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
package/dist/prices.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { SequenceAPIClient, Token, TokenPrice } from "@0xsequence/trails-api";
|
|
2
|
+
export declare const fetchGetTokenPrices: (apiClient: SequenceAPIClient, tokens: Token[]) => Promise<TokenPrice[]>;
|
|
3
|
+
export declare function normalizeToken(token: Token & {
|
|
4
|
+
tokenID?: string;
|
|
5
|
+
symbol?: string;
|
|
6
|
+
}): Token;
|
|
7
|
+
export declare const getTokenPrices: (apiClient: SequenceAPIClient, tokens: Token[]) => Promise<TokenPrice[]>;
|
|
8
|
+
export declare const getTokenPrice: (apiClient: SequenceAPIClient, token: Token) => Promise<TokenPrice | null>;
|
|
9
|
+
export declare const useTokenPrices: (tokens: Token[], apiClient: SequenceAPIClient) => {
|
|
10
|
+
tokenPrices: TokenPrice[] | undefined;
|
|
11
|
+
isLoadingTokenPrices: boolean;
|
|
12
|
+
};
|
|
13
|
+
export declare const useTokenPrice: (token?: Token | null, apiClient?: SequenceAPIClient) => {
|
|
14
|
+
tokenPrice: TokenPrice | null | undefined;
|
|
15
|
+
isLoadingTokenPrice: boolean;
|
|
16
|
+
};
|
|
17
|
+
export declare function invalidateTokenPricesCache(token?: Token): void;
|
|
18
|
+
//# sourceMappingURL=prices.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prices.d.ts","sourceRoot":"","sources":["../src/prices.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,KAAK,EACL,UAAU,EACX,MAAM,wBAAwB,CAAA;AAyE/B,eAAO,MAAM,mBAAmB,GAC9B,WAAW,iBAAiB,EAC5B,QAAQ,KAAK,EAAE,KACd,OAAO,CAAC,UAAU,EAAE,CAgBtB,CAAA;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,KAAK,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACnD,KAAK,CAMP;AAED,eAAO,MAAM,cAAc,GACzB,WAAW,iBAAiB,EAC5B,QAAQ,KAAK,EAAE,KACd,OAAO,CAAC,UAAU,EAAE,CAQtB,CAAA;AAED,eAAO,MAAM,aAAa,GACxB,WAAW,iBAAiB,EAC5B,OAAO,KAAK,KACX,OAAO,CAAC,UAAU,GAAG,IAAI,CAS3B,CAAA;AAED,eAAO,MAAM,cAAc,GACzB,QAAQ,KAAK,EAAE,EACf,WAAW,iBAAiB;;;CAe7B,CAAA;AAED,eAAO,MAAM,aAAa,GACxB,QAAQ,KAAK,GAAG,IAAI,EACpB,YAAY,iBAAiB;;;CAc9B,CAAA;AAGD,wBAAgB,0BAA0B,CAAC,KAAK,CAAC,EAAE,KAAK,QAYvD"}
|
package/dist/prices.js
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { QueryClient, useQuery } from "@tanstack/react-query";
|
|
2
|
+
import { zeroAddress } from "viem";
|
|
3
|
+
// Global caching configuration
|
|
4
|
+
const CACHE_CONFIG = {
|
|
5
|
+
// Time configurations
|
|
6
|
+
staleTime: 30000, // 30 seconds - prices change frequently
|
|
7
|
+
gcTime: 120000, // 2 minutes cache time
|
|
8
|
+
refetchInterval: 60000, // Background refetch every minute for prices
|
|
9
|
+
// Retry configurations
|
|
10
|
+
retry: 2,
|
|
11
|
+
retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 30000),
|
|
12
|
+
// Refetch behaviors
|
|
13
|
+
refetchOnWindowFocus: false,
|
|
14
|
+
refetchOnReconnect: true,
|
|
15
|
+
refetchIntervalInBackground: true,
|
|
16
|
+
// Retry logic for specific error types
|
|
17
|
+
shouldRetry: (failureCount, error) => {
|
|
18
|
+
if (error && "status" in error && error.status === 404)
|
|
19
|
+
return false;
|
|
20
|
+
if (failureCount < 2)
|
|
21
|
+
return true;
|
|
22
|
+
return false;
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
// Extract common query options for reuse
|
|
26
|
+
const COMMON_QUERY_OPTIONS = {
|
|
27
|
+
staleTime: CACHE_CONFIG.staleTime,
|
|
28
|
+
gcTime: CACHE_CONFIG.gcTime,
|
|
29
|
+
retry: CACHE_CONFIG.shouldRetry,
|
|
30
|
+
retryDelay: CACHE_CONFIG.retryDelay,
|
|
31
|
+
refetchOnWindowFocus: CACHE_CONFIG.refetchOnWindowFocus,
|
|
32
|
+
refetchOnReconnect: CACHE_CONFIG.refetchOnReconnect,
|
|
33
|
+
refetchInterval: CACHE_CONFIG.refetchInterval,
|
|
34
|
+
refetchIntervalInBackground: CACHE_CONFIG.refetchIntervalInBackground,
|
|
35
|
+
};
|
|
36
|
+
// Initialize query client for token prices
|
|
37
|
+
const tokenPricesQueryClient = new QueryClient({
|
|
38
|
+
defaultOptions: {
|
|
39
|
+
queries: {
|
|
40
|
+
...COMMON_QUERY_OPTIONS,
|
|
41
|
+
// Override retry for QueryClient (use number instead of function)
|
|
42
|
+
retry: CACHE_CONFIG.retry,
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
// Cache key generation methods
|
|
47
|
+
const createTokenCacheKey = (token) => {
|
|
48
|
+
return `${token.contractAddress}-${token.chainId}-${token.tokenId}`;
|
|
49
|
+
};
|
|
50
|
+
const createBatchCacheKey = (tokens) => {
|
|
51
|
+
return [
|
|
52
|
+
"tokenPrices",
|
|
53
|
+
"batch",
|
|
54
|
+
tokens.length,
|
|
55
|
+
tokens.map(createTokenCacheKey).sort(),
|
|
56
|
+
];
|
|
57
|
+
};
|
|
58
|
+
const createSingleCacheKey = (token) => {
|
|
59
|
+
return ["tokenPrices", "single", token ? createTokenCacheKey(token) : null];
|
|
60
|
+
};
|
|
61
|
+
// Separate fetch function for token prices
|
|
62
|
+
export const fetchGetTokenPrices = async (apiClient, tokens) => {
|
|
63
|
+
if (!apiClient) {
|
|
64
|
+
throw new Error("API client is required");
|
|
65
|
+
}
|
|
66
|
+
if (tokens.length === 0) {
|
|
67
|
+
return [];
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
const res = await apiClient.getCoinPrices({ tokens });
|
|
71
|
+
return res?.tokenPrices || [];
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
console.error("[trails-sdk] Failed to fetch token prices:", error);
|
|
75
|
+
throw error;
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
export function normalizeToken(token) {
|
|
79
|
+
return {
|
|
80
|
+
chainId: token.chainId,
|
|
81
|
+
contractAddress: token.contractAddress || zeroAddress,
|
|
82
|
+
tokenId: token.tokenId || token.tokenID || token.symbol,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
export const getTokenPrices = async (apiClient, tokens) => {
|
|
86
|
+
tokens = tokens.map(normalizeToken);
|
|
87
|
+
return tokenPricesQueryClient.fetchQuery({
|
|
88
|
+
queryKey: createBatchCacheKey(tokens),
|
|
89
|
+
queryFn: () => fetchGetTokenPrices(apiClient, tokens),
|
|
90
|
+
...COMMON_QUERY_OPTIONS,
|
|
91
|
+
});
|
|
92
|
+
};
|
|
93
|
+
export const getTokenPrice = async (apiClient, token) => {
|
|
94
|
+
return tokenPricesQueryClient.fetchQuery({
|
|
95
|
+
queryKey: createSingleCacheKey(token),
|
|
96
|
+
queryFn: async () => {
|
|
97
|
+
const prices = await getTokenPrices(apiClient, [token]);
|
|
98
|
+
return prices?.length ? prices[0] : null;
|
|
99
|
+
},
|
|
100
|
+
...COMMON_QUERY_OPTIONS,
|
|
101
|
+
});
|
|
102
|
+
};
|
|
103
|
+
export const useTokenPrices = (tokens, apiClient) => {
|
|
104
|
+
tokens = tokens.map(normalizeToken);
|
|
105
|
+
const { data: tokenPrices, isLoading: isLoadingTokenPrices } = useQuery({
|
|
106
|
+
queryKey: createBatchCacheKey(tokens),
|
|
107
|
+
queryFn: () => getTokenPrices(apiClient, tokens),
|
|
108
|
+
enabled: tokens.length > 0 && !!apiClient,
|
|
109
|
+
...COMMON_QUERY_OPTIONS,
|
|
110
|
+
});
|
|
111
|
+
return {
|
|
112
|
+
tokenPrices,
|
|
113
|
+
isLoadingTokenPrices,
|
|
114
|
+
};
|
|
115
|
+
};
|
|
116
|
+
export const useTokenPrice = (token, apiClient) => {
|
|
117
|
+
const { data: tokenPrice, isLoading: isLoadingTokenPrice } = useQuery({
|
|
118
|
+
queryKey: createSingleCacheKey(token),
|
|
119
|
+
queryFn: () => token && apiClient ? getTokenPrice(apiClient, token) : null,
|
|
120
|
+
enabled: !!token && !!apiClient,
|
|
121
|
+
...COMMON_QUERY_OPTIONS,
|
|
122
|
+
});
|
|
123
|
+
return {
|
|
124
|
+
tokenPrice,
|
|
125
|
+
isLoadingTokenPrice,
|
|
126
|
+
};
|
|
127
|
+
};
|
|
128
|
+
// Cache invalidation utility function
|
|
129
|
+
export function invalidateTokenPricesCache(token) {
|
|
130
|
+
if (token) {
|
|
131
|
+
// Invalidate specific token price using consistent cache key
|
|
132
|
+
tokenPricesQueryClient.invalidateQueries({
|
|
133
|
+
queryKey: createSingleCacheKey(token),
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
// Invalidate all token price queries
|
|
138
|
+
tokenPricesQueryClient.invalidateQueries({
|
|
139
|
+
queryKey: ["tokenPrices"],
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function getQueryParam(key: string): string | null;
|
|
2
|
+
export declare function useQueryParams(): {
|
|
3
|
+
queryParams: URLSearchParams;
|
|
4
|
+
getParam: (key: string) => string | null;
|
|
5
|
+
hasParam: (key: string, value?: string) => boolean;
|
|
6
|
+
setParam: (key: string, value: string) => void;
|
|
7
|
+
removeParam: (key: string) => void;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=queryParams.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queryParams.d.ts","sourceRoot":"","sources":["../src/queryParams.ts"],"names":[],"mappings":"AAEA,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGxD;AAED,wBAAgB,cAAc;;oBAsCL,MAAM,KAAG,MAAM,GAAG,IAAI;oBAItB,MAAM,UAAU,MAAM,KAAG,OAAO;oBAKhC,MAAM,SAAS,MAAM;uBASlB,MAAM;EAgBjC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { useEffect, useState } from "react";
|
|
2
|
+
export function getQueryParam(key) {
|
|
3
|
+
if (typeof window === "undefined")
|
|
4
|
+
return null;
|
|
5
|
+
return new URLSearchParams(window.location.search).get(key);
|
|
6
|
+
}
|
|
7
|
+
export function useQueryParams() {
|
|
8
|
+
const [queryParams, setQueryParams] = useState(typeof window !== "undefined"
|
|
9
|
+
? new URLSearchParams(window.location.search)
|
|
10
|
+
: new URLSearchParams());
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
const updateQueryParams = () => {
|
|
13
|
+
setQueryParams(new URLSearchParams(window.location.search));
|
|
14
|
+
};
|
|
15
|
+
// Check on popstate (back/forward navigation)
|
|
16
|
+
window.addEventListener("popstate", updateQueryParams);
|
|
17
|
+
// Check on pushState/replaceState
|
|
18
|
+
const originalPushState = window.history.pushState;
|
|
19
|
+
const originalReplaceState = window.history.replaceState;
|
|
20
|
+
window.history.pushState = function () {
|
|
21
|
+
// biome-ignore lint/complexity/noArguments: TODO: To fix
|
|
22
|
+
originalPushState.apply(this, arguments);
|
|
23
|
+
updateQueryParams();
|
|
24
|
+
};
|
|
25
|
+
window.history.replaceState = function () {
|
|
26
|
+
// biome-ignore lint/complexity/noArguments: TODO: To fix
|
|
27
|
+
originalReplaceState.apply(this, arguments);
|
|
28
|
+
updateQueryParams();
|
|
29
|
+
};
|
|
30
|
+
return () => {
|
|
31
|
+
window.removeEventListener("popstate", updateQueryParams);
|
|
32
|
+
window.history.pushState = originalPushState;
|
|
33
|
+
window.history.replaceState = originalReplaceState;
|
|
34
|
+
};
|
|
35
|
+
}, []);
|
|
36
|
+
const getParam = (key) => {
|
|
37
|
+
return queryParams.get(key);
|
|
38
|
+
};
|
|
39
|
+
const hasParam = (key, value) => {
|
|
40
|
+
const result = value ? queryParams.get(key) === value : queryParams.has(key);
|
|
41
|
+
return result;
|
|
42
|
+
};
|
|
43
|
+
const setParam = (key, value) => {
|
|
44
|
+
const newParams = new URLSearchParams(queryParams);
|
|
45
|
+
newParams.set(key, value);
|
|
46
|
+
const url = new URL(window.location.href);
|
|
47
|
+
url.search = newParams.toString();
|
|
48
|
+
window.history.pushState({}, "", url.toString());
|
|
49
|
+
setQueryParams(newParams);
|
|
50
|
+
};
|
|
51
|
+
const removeParam = (key) => {
|
|
52
|
+
const newParams = new URLSearchParams(queryParams);
|
|
53
|
+
newParams.delete(key);
|
|
54
|
+
const url = new URL(window.location.href);
|
|
55
|
+
url.search = newParams.toString();
|
|
56
|
+
window.history.pushState({}, "", url.toString());
|
|
57
|
+
setQueryParams(newParams);
|
|
58
|
+
};
|
|
59
|
+
return {
|
|
60
|
+
queryParams,
|
|
61
|
+
getParam,
|
|
62
|
+
hasParam,
|
|
63
|
+
setParam,
|
|
64
|
+
removeParam,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { WalletClient } from "viem";
|
|
2
|
+
export type Chain = any;
|
|
3
|
+
export type RelayQuote = any;
|
|
4
|
+
export type RelayExecuteResult = any;
|
|
5
|
+
export type RelayProgressData = any;
|
|
6
|
+
export interface RelayQuoteOptions {
|
|
7
|
+
wallet: WalletClient;
|
|
8
|
+
chainId: number;
|
|
9
|
+
toChainId?: number;
|
|
10
|
+
amount: string;
|
|
11
|
+
currency: string;
|
|
12
|
+
toCurrency?: string;
|
|
13
|
+
tradeType?: "EXACT_INPUT" | "EXACT_OUTPUT";
|
|
14
|
+
txs: Array<{
|
|
15
|
+
to: string;
|
|
16
|
+
value: string;
|
|
17
|
+
data: string;
|
|
18
|
+
}>;
|
|
19
|
+
recipient?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface RelayExecuteOptions {
|
|
22
|
+
quote: RelayQuote;
|
|
23
|
+
wallet: WalletClient;
|
|
24
|
+
onProgress?: (data: RelayProgressData) => void;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Get a quote for a relay transaction
|
|
28
|
+
*/
|
|
29
|
+
export declare function getRelaySDKQuote(options: RelayQuoteOptions): Promise<RelayQuote>;
|
|
30
|
+
/**
|
|
31
|
+
* Execute a relay transaction
|
|
32
|
+
*/
|
|
33
|
+
export declare function relaySDKExecute(options: RelayExecuteOptions): Promise<RelayExecuteResult>;
|
|
34
|
+
/**
|
|
35
|
+
* Helper function to create a simple relay transaction for a contract call
|
|
36
|
+
*/
|
|
37
|
+
export declare function createSimpleRelayTransaction(wallet: WalletClient, contractAddress: string, callData: string, value: string, chainId: number, currency?: string): Promise<RelayQuote>;
|
|
38
|
+
/**
|
|
39
|
+
* Helper function to execute a simple relay transaction
|
|
40
|
+
*/
|
|
41
|
+
export declare function executeSimpleRelayTransaction(quote: RelayQuote, wallet: WalletClient, onProgress?: RelayExecuteOptions["onProgress"]): Promise<RelayExecuteResult>;
|
|
42
|
+
export declare function getTxHashFromRelayResult(result: RelayExecuteResult): string;
|
|
43
|
+
export declare const relaySupportedChains: Record<number, Chain>;
|
|
44
|
+
export declare function getRelaySupportedChains(): Promise<Chain[]>;
|
|
45
|
+
export declare function isChainSupported(chainId: number): Promise<boolean>;
|
|
46
|
+
export interface RelayToken {
|
|
47
|
+
id: string;
|
|
48
|
+
symbol: string;
|
|
49
|
+
name: string;
|
|
50
|
+
contractAddress: string;
|
|
51
|
+
decimals: number;
|
|
52
|
+
chainId: number;
|
|
53
|
+
chainName: string;
|
|
54
|
+
imageUrl: string;
|
|
55
|
+
}
|
|
56
|
+
export declare function getRelaySupportedTokens(): Promise<RelayToken[]>;
|
|
57
|
+
export type GetIsRouteSupportedOptions = {
|
|
58
|
+
originChainId: number;
|
|
59
|
+
destinationChainId: number;
|
|
60
|
+
amount: string;
|
|
61
|
+
originToken: string;
|
|
62
|
+
destinationToken: string;
|
|
63
|
+
};
|
|
64
|
+
export declare function getIsRouteSupported({ originChainId, destinationChainId, amount, originToken, destinationToken, }: GetIsRouteSupportedOptions): Promise<boolean>;
|
|
65
|
+
//# sourceMappingURL=relaySdk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relaySdk.d.ts","sourceRoot":"","sources":["../src/relaySdk.ts"],"names":[],"mappings":"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"}
|
package/dist/relaySdk.js
ADDED
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
import { convertViemChainToRelayChain, createClient, getClient, MAINNET_RELAY_API, } from "@reservoir0x/relay-sdk";
|
|
2
|
+
import * as chains from "viem/chains";
|
|
3
|
+
createClient({
|
|
4
|
+
baseApiUrl: MAINNET_RELAY_API,
|
|
5
|
+
source: "Trails",
|
|
6
|
+
chains: Object.values(chains).map((chain) => convertViemChainToRelayChain(chain)),
|
|
7
|
+
});
|
|
8
|
+
/**
|
|
9
|
+
* Get a quote for a relay transaction
|
|
10
|
+
*/
|
|
11
|
+
export async function getRelaySDKQuote(options) {
|
|
12
|
+
try {
|
|
13
|
+
const client = getClient();
|
|
14
|
+
if (!client) {
|
|
15
|
+
throw new Error("Relay client not available");
|
|
16
|
+
}
|
|
17
|
+
console.log("[trails-sdk] getRelaySDKQuote", options);
|
|
18
|
+
const quote = await client.actions.getQuote({
|
|
19
|
+
wallet: options.wallet,
|
|
20
|
+
chainId: options.chainId,
|
|
21
|
+
toChainId: options.toChainId || options.chainId,
|
|
22
|
+
amount: options.amount,
|
|
23
|
+
currency: options.currency,
|
|
24
|
+
toCurrency: options.toCurrency || options.currency,
|
|
25
|
+
tradeType: options.tradeType || "EXACT_OUTPUT",
|
|
26
|
+
txs: options.txs,
|
|
27
|
+
user: options.wallet.account.address,
|
|
28
|
+
recipient: options.recipient || options.wallet.account.address,
|
|
29
|
+
});
|
|
30
|
+
return quote;
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
console.error("[trails-sdk] Error getting relay quote:", error);
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Execute a relay transaction
|
|
39
|
+
*/
|
|
40
|
+
export async function relaySDKExecute(options) {
|
|
41
|
+
try {
|
|
42
|
+
const client = getClient();
|
|
43
|
+
if (!client) {
|
|
44
|
+
throw new Error("Relay client not available");
|
|
45
|
+
}
|
|
46
|
+
console.log("[trails-sdk] relaysdkclient", client.chains, options.quote);
|
|
47
|
+
const result = await client.actions.execute({
|
|
48
|
+
quote: options.quote,
|
|
49
|
+
wallet: options.wallet,
|
|
50
|
+
onProgress: options.onProgress ||
|
|
51
|
+
((data) => {
|
|
52
|
+
console.log("[trails-sdk] Relay progress:", data);
|
|
53
|
+
}),
|
|
54
|
+
});
|
|
55
|
+
return result;
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
console.error("[trails-sdk] Error executing relay transaction:", error);
|
|
59
|
+
throw error;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Helper function to create a simple relay transaction for a contract call
|
|
64
|
+
*/
|
|
65
|
+
export async function createSimpleRelayTransaction(wallet, contractAddress, callData, value, chainId, currency = "0x0000000000000000000000000000000000000000") {
|
|
66
|
+
const options = {
|
|
67
|
+
wallet,
|
|
68
|
+
chainId,
|
|
69
|
+
amount: value,
|
|
70
|
+
currency,
|
|
71
|
+
txs: [
|
|
72
|
+
{
|
|
73
|
+
to: contractAddress,
|
|
74
|
+
value,
|
|
75
|
+
data: callData,
|
|
76
|
+
},
|
|
77
|
+
],
|
|
78
|
+
};
|
|
79
|
+
return await getRelaySDKQuote(options);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Helper function to execute a simple relay transaction
|
|
83
|
+
*/
|
|
84
|
+
export async function executeSimpleRelayTransaction(quote, wallet, onProgress) {
|
|
85
|
+
return await relaySDKExecute({
|
|
86
|
+
quote,
|
|
87
|
+
wallet,
|
|
88
|
+
onProgress,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
export function getTxHashFromRelayResult(result) {
|
|
92
|
+
return result?.data?.steps?.[result?.data?.steps.length - 1]?.items?.[0]
|
|
93
|
+
?.txHashes?.[0]?.txHash;
|
|
94
|
+
}
|
|
95
|
+
// Source: https://docs.relay.link/resources/supported-chains
|
|
96
|
+
export const relaySupportedChains = {
|
|
97
|
+
[chains.abstract.id]: chains.abstract,
|
|
98
|
+
[chains.ancient8.id]: chains.ancient8,
|
|
99
|
+
[chains.apeChain.id]: chains.apeChain,
|
|
100
|
+
[chains.arbitrum.id]: chains.arbitrum,
|
|
101
|
+
[chains.arbitrumNova.id]: chains.arbitrumNova,
|
|
102
|
+
[chains.arenaz.id]: chains.arenaz,
|
|
103
|
+
[chains.avalanche.id]: chains.avalanche,
|
|
104
|
+
[chains.b3.id]: chains.b3,
|
|
105
|
+
[chains.base.id]: chains.base,
|
|
106
|
+
[chains.berachain.id]: chains.berachain,
|
|
107
|
+
[chains.blast.id]: chains.blast,
|
|
108
|
+
[chains.opBNB.id]: chains.opBNB,
|
|
109
|
+
[chains.bob.id]: chains.bob,
|
|
110
|
+
[chains.boba.id]: chains.boba,
|
|
111
|
+
[chains.celo.id]: chains.celo,
|
|
112
|
+
[chains.corn.id]: chains.corn,
|
|
113
|
+
[chains.cronos.id]: chains.cronos,
|
|
114
|
+
[chains.cyber.id]: chains.cyber,
|
|
115
|
+
[chains.degen.id]: chains.degen,
|
|
116
|
+
[chains.mainnet.id]: chains.mainnet,
|
|
117
|
+
[chains.flowMainnet.id]: chains.flowMainnet,
|
|
118
|
+
[chains.forma.id]: chains.forma,
|
|
119
|
+
[chains.funkiMainnet.id]: chains.funkiMainnet,
|
|
120
|
+
[chains.gnosis.id]: chains.gnosis,
|
|
121
|
+
[chains.gravity.id]: chains.gravity,
|
|
122
|
+
[chains.hemi.id]: chains.hemi,
|
|
123
|
+
[chains.hychain.id]: chains.hychain,
|
|
124
|
+
[chains.ink.id]: chains.ink,
|
|
125
|
+
[chains.linea.id]: chains.linea,
|
|
126
|
+
[chains.lisk.id]: chains.lisk,
|
|
127
|
+
[chains.manta.id]: chains.manta,
|
|
128
|
+
[chains.mantle.id]: chains.mantle,
|
|
129
|
+
[chains.metis.id]: chains.metis,
|
|
130
|
+
[chains.mint.id]: chains.mint,
|
|
131
|
+
[chains.mode.id]: chains.mode,
|
|
132
|
+
[chains.morph.id]: chains.morph,
|
|
133
|
+
[chains.optimism.id]: chains.optimism,
|
|
134
|
+
[chains.plume.id]: chains.plume,
|
|
135
|
+
[chains.polygon.id]: chains.polygon,
|
|
136
|
+
[chains.polygonZkEvm.id]: chains.polygonZkEvm,
|
|
137
|
+
[chains.ronin.id]: chains.ronin,
|
|
138
|
+
[chains.redstone.id]: chains.redstone,
|
|
139
|
+
[chains.sanko.id]: chains.sanko,
|
|
140
|
+
[chains.scroll.id]: chains.scroll,
|
|
141
|
+
[chains.sei.id]: chains.sei,
|
|
142
|
+
[chains.shape.id]: chains.shape,
|
|
143
|
+
[chains.soneium.id]: chains.soneium,
|
|
144
|
+
[chains.sonic.id]: chains.sonic,
|
|
145
|
+
[chains.story.id]: chains.story,
|
|
146
|
+
[chains.superposition.id]: chains.superposition,
|
|
147
|
+
[chains.superseed.id]: chains.superseed,
|
|
148
|
+
[chains.swellchain.id]: chains.swellchain,
|
|
149
|
+
[chains.taiko.id]: chains.taiko,
|
|
150
|
+
[chains.tron.id]: chains.tron,
|
|
151
|
+
[chains.unichain.id]: chains.unichain,
|
|
152
|
+
[chains.worldchain.id]: chains.worldchain,
|
|
153
|
+
[chains.xai.id]: chains.xai,
|
|
154
|
+
[chains.zeroG.id]: chains.zeroG,
|
|
155
|
+
[chains.zircuit.id]: chains.zircuit,
|
|
156
|
+
[chains.zksync.id]: chains.zksync,
|
|
157
|
+
[chains.zora.id]: chains.zora,
|
|
158
|
+
};
|
|
159
|
+
export async function getRelaySupportedChains() {
|
|
160
|
+
return Object.values(relaySupportedChains);
|
|
161
|
+
}
|
|
162
|
+
export async function isChainSupported(chainId) {
|
|
163
|
+
return Object.keys(relaySupportedChains).includes(chainId.toString());
|
|
164
|
+
}
|
|
165
|
+
export async function getRelaySupportedTokens() {
|
|
166
|
+
try {
|
|
167
|
+
const chains = await fetchRelayChains();
|
|
168
|
+
const tokens = [];
|
|
169
|
+
chains.forEach((chain) => {
|
|
170
|
+
if (!chain.disabled) {
|
|
171
|
+
// Add native currency
|
|
172
|
+
tokens.push({
|
|
173
|
+
id: chain.currency.id,
|
|
174
|
+
symbol: chain.currency.symbol,
|
|
175
|
+
name: chain.currency.name,
|
|
176
|
+
contractAddress: chain.currency.address,
|
|
177
|
+
decimals: chain.currency.decimals,
|
|
178
|
+
chainId: chain.id,
|
|
179
|
+
chainName: chain.displayName || chain.name,
|
|
180
|
+
imageUrl: "", // Native currencies typically don't have logoURI
|
|
181
|
+
});
|
|
182
|
+
// Add featured tokens
|
|
183
|
+
chain.featuredTokens.forEach((token) => {
|
|
184
|
+
tokens.push({
|
|
185
|
+
id: token.id,
|
|
186
|
+
symbol: token.symbol,
|
|
187
|
+
name: token.name,
|
|
188
|
+
contractAddress: token.address,
|
|
189
|
+
decimals: token.decimals,
|
|
190
|
+
chainId: chain.id,
|
|
191
|
+
chainName: chain.displayName || chain.name,
|
|
192
|
+
imageUrl: token.metadata?.logoURI || "",
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
// Add ERC20 currencies
|
|
196
|
+
chain.erc20Currencies.forEach((token) => {
|
|
197
|
+
tokens.push({
|
|
198
|
+
id: token.id,
|
|
199
|
+
symbol: token.symbol,
|
|
200
|
+
name: token.name,
|
|
201
|
+
contractAddress: token.address,
|
|
202
|
+
decimals: token.decimals,
|
|
203
|
+
chainId: chain.id,
|
|
204
|
+
chainName: chain.displayName || chain.name,
|
|
205
|
+
imageUrl: token.metadata?.logoURI || "",
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
// Add solver currencies (fallback for chains that might not have featuredTokens/erc20Currencies)
|
|
209
|
+
chain.solverCurrencies.forEach((token) => {
|
|
210
|
+
tokens.push({
|
|
211
|
+
id: token.id,
|
|
212
|
+
symbol: token.symbol,
|
|
213
|
+
name: token.name,
|
|
214
|
+
contractAddress: token.address,
|
|
215
|
+
decimals: token.decimals,
|
|
216
|
+
chainId: chain.id,
|
|
217
|
+
chainName: chain.displayName || chain.name,
|
|
218
|
+
imageUrl: token.metadata?.logoURI || "",
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
// Remove duplicates by chainId and contractAddress
|
|
224
|
+
const uniqueTokens = tokens.filter((token, index, self) => index ===
|
|
225
|
+
self.findIndex((t) => t.chainId === token.chainId &&
|
|
226
|
+
t.contractAddress.toLowerCase() ===
|
|
227
|
+
token.contractAddress.toLowerCase()));
|
|
228
|
+
console.log(`[trails-sdk] Fetched ${uniqueTokens.length} unique tokens from Relay API`);
|
|
229
|
+
return uniqueTokens;
|
|
230
|
+
}
|
|
231
|
+
catch (error) {
|
|
232
|
+
console.error("[trails-sdk] Error fetching Relay supported tokens:", error);
|
|
233
|
+
return [];
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
// Cache for chains data
|
|
237
|
+
let cachedChains = null;
|
|
238
|
+
let cacheTimestamp = 0;
|
|
239
|
+
const CACHE_DURATION = 5 * 60 * 1000; // 5 minutes
|
|
240
|
+
async function fetchRelayChains() {
|
|
241
|
+
const now = Date.now();
|
|
242
|
+
// Return cached data if still valid
|
|
243
|
+
if (cachedChains && now - cacheTimestamp < CACHE_DURATION) {
|
|
244
|
+
return cachedChains;
|
|
245
|
+
}
|
|
246
|
+
try {
|
|
247
|
+
const response = await fetch("https://api.relay.link/chains");
|
|
248
|
+
if (!response.ok) {
|
|
249
|
+
throw new Error(`Failed to fetch chains: ${response.status}`);
|
|
250
|
+
}
|
|
251
|
+
const data = await response.json();
|
|
252
|
+
cachedChains = data.chains;
|
|
253
|
+
cacheTimestamp = now;
|
|
254
|
+
return data.chains;
|
|
255
|
+
}
|
|
256
|
+
catch (error) {
|
|
257
|
+
console.error("[trails-sdk] Error fetching Relay chains:", error);
|
|
258
|
+
// Return cached data if available, even if expired
|
|
259
|
+
if (cachedChains) {
|
|
260
|
+
return cachedChains;
|
|
261
|
+
}
|
|
262
|
+
throw error;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
export async function getIsRouteSupported({ originChainId, destinationChainId, amount, originToken, destinationToken, }) {
|
|
266
|
+
try {
|
|
267
|
+
// Fetch supported chains from Relay API
|
|
268
|
+
const chains = await fetchRelayChains();
|
|
269
|
+
// Check if both chains are supported and not disabled
|
|
270
|
+
const originChain = chains.find((chain) => chain.id === originChainId);
|
|
271
|
+
const destinationChain = chains.find((chain) => chain.id === destinationChainId);
|
|
272
|
+
if (!originChain ||
|
|
273
|
+
!destinationChain ||
|
|
274
|
+
originChain.disabled ||
|
|
275
|
+
destinationChain.disabled) {
|
|
276
|
+
return false;
|
|
277
|
+
}
|
|
278
|
+
// Check if destination token is supported on destination chain
|
|
279
|
+
const isDestinationTokenSupported = destinationChain.solverCurrencies.some((currency) => currency.address.toLowerCase() === destinationToken.toLowerCase());
|
|
280
|
+
if (!isDestinationTokenSupported) {
|
|
281
|
+
return false;
|
|
282
|
+
}
|
|
283
|
+
// If we have a client available, try to get a quote to verify the route
|
|
284
|
+
const client = getClient();
|
|
285
|
+
if (client) {
|
|
286
|
+
try {
|
|
287
|
+
const sender = "0x1111111111111111111111111111111111111111";
|
|
288
|
+
const quote = await client.actions.getQuote({
|
|
289
|
+
chainId: originChainId,
|
|
290
|
+
toChainId: destinationChainId,
|
|
291
|
+
amount: amount,
|
|
292
|
+
currency: originToken,
|
|
293
|
+
toCurrency: destinationToken,
|
|
294
|
+
tradeType: "EXACT_OUTPUT",
|
|
295
|
+
txs: [],
|
|
296
|
+
user: sender,
|
|
297
|
+
recipient: sender,
|
|
298
|
+
});
|
|
299
|
+
return quote.steps.length > 0;
|
|
300
|
+
}
|
|
301
|
+
catch (error) {
|
|
302
|
+
console.warn("[trails-sdk] Quote check failed, falling back to chain/token validation:", error);
|
|
303
|
+
// If quote fails, we still return true if chains and tokens are supported
|
|
304
|
+
return true;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
// If no client available, return true if chains and tokens are supported
|
|
308
|
+
return true;
|
|
309
|
+
}
|
|
310
|
+
catch (error) {
|
|
311
|
+
console.error("[trails-sdk] Error checking route support:", error);
|
|
312
|
+
return false;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Relayer } from "@0xsequence/wallet-core";
|
|
2
|
+
export type RelayerOperationStatus = Relayer.OperationStatus;
|
|
3
|
+
export type RpcRelayer = Relayer.Standard.Rpc.RpcRelayer;
|
|
4
|
+
export type RelayerConfig = {
|
|
5
|
+
hostname: string;
|
|
6
|
+
chainId: number;
|
|
7
|
+
rpcUrl: string;
|
|
8
|
+
};
|
|
9
|
+
export type RelayerEnv = "local" | "cors-anywhere" | "dev" | "prod";
|
|
10
|
+
export type RelayerEnvConfig = {
|
|
11
|
+
env?: RelayerEnv;
|
|
12
|
+
useV3Relayers?: boolean;
|
|
13
|
+
};
|
|
14
|
+
export type { Relayer };
|
|
15
|
+
export declare function getBackupRelayer(chainId: number): Relayer.Standard.Rpc.RpcRelayer | undefined;
|
|
16
|
+
export declare function getRelayerUrl(config: RelayerEnvConfig, chainId: number): string;
|
|
17
|
+
export declare function getRelayer(config: RelayerEnvConfig, chainId: number): Relayer.Standard.Rpc.RpcRelayer;
|
|
18
|
+
export declare function useRelayers(config?: RelayerEnvConfig): {
|
|
19
|
+
relayers: Map<number, Relayer.Standard.Rpc.RpcRelayer>;
|
|
20
|
+
getRelayer: (chainId: number) => Relayer.Standard.Rpc.RpcRelayer;
|
|
21
|
+
getBackupRelayer: (chainId: number) => Relayer.Standard.Rpc.RpcRelayer | undefined;
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=relayer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relayer.d.ts","sourceRoot":"","sources":["../src/relayer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA;AAMjD,MAAM,MAAM,sBAAsB,GAAG,OAAO,CAAC,eAAe,CAAA;AAC5D,MAAM,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAA;AAExD,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,eAAe,GAAG,KAAK,GAAG,MAAM,CAAA;AAEnE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,CAAC,EAAE,UAAU,CAAA;IAChB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB,CAAA;AAED,YAAY,EAAE,OAAO,EAAE,CAAA;AAEvB,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,GAAG,SAAS,CAgB7C;AAGD,wBAAgB,aAAa,CAC3B,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,MAAM,GACd,MAAM,CAsJR;AAED,wBAAgB,UAAU,CACxB,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAejC;AAED,wBAAgB,WAAW,CACzB,MAAM,GAAE,gBAEP,GACA;IACD,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;IACtD,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAA;IAChE,gBAAgB,EAAE,CAChB,OAAO,EAAE,MAAM,KACZ,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,GAAG,SAAS,CAAA;CACjD,CAwBA"}
|