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.
- package/LICENSE +202 -0
- package/README.md +42 -0
- package/dist/abi.d.ts +37 -0
- package/dist/abi.d.ts.map +1 -0
- package/dist/abi.js +36 -0
- package/dist/apiClient.d.ts +9 -0
- package/dist/apiClient.d.ts.map +1 -0
- package/dist/apiClient.js +18 -0
- package/dist/buffer.d.ts +3 -0
- package/dist/buffer.d.ts.map +1 -0
- package/dist/buffer.js +8 -0
- package/dist/cctp.d.ts +84 -0
- package/dist/cctp.d.ts.map +1 -0
- package/dist/cctp.js +401 -0
- package/dist/chainSwitch.d.ts +7 -0
- package/dist/chainSwitch.d.ts.map +1 -0
- package/dist/chainSwitch.js +33 -0
- package/dist/chains.d.ts +13 -0
- package/dist/chains.d.ts.map +1 -0
- package/dist/chains.js +95 -0
- package/dist/constants.d.ts +11 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +16 -0
- package/dist/encoders.d.ts +7 -0
- package/dist/encoders.d.ts.map +1 -0
- package/dist/encoders.js +8 -0
- package/dist/error.d.ts +2 -0
- package/dist/error.d.ts.map +1 -0
- package/dist/error.js +12 -0
- package/dist/explorer.d.ts +12 -0
- package/dist/explorer.d.ts.map +1 -0
- package/dist/explorer.js +18 -0
- package/dist/gasless.d.ts +116 -0
- package/dist/gasless.d.ts.map +1 -0
- package/dist/gasless.js +297 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/indexerClient.d.ts +9 -0
- package/dist/indexerClient.d.ts.map +1 -0
- package/dist/indexerClient.js +18 -0
- package/dist/intents.d.ts +83 -0
- package/dist/intents.d.ts.map +1 -0
- package/dist/intents.js +288 -0
- package/dist/metaTxnMonitor.d.ts +14 -0
- package/dist/metaTxnMonitor.d.ts.map +1 -0
- package/dist/metaTxnMonitor.js +121 -0
- package/dist/metaTxns.d.ts +6 -0
- package/dist/metaTxns.d.ts.map +1 -0
- package/dist/metaTxns.js +4 -0
- package/dist/paymasterSend.d.ts +90 -0
- package/dist/paymasterSend.d.ts.map +1 -0
- package/dist/paymasterSend.js +329 -0
- package/dist/preconditions.d.ts +11 -0
- package/dist/preconditions.d.ts.map +1 -0
- package/dist/preconditions.js +29 -0
- package/dist/prepareSend.d.ts +102 -0
- package/dist/prepareSend.d.ts.map +1 -0
- package/dist/prepareSend.js +1080 -0
- package/dist/prices.d.ts +18 -0
- package/dist/prices.d.ts.map +1 -0
- package/dist/prices.js +142 -0
- package/dist/queryParams.d.ts +9 -0
- package/dist/queryParams.d.ts.map +1 -0
- package/dist/queryParams.js +66 -0
- package/dist/relaySdk.d.ts +65 -0
- package/dist/relaySdk.d.ts.map +1 -0
- package/dist/relaySdk.js +314 -0
- package/dist/relayer.d.ts +23 -0
- package/dist/relayer.d.ts.map +1 -0
- package/dist/relayer.js +230 -0
- package/dist/sendUserOp.d.ts +140 -0
- package/dist/sendUserOp.d.ts.map +1 -0
- package/dist/sendUserOp.js +388 -0
- package/dist/sequenceWallet.d.ts +79 -0
- package/dist/sequenceWallet.d.ts.map +1 -0
- package/dist/sequenceWallet.js +374 -0
- package/dist/theme.d.ts +3 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +1 -0
- package/dist/toSimpleSmartAccount.d.ts +95 -0
- package/dist/toSimpleSmartAccount.d.ts.map +1 -0
- package/dist/toSimpleSmartAccount.js +373 -0
- package/dist/tokenBalances.d.ts +118 -0
- package/dist/tokenBalances.d.ts.map +1 -0
- package/dist/tokenBalances.js +492 -0
- package/dist/tokens.d.ts +50 -0
- package/dist/tokens.d.ts.map +1 -0
- package/dist/tokens.js +356 -0
- package/dist/trails.d.ts +128 -0
- package/dist/trails.d.ts.map +1 -0
- package/dist/trails.js +1031 -0
- package/dist/umd/trails.min.js +12610 -0
- package/dist/umd/trails.min.js.map +1 -0
- package/dist/umd.d.ts +24 -0
- package/dist/umd.d.ts.map +1 -0
- package/dist/utils.d.ts +5 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +9 -0
- package/dist/widget/ConstantsUtil-B-_-u8aQ.js +6 -0
- package/dist/widget/add-hVLs3ldJ.js +20 -0
- package/dist/widget/all-wallets-Cwxnx4BT.js +11 -0
- package/dist/widget/app-store-CAAVQjW0.js +22 -0
- package/dist/widget/apple-C3BSbglw.js +23 -0
- package/dist/widget/arrow-bottom-circle-BGU9MmsZ.js +16 -0
- package/dist/widget/arrow-bottom-hS_SA8Gp.js +13 -0
- package/dist/widget/arrow-left-CJZanWz7.js +13 -0
- package/dist/widget/arrow-right-C1qL8EMd.js +13 -0
- package/dist/widget/arrow-top-CbuCmbQs.js +13 -0
- package/dist/widget/bank-CXBEEGbb.js +19 -0
- package/dist/widget/bin-Dqzv3zCZ.js +9 -0
- package/dist/widget/bitcoin-4y3sovZp.js +18 -0
- package/dist/widget/browser-DyOl4_8m.js +1413 -0
- package/dist/widget/browser-t7Fh0sEU.js +19 -0
- package/dist/widget/card-Bo4CZkTs.js +19 -0
- package/dist/widget/ccip-BynehMIN.js +232 -0
- package/dist/widget/checkmark-DV6OKvnY.js +16 -0
- package/dist/widget/checkmark-bold-CAp1-IQ2.js +13 -0
- package/dist/widget/chevron-bottom-BjzsVzk9.js +13 -0
- package/dist/widget/chevron-left-CQZBDCiR.js +13 -0
- package/dist/widget/chevron-right-Dhg4zeZM.js +13 -0
- package/dist/widget/chevron-top-CDQmfJef.js +13 -0
- package/dist/widget/chrome-store-BNaC_b6w.js +66 -0
- package/dist/widget/circle-BC_GBj91.js +9 -0
- package/dist/widget/clock-BmF8-4a0.js +13 -0
- package/dist/widget/close-Bf61nZ8o.js +13 -0
- package/dist/widget/coinPlaceholder-7cZW2058.js +13 -0
- package/dist/widget/compass-CFC3yhnW.js +13 -0
- package/dist/widget/components/ChainImage.d.ts +8 -0
- package/dist/widget/components/ChainImage.d.ts.map +1 -0
- package/dist/widget/components/ChainImage.js +6 -0
- package/dist/widget/components/ConnectWallet.d.ts +18 -0
- package/dist/widget/components/ConnectWallet.d.ts.map +1 -0
- package/dist/widget/components/ConnectWallet.js +66 -0
- package/dist/widget/components/DebugScreensDropdown.d.ts +9 -0
- package/dist/widget/components/DebugScreensDropdown.d.ts.map +1 -0
- package/dist/widget/components/DebugScreensDropdown.js +40 -0
- package/dist/widget/components/FeeOptions.d.ts +17 -0
- package/dist/widget/components/FeeOptions.d.ts.map +1 -0
- package/dist/widget/components/FeeOptions.js +65 -0
- package/dist/widget/components/Footer.d.ts +9 -0
- package/dist/widget/components/Footer.d.ts.map +1 -0
- package/dist/widget/components/Footer.js +13 -0
- package/dist/widget/components/GreenCheckAnimation.d.ts +2 -0
- package/dist/widget/components/GreenCheckAnimation.d.ts.map +1 -0
- package/dist/widget/components/GreenCheckAnimation.js +74 -0
- package/dist/widget/components/Modal.d.ts +11 -0
- package/dist/widget/components/Modal.d.ts.map +1 -0
- package/dist/widget/components/Modal.js +36 -0
- package/dist/widget/components/Receipt.d.ts +13 -0
- package/dist/widget/components/Receipt.d.ts.map +1 -0
- package/dist/widget/components/Receipt.js +36 -0
- package/dist/widget/components/SendForm.d.ts +44 -0
- package/dist/widget/components/SendForm.d.ts.map +1 -0
- package/dist/widget/components/SendForm.js +177 -0
- package/dist/widget/components/TokenImage.d.ts +10 -0
- package/dist/widget/components/TokenImage.d.ts.map +1 -0
- package/dist/widget/components/TokenImage.js +8 -0
- package/dist/widget/components/TokenList.d.ts +16 -0
- package/dist/widget/components/TokenList.d.ts.map +1 -0
- package/dist/widget/components/TokenList.js +39 -0
- package/dist/widget/components/TransferPending.d.ts +11 -0
- package/dist/widget/components/TransferPending.d.ts.map +1 -0
- package/dist/widget/components/TransferPending.js +77 -0
- package/dist/widget/components/TransferPendingVertical.d.ts +18 -0
- package/dist/widget/components/TransferPendingVertical.d.ts.map +1 -0
- package/dist/widget/components/TransferPendingVertical.js +183 -0
- package/dist/widget/components/WalletConfirmation.d.ts +18 -0
- package/dist/widget/components/WalletConfirmation.d.ts.map +1 -0
- package/dist/widget/components/WalletConfirmation.js +22 -0
- package/dist/widget/config.d.ts +4 -0
- package/dist/widget/config.d.ts.map +1 -0
- package/dist/widget/config.js +3 -0
- package/dist/widget/copy-e0xXvKN0.js +20 -0
- package/dist/widget/cursor-CqM3v0xJ.js +8 -0
- package/dist/widget/cursor-transparent-CUQpdsCG.js +17 -0
- package/dist/widget/desktop-DUDGIRpM.js +14 -0
- package/dist/widget/disconnect-DUFST9QQ.js +13 -0
- package/dist/widget/discord-C1cj365Z.js +22 -0
- package/dist/widget/email-BHhmb_lX.js +703 -0
- package/dist/widget/embedded-wallet-CuuC4eah.js +467 -0
- package/dist/widget/ethereum-CfmBVfeB.js +15 -0
- package/dist/widget/etherscan-BSiynDhW.js +11 -0
- package/dist/widget/exclamation-triangle-DEiFNpHw.js +9 -0
- package/dist/widget/extension-mRmfCDxo.js +13 -0
- package/dist/widget/external-link-B4xMIVnW.js +13 -0
- package/dist/widget/facebook-CBAZStBR.js +31 -0
- package/dist/widget/farcaster-LHDEDf5S.js +17 -0
- package/dist/widget/filters-CBijuvFv.js +13 -0
- package/dist/widget/github-C3ILD420.js +23 -0
- package/dist/widget/google-CSj73POX.js +23 -0
- package/dist/widget/help-circle-2hdG5IdB.js +17 -0
- package/dist/widget/hooks/useAmountUsd.d.ts +13 -0
- package/dist/widget/hooks/useAmountUsd.d.ts.map +1 -0
- package/dist/widget/hooks/useAmountUsd.js +35 -0
- package/dist/widget/hooks/useSendForm.d.ts +125 -0
- package/dist/widget/hooks/useSendForm.d.ts.map +1 -0
- package/dist/widget/hooks/useSendForm.js +450 -0
- package/dist/widget/hooks/useTokenList.d.ts +52 -0
- package/dist/widget/hooks/useTokenList.d.ts.map +1 -0
- package/dist/widget/hooks/useTokenList.js +252 -0
- package/dist/widget/id-ByYSrwsd.js +17 -0
- package/dist/widget/if-defined-DRXJEhv7.js +752 -0
- package/dist/widget/image-C90L4Rf6.js +9 -0
- package/dist/widget/index-B3SlQ9v3.js +46 -0
- package/dist/widget/index-B8LPuLXQ.js +78 -0
- package/dist/widget/index-BDbworWA.js +171 -0
- package/dist/widget/index-BTlDgFSK.js +98 -0
- package/dist/widget/index-BUCcjXbd.js +306 -0
- package/dist/widget/index-BZ34edi2.js +1055 -0
- package/dist/widget/index-BiCU29wK.js +147 -0
- package/dist/widget/index-BlmqIKsY.js +266 -0
- package/dist/widget/index-BlviH5nG.js +55 -0
- package/dist/widget/index-Bwd5X3fS.js +8306 -0
- package/dist/widget/index-C5gmknHK.js +78 -0
- package/dist/widget/index-CD6dBcRj.js +76 -0
- package/dist/widget/index-CDlhy529.js +63 -0
- package/dist/widget/index-CHXa5ke-.js +59 -0
- package/dist/widget/index-CK94R-H7.js +22498 -0
- package/dist/widget/index-CQzo3m3x.js +182 -0
- package/dist/widget/index-CRT8cAwG.js +325 -0
- package/dist/widget/index-CY7Lt2Yu.js +310 -0
- package/dist/widget/index-CiKfAu1E.js +79 -0
- package/dist/widget/index-CkCu6rMi.js +258 -0
- package/dist/widget/index-CngLTu_R.js +517 -0
- package/dist/widget/index-CsMV8-em.js +2577 -0
- package/dist/widget/index-Cu2Wva8v.js +200 -0
- package/dist/widget/index-DKBxLTEF.js +240 -0
- package/dist/widget/index-DQEVT3dx.js +511 -0
- package/dist/widget/index-DU2HcCis.js +200 -0
- package/dist/widget/index-DutZGWNW.js +321 -0
- package/dist/widget/index-O0glArmc.js +182 -0
- package/dist/widget/index-O8FmRjKe.js +63719 -0
- package/dist/widget/index-RtKXrB6I.js +576 -0
- package/dist/widget/index-TIYtS0gE.js +88 -0
- package/dist/widget/index-dQNJvWHs.js +66 -0
- package/dist/widget/index-wmEwdsq7.js +909 -0
- package/dist/widget/index.d.ts +3 -0
- package/dist/widget/index.d.ts.map +1 -0
- package/dist/widget/index.js +2 -0
- package/dist/widget/info-DMPChDjV.js +8 -0
- package/dist/widget/info-circle-DAvS_7nY.js +17 -0
- package/dist/widget/lightbulb-DnZ9mNEs.js +8 -0
- package/dist/widget/lit-html-BRjl1r6K.js +243 -0
- package/dist/widget/mail-DpaVSOP8.js +13 -0
- package/dist/widget/mobile-CRvdyu7I.js +14 -0
- package/dist/widget/more-C5VqW9PR.js +16 -0
- package/dist/widget/network-placeholder-CZ0vApma.js +19 -0
- package/dist/widget/nftPlaceholder-7jjIK2bT.js +13 -0
- package/dist/widget/off-4mHjJLLX.js +9 -0
- package/dist/widget/onramp-Bc0ozVsw.js +929 -0
- package/dist/widget/play-store-Uocul8nC.js +37 -0
- package/dist/widget/plus-DrYF7siO.js +18 -0
- package/dist/widget/prepareSend-BQJmzM5B.js +54987 -0
- package/dist/widget/qr-code-DcnGMUB3.js +11 -0
- package/dist/widget/receive-fvIVd7R_.js +184 -0
- package/dist/widget/recycle-horizontal-DrDwXC4D.js +14 -0
- package/dist/widget/ref-CXNmEjML.js +41 -0
- package/dist/widget/refresh-OK9lIPLS.js +13 -0
- package/dist/widget/reown-logo-C-Qn7mS3.js +17 -0
- package/dist/widget/search-DZqv1oKg.js +13 -0
- package/dist/widget/send-CJlmI-xe.js +1039 -0
- package/dist/widget/send-otoEC8uU.js +20 -0
- package/dist/widget/socials-BJciurWF.js +599 -0
- package/dist/widget/solana-Bv5Hs_0T.js +18 -0
- package/dist/widget/swapHorizontal-BzOPGV37.js +13 -0
- package/dist/widget/swapHorizontalBold-axyHnSmj.js +13 -0
- package/dist/widget/swapHorizontalMedium-C6YOPfPz.js +21 -0
- package/dist/widget/swapHorizontalRoundedBold-yVcLbWNT.js +13 -0
- package/dist/widget/swapVertical-BDjxt9pE.js +13 -0
- package/dist/widget/swaps-DEWNj4kd.js +1637 -0
- package/dist/widget/telegram-BQJD7dlP.js +21 -0
- package/dist/widget/three-dots-DW9jmSMG.js +10 -0
- package/dist/widget/transactions-uCseGQQt.js +38 -0
- package/dist/widget/twitch-XugxDfOE.js +23 -0
- package/dist/widget/twitterIcon-DQVObQUL.js +11 -0
- package/dist/widget/types.d.ts +51 -0
- package/dist/widget/types.d.ts.map +1 -0
- package/dist/widget/types.js +1 -0
- package/dist/widget/verify-DpMYHxLf.js +13 -0
- package/dist/widget/verify-filled-KpEL6ZJ_.js +13 -0
- package/dist/widget/w3m-modal-C8e-6Kba.js +1047 -0
- package/dist/widget/wallet-D8ssEB0o.js +13 -0
- package/dist/widget/wallet-placeholder-HtAy21Wc.js +19 -0
- package/dist/widget/walletconnect-Bp_4XfrY.js +37 -0
- package/dist/widget/warning-circle-FgYS7P7n.js +17 -0
- package/dist/widget/widget/index.js +7 -0
- package/dist/widget/widget.d.ts +47 -0
- package/dist/widget/widget.d.ts.map +1 -0
- package/dist/widget/widget.js +932 -0
- package/dist/widget/x-DlZBoP9k.js +17 -0
- package/dist/widget/x-mark-Ba9pt-_h.js +8 -0
- package/package.json +102 -8
- package/src/abi.ts +38 -0
- package/src/apiClient.ts +32 -0
- package/src/buffer.ts +10 -0
- package/src/cctp.ts +579 -0
- package/src/chainSwitch.ts +55 -0
- package/src/chains.ts +124 -0
- package/src/constants.ts +26 -0
- package/src/encoders.ts +20 -0
- package/src/error.ts +15 -0
- package/src/explorer.ts +37 -0
- package/src/gasless.ts +545 -0
- package/src/index.ts +48 -0
- package/src/indexerClient.ts +36 -0
- package/src/intents.ts +537 -0
- package/src/metaTxnMonitor.ts +163 -0
- package/src/metaTxns.ts +21 -0
- package/src/paymasterSend.ts +503 -0
- package/src/preconditions.ts +52 -0
- package/src/prepareSend.ts +1849 -0
- package/src/prices.ts +186 -0
- package/src/queryParams.ts +80 -0
- package/src/relaySdk.ts +481 -0
- package/src/relayer.ts +255 -0
- package/src/sendUserOp.ts +570 -0
- package/src/sequenceWallet.ts +579 -0
- package/src/theme.ts +2 -0
- package/src/toSimpleSmartAccount.ts +567 -0
- package/src/tokenBalances.ts +760 -0
- package/src/tokens.ts +471 -0
- package/src/trails.ts +1591 -0
- package/src/types.d.ts +11 -0
- package/src/umd.tsx +49 -0
- package/src/utils.ts +16 -0
- package/src/vite-env.d.ts +4 -0
- package/src/widget/assets/MetaMask-icon-fox-with-margins.svg +31 -0
- package/src/widget/assets/MetaMask-icon-fox.svg +26 -0
- package/src/widget/assets/MetaMask-logo-black.svg +3 -0
- package/src/widget/assets/MetaMask-logo-white.svg +16 -0
- package/src/widget/assets/Privy_Brandmark_Black.svg +9 -0
- package/src/widget/assets/Privy_Brandmark_White.svg +9 -0
- package/src/widget/assets/Trails-logo-black.svg +11 -0
- package/src/widget/assets/Trails-logo-white.svg +11 -0
- package/src/widget/components/ChainImage.tsx +28 -0
- package/src/widget/components/ConnectWallet.tsx +206 -0
- package/src/widget/components/DebugScreensDropdown.tsx +88 -0
- package/src/widget/components/FeeOptions.tsx +199 -0
- package/src/widget/components/Footer.tsx +51 -0
- package/src/widget/components/GreenCheckAnimation.tsx +119 -0
- package/src/widget/components/Modal.tsx +97 -0
- package/src/widget/components/Receipt.tsx +237 -0
- package/src/widget/components/SendForm.tsx +695 -0
- package/src/widget/components/TokenImage.tsx +37 -0
- package/src/widget/components/TokenList.tsx +287 -0
- package/src/widget/components/TransferPending.tsx +204 -0
- package/src/widget/components/TransferPendingVertical.tsx +412 -0
- package/src/widget/components/WalletConfirmation.tsx +172 -0
- package/src/widget/config.ts +5 -0
- package/src/widget/hooks/useAmountUsd.ts +59 -0
- package/src/widget/hooks/useSendForm.ts +715 -0
- package/src/widget/hooks/useTokenList.ts +397 -0
- package/src/widget/index.css +2 -0
- package/src/widget/index.tsx +8 -0
- package/src/widget/types/svg.d.ts +8 -0
- package/src/widget/types.ts +59 -0
- package/src/widget/widget.tsx +1438 -0
- 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
|
+
}
|