Web3 provider — window.ombra
OmbraChain are o extensie Chrome / Edge (similar MetaMask) care injectează window.ombra în orice pagină web, permițând dApp-urilor să interacționeze cu wallet-ul user-ului.
Detectare
if (typeof window.ombra === "undefined") {
alert("Te rog instalează Ombra Wallet extension");
return;
}
const provider = window.ombra;
API style
Similar EIP-1193 (Ethereum) — toate metodele prin provider.request({ method, params }).
const result = await window.ombra.request({
method: "ombra_address",
params: {}
});
// → "5bb5c50f185363cf913f93a18c6837c20d720a69"
Metode disponibile
ombra_chainId
Returnează ID-ul chain-ului ("mainnet" sau "testnet").
const chainId = await window.ombra.request({ method: "ombra_chainId" });
// → "mainnet"
ombra_address
Adresa wallet-ului activ.
const addr = await window.ombra.request({ method: "ombra_address" });
// → "5bb5c50f185363cf913f93a18c6837c20d720a69"
ombra_balance
Balance în micro-OMBRA (string pentru BigInt safety).
const balance = await window.ombra.request({ method: "ombra_balance" });
// → "1500000000" (= 1500 OMBRA)
ombra_publicKey
Cheia publică Ed25519 hex.
const pubkey = await window.ombra.request({ method: "ombra_publicKey" });
// → "1a2b3c..." (64 hex chars)
ombra_signTransfer
Semnează tx fără broadcast (returnează raw signed tx).
const signed = await window.ombra.request({
method: "ombra_signTransfer",
params: { to: "abc...", amount: "1000000", fee: "10000" }
});
// → { tx: {...}, signature: "..." }
ombra_submitTransfer
Semnează ȘI broadcast la mainnet (one-shot).
const { txHash } = await window.ombra.request({
method: "ombra_submitTransfer",
params: { to: "abc...", amount: "1000000", fee: "10000" }
});
// → { txHash: "def..." }
ombra_submitTask
Submitează task AI on-chain (pentru dApp care vor să folosească compute miners).
const { taskId } = await window.ombra.request({
method: "ombra_submitTask",
params: {
prompt: "Explică PoATU în 100 cuvinte",
taskType: "chat", // chat | code | analysis
fee: "500000", // micro-OMBRA (0.5 OMBRA min)
maxTokens: 1000
}
});
// → { taskId: "..." }
// Poll cu ombra_getTask pentru rezultat
ombra_getTask
Status + rezultat al unui task.
const task = await window.ombra.request({
method: "ombra_getTask",
params: { taskId: "..." }
});
// → { status: "completed", result: "...", tokensOut: 856, ... }
ombra_connect
Cere permisiune user-ului să conecteze wallet-ul la dApp-ul tău.
const { accounts } = await window.ombra.request({ method: "ombra_connect" });
// → { accounts: ["5bb..."] } sau throw dacă user respinge
Events
window.ombra.on("accountsChanged", (accounts) => {
console.log("Wallet schimbat:", accounts[0]);
});
window.ombra.on("chainChanged", (chainId) => {
console.log("Chain schimbat:", chainId);
window.location.reload();
});
window.ombra.on("connect", () => console.log("Conectat"));
window.ombra.on("disconnect", () => console.log("Deconectat"));
Securitate
- Extensia NU expune cheia privată dApp-urilor — toate semnăturile sunt în extension popup
- User trebuie să confirme manual fiecare tx în popup
- DApp-ul vede DOAR adresa publică + balance
- Permisiunea
connectpoate fi revocată din extension settings
Exemplu complet — buton "Send tip"
<button id="tip">Send 1 OMBRA tip</button>
<script>
document.getElementById("tip").onclick = async () => {
if (!window.ombra) return alert("Install Ombra Wallet ext.");
await window.ombra.request({ method: "ombra_connect" });
const { txHash } = await window.ombra.request({
method: "ombra_submitTransfer",
params: { to: "5bb5c50f185363cf913f93a18c6837c20d720a69", amount: "1000000", fee: "10000" }
});
alert(`Tip trimis! TX: ${txHash}`);
};
</script>