@andrewkimjoseph/celina-sdk 0.9.8 → 0.10.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/build/a2a/skills.js +5 -0
- package/build/a2a/skills.js.map +1 -1
- package/build/index.d.ts +35 -1
- package/build/index.js +6 -0
- package/build/index.js.map +1 -1
- package/build/services/agentkarma.service.d.ts +89 -0
- package/build/services/agentkarma.service.js +102 -0
- package/build/services/agentkarma.service.js.map +1 -0
- package/build/src/a2a/agent-card.d.ts +37 -0
- package/build/src/a2a/agent-card.js +46 -0
- package/build/src/a2a/agent-card.js.map +1 -0
- package/build/src/a2a/index.d.ts +2 -0
- package/build/src/a2a/index.js +3 -0
- package/build/src/a2a/index.js.map +1 -0
- package/build/src/a2a/skills.d.ts +18 -0
- package/build/src/a2a/skills.js +106 -0
- package/build/src/a2a/skills.js.map +1 -0
- package/build/src/abis/aave-pool.d.ts +37 -0
- package/build/src/abis/aave-pool.js +26 -0
- package/build/src/abis/aave-pool.js.map +1 -0
- package/build/src/abis/accounts.d.ts +13 -0
- package/build/src/abis/accounts.js +10 -0
- package/build/src/abis/accounts.js.map +1 -0
- package/build/src/abis/election.d.ts +124 -0
- package/build/src/abis/election.js +88 -0
- package/build/src/abis/election.js.map +1 -0
- package/build/src/abis/gooddollar-broker.d.ts +77 -0
- package/build/src/abis/gooddollar-broker.js +44 -0
- package/build/src/abis/gooddollar-broker.js.map +1 -0
- package/build/src/abis/gooddollar-identity.d.ts +85 -0
- package/build/src/abis/gooddollar-identity.js +52 -0
- package/build/src/abis/gooddollar-identity.js.map +1 -0
- package/build/src/abis/governance.d.ts +86 -0
- package/build/src/abis/governance.js +68 -0
- package/build/src/abis/governance.js.map +1 -0
- package/build/src/abis/locked-gold.d.ts +10 -0
- package/build/src/abis/locked-gold.js +10 -0
- package/build/src/abis/locked-gold.js.map +1 -0
- package/build/src/abis/nft.d.ts +107 -0
- package/build/src/abis/nft.js +75 -0
- package/build/src/abis/nft.js.map +1 -0
- package/build/src/abis/permit2.d.ts +43 -0
- package/build/src/abis/permit2.js +30 -0
- package/build/src/abis/permit2.js.map +1 -0
- package/build/src/abis/self-registry.d.ts +194 -0
- package/build/src/abis/self-registry.js +120 -0
- package/build/src/abis/self-registry.js.map +1 -0
- package/build/src/abis/ubi-scheme.d.ts +91 -0
- package/build/src/abis/ubi-scheme.js +66 -0
- package/build/src/abis/ubi-scheme.js.map +1 -0
- package/build/src/abis/uniswap-state-view.d.ts +34 -0
- package/build/src/abis/uniswap-state-view.js +22 -0
- package/build/src/abis/uniswap-state-view.js.map +1 -0
- package/build/src/abis/uniswap-v4-quoter.d.ts +86 -0
- package/build/src/abis/uniswap-v4-quoter.js +64 -0
- package/build/src/abis/uniswap-v4-quoter.js.map +1 -0
- package/build/src/abis/universal-router.d.ts +16 -0
- package/build/src/abis/universal-router.js +14 -0
- package/build/src/abis/universal-router.js.map +1 -0
- package/build/src/abis/validators-minimal.d.ts +65 -0
- package/build/src/abis/validators-minimal.js +39 -0
- package/build/src/abis/validators-minimal.js.map +1 -0
- package/build/src/analytics/amplitude.d.ts +11 -0
- package/build/src/analytics/amplitude.js +76 -0
- package/build/src/analytics/amplitude.js.map +1 -0
- package/build/src/analytics/config.d.ts +7 -0
- package/build/src/analytics/config.js +28 -0
- package/build/src/analytics/config.js.map +1 -0
- package/build/src/analytics/consumer-package.d.ts +9 -0
- package/build/src/analytics/consumer-package.js +143 -0
- package/build/src/analytics/consumer-package.js.map +1 -0
- package/build/src/analytics/mcp-tool-events.d.ts +5 -0
- package/build/src/analytics/mcp-tool-events.js +53 -0
- package/build/src/analytics/mcp-tool-events.js.map +1 -0
- package/build/src/analytics/wallet-context.d.ts +11 -0
- package/build/src/analytics/wallet-context.js +81 -0
- package/build/src/analytics/wallet-context.js.map +1 -0
- package/build/src/analytics/wallet-extract.d.ts +9 -0
- package/build/src/analytics/wallet-extract.js +21 -0
- package/build/src/analytics/wallet-extract.js.map +1 -0
- package/build/src/analytics/wrap-service.d.ts +5 -0
- package/build/src/analytics/wrap-service.js +38 -0
- package/build/src/analytics/wrap-service.js.map +1 -0
- package/build/src/clients/celo-client.d.ts +17 -0
- package/build/src/clients/celo-client.js +28 -0
- package/build/src/clients/celo-client.js.map +1 -0
- package/build/src/clients/ens-client.d.ts +17 -0
- package/build/src/clients/ens-client.js +30 -0
- package/build/src/clients/ens-client.js.map +1 -0
- package/build/src/clients/mento-sdk.d.ts +2 -0
- package/build/src/clients/mento-sdk.js +9 -0
- package/build/src/clients/mento-sdk.js.map +1 -0
- package/build/src/clients/self-api.d.ts +82 -0
- package/build/src/clients/self-api.js +242 -0
- package/build/src/clients/self-api.js.map +1 -0
- package/build/src/clients/uniswap-sdk.d.ts +4 -0
- package/build/src/clients/uniswap-sdk.js +13 -0
- package/build/src/clients/uniswap-sdk.js.map +1 -0
- package/build/src/config/aave.d.ts +17 -0
- package/build/src/config/aave.js +77 -0
- package/build/src/config/aave.js.map +1 -0
- package/build/src/config/celina-tag.d.ts +4 -0
- package/build/src/config/celina-tag.js +13 -0
- package/build/src/config/celina-tag.js.map +1 -0
- package/build/src/config/celo-core-contracts.d.ts +8 -0
- package/build/src/config/celo-core-contracts.js +9 -0
- package/build/src/config/celo-core-contracts.js.map +1 -0
- package/build/src/config/chains.d.ts +937 -0
- package/build/src/config/chains.js +319 -0
- package/build/src/config/chains.js.map +1 -0
- package/build/src/config/gooddollar.d.ts +16 -0
- package/build/src/config/gooddollar.js +24 -0
- package/build/src/config/gooddollar.js.map +1 -0
- package/build/src/config/sdk-config.d.ts +33 -0
- package/build/src/config/sdk-config.js +31 -0
- package/build/src/config/sdk-config.js.map +1 -0
- package/build/src/config/self.d.ts +22 -0
- package/build/src/config/self.js +27 -0
- package/build/src/config/self.js.map +1 -0
- package/build/src/config/uniswap.d.ts +42 -0
- package/build/src/config/uniswap.js +76 -0
- package/build/src/config/uniswap.js.map +1 -0
- package/build/src/index.d.ts +124 -0
- package/build/src/index.js +71 -0
- package/build/src/index.js.map +1 -0
- package/build/src/oasf/index.d.ts +2 -0
- package/build/src/oasf/index.js +3 -0
- package/build/src/oasf/index.js.map +1 -0
- package/build/src/oasf/record.d.ts +39 -0
- package/build/src/oasf/record.js +35 -0
- package/build/src/oasf/record.js.map +1 -0
- package/build/src/oasf/taxonomy.d.ts +19 -0
- package/build/src/oasf/taxonomy.js +46 -0
- package/build/src/oasf/taxonomy.js.map +1 -0
- package/build/src/services/aave.service.d.ts +58 -0
- package/build/src/services/aave.service.js +210 -0
- package/build/src/services/aave.service.js.map +1 -0
- package/build/src/services/account.service.d.ts +22 -0
- package/build/src/services/account.service.js +29 -0
- package/build/src/services/account.service.js.map +1 -0
- package/build/src/services/agentkarma.service.d.ts +89 -0
- package/build/src/services/agentkarma.service.js +102 -0
- package/build/src/services/agentkarma.service.js.map +1 -0
- package/build/src/services/blockchain.service.d.ts +107 -0
- package/build/src/services/blockchain.service.js +151 -0
- package/build/src/services/blockchain.service.js.map +1 -0
- package/build/src/services/contract.service.d.ts +78 -0
- package/build/src/services/contract.service.js +117 -0
- package/build/src/services/contract.service.js.map +1 -0
- package/build/src/services/ens.service.d.ts +44 -0
- package/build/src/services/ens.service.js +92 -0
- package/build/src/services/ens.service.js.map +1 -0
- package/build/src/services/gooddollar.service.d.ts +183 -0
- package/build/src/services/gooddollar.service.js +675 -0
- package/build/src/services/gooddollar.service.js.map +1 -0
- package/build/src/services/governance.service.d.ts +96 -0
- package/build/src/services/governance.service.js +255 -0
- package/build/src/services/governance.service.js.map +1 -0
- package/build/src/services/mento-fx.service.d.ts +80 -0
- package/build/src/services/mento-fx.service.js +319 -0
- package/build/src/services/mento-fx.service.js.map +1 -0
- package/build/src/services/nft.service.d.ts +58 -0
- package/build/src/services/nft.service.js +222 -0
- package/build/src/services/nft.service.js.map +1 -0
- package/build/src/services/self-session-store.d.ts +19 -0
- package/build/src/services/self-session-store.js +28 -0
- package/build/src/services/self-session-store.js.map +1 -0
- package/build/src/services/self.service.d.ts +241 -0
- package/build/src/services/self.service.js +699 -0
- package/build/src/services/self.service.js.map +1 -0
- package/build/src/services/staking.service.d.ts +140 -0
- package/build/src/services/staking.service.js +444 -0
- package/build/src/services/staking.service.js.map +1 -0
- package/build/src/services/token.service.d.ts +110 -0
- package/build/src/services/token.service.js +189 -0
- package/build/src/services/token.service.js.map +1 -0
- package/build/src/services/transaction.service.d.ts +68 -0
- package/build/src/services/transaction.service.js +198 -0
- package/build/src/services/transaction.service.js.map +1 -0
- package/build/src/services/uniswap-path-router.d.ts +40 -0
- package/build/src/services/uniswap-path-router.js +168 -0
- package/build/src/services/uniswap-path-router.js.map +1 -0
- package/build/src/services/uniswap-pool-discovery.d.ts +55 -0
- package/build/src/services/uniswap-pool-discovery.js +198 -0
- package/build/src/services/uniswap-pool-discovery.js.map +1 -0
- package/build/src/services/uniswap.service.d.ts +82 -0
- package/build/src/services/uniswap.service.js +352 -0
- package/build/src/services/uniswap.service.js.map +1 -0
- package/build/src/simulation/index.d.ts +5 -0
- package/build/src/simulation/index.js +2 -0
- package/build/src/simulation/index.js.map +1 -0
- package/build/src/simulation/simulate-prepared-step.d.ts +17 -0
- package/build/src/simulation/simulate-prepared-step.js +42 -0
- package/build/src/simulation/simulate-prepared-step.js.map +1 -0
- package/build/src/tools/catalog.d.ts +11 -0
- package/build/src/tools/catalog.js +43 -0
- package/build/src/tools/catalog.js.map +1 -0
- package/build/src/tools/domains/aave.d.ts +2 -0
- package/build/src/tools/domains/aave.js +115 -0
- package/build/src/tools/domains/aave.js.map +1 -0
- package/build/src/tools/domains/agentkarma.d.ts +2 -0
- package/build/src/tools/domains/agentkarma.js +92 -0
- package/build/src/tools/domains/agentkarma.js.map +1 -0
- package/build/src/tools/domains/blockchain.d.ts +2 -0
- package/build/src/tools/domains/blockchain.js +86 -0
- package/build/src/tools/domains/blockchain.js.map +1 -0
- package/build/src/tools/domains/browser.d.ts +2 -0
- package/build/src/tools/domains/browser.js +45 -0
- package/build/src/tools/domains/browser.js.map +1 -0
- package/build/src/tools/domains/contract.d.ts +2 -0
- package/build/src/tools/domains/contract.js +67 -0
- package/build/src/tools/domains/contract.js.map +1 -0
- package/build/src/tools/domains/ens.d.ts +2 -0
- package/build/src/tools/domains/ens.js +16 -0
- package/build/src/tools/domains/ens.js.map +1 -0
- package/build/src/tools/domains/gooddollar.d.ts +2 -0
- package/build/src/tools/domains/gooddollar.js +171 -0
- package/build/src/tools/domains/gooddollar.js.map +1 -0
- package/build/src/tools/domains/governance.d.ts +2 -0
- package/build/src/tools/domains/governance.js +41 -0
- package/build/src/tools/domains/governance.js.map +1 -0
- package/build/src/tools/domains/index.d.ts +1 -0
- package/build/src/tools/domains/index.js +33 -0
- package/build/src/tools/domains/index.js.map +1 -0
- package/build/src/tools/domains/mento-fx.d.ts +2 -0
- package/build/src/tools/domains/mento-fx.js +67 -0
- package/build/src/tools/domains/mento-fx.js.map +1 -0
- package/build/src/tools/domains/nft.d.ts +2 -0
- package/build/src/tools/domains/nft.js +38 -0
- package/build/src/tools/domains/nft.js.map +1 -0
- package/build/src/tools/domains/self.d.ts +2 -0
- package/build/src/tools/domains/self.js +187 -0
- package/build/src/tools/domains/self.js.map +1 -0
- package/build/src/tools/domains/staking.d.ts +2 -0
- package/build/src/tools/domains/staking.js +74 -0
- package/build/src/tools/domains/staking.js.map +1 -0
- package/build/src/tools/domains/token.d.ts +2 -0
- package/build/src/tools/domains/token.js +74 -0
- package/build/src/tools/domains/token.js.map +1 -0
- package/build/src/tools/domains/transaction.d.ts +2 -0
- package/build/src/tools/domains/transaction.js +120 -0
- package/build/src/tools/domains/transaction.js.map +1 -0
- package/build/src/tools/domains/uniswap.d.ts +2 -0
- package/build/src/tools/domains/uniswap.js +67 -0
- package/build/src/tools/domains/uniswap.js.map +1 -0
- package/build/src/tools/filter.d.ts +2 -0
- package/build/src/tools/filter.js +50 -0
- package/build/src/tools/filter.js.map +1 -0
- package/build/src/tools/index.d.ts +7 -0
- package/build/src/tools/index.js +7 -0
- package/build/src/tools/index.js.map +1 -0
- package/build/src/tools/schemas/common.d.ts +165 -0
- package/build/src/tools/schemas/common.js +207 -0
- package/build/src/tools/schemas/common.js.map +1 -0
- package/build/src/tools/schemas/wallet-params.d.ts +9 -0
- package/build/src/tools/schemas/wallet-params.js +52 -0
- package/build/src/tools/schemas/wallet-params.js.map +1 -0
- package/build/src/tools/swap-routing.d.ts +25 -0
- package/build/src/tools/swap-routing.js +174 -0
- package/build/src/tools/swap-routing.js.map +1 -0
- package/build/src/tools/types.d.ts +124 -0
- package/build/src/tools/types.js +2 -0
- package/build/src/tools/types.js.map +1 -0
- package/build/src/tools/utils/normalize-token.d.ts +2 -0
- package/build/src/tools/utils/normalize-token.js +12 -0
- package/build/src/tools/utils/normalize-token.js.map +1 -0
- package/build/src/tools/utils/wallet.d.ts +4 -0
- package/build/src/tools/utils/wallet.js +8 -0
- package/build/src/tools/utils/wallet.js.map +1 -0
- package/build/src/tools/website-sync.d.ts +28 -0
- package/build/src/tools/website-sync.js +168 -0
- package/build/src/tools/website-sync.js.map +1 -0
- package/build/src/types/prepared.d.ts +28 -0
- package/build/src/types/prepared.js +12 -0
- package/build/src/types/prepared.js.map +1 -0
- package/build/src/utils/celo-format.d.ts +6 -0
- package/build/src/utils/celo-format.js +17 -0
- package/build/src/utils/celo-format.js.map +1 -0
- package/build/src/utils/erc20-allowance-storage.d.ts +20 -0
- package/build/src/utils/erc20-allowance-storage.js +64 -0
- package/build/src/utils/erc20-allowance-storage.js.map +1 -0
- package/build/src/utils/format-date.d.ts +2 -0
- package/build/src/utils/format-date.js +13 -0
- package/build/src/utils/format-date.js.map +1 -0
- package/build/src/utils/format-duration.d.ts +2 -0
- package/build/src/utils/format-duration.js +17 -0
- package/build/src/utils/format-duration.js.map +1 -0
- package/build/src/utils/format-unix-datetime.d.ts +4 -0
- package/build/src/utils/format-unix-datetime.js +18 -0
- package/build/src/utils/format-unix-datetime.js.map +1 -0
- package/build/src/utils/gooddollar-ubi-period.d.ts +23 -0
- package/build/src/utils/gooddollar-ubi-period.js +23 -0
- package/build/src/utils/gooddollar-ubi-period.js.map +1 -0
- package/build/src/utils/normalize-address.d.ts +7 -0
- package/build/src/utils/normalize-address.js +16 -0
- package/build/src/utils/normalize-address.js.map +1 -0
- package/build/src/utils/self-format.d.ts +28 -0
- package/build/src/utils/self-format.js +79 -0
- package/build/src/utils/self-format.js.map +1 -0
- package/build/src/utils/self-signing.d.ts +4 -0
- package/build/src/utils/self-signing.js +38 -0
- package/build/src/utils/self-signing.js.map +1 -0
- package/build/src/utils/transaction-errors.d.ts +3 -0
- package/build/src/utils/transaction-errors.js +17 -0
- package/build/src/utils/transaction-errors.js.map +1 -0
- package/build/tests/catalog/domains/blockchain.d.ts +2 -0
- package/build/tests/catalog/domains/blockchain.js +127 -0
- package/build/tests/catalog/domains/blockchain.js.map +1 -0
- package/build/tests/catalog/domains/chain-ext.d.ts +5 -0
- package/build/tests/catalog/domains/chain-ext.js +207 -0
- package/build/tests/catalog/domains/chain-ext.js.map +1 -0
- package/build/tests/catalog/domains/defi.d.ts +6 -0
- package/build/tests/catalog/domains/defi.js +581 -0
- package/build/tests/catalog/domains/defi.js.map +1 -0
- package/build/tests/catalog/domains/self.d.ts +2 -0
- package/build/tests/catalog/domains/self.js +208 -0
- package/build/tests/catalog/domains/self.js.map +1 -0
- package/build/tests/catalog/domains/token.d.ts +2 -0
- package/build/tests/catalog/domains/token.js +70 -0
- package/build/tests/catalog/domains/token.js.map +1 -0
- package/build/tests/catalog/domains/transaction.d.ts +2 -0
- package/build/tests/catalog/domains/transaction.js +96 -0
- package/build/tests/catalog/domains/transaction.js.map +1 -0
- package/build/tests/catalog/index.d.ts +2 -0
- package/build/tests/catalog/index.js +2 -0
- package/build/tests/catalog/index.js.map +1 -0
- package/build/tests/catalog/operations.d.ts +12 -0
- package/build/tests/catalog/operations.js +29 -0
- package/build/tests/catalog/operations.js.map +1 -0
- package/build/tests/catalog/types.d.ts +24 -0
- package/build/tests/catalog/types.js +2 -0
- package/build/tests/catalog/types.js.map +1 -0
- package/build/tests/fixtures/mainnet.d.ts +54 -0
- package/build/tests/fixtures/mainnet.js +53 -0
- package/build/tests/fixtures/mainnet.js.map +1 -0
- package/build/tests/helpers/assert.d.ts +4 -0
- package/build/tests/helpers/assert.js +24 -0
- package/build/tests/helpers/assert.js.map +1 -0
- package/build/tests/helpers/env.d.ts +11 -0
- package/build/tests/helpers/env.js +28 -0
- package/build/tests/helpers/env.js.map +1 -0
- package/build/tests/helpers/gating.d.ts +3 -0
- package/build/tests/helpers/gating.js +23 -0
- package/build/tests/helpers/gating.js.map +1 -0
- package/build/tests/testing-entry.d.ts +6 -0
- package/build/tests/testing-entry.js +6 -0
- package/build/tests/testing-entry.js.map +1 -0
- package/build/tools/domains/agentkarma.d.ts +2 -0
- package/build/tools/domains/agentkarma.js +92 -0
- package/build/tools/domains/agentkarma.js.map +1 -0
- package/build/tools/domains/index.js +2 -0
- package/build/tools/domains/index.js.map +1 -1
- package/build/tools/website-sync.d.ts +1 -1
- package/build/tools/website-sync.js +3 -0
- package/build/tools/website-sync.js.map +1 -1
- package/package.json +9 -12
- package/tests/README.md +0 -78
- package/tests/catalog/domains/blockchain.ts +0 -133
- package/tests/catalog/domains/chain-ext.ts +0 -219
- package/tests/catalog/domains/defi.ts +0 -647
- package/tests/catalog/domains/self.ts +0 -220
- package/tests/catalog/domains/token.ts +0 -74
- package/tests/catalog/domains/transaction.ts +0 -111
- package/tests/catalog/index.ts +0 -7
- package/tests/catalog/operations.ts +0 -53
- package/tests/catalog/types.ts +0 -27
- package/tests/fixtures/mainnet.ts +0 -93
- package/tests/helpers/assert.ts +0 -30
- package/tests/helpers/env.ts +0 -38
- package/tests/helpers/gating.ts +0 -36
- package/tests/testing-entry.ts +0 -27
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { v4QuoterAbi } from "../abis/uniswap-v4-quoter.js";
|
|
2
|
+
import { normalizeUniswapPoolKey, UNISWAP_V4, } from "../config/uniswap.js";
|
|
3
|
+
import { getUniswapPoolIndex, poolsBetween, } from "./uniswap-pool-discovery.js";
|
|
4
|
+
/** Maximum pools in a route (2 intermediate currencies → 3 pools). */
|
|
5
|
+
const MAX_POOLS = 3;
|
|
6
|
+
function otherToken(poolKey, currency) {
|
|
7
|
+
const c = currency.toLowerCase();
|
|
8
|
+
if (poolKey.currency0.toLowerCase() === c)
|
|
9
|
+
return poolKey.currency1;
|
|
10
|
+
if (poolKey.currency1.toLowerCase() === c)
|
|
11
|
+
return poolKey.currency0;
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
function buildPathKeys(pools, currencyIn) {
|
|
15
|
+
let current = currencyIn;
|
|
16
|
+
const pathKeys = [];
|
|
17
|
+
for (const poolKey of pools) {
|
|
18
|
+
const out = otherToken(poolKey, current);
|
|
19
|
+
if (!out) {
|
|
20
|
+
throw new Error("Invalid swap path for Uniswap v4 pools.");
|
|
21
|
+
}
|
|
22
|
+
pathKeys.push({
|
|
23
|
+
intermediateCurrency: out,
|
|
24
|
+
fee: poolKey.fee,
|
|
25
|
+
tickSpacing: poolKey.tickSpacing,
|
|
26
|
+
hooks: poolKey.hooks,
|
|
27
|
+
hookData: "0x",
|
|
28
|
+
});
|
|
29
|
+
current = out;
|
|
30
|
+
}
|
|
31
|
+
return pathKeys;
|
|
32
|
+
}
|
|
33
|
+
function enumeratePaths(index, currencyIn, currencyOut) {
|
|
34
|
+
const start = currencyIn.toLowerCase();
|
|
35
|
+
const goal = currencyOut.toLowerCase();
|
|
36
|
+
if (start === goal) {
|
|
37
|
+
return [];
|
|
38
|
+
}
|
|
39
|
+
const results = [];
|
|
40
|
+
const queue = [{ currency: start, pools: [], visited: new Set([start]) }];
|
|
41
|
+
while (queue.length > 0) {
|
|
42
|
+
const node = queue.shift();
|
|
43
|
+
if (node.pools.length >= MAX_POOLS) {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
const neighbors = index.adjacency.get(node.currency);
|
|
47
|
+
if (!neighbors) {
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
for (const neighbor of neighbors) {
|
|
51
|
+
if (node.visited.has(neighbor)) {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
// A pair can have several pools (different fee tiers); branch over each so
|
|
55
|
+
// the quoter can pick the genuinely best-priced one.
|
|
56
|
+
for (const poolKey of poolsBetween(index, node.currency, neighbor)) {
|
|
57
|
+
const nextPools = [...node.pools, poolKey];
|
|
58
|
+
if (neighbor === goal) {
|
|
59
|
+
results.push(nextPools);
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
if (nextPools.length < MAX_POOLS) {
|
|
63
|
+
queue.push({
|
|
64
|
+
currency: neighbor,
|
|
65
|
+
pools: nextPools,
|
|
66
|
+
visited: new Set([...node.visited, neighbor]),
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return results;
|
|
73
|
+
}
|
|
74
|
+
async function quotePath(client, currencyIn, pools, amountIn) {
|
|
75
|
+
if (pools.length === 0) {
|
|
76
|
+
return 0n;
|
|
77
|
+
}
|
|
78
|
+
if (pools.length === 1) {
|
|
79
|
+
const poolKey = normalizeUniswapPoolKey(pools[0]);
|
|
80
|
+
const zeroForOne = currencyIn.toLowerCase() === poolKey.currency0.toLowerCase();
|
|
81
|
+
const { result } = await client.simulateContract({
|
|
82
|
+
address: UNISWAP_V4.v4Quoter,
|
|
83
|
+
abi: v4QuoterAbi,
|
|
84
|
+
functionName: "quoteExactInputSingle",
|
|
85
|
+
args: [
|
|
86
|
+
{
|
|
87
|
+
poolKey,
|
|
88
|
+
zeroForOne,
|
|
89
|
+
exactAmount: amountIn,
|
|
90
|
+
hookData: "0x",
|
|
91
|
+
},
|
|
92
|
+
],
|
|
93
|
+
});
|
|
94
|
+
return result[0];
|
|
95
|
+
}
|
|
96
|
+
const pathKeys = buildPathKeys(pools, currencyIn);
|
|
97
|
+
const { result } = await client.simulateContract({
|
|
98
|
+
address: UNISWAP_V4.v4Quoter,
|
|
99
|
+
abi: v4QuoterAbi,
|
|
100
|
+
functionName: "quoteExactInput",
|
|
101
|
+
args: [
|
|
102
|
+
{
|
|
103
|
+
exactCurrency: currencyIn,
|
|
104
|
+
path: pathKeys,
|
|
105
|
+
exactAmount: amountIn,
|
|
106
|
+
},
|
|
107
|
+
],
|
|
108
|
+
});
|
|
109
|
+
return result[0];
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Quote all candidate paths and return the highest-output Uniswap v4 route.
|
|
113
|
+
* @param client - Celo public client for quoter simulation
|
|
114
|
+
* @param currencyIn - Input currency address (native CELO maps to WCELO upstream)
|
|
115
|
+
* @param currencyOut - Output currency address
|
|
116
|
+
* @param amountIn - Input amount in base units
|
|
117
|
+
* @returns Best route and quoter output, or `null` when no path quotes successfully
|
|
118
|
+
*/
|
|
119
|
+
export async function findBestUniswapRoute(client, currencyIn, currencyOut, amountIn) {
|
|
120
|
+
const index = await getUniswapPoolIndex(client);
|
|
121
|
+
const candidatePaths = enumeratePaths(index, currencyIn, currencyOut);
|
|
122
|
+
// Quote every candidate path concurrently; failed quotes (e.g. uninitialized
|
|
123
|
+
// pools or insufficient liquidity) are dropped rather than aborting the rest.
|
|
124
|
+
const quotes = await Promise.allSettled(candidatePaths.map(async (pools) => ({
|
|
125
|
+
pools,
|
|
126
|
+
amountOut: await quotePath(client, currencyIn, pools, amountIn),
|
|
127
|
+
})));
|
|
128
|
+
let best = null;
|
|
129
|
+
for (const quote of quotes) {
|
|
130
|
+
if (quote.status !== "fulfilled") {
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
const { pools, amountOut } = quote.value;
|
|
134
|
+
if (amountOut <= 0n) {
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
if (!best || amountOut > best.amountOut) {
|
|
138
|
+
best = {
|
|
139
|
+
amountOut,
|
|
140
|
+
route: {
|
|
141
|
+
currencyIn,
|
|
142
|
+
currencyOut,
|
|
143
|
+
pools,
|
|
144
|
+
pathKeys: buildPathKeys(pools, currencyIn),
|
|
145
|
+
hops: pools.length,
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
if (!best) {
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
route: best.route,
|
|
155
|
+
amountOut: best.amountOut,
|
|
156
|
+
indexSource: index.source,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Apply slippage tolerance to a quoted output amount.
|
|
161
|
+
* @param amountOut - Quoted output in base units
|
|
162
|
+
* @param slippagePercent - Max slippage in percent (e.g. `0.5` for 0.5%)
|
|
163
|
+
*/
|
|
164
|
+
export function applySlippage(amountOut, slippagePercent) {
|
|
165
|
+
const bps = BigInt(Math.round(slippagePercent * 100));
|
|
166
|
+
return (amountOut * (10000n - bps)) / 10000n;
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=uniswap-path-router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uniswap-path-router.js","sourceRoot":"","sources":["../../../src/services/uniswap-path-router.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Uniswap v4 pool discovery: subgraph index with on-chain hub fallback.
|
|
3
|
+
*/
|
|
4
|
+
import { type PublicClient } from "viem";
|
|
5
|
+
import { type UniswapPoolKey } from "../config/uniswap.js";
|
|
6
|
+
/** One edge in the v4 pool routing graph. */
|
|
7
|
+
export type UniswapPoolEdge = {
|
|
8
|
+
poolKey: UniswapPoolKey;
|
|
9
|
+
tokenA: `0x${string}`;
|
|
10
|
+
tokenB: `0x${string}`;
|
|
11
|
+
};
|
|
12
|
+
/** Cached routing graph of v4 pools on Celo mainnet. */
|
|
13
|
+
export type UniswapPoolIndex = {
|
|
14
|
+
edges: UniswapPoolEdge[];
|
|
15
|
+
/** Currency address (lowercase) → neighbor currencies in the graph. */
|
|
16
|
+
adjacency: Map<string, Set<string>>;
|
|
17
|
+
/**
|
|
18
|
+
* Sorted pair key (`tokenLo|tokenHi`, lowercase) → every pool connecting that
|
|
19
|
+
* pair. A single token pair can have several pools across fee tiers, so the
|
|
20
|
+
* router must consider all of them to find the best rate.
|
|
21
|
+
*/
|
|
22
|
+
poolsByPair: Map<string, UniswapPoolKey[]>;
|
|
23
|
+
/** Whether pools came from the v4 subgraph or on-chain hub probing. */
|
|
24
|
+
source: "subgraph" | "onchain";
|
|
25
|
+
fetchedAt: number;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Compute the Uniswap v4 pool id (keccak256 of sorted pool key fields).
|
|
29
|
+
* @param poolKey - Pool key (normalized so currency0 sorts before currency1)
|
|
30
|
+
*/
|
|
31
|
+
export declare function computeUniswapPoolId(poolKey: UniswapPoolKey): `0x${string}`;
|
|
32
|
+
/**
|
|
33
|
+
* Load or refresh the v4 pool index (subgraph first, on-chain hub fallback).
|
|
34
|
+
* @param client - Celo public client for StateView probing
|
|
35
|
+
* @param options.forceRefresh - Bypass TTL cache when true
|
|
36
|
+
*/
|
|
37
|
+
export declare function getUniswapPoolIndex(client: PublicClient, options?: {
|
|
38
|
+
forceRefresh?: boolean;
|
|
39
|
+
}): Promise<UniswapPoolIndex>;
|
|
40
|
+
/**
|
|
41
|
+
* All pools connecting two tokens in a cached index (one per fee tier / hooks).
|
|
42
|
+
* @param index - Pool graph from `getUniswapPoolIndex`
|
|
43
|
+
* @param tokenA - First currency address
|
|
44
|
+
* @param tokenB - Second currency address
|
|
45
|
+
*/
|
|
46
|
+
export declare function poolsBetween(index: UniswapPoolIndex, tokenA: `0x${string}`, tokenB: `0x${string}`): UniswapPoolKey[];
|
|
47
|
+
/**
|
|
48
|
+
* Find a pool key connecting two tokens in a cached index, if present.
|
|
49
|
+
* @param index - Pool graph from `getUniswapPoolIndex`
|
|
50
|
+
* @param tokenA - First currency address
|
|
51
|
+
* @param tokenB - Second currency address
|
|
52
|
+
*/
|
|
53
|
+
export declare function findPoolBetween(index: UniswapPoolIndex, tokenA: `0x${string}`, tokenB: `0x${string}`): UniswapPoolKey | null;
|
|
54
|
+
/** Reset cached index (for tests). */
|
|
55
|
+
export declare function resetUniswapPoolIndexCache(): void;
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Uniswap v4 pool discovery: subgraph index with on-chain hub fallback.
|
|
3
|
+
*/
|
|
4
|
+
import { encodeAbiParameters, keccak256, parseAbiParameters, } from "viem";
|
|
5
|
+
import { stateViewAbi } from "../abis/uniswap-state-view.js";
|
|
6
|
+
import { normalizeUniswapPoolKey, UNISWAP_DEFAULT_TICK_SPACING, UNISWAP_FEE_TIERS, UNISWAP_HUB_CURRENCIES, UNISWAP_POOL_CACHE_TTL_MS, UNISWAP_SUBGRAPH_URL, UNISWAP_V4, } from "../config/uniswap.js";
|
|
7
|
+
let cachedIndex = null;
|
|
8
|
+
/** Canonical lowercase key for the unordered pair `(a, b)`. */
|
|
9
|
+
function pairKey(a, b) {
|
|
10
|
+
const lo = a.toLowerCase();
|
|
11
|
+
const hi = b.toLowerCase();
|
|
12
|
+
return lo < hi ? `${lo}|${hi}` : `${hi}|${lo}`;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Compute the Uniswap v4 pool id (keccak256 of sorted pool key fields).
|
|
16
|
+
* @param poolKey - Pool key (normalized so currency0 sorts before currency1)
|
|
17
|
+
*/
|
|
18
|
+
export function computeUniswapPoolId(poolKey) {
|
|
19
|
+
const normalized = normalizeUniswapPoolKey(poolKey);
|
|
20
|
+
return keccak256(encodeAbiParameters(parseAbiParameters("address currency0, address currency1, uint24 fee, int24 tickSpacing, address hooks"), [
|
|
21
|
+
normalized.currency0,
|
|
22
|
+
normalized.currency1,
|
|
23
|
+
normalized.fee,
|
|
24
|
+
normalized.tickSpacing,
|
|
25
|
+
normalized.hooks,
|
|
26
|
+
]));
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Build a routing index from raw pool keys: dedup by pool id, then derive the
|
|
30
|
+
* edge list, currency adjacency, and per-pair pool buckets.
|
|
31
|
+
*/
|
|
32
|
+
function buildPoolIndex(poolKeys, source) {
|
|
33
|
+
const edges = [];
|
|
34
|
+
const adjacency = new Map();
|
|
35
|
+
const poolsByPair = new Map();
|
|
36
|
+
const seen = new Set();
|
|
37
|
+
for (const key of poolKeys) {
|
|
38
|
+
const normalized = normalizeUniswapPoolKey(key);
|
|
39
|
+
const id = computeUniswapPoolId(normalized);
|
|
40
|
+
if (seen.has(id)) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
seen.add(id);
|
|
44
|
+
const a = normalized.currency0.toLowerCase();
|
|
45
|
+
const b = normalized.currency1.toLowerCase();
|
|
46
|
+
edges.push({
|
|
47
|
+
poolKey: normalized,
|
|
48
|
+
tokenA: normalized.currency0,
|
|
49
|
+
tokenB: normalized.currency1,
|
|
50
|
+
});
|
|
51
|
+
if (!adjacency.has(a))
|
|
52
|
+
adjacency.set(a, new Set());
|
|
53
|
+
if (!adjacency.has(b))
|
|
54
|
+
adjacency.set(b, new Set());
|
|
55
|
+
adjacency.get(a).add(b);
|
|
56
|
+
adjacency.get(b).add(a);
|
|
57
|
+
const pk = pairKey(a, b);
|
|
58
|
+
const bucket = poolsByPair.get(pk);
|
|
59
|
+
if (bucket) {
|
|
60
|
+
bucket.push(normalized);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
poolsByPair.set(pk, [normalized]);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return { edges, adjacency, poolsByPair, source, fetchedAt: Date.now() };
|
|
67
|
+
}
|
|
68
|
+
async function fetchSubgraphPools() {
|
|
69
|
+
try {
|
|
70
|
+
const response = await fetch(UNISWAP_SUBGRAPH_URL, {
|
|
71
|
+
method: "POST",
|
|
72
|
+
headers: { "Content-Type": "application/json" },
|
|
73
|
+
body: JSON.stringify({
|
|
74
|
+
query: `{
|
|
75
|
+
pools(first: 500, orderBy: totalValueLockedUSD, orderDirection: desc) {
|
|
76
|
+
feeTier
|
|
77
|
+
tickSpacing
|
|
78
|
+
hooks
|
|
79
|
+
token0 { id }
|
|
80
|
+
token1 { id }
|
|
81
|
+
}
|
|
82
|
+
}`,
|
|
83
|
+
}),
|
|
84
|
+
});
|
|
85
|
+
if (!response.ok) {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
const json = (await response.json());
|
|
89
|
+
const pools = json.data?.pools;
|
|
90
|
+
if (!pools?.length) {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
return pools.map((pool) => ({
|
|
94
|
+
currency0: pool.token0.id,
|
|
95
|
+
currency1: pool.token1.id,
|
|
96
|
+
fee: Number(pool.feeTier),
|
|
97
|
+
tickSpacing: Number(pool.tickSpacing),
|
|
98
|
+
hooks: (pool.hooks || UNISWAP_V4.zeroHooks),
|
|
99
|
+
}));
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async function probePoolOnChain(client, currencyA, currencyB, fee, tickSpacing) {
|
|
106
|
+
const poolKey = normalizeUniswapPoolKey({
|
|
107
|
+
currency0: currencyA,
|
|
108
|
+
currency1: currencyB,
|
|
109
|
+
fee,
|
|
110
|
+
tickSpacing,
|
|
111
|
+
hooks: UNISWAP_V4.zeroHooks,
|
|
112
|
+
});
|
|
113
|
+
const poolId = computeUniswapPoolId(poolKey);
|
|
114
|
+
try {
|
|
115
|
+
const [slot0, liquidity] = await Promise.all([
|
|
116
|
+
client.readContract({
|
|
117
|
+
address: UNISWAP_V4.stateView,
|
|
118
|
+
abi: stateViewAbi,
|
|
119
|
+
functionName: "getSlot0",
|
|
120
|
+
args: [poolId],
|
|
121
|
+
}),
|
|
122
|
+
client.readContract({
|
|
123
|
+
address: UNISWAP_V4.stateView,
|
|
124
|
+
abi: stateViewAbi,
|
|
125
|
+
functionName: "getLiquidity",
|
|
126
|
+
args: [poolId],
|
|
127
|
+
}),
|
|
128
|
+
]);
|
|
129
|
+
if (slot0[0] > 0n && liquidity > 0n) {
|
|
130
|
+
return poolKey;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
// pool not initialized
|
|
135
|
+
}
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
async function buildOnChainIndex(client) {
|
|
139
|
+
const hubs = [...UNISWAP_HUB_CURRENCIES];
|
|
140
|
+
const probes = [];
|
|
141
|
+
for (let i = 0; i < hubs.length; i++) {
|
|
142
|
+
for (let j = i + 1; j < hubs.length; j++) {
|
|
143
|
+
const [currency0, currency1] = hubs[i].toLowerCase() < hubs[j].toLowerCase()
|
|
144
|
+
? [hubs[i], hubs[j]]
|
|
145
|
+
: [hubs[j], hubs[i]];
|
|
146
|
+
for (const fee of UNISWAP_FEE_TIERS) {
|
|
147
|
+
const tickSpacing = UNISWAP_DEFAULT_TICK_SPACING[fee] ??
|
|
148
|
+
UNISWAP_DEFAULT_TICK_SPACING[3000];
|
|
149
|
+
probes.push(probePoolOnChain(client, currency0, currency1, fee, tickSpacing));
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
const poolKeys = (await Promise.all(probes)).filter((poolKey) => poolKey !== null);
|
|
154
|
+
return buildPoolIndex(poolKeys, "onchain");
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Load or refresh the v4 pool index (subgraph first, on-chain hub fallback).
|
|
158
|
+
* @param client - Celo public client for StateView probing
|
|
159
|
+
* @param options.forceRefresh - Bypass TTL cache when true
|
|
160
|
+
*/
|
|
161
|
+
export async function getUniswapPoolIndex(client, options) {
|
|
162
|
+
const now = Date.now();
|
|
163
|
+
if (!options?.forceRefresh &&
|
|
164
|
+
cachedIndex &&
|
|
165
|
+
now - cachedIndex.fetchedAt < UNISWAP_POOL_CACHE_TTL_MS) {
|
|
166
|
+
return cachedIndex;
|
|
167
|
+
}
|
|
168
|
+
const subgraphPools = await fetchSubgraphPools();
|
|
169
|
+
if (subgraphPools?.length) {
|
|
170
|
+
cachedIndex = buildPoolIndex(subgraphPools, "subgraph");
|
|
171
|
+
return cachedIndex;
|
|
172
|
+
}
|
|
173
|
+
cachedIndex = await buildOnChainIndex(client);
|
|
174
|
+
return cachedIndex;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* All pools connecting two tokens in a cached index (one per fee tier / hooks).
|
|
178
|
+
* @param index - Pool graph from `getUniswapPoolIndex`
|
|
179
|
+
* @param tokenA - First currency address
|
|
180
|
+
* @param tokenB - Second currency address
|
|
181
|
+
*/
|
|
182
|
+
export function poolsBetween(index, tokenA, tokenB) {
|
|
183
|
+
return index.poolsByPair.get(pairKey(tokenA, tokenB)) ?? [];
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Find a pool key connecting two tokens in a cached index, if present.
|
|
187
|
+
* @param index - Pool graph from `getUniswapPoolIndex`
|
|
188
|
+
* @param tokenA - First currency address
|
|
189
|
+
* @param tokenB - Second currency address
|
|
190
|
+
*/
|
|
191
|
+
export function findPoolBetween(index, tokenA, tokenB) {
|
|
192
|
+
return poolsBetween(index, tokenA, tokenB)[0] ?? null;
|
|
193
|
+
}
|
|
194
|
+
/** Reset cached index (for tests). */
|
|
195
|
+
export function resetUniswapPoolIndexCache() {
|
|
196
|
+
cachedIndex = null;
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=uniswap-pool-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uniswap-pool-discovery.js","sourceRoot":"","sources":["../../../src/services/uniswap-pool-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type { CeloClientFactory } from "../clients/celo-client.js";
|
|
2
|
+
import { type SerializedPreparedFlow } from "../types/prepared.js";
|
|
3
|
+
/** Optional parameters for Uniswap v4 swap estimates and prepares. */
|
|
4
|
+
export interface UniswapSwapParams {
|
|
5
|
+
/** Max slippage tolerance in percent (default `0.5`). */
|
|
6
|
+
slippageTolerance?: number;
|
|
7
|
+
/** Swap deadline in minutes from now (default `5`). */
|
|
8
|
+
deadlineMinutes?: number;
|
|
9
|
+
/** Address receiving output tokens (default: `from`). */
|
|
10
|
+
recipient?: `0x${string}`;
|
|
11
|
+
}
|
|
12
|
+
/** Uniswap v4 quotes, gas estimates, and `prepareSwap` flows on Celo mainnet. */
|
|
13
|
+
export declare class UniswapService {
|
|
14
|
+
private readonly clientFactory;
|
|
15
|
+
private readonly tokenService;
|
|
16
|
+
constructor(clientFactory: CeloClientFactory);
|
|
17
|
+
private resolvePair;
|
|
18
|
+
private baseQuoteFields;
|
|
19
|
+
private buildSwapRoute;
|
|
20
|
+
private buildUniversalRouterCalldata;
|
|
21
|
+
private getApprovalSteps;
|
|
22
|
+
private estimateCallGas;
|
|
23
|
+
private estimateSwapGasWithAllowance;
|
|
24
|
+
/**
|
|
25
|
+
* Expected Uniswap v4 output for a token pair — no wallet required.
|
|
26
|
+
* @param tokenIn - Input token symbol or address
|
|
27
|
+
* @param tokenOut - Output token symbol or address
|
|
28
|
+
* @param amount - Human-readable input amount
|
|
29
|
+
* @param _from - Deprecated; ignored. Balance checks run on prepare/estimate only.
|
|
30
|
+
*/
|
|
31
|
+
getSwapQuote(tokenIn: string, tokenOut: string, amount: string, _from?: `0x${string}`): Promise<{
|
|
32
|
+
route: {
|
|
33
|
+
pools: import("../config/uniswap.js").UniswapPoolKey[];
|
|
34
|
+
};
|
|
35
|
+
protocol: "uniswap_v4";
|
|
36
|
+
network: "mainnet";
|
|
37
|
+
tokenIn: string;
|
|
38
|
+
tokenOut: string;
|
|
39
|
+
amountIn: string;
|
|
40
|
+
expectedOut: string;
|
|
41
|
+
routeHops: number;
|
|
42
|
+
indexSource: string | undefined;
|
|
43
|
+
}>;
|
|
44
|
+
/**
|
|
45
|
+
* Simulate gas for a Uniswap v4 swap from `from`, including Permit2 approvals when needed.
|
|
46
|
+
* @param from - Sender wallet address
|
|
47
|
+
* @param tokenIn - Input token symbol or address
|
|
48
|
+
* @param tokenOut - Output token symbol or address
|
|
49
|
+
* @param amount - Human-readable input amount
|
|
50
|
+
* @param params - Optional slippage, deadline, and recipient
|
|
51
|
+
*/
|
|
52
|
+
estimateSwap(from: `0x${string}`, tokenIn: string, tokenOut: string, amount: string, params?: UniswapSwapParams): Promise<{
|
|
53
|
+
from: `0x${string}`;
|
|
54
|
+
recipient: `0x${string}`;
|
|
55
|
+
amountOutMin: string;
|
|
56
|
+
approvalStepsNeeded: number;
|
|
57
|
+
approvalGas: string[];
|
|
58
|
+
swapGas: string | undefined;
|
|
59
|
+
swapGasEstimated: boolean;
|
|
60
|
+
slippageTolerance: number;
|
|
61
|
+
deadline: string;
|
|
62
|
+
deadlineMinutes: number;
|
|
63
|
+
protocol: "uniswap_v4";
|
|
64
|
+
network: "mainnet";
|
|
65
|
+
tokenIn: string;
|
|
66
|
+
tokenOut: string;
|
|
67
|
+
amountIn: string;
|
|
68
|
+
expectedOut: string;
|
|
69
|
+
routeHops: number;
|
|
70
|
+
indexSource: string | undefined;
|
|
71
|
+
}>;
|
|
72
|
+
/**
|
|
73
|
+
* Build unsigned Uniswap v4 steps (ERC-20 approve → Permit2 approve → swap when needed).
|
|
74
|
+
* @param from - Sender wallet address
|
|
75
|
+
* @param tokenIn - Input token symbol or address
|
|
76
|
+
* @param tokenOut - Output token symbol or address
|
|
77
|
+
* @param amount - Human-readable input amount
|
|
78
|
+
* @param params - Optional slippage, deadline, and recipient
|
|
79
|
+
* @returns 1–3 step `SerializedPreparedFlow` for sequential wallet signing
|
|
80
|
+
*/
|
|
81
|
+
prepareSwap(from: `0x${string}`, tokenIn: string, tokenOut: string, amount: string, params?: UniswapSwapParams): Promise<SerializedPreparedFlow>;
|
|
82
|
+
}
|