@mysten-incubation/dev-wallet 0.5.1 → 0.6.0

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.
Files changed (68) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +7 -4
  3. package/dist/client/connected-apps.d.mts +35 -0
  4. package/dist/client/connected-apps.d.mts.map +1 -0
  5. package/dist/client/connected-apps.mjs +50 -0
  6. package/dist/client/connected-apps.mjs.map +1 -0
  7. package/dist/client/dev-wallet-client.mjs +1 -1
  8. package/dist/client/dev-wallet-client.mjs.map +1 -1
  9. package/dist/client/index.d.mts +2 -1
  10. package/dist/client/index.mjs +2 -1
  11. package/dist/client/request-handler.d.mts +7 -0
  12. package/dist/client/request-handler.d.mts.map +1 -1
  13. package/dist/client/request-handler.mjs +17 -2
  14. package/dist/client/request-handler.mjs.map +1 -1
  15. package/dist/standalone/assets/{in-memory-adapter-Ban2kRYS.js → in-memory-adapter-uuWG4K4k.js} +1 -1
  16. package/dist/standalone/assets/main-CKYv0eR6.js +7 -0
  17. package/dist/standalone/assets/{webcrypto-adapter-Ddqn-RAu.js → webcrypto-adapter-5ShaPc_M.js} +1 -1
  18. package/dist/standalone/bookmarklet.js +1 -1
  19. package/dist/standalone/index.html +1 -1
  20. package/dist/ui/dev-wallet-balances.d.mts.map +1 -1
  21. package/dist/ui/dev-wallet-balances.mjs +20 -13
  22. package/dist/ui/dev-wallet-balances.mjs.map +1 -1
  23. package/dist/ui/dev-wallet-connect-guide.d.mts +29 -0
  24. package/dist/ui/dev-wallet-connect-guide.d.mts.map +1 -0
  25. package/dist/ui/dev-wallet-connect-guide.mjs +386 -0
  26. package/dist/ui/dev-wallet-connect-guide.mjs.map +1 -0
  27. package/dist/ui/dev-wallet-connected-apps.d.mts +27 -0
  28. package/dist/ui/dev-wallet-connected-apps.d.mts.map +1 -0
  29. package/dist/ui/dev-wallet-connected-apps.mjs +164 -0
  30. package/dist/ui/dev-wallet-connected-apps.mjs.map +1 -0
  31. package/dist/ui/dev-wallet-panel.d.mts.map +1 -1
  32. package/dist/ui/dev-wallet-panel.mjs +0 -9
  33. package/dist/ui/dev-wallet-panel.mjs.map +1 -1
  34. package/dist/ui/dev-wallet-settings.d.mts +8 -2
  35. package/dist/ui/dev-wallet-settings.d.mts.map +1 -1
  36. package/dist/ui/dev-wallet-settings.mjs +86 -171
  37. package/dist/ui/dev-wallet-settings.mjs.map +1 -1
  38. package/dist/ui/dev-wallet-standalone.d.mts +7 -2
  39. package/dist/ui/dev-wallet-standalone.d.mts.map +1 -1
  40. package/dist/ui/dev-wallet-standalone.mjs +68 -222
  41. package/dist/ui/dev-wallet-standalone.mjs.map +1 -1
  42. package/dist/ui/index.d.mts +3 -1
  43. package/dist/ui/index.mjs +3 -1
  44. package/dist/ui/wallet-controller.mjs +15 -3
  45. package/dist/ui/wallet-controller.mjs.map +1 -1
  46. package/dist/wallet/dev-wallet.d.mts +15 -3
  47. package/dist/wallet/dev-wallet.d.mts.map +1 -1
  48. package/dist/wallet/dev-wallet.mjs +94 -30
  49. package/dist/wallet/dev-wallet.mjs.map +1 -1
  50. package/dist/wallet/persisted.mjs +20 -0
  51. package/dist/wallet/persisted.mjs.map +1 -0
  52. package/package.json +6 -6
  53. package/src/app/main.ts +6 -2
  54. package/src/client/connected-apps.ts +79 -0
  55. package/src/client/dev-wallet-client.ts +2 -1
  56. package/src/client/index.ts +2 -0
  57. package/src/client/request-handler.ts +24 -1
  58. package/src/ui/dev-wallet-balances.ts +25 -13
  59. package/src/ui/dev-wallet-connect-guide.ts +428 -0
  60. package/src/ui/dev-wallet-connected-apps.ts +191 -0
  61. package/src/ui/dev-wallet-panel.ts +0 -9
  62. package/src/ui/dev-wallet-settings.ts +101 -179
  63. package/src/ui/dev-wallet-standalone.ts +80 -231
  64. package/src/ui/index.ts +2 -0
  65. package/src/ui/wallet-controller.ts +23 -3
  66. package/src/wallet/dev-wallet.ts +130 -39
  67. package/src/wallet/persisted.ts +24 -0
  68. package/dist/standalone/assets/main-xfzarPod.js +0 -7
@@ -1 +1 @@
1
- import{a as e,l as t,n,t as r}from"./base-adapter-C5w5q7XZ.js";import{t as i}from"./main-xfzarPod.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
+ import{a as e,l as t,n,t as r}from"./base-adapter-C5w5q7XZ.js";import{t as i}from"./main-CKYv0eR6.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
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
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
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:globalThis.document?.title||globalThis.location?.host||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
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
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,7 @@
37
37
  font-size: 14px;
38
38
  }
39
39
  </style>
40
- <script type="module" crossorigin src="/assets/main-xfzarPod.js"></script>
40
+ <script type="module" crossorigin src="/assets/main-CKYv0eR6.js"></script>
41
41
  <link rel="modulepreload" crossorigin href="/assets/base-adapter-C5w5q7XZ.js">
42
42
  </head>
43
43
  <body>
@@ -1 +1 @@
1
- {"version":3,"file":"dev-wallet-balances.d.mts","names":[],"sources":["../../src/ui/dev-wallet-balances.ts"],"mappings":";;;;;cA2Ba,iBAAA,SAA0B,UAAA;EAAA;SACtB,MAAA,iBAAM,SAAA,iBAAA,SAAA;EAkMtB,OAAA;EAGA,MAAA,EAAQ,iBAAA;EAGR,OAAA;EAcO;;;;EAPP,UAAA;EAhNgD;;;;EAuNhD,KAAA,EAAO,UAAA;EAAA,QAGC,SAAA;EAAA,QAGA,QAAA;EAAA,QAGA,MAAA;EAAA,QAGA,QAAA;EAAA,QAGA,UAAA;EAtBR;EA+BA,OAAA;EAwBS,UAAA,CAAW,iBAAA,EAAmB,GAAA;EAe9B,MAAA,kBAAM,cAAA,aAAA,OAAA;AAAA;AAAA,QA6IR,MAAA;EAAA,UACG,qBAAA;IACT,qBAAA,EAAuB,iBAAiB;EAAA;AAAA"}
1
+ {"version":3,"file":"dev-wallet-balances.d.mts","names":[],"sources":["../../src/ui/dev-wallet-balances.ts"],"mappings":";;;;;cA2Ba,iBAAA,SAA0B,UAAA;EAAA;SACtB,MAAA,iBAAM,SAAA,iBAAA,SAAA;EA+LtB,OAAA;EAGA,MAAA,EAAQ,iBAAA;EAGR,OAAA;EAcO;;;;EAPP,UAAA;EA7MgD;;;;EAoNhD,KAAA,EAAO,UAAA;EAAA,QAGC,SAAA;EAAA,QAGA,QAAA;EAAA,QAGA,MAAA;EAAA,QAGA,QAAA;EAAA,QAGA,UAAA;EAtBR;EA+BA,OAAA;EAmCS,UAAA,CAAW,iBAAA,EAAmB,GAAA;EAe9B,MAAA,kBAAM,cAAA,aAAA,OAAA;AAAA;AAAA,QAiJR,MAAA;EAAA,UACG,qBAAA;IACT,qBAAA,EAAuB,iBAAiB;EAAA;AAAA"}
@@ -116,7 +116,6 @@ let DevWalletBalances = class DevWalletBalances extends LitElement {
116
116
  margin-bottom: 0;
117
117
  }
118
118
 
119
- .manage-btn,
120
119
  .action-btn {
121
120
  height: 30px;
122
121
  padding: 0 10px;
@@ -128,18 +127,12 @@ let DevWalletBalances = class DevWalletBalances extends LitElement {
128
127
  font-weight: var(--dev-wallet-font-weight-medium);
129
128
  }
130
129
 
131
- .manage-btn:hover,
132
130
  .action-btn:hover:not(:disabled) {
133
131
  background: var(--dev-wallet-bg-hover);
134
132
  border-color: var(--dev-wallet-border-strong);
135
133
  color: var(--dev-wallet-foreground);
136
134
  }
137
135
 
138
- .manage-btn:disabled {
139
- opacity: 0.48;
140
- cursor: not-allowed;
141
- }
142
-
143
136
  .balance-hero {
144
137
  display: flex;
145
138
  align-items: center;
@@ -209,6 +202,10 @@ let DevWalletBalances = class DevWalletBalances extends LitElement {
209
202
  color: var(--dev-wallet-foreground);
210
203
  }
211
204
 
205
+ .empty-copy a {
206
+ color: var(--dev-wallet-foreground);
207
+ }
208
+
212
209
  .empty-copy {
213
210
  margin-top: 6px;
214
211
  font-size: 12px;
@@ -228,17 +225,25 @@ let DevWalletBalances = class DevWalletBalances extends LitElement {
228
225
  if (this.address && this.client) this.#fetchBalances();
229
226
  }
230
227
  /** Request SUI from the active network's faucet for the active address,
231
- * then refresh balances. No-op when no `faucetHost` is configured (live
232
- * mainnet / fork stacks have none). */
228
+ * wait for the faucet's transfers to land, then refresh balances. No-op
229
+ * when no `faucetHost` is configured (live mainnet / fork stacks have none). */
233
230
  async #requestFromFaucet() {
234
231
  if (!this.faucetHost || !this.address || this._funding) return;
235
232
  this._funding = true;
236
233
  this._fundError = null;
237
234
  try {
238
- await requestSuiFromFaucetV2({
235
+ const result = await requestSuiFromFaucetV2({
239
236
  host: this.faucetHost,
240
237
  recipient: this.address
241
238
  });
239
+ const client = this.client;
240
+ if (client) {
241
+ const digests = new Set(result.coins_sent?.map((c) => c.transferTxDigest) ?? []);
242
+ await Promise.allSettled([...digests].map((digest) => client.core.waitForTransaction({
243
+ digest,
244
+ timeout: 3e4
245
+ })));
246
+ }
242
247
  this.refresh();
243
248
  } catch (error) {
244
249
  this._fundError = error instanceof Error ? error.message : "Faucet request failed. Try again.";
@@ -284,7 +289,6 @@ let DevWalletBalances = class DevWalletBalances extends LitElement {
284
289
  </div>` : nothing}
285
290
  <div class="coins-header">
286
291
  <h3 class="section-header">Coins · ${this._balances.length}</h3>
287
- <button class="manage-btn" disabled>Manage</button>
288
292
  </div>
289
293
  ${this._loading ? html`<div class="loading" part="loading" aria-live="polite">Loading...</div>` : this._error ? html`<div class="error-state" part="error-message" aria-live="polite">
290
294
  ${this._error}
@@ -292,8 +296,11 @@ let DevWalletBalances = class DevWalletBalances extends LitElement {
292
296
  <div class="empty-title">No balances on ${networkLabel}</div>
293
297
  <div class="empty-copy">
294
298
  ${this.faucetHost ? html`Use the Faucet button above to fund ${formatAddress(this.address)} on
295
- ${networkLabel}, then refresh.` : html`Fund ${formatAddress(this.address)} from your local faucet or devstack
296
- seed, then refresh balances here.`}
299
+ ${networkLabel}, then refresh.` : this.network === "testnet" ? html`Get testnet SUI for ${formatAddress(this.address)} at
300
+ <a href="https://faucet.sui.io" target="_blank" rel="noopener noreferrer"
301
+ >faucet.sui.io</a
302
+ >, then refresh.` : html`Fund ${formatAddress(this.address)} from your local faucet or devstack
303
+ seed, then refresh balances here.`}
297
304
  </div>
298
305
  </div>` : html`
299
306
  <div class="balance-list" part="balance-list">
@@ -1 +1 @@
1
- {"version":3,"file":"dev-wallet-balances.mjs","names":["#fetchBalances","#requestFromFaucet","#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 { requestSuiFromFaucetV2 } from '@mysten/sui/faucet';\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-actions {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 6px;\n\t\t\t\tflex-shrink: 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/** Faucet endpoint for the active network (the wallet's `activeFaucet`),\n\t * or `null` when the active network has no faucet (live mainnet, fork\n\t * stacks). When set, a \"Request from faucet\" button funds the active\n\t * address against this endpoint and refreshes balances. */\n\t@property({ attribute: false })\n\tfaucetHost: string | null = null;\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@state()\n\tprivate _funding = false;\n\n\t@state()\n\tprivate _fundError: 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\t/** Request SUI from the active network's faucet for the active address,\n\t * then refresh balances. No-op when no `faucetHost` is configured (live\n\t * mainnet / fork stacks have none). */\n\tasync #requestFromFaucet() {\n\t\tif (!this.faucetHost || !this.address || this._funding) return;\n\t\tthis._funding = true;\n\t\tthis._fundError = null;\n\t\ttry {\n\t\t\tawait requestSuiFromFaucetV2({ host: this.faucetHost, recipient: this.address });\n\t\t\tthis.refresh();\n\t\t} catch (error) {\n\t\t\tthis._fundError =\n\t\t\t\terror instanceof Error ? error.message : 'Faucet request failed. Try again.';\n\t\t} finally {\n\t\t\tthis._funding = false;\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<div class=\"hero-actions\">\n\t\t\t\t\t${this.faucetHost\n\t\t\t\t\t\t? html`<button\n\t\t\t\t\t\t\t\tclass=\"action-btn\"\n\t\t\t\t\t\t\t\tpart=\"faucet-button\"\n\t\t\t\t\t\t\t\t?disabled=${this._funding}\n\t\t\t\t\t\t\t\t@click=${this.#requestFromFaucet}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t${this._funding ? 'Funding...' : 'Faucet'}\n\t\t\t\t\t\t\t</button>`\n\t\t\t\t\t\t: nothing}\n\t\t\t\t\t<button class=\"action-btn\" @click=${this.refresh}>Refresh</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t${this._fundError\n\t\t\t\t? html`<div class=\"error-state\" part=\"faucet-error-message\" aria-live=\"polite\">\n\t\t\t\t\t\t${this._fundError}\n\t\t\t\t\t</div>`\n\t\t\t\t: nothing}\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\t${this.faucetHost\n\t\t\t\t\t\t\t\t\t\t? html`Use the Faucet button above to fund ${formatAddress(this.address)} on\n\t\t\t\t\t\t\t\t\t\t\t${networkLabel}, then refresh.`\n\t\t\t\t\t\t\t\t\t\t: html`Fund ${formatAddress(this.address)} from your local faucet or devstack\n\t\t\t\t\t\t\t\t\t\t\tseed, then refresh 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":"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"}
1
+ {"version":3,"file":"dev-wallet-balances.mjs","names":["#fetchBalances","#requestFromFaucet","#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 { requestSuiFromFaucetV2 } from '@mysten/sui/faucet';\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.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.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.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-actions {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 6px;\n\t\t\t\tflex-shrink: 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 a {\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/** Faucet endpoint for the active network (the wallet's `activeFaucet`),\n\t * or `null` when the active network has no faucet (live mainnet, fork\n\t * stacks). When set, a \"Request from faucet\" button funds the active\n\t * address against this endpoint and refreshes balances. */\n\t@property({ attribute: false })\n\tfaucetHost: string | null = null;\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@state()\n\tprivate _funding = false;\n\n\t@state()\n\tprivate _fundError: 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\t/** Request SUI from the active network's faucet for the active address,\n\t * wait for the faucet's transfers to land, then refresh balances. No-op\n\t * when no `faucetHost` is configured (live mainnet / fork stacks have none). */\n\tasync #requestFromFaucet() {\n\t\tif (!this.faucetHost || !this.address || this._funding) return;\n\t\tthis._funding = true;\n\t\tthis._fundError = null;\n\t\ttry {\n\t\t\tconst result = await requestSuiFromFaucetV2({\n\t\t\t\thost: this.faucetHost,\n\t\t\t\trecipient: this.address,\n\t\t\t});\n\t\t\tconst client = this.client;\n\t\t\tif (client) {\n\t\t\t\tconst digests = new Set(result.coins_sent?.map((c) => c.transferTxDigest) ?? []);\n\t\t\t\t// Best effort: the funds were sent even if waiting times out.\n\t\t\t\tawait Promise.allSettled(\n\t\t\t\t\t[...digests].map((digest) => client.core.waitForTransaction({ digest, timeout: 30_000 })),\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.refresh();\n\t\t} catch (error) {\n\t\t\tthis._fundError =\n\t\t\t\terror instanceof Error ? error.message : 'Faucet request failed. Try again.';\n\t\t} finally {\n\t\t\tthis._funding = false;\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<div class=\"hero-actions\">\n\t\t\t\t\t${this.faucetHost\n\t\t\t\t\t\t? html`<button\n\t\t\t\t\t\t\t\tclass=\"action-btn\"\n\t\t\t\t\t\t\t\tpart=\"faucet-button\"\n\t\t\t\t\t\t\t\t?disabled=${this._funding}\n\t\t\t\t\t\t\t\t@click=${this.#requestFromFaucet}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t${this._funding ? 'Funding...' : 'Faucet'}\n\t\t\t\t\t\t\t</button>`\n\t\t\t\t\t\t: nothing}\n\t\t\t\t\t<button class=\"action-btn\" @click=${this.refresh}>Refresh</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t${this._fundError\n\t\t\t\t? html`<div class=\"error-state\" part=\"faucet-error-message\" aria-live=\"polite\">\n\t\t\t\t\t\t${this._fundError}\n\t\t\t\t\t</div>`\n\t\t\t\t: nothing}\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</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\t${this.faucetHost\n\t\t\t\t\t\t\t\t\t\t? html`Use the Faucet button above to fund ${formatAddress(this.address)} on\n\t\t\t\t\t\t\t\t\t\t\t${networkLabel}, then refresh.`\n\t\t\t\t\t\t\t\t\t\t: this.network === 'testnet'\n\t\t\t\t\t\t\t\t\t\t\t? html`Get testnet SUI for ${formatAddress(this.address)} at\n\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"https://faucet.sui.io\" target=\"_blank\" rel=\"noopener noreferrer\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>faucet.sui.io</a\n\t\t\t\t\t\t\t\t\t\t\t\t\t>, then refresh.`\n\t\t\t\t\t\t\t\t\t\t\t: html`Fund ${formatAddress(this.address)} from your local faucet or devstack\n\t\t\t\t\t\t\t\t\t\t\t\tseed, then refresh 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":"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"}
@@ -0,0 +1,29 @@
1
+ import { LitElement } from "lit";
2
+
3
+ //#region src/ui/dev-wallet-connect-guide.d.ts
4
+ /**
5
+ * How to point a dApp at a hosted/standalone dev wallet: a draggable
6
+ * bookmarklet, a console script, and a dApp Kit snippet — all derived from
7
+ * the wallet's `origin`. Rendered beside the standalone wallet on wide
8
+ * screens and at the top of its Settings tab.
9
+ */
10
+ type Platform = 'ios' | 'android' | 'android-firefox' | 'desktop';
11
+ declare class DevWalletConnectGuide extends LitElement {
12
+ #private;
13
+ static styles: import("lit").CSSResult;
14
+ /** Origin the wallet is served from (e.g. `https://sui-dev-wallet.vercel.app`). */
15
+ origin: string;
16
+ private _dragNudge;
17
+ private _tab;
18
+ /** Phones can't drag bookmarklets, so they get copy-and-edit steps instead. */
19
+ platform: Platform;
20
+ render(): import("lit").TemplateResult<1>;
21
+ }
22
+ declare global {
23
+ interface HTMLElementTagNameMap {
24
+ 'dev-wallet-connect-guide': DevWalletConnectGuide;
25
+ }
26
+ }
27
+ //#endregion
28
+ export { DevWalletConnectGuide };
29
+ //# sourceMappingURL=dev-wallet-connect-guide.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-wallet-connect-guide.d.mts","names":[],"sources":["../../src/ui/dev-wallet-connect-guide.ts"],"mappings":";;;;;AAGqD;;;;KAWhD,QAAA;AAAA,cAyBQ,qBAAA,SAA8B,UAAU;EAAA;SACpC,MAAA,gBAAM,SAAA;EAD8B;EAgNpD,MAAA;EAAA,QAGQ,UAAA;EAAA,QAGA,IAAA;EArNc;EAyNtB,QAAA,EAAU,QAAA;EAID,MAAA,kBAAM,cAAA;AAAA;AAAA,QAkKR,MAAA;EAAA,UACG,qBAAA;IACT,0BAAA,EAA4B,qBAAqB;EAAA;AAAA"}