0xtrails 0.0.1 → 0.0.2

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 (359) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +42 -0
  3. package/dist/abi.d.ts +37 -0
  4. package/dist/abi.d.ts.map +1 -0
  5. package/dist/abi.js +36 -0
  6. package/dist/apiClient.d.ts +9 -0
  7. package/dist/apiClient.d.ts.map +1 -0
  8. package/dist/apiClient.js +18 -0
  9. package/dist/buffer.d.ts +3 -0
  10. package/dist/buffer.d.ts.map +1 -0
  11. package/dist/buffer.js +8 -0
  12. package/dist/cctp.d.ts +84 -0
  13. package/dist/cctp.d.ts.map +1 -0
  14. package/dist/cctp.js +401 -0
  15. package/dist/chainSwitch.d.ts +7 -0
  16. package/dist/chainSwitch.d.ts.map +1 -0
  17. package/dist/chainSwitch.js +33 -0
  18. package/dist/chains.d.ts +13 -0
  19. package/dist/chains.d.ts.map +1 -0
  20. package/dist/chains.js +95 -0
  21. package/dist/constants.d.ts +11 -0
  22. package/dist/constants.d.ts.map +1 -0
  23. package/dist/constants.js +16 -0
  24. package/dist/encoders.d.ts +7 -0
  25. package/dist/encoders.d.ts.map +1 -0
  26. package/dist/encoders.js +8 -0
  27. package/dist/error.d.ts +2 -0
  28. package/dist/error.d.ts.map +1 -0
  29. package/dist/error.js +12 -0
  30. package/dist/explorer.d.ts +12 -0
  31. package/dist/explorer.d.ts.map +1 -0
  32. package/dist/explorer.js +18 -0
  33. package/dist/gasless.d.ts +116 -0
  34. package/dist/gasless.d.ts.map +1 -0
  35. package/dist/gasless.js +297 -0
  36. package/dist/index.d.ts +13 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +9 -0
  39. package/dist/indexerClient.d.ts +9 -0
  40. package/dist/indexerClient.d.ts.map +1 -0
  41. package/dist/indexerClient.js +18 -0
  42. package/dist/intents.d.ts +83 -0
  43. package/dist/intents.d.ts.map +1 -0
  44. package/dist/intents.js +288 -0
  45. package/dist/metaTxnMonitor.d.ts +14 -0
  46. package/dist/metaTxnMonitor.d.ts.map +1 -0
  47. package/dist/metaTxnMonitor.js +121 -0
  48. package/dist/metaTxns.d.ts +6 -0
  49. package/dist/metaTxns.d.ts.map +1 -0
  50. package/dist/metaTxns.js +4 -0
  51. package/dist/paymasterSend.d.ts +90 -0
  52. package/dist/paymasterSend.d.ts.map +1 -0
  53. package/dist/paymasterSend.js +329 -0
  54. package/dist/preconditions.d.ts +11 -0
  55. package/dist/preconditions.d.ts.map +1 -0
  56. package/dist/preconditions.js +29 -0
  57. package/dist/prepareSend.d.ts +102 -0
  58. package/dist/prepareSend.d.ts.map +1 -0
  59. package/dist/prepareSend.js +1080 -0
  60. package/dist/prices.d.ts +18 -0
  61. package/dist/prices.d.ts.map +1 -0
  62. package/dist/prices.js +142 -0
  63. package/dist/queryParams.d.ts +9 -0
  64. package/dist/queryParams.d.ts.map +1 -0
  65. package/dist/queryParams.js +66 -0
  66. package/dist/relaySdk.d.ts +65 -0
  67. package/dist/relaySdk.d.ts.map +1 -0
  68. package/dist/relaySdk.js +314 -0
  69. package/dist/relayer.d.ts +23 -0
  70. package/dist/relayer.d.ts.map +1 -0
  71. package/dist/relayer.js +230 -0
  72. package/dist/sendUserOp.d.ts +140 -0
  73. package/dist/sendUserOp.d.ts.map +1 -0
  74. package/dist/sendUserOp.js +388 -0
  75. package/dist/sequenceWallet.d.ts +79 -0
  76. package/dist/sequenceWallet.d.ts.map +1 -0
  77. package/dist/sequenceWallet.js +374 -0
  78. package/dist/theme.d.ts +3 -0
  79. package/dist/theme.d.ts.map +1 -0
  80. package/dist/theme.js +1 -0
  81. package/dist/toSimpleSmartAccount.d.ts +95 -0
  82. package/dist/toSimpleSmartAccount.d.ts.map +1 -0
  83. package/dist/toSimpleSmartAccount.js +373 -0
  84. package/dist/tokenBalances.d.ts +118 -0
  85. package/dist/tokenBalances.d.ts.map +1 -0
  86. package/dist/tokenBalances.js +492 -0
  87. package/dist/tokens.d.ts +50 -0
  88. package/dist/tokens.d.ts.map +1 -0
  89. package/dist/tokens.js +356 -0
  90. package/dist/trails.d.ts +128 -0
  91. package/dist/trails.d.ts.map +1 -0
  92. package/dist/trails.js +1031 -0
  93. package/dist/umd/trails.min.js +12610 -0
  94. package/dist/umd/trails.min.js.map +1 -0
  95. package/dist/umd.d.ts +24 -0
  96. package/dist/umd.d.ts.map +1 -0
  97. package/dist/utils.d.ts +5 -0
  98. package/dist/utils.d.ts.map +1 -0
  99. package/dist/utils.js +9 -0
  100. package/dist/widget/ConstantsUtil-B-_-u8aQ.js +6 -0
  101. package/dist/widget/add-hVLs3ldJ.js +20 -0
  102. package/dist/widget/all-wallets-Cwxnx4BT.js +11 -0
  103. package/dist/widget/app-store-CAAVQjW0.js +22 -0
  104. package/dist/widget/apple-C3BSbglw.js +23 -0
  105. package/dist/widget/arrow-bottom-circle-BGU9MmsZ.js +16 -0
  106. package/dist/widget/arrow-bottom-hS_SA8Gp.js +13 -0
  107. package/dist/widget/arrow-left-CJZanWz7.js +13 -0
  108. package/dist/widget/arrow-right-C1qL8EMd.js +13 -0
  109. package/dist/widget/arrow-top-CbuCmbQs.js +13 -0
  110. package/dist/widget/bank-CXBEEGbb.js +19 -0
  111. package/dist/widget/bin-Dqzv3zCZ.js +9 -0
  112. package/dist/widget/bitcoin-4y3sovZp.js +18 -0
  113. package/dist/widget/browser-DyOl4_8m.js +1413 -0
  114. package/dist/widget/browser-t7Fh0sEU.js +19 -0
  115. package/dist/widget/card-Bo4CZkTs.js +19 -0
  116. package/dist/widget/ccip-BynehMIN.js +232 -0
  117. package/dist/widget/checkmark-DV6OKvnY.js +16 -0
  118. package/dist/widget/checkmark-bold-CAp1-IQ2.js +13 -0
  119. package/dist/widget/chevron-bottom-BjzsVzk9.js +13 -0
  120. package/dist/widget/chevron-left-CQZBDCiR.js +13 -0
  121. package/dist/widget/chevron-right-Dhg4zeZM.js +13 -0
  122. package/dist/widget/chevron-top-CDQmfJef.js +13 -0
  123. package/dist/widget/chrome-store-BNaC_b6w.js +66 -0
  124. package/dist/widget/circle-BC_GBj91.js +9 -0
  125. package/dist/widget/clock-BmF8-4a0.js +13 -0
  126. package/dist/widget/close-Bf61nZ8o.js +13 -0
  127. package/dist/widget/coinPlaceholder-7cZW2058.js +13 -0
  128. package/dist/widget/compass-CFC3yhnW.js +13 -0
  129. package/dist/widget/components/ChainImage.d.ts +8 -0
  130. package/dist/widget/components/ChainImage.d.ts.map +1 -0
  131. package/dist/widget/components/ChainImage.js +6 -0
  132. package/dist/widget/components/ConnectWallet.d.ts +18 -0
  133. package/dist/widget/components/ConnectWallet.d.ts.map +1 -0
  134. package/dist/widget/components/ConnectWallet.js +66 -0
  135. package/dist/widget/components/DebugScreensDropdown.d.ts +9 -0
  136. package/dist/widget/components/DebugScreensDropdown.d.ts.map +1 -0
  137. package/dist/widget/components/DebugScreensDropdown.js +40 -0
  138. package/dist/widget/components/FeeOptions.d.ts +17 -0
  139. package/dist/widget/components/FeeOptions.d.ts.map +1 -0
  140. package/dist/widget/components/FeeOptions.js +65 -0
  141. package/dist/widget/components/Footer.d.ts +9 -0
  142. package/dist/widget/components/Footer.d.ts.map +1 -0
  143. package/dist/widget/components/Footer.js +13 -0
  144. package/dist/widget/components/GreenCheckAnimation.d.ts +2 -0
  145. package/dist/widget/components/GreenCheckAnimation.d.ts.map +1 -0
  146. package/dist/widget/components/GreenCheckAnimation.js +74 -0
  147. package/dist/widget/components/Modal.d.ts +11 -0
  148. package/dist/widget/components/Modal.d.ts.map +1 -0
  149. package/dist/widget/components/Modal.js +36 -0
  150. package/dist/widget/components/Receipt.d.ts +13 -0
  151. package/dist/widget/components/Receipt.d.ts.map +1 -0
  152. package/dist/widget/components/Receipt.js +36 -0
  153. package/dist/widget/components/SendForm.d.ts +44 -0
  154. package/dist/widget/components/SendForm.d.ts.map +1 -0
  155. package/dist/widget/components/SendForm.js +177 -0
  156. package/dist/widget/components/TokenImage.d.ts +10 -0
  157. package/dist/widget/components/TokenImage.d.ts.map +1 -0
  158. package/dist/widget/components/TokenImage.js +8 -0
  159. package/dist/widget/components/TokenList.d.ts +16 -0
  160. package/dist/widget/components/TokenList.d.ts.map +1 -0
  161. package/dist/widget/components/TokenList.js +39 -0
  162. package/dist/widget/components/TransferPending.d.ts +11 -0
  163. package/dist/widget/components/TransferPending.d.ts.map +1 -0
  164. package/dist/widget/components/TransferPending.js +77 -0
  165. package/dist/widget/components/TransferPendingVertical.d.ts +18 -0
  166. package/dist/widget/components/TransferPendingVertical.d.ts.map +1 -0
  167. package/dist/widget/components/TransferPendingVertical.js +183 -0
  168. package/dist/widget/components/WalletConfirmation.d.ts +18 -0
  169. package/dist/widget/components/WalletConfirmation.d.ts.map +1 -0
  170. package/dist/widget/components/WalletConfirmation.js +22 -0
  171. package/dist/widget/config.d.ts +4 -0
  172. package/dist/widget/config.d.ts.map +1 -0
  173. package/dist/widget/config.js +3 -0
  174. package/dist/widget/copy-e0xXvKN0.js +20 -0
  175. package/dist/widget/cursor-CqM3v0xJ.js +8 -0
  176. package/dist/widget/cursor-transparent-CUQpdsCG.js +17 -0
  177. package/dist/widget/desktop-DUDGIRpM.js +14 -0
  178. package/dist/widget/disconnect-DUFST9QQ.js +13 -0
  179. package/dist/widget/discord-C1cj365Z.js +22 -0
  180. package/dist/widget/email-BHhmb_lX.js +703 -0
  181. package/dist/widget/embedded-wallet-CuuC4eah.js +467 -0
  182. package/dist/widget/ethereum-CfmBVfeB.js +15 -0
  183. package/dist/widget/etherscan-BSiynDhW.js +11 -0
  184. package/dist/widget/exclamation-triangle-DEiFNpHw.js +9 -0
  185. package/dist/widget/extension-mRmfCDxo.js +13 -0
  186. package/dist/widget/external-link-B4xMIVnW.js +13 -0
  187. package/dist/widget/facebook-CBAZStBR.js +31 -0
  188. package/dist/widget/farcaster-LHDEDf5S.js +17 -0
  189. package/dist/widget/filters-CBijuvFv.js +13 -0
  190. package/dist/widget/github-C3ILD420.js +23 -0
  191. package/dist/widget/google-CSj73POX.js +23 -0
  192. package/dist/widget/help-circle-2hdG5IdB.js +17 -0
  193. package/dist/widget/hooks/useAmountUsd.d.ts +13 -0
  194. package/dist/widget/hooks/useAmountUsd.d.ts.map +1 -0
  195. package/dist/widget/hooks/useAmountUsd.js +35 -0
  196. package/dist/widget/hooks/useSendForm.d.ts +125 -0
  197. package/dist/widget/hooks/useSendForm.d.ts.map +1 -0
  198. package/dist/widget/hooks/useSendForm.js +450 -0
  199. package/dist/widget/hooks/useTokenList.d.ts +52 -0
  200. package/dist/widget/hooks/useTokenList.d.ts.map +1 -0
  201. package/dist/widget/hooks/useTokenList.js +252 -0
  202. package/dist/widget/id-ByYSrwsd.js +17 -0
  203. package/dist/widget/if-defined-DRXJEhv7.js +752 -0
  204. package/dist/widget/image-C90L4Rf6.js +9 -0
  205. package/dist/widget/index-B3SlQ9v3.js +46 -0
  206. package/dist/widget/index-B8LPuLXQ.js +78 -0
  207. package/dist/widget/index-BDbworWA.js +171 -0
  208. package/dist/widget/index-BTlDgFSK.js +98 -0
  209. package/dist/widget/index-BUCcjXbd.js +306 -0
  210. package/dist/widget/index-BZ34edi2.js +1055 -0
  211. package/dist/widget/index-BiCU29wK.js +147 -0
  212. package/dist/widget/index-BlmqIKsY.js +266 -0
  213. package/dist/widget/index-BlviH5nG.js +55 -0
  214. package/dist/widget/index-Bwd5X3fS.js +8306 -0
  215. package/dist/widget/index-C5gmknHK.js +78 -0
  216. package/dist/widget/index-CD6dBcRj.js +76 -0
  217. package/dist/widget/index-CDlhy529.js +63 -0
  218. package/dist/widget/index-CHXa5ke-.js +59 -0
  219. package/dist/widget/index-CK94R-H7.js +22498 -0
  220. package/dist/widget/index-CQzo3m3x.js +182 -0
  221. package/dist/widget/index-CRT8cAwG.js +325 -0
  222. package/dist/widget/index-CY7Lt2Yu.js +310 -0
  223. package/dist/widget/index-CiKfAu1E.js +79 -0
  224. package/dist/widget/index-CkCu6rMi.js +258 -0
  225. package/dist/widget/index-CngLTu_R.js +517 -0
  226. package/dist/widget/index-CsMV8-em.js +2577 -0
  227. package/dist/widget/index-Cu2Wva8v.js +200 -0
  228. package/dist/widget/index-DKBxLTEF.js +240 -0
  229. package/dist/widget/index-DQEVT3dx.js +511 -0
  230. package/dist/widget/index-DU2HcCis.js +200 -0
  231. package/dist/widget/index-DutZGWNW.js +321 -0
  232. package/dist/widget/index-O0glArmc.js +182 -0
  233. package/dist/widget/index-O8FmRjKe.js +63719 -0
  234. package/dist/widget/index-RtKXrB6I.js +576 -0
  235. package/dist/widget/index-TIYtS0gE.js +88 -0
  236. package/dist/widget/index-dQNJvWHs.js +66 -0
  237. package/dist/widget/index-wmEwdsq7.js +909 -0
  238. package/dist/widget/index.d.ts +3 -0
  239. package/dist/widget/index.d.ts.map +1 -0
  240. package/dist/widget/index.js +2 -0
  241. package/dist/widget/info-DMPChDjV.js +8 -0
  242. package/dist/widget/info-circle-DAvS_7nY.js +17 -0
  243. package/dist/widget/lightbulb-DnZ9mNEs.js +8 -0
  244. package/dist/widget/lit-html-BRjl1r6K.js +243 -0
  245. package/dist/widget/mail-DpaVSOP8.js +13 -0
  246. package/dist/widget/mobile-CRvdyu7I.js +14 -0
  247. package/dist/widget/more-C5VqW9PR.js +16 -0
  248. package/dist/widget/network-placeholder-CZ0vApma.js +19 -0
  249. package/dist/widget/nftPlaceholder-7jjIK2bT.js +13 -0
  250. package/dist/widget/off-4mHjJLLX.js +9 -0
  251. package/dist/widget/onramp-Bc0ozVsw.js +929 -0
  252. package/dist/widget/play-store-Uocul8nC.js +37 -0
  253. package/dist/widget/plus-DrYF7siO.js +18 -0
  254. package/dist/widget/prepareSend-BQJmzM5B.js +54987 -0
  255. package/dist/widget/qr-code-DcnGMUB3.js +11 -0
  256. package/dist/widget/receive-fvIVd7R_.js +184 -0
  257. package/dist/widget/recycle-horizontal-DrDwXC4D.js +14 -0
  258. package/dist/widget/ref-CXNmEjML.js +41 -0
  259. package/dist/widget/refresh-OK9lIPLS.js +13 -0
  260. package/dist/widget/reown-logo-C-Qn7mS3.js +17 -0
  261. package/dist/widget/search-DZqv1oKg.js +13 -0
  262. package/dist/widget/send-CJlmI-xe.js +1039 -0
  263. package/dist/widget/send-otoEC8uU.js +20 -0
  264. package/dist/widget/socials-BJciurWF.js +599 -0
  265. package/dist/widget/solana-Bv5Hs_0T.js +18 -0
  266. package/dist/widget/swapHorizontal-BzOPGV37.js +13 -0
  267. package/dist/widget/swapHorizontalBold-axyHnSmj.js +13 -0
  268. package/dist/widget/swapHorizontalMedium-C6YOPfPz.js +21 -0
  269. package/dist/widget/swapHorizontalRoundedBold-yVcLbWNT.js +13 -0
  270. package/dist/widget/swapVertical-BDjxt9pE.js +13 -0
  271. package/dist/widget/swaps-DEWNj4kd.js +1637 -0
  272. package/dist/widget/telegram-BQJD7dlP.js +21 -0
  273. package/dist/widget/three-dots-DW9jmSMG.js +10 -0
  274. package/dist/widget/transactions-uCseGQQt.js +38 -0
  275. package/dist/widget/twitch-XugxDfOE.js +23 -0
  276. package/dist/widget/twitterIcon-DQVObQUL.js +11 -0
  277. package/dist/widget/types.d.ts +51 -0
  278. package/dist/widget/types.d.ts.map +1 -0
  279. package/dist/widget/types.js +1 -0
  280. package/dist/widget/verify-DpMYHxLf.js +13 -0
  281. package/dist/widget/verify-filled-KpEL6ZJ_.js +13 -0
  282. package/dist/widget/w3m-modal-C8e-6Kba.js +1047 -0
  283. package/dist/widget/wallet-D8ssEB0o.js +13 -0
  284. package/dist/widget/wallet-placeholder-HtAy21Wc.js +19 -0
  285. package/dist/widget/walletconnect-Bp_4XfrY.js +37 -0
  286. package/dist/widget/warning-circle-FgYS7P7n.js +17 -0
  287. package/dist/widget/widget/index.js +7 -0
  288. package/dist/widget/widget.d.ts +47 -0
  289. package/dist/widget/widget.d.ts.map +1 -0
  290. package/dist/widget/widget.js +932 -0
  291. package/dist/widget/x-DlZBoP9k.js +17 -0
  292. package/dist/widget/x-mark-Ba9pt-_h.js +8 -0
  293. package/package.json +102 -8
  294. package/src/abi.ts +38 -0
  295. package/src/apiClient.ts +32 -0
  296. package/src/buffer.ts +10 -0
  297. package/src/cctp.ts +579 -0
  298. package/src/chainSwitch.ts +55 -0
  299. package/src/chains.ts +124 -0
  300. package/src/constants.ts +26 -0
  301. package/src/encoders.ts +20 -0
  302. package/src/error.ts +15 -0
  303. package/src/explorer.ts +37 -0
  304. package/src/gasless.ts +545 -0
  305. package/src/index.ts +48 -0
  306. package/src/indexerClient.ts +36 -0
  307. package/src/intents.ts +537 -0
  308. package/src/metaTxnMonitor.ts +163 -0
  309. package/src/metaTxns.ts +21 -0
  310. package/src/paymasterSend.ts +503 -0
  311. package/src/preconditions.ts +52 -0
  312. package/src/prepareSend.ts +1849 -0
  313. package/src/prices.ts +186 -0
  314. package/src/queryParams.ts +80 -0
  315. package/src/relaySdk.ts +481 -0
  316. package/src/relayer.ts +255 -0
  317. package/src/sendUserOp.ts +570 -0
  318. package/src/sequenceWallet.ts +579 -0
  319. package/src/theme.ts +2 -0
  320. package/src/toSimpleSmartAccount.ts +567 -0
  321. package/src/tokenBalances.ts +760 -0
  322. package/src/tokens.ts +471 -0
  323. package/src/trails.ts +1591 -0
  324. package/src/types.d.ts +11 -0
  325. package/src/umd.tsx +49 -0
  326. package/src/utils.ts +16 -0
  327. package/src/vite-env.d.ts +4 -0
  328. package/src/widget/assets/MetaMask-icon-fox-with-margins.svg +31 -0
  329. package/src/widget/assets/MetaMask-icon-fox.svg +26 -0
  330. package/src/widget/assets/MetaMask-logo-black.svg +3 -0
  331. package/src/widget/assets/MetaMask-logo-white.svg +16 -0
  332. package/src/widget/assets/Privy_Brandmark_Black.svg +9 -0
  333. package/src/widget/assets/Privy_Brandmark_White.svg +9 -0
  334. package/src/widget/assets/Trails-logo-black.svg +11 -0
  335. package/src/widget/assets/Trails-logo-white.svg +11 -0
  336. package/src/widget/components/ChainImage.tsx +28 -0
  337. package/src/widget/components/ConnectWallet.tsx +206 -0
  338. package/src/widget/components/DebugScreensDropdown.tsx +88 -0
  339. package/src/widget/components/FeeOptions.tsx +199 -0
  340. package/src/widget/components/Footer.tsx +51 -0
  341. package/src/widget/components/GreenCheckAnimation.tsx +119 -0
  342. package/src/widget/components/Modal.tsx +97 -0
  343. package/src/widget/components/Receipt.tsx +237 -0
  344. package/src/widget/components/SendForm.tsx +695 -0
  345. package/src/widget/components/TokenImage.tsx +37 -0
  346. package/src/widget/components/TokenList.tsx +287 -0
  347. package/src/widget/components/TransferPending.tsx +204 -0
  348. package/src/widget/components/TransferPendingVertical.tsx +412 -0
  349. package/src/widget/components/WalletConfirmation.tsx +172 -0
  350. package/src/widget/config.ts +5 -0
  351. package/src/widget/hooks/useAmountUsd.ts +59 -0
  352. package/src/widget/hooks/useSendForm.ts +715 -0
  353. package/src/widget/hooks/useTokenList.ts +397 -0
  354. package/src/widget/index.css +2 -0
  355. package/src/widget/index.tsx +8 -0
  356. package/src/widget/types/svg.d.ts +8 -0
  357. package/src/widget/types.ts +59 -0
  358. package/src/widget/widget.tsx +1438 -0
  359. package/index.js +0 -1
package/src/gasless.ts ADDED
@@ -0,0 +1,545 @@
1
+ import type {
2
+ Account,
3
+ Address,
4
+ Chain,
5
+ Hex,
6
+ PublicClient,
7
+ WalletClient,
8
+ } from "viem"
9
+ import {
10
+ encodeFunctionData,
11
+ erc20Abi,
12
+ getAddress,
13
+ maxUint256,
14
+ parseAbi,
15
+ } from "viem"
16
+ import { PERMIT_ABI, TRANSFER_ABI, TRANSFER_FROM_ABI } from "./abi.js"
17
+ import { attemptSwitchChain } from "./chainSwitch.js"
18
+
19
+ export function splitSignature(signature: `0x${string}`): {
20
+ r: `0x${string}`
21
+ s: `0x${string}`
22
+ v: number
23
+ } {
24
+ const sig = signature.slice(2)
25
+ const r = `0x${sig.slice(0, 64)}` as `0x${string}`
26
+ const s = `0x${sig.slice(64, 128)}` as `0x${string}`
27
+ const v = parseInt(sig.slice(128, 130), 16)
28
+ return { r, s, v }
29
+ }
30
+
31
+ export type PermitCalldataParams = {
32
+ signer: `0x${string}`
33
+ spender: `0x${string}`
34
+ amount: bigint
35
+ deadline: bigint
36
+ signature: `0x${string}`
37
+ }
38
+
39
+ export function getPermitCalldata({
40
+ signer,
41
+ spender,
42
+ amount,
43
+ deadline,
44
+ signature,
45
+ }: PermitCalldataParams): Hex {
46
+ const { r, s, v } = splitSignature(signature)
47
+
48
+ // Encode permit call
49
+ const permitCalldata = encodeFunctionData({
50
+ abi: [PERMIT_ABI],
51
+ functionName: "permit",
52
+ args: [signer, spender, amount, deadline, v, r, s],
53
+ })
54
+
55
+ return permitCalldata
56
+ }
57
+
58
+ export type TransferFromCalldataParams = {
59
+ signer: `0x${string}`
60
+ spender: `0x${string}`
61
+ amount: bigint
62
+ }
63
+
64
+ export function getTransferFromCalldata({
65
+ signer,
66
+ spender,
67
+ amount,
68
+ }: TransferFromCalldataParams): Hex {
69
+ // Encode transferFrom call
70
+ const transferFromCalldata = encodeFunctionData({
71
+ abi: [TRANSFER_FROM_ABI],
72
+ functionName: "transferFrom",
73
+ args: [signer, spender, amount],
74
+ })
75
+
76
+ return transferFromCalldata
77
+ }
78
+
79
+ export type TransferCalldataParams = {
80
+ recipient: `0x${string}`
81
+ amount: bigint
82
+ }
83
+
84
+ export function getTransferCalldata({
85
+ recipient,
86
+ amount,
87
+ }: TransferCalldataParams): Hex {
88
+ // Encode transfer call to recipient
89
+ const transferCalldata = encodeFunctionData({
90
+ abi: [TRANSFER_ABI],
91
+ functionName: "transfer",
92
+ args: [recipient, amount],
93
+ })
94
+
95
+ return transferCalldata
96
+ }
97
+
98
+ export function getPermitCalls(
99
+ connectedAccount: `0x${string}`,
100
+ delegatorSmartAccountAddress: `0x${string}`,
101
+ amount: bigint,
102
+ deadline: bigint,
103
+ signature: `0x${string}`,
104
+ recipient: `0x${string}`,
105
+ tokenAddress: `0x${string}`,
106
+ ): { to: `0x${string}`; data: `0x${string}`; value: string }[] {
107
+ const permitCalldata = getPermitCalldata({
108
+ signer: connectedAccount,
109
+ spender: delegatorSmartAccountAddress,
110
+ amount,
111
+ deadline,
112
+ signature,
113
+ })
114
+ const transferFromCalldata = getTransferFromCalldata({
115
+ signer: connectedAccount,
116
+ spender: delegatorSmartAccountAddress,
117
+ amount,
118
+ })
119
+ const transferCalldata = getTransferCalldata({ recipient, amount })
120
+
121
+ return [permitCalldata, transferFromCalldata, transferCalldata].map(
122
+ (call) => ({
123
+ to: tokenAddress,
124
+ data: call,
125
+ value: "0",
126
+ }),
127
+ )
128
+ }
129
+
130
+ export type GetPermitSignatureParams = {
131
+ publicClient: PublicClient
132
+ walletClient: WalletClient
133
+ signer: `0x${string}`
134
+ spender: `0x${string}`
135
+ tokenAddress: `0x${string}`
136
+ amount: bigint
137
+ chain: Chain
138
+ deadline?: bigint
139
+ }
140
+
141
+ export async function getPermitSignature({
142
+ publicClient,
143
+ walletClient,
144
+ signer,
145
+ spender,
146
+ tokenAddress,
147
+ amount,
148
+ chain,
149
+ deadline = BigInt(Math.floor(Date.now() / 1000) + 3600), // 1 hour from now
150
+ }: GetPermitSignatureParams): Promise<{
151
+ signature: `0x${string}`
152
+ deadline: bigint
153
+ v: number
154
+ r: `0x${string}`
155
+ s: `0x${string}`
156
+ }> {
157
+ if (!walletClient.account) {
158
+ throw new Error("No account found")
159
+ }
160
+
161
+ // Get permit signature from connected account
162
+ const nonce = await publicClient.readContract({
163
+ address: tokenAddress as `0x${string}`,
164
+ abi: [
165
+ {
166
+ name: "nonces",
167
+ type: "function",
168
+ stateMutability: "view",
169
+ inputs: [{ name: "owner", type: "address" }],
170
+ outputs: [{ name: "", type: "uint256" }],
171
+ },
172
+ ],
173
+ functionName: "nonces",
174
+ args: [signer],
175
+ })
176
+
177
+ const name = (await publicClient.readContract({
178
+ address: tokenAddress as `0x${string}`,
179
+ abi: [
180
+ {
181
+ name: "name",
182
+ type: "function",
183
+ stateMutability: "view",
184
+ inputs: [],
185
+ outputs: [{ name: "", type: "string" }],
186
+ },
187
+ ],
188
+ functionName: "name",
189
+ })) as string
190
+
191
+ let version = "1" // fallback default
192
+ try {
193
+ version = (await publicClient.readContract({
194
+ address: tokenAddress as `0x${string}`,
195
+ abi: [
196
+ {
197
+ name: "version",
198
+ type: "function",
199
+ stateMutability: "view",
200
+ inputs: [],
201
+ outputs: [{ name: "", type: "string" }],
202
+ },
203
+ ],
204
+ functionName: "version",
205
+ })) as string
206
+ } catch {
207
+ console.warn(
208
+ "[trails-sdk] Token does not implement version(), defaulting to '1'",
209
+ )
210
+ }
211
+
212
+ const domain = {
213
+ name,
214
+ version,
215
+ chainId: chain.id,
216
+ verifyingContract: tokenAddress as `0x${string}`,
217
+ }
218
+
219
+ const types = {
220
+ Permit: [
221
+ { name: "owner", type: "address" },
222
+ { name: "spender", type: "address" },
223
+ { name: "value", type: "uint256" },
224
+ { name: "nonce", type: "uint256" },
225
+ { name: "deadline", type: "uint256" },
226
+ ],
227
+ }
228
+
229
+ // Create permit data
230
+ const permitData = {
231
+ owner: signer,
232
+ spender: spender,
233
+ value: amount,
234
+ nonce: nonce,
235
+ deadline: deadline,
236
+ }
237
+
238
+ await attemptSwitchChain({
239
+ walletClient,
240
+ desiredChainId: chain.id,
241
+ })
242
+
243
+ console.log("[trails-sdk] Requesting permit signature...")
244
+
245
+ const signature = await walletClient.signTypedData({
246
+ account: walletClient.account,
247
+ domain,
248
+ types,
249
+ primaryType: "Permit",
250
+ message: permitData,
251
+ })
252
+
253
+ const { v, r, s } = splitSignature(signature)
254
+
255
+ return { signature, deadline, v, r, s }
256
+ }
257
+
258
+ export type GetDepositToIntentWithPermitCalldataParams = {
259
+ user: `0x${string}`
260
+ token: `0x${string}`
261
+ amount: bigint
262
+ intentAddress: `0x${string}`
263
+ deadline: bigint
264
+ permitAmount: bigint
265
+ // permit signature
266
+ v: number
267
+ r: `0x${string}`
268
+ s: `0x${string}`
269
+ // intent signature
270
+ sigV: number
271
+ sigR: `0x${string}`
272
+ sigS: `0x${string}`
273
+ }
274
+
275
+ export function getDepositToIntentWithPermitCalldata({
276
+ user,
277
+ token,
278
+ amount,
279
+ intentAddress,
280
+ deadline,
281
+ permitAmount,
282
+ v,
283
+ r,
284
+ s,
285
+ sigV,
286
+ sigR,
287
+ sigS,
288
+ }: GetDepositToIntentWithPermitCalldataParams): Hex {
289
+ const abi = parseAbi([
290
+ "function depositToIntentWithPermit(address user, address token, uint256 amount, uint256 permitAmount, address intentAddress, uint256 deadline, uint8 v, bytes32 r, bytes32 s, uint8 sigV, bytes32 sigR, bytes32 sigS)",
291
+ ])
292
+
293
+ return encodeFunctionData({
294
+ abi,
295
+ functionName: "depositToIntentWithPermit",
296
+ args: [
297
+ user,
298
+ token,
299
+ amount,
300
+ permitAmount,
301
+ intentAddress,
302
+ deadline,
303
+ v,
304
+ r,
305
+ s,
306
+ sigV,
307
+ sigR,
308
+ sigS,
309
+ ],
310
+ })
311
+ }
312
+
313
+ export type GetDepositToIntentWithoutPermitCalldataParams = {
314
+ user: `0x${string}`
315
+ token: `0x${string}`
316
+ amount: bigint
317
+ intentAddress: `0x${string}`
318
+ deadline: bigint
319
+ sigV: number
320
+ sigR: `0x${string}`
321
+ sigS: `0x${string}`
322
+ }
323
+
324
+ export function getDepositToIntentWithoutPermitCalldata({
325
+ user,
326
+ token,
327
+ amount,
328
+ intentAddress,
329
+ deadline,
330
+ sigV,
331
+ sigR,
332
+ sigS,
333
+ }: GetDepositToIntentWithoutPermitCalldataParams): Hex {
334
+ const abi = parseAbi([
335
+ "function depositToIntent(address user, address token, uint256 amount, address intentAddress, uint256 deadline, uint8 sigV, bytes32 sigR, bytes32 sigS)",
336
+ ])
337
+
338
+ return encodeFunctionData({
339
+ abi,
340
+ functionName: "depositToIntent",
341
+ args: [user, token, amount, intentAddress, deadline, sigV, sigR, sigS],
342
+ })
343
+ }
344
+
345
+ export type GetDepositToIntentCallsParams = {
346
+ publicClient: PublicClient
347
+ walletClient: WalletClient
348
+ account: Account
349
+ intentEntrypoint: `0x${string}`
350
+ depositTokenAddress: `0x${string}`
351
+ depositTokenAmount: bigint
352
+ depositRecipient: `0x${string}`
353
+ chain: Chain
354
+ }
355
+
356
+ export async function getDepositToIntentCalls({
357
+ publicClient,
358
+ walletClient,
359
+ account,
360
+ intentEntrypoint,
361
+ depositTokenAddress,
362
+ depositTokenAmount,
363
+ depositRecipient,
364
+ chain,
365
+ }: GetDepositToIntentCallsParams): Promise<
366
+ Array<{ to: `0x${string}`; data: `0x${string}`; value: `0x${string}` }>
367
+ > {
368
+ const permitAmount = maxUint256
369
+ const needsApproval = await getNeedsIntentEntrypointApproval({
370
+ client: publicClient,
371
+ token: depositTokenAddress,
372
+ account: account.address,
373
+ entrypoint: intentEntrypoint,
374
+ amount: BigInt(depositTokenAmount),
375
+ })
376
+
377
+ const deadline = BigInt(Math.floor(Date.now() / 1000) + 3600) // 1 hour from now
378
+
379
+ let approvalSignature = null
380
+ if (needsApproval) {
381
+ approvalSignature = await getPermitSignature({
382
+ publicClient,
383
+ walletClient,
384
+ signer: account.address,
385
+ spender: intentEntrypoint,
386
+ tokenAddress: depositTokenAddress as `0x${string}`,
387
+ amount: permitAmount,
388
+ chain,
389
+ deadline,
390
+ })
391
+ }
392
+
393
+ const {
394
+ v: signedIntentV,
395
+ r: signedIntentR,
396
+ s: signedIntentS,
397
+ } = await signIntent({
398
+ client: walletClient,
399
+ intentParams: {
400
+ user: account.address,
401
+ token: depositTokenAddress as `0x${string}`,
402
+ amount: BigInt(depositTokenAmount),
403
+ intentAddress: depositRecipient as `0x${string}`,
404
+ deadline,
405
+ chainId: chain.id,
406
+ contractAddress: intentEntrypoint,
407
+ },
408
+ })
409
+
410
+ let calldata = null
411
+ if (approvalSignature) {
412
+ calldata = getDepositToIntentWithPermitCalldata({
413
+ user: account.address,
414
+ token: depositTokenAddress as `0x${string}`,
415
+ amount: BigInt(depositTokenAmount),
416
+ permitAmount,
417
+ intentAddress: depositRecipient as `0x${string}`,
418
+ deadline,
419
+ v: approvalSignature.v,
420
+ r: approvalSignature.r,
421
+ s: approvalSignature.s,
422
+ sigV: signedIntentV,
423
+ sigR: signedIntentR,
424
+ sigS: signedIntentS,
425
+ })
426
+ } else {
427
+ calldata = getDepositToIntentWithoutPermitCalldata({
428
+ user: account.address,
429
+ token: depositTokenAddress as `0x${string}`,
430
+ amount: BigInt(depositTokenAmount),
431
+ intentAddress: depositRecipient as `0x${string}`,
432
+ deadline,
433
+ sigV: signedIntentV,
434
+ sigR: signedIntentR,
435
+ sigS: signedIntentS,
436
+ })
437
+ }
438
+
439
+ const calls = [
440
+ {
441
+ to: intentEntrypoint as `0x${string}`,
442
+ data: calldata as `0x${string}`,
443
+ value: "0" as `0x${string}`,
444
+ },
445
+ ]
446
+
447
+ return calls
448
+ }
449
+
450
+ export type GetNeedsIntentEntrypointApprovalParams = {
451
+ client: PublicClient
452
+ token: Address
453
+ account: Address
454
+ entrypoint: Address
455
+ amount: bigint
456
+ }
457
+
458
+ export async function getNeedsIntentEntrypointApproval({
459
+ client,
460
+ token,
461
+ account,
462
+ entrypoint,
463
+ amount,
464
+ }: GetNeedsIntentEntrypointApprovalParams): Promise<boolean> {
465
+ const allowance = await client.readContract({
466
+ address: token,
467
+ abi: erc20Abi,
468
+ functionName: "allowance",
469
+ args: [getAddress(account), getAddress(entrypoint)],
470
+ })
471
+
472
+ return allowance < amount
473
+ }
474
+
475
+ export type IntentParams = {
476
+ user: `0x${string}`
477
+ token: `0x${string}`
478
+ amount: bigint
479
+ intentAddress: `0x${string}`
480
+ deadline: bigint
481
+ chainId: number
482
+ contractAddress: `0x${string}`
483
+ }
484
+
485
+ export type SignIntentParams = {
486
+ client: WalletClient
487
+ intentParams: IntentParams
488
+ }
489
+
490
+ export async function signIntent({
491
+ client,
492
+ intentParams,
493
+ }: SignIntentParams): Promise<{
494
+ signature: `0x${string}`
495
+ v: number
496
+ r: `0x${string}`
497
+ s: `0x${string}`
498
+ }> {
499
+ const {
500
+ user,
501
+ token,
502
+ amount,
503
+ intentAddress,
504
+ deadline,
505
+ chainId,
506
+ contractAddress,
507
+ } = intentParams
508
+
509
+ const domain = {
510
+ name: "IntentEntrypoint",
511
+ version: "1",
512
+ chainId,
513
+ verifyingContract: contractAddress, // ✅ This fixes the signature mismatch
514
+ }
515
+
516
+ const types = {
517
+ Intent: [
518
+ { name: "user", type: "address" },
519
+ { name: "token", type: "address" },
520
+ { name: "amount", type: "uint256" },
521
+ { name: "intentAddress", type: "address" },
522
+ { name: "deadline", type: "uint256" },
523
+ ],
524
+ }
525
+
526
+ const message = {
527
+ user: getAddress(user),
528
+ token: getAddress(token),
529
+ amount: BigInt(amount),
530
+ intentAddress: getAddress(intentAddress),
531
+ deadline: BigInt(deadline),
532
+ }
533
+
534
+ const signature = await client.signTypedData({
535
+ account: client.account as Account,
536
+ domain,
537
+ types,
538
+ primaryType: "Intent",
539
+ message,
540
+ })
541
+
542
+ const { v, r, s } = splitSignature(signature)
543
+
544
+ return { signature, v, r, s }
545
+ }
package/src/index.ts ADDED
@@ -0,0 +1,48 @@
1
+ // Be explicit about what we export
2
+
3
+ export { getAPIClient, useAPIClient } from "./apiClient.js"
4
+ export {
5
+ getSupportedChains,
6
+ useSupportedChains,
7
+ } from "./chains.js"
8
+ export {
9
+ getIndexerGatewayClient,
10
+ useIndexerGatewayClient,
11
+ } from "./indexerClient.js"
12
+ export type {
13
+ GetIntentCallsPayloadsReturn,
14
+ OriginCallParams,
15
+ QuoteProvider,
16
+ TrailsFee,
17
+ } from "./intents.js"
18
+ export {
19
+ calculateIntentAddress,
20
+ calculateOriginAndDestinationIntentAddresses,
21
+ commitIntentConfig,
22
+ getIntentCallsPayloads,
23
+ } from "./intents.js"
24
+ export type {
25
+ MetaTxn,
26
+ MetaTxnStatus,
27
+ } from "./metaTxnMonitor.js"
28
+ export { prepareSend, useQuote } from "./prepareSend.js"
29
+ export {
30
+ getAccountTotalBalanceUsd,
31
+ getHasSufficientBalanceToken,
32
+ getHasSufficientBalanceUsd,
33
+ useAccountTotalBalanceUsd,
34
+ useHasSufficientBalanceToken,
35
+ useHasSufficientBalanceUsd,
36
+ useTokenBalances,
37
+ } from "./tokenBalances.js"
38
+ export type {
39
+ NativeTokenBalance,
40
+ TokenBalance,
41
+ } from "./tokenBalances.js"
42
+ export {
43
+ getSupportedTokens,
44
+ useSupportedTokens,
45
+ useTokenList,
46
+ } from "./tokens.js"
47
+ export { useTrails } from "./trails.js"
48
+ export type { WagmiAccount } from "./trails.js"
@@ -0,0 +1,36 @@
1
+ import { useConfig } from "@0xsequence/hooks"
2
+ import { SequenceIndexerGateway } from "@0xsequence/indexer"
3
+ import { useMemo } from "react"
4
+ import { DEFAULT_INDEXER_GATEWAY_URL } from "./constants.js"
5
+
6
+ export type IndexerGatewayConfig = {
7
+ indexerGatewayUrl?: string
8
+ projectAccessKey?: string
9
+ jwt?: string
10
+ }
11
+
12
+ export function getIndexerGatewayClient({
13
+ indexerGatewayUrl = DEFAULT_INDEXER_GATEWAY_URL,
14
+ projectAccessKey,
15
+ jwt,
16
+ }: IndexerGatewayConfig): SequenceIndexerGateway {
17
+ return new SequenceIndexerGateway(
18
+ indexerGatewayUrl as string,
19
+ projectAccessKey,
20
+ jwt,
21
+ )
22
+ }
23
+
24
+ export const useIndexerGatewayClient = (config?: IndexerGatewayConfig) => {
25
+ const { projectAccessKey, jwt, env } = useConfig()
26
+
27
+ const indexerGatewayClient = useMemo(() => {
28
+ return getIndexerGatewayClient({
29
+ indexerGatewayUrl: config?.indexerGatewayUrl ?? env.indexerGatewayUrl,
30
+ projectAccessKey: config?.projectAccessKey ?? projectAccessKey,
31
+ jwt: config?.jwt ?? jwt,
32
+ })
33
+ }, [projectAccessKey, jwt, env.indexerGatewayUrl, config])
34
+
35
+ return indexerGatewayClient
36
+ }