diff --git a/extension/background.js b/extension/background.js index e11ad95..ce2fc59 100644 --- a/extension/background.js +++ b/extension/background.js @@ -13357,7 +13357,9 @@ chrome.runtime.onConnect.addListener((port) => { if (port.name !== "inscriboor-provider") return; port.onMessage.addListener(async (message) => { try { - if (message.method === "bitcoin_getAccounts") { + if (message.method === "inscriboor_getVersion") { + port.postMessage({ id: message.id, result: chrome.runtime.getManifest().version }); + } else if (message.method === "bitcoin_getAccounts") { const me = await account(); port.postMessage({ id: message.id, result: [{ address: me.address, pubkey: me.pubkey, network: me.network }] }); } else if (message.method === "bitcoin_getNetwork") { diff --git a/extension/content.js b/extension/content.js index 04ffb62..9334769 100644 --- a/extension/content.js +++ b/extension/content.js @@ -1 +1 @@ -(() => {n let port;n const connect = () => {n port = chrome.runtime.connect({ name: "inscriboor-provider" });n port.onMessage.addListener(message => window.postMessage({ source: "inscriboor-extension", ...message }, "*"));n port.onDisconnect.addListener(() => { port = null; });n };n connect();n window.addEventListener("message", event => {n if (event.source !== window || event.data?.source !== "inscriboor-page") return;n if (!port) connect();n port.postMessage({ id:event.data.id, method:event.data.method, params:event.data.params, origin:location.origin });n });n})();n \ No newline at end of file +(() => {n let port;n const connect = () => {n port = chrome.runtime.connect({ name: "inscriboor-provider" });n port.onMessage.addListener(message => window.postMessage({ source: "inscriboor-extension", ...message }, "*"));n port.onDisconnect.addListener(() => { port = null; });n };n connect();n window.addEventListener("message", event => {n if (event.data?.source !== "inscriboor-page") return;n if (!port) connect();n port.postMessage({ id:event.data.id, method:event.data.method, params:event.data.params, origin:location.origin });n });n})();n \ No newline at end of file diff --git a/extension/icons/icon128.png b/extension/icons/icon128.png index 15dc7b7..a853d78 100644 Binary files a/extension/icons/icon128.png and b/extension/icons/icon128.png differ diff --git a/extension/icons/icon16.png b/extension/icons/icon16.png index ff3e09b..8a47f57 100644 Binary files a/extension/icons/icon16.png and b/extension/icons/icon16.png differ diff --git a/extension/icons/icon32.png b/extension/icons/icon32.png index e021b19..569c3b1 100644 Binary files a/extension/icons/icon32.png and b/extension/icons/icon32.png differ diff --git a/extension/icons/icon48.png b/extension/icons/icon48.png index afbd439..e61f742 100644 Binary files a/extension/icons/icon48.png and b/extension/icons/icon48.png differ diff --git a/extension/index.html b/extension/index.html index 75310ab..e906db0 100644 --- a/extension/index.html +++ b/extension/index.html @@ -19,6 +19,6 @@ -

Wallet

Address, signing requests, and transaction approval.

-

v0.2 · Super Testnet signing provider. Real-network vaulting comes later.

+

Wallet

Address, signing requests, and transaction approval.

+

diff --git a/extension/injected.js b/extension/injected.js index 61e4d73..f89e977 100644 --- a/extension/injected.js +++ b/extension/injected.js @@ -2,25 +2,26 @@ if (window.inscriboor) return; const pending = new Map(); window.addEventListener("message", event => { - if (event.source !== window || event.data?.source !== "inscriboor-extension") return; + if (event.data?.source !== "inscriboor-extension") return; const request = pending.get(event.data.id); if (!request) return; pending.delete(event.data.id); event.data.error ? request.reject(new Error(event.data.error)) : request.resolve(event.data.result); }); const provider = Object.freeze({ - isInscriboor: true, + isInscriboor: true,n version: "0.2.2", request({ method, params = {} } = {}) { if (typeof method !== "string" || !method) return Promise.reject(new Error("A provider method is required.")); const id = crypto.randomUUID(); return new Promise((resolve, reject) => { pending.set(id, { resolve, reject }); window.postMessage({ source: "inscriboor-page", id, method, params }, "*"); + const timeout = method === "ord_signInscription" ? 120000 : 5000; setTimeout(() => { if (!pending.has(id)) return; pending.delete(id); reject(new Error("Inscriboor request timed out.")); - }, 120000); + }, timeout); }); } }); diff --git a/extension/manifest.json b/extension/manifest.json index 6c494de..821f159 100644 --- a/extension/manifest.json +++ b/extension/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 3, "name": "Inscriboor", - "version": "0.2.1", + "version": "0.2.2", "description": "Bitcoin/ordinal signing wallet for Super Testnet experiments.", "permissions": [ "storage" @@ -52,5 +52,8 @@ "32": "icons/icon32.png", "48": "icons/icon48.png", "128": "icons/icon128.png" - } + }, + "host_permissions": [ + "https://supertestnet.lol/*" + ] } diff --git a/extension/style.css b/extension/style.css index a958b06..5c83cfd 100644 --- a/extension/style.css +++ b/extension/style.css @@ -21,3 +21,6 @@ dl { display:grid; grid-template-columns:110px 1fr; gap:8px 12px; margin:18px 0; dt { color:GrayText; } dd { margin:0; overflow-wrap:anywhere; } .actions { display:flex; justify-content:flex-end; gap:8px; margin-top:20px; } .error { color:#d33; } + +.update-link { display:inline-block; margin-top:10px; color:#f7931a; font-weight:700; } +.update-link[hidden] { display:none; } diff --git a/src/background.js b/src/background.js index f27c640..73bacc8 100644 --- a/src/background.js +++ b/src/background.js @@ -86,7 +86,9 @@ chrome.runtime.onConnect.addListener(port => { if (port.name !== "inscriboor-provider") return; port.onMessage.addListener(async message => { try { - if (message.method === "bitcoin_getAccounts") { + if (message.method === "inscriboor_getVersion") { + port.postMessage({ id:message.id, result:chrome.runtime.getManifest().version }); + } else if (message.method === "bitcoin_getAccounts") { const me = await account(); port.postMessage({ id:message.id, result:[{ address:me.address, pubkey:me.pubkey, network:me.network }] }); } else if (message.method === "bitcoin_getNetwork") {