{"_id":"@0xunreal/dynamic-amm-sdk","_rev":"3-58e101d0881916bd6c0ffd5ea0cd36b2","name":"@0xunreal/dynamic-amm-sdk","description":"Mercurial Vaults SDK is a typescript library that allows you to interact with Mercurial v2's AMM.","dist-tags":{"latest":"0.4.25"},"versions":{"0.4.22":{"name":"@0xunreal/dynamic-amm-sdk","version":"0.4.22","keywords":["mercurial","finance","dynamic","amm","sdk","solana"],"author":{"name":"mercurial-finance"},"license":"MIT","_id":"@0xunreal/dynamic-amm-sdk@0.4.22","homepage":"https://github.com/mercurial-finance/mercurial-dynamic-amm-sdk#readme","bugs":{"url":"https://github.com/mercurial-finance/mercurial-dynamic-amm-sdk/issues"},"dist":{"shasum":"3b742d23429a73e35d276a3035438895507574f2","tarball":"https://registry.npmjs.org/@0xunreal/dynamic-amm-sdk/-/dynamic-amm-sdk-0.4.22.tgz","fileCount":92,"integrity":"sha512-OrvRFcJR0dJBGkI9lwAOCXL+rsg0w+uN2+ergieVCRI+DBn8lbypJkckuP1A6YggIkCCilGnYYvPMWV1LsipuQ==","signatures":[{"sig":"MEYCIQCXOLGbVDsM+J+B1LbsvLxg5byNO5Skwam9k+LOsHiSbAIhALwYb6lzrDeCVuBlGWnZy3IEMc8xJ0MePkWGAhpmmol1","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":1275783},"main":"dist/cjs/index.js","_from":"file:0xunreal-dynamic-amm-sdk-0.4.22.tgz","types":"./dist/cjs/index.d.ts","module":"dist/esm/index.js","scripts":{"test":"jest ./src/amm/tests/*.test.ts --runInBand --setupFiles dotenv/config","build":"pnpm rimraf dist && tsc -p tsconfig.build.json && tsc -p tsconfig.esm.json","test-snapshot":"jest ./src/amm/tests/snapshot.test.ts --runInBand"},"_npmUser":{"name":"0xunreal","email":"0xunreal@proton.me"},"_resolved":"C:\\Users\\tamas\\AppData\\Local\\Temp\\0102e9a2a53d7ca0f5a2b8d5dd6ef6a3\\0xunreal-dynamic-amm-sdk-0.4.22.tgz","_integrity":"sha512-OrvRFcJR0dJBGkI9lwAOCXL+rsg0w+uN2+ergieVCRI+DBn8lbypJkckuP1A6YggIkCCilGnYYvPMWV1LsipuQ==","repository":{"url":"git+https://github.com/mercurial-finance/mercurial-dynamic-amm-sdk.git","type":"git"},"_npmVersion":"10.2.5","description":"Mercurial Vaults SDK is a typescript library that allows you to interact with Mercurial v2's AMM.","directories":{"test":"tests"},"_nodeVersion":"20.13.1","dependencies":{"jsbi":"^4.3.0","bn.js":"5.2.1","dotenv":"^16.0.1","bn-sqrt":"^1.0.0","invariant":"^2.2.4","decimal.js":"^10.4.1","@solana/web3.js":"^1.91.6","@solana/spl-token":"^0.4.6","@0xunreal/vault-sdk":"0.5.3","@project-serum/borsh":"^0.2.5","@saberhq/token-utils":"1.13.32","@project-serum/anchor":"0.24.2","@solana/buffer-layout":"4.0.0","@saberhq/anchor-contrib":"1.13.32","@saberhq/stableswap-sdk":"1.13.32","@solana/spl-token-registry":"^0.2.1105"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","jest":"^28.1.0","mocha":"^10.0.0","rimraf":"^5.0.7","ts-jest":"^28.0.2","ts-mocha":"^10.0.0","typescript":"^5.5.2","@types/chai":"^4.3.1","@types/jest":"^27.5.1","@types/bn.js":"^5.1.0","@types/mocha":"^9.1.1","@types/invariant":"^2.2.35","@tsconfig/recommended":"^1.0.1"},"peerDependencies":{"@solana/buffer-layout":"^3 || ^4"},"_npmOperationalInternal":{"tmp":"tmp/dynamic-amm-sdk_0.4.22_1719509359282_0.40722040478504073","host":"s3://npm-registry-packages"}},"0.4.23":{"name":"@0xunreal/dynamic-amm-sdk","version":"0.4.23","keywords":["mercurial","finance","dynamic","amm","sdk","solana"],"author":{"name":"mercurial-finance"},"license":"MIT","_id":"@0xunreal/dynamic-amm-sdk@0.4.23","homepage":"https://github.com/mercurial-finance/mercurial-dynamic-amm-sdk#readme","bugs":{"url":"https://github.com/mercurial-finance/mercurial-dynamic-amm-sdk/issues"},"dist":{"shasum":"0b380a8a7f8c18a0b07709161d4196d889c06514","tarball":"https://registry.npmjs.org/@0xunreal/dynamic-amm-sdk/-/dynamic-amm-sdk-0.4.23.tgz","fileCount":92,"integrity":"sha512-s6AmhsIPa6FYDnNJzkFKN4UU0s5aJupSePBdwAssUED9TJQu8AtLTLNLyVcSlE6ftcDMNlwc0Uuy6Y5JCOgVow==","signatures":[{"sig":"MEQCIDexNVjpW/orrhBOQNROHKyNvxgj6lNL4yzsosfNnUy9AiBafv7r2k3zkGDvuso6DyydxuAzOmeGFbJ/R9VtEpNn6A==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":1275639},"main":"dist/cjs/index.js","_from":"file:0xunreal-dynamic-amm-sdk-0.4.23.tgz","types":"./dist/cjs/index.d.ts","module":"dist/esm/index.js","scripts":{"test":"jest ./src/amm/tests/*.test.ts --runInBand --setupFiles dotenv/config","build":"pnpm rimraf dist && tsc -p tsconfig.build.json && tsc -p tsconfig.esm.json","test-snapshot":"jest ./src/amm/tests/snapshot.test.ts --runInBand"},"_npmUser":{"name":"0xunreal","email":"0xunreal@proton.me"},"_resolved":"C:\\Users\\tamas\\AppData\\Local\\Temp\\74921053ad41d90b783d9188ad0017f4\\0xunreal-dynamic-amm-sdk-0.4.23.tgz","_integrity":"sha512-s6AmhsIPa6FYDnNJzkFKN4UU0s5aJupSePBdwAssUED9TJQu8AtLTLNLyVcSlE6ftcDMNlwc0Uuy6Y5JCOgVow==","repository":{"url":"git+https://github.com/mercurial-finance/mercurial-dynamic-amm-sdk.git","type":"git"},"_npmVersion":"10.2.5","description":"Mercurial Vaults SDK is a typescript library that allows you to interact with Mercurial v2's AMM.","directories":{"test":"tests"},"_nodeVersion":"20.13.1","dependencies":{"jsbi":"^4.3.0","bn.js":"5.2.1","dotenv":"^16.0.1","bn-sqrt":"^1.0.0","invariant":"^2.2.4","decimal.js":"^10.4.1","@solana/web3.js":"^1.91.6","@solana/spl-token":"^0.4.6","@0xunreal/vault-sdk":"0.5.3","@project-serum/borsh":"^0.2.5","@saberhq/token-utils":"1.13.32","@project-serum/anchor":"0.24.2","@solana/buffer-layout":"4.0.0","@saberhq/anchor-contrib":"1.13.32","@saberhq/stableswap-sdk":"1.13.32","@solana/spl-token-registry":"^0.2.1105"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","jest":"^28.1.0","mocha":"^10.0.0","rimraf":"^5.0.7","ts-jest":"^28.0.2","ts-mocha":"^10.0.0","typescript":"^5.5.2","@types/chai":"^4.3.1","@types/jest":"^27.5.1","@types/bn.js":"^5.1.0","@types/mocha":"^9.1.1","@types/invariant":"^2.2.35","@tsconfig/recommended":"^1.0.1"},"peerDependencies":{"@solana/buffer-layout":"^3 || ^4"},"_npmOperationalInternal":{"tmp":"tmp/dynamic-amm-sdk_0.4.23_1719509515799_0.0074353120889985025","host":"s3://npm-registry-packages"}},"0.4.24":{"name":"@0xunreal/dynamic-amm-sdk","version":"0.4.24","keywords":["mercurial","finance","dynamic","amm","sdk","solana"],"author":{"name":"mercurial-finance"},"license":"MIT","_id":"@0xunreal/dynamic-amm-sdk@0.4.24","homepage":"https://github.com/mercurial-finance/mercurial-dynamic-amm-sdk#readme","bugs":{"url":"https://github.com/mercurial-finance/mercurial-dynamic-amm-sdk/issues"},"dist":{"shasum":"7c432aee7c1c35b873775b718d8343f110b0d56e","tarball":"https://registry.npmjs.org/@0xunreal/dynamic-amm-sdk/-/dynamic-amm-sdk-0.4.24.tgz","fileCount":92,"integrity":"sha512-gsDc+ZdXcCKsL3ZrBEUGGxoPCWa2l0GoxV+GjtOb1SS8YUq3t7fnoezhwbVWOrglyN04C7H4Mh5mhsrISDU1/A==","signatures":[{"sig":"MEUCIG4Xyf91F7lP18w8ZiorgbL8Ym3DEZVM1cYFcb369e8vAiEAuR2NJKkVPVn6IpBslUn2mjch/Vra2MXvMwN39wHeXFE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":1275639},"main":"dist/cjs/index.js","_from":"file:0xunreal-dynamic-amm-sdk-0.4.24.tgz","types":"./dist/cjs/index.d.ts","module":"dist/esm/index.js","scripts":{"test":"jest ./src/amm/tests/*.test.ts --runInBand --setupFiles dotenv/config","build":"pnpm rimraf dist && tsc -p tsconfig.build.json && tsc -p tsconfig.esm.json","test-snapshot":"jest ./src/amm/tests/snapshot.test.ts --runInBand"},"_npmUser":{"name":"0xunreal","email":"0xunreal@proton.me"},"_resolved":"C:\\Users\\tamas\\AppData\\Local\\Temp\\e7418898e5f472c4dc69d4fd059fc4dd\\0xunreal-dynamic-amm-sdk-0.4.24.tgz","_integrity":"sha512-gsDc+ZdXcCKsL3ZrBEUGGxoPCWa2l0GoxV+GjtOb1SS8YUq3t7fnoezhwbVWOrglyN04C7H4Mh5mhsrISDU1/A==","repository":{"url":"git+https://github.com/mercurial-finance/mercurial-dynamic-amm-sdk.git","type":"git"},"_npmVersion":"10.2.5","description":"Mercurial Vaults SDK is a typescript library that allows you to interact with Mercurial v2's AMM.","directories":{"test":"tests"},"_nodeVersion":"20.13.1","dependencies":{"jsbi":"^4.3.0","bn.js":"5.2.1","dotenv":"^16.0.1","bn-sqrt":"^1.0.0","invariant":"^2.2.4","decimal.js":"^10.4.1","@solana/web3.js":"^1.91.6","@solana/spl-token":"^0.4.7","@0xunreal/vault-sdk":"0.5.5","@project-serum/borsh":"^0.2.5","@saberhq/token-utils":"1.13.32","@project-serum/anchor":"0.24.2","@solana/buffer-layout":"4.0.0","@saberhq/anchor-contrib":"1.13.32","@saberhq/stableswap-sdk":"1.13.32","@solana/spl-token-registry":"^0.2.1105"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","jest":"^28.1.0","mocha":"^10.0.0","rimraf":"^5.0.7","ts-jest":"^28.0.2","ts-mocha":"^10.0.0","typescript":"^5.5.2","@types/chai":"^4.3.1","@types/jest":"^27.5.1","@types/bn.js":"^5.1.0","@types/mocha":"^9.1.1","@types/invariant":"^2.2.35","@tsconfig/recommended":"^1.0.1"},"peerDependencies":{"@solana/buffer-layout":"^3 || ^4"},"_npmOperationalInternal":{"tmp":"tmp/dynamic-amm-sdk_0.4.24_1719520928792_0.6862975763019656","host":"s3://npm-registry-packages"}},"0.4.25":{"name":"@0xunreal/dynamic-amm-sdk","version":"0.4.25","description":"Mercurial Vaults SDK is a typescript library that allows you to interact with Mercurial v2's AMM.","main":"dist/cjs/index.js","module":"dist/esm/index.js","dependencies":{"@0xunreal/vault-sdk":"0.5.7","@project-serum/anchor":"0.24.2","@project-serum/borsh":"^0.2.5","@saberhq/anchor-contrib":"1.13.32","@saberhq/stableswap-sdk":"1.13.32","@saberhq/token-utils":"1.13.32","@solana/buffer-layout":"4.0.0","@solana/spl-token":"^0.4.7","@solana/spl-token-registry":"^0.2.1105","@solana/web3.js":"^1.91.6","bn-sqrt":"^1.0.0","bn.js":"5.2.1","decimal.js":"^10.4.1","dotenv":"^16.0.1","invariant":"^2.2.4","jsbi":"^4.3.0"},"devDependencies":{"@tsconfig/recommended":"^1.0.1","@types/bn.js":"^5.1.0","@types/chai":"^4.3.1","@types/invariant":"^2.2.35","@types/jest":"^27.5.1","@types/mocha":"^9.1.1","chai":"^4.3.6","jest":"^28.1.0","mocha":"^10.0.0","rimraf":"^5.0.7","ts-jest":"^28.0.2","ts-mocha":"^10.0.0","typescript":"^5.5.2"},"peerDependencies":{"@solana/buffer-layout":"^3 || ^4"},"directories":{"test":"tests"},"repository":{"type":"git","url":"git+https://github.com/mercurial-finance/mercurial-dynamic-amm-sdk.git"},"keywords":["mercurial","finance","dynamic","amm","sdk","solana"],"author":{"name":"mercurial-finance"},"license":"MIT","bugs":{"url":"https://github.com/mercurial-finance/mercurial-dynamic-amm-sdk/issues"},"homepage":"https://github.com/mercurial-finance/mercurial-dynamic-amm-sdk#readme","scripts":{"build":"pnpm rimraf dist && tsc -p tsconfig.build.json && tsc -p tsconfig.esm.json","test":"jest ./src/amm/tests/*.test.ts --runInBand --setupFiles dotenv/config","test-snapshot":"jest ./src/amm/tests/snapshot.test.ts --runInBand"},"types":"./dist/cjs/index.d.ts","_id":"@0xunreal/dynamic-amm-sdk@0.4.25","_integrity":"sha512-Ak2gtsM9tAg3i0bvalhTJMTeYttFh84x56cyEl2BbNE0FqBDl/Fs4ZeiMl1aHFplaZRrckTTS71iJzLbbv+fow==","_resolved":"C:\\Users\\tamas\\AppData\\Local\\Temp\\94fd333e46965d640f714e2b8ba5b918\\0xunreal-dynamic-amm-sdk-0.4.25.tgz","_from":"file:0xunreal-dynamic-amm-sdk-0.4.25.tgz","_nodeVersion":"20.13.1","_npmVersion":"10.2.5","dist":{"integrity":"sha512-Ak2gtsM9tAg3i0bvalhTJMTeYttFh84x56cyEl2BbNE0FqBDl/Fs4ZeiMl1aHFplaZRrckTTS71iJzLbbv+fow==","shasum":"7b29cd1e102ddec47200fe25779175e6fc026992","tarball":"https://registry.npmjs.org/@0xunreal/dynamic-amm-sdk/-/dynamic-amm-sdk-0.4.25.tgz","fileCount":92,"unpackedSize":1275639,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCURAQ3xxVh6NtT1FFkDdoKijh2mTE1YyWQxO95sW4xpAIhALWORmEv6XdVCDqVeWPCOnHZ9Ky+RDWdAVCPy6hSfnuf"}]},"_npmUser":{"name":"0xunreal","email":"0xunreal@proton.me"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynamic-amm-sdk_0.4.25_1719531990839_0.6655497230456897"},"_hasShrinkwrap":false}},"time":{"created":"2024-06-27T17:29:19.172Z","modified":"2024-06-27T23:46:31.232Z","0.4.22":"2024-06-27T17:29:19.464Z","0.4.23":"2024-06-27T17:31:56.123Z","0.4.24":"2024-06-27T20:42:09.029Z","0.4.25":"2024-06-27T23:46:31.058Z"},"maintainers":[{"name":"0xunreal","email":"0xunreal@proton.me"}],"author":{"name":"mercurial-finance"},"repository":{"type":"git","url":"git+https://github.com/mercurial-finance/mercurial-dynamic-amm-sdk.git"},"keywords":["mercurial","finance","dynamic","amm","sdk","solana"],"license":"MIT","homepage":"https://github.com/mercurial-finance/mercurial-dynamic-amm-sdk#readme","bugs":{"url":"https://github.com/mercurial-finance/mercurial-dynamic-amm-sdk/issues"},"readme":"# Mercurial Amm Dynamic SDK\r\n\r\n<p align=\"center\">\r\n<img align=\"center\" src=\"https://vaults.mercurial.finance/icons/logo.svg\" width=\"180\" height=\"180\" />\r\n</p>\r\n<br>\r\n\r\n## Getting started\r\n\r\nNPM: https://www.npmjs.com/package/@mercurial-finance/dynamic-amm-sdk\r\n\r\nSDK: https://github.com/mercurial-finance/mercurial-dynamic-amm-sdk\r\n\r\n<!-- Docs: https://docs.mercurial.finance/mercurial-dynamic-yield-infra/ -->\r\n\r\nDiscord: https://discord.com/channels/841152225564950528/864859354335412224\r\n\r\n<hr>\r\n\r\n## Install\r\n\r\n1. Install deps\r\n\r\n```\r\nnpm i @mercurial-finance/dynamic-amm-sdk @project-serum/anchor @solana/web3.js @solana/spl-token @solana/spl-token-registry\r\n```\r\n\r\n2. Initialize AmmImpl instance\r\n\r\n```ts\r\nimport AmmImpl, { MAINNET_POOL } from '@mercurial-finance/dynamic-amm-sdk';\r\nimport { PublicKey } from '@solana/web3.js';\r\nimport { Wallet, AnchorProvider } from '@project-serum/anchor';\r\n\r\n// Connection, Wallet, and AnchorProvider to interact with the network\r\nconst mainnetConnection = new Connection('https://api.mainnet-beta.solana.com');\r\nconst mockWallet = new Wallet(new Keypair());\r\nconst provider = new AnchorProvider(mainnetConnection, mockWallet, {\r\n  commitment: 'confirmed',\r\n});\r\n// Alternatively, to use Solana Wallet Adapter\r\n\r\n// https://station.jup.ag/blog/jupiter-token-list-api#endpoints\r\nconst tokenList = await fetch('https://token.jup.ag/all').then(res => res.json());\r\nconst USDC = tokenList.find(token => token.address === <USDC_ADDRESS>);\r\nconst USDT = tokenList.find(token => token.address === <USDT_ADDRESS>);\r\nconst SOL = tokenList.find(token => token.address === <SOL_ADDRESS>);\r\nconst constantProductPool = await AmmImpl.create(connection, MAINNET_POOL.USDC_SOL, USDC, SOL);\r\nconst stablePool = await AmmImpl.create(connection, MAINNET_POOL.USDT_USDC, USDT, USDC);\r\n\r\n// If you need to create multiple, can consider using `createMultiple`\r\nconst pools = [\r\n  {\r\n    pool: MAINNET_POOL.USDC_SOL,\r\n    tokenInfoA: USDC,\r\n    tokenInfoB: SOL\r\n  },\r\n  {\r\n    pool: MAINNET_POOL.USDT_USDC,\r\n    tokenInfoA: USDT,\r\n    tokenInfoB: USDC\r\n  }\r\n]\r\nconst [constantProductPool, stablePool] = await AmmImpl.createMultiple(connection, pools)\r\n```\r\n\r\n3. To interact with the AmmImpl\r\n\r\n- Get Lp Supply\r\n\r\n```ts\r\n// To refetch the pool's latest supply\r\n// Alternatively, use `AmmImpl.poolState.lpSupply`\r\nconst lpSupply = await constantProductPool.getLpSupply();\r\n```\r\n\r\n- Check pool balance\r\n\r\n```ts\r\n// Get the user's ATA LP balance\r\nconst userLpBalance = await constantProductPool.getUserBalance(mockWallet.publicKey);\r\n```\r\n\r\n- Update pool state (It's recommended to update the deposit before perform any quotation)\r\n\r\n```ts\r\nawait constantProduct.updateState();\r\n```\r\n\r\n- Deposit to constant product\r\n\r\n```ts\r\nconst inAmountALamport = new BN(1 * 10 ** constantProductPool.tokenA.decimals); // 1.0 SOL\r\n\r\n// Get deposit quote for constant product\r\nconst { poolTokenAmountOut, tokenAInAmount, tokenBInAmount } = constantProductPool.getDepositQuote(\r\n  inAmountALamport,\r\n  new BN(0),\r\n);\r\n\r\nconst depositTx = await constantProductPool.deposit(\r\n  mockWallet.publicKey,\r\n  tokenAInAmount,\r\n  tokenBInAmount,\r\n  poolTokenAmountOut,\r\n); // Web3 Transaction Object\r\nconst depositResult = await provider.sendAndConfirm(depositTx); // Transaction hash\r\n```\r\n\r\n- Balance deposit to stable pool\r\n\r\n```ts\r\nconst inAmountALamport = new BN(0.1 * 10 ** stablePool.tokenA.decimals);\r\n\r\nconst { poolTokenAmountOut, tokenAInAmount, tokenBInAmount } = stablePool.getDepositQuote(inAmountALamport, new BN(0));\r\n\r\nconst depositTx = await stablePool.deposit(mockWallet.publicKey, tokenAInAmount, tokenBInAmount, poolTokenAmountOut); // Web3 Transaction Object\r\nconst depositResult = await provider.sendAndConfirm(depositTx); // Transaction hash\r\n```\r\n\r\n- Double side imbalance deposit to stable pool\r\n\r\n```ts\r\nconst inAmountALamport = new BN(0.1 * 10 ** stablePool.tokenA.decimals);\r\nconst inAmountBLamport = new BN(0.1 * 10 ** stablePool.tokenB.decimals);\r\n\r\nconst { poolTokenAmountOut, tokenAInAmount, tokenBInAmount } = stablePool.getDepositQuote(\r\n  inAmountALamport,\r\n  inAmountBLamport,\r\n  false, // pass in false for imbalance deposit quote\r\n); // Web3 Transaction Object\r\nconst depositTx = await stablePool.deposit(mockWallet.publicKey, tokenAInAmount, tokenBInAmount, poolTokenAmountOut);\r\nconst depositResult = await provider.sendAndConfirm(depositTx); // Transaction hash\r\n```\r\n\r\n- Single side imbalance deposit to stable pool\r\n\r\n```ts\r\nconst inAmountALamport = new BN(0.1 * 10 ** stablePool.tokenA.decimals);\r\n\r\nconst { poolTokenAmountOut, tokenAInAmount, tokenBInAmount } = stablePool.getDepositQuote(\r\n  inAmountALamport,\r\n  new BN(0),\r\n  false, // pass in false for imbalance deposit quote\r\n); // Web3 Transaction Object\r\nconst depositTx = await stablePool.deposit(mockWallet.publicKey, tokenAInAmount, tokenBInAmount, poolTokenAmountOut);\r\nconst depositResult = await provider.sendAndConfirm(depositTx); // Transaction hash\r\n```\r\n\r\n- Balance withdraw from constant product\r\n\r\n```ts\r\nconst outTokenAmountLamport = new BN(0.1 * 10 ** cpPool.decimals);\r\n\r\nconst { poolTokenAmountIn, tokenAOutAmount, tokenBOutAmount } = cpPool.getWithdrawQuote(outTokenAmountLamport); // use lp balance for full withdrawal\r\nconst withdrawTx = await cpPool.withdraw(mockWallet.publicKey, poolTokenAmountIn, tokenAOutAmount, tokenBOutAmount); // Web3 Transaction Object\r\nconst withdrawResult = await provider.sendAndConfirm(withdrawTx); // Transaction hash\r\n```\r\n\r\n- Balance withdraw from stable pool\r\n\r\n```ts\r\nconst outTokenAmountLamport = new BN(0.1 * 10 ** stablePool.decimals);\r\n\r\nconst { poolTokenAmountIn, tokenAOutAmount, tokenBOutAmount } = stablePool.getWithdrawQuote(outTokenAmountLamport); // use lp balance for full withdrawal\r\nconst withdrawTx = await stablePool.withdraw(mockWallet.publicKey, poolTokenAmountIn, tokenAOutAmount, tokenBOutAmount); // Web3 Transaction Object\r\nconst withdrawResult = await provider.sendAndConfirm(withdrawTx);\r\n```\r\n\r\n- Imbalance withdraw from stable pool\r\n\r\n```ts\r\nconst outTokenAmountLamport = new BN(0.1 * 10 ** stablePool.decimals);\r\n\r\nconst { poolTokenAmountIn, tokenAOutAmount, tokenBOutAmount } = stablePool.getWithdrawQuote(\r\n  outTokenAmountLamport,\r\n  new PublicKey(stablePool.tokenA.address), // Pass in token A/B mint to perform imbalance withdraw\r\n);\r\nconst withdrawTx = await stablePool.withdraw(mockWallet.publicKey, poolTokenAmountIn, tokenAOutAmount, tokenBOutAmount); // Web3 Transaction Object\r\nconst withdrawResult = await provider.sendAndConfirm(withdrawTx);\r\n```\r\n\r\n- Swap\r\n\r\n```ts\r\nconst inAmountLamport = new BN(0.1 * 10 ** constantProductPool.tokenB.decimals);\r\n\r\n// Swap SOL → USDT\r\nconst { minSwapOutAmount } = constantProductPool.getSwapQuote(\r\n  new PublicKey(constantProductPool.tokenB.address),\r\n  inAmountLamport,\r\n);\r\n\r\nconst swapTx = await constantProductPool.swap(\r\n  mockWallet.publicKey,\r\n  new PublicKey(constantProductPool.tokenB.address),\r\n  inAmountLamport,\r\n  minSwapOutAmount,\r\n);\r\nconst swapResult = await provider.sendAndConfirm(withdrawTx);\r\n```\r\n\r\n- Update pool state\r\n\r\n```ts\r\nconstantProductPool.updateState();\r\n```\r\n","readmeFilename":"README.md"}