4 lines
30 KiB
JavaScript
4 lines
30 KiB
JavaScript
|
|
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<r.length;d+=l)a+=String.fromCharCode(...r.subarray(d,d+l));return`data:${t};base64,${btoa(a)}`}async function j(e){await Q(),s={...e,sessionId:crypto.randomUUID(),expiresAt:0},await T()}async function G(e,t){const r=JSON.parse(e.create_wallet_registration_from_keys(t.short_address,t.public_key,t.private_key)),a=e.create_handshake_proof(t.public_key,t.private_key),l=await S();if(!l.apiUrl)throw new Error(`No ${l.selec
|
||
|
|
`),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-Contract
|