import{c as yt}from"./chunks/core-CvwXoH-U.js";const F="contractlessWallet",M="contractlessWallets",V="contractlessSettings",L="contractlessAutoLock",K="contractlessUnlockedWallet",j="contractlessApplicationSessions",ct=12e4,vt=10,bt={apiUrl:"https://api.contractless.dev",autoLockMinutes:60};let s;const J="pending-provider-approvals";async function k(){const e=await chrome.storage.local.get(V);return{...bt,...e[V]??{}}}function lt(e){const t=JSON.parse(e);if(typeof t.short_address!="string"||typeof t.public_key!="string")throw new Error("The encrypted wallet metadata is invalid.");return{address:t.short_address,publicKey:t.public_key}}async function $(){const e=await chrome.storage.local.get([M,F]),t=e[M];if((t==null?void 0:t.version)===1&&Array.isArray(t.wallets))return t;const a=e[F];if(typeof a!="string")return{version:1,wallets:[]};const i=lt(a),d={id:crypto.randomUUID(),label:"Contractless Account 1",address:i.address,publicKey:i.publicKey,walletJson:a},l={version:1,activeWalletId:d.id,wallets:[d]};return await chrome.storage.local.set({[M]:l}),await chrome.storage.local.remove(F),l}async function H(e){await chrome.storage.local.set({[M]:e})}function P(e){return e.wallets.find(t=>t.id===e.activeWalletId)??e.wallets[0]}async function X(e){const t=await $(),a=lt(e),i=t.wallets.find(l=>l.address===a.address);if(i)return i.walletJson=e,i.publicKey=a.publicKey,t.activeWalletId=i.id,await H(t),i;const d={id:crypto.randomUUID(),label:`Contractless Account ${t.wallets.length+1}`,address:a.address,publicKey:a.publicKey,walletJson:e};return t.wallets.push(d),t.activeWalletId=d.id,await H(t),d}async function E(){await dt();const e=await $(),t=P(e),a=await k();return{exists:e.wallets.length>0,unlocked:!!(s&&s.walletId===(t==null?void 0:t.id)),activeWalletId:t==null?void 0:t.id,activeWalletLabel:t==null?void 0:t.label,address:s==null?void 0:s.short_address,publicKey:s==null?void 0:s.public_key,wallets:e.wallets.map(i=>({id:i.id,label:i.label,address:i.address,publicKey:i.publicKey,active:i.id===(t==null?void 0:t.id)})),apiUrl:a.apiUrl,autoLockMinutes:a.autoLockMinutes}}async function b(){if(!s)return;const e=await k();s.expiresAt=Date.now()+e.autoLockMinutes*6e4,await chrome.storage.session.set({[K]:s}),await chrome.alarms.clear(L),await chrome.alarms.create(L,{when:s.expiresAt})}function kt(e,t){const a=new Uint8Array(e);let i="";const d=32768;for(let l=0;l{});if(!l.ok||(f==null?void 0:f.success)!==!0)throw new Error((f==null?void 0:f.error)??`Wallet registration failed with HTTP ${l.status}.`);return f.data}async function St(e,t){var f;const a=await k(),i=e.create_handshake_proof(t.public_key,t.private_key),d=await fetch(`${a.apiUrl}/api/v1/addresses/registration?address=${encodeURIComponent(t.short_address)}`,{headers:{"X-Contractless-Address":t.short_address,"X-Contractless-Public-Key":t.public_key,"X-Contractless-Signature":i}}),l=await d.json().catch(()=>{});if(!d.ok||(l==null?void 0:l.success)!==!0)throw new Error((l==null?void 0:l.error)??`Wallet registration lookup failed with HTTP ${d.status}.`);((f=l.data)==null?void 0:f.registered)!==!0&&await Y(e,t)}async function dt(){if(s){if(s.expiresAt>Date.now())return;await R();return}const t=(await chrome.storage.session.get(K))[K];if(!t||t.expiresAt<=Date.now()){await chrome.storage.session.remove(K);return}t.sessionId||(t.sessionId=crypto.randomUUID(),await wt(),await chrome.storage.session.set({[K]:t})),s=t}async function R(){s&&(s.private_key="",s=void 0),await chrome.storage.session.remove([K,j]),await chrome.alarms.clear(L)}async function Q(){const t=(await chrome.storage.session.get(j))[j];return Array.isArray(t)?t:[]}async function pt(e){await chrome.storage.session.set({[j]:e})}async function wt(){await chrome.storage.session.remove(j)}function Tt(e){const t=crypto.getRandomValues(new Uint8Array(e));return Array.from(t,a=>a.toString(16).padStart(2,"0")).join("")}async function Et(e){const t=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(e));return Array.from(new Uint8Array(t),a=>a.toString(16).padStart(2,"0")).join("")}function O(e){return!e.params||typeof e.params!="object"?{}:e.params}function C(e){const t=String(e??"").trim();if(!/^[A-Za-z0-9_-]{5,32}$/.test(t))throw new Error("The application ID must contain 5 to 32 URL-safe characters.");return t}function Z(e,t){if(String(e.origin??"")!==t)throw new Error("The application origin does not match the requesting website.")}function ut(e){const t=Number(e),a=Math.floor(Date.now()/1e3);if(!Number.isInteger(t)||Math.abs(a-t)>300)throw new Error("The application connection timestamp must be within five minutes.");return t}function ht(e){const t=String(e??"").trim().toLowerCase();if(!/^[0-9a-f]{32,128}$/.test(t)||t.length%2!==0)throw new Error("The application nonce must contain 16 to 64 random hexadecimal bytes.");return t}function gt(e){const t=String(e??"").trim();if(!t||new TextEncoder().encode(t).length>75)throw new Error("The application connection message must contain 1 to 75 bytes.");return t}function ft(e){const t=String(e??"").trim();if(!t||new TextEncoder().encode(t).length>75)throw new Error("A signed website message must contain 1 to 75 bytes.");return t}function st(e,t){if(e==="contractless_connect"||e==="contractless_signMessage")return"safe";const a=t.transaction;if(!a||typeof a!="object")return"high";const i=Number(a.txtype);return Number.isInteger(i)&&i>=100&&i<=113?"low":"high"}function _t(e){if(!e||typeof e!="object")throw new Error("A complete transaction object is required.");const t=e,a=Number(t.txtype);if(!Number.isInteger(a))throw new Error("The transaction type is invalid.");if(a===6||a===7)throw new Error("Swaps and loan creation require a staged signing workflow.");return t}function z(e){if(!e||typeof e!="object")throw new Error("A complete or partially signed transaction object is required.");const t=e,a=t.unsigned_swap??t.unsigned_loan_contract??t;if(!a||typeof a!="object")throw new Error("The unsigned transaction fields are missing.");const i=Number(a.txtype);if(i!==6&&i!==7)throw new Error("Staged signing is only available for swaps and loan creation.");return t}async function rt(e,t){var S;if(!s)throw new Error("Wallet is locked.");const a=t.unsigned_swap??t.unsigned_loan_contract??t;if(!a||typeof a!="object")return;const i=a,d=Number(i.txtype),l=d===2?[["Receiving",String(i.receiver??"")]]:d===6?[["First swap participant",String(i.sender1??"")],["Second swap participant",String(i.sender2??"")]]:d===7?[["Lender",String(i.lender??"")],["Borrower",String(i.borrower??"")]]:[];if(l.length===0)return;e.inspect_transaction_request(JSON.stringify(t));const f=await k(),v=e.create_handshake_proof(s.public_key,s.private_key),y={"X-Contractless-Address":s.short_address,"X-Contractless-Public-Key":s.public_key,"X-Contractless-Signature":v},T=new Map;for(const[x,U]of l){const A=U.trim().toLowerCase();let I=T.get(A);if(I===void 0){const r=await fetch(`${f.apiUrl}/api/v1/addresses/registration?address=${encodeURIComponent(A)}`,{headers:y}),o=await r.json().catch(()=>{});if(!r.ok||(o==null?void 0:o.success)!==!0)throw new Error((o==null?void 0:o.error)??`Address registration lookup failed with HTTP ${r.status}.`);I=((S=o.data)==null?void 0:S.registered)===!0,T.set(A,I)}if(!I)throw new Error(`${x} wallet is not registered.`)}}async function mt(e,t){if(t.complete!==!0||typeof t.bytes_hex!="string"||typeof t.hash!="string")throw new Error("The transaction could not be completed.");if(!s)throw new Error("Wallet is locked.");const a=await k(),i=e.create_handshake_proof(s.public_key,s.private_key),d=await fetch(`${a.apiUrl}/api/v1/transactions/broadcast`,{method:"POST",headers:{"Content-Type":"application/json","X-Contractless-Address":s.short_address,"X-Contractless-Public-Key":s.public_key,"X-Contractless-Signature":i},body:JSON.stringify({transaction_hex:t.bytes_hex})}),l=await d.json().catch(()=>{});if(!d.ok||(l==null?void 0:l.success)!==!0)throw new Error((l==null?void 0:l.error)??`Transaction broadcast failed with HTTP ${d.status}.`);return await b(),{txid:t.hash,bytes:t.bytes_hex,broadcast:l.data}}async function N(e,t){if(!s)throw new Error("Wallet is locked.");Z(e,t);const a=C(e.appId),i=String(e.accessKey??""),d=(await Q()).find(l=>l.origin===t&&l.appId===a&&l.accessKey===i&&l.walletId===(s==null?void 0:s.walletId)&&l.unlockSessionId===(s==null?void 0:s.sessionId));if(!d)throw new Error("The application session is invalid or has expired. Reconnect the wallet.");return d}async function B(){const t=(await chrome.storage.session.get(J))[J],a=Array.isArray(t)?t.filter(y=>typeof y=="string"&&y.length>0):typeof t=="string"&&t.length>0?[t]:[];if(a.length===0)return[];const i=a.map(y=>`approval:${y}`),d=await chrome.storage.session.get(i),l=Date.now(),f=[],v=[];for(const y of a){const T=`approval:${y}`,S=d[T];!S||l-S.createdAt>=ct?v.push(T):f.push(y)}return(v.length>0||f.length!==a.length)&&(await chrome.storage.session.set({[J]:f}),v.length>0&&await chrome.storage.session.remove(v)),f}async function G(e){const t=(await B()).filter(a=>a!==e);return await chrome.storage.session.set({[J]:t}),t}async function ot(e){const t=await B(),a=await chrome.storage.session.get(t.map(d=>`approval:${d}`));if(e.method==="contractless_connect"&&t.some(d=>{const l=a[`approval:${d}`];if(!l||l.method!=="contractless_connect")return!1;const f=O(l),v=O(e);return l.origin===e.origin&&f.appId===v.appId}))throw new Error("This application already has a wallet connection request pending.");if(t.length>=vt)throw new Error("The wallet approval queue is full. Resolve a pending request first.");await chrome.storage.session.set({[J]:[...t,e.id],[`approval:${e.id}`]:e});try{await chrome.action.openPopup()}catch{}}async function nt(e){const t=`approval-result:${e}`,a=Date.now()+ct;for(;Date.now()setTimeout(d,150))}throw await chrome.storage.session.remove([`approval:${e}`,t]),await G(e),new Error("Wallet approval request expired.")}function At(e){const t=e.url??e.origin;if(!t)throw new Error("The requesting website origin is unavailable.");const a=new URL(t).origin;if(a==="null")throw new Error("Requests from opaque origins are not supported.");return a}async function it(e,t){if(!s)throw new Error("Wallet is locked.");switch(await b(),t.method){case"contractless_connect":{const a=O(t);Z(a,t.origin);const i=String(a.walletSessionId??"");if(i&&i!==s.sessionId)throw new Error("The active wallet changed while the connection was being approved.");const d=C(a.appId),l=ut(a.timestamp),f=ht(a.nonce),v=gt(a.message),y=Tt(32),T=await Et(y),S=Math.floor(Date.now()/1e3),x=Math.min(S+900,Math.floor(s.expiresAt/1e3)),U=["Contractless application connection",`Application ID: ${d}`,`Origin: ${t.origin}`,`Requested timestamp: ${l}`,`Message: ${v}`,`Session key hash: ${T}`].join(` `),A=JSON.parse(e.sign_message_request(JSON.stringify({origin:t.origin,message:U,nonce:f,issued_at:S,expires_at:x}),s.private_key,s.public_key)),I={origin:t.origin,appId:d,accessKey:y,walletId:s.walletId,unlockSessionId:s.sessionId,createdAt:Date.now()},r=await Q();return r.push(I),await pt(r),{address:s.short_address,publicKey:s.public_key,signature:A.signature,proof:A,accessKey:y,appId:d,origin:t.origin,sessionExpiresAt:s.expiresAt}}case"contractless_signMessage":{const a=O(t);await N(a,t.origin);const i=Math.floor(Date.now()/1e3),d=Number(a.expires_at??i+300),l=C(a.appId),f={origin:t.origin,message:["Contractless application message",`Application ID: ${l}`,`Message: ${ft(a.message)}`].join(` `),nonce:String(a.nonce??""),issued_at:i,expires_at:d};return JSON.parse(e.sign_message_request(JSON.stringify(f),s.private_key,s.public_key))}case"contractless_sendTransaction":{const a=O(t);await N(a,t.origin);const i=_t(a.transaction),d=JSON.parse(e.sign_transaction_request(JSON.stringify(i),s.private_key,s.public_key,1));return mt(e,d)}case"contractless_signDualTransaction":{const a=O(t);await N(a,t.origin);const i=z(a.transaction),d=Number(a.signerSlot);if(d!==1&&d!==2)throw new Error("The signer slot must be 1 or 2.");const l=JSON.parse(e.sign_transaction_request(JSON.stringify(i),s.private_key,s.public_key,d));return{complete:!1,txid:l.hash,unsignedBytes:l.unsigned_bytes_hex,canonicalUnsignedJson:JSON.parse(e.inspect_transaction_request(JSON.stringify(i))).canonical_unsigned_json,signedTransaction:l.signed_transaction,signature:d===1?l.signature1:l.signature2,signature1:l.signature1,signature2:l.signature2,signerSlot:d,signerPublicKey:s.public_key}}default:throw new Error("The website requested an unsupported wallet method.")}}async function It(e,t){var i,d,l,f,v,y,T,S,x,U,A,I;const a=await yt();switch(await dt(),e.type){case"status":return E();case"create-wallet":{const r=String(e.password),o=a.generate_browser_wallet(r),n=JSON.parse(a.unlock_browser_wallet(o,r));await Y(a,n);const u=await X(o);return await W({walletId:u.id,...n}),E()}case"import-wallet":{const r=a.import_legacy_wallet(String(e.walletJson),String(e.legacyPassword),String(e.password)),o=await X(r),n=JSON.parse(a.unlock_browser_wallet(r,String(e.password)));return await W({walletId:o.id,...n}),E()}case"import-wallet-image":{const r=String(e.password),o=a.import_private_key_image(String(e.imageBase64),String(e.imagePassword),r),n=await X(o),u=JSON.parse(a.unlock_browser_wallet(o,r));return await W({walletId:n.id,...u}),E()}case"import-private-key":{const r=String(e.password),o=a.import_private_key(String(e.privateKey),r),n=await X(o),u=JSON.parse(a.unlock_browser_wallet(o,r));return await W({walletId:n.id,...u}),E()}case"unlock":{const r=await $(),o=P(r);if(!o)throw new Error("No wallet exists.");const n=JSON.parse(a.unlock_browser_wallet(o.walletJson,String(e.password)));await W({walletId:o.id,...n});try{await St(a,n)}catch(u){console.warn("Automatic wallet registration failed during unlock.",u)}return E()}case"switch-wallet":{const r=await $(),o=String(e.walletId);if(!r.wallets.some(n=>n.id===o))throw new Error("The selected wallet does not exist.");return await R(),r.activeWalletId=o,await H(r),E()}case"rename-wallet":{const r=await $(),o=r.wallets.find(u=>u.id===String(e.walletId));if(!o)throw new Error("The selected wallet does not exist.");const n=String(e.label).trim();if(n.length<1||n.length>40)throw new Error("Wallet labels must contain between 1 and 40 characters.");return o.label=n,await H(r),E()}case"lock":return await R(),E();case"save-settings":{const r={apiUrl:String(e.apiUrl).replace(/\/+$/,""),autoLockMinutes:Math.max(1,Number(e.autoLockMinutes))};return await chrome.storage.local.set({[V]:r}),await b(),E()}case"register-wallet":{if(!s)throw new Error("Wallet is locked.");const r=await Y(a,s);return await b(),r}case"wallet-balances":{if(!s)throw new Error("Wallet is locked.");const r=await k(),o=a.create_handshake_proof(s.public_key,s.private_key),n={"X-Contractless-Address":s.short_address,"X-Contractless-Public-Key":s.public_key,"X-Contractless-Signature":o},u=encodeURIComponent(s.short_address),[c,h,w]=await Promise.all([fetch(`${r.apiUrl}/api/v1/balances?address=${u}`,{headers:n}),fetch(`${r.apiUrl}/api/v1/tokens`,{headers:n}),fetch(`${r.apiUrl}/api/v1/nfts`,{headers:n})]),[p,_,g]=await Promise.all([c.json().catch(()=>{}),h.json().catch(()=>{}),w.json().catch(()=>{})]);if(!c.ok||(p==null?void 0:p.success)!==!0)throw new Error((p==null?void 0:p.error)??`Balance lookup failed with HTTP ${c.status}.`);return await b(),{address:s.short_address,balances:((i=p.data)==null?void 0:i.balances)??[],tokens:h.ok&&(_==null?void 0:_.success)===!0?((d=_.data)==null?void 0:d.tokens)??[]:[],nfts:w.ok&&(g==null?void 0:g.success)===!0?((l=g.data)==null?void 0:l.nfts)??[]:[],tokenCatalogError:h.ok&&(_==null?void 0:_.success)===!0?void 0:(_==null?void 0:_.error)??`Token lookup failed with HTTP ${h.status}.`,nftCatalogError:w.ok&&(g==null?void 0:g.success)===!0?void 0:(g==null?void 0:g.error)??`NFT lookup failed with HTTP ${w.status}.`}}case"wallet-nft-details":{if(!s)throw new Error("Wallet is locked.");const r=String(e.name??"").trim(),o=Number(e.series??0);if(!r||r.length>15||!Number.isInteger(o)||o<0||o>4294967295)throw new Error("A valid NFT or RWA identifier is required.");const n=await k(),u=a.create_handshake_proof(s.public_key,s.private_key),c={"X-Contractless-Address":s.short_address,"X-Contractless-Public-Key":s.public_key,"X-Contractless-Signature":u},h=`name=${encodeURIComponent(r)}&series=${o}`,[w,p]=await Promise.all([fetch(`${n.apiUrl}/api/v1/nfts/details?${h}`,{headers:c}),fetch(`${n.apiUrl}/api/v1/nfts/media?${h}`,{headers:c})]),[_,g]=await Promise.all([w.json().catch(()=>{}),p.json().catch(()=>{})]);if(!w.ok||(_==null?void 0:_.success)!==!0)throw new Error((_==null?void 0:_.error)??`NFT details lookup failed with HTTP ${w.status}.`);let m="",tt=!1,et={},D;if(p.ok&&(g==null?void 0:g.success)===!0){et=(f=g.data)!=null&&f.metadata&&typeof g.data.metadata=="object"?g.data.metadata:{},tt=((v=g.data)==null?void 0:v.image_available)===!0;const at=String(((y=g.data)==null?void 0:y.image_url)??"");if(at)try{const q=await fetch(new URL(at,`${n.apiUrl}/`).toString(),{headers:c});q.ok?m=kt(await q.arrayBuffer(),q.headers.get("Content-Type")??"image/png"):D=`NFT image returned HTTP ${q.status}.`}catch{D="NFT image could not be retrieved."}}else D=(g==null?void 0:g.error)??`NFT media lookup failed with HTTP ${p.status}.`;return await b(),{..._.data,metadata:et,image_data_url:m,image_available:tt,media_error:D}}case"wallet-receive-address":{if(!s)throw new Error("Wallet is locked.");const r=await k(),o=a.create_handshake_proof(s.public_key,s.private_key),n=encodeURIComponent(s.short_address),u=await fetch(`${r.apiUrl}/api/v1/addresses/vanity?address=${n}`,{headers:{"X-Contractless-Address":s.short_address,"X-Contractless-Public-Key":s.public_key,"X-Contractless-Signature":o}}),c=await u.json().catch(()=>{});if(!u.ok||(c==null?void 0:c.success)!==!0)throw new Error((c==null?void 0:c.error)??`Vanity address lookup failed with HTTP ${u.status}.`);await b();const h=typeof((T=c.data)==null?void 0:T.vanity_address)=="string"&&c.data.vanity_address.trim()!==""?c.data.vanity_address:void 0;return{shortAddress:s.short_address,receiveAddress:h??s.short_address,vanity:!!h}}case"wallet-prepare-transfer":{if(!s)throw new Error("Wallet is locked.");const r=await k(),o=a.create_handshake_proof(s.public_key,s.private_key),n={"X-Contractless-Address":s.short_address,"X-Contractless-Public-Key":s.public_key,"X-Contractless-Signature":o},u=String(e.receiver??"").trim().toLowerCase(),c=s.short_address.endsWith(".cltc")?"cltc":"clc";let h=u;if(new RegExp(`^[0-9a-f]{40}\\.${c}$`).test(u)){const g=await fetch(`${r.apiUrl}/api/v1/addresses/registration?address=${encodeURIComponent(h)}`,{headers:n}),m=await g.json().catch(()=>{});if(!g.ok||(m==null?void 0:m.success)!==!0)throw new Error((m==null?void 0:m.error)??`Address lookup failed with HTTP ${g.status}.`);if(((x=m.data)==null?void 0:x.registered)!==!0)throw new Error("The receiving wallet is not registered.")}else{if(!new RegExp(`^[a-z]{1,20}\\.${c}$`).test(u))throw new Error(`Enter a valid Contractless ${c.toUpperCase()} address.`);const g=await fetch(`${r.apiUrl}/api/v1/addresses/vanity/resolve?address=${encodeURIComponent(u)}`,{headers:n}),m=await g.json().catch(()=>{});if(!g.ok||(m==null?void 0:m.success)!==!0)throw new Error((m==null?void 0:m.error)??`Vanity address lookup failed with HTTP ${g.status}.`);if(h=String(((S=m.data)==null?void 0:S.owner_address)??""),!h)throw new Error("That vanity address is not registered.")}const w=Number(e.nftSeries??0);if(!Number.isInteger(w)||w<0||w>4294967295)throw new Error("The NFT/RWA series number is invalid.");const p={txtype:2,time:Math.floor(Date.now()/1e3),value:String(e.valueAtomic??""),coin:String(e.asset??"").trim().padEnd(15," "),nft_series:w,sender:s.short_address,receiver:h,txfee:String(e.feeAtomic??"")},_=JSON.parse(a.inspect_transaction_request(JSON.stringify(p)));return await b(),{transaction:p,review:_.review,hash:_.hash,receiverInput:u}}case"wallet-broadcast-transfer":{if(!s)throw new Error("Wallet is locked.");const r=e.transaction;if(!r||typeof r!="object")throw new Error("The reviewed transfer is unavailable.");const o=JSON.parse(a.sign_transaction_request(JSON.stringify(r),s.private_key,s.public_key,1));return mt(a,o)}case"wallet-activity":{if(!s)throw new Error("Wallet is locked.");const r=await k(),o=a.create_handshake_proof(s.public_key,s.private_key),n=encodeURIComponent(s.short_address),u={"X-Contractless-Address":s.short_address,"X-Contractless-Public-Key":s.public_key,"X-Contractless-Signature":o},[c,h]=await Promise.all([fetch(`${r.apiUrl}/api/v1/addresses/latest?address=${n}&limit=25`,{headers:u}),fetch(`${r.apiUrl}/api/v1/height`,{headers:u})]),[w,p]=await Promise.all([c.json().catch(()=>{}),h.json().catch(()=>{})]);if(!c.ok||(w==null?void 0:w.success)!==!0)throw new Error((w==null?void 0:w.error)??`Activity lookup failed with HTTP ${c.status}.`);if(!h.ok||(p==null?void 0:p.success)!==!0)throw new Error((p==null?void 0:p.error)??`Block height lookup failed with HTTP ${h.status}.`);return await b(),{address:s.short_address,current_height:Number(((U=p.data)==null?void 0:U.height)??0),transactions:Array.isArray((A=w.data)==null?void 0:A.transactions)?w.data.transactions:[]}}case"wallet-transaction":{if(!s)throw new Error("Wallet is locked.");const r=String(e.txid);if(!/^[0-9a-f]{64}$/i.test(r))throw new Error("A valid transaction ID is required.");const o=await k(),n=a.create_handshake_proof(s.public_key,s.private_key),u={"X-Contractless-Address":s.short_address,"X-Contractless-Public-Key":s.public_key,"X-Contractless-Signature":n},[c,h]=await Promise.all([fetch(`${o.apiUrl}/api/v1/transactions/lookup?txid=${encodeURIComponent(r)}`,{headers:u}),fetch(`${o.apiUrl}/api/v1/height`,{headers:u})]),[w,p]=await Promise.all([c.json().catch(()=>{}),h.json().catch(()=>{})]);if(!c.ok||(w==null?void 0:w.success)!==!0)throw new Error((w==null?void 0:w.error)??`Transaction lookup failed with HTTP ${c.status}.`);if(!h.ok||(p==null?void 0:p.success)!==!0)throw new Error((p==null?void 0:p.error)??`Block height lookup failed with HTTP ${h.status}.`);return await b(),{...w.data,current_height:Number(((I=p.data)==null?void 0:I.height)??0)}}case"export-wallet":{const r=P(await $());if(!r)throw new Error("No wallet exists.");return r.walletJson}case"export-legacy-wallet":{const r=P(await $());if(!r)throw new Error("No wallet exists.");return a.export_legacy_wallet(r.walletJson,String(e.password),String(e.legacyPassword))}case"export-private-key-image":{const r=P(await $());if(!r)throw new Error("No wallet exists.");const o=JSON.parse(a.export_legacy_wallet(r.walletJson,String(e.password),String(e.imagePassword)));if(typeof o.private_key!="string")throw new Error("The wallet image could not be created.");return o.private_key}case"reveal-private-key":{const r=P(await $());if(!r)throw new Error("No wallet exists.");const o=JSON.parse(a.unlock_browser_wallet(r.walletJson,String(e.password)));if(typeof o.private_key!="string")throw new Error("The private key could not be decrypted.");return await b(),{label:r.label,address:r.address,privateKey:o.private_key}}case"provider-request":{const r=At(t),o=String(e.method),n=e.params&&typeof e.params=="object"?e.params:{};if(o==="contractless_detect")return{installed:!0,providerVersion:"1.0.0"};if(o==="contractless_connect"){Z(n,r);const c=C(n.appId),h=ut(n.timestamp);ht(n.nonce);const w=gt(n.message),p={id:crypto.randomUUID(),method:o,params:{...n,walletSessionId:s==null?void 0:s.sessionId},origin:r,createdAt:Date.now(),risk:st(o,n),display:{request:"Connect application",application_id:c,website:r,wallet_address:(s==null?void 0:s.short_address)??"Unlock wallet to continue",message:w,requested_timestamp:h,access:"Address access and future wallet requests until this wallet locks"}};if(await ot(p),!await nt(p.id))throw new Error("The wallet connection request was rejected.");return it(a,p)}if(o==="contractless_accounts")try{return await N(n,r),s?[s.short_address]:[]}catch{return[]}if(o==="contractless_balances"){if(await N(n,r),!s)throw new Error("Wallet is locked.");const c=await k(),h=a.create_handshake_proof(s.public_key,s.private_key),w=await fetch(`${c.apiUrl}/api/v1/balances?address=${encodeURIComponent(s.short_address)}`,{headers:{"X-Contractless-Address":s.short_address,"X-Contractless-Public-Key":s.public_key,"X-Contractless-Signature":h}}),p=await w.json().catch(()=>{});if(!w.ok||(p==null?void 0:p.success)!==!0)throw new Error((p==null?void 0:p.error)??`Balance lookup failed with HTTP ${w.status}.`);return await b(),p.data}if(o==="contractless_disconnect"){const c=await N(n,r),h=(await Q()).filter(w=>!(w.origin===c.origin&&w.appId===c.appId&&w.accessKey===c.accessKey));return await pt(h),{disconnected:!0}}if(o==="contractless_completeDualTransaction"){await N(n,r);const c=z(n.transaction);return JSON.parse(a.complete_dual_transaction_request(JSON.stringify(c),String(n.signature1??""),String(n.publicKey1??""),String(n.signature2??""),String(n.publicKey2??"")))}if(!["contractless_signMessage","contractless_sendTransaction","contractless_signDualTransaction"].includes(o))throw new Error("The website requested an unsupported wallet method.");if(await N(n,r),o==="contractless_sendTransaction"){const c=_t(n.transaction);await rt(a,c)}else if(o==="contractless_signDualTransaction"){const c=z(n.transaction);await rt(a,c)}const u={id:crypto.randomUUID(),method:o,params:n,origin:r,createdAt:Date.now(),risk:st(o,n),display:o==="contractless_signMessage"?{request:"Sign a text message",application_id:C(n.appId),website:r,message:ft(n.message),warning:"This is a text signature. It cannot move wallet assets."}:o==="contractless_signDualTransaction"?(()=>{const c=JSON.parse(a.inspect_transaction_request(JSON.stringify(n.transaction)));return{application_id:C(n.appId),website:r,transaction_type:c.transaction_name,signer_slot:n.signerSlot,transaction_fields:c.review,action:"Sign and return this signature to the application without broadcasting."}})():(()=>{const c=JSON.parse(a.inspect_transaction_request(JSON.stringify(n.transaction)));return{application_id:C(n.appId),website:r,transaction_type:c.transaction_name,transaction_fields:c.review,action:"Sign and broadcast this transaction."}})()};if(await ot(u),!await nt(u.id))throw new Error("The wallet request was rejected.");return it(a,u)}case"pending-provider-approval":{const r=await B(),o=r[0]??"";if(!o)return null;const n=`approval:${o}`,c=(await chrome.storage.session.get(n))[n];return c?s?(c.method==="contractless_connect"&&(c.params={...c.params,walletSessionId:s.sessionId},c.display={...c.display??{},wallet_address:s.short_address},await chrome.storage.session.set({[n]:c})),{locked:!1,request:c,position:1,total:r.length}):{locked:!0}:(await G(o),null)}case"resolve-provider-approval":{if(!s)throw new Error("Unlock the wallet before approving this request.");const r=String(e.id??""),o=await B();if(!r||o[0]!==r)throw new Error("The wallet approval request has expired.");const n=`approval:${r}`,c=(await chrome.storage.session.get(n))[n];if(!c)throw new Error("The wallet approval request has expired.");return c.method==="contractless_connect"&&(c.params={...c.params,walletSessionId:s.sessionId},await chrome.storage.session.set({[n]:c})),await chrome.storage.session.set({[`approval-result:${r}`]:{approved:e.approved===!0}}),await chrome.storage.session.remove(n),{resolved:!0,remaining:(await G(r)).length}}default:throw new Error("Unsupported wallet request.")}}chrome.runtime.onMessage.addListener((e,t,a)=>(It(e,t).then(i=>a({ok:!0,result:i})).catch(i=>a({ok:!1,error:i instanceof Error?i.message:String(i)})),!0));chrome.alarms.onAlarm.addListener(e=>{e.name===L&&R()});