{"_id":"@amuyu/smart-router","name":"@amuyu/smart-router","dist-tags":{"latest":"4.14.0"},"versions":{"4.14.0":{"name":"@amuyu/smart-router","version":"4.14.0","description":"A SDK for getting best routes from AMM","repository":{"type":"git","url":"git+https://github.com/pancakeswap/pancake-frontend.git","directory":"packages/smart-router"},"main":"dist/evm.js","module":"dist/evm.mjs","types":"dist/evm/index.d.ts","sideEffects":false,"dependencies":{"@amuyu/chains":"^0.4.0","@amuyu/multicall":"^3.4.0","@amuyu/sdk":"^5.7.7","@amuyu/swap-sdk-core":"^1.0.0","@amuyu/tokens":"^0.6.0","@amuyu/token-lists":"^0.0.9","@amuyu/v3-sdk":"^3.7.5","async-retry":"^1.3.1","debug":"^4.3.4","graphql":"^16.8.1","graphql-request":"5.0.0","lodash":"^4.17.21","mnemonist":"^0.38.3","stats-lite":"^2.2.0","tiny-invariant":"^1.3.0","viem":"1.19.11","zod":"^3.22.3"},"devDependencies":{"@types/async-retry":"^1.4.4","@types/debug":"^4.1.7","@types/lodash":"^4.14.178","@types/stats-lite":"^2.2.0","tsup":"^6.7.0","@pancakeswap/tsconfig":"0.0.0","@pancakeswap/utils":"6.0.1"},"exports":{"./package.json":"./package.json",".":{"types":"./dist/evm/index.d.ts","import":"./dist/evm.mjs","require":"./dist/evm.js"},"./evm":{"types":"./dist/evm/index.d.ts","import":"./dist/evm.mjs","require":"./dist/evm.js"},"./legacy-router":{"types":"./dist/legacy-router/index.d.ts","import":"./dist/legacy-router.mjs","require":"./dist/legacy-router.js"}},"scripts":{"build":"tsup","dev":"tsup --watch","test":"vitest --run","update:snapshot":"vitest -u","clean":"rm -rf .turbo && rm -rf node_modules && rm -rf dist"},"_id":"@amuyu/smart-router@4.14.0","bugs":{"url":"https://github.com/pancakeswap/pancake-frontend/issues"},"homepage":"https://github.com/pancakeswap/pancake-frontend#readme","_integrity":"sha512-byAiOgM4YrcyrmHMnSW6goP48LszjgyUuLZ1ro88KSVE5FRvABC9v1O7yAqH60yv1oW4dRtopBBRzwFHPnYlGQ==","_resolved":"/private/var/folders/_p/6_qpzfwn4m7cdkzm6y6tgnw40000gn/T/1f1c8e4aaa6c1be0012c1ee1bc9e95d7/amuyu-smart-router-4.14.0.tgz","_from":"file:amuyu-smart-router-4.14.0.tgz","_nodeVersion":"18.20.4","_npmVersion":"10.8.2","dist":{"integrity":"sha512-byAiOgM4YrcyrmHMnSW6goP48LszjgyUuLZ1ro88KSVE5FRvABC9v1O7yAqH60yv1oW4dRtopBBRzwFHPnYlGQ==","shasum":"142d9bcdcd8905daa3fbd51cd8fc563c1e6e0ed4","tarball":"https://registry.npmjs.org/@amuyu/smart-router/-/smart-router-4.14.0.tgz","fileCount":251,"unpackedSize":895403,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCzLSO7761rEKQPbwIAoWJ2peU9PT51cv98gorStvD5eQIgHCl4SdyGSdhsEoX39Ywa9ubblj+KpsN8jddk4AfrYMc="}]},"_npmUser":{"name":"amuyu","email":"hwajoong.song@gmail.com"},"directories":{},"maintainers":[{"name":"amuyu","email":"hwajoong.song@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/smart-router_4.14.0_1731049570459_0.6675578685929908"},"_hasShrinkwrap":false}},"time":{"created":"2024-11-08T07:06:10.367Z","4.14.0":"2024-11-08T07:06:10.763Z","modified":"2024-11-08T07:06:11.058Z"},"maintainers":[{"name":"amuyu","email":"hwajoong.song@gmail.com"}],"description":"A SDK for getting best routes from AMM","homepage":"https://github.com/pancakeswap/pancake-frontend#readme","repository":{"type":"git","url":"git+https://github.com/pancakeswap/pancake-frontend.git","directory":"packages/smart-router"},"bugs":{"url":"https://github.com/pancakeswap/pancake-frontend/issues"},"readme":"# Pancakeswap Smart Router\n\n`@pancakeswap/smart-router` is a SDK for getting best trade routes from Pancakeswap AMM.\n\n## Install\n\n```bash\n$ pnpm add @pancakeswap/smart-router\n```\n\n## Usage\n\nUse BSC as an example. Here's how we use smart router sdk to find the best trade route swapping from BNB to CAKE and construct a valid swap transaction from the trade route we got.\n\nFor working code example, please refer to [smart-router-example](https://github.com/pancakeswap/smart-router-example).\n\n0. Install other dependencies\n\n```bash\n$ pnpm add viem graphql-request @pancakeswap/sdk @pancakeswap/tokens\n```\n\n1. Prepare on-chain rpc provider and subgraph providers\n\n```typescript\nimport { createPublicClient, http } from 'viem'\nimport { GraphQLClient } from 'graphql-request'\nimport { SmartRouter } from '@pancakeswap/smart-router/evm'\n\nconst publicClient = createPublicClient({\n  chain: mainnet,\n  transport: http('https://bsc-dataseed1.binance.org'),\n  batch: {\n    multicall: {\n      batchSize: 1024 * 200,\n    },\n  },\n})\n\nconst v3SubgraphClient = new GraphQLClient('https://api.thegraph.com/subgraphs/name/pancakeswap/exchange-v3-bsc')\nconst v2SubgraphClient = new GraphQLClient('https://proxy-worker-api.pancakeswap.com/bsc-exchange')\n\nconst quoteProvider = SmartRouter.createQuoteProvider({ onChainProvider: () => publicClient })\n```\n\n2. Get candidate pools\n\n```typescript\nimport { Native } from '@pancakeswap/sdk'\nimport { SmartRouter } from '@pancakeswap/smart-router/evm'\nimport { bscTokens } from '@pancakeswap/tokens'\n\nconst swapFrom = Native.onChain(chainId)\nconst swapTo = bscTokens.cake\n\nconst [v2Pools, v3Pools] = await Promise.all([\n  SmartRouter.getV2CandidatePools({\n    onChainProvider: () => publicClient,\n    v2SubgraphProvider: () => v2SubgraphClient,\n    v3SubgraphProvider: () => v3SubgraphClient,\n    currencyA: swapFrom,\n    currencyB: swapTo,\n  }),\n  SmartRouter.getV3CandidatePools({\n    onChainProvider: () => publicClient,\n    subgraphProvider: () => v3SubgraphClient,\n    currencyA: swapFrom,\n    currencyB: swapTo,\n  }),\n])\n```\n\n3. Find the best swap trade route\n\n```typescript\nimport { CurrencyAmount, TradeType } from '@pancakeswap/sdk'\n\n// 0.01 BNB in our example\nconst amount = CurrencyAmount.fromRawAmount(swapFrom, 10 ** 16)\n\nconst trade = await SmartRouter.getBestTrade(amount, swapTo, TradeType.EXACT_INPUT, {\n  gasPriceWei: () => publicClient.getGasPrice(),\n  maxHops: 2,\n  maxSplits: 2,\n  poolProvider: SmartRouter.createStaticPoolProvider(pools),\n  quoteProvider,\n  quoterOptimization: true,\n})\n```\n\n4. Build the swap transaction from trade\n\n```typescript\nimport { ChainId } from '@pancakeswap/chains'\nimport { SmartRouter, SmartRouterTrade, SMART_ROUTER_ADDRESSES, SwapRouter } from '@pancakeswap/smart-router/evm'\nimport { hexToBigInt } from 'viem'\n\nconst routerAddress = SMART_ROUTER_ADDRESSES[ChainId.BSC]\n// Swap recipient address\nconst address = '0x'\n\nconst { value, calldata } = SwapRouter.swapCallParameters(trade, {\n  recipient: address,\n  slippageTolerance: new Percent(1),\n})\n\nconst tx = {\n  account: address,\n  to: routerAddress,\n  data: calldata,\n  value: hexToBigInt(value),\n}\nconst gasEstimate = await publicClient.estimateGas(tx)\n```\n","readmeFilename":"README.md"}