@mysten-incubation/dev-wallet 0.3.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +76 -2
- package/dist/_virtual/{_@oxc-project_runtime@0.127.0/helpers → _@oxc-project_runtime@0.135.0/helpers/esm}/decorate.mjs +1 -1
- package/dist/adapters/base-adapter.d.mts.map +1 -1
- package/dist/adapters/base-adapter.mjs.map +1 -1
- package/dist/adapters/build-managed-account.mjs.map +1 -1
- package/dist/adapters/devstack-adapter.d.mts.map +1 -1
- package/dist/adapters/devstack-adapter.mjs.map +1 -1
- package/dist/adapters/devstack-paths.d.mts.map +1 -1
- package/dist/adapters/devstack-paths.mjs.map +1 -1
- package/dist/adapters/fork-relay.d.mts.map +1 -1
- package/dist/adapters/fork-relay.mjs.map +1 -1
- package/dist/adapters/idb-store.mjs.map +1 -1
- package/dist/adapters/in-memory-adapter.d.mts.map +1 -1
- package/dist/adapters/in-memory-adapter.mjs.map +1 -1
- package/dist/adapters/passkey-adapter.d.mts.map +1 -1
- package/dist/adapters/passkey-adapter.mjs.map +1 -1
- package/dist/adapters/remote-cli-adapter.d.mts.map +1 -1
- package/dist/adapters/remote-cli-adapter.mjs.map +1 -1
- package/dist/adapters/webcrypto-adapter.d.mts.map +1 -1
- package/dist/adapters/webcrypto-adapter.mjs.map +1 -1
- package/dist/bin/cli.mjs.map +1 -1
- package/dist/client/dev-wallet-client.d.mts.map +1 -1
- package/dist/client/dev-wallet-client.mjs.map +1 -1
- package/dist/client/request-handler.d.mts.map +1 -1
- package/dist/client/request-handler.mjs.map +1 -1
- package/dist/index.d.mts +2 -1
- package/dist/index.mjs +2 -1
- package/dist/inject/index.d.mts +61 -0
- package/dist/inject/index.d.mts.map +1 -0
- package/dist/inject/index.mjs +67 -0
- package/dist/inject/index.mjs.map +1 -0
- package/dist/react/components.d.mts +6 -8
- package/dist/react/components.d.mts.map +1 -1
- package/dist/react/components.mjs.map +1 -1
- package/dist/react/context.d.mts +2 -3
- package/dist/react/context.d.mts.map +1 -1
- package/dist/react/context.mjs.map +1 -1
- package/dist/react/useDevWallet.d.mts +3 -11
- package/dist/react/useDevWallet.d.mts.map +1 -1
- package/dist/react/useDevWallet.mjs +14 -36
- package/dist/react/useDevWallet.mjs.map +1 -1
- package/dist/server/cli-signing-middleware.d.mts.map +1 -1
- package/dist/server/cli-signing-middleware.mjs.map +1 -1
- package/dist/standalone/assets/base-adapter-DET6CP7z.js +1 -0
- package/dist/standalone/assets/in-memory-adapter-CX7xym4e.js +1 -0
- package/dist/standalone/assets/main-CuOnBmaa.js +7 -0
- package/dist/standalone/assets/webcrypto-adapter-CUQmbHDy.js +1 -0
- package/dist/standalone/bookmarklet.js +5 -5
- package/dist/standalone/index.html +2 -1
- package/dist/types.d.mts.map +1 -1
- package/dist/ui/copy-controller.mjs.map +1 -1
- package/dist/ui/dev-wallet-account-selector.d.mts +2 -3
- package/dist/ui/dev-wallet-account-selector.d.mts.map +1 -1
- package/dist/ui/dev-wallet-account-selector.mjs +1 -1
- package/dist/ui/dev-wallet-account-selector.mjs.map +1 -1
- package/dist/ui/dev-wallet-accounts.d.mts +2 -3
- package/dist/ui/dev-wallet-accounts.d.mts.map +1 -1
- package/dist/ui/dev-wallet-accounts.mjs +1 -1
- package/dist/ui/dev-wallet-accounts.mjs.map +1 -1
- package/dist/ui/dev-wallet-balances.d.mts +2 -3
- package/dist/ui/dev-wallet-balances.d.mts.map +1 -1
- package/dist/ui/dev-wallet-balances.mjs +1 -1
- package/dist/ui/dev-wallet-balances.mjs.map +1 -1
- package/dist/ui/dev-wallet-connect.d.mts +2 -3
- package/dist/ui/dev-wallet-connect.d.mts.map +1 -1
- package/dist/ui/dev-wallet-connect.mjs +1 -1
- package/dist/ui/dev-wallet-connect.mjs.map +1 -1
- package/dist/ui/dev-wallet-dropdown.d.mts +2 -3
- package/dist/ui/dev-wallet-dropdown.d.mts.map +1 -1
- package/dist/ui/dev-wallet-dropdown.mjs +1 -1
- package/dist/ui/dev-wallet-dropdown.mjs.map +1 -1
- package/dist/ui/dev-wallet-fork-panel.d.mts +2 -3
- package/dist/ui/dev-wallet-fork-panel.d.mts.map +1 -1
- package/dist/ui/dev-wallet-fork-panel.mjs +1 -1
- package/dist/ui/dev-wallet-fork-panel.mjs.map +1 -1
- package/dist/ui/dev-wallet-network-badge.d.mts +2 -3
- package/dist/ui/dev-wallet-network-badge.d.mts.map +1 -1
- package/dist/ui/dev-wallet-network-badge.mjs +1 -1
- package/dist/ui/dev-wallet-network-badge.mjs.map +1 -1
- package/dist/ui/dev-wallet-new-account.d.mts +2 -3
- package/dist/ui/dev-wallet-new-account.d.mts.map +1 -1
- package/dist/ui/dev-wallet-new-account.mjs +1 -1
- package/dist/ui/dev-wallet-new-account.mjs.map +1 -1
- package/dist/ui/dev-wallet-objects.d.mts +2 -3
- package/dist/ui/dev-wallet-objects.d.mts.map +1 -1
- package/dist/ui/dev-wallet-objects.mjs +1 -1
- package/dist/ui/dev-wallet-objects.mjs.map +1 -1
- package/dist/ui/dev-wallet-panel.d.mts +2 -3
- package/dist/ui/dev-wallet-panel.d.mts.map +1 -1
- package/dist/ui/dev-wallet-panel.mjs +1 -1
- package/dist/ui/dev-wallet-panel.mjs.map +1 -1
- package/dist/ui/dev-wallet-popup.d.mts +2 -3
- package/dist/ui/dev-wallet-popup.d.mts.map +1 -1
- package/dist/ui/dev-wallet-popup.mjs +1 -1
- package/dist/ui/dev-wallet-popup.mjs.map +1 -1
- package/dist/ui/dev-wallet-settings.d.mts +2 -3
- package/dist/ui/dev-wallet-settings.d.mts.map +1 -1
- package/dist/ui/dev-wallet-settings.mjs +1 -1
- package/dist/ui/dev-wallet-settings.mjs.map +1 -1
- package/dist/ui/dev-wallet-signing-modal.d.mts +2 -3
- package/dist/ui/dev-wallet-signing-modal.d.mts.map +1 -1
- package/dist/ui/dev-wallet-signing-modal.mjs +1 -1
- package/dist/ui/dev-wallet-signing-modal.mjs.map +1 -1
- package/dist/ui/dev-wallet-signing.d.mts +2 -3
- package/dist/ui/dev-wallet-signing.d.mts.map +1 -1
- package/dist/ui/dev-wallet-signing.mjs +2 -1
- package/dist/ui/dev-wallet-signing.mjs.map +1 -1
- package/dist/ui/dev-wallet-standalone.d.mts +2 -3
- package/dist/ui/dev-wallet-standalone.d.mts.map +1 -1
- package/dist/ui/dev-wallet-standalone.mjs +1 -1
- package/dist/ui/dev-wallet-standalone.mjs.map +1 -1
- package/dist/ui/dev-wallet-tab-bar.d.mts +1 -2
- package/dist/ui/dev-wallet-tab-bar.d.mts.map +1 -1
- package/dist/ui/dev-wallet-tab-bar.mjs +1 -1
- package/dist/ui/dev-wallet-tab-bar.mjs.map +1 -1
- package/dist/ui/mount.mjs.map +1 -1
- package/dist/ui/styles.mjs.map +1 -1
- package/dist/ui/transaction-analyzer.mjs.map +1 -1
- package/dist/ui/utils.d.mts.map +1 -1
- package/dist/ui/utils.mjs.map +1 -1
- package/dist/ui/wallet-controller.mjs.map +1 -1
- package/dist/wallet/constants.d.mts.map +1 -1
- package/dist/wallet/constants.mjs.map +1 -1
- package/dist/wallet/dev-wallet.d.mts +19 -0
- package/dist/wallet/dev-wallet.d.mts.map +1 -1
- package/dist/wallet/dev-wallet.mjs +58 -2
- package/dist/wallet/dev-wallet.mjs.map +1 -1
- package/dist/wallet/initializer.d.mts.map +1 -1
- package/dist/wallet/initializer.mjs +10 -26
- package/dist/wallet/initializer.mjs.map +1 -1
- package/dist/wallet/mount-and-register.d.mts +44 -0
- package/dist/wallet/mount-and-register.d.mts.map +1 -0
- package/dist/wallet/mount-and-register.mjs +46 -0
- package/dist/wallet/mount-and-register.mjs.map +1 -0
- package/dist/wallet/signing.d.mts.map +1 -1
- package/dist/wallet/signing.mjs.map +1 -1
- package/package.json +26 -22
- package/src/index.ts +5 -0
- package/src/inject/index.ts +200 -0
- package/src/react/useDevWallet.ts +26 -71
- package/src/ui/dev-wallet-signing.ts +2 -0
- package/src/wallet/dev-wallet.ts +75 -2
- package/src/wallet/initializer.ts +16 -42
- package/src/wallet/mount-and-register.ts +93 -0
- package/dist/standalone/assets/in-memory-adapter-qRkNfj9O.js +0 -1
- package/dist/standalone/assets/main-DDltQnzR.js +0 -3954
- package/dist/standalone/assets/webcrypto-adapter-FejcrL9x.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as e,l as t,n,t as r}from"./base-adapter-DET6CP7z.js";import{t as i}from"./main-CuOnBmaa.js";function a(e){let t=new Uint8Array(e),n=t.slice(1,33),r=t.slice(33,65)[31]&1?3:2,a=new Uint8Array(i.SIZE);return a[0]=r,a.set(n,1),a}var o=class n extends e{#e;static async generate({extractable:e=!1}={}){let t=await globalThis.crypto.subtle.generateKey({name:`ECDSA`,namedCurve:`P-256`},e,[`sign`,`verify`]),r=await globalThis.crypto.subtle.exportKey(`raw`,t.publicKey);return new n(t.privateKey,a(new Uint8Array(r)))}static import(e){return new n(e.privateKey,e.publicKey)}getKeyScheme(){return`Secp256r1`}constructor(e,t){super(),this.privateKey=e,this.#e=new i(t)}export(){let e={privateKey:this.privateKey,publicKey:this.#e.toRawBytes()};return Object.defineProperty(e,"toJSON",{enumerable:!1,value:()=>{throw Error(`The exported keypair must not be serialized. It must be stored in IndexedDB directly.`)}}),e}getPublicKey(){return this.#e}async sign(e){let n=await globalThis.crypto.subtle.sign({name:`ECDSA`,hash:`SHA-256`},this.privateKey,e),r=t.Signature.fromBytes(new Uint8Array(n));return(r.hasHighS()?new t.Signature(r.r,t.Point.Fn.neg(r.s)):r).toBytes(`compact`)}},s=class{#e;#t;#n=null;constructor(e,t){this.#e=e,this.#t=t}get(e){return this.#i(`readonly`,t=>t.get(e))}async set(e,t){await this.#i(`readwrite`,n=>n.put(t,e))}del(e){return this.#i(`readwrite`,t=>t.delete(e))}entries(){return this.#r().then(e=>new Promise((t,n)=>{let r=e.transaction(this.#t,`readonly`),i=r.objectStore(this.#t),a=[],o=i.openCursor();o.onsuccess=()=>{let e=o.result;e&&(a.push([e.key,e.value]),e.continue())},r.oncomplete=()=>t(a),r.onerror=()=>n(r.error)}))}#r(){return this.#n||=new Promise((e,t)=>{let n=indexedDB.open(this.#e);n.onupgradeneeded=()=>{n.result.objectStoreNames.contains(this.#t)||n.result.createObjectStore(this.#t)},n.onsuccess=()=>e(n.result),n.onerror=()=>{this.#n=null,t(n.error)}}),this.#n}#i(e,t){return this.#r().then(n=>new Promise((r,i)=>{let a=n.transaction(this.#t,e),o=t(a.objectStore(this.#t));a.oncomplete=()=>r(o.result),a.onerror=()=>i(a.error),a.onabort=()=>i(a.error)}))}},c=`dev-wallet-webcrypto`,l=`accounts`,u=`__account_meta__`,d=class extends r{#e;constructor(e){super(),this.id=`webcrypto`,this.name=`WebCrypto Signer`,this.#e=new s(e?.dbName??c,e?.storeName??l)}async initialize(){let e=await this.#e.entries(),t=await this.#e.get(u)??[],r=[];for(let[i,a]of e){if(i===u)continue;let e=i;try{let i=a,s=o.import(i),c=t.find(t=>t.address===e);r.push(n(s,e,c?.label??`Account`))}catch(t){console.warn(`[dev-wallet] Failed to load account ${e}, skipping:`,t)}}this.setInitialAccounts(r)}async createAccount(e){let t=await o.generate(),r=t.getPublicKey().toSuiAddress(),i=n(t,r,e?.label??this.getDefaultLabel());return await this.#e.set(r,t.export()),this.addAccount(i),await this.#t(),i}async renameAccount(e,t){return this._performRename(e,t)?(await this.#t(),!0):!1}async removeAccount(e){return this.removeAccountByAddress(e)?(await this.#e.del(e),await this.#t(),!0):!1}async#t(){let e=this.getAccounts().map(e=>({address:e.address,label:e.label}));await this.#e.set(u,e)}};export{d as WebCryptoSignerAdapter};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
(function(){
|
|
2
|
-
`,e)}try{window.dispatchEvent(new
|
|
3
|
-
`,e)}return E}function Y(...t){return t=t.filter(e=>!S.has(e)),t.length?(t.forEach(e=>Ie(e)),w.register?.forEach(e=>V(()=>e(...t))),function(){t.forEach(n=>we(n)),w.unregister?.forEach(n=>V(()=>n(...t)))}):()=>{}}let C;function be(){return C||(C=[...S]),C}function ve(t,e){return w[t]?.push(e)||(w[t]=[e]),function(){w[t]=w[t]?.filter(s=>e!==s)}}function V(t){try{t()}catch(e){console.error(e)}}class Ee extends Event{get detail(){return ge(this,A,"f")}get type(){return"wallet-standard:app-ready"}constructor(e){super("wallet-standard:app-ready",{bubbles:!1,cancelable:!1,composed:!1}),A.set(this,void 0),ye(this,A,e,"f")}preventDefault(){throw new Error("preventDefault cannot be called")}stopImmediatePropagation(){throw new Error("stopImmediatePropagation cannot be called")}stopPropagation(){throw new Error("stopPropagation cannot be called")}}A=new WeakMap;var m=function(t,e,n,s){if(n==="a"&&!s)throw new TypeError("Private accessor was defined without a getter");if(typeof e=="function"?t!==e||!s:!e.has(t))throw new TypeError("Cannot read private member from an object whose class did not declare it");return n==="m"?s:n==="a"?s.call(t):s?s.value:e.get(t)},b=function(t,e,n,s,r){if(s==="m")throw new TypeError("Private method is not writable");if(s==="a"&&!r)throw new TypeError("Private accessor was defined without a setter");if(typeof e=="function"?t!==e||!r:!e.has(t))throw new TypeError("Cannot write private member to an object whose class did not declare it");return s==="a"?r.call(t,n):r?r.value=n:e.set(t,n),n},P,j,_,T,N,D;class O{get address(){return m(this,P,"f")}get publicKey(){return m(this,j,"f").slice()}get chains(){return m(this,_,"f").slice()}get features(){return m(this,T,"f").slice()}get label(){return m(this,N,"f")}get icon(){return m(this,D,"f")}constructor(e){P.set(this,void 0),j.set(this,void 0),_.set(this,void 0),T.set(this,void 0),N.set(this,void 0),D.set(this,void 0),new.target===O&&Object.freeze(this),b(this,P,e.address,"f"),b(this,j,e.publicKey.slice(),"f"),b(this,_,e.chains.slice(),"f"),b(this,T,e.features.slice(),"f"),b(this,N,e.label,"f"),b(this,D,e.icon,"f")}}P=new WeakMap,j=new WeakMap,_=new WeakMap,T=new WeakMap,N=new WeakMap,D=new WeakMap;const X=["sui:devnet","sui:testnet","sui:localnet","sui:mainnet"];new TextEncoder;const J=new TextDecoder;function Ce(t){if(Uint8Array.fromBase64)return Uint8Array.fromBase64(t);const e=atob(t),n=new Uint8Array(e.length);for(let s=0;s<e.length;s++)n[s]=e.charCodeAt(s);return n}function Ae(t){if(Uint8Array.fromBase64)return Uint8Array.fromBase64(typeof t=="string"?t:J.decode(t),{alphabet:"base64url"});let e=t;e instanceof Uint8Array&&(e=J.decode(e)),e=e.replace(/-/g,"+").replace(/_/g,"/");try{return Ce(e)}catch{throw new TypeError("The input to be decoded is not correctly encoded.")}}class Se extends Error{static code="ERR_JOSE_GENERIC";code="ERR_JOSE_GENERIC";constructor(e,n){super(e,n),this.name=this.constructor.name,Error.captureStackTrace?.(this,this.constructor)}}class I extends Se{static code="ERR_JWT_INVALID";code="ERR_JWT_INVALID"}const Pe=t=>typeof t=="object"&&t!==null;function je(t){if(!Pe(t)||Object.prototype.toString.call(t)!=="[object Object]")return!1;if(Object.getPrototypeOf(t)===null)return!0;let e=t;for(;Object.getPrototypeOf(e)!==null;)e=Object.getPrototypeOf(e);return Object.getPrototypeOf(t)===e}function _e(t){if(typeof t!="string")throw new I("JWTs must use Compact JWS serialization, JWT must be a string");const{1:e,length:n}=t.split(".");if(n===5)throw new I("Only JWTs using Compact JWS serialization can be decoded");if(n!==3)throw new I("Invalid JWT");if(!e)throw new I("JWTs must contain a payload");let s;try{s=Ae(e)}catch{throw new I("Failed to base64url decode the payload")}let r;try{r=JSON.parse(J.decode(s))}catch{throw new I("Failed to parse the decoded payload as JSON")}if(!je(r))throw new I("Invalid JWT Claims Set");return r}const Te=h({exp:Z(),iat:Z(),iss:c(),aud:c(),payload:h({accounts:z(h({address:c(),publicKey:c(),label:G(c())}))})});function Ne(t){const e=_e(t);return he(Te,e)}const De=h({id:pe(c(),H()),source:g("web-wallet-channel"),payload:L("type",[h({type:g("reject"),reason:G(c("`reason` must be a string"))}),h({type:g("resolve"),data:L("type",[h({type:g("connect"),session:c("`session` is required")}),h({type:g("sign-transaction"),bytes:c(),signature:c()}),h({type:g("sign-and-execute-transaction"),bytes:c(),signature:c(),digest:c(),effects:c()}),h({type:g("sign-personal-message"),bytes:c(),signature:c()})])})]),version:g("1")});function We(){return{version:"1",originUrl:window.location.href,userAgent:navigator.userAgent,screenResolution:`${window.screen.width}x${window.screen.height}`,language:navigator.language,platform:navigator.platform,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,timestamp:Date.now()}}var Re=class{#e;#c="1";#r;#t;#n;#s;#l;#u;#d;#h;#o=null;#p=!1;constructor({appName:t,hostOrigin:e,hostPathname:n="dapp-request",extraRequestOptions:s,popupWindow:r}){const i=r??window.open("about:blank","_blank");if(!i)throw new Error("Failed to open new window");this.#r=crypto.randomUUID(),this.#e=i,this.#t=e,this.#n=n,this.#s=t;const{promise:a,resolve:l,reject:o}=ee();this.#u=a,this.#d=l,this.#h=o,this.#l=s,this.#o=setInterval(()=>{try{this.#e.closed&&(this.#a(),o(new Error("User closed the wallet window")))}catch{}},1e3)}send({type:t,...e}){if(this.#e.closed)throw new Error("User closed the wallet window");if(this.#p)throw new Error("send() can only be called once");this.#p=!0,window.addEventListener("message",this.#i);const n={version:this.#c,requestId:this.#r,appUrl:window.location.href.split("#")[0],appName:this.#s,payload:{type:t,...e},metadata:We(),extraRequestOptions:this.#l},s=encodeURIComponent(btoa(JSON.stringify(n)));return this.#e.location.assign(`${this.#t}/${this.#n}#${s}`),this.#u}close(){this.#a(),this.#e.close()}#i=t=>{if(t.origin!==this.#t)return;const{success:e,output:n}=fe(De,t.data);!e||n.id!==this.#r||(this.#a(),n.payload.type==="reject"?this.#h(new Error(n.payload.reason||"User rejected the request")):n.payload.type==="resolve"&&this.#d(n.payload.data))};#a(){this.#o&&(clearInterval(this.#o),this.#o=null),window.removeEventListener("message",this.#i)}};const Me="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0Ij4KICA8ZGVmcz4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0id2FsbGV0R3JhZCIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMTAwJSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCUiIHN0eWxlPSJzdG9wLWNvbG9yOiM2MzY2RjEiIC8+CiAgICAgIDxzdG9wIG9mZnNldD0iMTAwJSIgc3R5bGU9InN0b3AtY29sb3I6IzI1NjNFQiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImZsYXBHcmFkIiB4MT0iMCUiIHkxPSIwJSIgeDI9IjEwMCUiIHkyPSIxMDAlIj4KICAgICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3R5bGU9InN0b3AtY29sb3I6IzgxOENGOCIgLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxMDAlIiBzdHlsZT0ic3RvcC1jb2xvcjojNEY0NkU1IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICA8L2RlZnM+CiAgPCEtLSBTaGFkb3cgLS0+CiAgPHJlY3QgeD0iOSIgeT0iMjEiIHdpZHRoPSI1MCIgaGVpZ2h0PSIzNiIgcng9IjYiIHJ5PSI2IiBmaWxsPSIjMDAwIiBvcGFjaXR5PSIwLjEiIC8+CiAgPCEtLSBXYWxsZXQgYm9keSAtLT4KICA8cmVjdCB4PSI2IiB5PSIxOCIgd2lkdGg9IjUwIiBoZWlnaHQ9IjM2IiByeD0iNiIgcnk9IjYiIGZpbGw9InVybCgjd2FsbGV0R3JhZCkiIC8+CiAgPCEtLSBGbGFwIC0tPgogIDxwYXRoIGQ9Ik02IDI2IEw2IDIyIEM2IDE1IDggMTIgMTQgMTIgTDQ2IDEyIEM1MiAxMiA1NiAxNSA1NiAyMiBMNTYgMjYgWiIgZmlsbD0idXJsKCNmbGFwR3JhZCkiIC8+CiAgPCEtLSBDbGFzcCAtLT4KICA8cmVjdCB4PSI0MiIgeT0iMzAiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxMiIgcng9IjQiIHJ5PSI0IiBmaWxsPSIjNDMzOENBIiAvPgogIDwhLS0gR29sZCBjb2luIGluIGNsYXNwIC0tPgogIDxjaXJjbGUgY3g9IjQ4IiBjeT0iMzYiIHI9IjMuNSIgZmlsbD0iI0ZDRDM0RCIgLz4KICA8Y2lyY2xlIGN4PSI0OCIgY3k9IjM2IiByPSIyIiBmaWxsPSIjRjU5RTBCIiAvPgogIDwhLS0gRW1ib3NzZWQgRFcgdGV4dCAtLT4KICA8dGV4dCB4PSIyNiIgeT0iNDUiIGZvbnQtZmFtaWx5PSJBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIiBmb250LXdlaWdodD0iOTAwIiBmb250LXNpemU9IjE4IiBmaWxsPSIjMzczMEEzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBkb21pbmFudC1iYXNlbGluZT0ibWlkZGxlIiBsZXR0ZXItc3BhY2luZz0iMiI+RFc8L3RleHQ+CiAgPHRleHQgeD0iMjYiIHk9IjQ0IiBmb250LWZhbWlseT0iQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZiIgZm9udC13ZWlnaHQ9IjkwMCIgZm9udC1zaXplPSIxOCIgZmlsbD0iI0M3RDJGRSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZG9taW5hbnQtYmFzZWxpbmU9Im1pZGxlIiBsZXR0ZXItc3BhY2luZz0iMiI+RFc8L3RleHQ+Cjwvc3ZnPgo=",xe="Dev Wallet (Web)",ke="http://localhost:5174",Ze=["sui:signTransaction","sui:signAndExecuteTransaction","sui:signPersonalMessage"];class U{#e;#c;#r;#t;#n=[];#s;constructor(e){this.#e=e?.name??xe,this.#c=e?.icon??Me,this.#r=e?.origin??ke,this.#t=`dev-wallet:session:${this.#r}`,this.#s=te(),this.#I()}static register(e){const n=new U(e);return me().register(n)}get version(){return"1.0.0"}get name(){return this.#e}get icon(){return this.#c}get chains(){return X}get accounts(){return this.#n}get features(){return{"standard:connect":{version:"1.0.0",connect:this.#u},"standard:events":{version:"1.0.0",on:this.#l},"standard:disconnect":{version:"1.0.0",disconnect:this.#d},"sui:signPersonalMessage":{version:"1.1.0",signPersonalMessage:this.#h},"sui:signTransaction":{version:"2.0.0",signTransaction:this.#o},"sui:signAndExecuteTransaction":{version:"2.0.0",signAndExecuteTransaction:this.#p}}}#l=(e,n)=>(this.#s.on(e,n),()=>this.#s.off(e,n));#u=async()=>{const n=await this.#i().send({type:"connect"});return this.#y(n.session),this.#g(n.session),{accounts:this.accounts}};#d=async()=>{this.#f(),this.#n=[],this.#s.emit("change",{accounts:this.#n})};#h=async e=>{const s=await this.#i().send({type:"sign-personal-message",message:$(e.message),address:e.account.address,chain:e.chain??e.account.chains[0]??"sui:unknown",session:this.#a()});return{bytes:s.bytes,signature:s.signature}};#o=async e=>{const n=await e.transaction.toJSON(),r=await this.#i().send({type:"sign-transaction",transaction:n,address:e.account.address,chain:e.chain,session:this.#a()});return{bytes:r.bytes,signature:r.signature}};#p=async e=>{const n=await e.transaction.toJSON(),r=await this.#i().send({type:"sign-and-execute-transaction",transaction:n,address:e.account.address,chain:e.chain,session:this.#a()});return{bytes:r.bytes,signature:r.signature,digest:r.digest,effects:r.effects}};#i(){return new Re({appName:this.#e,hostOrigin:this.#r})}#a(){if(typeof localStorage>"u")throw new Error("No active session. Call connect() first.");const e=localStorage.getItem(this.#t);if(!e)throw new Error("No active session. Call connect() first.");return e}#y(e){typeof localStorage<"u"&&localStorage.setItem(this.#t,e)}#f(){typeof localStorage<"u"&&localStorage.removeItem(this.#t)}#g(e){const n=Ne(e);this.#n=n.payload.accounts.map(s=>new O({address:s.address,publicKey:s.publicKey?q(s.publicKey):new Uint8Array(0),chains:[...X],features:[...Ze],label:s.label})),this.#s.emit("change",{accounts:this.#n})}#I(){if(typeof localStorage>"u")return;const e=localStorage.getItem(this.#t);if(e)try{this.#g(e)}catch{this.#f()}}}function Ge(t){const e=({register:n})=>n(t);try{window.dispatchEvent(new CustomEvent("wallet-standard:register-wallet",{bubbles:!1,cancelable:!1,composed:!1,detail:e}))}catch(n){console.error(`wallet-standard:register-wallet event could not be dispatched
|
|
4
|
-
`,
|
|
5
|
-
`,
|
|
1
|
+
(function(){function $(t){return Uint8Array.from(atob(t),e=>e.charCodeAt(0))}var T=8192;function ee(t){if(t.length<T)return btoa(String.fromCharCode(...t));let e="";for(var i=0;i<t.length;i+=T){const s=t.slice(i,i+T);e+=String.fromCharCode(...s)}return btoa(e)}function te(){let t,e;return{promise:new Promise((i,s)=>{t=i,e=s}),resolve:t,reject:e}}function ie(t){return t=t||new Map,{all:t,on(e,i){const s=t.get(e);s?s.push(i):t.set(e,[i])},off(e,i){const s=t.get(e);s&&(i?s.splice(s.indexOf(i)>>>0,1):t.set(e,[]))},emit(e,i){let s=t.get(e);s&&s.slice().map(r=>{r(i)}),s=t.get("*"),s&&s.slice().map(r=>{r(e,i)})}}}var E,se={lang:void 0,message:void 0,abortEarly:void 0,abortPipeEarly:void 0};function x(t){return!t&&!E?se:{lang:t?.lang??E?.lang,message:t?.message,abortEarly:t?.abortEarly??E?.abortEarly,abortPipeEarly:t?.abortPipeEarly??E?.abortPipeEarly}}var re;function ne(t){return re?.get(t)}var ae;function oe(t){return ae?.get(t)}var le;function ce(t,e){return le?.get(t)?.get(e)}function J(t){const e=typeof t;return e==="string"?`"${t}"`:e==="number"||e==="bigint"||e==="boolean"?`${t}`:e==="object"||e==="function"?(t&&Object.getPrototypeOf(t)?.constructor?.name)??"null":e}function h(t,e,i,s,r){const n=r&&"input"in r?r.input:i.value,a=r?.expected??t.expects??null,c=r?.received??J(n),o={kind:t.kind,type:t.type,input:n,expected:a,received:c,message:`Invalid ${e}: ${a?`Expected ${a} but r`:"R"}eceived ${c}`,requirement:t.requirement,path:r?.path,issues:r?.issues,lang:s.lang,abortEarly:s.abortEarly,abortPipeEarly:s.abortPipeEarly},u=t.kind==="schema",d=r?.message??t.message??ce(t.reference,o.lang)??(u?oe(o.lang):null)??s.message??ne(o.lang);d!==void 0&&(o.message=typeof d=="function"?d(o):d),u&&(i.typed=!1),i.issues?i.issues.push(o):i.issues=[o]}var H=new WeakMap;function f(t){let e=H.get(t);return e||(e={version:1,vendor:"valibot",validate(i){return t["~run"]({value:i},x())}},H.set(t,e)),e}function ue(t,e){const i=[...new Set(t)];return i.length>1?`(${i.join(` ${e} `)})`:i[0]??"never"}var de=class extends Error{constructor(t){super(t[0].message),this.name="ValiError",this.issues=t}},Ie=/^[\da-f]{8}(?:-[\da-f]{4}){3}-[\da-f]{12}$/iu;function Y(t){return{kind:"validation",type:"uuid",reference:Y,async:!1,expects:null,requirement:Ie,message:t,"~run"(e,i){return e.typed&&!this.requirement.test(e.value)&&h(this,"UUID",e,i),e}}}var ge={abortEarly:!0};function he(t,e,i){return typeof t.fallback=="function"?t.fallback(e,i):t.fallback}function z(t,e,i){return typeof t.default=="function"?t.default(e,i):t.default}function F(t,e){return{kind:"schema",type:"array",reference:F,expects:"Array",async:!1,item:t,message:e,get"~standard"(){return f(this)},"~run"(i,s){const r=i.value;if(Array.isArray(r)){i.typed=!0,i.value=[];for(let n=0;n<r.length;n++){const a=r[n],c=this.item["~run"]({value:a},s);if(c.issues){const o={type:"array",origin:"value",input:r,key:n,value:a};for(const u of c.issues)u.path?u.path.unshift(o):u.path=[o],i.issues?.push(u);if(i.issues||(i.issues=c.issues),s.abortEarly){i.typed=!1;break}}c.typed||(i.typed=!1),i.value.push(c.value)}}else h(this,"type",i,s);return i}}}function p(t,e){return{kind:"schema",type:"literal",reference:p,expects:J(t),async:!1,literal:t,message:e,get"~standard"(){return f(this)},"~run"(i,s){return i.value===this.literal?i.typed=!0:h(this,"type",i,s),i}}}function B(t){return{kind:"schema",type:"number",reference:B,expects:"number",async:!1,message:t,get"~standard"(){return f(this)},"~run"(e,i){return typeof e.value=="number"&&!isNaN(e.value)?e.typed=!0:h(this,"type",e,i),e}}}function I(t,e){return{kind:"schema",type:"object",reference:I,expects:"Object",async:!1,entries:t,message:e,get"~standard"(){return f(this)},"~run"(i,s){const r=i.value;if(r&&typeof r=="object"){i.typed=!0,i.value={};for(const n in this.entries){const a=this.entries[n];if(n in r||(a.type==="exact_optional"||a.type==="optional"||a.type==="nullish")&&a.default!==void 0){const c=n in r?r[n]:z(a),o=a["~run"]({value:c},s);if(o.issues){const u={type:"object",origin:"value",input:r,key:n,value:c};for(const d of o.issues)d.path?d.path.unshift(u):d.path=[u],i.issues?.push(d);if(i.issues||(i.issues=o.issues),s.abortEarly){i.typed=!1;break}}o.typed||(i.typed=!1),i.value[n]=o.value}else if(a.fallback!==void 0)i.value[n]=he(a);else if(a.type!=="exact_optional"&&a.type!=="optional"&&a.type!=="nullish"&&(h(this,"key",i,s,{input:void 0,expected:`"${n}"`,path:[{type:"object",origin:"key",input:r,key:n,value:r[n]}]}),s.abortEarly))break}}else h(this,"type",i,s);return i}}}function k(t,e){return{kind:"schema",type:"optional",reference:k,expects:`(${t.expects} | undefined)`,async:!1,wrapped:t,default:e,get"~standard"(){return f(this)},"~run"(i,s){return i.value===void 0&&(this.default!==void 0&&(i.value=z(this,i,s)),i.value===void 0)?(i.typed=!0,i):this.wrapped["~run"](i,s)}}}function l(t){return{kind:"schema",type:"string",reference:l,expects:"string",async:!1,message:t,get"~standard"(){return f(this)},"~run"(e,i){return typeof e.value=="string"?e.typed=!0:h(this,"type",e,i),e}}}function _(t,e,i){return{kind:"schema",type:"variant",reference:_,expects:"Object",async:!1,key:t,options:e,message:i,get"~standard"(){return f(this)},"~run"(s,r){const n=s.value;if(n&&typeof n=="object"){let a,c=0,o=this.key,u=[];const d=(Ve,Q)=>{for(const v of Ve.options){if(v.type==="variant")d(v,new Set(Q).add(v.key));else{let V=!0,G=0;for(const g of Q){const R=v.entries[g];if(g in n?R["~run"]({typed:!1,value:n[g]},ge).issues:R.type!=="exact_optional"&&R.type!=="optional"&&R.type!=="nullish"){V=!1,o!==g&&(c<G||c===G&&g in n&&!(o in n))&&(c=G,o=g,u=[]),o===g&&u.push(v.entries[g].expects);break}G++}if(V){const g=v["~run"]({value:n},r);(!a||!a.typed&&g.typed)&&(a=g)}}if(a&&!a.issues)break}};if(d(this,new Set([this.key])),a)return a;h(this,"type",s,r,{input:n[o],expected:ue(u,"|"),path:[{type:"object",origin:"value",input:n,key:o,value:n[o]}]})}else h(this,"type",s,r);return s}}}function pe(t,e,i){const s=t["~run"]({value:e},x(i));if(s.issues)throw new de(s.issues);return s.value}function fe(...t){return{...t[0],pipe:t,get"~standard"(){return f(this)},"~run"(e,i){for(const s of t)if(s.kind!=="metadata"){if(e.issues&&(s.kind==="schema"||s.kind==="transformation")){e.typed=!1;break}(!e.issues||!i.abortEarly&&!i.abortPipeEarly)&&(e=s["~run"](e,i))}return e}}}function ye(t,e,i){const s=t["~run"]({value:e},x(i));return{typed:s.typed,success:!s.issues,output:s.value,issues:s.issues}}var be=function(t,e,i,s){if(i==="a"&&!s)throw new TypeError("Private accessor was defined without a getter");if(typeof e=="function"?t!==e||!s:!e.has(t))throw new TypeError("Cannot read private member from an object whose class did not declare it");return i==="m"?s:i==="a"?s.call(t):s?s.value:e.get(t)},me=function(t,e,i,s,r){if(s==="m")throw new TypeError("Private method is not writable");if(s==="a"&&!r)throw new TypeError("Private accessor was defined without a setter");if(typeof e=="function"?t!==e||!r:!e.has(t))throw new TypeError("Cannot write private member to an object whose class did not declare it");return s==="a"?r.call(t,i):r?r.value=i:e.set(t,i),i},S,C=void 0,j=new Set;function we(t){A=void 0,j.add(t)}function ve(t){A=void 0,j.delete(t)}var b={};function Ce(){if(C||(C=Object.freeze({register:O,get:Ae,on:Ee}),typeof window>"u"))return C;const t=Object.freeze({register:O});try{window.addEventListener("wallet-standard:register-wallet",({detail:e})=>e(t))}catch(e){console.error(`wallet-standard:register-wallet event listener could not be added
|
|
2
|
+
`,e)}try{window.dispatchEvent(new Se(t))}catch(e){console.error(`wallet-standard:app-ready event could not be dispatched
|
|
3
|
+
`,e)}return C}function O(...t){return t=t.filter(e=>!j.has(e)),t.length?(t.forEach(e=>we(e)),b.register?.forEach(e=>U(()=>e(...t))),function(){t.forEach(i=>ve(i)),b.unregister?.forEach(i=>U(()=>i(...t)))}):()=>{}}var A;function Ae(){return A||(A=[...j]),A}function Ee(t,e){return b[t]?.push(e)||(b[t]=[e]),function(){b[t]=b[t]?.filter(s=>e!==s)}}function U(t){try{t()}catch(e){console.error(e)}}var Se=class extends Event{get detail(){return be(this,S,"f")}get type(){return"wallet-standard:app-ready"}constructor(t){super("wallet-standard:app-ready",{bubbles:!1,cancelable:!1,composed:!1}),S.set(this,void 0),me(this,S,t,"f")}preventDefault(){throw new Error("preventDefault cannot be called")}stopImmediatePropagation(){throw new Error("stopImmediatePropagation cannot be called")}stopPropagation(){throw new Error("stopPropagation cannot be called")}};S=new WeakMap;var m=function(t,e,i,s){if(i==="a"&&!s)throw new TypeError("Private accessor was defined without a getter");if(typeof e=="function"?t!==e||!s:!e.has(t))throw new TypeError("Cannot read private member from an object whose class did not declare it");return i==="m"?s:i==="a"?s.call(t):s?s.value:e.get(t)},w=function(t,e,i,s,r){if(s==="m")throw new TypeError("Private method is not writable");if(s==="a"&&!r)throw new TypeError("Private accessor was defined without a setter");if(typeof e=="function"?t!==e||!r:!e.has(t))throw new TypeError("Cannot write private member to an object whose class did not declare it");return s==="a"?r.call(t,i):r?r.value=i:e.set(t,i),i},P,Z,M,D,W,N,je=class K{get address(){return m(this,P,"f")}get publicKey(){return m(this,Z,"f").slice()}get chains(){return m(this,M,"f").slice()}get features(){return m(this,D,"f").slice()}get label(){return m(this,W,"f")}get icon(){return m(this,N,"f")}constructor(e){P.set(this,void 0),Z.set(this,void 0),M.set(this,void 0),D.set(this,void 0),W.set(this,void 0),N.set(this,void 0),new.target===K&&Object.freeze(this),w(this,P,e.address,"f"),w(this,Z,e.publicKey.slice(),"f"),w(this,M,e.chains.slice(),"f"),w(this,D,e.features.slice(),"f"),w(this,W,e.label,"f"),w(this,N,e.icon,"f")}};P=new WeakMap,Z=new WeakMap,M=new WeakMap,D=new WeakMap,W=new WeakMap,N=new WeakMap;var Pe="sui:devnet",Ze="sui:testnet",Me="sui:localnet",De="sui:mainnet",X=[Pe,Ze,Me,De],Ke=new TextEncoder,L=new TextDecoder;function We(t){if(Uint8Array.fromBase64)return Uint8Array.fromBase64(t);const e=atob(t),i=new Uint8Array(e.length);for(let s=0;s<e.length;s++)i[s]=e.charCodeAt(s);return i}function Ne(t){if(Uint8Array.fromBase64)return Uint8Array.fromBase64(typeof t=="string"?t:L.decode(t),{alphabet:"base64url"});let e=t;e instanceof Uint8Array&&(e=L.decode(e)),e=e.replace(/-/g,"+").replace(/_/g,"/");try{return We(e)}catch{throw new TypeError("The input to be decoded is not correctly encoded.")}}var Ge=class extends Error{static code="ERR_JOSE_GENERIC";code="ERR_JOSE_GENERIC";constructor(t,e){super(t,e),this.name=this.constructor.name,Error.captureStackTrace?.(this,this.constructor)}},y=class extends Ge{static code="ERR_JWT_INVALID";code="ERR_JWT_INVALID"},Re=t=>typeof t=="object"&&t!==null;function Te(t){if(!Re(t)||Object.prototype.toString.call(t)!=="[object Object]")return!1;if(Object.getPrototypeOf(t)===null)return!0;let e=t;for(;Object.getPrototypeOf(e)!==null;)e=Object.getPrototypeOf(e);return Object.getPrototypeOf(t)===e}function xe(t){if(typeof t!="string")throw new y("JWTs must use Compact JWS serialization, JWT must be a string");const{1:e,length:i}=t.split(".");if(i===5)throw new y("Only JWTs using Compact JWS serialization can be decoded");if(i!==3)throw new y("Invalid JWT");if(!e)throw new y("JWTs must contain a payload");let s;try{s=Ne(e)}catch{throw new y("Failed to base64url decode the payload")}let r;try{r=JSON.parse(L.decode(s))}catch{throw new y("Failed to parse the decoded payload as JSON")}if(!Te(r))throw new y("Invalid JWT Claims Set");return r}var Be=I({address:l(),publicKey:l(),label:k(l())}),ke=I({exp:B(),iat:B(),iss:l(),aud:l(),payload:I({accounts:F(Be)})});function _e(t){const e=xe(t);return pe(ke,e)}var Le=_("type",[I({type:p("connect"),session:l("`session` is required")}),I({type:p("sign-transaction"),bytes:l(),signature:l()}),I({type:p("sign-and-execute-transaction"),bytes:l(),signature:l(),digest:l(),effects:l()}),I({type:p("sign-personal-message"),bytes:l(),signature:l()})]),Je=_("type",[I({type:p("reject"),reason:k(l("`reason` must be a string"))}),I({type:p("resolve"),data:Le})]),He=I({id:fe(l(),Y()),source:p("web-wallet-channel"),payload:Je,version:p("1")});function Ye(){return{version:"1",originUrl:window.location.href,userAgent:navigator.userAgent,screenResolution:`${window.screen.width}x${window.screen.height}`,language:navigator.language,platform:navigator.platform,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,timestamp:Date.now()}}var ze=class{#e;#l="1";#r;#t;#i;#s;#c;#u;#d;#I;#o=null;#g=!1;constructor({appName:t,hostOrigin:e,hostPathname:i="dapp-request",extraRequestOptions:s,popupWindow:r}){const n=r??window.open("about:blank","_blank");if(!n)throw new Error("Failed to open new window");this.#r=crypto.randomUUID(),this.#e=n,this.#t=e,this.#i=i,this.#s=t;const{promise:a,resolve:c,reject:o}=te();this.#u=a,this.#d=c,this.#I=o,this.#c=s,this.#o=setInterval(()=>{try{this.#e.closed&&(this.#a(),o(new Error("User closed the wallet window")))}catch{}},1e3)}send({type:t,...e}){if(this.#e.closed)throw new Error("User closed the wallet window");if(this.#g)throw new Error("send() can only be called once");this.#g=!0,window.addEventListener("message",this.#n);const i={version:this.#l,requestId:this.#r,appUrl:window.location.href.split("#")[0],appName:this.#s,payload:{type:t,...e},metadata:Ye(),extraRequestOptions:this.#c},s=encodeURIComponent(btoa(JSON.stringify(i)));return this.#e.location.assign(`${this.#t}/${this.#i}#${s}`),this.#u}close(){this.#a(),this.#e.close()}#n=t=>{if(t.origin!==this.#t)return;const{success:e,output:i}=ye(He,t.data);!e||i.id!==this.#r||(this.#a(),i.payload.type==="reject"?this.#I(new Error(i.payload.reason||"User rejected the request")):i.payload.type==="resolve"&&this.#d(i.payload.data))};#a(){this.#o&&(clearInterval(this.#o),this.#o=null),window.removeEventListener("message",this.#n)}},qe="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0Ij4KICA8ZGVmcz4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0id2FsbGV0R3JhZCIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMTAwJSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCUiIHN0eWxlPSJzdG9wLWNvbG9yOiM2MzY2RjEiIC8+CiAgICAgIDxzdG9wIG9mZnNldD0iMTAwJSIgc3R5bGU9InN0b3AtY29sb3I6IzI1NjNFQiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImZsYXBHcmFkIiB4MT0iMCUiIHkxPSIwJSIgeDI9IjEwMCUiIHkyPSIxMDAlIj4KICAgICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3R5bGU9InN0b3AtY29sb3I6IzgxOENGOCIgLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxMDAlIiBzdHlsZT0ic3RvcC1jb2xvcjojNEY0NkU1IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICA8L2RlZnM+CiAgPCEtLSBTaGFkb3cgLS0+CiAgPHJlY3QgeD0iOSIgeT0iMjEiIHdpZHRoPSI1MCIgaGVpZ2h0PSIzNiIgcng9IjYiIHJ5PSI2IiBmaWxsPSIjMDAwIiBvcGFjaXR5PSIwLjEiIC8+CiAgPCEtLSBXYWxsZXQgYm9keSAtLT4KICA8cmVjdCB4PSI2IiB5PSIxOCIgd2lkdGg9IjUwIiBoZWlnaHQ9IjM2IiByeD0iNiIgcnk9IjYiIGZpbGw9InVybCgjd2FsbGV0R3JhZCkiIC8+CiAgPCEtLSBGbGFwIC0tPgogIDxwYXRoIGQ9Ik02IDI2IEw2IDIyIEM2IDE1IDggMTIgMTQgMTIgTDQ2IDEyIEM1MiAxMiA1NiAxNSA1NiAyMiBMNTYgMjYgWiIgZmlsbD0idXJsKCNmbGFwR3JhZCkiIC8+CiAgPCEtLSBDbGFzcCAtLT4KICA8cmVjdCB4PSI0MiIgeT0iMzAiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxMiIgcng9IjQiIHJ5PSI0IiBmaWxsPSIjNDMzOENBIiAvPgogIDwhLS0gR29sZCBjb2luIGluIGNsYXNwIC0tPgogIDxjaXJjbGUgY3g9IjQ4IiBjeT0iMzYiIHI9IjMuNSIgZmlsbD0iI0ZDRDM0RCIgLz4KICA8Y2lyY2xlIGN4PSI0OCIgY3k9IjM2IiByPSIyIiBmaWxsPSIjRjU5RTBCIiAvPgogIDwhLS0gRW1ib3NzZWQgRFcgdGV4dCAtLT4KICA8dGV4dCB4PSIyNiIgeT0iNDUiIGZvbnQtZmFtaWx5PSJBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIiBmb250LXdlaWdodD0iOTAwIiBmb250LXNpemU9IjE4IiBmaWxsPSIjMzczMEEzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBkb21pbmFudC1iYXNlbGluZT0ibWlkZGxlIiBsZXR0ZXItc3BhY2luZz0iMiI+RFc8L3RleHQ+CiAgPHRleHQgeD0iMjYiIHk9IjQ0IiBmb250LWZhbWlseT0iQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZiIgZm9udC13ZWlnaHQ9IjkwMCIgZm9udC1zaXplPSIxOCIgZmlsbD0iI0M3RDJGRSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZG9taW5hbnQtYmFzZWxpbmU9Im1pZGxlIiBsZXR0ZXItc3BhY2luZz0iMiI+RFc8L3RleHQ+Cjwvc3ZnPgo=",Fe="Dev Wallet (Web)",Oe="http://localhost:5174",Ue=["sui:signTransaction","sui:signAndExecuteTransaction","sui:signPersonalMessage"],Xe=class q{#e;#l;#r;#t;#i=[];#s;constructor(e){this.#e=e?.name??Fe,this.#l=e?.icon??"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0Ij4KICA8ZGVmcz4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0id2FsbGV0R3JhZCIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMTAwJSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCUiIHN0eWxlPSJzdG9wLWNvbG9yOiM2MzY2RjEiIC8+CiAgICAgIDxzdG9wIG9mZnNldD0iMTAwJSIgc3R5bGU9InN0b3AtY29sb3I6IzI1NjNFQiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImZsYXBHcmFkIiB4MT0iMCUiIHkxPSIwJSIgeDI9IjEwMCUiIHkyPSIxMDAlIj4KICAgICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3R5bGU9InN0b3AtY29sb3I6IzgxOENGOCIgLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxMDAlIiBzdHlsZT0ic3RvcC1jb2xvcjojNEY0NkU1IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICA8L2RlZnM+CiAgPCEtLSBTaGFkb3cgLS0+CiAgPHJlY3QgeD0iOSIgeT0iMjEiIHdpZHRoPSI1MCIgaGVpZ2h0PSIzNiIgcng9IjYiIHJ5PSI2IiBmaWxsPSIjMDAwIiBvcGFjaXR5PSIwLjEiIC8+CiAgPCEtLSBXYWxsZXQgYm9keSAtLT4KICA8cmVjdCB4PSI2IiB5PSIxOCIgd2lkdGg9IjUwIiBoZWlnaHQ9IjM2IiByeD0iNiIgcnk9IjYiIGZpbGw9InVybCgjd2FsbGV0R3JhZCkiIC8+CiAgPCEtLSBGbGFwIC0tPgogIDxwYXRoIGQ9Ik02IDI2IEw2IDIyIEM2IDE1IDggMTIgMTQgMTIgTDQ2IDEyIEM1MiAxMiA1NiAxNSA1NiAyMiBMNTYgMjYgWiIgZmlsbD0idXJsKCNmbGFwR3JhZCkiIC8+CiAgPCEtLSBDbGFzcCAtLT4KICA8cmVjdCB4PSI0MiIgeT0iMzAiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxMiIgcng9IjQiIHJ5PSI0IiBmaWxsPSIjNDMzOENBIiAvPgogIDwhLS0gR29sZCBjb2luIGluIGNsYXNwIC0tPgogIDxjaXJjbGUgY3g9IjQ4IiBjeT0iMzYiIHI9IjMuNSIgZmlsbD0iI0ZDRDM0RCIgLz4KICA8Y2lyY2xlIGN4PSI0OCIgY3k9IjM2IiByPSIyIiBmaWxsPSIjRjU5RTBCIiAvPgogIDwhLS0gRW1ib3NzZWQgRFcgdGV4dCAtLT4KICA8dGV4dCB4PSIyNiIgeT0iNDUiIGZvbnQtZmFtaWx5PSJBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIiBmb250LXdlaWdodD0iOTAwIiBmb250LXNpemU9IjE4IiBmaWxsPSIjMzczMEEzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBkb21pbmFudC1iYXNlbGluZT0ibWlkZGxlIiBsZXR0ZXItc3BhY2luZz0iMiI+RFc8L3RleHQ+CiAgPHRleHQgeD0iMjYiIHk9IjQ0IiBmb250LWZhbWlseT0iQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZiIgZm9udC13ZWlnaHQ9IjkwMCIgZm9udC1zaXplPSIxOCIgZmlsbD0iI0M3RDJGRSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZG9taW5hbnQtYmFzZWxpbmU9Im1pZGxlIiBsZXR0ZXItc3BhY2luZz0iMiI+RFc8L3RleHQ+Cjwvc3ZnPgo=",this.#r=e?.origin??Oe,this.#t=`dev-wallet:session:${this.#r}`,this.#s=ie(),this.#y()}static register(e){const i=new q(e);return Ce().register(i)}get version(){return"1.0.0"}get name(){return this.#e}get icon(){return this.#l}get chains(){return X}get accounts(){return this.#i}get features(){return{"standard:connect":{version:"1.0.0",connect:this.#u},"standard:events":{version:"1.0.0",on:this.#c},"standard:disconnect":{version:"1.0.0",disconnect:this.#d},"sui:signPersonalMessage":{version:"1.1.0",signPersonalMessage:this.#I},"sui:signTransaction":{version:"2.0.0",signTransaction:this.#o},"sui:signAndExecuteTransaction":{version:"2.0.0",signAndExecuteTransaction:this.#g}}}#c=(e,i)=>(this.#s.on(e,i),()=>this.#s.off(e,i));#u=async()=>{const e=await this.#n().send({type:"connect"});return this.#f(e.session),this.#p(e.session),{accounts:this.accounts}};#d=async()=>{this.#h(),this.#i=[],this.#s.emit("change",{accounts:this.#i})};#I=async e=>{const i=await this.#n().send({type:"sign-personal-message",message:ee(e.message),address:e.account.address,chain:e.chain??e.account.chains[0]??"sui:unknown",session:this.#a()});return{bytes:i.bytes,signature:i.signature}};#o=async e=>{const i=await e.transaction.toJSON(),s=await this.#n().send({type:"sign-transaction",transaction:i,address:e.account.address,chain:e.chain,session:this.#a()});return{bytes:s.bytes,signature:s.signature}};#g=async e=>{const i=await e.transaction.toJSON(),s=await this.#n().send({type:"sign-and-execute-transaction",transaction:i,address:e.account.address,chain:e.chain,session:this.#a()});return{bytes:s.bytes,signature:s.signature,digest:s.digest,effects:s.effects}};#n(){return new ze({appName:this.#e,hostOrigin:this.#r})}#a(){if(typeof localStorage>"u")throw new Error("No active session. Call connect() first.");const e=localStorage.getItem(this.#t);if(!e)throw new Error("No active session. Call connect() first.");return e}#f(e){typeof localStorage<"u"&&localStorage.setItem(this.#t,e)}#h(){typeof localStorage<"u"&&localStorage.removeItem(this.#t)}#p(e){const i=_e(e);this.#i=i.payload.accounts.map(s=>new je({address:s.address,publicKey:s.publicKey?$(s.publicKey):new Uint8Array(0),chains:[...X],features:[...Ue],label:s.label})),this.#s.emit("change",{accounts:this.#i})}#y(){if(typeof localStorage>"u")return;const e=localStorage.getItem(this.#t);if(e)try{this.#p(e)}catch{this.#h()}}};function Qe(t){const e=({register:i})=>i(t);try{window.dispatchEvent(new CustomEvent("wallet-standard:register-wallet",{bubbles:!1,cancelable:!1,composed:!1,detail:e}))}catch(i){console.error(`wallet-standard:register-wallet event could not be dispatched
|
|
4
|
+
`,i)}try{window.addEventListener("wallet-standard:app-ready",({detail:i})=>e(i))}catch(i){console.error(`wallet-standard:app-ready event listener could not be added
|
|
5
|
+
`,i)}}(function(){if(window.__DEV_WALLET_INJECTED__){console.log("[Dev Wallet] Already injected, skipping.");return}window.__DEV_WALLET_INJECTED__=!0;const t=document.currentScript instanceof HTMLScriptElement?document.currentScript.src:null;if(!t){console.error("[Dev Wallet] Could not determine wallet origin from script src.");return}const e=new URL(t).origin;Qe(new Xe({origin:e})),console.log(`[Dev Wallet] Registered (origin: ${e})`)})()})();
|
|
@@ -37,7 +37,8 @@
|
|
|
37
37
|
font-size: 14px;
|
|
38
38
|
}
|
|
39
39
|
</style>
|
|
40
|
-
<script type="module" crossorigin src="/assets/main-
|
|
40
|
+
<script type="module" crossorigin src="/assets/main-CuOnBmaa.js"></script>
|
|
41
|
+
<link rel="modulepreload" crossorigin href="/assets/base-adapter-DET6CP7z.js">
|
|
41
42
|
</head>
|
|
42
43
|
<body>
|
|
43
44
|
<div id="app">
|
package/dist/types.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.mts","names":[],"sources":["../src/types.ts"],"mappings":";;;;UAMiB,cAAA;EAChB,OAAA;EACA,KAAA;EACA,MAAA,EAAQ,MAAA;EACR,aAAA,EAAe,
|
|
1
|
+
{"version":3,"file":"types.d.mts","names":[],"sources":["../src/types.ts"],"mappings":";;;;UAMiB,cAAA;EAChB,OAAA;EACA,KAAA;EACA,MAAA,EAAQ,MAAA;EACR,aAAA,EAAe,qBAAqB;AAAA;AAAA,UAGpB,oBAAA;EAChB,KAAA;EAAA,CACC,GAAW;AAAA;AAAA,UAGI,oBAAA;EARD;EAUf,MAAA,GAAS,MAAM;EAVqB;EAYpC,OAAA;EACA,KAAA;AAAA;;AARY;AAGb;;UAYiB,aAAA;EAAA,SACP,EAAA;EAAA,SACA,IAAA;EAZA;;;;AAGJ;EAHI,SAkBA,aAAA;EARoB;EAW7B,UAAA,IAAc,OAAA;EACd,WAAA,IAAe,cAAA;EACf,UAAA,CAAW,OAAA,WAAkB,cAAA;EAE7B,aAAA,EAAe,OAAA,GAAU,oBAAA,GAAuB,OAAA,CAAQ,cAAA;EACxD,aAAA,EAAe,OAAA,EAAS,oBAAA,GAAuB,OAAA,CAAQ,cAAA;EADC;EAGxD,qBAAA,KAA0B,OAAA,CACzB,KAAA;IAAQ,OAAA;IAAiB,MAAA;IAAgB,KAAA;EAAA;EAE1C,aAAA,EAAe,OAAA,WAAkB,OAAA;EACjC,aAAA,EAAe,OAAA,UAAiB,KAAA,WAAgB,OAAA;EAAA;EAGhD,iBAAA,CAAkB,QAAA,GAAW,QAAA,EAAU,cAAA;EACvC,OAAA;AAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copy-controller.mjs","names":["#duration","#timeout"],"sources":["../../src/ui/copy-controller.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ReactiveController, ReactiveControllerHost } from 'lit';\n\nimport { copyToClipboard } from './utils.js';\n\nexport class CopyController implements ReactiveController {\n\thost: ReactiveControllerHost;\n\tcopied = false;\n\tcopiedValue: string | null = null;\n\t#timeout: ReturnType<typeof setTimeout> | null = null;\n\t#duration: number;\n\n\tconstructor(host: ReactiveControllerHost, duration = 1500) {\n\t\tthis.#duration = duration;\n\t\tthis.host = host;\n\t\thost.addController(this);\n\t}\n\n\thostConnected(): void {}\n\n\thostDisconnected(): void {\n\t\tif (this.#timeout) {\n\t\t\tclearTimeout(this.#timeout);\n\t\t\tthis.#timeout = null;\n\t\t}\n\t}\n\n\tasync copy(text: string): Promise<boolean> {\n\t\tconst ok = await copyToClipboard(text);\n\t\tif (ok) {\n\t\t\tthis.copied = true;\n\t\t\tthis.copiedValue = text;\n\t\t\tif (this.#timeout) clearTimeout(this.#timeout);\n\t\t\tthis.#timeout = setTimeout(() => {\n\t\t\t\tthis.copied = false;\n\t\t\t\tthis.copiedValue = null;\n\t\t\t\tthis.host.requestUpdate();\n\t\t\t}, this.#duration);\n\t\t\tthis.host.requestUpdate();\n\t\t}\n\t\treturn ok;\n\t}\n\n\tisCopied(text: string): boolean {\n\t\treturn this.copied && this.copiedValue === text;\n\t}\n}\n"],"mappings":";;AAOA,IAAa,iBAAb,MAA0D;CAIzD;CACA;CAEA,YAAY,MAA8B,WAAW,MAAM;gBALlD;qBACoB;kBACoB;
|
|
1
|
+
{"version":3,"file":"copy-controller.mjs","names":["#duration","#timeout"],"sources":["../../src/ui/copy-controller.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ReactiveController, ReactiveControllerHost } from 'lit';\n\nimport { copyToClipboard } from './utils.js';\n\nexport class CopyController implements ReactiveController {\n\thost: ReactiveControllerHost;\n\tcopied = false;\n\tcopiedValue: string | null = null;\n\t#timeout: ReturnType<typeof setTimeout> | null = null;\n\t#duration: number;\n\n\tconstructor(host: ReactiveControllerHost, duration = 1500) {\n\t\tthis.#duration = duration;\n\t\tthis.host = host;\n\t\thost.addController(this);\n\t}\n\n\thostConnected(): void {}\n\n\thostDisconnected(): void {\n\t\tif (this.#timeout) {\n\t\t\tclearTimeout(this.#timeout);\n\t\t\tthis.#timeout = null;\n\t\t}\n\t}\n\n\tasync copy(text: string): Promise<boolean> {\n\t\tconst ok = await copyToClipboard(text);\n\t\tif (ok) {\n\t\t\tthis.copied = true;\n\t\t\tthis.copiedValue = text;\n\t\t\tif (this.#timeout) clearTimeout(this.#timeout);\n\t\t\tthis.#timeout = setTimeout(() => {\n\t\t\t\tthis.copied = false;\n\t\t\t\tthis.copiedValue = null;\n\t\t\t\tthis.host.requestUpdate();\n\t\t\t}, this.#duration);\n\t\t\tthis.host.requestUpdate();\n\t\t}\n\t\treturn ok;\n\t}\n\n\tisCopied(text: string): boolean {\n\t\treturn this.copied && this.copiedValue === text;\n\t}\n}\n"],"mappings":";;AAOA,IAAa,iBAAb,MAA0D;CAIzD;CACA;CAEA,YAAY,MAA8B,WAAW,MAAM;gBALlD;qBACoB;kBACoB;EAIhD,KAAKA,YAAY;EACjB,KAAK,OAAO;EACZ,KAAK,cAAc,IAAI;CACxB;CAEA,gBAAsB,CAAC;CAEvB,mBAAyB;EACxB,IAAI,KAAKC,UAAU;GAClB,aAAa,KAAKA,QAAQ;GAC1B,KAAKA,WAAW;EACjB;CACD;CAEA,MAAM,KAAK,MAAgC;EAC1C,MAAM,KAAK,MAAM,gBAAgB,IAAI;EACrC,IAAI,IAAI;GACP,KAAK,SAAS;GACd,KAAK,cAAc;GACnB,IAAI,KAAKA,UAAU,aAAa,KAAKA,QAAQ;GAC7C,KAAKA,WAAW,iBAAiB;IAChC,KAAK,SAAS;IACd,KAAK,cAAc;IACnB,KAAK,KAAK,cAAc;GACzB,GAAG,KAAKD,SAAS;GACjB,KAAK,KAAK,cAAc;EACzB;EACA,OAAO;CACR;CAEA,SAAS,MAAuB;EAC/B,OAAO,KAAK,UAAU,KAAK,gBAAgB;CAC5C;AACD"}
|
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
import { SignerAdapter } from "../types.mjs";
|
|
2
2
|
import { ReadonlyWalletAccount } from "@mysten/wallet-standard";
|
|
3
|
-
import * as _$lit from "lit";
|
|
4
3
|
import { LitElement } from "lit";
|
|
5
4
|
|
|
6
5
|
//#region src/ui/dev-wallet-account-selector.d.ts
|
|
7
6
|
declare class DevWalletAccountSelector extends LitElement {
|
|
8
7
|
#private;
|
|
9
|
-
static styles: (
|
|
8
|
+
static styles: (import("lit").CSSResult | import("lit").CSSResult[])[];
|
|
10
9
|
accounts: ReadonlyWalletAccount[];
|
|
11
10
|
adapters: SignerAdapter[];
|
|
12
11
|
activeAddress: string;
|
|
13
12
|
private _open;
|
|
14
|
-
render():
|
|
13
|
+
render(): import("lit").TemplateResult<1>;
|
|
15
14
|
}
|
|
16
15
|
declare global {
|
|
17
16
|
interface HTMLElementTagNameMap {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-wallet-account-selector.d.mts","names":[],"sources":["../../src/ui/dev-wallet-account-selector.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"dev-wallet-account-selector.d.mts","names":[],"sources":["../../src/ui/dev-wallet-account-selector.ts"],"mappings":";;;;;cAsBa,wBAAA,SAAiC,UAAA;EAAA;SAC7B,MAAA,iBAAM,SAAA,iBAAA,SAAA;EAsKtB,QAAA,EAAU,qBAAA;EAGV,QAAA,EAAU,aAAA;EAGV,aAAA;EAAA,QAGQ,KAAA;EAIC,MAAA,kBAAM,cAAA;AAAA;AAAA,QAuGR,MAAA;EAAA,UACG,qBAAA;IACT,6BAAA,EAA+B,wBAAwB;EAAA;AAAA"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { dropdownItemStyles, sharedStyles } from "./styles.mjs";
|
|
2
2
|
import { emitEvent, findAdapterForAddress, formatAddress } from "./utils.mjs";
|
|
3
3
|
import { CopyController } from "./copy-controller.mjs";
|
|
4
|
-
import { __decorate } from "../_virtual/_@oxc-project_runtime@0.
|
|
4
|
+
import { __decorate } from "../_virtual/_@oxc-project_runtime@0.135.0/helpers/esm/decorate.mjs";
|
|
5
5
|
import "./dev-wallet-dropdown.mjs";
|
|
6
6
|
import { LitElement, css, html, nothing } from "lit";
|
|
7
7
|
import { customElement, property, state } from "lit/decorators.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-wallet-account-selector.mjs","names":["#getLabel","#getAdapterName","#select","#copy"],"sources":["../../src/ui/dev-wallet-account-selector.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ReadonlyWalletAccount } from '@mysten/wallet-standard';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport type { SignerAdapter } from '../types.js';\nimport { dropdownItemStyles, sharedStyles } from './styles.js';\nimport { CopyController } from './copy-controller.js';\nimport { emitEvent, findAdapterForAddress, formatAddress } from './utils.js';\nimport './dev-wallet-dropdown.js';\n\n/** Short display names for adapter badges. */\nconst ADAPTER_SHORT_NAMES: Record<string, string> = {\n\t'WebCrypto Signer': 'WebCrypto',\n\t'Remote CLI Signer': 'CLI',\n\t'In-Memory Signer': 'Memory',\n\t'Passkey Signer': 'Passkey',\n};\n\n@customElement('dev-wallet-account-selector')\nexport class DevWalletAccountSelector extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tdropdownItemStyles,\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: block;\n\t\t\t}\n\n\t\t\t.active-account {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 10px;\n\t\t\t\twidth: 100%;\n\t\t\t\tmin-height: 54px;\n\t\t\t\tpadding: 10px 12px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-lg);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-surface);\n\t\t\t\tcursor: pointer;\n\t\t\t\ttransition:\n\t\t\t\t\tbackground 120ms,\n\t\t\t\t\tborder-color 120ms;\n\t\t\t}\n\n\t\t\t.active-account:hover {\n\t\t\t\tbackground: var(--dev-wallet-bg-hover);\n\t\t\t\tborder-color: var(--dev-wallet-border-strong);\n\t\t\t}\n\n\t\t\t.avatar {\n\t\t\t\twidth: 28px;\n\t\t\t\theight: 28px;\n\t\t\t\tborder-radius: 50%;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tfont-size: 12px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tcolor: var(--dev-wallet-primary-foreground);\n\t\t\t\tbackground: var(--dev-wallet-primary);\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.account-info {\n\t\t\t\tflex: 1;\n\t\t\t\tmin-width: 0;\n\t\t\t}\n\n\t\t\t.account-label {\n\t\t\t\tfont-size: 13px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\twhite-space: nowrap;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t}\n\n\t\t\t.account-label-row {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 6px;\n\t\t\t\tmin-width: 0;\n\t\t\t}\n\n\t\t\t.account-address {\n\t\t\t\tfont-size: 11px;\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t}\n\n\t\t\t.copy-btn {\n\t\t\t\twidth: 36px;\n\t\t\t\theight: 54px;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tborder-radius: var(--dev-wallet-radius);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: transparent;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tflex-shrink: 0;\n\t\t\t\tfont-size: 12px;\n\t\t\t}\n\n\t\t\t.copy-btn:hover {\n\t\t\t\tbackground: var(--dev-wallet-bg-hover);\n\t\t\t\tborder-color: var(--dev-wallet-border-strong);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t}\n\n\t\t\t.copy-btn.copied {\n\t\t\t\tcolor: var(--dev-wallet-positive);\n\t\t\t}\n\n\t\t\t.chevron {\n\t\t\t\twidth: 14px;\n\t\t\t\theight: 14px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.dropdown-item[aria-selected='true'] {\n\t\t\t\tbackground: var(--dev-wallet-accent-fade);\n\t\t\t\tborder-color: var(--dev-wallet-border-strong);\n\t\t\t}\n\n\t\t\t.dropdown-item .avatar {\n\t\t\t\twidth: 24px;\n\t\t\t\theight: 24px;\n\t\t\t\tfont-size: 10px;\n\t\t\t}\n\n\t\t\t.dropdown-item .account-label {\n\t\t\t\tfont-size: 12px;\n\t\t\t}\n\n\t\t\t.dropdown-item .account-address {\n\t\t\t\tfont-size: 10px;\n\t\t\t}\n\n\t\t\t.dropdown-item .account-info {\n\t\t\t\tmin-width: 0;\n\t\t\t}\n\n\t\t\t.dropdown-item .account-label {\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\n\t\t\t.adapter-badge {\n\t\t\t\theight: 16px;\n\t\t\t\tdisplay: inline-flex;\n\t\t\t\talign-items: center;\n\t\t\t\tpadding: 0 5px;\n\t\t\t\tborder-radius: 999px;\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-bg-3);\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 9px;\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\n\t\t\t.selector-row {\n\t\t\t\tdisplay: flex;\n\t\t\t\tgap: 4px;\n\t\t\t\talign-items: center;\n\t\t\t}\n\n\t\t\t.selector-wrapper {\n\t\t\t\tflex: 1;\n\t\t\t\tmin-width: 0;\n\t\t\t\t--dropdown-max-height: 240px;\n\t\t\t}\n\n\t\t\t.empty-state {\n\t\t\t\tpadding: 16px;\n\t\t\t\ttext-align: center;\n\t\t\t\tfont-size: 12px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\taccounts: ReadonlyWalletAccount[] = [];\n\n\t@property({ attribute: false })\n\tadapters: SignerAdapter[] = [];\n\n\t@property({ type: String })\n\tactiveAddress = '';\n\n\t@state()\n\tprivate _open = false;\n\n\t#copy = new CopyController(this);\n\n\toverride render() {\n\t\tconst active = this.accounts.find((a) => a.address === this.activeAddress);\n\n\t\tif (!active) {\n\t\t\treturn html`<div class=\"empty-state\" part=\"empty-state\">No account selected</div>`;\n\t\t}\n\n\t\tconst label = this.#getLabel(active);\n\t\tconst initial = (label[0] ?? '?').toUpperCase();\n\t\tconst activeAdapterName = this.#getAdapterName(active.address);\n\n\t\treturn html`\n\t\t\t<div class=\"selector-row\">\n\t\t\t\t<dev-wallet-dropdown\n\t\t\t\t\tfull-width\n\t\t\t\t\tclass=\"selector-wrapper\"\n\t\t\t\t\t.open=${this._open}\n\t\t\t\t\t@close=${() => (this._open = false)}\n\t\t\t\t>\n\t\t\t\t\t<button\n\t\t\t\t\t\tslot=\"trigger\"\n\t\t\t\t\t\tclass=\"active-account\"\n\t\t\t\t\t\tpart=\"trigger\"\n\t\t\t\t\t\taria-expanded=${this._open}\n\t\t\t\t\t\taria-haspopup=\"listbox\"\n\t\t\t\t\t\t@click=${() => (this._open = !this._open)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span class=\"avatar\">${initial}</span>\n\t\t\t\t\t\t<div class=\"account-info\">\n\t\t\t\t\t\t\t<div class=\"account-label-row\">\n\t\t\t\t\t\t\t\t<div class=\"account-label\">${label}</div>\n\t\t\t\t\t\t\t\t${activeAdapterName\n\t\t\t\t\t\t\t\t\t? html`<span class=\"adapter-badge\">${activeAdapterName}</span>`\n\t\t\t\t\t\t\t\t\t: nothing}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"account-address\">${formatAddress(active.address)}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\tclass=\"chevron\"\n\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\tstroke-width=\"2.5\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<path d=\"M6 9l6 6 6-6\" />\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</button>\n\t\t\t\t\t<div slot=\"popover\" role=\"listbox\" aria-label=\"Select account\">\n\t\t\t\t\t\t${this.accounts.map((account) => {\n\t\t\t\t\t\t\tconst accountLabel = this.#getLabel(account);\n\t\t\t\t\t\t\tconst accountInitial = (accountLabel[0] ?? '?').toUpperCase();\n\t\t\t\t\t\t\tconst adapterName = this.#getAdapterName(account.address);\n\n\t\t\t\t\t\t\treturn html`\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tclass=\"dropdown-item\"\n\t\t\t\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t\t\t\taria-selected=${account.address === this.activeAddress}\n\t\t\t\t\t\t\t\t\t@click=${() => this.#select(account)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span class=\"avatar\">${accountInitial}</span>\n\t\t\t\t\t\t\t\t\t<div class=\"account-info\">\n\t\t\t\t\t\t\t\t\t\t<div class=\"account-label\">${accountLabel}</div>\n\t\t\t\t\t\t\t\t\t\t<div class=\"account-address\">${formatAddress(account.address)}</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t${adapterName ? html`<span class=\"adapter-badge\">${adapterName}</span>` : nothing}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t`;\n\t\t\t\t\t\t})}\n\t\t\t\t\t</div>\n\t\t\t\t</dev-wallet-dropdown>\n\t\t\t\t<button\n\t\t\t\t\tclass=\"copy-btn ${this.#copy.isCopied(active.address) ? 'copied' : ''}\"\n\t\t\t\t\tpart=\"copy-button\"\n\t\t\t\t\ttitle=\"Copy address\"\n\t\t\t\t\taria-label=\"Copy address\"\n\t\t\t\t\t@click=${(e: Event) => {\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\tthis.#copy.copy(active.address);\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t${this.#copy.isCopied(active.address) ? '\\u2713' : '\\u2398'}\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#getLabel(account: ReadonlyWalletAccount): string {\n\t\treturn account.label ?? `Account ${account.address.slice(0, 8)}`;\n\t}\n\n\t#getAdapterName(address: string): string | null {\n\t\tconst adapter = findAdapterForAddress(this.adapters, address);\n\t\tif (!adapter) return null;\n\t\treturn ADAPTER_SHORT_NAMES[adapter.name] ?? adapter.name;\n\t}\n\n\t#select(account: ReadonlyWalletAccount) {\n\t\tthis._open = false;\n\t\temitEvent(this, 'account-selected', { account });\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-account-selector': DevWalletAccountSelector;\n\t}\n}\n"],"mappings":";;;;;;;;;AAcA,MAAM,sBAA8C;CACnD,oBAAoB;CACpB,qBAAqB;CACrB,oBAAoB;CACpB,kBAAkB;CAClB;AAGM,IAAA,2BAAA,MAAM,iCAAiC,WAAW;;;kBAuKpB,EAAE;kBAGV,EAAE;uBAGd;eAGA;eAER,IAAI,eAAe,KAAK;;;gBAjLP;GACxB;GACA;GACA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgKH;;CAcD;CAEA,SAAkB;EACjB,MAAM,SAAS,KAAK,SAAS,MAAM,MAAM,EAAE,YAAY,KAAK,cAAc;AAE1E,MAAI,CAAC,OACJ,QAAO,IAAI;EAGZ,MAAM,QAAQ,MAAA,SAAe,OAAO;EACpC,MAAM,WAAW,MAAM,MAAM,KAAK,aAAa;EAC/C,MAAM,oBAAoB,MAAA,eAAqB,OAAO,QAAQ;AAE9D,SAAO,IAAI;;;;;aAKA,KAAK,MAAM;oBACH,KAAK,QAAQ,MAAO;;;;;;sBAMnB,KAAK,MAAM;;qBAEX,KAAK,QAAQ,CAAC,KAAK,MAAO;;6BAEnB,QAAQ;;;qCAGA,MAAM;UACjC,oBACC,IAAI,+BAA+B,kBAAkB,WACrD,QAAQ;;sCAEmB,cAAc,OAAO,QAAQ,CAAC;;;;;;;;;;;;;QAa5D,KAAK,SAAS,KAAK,YAAY;GAChC,MAAM,eAAe,MAAA,SAAe,QAAQ;GAC5C,MAAM,kBAAkB,aAAa,MAAM,KAAK,aAAa;GAC7D,MAAM,cAAc,MAAA,eAAqB,QAAQ,QAAQ;AAEzD,UAAO,IAAI;;;;yBAIO,QAAQ,YAAY,KAAK,cAAc;wBACxC,MAAA,OAAa,QAAQ,CAAC;;gCAEd,eAAe;;uCAER,aAAa;yCACX,cAAc,QAAQ,QAAQ,CAAC;;WAE7D,cAAc,IAAI,+BAA+B,YAAY,WAAW,QAAQ;;;IAGnF,CAAC;;;;uBAIc,MAAA,KAAW,SAAS,OAAO,QAAQ,GAAG,WAAW,GAAG;;;;eAI5D,MAAa;AACtB,KAAE,iBAAiB;AACnB,SAAA,KAAW,KAAK,OAAO,QAAQ;IAC9B;;OAEA,MAAA,KAAW,SAAS,OAAO,QAAQ,GAAG,MAAW,IAAS;;;;;CAMhE,UAAU,SAAwC;AACjD,SAAO,QAAQ,SAAS,WAAW,QAAQ,QAAQ,MAAM,GAAG,EAAE;;CAG/D,gBAAgB,SAAgC;EAC/C,MAAM,UAAU,sBAAsB,KAAK,UAAU,QAAQ;AAC7D,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,oBAAoB,QAAQ,SAAS,QAAQ;;CAGrD,QAAQ,SAAgC;AACvC,OAAK,QAAQ;AACb,YAAU,MAAM,oBAAoB,EAAE,SAAS,CAAC;;;YAjHhD,SAAS,EAAE,WAAW,OAAO,CAAC,CAAA,EAAA,yBAAA,WAAA,YAAA,KAAA,EAAA;YAG9B,SAAS,EAAE,WAAW,OAAO,CAAC,CAAA,EAAA,yBAAA,WAAA,YAAA,KAAA,EAAA;YAG9B,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,EAAA,yBAAA,WAAA,iBAAA,KAAA,EAAA;YAG1B,OAAO,CAAA,EAAA,yBAAA,WAAA,SAAA,KAAA,EAAA;uCAhLR,cAAc,8BAA8B,CAAA,EAAA,yBAAA"}
|
|
1
|
+
{"version":3,"file":"dev-wallet-account-selector.mjs","names":["#getLabel","#getAdapterName","#select","#copy"],"sources":["../../src/ui/dev-wallet-account-selector.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ReadonlyWalletAccount } from '@mysten/wallet-standard';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport type { SignerAdapter } from '../types.js';\nimport { dropdownItemStyles, sharedStyles } from './styles.js';\nimport { CopyController } from './copy-controller.js';\nimport { emitEvent, findAdapterForAddress, formatAddress } from './utils.js';\nimport './dev-wallet-dropdown.js';\n\n/** Short display names for adapter badges. */\nconst ADAPTER_SHORT_NAMES: Record<string, string> = {\n\t'WebCrypto Signer': 'WebCrypto',\n\t'Remote CLI Signer': 'CLI',\n\t'In-Memory Signer': 'Memory',\n\t'Passkey Signer': 'Passkey',\n};\n\n@customElement('dev-wallet-account-selector')\nexport class DevWalletAccountSelector extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tdropdownItemStyles,\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: block;\n\t\t\t}\n\n\t\t\t.active-account {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 10px;\n\t\t\t\twidth: 100%;\n\t\t\t\tmin-height: 54px;\n\t\t\t\tpadding: 10px 12px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-lg);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-surface);\n\t\t\t\tcursor: pointer;\n\t\t\t\ttransition:\n\t\t\t\t\tbackground 120ms,\n\t\t\t\t\tborder-color 120ms;\n\t\t\t}\n\n\t\t\t.active-account:hover {\n\t\t\t\tbackground: var(--dev-wallet-bg-hover);\n\t\t\t\tborder-color: var(--dev-wallet-border-strong);\n\t\t\t}\n\n\t\t\t.avatar {\n\t\t\t\twidth: 28px;\n\t\t\t\theight: 28px;\n\t\t\t\tborder-radius: 50%;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tfont-size: 12px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tcolor: var(--dev-wallet-primary-foreground);\n\t\t\t\tbackground: var(--dev-wallet-primary);\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.account-info {\n\t\t\t\tflex: 1;\n\t\t\t\tmin-width: 0;\n\t\t\t}\n\n\t\t\t.account-label {\n\t\t\t\tfont-size: 13px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\twhite-space: nowrap;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t}\n\n\t\t\t.account-label-row {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 6px;\n\t\t\t\tmin-width: 0;\n\t\t\t}\n\n\t\t\t.account-address {\n\t\t\t\tfont-size: 11px;\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t}\n\n\t\t\t.copy-btn {\n\t\t\t\twidth: 36px;\n\t\t\t\theight: 54px;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tborder-radius: var(--dev-wallet-radius);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: transparent;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tflex-shrink: 0;\n\t\t\t\tfont-size: 12px;\n\t\t\t}\n\n\t\t\t.copy-btn:hover {\n\t\t\t\tbackground: var(--dev-wallet-bg-hover);\n\t\t\t\tborder-color: var(--dev-wallet-border-strong);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t}\n\n\t\t\t.copy-btn.copied {\n\t\t\t\tcolor: var(--dev-wallet-positive);\n\t\t\t}\n\n\t\t\t.chevron {\n\t\t\t\twidth: 14px;\n\t\t\t\theight: 14px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.dropdown-item[aria-selected='true'] {\n\t\t\t\tbackground: var(--dev-wallet-accent-fade);\n\t\t\t\tborder-color: var(--dev-wallet-border-strong);\n\t\t\t}\n\n\t\t\t.dropdown-item .avatar {\n\t\t\t\twidth: 24px;\n\t\t\t\theight: 24px;\n\t\t\t\tfont-size: 10px;\n\t\t\t}\n\n\t\t\t.dropdown-item .account-label {\n\t\t\t\tfont-size: 12px;\n\t\t\t}\n\n\t\t\t.dropdown-item .account-address {\n\t\t\t\tfont-size: 10px;\n\t\t\t}\n\n\t\t\t.dropdown-item .account-info {\n\t\t\t\tmin-width: 0;\n\t\t\t}\n\n\t\t\t.dropdown-item .account-label {\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\n\t\t\t.adapter-badge {\n\t\t\t\theight: 16px;\n\t\t\t\tdisplay: inline-flex;\n\t\t\t\talign-items: center;\n\t\t\t\tpadding: 0 5px;\n\t\t\t\tborder-radius: 999px;\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-bg-3);\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 9px;\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\n\t\t\t.selector-row {\n\t\t\t\tdisplay: flex;\n\t\t\t\tgap: 4px;\n\t\t\t\talign-items: center;\n\t\t\t}\n\n\t\t\t.selector-wrapper {\n\t\t\t\tflex: 1;\n\t\t\t\tmin-width: 0;\n\t\t\t\t--dropdown-max-height: 240px;\n\t\t\t}\n\n\t\t\t.empty-state {\n\t\t\t\tpadding: 16px;\n\t\t\t\ttext-align: center;\n\t\t\t\tfont-size: 12px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\taccounts: ReadonlyWalletAccount[] = [];\n\n\t@property({ attribute: false })\n\tadapters: SignerAdapter[] = [];\n\n\t@property({ type: String })\n\tactiveAddress = '';\n\n\t@state()\n\tprivate _open = false;\n\n\t#copy = new CopyController(this);\n\n\toverride render() {\n\t\tconst active = this.accounts.find((a) => a.address === this.activeAddress);\n\n\t\tif (!active) {\n\t\t\treturn html`<div class=\"empty-state\" part=\"empty-state\">No account selected</div>`;\n\t\t}\n\n\t\tconst label = this.#getLabel(active);\n\t\tconst initial = (label[0] ?? '?').toUpperCase();\n\t\tconst activeAdapterName = this.#getAdapterName(active.address);\n\n\t\treturn html`\n\t\t\t<div class=\"selector-row\">\n\t\t\t\t<dev-wallet-dropdown\n\t\t\t\t\tfull-width\n\t\t\t\t\tclass=\"selector-wrapper\"\n\t\t\t\t\t.open=${this._open}\n\t\t\t\t\t@close=${() => (this._open = false)}\n\t\t\t\t>\n\t\t\t\t\t<button\n\t\t\t\t\t\tslot=\"trigger\"\n\t\t\t\t\t\tclass=\"active-account\"\n\t\t\t\t\t\tpart=\"trigger\"\n\t\t\t\t\t\taria-expanded=${this._open}\n\t\t\t\t\t\taria-haspopup=\"listbox\"\n\t\t\t\t\t\t@click=${() => (this._open = !this._open)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span class=\"avatar\">${initial}</span>\n\t\t\t\t\t\t<div class=\"account-info\">\n\t\t\t\t\t\t\t<div class=\"account-label-row\">\n\t\t\t\t\t\t\t\t<div class=\"account-label\">${label}</div>\n\t\t\t\t\t\t\t\t${activeAdapterName\n\t\t\t\t\t\t\t\t\t? html`<span class=\"adapter-badge\">${activeAdapterName}</span>`\n\t\t\t\t\t\t\t\t\t: nothing}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"account-address\">${formatAddress(active.address)}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\tclass=\"chevron\"\n\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\tstroke-width=\"2.5\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<path d=\"M6 9l6 6 6-6\" />\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</button>\n\t\t\t\t\t<div slot=\"popover\" role=\"listbox\" aria-label=\"Select account\">\n\t\t\t\t\t\t${this.accounts.map((account) => {\n\t\t\t\t\t\t\tconst accountLabel = this.#getLabel(account);\n\t\t\t\t\t\t\tconst accountInitial = (accountLabel[0] ?? '?').toUpperCase();\n\t\t\t\t\t\t\tconst adapterName = this.#getAdapterName(account.address);\n\n\t\t\t\t\t\t\treturn html`\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tclass=\"dropdown-item\"\n\t\t\t\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t\t\t\taria-selected=${account.address === this.activeAddress}\n\t\t\t\t\t\t\t\t\t@click=${() => this.#select(account)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span class=\"avatar\">${accountInitial}</span>\n\t\t\t\t\t\t\t\t\t<div class=\"account-info\">\n\t\t\t\t\t\t\t\t\t\t<div class=\"account-label\">${accountLabel}</div>\n\t\t\t\t\t\t\t\t\t\t<div class=\"account-address\">${formatAddress(account.address)}</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t${adapterName ? html`<span class=\"adapter-badge\">${adapterName}</span>` : nothing}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t`;\n\t\t\t\t\t\t})}\n\t\t\t\t\t</div>\n\t\t\t\t</dev-wallet-dropdown>\n\t\t\t\t<button\n\t\t\t\t\tclass=\"copy-btn ${this.#copy.isCopied(active.address) ? 'copied' : ''}\"\n\t\t\t\t\tpart=\"copy-button\"\n\t\t\t\t\ttitle=\"Copy address\"\n\t\t\t\t\taria-label=\"Copy address\"\n\t\t\t\t\t@click=${(e: Event) => {\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\tthis.#copy.copy(active.address);\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t${this.#copy.isCopied(active.address) ? '\\u2713' : '\\u2398'}\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#getLabel(account: ReadonlyWalletAccount): string {\n\t\treturn account.label ?? `Account ${account.address.slice(0, 8)}`;\n\t}\n\n\t#getAdapterName(address: string): string | null {\n\t\tconst adapter = findAdapterForAddress(this.adapters, address);\n\t\tif (!adapter) return null;\n\t\treturn ADAPTER_SHORT_NAMES[adapter.name] ?? adapter.name;\n\t}\n\n\t#select(account: ReadonlyWalletAccount) {\n\t\tthis._open = false;\n\t\temitEvent(this, 'account-selected', { account });\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-account-selector': DevWalletAccountSelector;\n\t}\n}\n"],"mappings":";;;;;;;;;AAcA,MAAM,sBAA8C;CACnD,oBAAoB;CACpB,qBAAqB;CACrB,oBAAoB;CACpB,kBAAkB;AACnB;AAGO,IAAA,2BAAA,MAAM,iCAAiC,WAAW;;;kBAuKpB,CAAC;kBAGT,CAAC;uBAGb;eAGA;eAER,IAAI,eAAe,IAAI;;;gBAjLN;GACxB;GACA;GACA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgKJ;;CAcA;CAEA,SAAkB;EACjB,MAAM,SAAS,KAAK,SAAS,MAAM,MAAM,EAAE,YAAY,KAAK,aAAa;EAEzE,IAAI,CAAC,QACJ,OAAO,IAAI;EAGZ,MAAM,QAAQ,KAAKA,UAAU,MAAM;EACnC,MAAM,WAAW,MAAM,MAAM,IAAA,CAAK,YAAY;EAC9C,MAAM,oBAAoB,KAAKC,gBAAgB,OAAO,OAAO;EAE7D,OAAO,IAAI;;;;;aAKA,KAAK,MAAM;oBACH,KAAK,QAAQ,MAAO;;;;;;sBAMnB,KAAK,MAAM;;qBAEX,KAAK,QAAQ,CAAC,KAAK,MAAO;;6BAEnB,QAAQ;;;qCAGA,MAAM;UACjC,oBACC,IAAI,+BAA+B,kBAAkB,WACrD,QAAQ;;sCAEmB,cAAc,OAAO,OAAO,EAAE;;;;;;;;;;;;;QAa5D,KAAK,SAAS,KAAK,YAAY;GAChC,MAAM,eAAe,KAAKD,UAAU,OAAO;GAC3C,MAAM,kBAAkB,aAAa,MAAM,IAAA,CAAK,YAAY;GAC5D,MAAM,cAAc,KAAKC,gBAAgB,QAAQ,OAAO;GAExD,OAAO,IAAI;;;;yBAIO,QAAQ,YAAY,KAAK,cAAc;wBACxC,KAAKC,QAAQ,OAAO,EAAE;;gCAEd,eAAe;;uCAER,aAAa;yCACX,cAAc,QAAQ,OAAO,EAAE;;WAE7D,cAAc,IAAI,+BAA+B,YAAY,WAAW,QAAQ;;;EAGrF,CAAC,EAAE;;;;uBAIc,KAAKC,MAAM,SAAS,OAAO,OAAO,IAAI,WAAW,GAAG;;;;eAI5D,MAAa;GACtB,EAAE,gBAAgB;GAClB,KAAKA,MAAM,KAAK,OAAO,OAAO;EAC/B,EAAE;;OAEA,KAAKA,MAAM,SAAS,OAAO,OAAO,IAAI,MAAW,IAAS;;;;CAIhE;CAEA,UAAU,SAAwC;EACjD,OAAO,QAAQ,SAAS,WAAW,QAAQ,QAAQ,MAAM,GAAG,CAAC;CAC9D;CAEA,gBAAgB,SAAgC;EAC/C,MAAM,UAAU,sBAAsB,KAAK,UAAU,OAAO;EAC5D,IAAI,CAAC,SAAS,OAAO;EACrB,OAAO,oBAAoB,QAAQ,SAAS,QAAQ;CACrD;CAEA,QAAQ,SAAgC;EACvC,KAAK,QAAQ;EACb,UAAU,MAAM,oBAAoB,EAAE,QAAQ,CAAC;CAChD;AACD;YAnHE,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,yBAAA,WAAA,YAAA,KAAA,CAAA;YAG7B,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,yBAAA,WAAA,YAAA,KAAA,CAAA;YAG7B,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,yBAAA,WAAA,iBAAA,KAAA,CAAA;YAGzB,MAAM,CAAA,GAAA,yBAAA,WAAA,SAAA,KAAA,CAAA;uCAhLP,cAAc,6BAA6B,CAAA,GAAA,wBAAA"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { SignerAdapter } from "../types.mjs";
|
|
2
2
|
import { ReadonlyWalletAccount } from "@mysten/wallet-standard";
|
|
3
|
-
import * as _$lit from "lit";
|
|
4
3
|
import { LitElement } from "lit";
|
|
5
4
|
|
|
6
5
|
//#region src/ui/dev-wallet-accounts.d.ts
|
|
7
6
|
declare class DevWalletAccounts extends LitElement {
|
|
8
7
|
#private;
|
|
9
|
-
static styles: (
|
|
8
|
+
static styles: (import("lit").CSSResult | import("lit").CSSResult[])[];
|
|
10
9
|
accounts: readonly ReadonlyWalletAccount[];
|
|
11
10
|
adapters: SignerAdapter[];
|
|
12
11
|
activeAddress: string;
|
|
@@ -22,7 +21,7 @@ declare class DevWalletAccounts extends LitElement {
|
|
|
22
21
|
private _confirmDeleteAddress;
|
|
23
22
|
private _deleting;
|
|
24
23
|
private _deleteError;
|
|
25
|
-
render():
|
|
24
|
+
render(): import("lit").TemplateResult<1>;
|
|
26
25
|
}
|
|
27
26
|
declare global {
|
|
28
27
|
interface HTMLElementTagNameMap {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-wallet-accounts.d.mts","names":[],"sources":["../../src/ui/dev-wallet-accounts.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"dev-wallet-accounts.d.mts","names":[],"sources":["../../src/ui/dev-wallet-accounts.ts"],"mappings":";;;;;cAkCa,iBAAA,SAA0B,UAAA;EAAA;SACtB,MAAA,iBAAM,SAAA,iBAAA,SAAA;EA8KtB,QAAA,WAAmB,qBAAA;EAGnB,QAAA,EAAU,aAAA;EAGV,aAAA;EAHU;;;;;EAWV,OAAA;EAAA,QAGQ,WAAA;EAAA,QAKA,eAAA;EAAA,QAGA,aAAA;EAAA,QAGA,qBAAA;EAAA,QAGA,SAAA;EAAA,QAGA,YAAA;EAEC,MAAA,kBAAM,cAAA;AAAA;AAAA,QAmSR,MAAA;EAAA,UACG,qBAAA;IACT,qBAAA,EAAuB,iBAAiB;EAAA;AAAA"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { actionButtonStyles, avatarStyles, badgeStyles, cardItemStyles, copyableTextStyles, dialogStyles, formInputStyles, iconButtonStyles, inlineErrorStyles, listContainerStyles, monoTruncateStyles, sectionHeaderStyles, sharedStyles } from "./styles.mjs";
|
|
2
2
|
import { emitEvent, findAdapterForAddress, formatAddress, getErrorMessage, isForkNetwork } from "./utils.mjs";
|
|
3
3
|
import { CopyController } from "./copy-controller.mjs";
|
|
4
|
-
import { __decorate } from "../_virtual/_@oxc-project_runtime@0.
|
|
4
|
+
import { __decorate } from "../_virtual/_@oxc-project_runtime@0.135.0/helpers/esm/decorate.mjs";
|
|
5
5
|
import "./dev-wallet-new-account.mjs";
|
|
6
6
|
import { LitElement, css, html, nothing } from "lit";
|
|
7
7
|
import { customElement, property, state } from "lit/decorators.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-wallet-accounts.mjs","names":["#openDialog","#selectAccount","#saveLabel","#cancelEditLabel","#getAccountLabel","#getAdapterName","#canRename","#startEditLabel","#copy","#canRemove","#promptDelete","#renderConfirmDialog","#closeDialog","#confirmDelete","#cancelDelete","#isImportedAccount"],"sources":["../../src/ui/dev-wallet-accounts.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ReadonlyWalletAccount } from '@mysten/wallet-standard';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport type { SignerAdapter } from '../types.js';\nimport { CopyController } from './copy-controller.js';\nimport {\n\tactionButtonStyles,\n\tavatarStyles,\n\tbadgeStyles,\n\tcardItemStyles,\n\tcopyableTextStyles,\n\tdialogStyles,\n\tformInputStyles,\n\ticonButtonStyles,\n\tinlineErrorStyles,\n\tlistContainerStyles,\n\tmonoTruncateStyles,\n\tsectionHeaderStyles,\n\tsharedStyles,\n} from './styles.js';\nimport {\n\temitEvent,\n\tfindAdapterForAddress,\n\tformatAddress,\n\tgetErrorMessage,\n\tisForkNetwork,\n} from './utils.js';\nimport './dev-wallet-new-account.js';\n\n@customElement('dev-wallet-accounts')\nexport class DevWalletAccounts extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tsectionHeaderStyles,\n\t\tactionButtonStyles,\n\t\tcardItemStyles,\n\t\tlistContainerStyles,\n\t\tcopyableTextStyles,\n\t\tmonoTruncateStyles,\n\t\ticonButtonStyles,\n\t\tinlineErrorStyles,\n\t\tbadgeStyles,\n\t\tavatarStyles,\n\t\tdialogStyles,\n\t\tformInputStyles,\n\t\tcss`\n\t\t\t.accounts-header {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\talign-items: center;\n\t\t\t\tmargin-bottom: 12px;\n\t\t\t}\n\n\t\t\t.accounts-header .section-header {\n\t\t\t\tmargin-bottom: 0;\n\t\t\t}\n\n\t\t\t.add-btn {\n\t\t\t\theight: 26px;\n\t\t\t\tfont-size: 12px;\n\t\t\t\tcolor: var(--dev-wallet-primary);\n\t\t\t\tpadding: 0 8px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t}\n\n\t\t\t.add-btn:hover {\n\t\t\t\tbackground: var(--dev-wallet-accent-fade);\n\t\t\t\tborder-color: var(--dev-wallet-border-strong);\n\t\t\t}\n\n\t\t\t.account-item {\n\t\t\t\tgap: 10px;\n\t\t\t\tpadding: 9px 10px;\n\t\t\t\twidth: 100%;\n\t\t\t\ttext-align: left;\n\t\t\t}\n\n\t\t\t.account-item:hover {\n\t\t\t\tborder-color: var(--dev-wallet-primary);\n\t\t\t}\n\n\t\t\t.account-item.active {\n\t\t\t\tbackground: var(--dev-wallet-accent-fade);\n\t\t\t}\n\n\t\t\t.account-avatar {\n\t\t\t\twidth: 32px;\n\t\t\t\theight: 32px;\n\t\t\t\tfont-size: 14px;\n\t\t\t}\n\n\t\t\t.account-info {\n\t\t\t\tflex: 1;\n\t\t\t\tmin-width: 0;\n\t\t\t}\n\n\t\t\t.account-label {\n\t\t\t\tfont-size: 14px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t}\n\n\t\t\t.account-address {\n\t\t\t\tfont-size: 12px;\n\t\t\t\tpadding: 1px 2px;\n\t\t\t}\n\n\t\t\t.account-label-row {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 4px;\n\t\t\t}\n\n\t\t\t.edit-label-btn,\n\t\t\t.delete-btn {\n\t\t\t\twidth: 18px;\n\t\t\t\theight: 18px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-2xs);\n\t\t\t\tfont-size: 11px;\n\t\t\t\topacity: 0;\n\t\t\t\ttransition: opacity 0.15s;\n\t\t\t}\n\n\t\t\t.delete-btn {\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.account-item:hover .edit-label-btn,\n\t\t\t.account-item:hover .delete-btn {\n\t\t\t\topacity: 1;\n\t\t\t}\n\n\t\t\t.delete-btn:hover {\n\t\t\t\tbackground: color-mix(in oklab, var(--dev-wallet-destructive) 20%, transparent);\n\t\t\t\tcolor: var(--dev-wallet-destructive);\n\t\t\t}\n\n\t\t\t.edit-label-input {\n\t\t\t\tpadding: 2px 6px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-2xs);\n\t\t\t\tborder: 1px solid var(--dev-wallet-primary);\n\t\t\t\tbackground: var(--dev-wallet-background);\n\t\t\t\tfont-size: 13px;\n\t\t\t}\n\n\t\t\t.account-badge {\n\t\t\t\theight: 16px;\n\t\t\t\tdisplay: inline-flex;\n\t\t\t\talign-items: center;\n\t\t\t\tpadding: 0 5px;\n\t\t\t\tborder-radius: 999px;\n\t\t\t\tbackground: var(--dev-wallet-bg-3);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t}\n\n\t\t\t.confirm-dialog {\n\t\t\t\twidth: 300px;\n\t\t\t\tpadding: 20px;\n\t\t\t}\n\n\t\t\t.confirm-body {\n\t\t\t\tfont-size: 13px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tmargin-bottom: 8px;\n\t\t\t\tline-height: 1.4;\n\t\t\t}\n\n\t\t\t.confirm-account {\n\t\t\t\tpadding: 8px 10px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-lg);\n\t\t\t\tbackground: var(--dev-wallet-bg-2);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tmargin-bottom: 16px;\n\t\t\t}\n\n\t\t\t.confirm-account-label {\n\t\t\t\tfont-size: 13px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t}\n\n\t\t\t.confirm-account-address {\n\t\t\t\tfont-size: 11px;\n\t\t\t}\n\n\t\t\t.confirm-actions {\n\t\t\t\tdisplay: flex;\n\t\t\t\tgap: 8px;\n\t\t\t}\n\n\t\t\t.confirm-error {\n\t\t\t\tmargin-bottom: 8px;\n\t\t\t}\n\n\t\t\t.empty-state {\n\t\t\t\ttext-align: center;\n\t\t\t\tpadding: 24px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tfont-size: 14px;\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\taccounts: readonly ReadonlyWalletAccount[] = [];\n\n\t@property({ attribute: false })\n\tadapters: SignerAdapter[] = [];\n\n\t@property({ type: String })\n\tactiveAddress = '';\n\n\t/** Phase 4 P4.20 — when set to a `*-fork` literal, the panel\n\t * surfaces a warning on the \"+ Add\" button (or hides it outright\n\t * when no fork-compatible funding path exists). Fork stacks have\n\t * no faucet; arbitrary fresh accounts can't be funded without an\n\t * impersonation seed already configured at the supervisor level. */\n\t@property({ type: String })\n\tnetwork = '';\n\n\t@state()\n\tprivate _dialogOpen = false;\n\n\t#copy = new CopyController(this);\n\n\t@state()\n\tprivate _editingAddress: string | null = null;\n\n\t@state()\n\tprivate _editingLabel = '';\n\n\t@state()\n\tprivate _confirmDeleteAddress: string | null = null;\n\n\t@state()\n\tprivate _deleting = false;\n\n\t@state()\n\tprivate _deleteError: string | null = null;\n\n\toverride render() {\n\t\tconst canAdd = this.adapters.some(\n\t\t\t(a) =>\n\t\t\t\t('createAccount' in a && a.createAccount) ||\n\t\t\t\t('importAccount' in a &&\n\t\t\t\t\ta.importAccount &&\n\t\t\t\t\t'listAvailableAccounts' in a &&\n\t\t\t\t\ta.listAvailableAccounts),\n\t\t);\n\n\t\t// Phase 4 P4.20 — fork-mode networks have no faucet, and the\n\t\t// supervisor's impersonation seed set is fixed at apply time.\n\t\t// We can't fund a fresh account from the browser side, so the\n\t\t// \"+ Add\" button either renders disabled with a tooltip\n\t\t// (canAdd still true because the adapter contract supports\n\t\t// account creation) or — pragmatically — stays clickable but\n\t\t// surfaces a warning marker on the button.\n\t\tconst fork = this.network !== '' && isForkNetwork(this.network);\n\n\t\treturn html`\n\t\t\t<div class=\"accounts-header\">\n\t\t\t\t<h3 class=\"section-header\">Accounts</h3>\n\t\t\t\t${canAdd\n\t\t\t\t\t? html`<button\n\t\t\t\t\t\t\tclass=\"add-btn\"\n\t\t\t\t\t\t\tpart=\"add-button\"\n\t\t\t\t\t\t\t?disabled=${fork}\n\t\t\t\t\t\t\ttitle=${fork\n\t\t\t\t\t\t\t\t? `Disabled on ${this.network}: fork networks have no faucet — fund seed addresses via Sui({fork:{seed:{addresses}}}) instead.`\n\t\t\t\t\t\t\t\t: ''}\n\t\t\t\t\t\t\t@click=${this.#openDialog}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t+ Add${fork ? ' (fork: no faucet)' : ''}\n\t\t\t\t\t\t</button>`\n\t\t\t\t\t: nothing}\n\t\t\t</div>\n\t\t\t${this.accounts.length === 0\n\t\t\t\t? html`<div class=\"empty-state\" part=\"empty-state\">No accounts yet</div>`\n\t\t\t\t: html`\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"account-list\"\n\t\t\t\t\t\t\tpart=\"account-list\"\n\t\t\t\t\t\t\trole=\"listbox\"\n\t\t\t\t\t\t\taria-label=\"Wallet accounts\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t${this.accounts.map(\n\t\t\t\t\t\t\t\t(account, index) => html`\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\tclass=\"account-item ${account.address === this.activeAddress ? 'active' : ''}\"\n\t\t\t\t\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t\t\t\t\taria-selected=${account.address === this.activeAddress}\n\t\t\t\t\t\t\t\t\t\t@click=${() => this.#selectAccount(account)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<div class=\"account-avatar\">${index + 1}</div>\n\t\t\t\t\t\t\t\t\t\t<div class=\"account-info\">\n\t\t\t\t\t\t\t\t\t\t\t${this._editingAddress === account.address\n\t\t\t\t\t\t\t\t\t\t\t\t? html`<input\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"edit-label-input\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Rename account\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.value=${this._editingLabel}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t@input=${(e: InputEvent) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis._editingLabel = (e.target as HTMLInputElement).value;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t@keydown=${(e: KeyboardEvent) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (e.key === 'Enter') this.#saveLabel(account.address);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (e.key === 'Escape') this.#cancelEditLabel();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t@click=${(e: Event) => e.stopPropagation()}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>`\n\t\t\t\t\t\t\t\t\t\t\t\t: html`<div class=\"account-label-row\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"account-label\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t${this.#getAccountLabel(account.address, index)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"account-badge\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>${this.#getAdapterName(account.address)}</span\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t${this.#canRename(account.address)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? html`<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"edit-label-btn\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"Rename\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Rename account\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@click=${(e: Event) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.#startEditLabel(account.address, index);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t✎\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</button>`\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: nothing}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>`}\n\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"account-address ${this.#copy.isCopied(account.address)\n\t\t\t\t\t\t\t\t\t\t\t\t\t? 'copied'\n\t\t\t\t\t\t\t\t\t\t\t\t\t: ''}\"\n\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"Click to copy\"\n\t\t\t\t\t\t\t\t\t\t\t\trole=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Copy address\"\n\t\t\t\t\t\t\t\t\t\t\t\t@click=${(e: Event) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\t\t\tthis.#copy.copy(account.address);\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t@keydown=${(e: KeyboardEvent) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.#copy.copy(account.address);\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t${this.#copy.isCopied(account.address)\n\t\t\t\t\t\t\t\t\t\t\t\t\t? 'Copied!'\n\t\t\t\t\t\t\t\t\t\t\t\t\t: formatAddress(account.address)}\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t${this.#canRemove(account.address)\n\t\t\t\t\t\t\t\t\t\t\t? html`<button\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"delete-btn\"\n\t\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"Remove account\"\n\t\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Remove account\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t@click=${(e: Event) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.#promptDelete(account.address);\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t🗑\n\t\t\t\t\t\t\t\t\t\t\t\t</button>`\n\t\t\t\t\t\t\t\t\t\t\t: nothing}\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t`,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`}\n\t\t\t${this.#renderConfirmDialog()}\n\t\t\t<dev-wallet-new-account\n\t\t\t\t.adapters=${this.adapters}\n\t\t\t\t.open=${this._dialogOpen}\n\t\t\t\t@close=${this.#closeDialog}\n\t\t\t></dev-wallet-new-account>\n\t\t`;\n\t}\n\n\t#getAccountLabel(address: string, index: number): string {\n\t\tconst adapter = findAdapterForAddress(this.adapters, address);\n\t\tif (!adapter) return `Account ${index + 1}`;\n\t\tconst managed = adapter.getAccount(address);\n\t\treturn managed?.label ?? `Account ${index + 1}`;\n\t}\n\n\t#canRename(address: string): boolean {\n\t\tconst adapter = findAdapterForAddress(this.adapters, address);\n\t\treturn !!(adapter && adapter.renameAccount);\n\t}\n\n\t#getAdapterName(address: string): string {\n\t\treturn findAdapterForAddress(this.adapters, address)?.name ?? 'Unknown';\n\t}\n\n\t#selectAccount(account: ReadonlyWalletAccount) {\n\t\temitEvent(this, 'account-selected', { account });\n\t}\n\n\t#startEditLabel(address: string, index: number) {\n\t\tthis._editingAddress = address;\n\t\tthis._editingLabel = this.#getAccountLabel(address, index);\n\t}\n\n\tasync #saveLabel(address: string) {\n\t\tconst label = this._editingLabel.trim();\n\t\tif (!label) {\n\t\t\tthis.#cancelEditLabel();\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tfor (const adapter of this.adapters) {\n\t\t\t\tif (adapter.getAccount(address) && adapter.renameAccount) {\n\t\t\t\t\tawait adapter.renameAccount(address, label);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error('[dev-wallet] rename failed:', e);\n\t\t}\n\t\tthis._editingAddress = null;\n\t\tthis._editingLabel = '';\n\t\temitEvent(this, 'account-renamed', { address, label });\n\t}\n\n\t#cancelEditLabel() {\n\t\tthis._editingAddress = null;\n\t\tthis._editingLabel = '';\n\t}\n\n\t#canRemove(address: string): boolean {\n\t\tconst adapter = findAdapterForAddress(this.adapters, address);\n\t\treturn !!(adapter && adapter.removeAccount);\n\t}\n\n\t#isImportedAccount(address: string): boolean {\n\t\tconst adapter = findAdapterForAddress(this.adapters, address);\n\t\tif (!adapter) return false;\n\t\treturn !('createAccount' in adapter && adapter.createAccount);\n\t}\n\n\t#promptDelete(address: string) {\n\t\tthis._confirmDeleteAddress = address;\n\t\tthis._deleteError = null;\n\t\tthis.updateComplete.then(() => {\n\t\t\tconst dialog = this.shadowRoot?.querySelector<HTMLDialogElement>('.confirm-dialog');\n\t\t\tif (dialog && !dialog.open) dialog.showModal();\n\t\t});\n\t}\n\n\t#cancelDelete() {\n\t\tconst dialog = this.shadowRoot?.querySelector<HTMLDialogElement>('.confirm-dialog');\n\t\tif (dialog?.open) dialog.close();\n\t\tthis._confirmDeleteAddress = null;\n\t\tthis._deleting = false;\n\t\tthis._deleteError = null;\n\t}\n\n\tasync #confirmDelete() {\n\t\tconst address = this._confirmDeleteAddress;\n\t\tif (!address) return;\n\n\t\tthis._deleting = true;\n\t\tthis._deleteError = null;\n\n\t\ttry {\n\t\t\tconst adapter = findAdapterForAddress(this.adapters, address);\n\t\t\tif (!adapter?.removeAccount) throw new Error('Adapter does not support removal');\n\t\t\tconst removed = await adapter.removeAccount(address);\n\t\t\tif (!removed) throw new Error('Account not found');\n\t\t\tthis.#cancelDelete();\n\t\t\temitEvent(this, 'account-removed', { address });\n\t\t} catch (error) {\n\t\t\tthis._deleteError = getErrorMessage(error, 'Failed to remove account');\n\t\t\tthis._deleting = false;\n\t\t}\n\t}\n\n\t#renderConfirmDialog() {\n\t\tif (!this._confirmDeleteAddress) return nothing;\n\n\t\tconst address = this._confirmDeleteAddress;\n\t\tconst index = this.accounts.findIndex((a) => a.address === address);\n\t\tconst label = index >= 0 ? this.#getAccountLabel(address, index) : 'Unknown';\n\t\tconst imported = this.#isImportedAccount(address);\n\n\t\treturn html`\n\t\t\t<dialog\n\t\t\t\tclass=\"confirm-dialog\"\n\t\t\t\t@cancel=${(e: Event) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tthis.#cancelDelete();\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<div class=\"dialog-title\">Remove Account</div>\n\t\t\t\t<div class=\"confirm-body\">\n\t\t\t\t\t${imported\n\t\t\t\t\t\t? 'This will remove the imported account from your wallet. You can re-import it later.'\n\t\t\t\t\t\t: 'This will permanently delete this account and its keys. This cannot be undone.'}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"confirm-account\">\n\t\t\t\t\t<div class=\"confirm-account-label\">${label}</div>\n\t\t\t\t\t<div class=\"confirm-account-address\">${formatAddress(address)}</div>\n\t\t\t\t</div>\n\t\t\t\t${this._deleteError ? html`<div class=\"confirm-error\">${this._deleteError}</div>` : nothing}\n\t\t\t\t<div class=\"confirm-actions\">\n\t\t\t\t\t<button class=\"btn btn-cancel\" ?disabled=${this._deleting} @click=${this.#cancelDelete}>\n\t\t\t\t\t\tCancel\n\t\t\t\t\t</button>\n\t\t\t\t\t<button class=\"btn btn-reject\" ?disabled=${this._deleting} @click=${this.#confirmDelete}>\n\t\t\t\t\t\t${this._deleting ? 'Removing...' : 'Remove'}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</dialog>\n\t\t`;\n\t}\n\n\t#openDialog() {\n\t\tthis._dialogOpen = true;\n\t}\n\n\t#closeDialog() {\n\t\tthis._dialogOpen = false;\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-accounts': DevWalletAccounts;\n\t}\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dev-wallet-accounts.mjs","names":["#openDialog","#selectAccount","#saveLabel","#cancelEditLabel","#getAccountLabel","#getAdapterName","#canRename","#startEditLabel","#copy","#canRemove","#promptDelete","#renderConfirmDialog","#closeDialog","#confirmDelete","#cancelDelete","#isImportedAccount"],"sources":["../../src/ui/dev-wallet-accounts.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ReadonlyWalletAccount } from '@mysten/wallet-standard';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport type { SignerAdapter } from '../types.js';\nimport { CopyController } from './copy-controller.js';\nimport {\n\tactionButtonStyles,\n\tavatarStyles,\n\tbadgeStyles,\n\tcardItemStyles,\n\tcopyableTextStyles,\n\tdialogStyles,\n\tformInputStyles,\n\ticonButtonStyles,\n\tinlineErrorStyles,\n\tlistContainerStyles,\n\tmonoTruncateStyles,\n\tsectionHeaderStyles,\n\tsharedStyles,\n} from './styles.js';\nimport {\n\temitEvent,\n\tfindAdapterForAddress,\n\tformatAddress,\n\tgetErrorMessage,\n\tisForkNetwork,\n} from './utils.js';\nimport './dev-wallet-new-account.js';\n\n@customElement('dev-wallet-accounts')\nexport class DevWalletAccounts extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tsectionHeaderStyles,\n\t\tactionButtonStyles,\n\t\tcardItemStyles,\n\t\tlistContainerStyles,\n\t\tcopyableTextStyles,\n\t\tmonoTruncateStyles,\n\t\ticonButtonStyles,\n\t\tinlineErrorStyles,\n\t\tbadgeStyles,\n\t\tavatarStyles,\n\t\tdialogStyles,\n\t\tformInputStyles,\n\t\tcss`\n\t\t\t.accounts-header {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\talign-items: center;\n\t\t\t\tmargin-bottom: 12px;\n\t\t\t}\n\n\t\t\t.accounts-header .section-header {\n\t\t\t\tmargin-bottom: 0;\n\t\t\t}\n\n\t\t\t.add-btn {\n\t\t\t\theight: 26px;\n\t\t\t\tfont-size: 12px;\n\t\t\t\tcolor: var(--dev-wallet-primary);\n\t\t\t\tpadding: 0 8px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t}\n\n\t\t\t.add-btn:hover {\n\t\t\t\tbackground: var(--dev-wallet-accent-fade);\n\t\t\t\tborder-color: var(--dev-wallet-border-strong);\n\t\t\t}\n\n\t\t\t.account-item {\n\t\t\t\tgap: 10px;\n\t\t\t\tpadding: 9px 10px;\n\t\t\t\twidth: 100%;\n\t\t\t\ttext-align: left;\n\t\t\t}\n\n\t\t\t.account-item:hover {\n\t\t\t\tborder-color: var(--dev-wallet-primary);\n\t\t\t}\n\n\t\t\t.account-item.active {\n\t\t\t\tbackground: var(--dev-wallet-accent-fade);\n\t\t\t}\n\n\t\t\t.account-avatar {\n\t\t\t\twidth: 32px;\n\t\t\t\theight: 32px;\n\t\t\t\tfont-size: 14px;\n\t\t\t}\n\n\t\t\t.account-info {\n\t\t\t\tflex: 1;\n\t\t\t\tmin-width: 0;\n\t\t\t}\n\n\t\t\t.account-label {\n\t\t\t\tfont-size: 14px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t}\n\n\t\t\t.account-address {\n\t\t\t\tfont-size: 12px;\n\t\t\t\tpadding: 1px 2px;\n\t\t\t}\n\n\t\t\t.account-label-row {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 4px;\n\t\t\t}\n\n\t\t\t.edit-label-btn,\n\t\t\t.delete-btn {\n\t\t\t\twidth: 18px;\n\t\t\t\theight: 18px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-2xs);\n\t\t\t\tfont-size: 11px;\n\t\t\t\topacity: 0;\n\t\t\t\ttransition: opacity 0.15s;\n\t\t\t}\n\n\t\t\t.delete-btn {\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.account-item:hover .edit-label-btn,\n\t\t\t.account-item:hover .delete-btn {\n\t\t\t\topacity: 1;\n\t\t\t}\n\n\t\t\t.delete-btn:hover {\n\t\t\t\tbackground: color-mix(in oklab, var(--dev-wallet-destructive) 20%, transparent);\n\t\t\t\tcolor: var(--dev-wallet-destructive);\n\t\t\t}\n\n\t\t\t.edit-label-input {\n\t\t\t\tpadding: 2px 6px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-2xs);\n\t\t\t\tborder: 1px solid var(--dev-wallet-primary);\n\t\t\t\tbackground: var(--dev-wallet-background);\n\t\t\t\tfont-size: 13px;\n\t\t\t}\n\n\t\t\t.account-badge {\n\t\t\t\theight: 16px;\n\t\t\t\tdisplay: inline-flex;\n\t\t\t\talign-items: center;\n\t\t\t\tpadding: 0 5px;\n\t\t\t\tborder-radius: 999px;\n\t\t\t\tbackground: var(--dev-wallet-bg-3);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t}\n\n\t\t\t.confirm-dialog {\n\t\t\t\twidth: 300px;\n\t\t\t\tpadding: 20px;\n\t\t\t}\n\n\t\t\t.confirm-body {\n\t\t\t\tfont-size: 13px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tmargin-bottom: 8px;\n\t\t\t\tline-height: 1.4;\n\t\t\t}\n\n\t\t\t.confirm-account {\n\t\t\t\tpadding: 8px 10px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-lg);\n\t\t\t\tbackground: var(--dev-wallet-bg-2);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tmargin-bottom: 16px;\n\t\t\t}\n\n\t\t\t.confirm-account-label {\n\t\t\t\tfont-size: 13px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t}\n\n\t\t\t.confirm-account-address {\n\t\t\t\tfont-size: 11px;\n\t\t\t}\n\n\t\t\t.confirm-actions {\n\t\t\t\tdisplay: flex;\n\t\t\t\tgap: 8px;\n\t\t\t}\n\n\t\t\t.confirm-error {\n\t\t\t\tmargin-bottom: 8px;\n\t\t\t}\n\n\t\t\t.empty-state {\n\t\t\t\ttext-align: center;\n\t\t\t\tpadding: 24px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tfont-size: 14px;\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\taccounts: readonly ReadonlyWalletAccount[] = [];\n\n\t@property({ attribute: false })\n\tadapters: SignerAdapter[] = [];\n\n\t@property({ type: String })\n\tactiveAddress = '';\n\n\t/** Phase 4 P4.20 — when set to a `*-fork` literal, the panel\n\t * surfaces a warning on the \"+ Add\" button (or hides it outright\n\t * when no fork-compatible funding path exists). Fork stacks have\n\t * no faucet; arbitrary fresh accounts can't be funded without an\n\t * impersonation seed already configured at the supervisor level. */\n\t@property({ type: String })\n\tnetwork = '';\n\n\t@state()\n\tprivate _dialogOpen = false;\n\n\t#copy = new CopyController(this);\n\n\t@state()\n\tprivate _editingAddress: string | null = null;\n\n\t@state()\n\tprivate _editingLabel = '';\n\n\t@state()\n\tprivate _confirmDeleteAddress: string | null = null;\n\n\t@state()\n\tprivate _deleting = false;\n\n\t@state()\n\tprivate _deleteError: string | null = null;\n\n\toverride render() {\n\t\tconst canAdd = this.adapters.some(\n\t\t\t(a) =>\n\t\t\t\t('createAccount' in a && a.createAccount) ||\n\t\t\t\t('importAccount' in a &&\n\t\t\t\t\ta.importAccount &&\n\t\t\t\t\t'listAvailableAccounts' in a &&\n\t\t\t\t\ta.listAvailableAccounts),\n\t\t);\n\n\t\t// Phase 4 P4.20 — fork-mode networks have no faucet, and the\n\t\t// supervisor's impersonation seed set is fixed at apply time.\n\t\t// We can't fund a fresh account from the browser side, so the\n\t\t// \"+ Add\" button either renders disabled with a tooltip\n\t\t// (canAdd still true because the adapter contract supports\n\t\t// account creation) or — pragmatically — stays clickable but\n\t\t// surfaces a warning marker on the button.\n\t\tconst fork = this.network !== '' && isForkNetwork(this.network);\n\n\t\treturn html`\n\t\t\t<div class=\"accounts-header\">\n\t\t\t\t<h3 class=\"section-header\">Accounts</h3>\n\t\t\t\t${canAdd\n\t\t\t\t\t? html`<button\n\t\t\t\t\t\t\tclass=\"add-btn\"\n\t\t\t\t\t\t\tpart=\"add-button\"\n\t\t\t\t\t\t\t?disabled=${fork}\n\t\t\t\t\t\t\ttitle=${fork\n\t\t\t\t\t\t\t\t? `Disabled on ${this.network}: fork networks have no faucet — fund seed addresses via Sui({fork:{seed:{addresses}}}) instead.`\n\t\t\t\t\t\t\t\t: ''}\n\t\t\t\t\t\t\t@click=${this.#openDialog}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t+ Add${fork ? ' (fork: no faucet)' : ''}\n\t\t\t\t\t\t</button>`\n\t\t\t\t\t: nothing}\n\t\t\t</div>\n\t\t\t${this.accounts.length === 0\n\t\t\t\t? html`<div class=\"empty-state\" part=\"empty-state\">No accounts yet</div>`\n\t\t\t\t: html`\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"account-list\"\n\t\t\t\t\t\t\tpart=\"account-list\"\n\t\t\t\t\t\t\trole=\"listbox\"\n\t\t\t\t\t\t\taria-label=\"Wallet accounts\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t${this.accounts.map(\n\t\t\t\t\t\t\t\t(account, index) => html`\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\tclass=\"account-item ${account.address === this.activeAddress ? 'active' : ''}\"\n\t\t\t\t\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t\t\t\t\taria-selected=${account.address === this.activeAddress}\n\t\t\t\t\t\t\t\t\t\t@click=${() => this.#selectAccount(account)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<div class=\"account-avatar\">${index + 1}</div>\n\t\t\t\t\t\t\t\t\t\t<div class=\"account-info\">\n\t\t\t\t\t\t\t\t\t\t\t${this._editingAddress === account.address\n\t\t\t\t\t\t\t\t\t\t\t\t? html`<input\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"edit-label-input\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Rename account\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.value=${this._editingLabel}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t@input=${(e: InputEvent) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis._editingLabel = (e.target as HTMLInputElement).value;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t@keydown=${(e: KeyboardEvent) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (e.key === 'Enter') this.#saveLabel(account.address);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (e.key === 'Escape') this.#cancelEditLabel();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t@click=${(e: Event) => e.stopPropagation()}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>`\n\t\t\t\t\t\t\t\t\t\t\t\t: html`<div class=\"account-label-row\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"account-label\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t${this.#getAccountLabel(account.address, index)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"account-badge\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>${this.#getAdapterName(account.address)}</span\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t${this.#canRename(account.address)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? html`<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"edit-label-btn\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"Rename\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Rename account\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@click=${(e: Event) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.#startEditLabel(account.address, index);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t✎\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</button>`\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: nothing}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>`}\n\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"account-address ${this.#copy.isCopied(account.address)\n\t\t\t\t\t\t\t\t\t\t\t\t\t? 'copied'\n\t\t\t\t\t\t\t\t\t\t\t\t\t: ''}\"\n\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"Click to copy\"\n\t\t\t\t\t\t\t\t\t\t\t\trole=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Copy address\"\n\t\t\t\t\t\t\t\t\t\t\t\t@click=${(e: Event) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\t\t\tthis.#copy.copy(account.address);\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t@keydown=${(e: KeyboardEvent) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.#copy.copy(account.address);\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t${this.#copy.isCopied(account.address)\n\t\t\t\t\t\t\t\t\t\t\t\t\t? 'Copied!'\n\t\t\t\t\t\t\t\t\t\t\t\t\t: formatAddress(account.address)}\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t${this.#canRemove(account.address)\n\t\t\t\t\t\t\t\t\t\t\t? html`<button\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"delete-btn\"\n\t\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"Remove account\"\n\t\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Remove account\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t@click=${(e: Event) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.#promptDelete(account.address);\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t🗑\n\t\t\t\t\t\t\t\t\t\t\t\t</button>`\n\t\t\t\t\t\t\t\t\t\t\t: nothing}\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t`,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`}\n\t\t\t${this.#renderConfirmDialog()}\n\t\t\t<dev-wallet-new-account\n\t\t\t\t.adapters=${this.adapters}\n\t\t\t\t.open=${this._dialogOpen}\n\t\t\t\t@close=${this.#closeDialog}\n\t\t\t></dev-wallet-new-account>\n\t\t`;\n\t}\n\n\t#getAccountLabel(address: string, index: number): string {\n\t\tconst adapter = findAdapterForAddress(this.adapters, address);\n\t\tif (!adapter) return `Account ${index + 1}`;\n\t\tconst managed = adapter.getAccount(address);\n\t\treturn managed?.label ?? `Account ${index + 1}`;\n\t}\n\n\t#canRename(address: string): boolean {\n\t\tconst adapter = findAdapterForAddress(this.adapters, address);\n\t\treturn !!(adapter && adapter.renameAccount);\n\t}\n\n\t#getAdapterName(address: string): string {\n\t\treturn findAdapterForAddress(this.adapters, address)?.name ?? 'Unknown';\n\t}\n\n\t#selectAccount(account: ReadonlyWalletAccount) {\n\t\temitEvent(this, 'account-selected', { account });\n\t}\n\n\t#startEditLabel(address: string, index: number) {\n\t\tthis._editingAddress = address;\n\t\tthis._editingLabel = this.#getAccountLabel(address, index);\n\t}\n\n\tasync #saveLabel(address: string) {\n\t\tconst label = this._editingLabel.trim();\n\t\tif (!label) {\n\t\t\tthis.#cancelEditLabel();\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tfor (const adapter of this.adapters) {\n\t\t\t\tif (adapter.getAccount(address) && adapter.renameAccount) {\n\t\t\t\t\tawait adapter.renameAccount(address, label);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error('[dev-wallet] rename failed:', e);\n\t\t}\n\t\tthis._editingAddress = null;\n\t\tthis._editingLabel = '';\n\t\temitEvent(this, 'account-renamed', { address, label });\n\t}\n\n\t#cancelEditLabel() {\n\t\tthis._editingAddress = null;\n\t\tthis._editingLabel = '';\n\t}\n\n\t#canRemove(address: string): boolean {\n\t\tconst adapter = findAdapterForAddress(this.adapters, address);\n\t\treturn !!(adapter && adapter.removeAccount);\n\t}\n\n\t#isImportedAccount(address: string): boolean {\n\t\tconst adapter = findAdapterForAddress(this.adapters, address);\n\t\tif (!adapter) return false;\n\t\treturn !('createAccount' in adapter && adapter.createAccount);\n\t}\n\n\t#promptDelete(address: string) {\n\t\tthis._confirmDeleteAddress = address;\n\t\tthis._deleteError = null;\n\t\tthis.updateComplete.then(() => {\n\t\t\tconst dialog = this.shadowRoot?.querySelector<HTMLDialogElement>('.confirm-dialog');\n\t\t\tif (dialog && !dialog.open) dialog.showModal();\n\t\t});\n\t}\n\n\t#cancelDelete() {\n\t\tconst dialog = this.shadowRoot?.querySelector<HTMLDialogElement>('.confirm-dialog');\n\t\tif (dialog?.open) dialog.close();\n\t\tthis._confirmDeleteAddress = null;\n\t\tthis._deleting = false;\n\t\tthis._deleteError = null;\n\t}\n\n\tasync #confirmDelete() {\n\t\tconst address = this._confirmDeleteAddress;\n\t\tif (!address) return;\n\n\t\tthis._deleting = true;\n\t\tthis._deleteError = null;\n\n\t\ttry {\n\t\t\tconst adapter = findAdapterForAddress(this.adapters, address);\n\t\t\tif (!adapter?.removeAccount) throw new Error('Adapter does not support removal');\n\t\t\tconst removed = await adapter.removeAccount(address);\n\t\t\tif (!removed) throw new Error('Account not found');\n\t\t\tthis.#cancelDelete();\n\t\t\temitEvent(this, 'account-removed', { address });\n\t\t} catch (error) {\n\t\t\tthis._deleteError = getErrorMessage(error, 'Failed to remove account');\n\t\t\tthis._deleting = false;\n\t\t}\n\t}\n\n\t#renderConfirmDialog() {\n\t\tif (!this._confirmDeleteAddress) return nothing;\n\n\t\tconst address = this._confirmDeleteAddress;\n\t\tconst index = this.accounts.findIndex((a) => a.address === address);\n\t\tconst label = index >= 0 ? this.#getAccountLabel(address, index) : 'Unknown';\n\t\tconst imported = this.#isImportedAccount(address);\n\n\t\treturn html`\n\t\t\t<dialog\n\t\t\t\tclass=\"confirm-dialog\"\n\t\t\t\t@cancel=${(e: Event) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tthis.#cancelDelete();\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<div class=\"dialog-title\">Remove Account</div>\n\t\t\t\t<div class=\"confirm-body\">\n\t\t\t\t\t${imported\n\t\t\t\t\t\t? 'This will remove the imported account from your wallet. You can re-import it later.'\n\t\t\t\t\t\t: 'This will permanently delete this account and its keys. This cannot be undone.'}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"confirm-account\">\n\t\t\t\t\t<div class=\"confirm-account-label\">${label}</div>\n\t\t\t\t\t<div class=\"confirm-account-address\">${formatAddress(address)}</div>\n\t\t\t\t</div>\n\t\t\t\t${this._deleteError ? html`<div class=\"confirm-error\">${this._deleteError}</div>` : nothing}\n\t\t\t\t<div class=\"confirm-actions\">\n\t\t\t\t\t<button class=\"btn btn-cancel\" ?disabled=${this._deleting} @click=${this.#cancelDelete}>\n\t\t\t\t\t\tCancel\n\t\t\t\t\t</button>\n\t\t\t\t\t<button class=\"btn btn-reject\" ?disabled=${this._deleting} @click=${this.#confirmDelete}>\n\t\t\t\t\t\t${this._deleting ? 'Removing...' : 'Remove'}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</dialog>\n\t\t`;\n\t}\n\n\t#openDialog() {\n\t\tthis._dialogOpen = true;\n\t}\n\n\t#closeDialog() {\n\t\tthis._dialogOpen = false;\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-accounts': DevWalletAccounts;\n\t}\n}\n"],"mappings":"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"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { CoinRecord } from "./utils.mjs";
|
|
2
|
-
import * as _$lit from "lit";
|
|
3
2
|
import { LitElement, nothing } from "lit";
|
|
4
3
|
import { ClientWithCoreApi } from "@mysten/sui/client";
|
|
5
4
|
|
|
6
5
|
//#region src/ui/dev-wallet-balances.d.ts
|
|
7
6
|
declare class DevWalletBalances extends LitElement {
|
|
8
7
|
#private;
|
|
9
|
-
static styles: (
|
|
8
|
+
static styles: (import("lit").CSSResult | import("lit").CSSResult[])[];
|
|
10
9
|
address: string;
|
|
11
10
|
client: ClientWithCoreApi | null;
|
|
12
11
|
network: string;
|
|
@@ -21,7 +20,7 @@ declare class DevWalletBalances extends LitElement {
|
|
|
21
20
|
/** Re-fetch balances for the current address/client. */
|
|
22
21
|
refresh(): void;
|
|
23
22
|
willUpdate(changedProperties: Map<string, unknown>): void;
|
|
24
|
-
render():
|
|
23
|
+
render(): import("lit").TemplateResult<1> | typeof nothing;
|
|
25
24
|
}
|
|
26
25
|
declare global {
|
|
27
26
|
interface HTMLElementTagNameMap {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-wallet-balances.d.mts","names":[],"sources":["../../src/ui/dev-wallet-balances.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"dev-wallet-balances.d.mts","names":[],"sources":["../../src/ui/dev-wallet-balances.ts"],"mappings":";;;;;cA0Ba,iBAAA,SAA0B,UAAA;EAAA;SACtB,MAAA,iBAAM,SAAA,iBAAA,SAAA;EA2LtB,OAAA;EAGA,MAAA,EAAQ,iBAAA;EAGR,OAAA;EAOO;;;;EAAP,KAAA,EAAO,UAAA;EAAA,QAGC,SAAA;EAAA,QAGA,QAAA;EAAA,QAGA,MAAA;EAjNQ;EA0NhB,OAAA;EAMS,UAAA,CAAW,iBAAA,EAAmB,GAAA;EAe9B,MAAA,kBAAM,cAAA,aAAA,OAAA;AAAA;AAAA,QAyHR,MAAA;EAAA,UACG,qBAAA;IACT,qBAAA,EAAuB,iBAAiB;EAAA;AAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { sectionHeaderStyles, sharedStyles, stateStyles } from "./styles.mjs";
|
|
2
2
|
import { formatAddress, formatCoinBalance, getCoinSymbol, indexCoinsByType, isSuiCoinType, lookupCoinByType } from "./utils.mjs";
|
|
3
|
-
import { __decorate } from "../_virtual/_@oxc-project_runtime@0.
|
|
3
|
+
import { __decorate } from "../_virtual/_@oxc-project_runtime@0.135.0/helpers/esm/decorate.mjs";
|
|
4
4
|
import { LitElement, css, html, nothing } from "lit";
|
|
5
5
|
import { customElement, property, state } from "lit/decorators.js";
|
|
6
6
|
//#region src/ui/dev-wallet-balances.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-wallet-balances.mjs","names":["#fetchBalances","#lastCoinsRef","#coinIndex","#lastFetchedAddress","#lastFetchedClient","#fetchGeneration"],"sources":["../../src/ui/dev-wallet-balances.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ClientWithCoreApi } from '@mysten/sui/client';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport { sectionHeaderStyles, sharedStyles, stateStyles } from './styles.js';\nimport type { CoinManifestEntry, CoinRecord } from './utils.js';\nimport {\n\tformatAddress,\n\tformatCoinBalance,\n\tgetCoinSymbol,\n\tindexCoinsByType,\n\tisSuiCoinType,\n\tlookupCoinByType,\n} from './utils.js';\n\ninterface CoinBalance {\n\tcoinType: string;\n\tsymbol: string;\n\ttotalBalance: string;\n\tdecimals: number;\n}\n\n@customElement('dev-wallet-balances')\nexport class DevWalletBalances extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tsectionHeaderStyles,\n\t\tstateStyles,\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: block;\n\t\t\t}\n\n\t\t\t.balance-list {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 2px;\n\t\t\t}\n\n\t\t\t.balance-item {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 10px;\n\t\t\t\tpadding: 8px 2px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius);\n\t\t\t\tbackground: transparent;\n\t\t\t\ttransition: background 120ms;\n\t\t\t}\n\n\t\t\t.balance-item:hover {\n\t\t\t\tbackground: var(--dev-wallet-bg-hover);\n\t\t\t}\n\n\t\t\t.balance-main {\n\t\t\t\tflex: 1;\n\t\t\t\tmin-width: 0;\n\t\t\t}\n\n\t\t\t.token-icon {\n\t\t\t\twidth: 28px;\n\t\t\t\theight: 28px;\n\t\t\t\tborder-radius: 50%;\n\t\t\t\tdisplay: inline-flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tflex-shrink: 0;\n\t\t\t\tbackground: linear-gradient(135deg, var(--dev-wallet-primary), var(--dev-wallet-teal));\n\t\t\t\tcolor: #fff;\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 10px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tbox-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.15);\n\t\t\t}\n\n\t\t\t.balance-symbol {\n\t\t\t\tfont-size: 12px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t}\n\n\t\t\t.balance-name {\n\t\t\t\tfont-size: 11px;\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\n\t\t\t.balance-amount-stack {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\talign-items: flex-end;\n\t\t\t\tgap: 1px;\n\t\t\t\tfont-size: 12px;\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-variant-numeric: tabular-nums;\n\t\t\t}\n\n\t\t\t.balance-amount-symbol {\n\t\t\t\tfont-size: 10.5px;\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t}\n\n\t\t\t.coins-header {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\tgap: 8px;\n\t\t\t}\n\n\t\t\t.coins-header .section-header {\n\t\t\t\tmargin-bottom: 0;\n\t\t\t}\n\n\t\t\t.manage-btn,\n\t\t\t.action-btn {\n\t\t\t\theight: 30px;\n\t\t\t\tpadding: 0 10px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: transparent;\n\t\t\t\tcolor: var(--dev-wallet-text-2);\n\t\t\t\tfont-size: 12px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t}\n\n\t\t\t.manage-btn:hover,\n\t\t\t.action-btn:hover:not(:disabled) {\n\t\t\t\tbackground: var(--dev-wallet-bg-hover);\n\t\t\t\tborder-color: var(--dev-wallet-border-strong);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t}\n\n\t\t\t.manage-btn:disabled {\n\t\t\t\topacity: 0.48;\n\t\t\t\tcursor: not-allowed;\n\t\t\t}\n\n\t\t\t.balance-hero {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\tgap: 12px;\n\t\t\t\tmargin-bottom: 18px;\n\t\t\t\tpadding: 16px;\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tborder-radius: var(--dev-wallet-radius-lg);\n\t\t\t\tbackground:\n\t\t\t\t\tradial-gradient(\n\t\t\t\t\t\tcircle at 20% 0%,\n\t\t\t\t\t\tcolor-mix(in srgb, var(--dev-wallet-primary) 18%, transparent),\n\t\t\t\t\t\ttransparent 42%\n\t\t\t\t\t),\n\t\t\t\t\tvar(--dev-wallet-surface);\n\t\t\t}\n\n\t\t\t.hero-copy {\n\t\t\t\tmin-width: 0;\n\t\t\t}\n\n\t\t\t.hero-balance {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: baseline;\n\t\t\t\tgap: 8px;\n\t\t\t}\n\n\t\t\t.hero-value {\n\t\t\t\tfont-size: 30px;\n\t\t\t\tline-height: 1;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tfont-variant-numeric: tabular-nums;\n\t\t\t\tletter-spacing: 0;\n\t\t\t}\n\n\t\t\t.hero-unit {\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 13px;\n\t\t\t\tcolor: var(--dev-wallet-text-2);\n\t\t\t}\n\n\t\t\t.hero-note {\n\t\t\t\tmargin-top: 6px;\n\t\t\t\tfont-size: 12px;\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\n\t\t\t.empty-wallet {\n\t\t\t\ttext-align: left;\n\t\t\t\tpadding: 16px;\n\t\t\t}\n\n\t\t\t.empty-title {\n\t\t\t\tfont-size: 13px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t}\n\n\t\t\t.empty-copy {\n\t\t\t\tmargin-top: 6px;\n\t\t\t\tfont-size: 12px;\n\t\t\t\tline-height: 1.45;\n\t\t\t\tcolor: var(--dev-wallet-text-2);\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ type: String })\n\taddress = '';\n\n\t@property({ attribute: false })\n\tclient: ClientWithCoreApi | null = null;\n\n\t@property({ type: String })\n\tnetwork = '';\n\n\t/** Optional pre-seeded coin metadata — pass the generated `coins`\n\t * constant from devstack codegen (`src/generated/coins.ts`) to skip\n\t * per-coin `getCoinMetadata` RPC waterfalls on UI load. Unknown coin\n\t * types fall through to an RPC fetch as before. */\n\t@property({ attribute: false })\n\tcoins: CoinRecord | null = null;\n\n\t@state()\n\tprivate _balances: CoinBalance[] = [];\n\n\t@state()\n\tprivate _loading = false;\n\n\t@state()\n\tprivate _error: string | null = null;\n\n\t#lastFetchedAddress = '';\n\t#lastFetchedClient: ClientWithCoreApi | null = null;\n\t#fetchGeneration = 0;\n\t#coinIndex: ReadonlyMap<string, CoinManifestEntry> = new Map();\n\t#lastCoinsRef: CoinRecord | null = null;\n\n\t/** Re-fetch balances for the current address/client. */\n\trefresh() {\n\t\tif (this.address && this.client) {\n\t\t\tthis.#fetchBalances();\n\t\t}\n\t}\n\n\toverride willUpdate(changedProperties: Map<string, unknown>) {\n\t\tif (changedProperties.has('coins') && this.coins !== this.#lastCoinsRef) {\n\t\t\tthis.#coinIndex = indexCoinsByType(this.coins);\n\t\t\tthis.#lastCoinsRef = this.coins;\n\t\t}\n\t\tif (\n\t\t\t(changedProperties.has('address') || changedProperties.has('client')) &&\n\t\t\tthis.address &&\n\t\t\tthis.client &&\n\t\t\t(this.address !== this.#lastFetchedAddress || this.client !== this.#lastFetchedClient)\n\t\t) {\n\t\t\tthis.#fetchBalances();\n\t\t}\n\t}\n\n\toverride render() {\n\t\tif (!this.address || !this.client) {\n\t\t\treturn nothing;\n\t\t}\n\n\t\tconst suiBalance = this._balances.find(\n\t\t\t(balance) => isSuiCoinType(balance.coinType) || balance.symbol === 'SUI',\n\t\t);\n\t\tconst formattedSui = suiBalance\n\t\t\t? formatCoinBalance(suiBalance.totalBalance, suiBalance.decimals)\n\t\t\t: '0.0000';\n\t\tconst networkLabel = this.network || 'active network';\n\n\t\treturn html`\n\t\t\t<div class=\"balance-hero\">\n\t\t\t\t<div class=\"hero-copy\">\n\t\t\t\t\t<div class=\"hero-balance\">\n\t\t\t\t\t\t<span class=\"hero-value\">${formattedSui}</span>\n\t\t\t\t\t\t<span class=\"hero-unit\">SUI</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"hero-note\">${formatAddress(this.address)} · ${networkLabel}</div>\n\t\t\t\t</div>\n\t\t\t\t<button class=\"action-btn\" @click=${this.refresh}>Refresh</button>\n\t\t\t</div>\n\t\t\t<div class=\"coins-header\">\n\t\t\t\t<h3 class=\"section-header\">Coins · ${this._balances.length}</h3>\n\t\t\t\t<button class=\"manage-btn\" disabled>Manage</button>\n\t\t\t</div>\n\t\t\t${this._loading\n\t\t\t\t? html`<div class=\"loading\" part=\"loading\" aria-live=\"polite\">Loading...</div>`\n\t\t\t\t: this._error\n\t\t\t\t\t? html`<div class=\"error-state\" part=\"error-message\" aria-live=\"polite\">\n\t\t\t\t\t\t\t${this._error}\n\t\t\t\t\t\t</div>`\n\t\t\t\t\t: this._balances.length === 0\n\t\t\t\t\t\t? html`<div class=\"empty-state empty-wallet\" part=\"empty-state\">\n\t\t\t\t\t\t\t\t<div class=\"empty-title\">No balances on ${networkLabel}</div>\n\t\t\t\t\t\t\t\t<div class=\"empty-copy\">\n\t\t\t\t\t\t\t\t\tFund ${formatAddress(this.address)} from your local faucet or devstack seed, then\n\t\t\t\t\t\t\t\t\trefresh balances here.\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>`\n\t\t\t\t\t\t: html`\n\t\t\t\t\t\t\t\t<div class=\"balance-list\" part=\"balance-list\">\n\t\t\t\t\t\t\t\t\t${this._balances.map((balance) => {\n\t\t\t\t\t\t\t\t\t\tconst seed = lookupCoinByType(this.#coinIndex, balance.coinType);\n\t\t\t\t\t\t\t\t\t\tconst name = seed?.displayName ?? balance.symbol;\n\t\t\t\t\t\t\t\t\t\treturn html`\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"balance-item\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"token-icon\">${balance.symbol.slice(0, 3)}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"balance-main\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"balance-symbol\">${balance.symbol}</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"balance-name\">${name}</div>\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"balance-amount-stack\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"balance-amount\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t${formatCoinBalance(balance.totalBalance, balance.decimals)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"balance-amount-symbol\">${balance.symbol}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t`;\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t`}\n\t\t`;\n\t}\n\n\tasync #fetchBalances() {\n\t\tthis.#lastFetchedAddress = this.address;\n\t\tthis.#lastFetchedClient = this.client;\n\t\tconst generation = ++this.#fetchGeneration;\n\t\tthis._loading = true;\n\t\tthis._error = null;\n\n\t\ttry {\n\t\t\tconst { balances } = await this.client!.core.listBalances({ owner: this.address });\n\n\t\t\tif (generation !== this.#fetchGeneration) return;\n\n\t\t\t// Pre-seed metadata from the generated `coins` record. Each\n\t\t\t// balance with a known coinType skips the per-coin RPC entirely;\n\t\t\t// only the (typically empty) remainder hits the network.\n\t\t\tconst preseeded = balances.map((b) => lookupCoinByType(this.#coinIndex, b.coinType));\n\t\t\tconst metadataResults = await Promise.all(\n\t\t\t\tbalances.map((b, i) => {\n\t\t\t\t\tif (preseeded[i] !== undefined) return null;\n\t\t\t\t\treturn this.client!.core.getCoinMetadata({ coinType: b.coinType }).catch(() => null);\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\tif (generation !== this.#fetchGeneration) return;\n\t\t\tthis._balances = balances.map((b, i): CoinBalance => {\n\t\t\t\tconst seed = preseeded[i];\n\t\t\t\tif (seed !== undefined) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcoinType: b.coinType,\n\t\t\t\t\t\tsymbol: seed.symbol ?? getCoinSymbol(b.coinType),\n\t\t\t\t\t\ttotalBalance: b.balance,\n\t\t\t\t\t\tdecimals: seed.decimals,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tcoinType: b.coinType,\n\t\t\t\t\tsymbol: metadataResults[i]?.coinMetadata?.symbol ?? getCoinSymbol(b.coinType),\n\t\t\t\t\ttotalBalance: b.balance,\n\t\t\t\t\tdecimals: metadataResults[i]?.coinMetadata?.decimals ?? 0,\n\t\t\t\t};\n\t\t\t});\n\t\t} catch {\n\t\t\tif (generation !== this.#fetchGeneration) return;\n\t\t\tthis._error = 'Failed to load balances';\n\t\t\tthis._balances = [];\n\t\t} finally {\n\t\t\tif (generation === this.#fetchGeneration) {\n\t\t\t\tthis._loading = false;\n\t\t\t}\n\t\t}\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-balances': DevWalletBalances;\n\t}\n}\n"],"mappings":";;;;;;AA0BO,IAAA,oBAAA,MAAM,0BAA0B,WAAW;;;iBA4LvC;gBAGyB;iBAGzB;eAOiB;mBAGQ,EAAE;kBAGlB;gBAGa;6BAEV;4BACyB;0BAC5B;oCACkC,IAAI,KAAK;uBAC3B;;;gBAvNV;GACxB;GACA;GACA;GACA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoLH;;CA2BD;CACA;CACA;CACA;CACA;;CAGA,UAAU;AACT,MAAI,KAAK,WAAW,KAAK,OACxB,OAAA,eAAqB;;CAIvB,WAAoB,mBAAyC;AAC5D,MAAI,kBAAkB,IAAI,QAAQ,IAAI,KAAK,UAAU,MAAA,cAAoB;AACxE,SAAA,YAAkB,iBAAiB,KAAK,MAAM;AAC9C,SAAA,eAAqB,KAAK;;AAE3B,OACE,kBAAkB,IAAI,UAAU,IAAI,kBAAkB,IAAI,SAAS,KACpE,KAAK,WACL,KAAK,WACJ,KAAK,YAAY,MAAA,sBAA4B,KAAK,WAAW,MAAA,mBAE9D,OAAA,eAAqB;;CAIvB,SAAkB;AACjB,MAAI,CAAC,KAAK,WAAW,CAAC,KAAK,OAC1B,QAAO;EAGR,MAAM,aAAa,KAAK,UAAU,MAChC,YAAY,cAAc,QAAQ,SAAS,IAAI,QAAQ,WAAW,MACnE;EACD,MAAM,eAAe,aAClB,kBAAkB,WAAW,cAAc,WAAW,SAAS,GAC/D;EACH,MAAM,eAAe,KAAK,WAAW;AAErC,SAAO,IAAI;;;;iCAIoB,aAAa;;;8BAGhB,cAAc,KAAK,QAAQ,CAAC,KAAK,aAAa;;wCAEpC,KAAK,QAAQ;;;yCAGZ,KAAK,UAAU,OAAO;;;KAG1D,KAAK,WACJ,IAAI,4EACJ,KAAK,SACJ,IAAI;SACF,KAAK,OAAO;gBAEd,KAAK,UAAU,WAAW,IACzB,IAAI;kDACsC,aAAa;;gBAE/C,cAAc,KAAK,QAAQ,CAAC;;;iBAIpC,IAAI;;WAED,KAAK,UAAU,KAAK,YAAY;GAEjC,MAAM,OADO,iBAAiB,MAAA,WAAiB,QAAQ,SAC1C,EAAM,eAAe,QAAQ;AAC1C,UAAO,IAAI;;uCAEkB,QAAQ,OAAO,MAAM,GAAG,EAAE,CAAC;;2CAEvB,QAAQ,OAAO;yCACjB,KAAK;;;;gBAI9B,kBAAkB,QAAQ,cAAc,QAAQ,SAAS,CAAC;;mDAEvB,QAAQ,OAAO;;;;IAIvD,CAAC;;SAEH;;;CAIR,OAAA,gBAAuB;AACtB,QAAA,qBAA2B,KAAK;AAChC,QAAA,oBAA0B,KAAK;EAC/B,MAAM,aAAa,EAAE,MAAA;AACrB,OAAK,WAAW;AAChB,OAAK,SAAS;AAEd,MAAI;GACH,MAAM,EAAE,aAAa,MAAM,KAAK,OAAQ,KAAK,aAAa,EAAE,OAAO,KAAK,SAAS,CAAC;AAElF,OAAI,eAAe,MAAA,gBAAuB;GAK1C,MAAM,YAAY,SAAS,KAAK,MAAM,iBAAiB,MAAA,WAAiB,EAAE,SAAS,CAAC;GACpF,MAAM,kBAAkB,MAAM,QAAQ,IACrC,SAAS,KAAK,GAAG,MAAM;AACtB,QAAI,UAAU,OAAO,OAAW,QAAO;AACvC,WAAO,KAAK,OAAQ,KAAK,gBAAgB,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,YAAY,KAAK;KACnF,CACF;AAED,OAAI,eAAe,MAAA,gBAAuB;AAC1C,QAAK,YAAY,SAAS,KAAK,GAAG,MAAmB;IACpD,MAAM,OAAO,UAAU;AACvB,QAAI,SAAS,OACZ,QAAO;KACN,UAAU,EAAE;KACZ,QAAQ,KAAK,UAAU,cAAc,EAAE,SAAS;KAChD,cAAc,EAAE;KAChB,UAAU,KAAK;KACf;AAEF,WAAO;KACN,UAAU,EAAE;KACZ,QAAQ,gBAAgB,IAAI,cAAc,UAAU,cAAc,EAAE,SAAS;KAC7E,cAAc,EAAE;KAChB,UAAU,gBAAgB,IAAI,cAAc,YAAY;KACxD;KACA;UACK;AACP,OAAI,eAAe,MAAA,gBAAuB;AAC1C,QAAK,SAAS;AACd,QAAK,YAAY,EAAE;YACV;AACT,OAAI,eAAe,MAAA,gBAClB,MAAK,WAAW;;;;YAxKlB,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,EAAA,kBAAA,WAAA,WAAA,KAAA,EAAA;YAG1B,SAAS,EAAE,WAAW,OAAO,CAAC,CAAA,EAAA,kBAAA,WAAA,UAAA,KAAA,EAAA;YAG9B,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,EAAA,kBAAA,WAAA,WAAA,KAAA,EAAA;YAO1B,SAAS,EAAE,WAAW,OAAO,CAAC,CAAA,EAAA,kBAAA,WAAA,SAAA,KAAA,EAAA;YAG9B,OAAO,CAAA,EAAA,kBAAA,WAAA,aAAA,KAAA,EAAA;YAGP,OAAO,CAAA,EAAA,kBAAA,WAAA,YAAA,KAAA,EAAA;YAGP,OAAO,CAAA,EAAA,kBAAA,WAAA,UAAA,KAAA,EAAA;gCAlNR,cAAc,sBAAsB,CAAA,EAAA,kBAAA"}
|
|
1
|
+
{"version":3,"file":"dev-wallet-balances.mjs","names":["#fetchBalances","#lastCoinsRef","#coinIndex","#lastFetchedAddress","#lastFetchedClient","#fetchGeneration"],"sources":["../../src/ui/dev-wallet-balances.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ClientWithCoreApi } from '@mysten/sui/client';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport { sectionHeaderStyles, sharedStyles, stateStyles } from './styles.js';\nimport type { CoinManifestEntry, CoinRecord } from './utils.js';\nimport {\n\tformatAddress,\n\tformatCoinBalance,\n\tgetCoinSymbol,\n\tindexCoinsByType,\n\tisSuiCoinType,\n\tlookupCoinByType,\n} from './utils.js';\n\ninterface CoinBalance {\n\tcoinType: string;\n\tsymbol: string;\n\ttotalBalance: string;\n\tdecimals: number;\n}\n\n@customElement('dev-wallet-balances')\nexport class DevWalletBalances extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tsectionHeaderStyles,\n\t\tstateStyles,\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: block;\n\t\t\t}\n\n\t\t\t.balance-list {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 2px;\n\t\t\t}\n\n\t\t\t.balance-item {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 10px;\n\t\t\t\tpadding: 8px 2px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius);\n\t\t\t\tbackground: transparent;\n\t\t\t\ttransition: background 120ms;\n\t\t\t}\n\n\t\t\t.balance-item:hover {\n\t\t\t\tbackground: var(--dev-wallet-bg-hover);\n\t\t\t}\n\n\t\t\t.balance-main {\n\t\t\t\tflex: 1;\n\t\t\t\tmin-width: 0;\n\t\t\t}\n\n\t\t\t.token-icon {\n\t\t\t\twidth: 28px;\n\t\t\t\theight: 28px;\n\t\t\t\tborder-radius: 50%;\n\t\t\t\tdisplay: inline-flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tflex-shrink: 0;\n\t\t\t\tbackground: linear-gradient(135deg, var(--dev-wallet-primary), var(--dev-wallet-teal));\n\t\t\t\tcolor: #fff;\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 10px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tbox-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.15);\n\t\t\t}\n\n\t\t\t.balance-symbol {\n\t\t\t\tfont-size: 12px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t}\n\n\t\t\t.balance-name {\n\t\t\t\tfont-size: 11px;\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\n\t\t\t.balance-amount-stack {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\talign-items: flex-end;\n\t\t\t\tgap: 1px;\n\t\t\t\tfont-size: 12px;\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-variant-numeric: tabular-nums;\n\t\t\t}\n\n\t\t\t.balance-amount-symbol {\n\t\t\t\tfont-size: 10.5px;\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t}\n\n\t\t\t.coins-header {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\tgap: 8px;\n\t\t\t}\n\n\t\t\t.coins-header .section-header {\n\t\t\t\tmargin-bottom: 0;\n\t\t\t}\n\n\t\t\t.manage-btn,\n\t\t\t.action-btn {\n\t\t\t\theight: 30px;\n\t\t\t\tpadding: 0 10px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: transparent;\n\t\t\t\tcolor: var(--dev-wallet-text-2);\n\t\t\t\tfont-size: 12px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t}\n\n\t\t\t.manage-btn:hover,\n\t\t\t.action-btn:hover:not(:disabled) {\n\t\t\t\tbackground: var(--dev-wallet-bg-hover);\n\t\t\t\tborder-color: var(--dev-wallet-border-strong);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t}\n\n\t\t\t.manage-btn:disabled {\n\t\t\t\topacity: 0.48;\n\t\t\t\tcursor: not-allowed;\n\t\t\t}\n\n\t\t\t.balance-hero {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\tgap: 12px;\n\t\t\t\tmargin-bottom: 18px;\n\t\t\t\tpadding: 16px;\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tborder-radius: var(--dev-wallet-radius-lg);\n\t\t\t\tbackground:\n\t\t\t\t\tradial-gradient(\n\t\t\t\t\t\tcircle at 20% 0%,\n\t\t\t\t\t\tcolor-mix(in srgb, var(--dev-wallet-primary) 18%, transparent),\n\t\t\t\t\t\ttransparent 42%\n\t\t\t\t\t),\n\t\t\t\t\tvar(--dev-wallet-surface);\n\t\t\t}\n\n\t\t\t.hero-copy {\n\t\t\t\tmin-width: 0;\n\t\t\t}\n\n\t\t\t.hero-balance {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: baseline;\n\t\t\t\tgap: 8px;\n\t\t\t}\n\n\t\t\t.hero-value {\n\t\t\t\tfont-size: 30px;\n\t\t\t\tline-height: 1;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tfont-variant-numeric: tabular-nums;\n\t\t\t\tletter-spacing: 0;\n\t\t\t}\n\n\t\t\t.hero-unit {\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 13px;\n\t\t\t\tcolor: var(--dev-wallet-text-2);\n\t\t\t}\n\n\t\t\t.hero-note {\n\t\t\t\tmargin-top: 6px;\n\t\t\t\tfont-size: 12px;\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\n\t\t\t.empty-wallet {\n\t\t\t\ttext-align: left;\n\t\t\t\tpadding: 16px;\n\t\t\t}\n\n\t\t\t.empty-title {\n\t\t\t\tfont-size: 13px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t}\n\n\t\t\t.empty-copy {\n\t\t\t\tmargin-top: 6px;\n\t\t\t\tfont-size: 12px;\n\t\t\t\tline-height: 1.45;\n\t\t\t\tcolor: var(--dev-wallet-text-2);\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ type: String })\n\taddress = '';\n\n\t@property({ attribute: false })\n\tclient: ClientWithCoreApi | null = null;\n\n\t@property({ type: String })\n\tnetwork = '';\n\n\t/** Optional pre-seeded coin metadata — pass the generated `coins`\n\t * constant from devstack codegen (`src/generated/coins.ts`) to skip\n\t * per-coin `getCoinMetadata` RPC waterfalls on UI load. Unknown coin\n\t * types fall through to an RPC fetch as before. */\n\t@property({ attribute: false })\n\tcoins: CoinRecord | null = null;\n\n\t@state()\n\tprivate _balances: CoinBalance[] = [];\n\n\t@state()\n\tprivate _loading = false;\n\n\t@state()\n\tprivate _error: string | null = null;\n\n\t#lastFetchedAddress = '';\n\t#lastFetchedClient: ClientWithCoreApi | null = null;\n\t#fetchGeneration = 0;\n\t#coinIndex: ReadonlyMap<string, CoinManifestEntry> = new Map();\n\t#lastCoinsRef: CoinRecord | null = null;\n\n\t/** Re-fetch balances for the current address/client. */\n\trefresh() {\n\t\tif (this.address && this.client) {\n\t\t\tthis.#fetchBalances();\n\t\t}\n\t}\n\n\toverride willUpdate(changedProperties: Map<string, unknown>) {\n\t\tif (changedProperties.has('coins') && this.coins !== this.#lastCoinsRef) {\n\t\t\tthis.#coinIndex = indexCoinsByType(this.coins);\n\t\t\tthis.#lastCoinsRef = this.coins;\n\t\t}\n\t\tif (\n\t\t\t(changedProperties.has('address') || changedProperties.has('client')) &&\n\t\t\tthis.address &&\n\t\t\tthis.client &&\n\t\t\t(this.address !== this.#lastFetchedAddress || this.client !== this.#lastFetchedClient)\n\t\t) {\n\t\t\tthis.#fetchBalances();\n\t\t}\n\t}\n\n\toverride render() {\n\t\tif (!this.address || !this.client) {\n\t\t\treturn nothing;\n\t\t}\n\n\t\tconst suiBalance = this._balances.find(\n\t\t\t(balance) => isSuiCoinType(balance.coinType) || balance.symbol === 'SUI',\n\t\t);\n\t\tconst formattedSui = suiBalance\n\t\t\t? formatCoinBalance(suiBalance.totalBalance, suiBalance.decimals)\n\t\t\t: '0.0000';\n\t\tconst networkLabel = this.network || 'active network';\n\n\t\treturn html`\n\t\t\t<div class=\"balance-hero\">\n\t\t\t\t<div class=\"hero-copy\">\n\t\t\t\t\t<div class=\"hero-balance\">\n\t\t\t\t\t\t<span class=\"hero-value\">${formattedSui}</span>\n\t\t\t\t\t\t<span class=\"hero-unit\">SUI</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"hero-note\">${formatAddress(this.address)} · ${networkLabel}</div>\n\t\t\t\t</div>\n\t\t\t\t<button class=\"action-btn\" @click=${this.refresh}>Refresh</button>\n\t\t\t</div>\n\t\t\t<div class=\"coins-header\">\n\t\t\t\t<h3 class=\"section-header\">Coins · ${this._balances.length}</h3>\n\t\t\t\t<button class=\"manage-btn\" disabled>Manage</button>\n\t\t\t</div>\n\t\t\t${this._loading\n\t\t\t\t? html`<div class=\"loading\" part=\"loading\" aria-live=\"polite\">Loading...</div>`\n\t\t\t\t: this._error\n\t\t\t\t\t? html`<div class=\"error-state\" part=\"error-message\" aria-live=\"polite\">\n\t\t\t\t\t\t\t${this._error}\n\t\t\t\t\t\t</div>`\n\t\t\t\t\t: this._balances.length === 0\n\t\t\t\t\t\t? html`<div class=\"empty-state empty-wallet\" part=\"empty-state\">\n\t\t\t\t\t\t\t\t<div class=\"empty-title\">No balances on ${networkLabel}</div>\n\t\t\t\t\t\t\t\t<div class=\"empty-copy\">\n\t\t\t\t\t\t\t\t\tFund ${formatAddress(this.address)} from your local faucet or devstack seed, then\n\t\t\t\t\t\t\t\t\trefresh balances here.\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>`\n\t\t\t\t\t\t: html`\n\t\t\t\t\t\t\t\t<div class=\"balance-list\" part=\"balance-list\">\n\t\t\t\t\t\t\t\t\t${this._balances.map((balance) => {\n\t\t\t\t\t\t\t\t\t\tconst seed = lookupCoinByType(this.#coinIndex, balance.coinType);\n\t\t\t\t\t\t\t\t\t\tconst name = seed?.displayName ?? balance.symbol;\n\t\t\t\t\t\t\t\t\t\treturn html`\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"balance-item\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"token-icon\">${balance.symbol.slice(0, 3)}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"balance-main\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"balance-symbol\">${balance.symbol}</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"balance-name\">${name}</div>\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"balance-amount-stack\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"balance-amount\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t${formatCoinBalance(balance.totalBalance, balance.decimals)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"balance-amount-symbol\">${balance.symbol}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t`;\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t`}\n\t\t`;\n\t}\n\n\tasync #fetchBalances() {\n\t\tthis.#lastFetchedAddress = this.address;\n\t\tthis.#lastFetchedClient = this.client;\n\t\tconst generation = ++this.#fetchGeneration;\n\t\tthis._loading = true;\n\t\tthis._error = null;\n\n\t\ttry {\n\t\t\tconst { balances } = await this.client!.core.listBalances({ owner: this.address });\n\n\t\t\tif (generation !== this.#fetchGeneration) return;\n\n\t\t\t// Pre-seed metadata from the generated `coins` record. Each\n\t\t\t// balance with a known coinType skips the per-coin RPC entirely;\n\t\t\t// only the (typically empty) remainder hits the network.\n\t\t\tconst preseeded = balances.map((b) => lookupCoinByType(this.#coinIndex, b.coinType));\n\t\t\tconst metadataResults = await Promise.all(\n\t\t\t\tbalances.map((b, i) => {\n\t\t\t\t\tif (preseeded[i] !== undefined) return null;\n\t\t\t\t\treturn this.client!.core.getCoinMetadata({ coinType: b.coinType }).catch(() => null);\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\tif (generation !== this.#fetchGeneration) return;\n\t\t\tthis._balances = balances.map((b, i): CoinBalance => {\n\t\t\t\tconst seed = preseeded[i];\n\t\t\t\tif (seed !== undefined) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcoinType: b.coinType,\n\t\t\t\t\t\tsymbol: seed.symbol ?? getCoinSymbol(b.coinType),\n\t\t\t\t\t\ttotalBalance: b.balance,\n\t\t\t\t\t\tdecimals: seed.decimals,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tcoinType: b.coinType,\n\t\t\t\t\tsymbol: metadataResults[i]?.coinMetadata?.symbol ?? getCoinSymbol(b.coinType),\n\t\t\t\t\ttotalBalance: b.balance,\n\t\t\t\t\tdecimals: metadataResults[i]?.coinMetadata?.decimals ?? 0,\n\t\t\t\t};\n\t\t\t});\n\t\t} catch {\n\t\t\tif (generation !== this.#fetchGeneration) return;\n\t\t\tthis._error = 'Failed to load balances';\n\t\t\tthis._balances = [];\n\t\t} finally {\n\t\t\tif (generation === this.#fetchGeneration) {\n\t\t\t\tthis._loading = false;\n\t\t\t}\n\t\t}\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-balances': DevWalletBalances;\n\t}\n}\n"],"mappings":";;;;;;AA0BO,IAAA,oBAAA,MAAM,0BAA0B,WAAW;;;iBA4LvC;gBAGyB;iBAGzB;eAOiB;mBAGQ,CAAC;kBAGjB;gBAGa;6BAEV;4BACyB;0BAC5B;oCACkC,IAAI,IAAI;uBAC1B;;;gBAvNV;GACxB;GACA;GACA;GACA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoLJ;;CA2BA;CACA;CACA;CACA;CACA;;CAGA,UAAU;EACT,IAAI,KAAK,WAAW,KAAK,QACxB,KAAKA,eAAe;CAEtB;CAEA,WAAoB,mBAAyC;EAC5D,IAAI,kBAAkB,IAAI,OAAO,KAAK,KAAK,UAAU,KAAKC,eAAe;GACxE,KAAKC,aAAa,iBAAiB,KAAK,KAAK;GAC7C,KAAKD,gBAAgB,KAAK;EAC3B;EACA,KACE,kBAAkB,IAAI,SAAS,KAAK,kBAAkB,IAAI,QAAQ,MACnE,KAAK,WACL,KAAK,WACJ,KAAK,YAAY,KAAKE,uBAAuB,KAAK,WAAW,KAAKC,qBAEnE,KAAKJ,eAAe;CAEtB;CAEA,SAAkB;EACjB,IAAI,CAAC,KAAK,WAAW,CAAC,KAAK,QAC1B,OAAO;EAGR,MAAM,aAAa,KAAK,UAAU,MAChC,YAAY,cAAc,QAAQ,QAAQ,KAAK,QAAQ,WAAW,KACpE;EACA,MAAM,eAAe,aAClB,kBAAkB,WAAW,cAAc,WAAW,QAAQ,IAC9D;EACH,MAAM,eAAe,KAAK,WAAW;EAErC,OAAO,IAAI;;;;iCAIoB,aAAa;;;8BAGhB,cAAc,KAAK,OAAO,EAAE,KAAK,aAAa;;wCAEpC,KAAK,QAAQ;;;yCAGZ,KAAK,UAAU,OAAO;;;KAG1D,KAAK,WACJ,IAAI,4EACJ,KAAK,SACJ,IAAI;SACF,KAAK,OAAO;gBAEd,KAAK,UAAU,WAAW,IACzB,IAAI;kDACsC,aAAa;;gBAE/C,cAAc,KAAK,OAAO,EAAE;;;iBAIpC,IAAI;;WAED,KAAK,UAAU,KAAK,YAAY;GAEjC,MAAM,OADO,iBAAiB,KAAKE,YAAY,QAAQ,QAC1C,CAAA,EAAM,eAAe,QAAQ;GAC1C,OAAO,IAAI;;uCAEkB,QAAQ,OAAO,MAAM,GAAG,CAAC,EAAE;;2CAEvB,QAAQ,OAAO;yCACjB,KAAK;;;;gBAI9B,kBAAkB,QAAQ,cAAc,QAAQ,QAAQ,EAAE;;mDAEvB,QAAQ,OAAO;;;;EAIzD,CAAC,EAAE;;SAEH;;CAER;CAEA,MAAMF,iBAAiB;EACtB,KAAKG,sBAAsB,KAAK;EAChC,KAAKC,qBAAqB,KAAK;EAC/B,MAAM,aAAa,EAAE,KAAKC;EAC1B,KAAK,WAAW;EAChB,KAAK,SAAS;EAEd,IAAI;GACH,MAAM,EAAE,aAAa,MAAM,KAAK,OAAQ,KAAK,aAAa,EAAE,OAAO,KAAK,QAAQ,CAAC;GAEjF,IAAI,eAAe,KAAKA,kBAAkB;GAK1C,MAAM,YAAY,SAAS,KAAK,MAAM,iBAAiB,KAAKH,YAAY,EAAE,QAAQ,CAAC;GACnF,MAAM,kBAAkB,MAAM,QAAQ,IACrC,SAAS,KAAK,GAAG,MAAM;IACtB,IAAI,UAAU,OAAO,QAAW,OAAO;IACvC,OAAO,KAAK,OAAQ,KAAK,gBAAgB,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,YAAY,IAAI;GACpF,CAAC,CACF;GAEA,IAAI,eAAe,KAAKG,kBAAkB;GAC1C,KAAK,YAAY,SAAS,KAAK,GAAG,MAAmB;IACpD,MAAM,OAAO,UAAU;IACvB,IAAI,SAAS,QACZ,OAAO;KACN,UAAU,EAAE;KACZ,QAAQ,KAAK,UAAU,cAAc,EAAE,QAAQ;KAC/C,cAAc,EAAE;KAChB,UAAU,KAAK;IAChB;IAED,OAAO;KACN,UAAU,EAAE;KACZ,QAAQ,gBAAgB,EAAE,EAAE,cAAc,UAAU,cAAc,EAAE,QAAQ;KAC5E,cAAc,EAAE;KAChB,UAAU,gBAAgB,EAAE,EAAE,cAAc,YAAY;IACzD;GACD,CAAC;EACF,QAAQ;GACP,IAAI,eAAe,KAAKA,kBAAkB;GAC1C,KAAK,SAAS;GACd,KAAK,YAAY,CAAC;EACnB,UAAU;GACT,IAAI,eAAe,KAAKA,kBACvB,KAAK,WAAW;EAElB;CACD;AACD;YA5KE,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,kBAAA,WAAA,WAAA,KAAA,CAAA;YAGzB,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,kBAAA,WAAA,UAAA,KAAA,CAAA;YAG7B,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,kBAAA,WAAA,WAAA,KAAA,CAAA;YAOzB,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,kBAAA,WAAA,SAAA,KAAA,CAAA;YAG7B,MAAM,CAAA,GAAA,kBAAA,WAAA,aAAA,KAAA,CAAA;YAGN,MAAM,CAAA,GAAA,kBAAA,WAAA,YAAA,KAAA,CAAA;YAGN,MAAM,CAAA,GAAA,kBAAA,WAAA,UAAA,KAAA,CAAA;gCAlNP,cAAc,qBAAqB,CAAA,GAAA,iBAAA"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import * as _$lit from "lit";
|
|
2
1
|
import { LitElement } from "lit";
|
|
3
2
|
|
|
4
3
|
//#region src/ui/dev-wallet-connect.d.ts
|
|
@@ -9,7 +8,7 @@ interface AccountInfo {
|
|
|
9
8
|
}
|
|
10
9
|
declare class DevWalletConnect extends LitElement {
|
|
11
10
|
#private;
|
|
12
|
-
static styles: (
|
|
11
|
+
static styles: (import("lit").CSSResult | import("lit").CSSResult[])[];
|
|
13
12
|
appName: string;
|
|
14
13
|
appUrl: string;
|
|
15
14
|
accounts: AccountInfo[];
|
|
@@ -17,7 +16,7 @@ declare class DevWalletConnect extends LitElement {
|
|
|
17
16
|
private _error;
|
|
18
17
|
private _selectedAddresses;
|
|
19
18
|
willUpdate(changedProperties: Map<string, unknown>): void;
|
|
20
|
-
render():
|
|
19
|
+
render(): import("lit").TemplateResult<1>;
|
|
21
20
|
get selectedAddresses(): string[];
|
|
22
21
|
showError(message: string): void;
|
|
23
22
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-wallet-connect.d.mts","names":[],"sources":["../../src/ui/dev-wallet-connect.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"dev-wallet-connect.d.mts","names":[],"sources":["../../src/ui/dev-wallet-connect.ts"],"mappings":";;;UASU,WAAA;EACT,OAAA;EACA,KAAA;EACA,WAAA;AAAA;AAAA,cAIY,gBAAA,SAAyB,UAAA;EAAA;SACrB,MAAA,iBAAM,SAAA,iBAAA,SAAA;EAuItB,OAAA;EAGA,MAAA;EAGA,QAAA,EAAU,WAAA;EAAA,QAGF,WAAA;EAAA,QAGA,MAAA;EAAA,QAGA,kBAAA;EAEC,UAAA,CAAW,iBAAA,EAAmB,GAAA;EAU9B,MAAA,kBAAM,cAAA;EAAA,IA8DX,iBAAA;EAkBJ,SAAA,CAAU,OAAA;AAAA;AAAA,QAMH,MAAA;EAAA,UACG,qBAAA;IACT,oBAAA,EAAsB,gBAAgB;EAAA;AAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { actionButtonStyles, sharedStyles } from "./styles.mjs";
|
|
2
2
|
import { emitEvent, formatAddress, toggleSetItem } from "./utils.mjs";
|
|
3
|
-
import { __decorate } from "../_virtual/_@oxc-project_runtime@0.
|
|
3
|
+
import { __decorate } from "../_virtual/_@oxc-project_runtime@0.135.0/helpers/esm/decorate.mjs";
|
|
4
4
|
import { LitElement, css, html, nothing } from "lit";
|
|
5
5
|
import { customElement, property, state } from "lit/decorators.js";
|
|
6
6
|
//#region src/ui/dev-wallet-connect.ts
|