@mysten-incubation/dev-wallet 0.0.1 → 0.2.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 (182) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/LICENSE +189 -0
  3. package/dist/_virtual/{_@oxc-project_runtime@0.107.0 → _@oxc-project_runtime@0.127.0}/helpers/decorate.mjs +2 -3
  4. package/dist/adapters/base-adapter.mjs +6 -7
  5. package/dist/adapters/base-adapter.mjs.map +1 -1
  6. package/dist/adapters/browser.d.mts +4 -1
  7. package/dist/adapters/browser.mjs +4 -2
  8. package/dist/adapters/build-managed-account.mjs +8 -10
  9. package/dist/adapters/build-managed-account.mjs.map +1 -1
  10. package/dist/adapters/devstack-adapter.d.mts +111 -0
  11. package/dist/adapters/devstack-adapter.d.mts.map +1 -0
  12. package/dist/adapters/devstack-adapter.mjs +224 -0
  13. package/dist/adapters/devstack-adapter.mjs.map +1 -0
  14. package/dist/adapters/devstack-paths.d.mts +12 -0
  15. package/dist/adapters/devstack-paths.d.mts.map +1 -0
  16. package/dist/adapters/devstack-paths.mjs +12 -0
  17. package/dist/adapters/devstack-paths.mjs.map +1 -0
  18. package/dist/adapters/fork-relay.d.mts +109 -0
  19. package/dist/adapters/fork-relay.d.mts.map +1 -0
  20. package/dist/adapters/fork-relay.mjs +208 -0
  21. package/dist/adapters/fork-relay.mjs.map +1 -0
  22. package/dist/adapters/idb-store.mjs +12 -16
  23. package/dist/adapters/idb-store.mjs.map +1 -1
  24. package/dist/adapters/in-memory-adapter.mjs +4 -10
  25. package/dist/adapters/in-memory-adapter.mjs.map +1 -1
  26. package/dist/adapters/passkey-adapter.mjs +4 -12
  27. package/dist/adapters/passkey-adapter.mjs.map +1 -1
  28. package/dist/adapters/remote-cli-adapter.mjs +37 -72
  29. package/dist/adapters/remote-cli-adapter.mjs.map +1 -1
  30. package/dist/adapters/webcrypto-adapter.mjs +2 -4
  31. package/dist/adapters/webcrypto-adapter.mjs.map +1 -1
  32. package/dist/bin/cli.mjs +9 -22
  33. package/dist/bin/cli.mjs.map +1 -1
  34. package/dist/client/dev-wallet-client.mjs +13 -28
  35. package/dist/client/dev-wallet-client.mjs.map +1 -1
  36. package/dist/client/index.mjs +1 -2
  37. package/dist/client/request-handler.mjs +36 -42
  38. package/dist/client/request-handler.mjs.map +1 -1
  39. package/dist/index.mjs +1 -2
  40. package/dist/react/components.d.mts +9 -9
  41. package/dist/react/components.d.mts.map +1 -1
  42. package/dist/react/components.mjs +2 -5
  43. package/dist/react/components.mjs.map +1 -1
  44. package/dist/react/context.d.mts +3 -3
  45. package/dist/react/context.d.mts.map +1 -1
  46. package/dist/react/context.mjs +3 -8
  47. package/dist/react/context.mjs.map +1 -1
  48. package/dist/react/index.mjs +1 -2
  49. package/dist/react/useDevWallet.d.mts +3 -0
  50. package/dist/react/useDevWallet.d.mts.map +1 -1
  51. package/dist/react/useDevWallet.mjs +9 -14
  52. package/dist/react/useDevWallet.mjs.map +1 -1
  53. package/dist/server/cli-signing-middleware.mjs +7 -20
  54. package/dist/server/cli-signing-middleware.mjs.map +1 -1
  55. package/dist/server/index.mjs +1 -2
  56. package/dist/standalone/assets/{in-memory-adapter-CBF4h2KD.js → in-memory-adapter-qRkNfj9O.js} +1 -1
  57. package/dist/standalone/assets/main-DDltQnzR.js +3954 -0
  58. package/dist/standalone/assets/{webcrypto-adapter-DysAubFb.js → webcrypto-adapter-FejcrL9x.js} +1 -1
  59. package/dist/standalone/index.html +11 -12
  60. package/dist/ui/copy-controller.mjs +3 -3
  61. package/dist/ui/copy-controller.mjs.map +1 -1
  62. package/dist/ui/dev-wallet-account-selector.d.mts +3 -4
  63. package/dist/ui/dev-wallet-account-selector.d.mts.map +1 -1
  64. package/dist/ui/dev-wallet-account-selector.mjs +48 -25
  65. package/dist/ui/dev-wallet-account-selector.mjs.map +1 -1
  66. package/dist/ui/dev-wallet-accounts.d.mts +9 -4
  67. package/dist/ui/dev-wallet-accounts.d.mts.map +1 -1
  68. package/dist/ui/dev-wallet-accounts.mjs +62 -140
  69. package/dist/ui/dev-wallet-accounts.mjs.map +1 -1
  70. package/dist/ui/dev-wallet-balances.d.mts +10 -3
  71. package/dist/ui/dev-wallet-balances.d.mts.map +1 -1
  72. package/dist/ui/dev-wallet-balances.mjs +241 -43
  73. package/dist/ui/dev-wallet-balances.mjs.map +1 -1
  74. package/dist/ui/dev-wallet-connect.d.mts +3 -3
  75. package/dist/ui/dev-wallet-connect.d.mts.map +1 -1
  76. package/dist/ui/dev-wallet-connect.mjs +24 -16
  77. package/dist/ui/dev-wallet-connect.mjs.map +1 -1
  78. package/dist/ui/dev-wallet-dropdown.d.mts +3 -3
  79. package/dist/ui/dev-wallet-dropdown.d.mts.map +1 -1
  80. package/dist/ui/dev-wallet-dropdown.mjs +37 -47
  81. package/dist/ui/dev-wallet-dropdown.mjs.map +1 -1
  82. package/dist/ui/dev-wallet-fork-panel.d.mts +43 -0
  83. package/dist/ui/dev-wallet-fork-panel.d.mts.map +1 -0
  84. package/dist/ui/dev-wallet-fork-panel.mjs +500 -0
  85. package/dist/ui/dev-wallet-fork-panel.mjs.map +1 -0
  86. package/dist/ui/dev-wallet-network-badge.d.mts +3 -4
  87. package/dist/ui/dev-wallet-network-badge.d.mts.map +1 -1
  88. package/dist/ui/dev-wallet-network-badge.mjs +52 -21
  89. package/dist/ui/dev-wallet-network-badge.mjs.map +1 -1
  90. package/dist/ui/dev-wallet-new-account.d.mts +3 -4
  91. package/dist/ui/dev-wallet-new-account.d.mts.map +1 -1
  92. package/dist/ui/dev-wallet-new-account.mjs +31 -105
  93. package/dist/ui/dev-wallet-new-account.mjs.map +1 -1
  94. package/dist/ui/dev-wallet-objects.d.mts +3 -3
  95. package/dist/ui/dev-wallet-objects.d.mts.map +1 -1
  96. package/dist/ui/dev-wallet-objects.mjs +76 -39
  97. package/dist/ui/dev-wallet-objects.mjs.map +1 -1
  98. package/dist/ui/dev-wallet-panel.d.mts +24 -4
  99. package/dist/ui/dev-wallet-panel.d.mts.map +1 -1
  100. package/dist/ui/dev-wallet-panel.mjs +247 -64
  101. package/dist/ui/dev-wallet-panel.mjs.map +1 -1
  102. package/dist/ui/dev-wallet-popup.d.mts +3 -5
  103. package/dist/ui/dev-wallet-popup.d.mts.map +1 -1
  104. package/dist/ui/dev-wallet-popup.mjs +19 -15
  105. package/dist/ui/dev-wallet-popup.mjs.map +1 -1
  106. package/dist/ui/dev-wallet-settings.d.mts +3 -4
  107. package/dist/ui/dev-wallet-settings.d.mts.map +1 -1
  108. package/dist/ui/dev-wallet-settings.mjs +149 -97
  109. package/dist/ui/dev-wallet-settings.mjs.map +1 -1
  110. package/dist/ui/dev-wallet-signing-modal.d.mts +11 -4
  111. package/dist/ui/dev-wallet-signing-modal.d.mts.map +1 -1
  112. package/dist/ui/dev-wallet-signing-modal.mjs +46 -18
  113. package/dist/ui/dev-wallet-signing-modal.mjs.map +1 -1
  114. package/dist/ui/dev-wallet-signing.d.mts +9 -3
  115. package/dist/ui/dev-wallet-signing.d.mts.map +1 -1
  116. package/dist/ui/dev-wallet-signing.mjs +119 -130
  117. package/dist/ui/dev-wallet-signing.mjs.map +1 -1
  118. package/dist/ui/dev-wallet-standalone.d.mts +8 -3
  119. package/dist/ui/dev-wallet-standalone.d.mts.map +1 -1
  120. package/dist/ui/dev-wallet-standalone.mjs +303 -38
  121. package/dist/ui/dev-wallet-standalone.mjs.map +1 -1
  122. package/dist/ui/dev-wallet-tab-bar.d.mts +13 -5
  123. package/dist/ui/dev-wallet-tab-bar.d.mts.map +1 -1
  124. package/dist/ui/dev-wallet-tab-bar.mjs +143 -82
  125. package/dist/ui/dev-wallet-tab-bar.mjs.map +1 -1
  126. package/dist/ui/index.d.mts +3 -2
  127. package/dist/ui/index.mjs +2 -2
  128. package/dist/ui/mount.d.mts +14 -1
  129. package/dist/ui/mount.d.mts.map +1 -1
  130. package/dist/ui/mount.mjs +5 -2
  131. package/dist/ui/mount.mjs.map +1 -1
  132. package/dist/ui/styles.mjs +428 -66
  133. package/dist/ui/styles.mjs.map +1 -1
  134. package/dist/ui/transaction-analyzer.mjs +19 -30
  135. package/dist/ui/transaction-analyzer.mjs.map +1 -1
  136. package/dist/ui/utils.d.mts +59 -0
  137. package/dist/ui/utils.d.mts.map +1 -0
  138. package/dist/ui/utils.mjs +42 -15
  139. package/dist/ui/utils.mjs.map +1 -1
  140. package/dist/ui/wallet-controller.mjs +89 -20
  141. package/dist/ui/wallet-controller.mjs.map +1 -1
  142. package/dist/wallet/constants.d.mts +9 -0
  143. package/dist/wallet/constants.d.mts.map +1 -0
  144. package/dist/wallet/constants.mjs +1 -1
  145. package/dist/wallet/dev-wallet.mjs +42 -99
  146. package/dist/wallet/dev-wallet.mjs.map +1 -1
  147. package/dist/wallet/initializer.d.mts +3 -0
  148. package/dist/wallet/initializer.d.mts.map +1 -1
  149. package/dist/wallet/initializer.mjs +9 -14
  150. package/dist/wallet/initializer.mjs.map +1 -1
  151. package/dist/wallet/signing.mjs +8 -21
  152. package/dist/wallet/signing.mjs.map +1 -1
  153. package/package.json +8 -6
  154. package/src/adapters/browser.ts +21 -0
  155. package/src/adapters/devstack-adapter.ts +342 -0
  156. package/src/adapters/devstack-paths.ts +16 -0
  157. package/src/adapters/fork-relay.ts +321 -0
  158. package/src/app/index.html +10 -11
  159. package/src/react/useDevWallet.ts +5 -1
  160. package/src/ui/dev-wallet-account-selector.ts +44 -17
  161. package/src/ui/dev-wallet-accounts.ts +87 -124
  162. package/src/ui/dev-wallet-balances.ts +248 -27
  163. package/src/ui/dev-wallet-connect.ts +19 -8
  164. package/src/ui/dev-wallet-dropdown.ts +7 -5
  165. package/src/ui/dev-wallet-fork-panel.ts +591 -0
  166. package/src/ui/dev-wallet-network-badge.ts +49 -10
  167. package/src/ui/dev-wallet-new-account.ts +21 -62
  168. package/src/ui/dev-wallet-objects.ts +59 -19
  169. package/src/ui/dev-wallet-panel.ts +261 -42
  170. package/src/ui/dev-wallet-popup.ts +12 -6
  171. package/src/ui/dev-wallet-settings.ts +159 -94
  172. package/src/ui/dev-wallet-signing-modal.ts +47 -7
  173. package/src/ui/dev-wallet-signing.ts +124 -97
  174. package/src/ui/dev-wallet-standalone.ts +310 -22
  175. package/src/ui/dev-wallet-tab-bar.ts +132 -70
  176. package/src/ui/index.ts +3 -0
  177. package/src/ui/mount.ts +23 -1
  178. package/src/ui/styles.ts +434 -58
  179. package/src/ui/utils.ts +66 -0
  180. package/src/ui/wallet-controller.ts +103 -5
  181. package/src/wallet/initializer.ts +7 -1
  182. package/dist/standalone/assets/main-VE4olb-Q.js +0 -2841
@@ -40,21 +40,17 @@ var IDBStore = class {
40
40
  }));
41
41
  }
42
42
  #open() {
43
- if (!this.#db) {
44
- this.#db = new Promise((resolve, reject) => {
45
- const request = indexedDB.open(this.#dbName);
46
- request.onupgradeneeded = () => {
47
- if (!request.result.objectStoreNames.contains(this.#storeName)) {
48
- request.result.createObjectStore(this.#storeName);
49
- }
50
- };
51
- request.onsuccess = () => resolve(request.result);
52
- request.onerror = () => {
53
- this.#db = null;
54
- reject(request.error);
55
- };
56
- });
57
- }
43
+ if (!this.#db) this.#db = new Promise((resolve, reject) => {
44
+ const request = indexedDB.open(this.#dbName);
45
+ request.onupgradeneeded = () => {
46
+ if (!request.result.objectStoreNames.contains(this.#storeName)) request.result.createObjectStore(this.#storeName);
47
+ };
48
+ request.onsuccess = () => resolve(request.result);
49
+ request.onerror = () => {
50
+ this.#db = null;
51
+ reject(request.error);
52
+ };
53
+ });
58
54
  return this.#db;
59
55
  }
60
56
  #withTx(mode, fn) {
@@ -67,7 +63,7 @@ var IDBStore = class {
67
63
  }));
68
64
  }
69
65
  };
70
-
71
66
  //#endregion
72
67
  export { IDBStore };
68
+
73
69
  //# sourceMappingURL=idb-store.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"idb-store.mjs","names":["#dbName","#storeName","#withTx","#open","#db"],"sources":["../../src/adapters/idb-store.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Minimal IndexedDB key-value store replacing the `idb-keyval` package.\n *\n * The database connection is opened lazily on first use and reused for all\n * subsequent operations.\n */\nexport class IDBStore {\n\t#dbName: string;\n\t#storeName: string;\n\t#db: Promise<IDBDatabase> | null = null;\n\n\tconstructor(dbName: string, storeName: string) {\n\t\tthis.#dbName = dbName;\n\t\tthis.#storeName = storeName;\n\t}\n\n\tget<T>(key: IDBValidKey): Promise<T | undefined> {\n\t\treturn this.#withTx('readonly', (s) => s.get(key) as IDBRequest<T | undefined>);\n\t}\n\n\tasync set(key: IDBValidKey, value: unknown): Promise<void> {\n\t\tawait this.#withTx('readwrite', (s) => s.put(value, key));\n\t}\n\n\tdel(key: IDBValidKey): Promise<void> {\n\t\treturn this.#withTx('readwrite', (s) => s.delete(key) as IDBRequest<void>);\n\t}\n\n\tentries<K extends IDBValidKey, V>(): Promise<[K, V][]> {\n\t\treturn this.#open().then(\n\t\t\t(db) =>\n\t\t\t\tnew Promise((resolve, reject) => {\n\t\t\t\t\tconst tx = db.transaction(this.#storeName, 'readonly');\n\t\t\t\t\tconst objectStore = tx.objectStore(this.#storeName);\n\t\t\t\t\tconst results: [K, V][] = [];\n\t\t\t\t\tconst cursor = objectStore.openCursor();\n\t\t\t\t\tcursor.onsuccess = () => {\n\t\t\t\t\t\tconst c = cursor.result;\n\t\t\t\t\t\tif (c) {\n\t\t\t\t\t\t\tresults.push([c.key as K, c.value as V]);\n\t\t\t\t\t\t\tc.continue();\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\ttx.oncomplete = () => resolve(results);\n\t\t\t\t\ttx.onerror = () => reject(tx.error);\n\t\t\t\t}),\n\t\t);\n\t}\n\n\t#open(): Promise<IDBDatabase> {\n\t\tif (!this.#db) {\n\t\t\tthis.#db = new Promise((resolve, reject) => {\n\t\t\t\tconst request = indexedDB.open(this.#dbName);\n\t\t\t\trequest.onupgradeneeded = () => {\n\t\t\t\t\tif (!request.result.objectStoreNames.contains(this.#storeName)) {\n\t\t\t\t\t\trequest.result.createObjectStore(this.#storeName);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\trequest.onsuccess = () => resolve(request.result);\n\t\t\t\trequest.onerror = () => {\n\t\t\t\t\tthis.#db = null;\n\t\t\t\t\treject(request.error);\n\t\t\t\t};\n\t\t\t});\n\t\t}\n\t\treturn this.#db;\n\t}\n\n\t#withTx<T>(\n\t\tmode: IDBTransactionMode,\n\t\tfn: (objectStore: IDBObjectStore) => IDBRequest<T>,\n\t): Promise<T> {\n\t\treturn this.#open().then(\n\t\t\t(db) =>\n\t\t\t\tnew Promise((resolve, reject) => {\n\t\t\t\t\tconst tx = db.transaction(this.#storeName, mode);\n\t\t\t\t\tconst req = fn(tx.objectStore(this.#storeName));\n\t\t\t\t\ttx.oncomplete = () => resolve(req.result);\n\t\t\t\t\ttx.onerror = () => reject(tx.error);\n\t\t\t\t\ttx.onabort = () => reject(tx.error);\n\t\t\t\t}),\n\t\t);\n\t}\n}\n"],"mappings":";;;;;;;AASA,IAAa,WAAb,MAAsB;CACrB;CACA;CACA,MAAmC;CAEnC,YAAY,QAAgB,WAAmB;AAC9C,QAAKA,SAAU;AACf,QAAKC,YAAa;;CAGnB,IAAO,KAA0C;AAChD,SAAO,MAAKC,OAAQ,aAAa,MAAM,EAAE,IAAI,IAAI,CAA8B;;CAGhF,MAAM,IAAI,KAAkB,OAA+B;AAC1D,QAAM,MAAKA,OAAQ,cAAc,MAAM,EAAE,IAAI,OAAO,IAAI,CAAC;;CAG1D,IAAI,KAAiC;AACpC,SAAO,MAAKA,OAAQ,cAAc,MAAM,EAAE,OAAO,IAAI,CAAqB;;CAG3E,UAAuD;AACtD,SAAO,MAAKC,MAAO,CAAC,MAClB,OACA,IAAI,SAAS,SAAS,WAAW;GAChC,MAAM,KAAK,GAAG,YAAY,MAAKF,WAAY,WAAW;GACtD,MAAM,cAAc,GAAG,YAAY,MAAKA,UAAW;GACnD,MAAM,UAAoB,EAAE;GAC5B,MAAM,SAAS,YAAY,YAAY;AACvC,UAAO,kBAAkB;IACxB,MAAM,IAAI,OAAO;AACjB,QAAI,GAAG;AACN,aAAQ,KAAK,CAAC,EAAE,KAAU,EAAE,MAAW,CAAC;AACxC,OAAE,UAAU;;;AAGd,MAAG,mBAAmB,QAAQ,QAAQ;AACtC,MAAG,gBAAgB,OAAO,GAAG,MAAM;IAClC,CACH;;CAGF,QAA8B;AAC7B,MAAI,CAAC,MAAKG,IAAK;AACd,SAAKA,KAAM,IAAI,SAAS,SAAS,WAAW;IAC3C,MAAM,UAAU,UAAU,KAAK,MAAKJ,OAAQ;AAC5C,YAAQ,wBAAwB;AAC/B,SAAI,CAAC,QAAQ,OAAO,iBAAiB,SAAS,MAAKC,UAAW,EAAE;AAC/D,cAAQ,OAAO,kBAAkB,MAAKA,UAAW;;;AAGnD,YAAQ,kBAAkB,QAAQ,QAAQ,OAAO;AACjD,YAAQ,gBAAgB;AACvB,WAAKG,KAAM;AACX,YAAO,QAAQ,MAAM;;KAErB;;AAEH,SAAO,MAAKA;;CAGb,QACC,MACA,IACa;AACb,SAAO,MAAKD,MAAO,CAAC,MAClB,OACA,IAAI,SAAS,SAAS,WAAW;GAChC,MAAM,KAAK,GAAG,YAAY,MAAKF,WAAY,KAAK;GAChD,MAAM,MAAM,GAAG,GAAG,YAAY,MAAKA,UAAW,CAAC;AAC/C,MAAG,mBAAmB,QAAQ,IAAI,OAAO;AACzC,MAAG,gBAAgB,OAAO,GAAG,MAAM;AACnC,MAAG,gBAAgB,OAAO,GAAG,MAAM;IAClC,CACH"}
1
+ {"version":3,"file":"idb-store.mjs","names":["#dbName","#storeName","#withTx","#open","#db"],"sources":["../../src/adapters/idb-store.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Minimal IndexedDB key-value store replacing the `idb-keyval` package.\n *\n * The database connection is opened lazily on first use and reused for all\n * subsequent operations.\n */\nexport class IDBStore {\n\t#dbName: string;\n\t#storeName: string;\n\t#db: Promise<IDBDatabase> | null = null;\n\n\tconstructor(dbName: string, storeName: string) {\n\t\tthis.#dbName = dbName;\n\t\tthis.#storeName = storeName;\n\t}\n\n\tget<T>(key: IDBValidKey): Promise<T | undefined> {\n\t\treturn this.#withTx('readonly', (s) => s.get(key) as IDBRequest<T | undefined>);\n\t}\n\n\tasync set(key: IDBValidKey, value: unknown): Promise<void> {\n\t\tawait this.#withTx('readwrite', (s) => s.put(value, key));\n\t}\n\n\tdel(key: IDBValidKey): Promise<void> {\n\t\treturn this.#withTx('readwrite', (s) => s.delete(key) as IDBRequest<void>);\n\t}\n\n\tentries<K extends IDBValidKey, V>(): Promise<[K, V][]> {\n\t\treturn this.#open().then(\n\t\t\t(db) =>\n\t\t\t\tnew Promise((resolve, reject) => {\n\t\t\t\t\tconst tx = db.transaction(this.#storeName, 'readonly');\n\t\t\t\t\tconst objectStore = tx.objectStore(this.#storeName);\n\t\t\t\t\tconst results: [K, V][] = [];\n\t\t\t\t\tconst cursor = objectStore.openCursor();\n\t\t\t\t\tcursor.onsuccess = () => {\n\t\t\t\t\t\tconst c = cursor.result;\n\t\t\t\t\t\tif (c) {\n\t\t\t\t\t\t\tresults.push([c.key as K, c.value as V]);\n\t\t\t\t\t\t\tc.continue();\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\ttx.oncomplete = () => resolve(results);\n\t\t\t\t\ttx.onerror = () => reject(tx.error);\n\t\t\t\t}),\n\t\t);\n\t}\n\n\t#open(): Promise<IDBDatabase> {\n\t\tif (!this.#db) {\n\t\t\tthis.#db = new Promise((resolve, reject) => {\n\t\t\t\tconst request = indexedDB.open(this.#dbName);\n\t\t\t\trequest.onupgradeneeded = () => {\n\t\t\t\t\tif (!request.result.objectStoreNames.contains(this.#storeName)) {\n\t\t\t\t\t\trequest.result.createObjectStore(this.#storeName);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\trequest.onsuccess = () => resolve(request.result);\n\t\t\t\trequest.onerror = () => {\n\t\t\t\t\tthis.#db = null;\n\t\t\t\t\treject(request.error);\n\t\t\t\t};\n\t\t\t});\n\t\t}\n\t\treturn this.#db;\n\t}\n\n\t#withTx<T>(\n\t\tmode: IDBTransactionMode,\n\t\tfn: (objectStore: IDBObjectStore) => IDBRequest<T>,\n\t): Promise<T> {\n\t\treturn this.#open().then(\n\t\t\t(db) =>\n\t\t\t\tnew Promise((resolve, reject) => {\n\t\t\t\t\tconst tx = db.transaction(this.#storeName, mode);\n\t\t\t\t\tconst req = fn(tx.objectStore(this.#storeName));\n\t\t\t\t\ttx.oncomplete = () => resolve(req.result);\n\t\t\t\t\ttx.onerror = () => reject(tx.error);\n\t\t\t\t\ttx.onabort = () => reject(tx.error);\n\t\t\t\t}),\n\t\t);\n\t}\n}\n"],"mappings":";;;;;;;AASA,IAAa,WAAb,MAAsB;CACrB;CACA;CACA,MAAmC;CAEnC,YAAY,QAAgB,WAAmB;AAC9C,QAAA,SAAe;AACf,QAAA,YAAkB;;CAGnB,IAAO,KAA0C;AAChD,SAAO,MAAA,OAAa,aAAa,MAAM,EAAE,IAAI,IAAI,CAA8B;;CAGhF,MAAM,IAAI,KAAkB,OAA+B;AAC1D,QAAM,MAAA,OAAa,cAAc,MAAM,EAAE,IAAI,OAAO,IAAI,CAAC;;CAG1D,IAAI,KAAiC;AACpC,SAAO,MAAA,OAAa,cAAc,MAAM,EAAE,OAAO,IAAI,CAAqB;;CAG3E,UAAuD;AACtD,SAAO,MAAA,MAAY,CAAC,MAClB,OACA,IAAI,SAAS,SAAS,WAAW;GAChC,MAAM,KAAK,GAAG,YAAY,MAAA,WAAiB,WAAW;GACtD,MAAM,cAAc,GAAG,YAAY,MAAA,UAAgB;GACnD,MAAM,UAAoB,EAAE;GAC5B,MAAM,SAAS,YAAY,YAAY;AACvC,UAAO,kBAAkB;IACxB,MAAM,IAAI,OAAO;AACjB,QAAI,GAAG;AACN,aAAQ,KAAK,CAAC,EAAE,KAAU,EAAE,MAAW,CAAC;AACxC,OAAE,UAAU;;;AAGd,MAAG,mBAAmB,QAAQ,QAAQ;AACtC,MAAG,gBAAgB,OAAO,GAAG,MAAM;IAClC,CACH;;CAGF,QAA8B;AAC7B,MAAI,CAAC,MAAA,GACJ,OAAA,KAAW,IAAI,SAAS,SAAS,WAAW;GAC3C,MAAM,UAAU,UAAU,KAAK,MAAA,OAAa;AAC5C,WAAQ,wBAAwB;AAC/B,QAAI,CAAC,QAAQ,OAAO,iBAAiB,SAAS,MAAA,UAAgB,CAC7D,SAAQ,OAAO,kBAAkB,MAAA,UAAgB;;AAGnD,WAAQ,kBAAkB,QAAQ,QAAQ,OAAO;AACjD,WAAQ,gBAAgB;AACvB,UAAA,KAAW;AACX,WAAO,QAAQ,MAAM;;IAErB;AAEH,SAAO,MAAA;;CAGR,QACC,MACA,IACa;AACb,SAAO,MAAA,MAAY,CAAC,MAClB,OACA,IAAI,SAAS,SAAS,WAAW;GAChC,MAAM,KAAK,GAAG,YAAY,MAAA,WAAiB,KAAK;GAChD,MAAM,MAAM,GAAG,GAAG,YAAY,MAAA,UAAgB,CAAC;AAC/C,MAAG,mBAAmB,QAAQ,IAAI,OAAO;AACzC,MAAG,gBAAgB,OAAO,GAAG,MAAM;AACnC,MAAG,gBAAgB,OAAO,GAAG,MAAM;IAClC,CACH"}
@@ -1,7 +1,6 @@
1
1
  import { buildManagedAccount } from "./build-managed-account.mjs";
2
2
  import { BaseSignerAdapter } from "./base-adapter.mjs";
3
3
  import { Ed25519Keypair } from "@mysten/sui/keypairs/ed25519";
4
-
5
4
  //#region src/adapters/in-memory-adapter.ts
6
5
  var InMemorySignerAdapter = class extends BaseSignerAdapter {
7
6
  constructor(..._args) {
@@ -12,22 +11,17 @@ var InMemorySignerAdapter = class extends BaseSignerAdapter {
12
11
  async initialize() {}
13
12
  async createAccount(options) {
14
13
  const keypair = new Ed25519Keypair();
15
- const address = keypair.getPublicKey().toSuiAddress();
16
- const label = options?.label ?? this.getDefaultLabel();
17
- const managedAccount = buildManagedAccount(keypair, address, label);
14
+ const managedAccount = buildManagedAccount(keypair, keypair.getPublicKey().toSuiAddress(), options?.label ?? this.getDefaultLabel());
18
15
  this.addAccount(managedAccount);
19
16
  return managedAccount;
20
17
  }
21
18
  async importAccount(options) {
22
19
  const signer = options.signer;
23
- if (!signer) {
24
- throw new Error("In-memory adapter requires a signer to import");
25
- }
20
+ if (!signer) throw new Error("In-memory adapter requires a signer to import");
26
21
  const address = signer.toSuiAddress();
27
22
  const existing = this.getAccount(address);
28
23
  if (existing) return existing;
29
- const label = options.label ?? this.getDefaultLabel();
30
- const managedAccount = buildManagedAccount(signer, address, label);
24
+ const managedAccount = buildManagedAccount(signer, address, options.label ?? this.getDefaultLabel());
31
25
  this.addAccount(managedAccount);
32
26
  return managedAccount;
33
27
  }
@@ -38,7 +32,7 @@ var InMemorySignerAdapter = class extends BaseSignerAdapter {
38
32
  return this.removeAccountByAddress(address);
39
33
  }
40
34
  };
41
-
42
35
  //#endregion
43
36
  export { InMemorySignerAdapter };
37
+
44
38
  //# sourceMappingURL=in-memory-adapter.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"in-memory-adapter.mjs","names":[],"sources":["../../src/adapters/in-memory-adapter.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\n\nimport type { CreateAccountOptions, ImportAccountOptions, ManagedAccount } from '../types.js';\nimport { BaseSignerAdapter } from './base-adapter.js';\nimport { buildManagedAccount } from './build-managed-account.js';\n\nexport class InMemorySignerAdapter extends BaseSignerAdapter {\n\treadonly id = 'in-memory';\n\treadonly name = 'In-Memory Signer';\n\n\tasync initialize(): Promise<void> {\n\t\t// No-op for in-memory adapter\n\t}\n\n\tasync createAccount(options?: CreateAccountOptions): Promise<ManagedAccount> {\n\t\tconst keypair = new Ed25519Keypair();\n\t\tconst address = keypair.getPublicKey().toSuiAddress();\n\t\tconst label = options?.label ?? this.getDefaultLabel();\n\n\t\tconst managedAccount = buildManagedAccount(keypair, address, label);\n\t\tthis.addAccount(managedAccount);\n\t\treturn managedAccount;\n\t}\n\n\tasync importAccount(options: ImportAccountOptions): Promise<ManagedAccount> {\n\t\tconst signer = options.signer;\n\t\tif (!signer) {\n\t\t\tthrow new Error('In-memory adapter requires a signer to import');\n\t\t}\n\t\tconst address = signer.toSuiAddress();\n\n\t\tconst existing = this.getAccount(address);\n\t\tif (existing) return existing;\n\n\t\tconst label = options.label ?? this.getDefaultLabel();\n\t\tconst managedAccount = buildManagedAccount(signer, address, label);\n\t\tthis.addAccount(managedAccount);\n\t\treturn managedAccount;\n\t}\n\n\tasync renameAccount(address: string, label: string): Promise<boolean> {\n\t\treturn this._performRename(address, label);\n\t}\n\n\tasync removeAccount(address: string): Promise<boolean> {\n\t\treturn this.removeAccountByAddress(address);\n\t}\n}\n"],"mappings":";;;;;AASA,IAAa,wBAAb,cAA2C,kBAAkB;;;YAC9C;cACE;;CAEhB,MAAM,aAA4B;CAIlC,MAAM,cAAc,SAAyD;EAC5E,MAAM,UAAU,IAAI,gBAAgB;EACpC,MAAM,UAAU,QAAQ,cAAc,CAAC,cAAc;EACrD,MAAM,QAAQ,SAAS,SAAS,KAAK,iBAAiB;EAEtD,MAAM,iBAAiB,oBAAoB,SAAS,SAAS,MAAM;AACnE,OAAK,WAAW,eAAe;AAC/B,SAAO;;CAGR,MAAM,cAAc,SAAwD;EAC3E,MAAM,SAAS,QAAQ;AACvB,MAAI,CAAC,QAAQ;AACZ,SAAM,IAAI,MAAM,gDAAgD;;EAEjE,MAAM,UAAU,OAAO,cAAc;EAErC,MAAM,WAAW,KAAK,WAAW,QAAQ;AACzC,MAAI,SAAU,QAAO;EAErB,MAAM,QAAQ,QAAQ,SAAS,KAAK,iBAAiB;EACrD,MAAM,iBAAiB,oBAAoB,QAAQ,SAAS,MAAM;AAClE,OAAK,WAAW,eAAe;AAC/B,SAAO;;CAGR,MAAM,cAAc,SAAiB,OAAiC;AACrE,SAAO,KAAK,eAAe,SAAS,MAAM;;CAG3C,MAAM,cAAc,SAAmC;AACtD,SAAO,KAAK,uBAAuB,QAAQ"}
1
+ {"version":3,"file":"in-memory-adapter.mjs","names":[],"sources":["../../src/adapters/in-memory-adapter.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\n\nimport type { CreateAccountOptions, ImportAccountOptions, ManagedAccount } from '../types.js';\nimport { BaseSignerAdapter } from './base-adapter.js';\nimport { buildManagedAccount } from './build-managed-account.js';\n\nexport class InMemorySignerAdapter extends BaseSignerAdapter {\n\treadonly id = 'in-memory';\n\treadonly name = 'In-Memory Signer';\n\n\tasync initialize(): Promise<void> {\n\t\t// No-op for in-memory adapter\n\t}\n\n\tasync createAccount(options?: CreateAccountOptions): Promise<ManagedAccount> {\n\t\tconst keypair = new Ed25519Keypair();\n\t\tconst address = keypair.getPublicKey().toSuiAddress();\n\t\tconst label = options?.label ?? this.getDefaultLabel();\n\n\t\tconst managedAccount = buildManagedAccount(keypair, address, label);\n\t\tthis.addAccount(managedAccount);\n\t\treturn managedAccount;\n\t}\n\n\tasync importAccount(options: ImportAccountOptions): Promise<ManagedAccount> {\n\t\tconst signer = options.signer;\n\t\tif (!signer) {\n\t\t\tthrow new Error('In-memory adapter requires a signer to import');\n\t\t}\n\t\tconst address = signer.toSuiAddress();\n\n\t\tconst existing = this.getAccount(address);\n\t\tif (existing) return existing;\n\n\t\tconst label = options.label ?? this.getDefaultLabel();\n\t\tconst managedAccount = buildManagedAccount(signer, address, label);\n\t\tthis.addAccount(managedAccount);\n\t\treturn managedAccount;\n\t}\n\n\tasync renameAccount(address: string, label: string): Promise<boolean> {\n\t\treturn this._performRename(address, label);\n\t}\n\n\tasync removeAccount(address: string): Promise<boolean> {\n\t\treturn this.removeAccountByAddress(address);\n\t}\n}\n"],"mappings":";;;;AASA,IAAa,wBAAb,cAA2C,kBAAkB;;;YAC9C;cACE;;CAEhB,MAAM,aAA4B;CAIlC,MAAM,cAAc,SAAyD;EAC5E,MAAM,UAAU,IAAI,gBAAgB;EAIpC,MAAM,iBAAiB,oBAAoB,SAH3B,QAAQ,cAAc,CAAC,cAGa,EAFtC,SAAS,SAAS,KAAK,iBAAiB,CAEa;AACnE,OAAK,WAAW,eAAe;AAC/B,SAAO;;CAGR,MAAM,cAAc,SAAwD;EAC3E,MAAM,SAAS,QAAQ;AACvB,MAAI,CAAC,OACJ,OAAM,IAAI,MAAM,gDAAgD;EAEjE,MAAM,UAAU,OAAO,cAAc;EAErC,MAAM,WAAW,KAAK,WAAW,QAAQ;AACzC,MAAI,SAAU,QAAO;EAGrB,MAAM,iBAAiB,oBAAoB,QAAQ,SADrC,QAAQ,SAAS,KAAK,iBAAiB,CACa;AAClE,OAAK,WAAW,eAAe;AAC/B,SAAO;;CAGR,MAAM,cAAc,SAAiB,OAAiC;AACrE,SAAO,KAAK,eAAe,SAAS,MAAM;;CAG3C,MAAM,cAAc,SAAmC;AACtD,SAAO,KAAK,uBAAuB,QAAQ"}
@@ -2,7 +2,6 @@ import { buildManagedAccount } from "./build-managed-account.mjs";
2
2
  import { BaseSignerAdapter } from "./base-adapter.mjs";
3
3
  import { IDBStore } from "./idb-store.mjs";
4
4
  import { PasskeyKeypair } from "@mysten/sui/keypairs/passkey";
5
-
6
5
  //#region src/adapters/passkey-adapter.ts
7
6
  const DEFAULT_DB_NAME = "dev-wallet-passkey";
8
7
  const DEFAULT_STORE_NAME = "accounts";
@@ -26,9 +25,7 @@ var PasskeySignerAdapter = class extends BaseSignerAdapter {
26
25
  this.#provider = options?.provider ?? null;
27
26
  }
28
27
  #getProvider() {
29
- if (!this.#provider) {
30
- throw new Error("PasskeySignerAdapter not initialized. Call initialize() first.");
31
- }
28
+ if (!this.#provider) throw new Error("PasskeySignerAdapter not initialized. Call initialize() first.");
32
29
  return this.#provider;
33
30
  }
34
31
  async initialize() {
@@ -40,10 +37,7 @@ var PasskeySignerAdapter = class extends BaseSignerAdapter {
40
37
  if (!stored) return;
41
38
  const provider = this.#getProvider();
42
39
  this.setInitialAccounts(stored.map((meta) => {
43
- const publicKeyBytes = new Uint8Array(meta.publicKeyBytes);
44
- const credentialId = meta.credentialId ? new Uint8Array(meta.credentialId) : undefined;
45
- const signer = new PasskeyKeypair(publicKeyBytes, provider, credentialId);
46
- return buildManagedAccount(signer, meta.address, meta.label);
40
+ return buildManagedAccount(new PasskeyKeypair(new Uint8Array(meta.publicKeyBytes), provider, meta.credentialId ? new Uint8Array(meta.credentialId) : void 0), meta.address, meta.label);
47
41
  }));
48
42
  }
49
43
  getDefaultLabel() {
@@ -51,9 +45,7 @@ var PasskeySignerAdapter = class extends BaseSignerAdapter {
51
45
  }
52
46
  async createAccount(options) {
53
47
  const signer = await PasskeyKeypair.getPasskeyInstance(this.#getProvider());
54
- const address = signer.toSuiAddress();
55
- const label = options?.label ?? this.getDefaultLabel();
56
- const managedAccount = buildManagedAccount(signer, address, label);
48
+ const managedAccount = buildManagedAccount(signer, signer.toSuiAddress(), options?.label ?? this.getDefaultLabel());
57
49
  this.addAccount(managedAccount);
58
50
  await this.#saveMeta();
59
51
  return managedAccount;
@@ -81,7 +73,7 @@ var PasskeySignerAdapter = class extends BaseSignerAdapter {
81
73
  await this.#store.set(META_KEY, meta);
82
74
  }
83
75
  };
84
-
85
76
  //#endregion
86
77
  export { PasskeySignerAdapter };
78
+
87
79
  //# sourceMappingURL=passkey-adapter.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"passkey-adapter.mjs","names":["#store","#provider","#getProvider","#saveMeta"],"sources":["../../src/adapters/passkey-adapter.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { PasskeyKeypair } from '@mysten/sui/keypairs/passkey';\nimport type { PasskeyProvider } from '@mysten/sui/keypairs/passkey';\n\nimport type { CreateAccountOptions } from '../types.js';\nimport { BaseSignerAdapter } from './base-adapter.js';\nimport { buildManagedAccount } from './build-managed-account.js';\nimport { IDBStore } from './idb-store.js';\n\n/** Metadata stored in IndexedDB for each passkey account. */\ninterface StoredPasskeyMeta {\n\taddress: string;\n\tlabel: string;\n\t/** Compressed secp256r1 public key (33 bytes, stored as number array). */\n\tpublicKeyBytes: number[];\n\t/** WebAuthn credential ID (stored as number array). Used to constrain credential selection during signing. */\n\tcredentialId?: number[];\n}\n\nconst DEFAULT_DB_NAME = 'dev-wallet-passkey';\nconst DEFAULT_STORE_NAME = 'accounts';\nconst META_KEY = '__passkey_accounts__';\n\n/**\n * Signer adapter backed by WebAuthn passkeys. Each signing operation triggers a\n * browser biometric/PIN prompt. Account metadata is persisted in IndexedDB;\n * private keys are managed by the browser/OS and never enter JavaScript.\n *\n * Browser only — requires `navigator.credentials` and `indexedDB`.\n */\nexport class PasskeySignerAdapter extends BaseSignerAdapter {\n\treadonly id = 'passkey';\n\treadonly name = 'Passkey Signer';\n\treadonly allowAutoSign = false;\n\n\t#store: IDBStore;\n\t#provider: PasskeyProvider | null;\n\n\tconstructor(options?: { dbName?: string; storeName?: string; provider?: PasskeyProvider }) {\n\t\tsuper();\n\t\tthis.#store = new IDBStore(\n\t\t\toptions?.dbName ?? DEFAULT_DB_NAME,\n\t\t\toptions?.storeName ?? DEFAULT_STORE_NAME,\n\t\t);\n\t\t// Allow injecting a custom provider (useful for testing)\n\t\tthis.#provider = options?.provider ?? null;\n\t}\n\n\t#getProvider(): PasskeyProvider {\n\t\tif (!this.#provider) {\n\t\t\tthrow new Error('PasskeySignerAdapter not initialized. Call initialize() first.');\n\t\t}\n\t\treturn this.#provider;\n\t}\n\n\tasync initialize(): Promise<void> {\n\t\tif (!this.#provider) {\n\t\t\tconst { BrowserPasskeyProvider } = await import('@mysten/sui/keypairs/passkey');\n\t\t\tthis.#provider = new BrowserPasskeyProvider('Dev Wallet Passkey', {\n\t\t\t\trp: { id: globalThis.location?.hostname },\n\t\t\t});\n\t\t}\n\n\t\tconst stored = await this.#store.get<StoredPasskeyMeta[]>(META_KEY);\n\t\tif (!stored) return;\n\n\t\tconst provider = this.#getProvider();\n\t\tthis.setInitialAccounts(\n\t\t\tstored.map((meta) => {\n\t\t\t\tconst publicKeyBytes = new Uint8Array(meta.publicKeyBytes);\n\t\t\t\tconst credentialId = meta.credentialId ? new Uint8Array(meta.credentialId) : undefined;\n\t\t\t\tconst signer = new PasskeyKeypair(publicKeyBytes, provider, credentialId);\n\t\t\t\treturn buildManagedAccount(signer, meta.address, meta.label);\n\t\t\t}),\n\t\t);\n\t}\n\n\tprotected override getDefaultLabel(): string {\n\t\treturn `Passkey Account ${this.getAccounts().length + 1}`;\n\t}\n\n\tasync createAccount(options?: CreateAccountOptions) {\n\t\tconst signer = await PasskeyKeypair.getPasskeyInstance(this.#getProvider());\n\t\tconst address = signer.toSuiAddress();\n\t\tconst label = options?.label ?? this.getDefaultLabel();\n\n\t\tconst managedAccount = buildManagedAccount(signer, address, label);\n\t\tthis.addAccount(managedAccount);\n\t\tawait this.#saveMeta();\n\n\t\treturn managedAccount;\n\t}\n\n\tasync renameAccount(address: string, label: string): Promise<boolean> {\n\t\tif (!this._performRename(address, label)) return false;\n\t\tawait this.#saveMeta();\n\t\treturn true;\n\t}\n\n\tasync removeAccount(address: string): Promise<boolean> {\n\t\tif (!this.removeAccountByAddress(address)) return false;\n\t\tawait this.#saveMeta();\n\t\treturn true;\n\t}\n\n\tasync #saveMeta(): Promise<void> {\n\t\tconst meta: StoredPasskeyMeta[] = this.getAccounts().map((a) => {\n\t\t\tconst credentialId = (a.signer as PasskeyKeypair).getCredentialId?.();\n\t\t\treturn {\n\t\t\t\taddress: a.address,\n\t\t\t\tlabel: a.label,\n\t\t\t\tpublicKeyBytes: [...a.signer.getPublicKey().toRawBytes()],\n\t\t\t\t...(credentialId && { credentialId: [...credentialId] }),\n\t\t\t};\n\t\t});\n\t\tawait this.#store.set(META_KEY, meta);\n\t}\n}\n"],"mappings":";;;;;;AAqBA,MAAM,kBAAkB;AACxB,MAAM,qBAAqB;AAC3B,MAAM,WAAW;;;;;;;;AASjB,IAAa,uBAAb,cAA0C,kBAAkB;CAK3D;CACA;CAEA,YAAY,SAA+E;AAC1F,SAAO;YARM;cACE;uBACS;AAOxB,QAAKA,QAAS,IAAI,SACjB,SAAS,UAAU,iBACnB,SAAS,aAAa,mBACtB;AAED,QAAKC,WAAY,SAAS,YAAY;;CAGvC,eAAgC;AAC/B,MAAI,CAAC,MAAKA,UAAW;AACpB,SAAM,IAAI,MAAM,iEAAiE;;AAElF,SAAO,MAAKA;;CAGb,MAAM,aAA4B;AACjC,MAAI,CAAC,MAAKA,UAAW;GACpB,MAAM,EAAE,2BAA2B,MAAM,OAAO;AAChD,SAAKA,WAAY,IAAI,uBAAuB,sBAAsB,EACjE,IAAI,EAAE,IAAI,WAAW,UAAU,UAAU,EACzC,CAAC;;EAGH,MAAM,SAAS,MAAM,MAAKD,MAAO,IAAyB,SAAS;AACnE,MAAI,CAAC,OAAQ;EAEb,MAAM,WAAW,MAAKE,aAAc;AACpC,OAAK,mBACJ,OAAO,KAAK,SAAS;GACpB,MAAM,iBAAiB,IAAI,WAAW,KAAK,eAAe;GAC1D,MAAM,eAAe,KAAK,eAAe,IAAI,WAAW,KAAK,aAAa,GAAG;GAC7E,MAAM,SAAS,IAAI,eAAe,gBAAgB,UAAU,aAAa;AACzE,UAAO,oBAAoB,QAAQ,KAAK,SAAS,KAAK,MAAM;IAC3D,CACF;;CAGF,AAAmB,kBAA0B;AAC5C,SAAO,mBAAmB,KAAK,aAAa,CAAC,SAAS;;CAGvD,MAAM,cAAc,SAAgC;EACnD,MAAM,SAAS,MAAM,eAAe,mBAAmB,MAAKA,aAAc,CAAC;EAC3E,MAAM,UAAU,OAAO,cAAc;EACrC,MAAM,QAAQ,SAAS,SAAS,KAAK,iBAAiB;EAEtD,MAAM,iBAAiB,oBAAoB,QAAQ,SAAS,MAAM;AAClE,OAAK,WAAW,eAAe;AAC/B,QAAM,MAAKC,UAAW;AAEtB,SAAO;;CAGR,MAAM,cAAc,SAAiB,OAAiC;AACrE,MAAI,CAAC,KAAK,eAAe,SAAS,MAAM,CAAE,QAAO;AACjD,QAAM,MAAKA,UAAW;AACtB,SAAO;;CAGR,MAAM,cAAc,SAAmC;AACtD,MAAI,CAAC,KAAK,uBAAuB,QAAQ,CAAE,QAAO;AAClD,QAAM,MAAKA,UAAW;AACtB,SAAO;;CAGR,OAAMA,WAA2B;EAChC,MAAM,OAA4B,KAAK,aAAa,CAAC,KAAK,MAAM;GAC/D,MAAM,eAAgB,EAAE,OAA0B,mBAAmB;AACrE,UAAO;IACN,SAAS,EAAE;IACX,OAAO,EAAE;IACT,gBAAgB,CAAC,GAAG,EAAE,OAAO,cAAc,CAAC,YAAY,CAAC;IACzD,GAAI,gBAAgB,EAAE,cAAc,CAAC,GAAG,aAAa,EAAE;IACvD;IACA;AACF,QAAM,MAAKH,MAAO,IAAI,UAAU,KAAK"}
1
+ {"version":3,"file":"passkey-adapter.mjs","names":["#store","#provider","#getProvider","#saveMeta"],"sources":["../../src/adapters/passkey-adapter.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { PasskeyKeypair } from '@mysten/sui/keypairs/passkey';\nimport type { PasskeyProvider } from '@mysten/sui/keypairs/passkey';\n\nimport type { CreateAccountOptions } from '../types.js';\nimport { BaseSignerAdapter } from './base-adapter.js';\nimport { buildManagedAccount } from './build-managed-account.js';\nimport { IDBStore } from './idb-store.js';\n\n/** Metadata stored in IndexedDB for each passkey account. */\ninterface StoredPasskeyMeta {\n\taddress: string;\n\tlabel: string;\n\t/** Compressed secp256r1 public key (33 bytes, stored as number array). */\n\tpublicKeyBytes: number[];\n\t/** WebAuthn credential ID (stored as number array). Used to constrain credential selection during signing. */\n\tcredentialId?: number[];\n}\n\nconst DEFAULT_DB_NAME = 'dev-wallet-passkey';\nconst DEFAULT_STORE_NAME = 'accounts';\nconst META_KEY = '__passkey_accounts__';\n\n/**\n * Signer adapter backed by WebAuthn passkeys. Each signing operation triggers a\n * browser biometric/PIN prompt. Account metadata is persisted in IndexedDB;\n * private keys are managed by the browser/OS and never enter JavaScript.\n *\n * Browser only — requires `navigator.credentials` and `indexedDB`.\n */\nexport class PasskeySignerAdapter extends BaseSignerAdapter {\n\treadonly id = 'passkey';\n\treadonly name = 'Passkey Signer';\n\treadonly allowAutoSign = false;\n\n\t#store: IDBStore;\n\t#provider: PasskeyProvider | null;\n\n\tconstructor(options?: { dbName?: string; storeName?: string; provider?: PasskeyProvider }) {\n\t\tsuper();\n\t\tthis.#store = new IDBStore(\n\t\t\toptions?.dbName ?? DEFAULT_DB_NAME,\n\t\t\toptions?.storeName ?? DEFAULT_STORE_NAME,\n\t\t);\n\t\t// Allow injecting a custom provider (useful for testing)\n\t\tthis.#provider = options?.provider ?? null;\n\t}\n\n\t#getProvider(): PasskeyProvider {\n\t\tif (!this.#provider) {\n\t\t\tthrow new Error('PasskeySignerAdapter not initialized. Call initialize() first.');\n\t\t}\n\t\treturn this.#provider;\n\t}\n\n\tasync initialize(): Promise<void> {\n\t\tif (!this.#provider) {\n\t\t\tconst { BrowserPasskeyProvider } = await import('@mysten/sui/keypairs/passkey');\n\t\t\tthis.#provider = new BrowserPasskeyProvider('Dev Wallet Passkey', {\n\t\t\t\trp: { id: globalThis.location?.hostname },\n\t\t\t});\n\t\t}\n\n\t\tconst stored = await this.#store.get<StoredPasskeyMeta[]>(META_KEY);\n\t\tif (!stored) return;\n\n\t\tconst provider = this.#getProvider();\n\t\tthis.setInitialAccounts(\n\t\t\tstored.map((meta) => {\n\t\t\t\tconst publicKeyBytes = new Uint8Array(meta.publicKeyBytes);\n\t\t\t\tconst credentialId = meta.credentialId ? new Uint8Array(meta.credentialId) : undefined;\n\t\t\t\tconst signer = new PasskeyKeypair(publicKeyBytes, provider, credentialId);\n\t\t\t\treturn buildManagedAccount(signer, meta.address, meta.label);\n\t\t\t}),\n\t\t);\n\t}\n\n\tprotected override getDefaultLabel(): string {\n\t\treturn `Passkey Account ${this.getAccounts().length + 1}`;\n\t}\n\n\tasync createAccount(options?: CreateAccountOptions) {\n\t\tconst signer = await PasskeyKeypair.getPasskeyInstance(this.#getProvider());\n\t\tconst address = signer.toSuiAddress();\n\t\tconst label = options?.label ?? this.getDefaultLabel();\n\n\t\tconst managedAccount = buildManagedAccount(signer, address, label);\n\t\tthis.addAccount(managedAccount);\n\t\tawait this.#saveMeta();\n\n\t\treturn managedAccount;\n\t}\n\n\tasync renameAccount(address: string, label: string): Promise<boolean> {\n\t\tif (!this._performRename(address, label)) return false;\n\t\tawait this.#saveMeta();\n\t\treturn true;\n\t}\n\n\tasync removeAccount(address: string): Promise<boolean> {\n\t\tif (!this.removeAccountByAddress(address)) return false;\n\t\tawait this.#saveMeta();\n\t\treturn true;\n\t}\n\n\tasync #saveMeta(): Promise<void> {\n\t\tconst meta: StoredPasskeyMeta[] = this.getAccounts().map((a) => {\n\t\t\tconst credentialId = (a.signer as PasskeyKeypair).getCredentialId?.();\n\t\t\treturn {\n\t\t\t\taddress: a.address,\n\t\t\t\tlabel: a.label,\n\t\t\t\tpublicKeyBytes: [...a.signer.getPublicKey().toRawBytes()],\n\t\t\t\t...(credentialId && { credentialId: [...credentialId] }),\n\t\t\t};\n\t\t});\n\t\tawait this.#store.set(META_KEY, meta);\n\t}\n}\n"],"mappings":";;;;;AAqBA,MAAM,kBAAkB;AACxB,MAAM,qBAAqB;AAC3B,MAAM,WAAW;;;;;;;;AASjB,IAAa,uBAAb,cAA0C,kBAAkB;CAK3D;CACA;CAEA,YAAY,SAA+E;AAC1F,SAAO;YARM;cACE;uBACS;AAOxB,QAAA,QAAc,IAAI,SACjB,SAAS,UAAU,iBACnB,SAAS,aAAa,mBACtB;AAED,QAAA,WAAiB,SAAS,YAAY;;CAGvC,eAAgC;AAC/B,MAAI,CAAC,MAAA,SACJ,OAAM,IAAI,MAAM,iEAAiE;AAElF,SAAO,MAAA;;CAGR,MAAM,aAA4B;AACjC,MAAI,CAAC,MAAA,UAAgB;GACpB,MAAM,EAAE,2BAA2B,MAAM,OAAO;AAChD,SAAA,WAAiB,IAAI,uBAAuB,sBAAsB,EACjE,IAAI,EAAE,IAAI,WAAW,UAAU,UAAU,EACzC,CAAC;;EAGH,MAAM,SAAS,MAAM,MAAA,MAAY,IAAyB,SAAS;AACnE,MAAI,CAAC,OAAQ;EAEb,MAAM,WAAW,MAAA,aAAmB;AACpC,OAAK,mBACJ,OAAO,KAAK,SAAS;AAIpB,UAAO,oBAAoB,IADR,eAAe,IAFP,WAAW,KAAK,eAET,EAAgB,UAD7B,KAAK,eAAe,IAAI,WAAW,KAAK,aAAa,GAAG,OAElD,EAAQ,KAAK,SAAS,KAAK,MAAM;IAC3D,CACF;;CAGF,kBAA6C;AAC5C,SAAO,mBAAmB,KAAK,aAAa,CAAC,SAAS;;CAGvD,MAAM,cAAc,SAAgC;EACnD,MAAM,SAAS,MAAM,eAAe,mBAAmB,MAAA,aAAmB,CAAC;EAI3E,MAAM,iBAAiB,oBAAoB,QAH3B,OAAO,cAG4B,EAFrC,SAAS,SAAS,KAAK,iBAAiB,CAEY;AAClE,OAAK,WAAW,eAAe;AAC/B,QAAM,MAAA,UAAgB;AAEtB,SAAO;;CAGR,MAAM,cAAc,SAAiB,OAAiC;AACrE,MAAI,CAAC,KAAK,eAAe,SAAS,MAAM,CAAE,QAAO;AACjD,QAAM,MAAA,UAAgB;AACtB,SAAO;;CAGR,MAAM,cAAc,SAAmC;AACtD,MAAI,CAAC,KAAK,uBAAuB,QAAQ,CAAE,QAAO;AAClD,QAAM,MAAA,UAAgB;AACtB,SAAO;;CAGR,OAAA,WAAiC;EAChC,MAAM,OAA4B,KAAK,aAAa,CAAC,KAAK,MAAM;GAC/D,MAAM,eAAgB,EAAE,OAA0B,mBAAmB;AACrE,UAAO;IACN,SAAS,EAAE;IACX,OAAO,EAAE;IACT,gBAAgB,CAAC,GAAG,EAAE,OAAO,cAAc,CAAC,YAAY,CAAC;IACzD,GAAI,gBAAgB,EAAE,cAAc,CAAC,GAAG,aAAa,EAAE;IACvD;IACA;AACF,QAAM,MAAA,MAAY,IAAI,UAAU,KAAK"}
@@ -5,7 +5,6 @@ import { Ed25519PublicKey } from "@mysten/sui/keypairs/ed25519";
5
5
  import { Signer } from "@mysten/sui/cryptography";
6
6
  import { Secp256k1PublicKey } from "@mysten/sui/keypairs/secp256k1";
7
7
  import { Secp256r1PublicKey } from "@mysten/sui/keypairs/secp256r1";
8
-
9
8
  //#region src/adapters/remote-cli-adapter.ts
10
9
  /**
11
10
  * Wallet features advertised by CLI-backed accounts.
@@ -29,8 +28,7 @@ const KEY_SCHEME_MAP = {
29
28
  secp256r1: "Secp256r1"
30
29
  };
31
30
  function publicKeyFromSuiBytes(publicBase64Key, scheme) {
32
- const allBytes = fromBase64(publicBase64Key);
33
- const rawBytes = allBytes.slice(1);
31
+ const rawBytes = fromBase64(publicBase64Key).slice(1);
34
32
  switch (scheme) {
35
33
  case "ED25519": return new Ed25519PublicKey(rawBytes);
36
34
  case "Secp256k1": return new Secp256k1PublicKey(rawBytes);
@@ -60,7 +58,7 @@ var CliProxySigner = class extends Signer {
60
58
  this.#authToken = options.authToken ?? null;
61
59
  }
62
60
  async sign(_bytes) {
63
- throw new Error("CliProxySigner does not support direct digest signing. " + "Transaction signing is handled via the sui CLI.");
61
+ throw new Error("CliProxySigner does not support direct digest signing. Transaction signing is handled via the sui CLI.");
64
62
  }
65
63
  getKeyScheme() {
66
64
  return this.#scheme;
@@ -73,9 +71,7 @@ var CliProxySigner = class extends Signer {
73
71
  }
74
72
  async signTransaction(bytes) {
75
73
  const headers = { "Content-Type": "application/json" };
76
- if (this.#authToken) {
77
- headers["Authorization"] = `Bearer ${this.#authToken}`;
78
- }
74
+ if (this.#authToken) headers["Authorization"] = `Bearer ${this.#authToken}`;
79
75
  const res = await fetch(`${this.#serverOrigin}/api/v1/sign-transaction`, {
80
76
  method: "POST",
81
77
  headers,
@@ -89,16 +85,14 @@ var CliProxySigner = class extends Signer {
89
85
  throw new Error(`Transaction signing failed: ${body.error ?? res.statusText}`);
90
86
  }
91
87
  const { suiSignature } = await res.json();
92
- if (typeof suiSignature !== "string" || suiSignature.length === 0) {
93
- throw new Error("Transaction signing failed: server returned invalid signature");
94
- }
88
+ if (typeof suiSignature !== "string" || suiSignature.length === 0) throw new Error("Transaction signing failed: server returned invalid signature");
95
89
  return {
96
90
  bytes: toBase64(bytes),
97
91
  signature: suiSignature
98
92
  };
99
93
  }
100
94
  async signPersonalMessage(_bytes) {
101
- throw new Error("Personal message signing is not supported in CLI mode. " + "The sui keytool sign command only supports TransactionData. " + "Use --adapter=webcrypto or --adapter=memory for personal message signing.");
95
+ throw new Error("Personal message signing is not supported in CLI mode. The sui keytool sign command only supports TransactionData. Use --adapter=webcrypto or --adapter=memory for personal message signing.");
102
96
  }
103
97
  };
104
98
  /**
@@ -113,8 +107,7 @@ var RemoteCliAdapter = class RemoteCliAdapter extends BaseSignerAdapter {
113
107
  return `CLI Account ${this.getAccounts().length + 1}`;
114
108
  }
115
109
  static storageKey(suffix) {
116
- const origin = typeof location !== "undefined" ? location.origin : "unknown";
117
- return `dev-wallet:${suffix}:${origin}`;
110
+ return `dev-wallet:${suffix}:${typeof location !== "undefined" ? location.origin : "unknown"}`;
118
111
  }
119
112
  static get STORAGE_KEY() {
120
113
  return RemoteCliAdapter.storageKey("cli-imported-addresses");
@@ -123,26 +116,25 @@ var RemoteCliAdapter = class RemoteCliAdapter extends BaseSignerAdapter {
123
116
  return RemoteCliAdapter.storageKey("cli-token");
124
117
  }
125
118
  #serverOrigin;
126
- #authToken = null;
127
- #allServerAccounts = [];
128
- #lastFetch = null;
119
+ #authToken;
120
+ #allServerAccounts;
121
+ #lastFetch;
129
122
  constructor(options) {
130
123
  super();
131
124
  this.id = "remote-cli";
132
125
  this.name = "Remote CLI Signer";
133
126
  this.allowAutoSign = false;
127
+ this.#authToken = null;
128
+ this.#allServerAccounts = [];
129
+ this.#lastFetch = null;
134
130
  const origin = options?.serverOrigin ?? "";
135
- if (origin) {
136
- try {
137
- new URL(origin);
138
- } catch {
139
- throw new Error(`Invalid serverOrigin URL: "${origin}"`);
140
- }
131
+ if (origin) try {
132
+ new URL(origin);
133
+ } catch {
134
+ throw new Error(`Invalid serverOrigin URL: "${origin}"`);
141
135
  }
142
136
  this.#serverOrigin = origin;
143
- if (options?.token) {
144
- this.#authToken = options.token;
145
- }
137
+ if (options?.token) this.#authToken = options.token;
146
138
  }
147
139
  get isPaired() {
148
140
  return this.#authToken !== null;
@@ -150,32 +142,23 @@ var RemoteCliAdapter = class RemoteCliAdapter extends BaseSignerAdapter {
150
142
  async initialize() {
151
143
  if (!this.#authToken && typeof localStorage !== "undefined") {
152
144
  const stored = localStorage.getItem(RemoteCliAdapter.TOKEN_KEY);
153
- if (stored) {
154
- this.#authToken = stored;
155
- }
145
+ if (stored) this.#authToken = stored;
156
146
  }
157
- if (this.#authToken) {
158
- try {
159
- await this.#fetchServerAccounts();
160
- await this.#restoreImportedAccounts();
161
- } catch (error) {
162
- if (error instanceof AuthError) {
163
- this.#authToken = null;
164
- if (typeof localStorage !== "undefined") {
165
- localStorage.removeItem(RemoteCliAdapter.TOKEN_KEY);
166
- }
167
- } else {
168
- console.warn("[dev-wallet] CLI adapter initialization failed:", error);
169
- }
170
- }
147
+ if (this.#authToken) try {
148
+ await this.#fetchServerAccounts();
149
+ await this.#restoreImportedAccounts();
150
+ } catch (error) {
151
+ if (error instanceof AuthError) {
152
+ this.#authToken = null;
153
+ if (typeof localStorage !== "undefined") localStorage.removeItem(RemoteCliAdapter.TOKEN_KEY);
154
+ } else console.warn("[dev-wallet] CLI adapter initialization failed:", error);
171
155
  }
172
156
  }
173
157
  async listAvailableAccounts() {
174
158
  await this.#fetchServerAccounts();
175
159
  const importedAddresses = new Set(this._accounts.map((a) => a.address));
176
160
  return this.#allServerAccounts.filter((info) => {
177
- const scheme = KEY_SCHEME_MAP[info.keyScheme];
178
- return scheme && !importedAddresses.has(info.suiAddress);
161
+ return KEY_SCHEME_MAP[info.keyScheme] && !importedAddresses.has(info.suiAddress);
179
162
  }).map((info) => ({
180
163
  address: info.suiAddress,
181
164
  scheme: info.keyScheme,
@@ -184,21 +167,13 @@ var RemoteCliAdapter = class RemoteCliAdapter extends BaseSignerAdapter {
184
167
  }
185
168
  async importAccount(options) {
186
169
  const address = options.address;
187
- if (!address) {
188
- throw new Error("Remote CLI adapter requires an address to import");
189
- }
190
- if (this._accounts.some((a) => a.address === address)) {
191
- throw new Error(`Account ${address} is already imported`);
192
- }
170
+ if (!address) throw new Error("Remote CLI adapter requires an address to import");
171
+ if (this._accounts.some((a) => a.address === address)) throw new Error(`Account ${address} is already imported`);
193
172
  await this.#fetchServerAccounts();
194
173
  const info = this.#allServerAccounts.find((a) => a.suiAddress === address);
195
- if (!info) {
196
- throw new Error(`Account ${address} not found on server`);
197
- }
174
+ if (!info) throw new Error(`Account ${address} not found on server`);
198
175
  const scheme = KEY_SCHEME_MAP[info.keyScheme];
199
- if (!scheme) {
200
- throw new Error(`Unsupported key scheme: ${info.keyScheme}`);
201
- }
176
+ if (!scheme) throw new Error(`Unsupported key scheme: ${info.keyScheme}`);
202
177
  const account = this.#serverAccountToManaged(info, scheme, options.label);
203
178
  this.addAccount(account);
204
179
  this.#saveImportedAddresses();
@@ -206,9 +181,7 @@ var RemoteCliAdapter = class RemoteCliAdapter extends BaseSignerAdapter {
206
181
  }
207
182
  async removeAccount(address) {
208
183
  const removed = this.removeAccountByAddress(address);
209
- if (removed) {
210
- this.#saveImportedAddresses();
211
- }
184
+ if (removed) this.#saveImportedAddresses();
212
185
  return removed;
213
186
  }
214
187
  destroy() {
@@ -222,9 +195,7 @@ var RemoteCliAdapter = class RemoteCliAdapter extends BaseSignerAdapter {
222
195
  }
223
196
  #authHeaders() {
224
197
  const headers = { "Content-Type": "application/json" };
225
- if (this.#authToken) {
226
- headers["Authorization"] = `Bearer ${this.#authToken}`;
227
- }
198
+ if (this.#authToken) headers["Authorization"] = `Bearer ${this.#authToken}`;
228
199
  return headers;
229
200
  }
230
201
  async #fetchServerAccounts(forceRefresh = false) {
@@ -233,12 +204,8 @@ var RemoteCliAdapter = class RemoteCliAdapter extends BaseSignerAdapter {
233
204
  return;
234
205
  }
235
206
  const res = await fetch(`${this.#serverOrigin}/api/v1/accounts`, { headers: this.#authHeaders() });
236
- if (res.status === 401 || res.status === 403) {
237
- throw new AuthError();
238
- }
239
- if (!res.ok) {
240
- throw new Error(`Failed to fetch accounts: ${res.statusText}`);
241
- }
207
+ if (res.status === 401 || res.status === 403) throw new AuthError();
208
+ if (!res.ok) throw new Error(`Failed to fetch accounts: ${res.statusText}`);
242
209
  const { accounts } = await res.json();
243
210
  this.#allServerAccounts = accounts;
244
211
  this.#lastFetch = {
@@ -259,9 +226,7 @@ var RemoteCliAdapter = class RemoteCliAdapter extends BaseSignerAdapter {
259
226
  if (!scheme) continue;
260
227
  restored.push(this.#serverAccountToManaged(info, scheme));
261
228
  }
262
- if (restored.length > 0) {
263
- this.setInitialAccounts([...this.getAccounts(), ...restored]);
264
- }
229
+ if (restored.length > 0) this.setInitialAccounts([...this.getAccounts(), ...restored]);
265
230
  }
266
231
  #loadImportedAddresses() {
267
232
  if (typeof localStorage === "undefined") return [];
@@ -293,7 +258,7 @@ var RemoteCliAdapter = class RemoteCliAdapter extends BaseSignerAdapter {
293
258
  return buildManagedAccount(signer, info.suiAddress, accountLabel, CLI_WALLET_FEATURES);
294
259
  }
295
260
  };
296
-
297
261
  //#endregion
298
262
  export { CliProxySigner, RemoteCliAdapter };
263
+
299
264
  //# sourceMappingURL=remote-cli-adapter.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"remote-cli-adapter.mjs","names":["#address","#publicKey","#scheme","#serverOrigin","#authToken","#fetchServerAccounts","#restoreImportedAccounts","#allServerAccounts","#serverAccountToManaged","#saveImportedAddresses","#lastFetch","#authHeaders","#loadImportedAddresses"],"sources":["../../src/adapters/remote-cli-adapter.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Signer } from '@mysten/sui/cryptography';\nimport type { PublicKey, SignatureScheme } from '@mysten/sui/cryptography';\nimport { Ed25519PublicKey } from '@mysten/sui/keypairs/ed25519';\nimport { Secp256k1PublicKey } from '@mysten/sui/keypairs/secp256k1';\nimport { Secp256r1PublicKey } from '@mysten/sui/keypairs/secp256r1';\nimport { fromBase64, toBase64 } from '@mysten/sui/utils';\nimport type { ImportAccountOptions, ManagedAccount } from '../types.js';\nimport { BaseSignerAdapter } from './base-adapter.js';\nimport { buildManagedAccount } from './build-managed-account.js';\n\n/**\n * Wallet features advertised by CLI-backed accounts.\n * Personal message signing is not supported because the `sui keytool sign`\n * command only accepts BCS-serialized TransactionData.\n */\nconst CLI_WALLET_FEATURES = ['sui:signTransaction', 'sui:signAndExecuteTransaction'] as const;\n\n/** Cache TTL for the CLI server accounts fetch (milliseconds). */\nconst ACCOUNTS_CACHE_TTL_MS = 5000;\n\n/** Thrown when the server rejects a request with a 401 or 403 status. */\nclass AuthError extends Error {\n\tconstructor() {\n\t\tsuper('Unauthorized');\n\t\tthis.name = 'AuthError';\n\t}\n}\n\n/** Map CLI `keyScheme` strings to SDK {@link SignatureScheme} values. */\nconst KEY_SCHEME_MAP: Record<string, SignatureScheme> = {\n\ted25519: 'ED25519',\n\tsecp256k1: 'Secp256k1',\n\tsecp256r1: 'Secp256r1',\n};\n\n/** Account metadata returned by the server `/api/v1/accounts` endpoint. */\ninterface ServerAccountInfo {\n\tsuiAddress: string;\n\tpublicBase64Key: string;\n\tkeyScheme: string;\n\talias: string | null;\n}\n\nfunction publicKeyFromSuiBytes(publicBase64Key: string, scheme: SignatureScheme): PublicKey {\n\tconst allBytes = fromBase64(publicBase64Key);\n\tconst rawBytes = allBytes.slice(1);\n\n\tswitch (scheme) {\n\t\tcase 'ED25519':\n\t\t\treturn new Ed25519PublicKey(rawBytes);\n\t\tcase 'Secp256k1':\n\t\t\treturn new Secp256k1PublicKey(rawBytes);\n\t\tcase 'Secp256r1':\n\t\t\treturn new Secp256r1PublicKey(rawBytes);\n\t\tdefault:\n\t\t\tthrow new Error(`Unsupported key scheme: ${scheme}`);\n\t}\n}\n\n/**\n * A {@link Signer} that delegates transaction signing to a server HTTP endpoint\n * backed by `sui keytool sign`. Private keys never enter JavaScript.\n *\n * `signPersonalMessage()` is not supported — `sui keytool sign` only accepts\n * BCS-serialized `TransactionData`.\n */\nexport class CliProxySigner extends Signer {\n\t#address: string;\n\t#publicKey: PublicKey;\n\t#scheme: SignatureScheme;\n\t#serverOrigin: string;\n\t#authToken: string | null;\n\n\tconstructor(options: {\n\t\taddress: string;\n\t\tpublicKey: PublicKey;\n\t\tscheme: SignatureScheme;\n\t\tserverOrigin: string;\n\t\tauthToken?: string | null;\n\t}) {\n\t\tsuper();\n\t\tthis.#address = options.address;\n\t\tthis.#publicKey = options.publicKey;\n\t\tthis.#scheme = options.scheme;\n\t\tthis.#serverOrigin = options.serverOrigin;\n\t\tthis.#authToken = options.authToken ?? null;\n\t}\n\n\tasync sign(_bytes: Uint8Array): Promise<Uint8Array<ArrayBuffer>> {\n\t\tthrow new Error(\n\t\t\t'CliProxySigner does not support direct digest signing. ' +\n\t\t\t\t'Transaction signing is handled via the sui CLI.',\n\t\t);\n\t}\n\n\tgetKeyScheme(): SignatureScheme {\n\t\treturn this.#scheme;\n\t}\n\n\tgetPublicKey(): PublicKey {\n\t\treturn this.#publicKey;\n\t}\n\n\toverride toSuiAddress(): string {\n\t\treturn this.#address;\n\t}\n\n\toverride async signTransaction(bytes: Uint8Array) {\n\t\tconst headers: Record<string, string> = { 'Content-Type': 'application/json' };\n\t\tif (this.#authToken) {\n\t\t\theaders['Authorization'] = `Bearer ${this.#authToken}`;\n\t\t}\n\n\t\tconst res = await fetch(`${this.#serverOrigin}/api/v1/sign-transaction`, {\n\t\t\tmethod: 'POST',\n\t\t\theaders,\n\t\t\tbody: JSON.stringify({\n\t\t\t\taddress: this.#address,\n\t\t\t\ttxBytes: toBase64(bytes),\n\t\t\t}),\n\t\t});\n\n\t\tif (!res.ok) {\n\t\t\tconst body = await res.json().catch(() => ({}));\n\t\t\tthrow new Error(`Transaction signing failed: ${body.error ?? res.statusText}`);\n\t\t}\n\n\t\tconst { suiSignature } = await res.json();\n\t\tif (typeof suiSignature !== 'string' || suiSignature.length === 0) {\n\t\t\tthrow new Error('Transaction signing failed: server returned invalid signature');\n\t\t}\n\t\treturn {\n\t\t\tbytes: toBase64(bytes),\n\t\t\tsignature: suiSignature,\n\t\t};\n\t}\n\n\toverride async signPersonalMessage(_bytes: Uint8Array): Promise<never> {\n\t\tthrow new Error(\n\t\t\t'Personal message signing is not supported in CLI mode. ' +\n\t\t\t\t'The sui keytool sign command only supports TransactionData. ' +\n\t\t\t\t'Use --adapter=webcrypto or --adapter=memory for personal message signing.',\n\t\t);\n\t}\n}\n\n/**\n * {@link SignerAdapter} that delegates signing to a server running the `sui` CLI.\n *\n * Authentication uses a token-in-URL approach: the CLI server prints a URL with\n * a token, which gets stored in `localStorage` for subsequent page loads. Imported\n * account addresses are also persisted so they survive CLI restarts.\n */\nexport class RemoteCliAdapter extends BaseSignerAdapter {\n\treadonly id = 'remote-cli';\n\treadonly name = 'Remote CLI Signer';\n\treadonly allowAutoSign = false;\n\n\tprotected override getDefaultLabel(): string {\n\t\treturn `CLI Account ${this.getAccounts().length + 1}`;\n\t}\n\n\t// Keys are scoped per origin to prevent cross-site leakage on shared localhost setups.\n\t// localStorage is used rather than sessionStorage because popup wallet flows\n\t// (DevWalletClient) may open new tabs that need access to the token.\n\tstatic storageKey(suffix: string): string {\n\t\tconst origin = typeof location !== 'undefined' ? location.origin : 'unknown';\n\t\treturn `dev-wallet:${suffix}:${origin}`;\n\t}\n\n\tstatic get STORAGE_KEY(): string {\n\t\treturn RemoteCliAdapter.storageKey('cli-imported-addresses');\n\t}\n\n\tstatic get TOKEN_KEY(): string {\n\t\treturn RemoteCliAdapter.storageKey('cli-token');\n\t}\n\n\t#serverOrigin: string;\n\t#authToken: string | null = null;\n\t#allServerAccounts: ServerAccountInfo[] = [];\n\t#lastFetch: { time: number; result: ServerAccountInfo[] } | null = null;\n\n\tconstructor(options?: { serverOrigin?: string; token?: string }) {\n\t\tsuper();\n\t\tconst origin = options?.serverOrigin ?? '';\n\t\tif (origin) {\n\t\t\ttry {\n\t\t\t\tnew URL(origin);\n\t\t\t} catch {\n\t\t\t\tthrow new Error(`Invalid serverOrigin URL: \"${origin}\"`);\n\t\t\t}\n\t\t}\n\t\tthis.#serverOrigin = origin;\n\t\tif (options?.token) {\n\t\t\tthis.#authToken = options.token;\n\t\t}\n\t}\n\n\tget isPaired(): boolean {\n\t\treturn this.#authToken !== null;\n\t}\n\n\tasync initialize(): Promise<void> {\n\t\tif (!this.#authToken && typeof localStorage !== 'undefined') {\n\t\t\tconst stored = localStorage.getItem(RemoteCliAdapter.TOKEN_KEY);\n\t\t\tif (stored) {\n\t\t\t\tthis.#authToken = stored;\n\t\t\t}\n\t\t}\n\n\t\tif (this.#authToken) {\n\t\t\ttry {\n\t\t\t\tawait this.#fetchServerAccounts();\n\t\t\t\tawait this.#restoreImportedAccounts();\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof AuthError) {\n\t\t\t\t\tthis.#authToken = null;\n\t\t\t\t\tif (typeof localStorage !== 'undefined') {\n\t\t\t\t\t\tlocalStorage.removeItem(RemoteCliAdapter.TOKEN_KEY);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('[dev-wallet] CLI adapter initialization failed:', error);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tasync listAvailableAccounts(): Promise<\n\t\tArray<{ address: string; scheme: string; alias: string | null }>\n\t> {\n\t\tawait this.#fetchServerAccounts();\n\t\tconst importedAddresses = new Set(this._accounts.map((a) => a.address));\n\t\treturn this.#allServerAccounts\n\t\t\t.filter((info) => {\n\t\t\t\tconst scheme = KEY_SCHEME_MAP[info.keyScheme];\n\t\t\t\treturn scheme && !importedAddresses.has(info.suiAddress);\n\t\t\t})\n\t\t\t.map((info) => ({\n\t\t\t\taddress: info.suiAddress,\n\t\t\t\tscheme: info.keyScheme,\n\t\t\t\talias: info.alias,\n\t\t\t}));\n\t}\n\n\tasync importAccount(options: ImportAccountOptions): Promise<ManagedAccount> {\n\t\tconst address = options.address;\n\t\tif (!address) {\n\t\t\tthrow new Error('Remote CLI adapter requires an address to import');\n\t\t}\n\n\t\tif (this._accounts.some((a) => a.address === address)) {\n\t\t\tthrow new Error(`Account ${address} is already imported`);\n\t\t}\n\n\t\tawait this.#fetchServerAccounts();\n\t\tconst info = this.#allServerAccounts.find((a) => a.suiAddress === address);\n\t\tif (!info) {\n\t\t\tthrow new Error(`Account ${address} not found on server`);\n\t\t}\n\n\t\tconst scheme = KEY_SCHEME_MAP[info.keyScheme];\n\t\tif (!scheme) {\n\t\t\tthrow new Error(`Unsupported key scheme: ${info.keyScheme}`);\n\t\t}\n\n\t\tconst account = this.#serverAccountToManaged(info, scheme, options.label);\n\t\tthis.addAccount(account);\n\t\tthis.#saveImportedAddresses();\n\t\treturn account;\n\t}\n\n\tasync removeAccount(address: string): Promise<boolean> {\n\t\tconst removed = this.removeAccountByAddress(address);\n\t\tif (removed) {\n\t\t\tthis.#saveImportedAddresses();\n\t\t}\n\t\treturn removed;\n\t}\n\n\toverride destroy(): void {\n\t\tthis.#allServerAccounts = [];\n\t\tthis.#authToken = null;\n\t\tif (typeof localStorage !== 'undefined') {\n\t\t\tlocalStorage.removeItem(RemoteCliAdapter.TOKEN_KEY);\n\t\t\tlocalStorage.removeItem(RemoteCliAdapter.STORAGE_KEY);\n\t\t}\n\t\tsuper.destroy();\n\t}\n\n\t#authHeaders(): Record<string, string> {\n\t\tconst headers: Record<string, string> = { 'Content-Type': 'application/json' };\n\t\tif (this.#authToken) {\n\t\t\theaders['Authorization'] = `Bearer ${this.#authToken}`;\n\t\t}\n\t\treturn headers;\n\t}\n\n\tasync #fetchServerAccounts(forceRefresh = false): Promise<void> {\n\t\tif (\n\t\t\t!forceRefresh &&\n\t\t\tthis.#lastFetch &&\n\t\t\tDate.now() - this.#lastFetch.time < ACCOUNTS_CACHE_TTL_MS\n\t\t) {\n\t\t\tthis.#allServerAccounts = this.#lastFetch.result;\n\t\t\treturn;\n\t\t}\n\t\tconst res = await fetch(`${this.#serverOrigin}/api/v1/accounts`, {\n\t\t\theaders: this.#authHeaders(),\n\t\t});\n\t\tif (res.status === 401 || res.status === 403) {\n\t\t\tthrow new AuthError();\n\t\t}\n\t\tif (!res.ok) {\n\t\t\tthrow new Error(`Failed to fetch accounts: ${res.statusText}`);\n\t\t}\n\n\t\tconst { accounts } = (await res.json()) as { accounts: ServerAccountInfo[] };\n\t\tthis.#allServerAccounts = accounts;\n\t\tthis.#lastFetch = { time: Date.now(), result: accounts };\n\t}\n\n\tasync #restoreImportedAccounts(): Promise<void> {\n\t\tconst saved = this.#loadImportedAddresses();\n\t\tif (saved.length === 0) return;\n\n\t\tconst existingAddresses = new Set(this.getAccounts().map((a) => a.address));\n\t\tconst restored: ManagedAccount[] = [];\n\n\t\tfor (const address of saved) {\n\t\t\tif (existingAddresses.has(address)) continue;\n\n\t\t\tconst info = this.#allServerAccounts.find((a) => a.suiAddress === address);\n\t\t\tif (!info) continue; // Account no longer on server — skip\n\n\t\t\tconst scheme = KEY_SCHEME_MAP[info.keyScheme];\n\t\t\tif (!scheme) continue;\n\n\t\t\trestored.push(this.#serverAccountToManaged(info, scheme));\n\t\t}\n\n\t\tif (restored.length > 0) {\n\t\t\tthis.setInitialAccounts([...this.getAccounts(), ...restored]);\n\t\t}\n\t}\n\n\t#loadImportedAddresses(): string[] {\n\t\tif (typeof localStorage === 'undefined') return [];\n\t\ttry {\n\t\t\tconst raw = localStorage.getItem(RemoteCliAdapter.STORAGE_KEY);\n\t\t\tif (!raw) return [];\n\t\t\tconst parsed: unknown = JSON.parse(raw);\n\t\t\tif (!Array.isArray(parsed)) return [];\n\t\t\treturn parsed.filter((v): v is string => typeof v === 'string');\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\t#saveImportedAddresses(): void {\n\t\tif (typeof localStorage === 'undefined') return;\n\t\tconst addresses = this._accounts.map((a) => a.address);\n\t\tlocalStorage.setItem(RemoteCliAdapter.STORAGE_KEY, JSON.stringify(addresses));\n\t}\n\n\t#serverAccountToManaged(\n\t\tinfo: ServerAccountInfo,\n\t\tscheme: SignatureScheme,\n\t\tlabel?: string,\n\t): ManagedAccount {\n\t\tconst publicKey = publicKeyFromSuiBytes(info.publicBase64Key, scheme);\n\n\t\tconst signer = new CliProxySigner({\n\t\t\taddress: info.suiAddress,\n\t\t\tpublicKey,\n\t\t\tscheme,\n\t\t\tserverOrigin: this.#serverOrigin,\n\t\t\tauthToken: this.#authToken,\n\t\t});\n\n\t\tconst accountLabel = label ?? info.alias ?? this.getDefaultLabel();\n\n\t\treturn buildManagedAccount(signer, info.suiAddress, accountLabel, CLI_WALLET_FEATURES);\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;AAkBA,MAAM,sBAAsB,CAAC,uBAAuB,gCAAgC;;AAGpF,MAAM,wBAAwB;;AAG9B,IAAM,YAAN,cAAwB,MAAM;CAC7B,cAAc;AACb,QAAM,eAAe;AACrB,OAAK,OAAO;;;;AAKd,MAAM,iBAAkD;CACvD,SAAS;CACT,WAAW;CACX,WAAW;CACX;AAUD,SAAS,sBAAsB,iBAAyB,QAAoC;CAC3F,MAAM,WAAW,WAAW,gBAAgB;CAC5C,MAAM,WAAW,SAAS,MAAM,EAAE;AAElC,SAAQ,QAAR;EACC,KAAK,UACJ,QAAO,IAAI,iBAAiB,SAAS;EACtC,KAAK,YACJ,QAAO,IAAI,mBAAmB,SAAS;EACxC,KAAK,YACJ,QAAO,IAAI,mBAAmB,SAAS;EACxC,QACC,OAAM,IAAI,MAAM,2BAA2B,SAAS;;;;;;;;;;AAWvD,IAAa,iBAAb,cAAoC,OAAO;CAC1C;CACA;CACA;CACA;CACA;CAEA,YAAY,SAMT;AACF,SAAO;AACP,QAAKA,UAAW,QAAQ;AACxB,QAAKC,YAAa,QAAQ;AAC1B,QAAKC,SAAU,QAAQ;AACvB,QAAKC,eAAgB,QAAQ;AAC7B,QAAKC,YAAa,QAAQ,aAAa;;CAGxC,MAAM,KAAK,QAAsD;AAChE,QAAM,IAAI,MACT,4DACC,kDACD;;CAGF,eAAgC;AAC/B,SAAO,MAAKF;;CAGb,eAA0B;AACzB,SAAO,MAAKD;;CAGb,AAAS,eAAuB;AAC/B,SAAO,MAAKD;;CAGb,MAAe,gBAAgB,OAAmB;EACjD,MAAM,UAAkC,EAAE,gBAAgB,oBAAoB;AAC9E,MAAI,MAAKI,WAAY;AACpB,WAAQ,mBAAmB,UAAU,MAAKA;;EAG3C,MAAM,MAAM,MAAM,MAAM,GAAG,MAAKD,aAAc,2BAA2B;GACxE,QAAQ;GACR;GACA,MAAM,KAAK,UAAU;IACpB,SAAS,MAAKH;IACd,SAAS,SAAS,MAAM;IACxB,CAAC;GACF,CAAC;AAEF,MAAI,CAAC,IAAI,IAAI;GACZ,MAAM,OAAO,MAAM,IAAI,MAAM,CAAC,aAAa,EAAE,EAAE;AAC/C,SAAM,IAAI,MAAM,+BAA+B,KAAK,SAAS,IAAI,aAAa;;EAG/E,MAAM,EAAE,iBAAiB,MAAM,IAAI,MAAM;AACzC,MAAI,OAAO,iBAAiB,YAAY,aAAa,WAAW,GAAG;AAClE,SAAM,IAAI,MAAM,gEAAgE;;AAEjF,SAAO;GACN,OAAO,SAAS,MAAM;GACtB,WAAW;GACX;;CAGF,MAAe,oBAAoB,QAAoC;AACtE,QAAM,IAAI,MACT,4DACC,iEACA,4EACD;;;;;;;;;;AAWH,IAAa,mBAAb,MAAa,yBAAyB,kBAAkB;CAKvD,AAAmB,kBAA0B;AAC5C,SAAO,eAAe,KAAK,aAAa,CAAC,SAAS;;CAMnD,OAAO,WAAW,QAAwB;EACzC,MAAM,SAAS,OAAO,aAAa,cAAc,SAAS,SAAS;AACnE,SAAO,cAAc,OAAO,GAAG;;CAGhC,WAAW,cAAsB;AAChC,SAAO,iBAAiB,WAAW,yBAAyB;;CAG7D,WAAW,YAAoB;AAC9B,SAAO,iBAAiB,WAAW,YAAY;;CAGhD;CACA,aAA4B;CAC5B,qBAA0C,EAAE;CAC5C,aAAmE;CAEnE,YAAY,SAAqD;AAChE,SAAO;YA9BM;cACE;uBACS;EA6BxB,MAAM,SAAS,SAAS,gBAAgB;AACxC,MAAI,QAAQ;AACX,OAAI;AACH,QAAI,IAAI,OAAO;WACR;AACP,UAAM,IAAI,MAAM,8BAA8B,OAAO,GAAG;;;AAG1D,QAAKG,eAAgB;AACrB,MAAI,SAAS,OAAO;AACnB,SAAKC,YAAa,QAAQ;;;CAI5B,IAAI,WAAoB;AACvB,SAAO,MAAKA,cAAe;;CAG5B,MAAM,aAA4B;AACjC,MAAI,CAAC,MAAKA,aAAc,OAAO,iBAAiB,aAAa;GAC5D,MAAM,SAAS,aAAa,QAAQ,iBAAiB,UAAU;AAC/D,OAAI,QAAQ;AACX,UAAKA,YAAa;;;AAIpB,MAAI,MAAKA,WAAY;AACpB,OAAI;AACH,UAAM,MAAKC,qBAAsB;AACjC,UAAM,MAAKC,yBAA0B;YAC7B,OAAO;AACf,QAAI,iBAAiB,WAAW;AAC/B,WAAKF,YAAa;AAClB,SAAI,OAAO,iBAAiB,aAAa;AACxC,mBAAa,WAAW,iBAAiB,UAAU;;WAE9C;AACN,aAAQ,KAAK,mDAAmD,MAAM;;;;;CAM1E,MAAM,wBAEJ;AACD,QAAM,MAAKC,qBAAsB;EACjC,MAAM,oBAAoB,IAAI,IAAI,KAAK,UAAU,KAAK,MAAM,EAAE,QAAQ,CAAC;AACvE,SAAO,MAAKE,kBACV,QAAQ,SAAS;GACjB,MAAM,SAAS,eAAe,KAAK;AACnC,UAAO,UAAU,CAAC,kBAAkB,IAAI,KAAK,WAAW;IACvD,CACD,KAAK,UAAU;GACf,SAAS,KAAK;GACd,QAAQ,KAAK;GACb,OAAO,KAAK;GACZ,EAAE;;CAGL,MAAM,cAAc,SAAwD;EAC3E,MAAM,UAAU,QAAQ;AACxB,MAAI,CAAC,SAAS;AACb,SAAM,IAAI,MAAM,mDAAmD;;AAGpE,MAAI,KAAK,UAAU,MAAM,MAAM,EAAE,YAAY,QAAQ,EAAE;AACtD,SAAM,IAAI,MAAM,WAAW,QAAQ,sBAAsB;;AAG1D,QAAM,MAAKF,qBAAsB;EACjC,MAAM,OAAO,MAAKE,kBAAmB,MAAM,MAAM,EAAE,eAAe,QAAQ;AAC1E,MAAI,CAAC,MAAM;AACV,SAAM,IAAI,MAAM,WAAW,QAAQ,sBAAsB;;EAG1D,MAAM,SAAS,eAAe,KAAK;AACnC,MAAI,CAAC,QAAQ;AACZ,SAAM,IAAI,MAAM,2BAA2B,KAAK,YAAY;;EAG7D,MAAM,UAAU,MAAKC,uBAAwB,MAAM,QAAQ,QAAQ,MAAM;AACzE,OAAK,WAAW,QAAQ;AACxB,QAAKC,uBAAwB;AAC7B,SAAO;;CAGR,MAAM,cAAc,SAAmC;EACtD,MAAM,UAAU,KAAK,uBAAuB,QAAQ;AACpD,MAAI,SAAS;AACZ,SAAKA,uBAAwB;;AAE9B,SAAO;;CAGR,AAAS,UAAgB;AACxB,QAAKF,oBAAqB,EAAE;AAC5B,QAAKH,YAAa;AAClB,MAAI,OAAO,iBAAiB,aAAa;AACxC,gBAAa,WAAW,iBAAiB,UAAU;AACnD,gBAAa,WAAW,iBAAiB,YAAY;;AAEtD,QAAM,SAAS;;CAGhB,eAAuC;EACtC,MAAM,UAAkC,EAAE,gBAAgB,oBAAoB;AAC9E,MAAI,MAAKA,WAAY;AACpB,WAAQ,mBAAmB,UAAU,MAAKA;;AAE3C,SAAO;;CAGR,OAAMC,oBAAqB,eAAe,OAAsB;AAC/D,MACC,CAAC,gBACD,MAAKK,aACL,KAAK,KAAK,GAAG,MAAKA,UAAW,OAAO,uBACnC;AACD,SAAKH,oBAAqB,MAAKG,UAAW;AAC1C;;EAED,MAAM,MAAM,MAAM,MAAM,GAAG,MAAKP,aAAc,mBAAmB,EAChE,SAAS,MAAKQ,aAAc,EAC5B,CAAC;AACF,MAAI,IAAI,WAAW,OAAO,IAAI,WAAW,KAAK;AAC7C,SAAM,IAAI,WAAW;;AAEtB,MAAI,CAAC,IAAI,IAAI;AACZ,SAAM,IAAI,MAAM,6BAA6B,IAAI,aAAa;;EAG/D,MAAM,EAAE,aAAc,MAAM,IAAI,MAAM;AACtC,QAAKJ,oBAAqB;AAC1B,QAAKG,YAAa;GAAE,MAAM,KAAK,KAAK;GAAE,QAAQ;GAAU;;CAGzD,OAAMJ,0BAA0C;EAC/C,MAAM,QAAQ,MAAKM,uBAAwB;AAC3C,MAAI,MAAM,WAAW,EAAG;EAExB,MAAM,oBAAoB,IAAI,IAAI,KAAK,aAAa,CAAC,KAAK,MAAM,EAAE,QAAQ,CAAC;EAC3E,MAAM,WAA6B,EAAE;AAErC,OAAK,MAAM,WAAW,OAAO;AAC5B,OAAI,kBAAkB,IAAI,QAAQ,CAAE;GAEpC,MAAM,OAAO,MAAKL,kBAAmB,MAAM,MAAM,EAAE,eAAe,QAAQ;AAC1E,OAAI,CAAC,KAAM;GAEX,MAAM,SAAS,eAAe,KAAK;AACnC,OAAI,CAAC,OAAQ;AAEb,YAAS,KAAK,MAAKC,uBAAwB,MAAM,OAAO,CAAC;;AAG1D,MAAI,SAAS,SAAS,GAAG;AACxB,QAAK,mBAAmB,CAAC,GAAG,KAAK,aAAa,EAAE,GAAG,SAAS,CAAC;;;CAI/D,yBAAmC;AAClC,MAAI,OAAO,iBAAiB,YAAa,QAAO,EAAE;AAClD,MAAI;GACH,MAAM,MAAM,aAAa,QAAQ,iBAAiB,YAAY;AAC9D,OAAI,CAAC,IAAK,QAAO,EAAE;GACnB,MAAM,SAAkB,KAAK,MAAM,IAAI;AACvC,OAAI,CAAC,MAAM,QAAQ,OAAO,CAAE,QAAO,EAAE;AACrC,UAAO,OAAO,QAAQ,MAAmB,OAAO,MAAM,SAAS;UACxD;AACP,UAAO,EAAE;;;CAIX,yBAA+B;AAC9B,MAAI,OAAO,iBAAiB,YAAa;EACzC,MAAM,YAAY,KAAK,UAAU,KAAK,MAAM,EAAE,QAAQ;AACtD,eAAa,QAAQ,iBAAiB,aAAa,KAAK,UAAU,UAAU,CAAC;;CAG9E,wBACC,MACA,QACA,OACiB;EACjB,MAAM,YAAY,sBAAsB,KAAK,iBAAiB,OAAO;EAErE,MAAM,SAAS,IAAI,eAAe;GACjC,SAAS,KAAK;GACd;GACA;GACA,cAAc,MAAKL;GACnB,WAAW,MAAKC;GAChB,CAAC;EAEF,MAAM,eAAe,SAAS,KAAK,SAAS,KAAK,iBAAiB;AAElE,SAAO,oBAAoB,QAAQ,KAAK,YAAY,cAAc,oBAAoB"}
1
+ {"version":3,"file":"remote-cli-adapter.mjs","names":["#address","#publicKey","#scheme","#serverOrigin","#authToken","#fetchServerAccounts","#restoreImportedAccounts","#allServerAccounts","#serverAccountToManaged","#saveImportedAddresses","#lastFetch","#authHeaders","#loadImportedAddresses"],"sources":["../../src/adapters/remote-cli-adapter.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Signer } from '@mysten/sui/cryptography';\nimport type { PublicKey, SignatureScheme } from '@mysten/sui/cryptography';\nimport { Ed25519PublicKey } from '@mysten/sui/keypairs/ed25519';\nimport { Secp256k1PublicKey } from '@mysten/sui/keypairs/secp256k1';\nimport { Secp256r1PublicKey } from '@mysten/sui/keypairs/secp256r1';\nimport { fromBase64, toBase64 } from '@mysten/sui/utils';\nimport type { ImportAccountOptions, ManagedAccount } from '../types.js';\nimport { BaseSignerAdapter } from './base-adapter.js';\nimport { buildManagedAccount } from './build-managed-account.js';\n\n/**\n * Wallet features advertised by CLI-backed accounts.\n * Personal message signing is not supported because the `sui keytool sign`\n * command only accepts BCS-serialized TransactionData.\n */\nconst CLI_WALLET_FEATURES = ['sui:signTransaction', 'sui:signAndExecuteTransaction'] as const;\n\n/** Cache TTL for the CLI server accounts fetch (milliseconds). */\nconst ACCOUNTS_CACHE_TTL_MS = 5000;\n\n/** Thrown when the server rejects a request with a 401 or 403 status. */\nclass AuthError extends Error {\n\tconstructor() {\n\t\tsuper('Unauthorized');\n\t\tthis.name = 'AuthError';\n\t}\n}\n\n/** Map CLI `keyScheme` strings to SDK {@link SignatureScheme} values. */\nconst KEY_SCHEME_MAP: Record<string, SignatureScheme> = {\n\ted25519: 'ED25519',\n\tsecp256k1: 'Secp256k1',\n\tsecp256r1: 'Secp256r1',\n};\n\n/** Account metadata returned by the server `/api/v1/accounts` endpoint. */\ninterface ServerAccountInfo {\n\tsuiAddress: string;\n\tpublicBase64Key: string;\n\tkeyScheme: string;\n\talias: string | null;\n}\n\nfunction publicKeyFromSuiBytes(publicBase64Key: string, scheme: SignatureScheme): PublicKey {\n\tconst allBytes = fromBase64(publicBase64Key);\n\tconst rawBytes = allBytes.slice(1);\n\n\tswitch (scheme) {\n\t\tcase 'ED25519':\n\t\t\treturn new Ed25519PublicKey(rawBytes);\n\t\tcase 'Secp256k1':\n\t\t\treturn new Secp256k1PublicKey(rawBytes);\n\t\tcase 'Secp256r1':\n\t\t\treturn new Secp256r1PublicKey(rawBytes);\n\t\tdefault:\n\t\t\tthrow new Error(`Unsupported key scheme: ${scheme}`);\n\t}\n}\n\n/**\n * A {@link Signer} that delegates transaction signing to a server HTTP endpoint\n * backed by `sui keytool sign`. Private keys never enter JavaScript.\n *\n * `signPersonalMessage()` is not supported — `sui keytool sign` only accepts\n * BCS-serialized `TransactionData`.\n */\nexport class CliProxySigner extends Signer {\n\t#address: string;\n\t#publicKey: PublicKey;\n\t#scheme: SignatureScheme;\n\t#serverOrigin: string;\n\t#authToken: string | null;\n\n\tconstructor(options: {\n\t\taddress: string;\n\t\tpublicKey: PublicKey;\n\t\tscheme: SignatureScheme;\n\t\tserverOrigin: string;\n\t\tauthToken?: string | null;\n\t}) {\n\t\tsuper();\n\t\tthis.#address = options.address;\n\t\tthis.#publicKey = options.publicKey;\n\t\tthis.#scheme = options.scheme;\n\t\tthis.#serverOrigin = options.serverOrigin;\n\t\tthis.#authToken = options.authToken ?? null;\n\t}\n\n\tasync sign(_bytes: Uint8Array): Promise<Uint8Array<ArrayBuffer>> {\n\t\tthrow new Error(\n\t\t\t'CliProxySigner does not support direct digest signing. ' +\n\t\t\t\t'Transaction signing is handled via the sui CLI.',\n\t\t);\n\t}\n\n\tgetKeyScheme(): SignatureScheme {\n\t\treturn this.#scheme;\n\t}\n\n\tgetPublicKey(): PublicKey {\n\t\treturn this.#publicKey;\n\t}\n\n\toverride toSuiAddress(): string {\n\t\treturn this.#address;\n\t}\n\n\toverride async signTransaction(bytes: Uint8Array) {\n\t\tconst headers: Record<string, string> = { 'Content-Type': 'application/json' };\n\t\tif (this.#authToken) {\n\t\t\theaders['Authorization'] = `Bearer ${this.#authToken}`;\n\t\t}\n\n\t\tconst res = await fetch(`${this.#serverOrigin}/api/v1/sign-transaction`, {\n\t\t\tmethod: 'POST',\n\t\t\theaders,\n\t\t\tbody: JSON.stringify({\n\t\t\t\taddress: this.#address,\n\t\t\t\ttxBytes: toBase64(bytes),\n\t\t\t}),\n\t\t});\n\n\t\tif (!res.ok) {\n\t\t\tconst body = await res.json().catch(() => ({}));\n\t\t\tthrow new Error(`Transaction signing failed: ${body.error ?? res.statusText}`);\n\t\t}\n\n\t\tconst { suiSignature } = await res.json();\n\t\tif (typeof suiSignature !== 'string' || suiSignature.length === 0) {\n\t\t\tthrow new Error('Transaction signing failed: server returned invalid signature');\n\t\t}\n\t\treturn {\n\t\t\tbytes: toBase64(bytes),\n\t\t\tsignature: suiSignature,\n\t\t};\n\t}\n\n\toverride async signPersonalMessage(_bytes: Uint8Array): Promise<never> {\n\t\tthrow new Error(\n\t\t\t'Personal message signing is not supported in CLI mode. ' +\n\t\t\t\t'The sui keytool sign command only supports TransactionData. ' +\n\t\t\t\t'Use --adapter=webcrypto or --adapter=memory for personal message signing.',\n\t\t);\n\t}\n}\n\n/**\n * {@link SignerAdapter} that delegates signing to a server running the `sui` CLI.\n *\n * Authentication uses a token-in-URL approach: the CLI server prints a URL with\n * a token, which gets stored in `localStorage` for subsequent page loads. Imported\n * account addresses are also persisted so they survive CLI restarts.\n */\nexport class RemoteCliAdapter extends BaseSignerAdapter {\n\treadonly id = 'remote-cli';\n\treadonly name = 'Remote CLI Signer';\n\treadonly allowAutoSign = false;\n\n\tprotected override getDefaultLabel(): string {\n\t\treturn `CLI Account ${this.getAccounts().length + 1}`;\n\t}\n\n\t// Keys are scoped per origin to prevent cross-site leakage on shared localhost setups.\n\t// localStorage is used rather than sessionStorage because popup wallet flows\n\t// (DevWalletClient) may open new tabs that need access to the token.\n\tstatic storageKey(suffix: string): string {\n\t\tconst origin = typeof location !== 'undefined' ? location.origin : 'unknown';\n\t\treturn `dev-wallet:${suffix}:${origin}`;\n\t}\n\n\tstatic get STORAGE_KEY(): string {\n\t\treturn RemoteCliAdapter.storageKey('cli-imported-addresses');\n\t}\n\n\tstatic get TOKEN_KEY(): string {\n\t\treturn RemoteCliAdapter.storageKey('cli-token');\n\t}\n\n\t#serverOrigin: string;\n\t#authToken: string | null = null;\n\t#allServerAccounts: ServerAccountInfo[] = [];\n\t#lastFetch: { time: number; result: ServerAccountInfo[] } | null = null;\n\n\tconstructor(options?: { serverOrigin?: string; token?: string }) {\n\t\tsuper();\n\t\tconst origin = options?.serverOrigin ?? '';\n\t\tif (origin) {\n\t\t\ttry {\n\t\t\t\tnew URL(origin);\n\t\t\t} catch {\n\t\t\t\tthrow new Error(`Invalid serverOrigin URL: \"${origin}\"`);\n\t\t\t}\n\t\t}\n\t\tthis.#serverOrigin = origin;\n\t\tif (options?.token) {\n\t\t\tthis.#authToken = options.token;\n\t\t}\n\t}\n\n\tget isPaired(): boolean {\n\t\treturn this.#authToken !== null;\n\t}\n\n\tasync initialize(): Promise<void> {\n\t\tif (!this.#authToken && typeof localStorage !== 'undefined') {\n\t\t\tconst stored = localStorage.getItem(RemoteCliAdapter.TOKEN_KEY);\n\t\t\tif (stored) {\n\t\t\t\tthis.#authToken = stored;\n\t\t\t}\n\t\t}\n\n\t\tif (this.#authToken) {\n\t\t\ttry {\n\t\t\t\tawait this.#fetchServerAccounts();\n\t\t\t\tawait this.#restoreImportedAccounts();\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof AuthError) {\n\t\t\t\t\tthis.#authToken = null;\n\t\t\t\t\tif (typeof localStorage !== 'undefined') {\n\t\t\t\t\t\tlocalStorage.removeItem(RemoteCliAdapter.TOKEN_KEY);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('[dev-wallet] CLI adapter initialization failed:', error);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tasync listAvailableAccounts(): Promise<\n\t\tArray<{ address: string; scheme: string; alias: string | null }>\n\t> {\n\t\tawait this.#fetchServerAccounts();\n\t\tconst importedAddresses = new Set(this._accounts.map((a) => a.address));\n\t\treturn this.#allServerAccounts\n\t\t\t.filter((info) => {\n\t\t\t\tconst scheme = KEY_SCHEME_MAP[info.keyScheme];\n\t\t\t\treturn scheme && !importedAddresses.has(info.suiAddress);\n\t\t\t})\n\t\t\t.map((info) => ({\n\t\t\t\taddress: info.suiAddress,\n\t\t\t\tscheme: info.keyScheme,\n\t\t\t\talias: info.alias,\n\t\t\t}));\n\t}\n\n\tasync importAccount(options: ImportAccountOptions): Promise<ManagedAccount> {\n\t\tconst address = options.address;\n\t\tif (!address) {\n\t\t\tthrow new Error('Remote CLI adapter requires an address to import');\n\t\t}\n\n\t\tif (this._accounts.some((a) => a.address === address)) {\n\t\t\tthrow new Error(`Account ${address} is already imported`);\n\t\t}\n\n\t\tawait this.#fetchServerAccounts();\n\t\tconst info = this.#allServerAccounts.find((a) => a.suiAddress === address);\n\t\tif (!info) {\n\t\t\tthrow new Error(`Account ${address} not found on server`);\n\t\t}\n\n\t\tconst scheme = KEY_SCHEME_MAP[info.keyScheme];\n\t\tif (!scheme) {\n\t\t\tthrow new Error(`Unsupported key scheme: ${info.keyScheme}`);\n\t\t}\n\n\t\tconst account = this.#serverAccountToManaged(info, scheme, options.label);\n\t\tthis.addAccount(account);\n\t\tthis.#saveImportedAddresses();\n\t\treturn account;\n\t}\n\n\tasync removeAccount(address: string): Promise<boolean> {\n\t\tconst removed = this.removeAccountByAddress(address);\n\t\tif (removed) {\n\t\t\tthis.#saveImportedAddresses();\n\t\t}\n\t\treturn removed;\n\t}\n\n\toverride destroy(): void {\n\t\tthis.#allServerAccounts = [];\n\t\tthis.#authToken = null;\n\t\tif (typeof localStorage !== 'undefined') {\n\t\t\tlocalStorage.removeItem(RemoteCliAdapter.TOKEN_KEY);\n\t\t\tlocalStorage.removeItem(RemoteCliAdapter.STORAGE_KEY);\n\t\t}\n\t\tsuper.destroy();\n\t}\n\n\t#authHeaders(): Record<string, string> {\n\t\tconst headers: Record<string, string> = { 'Content-Type': 'application/json' };\n\t\tif (this.#authToken) {\n\t\t\theaders['Authorization'] = `Bearer ${this.#authToken}`;\n\t\t}\n\t\treturn headers;\n\t}\n\n\tasync #fetchServerAccounts(forceRefresh = false): Promise<void> {\n\t\tif (\n\t\t\t!forceRefresh &&\n\t\t\tthis.#lastFetch &&\n\t\t\tDate.now() - this.#lastFetch.time < ACCOUNTS_CACHE_TTL_MS\n\t\t) {\n\t\t\tthis.#allServerAccounts = this.#lastFetch.result;\n\t\t\treturn;\n\t\t}\n\t\tconst res = await fetch(`${this.#serverOrigin}/api/v1/accounts`, {\n\t\t\theaders: this.#authHeaders(),\n\t\t});\n\t\tif (res.status === 401 || res.status === 403) {\n\t\t\tthrow new AuthError();\n\t\t}\n\t\tif (!res.ok) {\n\t\t\tthrow new Error(`Failed to fetch accounts: ${res.statusText}`);\n\t\t}\n\n\t\tconst { accounts } = (await res.json()) as { accounts: ServerAccountInfo[] };\n\t\tthis.#allServerAccounts = accounts;\n\t\tthis.#lastFetch = { time: Date.now(), result: accounts };\n\t}\n\n\tasync #restoreImportedAccounts(): Promise<void> {\n\t\tconst saved = this.#loadImportedAddresses();\n\t\tif (saved.length === 0) return;\n\n\t\tconst existingAddresses = new Set(this.getAccounts().map((a) => a.address));\n\t\tconst restored: ManagedAccount[] = [];\n\n\t\tfor (const address of saved) {\n\t\t\tif (existingAddresses.has(address)) continue;\n\n\t\t\tconst info = this.#allServerAccounts.find((a) => a.suiAddress === address);\n\t\t\tif (!info) continue; // Account no longer on server — skip\n\n\t\t\tconst scheme = KEY_SCHEME_MAP[info.keyScheme];\n\t\t\tif (!scheme) continue;\n\n\t\t\trestored.push(this.#serverAccountToManaged(info, scheme));\n\t\t}\n\n\t\tif (restored.length > 0) {\n\t\t\tthis.setInitialAccounts([...this.getAccounts(), ...restored]);\n\t\t}\n\t}\n\n\t#loadImportedAddresses(): string[] {\n\t\tif (typeof localStorage === 'undefined') return [];\n\t\ttry {\n\t\t\tconst raw = localStorage.getItem(RemoteCliAdapter.STORAGE_KEY);\n\t\t\tif (!raw) return [];\n\t\t\tconst parsed: unknown = JSON.parse(raw);\n\t\t\tif (!Array.isArray(parsed)) return [];\n\t\t\treturn parsed.filter((v): v is string => typeof v === 'string');\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\t#saveImportedAddresses(): void {\n\t\tif (typeof localStorage === 'undefined') return;\n\t\tconst addresses = this._accounts.map((a) => a.address);\n\t\tlocalStorage.setItem(RemoteCliAdapter.STORAGE_KEY, JSON.stringify(addresses));\n\t}\n\n\t#serverAccountToManaged(\n\t\tinfo: ServerAccountInfo,\n\t\tscheme: SignatureScheme,\n\t\tlabel?: string,\n\t): ManagedAccount {\n\t\tconst publicKey = publicKeyFromSuiBytes(info.publicBase64Key, scheme);\n\n\t\tconst signer = new CliProxySigner({\n\t\t\taddress: info.suiAddress,\n\t\t\tpublicKey,\n\t\t\tscheme,\n\t\t\tserverOrigin: this.#serverOrigin,\n\t\t\tauthToken: this.#authToken,\n\t\t});\n\n\t\tconst accountLabel = label ?? info.alias ?? this.getDefaultLabel();\n\n\t\treturn buildManagedAccount(signer, info.suiAddress, accountLabel, CLI_WALLET_FEATURES);\n\t}\n}\n"],"mappings":"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"}
@@ -2,7 +2,6 @@ import { buildManagedAccount } from "./build-managed-account.mjs";
2
2
  import { BaseSignerAdapter } from "./base-adapter.mjs";
3
3
  import { IDBStore } from "./idb-store.mjs";
4
4
  import { WebCryptoSigner } from "@mysten/signers/webcrypto";
5
-
6
5
  //#region src/adapters/webcrypto-adapter.ts
7
6
  const DEFAULT_DB_NAME = "dev-wallet-webcrypto";
8
7
  const DEFAULT_STORE_NAME = "accounts";
@@ -36,8 +35,7 @@ var WebCryptoSignerAdapter = class extends BaseSignerAdapter {
36
35
  async createAccount(options) {
37
36
  const signer = await WebCryptoSigner.generate();
38
37
  const address = signer.getPublicKey().toSuiAddress();
39
- const label = options?.label ?? this.getDefaultLabel();
40
- const managedAccount = buildManagedAccount(signer, address, label);
38
+ const managedAccount = buildManagedAccount(signer, address, options?.label ?? this.getDefaultLabel());
41
39
  await this.#store.set(address, signer.export());
42
40
  this.addAccount(managedAccount);
43
41
  await this.#saveMeta();
@@ -62,7 +60,7 @@ var WebCryptoSignerAdapter = class extends BaseSignerAdapter {
62
60
  await this.#store.set(META_KEY, meta);
63
61
  }
64
62
  };
65
-
66
63
  //#endregion
67
64
  export { WebCryptoSignerAdapter };
65
+
68
66
  //# sourceMappingURL=webcrypto-adapter.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"webcrypto-adapter.mjs","names":["#store","#saveMeta"],"sources":["../../src/adapters/webcrypto-adapter.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ExportedWebCryptoKeypair } from '@mysten/signers/webcrypto';\nimport { WebCryptoSigner } from '@mysten/signers/webcrypto';\n\nimport type { CreateAccountOptions, ManagedAccount } from '../types.js';\nimport { BaseSignerAdapter } from './base-adapter.js';\nimport { buildManagedAccount } from './build-managed-account.js';\nimport { IDBStore } from './idb-store.js';\n\ninterface StoredAccountMeta {\n\taddress: string;\n\tlabel: string;\n}\n\nconst DEFAULT_DB_NAME = 'dev-wallet-webcrypto';\nconst DEFAULT_STORE_NAME = 'accounts';\nconst META_KEY = '__account_meta__';\n\nexport class WebCryptoSignerAdapter extends BaseSignerAdapter {\n\treadonly id = 'webcrypto';\n\treadonly name = 'WebCrypto Signer';\n\n\t#store: IDBStore;\n\n\tconstructor(options?: { dbName?: string; storeName?: string }) {\n\t\tsuper();\n\t\tthis.#store = new IDBStore(\n\t\t\toptions?.dbName ?? DEFAULT_DB_NAME,\n\t\t\toptions?.storeName ?? DEFAULT_STORE_NAME,\n\t\t);\n\t}\n\n\tasync initialize(): Promise<void> {\n\t\tconst allEntries = await this.#store.entries<\n\t\t\tstring,\n\t\t\tExportedWebCryptoKeypair | StoredAccountMeta[]\n\t\t>();\n\t\tconst meta: StoredAccountMeta[] = (await this.#store.get<StoredAccountMeta[]>(META_KEY)) ?? [];\n\n\t\tconst accounts = [];\n\n\t\tfor (const [key, value] of allEntries) {\n\t\t\tif (key === META_KEY) continue;\n\n\t\t\tconst address = key as string;\n\t\t\ttry {\n\t\t\t\tconst exported = value as ExportedWebCryptoKeypair;\n\t\t\t\tconst signer = WebCryptoSigner.import(exported);\n\t\t\t\tconst accountMeta = meta.find((m) => m.address === address);\n\t\t\t\taccounts.push(buildManagedAccount(signer, address, accountMeta?.label ?? 'Account'));\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(`[dev-wallet] Failed to load account ${address}, skipping:`, error);\n\t\t\t}\n\t\t}\n\n\t\tthis.setInitialAccounts(accounts);\n\t}\n\n\tasync createAccount(options?: CreateAccountOptions): Promise<ManagedAccount> {\n\t\tconst signer = await WebCryptoSigner.generate();\n\t\tconst address = signer.getPublicKey().toSuiAddress();\n\t\tconst label = options?.label ?? this.getDefaultLabel();\n\n\t\tconst managedAccount = buildManagedAccount(signer, address, label);\n\n\t\tawait this.#store.set(address, signer.export());\n\t\tthis.addAccount(managedAccount);\n\t\tawait this.#saveMeta();\n\n\t\treturn managedAccount;\n\t}\n\n\tasync renameAccount(address: string, label: string): Promise<boolean> {\n\t\tif (!this._performRename(address, label)) return false;\n\t\tawait this.#saveMeta();\n\t\treturn true;\n\t}\n\n\tasync removeAccount(address: string): Promise<boolean> {\n\t\tif (!this.removeAccountByAddress(address)) return false;\n\n\t\tawait this.#store.del(address);\n\t\tawait this.#saveMeta();\n\t\treturn true;\n\t}\n\n\tasync #saveMeta(): Promise<void> {\n\t\tconst meta: StoredAccountMeta[] = this.getAccounts().map((a) => ({\n\t\t\taddress: a.address,\n\t\t\tlabel: a.label,\n\t\t}));\n\t\tawait this.#store.set(META_KEY, meta);\n\t}\n}\n"],"mappings":";;;;;;AAgBA,MAAM,kBAAkB;AACxB,MAAM,qBAAqB;AAC3B,MAAM,WAAW;AAEjB,IAAa,yBAAb,cAA4C,kBAAkB;CAI7D;CAEA,YAAY,SAAmD;AAC9D,SAAO;YANM;cACE;AAMf,QAAKA,QAAS,IAAI,SACjB,SAAS,UAAU,iBACnB,SAAS,aAAa,mBACtB;;CAGF,MAAM,aAA4B;EACjC,MAAM,aAAa,MAAM,MAAKA,MAAO,SAGlC;EACH,MAAM,OAA6B,MAAM,MAAKA,MAAO,IAAyB,SAAS,IAAK,EAAE;EAE9F,MAAM,WAAW,EAAE;AAEnB,OAAK,MAAM,CAAC,KAAK,UAAU,YAAY;AACtC,OAAI,QAAQ,SAAU;GAEtB,MAAM,UAAU;AAChB,OAAI;IACH,MAAM,WAAW;IACjB,MAAM,SAAS,gBAAgB,OAAO,SAAS;IAC/C,MAAM,cAAc,KAAK,MAAM,MAAM,EAAE,YAAY,QAAQ;AAC3D,aAAS,KAAK,oBAAoB,QAAQ,SAAS,aAAa,SAAS,UAAU,CAAC;YAC5E,OAAO;AACf,YAAQ,KAAK,uCAAuC,QAAQ,cAAc,MAAM;;;AAIlF,OAAK,mBAAmB,SAAS;;CAGlC,MAAM,cAAc,SAAyD;EAC5E,MAAM,SAAS,MAAM,gBAAgB,UAAU;EAC/C,MAAM,UAAU,OAAO,cAAc,CAAC,cAAc;EACpD,MAAM,QAAQ,SAAS,SAAS,KAAK,iBAAiB;EAEtD,MAAM,iBAAiB,oBAAoB,QAAQ,SAAS,MAAM;AAElE,QAAM,MAAKA,MAAO,IAAI,SAAS,OAAO,QAAQ,CAAC;AAC/C,OAAK,WAAW,eAAe;AAC/B,QAAM,MAAKC,UAAW;AAEtB,SAAO;;CAGR,MAAM,cAAc,SAAiB,OAAiC;AACrE,MAAI,CAAC,KAAK,eAAe,SAAS,MAAM,CAAE,QAAO;AACjD,QAAM,MAAKA,UAAW;AACtB,SAAO;;CAGR,MAAM,cAAc,SAAmC;AACtD,MAAI,CAAC,KAAK,uBAAuB,QAAQ,CAAE,QAAO;AAElD,QAAM,MAAKD,MAAO,IAAI,QAAQ;AAC9B,QAAM,MAAKC,UAAW;AACtB,SAAO;;CAGR,OAAMA,WAA2B;EAChC,MAAM,OAA4B,KAAK,aAAa,CAAC,KAAK,OAAO;GAChE,SAAS,EAAE;GACX,OAAO,EAAE;GACT,EAAE;AACH,QAAM,MAAKD,MAAO,IAAI,UAAU,KAAK"}
1
+ {"version":3,"file":"webcrypto-adapter.mjs","names":["#store","#saveMeta"],"sources":["../../src/adapters/webcrypto-adapter.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ExportedWebCryptoKeypair } from '@mysten/signers/webcrypto';\nimport { WebCryptoSigner } from '@mysten/signers/webcrypto';\n\nimport type { CreateAccountOptions, ManagedAccount } from '../types.js';\nimport { BaseSignerAdapter } from './base-adapter.js';\nimport { buildManagedAccount } from './build-managed-account.js';\nimport { IDBStore } from './idb-store.js';\n\ninterface StoredAccountMeta {\n\taddress: string;\n\tlabel: string;\n}\n\nconst DEFAULT_DB_NAME = 'dev-wallet-webcrypto';\nconst DEFAULT_STORE_NAME = 'accounts';\nconst META_KEY = '__account_meta__';\n\nexport class WebCryptoSignerAdapter extends BaseSignerAdapter {\n\treadonly id = 'webcrypto';\n\treadonly name = 'WebCrypto Signer';\n\n\t#store: IDBStore;\n\n\tconstructor(options?: { dbName?: string; storeName?: string }) {\n\t\tsuper();\n\t\tthis.#store = new IDBStore(\n\t\t\toptions?.dbName ?? DEFAULT_DB_NAME,\n\t\t\toptions?.storeName ?? DEFAULT_STORE_NAME,\n\t\t);\n\t}\n\n\tasync initialize(): Promise<void> {\n\t\tconst allEntries = await this.#store.entries<\n\t\t\tstring,\n\t\t\tExportedWebCryptoKeypair | StoredAccountMeta[]\n\t\t>();\n\t\tconst meta: StoredAccountMeta[] = (await this.#store.get<StoredAccountMeta[]>(META_KEY)) ?? [];\n\n\t\tconst accounts = [];\n\n\t\tfor (const [key, value] of allEntries) {\n\t\t\tif (key === META_KEY) continue;\n\n\t\t\tconst address = key as string;\n\t\t\ttry {\n\t\t\t\tconst exported = value as ExportedWebCryptoKeypair;\n\t\t\t\tconst signer = WebCryptoSigner.import(exported);\n\t\t\t\tconst accountMeta = meta.find((m) => m.address === address);\n\t\t\t\taccounts.push(buildManagedAccount(signer, address, accountMeta?.label ?? 'Account'));\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(`[dev-wallet] Failed to load account ${address}, skipping:`, error);\n\t\t\t}\n\t\t}\n\n\t\tthis.setInitialAccounts(accounts);\n\t}\n\n\tasync createAccount(options?: CreateAccountOptions): Promise<ManagedAccount> {\n\t\tconst signer = await WebCryptoSigner.generate();\n\t\tconst address = signer.getPublicKey().toSuiAddress();\n\t\tconst label = options?.label ?? this.getDefaultLabel();\n\n\t\tconst managedAccount = buildManagedAccount(signer, address, label);\n\n\t\tawait this.#store.set(address, signer.export());\n\t\tthis.addAccount(managedAccount);\n\t\tawait this.#saveMeta();\n\n\t\treturn managedAccount;\n\t}\n\n\tasync renameAccount(address: string, label: string): Promise<boolean> {\n\t\tif (!this._performRename(address, label)) return false;\n\t\tawait this.#saveMeta();\n\t\treturn true;\n\t}\n\n\tasync removeAccount(address: string): Promise<boolean> {\n\t\tif (!this.removeAccountByAddress(address)) return false;\n\n\t\tawait this.#store.del(address);\n\t\tawait this.#saveMeta();\n\t\treturn true;\n\t}\n\n\tasync #saveMeta(): Promise<void> {\n\t\tconst meta: StoredAccountMeta[] = this.getAccounts().map((a) => ({\n\t\t\taddress: a.address,\n\t\t\tlabel: a.label,\n\t\t}));\n\t\tawait this.#store.set(META_KEY, meta);\n\t}\n}\n"],"mappings":";;;;;AAgBA,MAAM,kBAAkB;AACxB,MAAM,qBAAqB;AAC3B,MAAM,WAAW;AAEjB,IAAa,yBAAb,cAA4C,kBAAkB;CAI7D;CAEA,YAAY,SAAmD;AAC9D,SAAO;YANM;cACE;AAMf,QAAA,QAAc,IAAI,SACjB,SAAS,UAAU,iBACnB,SAAS,aAAa,mBACtB;;CAGF,MAAM,aAA4B;EACjC,MAAM,aAAa,MAAM,MAAA,MAAY,SAGlC;EACH,MAAM,OAA6B,MAAM,MAAA,MAAY,IAAyB,SAAS,IAAK,EAAE;EAE9F,MAAM,WAAW,EAAE;AAEnB,OAAK,MAAM,CAAC,KAAK,UAAU,YAAY;AACtC,OAAI,QAAQ,SAAU;GAEtB,MAAM,UAAU;AAChB,OAAI;IACH,MAAM,WAAW;IACjB,MAAM,SAAS,gBAAgB,OAAO,SAAS;IAC/C,MAAM,cAAc,KAAK,MAAM,MAAM,EAAE,YAAY,QAAQ;AAC3D,aAAS,KAAK,oBAAoB,QAAQ,SAAS,aAAa,SAAS,UAAU,CAAC;YAC5E,OAAO;AACf,YAAQ,KAAK,uCAAuC,QAAQ,cAAc,MAAM;;;AAIlF,OAAK,mBAAmB,SAAS;;CAGlC,MAAM,cAAc,SAAyD;EAC5E,MAAM,SAAS,MAAM,gBAAgB,UAAU;EAC/C,MAAM,UAAU,OAAO,cAAc,CAAC,cAAc;EAGpD,MAAM,iBAAiB,oBAAoB,QAAQ,SAFrC,SAAS,SAAS,KAAK,iBAAiB,CAEY;AAElE,QAAM,MAAA,MAAY,IAAI,SAAS,OAAO,QAAQ,CAAC;AAC/C,OAAK,WAAW,eAAe;AAC/B,QAAM,MAAA,UAAgB;AAEtB,SAAO;;CAGR,MAAM,cAAc,SAAiB,OAAiC;AACrE,MAAI,CAAC,KAAK,eAAe,SAAS,MAAM,CAAE,QAAO;AACjD,QAAM,MAAA,UAAgB;AACtB,SAAO;;CAGR,MAAM,cAAc,SAAmC;AACtD,MAAI,CAAC,KAAK,uBAAuB,QAAQ,CAAE,QAAO;AAElD,QAAM,MAAA,MAAY,IAAI,QAAQ;AAC9B,QAAM,MAAA,UAAgB;AACtB,SAAO;;CAGR,OAAA,WAAiC;EAChC,MAAM,OAA4B,KAAK,aAAa,CAAC,KAAK,OAAO;GAChE,SAAS,EAAE;GACX,OAAO,EAAE;GACT,EAAE;AACH,QAAM,MAAA,MAAY,IAAI,UAAU,KAAK"}