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/cctp.ts ADDED
@@ -0,0 +1,579 @@
1
+ import type { Chain, PublicClient, WalletClient } from "viem"
2
+ import {
3
+ createPublicClient,
4
+ encodeFunctionData,
5
+ erc20Abi,
6
+ getAddress,
7
+ http,
8
+ maxUint256,
9
+ } from "viem"
10
+ import * as chains from "viem/chains"
11
+ import { attemptSwitchChain } from "./chainSwitch.js"
12
+
13
+ const domains: Record<number, number> = {
14
+ [chains.mainnet.id]: 0,
15
+ [chains.sepolia.id]: 0,
16
+ [chains.avalanche.id]: 1,
17
+ [chains.avalancheFuji.id]: 1,
18
+ [chains.optimism.id]: 2,
19
+ [chains.optimismSepolia.id]: 2,
20
+ [chains.arbitrum.id]: 3,
21
+ [chains.arbitrumSepolia.id]: 3,
22
+ [chains.base.id]: 6,
23
+ [chains.baseSepolia.id]: 6,
24
+ [chains.polygon.id]: 7,
25
+ [chains.polygonAmoy.id]: 7,
26
+ [chains.unichain.id]: 10,
27
+ [chains.unichainSepolia.id]: 10,
28
+ [chains.linea.id]: 11,
29
+ [chains.lineaSepolia.id]: 11,
30
+ [chains.worldchain.id]: 14,
31
+ [chains.worldchainSepolia.id]: 14,
32
+ }
33
+
34
+ const tokenAddresses: Record<number, string> = {
35
+ [chains.mainnet.id]: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
36
+ [chains.sepolia.id]: "0x1c7d4b196cb0c7b01d743fbc6116a902379c7238",
37
+ [chains.avalanche.id]: "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E",
38
+ [chains.avalancheFuji.id]: "0x5425890298aed601595a70AB815c96711a31Bc65",
39
+ [chains.optimism.id]: "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
40
+ [chains.optimismSepolia.id]: "0x5fd84259d66Cd46123540766Be93DFE6D43130D7",
41
+ [chains.arbitrum.id]: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
42
+ [chains.arbitrumSepolia.id]: "0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d",
43
+ [chains.base.id]: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
44
+ [chains.baseSepolia.id]: "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
45
+ [chains.polygon.id]: "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
46
+ [chains.polygonAmoy.id]: "0x41E94Eb019C0762f9Bfcf9Fb1E58725BfB0e7582",
47
+ [chains.unichain.id]: "0x078D782b760474a361dDA0AF3839290b0EF57AD6",
48
+ [chains.unichainSepolia.id]: "0x31d0220469e10c4E71834a79b1f276d740d3768F",
49
+ [chains.linea.id]: "0x176211869cA2b568f2A7D4EE941E073a821EE1ff",
50
+ [chains.lineaSepolia.id]: "0xFEce4462D57bD51A6A552365A011b95f0E16d9B7",
51
+ [chains.worldchain.id]: "0x79A02482A880bCe3F13E09da970dC34dB4cD24D1",
52
+ [chains.worldchainSepolia.id]: "0x66145f38cBAC35Ca6F1Dfb4914dF98F1614aeA88",
53
+ }
54
+
55
+ const tokenMessengers: Record<number, string> = {
56
+ [chains.mainnet.id]: "0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d",
57
+ [chains.sepolia.id]: "0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA",
58
+ [chains.avalanche.id]: "0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d",
59
+ [chains.avalancheFuji.id]: "0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA",
60
+ [chains.optimism.id]: "0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d",
61
+ [chains.optimismSepolia.id]: "0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA",
62
+ [chains.arbitrum.id]: "0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d",
63
+ [chains.arbitrumSepolia.id]: "0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA",
64
+ [chains.base.id]: "0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d",
65
+ [chains.baseSepolia.id]: "0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA",
66
+ [chains.polygon.id]: "0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d",
67
+ [chains.polygonAmoy.id]: "0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA",
68
+ [chains.unichain.id]: "0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d",
69
+ [chains.unichainSepolia.id]: "0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA",
70
+ [chains.linea.id]: "0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d",
71
+ [chains.lineaSepolia.id]: "0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA",
72
+ [chains.worldchain.id]: "0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d",
73
+ [chains.worldchainSepolia.id]: "0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA",
74
+ }
75
+
76
+ const messageTransmitters: Record<number, string> = {
77
+ [chains.mainnet.id]: "0x81D40F21F12A8F0E3252Bccb954D722d4c464B64",
78
+ [chains.sepolia.id]: "0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275",
79
+ [chains.avalanche.id]: "0x81D40F21F12A8F0E3252Bccb954D722d4c464B64",
80
+ [chains.avalancheFuji.id]: "0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275",
81
+ [chains.optimism.id]: "0x81D40F21F12A8F0E3252Bccb954D722d4c464B64",
82
+ [chains.optimismSepolia.id]: "0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275",
83
+ [chains.arbitrum.id]: "0x81D40F21F12A8F0E3252Bccb954D722d4c464B64",
84
+ [chains.arbitrumSepolia.id]: "0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275",
85
+ [chains.base.id]: "0x81D40F21F12A8F0E3252Bccb954D722d4c464B64",
86
+ [chains.baseSepolia.id]: "0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275",
87
+ [chains.polygon.id]: "0x81D40F21F12A8F0E3252Bccb954D722d4c464B64",
88
+ [chains.polygonAmoy.id]: "0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275",
89
+ [chains.unichain.id]: "0x81D40F21F12A8F0E3252Bccb954D722d4c464B64",
90
+ [chains.unichainSepolia.id]: "0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275",
91
+ [chains.linea.id]: "0x81D40F21F12A8F0E3252Bccb954D722d4c464B64",
92
+ [chains.lineaSepolia.id]: "0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275",
93
+ [chains.worldchain.id]: "0x81D40F21F12A8F0E3252Bccb954D722d4c464B64",
94
+ [chains.worldchainSepolia.id]: "0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275",
95
+ }
96
+
97
+ export type Attestation = {
98
+ attestation: `0x${string}`
99
+ message: `0x${string}`
100
+ }
101
+
102
+ export function getDomain(chainId: number): number | null {
103
+ return domains[chainId] ?? null
104
+ }
105
+
106
+ export function getTokenAddress(chainId: number): string | null {
107
+ return tokenAddresses[chainId] ?? null
108
+ }
109
+
110
+ export function getTokenMessenger(chainId: number): string | null {
111
+ return tokenMessengers[chainId] ?? null
112
+ }
113
+
114
+ export function getMessageTransmitter(chainId: number): string | null {
115
+ return messageTransmitters[chainId] ?? null
116
+ }
117
+
118
+ export async function cctpTransfer({
119
+ walletClient,
120
+ originChain,
121
+ destinationChain,
122
+ amount,
123
+ }: {
124
+ walletClient: WalletClient
125
+ originChain: Chain
126
+ destinationChain: Chain
127
+ amount: bigint
128
+ }): Promise<{ attestation: Attestation; txHash: `0x${string}` }> {
129
+ const originToken = getTokenAddress(originChain.id)
130
+ const originDomain = getDomain(originChain.id)
131
+ const destinationDomain = getDomain(destinationChain.id)
132
+ const originTokenMessenger = getTokenMessenger(originChain.id)
133
+ const destinationAddress = walletClient.account?.address
134
+
135
+ if (
136
+ !originToken ||
137
+ !originDomain ||
138
+ !originTokenMessenger ||
139
+ !destinationDomain ||
140
+ !destinationAddress
141
+ ) {
142
+ throw new Error("Invalid origin chain")
143
+ }
144
+
145
+ const originClient = createPublicClient({
146
+ chain: originChain,
147
+ transport: http(),
148
+ })
149
+
150
+ await attemptSwitchChain({
151
+ walletClient,
152
+ desiredChainId: originChain.id,
153
+ })
154
+
155
+ const account = walletClient.account?.address
156
+ if (!account) {
157
+ throw new Error("No account found")
158
+ }
159
+
160
+ const needsApproval = await getNeedsApproval({
161
+ publicClient: originClient,
162
+ token: originToken,
163
+ account,
164
+ spender: originTokenMessenger,
165
+ amount: amount,
166
+ })
167
+
168
+ if (needsApproval) {
169
+ const txHash = await approveUSDC({
170
+ walletClient,
171
+ tokenAddress: originToken,
172
+ spender: originTokenMessenger,
173
+ amount: maxUint256,
174
+ chain: originChain,
175
+ })
176
+
177
+ console.log("waiting for approve", txHash)
178
+ await originClient.waitForTransactionReceipt({
179
+ hash: txHash,
180
+ })
181
+ console.log("approve done")
182
+ }
183
+
184
+ const maxFee = getMaxFee()
185
+
186
+ const txHash = await burnUSDC({
187
+ walletClient,
188
+ tokenMessenger: originTokenMessenger,
189
+ destinationDomain,
190
+ destinationAddress,
191
+ amount,
192
+ burnToken: originToken,
193
+ maxFee,
194
+ chain: originChain,
195
+ })
196
+
197
+ await originClient.waitForTransactionReceipt({
198
+ hash: txHash,
199
+ })
200
+
201
+ const attestation = await waitForAttestation({
202
+ domain: originDomain,
203
+ transactionHash: txHash,
204
+ })
205
+
206
+ if (!attestation) {
207
+ throw new Error("Failed to retrieve attestation")
208
+ }
209
+
210
+ return {
211
+ attestation,
212
+ txHash: txHash,
213
+ }
214
+ }
215
+
216
+ export async function cctpDestinationTx({
217
+ relayerClient,
218
+ destinationChain,
219
+ attestation,
220
+ }: {
221
+ relayerClient: WalletClient
222
+ destinationChain: Chain
223
+ attestation: Attestation
224
+ }): Promise<`0x${string}`> {
225
+ const destinationTokenMessenger = getMessageTransmitter(destinationChain.id)
226
+
227
+ if (!destinationTokenMessenger) {
228
+ throw new Error("Invalid destination chain")
229
+ }
230
+
231
+ await attemptSwitchChain({
232
+ walletClient: relayerClient,
233
+ desiredChainId: destinationChain.id,
234
+ })
235
+
236
+ const txHash = await mintUSDC({
237
+ walletClient: relayerClient,
238
+ tokenMessenger: destinationTokenMessenger,
239
+ attestation,
240
+ chain: destinationChain,
241
+ })
242
+
243
+ console.log("[trails-sdk] minted USDC")
244
+ return txHash
245
+ }
246
+
247
+ export function getMaxFee(): bigint {
248
+ return 500n // Set fast transfer max fee in 10^6 subunits (0.0005 USDC; change as needed)
249
+ }
250
+
251
+ export async function getNeedsApproval({
252
+ publicClient,
253
+ token,
254
+ account,
255
+ spender,
256
+ amount,
257
+ }: {
258
+ publicClient: PublicClient
259
+ token: string
260
+ account: string
261
+ spender: string
262
+ amount: bigint
263
+ }): Promise<boolean> {
264
+ const allowance = await publicClient.readContract({
265
+ address: token as `0x${string}`,
266
+ abi: erc20Abi,
267
+ functionName: "allowance",
268
+ args: [getAddress(account), getAddress(spender)],
269
+ })
270
+
271
+ return allowance < amount
272
+ }
273
+
274
+ export async function approveUSDC({
275
+ walletClient,
276
+ tokenAddress,
277
+ spender,
278
+ amount,
279
+ chain,
280
+ }: {
281
+ walletClient: WalletClient
282
+ tokenAddress: string
283
+ spender: string
284
+ amount: bigint
285
+ chain: Chain
286
+ }): Promise<`0x${string}`> {
287
+ const approvalData = await getApproveUSDCData({
288
+ tokenAddress,
289
+ spender,
290
+ amount,
291
+ })
292
+
293
+ console.log("[trails-sdk] approving USDC transfer", approvalData)
294
+
295
+ await attemptSwitchChain({
296
+ walletClient,
297
+ desiredChainId: chain.id,
298
+ })
299
+
300
+ const account = walletClient.account?.address
301
+ if (!account) {
302
+ throw new Error("No account found")
303
+ }
304
+
305
+ return walletClient.sendTransaction({
306
+ ...approvalData,
307
+ account: account as `0x${string}`,
308
+ chain,
309
+ })
310
+ }
311
+
312
+ async function getApproveUSDCData({
313
+ tokenAddress,
314
+ spender,
315
+ amount,
316
+ }: {
317
+ tokenAddress: string
318
+ spender: string
319
+ amount: bigint
320
+ }): Promise<{ to: `0x${string}`; data: `0x${string}`; value: bigint }> {
321
+ console.log("[trails-sdk] get approve USDC transfer data", {
322
+ tokenAddress,
323
+ spender,
324
+ amount,
325
+ })
326
+ return {
327
+ to: tokenAddress as `0x${string}`,
328
+ value: BigInt(0),
329
+ data: encodeFunctionData({
330
+ abi: [
331
+ {
332
+ type: "function",
333
+ name: "approve",
334
+ stateMutability: "nonpayable",
335
+ inputs: [
336
+ { name: "spender", type: "address" },
337
+ { name: "amount", type: "uint256" },
338
+ ],
339
+ outputs: [{ name: "", type: "bool" }],
340
+ },
341
+ ],
342
+ functionName: "approve",
343
+ args: [spender as `0x${string}`, amount],
344
+ }),
345
+ }
346
+ }
347
+
348
+ export async function burnUSDC({
349
+ walletClient,
350
+ tokenMessenger,
351
+ destinationDomain,
352
+ destinationAddress,
353
+ amount,
354
+ burnToken,
355
+ maxFee,
356
+ chain,
357
+ }: {
358
+ walletClient: WalletClient
359
+ tokenMessenger: string
360
+ destinationDomain: number
361
+ destinationAddress: string
362
+ amount: bigint
363
+ burnToken: string
364
+ maxFee: bigint
365
+ chain: Chain
366
+ }): Promise<`0x${string}`> {
367
+ const burnData = await getBurnUSDCData({
368
+ tokenMessenger,
369
+ destinationDomain,
370
+ destinationAddress,
371
+ amount,
372
+ burnToken,
373
+ maxFee: maxFee,
374
+ })
375
+
376
+ await attemptSwitchChain({
377
+ walletClient,
378
+ desiredChainId: chain.id,
379
+ })
380
+
381
+ const account = walletClient.account?.address
382
+ if (!account) {
383
+ throw new Error("No account found")
384
+ }
385
+
386
+ return walletClient.sendTransaction({
387
+ ...burnData,
388
+ account: account as `0x${string}`,
389
+ chain,
390
+ })
391
+ }
392
+
393
+ export async function getBurnUSDCData({
394
+ tokenMessenger,
395
+ destinationDomain,
396
+ destinationAddress,
397
+ amount,
398
+ burnToken,
399
+ maxFee,
400
+ }: {
401
+ tokenMessenger: string
402
+ destinationDomain: number
403
+ destinationAddress: string
404
+ amount: bigint
405
+ burnToken: string
406
+ maxFee: bigint
407
+ }): Promise<{ to: `0x${string}`; data: `0x${string}`; value: bigint }> {
408
+ console.log("[trails-sdk] get burn USDC data", {
409
+ tokenMessenger,
410
+ destinationDomain,
411
+ destinationAddress,
412
+ amount,
413
+ burnToken,
414
+ maxFee,
415
+ })
416
+ // Bytes32 Formatted Parameters
417
+ const DESTINATION_ADDRESS_BYTES32 = `0x000000000000000000000000${destinationAddress.slice(2)}` // Destination address in bytes32 format
418
+ const DESTINATION_CALLER_BYTES32 =
419
+ "0x0000000000000000000000000000000000000000000000000000000000000000" // Empty bytes32 allows any address to call MessageTransmitterV2.receiveMessage()
420
+
421
+ return {
422
+ to: tokenMessenger as `0x${string}`,
423
+ value: BigInt(0),
424
+ data: encodeFunctionData({
425
+ abi: [
426
+ {
427
+ type: "function",
428
+ name: "depositForBurn",
429
+ stateMutability: "nonpayable",
430
+ inputs: [
431
+ { name: "amount", type: "uint256" },
432
+ { name: "destinationDomain", type: "uint32" },
433
+ { name: "mintRecipient", type: "bytes32" },
434
+ { name: "burnToken", type: "address" },
435
+ { name: "destinationCaller", type: "bytes32" },
436
+ { name: "maxFee", type: "uint256" },
437
+ { name: "minFinalityThreshold", type: "uint32" },
438
+ ],
439
+ outputs: [],
440
+ },
441
+ ],
442
+ functionName: "depositForBurn",
443
+ args: [
444
+ amount,
445
+ destinationDomain,
446
+ DESTINATION_ADDRESS_BYTES32 as `0x${string}`,
447
+ burnToken as `0x${string}`,
448
+ DESTINATION_CALLER_BYTES32 as `0x${string}`,
449
+ maxFee,
450
+ 1000, // minFinalityThreshold (1000 or less for Fast Transfer)
451
+ ],
452
+ }),
453
+ }
454
+ }
455
+
456
+ export async function retrieveAttestation({
457
+ domain,
458
+ transactionHash,
459
+ }: {
460
+ domain: number
461
+ transactionHash: `0x${string}`
462
+ }): Promise<Attestation | null> {
463
+ console.log("[trails-sdk] retrieving attestation", {
464
+ domain,
465
+ transactionHash,
466
+ })
467
+ const url = `https://iris-api-sandbox.circle.com/v2/messages/${domain}?transactionHash=${transactionHash}`
468
+ while (true) {
469
+ try {
470
+ const response = await fetch(url)
471
+ const data = await response.json()
472
+ if (response.status === 404) {
473
+ console.log("[trails-sdk] waiting for attestation...")
474
+ }
475
+ if (data?.messages?.[0]?.status === "complete") {
476
+ console.log("[trails-sdk] attestation retrieved successfully!")
477
+ return data.messages[0]
478
+ }
479
+ console.log("[trails-sdk] waiting for attestation...")
480
+ await new Promise((resolve) => setTimeout(resolve, 5000))
481
+ } catch (error: unknown) {
482
+ console.error(
483
+ "[trails-sdk] error fetching attestation:",
484
+ error instanceof Error ? error.message : String(error),
485
+ )
486
+ await new Promise((resolve) => setTimeout(resolve, 5000))
487
+ }
488
+ }
489
+ }
490
+
491
+ export async function mintUSDC({
492
+ walletClient,
493
+ tokenMessenger,
494
+ attestation,
495
+ chain,
496
+ }: {
497
+ walletClient: WalletClient
498
+ tokenMessenger: string
499
+ attestation: Attestation
500
+ chain: Chain
501
+ }): Promise<`0x${string}`> {
502
+ const mintData = await getMintUSDCData({
503
+ tokenMessenger,
504
+ attestation,
505
+ })
506
+
507
+ await attemptSwitchChain({
508
+ walletClient,
509
+ desiredChainId: chain.id,
510
+ })
511
+
512
+ const account = walletClient.account?.address
513
+ if (!account) {
514
+ throw new Error("No account found")
515
+ }
516
+
517
+ return walletClient.sendTransaction({
518
+ ...mintData,
519
+ account: account as `0x${string}`,
520
+ chain,
521
+ })
522
+ }
523
+
524
+ export async function getMintUSDCData({
525
+ tokenMessenger,
526
+ attestation,
527
+ }: {
528
+ tokenMessenger: string
529
+ attestation: Attestation
530
+ }): Promise<{ to: `0x${string}`; data: `0x${string}`; value: bigint }> {
531
+ console.log("[trails-sdk] get mint USDC data", {
532
+ tokenMessenger,
533
+ attestation,
534
+ })
535
+ return {
536
+ to: tokenMessenger as `0x${string}`,
537
+ value: BigInt(0),
538
+ data: encodeFunctionData({
539
+ abi: [
540
+ {
541
+ type: "function",
542
+ name: "receiveMessage",
543
+ stateMutability: "nonpayable",
544
+ inputs: [
545
+ { name: "message", type: "bytes" },
546
+ { name: "attestation", type: "bytes" },
547
+ ],
548
+ outputs: [],
549
+ },
550
+ ],
551
+ functionName: "receiveMessage",
552
+ args: [attestation.message, attestation.attestation],
553
+ }),
554
+ }
555
+ }
556
+
557
+ export async function waitForAttestation({
558
+ domain,
559
+ transactionHash,
560
+ }: {
561
+ domain: number
562
+ transactionHash: `0x${string}`
563
+ }): Promise<Attestation | null> {
564
+ while (true) {
565
+ const attestation = await retrieveAttestation({
566
+ domain,
567
+ transactionHash,
568
+ })
569
+ if (attestation) {
570
+ return attestation
571
+ }
572
+ console.log("[trails-sdk] waiting for attestation...")
573
+ await new Promise((resolve) => setTimeout(resolve, 1000))
574
+ }
575
+ }
576
+
577
+ export function getIsUsdcAddress(address: string, chainId: number): boolean {
578
+ return address?.toLowerCase() === tokenAddresses[chainId]?.toLowerCase()
579
+ }
@@ -0,0 +1,55 @@
1
+ import type { WalletClient } from "viem"
2
+ import { getChainInfo } from "./chains.js"
3
+
4
+ export type AttemptSwitchChainParams = {
5
+ walletClient: WalletClient
6
+ desiredChainId: number
7
+ }
8
+
9
+ export async function attemptSwitchChain({
10
+ walletClient,
11
+ desiredChainId,
12
+ }: AttemptSwitchChainParams): Promise<void> {
13
+ try {
14
+ // Check if the chain was switched successfully
15
+ let currentChainId = await walletClient.getChainId()
16
+ if (currentChainId === desiredChainId) {
17
+ console.log("[trails-sdk] Chain already switched to:", desiredChainId)
18
+ return
19
+ }
20
+
21
+ console.log(
22
+ "[trails-sdk] Switching to chain:",
23
+ desiredChainId,
24
+ "currentChainId",
25
+ currentChainId,
26
+ )
27
+ await walletClient.switchChain({ id: desiredChainId })
28
+
29
+ // Check if the chain was switched successfully
30
+ currentChainId = await walletClient.getChainId()
31
+ if (currentChainId !== desiredChainId) {
32
+ throw new Error("Failed to switch chain")
33
+ }
34
+
35
+ console.log("[trails-sdk] Chain switched to:", desiredChainId)
36
+ } catch (error: unknown) {
37
+ if (
38
+ error instanceof Error &&
39
+ error.message.includes("wallet_addEthereumChain")
40
+ ) {
41
+ const chainInfo = getChainInfo(desiredChainId)
42
+ if (chainInfo) {
43
+ await walletClient.addChain({
44
+ chain: chainInfo,
45
+ })
46
+ return attemptSwitchChain({ walletClient, desiredChainId })
47
+ }
48
+ }
49
+
50
+ console.error("[trails-sdk] Chain switch failed:", error)
51
+ throw new Error(
52
+ `[trails-sdk] Failed to switch chain: ${error instanceof Error ? error.message : "Unknown error"}`,
53
+ )
54
+ }
55
+ }