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
@@ -0,0 +1,503 @@
1
+ import type { Account, Chain, PublicClient, WalletClient } from "viem"
2
+ import {
3
+ createPublicClient,
4
+ encodeFunctionData,
5
+ encodePacked,
6
+ http,
7
+ pad,
8
+ parseAbi,
9
+ parseEther,
10
+ parseGwei,
11
+ toHex,
12
+ zeroAddress,
13
+ } from "viem"
14
+ import type { UserOperation } from "viem/account-abstraction"
15
+ import {
16
+ createBundlerClient,
17
+ createPaymasterClient,
18
+ prepareUserOperation,
19
+ } from "viem/account-abstraction"
20
+ import { generatePrivateKey, privateKeyToAccount } from "viem/accounts"
21
+ import {
22
+ getPermitCalldata,
23
+ getPermitSignature,
24
+ getTransferCalldata,
25
+ getTransferFromCalldata,
26
+ } from "./gasless.js"
27
+ import { sendUserOperationDirectly } from "./sendUserOp.js"
28
+ import type { ToSimpleSmartAccountReturnType } from "./toSimpleSmartAccount.js"
29
+ import { toSimpleSmartAccount } from "./toSimpleSmartAccount.js"
30
+
31
+ // --- Interfaces ---
32
+
33
+ interface PackedCall {
34
+ to: `0x${string}`
35
+ value: bigint
36
+ gasLimit: bigint
37
+ behaviorOnError: number
38
+ data: `0x${string}`
39
+ }
40
+
41
+ interface Payload {
42
+ kind: number
43
+ noChainId: boolean
44
+ space: number
45
+ nonce: number
46
+ parentWallets: string[]
47
+ calls: PackedCall[]
48
+ }
49
+
50
+ type UserOpWithSignature = UserOperation & { signature: `0x${string}` }
51
+
52
+ // --- ABIs ---
53
+
54
+ export const ENTRYPOINT_ABI = [
55
+ {
56
+ name: "handleOps",
57
+ type: "function",
58
+ stateMutability: "nonpayable",
59
+ inputs: [
60
+ {
61
+ name: "ops",
62
+ type: "tuple[]",
63
+ components: [
64
+ { name: "sender", type: "address" },
65
+ { name: "nonce", type: "uint256" },
66
+ { name: "initCode", type: "bytes" },
67
+ { name: "callData", type: "bytes" },
68
+ { name: "callGasLimit", type: "uint256" },
69
+ { name: "verificationGasLimit", type: "uint256" },
70
+ { name: "preVerificationGas", type: "uint256" },
71
+ { name: "maxFeePerGas", type: "uint256" },
72
+ { name: "maxPriorityFeePerGas", type: "uint256" },
73
+ { name: "paymasterAndData", type: "bytes" },
74
+ { name: "signature", type: "bytes" },
75
+ ],
76
+ },
77
+ {
78
+ name: "beneficiary",
79
+ type: "address",
80
+ },
81
+ ],
82
+ outputs: [],
83
+ },
84
+ {
85
+ name: "getUserOpHash",
86
+ type: "function",
87
+ stateMutability: "view",
88
+ inputs: [
89
+ {
90
+ name: "userOp",
91
+ type: "tuple",
92
+ components: [
93
+ { name: "sender", type: "address" },
94
+ { name: "nonce", type: "uint256" },
95
+ { name: "initCode", type: "bytes" },
96
+ { name: "callData", type: "bytes" },
97
+ { name: "accountGasLimits", type: "bytes32" },
98
+ { name: "preVerificationGas", type: "uint256" },
99
+ { name: "gasFees", type: "bytes32" },
100
+ { name: "paymasterAndData", type: "bytes" },
101
+ { name: "signature", type: "bytes" },
102
+ ],
103
+ },
104
+ ],
105
+ outputs: [
106
+ {
107
+ name: "",
108
+ type: "bytes32",
109
+ },
110
+ ],
111
+ },
112
+ ]
113
+
114
+ const ENTRYPOINT_ADDRESS = "0x0000000071727de22e5e9d8baf0edac6f37da032"
115
+
116
+ // --- Payload packer ---
117
+
118
+ export function packPayload(payload: Payload): `0x${string}` {
119
+ const globalFlag = 0x00
120
+ const numCalls = payload.calls.length
121
+
122
+ const encodedCalls = payload.calls.map((call) => {
123
+ const callFlags = 0x4a // has value + gas limit + revert on error
124
+ return encodePacked(
125
+ ["uint8", "address", "uint256", "uint256", "bytes"],
126
+ [callFlags, call.to, call.value, call.gasLimit, call.data],
127
+ )
128
+ })
129
+
130
+ return encodePacked(
131
+ ["uint8", "bytes20", "uint8", ...Array(numCalls).fill("bytes")],
132
+ [
133
+ globalFlag,
134
+ pad(toHex(payload.space), { size: 20 }),
135
+ numCalls,
136
+ ...encodedCalls,
137
+ ],
138
+ )
139
+ }
140
+
141
+ // --- Main logic ---
142
+
143
+ export async function getDelegatorSmartAccount({
144
+ publicClient,
145
+ }: {
146
+ publicClient: PublicClient
147
+ }): Promise<ToSimpleSmartAccountReturnType> {
148
+ // Create delegator account from private key
149
+ const delegatorPrivateKey = generatePrivateKey()
150
+ const delegatorAccount = privateKeyToAccount(delegatorPrivateKey)
151
+ console.log("[trails-sdk] Delegator account:", delegatorAccount.address)
152
+
153
+ // Initialize delegator smart account
154
+ console.log("Creating smart account...")
155
+ const delegatorSmartAccount = await toSimpleSmartAccount({
156
+ client: publicClient,
157
+ entryPoint: {
158
+ address: ENTRYPOINT_ADDRESS,
159
+ version: "0.7",
160
+ },
161
+ owner: privateKeyToAccount(delegatorPrivateKey),
162
+ })
163
+
164
+ console.log(
165
+ "[trails-sdk] Smart account address:",
166
+ delegatorSmartAccount.address,
167
+ )
168
+
169
+ console.log(
170
+ "[trails-sdk] delegatorSmartAccount.address",
171
+ delegatorSmartAccount.address,
172
+ )
173
+
174
+ return delegatorSmartAccount
175
+ }
176
+
177
+ export async function getPaymasterGaslessTransaction({
178
+ walletClient,
179
+ chain,
180
+ tokenAddress,
181
+ amount,
182
+ recipient,
183
+ delegatorSmartAccount,
184
+ }: {
185
+ walletClient: WalletClient
186
+ chain: Chain
187
+ tokenAddress: `0x${string}`
188
+ amount: bigint
189
+ recipient: `0x${string}`
190
+ delegatorSmartAccount: ToSimpleSmartAccountReturnType
191
+ }): Promise<{ to: string; data: string; value: string }[]> {
192
+ // Initialize clients
193
+ const publicClient = createPublicClient({
194
+ chain,
195
+ transport: http(),
196
+ })
197
+
198
+ if (!walletClient.account) {
199
+ throw new Error("No account found")
200
+ }
201
+
202
+ const connectedAccount = walletClient.account.address as `0x${string}`
203
+
204
+ console.log("[trails-sdk] Transfer amount:", amount.toString())
205
+
206
+ const { signature, deadline } = await getPermitSignature({
207
+ publicClient,
208
+ walletClient,
209
+ signer: connectedAccount,
210
+ spender: delegatorSmartAccount.address,
211
+ tokenAddress,
212
+ amount,
213
+ chain,
214
+ })
215
+
216
+ console.log("[trails-sdk] Received signature:", signature)
217
+
218
+ // Encode permit call
219
+ const permitCalldata = getPermitCalldata({
220
+ signer: connectedAccount,
221
+ spender: delegatorSmartAccount.address,
222
+ amount,
223
+ deadline,
224
+ signature,
225
+ })
226
+
227
+ // Encode transferFrom call
228
+ const transferFromCalldata = getTransferFromCalldata({
229
+ signer: connectedAccount,
230
+ spender: delegatorSmartAccount.address,
231
+ amount,
232
+ })
233
+
234
+ // Encode transfer call to recipient
235
+ const transferCalldata = getTransferCalldata({ recipient, amount })
236
+
237
+ const calls = [
238
+ { to: zeroAddress, data: "0x", value: "0x" },
239
+ { to: tokenAddress, data: permitCalldata, value: "0x" },
240
+ { to: tokenAddress, data: transferFromCalldata, value: "0x" },
241
+ { to: tokenAddress, data: transferCalldata, value: "0x" },
242
+ ]
243
+
244
+ return calls
245
+ }
246
+
247
+ export async function sendPaymasterGaslessTransaction({
248
+ walletClient,
249
+ publicClient,
250
+ chain,
251
+ paymasterUrl,
252
+ delegatorSmartAccount,
253
+ calls,
254
+ }: {
255
+ walletClient: WalletClient
256
+ publicClient: PublicClient
257
+ chain: Chain
258
+ paymasterUrl: string
259
+ delegatorSmartAccount: ToSimpleSmartAccountReturnType
260
+ calls: { to: string; data: string; value: string }[]
261
+ }): Promise<string> {
262
+ try {
263
+ if (!walletClient.account) {
264
+ throw new Error("No account found")
265
+ }
266
+
267
+ // Create relayer wallet
268
+ // const relayerAccount = privateKeyToAccount(
269
+ // RELAYER_PRIVATE_KEY as `0x${string}`,
270
+ // )
271
+ // const relayerClient = createWalletClient({
272
+ // account: relayerAccount,
273
+ // chain,
274
+ // transport: http(),
275
+ // })
276
+
277
+ // console.log("[trails-sdk] Relayer address:", relayerAccount.address)
278
+
279
+ // console.log('[trails-sdk] Staking on entry point...')
280
+ // await stakeOnEntryPoint({ relayerClient, relayerAccount, delegatorAddress: delegatorAccount.address, chain })
281
+
282
+ // const prefundTx = await relayerClient.sendTransaction({
283
+ // to: delegatorSmartAccount.address,
284
+ // value: parseEther('0.0005'),
285
+ // chain: chain
286
+ // });
287
+
288
+ // console.log('[trails-sdk] Prefund tx:', prefundTx);
289
+
290
+ // const prefundReceipt = await publicClient.waitForTransactionReceipt({ hash: prefundTx });
291
+ // console.log('[trails-sdk] Prefund receipt:', prefundReceipt);
292
+
293
+ console.log("[trails-sdk] Estimating gas fees...")
294
+ const fees = await publicClient.estimateFeesPerGas()
295
+
296
+ const maxPriorityFeePerGas = parseGwei("1") // adjustable
297
+ const maxFeePerGas = fees.maxFeePerGas! + maxPriorityFeePerGas
298
+
299
+ if (paymasterUrl) {
300
+ // alchemy bundler doesn't support paymaster client
301
+ if (paymasterUrl.includes("alchemy")) {
302
+ const bundlerClient = createBundlerClient({
303
+ chain: chain,
304
+ transport: http(paymasterUrl),
305
+ })
306
+
307
+ console.log("[trails-sdk] preparing user op")
308
+
309
+ const userOp = await prepareUserOperation(publicClient, {
310
+ account: delegatorSmartAccount,
311
+ calls,
312
+ maxFeePerGas,
313
+ maxPriorityFeePerGas,
314
+ callGasLimit: 500_000n,
315
+ verificationGasLimit: 500_000n,
316
+ preVerificationGas: 500_000n,
317
+ })
318
+
319
+ const signedUserOp =
320
+ await delegatorSmartAccount.signUserOperation(userOp)
321
+ ;(userOp as UserOpWithSignature).signature = signedUserOp
322
+
323
+ console.log("[trails-sdk] Signed user operation:", signedUserOp)
324
+
325
+ console.log("[trails-sdk] Sending user operation...")
326
+ const hash = await bundlerClient.sendUserOperation(userOp)
327
+ console.log("[trails-sdk] User operation sent! Hash:", hash)
328
+ const receipt = await bundlerClient.waitForUserOperationReceipt({
329
+ hash: hash as `0x${string}`,
330
+ })
331
+
332
+ console.log("[trails-sdk] User operation receipt:", receipt)
333
+
334
+ return receipt.receipt.transactionHash
335
+ } else {
336
+ // other bundlers: thirdweb, pimlico, zerodev, etc
337
+ const paymasterClient = createPaymasterClient({
338
+ transport: http(paymasterUrl),
339
+ })
340
+
341
+ const bundlerClient = createBundlerClient({
342
+ chain: chain,
343
+ paymaster: paymasterClient,
344
+ transport: http(paymasterUrl),
345
+ })
346
+
347
+ console.log("[trails-sdk] preparing user op")
348
+
349
+ let userOp = await prepareUserOperation(publicClient, {
350
+ account: delegatorSmartAccount,
351
+ calls,
352
+ maxFeePerGas,
353
+ maxPriorityFeePerGas,
354
+ callGasLimit: 500_000n,
355
+ verificationGasLimit: 500_000n,
356
+ preVerificationGas: 500_000n,
357
+ })
358
+
359
+ // Add paymaster data
360
+ userOp = await bundlerClient.prepareUserOperation({
361
+ ...userOp,
362
+ })
363
+
364
+ console.log("[trails-sdk] preparedUserOp", userOp)
365
+
366
+ const signedUserOp =
367
+ await delegatorSmartAccount.signUserOperation(userOp)
368
+ ;(userOp as UserOpWithSignature).signature = signedUserOp
369
+
370
+ console.log("[trails-sdk] Signed user operation:", signedUserOp)
371
+
372
+ console.log("[trails-sdk] Sending user operation...")
373
+ const hash = await bundlerClient.sendUserOperation(userOp)
374
+ console.log("[trails-sdk] User operation sent! Hash:", hash)
375
+ const receipt = await bundlerClient.waitForUserOperationReceipt({
376
+ hash: hash as `0x${string}`,
377
+ })
378
+
379
+ console.log("[trails-sdk] User operation receipt:", receipt)
380
+
381
+ return receipt.receipt.transactionHash
382
+ }
383
+ } else {
384
+ // --- Send user operation directly ---
385
+ const RELAYER_PRIVATE_KEY = "" // This is for testing only
386
+
387
+ console.log("[trails-sdk] preparing user op")
388
+ const userOp1 = await prepareUserOperation(publicClient, {
389
+ account: delegatorSmartAccount,
390
+ calls,
391
+ maxFeePerGas,
392
+ maxPriorityFeePerGas,
393
+ callGasLimit: 500_000n,
394
+ verificationGasLimit: 500_000n,
395
+ preVerificationGas: 500_000n,
396
+ paymasterAndData: "0x",
397
+ })
398
+
399
+ console.log("[trails-sdk] preparedUserOp", userOp1)
400
+
401
+ const requiredPrefund = getRequiredPrefund(userOp1)
402
+ console.log("[trails-sdk] Required prefund:", requiredPrefund)
403
+
404
+ const balance = await publicClient.getBalance({
405
+ address: delegatorSmartAccount.address,
406
+ })
407
+ console.log("[trails-sdk] Balance:", balance)
408
+
409
+ const signedUserOp1 =
410
+ await delegatorSmartAccount.signUserOperation(userOp1)
411
+ ;(userOp1 as UserOpWithSignature).signature = signedUserOp1
412
+
413
+ console.log("[trails-sdk] Signed user operation:", signedUserOp1)
414
+
415
+ const txHash = await sendUserOperationDirectly({
416
+ userOp: userOp1,
417
+ relayerPrivateKey: RELAYER_PRIVATE_KEY as `0x${string}`,
418
+ chain: chain,
419
+ })
420
+
421
+ console.log("[trails-sdk] User operation submitted! Hash:", txHash)
422
+
423
+ return txHash
424
+ }
425
+ } catch (error) {
426
+ console.error("[trails-sdk] Gasless flow error:", error)
427
+ throw error
428
+ }
429
+ }
430
+
431
+ export type stakeOnEntryPointParams = {
432
+ relayerClient: WalletClient
433
+ relayerAccount: Account
434
+ delegatorAddress: `0x${string}`
435
+ chain: Chain
436
+ }
437
+
438
+ export async function stakeOnEntryPoint({
439
+ relayerClient,
440
+ relayerAccount,
441
+ delegatorAddress,
442
+ chain,
443
+ }: stakeOnEntryPointParams) {
444
+ const STAKE_AMOUNT = parseEther("0.01")
445
+
446
+ const addStakeAbi = parseAbi([
447
+ "function addStake(uint32 unstakeDelaySec) public payable",
448
+ "function depositTo(address to) public payable",
449
+ ])
450
+
451
+ const shouldStake = false
452
+ if (shouldStake) {
453
+ const addStakeData = encodeFunctionData({
454
+ abi: addStakeAbi,
455
+ functionName: "addStake",
456
+ args: [95000], // unstakeDelaySec needs to be 1 day minimum
457
+ })
458
+
459
+ const txHash = await relayerClient.sendTransaction({
460
+ account: relayerAccount,
461
+ to: ENTRYPOINT_ADDRESS,
462
+ data: addStakeData,
463
+ value: STAKE_AMOUNT,
464
+ chain: chain,
465
+ })
466
+
467
+ console.log(`[trails-sdk] [Stake] Transaction sent: ${txHash}`)
468
+
469
+ // const receipt = await relayerClient.waitForTransactionReceipt({ hash: txHash })
470
+ // console.log(`[trails-sdk] [Stake] Transaction receipt: ${receipt}`)
471
+ }
472
+
473
+ const depositData = encodeFunctionData({
474
+ abi: addStakeAbi,
475
+ functionName: "depositTo",
476
+ args: [delegatorAddress],
477
+ })
478
+
479
+ const txHash2 = await relayerClient.sendTransaction({
480
+ account: relayerAccount,
481
+ to: ENTRYPOINT_ADDRESS,
482
+ value: STAKE_AMOUNT,
483
+ data: depositData,
484
+ chain: chain,
485
+ })
486
+
487
+ console.log(`[trails-sdk] [Stake] Transaction sent: ${txHash2}`)
488
+
489
+ return txHash2
490
+ }
491
+
492
+ export const getRequiredPrefund = (userOperation: UserOperation) => {
493
+ const op = userOperation
494
+
495
+ const requiredGas =
496
+ op.verificationGasLimit +
497
+ op.callGasLimit +
498
+ (op.paymasterVerificationGasLimit || 0n) +
499
+ (op.paymasterPostOpGasLimit || 0n) +
500
+ op.preVerificationGas
501
+
502
+ return requiredGas * op.maxFeePerGas
503
+ }
@@ -0,0 +1,52 @@
1
+ import type { IntentPrecondition } from "@0xsequence/trails-api"
2
+
3
+ export function findPreconditionAddresses(
4
+ preconditions: IntentPrecondition[],
5
+ originChainId: number,
6
+ destinationChainId: number,
7
+ ): { originAddress?: string; destinationAddress?: string } {
8
+ const origin = preconditions.find(
9
+ (p) => p.chainId === originChainId.toString() && p.data?.address,
10
+ )
11
+ const destination = preconditions.find(
12
+ (p) => p.chainId === destinationChainId.toString() && p.data?.address,
13
+ )
14
+
15
+ return {
16
+ originAddress: origin?.data?.address,
17
+ destinationAddress: destination?.data?.address,
18
+ }
19
+ }
20
+
21
+ export function findChainAndAddressesFromPreconditions(
22
+ preconditions: IntentPrecondition[],
23
+ ): { chainId: number; address: string }[] {
24
+ const addressesFromPreconditions: { chainId: number; address: string }[] = []
25
+ preconditions.forEach((p) => {
26
+ if (
27
+ (p.type === "erc20-balance" ||
28
+ p.type === "native-balance" ||
29
+ p.type === "transfer-native") &&
30
+ p.data?.address &&
31
+ p.chainId
32
+ ) {
33
+ addressesFromPreconditions.push({
34
+ chainId: parseInt(p.chainId),
35
+ address: p.data.address,
36
+ })
37
+ }
38
+ })
39
+ return addressesFromPreconditions
40
+ }
41
+
42
+ export function findFirstPreconditionForChainId(
43
+ preconditions: IntentPrecondition[],
44
+ chainId: number,
45
+ ): IntentPrecondition | null {
46
+ const precondition = preconditions.find(
47
+ (p) =>
48
+ (p.type === "erc20-balance" || p.type === "native-balance") &&
49
+ p.chainId === chainId?.toString(),
50
+ )
51
+ return precondition ?? null
52
+ }