@eth-optimism/actions-sdk 0.3.0 → 0.4.0
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/dist/__mocks__/MockAssets.d.ts +17 -2
- package/dist/__mocks__/MockAssets.d.ts.map +1 -1
- package/dist/__mocks__/MockAssets.js +49 -6
- package/dist/__mocks__/MockAssets.js.map +1 -1
- package/dist/__tests__/actions.test.js +1 -1
- package/dist/__tests__/actions.test.js.map +1 -1
- package/dist/actions.d.ts +8 -13
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +35 -27
- package/dist/actions.js.map +1 -1
- package/dist/constants/assets.d.ts +215 -4
- package/dist/constants/assets.d.ts.map +1 -1
- package/dist/constants/assets.js +734 -11
- package/dist/constants/assets.js.map +1 -1
- package/dist/constants/providers.d.ts +6 -0
- package/dist/constants/providers.d.ts.map +1 -0
- package/dist/constants/providers.js +6 -0
- package/dist/constants/providers.js.map +1 -0
- package/dist/constants/supportedChains.d.ts +2 -2
- package/dist/constants/supportedChains.d.ts.map +1 -1
- package/dist/constants/supportedChains.js +12 -2
- package/dist/constants/supportedChains.js.map +1 -1
- package/dist/index.d.ts +4 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -4
- package/dist/index.js.map +1 -1
- package/dist/lend/__mocks__/MockLendProvider.d.ts +1 -1
- package/dist/lend/__mocks__/MockLendProvider.d.ts.map +1 -1
- package/dist/lend/__mocks__/MockLendProvider.js +7 -2
- package/dist/lend/__mocks__/MockLendProvider.js.map +1 -1
- package/dist/lend/core/LendProvider.d.ts +12 -8
- package/dist/lend/core/LendProvider.d.ts.map +1 -1
- package/dist/lend/core/LendProvider.js +15 -21
- package/dist/lend/core/LendProvider.js.map +1 -1
- package/dist/lend/namespaces/BaseLendNamespace.d.ts +2 -6
- package/dist/lend/namespaces/BaseLendNamespace.d.ts.map +1 -1
- package/dist/lend/namespaces/BaseLendNamespace.js.map +1 -1
- package/dist/lend/namespaces/__tests__/BaseLendNamespace.spec.js +7 -4
- package/dist/lend/namespaces/__tests__/BaseLendNamespace.spec.js.map +1 -1
- package/dist/lend/providers/aave/AaveLendProvider.d.ts +1 -6
- package/dist/lend/providers/aave/AaveLendProvider.d.ts.map +1 -1
- package/dist/lend/providers/aave/AaveLendProvider.js +3 -6
- package/dist/lend/providers/aave/AaveLendProvider.js.map +1 -1
- package/dist/lend/providers/aave/__tests__/AaveLendProvider.test.js +14 -6
- package/dist/lend/providers/aave/__tests__/AaveLendProvider.test.js.map +1 -1
- package/dist/lend/providers/aave/addresses.d.ts +13 -39
- package/dist/lend/providers/aave/addresses.d.ts.map +1 -1
- package/dist/lend/providers/aave/addresses.js +65 -60
- package/dist/lend/providers/aave/addresses.js.map +1 -1
- package/dist/lend/providers/aave/sdk.d.ts +2 -2
- package/dist/lend/providers/aave/sdk.d.ts.map +1 -1
- package/dist/lend/providers/aave/sdk.js +6 -28
- package/dist/lend/providers/aave/sdk.js.map +1 -1
- package/dist/lend/providers/morpho/MorphoLendProvider.d.ts +1 -6
- package/dist/lend/providers/morpho/MorphoLendProvider.d.ts.map +1 -1
- package/dist/lend/providers/morpho/MorphoLendProvider.js +4 -13
- package/dist/lend/providers/morpho/MorphoLendProvider.js.map +1 -1
- package/dist/lend/providers/morpho/__tests__/api.test.js +52 -43
- package/dist/lend/providers/morpho/__tests__/api.test.js.map +1 -1
- package/dist/lend/providers/morpho/__tests__/sdk.test.js +41 -42
- package/dist/lend/providers/morpho/__tests__/sdk.test.js.map +1 -1
- package/dist/lend/providers/morpho/api.d.ts +3 -7
- package/dist/lend/providers/morpho/api.d.ts.map +1 -1
- package/dist/lend/providers/morpho/api.js +2 -2
- package/dist/lend/providers/morpho/api.js.map +1 -1
- package/dist/lend/providers/morpho/contracts.d.ts +11 -10
- package/dist/lend/providers/morpho/contracts.d.ts.map +1 -1
- package/dist/lend/providers/morpho/contracts.js +43 -10
- package/dist/lend/providers/morpho/contracts.js.map +1 -1
- package/dist/lend/providers/morpho/sdk.d.ts +7 -2
- package/dist/lend/providers/morpho/sdk.d.ts.map +1 -1
- package/dist/lend/providers/morpho/sdk.js +67 -63
- package/dist/lend/providers/morpho/sdk.js.map +1 -1
- package/dist/nodeActionsFactory.d.ts +1 -1
- package/dist/reactActionsFactory.d.ts +1 -1
- package/dist/services/ChainManager.d.ts +8 -8
- package/dist/services/ChainManager.d.ts.map +1 -1
- package/dist/services/ChainManager.js.map +1 -1
- package/dist/services/__mocks__/MockChainManager.d.ts +4 -4
- package/dist/services/__mocks__/MockChainManager.d.ts.map +1 -1
- package/dist/services/__mocks__/MockChainManager.js.map +1 -1
- package/dist/services/tokenBalance.d.ts +1 -1
- package/dist/services/tokenBalance.d.ts.map +1 -1
- package/dist/services/tokenBalance.js +31 -30
- package/dist/services/tokenBalance.js.map +1 -1
- package/dist/services/tokenBalance.spec.js +20 -24
- package/dist/services/tokenBalance.spec.js.map +1 -1
- package/dist/swap/__mocks__/MockSwapProvider.d.ts +20 -8
- package/dist/swap/__mocks__/MockSwapProvider.d.ts.map +1 -1
- package/dist/swap/__mocks__/MockSwapProvider.js +52 -29
- package/dist/swap/__mocks__/MockSwapProvider.js.map +1 -1
- package/dist/swap/core/SwapProvider.d.ts +105 -16
- package/dist/swap/core/SwapProvider.d.ts.map +1 -1
- package/dist/swap/core/SwapProvider.js +218 -36
- package/dist/swap/core/SwapProvider.js.map +1 -1
- package/dist/swap/core/__tests__/SwapProvider.test.js +115 -9
- package/dist/swap/core/__tests__/SwapProvider.test.js.map +1 -1
- package/dist/swap/core/markets.d.ts +47 -0
- package/dist/swap/core/markets.d.ts.map +1 -0
- package/dist/swap/core/markets.js +65 -0
- package/dist/swap/core/markets.js.map +1 -0
- package/dist/swap/index.d.ts +2 -0
- package/dist/swap/index.d.ts.map +1 -1
- package/dist/swap/index.js +1 -0
- package/dist/swap/index.js.map +1 -1
- package/dist/swap/namespaces/ActionsSwapNamespace.d.ts +2 -2
- package/dist/swap/namespaces/ActionsSwapNamespace.js +2 -2
- package/dist/swap/namespaces/BaseSwapNamespace.d.ts +48 -8
- package/dist/swap/namespaces/BaseSwapNamespace.d.ts.map +1 -1
- package/dist/swap/namespaces/BaseSwapNamespace.js +139 -16
- package/dist/swap/namespaces/BaseSwapNamespace.js.map +1 -1
- package/dist/swap/namespaces/WalletSwapNamespace.d.ts +19 -7
- package/dist/swap/namespaces/WalletSwapNamespace.d.ts.map +1 -1
- package/dist/swap/namespaces/WalletSwapNamespace.js +39 -15
- package/dist/swap/namespaces/WalletSwapNamespace.js.map +1 -1
- package/dist/swap/namespaces/__tests__/BaseSwapNamespace.spec.js +150 -11
- package/dist/swap/namespaces/__tests__/BaseSwapNamespace.spec.js.map +1 -1
- package/dist/swap/namespaces/__tests__/WalletSwapNamespace.spec.js +85 -8
- package/dist/swap/namespaces/__tests__/WalletSwapNamespace.spec.js.map +1 -1
- package/dist/swap/providers/uniswap/UniswapSwapProvider.d.ts +9 -42
- package/dist/swap/providers/uniswap/UniswapSwapProvider.d.ts.map +1 -1
- package/dist/swap/providers/uniswap/UniswapSwapProvider.js +81 -139
- package/dist/swap/providers/uniswap/UniswapSwapProvider.js.map +1 -1
- package/dist/swap/providers/uniswap/__tests__/UniswapSwapProvider.test.js +10 -9
- package/dist/swap/providers/uniswap/__tests__/UniswapSwapProvider.test.js.map +1 -1
- package/dist/swap/providers/uniswap/__tests__/sdk.test.js +17 -17
- package/dist/swap/providers/uniswap/__tests__/sdk.test.js.map +1 -1
- package/dist/swap/providers/uniswap/addresses.d.ts +5 -0
- package/dist/swap/providers/uniswap/addresses.d.ts.map +1 -1
- package/dist/swap/providers/uniswap/addresses.js +1 -1
- package/dist/swap/providers/uniswap/addresses.js.map +1 -1
- package/dist/swap/providers/uniswap/encoding.d.ts +4 -4
- package/dist/swap/providers/uniswap/encoding.js +17 -17
- package/dist/swap/providers/uniswap/markets.d.ts +19 -0
- package/dist/swap/providers/uniswap/markets.d.ts.map +1 -0
- package/dist/swap/providers/uniswap/markets.js +48 -0
- package/dist/swap/providers/uniswap/markets.js.map +1 -0
- package/dist/swap/providers/uniswap/types.d.ts +4 -3
- package/dist/swap/providers/uniswap/types.d.ts.map +1 -1
- package/dist/swap/providers/velodrome/VelodromeSwapProvider.d.ts +49 -0
- package/dist/swap/providers/velodrome/VelodromeSwapProvider.d.ts.map +1 -0
- package/dist/swap/providers/velodrome/VelodromeSwapProvider.js +140 -0
- package/dist/swap/providers/velodrome/VelodromeSwapProvider.js.map +1 -0
- package/dist/swap/providers/velodrome/__tests__/VelodromeSwapProvider.network.test.d.ts +2 -0
- package/dist/swap/providers/velodrome/__tests__/VelodromeSwapProvider.network.test.d.ts.map +1 -0
- package/dist/swap/providers/velodrome/__tests__/VelodromeSwapProvider.network.test.js +255 -0
- package/dist/swap/providers/velodrome/__tests__/VelodromeSwapProvider.network.test.js.map +1 -0
- package/dist/swap/providers/velodrome/__tests__/VelodromeSwapProvider.routing.test.d.ts +2 -0
- package/dist/swap/providers/velodrome/__tests__/VelodromeSwapProvider.routing.test.d.ts.map +1 -0
- package/dist/swap/providers/velodrome/__tests__/VelodromeSwapProvider.routing.test.js +166 -0
- package/dist/swap/providers/velodrome/__tests__/VelodromeSwapProvider.routing.test.js.map +1 -0
- package/dist/swap/providers/velodrome/__tests__/VelodromeSwapProvider.test.d.ts +2 -0
- package/dist/swap/providers/velodrome/__tests__/VelodromeSwapProvider.test.d.ts.map +1 -0
- package/dist/swap/providers/velodrome/__tests__/VelodromeSwapProvider.test.js +419 -0
- package/dist/swap/providers/velodrome/__tests__/VelodromeSwapProvider.test.js.map +1 -0
- package/dist/swap/providers/velodrome/__tests__/encoding.cl.test.d.ts +2 -0
- package/dist/swap/providers/velodrome/__tests__/encoding.cl.test.d.ts.map +1 -0
- package/dist/swap/providers/velodrome/__tests__/encoding.cl.test.js +51 -0
- package/dist/swap/providers/velodrome/__tests__/encoding.cl.test.js.map +1 -0
- package/dist/swap/providers/velodrome/__tests__/encoding.helpers.d.ts +14 -0
- package/dist/swap/providers/velodrome/__tests__/encoding.helpers.d.ts.map +1 -0
- package/dist/swap/providers/velodrome/__tests__/encoding.helpers.js +13 -0
- package/dist/swap/providers/velodrome/__tests__/encoding.helpers.js.map +1 -0
- package/dist/swap/providers/velodrome/__tests__/encoding.v2.test.d.ts +2 -0
- package/dist/swap/providers/velodrome/__tests__/encoding.v2.test.d.ts.map +1 -0
- package/dist/swap/providers/velodrome/__tests__/encoding.v2.test.js +173 -0
- package/dist/swap/providers/velodrome/__tests__/encoding.v2.test.js.map +1 -0
- package/dist/swap/providers/velodrome/abis.d.ts +396 -0
- package/dist/swap/providers/velodrome/abis.d.ts.map +1 -0
- package/dist/swap/providers/velodrome/abis.js +257 -0
- package/dist/swap/providers/velodrome/abis.js.map +1 -0
- package/dist/swap/providers/velodrome/addresses.d.ts +39 -0
- package/dist/swap/providers/velodrome/addresses.d.ts.map +1 -0
- package/dist/swap/providers/velodrome/addresses.js +57 -0
- package/dist/swap/providers/velodrome/addresses.js.map +1 -0
- package/dist/swap/providers/velodrome/config.d.ts +22 -0
- package/dist/swap/providers/velodrome/config.d.ts.map +1 -0
- package/dist/swap/providers/velodrome/config.js +29 -0
- package/dist/swap/providers/velodrome/config.js.map +1 -0
- package/dist/swap/providers/velodrome/encoding/helpers.d.ts +37 -0
- package/dist/swap/providers/velodrome/encoding/helpers.d.ts.map +1 -0
- package/dist/swap/providers/velodrome/encoding/helpers.js +60 -0
- package/dist/swap/providers/velodrome/encoding/helpers.js.map +1 -0
- package/dist/swap/providers/velodrome/encoding/index.d.ts +8 -0
- package/dist/swap/providers/velodrome/encoding/index.d.ts.map +1 -0
- package/dist/swap/providers/velodrome/encoding/index.js +5 -0
- package/dist/swap/providers/velodrome/encoding/index.js.map +1 -0
- package/dist/swap/providers/velodrome/encoding/poolRouter.d.ts +39 -0
- package/dist/swap/providers/velodrome/encoding/poolRouter.d.ts.map +1 -0
- package/dist/swap/providers/velodrome/encoding/poolRouter.js +83 -0
- package/dist/swap/providers/velodrome/encoding/poolRouter.js.map +1 -0
- package/dist/swap/providers/velodrome/encoding/routers/approval.d.ts +15 -0
- package/dist/swap/providers/velodrome/encoding/routers/approval.d.ts.map +1 -0
- package/dist/swap/providers/velodrome/encoding/routers/approval.js +33 -0
- package/dist/swap/providers/velodrome/encoding/routers/approval.js.map +1 -0
- package/dist/swap/providers/velodrome/encoding/routers/cl.d.ts +40 -0
- package/dist/swap/providers/velodrome/encoding/routers/cl.d.ts.map +1 -0
- package/dist/swap/providers/velodrome/encoding/routers/cl.js +80 -0
- package/dist/swap/providers/velodrome/encoding/routers/cl.js.map +1 -0
- package/dist/swap/providers/velodrome/encoding/routers/v2.d.ts +42 -0
- package/dist/swap/providers/velodrome/encoding/routers/v2.d.ts.map +1 -0
- package/dist/swap/providers/velodrome/encoding/routers/v2.js +166 -0
- package/dist/swap/providers/velodrome/encoding/routers/v2.js.map +1 -0
- package/dist/swap/providers/velodrome/markets.d.ts +21 -0
- package/dist/swap/providers/velodrome/markets.d.ts.map +1 -0
- package/dist/swap/providers/velodrome/markets.js +69 -0
- package/dist/swap/providers/velodrome/markets.js.map +1 -0
- package/dist/swap/providers/velodrome/types.d.ts +31 -0
- package/dist/swap/providers/velodrome/types.d.ts.map +1 -0
- package/dist/swap/providers/velodrome/types.js +2 -0
- package/dist/swap/providers/velodrome/types.js.map +1 -0
- package/dist/types/actions.d.ts +44 -9
- package/dist/types/actions.d.ts.map +1 -1
- package/dist/types/asset.d.ts +7 -9
- package/dist/types/asset.d.ts.map +1 -1
- package/dist/types/chain.d.ts +2 -2
- package/dist/types/chain.d.ts.map +1 -1
- package/dist/types/lend/base.d.ts +6 -6
- package/dist/types/lend/base.d.ts.map +1 -1
- package/dist/types/lend/base.js.map +1 -1
- package/dist/types/lend/contracts.d.ts +2 -1
- package/dist/types/lend/contracts.d.ts.map +1 -1
- package/dist/types/providers.d.ts +21 -0
- package/dist/types/providers.d.ts.map +1 -0
- package/dist/types/providers.js +2 -0
- package/dist/types/providers.js.map +1 -0
- package/dist/types/swap/base.d.ts +133 -33
- package/dist/types/swap/base.d.ts.map +1 -1
- package/dist/utils/approve.d.ts +82 -0
- package/dist/utils/approve.d.ts.map +1 -0
- package/dist/utils/{permit2.js → approve.js} +48 -14
- package/dist/utils/approve.js.map +1 -0
- package/dist/utils/approve.test.d.ts +2 -0
- package/dist/utils/approve.test.d.ts.map +1 -0
- package/dist/utils/{permit2.test.js → approve.test.js} +95 -2
- package/dist/utils/approve.test.js.map +1 -0
- package/dist/utils/assets.d.ts +6 -0
- package/dist/utils/assets.d.ts.map +1 -1
- package/dist/utils/assets.js +10 -0
- package/dist/utils/assets.js.map +1 -1
- package/dist/utils/validateAddresses.d.ts +32 -0
- package/dist/utils/validateAddresses.d.ts.map +1 -0
- package/dist/utils/validateAddresses.js +103 -0
- package/dist/utils/validateAddresses.js.map +1 -0
- package/dist/utils/validateAddresses.test.d.ts +2 -0
- package/dist/utils/validateAddresses.test.d.ts.map +1 -0
- package/dist/utils/validateAddresses.test.js +314 -0
- package/dist/utils/validateAddresses.test.js.map +1 -0
- package/dist/wallet/core/namespace/WalletNamespace.d.ts +21 -9
- package/dist/wallet/core/namespace/WalletNamespace.d.ts.map +1 -1
- package/dist/wallet/core/namespace/WalletNamespace.js +44 -15
- package/dist/wallet/core/namespace/WalletNamespace.js.map +1 -1
- package/dist/wallet/core/namespace/__tests__/WalletNamespace.spec.js +4 -4
- package/dist/wallet/core/namespace/__tests__/WalletNamespace.spec.js.map +1 -1
- package/dist/wallet/core/providers/hosted/abstract/HostedWalletProvider.d.ts +4 -16
- package/dist/wallet/core/providers/hosted/abstract/HostedWalletProvider.d.ts.map +1 -1
- package/dist/wallet/core/providers/hosted/abstract/HostedWalletProvider.js.map +1 -1
- package/dist/wallet/core/providers/hosted/types/index.d.ts +6 -11
- package/dist/wallet/core/providers/hosted/types/index.d.ts.map +1 -1
- package/dist/wallet/core/providers/smart/default/DefaultSmartWalletProvider.d.ts +2 -9
- package/dist/wallet/core/providers/smart/default/DefaultSmartWalletProvider.d.ts.map +1 -1
- package/dist/wallet/core/providers/smart/default/DefaultSmartWalletProvider.js.map +1 -1
- package/dist/wallet/core/wallets/abstract/Wallet.d.ts +6 -17
- package/dist/wallet/core/wallets/abstract/Wallet.d.ts.map +1 -1
- package/dist/wallet/core/wallets/abstract/Wallet.js +5 -6
- package/dist/wallet/core/wallets/abstract/Wallet.js.map +1 -1
- package/dist/wallet/core/wallets/abstract/__mocks__/TestWallet.d.ts +10 -1
- package/dist/wallet/core/wallets/abstract/__mocks__/TestWallet.d.ts.map +1 -1
- package/dist/wallet/core/wallets/abstract/__mocks__/TestWallet.js +2 -2
- package/dist/wallet/core/wallets/abstract/__mocks__/TestWallet.js.map +1 -1
- package/dist/wallet/core/wallets/abstract/__tests__/Wallet.spec.js +12 -4
- package/dist/wallet/core/wallets/abstract/__tests__/Wallet.spec.js.map +1 -1
- package/dist/wallet/core/wallets/smart/default/DefaultSmartWallet.d.ts +3 -10
- package/dist/wallet/core/wallets/smart/default/DefaultSmartWallet.d.ts.map +1 -1
- package/dist/wallet/core/wallets/smart/default/DefaultSmartWallet.js.map +1 -1
- package/dist/wallet/core/wallets/smart/default/__tests__/DefaultSmartWallet.spec.js.map +1 -1
- package/dist/wallet/node/providers/hosted/privy/PrivyHostedWalletProvider.d.ts +3 -10
- package/dist/wallet/node/providers/hosted/privy/PrivyHostedWalletProvider.d.ts.map +1 -1
- package/dist/wallet/node/providers/hosted/privy/PrivyHostedWalletProvider.js.map +1 -1
- package/dist/wallet/node/providers/hosted/registry/NodeHostedWalletProviderRegistry.d.ts +2 -4
- package/dist/wallet/node/providers/hosted/registry/NodeHostedWalletProviderRegistry.d.ts.map +1 -1
- package/dist/wallet/node/providers/hosted/registry/NodeHostedWalletProviderRegistry.js +6 -8
- package/dist/wallet/node/providers/hosted/registry/NodeHostedWalletProviderRegistry.js.map +1 -1
- package/dist/wallet/node/providers/hosted/registry/__tests__/NodeHostedWalletProviderRegistry.spec.js +4 -4
- package/dist/wallet/node/providers/hosted/registry/__tests__/NodeHostedWalletProviderRegistry.spec.js.map +1 -1
- package/dist/wallet/node/providers/hosted/turnkey/TurnkeyHostedWalletProvider.d.ts +2 -9
- package/dist/wallet/node/providers/hosted/turnkey/TurnkeyHostedWalletProvider.d.ts.map +1 -1
- package/dist/wallet/node/providers/hosted/turnkey/TurnkeyHostedWalletProvider.js.map +1 -1
- package/dist/wallet/node/wallets/hosted/privy/PrivyWallet.d.ts +3 -10
- package/dist/wallet/node/wallets/hosted/privy/PrivyWallet.d.ts.map +1 -1
- package/dist/wallet/node/wallets/hosted/privy/PrivyWallet.js.map +1 -1
- package/dist/wallet/node/wallets/hosted/turnkey/TurnkeyWallet.d.ts +3 -10
- package/dist/wallet/node/wallets/hosted/turnkey/TurnkeyWallet.d.ts.map +1 -1
- package/dist/wallet/node/wallets/hosted/turnkey/TurnkeyWallet.js.map +1 -1
- package/dist/wallet/react/providers/hosted/dynamic/DynamicHostedWalletProvider.d.ts +3 -9
- package/dist/wallet/react/providers/hosted/dynamic/DynamicHostedWalletProvider.d.ts.map +1 -1
- package/dist/wallet/react/providers/hosted/dynamic/DynamicHostedWalletProvider.js +3 -2
- package/dist/wallet/react/providers/hosted/dynamic/DynamicHostedWalletProvider.js.map +1 -1
- package/dist/wallet/react/providers/hosted/privy/PrivyHostedWalletProvider.d.ts +3 -9
- package/dist/wallet/react/providers/hosted/privy/PrivyHostedWalletProvider.d.ts.map +1 -1
- package/dist/wallet/react/providers/hosted/privy/PrivyHostedWalletProvider.js +3 -2
- package/dist/wallet/react/providers/hosted/privy/PrivyHostedWalletProvider.js.map +1 -1
- package/dist/wallet/react/providers/hosted/turnkey/TurnkeyHostedWalletProvider.d.ts +3 -9
- package/dist/wallet/react/providers/hosted/turnkey/TurnkeyHostedWalletProvider.d.ts.map +1 -1
- package/dist/wallet/react/providers/hosted/turnkey/TurnkeyHostedWalletProvider.js +3 -2
- package/dist/wallet/react/providers/hosted/turnkey/TurnkeyHostedWalletProvider.js.map +1 -1
- package/dist/wallet/react/providers/registry/ReactHostedWalletProviderRegistry.d.ts +2 -4
- package/dist/wallet/react/providers/registry/ReactHostedWalletProviderRegistry.d.ts.map +1 -1
- package/dist/wallet/react/providers/registry/ReactHostedWalletProviderRegistry.js +11 -13
- package/dist/wallet/react/providers/registry/ReactHostedWalletProviderRegistry.js.map +1 -1
- package/dist/wallet/react/providers/registry/__tests__/ReactHostedWalletProviderRegistry.spec.js +6 -6
- package/dist/wallet/react/providers/registry/__tests__/ReactHostedWalletProviderRegistry.spec.js.map +1 -1
- package/dist/wallet/react/wallets/hosted/dynamic/DynamicWallet.d.ts +5 -10
- package/dist/wallet/react/wallets/hosted/dynamic/DynamicWallet.d.ts.map +1 -1
- package/dist/wallet/react/wallets/hosted/dynamic/DynamicWallet.js +3 -3
- package/dist/wallet/react/wallets/hosted/dynamic/DynamicWallet.js.map +1 -1
- package/dist/wallet/react/wallets/hosted/dynamic/__mocks__/DynamicWalletMock.d.ts +2 -6
- package/dist/wallet/react/wallets/hosted/dynamic/__mocks__/DynamicWalletMock.d.ts.map +1 -1
- package/dist/wallet/react/wallets/hosted/dynamic/__mocks__/DynamicWalletMock.js.map +1 -1
- package/dist/wallet/react/wallets/hosted/privy/PrivyWallet.d.ts +5 -10
- package/dist/wallet/react/wallets/hosted/privy/PrivyWallet.d.ts.map +1 -1
- package/dist/wallet/react/wallets/hosted/privy/PrivyWallet.js +3 -3
- package/dist/wallet/react/wallets/hosted/privy/PrivyWallet.js.map +1 -1
- package/dist/wallet/react/wallets/hosted/turnkey/TurnkeyWallet.d.ts +5 -10
- package/dist/wallet/react/wallets/hosted/turnkey/TurnkeyWallet.d.ts.map +1 -1
- package/dist/wallet/react/wallets/hosted/turnkey/TurnkeyWallet.js +2 -2
- package/dist/wallet/react/wallets/hosted/turnkey/TurnkeyWallet.js.map +1 -1
- package/package.json +3 -2
- package/src/__mocks__/MockAssets.ts +54 -6
- package/src/__tests__/actions.test.ts +1 -1
- package/src/actions.ts +58 -61
- package/src/constants/assets.ts +781 -10
- package/src/constants/providers.ts +5 -0
- package/src/constants/supportedChains.ts +22 -2
- package/src/index.ts +50 -8
- package/src/lend/__mocks__/MockLendProvider.ts +8 -3
- package/src/lend/core/LendProvider.ts +27 -28
- package/src/lend/namespaces/BaseLendNamespace.ts +2 -6
- package/src/lend/namespaces/__tests__/BaseLendNamespace.spec.ts +12 -5
- package/src/lend/providers/aave/AaveLendProvider.ts +3 -7
- package/src/lend/providers/aave/__tests__/AaveLendProvider.test.ts +16 -7
- package/src/lend/providers/aave/addresses.ts +82 -64
- package/src/lend/providers/aave/sdk.ts +11 -36
- package/src/lend/providers/morpho/MorphoLendProvider.ts +4 -16
- package/src/lend/providers/morpho/__tests__/api.test.ts +65 -44
- package/src/lend/providers/morpho/__tests__/sdk.test.ts +43 -43
- package/src/lend/providers/morpho/api.ts +7 -8
- package/src/lend/providers/morpho/contracts.ts +62 -13
- package/src/lend/providers/morpho/sdk.ts +85 -63
- package/src/services/ChainManager.ts +12 -21
- package/src/services/__mocks__/MockChainManager.ts +4 -7
- package/src/services/tokenBalance.spec.ts +20 -24
- package/src/services/tokenBalance.ts +39 -33
- package/src/swap/__mocks__/MockSwapProvider.ts +77 -42
- package/src/swap/core/SwapProvider.ts +307 -49
- package/src/swap/core/__tests__/SwapProvider.test.ts +151 -9
- package/src/swap/core/markets.ts +104 -0
- package/src/swap/index.ts +5 -0
- package/src/swap/namespaces/ActionsSwapNamespace.ts +2 -2
- package/src/swap/namespaces/BaseSwapNamespace.ts +199 -18
- package/src/swap/namespaces/WalletSwapNamespace.ts +53 -14
- package/src/swap/namespaces/__tests__/BaseSwapNamespace.spec.ts +241 -14
- package/src/swap/namespaces/__tests__/WalletSwapNamespace.spec.ts +103 -8
- package/src/swap/providers/uniswap/UniswapSwapProvider.ts +108 -195
- package/src/swap/providers/uniswap/__tests__/UniswapSwapProvider.test.ts +12 -12
- package/src/swap/providers/uniswap/__tests__/sdk.test.ts +19 -20
- package/src/swap/providers/uniswap/addresses.ts +3 -1
- package/src/swap/providers/uniswap/encoding.ts +22 -22
- package/src/swap/providers/uniswap/markets.ts +84 -0
- package/src/swap/providers/uniswap/types.ts +4 -3
- package/src/swap/providers/velodrome/VelodromeSwapProvider.ts +224 -0
- package/src/swap/providers/velodrome/__tests__/VelodromeSwapProvider.network.test.ts +341 -0
- package/src/swap/providers/velodrome/__tests__/VelodromeSwapProvider.routing.test.ts +202 -0
- package/src/swap/providers/velodrome/__tests__/VelodromeSwapProvider.test.ts +506 -0
- package/src/swap/providers/velodrome/__tests__/encoding.cl.test.ts +69 -0
- package/src/swap/providers/velodrome/__tests__/encoding.helpers.ts +20 -0
- package/src/swap/providers/velodrome/__tests__/encoding.v2.test.ts +235 -0
- package/src/swap/providers/velodrome/abis.ts +264 -0
- package/src/swap/providers/velodrome/addresses.ts +107 -0
- package/src/swap/providers/velodrome/config.ts +46 -0
- package/src/swap/providers/velodrome/encoding/helpers.ts +82 -0
- package/src/swap/providers/velodrome/encoding/index.ts +7 -0
- package/src/swap/providers/velodrome/encoding/poolRouter.ts +124 -0
- package/src/swap/providers/velodrome/encoding/routers/approval.ts +45 -0
- package/src/swap/providers/velodrome/encoding/routers/cl.ts +156 -0
- package/src/swap/providers/velodrome/encoding/routers/v2.ts +267 -0
- package/src/swap/providers/velodrome/markets.ts +100 -0
- package/src/swap/providers/velodrome/types.ts +30 -0
- package/src/types/actions.ts +49 -9
- package/src/types/asset.ts +12 -9
- package/src/types/chain.ts +2 -2
- package/src/types/lend/base.ts +6 -6
- package/src/types/lend/contracts.ts +5 -1
- package/src/types/providers.ts +22 -0
- package/src/types/swap/base.ts +147 -34
- package/src/utils/{permit2.test.ts → approve.test.ts} +117 -1
- package/src/utils/{permit2.ts → approve.ts} +67 -14
- package/src/utils/assets.ts +14 -0
- package/src/utils/validateAddresses.test.ts +439 -0
- package/src/utils/validateAddresses.ts +153 -0
- package/src/wallet/core/namespace/WalletNamespace.ts +70 -16
- package/src/wallet/core/namespace/__tests__/WalletNamespace.spec.ts +8 -4
- package/src/wallet/core/providers/hosted/abstract/HostedWalletProvider.ts +5 -17
- package/src/wallet/core/providers/hosted/types/index.ts +9 -11
- package/src/wallet/core/providers/smart/default/DefaultSmartWalletProvider.ts +5 -17
- package/src/wallet/core/wallets/abstract/Wallet.ts +15 -22
- package/src/wallet/core/wallets/abstract/__mocks__/TestWallet.ts +13 -1
- package/src/wallet/core/wallets/abstract/__tests__/Wallet.spec.ts +21 -5
- package/src/wallet/core/wallets/smart/default/DefaultSmartWallet.ts +5 -17
- package/src/wallet/core/wallets/smart/default/__tests__/DefaultSmartWallet.spec.ts +0 -1
- package/src/wallet/node/providers/hosted/privy/PrivyHostedWalletProvider.ts +3 -10
- package/src/wallet/node/providers/hosted/registry/NodeHostedWalletProviderRegistry.ts +8 -8
- package/src/wallet/node/providers/hosted/registry/__tests__/NodeHostedWalletProviderRegistry.spec.ts +4 -4
- package/src/wallet/node/providers/hosted/turnkey/TurnkeyHostedWalletProvider.ts +3 -10
- package/src/wallet/node/wallets/hosted/privy/PrivyWallet.ts +5 -17
- package/src/wallet/node/wallets/hosted/turnkey/TurnkeyWallet.ts +5 -17
- package/src/wallet/react/providers/hosted/dynamic/DynamicHostedWalletProvider.ts +7 -11
- package/src/wallet/react/providers/hosted/privy/PrivyHostedWalletProvider.ts +7 -11
- package/src/wallet/react/providers/hosted/turnkey/TurnkeyHostedWalletProvider.ts +7 -11
- package/src/wallet/react/providers/registry/ReactHostedWalletProviderRegistry.ts +23 -10
- package/src/wallet/react/providers/registry/__tests__/ReactHostedWalletProviderRegistry.spec.ts +6 -6
- package/src/wallet/react/wallets/hosted/dynamic/DynamicWallet.ts +10 -18
- package/src/wallet/react/wallets/hosted/dynamic/__mocks__/DynamicWalletMock.ts +2 -6
- package/src/wallet/react/wallets/hosted/privy/PrivyWallet.ts +10 -18
- package/src/wallet/react/wallets/hosted/turnkey/TurnkeyWallet.ts +10 -18
- package/dist/supported/tokens.d.ts +0 -25
- package/dist/supported/tokens.d.ts.map +0 -1
- package/dist/supported/tokens.js +0 -44
- package/dist/supported/tokens.js.map +0 -1
- package/dist/utils/permit2.d.ts +0 -46
- package/dist/utils/permit2.d.ts.map +0 -1
- package/dist/utils/permit2.js.map +0 -1
- package/dist/utils/permit2.test.d.ts +0 -2
- package/dist/utils/permit2.test.d.ts.map +0 -1
- package/dist/utils/permit2.test.js.map +0 -1
- package/src/supported/tokens.ts +0 -66
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type { Address } from 'viem'
|
|
2
|
+
import { formatUnits } from 'viem'
|
|
3
|
+
|
|
4
|
+
import { WETH } from '@/constants/assets.js'
|
|
5
|
+
import type { SupportedChainId } from '@/constants/supportedChains.js'
|
|
6
|
+
import { UNIVERSAL_ROUTER_MSG_SENDER } from '@/swap/core/markets.js'
|
|
7
|
+
import type { Asset } from '@/types/asset.js'
|
|
8
|
+
import type { SwapPrice, SwapRoute } from '@/types/swap/index.js'
|
|
9
|
+
import { getAssetAddress, isNativeAsset } from '@/utils/assets.js'
|
|
10
|
+
|
|
11
|
+
export { UNIVERSAL_ROUTER_MSG_SENDER }
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Resolve an asset pair to on-chain token addresses for a given chain.
|
|
15
|
+
* Native ETH is converted to the WETH predeploy address.
|
|
16
|
+
* @param assetIn - Input asset
|
|
17
|
+
* @param assetOut - Output asset
|
|
18
|
+
* @param chainId - Target chain
|
|
19
|
+
* @returns Resolved token addresses
|
|
20
|
+
*/
|
|
21
|
+
export function resolveTokens(
|
|
22
|
+
assetIn: Asset,
|
|
23
|
+
assetOut: Asset,
|
|
24
|
+
chainId: SupportedChainId,
|
|
25
|
+
): { tokenIn: Address; tokenOut: Address } {
|
|
26
|
+
const tokenIn = isNativeAsset(assetIn)
|
|
27
|
+
? getWrappedNativeAddress(chainId)
|
|
28
|
+
: getAssetAddress(assetIn, chainId)
|
|
29
|
+
const tokenOut = isNativeAsset(assetOut)
|
|
30
|
+
? getWrappedNativeAddress(chainId)
|
|
31
|
+
: getAssetAddress(assetOut, chainId)
|
|
32
|
+
return { tokenIn, tokenOut }
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Get the wrapped native token address for a chain.
|
|
37
|
+
* Velodrome routers require WETH in Route structs, not address(0).
|
|
38
|
+
* @param chainId - Target chain
|
|
39
|
+
* @returns WETH address
|
|
40
|
+
* @throws If no WETH address configured for the chain
|
|
41
|
+
*/
|
|
42
|
+
export function getWrappedNativeAddress(chainId: SupportedChainId): Address {
|
|
43
|
+
const addr = WETH.address[chainId]
|
|
44
|
+
if (!addr || addr === 'native') {
|
|
45
|
+
throw new Error(`No WETH address configured for chain ${chainId}`)
|
|
46
|
+
}
|
|
47
|
+
return addr
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Build a SwapPrice from raw quote data.
|
|
52
|
+
* @param assetIn - Input asset (for decimal conversion)
|
|
53
|
+
* @param assetOut - Output asset (for decimal conversion)
|
|
54
|
+
* @param amountInRaw - Input amount as raw bigint
|
|
55
|
+
* @param amountOutRaw - Output amount as raw bigint
|
|
56
|
+
* @param route - Swap route information
|
|
57
|
+
* @returns SwapPrice with human-readable and raw amounts
|
|
58
|
+
*/
|
|
59
|
+
export function buildSwapPrice(
|
|
60
|
+
assetIn: Asset,
|
|
61
|
+
assetOut: Asset,
|
|
62
|
+
amountInRaw: bigint,
|
|
63
|
+
amountOutRaw: bigint,
|
|
64
|
+
route: SwapRoute,
|
|
65
|
+
): SwapPrice {
|
|
66
|
+
const amountIn = parseFloat(
|
|
67
|
+
formatUnits(amountInRaw, assetIn.metadata.decimals),
|
|
68
|
+
)
|
|
69
|
+
const amountOut = parseFloat(
|
|
70
|
+
formatUnits(amountOutRaw, assetOut.metadata.decimals),
|
|
71
|
+
)
|
|
72
|
+
return {
|
|
73
|
+
price: (amountOut / amountIn).toFixed(6),
|
|
74
|
+
priceInverse: (amountIn / amountOut).toFixed(6),
|
|
75
|
+
amountIn,
|
|
76
|
+
amountOut,
|
|
77
|
+
amountInRaw,
|
|
78
|
+
amountOutRaw,
|
|
79
|
+
priceImpact: 0,
|
|
80
|
+
route,
|
|
81
|
+
}
|
|
82
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type { PoolQuoteResult } from './poolRouter.js'
|
|
2
|
+
export { encodePoolSwap, fetchPoolQuote } from './poolRouter.js'
|
|
3
|
+
export { buildTokenApproval } from './routers/approval.js'
|
|
4
|
+
export type { EncodeCLSwapParams, GetCLQuoteParams } from './routers/cl.js'
|
|
5
|
+
export { encodeCLSwap, getCLQuote } from './routers/cl.js'
|
|
6
|
+
export type { EncodeSwapParams, GetQuoteParams } from './routers/v2.js'
|
|
7
|
+
export { encodeSwap, getQuote } from './routers/v2.js'
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import type { Address, Hex, PublicClient } from 'viem'
|
|
2
|
+
|
|
3
|
+
import type { SupportedChainId } from '@/constants/supportedChains.js'
|
|
4
|
+
import type { VelodromeChainConfig } from '@/swap/providers/velodrome/config.js'
|
|
5
|
+
import type { ResolvedPoolConfig } from '@/swap/providers/velodrome/types.js'
|
|
6
|
+
import type { Asset } from '@/types/asset.js'
|
|
7
|
+
import type { SwapPrice } from '@/types/swap/index.js'
|
|
8
|
+
|
|
9
|
+
import { encodeCLSwap, getCLQuote } from './routers/cl.js'
|
|
10
|
+
import { encodeSwap, getQuote } from './routers/v2.js'
|
|
11
|
+
|
|
12
|
+
/** Internal result from pool-type-specific quoting */
|
|
13
|
+
export interface PoolQuoteResult {
|
|
14
|
+
internalQuote: SwapPrice
|
|
15
|
+
providerContext: Record<string, unknown>
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Fetch a price quote by routing to the correct pool type (v2 AMM or CL/Slipstream).
|
|
20
|
+
* @returns Internal quote and provider context for the SwapQuote
|
|
21
|
+
* @throws If CL pool requested on a chain without CL factory/quoter
|
|
22
|
+
*/
|
|
23
|
+
export async function fetchPoolQuote(
|
|
24
|
+
poolConfig: ResolvedPoolConfig,
|
|
25
|
+
params: {
|
|
26
|
+
assetIn: Asset
|
|
27
|
+
assetOut: Asset
|
|
28
|
+
amountInRaw: bigint
|
|
29
|
+
chainId: SupportedChainId
|
|
30
|
+
publicClient: PublicClient
|
|
31
|
+
chain: VelodromeChainConfig
|
|
32
|
+
},
|
|
33
|
+
): Promise<PoolQuoteResult> {
|
|
34
|
+
const { assetIn, assetOut, amountInRaw, chainId, publicClient, chain } =
|
|
35
|
+
params
|
|
36
|
+
|
|
37
|
+
if (poolConfig.type === 'cl') {
|
|
38
|
+
if (!chain.contracts.clPoolFactory || !chain.contracts.clQuoterV2) {
|
|
39
|
+
throw new Error(`CL pools not supported on chain ${chainId}`)
|
|
40
|
+
}
|
|
41
|
+
const internalQuote = await getCLQuote({
|
|
42
|
+
assetIn,
|
|
43
|
+
assetOut,
|
|
44
|
+
amountInRaw,
|
|
45
|
+
chainId,
|
|
46
|
+
publicClient,
|
|
47
|
+
clFactoryAddress: chain.contracts.clPoolFactory,
|
|
48
|
+
clQuoterAddress: chain.contracts.clQuoterV2,
|
|
49
|
+
tickSpacing: poolConfig.tickSpacing,
|
|
50
|
+
})
|
|
51
|
+
return {
|
|
52
|
+
internalQuote,
|
|
53
|
+
providerContext: {
|
|
54
|
+
tickSpacing: poolConfig.tickSpacing,
|
|
55
|
+
clFactoryAddress: chain.contracts.clPoolFactory,
|
|
56
|
+
poolAddress: internalQuote.route.pools[0]?.address,
|
|
57
|
+
},
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const internalQuote = await getQuote({
|
|
62
|
+
assetIn,
|
|
63
|
+
assetOut,
|
|
64
|
+
amountInRaw,
|
|
65
|
+
chainId,
|
|
66
|
+
publicClient,
|
|
67
|
+
routerAddress: chain.contracts.router,
|
|
68
|
+
routerType: chain.metadata.routerType,
|
|
69
|
+
stable: poolConfig.stable,
|
|
70
|
+
factoryAddress: chain.contracts.poolFactory,
|
|
71
|
+
})
|
|
72
|
+
return {
|
|
73
|
+
internalQuote,
|
|
74
|
+
providerContext: {
|
|
75
|
+
stable: poolConfig.stable,
|
|
76
|
+
factoryAddress: chain.contracts.poolFactory,
|
|
77
|
+
routerType: chain.metadata.routerType,
|
|
78
|
+
},
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Encode swap calldata by routing to the correct pool type (v2 AMM or CL/Slipstream).
|
|
84
|
+
* @returns Encoded calldata as hex string
|
|
85
|
+
*/
|
|
86
|
+
export function encodePoolSwap(
|
|
87
|
+
poolConfig: ResolvedPoolConfig,
|
|
88
|
+
params: {
|
|
89
|
+
assetIn: Asset
|
|
90
|
+
assetOut: Asset
|
|
91
|
+
amountInRaw: bigint
|
|
92
|
+
amountOutMinRaw: bigint
|
|
93
|
+
recipient: Address
|
|
94
|
+
deadline: number
|
|
95
|
+
chainId: SupportedChainId
|
|
96
|
+
chain: VelodromeChainConfig
|
|
97
|
+
},
|
|
98
|
+
): Hex {
|
|
99
|
+
if (poolConfig.type === 'cl') {
|
|
100
|
+
return encodeCLSwap({
|
|
101
|
+
assetIn: params.assetIn,
|
|
102
|
+
assetOut: params.assetOut,
|
|
103
|
+
amountInRaw: params.amountInRaw,
|
|
104
|
+
amountOutMin: params.amountOutMinRaw,
|
|
105
|
+
tickSpacing: poolConfig.tickSpacing,
|
|
106
|
+
recipient: params.recipient,
|
|
107
|
+
deadline: params.deadline,
|
|
108
|
+
chainId: params.chainId,
|
|
109
|
+
})
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
return encodeSwap({
|
|
113
|
+
assetIn: params.assetIn,
|
|
114
|
+
assetOut: params.assetOut,
|
|
115
|
+
amountInRaw: params.amountInRaw,
|
|
116
|
+
amountOutMin: params.amountOutMinRaw,
|
|
117
|
+
routerType: params.chain.metadata.routerType,
|
|
118
|
+
stable: poolConfig.stable,
|
|
119
|
+
factoryAddress: params.chain.contracts.poolFactory,
|
|
120
|
+
recipient: params.recipient,
|
|
121
|
+
deadline: params.deadline,
|
|
122
|
+
chainId: params.chainId,
|
|
123
|
+
})
|
|
124
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { Address, PublicClient } from 'viem'
|
|
2
|
+
import { encodeFunctionData, erc20Abi } from 'viem'
|
|
3
|
+
|
|
4
|
+
import type { VelodromeRouterType } from '@/swap/providers/velodrome/config.js'
|
|
5
|
+
import type { TransactionData } from '@/types/transaction.js'
|
|
6
|
+
import { buildApprovalTxIfNeeded } from '@/utils/approve.js'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Build a token approval or transfer transaction for swap input.
|
|
10
|
+
*
|
|
11
|
+
* Universal Router uses a direct ERC20 transfer instead of approve+transferFrom.
|
|
12
|
+
* This works because smart wallet batching (4337) bundles the transfer and swap
|
|
13
|
+
* into a single atomic UserOperation — the router receives tokens before executing
|
|
14
|
+
* the swap in the same transaction. The caller must already hold the tokens.
|
|
15
|
+
*
|
|
16
|
+
* Legacy routers (v2, leaf) use standard approve, approving only the deficit.
|
|
17
|
+
*/
|
|
18
|
+
export async function buildTokenApproval(
|
|
19
|
+
token: Address,
|
|
20
|
+
router: Address,
|
|
21
|
+
routerType: VelodromeRouterType,
|
|
22
|
+
amount: bigint,
|
|
23
|
+
owner: Address,
|
|
24
|
+
publicClient: PublicClient,
|
|
25
|
+
): Promise<TransactionData | undefined> {
|
|
26
|
+
if (routerType === 'universal') {
|
|
27
|
+
return {
|
|
28
|
+
to: token,
|
|
29
|
+
data: encodeFunctionData({
|
|
30
|
+
abi: erc20Abi,
|
|
31
|
+
functionName: 'transfer',
|
|
32
|
+
args: [router, amount],
|
|
33
|
+
}),
|
|
34
|
+
value: 0n,
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return buildApprovalTxIfNeeded({
|
|
39
|
+
publicClient,
|
|
40
|
+
token,
|
|
41
|
+
owner,
|
|
42
|
+
spender: router,
|
|
43
|
+
amount,
|
|
44
|
+
})
|
|
45
|
+
}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import type { Address, Hex, PublicClient } from 'viem'
|
|
2
|
+
import { encodeAbiParameters, encodeFunctionData, encodePacked } from 'viem'
|
|
3
|
+
|
|
4
|
+
import type { SupportedChainId } from '@/constants/supportedChains.js'
|
|
5
|
+
import {
|
|
6
|
+
CL_POOL_FACTORY_ABI,
|
|
7
|
+
CL_QUOTER_ABI,
|
|
8
|
+
UNIVERSAL_ROUTER_ABI,
|
|
9
|
+
} from '@/swap/providers/velodrome/abis.js'
|
|
10
|
+
import {
|
|
11
|
+
buildSwapPrice,
|
|
12
|
+
resolveTokens,
|
|
13
|
+
UNIVERSAL_ROUTER_MSG_SENDER,
|
|
14
|
+
} from '@/swap/providers/velodrome/encoding/helpers.js'
|
|
15
|
+
import type { Asset } from '@/types/asset.js'
|
|
16
|
+
import type { SwapPrice, SwapRoute } from '@/types/swap/index.js'
|
|
17
|
+
|
|
18
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
19
|
+
// Quoting
|
|
20
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
21
|
+
|
|
22
|
+
export interface GetCLQuoteParams {
|
|
23
|
+
assetIn: Asset
|
|
24
|
+
assetOut: Asset
|
|
25
|
+
amountInRaw: bigint
|
|
26
|
+
chainId: SupportedChainId
|
|
27
|
+
publicClient: PublicClient
|
|
28
|
+
clFactoryAddress: Address
|
|
29
|
+
clQuoterAddress: Address
|
|
30
|
+
tickSpacing: number
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Get a swap quote from a CL/Slipstream pool via QuoterV2.
|
|
35
|
+
* Verifies the pool exists via the CL factory, then quotes via QuoterV2.
|
|
36
|
+
* @param params - CL quote parameters
|
|
37
|
+
* @returns Price quote with amounts and route
|
|
38
|
+
* @throws If no CL pool exists for the given pair and tickSpacing
|
|
39
|
+
*/
|
|
40
|
+
export async function getCLQuote(params: GetCLQuoteParams): Promise<SwapPrice> {
|
|
41
|
+
const {
|
|
42
|
+
assetIn,
|
|
43
|
+
assetOut,
|
|
44
|
+
amountInRaw,
|
|
45
|
+
publicClient,
|
|
46
|
+
clFactoryAddress,
|
|
47
|
+
clQuoterAddress,
|
|
48
|
+
tickSpacing,
|
|
49
|
+
chainId,
|
|
50
|
+
} = params
|
|
51
|
+
const { tokenIn, tokenOut } = resolveTokens(assetIn, assetOut, chainId)
|
|
52
|
+
|
|
53
|
+
// Verify the CL pool exists
|
|
54
|
+
const poolAddress = await publicClient.readContract({
|
|
55
|
+
address: clFactoryAddress,
|
|
56
|
+
abi: CL_POOL_FACTORY_ABI,
|
|
57
|
+
functionName: 'getPool',
|
|
58
|
+
args: [tokenIn, tokenOut, tickSpacing],
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
if (
|
|
62
|
+
!poolAddress ||
|
|
63
|
+
poolAddress === '0x0000000000000000000000000000000000000000'
|
|
64
|
+
) {
|
|
65
|
+
throw new Error(
|
|
66
|
+
`No CL pool found for ${assetIn.metadata.symbol}/${assetOut.metadata.symbol} (tickSpacing=${tickSpacing})`,
|
|
67
|
+
)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Quote via QuoterV2.quoteExactInputSingle
|
|
71
|
+
// sqrtPriceLimitX96 = 0 means no price limit
|
|
72
|
+
const quoteResult = (await publicClient.readContract({
|
|
73
|
+
address: clQuoterAddress,
|
|
74
|
+
abi: CL_QUOTER_ABI,
|
|
75
|
+
functionName: 'quoteExactInputSingle',
|
|
76
|
+
args: [
|
|
77
|
+
{
|
|
78
|
+
tokenIn,
|
|
79
|
+
tokenOut,
|
|
80
|
+
amountIn: amountInRaw,
|
|
81
|
+
tickSpacing,
|
|
82
|
+
sqrtPriceLimitX96: 0n,
|
|
83
|
+
},
|
|
84
|
+
],
|
|
85
|
+
})) as readonly [bigint, bigint, number, bigint]
|
|
86
|
+
|
|
87
|
+
const route: SwapRoute = {
|
|
88
|
+
path: [assetIn, assetOut],
|
|
89
|
+
pools: [{ address: poolAddress as Address, fee: 0, version: 'v3' }],
|
|
90
|
+
}
|
|
91
|
+
return buildSwapPrice(assetIn, assetOut, amountInRaw, quoteResult[0], route)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
95
|
+
// Encoding
|
|
96
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
97
|
+
|
|
98
|
+
export interface EncodeCLSwapParams {
|
|
99
|
+
assetIn: Asset
|
|
100
|
+
assetOut: Asset
|
|
101
|
+
amountInRaw: bigint
|
|
102
|
+
amountOutMin: bigint
|
|
103
|
+
tickSpacing: number
|
|
104
|
+
recipient: Address
|
|
105
|
+
deadline: number
|
|
106
|
+
chainId: SupportedChainId
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** Universal Router V3_SWAP_EXACT_IN command byte */
|
|
110
|
+
const V3_SWAP_EXACT_IN = 0x00
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Encode a V3_SWAP_EXACT_IN command for a CL/Slipstream pool on the Universal Router.
|
|
114
|
+
* Path: encodePacked([tokenIn (20), tickSpacing as int24 (3), tokenOut (20)]) — 43 bytes.
|
|
115
|
+
* @param params - CL swap encoding parameters
|
|
116
|
+
* @returns Encoded calldata as hex string
|
|
117
|
+
*/
|
|
118
|
+
export function encodeCLSwap(params: EncodeCLSwapParams): Hex {
|
|
119
|
+
const { amountInRaw, amountOutMin, tickSpacing, deadline, chainId } = params
|
|
120
|
+
const { tokenIn, tokenOut } = resolveTokens(
|
|
121
|
+
params.assetIn,
|
|
122
|
+
params.assetOut,
|
|
123
|
+
chainId,
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
const commands = `0x${V3_SWAP_EXACT_IN.toString(16).padStart(2, '0')}` as Hex
|
|
127
|
+
|
|
128
|
+
// CL path: [tokenIn (20)] [tickSpacing as int24 (3)] [tokenOut (20)] — 43 bytes
|
|
129
|
+
const path = encodePacked(
|
|
130
|
+
['address', 'int24', 'address'],
|
|
131
|
+
[tokenIn, tickSpacing, tokenOut],
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
const input = encodeAbiParameters(
|
|
135
|
+
[
|
|
136
|
+
{ type: 'address' },
|
|
137
|
+
{ type: 'uint256' },
|
|
138
|
+
{ type: 'uint256' },
|
|
139
|
+
{ type: 'bytes' },
|
|
140
|
+
{ type: 'bool' },
|
|
141
|
+
],
|
|
142
|
+
[
|
|
143
|
+
UNIVERSAL_ROUTER_MSG_SENDER, // recipient = msg.sender (Universal Router sentinel)
|
|
144
|
+
amountInRaw,
|
|
145
|
+
amountOutMin,
|
|
146
|
+
path,
|
|
147
|
+
false, // payerIsUser — tokens pre-transferred to router
|
|
148
|
+
],
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
return encodeFunctionData({
|
|
152
|
+
abi: UNIVERSAL_ROUTER_ABI,
|
|
153
|
+
functionName: 'execute',
|
|
154
|
+
args: [commands, [input], BigInt(deadline)],
|
|
155
|
+
})
|
|
156
|
+
}
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import type { Address, Hex, PublicClient } from 'viem'
|
|
2
|
+
import { encodeAbiParameters, encodeFunctionData, encodePacked } from 'viem'
|
|
3
|
+
|
|
4
|
+
import type { SupportedChainId } from '@/constants/supportedChains.js'
|
|
5
|
+
import {
|
|
6
|
+
LEAF_ROUTER_ABI,
|
|
7
|
+
POOL_ABI,
|
|
8
|
+
POOL_FACTORY_ABI,
|
|
9
|
+
UNIVERSAL_ROUTER_ABI,
|
|
10
|
+
V2_ROUTER_ABI,
|
|
11
|
+
} from '@/swap/providers/velodrome/abis.js'
|
|
12
|
+
import type { VelodromeRouterType } from '@/swap/providers/velodrome/config.js'
|
|
13
|
+
import {
|
|
14
|
+
buildSwapPrice,
|
|
15
|
+
resolveTokens,
|
|
16
|
+
UNIVERSAL_ROUTER_MSG_SENDER,
|
|
17
|
+
} from '@/swap/providers/velodrome/encoding/helpers.js'
|
|
18
|
+
import type { Asset } from '@/types/asset.js'
|
|
19
|
+
import type { SwapPrice, SwapRoute } from '@/types/swap/index.js'
|
|
20
|
+
import { isNativeAsset } from '@/utils/assets.js'
|
|
21
|
+
|
|
22
|
+
/** Universal Router V2_SWAP_EXACT_IN command byte */
|
|
23
|
+
const V2_SWAP_EXACT_IN = 0x08
|
|
24
|
+
|
|
25
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
26
|
+
// Quoting
|
|
27
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
28
|
+
|
|
29
|
+
export interface GetQuoteParams {
|
|
30
|
+
assetIn: Asset
|
|
31
|
+
assetOut: Asset
|
|
32
|
+
amountInRaw: bigint
|
|
33
|
+
chainId: SupportedChainId
|
|
34
|
+
publicClient: PublicClient
|
|
35
|
+
routerAddress: Address
|
|
36
|
+
routerType: VelodromeRouterType
|
|
37
|
+
stable: boolean
|
|
38
|
+
factoryAddress: Address
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Get a v2 AMM swap quote.
|
|
43
|
+
* @param params - Quote parameters including router type
|
|
44
|
+
* @returns Price quote with amounts and route
|
|
45
|
+
*/
|
|
46
|
+
export async function getQuote(params: GetQuoteParams): Promise<SwapPrice> {
|
|
47
|
+
const { assetIn, assetOut, amountInRaw, chainId } = params
|
|
48
|
+
const { tokenIn, tokenOut } = resolveTokens(assetIn, assetOut, chainId)
|
|
49
|
+
const amountOutRaw = await fetchAmountOut(params, tokenIn, tokenOut)
|
|
50
|
+
const route: SwapRoute = {
|
|
51
|
+
path: [assetIn, assetOut],
|
|
52
|
+
pools: [{ address: tokenIn, fee: 0, version: 'v2' }],
|
|
53
|
+
}
|
|
54
|
+
return buildSwapPrice(assetIn, assetOut, amountInRaw, amountOutRaw, route)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Fetch the output amount using the appropriate quoting mechanism for the router type.
|
|
59
|
+
* @param params - Quote parameters
|
|
60
|
+
* @param tokenIn - Resolved input token address
|
|
61
|
+
* @param tokenOut - Resolved output token address
|
|
62
|
+
* @returns Output amount as raw bigint
|
|
63
|
+
* @throws If router type is unknown
|
|
64
|
+
*/
|
|
65
|
+
async function fetchAmountOut(
|
|
66
|
+
params: GetQuoteParams,
|
|
67
|
+
tokenIn: Address,
|
|
68
|
+
tokenOut: Address,
|
|
69
|
+
): Promise<bigint> {
|
|
70
|
+
const { routerType } = params
|
|
71
|
+
|
|
72
|
+
if (routerType === 'universal') {
|
|
73
|
+
return fetchAmountOutViaPool(params, tokenIn, tokenOut)
|
|
74
|
+
}
|
|
75
|
+
if (routerType === 'v2') {
|
|
76
|
+
return fetchAmountOutViaRouter(params, V2_ROUTER_ABI, {
|
|
77
|
+
from: tokenIn,
|
|
78
|
+
to: tokenOut,
|
|
79
|
+
stable: params.stable,
|
|
80
|
+
factory: params.factoryAddress,
|
|
81
|
+
})
|
|
82
|
+
}
|
|
83
|
+
if (routerType === 'leaf') {
|
|
84
|
+
return fetchAmountOutViaRouter(params, LEAF_ROUTER_ABI, {
|
|
85
|
+
from: tokenIn,
|
|
86
|
+
to: tokenOut,
|
|
87
|
+
stable: params.stable,
|
|
88
|
+
})
|
|
89
|
+
}
|
|
90
|
+
throw new Error(`Unknown router type: ${routerType as string}`)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** Quote via Pool.getAmountOut (Universal Router path — no router-level quoting available). */
|
|
94
|
+
async function fetchAmountOutViaPool(
|
|
95
|
+
params: GetQuoteParams,
|
|
96
|
+
tokenIn: Address,
|
|
97
|
+
tokenOut: Address,
|
|
98
|
+
): Promise<bigint> {
|
|
99
|
+
const { publicClient, factoryAddress, stable, assetIn, assetOut } = params
|
|
100
|
+
|
|
101
|
+
const poolAddress = await publicClient.readContract({
|
|
102
|
+
address: factoryAddress,
|
|
103
|
+
abi: POOL_FACTORY_ABI,
|
|
104
|
+
functionName: 'getPool',
|
|
105
|
+
args: [tokenIn, tokenOut, stable],
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
if (
|
|
109
|
+
!poolAddress ||
|
|
110
|
+
poolAddress === '0x0000000000000000000000000000000000000000'
|
|
111
|
+
) {
|
|
112
|
+
throw new Error(
|
|
113
|
+
`No Velodrome pool found for ${assetIn.metadata.symbol}/${assetOut.metadata.symbol} (stable=${stable})`,
|
|
114
|
+
)
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return (await publicClient.readContract({
|
|
118
|
+
address: poolAddress as Address,
|
|
119
|
+
abi: POOL_ABI,
|
|
120
|
+
functionName: 'getAmountOut',
|
|
121
|
+
args: [params.amountInRaw, tokenIn],
|
|
122
|
+
})) as bigint
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/** Quote via Router.getAmountsOut (v2 and leaf router path). */
|
|
126
|
+
async function fetchAmountOutViaRouter(
|
|
127
|
+
params: GetQuoteParams,
|
|
128
|
+
abi: typeof V2_ROUTER_ABI | typeof LEAF_ROUTER_ABI,
|
|
129
|
+
route: { from: Address; to: Address; stable: boolean; factory?: Address },
|
|
130
|
+
): Promise<bigint> {
|
|
131
|
+
const amounts = await params.publicClient.readContract({
|
|
132
|
+
address: params.routerAddress,
|
|
133
|
+
abi,
|
|
134
|
+
functionName: 'getAmountsOut',
|
|
135
|
+
args: [params.amountInRaw, [route]],
|
|
136
|
+
})
|
|
137
|
+
return (amounts as bigint[])[1]
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
141
|
+
// Encoding
|
|
142
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
143
|
+
|
|
144
|
+
export interface EncodeSwapParams {
|
|
145
|
+
assetIn: Asset
|
|
146
|
+
assetOut: Asset
|
|
147
|
+
amountInRaw: bigint
|
|
148
|
+
amountOutMin: bigint
|
|
149
|
+
routerType: VelodromeRouterType
|
|
150
|
+
stable: boolean
|
|
151
|
+
factoryAddress: Address
|
|
152
|
+
recipient: Address
|
|
153
|
+
deadline: number
|
|
154
|
+
chainId: SupportedChainId
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Encode swap calldata for the appropriate router type.
|
|
159
|
+
* @param params - Swap encoding parameters
|
|
160
|
+
* @returns Encoded calldata as hex string
|
|
161
|
+
* @throws If router type is unknown
|
|
162
|
+
*/
|
|
163
|
+
export function encodeSwap(params: EncodeSwapParams): Hex {
|
|
164
|
+
const { routerType } = params
|
|
165
|
+
const { tokenIn, tokenOut } = resolveTokens(
|
|
166
|
+
params.assetIn,
|
|
167
|
+
params.assetOut,
|
|
168
|
+
params.chainId,
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
if (routerType === 'universal') {
|
|
172
|
+
return encodeUniversalV2Swap(tokenIn, tokenOut, params)
|
|
173
|
+
}
|
|
174
|
+
if (routerType === 'v2') {
|
|
175
|
+
return encodeRouterSwap(tokenIn, tokenOut, params, V2_ROUTER_ABI, {
|
|
176
|
+
from: tokenIn,
|
|
177
|
+
to: tokenOut,
|
|
178
|
+
stable: params.stable,
|
|
179
|
+
factory: params.factoryAddress,
|
|
180
|
+
})
|
|
181
|
+
}
|
|
182
|
+
if (routerType === 'leaf') {
|
|
183
|
+
return encodeRouterSwap(tokenIn, tokenOut, params, LEAF_ROUTER_ABI, {
|
|
184
|
+
from: tokenIn,
|
|
185
|
+
to: tokenOut,
|
|
186
|
+
stable: params.stable,
|
|
187
|
+
})
|
|
188
|
+
}
|
|
189
|
+
throw new Error(`Unknown router type: ${routerType as string}`)
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Encode a V2_SWAP_EXACT_IN command for the Universal Router.
|
|
194
|
+
* Route: encodePacked(tokenIn, stable, tokenOut) — 41 bytes per hop.
|
|
195
|
+
* payerIsUser = false: tokens are pre-transferred to the Router by the smart wallet.
|
|
196
|
+
*/
|
|
197
|
+
function encodeUniversalV2Swap(
|
|
198
|
+
tokenIn: Address,
|
|
199
|
+
tokenOut: Address,
|
|
200
|
+
params: EncodeSwapParams,
|
|
201
|
+
): Hex {
|
|
202
|
+
const commands = `0x${V2_SWAP_EXACT_IN.toString(16).padStart(2, '0')}` as Hex
|
|
203
|
+
const routes = encodePacked(
|
|
204
|
+
['address', 'bool', 'address'],
|
|
205
|
+
[tokenIn, params.stable, tokenOut],
|
|
206
|
+
)
|
|
207
|
+
const input = encodeAbiParameters(
|
|
208
|
+
[
|
|
209
|
+
{ type: 'address' },
|
|
210
|
+
{ type: 'uint256' },
|
|
211
|
+
{ type: 'uint256' },
|
|
212
|
+
{ type: 'bytes' },
|
|
213
|
+
{ type: 'bool' },
|
|
214
|
+
{ type: 'bool' },
|
|
215
|
+
],
|
|
216
|
+
[
|
|
217
|
+
UNIVERSAL_ROUTER_MSG_SENDER, // recipient = msg.sender (Universal Router sentinel)
|
|
218
|
+
params.amountInRaw,
|
|
219
|
+
params.amountOutMin,
|
|
220
|
+
routes,
|
|
221
|
+
false, // payerIsUser
|
|
222
|
+
false, // isUni — false for Velodrome/Aerodrome
|
|
223
|
+
],
|
|
224
|
+
)
|
|
225
|
+
return encodeFunctionData({
|
|
226
|
+
abi: UNIVERSAL_ROUTER_ABI,
|
|
227
|
+
functionName: 'execute',
|
|
228
|
+
args: [commands, [input], BigInt(params.deadline)],
|
|
229
|
+
})
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Encode swap calldata for v2 or leaf routers.
|
|
234
|
+
* Selects the correct swap function based on whether native ETH is involved.
|
|
235
|
+
*/
|
|
236
|
+
function encodeRouterSwap(
|
|
237
|
+
tokenIn: Address,
|
|
238
|
+
tokenOut: Address,
|
|
239
|
+
params: EncodeSwapParams,
|
|
240
|
+
abi: typeof V2_ROUTER_ABI | typeof LEAF_ROUTER_ABI,
|
|
241
|
+
route: { from: Address; to: Address; stable: boolean; factory?: Address },
|
|
242
|
+
): Hex {
|
|
243
|
+
const { assetIn, assetOut, amountInRaw, amountOutMin, recipient, deadline } =
|
|
244
|
+
params
|
|
245
|
+
|
|
246
|
+
if (isNativeAsset(assetIn)) {
|
|
247
|
+
return encodeFunctionData({
|
|
248
|
+
abi,
|
|
249
|
+
functionName: 'swapExactETHForTokens',
|
|
250
|
+
args: [amountOutMin, [route], recipient, BigInt(deadline)],
|
|
251
|
+
})
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
if (isNativeAsset(assetOut)) {
|
|
255
|
+
return encodeFunctionData({
|
|
256
|
+
abi,
|
|
257
|
+
functionName: 'swapExactTokensForETH',
|
|
258
|
+
args: [amountInRaw, amountOutMin, [route], recipient, BigInt(deadline)],
|
|
259
|
+
})
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
return encodeFunctionData({
|
|
263
|
+
abi,
|
|
264
|
+
functionName: 'swapExactTokensForTokens',
|
|
265
|
+
args: [amountInRaw, amountOutMin, [route], recipient, BigInt(deadline)],
|
|
266
|
+
})
|
|
267
|
+
}
|