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