@zerodev/wallet-core 0.0.1-alpha.10

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 (292) hide show
  1. package/README.md +310 -0
  2. package/dist/_cjs/actions/auth/authenticateWithEmail.js +17 -0
  3. package/dist/_cjs/actions/auth/authenticateWithEmail.js.map +1 -0
  4. package/dist/_cjs/actions/auth/authenticateWithOAuth.js +13 -0
  5. package/dist/_cjs/actions/auth/authenticateWithOAuth.js.map +1 -0
  6. package/dist/_cjs/actions/auth/getAuthProxyConfigId.js +10 -0
  7. package/dist/_cjs/actions/auth/getAuthProxyConfigId.js.map +1 -0
  8. package/dist/_cjs/actions/auth/getUserEmail.js +19 -0
  9. package/dist/_cjs/actions/auth/getUserEmail.js.map +1 -0
  10. package/dist/_cjs/actions/auth/getWhoami.js +15 -0
  11. package/dist/_cjs/actions/auth/getWhoami.js.map +1 -0
  12. package/dist/_cjs/actions/auth/index.js +22 -0
  13. package/dist/_cjs/actions/auth/index.js.map +1 -0
  14. package/dist/_cjs/actions/auth/loginWithOTP.js +15 -0
  15. package/dist/_cjs/actions/auth/loginWithOTP.js.map +1 -0
  16. package/dist/_cjs/actions/auth/loginWithStamp.js +39 -0
  17. package/dist/_cjs/actions/auth/loginWithStamp.js.map +1 -0
  18. package/dist/_cjs/actions/auth/registerWithOTP.js +16 -0
  19. package/dist/_cjs/actions/auth/registerWithOTP.js.map +1 -0
  20. package/dist/_cjs/actions/auth/registerWithPasskey.js +17 -0
  21. package/dist/_cjs/actions/auth/registerWithPasskey.js.map +1 -0
  22. package/dist/_cjs/actions/index.js +17 -0
  23. package/dist/_cjs/actions/index.js.map +1 -0
  24. package/dist/_cjs/actions/wallet/getUserWallet.js +18 -0
  25. package/dist/_cjs/actions/wallet/getUserWallet.js.map +1 -0
  26. package/dist/_cjs/actions/wallet/index.js +10 -0
  27. package/dist/_cjs/actions/wallet/index.js.map +1 -0
  28. package/dist/_cjs/actions/wallet/signRawPayload.js +27 -0
  29. package/dist/_cjs/actions/wallet/signRawPayload.js.map +1 -0
  30. package/dist/_cjs/actions/wallet/signTransaction.js +26 -0
  31. package/dist/_cjs/actions/wallet/signTransaction.js.map +1 -0
  32. package/dist/_cjs/adapters/viem.js +92 -0
  33. package/dist/_cjs/adapters/viem.js.map +1 -0
  34. package/dist/_cjs/client/authProxy.js +31 -0
  35. package/dist/_cjs/client/authProxy.js.map +1 -0
  36. package/dist/_cjs/client/createClient.js +49 -0
  37. package/dist/_cjs/client/createClient.js.map +1 -0
  38. package/dist/_cjs/client/decorators/client.js +23 -0
  39. package/dist/_cjs/client/decorators/client.js.map +1 -0
  40. package/dist/_cjs/client/index.js +11 -0
  41. package/dist/_cjs/client/index.js.map +1 -0
  42. package/dist/_cjs/client/transports/createTransport.js +31 -0
  43. package/dist/_cjs/client/transports/createTransport.js.map +1 -0
  44. package/dist/_cjs/client/transports/rest.js +104 -0
  45. package/dist/_cjs/client/transports/rest.js.map +1 -0
  46. package/dist/_cjs/client/types.js +3 -0
  47. package/dist/_cjs/client/types.js.map +1 -0
  48. package/dist/_cjs/constants.js +9 -0
  49. package/dist/_cjs/constants.js.map +1 -0
  50. package/dist/_cjs/core/createZeroDevWallet.js +302 -0
  51. package/dist/_cjs/core/createZeroDevWallet.js.map +1 -0
  52. package/dist/_cjs/errors/request.js +61 -0
  53. package/dist/_cjs/errors/request.js.map +1 -0
  54. package/dist/_cjs/index.js +35 -0
  55. package/dist/_cjs/index.js.map +1 -0
  56. package/dist/_cjs/package.json +1 -0
  57. package/dist/_cjs/polyfills/window.js +26 -0
  58. package/dist/_cjs/polyfills/window.js.map +1 -0
  59. package/dist/_cjs/stampers/iframeStamper.js +35 -0
  60. package/dist/_cjs/stampers/iframeStamper.js.map +1 -0
  61. package/dist/_cjs/stampers/index.js +10 -0
  62. package/dist/_cjs/stampers/index.js.map +1 -0
  63. package/dist/_cjs/stampers/indexedDbStamper.js +23 -0
  64. package/dist/_cjs/stampers/indexedDbStamper.js.map +1 -0
  65. package/dist/_cjs/stampers/types.js +3 -0
  66. package/dist/_cjs/stampers/types.js.map +1 -0
  67. package/dist/_cjs/stampers/webauthnStamper.js +17 -0
  68. package/dist/_cjs/stampers/webauthnStamper.js.map +1 -0
  69. package/dist/_cjs/storage/adapters.js +18 -0
  70. package/dist/_cjs/storage/adapters.js.map +1 -0
  71. package/dist/_cjs/storage/manager.js +108 -0
  72. package/dist/_cjs/storage/manager.js.map +1 -0
  73. package/dist/_cjs/types/session.js +9 -0
  74. package/dist/_cjs/types/session.js.map +1 -0
  75. package/dist/_cjs/utils/buildClientSignature.js +39 -0
  76. package/dist/_cjs/utils/buildClientSignature.js.map +1 -0
  77. package/dist/_cjs/utils/derToRawSignature.js +63 -0
  78. package/dist/_cjs/utils/derToRawSignature.js.map +1 -0
  79. package/dist/_cjs/utils/exportPrivateKey.js +55 -0
  80. package/dist/_cjs/utils/exportPrivateKey.js.map +1 -0
  81. package/dist/_cjs/utils/exportWallet.js +70 -0
  82. package/dist/_cjs/utils/exportWallet.js.map +1 -0
  83. package/dist/_cjs/utils/utils.js +75 -0
  84. package/dist/_cjs/utils/utils.js.map +1 -0
  85. package/dist/_esm/actions/auth/authenticateWithEmail.js +18 -0
  86. package/dist/_esm/actions/auth/authenticateWithEmail.js.map +1 -0
  87. package/dist/_esm/actions/auth/authenticateWithOAuth.js +29 -0
  88. package/dist/_esm/actions/auth/authenticateWithOAuth.js.map +1 -0
  89. package/dist/_esm/actions/auth/getAuthProxyConfigId.js +13 -0
  90. package/dist/_esm/actions/auth/getAuthProxyConfigId.js.map +1 -0
  91. package/dist/_esm/actions/auth/getUserEmail.js +33 -0
  92. package/dist/_esm/actions/auth/getUserEmail.js.map +1 -0
  93. package/dist/_esm/actions/auth/getWhoami.js +28 -0
  94. package/dist/_esm/actions/auth/getWhoami.js.map +1 -0
  95. package/dist/_esm/actions/auth/index.js +10 -0
  96. package/dist/_esm/actions/auth/index.js.map +1 -0
  97. package/dist/_esm/actions/auth/loginWithOTP.js +38 -0
  98. package/dist/_esm/actions/auth/loginWithOTP.js.map +1 -0
  99. package/dist/_esm/actions/auth/loginWithStamp.js +52 -0
  100. package/dist/_esm/actions/auth/loginWithStamp.js.map +1 -0
  101. package/dist/_esm/actions/auth/registerWithOTP.js +35 -0
  102. package/dist/_esm/actions/auth/registerWithOTP.js.map +1 -0
  103. package/dist/_esm/actions/auth/registerWithPasskey.js +36 -0
  104. package/dist/_esm/actions/auth/registerWithPasskey.js.map +1 -0
  105. package/dist/_esm/actions/index.js +5 -0
  106. package/dist/_esm/actions/index.js.map +1 -0
  107. package/dist/_esm/actions/wallet/getUserWallet.js +31 -0
  108. package/dist/_esm/actions/wallet/getUserWallet.js.map +1 -0
  109. package/dist/_esm/actions/wallet/index.js +4 -0
  110. package/dist/_esm/actions/wallet/index.js.map +1 -0
  111. package/dist/_esm/actions/wallet/signRawPayload.js +42 -0
  112. package/dist/_esm/actions/wallet/signRawPayload.js.map +1 -0
  113. package/dist/_esm/actions/wallet/signTransaction.js +41 -0
  114. package/dist/_esm/actions/wallet/signTransaction.js.map +1 -0
  115. package/dist/_esm/adapters/viem.js +94 -0
  116. package/dist/_esm/adapters/viem.js.map +1 -0
  117. package/dist/_esm/client/authProxy.js +41 -0
  118. package/dist/_esm/client/authProxy.js.map +1 -0
  119. package/dist/_esm/client/createClient.js +60 -0
  120. package/dist/_esm/client/createClient.js.map +1 -0
  121. package/dist/_esm/client/decorators/client.js +44 -0
  122. package/dist/_esm/client/decorators/client.js.map +1 -0
  123. package/dist/_esm/client/index.js +4 -0
  124. package/dist/_esm/client/index.js.map +1 -0
  125. package/dist/_esm/client/transports/createTransport.js +33 -0
  126. package/dist/_esm/client/transports/createTransport.js.map +1 -0
  127. package/dist/_esm/client/transports/rest.js +103 -0
  128. package/dist/_esm/client/transports/rest.js.map +1 -0
  129. package/dist/_esm/client/types.js +2 -0
  130. package/dist/_esm/client/types.js.map +1 -0
  131. package/dist/_esm/constants.js +6 -0
  132. package/dist/_esm/constants.js.map +1 -0
  133. package/dist/_esm/core/createZeroDevWallet.js +308 -0
  134. package/dist/_esm/core/createZeroDevWallet.js.map +1 -0
  135. package/dist/_esm/errors/request.js +60 -0
  136. package/dist/_esm/errors/request.js.map +1 -0
  137. package/dist/_esm/index.js +23 -0
  138. package/dist/_esm/index.js.map +1 -0
  139. package/dist/_esm/package.json +1 -0
  140. package/dist/_esm/polyfills/window.js +24 -0
  141. package/dist/_esm/polyfills/window.js.map +1 -0
  142. package/dist/_esm/stampers/iframeStamper.js +32 -0
  143. package/dist/_esm/stampers/iframeStamper.js.map +1 -0
  144. package/dist/_esm/stampers/index.js +4 -0
  145. package/dist/_esm/stampers/index.js.map +1 -0
  146. package/dist/_esm/stampers/indexedDbStamper.js +20 -0
  147. package/dist/_esm/stampers/indexedDbStamper.js.map +1 -0
  148. package/dist/_esm/stampers/types.js +2 -0
  149. package/dist/_esm/stampers/types.js.map +1 -0
  150. package/dist/_esm/stampers/webauthnStamper.js +15 -0
  151. package/dist/_esm/stampers/webauthnStamper.js.map +1 -0
  152. package/dist/_esm/storage/adapters.js +15 -0
  153. package/dist/_esm/storage/adapters.js.map +1 -0
  154. package/dist/_esm/storage/manager.js +118 -0
  155. package/dist/_esm/storage/manager.js.map +1 -0
  156. package/dist/_esm/types/session.js +6 -0
  157. package/dist/_esm/types/session.js.map +1 -0
  158. package/dist/_esm/utils/buildClientSignature.js +64 -0
  159. package/dist/_esm/utils/buildClientSignature.js.map +1 -0
  160. package/dist/_esm/utils/derToRawSignature.js +89 -0
  161. package/dist/_esm/utils/derToRawSignature.js.map +1 -0
  162. package/dist/_esm/utils/exportPrivateKey.js +83 -0
  163. package/dist/_esm/utils/exportPrivateKey.js.map +1 -0
  164. package/dist/_esm/utils/exportWallet.js +98 -0
  165. package/dist/_esm/utils/exportWallet.js.map +1 -0
  166. package/dist/_esm/utils/utils.js +105 -0
  167. package/dist/_esm/utils/utils.js.map +1 -0
  168. package/dist/_types/actions/auth/authenticateWithEmail.d.ts +33 -0
  169. package/dist/_types/actions/auth/authenticateWithEmail.d.ts.map +1 -0
  170. package/dist/_types/actions/auth/authenticateWithOAuth.d.ts +38 -0
  171. package/dist/_types/actions/auth/authenticateWithOAuth.d.ts.map +1 -0
  172. package/dist/_types/actions/auth/getAuthProxyConfigId.d.ts +12 -0
  173. package/dist/_types/actions/auth/getAuthProxyConfigId.d.ts.map +1 -0
  174. package/dist/_types/actions/auth/getUserEmail.d.ts +32 -0
  175. package/dist/_types/actions/auth/getUserEmail.d.ts.map +1 -0
  176. package/dist/_types/actions/auth/getWhoami.d.ts +35 -0
  177. package/dist/_types/actions/auth/getWhoami.d.ts.map +1 -0
  178. package/dist/_types/actions/auth/index.d.ts +10 -0
  179. package/dist/_types/actions/auth/index.d.ts.map +1 -0
  180. package/dist/_types/actions/auth/loginWithOTP.d.ts +41 -0
  181. package/dist/_types/actions/auth/loginWithOTP.d.ts.map +1 -0
  182. package/dist/_types/actions/auth/loginWithStamp.d.ts +37 -0
  183. package/dist/_types/actions/auth/loginWithStamp.d.ts.map +1 -0
  184. package/dist/_types/actions/auth/registerWithOTP.d.ts +46 -0
  185. package/dist/_types/actions/auth/registerWithOTP.d.ts.map +1 -0
  186. package/dist/_types/actions/auth/registerWithPasskey.d.ts +53 -0
  187. package/dist/_types/actions/auth/registerWithPasskey.d.ts.map +1 -0
  188. package/dist/_types/actions/index.d.ts +3 -0
  189. package/dist/_types/actions/index.d.ts.map +1 -0
  190. package/dist/_types/actions/wallet/getUserWallet.d.ts +34 -0
  191. package/dist/_types/actions/wallet/getUserWallet.d.ts.map +1 -0
  192. package/dist/_types/actions/wallet/index.d.ts +4 -0
  193. package/dist/_types/actions/wallet/index.d.ts.map +1 -0
  194. package/dist/_types/actions/wallet/signRawPayload.d.ts +39 -0
  195. package/dist/_types/actions/wallet/signRawPayload.d.ts.map +1 -0
  196. package/dist/_types/actions/wallet/signTransaction.d.ts +35 -0
  197. package/dist/_types/actions/wallet/signTransaction.d.ts.map +1 -0
  198. package/dist/_types/adapters/viem.d.ts +10 -0
  199. package/dist/_types/adapters/viem.d.ts.map +1 -0
  200. package/dist/_types/client/authProxy.d.ts +36 -0
  201. package/dist/_types/client/authProxy.d.ts.map +1 -0
  202. package/dist/_types/client/createClient.d.ts +17 -0
  203. package/dist/_types/client/createClient.d.ts.map +1 -0
  204. package/dist/_types/client/decorators/client.d.ts +81 -0
  205. package/dist/_types/client/decorators/client.d.ts.map +1 -0
  206. package/dist/_types/client/index.d.ts +5 -0
  207. package/dist/_types/client/index.d.ts.map +1 -0
  208. package/dist/_types/client/transports/createTransport.d.ts +17 -0
  209. package/dist/_types/client/transports/createTransport.d.ts.map +1 -0
  210. package/dist/_types/client/transports/rest.d.ts +35 -0
  211. package/dist/_types/client/transports/rest.d.ts.map +1 -0
  212. package/dist/_types/client/types.d.ts +59 -0
  213. package/dist/_types/client/types.d.ts.map +1 -0
  214. package/dist/_types/constants.d.ts +6 -0
  215. package/dist/_types/constants.d.ts.map +1 -0
  216. package/dist/_types/core/createZeroDevWallet.d.ts +52 -0
  217. package/dist/_types/core/createZeroDevWallet.d.ts.map +1 -0
  218. package/dist/_types/errors/request.d.ts +12 -0
  219. package/dist/_types/errors/request.d.ts.map +1 -0
  220. package/dist/_types/index.d.ts +20 -0
  221. package/dist/_types/index.d.ts.map +1 -0
  222. package/dist/_types/polyfills/window.d.ts +15 -0
  223. package/dist/_types/polyfills/window.d.ts.map +1 -0
  224. package/dist/_types/stampers/iframeStamper.d.ts +7 -0
  225. package/dist/_types/stampers/iframeStamper.d.ts.map +1 -0
  226. package/dist/_types/stampers/index.d.ts +5 -0
  227. package/dist/_types/stampers/index.d.ts.map +1 -0
  228. package/dist/_types/stampers/indexedDbStamper.d.ts +3 -0
  229. package/dist/_types/stampers/indexedDbStamper.d.ts.map +1 -0
  230. package/dist/_types/stampers/types.d.ts +25 -0
  231. package/dist/_types/stampers/types.d.ts.map +1 -0
  232. package/dist/_types/stampers/webauthnStamper.d.ts +5 -0
  233. package/dist/_types/stampers/webauthnStamper.d.ts.map +1 -0
  234. package/dist/_types/storage/adapters.d.ts +3 -0
  235. package/dist/_types/storage/adapters.d.ts.map +1 -0
  236. package/dist/_types/storage/manager.d.ts +19 -0
  237. package/dist/_types/storage/manager.d.ts.map +1 -0
  238. package/dist/_types/types/session.d.ts +17 -0
  239. package/dist/_types/types/session.d.ts.map +1 -0
  240. package/dist/_types/utils/buildClientSignature.d.ts +25 -0
  241. package/dist/_types/utils/buildClientSignature.d.ts.map +1 -0
  242. package/dist/_types/utils/derToRawSignature.d.ts +11 -0
  243. package/dist/_types/utils/derToRawSignature.d.ts.map +1 -0
  244. package/dist/_types/utils/exportPrivateKey.d.ts +47 -0
  245. package/dist/_types/utils/exportPrivateKey.d.ts.map +1 -0
  246. package/dist/_types/utils/exportWallet.d.ts +44 -0
  247. package/dist/_types/utils/exportWallet.d.ts.map +1 -0
  248. package/dist/_types/utils/utils.d.ts +52 -0
  249. package/dist/_types/utils/utils.d.ts.map +1 -0
  250. package/dist/tsconfig.build.tsbuildinfo +1 -0
  251. package/package.json +74 -0
  252. package/src/actions/auth/authenticateWithEmail.ts +52 -0
  253. package/src/actions/auth/authenticateWithOAuth.ts +52 -0
  254. package/src/actions/auth/getAuthProxyConfigId.ts +20 -0
  255. package/src/actions/auth/getUserEmail.ts +52 -0
  256. package/src/actions/auth/getWhoami.ts +51 -0
  257. package/src/actions/auth/index.ts +47 -0
  258. package/src/actions/auth/loginWithOTP.ts +57 -0
  259. package/src/actions/auth/loginWithStamp.ts +79 -0
  260. package/src/actions/auth/registerWithOTP.ts +64 -0
  261. package/src/actions/auth/registerWithPasskey.ts +72 -0
  262. package/src/actions/index.ts +41 -0
  263. package/src/actions/wallet/getUserWallet.ts +53 -0
  264. package/src/actions/wallet/index.ts +17 -0
  265. package/src/actions/wallet/signRawPayload.ts +75 -0
  266. package/src/actions/wallet/signTransaction.ts +64 -0
  267. package/src/adapters/viem.ts +162 -0
  268. package/src/client/authProxy.ts +78 -0
  269. package/src/client/createClient.ts +90 -0
  270. package/src/client/decorators/client.ts +171 -0
  271. package/src/client/index.ts +19 -0
  272. package/src/client/transports/createTransport.ts +54 -0
  273. package/src/client/transports/rest.ts +138 -0
  274. package/src/client/types.ts +64 -0
  275. package/src/constants.ts +5 -0
  276. package/src/core/createZeroDevWallet.ts +447 -0
  277. package/src/errors/request.ts +36 -0
  278. package/src/index.ts +79 -0
  279. package/src/polyfills/window.ts +24 -0
  280. package/src/stampers/iframeStamper.ts +49 -0
  281. package/src/stampers/index.ts +8 -0
  282. package/src/stampers/indexedDbStamper.ts +22 -0
  283. package/src/stampers/types.ts +35 -0
  284. package/src/stampers/webauthnStamper.ts +21 -0
  285. package/src/storage/adapters.ts +20 -0
  286. package/src/storage/manager.ts +170 -0
  287. package/src/types/session.ts +18 -0
  288. package/src/utils/buildClientSignature.ts +86 -0
  289. package/src/utils/derToRawSignature.ts +103 -0
  290. package/src/utils/exportPrivateKey.ts +116 -0
  291. package/src/utils/exportWallet.ts +130 -0
  292. package/src/utils/utils.ts +136 -0
@@ -0,0 +1,20 @@
1
+ import { IndexedDbStamper as TurnkeyIndexedDbStamper } from '@turnkey/indexed-db-stamper';
2
+ export async function createIndexedDbStamper() {
3
+ const inner = new TurnkeyIndexedDbStamper();
4
+ await inner.init();
5
+ return {
6
+ async getPublicKey() {
7
+ return await inner.getPublicKey();
8
+ },
9
+ async stamp(payload) {
10
+ return await inner.stamp(payload);
11
+ },
12
+ async clear() {
13
+ await inner.clear();
14
+ },
15
+ async resetKeyPair(externalKeyPair) {
16
+ await inner.resetKeyPair(externalKeyPair);
17
+ },
18
+ };
19
+ }
20
+ //# sourceMappingURL=indexedDbStamper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexedDbStamper.js","sourceRoot":"","sources":["../../../src/stampers/indexedDbStamper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,IAAI,uBAAuB,EAAE,MAAM,6BAA6B,CAAA;AAGzF,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,MAAM,KAAK,GAAG,IAAI,uBAAuB,EAAE,CAAA;IAC3C,MAAM,KAAK,CAAC,IAAI,EAAE,CAAA;IAElB,OAAO;QACL,KAAK,CAAC,YAAY;YAChB,OAAO,MAAM,KAAK,CAAC,YAAY,EAAE,CAAA;QACnC,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,OAAe;YACzB,OAAO,MAAM,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACnC,CAAC;QACD,KAAK,CAAC,KAAK;YACT,MAAM,KAAK,CAAC,KAAK,EAAE,CAAA;QACrB,CAAC;QACD,KAAK,CAAC,YAAY,CAAC,eAA+B;YAChD,MAAM,KAAK,CAAC,YAAY,CAAC,eAAe,CAAC,CAAA;QAC3C,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/stampers/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ import { WebauthnStamper as TurnkeyWebauthnStamper } from '@turnkey/webauthn-stamper';
2
+ export async function createWebauthnStamper({ rpId, }) {
3
+ const inner = new TurnkeyWebauthnStamper({ rpId });
4
+ return {
5
+ async getPublicKey() {
6
+ // return await inner.();
7
+ return null;
8
+ },
9
+ async stamp(payload) {
10
+ return await inner.stamp(payload);
11
+ },
12
+ async clear() { },
13
+ };
14
+ }
15
+ //# sourceMappingURL=webauthnStamper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webauthnStamper.js","sourceRoot":"","sources":["../../../src/stampers/webauthnStamper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,IAAI,sBAAsB,EAAE,MAAM,2BAA2B,CAAA;AAGrF,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,EAC1C,IAAI,GAGL;IACC,MAAM,KAAK,GAAG,IAAI,sBAAsB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA;IAElD,OAAO;QACL,KAAK,CAAC,YAAY;YAChB,2BAA2B;YAC3B,OAAO,IAAI,CAAA;QACb,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,OAAe;YACzB,OAAO,MAAM,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACnC,CAAC;QACD,KAAK,CAAC,KAAK,KAAI,CAAC;KACjB,CAAA;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ import WindowWrapper from '../polyfills/window.js';
2
+ export function createWebStorageAdapter(storage = WindowWrapper.localStorage) {
3
+ return {
4
+ getItem(key) {
5
+ return storage.getItem(key);
6
+ },
7
+ setItem(key, value) {
8
+ storage.setItem(key, value);
9
+ },
10
+ removeItem(key) {
11
+ storage.removeItem(key);
12
+ },
13
+ };
14
+ }
15
+ //# sourceMappingURL=adapters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.js","sourceRoot":"","sources":["../../../src/storage/adapters.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,wBAAwB,CAAA;AAGlD,MAAM,UAAU,uBAAuB,CACrC,UAAmB,aAAa,CAAC,YAAY;IAE7C,OAAO;QACL,OAAO,CAAC,GAAW;YACjB,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC7B,CAAC;QAED,OAAO,CAAC,GAAW,EAAE,KAAa;YAChC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QAC7B,CAAC;QAED,UAAU,CAAC,GAAW;YACpB,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;QACzB,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,118 @@
1
+ import { normalizeTimestamp } from '../utils/utils.js';
2
+ export function createStorageManager(adapter) {
3
+ const ACTIVE_SESSION_KEY = '@zerodev/active_session';
4
+ const ALL_SESSIONS_KEY = '@zerodev/sessions';
5
+ const storeSession = async (sessionData, sessionKey) => {
6
+ // Store the session data
7
+ await adapter.setItem(sessionKey, JSON.stringify(sessionData));
8
+ // Add to sessions list if not already present
9
+ const sessionsStr = await adapter.getItem(ALL_SESSIONS_KEY);
10
+ const sessions = JSON.parse(sessionsStr || '[]');
11
+ if (!sessions.includes(sessionKey)) {
12
+ sessions.push(sessionKey);
13
+ await adapter.setItem(ALL_SESSIONS_KEY, JSON.stringify(sessions));
14
+ }
15
+ // Set as active session
16
+ await adapter.setItem(ACTIVE_SESSION_KEY, sessionKey);
17
+ };
18
+ const getActiveSession = async () => {
19
+ const activeKey = await adapter.getItem(ACTIVE_SESSION_KEY);
20
+ if (!activeKey)
21
+ return undefined;
22
+ return getSession(activeKey);
23
+ };
24
+ const getActiveSessionKey = async () => {
25
+ const key = await adapter.getItem(ACTIVE_SESSION_KEY);
26
+ return key || undefined;
27
+ };
28
+ const getSession = async (sessionKey) => {
29
+ const sessionStr = await adapter.getItem(sessionKey);
30
+ if (!sessionStr)
31
+ return undefined;
32
+ try {
33
+ const session = JSON.parse(sessionStr);
34
+ // Check if session is expired
35
+ if (session.expiry && normalizeTimestamp(session.expiry) < Date.now()) {
36
+ await clearSession(sessionKey);
37
+ return undefined;
38
+ }
39
+ return session;
40
+ }
41
+ catch (_error) {
42
+ // Invalid JSON, clean up
43
+ await clearSession(sessionKey);
44
+ return undefined;
45
+ }
46
+ };
47
+ const listSessionKeys = async () => {
48
+ const sessionsStr = await adapter.getItem(ALL_SESSIONS_KEY);
49
+ const sessionKeys = JSON.parse(sessionsStr || '[]');
50
+ // Clean up any keys that don't have corresponding sessions
51
+ const validKeys = [];
52
+ for (const key of sessionKeys) {
53
+ const exists = await adapter.getItem(key);
54
+ if (exists) {
55
+ validKeys.push(key);
56
+ }
57
+ }
58
+ // Update the list if we found invalid keys
59
+ if (validKeys.length !== sessionKeys.length) {
60
+ await adapter.setItem(ALL_SESSIONS_KEY, JSON.stringify(validKeys));
61
+ }
62
+ return validKeys;
63
+ };
64
+ const listSessions = async () => {
65
+ const sessionKeys = await listSessionKeys();
66
+ const sessions = [];
67
+ for (const key of sessionKeys) {
68
+ const session = await getSession(key);
69
+ if (session) {
70
+ sessions.push(session);
71
+ }
72
+ }
73
+ return sessions;
74
+ };
75
+ const setActiveSession = async (sessionKey) => {
76
+ // Verify the session exists
77
+ const session = await getSession(sessionKey);
78
+ if (!session) {
79
+ throw new Error(`Session not found: ${sessionKey}`);
80
+ }
81
+ await adapter.setItem(ACTIVE_SESSION_KEY, sessionKey);
82
+ };
83
+ const clearSession = async (sessionKey) => {
84
+ // Remove the session data
85
+ await adapter.removeItem(sessionKey);
86
+ // Remove from sessions list
87
+ const sessions = await listSessionKeys();
88
+ const updated = sessions.filter((k) => k !== sessionKey);
89
+ await adapter.setItem(ALL_SESSIONS_KEY, JSON.stringify(updated));
90
+ // Clear active session if it was the cleared one
91
+ const activeKey = await adapter.getItem(ACTIVE_SESSION_KEY);
92
+ if (activeKey === sessionKey) {
93
+ await adapter.removeItem(ACTIVE_SESSION_KEY);
94
+ }
95
+ };
96
+ const clearAllSessions = async () => {
97
+ const sessions = await listSessionKeys();
98
+ // Remove all session data
99
+ for (const key of sessions) {
100
+ await adapter.removeItem(key);
101
+ }
102
+ // Clear the metadata
103
+ await adapter.removeItem(ALL_SESSIONS_KEY);
104
+ await adapter.removeItem(ACTIVE_SESSION_KEY);
105
+ };
106
+ return {
107
+ storeSession,
108
+ getActiveSession,
109
+ getActiveSessionKey,
110
+ getSession,
111
+ listSessionKeys,
112
+ listSessions,
113
+ setActiveSession,
114
+ clearSession,
115
+ clearAllSessions,
116
+ };
117
+ }
118
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/storage/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export var SessionType;
2
+ (function (SessionType) {
3
+ SessionType["READ_ONLY"] = "SESSION_TYPE_READ_ONLY";
4
+ SessionType["READ_WRITE"] = "SESSION_TYPE_READ_WRITE";
5
+ })(SessionType || (SessionType = {}));
6
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/types/session.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,WAGX;AAHD,WAAY,WAAW;IACrB,mDAAoC,CAAA;IACpC,qDAAsC,CAAA;AACxC,CAAC,EAHW,WAAW,KAAX,WAAW,QAGtB"}
@@ -0,0 +1,64 @@
1
+ import { derToRawSignature } from './derToRawSignature.js';
2
+ /**
3
+ * Builds a client signature for OTP login.
4
+ *
5
+ * Steps:
6
+ * 1. Decode verificationToken JWT to extract `id` field as tokenId
7
+ * 2. Build message: JSON.stringify({ login: { publicKey }, tokenId, type: "USAGE_TYPE_LOGIN" })
8
+ * 3. Sign message with stamper → get stampHeaderValue
9
+ * 4. Parse stampHeaderValue → extract DER signature hex
10
+ * 5. Convert DER to raw r||s format
11
+ * 6. Return raw signature hex
12
+ *
13
+ * @param params - The parameters for building the client signature
14
+ * @returns The raw r||s signature hex (64 bytes = 128 chars)
15
+ */
16
+ export async function buildClientSignature(params) {
17
+ const { verificationToken, publicKey, stamper } = params;
18
+ // Step 1: Extract tokenId from verification token JWT payload
19
+ const tokenId = extractTokenIdFromJwt(verificationToken);
20
+ // Step 2: Build the signature payload message
21
+ const signaturePayload = {
22
+ login: { publicKey },
23
+ tokenId,
24
+ type: 'USAGE_TYPE_LOGIN',
25
+ };
26
+ const message = JSON.stringify(signaturePayload);
27
+ // Step 3: Sign the message using the stamper
28
+ const stamp = await stamper.stamp(message);
29
+ // Step 4: Parse the stamp to extract the DER signature
30
+ // The stampHeaderValue is base64url encoded JSON containing the signature
31
+ const stampData = JSON.parse(base64UrlDecode(stamp.stampHeaderValue));
32
+ const derSignatureHex = stampData.signature;
33
+ // Step 5: Convert DER signature to raw r||s format
34
+ const rawSignature = derToRawSignature(derSignatureHex);
35
+ // Step 6: Return raw signature hex
36
+ return rawSignature;
37
+ }
38
+ /**
39
+ * Extracts the token ID (id field) from a JWT's payload
40
+ */
41
+ function extractTokenIdFromJwt(jwt) {
42
+ const parts = jwt.split('.');
43
+ if (parts.length !== 3) {
44
+ throw new Error('Invalid JWT format');
45
+ }
46
+ const payload = JSON.parse(base64UrlDecode(parts[1]));
47
+ if (!payload.id) {
48
+ throw new Error('JWT payload missing id field');
49
+ }
50
+ return payload.id;
51
+ }
52
+ /**
53
+ * Decodes a base64url encoded string
54
+ */
55
+ function base64UrlDecode(str) {
56
+ // Add padding if necessary
57
+ let base64 = str.replace(/-/g, '+').replace(/_/g, '/');
58
+ const padding = base64.length % 4;
59
+ if (padding) {
60
+ base64 += '='.repeat(4 - padding);
61
+ }
62
+ return atob(base64);
63
+ }
64
+ //# sourceMappingURL=buildClientSignature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildClientSignature.js","sourceRoot":"","sources":["../../../src/utils/buildClientSignature.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAW1D;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAkC;IAElC,MAAM,EAAE,iBAAiB,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,MAAM,CAAA;IAExD,8DAA8D;IAC9D,MAAM,OAAO,GAAG,qBAAqB,CAAC,iBAAiB,CAAC,CAAA;IAExD,8CAA8C;IAC9C,MAAM,gBAAgB,GAAG;QACvB,KAAK,EAAE,EAAE,SAAS,EAAE;QACpB,OAAO;QACP,IAAI,EAAE,kBAAkB;KACzB,CAAA;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAA;IAEhD,6CAA6C;IAC7C,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAE1C,uDAAuD;IACvD,0EAA0E;IAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAA;IACrE,MAAM,eAAe,GAAW,SAAS,CAAC,SAAS,CAAA;IAEnD,mDAAmD;IACnD,MAAM,YAAY,GAAG,iBAAiB,CAAC,eAAe,CAAC,CAAA;IAEvD,mCAAmC;IACnC,OAAO,YAAY,CAAA;AACrB,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,GAAW;IACxC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC5B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAA;IACvC,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAA;IACtD,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;IACjD,CAAC;IAED,OAAO,OAAO,CAAC,EAAE,CAAA;AACnB,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,GAAW;IAClC,2BAA2B;IAC3B,IAAI,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IACtD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAA;IACjC,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,CAAA;IACnC,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAA;AACrB,CAAC"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Converts a DER-encoded ECDSA signature to raw r||s format.
3
+ *
4
+ * DER format: 0x30 [length] 0x02 [r-length] [r] 0x02 [s-length] [s]
5
+ * Raw format: [r (32 bytes)] [s (32 bytes)]
6
+ *
7
+ * @param derHex - The DER-encoded signature as a hex string
8
+ * @returns The raw signature as a hex string (r||s, 64 bytes = 128 chars)
9
+ */
10
+ export function derToRawSignature(derHex) {
11
+ const der = hexToBytes(derHex);
12
+ // Verify SEQUENCE tag (0x30)
13
+ if (der[0] !== 0x30) {
14
+ throw new Error('Invalid DER signature: expected SEQUENCE tag (0x30)');
15
+ }
16
+ let offset = 2; // Skip SEQUENCE tag and length
17
+ // Parse r INTEGER
18
+ if (der[offset] !== 0x02) {
19
+ throw new Error('Invalid DER signature: expected INTEGER tag (0x02) for r');
20
+ }
21
+ offset++; // Skip INTEGER tag
22
+ const rLength = der[offset];
23
+ offset++; // Skip length byte
24
+ const rBytes = der.slice(offset, offset + rLength);
25
+ offset += rLength;
26
+ // Parse s INTEGER
27
+ if (der[offset] !== 0x02) {
28
+ throw new Error('Invalid DER signature: expected INTEGER tag (0x02) for s');
29
+ }
30
+ offset++; // Skip INTEGER tag
31
+ const sLength = der[offset];
32
+ offset++; // Skip length byte
33
+ const sBytes = der.slice(offset, offset + sLength);
34
+ // Remove leading zero bytes if present (DER uses signed integers)
35
+ // and pad to 32 bytes
36
+ const r = padTo32Bytes(stripLeadingZeros(rBytes));
37
+ const s = padTo32Bytes(stripLeadingZeros(sBytes));
38
+ // Concatenate r || s
39
+ const raw = new Uint8Array(64);
40
+ raw.set(r, 0);
41
+ raw.set(s, 32);
42
+ return bytesToHex(raw);
43
+ }
44
+ /**
45
+ * Converts a hex string to a Uint8Array
46
+ */
47
+ function hexToBytes(hex) {
48
+ const cleanHex = hex.startsWith('0x') ? hex.slice(2) : hex;
49
+ const bytes = new Uint8Array(cleanHex.length / 2);
50
+ for (let i = 0; i < bytes.length; i++) {
51
+ bytes[i] = parseInt(cleanHex.slice(i * 2, i * 2 + 2), 16);
52
+ }
53
+ return bytes;
54
+ }
55
+ /**
56
+ * Converts a Uint8Array to a hex string (no 0x prefix)
57
+ */
58
+ function bytesToHex(bytes) {
59
+ return Array.from(bytes)
60
+ .map((b) => b.toString(16).padStart(2, '0'))
61
+ .join('');
62
+ }
63
+ /**
64
+ * Strips leading zero bytes from a byte array
65
+ * DER integers are signed, so positive numbers may have a leading 0x00
66
+ */
67
+ function stripLeadingZeros(bytes) {
68
+ let start = 0;
69
+ while (start < bytes.length - 1 && bytes[start] === 0) {
70
+ start++;
71
+ }
72
+ return bytes.slice(start);
73
+ }
74
+ /**
75
+ * Pads a byte array to 32 bytes (left-padded with zeros)
76
+ */
77
+ function padTo32Bytes(bytes) {
78
+ if (bytes.length === 32) {
79
+ return bytes;
80
+ }
81
+ if (bytes.length > 32) {
82
+ // This shouldn't happen for P-256, but handle it gracefully
83
+ return bytes.slice(bytes.length - 32);
84
+ }
85
+ const padded = new Uint8Array(32);
86
+ padded.set(bytes, 32 - bytes.length);
87
+ return padded;
88
+ }
89
+ //# sourceMappingURL=derToRawSignature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derToRawSignature.js","sourceRoot":"","sources":["../../../src/utils/derToRawSignature.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Export a wallet account's private key
3
+ *
4
+ * This calls Turnkey's export_wallet_account API to get an encrypted bundle
5
+ * containing the account's private key. The bundle is encrypted with the
6
+ * targetPublicKey (from Turnkey's export iframe).
7
+ *
8
+ * @param params - Export parameters
9
+ * @returns Encrypted export bundle and metadata
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * // In UI: Initialize export iframe first
14
+ * const iframeStamper = await createIframeStamper({
15
+ * iframeUrl: 'https://export.turnkey.com',
16
+ * iframeContainer: document.getElementById('export-container'),
17
+ * iframeElementId: 'export-iframe'
18
+ * });
19
+ * const targetPublicKey = await iframeStamper.init();
20
+ *
21
+ * // Call SDK to get encrypted bundle
22
+ * const { exportBundle, address, organizationId } = await exportPrivateKey({
23
+ * wallet,
24
+ * targetPublicKey
25
+ * });
26
+ *
27
+ * // Inject into iframe to display private key
28
+ * await iframeStamper.injectKeyExportBundle(exportBundle, organizationId, 'Hexadecimal');
29
+ * ```
30
+ */
31
+ export async function exportPrivateKey(params) {
32
+ const { targetPublicKey, wallet, address: addressParam } = params;
33
+ const session = await wallet.getSession();
34
+ if (!session) {
35
+ throw new Error('Session not found');
36
+ }
37
+ const { organizationId } = session;
38
+ // If address not provided, get it from the wallet's account
39
+ let address = addressParam;
40
+ if (!address) {
41
+ const account = await wallet.toAccount();
42
+ if (!account?.address) {
43
+ throw new Error('Could not get address from wallet account');
44
+ }
45
+ address = account.address;
46
+ }
47
+ const exportBody = JSON.stringify({
48
+ type: 'ACTIVITY_TYPE_EXPORT_WALLET_ACCOUNT',
49
+ timestampMs: Date.now().toString(),
50
+ organizationId: organizationId,
51
+ parameters: {
52
+ address: address,
53
+ targetPublicKey,
54
+ },
55
+ });
56
+ const stamperKey = session.stamperType === 'indexedDb' ? 'indexedDbStamper' : 'webauthnStamper';
57
+ const stamper = wallet.client[stamperKey];
58
+ if (!stamper) {
59
+ throw new Error(`Stamper '${stamperKey}' not found on wallet.client`);
60
+ }
61
+ const exportStamp = await stamper.stamp(exportBody);
62
+ if (!exportStamp) {
63
+ throw new Error('Failed to stamp export body');
64
+ }
65
+ const exportResponse = await fetch('https://api.turnkey.com/public/v1/submit/export_wallet_account', {
66
+ method: 'POST',
67
+ body: exportBody,
68
+ headers: {
69
+ [exportStamp.stampHeaderName]: exportStamp.stampHeaderValue,
70
+ },
71
+ });
72
+ if (!exportResponse.ok) {
73
+ const errorText = await exportResponse.text();
74
+ throw new Error(`Failed to export wallet account: ${exportResponse.status} ${errorText}`);
75
+ }
76
+ const exportData = await exportResponse.json();
77
+ const exportBundle = exportData?.activity?.result?.exportWalletAccountResult?.exportBundle;
78
+ if (!exportBundle) {
79
+ throw new Error(`Export bundle not found in response: ${JSON.stringify(exportData)}`);
80
+ }
81
+ return { exportBundle, address: address, organizationId };
82
+ }
83
+ //# sourceMappingURL=exportPrivateKey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exportPrivateKey.js","sourceRoot":"","sources":["../../../src/utils/exportPrivateKey.ts"],"names":[],"mappings":"AAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAkC;IAElC,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,CAAA;IAEjE,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAA;IACzC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAA;IACtC,CAAC;IACD,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAA;IAElC,4DAA4D;IAC5D,IAAI,OAAO,GAAG,YAAY,CAAA;IAC1B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAA;QACxC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAA;QAC9D,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAA;IAC3B,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,EAAE,qCAAqC;QAC3C,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;QAClC,cAAc,EAAE,cAAc;QAC9B,UAAU,EAAE;YACV,OAAO,EAAE,OAAO;YAChB,eAAe;SAChB;KACF,CAAC,CAAA;IAEF,MAAM,UAAU,GACd,OAAO,CAAC,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,iBAAiB,CAAA;IAC9E,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;IACzC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,YAAY,UAAU,8BAA8B,CAAC,CAAA;IACvE,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IACnD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;IAChD,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,KAAK,CAChC,gEAAgE,EAChE;QACE,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE;YACP,CAAC,WAAW,CAAC,eAAe,CAAC,EAAE,WAAW,CAAC,gBAAgB;SAC5D;KACF,CACF,CAAA;IACD,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,CAAA;QAC7C,MAAM,IAAI,KAAK,CACb,oCAAoC,cAAc,CAAC,MAAM,IAAI,SAAS,EAAE,CACzE,CAAA;IACH,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,CAAA;IAE9C,MAAM,YAAY,GAChB,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,yBAAyB,EAAE,YAAY,CAAA;IAEvE,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CACb,wCAAwC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CACrE,CAAA;IACH,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,OAAQ,EAAE,cAAc,EAAE,CAAA;AAC5D,CAAC"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * TODO: Add it as standard action in the SDK when backend is ready
3
+ * Export a wallet's seed phrase
4
+ *
5
+ * This calls Turnkey's export_wallet API to get an encrypted bundle
6
+ * containing the wallet's mnemonic. The bundle is encrypted with the
7
+ * targetPublicKey (from Turnkey's export iframe).
8
+ *
9
+ * @param params - Export parameters
10
+ * @returns Encrypted export bundle
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * // In UI: Initialize export iframe first
15
+ * const iframeStamper = await createIframeStamper({
16
+ * iframeUrl: 'https://export.turnkey.com',
17
+ * iframeContainer: document.getElementById('export-container'),
18
+ * iframeElementId: 'export-iframe'
19
+ * });
20
+ * const targetPublicKey = await iframeStamper.init();
21
+ *
22
+ * // Call SDK to get encrypted bundle
23
+ * const exportBundle = await exportWallet({
24
+ * wallet,
25
+ * targetPublicKey
26
+ * });
27
+ *
28
+ * // Inject into iframe to display seed phrase
29
+ * await iframeStamper.injectWalletExportBundle(exportBundle, organizationId);
30
+ * ```
31
+ */
32
+ export async function exportWallet(params) {
33
+ const { targetPublicKey, wallet } = params;
34
+ try {
35
+ const session = await wallet.getSession();
36
+ if (!session) {
37
+ throw new Error('Session not found');
38
+ }
39
+ const { organizationId } = session;
40
+ const listWalletsBody = JSON.stringify({
41
+ organizationId,
42
+ });
43
+ const listWalletsStamp = await wallet.client[session.stamperType === 'indexedDb'
44
+ ? 'indexedDbStamper'
45
+ : 'webauthnStamper'].stamp(listWalletsBody);
46
+ if (!listWalletsStamp) {
47
+ throw new Error('Failed to stamp list wallets body');
48
+ }
49
+ const listWalletsResponse = await fetch('https://api.turnkey.com/public/v1/query/list_wallets', {
50
+ method: 'POST',
51
+ body: listWalletsBody,
52
+ headers: {
53
+ [listWalletsStamp.stampHeaderName]: listWalletsStamp.stampHeaderValue,
54
+ },
55
+ });
56
+ if (!listWalletsResponse.ok) {
57
+ throw new Error('Failed to list wallets');
58
+ }
59
+ const listWalletsData = await listWalletsResponse.json();
60
+ const walletId = listWalletsData.wallets[0].walletId;
61
+ const exportWalletBody = JSON.stringify({
62
+ type: 'ACTIVITY_TYPE_EXPORT_WALLET',
63
+ timestampMs: Date.now().toString(),
64
+ organizationId: organizationId,
65
+ parameters: {
66
+ walletId: walletId,
67
+ targetPublicKey,
68
+ language: 'MNEMONIC_LANGUAGE_ENGLISH',
69
+ },
70
+ });
71
+ const exportWalletStamp = await wallet.client[session.stamperType === 'indexedDb'
72
+ ? 'indexedDbStamper'
73
+ : 'webauthnStamper'].stamp(exportWalletBody);
74
+ if (!exportWalletStamp) {
75
+ throw new Error('Failed to stamp export wallet body');
76
+ }
77
+ const exportWalletResponse = await fetch('https://api.turnkey.com/public/v1/submit/export_wallet', {
78
+ method: 'POST',
79
+ body: exportWalletBody,
80
+ headers: {
81
+ [exportWalletStamp.stampHeaderName]: exportWalletStamp.stampHeaderValue,
82
+ },
83
+ });
84
+ if (!exportWalletResponse.ok) {
85
+ throw new Error('Failed to export wallet');
86
+ }
87
+ const exportWalletData = await exportWalletResponse.json();
88
+ const exportBundle = exportWalletData?.activity?.result?.exportWalletResult?.exportBundle;
89
+ if (!exportBundle) {
90
+ throw new Error('Export bundle not found in response');
91
+ }
92
+ return { exportBundle, walletId, organizationId };
93
+ }
94
+ catch (_) {
95
+ throw new Error('Error exporting wallet');
96
+ }
97
+ }
98
+ //# sourceMappingURL=exportWallet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exportWallet.js","sourceRoot":"","sources":["../../../src/utils/exportWallet.ts"],"names":[],"mappings":"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"}