@eth-optimism/actions-sdk 0.2.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 -4
- package/dist/__mocks__/MockAssets.js.map +1 -1
- package/dist/__tests__/actions.test.js +1 -5
- package/dist/__tests__/actions.test.js.map +1 -1
- package/dist/actions.d.ts +23 -9
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +68 -36
- package/dist/actions.js.map +1 -1
- package/dist/constants/assets.d.ts +217 -2
- package/dist/constants/assets.d.ts.map +1 -1
- package/dist/constants/assets.js +744 -6
- package/dist/constants/assets.js.map +1 -1
- package/dist/constants/contracts.d.ts +4 -0
- package/dist/constants/contracts.d.ts.map +1 -0
- package/dist/constants/contracts.js +3 -0
- package/dist/constants/contracts.js.map +1 -0
- 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 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- 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 -14
- package/dist/lend/core/LendProvider.d.ts.map +1 -1
- package/dist/lend/core/LendProvider.js +16 -31
- package/dist/lend/core/LendProvider.js.map +1 -1
- package/dist/lend/core/__tests__/LendProvider.test.js +2 -4
- package/dist/lend/core/__tests__/LendProvider.test.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 -41
- package/dist/lend/providers/morpho/__tests__/sdk.test.js.map +1 -1
- package/dist/lend/providers/morpho/api.d.ts +3 -3
- 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 -54
- 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 +50 -0
- package/dist/swap/__mocks__/MockSwapProvider.d.ts.map +1 -0
- package/dist/swap/__mocks__/MockSwapProvider.js +161 -0
- package/dist/swap/__mocks__/MockSwapProvider.js.map +1 -0
- package/dist/swap/core/SwapProvider.d.ts +145 -0
- package/dist/swap/core/SwapProvider.d.ts.map +1 -0
- package/dist/swap/core/SwapProvider.js +359 -0
- package/dist/swap/core/SwapProvider.js.map +1 -0
- package/dist/swap/core/__tests__/SwapProvider.test.d.ts +2 -0
- package/dist/swap/core/__tests__/SwapProvider.test.d.ts.map +1 -0
- package/dist/swap/core/__tests__/SwapProvider.test.js +435 -0
- package/dist/swap/core/__tests__/SwapProvider.test.js.map +1 -0
- 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 +9 -0
- package/dist/swap/index.d.ts.map +1 -0
- package/dist/swap/index.js +9 -0
- package/dist/swap/index.js.map +1 -0
- package/dist/swap/namespaces/ActionsSwapNamespace.d.ts +8 -0
- package/dist/swap/namespaces/ActionsSwapNamespace.d.ts.map +1 -0
- package/dist/swap/namespaces/ActionsSwapNamespace.js +8 -0
- package/dist/swap/namespaces/ActionsSwapNamespace.js.map +1 -0
- package/dist/swap/namespaces/BaseSwapNamespace.d.ts +73 -0
- package/dist/swap/namespaces/BaseSwapNamespace.d.ts.map +1 -0
- package/dist/swap/namespaces/BaseSwapNamespace.js +181 -0
- package/dist/swap/namespaces/BaseSwapNamespace.js.map +1 -0
- package/dist/swap/namespaces/WalletSwapNamespace.d.ts +34 -0
- package/dist/swap/namespaces/WalletSwapNamespace.d.ts.map +1 -0
- package/dist/swap/namespaces/WalletSwapNamespace.js +84 -0
- package/dist/swap/namespaces/WalletSwapNamespace.js.map +1 -0
- package/dist/swap/namespaces/__tests__/BaseSwapNamespace.spec.d.ts +2 -0
- package/dist/swap/namespaces/__tests__/BaseSwapNamespace.spec.d.ts.map +1 -0
- package/dist/swap/namespaces/__tests__/BaseSwapNamespace.spec.js +245 -0
- package/dist/swap/namespaces/__tests__/BaseSwapNamespace.spec.js.map +1 -0
- package/dist/swap/namespaces/__tests__/WalletSwapNamespace.spec.d.ts +2 -0
- package/dist/swap/namespaces/__tests__/WalletSwapNamespace.spec.d.ts.map +1 -0
- package/dist/swap/namespaces/__tests__/WalletSwapNamespace.spec.js +209 -0
- package/dist/swap/namespaces/__tests__/WalletSwapNamespace.spec.js.map +1 -0
- package/dist/swap/providers/uniswap/UniswapSwapProvider.d.ts +35 -0
- package/dist/swap/providers/uniswap/UniswapSwapProvider.d.ts.map +1 -0
- package/dist/swap/providers/uniswap/UniswapSwapProvider.js +148 -0
- package/dist/swap/providers/uniswap/UniswapSwapProvider.js.map +1 -0
- package/dist/swap/providers/uniswap/__tests__/UniswapSwapProvider.test.d.ts +2 -0
- package/dist/swap/providers/uniswap/__tests__/UniswapSwapProvider.test.d.ts.map +1 -0
- package/dist/swap/providers/uniswap/__tests__/UniswapSwapProvider.test.js +258 -0
- package/dist/swap/providers/uniswap/__tests__/UniswapSwapProvider.test.js.map +1 -0
- package/dist/swap/providers/uniswap/__tests__/sdk.test.d.ts +2 -0
- package/dist/swap/providers/uniswap/__tests__/sdk.test.d.ts.map +1 -0
- package/dist/swap/providers/uniswap/__tests__/sdk.test.js +312 -0
- package/dist/swap/providers/uniswap/__tests__/sdk.test.js.map +1 -0
- package/dist/swap/providers/uniswap/abis.d.ts +227 -0
- package/dist/swap/providers/uniswap/abis.d.ts.map +1 -0
- package/dist/swap/providers/uniswap/abis.js +138 -0
- package/dist/swap/providers/uniswap/abis.js.map +1 -0
- package/dist/swap/providers/uniswap/addresses.d.ts +26 -0
- package/dist/swap/providers/uniswap/addresses.d.ts.map +1 -0
- package/dist/swap/providers/uniswap/addresses.js +81 -0
- package/dist/swap/providers/uniswap/addresses.js.map +1 -0
- package/dist/swap/providers/uniswap/encoding.d.ts +77 -0
- package/dist/swap/providers/uniswap/encoding.d.ts.map +1 -0
- package/dist/swap/providers/uniswap/encoding.js +233 -0
- package/dist/swap/providers/uniswap/encoding.js.map +1 -0
- 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 +21 -0
- package/dist/swap/providers/uniswap/types.d.ts.map +1 -0
- package/dist/swap/providers/uniswap/types.js +2 -0
- package/dist/swap/providers/uniswap/types.js.map +1 -0
- 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 +60 -11
- 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/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/lend/base.d.ts +9 -19
- 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 +338 -0
- package/dist/types/swap/base.d.ts.map +1 -0
- package/dist/types/swap/base.js +4 -0
- package/dist/types/swap/base.js.map +1 -0
- package/dist/types/swap/index.d.ts +2 -0
- package/dist/types/swap/index.d.ts.map +1 -0
- package/dist/types/swap/index.js +2 -0
- package/dist/types/swap/index.js.map +1 -0
- package/dist/types/transaction.d.ts +14 -0
- package/dist/types/transaction.d.ts.map +1 -0
- package/dist/types/transaction.js +2 -0
- package/dist/types/transaction.js.map +1 -0
- package/dist/utils/approve.d.ts +82 -0
- package/dist/utils/approve.d.ts.map +1 -0
- package/dist/utils/approve.js +134 -0
- 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/approve.test.js +203 -0
- package/dist/utils/approve.test.js.map +1 -0
- package/dist/utils/assets.d.ts +10 -5
- package/dist/utils/assets.d.ts.map +1 -1
- package/dist/utils/assets.js +14 -11
- package/dist/utils/assets.js.map +1 -1
- package/dist/utils/assets.test.js +13 -1
- package/dist/utils/assets.test.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/utils/validation.d.ts +12 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +44 -0
- package/dist/utils/validation.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 -10
- package/dist/wallet/core/providers/hosted/abstract/HostedWalletProvider.d.ts.map +1 -1
- package/dist/wallet/core/providers/hosted/abstract/HostedWalletProvider.js +2 -1
- package/dist/wallet/core/providers/hosted/abstract/HostedWalletProvider.js.map +1 -1
- package/dist/wallet/core/providers/hosted/types/index.d.ts +6 -7
- package/dist/wallet/core/providers/hosted/types/index.d.ts.map +1 -1
- package/dist/wallet/core/providers/smart/default/DefaultSmartWalletProvider.d.ts +5 -6
- package/dist/wallet/core/providers/smart/default/DefaultSmartWalletProvider.d.ts.map +1 -1
- package/dist/wallet/core/providers/smart/default/DefaultSmartWalletProvider.js +5 -1
- package/dist/wallet/core/providers/smart/default/DefaultSmartWalletProvider.js.map +1 -1
- package/dist/wallet/core/providers/smart/default/__tests__/DefaultSmartWalletProvider.spec.js +2 -2
- package/dist/wallet/core/providers/smart/default/__tests__/DefaultSmartWalletProvider.spec.js.map +1 -1
- package/dist/wallet/core/wallets/abstract/Wallet.d.ts +12 -12
- package/dist/wallet/core/wallets/abstract/Wallet.d.ts.map +1 -1
- package/dist/wallet/core/wallets/abstract/Wallet.js +9 -4
- 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 +5 -7
- package/dist/wallet/core/wallets/smart/default/DefaultSmartWallet.d.ts.map +1 -1
- package/dist/wallet/core/wallets/smart/default/DefaultSmartWallet.js +6 -5
- 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 +4 -6
- package/dist/wallet/node/providers/hosted/privy/PrivyHostedWalletProvider.d.ts.map +1 -1
- package/dist/wallet/node/providers/hosted/privy/PrivyHostedWalletProvider.js +3 -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 +8 -9
- 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 +3 -6
- package/dist/wallet/node/providers/hosted/turnkey/TurnkeyHostedWalletProvider.d.ts.map +1 -1
- package/dist/wallet/node/providers/hosted/turnkey/TurnkeyHostedWalletProvider.js +4 -2
- package/dist/wallet/node/providers/hosted/turnkey/TurnkeyHostedWalletProvider.js.map +1 -1
- package/dist/wallet/node/wallets/hosted/privy/PrivyWallet.d.ts +4 -6
- package/dist/wallet/node/wallets/hosted/privy/PrivyWallet.d.ts.map +1 -1
- package/dist/wallet/node/wallets/hosted/privy/PrivyWallet.js +4 -3
- package/dist/wallet/node/wallets/hosted/privy/PrivyWallet.js.map +1 -1
- package/dist/wallet/node/wallets/hosted/turnkey/TurnkeyWallet.d.ts +3 -6
- package/dist/wallet/node/wallets/hosted/turnkey/TurnkeyWallet.d.ts.map +1 -1
- package/dist/wallet/node/wallets/hosted/turnkey/TurnkeyWallet.js +2 -2
- package/dist/wallet/node/wallets/hosted/turnkey/TurnkeyWallet.js.map +1 -1
- package/dist/wallet/react/providers/hosted/dynamic/DynamicHostedWalletProvider.d.ts +6 -6
- package/dist/wallet/react/providers/hosted/dynamic/DynamicHostedWalletProvider.d.ts.map +1 -1
- package/dist/wallet/react/providers/hosted/dynamic/DynamicHostedWalletProvider.js +7 -2
- package/dist/wallet/react/providers/hosted/dynamic/DynamicHostedWalletProvider.js.map +1 -1
- package/dist/wallet/react/providers/hosted/dynamic/__tests__/DynamicHostedWalletProvider.spec.js +1 -0
- package/dist/wallet/react/providers/hosted/dynamic/__tests__/DynamicHostedWalletProvider.spec.js.map +1 -1
- package/dist/wallet/react/providers/hosted/privy/PrivyHostedWalletProvider.d.ts +5 -6
- package/dist/wallet/react/providers/hosted/privy/PrivyHostedWalletProvider.d.ts.map +1 -1
- package/dist/wallet/react/providers/hosted/privy/PrivyHostedWalletProvider.js +6 -2
- package/dist/wallet/react/providers/hosted/privy/PrivyHostedWalletProvider.js.map +1 -1
- package/dist/wallet/react/providers/hosted/privy/__tests__/PrivyHostedWalletProvider.spec.js +1 -0
- package/dist/wallet/react/providers/hosted/privy/__tests__/PrivyHostedWalletProvider.spec.js.map +1 -1
- package/dist/wallet/react/providers/hosted/turnkey/TurnkeyHostedWalletProvider.d.ts +5 -8
- package/dist/wallet/react/providers/hosted/turnkey/TurnkeyHostedWalletProvider.d.ts.map +1 -1
- package/dist/wallet/react/providers/hosted/turnkey/TurnkeyHostedWalletProvider.js +6 -4
- 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 +7 -6
- package/dist/wallet/react/wallets/hosted/dynamic/DynamicWallet.d.ts.map +1 -1
- package/dist/wallet/react/wallets/hosted/dynamic/DynamicWallet.js +5 -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 -6
- 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 -6
- 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 +4 -3
- package/src/__mocks__/MockAssets.ts +54 -4
- package/src/__tests__/actions.test.ts +1 -5
- package/src/actions.ts +106 -71
- package/src/constants/assets.ts +792 -5
- package/src/constants/contracts.ts +5 -0
- package/src/constants/providers.ts +5 -0
- package/src/constants/supportedChains.ts +22 -2
- package/src/index.ts +76 -6
- package/src/lend/__mocks__/MockLendProvider.ts +8 -3
- package/src/lend/core/LendProvider.ts +28 -41
- package/src/lend/core/__tests__/LendProvider.test.ts +2 -5
- 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 -42
- package/src/lend/providers/morpho/api.ts +7 -4
- package/src/lend/providers/morpho/contracts.ts +62 -13
- package/src/lend/providers/morpho/sdk.ts +85 -54
- 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 +251 -0
- package/src/swap/core/SwapProvider.ts +577 -0
- package/src/swap/core/__tests__/SwapProvider.test.ts +620 -0
- package/src/swap/core/markets.ts +104 -0
- package/src/swap/index.ts +19 -0
- package/src/swap/namespaces/ActionsSwapNamespace.ts +7 -0
- package/src/swap/namespaces/BaseSwapNamespace.ts +258 -0
- package/src/swap/namespaces/WalletSwapNamespace.ts +121 -0
- package/src/swap/namespaces/__tests__/BaseSwapNamespace.spec.ts +365 -0
- package/src/swap/namespaces/__tests__/WalletSwapNamespace.spec.ts +257 -0
- package/src/swap/providers/uniswap/UniswapSwapProvider.ts +217 -0
- package/src/swap/providers/uniswap/__tests__/UniswapSwapProvider.test.ts +299 -0
- package/src/swap/providers/uniswap/__tests__/sdk.test.ts +369 -0
- package/src/swap/providers/uniswap/abis.ts +144 -0
- package/src/swap/providers/uniswap/addresses.ts +110 -0
- package/src/swap/providers/uniswap/encoding.ts +406 -0
- package/src/swap/providers/uniswap/markets.ts +84 -0
- package/src/swap/providers/uniswap/types.ts +25 -0
- 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 +68 -12
- package/src/types/asset.ts +12 -9
- package/src/types/chain.ts +2 -2
- package/src/types/index.ts +2 -0
- package/src/types/lend/base.ts +10 -20
- package/src/types/lend/contracts.ts +5 -1
- package/src/types/providers.ts +22 -0
- package/src/types/swap/base.ts +372 -0
- package/src/types/swap/index.ts +1 -0
- package/src/types/transaction.ts +14 -0
- package/src/utils/approve.test.ts +258 -0
- package/src/utils/approve.ts +197 -0
- package/src/utils/assets.test.ts +16 -1
- package/src/utils/assets.ts +27 -10
- package/src/utils/validateAddresses.test.ts +439 -0
- package/src/utils/validateAddresses.ts +153 -0
- package/src/utils/validation.ts +76 -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 +6 -10
- package/src/wallet/core/providers/hosted/types/index.ts +9 -7
- package/src/wallet/core/providers/smart/default/DefaultSmartWalletProvider.ts +10 -10
- package/src/wallet/core/providers/smart/default/__tests__/DefaultSmartWalletProvider.spec.ts +2 -0
- package/src/wallet/core/wallets/abstract/Wallet.ts +23 -14
- 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 +11 -14
- package/src/wallet/core/wallets/smart/default/__tests__/DefaultSmartWallet.spec.ts +0 -1
- package/src/wallet/node/providers/hosted/privy/PrivyHostedWalletProvider.ts +11 -7
- package/src/wallet/node/providers/hosted/registry/NodeHostedWalletProviderRegistry.ts +16 -8
- package/src/wallet/node/providers/hosted/registry/__tests__/NodeHostedWalletProviderRegistry.spec.ts +4 -4
- package/src/wallet/node/providers/hosted/turnkey/TurnkeyHostedWalletProvider.ts +6 -7
- package/src/wallet/node/wallets/hosted/privy/PrivyWallet.ts +8 -11
- package/src/wallet/node/wallets/hosted/turnkey/TurnkeyWallet.ts +7 -11
- package/src/wallet/react/providers/hosted/dynamic/DynamicHostedWalletProvider.ts +11 -7
- package/src/wallet/react/providers/hosted/dynamic/__tests__/DynamicHostedWalletProvider.spec.ts +1 -0
- package/src/wallet/react/providers/hosted/privy/PrivyHostedWalletProvider.ts +10 -7
- package/src/wallet/react/providers/hosted/privy/__tests__/PrivyHostedWalletProvider.spec.ts +1 -0
- package/src/wallet/react/providers/hosted/turnkey/TurnkeyHostedWalletProvider.ts +10 -9
- package/src/wallet/react/providers/registry/ReactHostedWalletProviderRegistry.ts +38 -13
- package/src/wallet/react/providers/registry/__tests__/ReactHostedWalletProviderRegistry.spec.ts +6 -6
- package/src/wallet/react/wallets/hosted/dynamic/DynamicWallet.ts +13 -11
- package/src/wallet/react/wallets/hosted/dynamic/__mocks__/DynamicWalletMock.ts +2 -6
- package/src/wallet/react/wallets/hosted/privy/PrivyWallet.ts +11 -11
- package/src/wallet/react/wallets/hosted/turnkey/TurnkeyWallet.ts +11 -11
- package/dist/supported/tokens.d.ts +0 -25
- package/dist/supported/tokens.d.ts.map +0 -1
- package/dist/supported/tokens.js +0 -37
- package/dist/supported/tokens.js.map +0 -1
- package/src/supported/tokens.ts +0 -52
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
import type { Address, Hex } from 'viem'
|
|
2
|
+
|
|
3
|
+
import type { SupportedChainId } from '@/constants/supportedChains.js'
|
|
4
|
+
import type { SwapProviderName } from '@/types/actions.js'
|
|
5
|
+
import type { Asset } from '@/types/asset.js'
|
|
6
|
+
import type { TransactionData } from '@/types/transaction.js'
|
|
7
|
+
import type {
|
|
8
|
+
BatchTransactionReturnType,
|
|
9
|
+
TransactionReturnType,
|
|
10
|
+
} from '@/wallet/core/wallets/abstract/types/index.js'
|
|
11
|
+
|
|
12
|
+
export { SwapProvider } from '@/swap/core/SwapProvider.js'
|
|
13
|
+
export { ActionsSwapNamespace } from '@/swap/namespaces/ActionsSwapNamespace.js'
|
|
14
|
+
export { WalletSwapNamespace } from '@/swap/namespaces/WalletSwapNamespace.js'
|
|
15
|
+
export type { SwapProviders } from '@/types/providers.js'
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Per-provider swap configuration.
|
|
19
|
+
* Provider-level values override the shared SwapGlobalConfig defaults.
|
|
20
|
+
*/
|
|
21
|
+
export interface SwapProviderConfig {
|
|
22
|
+
/** Slippage tolerance override for this provider (e.g., 0.005 for 0.5%) */
|
|
23
|
+
defaultSlippage?: number
|
|
24
|
+
/** Maximum allowed slippage override for this provider (e.g., 0.5 for 50%) */
|
|
25
|
+
maxSlippage?: number
|
|
26
|
+
/** Quote expiration override for this provider, in seconds from now */
|
|
27
|
+
quoteExpirationSeconds?: number
|
|
28
|
+
/** Allowlist of swap markets (optional - defaults to all supported assets) */
|
|
29
|
+
marketAllowlist?: SwapMarketConfig[]
|
|
30
|
+
/** Blocklist of swap markets to exclude */
|
|
31
|
+
marketBlocklist?: SwapMarketConfig[]
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Swap market filter
|
|
36
|
+
* @description Define allowed/blocked trading markets by assets.
|
|
37
|
+
* 2 assets = one explicit pair. 3+ = all pairs between them.
|
|
38
|
+
*/
|
|
39
|
+
export interface SwapMarketConfig {
|
|
40
|
+
/** 2 assets = one explicit pair. 3+ = all pairs between them. */
|
|
41
|
+
assets: [Asset, Asset, ...Asset[]]
|
|
42
|
+
/** Restrict to a specific chain. Omit = all configured chains. */
|
|
43
|
+
chainId?: SupportedChainId
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Swap market identifier
|
|
48
|
+
* @description Unique identifier for a swap market (mirrors LendMarketId pattern)
|
|
49
|
+
*/
|
|
50
|
+
export type SwapMarketId = {
|
|
51
|
+
/** Pool identifier (keccak256 hash of PoolKey) */
|
|
52
|
+
poolId: string
|
|
53
|
+
/** Chain ID where this market exists */
|
|
54
|
+
chainId: SupportedChainId
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Parameters for getting a specific swap market
|
|
59
|
+
*/
|
|
60
|
+
export type GetSwapMarketParams = SwapMarketId
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Parameters for getting swap markets
|
|
64
|
+
*/
|
|
65
|
+
export interface GetSwapMarketsParams {
|
|
66
|
+
/** Filter by chain ID */
|
|
67
|
+
chainId?: SupportedChainId
|
|
68
|
+
/** Filter by asset (returns markets containing this asset) */
|
|
69
|
+
asset?: Asset
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Parameters for a wallet swap — what the developer passes.
|
|
74
|
+
* Exactly one of amountIn or amountOut must be provided.
|
|
75
|
+
*/
|
|
76
|
+
export interface WalletSwapParams {
|
|
77
|
+
/** Amount of input token (human-readable). For exact-in swaps. Mutually exclusive with amountOut. */
|
|
78
|
+
amountIn?: number
|
|
79
|
+
/** Amount of output token (human-readable). For exact-out swaps. Mutually exclusive with amountIn. */
|
|
80
|
+
amountOut?: number
|
|
81
|
+
/** Token to sell */
|
|
82
|
+
assetIn: Asset
|
|
83
|
+
/** Token to buy */
|
|
84
|
+
assetOut: Asset
|
|
85
|
+
/** Chain to execute swap on */
|
|
86
|
+
chainId: SupportedChainId
|
|
87
|
+
/** Slippage tolerance override (e.g., 0.01 for 1%). Overrides provider and config defaults. */
|
|
88
|
+
slippage?: number
|
|
89
|
+
/** Transaction deadline as Unix timestamp. Defaults to now + 1 minute. */
|
|
90
|
+
deadline?: number
|
|
91
|
+
/** Recipient address. Defaults to wallet address. */
|
|
92
|
+
recipient?: Address
|
|
93
|
+
/** Explicitly select a swap provider. Overrides routing config. */
|
|
94
|
+
provider?: SwapProviderName
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Full swap execute parameters including wallet address.
|
|
99
|
+
* walletAddress is auto-injected by the wallet namespace.
|
|
100
|
+
*/
|
|
101
|
+
export interface SwapExecuteParams extends WalletSwapParams {
|
|
102
|
+
walletAddress: Address
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Fully resolved swap parameters with defaults applied and amounts as raw bigint.
|
|
107
|
+
* Passed to provider _execute() implementations.
|
|
108
|
+
*/
|
|
109
|
+
export interface ResolvedSwapParams {
|
|
110
|
+
amountInRaw?: bigint
|
|
111
|
+
amountOutRaw?: bigint
|
|
112
|
+
assetIn: Asset
|
|
113
|
+
assetOut: Asset
|
|
114
|
+
slippage: number
|
|
115
|
+
deadline: number
|
|
116
|
+
recipient: Address
|
|
117
|
+
walletAddress: Address
|
|
118
|
+
chainId: SupportedChainId
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Parameters for getting a swap price quote
|
|
123
|
+
* @description Specify either amountIn (for exact-in) or amountOut (for exact-out),
|
|
124
|
+
* not both. Amounts should be human-readable numbers (e.g., 100 for 100 USDC).
|
|
125
|
+
*/
|
|
126
|
+
export interface SwapPriceParams {
|
|
127
|
+
/** Token to get price for (required) */
|
|
128
|
+
assetIn: Asset
|
|
129
|
+
/** Token to price against. Defaults to USDC if not provided. */
|
|
130
|
+
assetOut?: Asset
|
|
131
|
+
/** Amount of input token (human-readable). Defaults to 1 unit. For exact-in quotes. */
|
|
132
|
+
amountIn?: number
|
|
133
|
+
/** Amount of output token (human-readable). For exact-out quotes. */
|
|
134
|
+
amountOut?: number
|
|
135
|
+
/** Chain to get price on */
|
|
136
|
+
chainId: SupportedChainId
|
|
137
|
+
/** Explicitly select a swap provider. Overrides routing config. */
|
|
138
|
+
provider?: SwapProviderName
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Parameters for getting a swap quote with pre-built execution data.
|
|
143
|
+
*/
|
|
144
|
+
export interface SwapQuoteParams {
|
|
145
|
+
/** Token to sell */
|
|
146
|
+
assetIn: Asset
|
|
147
|
+
/** Token to buy (required) */
|
|
148
|
+
assetOut: Asset
|
|
149
|
+
/** Amount of input token (human-readable). Mutually exclusive with amountOut. */
|
|
150
|
+
amountIn?: number
|
|
151
|
+
/** Amount of output token (human-readable). Mutually exclusive with amountIn. */
|
|
152
|
+
amountOut?: number
|
|
153
|
+
/** Chain to execute swap on */
|
|
154
|
+
chainId: SupportedChainId
|
|
155
|
+
/** Slippage tolerance baked into the quote */
|
|
156
|
+
slippage?: number
|
|
157
|
+
/** Transaction deadline as Unix timestamp */
|
|
158
|
+
deadline?: number
|
|
159
|
+
/** Recipient address */
|
|
160
|
+
recipient?: Address
|
|
161
|
+
/** Explicitly select a swap provider */
|
|
162
|
+
provider?: SwapProviderName
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Pre-built execution data from a quote, ready to submit on-chain.
|
|
167
|
+
*/
|
|
168
|
+
export interface SwapQuoteExecution {
|
|
169
|
+
/** Encoded swap calldata */
|
|
170
|
+
swapCalldata: Hex
|
|
171
|
+
/** Router/contract to send the swap transaction to */
|
|
172
|
+
routerAddress: Address
|
|
173
|
+
/** Native ETH value for ETH-in swaps, else 0n */
|
|
174
|
+
value: bigint
|
|
175
|
+
/** Opaque provider-specific context (e.g. stable flag, factory address) */
|
|
176
|
+
providerContext?: Record<string, unknown>
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* A complete swap quote: pricing, amounts, and pre-built execution data.
|
|
181
|
+
* Pass to execute() to skip re-quoting.
|
|
182
|
+
*
|
|
183
|
+
* **Precision note:** `Raw` fields (bigint) are the on-chain source of truth.
|
|
184
|
+
* Number fields (`amountIn`, `amountOut`, `price`, etc.) are display approximations
|
|
185
|
+
* derived via `formatUnits` → `parseFloat`. For tokens with many significant digits,
|
|
186
|
+
* numbers may lose precision. Use `Raw` fields for any math that matters.
|
|
187
|
+
*/
|
|
188
|
+
export interface SwapQuote {
|
|
189
|
+
// ── What you're swapping ──
|
|
190
|
+
/** Token being sold */
|
|
191
|
+
assetIn: Asset
|
|
192
|
+
/** Token being bought */
|
|
193
|
+
assetOut: Asset
|
|
194
|
+
/** Chain to execute on */
|
|
195
|
+
chainId: SupportedChainId
|
|
196
|
+
|
|
197
|
+
// ── Amounts (Raw = on-chain precision, number = display approximation) ──
|
|
198
|
+
/** Human-readable input amount (display only — use amountInRaw for precision) */
|
|
199
|
+
amountIn: number
|
|
200
|
+
/** Input amount as raw bigint (native decimals). Source of truth. */
|
|
201
|
+
amountInRaw: bigint
|
|
202
|
+
/** Human-readable expected output (display only — use amountOutRaw for precision) */
|
|
203
|
+
amountOut: number
|
|
204
|
+
/** Expected output as raw bigint. Source of truth. */
|
|
205
|
+
amountOutRaw: bigint
|
|
206
|
+
/** Human-readable minimum output after slippage (display only) */
|
|
207
|
+
amountOutMin: number
|
|
208
|
+
/** Minimum output as raw bigint after slippage. Source of truth for on-chain execution. */
|
|
209
|
+
amountOutMinRaw: bigint
|
|
210
|
+
|
|
211
|
+
// ── Price (display approximations derived from number amounts) ──
|
|
212
|
+
/** Exchange rate: amountOut / amountIn. Display approximation. */
|
|
213
|
+
price: number
|
|
214
|
+
/** Inverse exchange rate: amountIn / amountOut. Display approximation. */
|
|
215
|
+
priceInverse: number
|
|
216
|
+
/** Price impact as decimal (0.03 = 3%) */
|
|
217
|
+
priceImpact: number
|
|
218
|
+
|
|
219
|
+
// ── Route ──
|
|
220
|
+
/** Route taken for the swap */
|
|
221
|
+
route: SwapRoute
|
|
222
|
+
|
|
223
|
+
// ── Execution ──
|
|
224
|
+
/** Pre-built transaction data. Pass quote to execute() to use. */
|
|
225
|
+
execution: SwapQuoteExecution
|
|
226
|
+
|
|
227
|
+
// ── Metadata ──
|
|
228
|
+
/** Provider that generated this quote */
|
|
229
|
+
provider: SwapProviderName
|
|
230
|
+
/** Slippage tolerance applied to this quote */
|
|
231
|
+
slippage: number
|
|
232
|
+
/** Transaction deadline (Unix seconds) */
|
|
233
|
+
deadline: number
|
|
234
|
+
/** When the quote was generated (Unix seconds) */
|
|
235
|
+
quotedAt: number
|
|
236
|
+
/** When the quote expires (Unix seconds) */
|
|
237
|
+
expiresAt: number
|
|
238
|
+
/** Estimated gas cost as raw bigint (native decimals) */
|
|
239
|
+
gasEstimate?: bigint
|
|
240
|
+
/**
|
|
241
|
+
* Wallet address that will execute this quote.
|
|
242
|
+
* Set by WalletSwapNamespace before execution — not available on price-only quotes.
|
|
243
|
+
* Used to check existing on-chain allowances and skip redundant approvals.
|
|
244
|
+
*/
|
|
245
|
+
recipient?: Address
|
|
246
|
+
/**
|
|
247
|
+
* The recipient address baked into execution.swapCalldata at quote time.
|
|
248
|
+
* If recipient differs from quotedRecipient at execute time, calldata is re-encoded
|
|
249
|
+
* with the correct recipient to prevent tokens from being sent to the wrong address.
|
|
250
|
+
*/
|
|
251
|
+
quotedRecipient: Address
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Market information for a swap hop
|
|
256
|
+
*/
|
|
257
|
+
export interface SwapMarketInfo {
|
|
258
|
+
/** Market address or identifier */
|
|
259
|
+
address: Address
|
|
260
|
+
/** Fee tier in pips */
|
|
261
|
+
fee: number
|
|
262
|
+
/** Protocol version used (v2, v3, v4) */
|
|
263
|
+
version: 'v2' | 'v3' | 'v4'
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Swap route information
|
|
268
|
+
*/
|
|
269
|
+
export interface SwapRoute {
|
|
270
|
+
/** Ordered list of assets in the route path */
|
|
271
|
+
path: Asset[]
|
|
272
|
+
/** Market information for each hop */
|
|
273
|
+
pools: SwapMarketInfo[]
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Swap price quote response
|
|
278
|
+
*/
|
|
279
|
+
export interface SwapPrice {
|
|
280
|
+
/** Exchange rate as human-readable string (e.g., "3245.50") */
|
|
281
|
+
price: string
|
|
282
|
+
/** Inverse exchange rate */
|
|
283
|
+
priceInverse: string
|
|
284
|
+
/** Human-readable input amount */
|
|
285
|
+
amountIn: number
|
|
286
|
+
/** Human-readable output amount */
|
|
287
|
+
amountOut: number
|
|
288
|
+
/** Input amount as raw bigint (native decimals) */
|
|
289
|
+
amountInRaw: bigint
|
|
290
|
+
/** Expected output amount as raw bigint (native decimals) */
|
|
291
|
+
amountOutRaw: bigint
|
|
292
|
+
/** Price impact as decimal (0.03 = 3%). Derived from pool mid-price vs execution price. */
|
|
293
|
+
priceImpact: number
|
|
294
|
+
/** Route taken for the swap */
|
|
295
|
+
route: SwapRoute
|
|
296
|
+
/** Estimated gas cost as raw bigint (native decimals) */
|
|
297
|
+
gasEstimate?: bigint
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Transaction data for swap execution
|
|
302
|
+
*/
|
|
303
|
+
export interface SwapTransactionData {
|
|
304
|
+
/** Permit2 approval transaction (if needed) */
|
|
305
|
+
permit2Approval?: TransactionData
|
|
306
|
+
/** Token approval to Permit2 (if needed) */
|
|
307
|
+
tokenApproval?: TransactionData
|
|
308
|
+
/** Main swap transaction */
|
|
309
|
+
swap: TransactionData
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* Swap transaction result
|
|
314
|
+
*/
|
|
315
|
+
export interface SwapTransaction {
|
|
316
|
+
/** Human-readable input amount */
|
|
317
|
+
amountIn: number
|
|
318
|
+
/** Human-readable output amount */
|
|
319
|
+
amountOut: number
|
|
320
|
+
/** Input amount as raw bigint (native decimals) */
|
|
321
|
+
amountInRaw: bigint
|
|
322
|
+
/** Output amount as raw bigint (native decimals) (expected) */
|
|
323
|
+
amountOutRaw: bigint
|
|
324
|
+
/** Input asset */
|
|
325
|
+
assetIn: Asset
|
|
326
|
+
/** Output asset */
|
|
327
|
+
assetOut: Asset
|
|
328
|
+
/** Exchange rate: amountOut / amountIn */
|
|
329
|
+
price: number
|
|
330
|
+
/** Price impact as decimal (0.03 = 3%) */
|
|
331
|
+
priceImpact: number
|
|
332
|
+
/** Transaction data for execution */
|
|
333
|
+
transactionData: SwapTransactionData
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/**
|
|
337
|
+
* Swap execution receipt
|
|
338
|
+
*/
|
|
339
|
+
export interface SwapReceipt {
|
|
340
|
+
/** Transaction receipt(s) */
|
|
341
|
+
receipt: TransactionReturnType | BatchTransactionReturnType
|
|
342
|
+
/** Human-readable input amount */
|
|
343
|
+
amountIn: number
|
|
344
|
+
/** Human-readable output amount */
|
|
345
|
+
amountOut: number
|
|
346
|
+
/** Actual input amount as raw bigint (native decimals) */
|
|
347
|
+
amountInRaw: bigint
|
|
348
|
+
/** Actual output amount as raw bigint (native decimals) */
|
|
349
|
+
amountOutRaw: bigint
|
|
350
|
+
/** Input asset */
|
|
351
|
+
assetIn: Asset
|
|
352
|
+
/** Output asset */
|
|
353
|
+
assetOut: Asset
|
|
354
|
+
/** Exchange rate: amountOut / amountIn */
|
|
355
|
+
price: number
|
|
356
|
+
/** Price impact as decimal (0.03 = 3%) */
|
|
357
|
+
priceImpact: number
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
* Swap market information
|
|
362
|
+
*/
|
|
363
|
+
export interface SwapMarket {
|
|
364
|
+
/** Market identifier (contains poolId and chainId) */
|
|
365
|
+
marketId: SwapMarketId
|
|
366
|
+
/** Token pair in the market */
|
|
367
|
+
assets: [Asset, Asset]
|
|
368
|
+
/** Fee tier in pips (500 = 0.05%) */
|
|
369
|
+
fee: number
|
|
370
|
+
/** Provider name */
|
|
371
|
+
provider: SwapProviderName
|
|
372
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '@/types/swap/base.js'
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Address, Hex } from 'viem'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Transaction data for execution
|
|
5
|
+
* @description Raw transaction data for wallet execution
|
|
6
|
+
*/
|
|
7
|
+
export interface TransactionData {
|
|
8
|
+
/** Target contract address */
|
|
9
|
+
to: Address
|
|
10
|
+
/** Encoded function call data */
|
|
11
|
+
data: Hex
|
|
12
|
+
/** ETH value to send */
|
|
13
|
+
value: bigint
|
|
14
|
+
}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import type { Address, PublicClient } from 'viem'
|
|
2
|
+
import { decodeFunctionData } from 'viem'
|
|
3
|
+
import { describe, expect, it, vi } from 'vitest'
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
buildApprovalTxIfNeeded,
|
|
7
|
+
buildErc20ApprovalTx,
|
|
8
|
+
buildPermit2ApprovalTx,
|
|
9
|
+
buildTokenApprovalTx,
|
|
10
|
+
checkPermit2Allowance,
|
|
11
|
+
checkTokenAllowance,
|
|
12
|
+
DEFAULT_PERMIT2_EXPIRY_SECONDS,
|
|
13
|
+
getApprovalDeficit,
|
|
14
|
+
} from '@/utils/approve.js'
|
|
15
|
+
|
|
16
|
+
const PERMIT2_ABI = [
|
|
17
|
+
{
|
|
18
|
+
name: 'approve',
|
|
19
|
+
type: 'function',
|
|
20
|
+
stateMutability: 'nonpayable',
|
|
21
|
+
inputs: [
|
|
22
|
+
{ name: 'token', type: 'address' },
|
|
23
|
+
{ name: 'spender', type: 'address' },
|
|
24
|
+
{ name: 'amount', type: 'uint160' },
|
|
25
|
+
{ name: 'expiration', type: 'uint48' },
|
|
26
|
+
],
|
|
27
|
+
outputs: [],
|
|
28
|
+
},
|
|
29
|
+
] as const
|
|
30
|
+
|
|
31
|
+
const TOKEN = '0x1111111111111111111111111111111111111111' as Address
|
|
32
|
+
const OWNER = '0x2222222222222222222222222222222222222222' as Address
|
|
33
|
+
const SPENDER = '0x3333333333333333333333333333333333333333' as Address
|
|
34
|
+
const PERMIT2 = '0x000000000022D473030F116dDEE9F6B43aC78BA3' as Address
|
|
35
|
+
|
|
36
|
+
describe('checkPermit2Allowance', () => {
|
|
37
|
+
it('returns parsed allowance data', async () => {
|
|
38
|
+
const publicClient = {
|
|
39
|
+
readContract: vi.fn().mockResolvedValue([
|
|
40
|
+
1000000n, // amount (uint160)
|
|
41
|
+
1700000000, // expiration (uint48)
|
|
42
|
+
5, // nonce (uint48)
|
|
43
|
+
]),
|
|
44
|
+
} as unknown as PublicClient
|
|
45
|
+
|
|
46
|
+
const result = await checkPermit2Allowance({
|
|
47
|
+
publicClient,
|
|
48
|
+
permit2Address: PERMIT2,
|
|
49
|
+
owner: OWNER,
|
|
50
|
+
token: TOKEN,
|
|
51
|
+
spender: SPENDER,
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
expect(result.amount).toBe(1000000n)
|
|
55
|
+
expect(result.expiration).toBe(1700000000)
|
|
56
|
+
expect(result.nonce).toBe(5)
|
|
57
|
+
expect(publicClient.readContract).toHaveBeenCalledWith(
|
|
58
|
+
expect.objectContaining({
|
|
59
|
+
address: PERMIT2,
|
|
60
|
+
functionName: 'allowance',
|
|
61
|
+
args: [OWNER, TOKEN, SPENDER],
|
|
62
|
+
}),
|
|
63
|
+
)
|
|
64
|
+
})
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
describe('checkTokenAllowance', () => {
|
|
68
|
+
it('returns token allowance as bigint', async () => {
|
|
69
|
+
const publicClient = {
|
|
70
|
+
readContract: vi.fn().mockResolvedValue(500000n),
|
|
71
|
+
} as unknown as PublicClient
|
|
72
|
+
|
|
73
|
+
const result = await checkTokenAllowance({
|
|
74
|
+
publicClient,
|
|
75
|
+
token: TOKEN,
|
|
76
|
+
owner: OWNER,
|
|
77
|
+
spender: SPENDER,
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
expect(result).toBe(500000n)
|
|
81
|
+
expect(publicClient.readContract).toHaveBeenCalledWith(
|
|
82
|
+
expect.objectContaining({
|
|
83
|
+
address: TOKEN,
|
|
84
|
+
functionName: 'allowance',
|
|
85
|
+
args: [OWNER, SPENDER],
|
|
86
|
+
}),
|
|
87
|
+
)
|
|
88
|
+
})
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
describe('buildTokenApprovalTx', () => {
|
|
92
|
+
it('builds max approval to Permit2', () => {
|
|
93
|
+
const tx = buildTokenApprovalTx(TOKEN, PERMIT2)
|
|
94
|
+
|
|
95
|
+
expect(tx.to).toBe(TOKEN)
|
|
96
|
+
expect(tx.value).toBe(0n)
|
|
97
|
+
expect(tx.data).toMatch(/^0x/)
|
|
98
|
+
// Should encode approve(permit2, maxUint256)
|
|
99
|
+
expect(tx.data.length).toBeGreaterThan(10)
|
|
100
|
+
})
|
|
101
|
+
})
|
|
102
|
+
|
|
103
|
+
describe('buildPermit2ApprovalTx', () => {
|
|
104
|
+
it('approves exact amount with default expiry', () => {
|
|
105
|
+
const before = Math.floor(Date.now() / 1000)
|
|
106
|
+
const amount = 100000000n
|
|
107
|
+
|
|
108
|
+
const tx = buildPermit2ApprovalTx({
|
|
109
|
+
permit2Address: PERMIT2,
|
|
110
|
+
token: TOKEN,
|
|
111
|
+
spender: SPENDER,
|
|
112
|
+
amount,
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
expect(tx.to).toBe(PERMIT2)
|
|
116
|
+
expect(tx.value).toBe(0n)
|
|
117
|
+
|
|
118
|
+
const decoded = decodeFunctionData({ abi: PERMIT2_ABI, data: tx.data })
|
|
119
|
+
const [, , decodedAmount, expiration] = decoded.args
|
|
120
|
+
expect(decodedAmount).toBe(amount)
|
|
121
|
+
expect(Number(expiration)).toBeGreaterThanOrEqual(
|
|
122
|
+
before + DEFAULT_PERMIT2_EXPIRY_SECONDS,
|
|
123
|
+
)
|
|
124
|
+
})
|
|
125
|
+
|
|
126
|
+
it('uses custom expiry when provided', () => {
|
|
127
|
+
const before = Math.floor(Date.now() / 1000)
|
|
128
|
+
const customExpiry = 7 * 24 * 60 * 60 // 7 days
|
|
129
|
+
|
|
130
|
+
const tx = buildPermit2ApprovalTx({
|
|
131
|
+
permit2Address: PERMIT2,
|
|
132
|
+
token: TOKEN,
|
|
133
|
+
spender: SPENDER,
|
|
134
|
+
amount: 100000000n,
|
|
135
|
+
expirySeconds: customExpiry,
|
|
136
|
+
})
|
|
137
|
+
|
|
138
|
+
const decoded = decodeFunctionData({ abi: PERMIT2_ABI, data: tx.data })
|
|
139
|
+
const [, , , expiration] = decoded.args
|
|
140
|
+
expect(Number(expiration)).toBeGreaterThanOrEqual(before + customExpiry)
|
|
141
|
+
expect(Number(expiration)).toBeLessThan(
|
|
142
|
+
before + DEFAULT_PERMIT2_EXPIRY_SECONDS,
|
|
143
|
+
)
|
|
144
|
+
})
|
|
145
|
+
})
|
|
146
|
+
|
|
147
|
+
describe('buildErc20ApprovalTx', () => {
|
|
148
|
+
it('builds approval for exact amount', () => {
|
|
149
|
+
const tx = buildErc20ApprovalTx(TOKEN, SPENDER, 500000n)
|
|
150
|
+
|
|
151
|
+
expect(tx.to).toBe(TOKEN)
|
|
152
|
+
expect(tx.value).toBe(0n)
|
|
153
|
+
expect(tx.data).toMatch(/^0x/)
|
|
154
|
+
})
|
|
155
|
+
})
|
|
156
|
+
|
|
157
|
+
describe('getApprovalDeficit', () => {
|
|
158
|
+
it('returns 0n when allowance is sufficient', async () => {
|
|
159
|
+
const publicClient = {
|
|
160
|
+
readContract: vi.fn().mockResolvedValue(1000000n),
|
|
161
|
+
} as unknown as PublicClient
|
|
162
|
+
|
|
163
|
+
const deficit = await getApprovalDeficit({
|
|
164
|
+
publicClient,
|
|
165
|
+
token: TOKEN,
|
|
166
|
+
owner: OWNER,
|
|
167
|
+
spender: SPENDER,
|
|
168
|
+
amount: 500000n,
|
|
169
|
+
})
|
|
170
|
+
|
|
171
|
+
expect(deficit).toBe(0n)
|
|
172
|
+
})
|
|
173
|
+
|
|
174
|
+
it('returns deficit when allowance is insufficient', async () => {
|
|
175
|
+
const publicClient = {
|
|
176
|
+
readContract: vi.fn().mockResolvedValue(300000n),
|
|
177
|
+
} as unknown as PublicClient
|
|
178
|
+
|
|
179
|
+
const deficit = await getApprovalDeficit({
|
|
180
|
+
publicClient,
|
|
181
|
+
token: TOKEN,
|
|
182
|
+
owner: OWNER,
|
|
183
|
+
spender: SPENDER,
|
|
184
|
+
amount: 500000n,
|
|
185
|
+
})
|
|
186
|
+
|
|
187
|
+
expect(deficit).toBe(200000n)
|
|
188
|
+
})
|
|
189
|
+
|
|
190
|
+
it('returns full amount when allowance is zero', async () => {
|
|
191
|
+
const publicClient = {
|
|
192
|
+
readContract: vi.fn().mockResolvedValue(0n),
|
|
193
|
+
} as unknown as PublicClient
|
|
194
|
+
|
|
195
|
+
const deficit = await getApprovalDeficit({
|
|
196
|
+
publicClient,
|
|
197
|
+
token: TOKEN,
|
|
198
|
+
owner: OWNER,
|
|
199
|
+
spender: SPENDER,
|
|
200
|
+
amount: 500000n,
|
|
201
|
+
})
|
|
202
|
+
|
|
203
|
+
expect(deficit).toBe(500000n)
|
|
204
|
+
})
|
|
205
|
+
})
|
|
206
|
+
|
|
207
|
+
describe('buildApprovalTxIfNeeded', () => {
|
|
208
|
+
it('returns undefined when allowance is sufficient', async () => {
|
|
209
|
+
const publicClient = {
|
|
210
|
+
readContract: vi.fn().mockResolvedValue(1000000n),
|
|
211
|
+
} as unknown as PublicClient
|
|
212
|
+
|
|
213
|
+
const tx = await buildApprovalTxIfNeeded({
|
|
214
|
+
publicClient,
|
|
215
|
+
token: TOKEN,
|
|
216
|
+
owner: OWNER,
|
|
217
|
+
spender: SPENDER,
|
|
218
|
+
amount: 500000n,
|
|
219
|
+
})
|
|
220
|
+
|
|
221
|
+
expect(tx).toBeUndefined()
|
|
222
|
+
})
|
|
223
|
+
|
|
224
|
+
it('returns approval tx for the deficit only', async () => {
|
|
225
|
+
const publicClient = {
|
|
226
|
+
readContract: vi.fn().mockResolvedValue(300000n),
|
|
227
|
+
} as unknown as PublicClient
|
|
228
|
+
|
|
229
|
+
const tx = await buildApprovalTxIfNeeded({
|
|
230
|
+
publicClient,
|
|
231
|
+
token: TOKEN,
|
|
232
|
+
owner: OWNER,
|
|
233
|
+
spender: SPENDER,
|
|
234
|
+
amount: 500000n,
|
|
235
|
+
})
|
|
236
|
+
|
|
237
|
+
expect(tx).toBeDefined()
|
|
238
|
+
expect(tx!.to).toBe(TOKEN)
|
|
239
|
+
expect(tx!.value).toBe(0n)
|
|
240
|
+
})
|
|
241
|
+
|
|
242
|
+
it('returns approval for full amount when allowance is zero', async () => {
|
|
243
|
+
const publicClient = {
|
|
244
|
+
readContract: vi.fn().mockResolvedValue(0n),
|
|
245
|
+
} as unknown as PublicClient
|
|
246
|
+
|
|
247
|
+
const tx = await buildApprovalTxIfNeeded({
|
|
248
|
+
publicClient,
|
|
249
|
+
token: TOKEN,
|
|
250
|
+
owner: OWNER,
|
|
251
|
+
spender: SPENDER,
|
|
252
|
+
amount: 500000n,
|
|
253
|
+
})
|
|
254
|
+
|
|
255
|
+
expect(tx).toBeDefined()
|
|
256
|
+
expect(tx!.to).toBe(TOKEN)
|
|
257
|
+
})
|
|
258
|
+
})
|