@mysten-incubation/dev-wallet 0.0.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 (213) hide show
  1. package/README.md +250 -0
  2. package/dist/_virtual/_@oxc-project_runtime@0.107.0/helpers/decorate.mjs +10 -0
  3. package/dist/adapters/base-adapter.d.mts +33 -0
  4. package/dist/adapters/base-adapter.d.mts.map +1 -0
  5. package/dist/adapters/base-adapter.mjs +77 -0
  6. package/dist/adapters/base-adapter.mjs.map +1 -0
  7. package/dist/adapters/browser.d.mts +8 -0
  8. package/dist/adapters/browser.mjs +8 -0
  9. package/dist/adapters/build-managed-account.d.mts +12 -0
  10. package/dist/adapters/build-managed-account.d.mts.map +1 -0
  11. package/dist/adapters/build-managed-account.mjs +30 -0
  12. package/dist/adapters/build-managed-account.mjs.map +1 -0
  13. package/dist/adapters/idb-store.mjs +73 -0
  14. package/dist/adapters/idb-store.mjs.map +1 -0
  15. package/dist/adapters/in-memory-adapter.d.mts +16 -0
  16. package/dist/adapters/in-memory-adapter.d.mts.map +1 -0
  17. package/dist/adapters/in-memory-adapter.mjs +44 -0
  18. package/dist/adapters/in-memory-adapter.mjs.map +1 -0
  19. package/dist/adapters/passkey-adapter.d.mts +31 -0
  20. package/dist/adapters/passkey-adapter.d.mts.map +1 -0
  21. package/dist/adapters/passkey-adapter.mjs +87 -0
  22. package/dist/adapters/passkey-adapter.mjs.map +1 -0
  23. package/dist/adapters/remote-cli-adapter.d.mts +65 -0
  24. package/dist/adapters/remote-cli-adapter.d.mts.map +1 -0
  25. package/dist/adapters/remote-cli-adapter.mjs +299 -0
  26. package/dist/adapters/remote-cli-adapter.mjs.map +1 -0
  27. package/dist/adapters/webcrypto-adapter.d.mts +20 -0
  28. package/dist/adapters/webcrypto-adapter.d.mts.map +1 -0
  29. package/dist/adapters/webcrypto-adapter.mjs +68 -0
  30. package/dist/adapters/webcrypto-adapter.mjs.map +1 -0
  31. package/dist/bin/cli.d.mts +1 -0
  32. package/dist/bin/cli.mjs +183 -0
  33. package/dist/bin/cli.mjs.map +1 -0
  34. package/dist/client/dev-wallet-client.d.mts +57 -0
  35. package/dist/client/dev-wallet-client.d.mts.map +1 -0
  36. package/dist/client/dev-wallet-client.mjs +223 -0
  37. package/dist/client/dev-wallet-client.mjs.map +1 -0
  38. package/dist/client/index.d.mts +3 -0
  39. package/dist/client/index.mjs +4 -0
  40. package/dist/client/request-handler.d.mts +42 -0
  41. package/dist/client/request-handler.d.mts.map +1 -0
  42. package/dist/client/request-handler.mjs +115 -0
  43. package/dist/client/request-handler.mjs.map +1 -0
  44. package/dist/index.d.mts +5 -0
  45. package/dist/index.mjs +4 -0
  46. package/dist/react/components.d.mts +32 -0
  47. package/dist/react/components.d.mts.map +1 -0
  48. package/dist/react/components.mjs +53 -0
  49. package/dist/react/components.mjs.map +1 -0
  50. package/dist/react/context.d.mts +22 -0
  51. package/dist/react/context.d.mts.map +1 -0
  52. package/dist/react/context.mjs +25 -0
  53. package/dist/react/context.mjs.map +1 -0
  54. package/dist/react/index.d.mts +4 -0
  55. package/dist/react/index.mjs +5 -0
  56. package/dist/react/useDevWallet.d.mts +38 -0
  57. package/dist/react/useDevWallet.d.mts.map +1 -0
  58. package/dist/react/useDevWallet.mjs +89 -0
  59. package/dist/react/useDevWallet.mjs.map +1 -0
  60. package/dist/server/cli-signing-middleware.d.mts +22 -0
  61. package/dist/server/cli-signing-middleware.d.mts.map +1 -0
  62. package/dist/server/cli-signing-middleware.mjs +117 -0
  63. package/dist/server/cli-signing-middleware.mjs.map +1 -0
  64. package/dist/server/index.d.mts +2 -0
  65. package/dist/server/index.mjs +3 -0
  66. package/dist/standalone/assets/in-memory-adapter-CBF4h2KD.js +1 -0
  67. package/dist/standalone/assets/main-VE4olb-Q.js +2841 -0
  68. package/dist/standalone/assets/webcrypto-adapter-DysAubFb.js +1 -0
  69. package/dist/standalone/bookmarklet.js +5 -0
  70. package/dist/standalone/index.html +48 -0
  71. package/dist/types.d.mts +55 -0
  72. package/dist/types.d.mts.map +1 -0
  73. package/dist/ui/copy-controller.mjs +43 -0
  74. package/dist/ui/copy-controller.mjs.map +1 -0
  75. package/dist/ui/dev-wallet-account-selector.d.mts +24 -0
  76. package/dist/ui/dev-wallet-account-selector.d.mts.map +1 -0
  77. package/dist/ui/dev-wallet-account-selector.mjs +268 -0
  78. package/dist/ui/dev-wallet-account-selector.mjs.map +1 -0
  79. package/dist/ui/dev-wallet-accounts.d.mts +29 -0
  80. package/dist/ui/dev-wallet-accounts.d.mts.map +1 -0
  81. package/dist/ui/dev-wallet-accounts.mjs +524 -0
  82. package/dist/ui/dev-wallet-accounts.mjs.map +1 -0
  83. package/dist/ui/dev-wallet-balances.d.mts +26 -0
  84. package/dist/ui/dev-wallet-balances.d.mts.map +1 -0
  85. package/dist/ui/dev-wallet-balances.mjs +130 -0
  86. package/dist/ui/dev-wallet-balances.mjs.map +1 -0
  87. package/dist/ui/dev-wallet-connect.d.mts +31 -0
  88. package/dist/ui/dev-wallet-connect.d.mts.map +1 -0
  89. package/dist/ui/dev-wallet-connect.mjs +225 -0
  90. package/dist/ui/dev-wallet-connect.mjs.map +1 -0
  91. package/dist/ui/dev-wallet-dropdown.d.mts +27 -0
  92. package/dist/ui/dev-wallet-dropdown.d.mts.map +1 -0
  93. package/dist/ui/dev-wallet-dropdown.mjs +121 -0
  94. package/dist/ui/dev-wallet-dropdown.mjs.map +1 -0
  95. package/dist/ui/dev-wallet-network-badge.d.mts +21 -0
  96. package/dist/ui/dev-wallet-network-badge.d.mts.map +1 -0
  97. package/dist/ui/dev-wallet-network-badge.mjs +121 -0
  98. package/dist/ui/dev-wallet-network-badge.mjs.map +1 -0
  99. package/dist/ui/dev-wallet-new-account.d.mts +31 -0
  100. package/dist/ui/dev-wallet-new-account.d.mts.map +1 -0
  101. package/dist/ui/dev-wallet-new-account.mjs +577 -0
  102. package/dist/ui/dev-wallet-new-account.mjs.map +1 -0
  103. package/dist/ui/dev-wallet-objects.d.mts +26 -0
  104. package/dist/ui/dev-wallet-objects.d.mts.map +1 -0
  105. package/dist/ui/dev-wallet-objects.mjs +276 -0
  106. package/dist/ui/dev-wallet-objects.mjs.map +1 -0
  107. package/dist/ui/dev-wallet-panel.d.mts +22 -0
  108. package/dist/ui/dev-wallet-panel.d.mts.map +1 -0
  109. package/dist/ui/dev-wallet-panel.mjs +192 -0
  110. package/dist/ui/dev-wallet-panel.mjs.map +1 -0
  111. package/dist/ui/dev-wallet-popup.d.mts +36 -0
  112. package/dist/ui/dev-wallet-popup.d.mts.map +1 -0
  113. package/dist/ui/dev-wallet-popup.mjs +137 -0
  114. package/dist/ui/dev-wallet-popup.mjs.map +1 -0
  115. package/dist/ui/dev-wallet-settings.d.mts +33 -0
  116. package/dist/ui/dev-wallet-settings.d.mts.map +1 -0
  117. package/dist/ui/dev-wallet-settings.mjs +635 -0
  118. package/dist/ui/dev-wallet-settings.mjs.map +1 -0
  119. package/dist/ui/dev-wallet-signing-modal.d.mts +32 -0
  120. package/dist/ui/dev-wallet-signing-modal.d.mts.map +1 -0
  121. package/dist/ui/dev-wallet-signing-modal.mjs +115 -0
  122. package/dist/ui/dev-wallet-signing-modal.mjs.map +1 -0
  123. package/dist/ui/dev-wallet-signing.d.mts +25 -0
  124. package/dist/ui/dev-wallet-signing.d.mts.map +1 -0
  125. package/dist/ui/dev-wallet-signing.mjs +544 -0
  126. package/dist/ui/dev-wallet-signing.mjs.map +1 -0
  127. package/dist/ui/dev-wallet-standalone.d.mts +23 -0
  128. package/dist/ui/dev-wallet-standalone.d.mts.map +1 -0
  129. package/dist/ui/dev-wallet-standalone.mjs +129 -0
  130. package/dist/ui/dev-wallet-standalone.mjs.map +1 -0
  131. package/dist/ui/dev-wallet-tab-bar.d.mts +19 -0
  132. package/dist/ui/dev-wallet-tab-bar.d.mts.map +1 -0
  133. package/dist/ui/dev-wallet-tab-bar.mjs +143 -0
  134. package/dist/ui/dev-wallet-tab-bar.mjs.map +1 -0
  135. package/dist/ui/index.d.mts +17 -0
  136. package/dist/ui/index.mjs +18 -0
  137. package/dist/ui/mount.d.mts +11 -0
  138. package/dist/ui/mount.d.mts.map +1 -0
  139. package/dist/ui/mount.mjs +17 -0
  140. package/dist/ui/mount.mjs.map +1 -0
  141. package/dist/ui/styles.mjs +250 -0
  142. package/dist/ui/styles.mjs.map +1 -0
  143. package/dist/ui/transaction-analyzer.mjs +58 -0
  144. package/dist/ui/transaction-analyzer.mjs.map +1 -0
  145. package/dist/ui/utils.mjs +98 -0
  146. package/dist/ui/utils.mjs.map +1 -0
  147. package/dist/ui/wallet-controller.mjs +275 -0
  148. package/dist/ui/wallet-controller.mjs.map +1 -0
  149. package/dist/wallet/constants.mjs +11 -0
  150. package/dist/wallet/constants.mjs.map +1 -0
  151. package/dist/wallet/dev-wallet.d.mts +118 -0
  152. package/dist/wallet/dev-wallet.d.mts.map +1 -0
  153. package/dist/wallet/dev-wallet.mjs +424 -0
  154. package/dist/wallet/dev-wallet.mjs.map +1 -0
  155. package/dist/wallet/initializer.d.mts +63 -0
  156. package/dist/wallet/initializer.d.mts.map +1 -0
  157. package/dist/wallet/initializer.mjs +75 -0
  158. package/dist/wallet/initializer.mjs.map +1 -0
  159. package/dist/wallet/signing.d.mts +35 -0
  160. package/dist/wallet/signing.d.mts.map +1 -0
  161. package/dist/wallet/signing.mjs +69 -0
  162. package/dist/wallet/signing.mjs.map +1 -0
  163. package/package.json +124 -0
  164. package/src/adapters/base-adapter.ts +93 -0
  165. package/src/adapters/browser.ts +15 -0
  166. package/src/adapters/build-managed-account.ts +33 -0
  167. package/src/adapters/idb-store.ts +87 -0
  168. package/src/adapters/in-memory-adapter.ts +51 -0
  169. package/src/adapters/passkey-adapter.ts +120 -0
  170. package/src/adapters/remote-cli-adapter.ts +388 -0
  171. package/src/adapters/webcrypto-adapter.ts +96 -0
  172. package/src/app/bookmarklet-entry.ts +77 -0
  173. package/src/app/index.html +48 -0
  174. package/src/app/main.ts +245 -0
  175. package/src/app/tsconfig.json +3 -0
  176. package/src/bin/cli.ts +214 -0
  177. package/src/client/dev-wallet-client.ts +280 -0
  178. package/src/client/index.ts +7 -0
  179. package/src/client/request-handler.ts +161 -0
  180. package/src/index.ts +19 -0
  181. package/src/react/components.ts +64 -0
  182. package/src/react/context.ts +38 -0
  183. package/src/react/index.ts +16 -0
  184. package/src/react/useDevWallet.ts +118 -0
  185. package/src/server/cli-signing-middleware.ts +146 -0
  186. package/src/server/index.ts +8 -0
  187. package/src/types.ts +58 -0
  188. package/src/ui/copy-controller.ts +49 -0
  189. package/src/ui/dev-wallet-account-selector.ts +283 -0
  190. package/src/ui/dev-wallet-accounts.ts +578 -0
  191. package/src/ui/dev-wallet-balances.ts +171 -0
  192. package/src/ui/dev-wallet-connect.ts +259 -0
  193. package/src/ui/dev-wallet-dropdown.ts +138 -0
  194. package/src/ui/dev-wallet-network-badge.ts +128 -0
  195. package/src/ui/dev-wallet-new-account.ts +662 -0
  196. package/src/ui/dev-wallet-objects.ts +336 -0
  197. package/src/ui/dev-wallet-panel.ts +207 -0
  198. package/src/ui/dev-wallet-popup.ts +169 -0
  199. package/src/ui/dev-wallet-settings.ts +692 -0
  200. package/src/ui/dev-wallet-signing-modal.ts +137 -0
  201. package/src/ui/dev-wallet-signing.ts +624 -0
  202. package/src/ui/dev-wallet-standalone.ts +136 -0
  203. package/src/ui/dev-wallet-tab-bar.ts +151 -0
  204. package/src/ui/index.ts +26 -0
  205. package/src/ui/mount.ts +21 -0
  206. package/src/ui/styles.ts +252 -0
  207. package/src/ui/transaction-analyzer.ts +60 -0
  208. package/src/ui/utils.ts +118 -0
  209. package/src/ui/wallet-controller.ts +340 -0
  210. package/src/wallet/constants.ts +17 -0
  211. package/src/wallet/dev-wallet.ts +597 -0
  212. package/src/wallet/initializer.ts +124 -0
  213. package/src/wallet/signing.ts +85 -0
@@ -0,0 +1 @@
1
+ import{S as g,a as d,p as u,B as m,b as h}from"./main-VE4olb-Q.js";function S(c){const e=new Uint8Array(c),t=e.slice(1,33),r=(e.slice(33,65)[31]&1)===0?2:3,s=new Uint8Array(d.SIZE);return s[0]=r,s.set(t,1),s}var y=class p extends g{#e;static async generate({extractable:e=!1}={}){const 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 p(t.privateKey,S(new Uint8Array(r)))}static import(e){return new p(e.privateKey,e.publicKey)}getKeyScheme(){return"Secp256r1"}constructor(e,t){super(),this.privateKey=e,this.#e=new d(t)}export(){const e={privateKey:this.privateKey,publicKey:this.#e.toRawBytes()};return Object.defineProperty(e,"toJSON",{enumerable:!1,value:()=>{throw new Error("The exported keypair must not be serialized. It must be stored in IndexedDB directly.")}}),e}getPublicKey(){return this.#e}async sign(e){const t=await globalThis.crypto.subtle.sign({name:"ECDSA",hash:"SHA-256"},this.privateKey,e),r=u.Signature.fromBytes(new Uint8Array(t));return(r.hasHighS()?new u.Signature(r.r,u.Point.Fn.neg(r.s)):r).toBytes("compact")}};class A{#e;#t;#r=null;constructor(e,t){this.#e=e,this.#t=t}get(e){return this.#s("readonly",t=>t.get(e))}async set(e,t){await this.#s("readwrite",r=>r.put(t,e))}del(e){return this.#s("readwrite",t=>t.delete(e))}entries(){return this.#n().then(e=>new Promise((t,r)=>{const s=e.transaction(this.#t,"readonly"),o=s.objectStore(this.#t),n=[],a=o.openCursor();a.onsuccess=()=>{const i=a.result;i&&(n.push([i.key,i.value]),i.continue())},s.oncomplete=()=>t(n),s.onerror=()=>r(s.error)}))}#n(){return this.#r||(this.#r=new Promise((e,t)=>{const r=indexedDB.open(this.#e);r.onupgradeneeded=()=>{r.result.objectStoreNames.contains(this.#t)||r.result.createObjectStore(this.#t)},r.onsuccess=()=>e(r.result),r.onerror=()=>{this.#r=null,t(r.error)}})),this.#r}#s(e,t){return this.#n().then(r=>new Promise((s,o)=>{const n=r.transaction(this.#t,e),a=t(n.objectStore(this.#t));n.oncomplete=()=>s(a.result),n.onerror=()=>o(n.error),n.onabort=()=>o(n.error)}))}}const f="dev-wallet-webcrypto",K="accounts",l="__account_meta__";class x extends m{constructor(e){super(),this.id="webcrypto",this.name="WebCrypto Signer",this.#e=new A(e?.dbName??f,e?.storeName??K)}#e;async initialize(){const e=await this.#e.entries(),t=await this.#e.get(l)??[],r=[];for(const[s,o]of e){if(s===l)continue;const n=s;try{const a=o,i=y.import(a),b=t.find(w=>w.address===n);r.push(h(i,n,b?.label??"Account"))}catch(a){console.warn(`[dev-wallet] Failed to load account ${n}, skipping:`,a)}}this.setInitialAccounts(r)}async createAccount(e){const t=await y.generate(),r=t.getPublicKey().toSuiAddress(),s=e?.label??this.getDefaultLabel(),o=h(t,r,s);return await this.#e.set(r,t.export()),this.addAccount(o),await this.#t(),o}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(){const e=this.getAccounts().map(t=>({address:t.address,label:t.label}));await this.#e.set(l,e)}}export{x as WebCryptoSignerAdapter};
@@ -0,0 +1,5 @@
1
+ (function(){"use strict";function q(t){return Uint8Array.from(atob(t),e=>e.charCodeAt(0))}const M=8192;function $(t){if(t.length<M)return btoa(String.fromCharCode(...t));let e="";for(var n=0;n<t.length;n+=M){const s=t.slice(n,n+M);e+=String.fromCharCode(...s)}return btoa(e)}function ee(){let t,e;return{promise:new Promise((n,s)=>{t=n,e=s}),resolve:t,reject:e}}function te(t){return t=t||new Map,{all:t,on(e,n){const s=t.get(e);s?s.push(n):t.set(e,[n])},off(e,n){const s=t.get(e);s&&(n?s.splice(s.indexOf(n)>>>0,1):t.set(e,[]))},emit(e,n){let s=t.get(e);s&&s.slice().map(r=>{r(n)}),s=t.get("*"),s&&s.slice().map(r=>{r(e,n)})}}}let x;function k(t){return{lang:t?.lang??x?.lang,message:t?.message,abortEarly:t?.abortEarly??x?.abortEarly,abortPipeEarly:t?.abortPipeEarly??x?.abortPipeEarly}}let ne;function se(t){return ne?.get(t)}let re;function ie(t){return re?.get(t)}let ae;function oe(t,e){return ae?.get(t)?.get(e)}function B(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 f(t,e,n,s,r){const i=r&&"input"in r?r.input:n.value,a=r?.expected??t.expects??null,l=r?.received??B(i),o={kind:t.kind,type:t.type,input:i,expected:a,received:l,message:`Invalid ${e}: ${a?`Expected ${a} but r`:"R"}eceived ${l}`,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??oe(t.reference,o.lang)??(u?ie(o.lang):null)??s.message??se(o.lang);d!==void 0&&(o.message=typeof d=="function"?d(o):d),u&&(n.typed=!1),n.issues?n.issues.push(o):n.issues=[o]}function y(t){return{version:1,vendor:"valibot",validate(e){return t["~run"]({value:e},k())}}}function ce(t,e){const n=[...new Set(t)];return n.length>1?`(${n.join(` ${e} `)})`:n[0]??"never"}var le=class extends Error{constructor(t){super(t[0].message),this.name="ValiError",this.issues=t}};const ue=/^[\da-f]{8}(?:-[\da-f]{4}){3}-[\da-f]{12}$/iu;function H(t){return{kind:"validation",type:"uuid",reference:H,async:!1,expects:null,requirement:ue,message:t,"~run"(e,n){return e.typed&&!this.requirement.test(e.value)&&f(this,"UUID",e,n),e}}}function de(t,e,n){return typeof t.fallback=="function"?t.fallback(e,n):t.fallback}function F(t,e,n){return typeof t.default=="function"?t.default(e,n):t.default}function z(t,e){return{kind:"schema",type:"array",reference:z,expects:"Array",async:!1,item:t,message:e,get"~standard"(){return y(this)},"~run"(n,s){const r=n.value;if(Array.isArray(r)){n.typed=!0,n.value=[];for(let i=0;i<r.length;i++){const a=r[i],l=this.item["~run"]({value:a},s);if(l.issues){const o={type:"array",origin:"value",input:r,key:i,value:a};for(const u of l.issues)u.path?u.path.unshift(o):u.path=[o],n.issues?.push(u);if(n.issues||(n.issues=l.issues),s.abortEarly){n.typed=!1;break}}l.typed||(n.typed=!1),n.value.push(l.value)}}else f(this,"type",n,s);return n}}}function g(t,e){return{kind:"schema",type:"literal",reference:g,expects:B(t),async:!1,literal:t,message:e,get"~standard"(){return y(this)},"~run"(n,s){return n.value===this.literal?n.typed=!0:f(this,"type",n,s),n}}}function Z(t){return{kind:"schema",type:"number",reference:Z,expects:"number",async:!1,message:t,get"~standard"(){return y(this)},"~run"(e,n){return typeof e.value=="number"&&!isNaN(e.value)?e.typed=!0:f(this,"type",e,n),e}}}function h(t,e){return{kind:"schema",type:"object",reference:h,expects:"Object",async:!1,entries:t,message:e,get"~standard"(){return y(this)},"~run"(n,s){const r=n.value;if(r&&typeof r=="object"){n.typed=!0,n.value={};for(const i in this.entries){const a=this.entries[i];if(i in r||(a.type==="exact_optional"||a.type==="optional"||a.type==="nullish")&&a.default!==void 0){const l=i in r?r[i]:F(a),o=a["~run"]({value:l},s);if(o.issues){const u={type:"object",origin:"value",input:r,key:i,value:l};for(const d of o.issues)d.path?d.path.unshift(u):d.path=[u],n.issues?.push(d);if(n.issues||(n.issues=o.issues),s.abortEarly){n.typed=!1;break}}o.typed||(n.typed=!1),n.value[i]=o.value}else if(a.fallback!==void 0)n.value[i]=de(a);else if(a.type!=="exact_optional"&&a.type!=="optional"&&a.type!=="nullish"&&(f(this,"key",n,s,{input:void 0,expected:`"${i}"`,path:[{type:"object",origin:"key",input:r,key:i,value:r[i]}]}),s.abortEarly))break}}else f(this,"type",n,s);return n}}}function G(t,e){return{kind:"schema",type:"optional",reference:G,expects:`(${t.expects} | undefined)`,async:!1,wrapped:t,default:e,get"~standard"(){return y(this)},"~run"(n,s){return n.value===void 0&&(this.default!==void 0&&(n.value=F(this,n,s)),n.value===void 0)?(n.typed=!0,n):this.wrapped["~run"](n,s)}}}function c(t){return{kind:"schema",type:"string",reference:c,expects:"string",async:!1,message:t,get"~standard"(){return y(this)},"~run"(e,n){return typeof e.value=="string"?e.typed=!0:f(this,"type",e,n),e}}}function L(t,e,n){return{kind:"schema",type:"variant",reference:L,expects:"Object",async:!1,key:t,options:e,message:n,get"~standard"(){return y(this)},"~run"(s,r){const i=s.value;if(i&&typeof i=="object"){let a,l=0,o=this.key,u=[];const d=(Le,Q)=>{for(const v of Le.options){if(v.type==="variant")d(v,new Set(Q).add(v.key));else{let K=!0,W=0;for(const p of Q){const R=v.entries[p];if(p in i?R["~run"]({typed:!1,value:i[p]},{abortEarly:!0}).issues:R.type!=="exact_optional"&&R.type!=="optional"&&R.type!=="nullish"){K=!1,o!==p&&(l<W||l===W&&p in i&&!(o in i))&&(l=W,o=p,u=[]),o===p&&u.push(v.entries[p].expects);break}W++}if(K){const p=v["~run"]({value:i},r);(!a||!a.typed&&p.typed)&&(a=p)}}if(a&&!a.issues)break}};if(d(this,new Set([this.key])),a)return a;f(this,"type",s,r,{input:i[o],expected:ce(u,"|"),path:[{type:"object",origin:"value",input:i,key:o,value:i[o]}]})}else f(this,"type",s,r);return s}}}function he(t,e,n){const s=t["~run"]({value:e},k(n));if(s.issues)throw new le(s.issues);return s.value}function pe(...t){return{...t[0],pipe:t,get"~standard"(){return y(this)},"~run"(e,n){for(const s of t)if(s.kind!=="metadata"){if(e.issues&&(s.kind==="schema"||s.kind==="transformation")){e.typed=!1;break}(!e.issues||!n.abortEarly&&!n.abortPipeEarly)&&(e=s["~run"](e,n))}return e}}}function fe(t,e,n){const s=t["~run"]({value:e},k(n));return{typed:s.typed,success:!s.issues,output:s.value,issues:s.issues}}var ge=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)},ye=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},A;let E;const S=new Set;function Ie(t){C=void 0,S.add(t)}function we(t){C=void 0,S.delete(t)}const w={};function me(){if(E||(E=Object.freeze({register:Y,get:be,on:ve}),typeof window>"u"))return E;const t=Object.freeze({register:Y});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 Ee(t))}catch(e){console.error(`wallet-standard:app-ready event could not be dispatched
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
+ `,n)}try{window.addEventListener("wallet-standard:app-ready",({detail:n})=>e(n))}catch(n){console.error(`wallet-standard:app-ready event listener could not be added
5
+ `,n)}}(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,n=new U({origin:e});Ge(n),console.log(`[Dev Wallet] Registered (origin: ${e})`)})()})();
@@ -0,0 +1,48 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Dev Wallet</title>
7
+ <style>
8
+ * {
9
+ margin: 0;
10
+ padding: 0;
11
+ box-sizing: border-box;
12
+ }
13
+ body {
14
+ font-family:
15
+ ui-sans-serif,
16
+ system-ui,
17
+ -apple-system,
18
+ BlinkMacSystemFont,
19
+ 'Segoe UI',
20
+ Roboto,
21
+ 'Helvetica Neue',
22
+ Arial,
23
+ sans-serif;
24
+ background: oklch(0.175 0.028 283);
25
+ color: oklch(0.91 0 0);
26
+ min-height: 100vh;
27
+ }
28
+ #app {
29
+ display: flex;
30
+ flex-direction: column;
31
+ align-items: center;
32
+ justify-content: center;
33
+ min-height: 100vh;
34
+ padding: 20px;
35
+ }
36
+ .loading {
37
+ color: oklch(0.62 0.04 280);
38
+ font-size: 14px;
39
+ }
40
+ </style>
41
+ <script type="module" crossorigin src="/assets/main-VE4olb-Q.js"></script>
42
+ </head>
43
+ <body>
44
+ <div id="app">
45
+ <p class="loading">Loading wallet...</p>
46
+ </div>
47
+ </body>
48
+ </html>
@@ -0,0 +1,55 @@
1
+ import { ReadonlyWalletAccount } from "@mysten/wallet-standard";
2
+ import { Signer } from "@mysten/sui/cryptography";
3
+
4
+ //#region src/types.d.ts
5
+ interface ManagedAccount {
6
+ address: string;
7
+ label: string;
8
+ signer: Signer;
9
+ walletAccount: ReadonlyWalletAccount;
10
+ }
11
+ interface CreateAccountOptions {
12
+ label?: string;
13
+ [key: string]: unknown;
14
+ }
15
+ interface ImportAccountOptions {
16
+ /** Keypair to import — used by adapters that accept raw keypairs. */
17
+ signer?: Signer;
18
+ /** Address to import — used by adapters that look up keys from an external source (e.g. CLI keystore). */
19
+ address?: string;
20
+ label?: string;
21
+ }
22
+ /**
23
+ * Pluggable interface for managing accounts and providing signers to a {@link DevWallet}.
24
+ * Implementations handle key generation, storage, and lifecycle.
25
+ */
26
+ interface SignerAdapter {
27
+ readonly id: string;
28
+ readonly name: string;
29
+ /**
30
+ * Whether accounts from this adapter are eligible for auto-signing.
31
+ * Defaults to `true`. CLI-based adapters set this to `false` to ensure
32
+ * transactions always require explicit user approval.
33
+ */
34
+ readonly allowAutoSign?: boolean;
35
+ /** Load keys from storage. Must be called before use. */
36
+ initialize(): Promise<void>;
37
+ getAccounts(): ManagedAccount[];
38
+ getAccount(address: string): ManagedAccount | undefined;
39
+ createAccount?(options?: CreateAccountOptions): Promise<ManagedAccount>;
40
+ importAccount?(options: ImportAccountOptions): Promise<ManagedAccount>;
41
+ /** List accounts available for import (e.g. from a CLI keystore). */
42
+ listAvailableAccounts?(): Promise<Array<{
43
+ address: string;
44
+ scheme: string;
45
+ alias?: string | null;
46
+ }>>;
47
+ removeAccount?(address: string): Promise<boolean>;
48
+ renameAccount?(address: string, label: string): Promise<boolean>;
49
+ /** Subscribe to account list changes. Returns an unsubscribe function. */
50
+ onAccountsChanged(callback: (accounts: ManagedAccount[]) => void): () => void;
51
+ destroy(): void;
52
+ }
53
+ //#endregion
54
+ export { CreateAccountOptions, ImportAccountOptions, ManagedAccount, SignerAdapter };
55
+ //# sourceMappingURL=types.d.mts.map
@@ -0,0 +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,qBAAA;AAAA;AAAA,UAGC,oBAAA;EAChB,KAAA;EAAA,CACC,GAAA;AAAA;AAAA,UAGe,oBAAA;EARD;EAUf,MAAA,GAAS,MAAA;EAV2B;EAYpC,OAAA;EACA,KAAA;AAAA;;;AALD;;UAYiB,aAAA;EAAA,SACP,EAAA;EAAA,SACA,IAAA;EAZA;;;;;EAAA,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"}
@@ -0,0 +1,43 @@
1
+ import { copyToClipboard } from "./utils.mjs";
2
+
3
+ //#region src/ui/copy-controller.ts
4
+ var CopyController = class {
5
+ #timeout = null;
6
+ #duration;
7
+ constructor(host, duration = 1500) {
8
+ this.copied = false;
9
+ this.copiedValue = null;
10
+ this.#duration = duration;
11
+ this.host = host;
12
+ host.addController(this);
13
+ }
14
+ hostConnected() {}
15
+ hostDisconnected() {
16
+ if (this.#timeout) {
17
+ clearTimeout(this.#timeout);
18
+ this.#timeout = null;
19
+ }
20
+ }
21
+ async copy(text) {
22
+ const ok = await copyToClipboard(text);
23
+ if (ok) {
24
+ this.copied = true;
25
+ this.copiedValue = text;
26
+ if (this.#timeout) clearTimeout(this.#timeout);
27
+ this.#timeout = setTimeout(() => {
28
+ this.copied = false;
29
+ this.copiedValue = null;
30
+ this.host.requestUpdate();
31
+ }, this.#duration);
32
+ this.host.requestUpdate();
33
+ }
34
+ return ok;
35
+ }
36
+ isCopied(text) {
37
+ return this.copied && this.copiedValue === text;
38
+ }
39
+ };
40
+
41
+ //#endregion
42
+ export { CopyController };
43
+ //# sourceMappingURL=copy-controller.mjs.map
@@ -0,0 +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,WAAiD;CACjD;CAEA,YAAY,MAA8B,WAAW,MAAM;gBALlD;qBACoB;AAK5B,QAAKA,WAAY;AACjB,OAAK,OAAO;AACZ,OAAK,cAAc,KAAK;;CAGzB,gBAAsB;CAEtB,mBAAyB;AACxB,MAAI,MAAKC,SAAU;AAClB,gBAAa,MAAKA,QAAS;AAC3B,SAAKA,UAAW;;;CAIlB,MAAM,KAAK,MAAgC;EAC1C,MAAM,KAAK,MAAM,gBAAgB,KAAK;AACtC,MAAI,IAAI;AACP,QAAK,SAAS;AACd,QAAK,cAAc;AACnB,OAAI,MAAKA,QAAU,cAAa,MAAKA,QAAS;AAC9C,SAAKA,UAAW,iBAAiB;AAChC,SAAK,SAAS;AACd,SAAK,cAAc;AACnB,SAAK,KAAK,eAAe;MACvB,MAAKD,SAAU;AAClB,QAAK,KAAK,eAAe;;AAE1B,SAAO;;CAGR,SAAS,MAAuB;AAC/B,SAAO,KAAK,UAAU,KAAK,gBAAgB"}
@@ -0,0 +1,24 @@
1
+ import { SignerAdapter } from "../types.mjs";
2
+ import "./dev-wallet-dropdown.mjs";
3
+ import { ReadonlyWalletAccount } from "@mysten/wallet-standard";
4
+ import * as lit38 from "lit";
5
+ import { LitElement } from "lit";
6
+
7
+ //#region src/ui/dev-wallet-account-selector.d.ts
8
+ declare class DevWalletAccountSelector extends LitElement {
9
+ #private;
10
+ static styles: (lit38.CSSResult | lit38.CSSResult[])[];
11
+ accounts: ReadonlyWalletAccount[];
12
+ adapters: SignerAdapter[];
13
+ activeAddress: string;
14
+ private _open;
15
+ render(): lit38.TemplateResult<1>;
16
+ }
17
+ declare global {
18
+ interface HTMLElementTagNameMap {
19
+ 'dev-wallet-account-selector': DevWalletAccountSelector;
20
+ }
21
+ } //# sourceMappingURL=dev-wallet-account-selector.d.ts.map
22
+ //#endregion
23
+ export { DevWalletAccountSelector };
24
+ //# sourceMappingURL=dev-wallet-account-selector.d.mts.map
@@ -0,0 +1 @@
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,GADqB,KAAA,CACf,SAAA,GAAA,KAAA,CAAA,SAAA;EAiJtB,QAAA,EAAU,qBAAA;EAGV,QAAA,EAAU,aAAA;EAGV,aAAA;EAAA,QAGQ,KAAA;EAIC,MAAA,CAAA,GAVc,KAAA,CAUR,cAAA;AAAA;AAAA,QAiGR,MAAA;EAAA,UACG,qBAAA;IACT,6BAAA,EAA+B,wBAAA;EAAA;AAAA"}
@@ -0,0 +1,268 @@
1
+ import { dropdownItemStyles, sharedStyles } from "./styles.mjs";
2
+ import { emitEvent, findAdapterForAddress, formatAddress } from "./utils.mjs";
3
+ import { CopyController } from "./copy-controller.mjs";
4
+ import { __decorate } from "../_virtual/_@oxc-project_runtime@0.107.0/helpers/decorate.mjs";
5
+ import "./dev-wallet-dropdown.mjs";
6
+ import { LitElement, css, html, nothing } from "lit";
7
+ import { customElement, property, state } from "lit/decorators.js";
8
+
9
+ //#region src/ui/dev-wallet-account-selector.ts
10
+ /** Short display names for adapter badges. */
11
+ const ADAPTER_SHORT_NAMES = {
12
+ "WebCrypto Signer": "WebCrypto",
13
+ "Remote CLI Signer": "CLI",
14
+ "In-Memory Signer": "Memory",
15
+ "Passkey Signer": "Passkey"
16
+ };
17
+ let DevWalletAccountSelector = class DevWalletAccountSelector$1 extends LitElement {
18
+ constructor(..._args) {
19
+ super(..._args);
20
+ this.accounts = [];
21
+ this.adapters = [];
22
+ this.activeAddress = "";
23
+ this._open = false;
24
+ }
25
+ static {
26
+ this.styles = [
27
+ sharedStyles,
28
+ dropdownItemStyles,
29
+ css`
30
+ :host {
31
+ display: block;
32
+ }
33
+
34
+ .active-account {
35
+ display: flex;
36
+ align-items: center;
37
+ gap: 8px;
38
+ width: 100%;
39
+ padding: 8px 10px;
40
+ border-radius: var(--dev-wallet-radius-md);
41
+ background: var(--dev-wallet-secondary);
42
+ cursor: pointer;
43
+ transition: background 0.15s;
44
+ }
45
+
46
+ .active-account:hover {
47
+ background: var(--dev-wallet-border);
48
+ }
49
+
50
+ .avatar {
51
+ width: 28px;
52
+ height: 28px;
53
+ border-radius: 50%;
54
+ display: flex;
55
+ align-items: center;
56
+ justify-content: center;
57
+ font-size: 12px;
58
+ font-weight: var(--dev-wallet-font-weight-semibold);
59
+ color: var(--dev-wallet-primary-foreground);
60
+ background: var(--dev-wallet-primary);
61
+ flex-shrink: 0;
62
+ }
63
+
64
+ .account-info {
65
+ flex: 1;
66
+ min-width: 0;
67
+ }
68
+
69
+ .account-label {
70
+ font-size: 13px;
71
+ font-weight: var(--dev-wallet-font-weight-semibold);
72
+ color: var(--dev-wallet-foreground);
73
+ white-space: nowrap;
74
+ overflow: hidden;
75
+ text-overflow: ellipsis;
76
+ }
77
+
78
+ .account-address {
79
+ font-size: 11px;
80
+ font-family: var(--dev-wallet-font-mono);
81
+ color: var(--dev-wallet-muted-foreground);
82
+ }
83
+
84
+ .copy-btn {
85
+ width: 22px;
86
+ height: 22px;
87
+ display: flex;
88
+ align-items: center;
89
+ justify-content: center;
90
+ border-radius: var(--dev-wallet-radius-xs);
91
+ color: var(--dev-wallet-muted-foreground);
92
+ flex-shrink: 0;
93
+ font-size: 12px;
94
+ }
95
+
96
+ .copy-btn:hover {
97
+ background: var(--dev-wallet-border);
98
+ color: var(--dev-wallet-foreground);
99
+ }
100
+
101
+ .copy-btn.copied {
102
+ color: var(--dev-wallet-positive);
103
+ }
104
+
105
+ .chevron {
106
+ width: 14px;
107
+ height: 14px;
108
+ color: var(--dev-wallet-muted-foreground);
109
+ flex-shrink: 0;
110
+ }
111
+
112
+ .dropdown-item[aria-selected='true'] {
113
+ background: color-mix(in oklab, var(--dev-wallet-primary) 10%, transparent);
114
+ }
115
+
116
+ .dropdown-item .avatar {
117
+ width: 24px;
118
+ height: 24px;
119
+ font-size: 10px;
120
+ }
121
+
122
+ .dropdown-item .account-label {
123
+ font-size: 12px;
124
+ }
125
+
126
+ .dropdown-item .account-address {
127
+ font-size: 10px;
128
+ }
129
+
130
+ .dropdown-item .account-info {
131
+ min-width: 0;
132
+ }
133
+
134
+ .dropdown-item .account-label {
135
+ overflow: hidden;
136
+ text-overflow: ellipsis;
137
+ white-space: nowrap;
138
+ }
139
+
140
+ .adapter-badge {
141
+ font-size: 9px;
142
+ padding: 1px 4px;
143
+ border-radius: var(--dev-wallet-radius-2xs);
144
+ background: var(--dev-wallet-secondary);
145
+ color: var(--dev-wallet-muted-foreground);
146
+ white-space: nowrap;
147
+ }
148
+
149
+ .selector-row {
150
+ display: flex;
151
+ gap: 4px;
152
+ align-items: center;
153
+ }
154
+
155
+ .selector-wrapper {
156
+ flex: 1;
157
+ min-width: 0;
158
+ --dropdown-max-height: 240px;
159
+ }
160
+
161
+ .empty-state {
162
+ padding: 16px;
163
+ text-align: center;
164
+ font-size: 12px;
165
+ color: var(--dev-wallet-muted-foreground);
166
+ }
167
+ `
168
+ ];
169
+ }
170
+ #copy = new CopyController(this);
171
+ render() {
172
+ const active = this.accounts.find((a) => a.address === this.activeAddress);
173
+ if (!active) {
174
+ return html`<div class="empty-state" part="empty-state">No account selected</div>`;
175
+ }
176
+ const label = this.#getLabel(active);
177
+ const initial = (label[0] ?? "?").toUpperCase();
178
+ return html`
179
+ <div class="selector-row">
180
+ <dev-wallet-dropdown
181
+ full-width
182
+ class="selector-wrapper"
183
+ .open=${this._open}
184
+ @close=${() => this._open = false}
185
+ >
186
+ <button
187
+ slot="trigger"
188
+ class="active-account"
189
+ part="trigger"
190
+ aria-expanded=${this._open}
191
+ aria-haspopup="listbox"
192
+ @click=${() => this._open = !this._open}
193
+ >
194
+ <span class="avatar">${initial}</span>
195
+ <div class="account-info">
196
+ <div class="account-label">${label}</div>
197
+ <div class="account-address">${formatAddress(active.address)}</div>
198
+ </div>
199
+ <svg
200
+ class="chevron"
201
+ viewBox="0 0 24 24"
202
+ fill="none"
203
+ stroke="currentColor"
204
+ stroke-width="2.5"
205
+ >
206
+ <path d="M6 9l6 6 6-6" />
207
+ </svg>
208
+ </button>
209
+ <div slot="popover" role="listbox" aria-label="Select account">
210
+ ${this.accounts.map((account) => {
211
+ const accountLabel = this.#getLabel(account);
212
+ const accountInitial = (accountLabel[0] ?? "?").toUpperCase();
213
+ const adapterName = this.#getAdapterName(account.address);
214
+ return html`
215
+ <button
216
+ class="dropdown-item"
217
+ role="option"
218
+ aria-selected=${account.address === this.activeAddress}
219
+ @click=${() => this.#select(account)}
220
+ >
221
+ <span class="avatar">${accountInitial}</span>
222
+ <div class="account-info">
223
+ <div class="account-label">${accountLabel}</div>
224
+ <div class="account-address">${formatAddress(account.address)}</div>
225
+ </div>
226
+ ${adapterName ? html`<span class="adapter-badge">${adapterName}</span>` : nothing}
227
+ </button>
228
+ `;
229
+ })}
230
+ </div>
231
+ </dev-wallet-dropdown>
232
+ <button
233
+ class="copy-btn ${this.#copy.isCopied(active.address) ? "copied" : ""}"
234
+ part="copy-button"
235
+ title="Copy address"
236
+ aria-label="Copy address"
237
+ @click=${(e) => {
238
+ e.stopPropagation();
239
+ this.#copy.copy(active.address);
240
+ }}
241
+ >
242
+ ${this.#copy.isCopied(active.address) ? "✓" : "⎘"}
243
+ </button>
244
+ </div>
245
+ `;
246
+ }
247
+ #getLabel(account) {
248
+ return account.label ?? `Account ${account.address.slice(0, 8)}`;
249
+ }
250
+ #getAdapterName(address) {
251
+ const adapter = findAdapterForAddress(this.adapters, address);
252
+ if (!adapter) return null;
253
+ return ADAPTER_SHORT_NAMES[adapter.name] ?? adapter.name;
254
+ }
255
+ #select(account) {
256
+ this._open = false;
257
+ emitEvent(this, "account-selected", { account });
258
+ }
259
+ };
260
+ __decorate([property({ attribute: false })], DevWalletAccountSelector.prototype, "accounts", void 0);
261
+ __decorate([property({ attribute: false })], DevWalletAccountSelector.prototype, "adapters", void 0);
262
+ __decorate([property({ type: String })], DevWalletAccountSelector.prototype, "activeAddress", void 0);
263
+ __decorate([state()], DevWalletAccountSelector.prototype, "_open", void 0);
264
+ DevWalletAccountSelector = __decorate([customElement("dev-wallet-account-selector")], DevWalletAccountSelector);
265
+
266
+ //#endregion
267
+ export { DevWalletAccountSelector };
268
+ //# sourceMappingURL=dev-wallet-account-selector.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-wallet-account-selector.mjs","names":["DevWalletAccountSelector","#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: 8px;\n\t\t\t\twidth: 100%;\n\t\t\t\tpadding: 8px 10px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-md);\n\t\t\t\tbackground: var(--dev-wallet-secondary);\n\t\t\t\tcursor: pointer;\n\t\t\t\ttransition: background 0.15s;\n\t\t\t}\n\n\t\t\t.active-account:hover {\n\t\t\t\tbackground: var(--dev-wallet-border);\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-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-muted-foreground);\n\t\t\t}\n\n\t\t\t.copy-btn {\n\t\t\t\twidth: 22px;\n\t\t\t\theight: 22px;\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-xs);\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-border);\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: color-mix(in oklab, var(--dev-wallet-primary) 10%, transparent);\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\tfont-size: 9px;\n\t\t\t\tpadding: 1px 4px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-2xs);\n\t\t\t\tbackground: var(--dev-wallet-secondary);\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\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\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\">${label}</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,qCAAMA,mCAAiC,WAAW;;;kBAkJpB,EAAE;kBAGV,EAAE;uBAGd;eAGA;;;gBA1JS;GACxB;GACA;GACA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2IH;;CAcD,QAAQ,IAAI,eAAe,KAAK;CAEhC,AAAS,SAAS;EACjB,MAAM,SAAS,KAAK,SAAS,MAAM,MAAM,EAAE,YAAY,KAAK,cAAc;AAE1E,MAAI,CAAC,QAAQ;AACZ,UAAO,IAAI;;EAGZ,MAAM,QAAQ,MAAKC,SAAU,OAAO;EACpC,MAAM,WAAW,MAAM,MAAM,KAAK,aAAa;AAE/C,SAAO,IAAI;;;;;aAKA,KAAK,MAAM;oBACH,KAAK,QAAQ,MAAO;;;;;;sBAMnB,KAAK,MAAM;;qBAEX,KAAK,QAAQ,CAAC,KAAK,MAAO;;6BAEnB,QAAQ;;oCAED,MAAM;sCACJ,cAAc,OAAO,QAAQ,CAAC;;;;;;;;;;;;;QAa5D,KAAK,SAAS,KAAK,YAAY;GAChC,MAAM,eAAe,MAAKA,SAAU,QAAQ;GAC5C,MAAM,kBAAkB,aAAa,MAAM,KAAK,aAAa;GAC7D,MAAM,cAAc,MAAKC,eAAgB,QAAQ,QAAQ;AAEzD,UAAO,IAAI;;;;yBAIO,QAAQ,YAAY,KAAK,cAAc;wBACxC,MAAKC,OAAQ,QAAQ,CAAC;;gCAEd,eAAe;;uCAER,aAAa;yCACX,cAAc,QAAQ,QAAQ,CAAC;;WAE7D,cAAc,IAAI,+BAA+B,YAAY,WAAW,QAAQ;;;IAGnF,CAAC;;;;uBAIc,MAAKC,KAAM,SAAS,OAAO,QAAQ,GAAG,WAAW,GAAG;;;;eAI5D,MAAa;AACtB,KAAE,iBAAiB;AACnB,SAAKA,KAAM,KAAK,OAAO,QAAQ;IAC9B;;OAEA,MAAKA,KAAM,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;;;YA3GhD,SAAS,EAAE,WAAW,OAAO,CAAC;YAG9B,SAAS,EAAE,WAAW,OAAO,CAAC;YAG9B,SAAS,EAAE,MAAM,QAAQ,CAAC;YAG1B,OAAO;uCA3JR,cAAc,8BAA8B"}
@@ -0,0 +1,29 @@
1
+ import { SignerAdapter } from "../types.mjs";
2
+ import "./dev-wallet-new-account.mjs";
3
+ import { ReadonlyWalletAccount } from "@mysten/wallet-standard";
4
+ import * as lit17 from "lit";
5
+ import { LitElement } from "lit";
6
+
7
+ //#region src/ui/dev-wallet-accounts.d.ts
8
+ declare class DevWalletAccounts extends LitElement {
9
+ #private;
10
+ static styles: (lit17.CSSResult | lit17.CSSResult[])[];
11
+ accounts: readonly ReadonlyWalletAccount[];
12
+ adapters: SignerAdapter[];
13
+ activeAddress: string;
14
+ private _dialogOpen;
15
+ private _editingAddress;
16
+ private _editingLabel;
17
+ private _confirmDeleteAddress;
18
+ private _deleting;
19
+ private _deleteError;
20
+ render(): lit17.TemplateResult<1>;
21
+ }
22
+ declare global {
23
+ interface HTMLElementTagNameMap {
24
+ 'dev-wallet-accounts': DevWalletAccounts;
25
+ }
26
+ } //# sourceMappingURL=dev-wallet-accounts.d.ts.map
27
+ //#endregion
28
+ export { DevWalletAccounts };
29
+ //# sourceMappingURL=dev-wallet-accounts.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-wallet-accounts.d.mts","names":[],"sources":["../../src/ui/dev-wallet-accounts.ts"],"mappings":";;;;;;;cAca,iBAAA,SAA0B,UAAA;EAAA;SACtB,MAAA,GADc,KAAA,CACR,SAAA,GAAA,KAAA,CAAA,SAAA;EAgQtB,QAAA,WAAmB,qBAAA;EAGnB,QAAA,EAAU,aAAA;EAGV,aAAA;EAAA,QAGQ,WAAA;EAAA,QAKA,eAAA;EAAA,QAGA,aAAA;EAAA,QAGA,qBAAA;EAAA,QAGA,SAAA;EAAA,QAGA,YAAA;EAEC,MAAA,CAAA,GAzBc,KAAA,CAyBR,cAAA;AAAA;AAAA,QAkRR,MAAA;EAAA,UACG,qBAAA;IACT,qBAAA,EAAuB,iBAAA;EAAA;AAAA"}