@qidao/sdk 5.0.9 → 5.0.10
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/index.js +2 -2
- package/dist/{qidao-sdk.cjs.development.js → sdk.cjs.development.js} +1 -1
- package/dist/sdk.cjs.development.js.map +1 -0
- package/dist/{qidao-sdk.cjs.production.min.js → sdk.cjs.production.min.js} +1 -1
- package/dist/sdk.cjs.production.min.js.map +1 -0
- package/dist/{qidao-sdk.esm.js → sdk.esm.js} +1 -1
- package/dist/sdk.esm.js.map +1 -0
- package/package.json +1 -1
- package/dist/qidao-sdk.cjs.development.js.map +0 -1
- package/dist/qidao-sdk.cjs.production.min.js.map +0 -1
- package/dist/qidao-sdk.esm.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"qidao-sdk.cjs.production.min.js","sources":["../src/enums/ChainId.ts","../src/enums/Rounding.ts","../src/enums/TradeType.ts","../src/enums/KashiAction.ts","../src/enums/Fee.ts","../src/enums/OrderStatus.ts","../src/constants/addresses.ts","../src/constants/kashi.ts","../src/entities/AbstractCurrency.ts","../src/entities/NativeCurrency.ts","../src/functions/validateAndParseAddress.ts","../src/entities/Token.ts","../src/constants/tokens.ts","../src/entities/Native/Avalanche.ts","../src/entities/Native/Binance.ts","../src/entities/Native/Celo.ts","../src/entities/Native/Ether.ts","../src/entities/Native/Fantom.ts","../src/entities/Native/Harmony.ts","../src/entities/Native/Heco.ts","../src/entities/Native/Matic.ts","../src/entities/Native/Movr.ts","../src/entities/Native/Okex.ts","../src/entities/Native/xDai.ts","../src/entities/Native/Palm.ts","../src/entities/Native/Fuse.ts","../src/entities/Native/Telos.ts","../src/constants/index.ts","../src/constants/natives.ts","../src/constants/numbers.ts","../src/errors.ts","../src/entities/Fraction.ts","../src/entities/CurrencyAmount.ts","../src/entities/Price.ts","../src/functions/computePoolInitCodeHash.ts","../src/functions/computeConstantProductPoolAddress.ts","../src/functions/sqrt.ts","../src/entities/ConstantProductPool.ts","../src/functions/computePairAddress.ts","../src/entities/Pair.ts","../src/entities/Percent.ts","../src/entities/Route.ts","../src/functions/computePriceImpact.ts","../src/functions/sortedInsert.ts","../src/entities/Trade.ts","../src/types/MultiRouterTypes.ts","../node_modules/regenerator-runtime/runtime.js","../src/types/LimitOrderTypes.ts","../src/entities/eip712.ts","../src/router.ts","../src/utils/MultiRouterMath.ts","../src/limitorder.ts","../src/functions/validateSolidityTypeInstance.ts"],"sourcesContent":["export enum ChainId {\n MAINNET = 1,\n ROPSTEN = 3,\n RINKEBY = 4,\n GÖRLI = 5,\n KOVAN = 42,\n MATIC = 137,\n MATIC_TESTNET = 80001,\n FANTOM = 250,\n FANTOM_TESTNET = 4002,\n XDAI = 100,\n BSC = 56,\n BSC_TESTNET = 97,\n ARBITRUM = 42161,\n ARBITRUM_TESTNET = 79377087078960,\n MOONBEAM_TESTNET = 1287,\n MOONBEAM = 1284,\n AVALANCHE = 43114,\n AVALANCHE_TESTNET = 43113,\n HECO = 128,\n HECO_TESTNET = 256,\n HARMONY = 1666600000,\n HARMONY_TESTNET = 1666700000,\n OKEX = 66,\n OKEX_TESTNET = 65,\n CELO = 42220,\n PALM = 11297108109,\n PALM_TESTNET = 11297108099,\n MOONRIVER = 1285,\n FUSE = 122,\n TELOS = 40,\n}\n","export enum Rounding {\n ROUND_DOWN,\n ROUND_HALF_UP,\n ROUND_UP\n}\n","export enum TradeType {\n EXACT_INPUT,\n EXACT_OUTPUT\n}\n","export enum KashiAction {\n ADD_ASSET = 1,\n REPAY = 2,\n REMOVE_ASSET = 3,\n REMOVE_COLLATERAL = 4,\n BORROW = 5,\n GET_REPAY_SHARE = 6,\n GET_REPAY_PART = 7,\n ACCRUE = 8,\n\n // Functions that don't need accrue to be called\n ADD_COLLATERAL = 10,\n UPDATE_EXCHANGE_RATE = 11,\n\n // Function on BentoBox\n BENTO_DEPOSIT = 20,\n BENTO_WITHDRAW = 21,\n BENTO_TRANSFER = 22,\n BENTO_TRANSFER_MULTIPLE = 23,\n BENTO_SETAPPROVAL = 24,\n\n // Any external call (except to BentoBox)\n CALL = 30\n}\n","// Fee - Tiers TBD\nexport enum Fee {\n DEFAULT = 30\n}\n","export enum OrderStatus {\n FILLED = 'FILLED',\n CANCELLED = 'CANCELLED',\n EXPIRED = 'EXPIRED',\n PENDING = 'PENDING'\n}\n","import { AddressMap } from '../types'\nimport { ChainId } from '../enums'\n\nexport const USDC_ADDRESS: AddressMap = {\n [ChainId.MAINNET]: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n [ChainId.ROPSTEN]: '0x0D9C8723B343A8368BebE0B5E89273fF8D712e3C',\n [ChainId.KOVAN]: '0xb7a4F3E9097C08dA09517b5aB877F7a917224ede',\n [ChainId.MATIC]: '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174',\n [ChainId.FANTOM]: '0x04068DA6C83AFCFA0e13ba15A6696662335D5B75',\n [ChainId.BSC]: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',\n [ChainId.HARMONY]: '0x985458E523dB3d53125813eD68c274899e9DfAb4',\n [ChainId.HECO]: '0x9362Bbef4B8313A8Aa9f0c9808B80577Aa26B73B',\n [ChainId.OKEX]: '0xc946DAf81b08146B1C7A8Da2A851Ddf2B3EAaf85',\n [ChainId.XDAI]: '0xDDAfbb505ad214D7b80b1f830fcCc89B60fb7A83',\n [ChainId.ARBITRUM]: '0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8',\n [ChainId.AVALANCHE]: '0xA7D7079b0FEaD91F3e65f86E8915Cb59c1a4C664',\n [ChainId.MOONRIVER]: '0xE3F5a90F9cb311505cd691a46596599aA1A0AD7D',\n [ChainId.FUSE]: '0x620fd5fa44BE6af63715Ef4E65DDFA0387aD13F5',\n}\n\nexport const USD_ADDRESS: AddressMap = {\n [ChainId.MAINNET]: USDC_ADDRESS[ChainId.MAINNET],\n [ChainId.ROPSTEN]: USDC_ADDRESS[ChainId.ROPSTEN],\n [ChainId.KOVAN]: USDC_ADDRESS[ChainId.KOVAN],\n [ChainId.MATIC]: USDC_ADDRESS[ChainId.MATIC],\n [ChainId.FANTOM]: USDC_ADDRESS[ChainId.FANTOM],\n [ChainId.BSC]: USDC_ADDRESS[ChainId.BSC],\n [ChainId.HARMONY]: USDC_ADDRESS[ChainId.HARMONY],\n [ChainId.HECO]: USDC_ADDRESS[ChainId.HECO],\n [ChainId.OKEX]: USDC_ADDRESS[ChainId.OKEX],\n [ChainId.XDAI]: USDC_ADDRESS[ChainId.XDAI],\n [ChainId.ARBITRUM]: USDC_ADDRESS[ChainId.ARBITRUM],\n [ChainId.AVALANCHE]: USDC_ADDRESS[ChainId.AVALANCHE],\n [ChainId.MOONRIVER]: USDC_ADDRESS[ChainId.MOONRIVER],\n [ChainId.CELO]: '0x765DE816845861e75A25fCA122bb6898B8B1282a',\n [ChainId.FUSE]: USDC_ADDRESS[ChainId.FUSE],\n}\n\nexport const FACTORY_ADDRESS: AddressMap = {\n [ChainId.MAINNET]: '0xC0AEe478e3658e2610c5F7A4A2E1777cE9e4f2Ac',\n [ChainId.ROPSTEN]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4',\n [ChainId.RINKEBY]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4',\n [ChainId.GÖRLI]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4',\n [ChainId.KOVAN]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4',\n [ChainId.FANTOM]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4',\n [ChainId.FANTOM_TESTNET]: '',\n [ChainId.MATIC]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4',\n [ChainId.MATIC_TESTNET]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4',\n [ChainId.XDAI]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4',\n [ChainId.BSC]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4',\n [ChainId.BSC_TESTNET]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4',\n [ChainId.ARBITRUM]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4',\n [ChainId.ARBITRUM_TESTNET]: '',\n [ChainId.MOONBEAM_TESTNET]: '0x2Ce3F07dD4c62b56a502E223A7cBE38b1d77A1b5',\n [ChainId.AVALANCHE]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4',\n [ChainId.AVALANCHE_TESTNET]: '0xd00ae08403B9bbb9124bB305C09058E32C39A48c',\n [ChainId.HECO]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4',\n [ChainId.HECO_TESTNET]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4',\n [ChainId.HARMONY]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4',\n [ChainId.HARMONY_TESTNET]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4',\n [ChainId.OKEX]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4',\n [ChainId.OKEX_TESTNET]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4',\n [ChainId.CELO]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4',\n [ChainId.PALM]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4',\n [ChainId.PALM_TESTNET]: '',\n [ChainId.MOONRIVER]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4',\n [ChainId.FUSE]: '0x43eA90e2b786728520e4f930d2A71a477BF2737C',\n [ChainId.TELOS]: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4',\n}\n\nexport const ROUTER_ADDRESS: AddressMap = {\n [ChainId.MAINNET]: '0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F',\n [ChainId.RINKEBY]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506',\n [ChainId.ROPSTEN]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506',\n [ChainId.GÖRLI]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506',\n [ChainId.KOVAN]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506',\n [ChainId.FANTOM]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506',\n [ChainId.FANTOM_TESTNET]: '',\n [ChainId.MATIC]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506',\n [ChainId.MATIC_TESTNET]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506',\n [ChainId.XDAI]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506',\n [ChainId.BSC]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506',\n [ChainId.BSC_TESTNET]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506',\n [ChainId.ARBITRUM]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506',\n [ChainId.ARBITRUM_TESTNET]: '',\n [ChainId.MOONBEAM_TESTNET]: '0xeB5c2BB5E83B51d83F3534Ae21E84336B8B376ef',\n [ChainId.AVALANCHE]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506',\n [ChainId.AVALANCHE_TESTNET]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506',\n [ChainId.HECO]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506',\n [ChainId.HECO_TESTNET]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506',\n [ChainId.HARMONY]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506',\n [ChainId.HARMONY_TESTNET]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506',\n [ChainId.OKEX]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506',\n [ChainId.OKEX_TESTNET]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506',\n [ChainId.CELO]: '0x1421bDe4B10e8dd459b3BCb598810B1337D56842',\n [ChainId.PALM]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506',\n [ChainId.PALM_TESTNET]: '',\n [ChainId.MOONRIVER]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506',\n [ChainId.FUSE]: '0xF4d73326C13a4Fc5FD7A064217e12780e9Bd62c3',\n [ChainId.TELOS]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506',\n}\n\nexport const SUSHI_ADDRESS: AddressMap = {\n [ChainId.MAINNET]: '0x6B3595068778DD592e39A122f4f5a5cF09C90fE2',\n [ChainId.ROPSTEN]: '0x0769fd68dFb93167989C6f7254cd0D766Fb2841F',\n [ChainId.RINKEBY]: '0x0769fd68dFb93167989C6f7254cd0D766Fb2841F',\n [ChainId.GÖRLI]: '0x0769fd68dFb93167989C6f7254cd0D766Fb2841F',\n [ChainId.KOVAN]: '0x0769fd68dFb93167989C6f7254cd0D766Fb2841F',\n [ChainId.FANTOM]: '0xae75A438b2E0cB8Bb01Ec1E1e376De11D44477CC',\n [ChainId.MATIC]: '0x0b3F868E0BE5597D5DB7fEB59E1CADBb0fdDa50a',\n [ChainId.XDAI]: '0x2995D1317DcD4f0aB89f4AE60F3f020A4F17C7CE',\n [ChainId.BSC]: '0x947950BcC74888a40Ffa2593C5798F11Fc9124C4',\n [ChainId.ARBITRUM]: '0xd4d42F0b6DEF4CE0383636770eF773390d85c61A',\n [ChainId.AVALANCHE]: '0x37B608519F91f70F2EeB0e5Ed9AF4061722e4F76',\n [ChainId.HECO]: '0x52E00B2dA5Bd7940fFe26B609A42F957f31118D5',\n [ChainId.HARMONY]: '0xBEC775Cb42AbFa4288dE81F387a9b1A3c4Bc552A',\n [ChainId.OKEX]: '0x2218E0D5E0173769F5b4939a3aE423f7e5E4EAB7',\n [ChainId.OKEX_TESTNET]: '',\n [ChainId.CELO]: '0x29dFce9c22003A4999930382Fd00f9Fd6133Acd1',\n [ChainId.PALM]: '',\n [ChainId.PALM_TESTNET]: '',\n [ChainId.MOONRIVER]: '0xf390830DF829cf22c53c8840554B98eafC5dCBc2',\n [ChainId.TELOS]: '0x922D641a426DcFFaeF11680e5358F34d97d112E1',\n [ChainId.FUSE]: '0x90708b20ccC1eb95a4FA7C8b18Fd2C22a0Ff9E78',\n}\n\nexport const MASTERCHEF_ADDRESS: AddressMap = {\n [ChainId.MAINNET]: '0xc2EdaD668740f1aA35E4D8f227fB8E17dcA888Cd',\n [ChainId.ROPSTEN]: '0x80C7DD17B01855a6D2347444a0FCC36136a314de',\n [ChainId.RINKEBY]: '0x80C7DD17B01855a6D2347444a0FCC36136a314de',\n [ChainId.GÖRLI]: '0x80C7DD17B01855a6D2347444a0FCC36136a314de',\n [ChainId.KOVAN]: '0x80C7DD17B01855a6D2347444a0FCC36136a314de',\n}\n\nexport const BAR_ADDRESS: AddressMap = {\n [ChainId.MAINNET]: '0x8798249c2E607446EfB7Ad49eC89dD1865Ff4272',\n [ChainId.ROPSTEN]: '0x1be211D8DA40BC0ae8719c6663307Bfc987b1d6c',\n [ChainId.RINKEBY]: '0x1be211D8DA40BC0ae8719c6663307Bfc987b1d6c',\n [ChainId.GÖRLI]: '0x1be211D8DA40BC0ae8719c6663307Bfc987b1d6c',\n [ChainId.KOVAN]: '0x1be211D8DA40BC0ae8719c6663307Bfc987b1d6c',\n}\n\nexport const MAKER_ADDRESS: AddressMap = {\n [ChainId.MAINNET]: '0xE11fc0B43ab98Eb91e9836129d1ee7c3Bc95df50',\n [ChainId.ROPSTEN]: '0x1b9d177CcdeA3c79B6c8F40761fc8Dc9d0500EAa',\n [ChainId.RINKEBY]: '0x1b9d177CcdeA3c79B6c8F40761fc8Dc9d0500EAa',\n [ChainId.GÖRLI]: '0x1b9d177CcdeA3c79B6c8F40761fc8Dc9d0500EAa',\n [ChainId.KOVAN]: '0x1b9d177CcdeA3c79B6c8F40761fc8Dc9d0500EAa',\n}\n\nexport const TIMELOCK_ADDRESS: AddressMap = {\n [ChainId.MAINNET]: '0x9a8541Ddf3a932a9A922B607e9CF7301f1d47bD1',\n}\n\nexport const BENTOBOX_ADDRESS: AddressMap = {\n [ChainId.MAINNET]: '0xF5BCE5077908a1b7370B9ae04AdC565EBd643966',\n [ChainId.ROPSTEN]: '0x6BdD85290001C8Aef74f35A7606065FA15aD5ACF',\n [ChainId.RINKEBY]: '0xF5BCE5077908a1b7370B9ae04AdC565EBd643966',\n [ChainId.GÖRLI]: '0xF5BCE5077908a1b7370B9ae04AdC565EBd643966',\n [ChainId.KOVAN]: '0x9A0D9920D92c178a58D99B455898Df2df22A2eE4',\n [ChainId.FANTOM]: '0xF5BCE5077908a1b7370B9ae04AdC565EBd643966',\n [ChainId.MATIC]: '0x0319000133d3AdA02600f0875d2cf03D442C3367',\n [ChainId.MATIC_TESTNET]: '0xF5BCE5077908a1b7370B9ae04AdC565EBd643966',\n [ChainId.XDAI]: '0xE2d7F5dd869Fc7c126D21b13a9080e75a4bDb324',\n [ChainId.BSC]: '0xF5BCE5077908a1b7370B9ae04AdC565EBd643966',\n [ChainId.BSC_TESTNET]: '0xF5BCE5077908a1b7370B9ae04AdC565EBd643966',\n [ChainId.ARBITRUM]: '0x74c764D41B77DBbb4fe771daB1939B00b146894A',\n [ChainId.AVALANCHE]: '0x0711B6026068f736bae6B213031fCE978D48E026',\n [ChainId.HECO]: '0xF5BCE5077908a1b7370B9ae04AdC565EBd643966',\n [ChainId.CELO]: '0x0711B6026068f736bae6B213031fCE978D48E026',\n [ChainId.HARMONY]: '0xA28cfF72b04f83A7E3f912e6ad34d5537708a2C2',\n}\n\nexport const KASHI_ADDRESS: AddressMap = {\n [ChainId.MAINNET]: '0x2cBA6Ab6574646Badc84F0544d05059e57a5dc42',\n [ChainId.KOVAN]: '0x2cBA6Ab6574646Badc84F0544d05059e57a5dc42',\n [ChainId.MATIC]: '0xB527C5295c4Bc348cBb3a2E96B2494fD292075a7',\n [ChainId.XDAI]: '0x7a6DA9903d0a481F40b8336c1463487BC8C0407e',\n [ChainId.BSC]: '0x2cBA6Ab6574646Badc84F0544d05059e57a5dc42',\n [ChainId.ARBITRUM]: '0xa010eE0226cd071BeBd8919A1F675cAE1f1f5D3e',\n [ChainId.AVALANCHE]: '0x513037395FA0C9c35E41f89189ceDfE3bD42fAdb',\n [ChainId.AVALANCHE_TESTNET]: '',\n [ChainId.HECO]: '0x2cBA6Ab6574646Badc84F0544d05059e57a5dc42',\n}\n\nexport const SUSHISWAP_SWAPPER_ADDRESS: AddressMap = {\n [ChainId.MAINNET]: '0x1766733112408b95239aD1951925567CB1203084',\n [ChainId.MATIC]: '0xe9589382130Ded5DF2397E2fD7A3E9b41DD2701D',\n [ChainId.XDAI]: '0xE02BDb31C353CE95A1D74F81C93eEa70Bf7371B9',\n [ChainId.BSC]: '0x1766733112408b95239aD1951925567CB1203084',\n [ChainId.ARBITRUM]: '0x0bFcD5dD76218bF9e3BE8A1055f9e6D27E5745eb',\n [ChainId.AVALANCHE]: '0x062eee8B38ab5E8ee3bc58CE505939db53E63785',\n [ChainId.HECO]: '0x1766733112408b95239aD1951925567CB1203084',\n}\n\nexport const SUSHISWAP_MULTISWAPPER_ADDRESS: AddressMap = {\n [ChainId.MAINNET]: '0x545820d5Cc05248da112419fEfb18522c63C8e12',\n [ChainId.KOVAN]: '0xc0c1649b2c67f1a9f5ff1dd618188165e2555bcf',\n [ChainId.MATIC]: '0x73BE093B84c773fe8eE0f76DDc0829E45c215415',\n [ChainId.XDAI]: '0x735f0FbEb3b6389986BcaAf073Af07D2F8be2b93',\n [ChainId.BSC]: '0x86c655cAc122e9A2fd9Ae1f79Df27b30E357968c',\n [ChainId.ARBITRUM]: '0xbe7D5968296843756109D42946D01195320922EF',\n [ChainId.AVALANCHE]: '0xB7C8b5BFcd7212f034Be42a2aAb08b8773B76920',\n}\n\nexport const SUSHISWAP_MULTI_EXACT_SWAPPER_ADDRESS: AddressMap = {\n [ChainId.MAINNET]: '0xB527C5295c4Bc348cBb3a2E96B2494fD292075a7',\n [ChainId.KOVAN]: '0x75AE0Aa596D39b20addC921DeB5EE3c96279dABE',\n [ChainId.MATIC]: '0xDB6C4EDd9545d3b815dA85E6429B699c418886f9',\n [ChainId.XDAI]: '0x07b6e34EeCF38B02e83b6B4702699717e298967E',\n [ChainId.BSC]: '0x1B16149Edaf1EFa6ADE6aEEF33e63C6e08c9bB1B',\n [ChainId.ARBITRUM]: '0x860D841bfD1cfEf72A14B2b734005799F07dC7ED',\n [ChainId.AVALANCHE]: '0x2c46217Fae90D302d1Fb5467ADA504bC2A84f448',\n}\n\nexport const PEGGED_ORACLE_ADDRESS = '0x6cbfbB38498Df0E1e7A4506593cDB02db9001564'\n\nexport const SUSHISWAP_TWAP_0_ORACLE_ADDRESS = '0x66F03B0d30838A3fee971928627ea6F59B236065'\n\nexport const SUSHISWAP_TWAP_1_ORACLE_ADDRESS = '0x0D51b575591F8f74a2763Ade75D3CDCf6789266f'\n\nexport const CHAINLINK_ORACLE_ADDRESS: AddressMap = {\n [ChainId.MAINNET]: '0x00632CFe43d8F9f8E6cD0d39Ffa3D4fa7ec73CFB',\n [ChainId.MATIC]: '0x00632CFe43d8F9f8E6cD0d39Ffa3D4fa7ec73CFB',\n [ChainId.XDAI]: '0x00632CFe43d8F9f8E6cD0d39Ffa3D4fa7ec73CFB',\n [ChainId.BSC]: '0x00632CFe43d8F9f8E6cD0d39Ffa3D4fa7ec73CFB',\n [ChainId.ARBITRUM]: '0xB2B5C26B6868be10fF77e4E233fD231ceB90162a',\n [ChainId.AVALANCHE]: '0x43198B6fA5d89B88D2E072fA4841724571De5A59',\n}\n\nexport const BORING_HELPER_ADDRESS: AddressMap = {\n [ChainId.MAINNET]: '0x11Ca5375AdAfd6205E41131A4409f182677996E6',\n [ChainId.KOVAN]: '0x11Ca5375AdAfd6205E41131A4409f182677996E6',\n [ChainId.MATIC]: '0xA77a7fD5a16237B85E0FAd02C51f459D18AE93Cd',\n [ChainId.XDAI]: '0x97e4a0fb71243A83A6FbaEF7Cf73617594e4cF2F',\n [ChainId.BSC]: '0x11Ca5375AdAfd6205E41131A4409f182677996E6',\n [ChainId.ARBITRUM]: '0x9AF28d4f7Fa007686958c306BD4c8c52c2b615b8',\n [ChainId.AVALANCHE]: '0xD18cA07a599bf5eBb9B7327871ad682F0b660748',\n [ChainId.HECO]: '0x11Ca5375AdAfd6205E41131A4409f182677996E6',\n}\n\nexport const STOP_LIMIT_ORDER_ADDRESS: AddressMap = {\n [ChainId.KOVAN]: '0xce9365dB1C99897f04B3923C03ba9a5f80E8DB87',\n [ChainId.MATIC]: '0x1aDb3Bd86bb01797667eC382a0BC6A9854b4005f',\n [ChainId.AVALANCHE]: '0xf6f9c9DB78AF5791A296c4bF34d59E0236E990E0',\n}\n\nexport const ARCHER_ROUTER_ADDRESS: AddressMap = {\n [ChainId.MAINNET]: '0x9917C083FF9FbD29Df1367FBF7F2388A9a202431',\n}\n\nexport const MINICHEF_ADDRESS: AddressMap = {\n [ChainId.MATIC]: '0x0769fd68dFb93167989C6f7254cd0D766Fb2841F',\n [ChainId.XDAI]: '0xdDCbf776dF3dE60163066A5ddDF2277cB445E0F3',\n [ChainId.HARMONY]: '0x67dA5f2FfaDDfF067AB9d5F025F8810634d84287',\n [ChainId.ARBITRUM]: '0xF4d73326C13a4Fc5FD7A064217e12780e9Bd62c3',\n [ChainId.CELO]: '0x8084936982D089130e001b470eDf58faCA445008',\n [ChainId.MOONRIVER]: '0x3dB01570D97631f69bbb0ba39796865456Cf89A5',\n [ChainId.FUSE]: '0x182CD0C6F1FaEc0aED2eA83cd0e160c8Bd4cb063',\n}\n\nexport const OLD_FARMS: AddressMap = {\n [ChainId.CELO]: '0x0769fd68dFb93167989C6f7254cd0D766Fb2841F',\n}\n\nexport const WETH9_ADDRESS: AddressMap = {\n [ChainId.MAINNET]: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',\n [ChainId.ROPSTEN]: '0xc778417E063141139Fce010982780140Aa0cD5Ab',\n [ChainId.RINKEBY]: '0xc778417E063141139Fce010982780140Aa0cD5Ab',\n [ChainId.GÖRLI]: '0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6',\n [ChainId.KOVAN]: '0xd0A1E359811322d97991E03f863a0C30C2cF029C',\n [ChainId.ARBITRUM]: '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1',\n [ChainId.ARBITRUM_TESTNET]: '0xf8456e5e6A225C2C1D74D8C9a4cB2B1d5dc1153b',\n [ChainId.BSC]: '0x2170Ed0880ac9A755fd29B2688956BD959F933F8',\n [ChainId.FANTOM]: '0x74b23882a30290451A17c44f4F05243b6b58C76d',\n [ChainId.MATIC]: '0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619',\n [ChainId.OKEX]: '0x2170Ed0880ac9A755fd29B2688956BD959F933F8',\n [ChainId.HECO]: '0x64FF637fB478863B7468bc97D30a5bF3A428a1fD',\n [ChainId.HARMONY]: '0x6983D1E6DEf3690C4d616b13597A09e6193EA013',\n [ChainId.XDAI]: '0x6A023CCd1ff6F2045C3309768eAd9E68F978f6e1',\n [ChainId.AVALANCHE]: '0xf20d962a6c8f70c731bd838a3a388D7d48fA6e15',\n [ChainId.CELO]: '0x122013fd7dF1C6F636a5bb8f03108E876548b455',\n}\n\nexport const WNATIVE_ADDRESS: AddressMap = {\n [ChainId.MAINNET]: WETH9_ADDRESS[ChainId.MAINNET],\n [ChainId.ROPSTEN]: WETH9_ADDRESS[ChainId.ROPSTEN],\n [ChainId.RINKEBY]: WETH9_ADDRESS[ChainId.RINKEBY],\n [ChainId.GÖRLI]: WETH9_ADDRESS[ChainId.GÖRLI],\n [ChainId.KOVAN]: WETH9_ADDRESS[ChainId.KOVAN],\n [ChainId.ARBITRUM]: WETH9_ADDRESS[ChainId.ARBITRUM],\n [ChainId.ARBITRUM_TESTNET]: WETH9_ADDRESS[ChainId.ARBITRUM_TESTNET],\n [ChainId.FANTOM]: '0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83',\n [ChainId.FANTOM_TESTNET]: '0xf1277d1Ed8AD466beddF92ef448A132661956621',\n [ChainId.MATIC]: '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270',\n [ChainId.MATIC_TESTNET]: '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270',\n [ChainId.XDAI]: '0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d',\n [ChainId.BSC]: '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c',\n [ChainId.BSC_TESTNET]: '0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd',\n [ChainId.MOONBEAM_TESTNET]: '0xe73763DB808ecCDC0E36bC8E32510ED126910394',\n [ChainId.AVALANCHE]: '0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7',\n [ChainId.AVALANCHE_TESTNET]: '0xd00ae08403B9bbb9124bB305C09058E32C39A48c',\n [ChainId.HECO]: '0x5545153CCFcA01fbd7Dd11C0b23ba694D9509A6F',\n [ChainId.HECO_TESTNET]: '0x5B2DA6F42CA09C77D577a12BeaD0446148830687',\n [ChainId.HARMONY]: '0xcF664087a5bB0237a0BAd6742852ec6c8d69A27a',\n [ChainId.HARMONY_TESTNET]: '0x7a2afac38517d512E55C0bCe3b6805c10a04D60F',\n [ChainId.OKEX]: '0x8F8526dbfd6E38E3D8307702cA8469Bae6C56C15',\n [ChainId.OKEX_TESTNET]: '0x2219845942d28716c0F7C605765fABDcA1a7d9E0',\n [ChainId.CELO]: '0x471EcE3750Da237f93B8E339c536989b8978a438',\n [ChainId.PALM]: '0xF98cABF0a963452C5536330408B2590567611a71',\n [ChainId.MOONRIVER]: '0xf50225a84382c74CbdeA10b0c176f71fc3DE0C4d',\n [ChainId.FUSE]: '0x0BE9e53fd7EDaC9F859882AfdDa116645287C629',\n [ChainId.TELOS]: '0xD102cE6A4dB07D247fcc28F366A623Df0938CA9E',\n}\n\nexport const MASTERCHEF_V2_ADDRESS: AddressMap = {\n [ChainId.MAINNET]: '0xEF0881eC094552b2e128Cf945EF17a6752B4Ec5d',\n}\n\nexport const ENS_REGISTRAR_ADDRESS: AddressMap = {\n [ChainId.MAINNET]: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',\n [ChainId.GÖRLI]: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',\n [ChainId.ROPSTEN]: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',\n [ChainId.RINKEBY]: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',\n}\n\nexport const ZAPPER_ADDRESS: AddressMap = {\n [ChainId.MAINNET]: '0xcff6eF0B9916682B37D80c19cFF8949bc1886bC2',\n [ChainId.ROPSTEN]: '0xcff6eF0B9916682B37D80c19cFF8949bc1886bC2',\n}\n\nexport const MERKLE_DISTRIBUTOR_ADDRESS: AddressMap = {\n [ChainId.MAINNET]: '0xcBE6B83e77cdc011Cc18F6f0Df8444E5783ed982',\n [ChainId.ROPSTEN]: '0x84d1f7202e0e7dac211617017ca72a2cb5e2b955',\n}\n\nexport const MULTICALL2_ADDRESS: AddressMap = {\n [ChainId.MAINNET]: '0x5BA1e12693Dc8F9c48aAD8770482f4739bEeD696',\n [ChainId.ROPSTEN]: '0x5BA1e12693Dc8F9c48aAD8770482f4739bEeD696',\n [ChainId.RINKEBY]: '0x5BA1e12693Dc8F9c48aAD8770482f4739bEeD696',\n [ChainId.GÖRLI]: '0x5BA1e12693Dc8F9c48aAD8770482f4739bEeD696',\n [ChainId.KOVAN]: '0x5BA1e12693Dc8F9c48aAD8770482f4739bEeD696',\n [ChainId.ARBITRUM]: '0x80C7DD17B01855a6D2347444a0FCC36136a314de',\n [ChainId.ARBITRUM_TESTNET]: '0xa501c031958F579dB7676fF1CE78AD305794d579',\n [ChainId.CELO]: '0x9aac9048fC8139667D6a2597B902865bfdc225d3',\n [ChainId.FANTOM]: '0x22D4cF72C45F8198CfbF4B568dBdB5A85e8DC0B5',\n [ChainId.MATIC]: '0x02817C1e3543c2d908a590F5dB6bc97f933dB4BD',\n [ChainId.MATIC_TESTNET]: '0xc1400d49baa8e307B4462cD46E0a20109D25F50f',\n [ChainId.XDAI]: '0x67dA5f2FfaDDfF067AB9d5F025F8810634d84287',\n [ChainId.BSC]: '0xa9193376D09C7f31283C54e56D013fCF370Cd9D9',\n [ChainId.AVALANCHE]: '0xdDCbf776dF3dE60163066A5ddDF2277cB445E0F3',\n [ChainId.HECO]: '0xdDCbf776dF3dE60163066A5ddDF2277cB445E0F3',\n [ChainId.HARMONY]: '0xdDCbf776dF3dE60163066A5ddDF2277cB445E0F3',\n [ChainId.OKEX]: '0xF4d73326C13a4Fc5FD7A064217e12780e9Bd62c3',\n [ChainId.PALM]: '0x0769fd68dFb93167989C6f7254cd0D766Fb2841F',\n [ChainId.MOONRIVER]: '0x270f2F35bED92B7A59eA5F08F6B3fd34c8D9D9b5',\n [ChainId.FUSE]: '0x0769fd68dFb93167989C6f7254cd0D766Fb2841F',\n [ChainId.TELOS]: '0xdDCbf776dF3dE60163066A5ddDF2277cB445E0F3',\n}\n","import { BigNumber } from '@ethersproject/bignumber'\n\n// Functions that need accrue to be called\nexport const ACTION_ADD_ASSET = 1\nexport const ACTION_REPAY = 2\nexport const ACTION_REMOVE_ASSET = 3\nexport const ACTION_REMOVE_COLLATERAL = 4\nexport const ACTION_BORROW = 5\nexport const ACTION_GET_REPAY_SHARE = 6\nexport const ACTION_GET_REPAY_PART = 7\nexport const ACTION_ACCRUE = 8\n\n// Functions that don't need accrue to be called\nexport const ACTION_ADD_COLLATERAL = 10\nexport const ACTION_UPDATE_EXCHANGE_RATE = 11\n\n// Function on BentoBox\nexport const ACTION_BENTO_DEPOSIT = 20\nexport const ACTION_BENTO_WITHDRAW = 21\nexport const ACTION_BENTO_TRANSFER = 22\nexport const ACTION_BENTO_TRANSFER_MULTIPLE = 23\nexport const ACTION_BENTO_SETAPPROVAL = 24\n\n// Any external call (except to BentoBox)\nexport const ACTION_CALL = 30\n\nexport const MINIMUM_TARGET_UTILIZATION = BigNumber.from('700000000000000000') // 70%\n\nexport const MAXIMUM_TARGET_UTILIZATION = BigNumber.from('800000000000000000') // 80%\n\nexport const UTILIZATION_PRECISION = BigNumber.from('1000000000000000000')\n\nexport const FULL_UTILIZATION = BigNumber.from('1000000000000000000')\n\nexport const FULL_UTILIZATION_MINUS_MAX = FULL_UTILIZATION.sub(MAXIMUM_TARGET_UTILIZATION)\n\nexport const STARTING_INTEREST_PER_YEAR = BigNumber.from(317097920)\n .mul(BigNumber.from(60))\n .mul(BigNumber.from(60))\n .mul(BigNumber.from(24))\n .mul(BigNumber.from(365)) // approx 1% APR\n\nexport const MINIMUM_INTEREST_PER_YEAR = BigNumber.from(79274480)\n .mul(BigNumber.from(60))\n .mul(BigNumber.from(60))\n .mul(BigNumber.from(24))\n .mul(BigNumber.from(365)) // approx 0.25% APR\n\nexport const MAXIMUM_INTEREST_PER_YEAR = BigNumber.from(317097920000)\n .mul(BigNumber.from(60))\n .mul(BigNumber.from(60))\n .mul(BigNumber.from(24))\n .mul(BigNumber.from(365)) // approx 1000% APR\n\nexport const INTEREST_ELASTICITY = BigNumber.from('28800000000000000000000000000000000000000') // Half or double in 28800 seconds (8 hours) if linear\n\nexport const FACTOR_PRECISION = BigNumber.from('1000000000000000000')\n\nexport const PROTOCOL_FEE = BigNumber.from('10000') // 10%\n\nexport const PROTOCOL_FEE_DIVISOR = BigNumber.from('100000')\n","import { Currency } from './Currency'\nimport { Token } from './Token'\nimport invariant from 'tiny-invariant'\n\n/**\n * A currency is any fungible financial instrument, including Ether, all ERC20 tokens, and other chain-native currencies\n */\nexport abstract class AbstractCurrency {\n /**\n * Returns whether the currency is native to the chain and must be wrapped (e.g. Ether)\n */\n public abstract readonly isNative: boolean\n /**\n * Returns whether the currency is a token that is usable in Uniswap without wrapping\n */\n public abstract readonly isToken: boolean\n\n /**\n * The chain ID on which this currency resides\n */\n public readonly chainId: number\n /**\n * The decimals used in representing currency amounts\n */\n public readonly decimals: number\n /**\n * The symbol of the currency, i.e. a short textual non-unique identifier\n */\n public readonly symbol?: string\n /**\n * The name of the currency, i.e. a descriptive textual non-unique identifier\n */\n public readonly name?: string\n\n /**\n * Constructs an instance of the base class `BaseCurrency`.\n * @param chainId the chain ID on which this currency resides\n * @param decimals decimals of the currency\n * @param symbol symbol of the currency\n * @param name of the currency\n */\n protected constructor(chainId: number, decimals: number, symbol?: string, name?: string) {\n invariant(Number.isSafeInteger(chainId), 'CHAIN_ID')\n invariant(decimals >= 0 && decimals < 255 && Number.isInteger(decimals), 'DECIMALS')\n\n this.chainId = chainId\n this.decimals = decimals\n this.symbol = symbol\n this.name = name\n }\n\n /**\n * Returns whether this currency is functionally equivalent to the other currency\n * @param other the other currency\n */\n public abstract equals(other: Currency): boolean\n\n /**\n * Return the wrapped version of this currency that can be used with the Uniswap contracts. Currencies must\n * implement this to be used in Uniswap\n */\n public abstract get wrapped(): Token\n\n /**\n * Returns token address. Useful in cases where a dependency is needed to detect changes (e.g. useEffect).\n */\n public serialize(): string {\n return this.wrapped.address\n }\n}\n","import { AbstractCurrency } from './AbstractCurrency'\n\n/**\n * Represents the native currency of the chain on which it resides, e.g.\n */\nexport abstract class NativeCurrency extends AbstractCurrency {\n public readonly isNative: true = true\n public readonly isToken: false = false\n}\n","import { getAddress } from '@ethersproject/address'\nimport invariant from 'tiny-invariant'\nimport warning from 'tiny-warning'\n\n// warns if addresses are not checksummed\nexport function validateAndParseAddress(address: string): string {\n try {\n const checksummedAddress = getAddress(address)\n warning(address === checksummedAddress, `${address} is not checksummed.`)\n return checksummedAddress\n } catch (error) {\n invariant(false, `${address} is not a valid address.`)\n }\n}\n","import { AbstractCurrency } from './AbstractCurrency'\nimport { ChainId } from '../enums'\nimport { Currency } from './Currency'\nimport invariant from 'tiny-invariant'\nimport { validateAndParseAddress } from '../functions/validateAndParseAddress'\n\n/**\n * Represents an ERC20 token with a unique address and some metadata.\n */\nexport class Token extends AbstractCurrency {\n public readonly chainId: ChainId\n public readonly address: string\n\n public readonly isNative: false = false\n public readonly isToken: true = true\n\n public constructor(chainId: ChainId, address: string, decimals: number, symbol?: string, name?: string) {\n super(chainId, decimals, symbol, name)\n this.chainId = chainId\n this.address = validateAndParseAddress(address)\n }\n\n /**\n * Returns true if the two tokens are equivalent, i.e. have the same chainId and address.\n * @param other other token to compare\n */\n public equals(other: Currency): boolean {\n return other.isToken && this.chainId === other.chainId && this.address === other.address\n }\n\n /**\n * Returns true if the address of this token sorts before the address of the other token\n * @param other other token to compare\n * @throws if the tokens have the same address\n * @throws if the tokens are on different chains\n */\n public sortsBefore(other: Token): boolean {\n invariant(this.chainId === other.chainId, 'CHAIN_IDS')\n invariant(this.address !== other.address, 'ADDRESSES')\n return this.address.toLowerCase() < other.address.toLowerCase()\n }\n\n /**\n * Return this token, which does not need to be wrapped\n */\n public get wrapped(): Token {\n return this\n }\n}\n\n/**\n * Compares two currencies for equality\n */\nexport function currencyEquals(currencyA: Currency, currencyB: Currency): boolean {\n if (currencyA instanceof Token && currencyB instanceof Token) {\n return currencyA.equals(currencyB)\n } else if (currencyA instanceof Token) {\n return false\n } else if (currencyB instanceof Token) {\n return false\n } else {\n return currencyA === currencyB\n }\n}\n","import { USDC_ADDRESS, USD_ADDRESS, WETH9_ADDRESS, WNATIVE_ADDRESS } from './addresses'\n\nimport { ChainId } from '../enums'\nimport { Token } from '../entities/Token'\nimport { TokenMap } from '../types/TokenMap'\n\nexport const USDC: TokenMap = {\n [ChainId.MAINNET]: new Token(ChainId.MAINNET, USDC_ADDRESS[ChainId.MAINNET], 6, 'USDC', 'USD Coin'),\n [ChainId.ROPSTEN]: new Token(ChainId.ROPSTEN, USDC_ADDRESS[ChainId.ROPSTEN], 6, 'USDC', 'USD Coin'),\n [ChainId.KOVAN]: new Token(ChainId.KOVAN, USDC_ADDRESS[ChainId.KOVAN], 6, 'USDC', 'USD Coin'),\n [ChainId.MATIC]: new Token(ChainId.MATIC, USDC_ADDRESS[ChainId.MATIC], 6, 'USDC', 'USD Coin'),\n [ChainId.FANTOM]: new Token(ChainId.FANTOM, USDC_ADDRESS[ChainId.FANTOM], 6, 'USDC', 'USD Coin'),\n [ChainId.BSC]: new Token(ChainId.BSC, USDC_ADDRESS[ChainId.BSC], 18, 'USDC', 'USD Coin'),\n [ChainId.HARMONY]: new Token(ChainId.HARMONY, USDC_ADDRESS[ChainId.HARMONY], 6, 'USDC', 'USD Coin'),\n [ChainId.HECO]: new Token(ChainId.HECO, USDC_ADDRESS[ChainId.HECO], 6, 'USDC', 'USD Coin'),\n [ChainId.OKEX]: new Token(ChainId.OKEX, USDC_ADDRESS[ChainId.OKEX], 18, 'USDC', 'USD Coin'),\n [ChainId.XDAI]: new Token(ChainId.XDAI, USDC_ADDRESS[ChainId.XDAI], 6, 'USDC', 'USD Coin'),\n [ChainId.ARBITRUM]: new Token(ChainId.ARBITRUM, USDC_ADDRESS[ChainId.ARBITRUM], 6, 'USDC', 'USD Coin'),\n [ChainId.MOONRIVER]: new Token(ChainId.MOONRIVER, USDC_ADDRESS[ChainId.MOONRIVER], 6, 'USDC', 'USD Coin'),\n [ChainId.FUSE]: new Token(ChainId.FUSE, USDC_ADDRESS[ChainId.FUSE], 6, 'USDC', 'USD Coin'),\n}\n\nexport const USD: TokenMap = {\n ...USDC,\n [ChainId.CELO]: new Token(ChainId.CELO, USD_ADDRESS[ChainId.CELO], 18, 'cUSD', 'Celo Dollar'),\n}\n\nexport const WETH9: TokenMap = {\n [ChainId.MAINNET]: new Token(ChainId.MAINNET, WETH9_ADDRESS[ChainId.MAINNET], 18, 'WETH', 'Wrapped Ether'),\n [ChainId.ROPSTEN]: new Token(ChainId.ROPSTEN, WETH9_ADDRESS[ChainId.ROPSTEN], 18, 'WETH', 'Wrapped Ether'),\n [ChainId.RINKEBY]: new Token(ChainId.RINKEBY, WETH9_ADDRESS[ChainId.RINKEBY], 18, 'WETH', 'Wrapped Ether'),\n [ChainId.GÖRLI]: new Token(ChainId.GÖRLI, WETH9_ADDRESS[ChainId.GÖRLI], 18, 'WETH', 'Wrapped Ether'),\n [ChainId.KOVAN]: new Token(ChainId.KOVAN, WETH9_ADDRESS[ChainId.KOVAN], 18, 'WETH', 'Wrapped Ether'),\n [ChainId.ARBITRUM]: new Token(ChainId.ARBITRUM, WETH9_ADDRESS[ChainId.ARBITRUM], 18, 'WETH', 'Wrapped Ether'),\n [ChainId.ARBITRUM_TESTNET]: new Token(\n ChainId.ARBITRUM_TESTNET,\n WETH9_ADDRESS[ChainId.ARBITRUM_TESTNET],\n 18,\n 'WETH',\n 'Wrapped Ether'\n ),\n [ChainId.BSC]: new Token(ChainId.BSC, WETH9_ADDRESS[ChainId.BSC], 18, 'WETH', 'Wrapped Ether'),\n [ChainId.FANTOM]: new Token(ChainId.FANTOM, WETH9_ADDRESS[ChainId.FANTOM], 18, 'WETH', 'Wrapped Ether'),\n [ChainId.MATIC]: new Token(ChainId.MATIC, WETH9_ADDRESS[ChainId.MATIC], 18, 'WETH', 'Wrapped Ether'),\n [ChainId.OKEX]: new Token(ChainId.OKEX, WETH9_ADDRESS[ChainId.OKEX], 18, 'WETH', 'Wrapped Ether'),\n [ChainId.HECO]: new Token(ChainId.HECO, WETH9_ADDRESS[ChainId.HECO], 18, 'WETH', 'Wrapped Ether'),\n [ChainId.HARMONY]: new Token(ChainId.HARMONY, WETH9_ADDRESS[ChainId.HARMONY], 18, 'WETH', 'Wrapped Ether'),\n [ChainId.XDAI]: new Token(ChainId.XDAI, WETH9_ADDRESS[ChainId.XDAI], 18, 'WETH', 'Wrapped Ether'),\n [ChainId.AVALANCHE]: new Token(ChainId.AVALANCHE, WETH9_ADDRESS[ChainId.AVALANCHE], 18, 'WETH', 'Wrapped Ether'),\n}\n\nexport const WNATIVE: TokenMap = {\n [ChainId.MAINNET]: WETH9[ChainId.MAINNET],\n [ChainId.ROPSTEN]: WETH9[ChainId.ROPSTEN],\n [ChainId.RINKEBY]: WETH9[ChainId.RINKEBY],\n [ChainId.GÖRLI]: WETH9[ChainId.GÖRLI],\n [ChainId.KOVAN]: WETH9[ChainId.KOVAN],\n [ChainId.FANTOM]: new Token(ChainId.FANTOM, WNATIVE_ADDRESS[ChainId.FANTOM], 18, 'WFTM', 'Wrapped FTM'),\n [ChainId.FANTOM_TESTNET]: new Token(\n ChainId.FANTOM_TESTNET,\n WNATIVE_ADDRESS[ChainId.FANTOM_TESTNET],\n 18,\n 'FTM',\n 'Wrapped FTM'\n ),\n [ChainId.MATIC]: new Token(ChainId.MATIC, WNATIVE_ADDRESS[ChainId.MATIC], 18, 'WMATIC', 'Wrapped Matic'),\n [ChainId.MATIC_TESTNET]: new Token(\n ChainId.MATIC_TESTNET,\n WNATIVE_ADDRESS[ChainId.MATIC_TESTNET],\n 18,\n 'WMATIC',\n 'Wrapped Matic'\n ),\n [ChainId.XDAI]: new Token(ChainId.XDAI, WNATIVE_ADDRESS[ChainId.XDAI], 18, 'WXDAI', 'Wrapped xDai'),\n [ChainId.BSC]: new Token(ChainId.BSC, WNATIVE_ADDRESS[ChainId.BSC], 18, 'WBNB', 'Wrapped BNB'),\n [ChainId.BSC_TESTNET]: new Token(\n ChainId.BSC_TESTNET,\n WNATIVE_ADDRESS[ChainId.BSC_TESTNET],\n 18,\n 'WBNB',\n 'Wrapped BNB'\n ),\n [ChainId.ARBITRUM]: WETH9[ChainId.ARBITRUM],\n [ChainId.ARBITRUM_TESTNET]: WETH9[ChainId.ARBITRUM_TESTNET],\n [ChainId.MOONBEAM_TESTNET]: new Token(\n ChainId.MOONBEAM_TESTNET,\n WNATIVE_ADDRESS[ChainId.MOONBEAM_TESTNET],\n 18,\n 'WETH',\n 'Wrapped Ether'\n ),\n [ChainId.AVALANCHE]: new Token(ChainId.AVALANCHE, WNATIVE_ADDRESS[ChainId.AVALANCHE], 18, 'WAVAX', 'Wrapped AVAX'),\n [ChainId.AVALANCHE_TESTNET]: new Token(\n ChainId.AVALANCHE_TESTNET,\n WNATIVE_ADDRESS[ChainId.AVALANCHE_TESTNET],\n 18,\n 'WAVAX',\n 'Wrapped AVAX'\n ),\n [ChainId.HECO]: new Token(ChainId.HECO, WNATIVE_ADDRESS[ChainId.HECO], 18, 'WHT', 'Wrapped HT'),\n [ChainId.HECO_TESTNET]: new Token(\n ChainId.HECO_TESTNET,\n WNATIVE_ADDRESS[ChainId.HECO_TESTNET],\n 18,\n 'WHT',\n 'Wrapped HT'\n ),\n [ChainId.HARMONY]: new Token(ChainId.HARMONY, WNATIVE_ADDRESS[ChainId.HARMONY], 18, 'WONE', 'Wrapped ONE'),\n [ChainId.HARMONY_TESTNET]: new Token(\n ChainId.HARMONY_TESTNET,\n WNATIVE_ADDRESS[ChainId.HARMONY_TESTNET],\n 18,\n 'WONE',\n 'Wrapped ONE'\n ),\n [ChainId.OKEX]: new Token(ChainId.OKEX, WNATIVE_ADDRESS[ChainId.OKEX], 18, 'WOKT', 'Wrapped OKExChain'),\n [ChainId.OKEX_TESTNET]: new Token(\n ChainId.OKEX_TESTNET,\n WNATIVE_ADDRESS[ChainId.OKEX_TESTNET],\n 18,\n 'WOKT',\n 'Wrapped OKExChain'\n ),\n [ChainId.CELO]: new Token(ChainId.CELO, WNATIVE_ADDRESS[ChainId.CELO], 18, 'CELO', 'Celo'),\n [ChainId.PALM]: new Token(ChainId.PALM, WNATIVE_ADDRESS[ChainId.PALM], 18, 'WPALM', 'Wrapped Palm'),\n [ChainId.MOONRIVER]: new Token(\n ChainId.MOONRIVER,\n WNATIVE_ADDRESS[ChainId.MOONRIVER],\n 18,\n 'WMOVR',\n 'Wrapped Moonriver'\n ),\n [ChainId.FUSE]: new Token(ChainId.FUSE, WNATIVE_ADDRESS[ChainId.FUSE], 18, 'WFUSE', 'Wrapped Fuse'),\n [ChainId.TELOS]: new Token(ChainId.TELOS, WNATIVE_ADDRESS[ChainId.TELOS], 18, 'WTLOS', 'Wrapped Telos'),\n}\n","import { Currency } from '../Currency'\nimport { NativeCurrency } from '../NativeCurrency'\nimport { Token } from '../Token'\nimport { WNATIVE } from '../../constants/tokens'\nimport invariant from 'tiny-invariant'\n\nexport class Avalanche extends NativeCurrency {\n protected constructor(chainId: number) {\n super(chainId, 18, 'AVAX', 'Avalanche')\n }\n\n public get wrapped(): Token {\n const wnative = WNATIVE[this.chainId]\n invariant(!!wnative, 'WRAPPED')\n return wnative\n }\n\n private static _cache: { [chainId: number]: Avalanche } = {}\n\n public static onChain(chainId: number): Avalanche {\n return this._cache[chainId] ?? (this._cache[chainId] = new Avalanche(chainId))\n }\n\n public equals(other: Currency): boolean {\n return other.isNative && other.chainId === this.chainId\n }\n}\n","import { Currency } from '../Currency'\nimport { NativeCurrency } from '../NativeCurrency'\nimport { Token } from '../Token'\nimport { WNATIVE } from '../../constants/tokens'\nimport invariant from 'tiny-invariant'\n\nexport class Binance extends NativeCurrency {\n protected constructor(chainId: number) {\n super(chainId, 18, 'BNB', 'Binance Coin')\n }\n\n public get wrapped(): Token {\n const wnative = WNATIVE[this.chainId]\n invariant(!!wnative, 'WRAPPED')\n return wnative\n }\n\n private static _cache: { [chainId: number]: Binance } = {}\n\n public static onChain(chainId: number): Binance {\n return this._cache[chainId] ?? (this._cache[chainId] = new Binance(chainId))\n }\n\n public equals(other: Currency): boolean {\n return other.isNative && other.chainId === this.chainId\n }\n}\n","import { Currency } from '../Currency'\nimport { NativeCurrency } from '../NativeCurrency'\nimport { Token } from '../Token'\nimport { WNATIVE } from '../../constants/tokens'\nimport invariant from 'tiny-invariant'\n\nexport class Celo extends NativeCurrency {\n protected constructor(chainId: number) {\n super(chainId, 18, 'CELO', 'Celo')\n }\n\n public get wrapped(): Token {\n const wcelo = WNATIVE[this.chainId]\n invariant(!!wcelo, 'WRAPPED')\n return wcelo\n }\n\n private static _cache: { [chainId: number]: Celo } = {}\n\n public static onChain(chainId: number): Celo {\n return this._cache[chainId] ?? (this._cache[chainId] = new Celo(chainId))\n }\n\n public equals(other: Currency): boolean {\n return other.isNative && other.chainId === this.chainId\n }\n}\n","import { Currency } from '../Currency'\nimport { NativeCurrency } from '../NativeCurrency'\nimport { Token } from '../Token'\nimport { WETH9 } from '../../constants/tokens'\nimport invariant from 'tiny-invariant'\n\n/**\n * Ether is the main usage of a 'native' currency, i.e. for Ethereum mainnet and all testnets\n */\nexport class Ether extends NativeCurrency {\n protected constructor(chainId: number) {\n super(chainId, 18, 'ETH', 'Ether')\n }\n\n public get wrapped(): Token {\n const weth9 = WETH9[this.chainId]\n invariant(!!weth9, 'WRAPPED')\n return weth9\n }\n\n private static _etherCache: { [chainId: number]: Ether } = {}\n\n public static onChain(chainId: number): Ether {\n return this._etherCache[chainId] ?? (this._etherCache[chainId] = new Ether(chainId))\n }\n\n public equals(other: Currency): boolean {\n return other.isNative && other.chainId === this.chainId\n }\n}\n","import { Currency } from '../Currency'\nimport { NativeCurrency } from '../NativeCurrency'\nimport { Token } from '../Token'\nimport { WNATIVE } from '../../constants/tokens'\nimport invariant from 'tiny-invariant'\n\nexport class Fantom extends NativeCurrency {\n protected constructor(chainId: number) {\n super(chainId, 18, 'FTM', 'Fantom')\n }\n\n public get wrapped(): Token {\n const wnative = WNATIVE[this.chainId]\n invariant(!!wnative, 'WRAPPED')\n return wnative\n }\n\n private static _cache: { [chainId: number]: Fantom } = {}\n\n public static onChain(chainId: number): Fantom {\n return this._cache[chainId] ?? (this._cache[chainId] = new Fantom(chainId))\n }\n\n public equals(other: Currency): boolean {\n return other.isNative && other.chainId === this.chainId\n }\n}\n","import { Currency } from '../Currency'\nimport { NativeCurrency } from '../NativeCurrency'\nimport { Token } from '../Token'\nimport { WNATIVE } from '../../constants/tokens'\nimport invariant from 'tiny-invariant'\n\nexport class Harmony extends NativeCurrency {\n protected constructor(chainId: number) {\n super(chainId, 18, 'ONE', 'Harmony')\n }\n\n public get wrapped(): Token {\n const wnative = WNATIVE[this.chainId]\n invariant(!!wnative, 'WRAPPED')\n return wnative\n }\n\n private static _cache: { [chainId: number]: Harmony } = {}\n\n public static onChain(chainId: number): Harmony {\n return this._cache[chainId] ?? (this._cache[chainId] = new Harmony(chainId))\n }\n\n public equals(other: Currency): boolean {\n return other.isNative && other.chainId === this.chainId\n }\n}\n","import { Currency } from '../Currency'\nimport { NativeCurrency } from '../NativeCurrency'\nimport { Token } from '../Token'\nimport { WNATIVE } from '../../constants/tokens'\nimport invariant from 'tiny-invariant'\n\nexport class Heco extends NativeCurrency {\n protected constructor(chainId: number) {\n super(chainId, 18, 'HT', 'Huobi Token')\n }\n\n public get wrapped(): Token {\n const wnative = WNATIVE[this.chainId]\n invariant(!!wnative, 'WRAPPED')\n return wnative\n }\n\n private static _cache: { [chainId: number]: Heco } = {}\n\n public static onChain(chainId: number): Heco {\n return this._cache[chainId] ?? (this._cache[chainId] = new Heco(chainId))\n }\n\n public equals(other: Currency): boolean {\n return other.isNative && other.chainId === this.chainId\n }\n}\n","import { Currency } from '../Currency'\nimport { NativeCurrency } from '../NativeCurrency'\nimport { Token } from '../Token'\nimport { WNATIVE } from '../../constants/tokens'\nimport invariant from 'tiny-invariant'\n\nexport class Matic extends NativeCurrency {\n protected constructor(chainId: number) {\n super(chainId, 18, 'MATIC', 'Matic')\n }\n\n public get wrapped(): Token {\n const wnative = WNATIVE[this.chainId]\n invariant(!!wnative, 'WRAPPED')\n return wnative\n }\n\n private static _cache: { [chainId: number]: Matic } = {}\n\n public static onChain(chainId: number): Matic {\n return this._cache[chainId] ?? (this._cache[chainId] = new Matic(chainId))\n }\n\n public equals(other: Currency): boolean {\n return other.isNative && other.chainId === this.chainId\n }\n}\n","import { Currency } from '../Currency'\nimport { NativeCurrency } from '../NativeCurrency'\nimport { Token } from '../Token'\nimport { WNATIVE } from '../../constants/tokens'\nimport invariant from 'tiny-invariant'\n\nexport class Movr extends NativeCurrency {\n protected constructor(chainId: number) {\n super(chainId, 18, 'MOVR', 'Moonriver')\n }\n\n public get wrapped(): Token {\n const wnative = WNATIVE[this.chainId]\n invariant(!!wnative, 'WRAPPED')\n return wnative\n }\n\n private static _cache: { [chainId: number]: Movr } = {}\n\n public static onChain(chainId: number): Movr {\n return this._cache[chainId] ?? (this._cache[chainId] = new Movr(chainId))\n }\n\n public equals(other: Currency): boolean {\n return other.isNative && other.chainId === this.chainId\n }\n}\n","import { Currency } from '../Currency'\nimport { NativeCurrency } from '../NativeCurrency'\nimport { Token } from '../Token'\nimport { WNATIVE } from '../../constants/tokens'\nimport invariant from 'tiny-invariant'\n\nexport class Okex extends NativeCurrency {\n protected constructor(chainId: number) {\n super(chainId, 18, 'OKT', 'OKExChain')\n }\n\n public get wrapped(): Token {\n const wnative = WNATIVE[this.chainId]\n invariant(!!wnative, 'WRAPPED')\n return wnative\n }\n\n private static _cache: { [chainId: number]: Okex } = {}\n\n public static onChain(chainId: number): Okex {\n return this._cache[chainId] ?? (this._cache[chainId] = new Okex(chainId))\n }\n\n public equals(other: Currency): boolean {\n return other.isNative && other.chainId === this.chainId\n }\n}\n","import { Currency } from '../Currency'\nimport { NativeCurrency } from '../NativeCurrency'\nimport { Token } from '../Token'\nimport { WNATIVE } from '../../constants/tokens'\nimport invariant from 'tiny-invariant'\n\nexport class xDai extends NativeCurrency {\n protected constructor(chainId: number) {\n super(chainId, 18, 'XDAI', 'xDai')\n }\n\n public get wrapped(): Token {\n const wnative = WNATIVE[this.chainId]\n invariant(!!wnative, 'WRAPPED')\n return wnative\n }\n\n private static _cache: { [chainId: number]: xDai } = {}\n\n public static onChain(chainId: number): xDai {\n return this._cache[chainId] ?? (this._cache[chainId] = new xDai(chainId))\n }\n\n public equals(other: Currency): boolean {\n return other.isNative && other.chainId === this.chainId\n }\n}\n","import { Currency } from '../Currency'\nimport { NativeCurrency } from '../NativeCurrency'\nimport { Token } from '../Token'\nimport { WNATIVE } from '../../constants/tokens'\nimport invariant from 'tiny-invariant'\n\nexport class Palm extends NativeCurrency {\n protected constructor(chainId: number) {\n super(chainId, 18, 'PALM', 'Palm')\n }\n\n public get wrapped(): Token {\n const wnative = WNATIVE[this.chainId]\n invariant(!!wnative, 'WRAPPED')\n return wnative\n }\n\n private static _cache: { [chainId: number]: Palm } = {}\n\n public static onChain(chainId: number): Palm {\n return this._cache[chainId] ?? (this._cache[chainId] = new Palm(chainId))\n }\n\n public equals(other: Currency): boolean {\n return other.isNative && other.chainId === this.chainId\n }\n}\n","import { Currency } from '../Currency'\nimport { NativeCurrency } from '../NativeCurrency'\nimport { Token } from '../Token'\nimport { WNATIVE } from '../../constants/tokens'\nimport invariant from 'tiny-invariant'\n\nexport class Fuse extends NativeCurrency {\n protected constructor(chainId: number) {\n super(chainId, 18, 'FUSE', 'Fuse')\n }\n\n public get wrapped(): Token {\n const wnative = WNATIVE[this.chainId]\n invariant(!!wnative, 'WRAPPED')\n return wnative\n }\n\n private static _cache: { [chainId: number]: Fuse } = {}\n\n public static onChain(chainId: number): Fuse {\n return this._cache[chainId] ?? (this._cache[chainId] = new Fuse(chainId))\n }\n\n public equals(other: Currency): boolean {\n return other.isNative && other.chainId === this.chainId\n }\n}\n","import { Currency } from '../Currency'\nimport { NativeCurrency } from '../NativeCurrency'\nimport { Token } from '../Token'\nimport { WNATIVE } from '../../constants/tokens'\nimport invariant from 'tiny-invariant'\n\nexport class Telos extends NativeCurrency {\n protected constructor(chainId: number) {\n super(chainId, 18, 'TLOS', 'Telos')\n }\n\n public get wrapped(): Token {\n const wnative = WNATIVE[this.chainId]\n invariant(!!wnative, 'WRAPPED')\n return wnative\n }\n\n private static _cache: { [chainId: number]: Telos } = {}\n\n public static onChain(chainId: number): Telos {\n return this._cache[chainId] ?? (this._cache[chainId] = new Telos(chainId))\n }\n\n public equals(other: Currency): boolean {\n return other.isNative && other.chainId === this.chainId\n }\n}\n","import { ChainId } from '../enums'\nimport JSBI from 'jsbi'\n\nexport * from './addresses'\nexport * from './kashi'\nexport * from './natives'\nexport * from './numbers'\nexport * from './tokens'\n\n// export const INIT_CODE_HASH: string = '0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303'\n\n// TODO: Lots of redudency here... let's fix this.\nexport const INIT_CODE_HASH: { [chainId: number]: string } = {\n [ChainId.MAINNET]: '0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303',\n [ChainId.ROPSTEN]: '0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303',\n [ChainId.RINKEBY]: '0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303',\n [ChainId.GÖRLI]: '0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303',\n [ChainId.KOVAN]: '0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303',\n [ChainId.FANTOM]: '0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303',\n [ChainId.MATIC]: '0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303',\n [ChainId.MATIC_TESTNET]: '0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303',\n [ChainId.XDAI]: '0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303',\n [ChainId.BSC]: '0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303',\n [ChainId.BSC_TESTNET]: '0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303',\n [ChainId.ARBITRUM]: '0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303',\n [ChainId.MOONBEAM_TESTNET]: '0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303',\n [ChainId.AVALANCHE]: '0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303',\n [ChainId.AVALANCHE_TESTNET]: '0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303',\n [ChainId.HECO]: '0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303',\n [ChainId.HECO_TESTNET]: '0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303',\n [ChainId.HARMONY]: '0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303',\n [ChainId.HARMONY_TESTNET]: '0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303',\n [ChainId.OKEX]: '0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303',\n [ChainId.OKEX_TESTNET]: '0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303',\n [ChainId.CELO]: '0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303',\n [ChainId.PALM]: '0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303',\n [ChainId.MOONRIVER]: '0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303',\n [ChainId.FUSE]: '0x1901958ef8b470f2c0a3875a79ee0bd303866d85102c0f1ea820d317024d50b5',\n [ChainId.TELOS]: '0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303',\n}\n\nexport const MINIMUM_LIQUIDITY = JSBI.BigInt(1000)\n\nexport enum SolidityType {\n uint8 = 'uint8',\n uint256 = 'uint256',\n}\n\nexport const SOLIDITY_TYPE_MAXIMA = {\n [SolidityType.uint8]: JSBI.BigInt('0xff'),\n [SolidityType.uint256]: JSBI.BigInt('0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'),\n}\n\nexport const LAMBDA_URL = 'https://9epjsvomc4.execute-api.us-east-1.amazonaws.com/dev'\n\nexport const SOCKET_URL = 'wss://hfimt374ge.execute-api.us-east-1.amazonaws.com/dev'\n","import {\n Avalanche,\n Binance,\n Celo,\n Ether,\n Fantom,\n Fuse,\n Harmony,\n Heco,\n Matic,\n Movr,\n Okex,\n Palm,\n xDai,\n Telos,\n} from '../entities/Native'\n\nimport { ChainId } from '../enums'\n\nexport const NATIVE = {\n [ChainId.MAINNET]: Ether.onChain(ChainId.MAINNET),\n [ChainId.ROPSTEN]: Ether.onChain(ChainId.ROPSTEN),\n [ChainId.RINKEBY]: Ether.onChain(ChainId.RINKEBY),\n [ChainId.GÖRLI]: Ether.onChain(ChainId.GÖRLI),\n [ChainId.KOVAN]: Ether.onChain(ChainId.KOVAN),\n [ChainId.FANTOM]: Fantom.onChain(ChainId.FANTOM),\n [ChainId.FANTOM_TESTNET]: Fantom.onChain(ChainId.FANTOM_TESTNET),\n [ChainId.MATIC]: Matic.onChain(ChainId.MATIC),\n [ChainId.MATIC_TESTNET]: Matic.onChain(ChainId.MATIC_TESTNET),\n [ChainId.XDAI]: xDai.onChain(ChainId.XDAI),\n [ChainId.BSC]: Binance.onChain(ChainId.BSC),\n [ChainId.BSC_TESTNET]: Binance.onChain(ChainId.BSC_TESTNET),\n // [ChainId.MOONBEAM_TESTNET]: Currency.GLMR,\n [ChainId.ARBITRUM]: Ether.onChain(ChainId.ARBITRUM),\n [ChainId.AVALANCHE]: Avalanche.onChain(ChainId.AVALANCHE),\n [ChainId.AVALANCHE_TESTNET]: Avalanche.onChain(ChainId.AVALANCHE_TESTNET),\n [ChainId.HECO]: Heco.onChain(ChainId.HECO),\n [ChainId.HECO_TESTNET]: Heco.onChain(ChainId.HECO_TESTNET),\n [ChainId.HARMONY]: Harmony.onChain(ChainId.HARMONY),\n [ChainId.HARMONY_TESTNET]: Harmony.onChain(ChainId.HARMONY_TESTNET),\n [ChainId.OKEX]: Okex.onChain(ChainId.OKEX),\n [ChainId.OKEX_TESTNET]: Okex.onChain(ChainId.OKEX_TESTNET),\n [ChainId.CELO]: Celo.onChain(ChainId.CELO),\n [ChainId.PALM]: Palm.onChain(ChainId.PALM),\n [ChainId.MOONRIVER]: Movr.onChain(ChainId.MOONRIVER),\n [ChainId.FUSE]: Fuse.onChain(ChainId.FUSE),\n [ChainId.TELOS]: Telos.onChain(ChainId.TELOS),\n}\n","import JSBI from 'jsbi'\n\nexport const MaxUint256 = JSBI.BigInt('0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff')\n\n// exports for internal consumption\nexport const ZERO = JSBI.BigInt(0)\nexport const ONE = JSBI.BigInt(1)\nexport const TWO = JSBI.BigInt(2)\nexport const THREE = JSBI.BigInt(3)\nexport const FIVE = JSBI.BigInt(5)\nexport const TEN = JSBI.BigInt(10)\nexport const _100 = JSBI.BigInt(100)\nexport const _997 = JSBI.BigInt(997)\nexport const _1000 = JSBI.BigInt(1000)\n","// see https://stackoverflow.com/a/41102306\nconst CAN_SET_PROTOTYPE = 'setPrototypeOf' in Object\n\n/**\n * Indicates that the pair has insufficient reserves for a desired output amount. I.e. the amount of output cannot be\n * obtained by sending any amount of input.\n */\nexport class InsufficientReservesError extends Error {\n public readonly isInsufficientReservesError: true = true\n\n public constructor() {\n super()\n this.name = this.constructor.name\n if (CAN_SET_PROTOTYPE) Object.setPrototypeOf(this, new.target.prototype)\n }\n}\n\n/**\n * Indicates that the input amount is too small to produce any amount of output. I.e. the amount of input sent is less\n * than the price of a single unit of output after fees.\n */\nexport class InsufficientInputAmountError extends Error {\n public readonly isInsufficientInputAmountError: true = true\n\n public constructor() {\n super()\n this.name = this.constructor.name\n if (CAN_SET_PROTOTYPE) Object.setPrototypeOf(this, new.target.prototype)\n }\n}\n","import _Big, { RoundingMode } from 'big.js'\n\nimport { BigintIsh } from '../types'\nimport JSBI from 'jsbi'\nimport { Rounding } from '../enums'\nimport _Decimal from 'decimal.js-light'\nimport invariant from 'tiny-invariant'\nimport toFormat from 'toformat'\n\nconst Decimal = toFormat(_Decimal)\nconst Big = toFormat(_Big)\n\nBig.strict = true\n\nconst toSignificantRounding = {\n [Rounding.ROUND_DOWN]: Decimal.ROUND_DOWN,\n [Rounding.ROUND_HALF_UP]: Decimal.ROUND_HALF_UP,\n [Rounding.ROUND_UP]: Decimal.ROUND_UP\n}\n\nconst toFixedRounding = {\n [Rounding.ROUND_DOWN]: RoundingMode.RoundDown,\n [Rounding.ROUND_HALF_UP]: RoundingMode.RoundHalfUp,\n [Rounding.ROUND_UP]: RoundingMode.RoundUp\n}\n\nexport class Fraction {\n public readonly numerator: JSBI\n public readonly denominator: JSBI\n\n public constructor(numerator: BigintIsh, denominator: BigintIsh = JSBI.BigInt(1)) {\n this.numerator = JSBI.BigInt(numerator)\n this.denominator = JSBI.BigInt(denominator)\n }\n\n private static tryParseFraction(fractionish: BigintIsh | Fraction): Fraction {\n if (fractionish instanceof JSBI || typeof fractionish === 'number' || typeof fractionish === 'string')\n return new Fraction(fractionish)\n\n if ('numerator' in fractionish && 'denominator' in fractionish) return fractionish\n throw new Error('Could not parse fraction')\n }\n\n // performs floor division\n public get quotient(): JSBI {\n return JSBI.divide(this.numerator, this.denominator)\n }\n\n // remainder after floor division\n public get remainder(): Fraction {\n return new Fraction(JSBI.remainder(this.numerator, this.denominator), this.denominator)\n }\n\n public invert(): Fraction {\n return new Fraction(this.denominator, this.numerator)\n }\n\n public add(other: Fraction | BigintIsh): Fraction {\n const otherParsed = Fraction.tryParseFraction(other)\n if (JSBI.equal(this.denominator, otherParsed.denominator)) {\n return new Fraction(JSBI.add(this.numerator, otherParsed.numerator), this.denominator)\n }\n return new Fraction(\n JSBI.add(\n JSBI.multiply(this.numerator, otherParsed.denominator),\n JSBI.multiply(otherParsed.numerator, this.denominator)\n ),\n JSBI.multiply(this.denominator, otherParsed.denominator)\n )\n }\n\n public subtract(other: Fraction | BigintIsh): Fraction {\n const otherParsed = Fraction.tryParseFraction(other)\n if (JSBI.equal(this.denominator, otherParsed.denominator)) {\n return new Fraction(JSBI.subtract(this.numerator, otherParsed.numerator), this.denominator)\n }\n return new Fraction(\n JSBI.subtract(\n JSBI.multiply(this.numerator, otherParsed.denominator),\n JSBI.multiply(otherParsed.numerator, this.denominator)\n ),\n JSBI.multiply(this.denominator, otherParsed.denominator)\n )\n }\n\n public lessThan(other: Fraction | BigintIsh): boolean {\n const otherParsed = Fraction.tryParseFraction(other)\n return JSBI.lessThan(\n JSBI.multiply(this.numerator, otherParsed.denominator),\n JSBI.multiply(otherParsed.numerator, this.denominator)\n )\n }\n\n public equalTo(other: Fraction | BigintIsh): boolean {\n const otherParsed = Fraction.tryParseFraction(other)\n return JSBI.equal(\n JSBI.multiply(this.numerator, otherParsed.denominator),\n JSBI.multiply(otherParsed.numerator, this.denominator)\n )\n }\n\n public greaterThan(other: Fraction | BigintIsh): boolean {\n const otherParsed = Fraction.tryParseFraction(other)\n return JSBI.greaterThan(\n JSBI.multiply(this.numerator, otherParsed.denominator),\n JSBI.multiply(otherParsed.numerator, this.denominator)\n )\n }\n\n public multiply(other: Fraction | BigintIsh): Fraction {\n const otherParsed = Fraction.tryParseFraction(other)\n return new Fraction(\n JSBI.multiply(this.numerator, otherParsed.numerator),\n JSBI.multiply(this.denominator, otherParsed.denominator)\n )\n }\n\n public divide(other: Fraction | BigintIsh): Fraction {\n const otherParsed = Fraction.tryParseFraction(other)\n return new Fraction(\n JSBI.multiply(this.numerator, otherParsed.denominator),\n JSBI.multiply(this.denominator, otherParsed.numerator)\n )\n }\n\n public toSignificant(\n significantDigits: number,\n format: object = { groupSeparator: '' },\n rounding: Rounding = Rounding.ROUND_HALF_UP\n ): string {\n invariant(Number.isInteger(significantDigits), `${significantDigits} is not an integer.`)\n invariant(significantDigits > 0, `${significantDigits} is not positive.`)\n\n Decimal.set({\n precision: significantDigits + 1,\n rounding: toSignificantRounding[rounding]\n })\n const quotient = new Decimal(this.numerator.toString())\n .div(this.denominator.toString())\n .toSignificantDigits(significantDigits)\n return quotient.toFormat(quotient.decimalPlaces(), format)\n }\n\n public toFixed(\n decimalPlaces: number,\n format: object = { groupSeparator: '' },\n rounding: Rounding = Rounding.ROUND_HALF_UP\n ): string {\n invariant(Number.isInteger(decimalPlaces), `${decimalPlaces} is not an integer.`)\n invariant(decimalPlaces >= 0, `${decimalPlaces} is negative.`)\n\n Big.DP = decimalPlaces\n Big.RM = toFixedRounding[rounding]\n return new Big(this.numerator.toString()).div(this.denominator.toString()).toFormat(decimalPlaces, format)\n }\n\n /**\n * Helper method for converting any super class back to a fraction\n */\n public get asFraction(): Fraction {\n return new Fraction(this.numerator, this.denominator)\n }\n}\n","import { BigintIsh } from '../types'\nimport { Currency } from './Currency'\nimport { Fraction } from './Fraction'\nimport JSBI from 'jsbi'\nimport { MaxUint256 } from '../constants'\nimport { Rounding } from '../enums'\nimport { Token } from './Token'\nimport _Big from 'big.js'\nimport invariant from 'tiny-invariant'\nimport toFormat from 'toformat'\n\nconst Big = toFormat(_Big)\n\nBig.strict = true\n\nexport class CurrencyAmount<T extends Currency> extends Fraction {\n public readonly currency: T\n public readonly decimalScale: JSBI\n\n /**\n * Returns a new currency amount instance from the unitless amount of token, i.e. the raw amount\n * @param currency the currency in the amount\n * @param rawAmount the raw token or ether amount\n */\n public static fromRawAmount<T extends Currency>(currency: T, rawAmount: BigintIsh): CurrencyAmount<T> {\n return new CurrencyAmount(currency, rawAmount)\n }\n\n /**\n * Construct a currency amount with a denominator that is not equal to 1\n * @param currency the currency\n * @param numerator the numerator of the fractional token amount\n * @param denominator the denominator of the fractional token amount\n */\n public static fromFractionalAmount<T extends Currency>(\n currency: T,\n numerator: BigintIsh,\n denominator: BigintIsh\n ): CurrencyAmount<T> {\n return new CurrencyAmount(currency, numerator, denominator)\n }\n\n protected constructor(currency: T, numerator: BigintIsh, denominator?: BigintIsh) {\n super(numerator, denominator)\n invariant(JSBI.lessThanOrEqual(this.quotient, MaxUint256), 'AMOUNT')\n this.currency = currency\n this.decimalScale = JSBI.exponentiate(JSBI.BigInt(10), JSBI.BigInt(currency.decimals))\n }\n\n public add(other: CurrencyAmount<T>): CurrencyAmount<T> {\n invariant(this.currency.equals(other.currency), 'CURRENCY')\n const added = super.add(other)\n return CurrencyAmount.fromFractionalAmount(this.currency, added.numerator, added.denominator)\n }\n\n public subtract(other: CurrencyAmount<T>): CurrencyAmount<T> {\n invariant(this.currency.equals(other.currency), 'CURRENCY')\n const subtracted = super.subtract(other)\n return CurrencyAmount.fromFractionalAmount(this.currency, subtracted.numerator, subtracted.denominator)\n }\n\n public multiply(other: Fraction | BigintIsh): CurrencyAmount<T> {\n const multiplied = super.multiply(other)\n return CurrencyAmount.fromFractionalAmount(this.currency, multiplied.numerator, multiplied.denominator)\n }\n\n public divide(other: Fraction | BigintIsh): CurrencyAmount<T> {\n const divided = super.divide(other)\n return CurrencyAmount.fromFractionalAmount(this.currency, divided.numerator, divided.denominator)\n }\n\n public toSignificant(\n significantDigits: number = 6,\n format?: object,\n rounding: Rounding = Rounding.ROUND_DOWN\n ): string {\n return super.divide(this.decimalScale).toSignificant(significantDigits, format, rounding)\n }\n\n public toFixed(\n decimalPlaces: number = this.currency.decimals,\n format?: object,\n rounding: Rounding = Rounding.ROUND_DOWN\n ): string {\n invariant(decimalPlaces <= this.currency.decimals, 'DECIMALS')\n return super.divide(this.decimalScale).toFixed(decimalPlaces, format, rounding)\n }\n\n public toExact(format: object = { groupSeparator: '' }): string {\n Big.DP = this.currency.decimals\n return new Big(this.quotient.toString()).div(this.decimalScale.toString()).toFormat(format)\n }\n\n public get wrapped(): CurrencyAmount<Token> {\n if (this.currency.isToken) return this as CurrencyAmount<Token>\n return CurrencyAmount.fromFractionalAmount(this.currency.wrapped, this.numerator, this.denominator)\n }\n\n /**\n * Returns a string representation of the address and currency amount.\n * Useful in cases where a dependency is needed to detect changes (e.g. useEffect).\n * @return string [0x6B3595068778DD592e39A122f4f5a5cF09C90fE2 - 1323.94]\n */\n public serialize(): string {\n return `[${this.currency.wrapped.address} - ${this.toExact()}]`\n }\n}\n","import { BigintIsh } from '../types'\nimport { Currency } from './Currency'\nimport { CurrencyAmount } from './CurrencyAmount'\nimport { Fraction } from './Fraction'\nimport JSBI from 'jsbi'\nimport { Rounding } from '../enums'\nimport invariant from 'tiny-invariant'\n\nexport class Price<TBase extends Currency, TQuote extends Currency> extends Fraction {\n public readonly baseCurrency: TBase // input i.e. denominator\n public readonly quoteCurrency: TQuote // output i.e. numerator\n public readonly scalar: Fraction // used to adjust the raw fraction w/r/t the decimals of the {base,quote}Token\n\n /**\n * Construct a price, either with the base and quote currency amount, or the\n * @param args\n */\n public constructor(\n ...args:\n | [TBase, TQuote, BigintIsh, BigintIsh]\n | [\n {\n baseAmount: CurrencyAmount<TBase>\n quoteAmount: CurrencyAmount<TQuote>\n }\n ]\n ) {\n let baseCurrency: TBase, quoteCurrency: TQuote, denominator: BigintIsh, numerator: BigintIsh\n\n if (args.length === 4) {\n ;[baseCurrency, quoteCurrency, denominator, numerator] = args\n } else {\n const result = args[0].quoteAmount.divide(args[0].baseAmount)\n ;[baseCurrency, quoteCurrency, denominator, numerator] = [\n args[0].baseAmount.currency,\n args[0].quoteAmount.currency,\n result.denominator,\n result.numerator\n ]\n }\n super(numerator, denominator)\n\n this.baseCurrency = baseCurrency\n this.quoteCurrency = quoteCurrency\n this.scalar = new Fraction(\n JSBI.exponentiate(JSBI.BigInt(10), JSBI.BigInt(baseCurrency.decimals)),\n JSBI.exponentiate(JSBI.BigInt(10), JSBI.BigInt(quoteCurrency.decimals))\n )\n }\n\n /**\n * Flip the price, switching the base and quote currency\n */\n public invert(): Price<TQuote, TBase> {\n return new Price(this.quoteCurrency, this.baseCurrency, this.numerator, this.denominator)\n }\n\n /**\n * Multiply the price by another price, returning a new price. The other price must have the same base currency as this price's quote currency\n * @param other the other price\n */\n public multiply<TOtherQuote extends Currency>(other: Price<TQuote, TOtherQuote>): Price<TBase, TOtherQuote> {\n invariant(this.quoteCurrency.equals(other.baseCurrency), 'TOKEN')\n const fraction = super.multiply(other)\n return new Price(this.baseCurrency, other.quoteCurrency, fraction.denominator, fraction.numerator)\n }\n\n /**\n * Return the amount of quote currency corresponding to a given amount of the base currency\n * @param currencyAmount the amount of base currency to quote against the price\n */\n public quote(currencyAmount: CurrencyAmount<TBase>): CurrencyAmount<TQuote> {\n invariant(currencyAmount.currency.equals(this.baseCurrency), 'TOKEN')\n const result = super.multiply(currencyAmount)\n return CurrencyAmount.fromFractionalAmount(this.quoteCurrency, result.numerator, result.denominator)\n }\n\n /**\n * Get the value scaled by decimals for formatting\n * @private\n */\n private get adjustedForDecimals(): Fraction {\n return super.multiply(this.scalar)\n }\n\n public toSignificant(significantDigits: number = 6, format?: object, rounding?: Rounding): string {\n return this.adjustedForDecimals.toSignificant(significantDigits, format, rounding)\n }\n\n public toFixed(decimalPlaces: number = 4, format?: object, rounding?: Rounding): string {\n return this.adjustedForDecimals.toFixed(decimalPlaces, format, rounding)\n }\n}\n","import { keccak256, pack } from '@ethersproject/solidity'\n\nimport { defaultAbiCoder } from '@ethersproject/abi'\n\nexport const computePoolInitCodeHash = ({\n creationCode,\n deployData,\n masterDeployerAddress\n}: {\n creationCode: string\n deployData: string\n masterDeployerAddress: string\n}): string =>\n keccak256(\n ['bytes'],\n [\n pack(\n ['bytes', 'bytes'],\n [creationCode, defaultAbiCoder.encode(['bytes', 'address'], [deployData, masterDeployerAddress])]\n )\n ]\n )\n","import { Fee } from '../enums'\nimport { Token } from '../entities'\nimport { computePoolInitCodeHash } from './computePoolInitCodeHash'\nimport { defaultAbiCoder } from '@ethersproject/abi'\nimport { getCreate2Address } from '@ethersproject/address'\nimport { keccak256 } from '@ethersproject/solidity'\n\nconst MASTER_DEPLOYER_ADDRESS = '0xa2A7Aa74cb94f37221FD49F5BA6F3fF876092700'\n\nconst CONSTANT_PRODUCT_POOL_CREATION_CODE =\n '0x6101806040523480156200001257600080fd5b5060405162004195380380620041958339810160408190526200003591620005d2565b604080518082018252600e81526d29bab9b434902628102a37b5b2b760911b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f918101919091527fc2bf45081e840722410522aa366600d7fe4da5bfb5a5b417f4d5125b4ed180a4918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015246608082018190523060a08301529060c0016040516020818303038152906040528051906020012060808181525050506000806000808580602001905181019062000132919062000572565b929650909450925090506001600160a01b038416620001875760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b60448201526064015b60405180910390fd5b826001600160a01b0316846001600160a01b03161415620001eb5760405162461bcd60e51b815260206004820152601360248201527f4944454e544943414c5f4144445245535345530000000000000000000000000060448201526064016200017e565b6001600160a01b038416301415620002365760405162461bcd60e51b815260206004820152600d60248201526c24a72b20a624a22faa27a5a2a760991b60448201526064016200017e565b6001600160a01b038316301415620002815760405162461bcd60e51b815260206004820152600d60248201526c24a72b20a624a22faa27a5a2a760991b60448201526064016200017e565b612710821115620002c85760405162461bcd60e51b815260206004820152601060248201526f494e56414c49445f535741505f46454560801b60448201526064016200017e565b60408051600481526024810182526020810180516001600160e01b03166360a56c0160e11b17905290516000916001600160a01b038816916200030c9190620006b9565b600060405180830381855afa9150503d806000811462000349576040519150601f19603f3d011682016040523d82523d6000602084013e6200034e565b606091505b5060408051600481526024810182526020810180516001600160e01b0316630605066960e11b1790529051919350600092506001600160a01b03891691620003979190620006b9565b600060405180830381855afa9150503d8060008114620003d4576040519150601f19603f3d011682016040523d82523d6000602084013e620003d9565b606091505b5060408051600481526024810182526020810180516001600160e01b0316634da3182760e01b1790529051919350600092506001600160a01b038a1691620004229190620006b9565b600060405180830381855afa9150503d80600081146200045f576040519150601f19603f3d011682016040523d82523d6000602084013e62000464565b606091505b506001600160601b031960608a811b82166101405289901b166101605260a087905261271087900360c0528451909250620004aa9150840160209081019085016200069f565b6004558151620004c490830160209081019084016200054b565b60601b6001600160601b03191660e0528051620004eb90602090830181019083016200054b565b6001600160601b0319606091821b8116610100529089901b1661012052600160095583156200052a57600880546001600160e01b0316600160e01b1790555b50505050505050505062000739565b8051620005468162000720565b919050565b6000602082840312156200055e57600080fd5b81516200056b8162000720565b9392505050565b600080600080608085870312156200058957600080fd5b8451620005968162000720565b6020860151909450620005a98162000720565b6040860151606087015191945092508015158114620005c757600080fd5b939692955090935050565b60008060408385031215620005e657600080fd5b82516001600160401b0380821115620005fe57600080fd5b818501915085601f8301126200061357600080fd5b8151818111156200062857620006286200070a565b604051601f8201601f19908116603f011681019083821181831017156200065357620006536200070a565b816040528281528860208487010111156200066d57600080fd5b62000680836020830160208801620006d7565b8096505050505050620006966020840162000539565b90509250929050565b600060208284031215620006b257600080fd5b5051919050565b60008251620006cd818460208701620006d7565b9190910192915050565b60005b83811015620006f4578181015183820152602001620006da565b8381111562000704576000848401525b50505050565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146200073657600080fd5b50565b60805160a05160c05160e05160601c6101005160601c6101205160601c6101405160601c6101605160601c61390062000895600039600081816105b301528181610791015281816108c00152818161096e01528181610ff6015281816110fe01528181611336015281816113a5015281816115e701528181611fc30152818161204a01526129e701526000818161032e0152818161070d01528181610a5301528181610b8201528181610fca01528181611095015281816112e2015281816114860152818161157901528181611d24015281816120830152818161216e01526128e801526000818161058c015281816118070152611c240152600081816103f901528181612650015281816127c6015281816128ac0152612a900152600081816102e20152612eb3015260006125520152600081816104200152818161315501526131c00152600081816103d2015261233901526139006000f3fe608060405234801561001057600080fd5b506004361061020b5760003560e01c8063627dd56a1161012a578063a69840a8116100bd578063c14ad8021161008c578063d21220a711610071578063d21220a7146105ae578063d505accf146105d5578063dd62ed3e146105e857600080fd5b8063c14ad8021461057e578063cf58879a1461058757600080fd5b8063a69840a81461051e578063a8f1f52e14610545578063a9059cbb14610558578063af8c09bf1461056b57600080fd5b80637ba0e2e7116100f95780637ba0e2e7146104a55780637ecebe00146104b857806392bc3219146104d857806395d89b41146104e257600080fd5b8063627dd56a1461045457806367e4ac2c1461046757806370a082311461047c5780637464fc3d1461049c57600080fd5b80632a07b6c7116101a25780634da31827116101715780634da31827146103f457806354cf2aeb1461041b5780635909c0d5146104425780635a3d54931461044b57600080fd5b80632a07b6c71461036c57806330adf81f1461038c578063313ce567146103b35780633644e515146103cd57600080fd5b80630c0a0cd2116101de5780630c0a0cd2146102dd5780630dfe16811461032957806318160ddd1461035057806323b872dd1461035957600080fd5b8063053da1c81461021057806306fdde03146102365780630902f1ac1461027f578063095ea7b3146102ba575b600080fd5b61022361021e366004613566565b610613565b6040519081526020015b60405180910390f35b6102726040518060400160405280600e81526020017f5375736869204c5020546f6b656e00000000000000000000000000000000000081525081565b60405161022d9190613716565b610287610c3e565b604080516dffffffffffffffffffffffffffff948516815293909216602084015263ffffffff169082015260600161022d565b6102cd6102c8366004613449565b610ca7565b604051901515815260200161022d565b6103047f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161022d565b6103047f000000000000000000000000000000000000000000000000000000000000000081565b61022360005481565b6102cd6103673660046134ae565b610d20565b61037f61037a366004613566565b610e6c565b60405161022d91906136b1565b6102237f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b6103bb601281565b60405160ff909116815260200161022d565b6102237f000000000000000000000000000000000000000000000000000000000000000081565b6103047f000000000000000000000000000000000000000000000000000000000000000081565b6102237f000000000000000000000000000000000000000000000000000000000000000081565b61022360055481565b61022360065481565b610223610462366004613566565b6111e1565b61046f611557565b60405161022d9190613657565b61022361048a36600461327d565b60016020526000908152604090205481565b61022360075481565b6102236104b3366004613566565b611656565b6102236104c636600461327d565b60036020526000908152604090205481565b6104e0611bb2565b005b6102726040518060400160405280600381526020017f534c50000000000000000000000000000000000000000000000000000000000081525081565b6102237f54726964656e743a436f6e7374616e7450726f6475637400000000000000000081565b610223610553366004613566565b611cad565b6102cd610566366004613449565b611de0565b610223610579366004613566565b611e65565b61022360045481565b6103047f000000000000000000000000000000000000000000000000000000000000000081565b6103047f000000000000000000000000000000000000000000000000000000000000000081565b6104e06105e33660046134ef565b61220e565b6102236105f6366004613475565b600260209081526000928352604080842090915290825290205481565b6000600954600114610686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c4f434b4544000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b600260095560008080808061069d87890189613305565b9450945094509450945060008060006107056008546dffffffffffffffffffffffffffff808216926e01000000000000000000000000000083049091169163ffffffff7c01000000000000000000000000000000000000000000000000000000009091041690565b9250925092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16141561096c5761078a85846dffffffffffffffffffffffffffff16846dffffffffffffffffffffffffffff1661254a565b98506107b87f00000000000000000000000000000000000000000000000000000000000000008a89896125ad565b6040517fbd50c7b1000000000000000000000000000000000000000000000000000000008152339063bd50c7b1906107f4908790600401613716565b600060405180830381600087803b15801561080e57600080fd5b505af1158015610822573d6000803e3d6000fd5b505050506000806108316128a5565b9150915086856dffffffffffffffffffffffffffff16830310156108b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f494e53554646494349454e545f414d4f554e545f494e00000000000000000000604482015260640161067d565b6108be8282878787612b1d565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fcd3829a3813dc3cdd188fd3d01dcf3268c16be2fdd2dd21d0665418816e460628a8f60405161095d929190918252602082015260400190565b60405180910390a45050610c2a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614610a21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f494e56414c49445f494e5055545f544f4b454e00000000000000000000000000604482015260640161067d565b610a4c85836dffffffffffffffffffffffffffff16856dffffffffffffffffffffffffffff1661254a565b9850610a7a7f00000000000000000000000000000000000000000000000000000000000000008a89896125ad565b6040517fbd50c7b1000000000000000000000000000000000000000000000000000000008152339063bd50c7b190610ab6908790600401613716565b600060405180830381600087803b158015610ad057600080fd5b505af1158015610ae4573d6000803e3d6000fd5b50505050600080610af36128a5565b9150915086846dffffffffffffffffffffffffffff1682031015610b73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f494e53554646494349454e545f414d4f554e545f494e00000000000000000000604482015260640161067d565b610b808282878787612b1d565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fcd3829a3813dc3cdd188fd3d01dcf3268c16be2fdd2dd21d0665418816e460628a8f604051610c1f929190918252602082015260400190565b60405180910390a450505b505060016009555094979650505050505050565b6000806000610c9c6008546dffffffffffffffffffffffffffff808216926e01000000000000000000000000000083049091169163ffffffff7c01000000000000000000000000000000000000000000000000000000009091041690565b925092509250909192565b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610d0f9086815260200190565b60405180910390a350600192915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14610dbd5773ffffffffffffffffffffffffffffffffffffffff8416600090815260026020908152604080832033845290915281208054849290610db7908490613792565b90915550505b73ffffffffffffffffffffffffffffffffffffffff841660009081526001602052604081208054849290610df2908490613792565b909155505073ffffffffffffffffffffffffffffffffffffffff808416600081815260016020526040908190208054860190555190918616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610e5a9086815260200190565b60405180910390a35060019392505050565b6060600954600114610eda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c4f434b45440000000000000000000000000000000000000000000000000000604482015260640161067d565b6002600955600080610eee84860186613414565b915091506000806000610f506008546dffffffffffffffffffffffffffff808216926e01000000000000000000000000000083049091169163ffffffff7c01000000000000000000000000000000000000000000000000000000009091041690565b925092509250600080610f616128a5565b60008054308252600160205260409091205492945090925090610f85878784612e33565b90910190600082610f968684613755565b610fa09190613741565b9050600083610faf8685613755565b610fb99190613741565b9050610fc53084612ee2565b610ff17f0000000000000000000000000000000000000000000000000000000000000000838d8d6125ad565b61101d7f0000000000000000000000000000000000000000000000000000000000000000828d8d6125ad565b8186039550808503945061103486868b8b8b612b1d565b6110466110418688613755565b612f75565b6007556040805160028082526060820190925290816020015b604080518082019091526000808252602082015281526020019060019003908161105f579050509b5060405180604001604052807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168152602001838152508c6000815181106110e6576110e6613847565b602002602001018190525060405180604001604052807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168152602001828152508c60018151811061114f5761114f613847565b60200260200101819052508a73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d8193649684846040516111c2929190918252602082015260400190565b60405180910390a35050600160095550979a9950505050505050505050565b600060095460011461124f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c4f434b45440000000000000000000000000000000000000000000000000000604482015260640161067d565b600260095560008080611264858701876132be565b92509250925060008060006112c86008546dffffffffffffffffffffffffffff808216926e01000000000000000000000000000083049091169163ffffffff7c01000000000000000000000000000000000000000000000000000000009091041690565b9250925092506000806112d96128a5565b915091506000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff1614156113a3577f00000000000000000000000000000000000000000000000000000000000000009050866dffffffffffffffffffffffffffff168403915061139782886dffffffffffffffffffffffffffff16886dffffffffffffffffffffffffffff1661254a565b9a508a830392506114bf565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff1614611458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f494e56414c49445f494e5055545f544f4b454e00000000000000000000000000604482015260640161067d565b50506008546dffffffffffffffffffffffffffff6e01000000000000000000000000000090910481168203907f0000000000000000000000000000000000000000000000000000000000000000906114b7908390888116908a1661254a565b9a508a840393505b6114cb818c8b8b6125ad565b6114d88484898989612b1d565b8073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fcd3829a3813dc3cdd188fd3d01dcf3268c16be2fdd2dd21d0665418816e46062858f604051610c1f929190918252602082015260400190565b60408051600280825260608083018452926020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000816000815181106115ab576115ab613847565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061161957611619613847565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505090565b60006009546001146116c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c4f434b45440000000000000000000000000000000000000000000000000000604482015260640161067d565b600260095560006116d78385018561327d565b905060008060006117376008546dffffffffffffffffffffffffffff808216926e01000000000000000000000000000083049091169163ffffffff7c01000000000000000000000000000000000000000000000000000000009091041690565b9250925092506000806117486128a5565b600054919350915061175b868683612e33565b0160006117786dffffffffffffffffffffffffffff881685613792565b905060006117966dffffffffffffffffffffffffffff881685613792565b90506000806117c784848c6dffffffffffffffffffffffffffff168c6dffffffffffffffffffffffffffff166130fa565b909250905060006117ef6117db8389613792565b6117e5858b613792565b6110419190613755565b905085611a705761180360006103e86131fd565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637cd07e476040518163ffffffff1660e01b815260040160206040518083038186803b15801561186b57600080fd5b505afa15801561187f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a391906132a1565b90503373ffffffffffffffffffffffffffffffffffffffff821614156119dd578073ffffffffffffffffffffffffffffffffffffffff166340dc0e376040518163ffffffff1660e01b815260040160206040518083038186803b15801561190957600080fd5b505afa15801561191d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194191906135d8565b9d508d1580159061197257507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8e14155b6119d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4241445f444553495245445f4c49515549444954590000000000000000000000604482015260640161067d565b611a6a565b73ffffffffffffffffffffffffffffffffffffffff811615611a5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4f4e4c595f4d49475241544f5200000000000000000000000000000000000000604482015260640161067d565b611a676103e883613792565b9d505b50611ab8565b6000611a926110416dffffffffffffffffffffffffffff808e16908f16613755565b90508087611aa08285613792565b611aaa9190613755565b611ab49190613741565b9d50505b8c611b1f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f494e53554646494349454e545f4c49515549444954595f4d494e544544000000604482015260640161067d565b611b298c8e6131fd565b611b3688888d8d8d612b1d565b611b43611041888a613755565b600755604080518681526020810186905273ffffffffffffffffffffffffffffffffffffffff8e169133917fdbba30eb0402b389513e87f51f4db2db80bed454384ec6925a24097c3548a02a91015b60405180910390a35050600160095550989b9a5050505050505050505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc14ad80200000000000000000000000000000000000000000000000000000000179052905160009173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691611c4f919061363b565b600060405180830381855afa9150503d8060008114611c8a576040519150601f19603f3d011682016040523d82523d6000602084013e611c8f565b606091505b5091505080806020019051810190611ca791906135d8565b60045550565b60008080611cbd84860186613449565b91509150600080611d1d6008546dffffffffffffffffffffffffffff808216926e01000000000000000000000000000083049091169163ffffffff7c01000000000000000000000000000000000000000000000000000000009091041690565b50915091507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611da857611da183836dffffffffffffffffffffffffffff16836dffffffffffffffffffffffffffff1661254a565b9450611dd6565b611dd383826dffffffffffffffffffffffffffff16846dffffffffffffffffffffffffffff1661254a565b94505b5050505092915050565b33600090815260016020526040812080548391908390611e01908490613792565b909155505073ffffffffffffffffffffffffffffffffffffffff8316600081815260016020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610d0f9086815260200190565b6000600954600114611ed3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c4f434b45440000000000000000000000000000000000000000000000000000604482015260640161067d565b600260095560008080611ee8858701876132be565b9250925092506000806000611f4c6008546dffffffffffffffffffffffffffff808216926e01000000000000000000000000000083049091169163ffffffff7c01000000000000000000000000000000000000000000000000000000009091041690565b925092509250600080611f5d6128a5565b60008054308252600160205260409091205492945090925090611f81878784612e33565b90910190600082611f928684613755565b611f9c9190613741565b9050600083611fab8685613755565b611fb59190613741565b9050611fc13084612ee2565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff1614156120815761204482838b6dffffffffffffffffffffffffffff1603838b6dffffffffffffffffffffffffffff160361254a565b016120717f0000000000000000000000000000000000000000000000000000000000000000828d8d6125ad565b9b5050918a90039160008b6121a1565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff1614612136576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f494e56414c49445f4f55545055545f544f4b454e000000000000000000000000604482015260640161067d565b61216581828a6dffffffffffffffffffffffffffff1603848c6dffffffffffffffffffffffffffff160361254a565b820191506121957f0000000000000000000000000000000000000000000000000000000000000000838d8d6125ad565b509a50928a9003928a60005b6121ae86868b8b8b612b1d565b6121bb6110418688613755565b600755604080518381526020810183905273ffffffffffffffffffffffffffffffffffffffff8d169133917fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d819364969101611b92565b42841015612278576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f45585049524544000000000000000000604482015260640161067d565b73ffffffffffffffffffffffffffffffffffffffff878116600081815260036020908152604080832080546001810190915581517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98185015280830195909552948b166060850152608084018a905260a084019490945260c08084018990528451808503909101815260e0840190945283519301929092207f19010000000000000000000000000000000000000000000000000000000000006101008301527f000000000000000000000000000000000000000000000000000000000000000061010283015261012282015261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa1580156123f1573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81161580159061246c57508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b6124d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f494e56414c49445f5045524d49545f5349474e41545552450000000000000000604482015260640161067d565b73ffffffffffffffffffffffffffffffffffffffff90811660009081526002602090815260408083208b8516808552908352928190208a905551898152919350918a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b6000806125777f000000000000000000000000000000000000000000000000000000000000000086613755565b90508061258661271086613755565b6125909190613729565b61259a8483613755565b6125a49190613741565b95945050505050565b801561272f576040805173ffffffffffffffffffffffffffffffffffffffff8681166024830152306044830152848116606483015260006084830181905260a48084018890528451808503909101815260c490930184526020830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f97da6d300000000000000000000000000000000000000000000000000000000017905292517f00000000000000000000000000000000000000000000000000000000000000009091169161267c9161363b565b6000604051808303816000865af19150503d80600081146126b9576040519150601f19603f3d011682016040523d82523d6000602084013e6126be565b606091505b5050905080612729576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f57495448445241575f4641494c45440000000000000000000000000000000000604482015260640161067d565b5061289f565b6040805173ffffffffffffffffffffffffffffffffffffffff8681166024830152306044830152848116606483015260848083018790528351808403909101815260a490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff18d03cc0000000000000000000000000000000000000000000000000000000017905291516000927f000000000000000000000000000000000000000000000000000000000000000016916127f09161363b565b6000604051808303816000865af19150503d806000811461282d576040519150601f19603f3d011682016040523d82523d6000602084013e612832565b606091505b505090508061289d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5452414e534645525f4641494c45440000000000000000000000000000000000604482015260640161067d565b505b50505050565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f7888aec7f00000000000000000000000000000000000000000000000000000000000000003060405160240161293b92919073ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612989919061363b565b600060405180830381855afa9150503d80600081146129c4576040519150601f19603f3d011682016040523d82523d6000602084013e6129c9565b606091505b50915050808060200190518101906129e191906135d8565b604080517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff90811660248301523060448084019190915283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff7888aec0000000000000000000000000000000000000000000000000000000017905291519295506000927f000000000000000000000000000000000000000000000000000000000000000090921691612abd919061363b565b600060405180830381855afa9150503d8060008114612af8576040519150601f19603f3d011682016040523d82523d6000602084013e612afd565b606091505b5091505080806020019051810190612b1591906135d8565b925050509091565b6dffffffffffffffffffffffffffff8511801590612b4957506dffffffffffffffffffffffffffff8411155b612baf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f4f564552464c4f57000000000000000000000000000000000000000000000000604482015260640161067d565b6008547c0100000000000000000000000000000000000000000000000000000000900463ffffffff16612c3357600880546dffffffffffffffffffffffffffff8681166e010000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090921690881617179055612df3565b6000612c44640100000000426137d5565b90508163ffffffff168163ffffffff1614158015612c7157506dffffffffffffffffffffffffffff841615155b8015612c8c57506dffffffffffffffffffffffffffff831615155b15612d515781810360006dffffffffffffffffffffffffffff86167bffffffffffffffffffffffffffff0000000000000000000000000000607087901b1681612cd757612cd7613818565b600580549290910463ffffffff851681029092019055905060006dffffffffffffffffffffffffffff8616607088901b7bffffffffffffffffffffffffffff00000000000000000000000000001681612d3257612d32613818565b0490508263ffffffff1681026006600082825401925050819055505050505b6008805463ffffffff9092167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff6dffffffffffffffffffffffffffff8881166e010000000000000000000000000000027fffffffff00000000000000000000000000000000000000000000000000000000909516908a161793909317929092169190911790555b60408051868152602081018690527fcf2aa50876cdfbb541206f89af0ee78d44a2abf8d328e37fa4917f982149848a910160405180910390a15050505050565b6007546000908015612eda576000612e616110416dffffffffffffffffffffffffffff808816908916613755565b905081811115612ed857612710816004548484612e7e9190613792565b612e889088613755565b612e929190613755565b612e9c9190613741565b612ea69190613741565b92508215612ed857612ed87f0000000000000000000000000000000000000000000000000000000000000000846131fd565b505b509392505050565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081208054839290612f17908490613792565b909155505060008054829003815560405182815273ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b600081612f8457506000919050565b8160017001000000000000000000000000000000008210612faa5760809190911c9060401b5b680100000000000000008210612fc55760409190911c9060201b5b6401000000008210612fdc5760209190911c9060101b5b620100008210612ff15760109190911c9060081b5b61010082106130055760089190911c9060041b5b601082106130185760049190911c9060021b5b600882106130245760011b5b600181858161303557613035613818565b048201901c9050600181858161304d5761304d613818565b048201901c9050600181858161306557613065613818565b048201901c9050600181858161307d5761307d613818565b048201901c9050600181858161309557613095613818565b048201901c905060018185816130ad576130ad613818565b048201901c905060018185816130c5576130c5613818565b048201901c905060008185816130dd576130dd613818565b0490508082106130ed57806130ef565b815b93505050505b919050565b600080831580613108575082155b15613118575060009050806131f4565b6000846131258589613755565b61312f9190613741565b905085811161318a576131456127106002613755565b61314f8288613792565b613179907f0000000000000000000000000000000000000000000000000000000000000000613755565b6131839190613741565b91506131f2565b6000846131978789613755565b6131a19190613741565b90506131b06127106002613755565b6131ba828a613792565b6131e4907f0000000000000000000000000000000000000000000000000000000000000000613755565b6131ee9190613741565b9350505b505b94509492505050565b8060008082825461320e9190613729565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000818152600160209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101612f69565b803580151581146130f557600080fd5b60006020828403121561328f57600080fd5b813561329a816138a5565b9392505050565b6000602082840312156132b357600080fd5b815161329a816138a5565b6000806000606084860312156132d357600080fd5b83356132de816138a5565b925060208401356132ee816138a5565b91506132fc6040850161326d565b90509250925092565b600080600080600060a0868803121561331d57600080fd5b8535613328816138a5565b94506020860135613338816138a5565b93506133466040870161326d565b925060608601359150608086013567ffffffffffffffff8082111561336a57600080fd5b818801915088601f83011261337e57600080fd5b81358181111561339057613390613876565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156133d6576133d6613876565b816040528281528b60208487010111156133ef57600080fd5b8260208601602083013760006020848301015280955050505050509295509295909350565b6000806040838503121561342757600080fd5b8235613432816138a5565b91506134406020840161326d565b90509250929050565b6000806040838503121561345c57600080fd5b8235613467816138a5565b946020939093013593505050565b6000806040838503121561348857600080fd5b8235613493816138a5565b915060208301356134a3816138a5565b809150509250929050565b6000806000606084860312156134c357600080fd5b83356134ce816138a5565b925060208401356134de816138a5565b929592945050506040919091013590565b600080600080600080600060e0888a03121561350a57600080fd5b8735613515816138a5565b96506020880135613525816138a5565b95506040880135945060608801359350608088013560ff8116811461354957600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806020838503121561357957600080fd5b823567ffffffffffffffff8082111561359157600080fd5b818501915085601f8301126135a557600080fd5b8135818111156135b457600080fd5b8660208285010111156135c657600080fd5b60209290920196919550909350505050565b6000602082840312156135ea57600080fd5b5051919050565b600081518084526136098160208601602086016137a9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000825161364d8184602087016137a9565b9190910192915050565b6020808252825182820181905260009190848201906040850190845b818110156136a557835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101613673565b50909695505050505050565b602080825282518282018190526000919060409081850190868401855b82811015613709578151805173ffffffffffffffffffffffffffffffffffffffff1685528601518685015292840192908501906001016136ce565b5091979650505050505050565b60208152600061329a60208301846135f1565b6000821982111561373c5761373c6137e9565b500190565b60008261375057613750613818565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561378d5761378d6137e9565b500290565b6000828210156137a4576137a46137e9565b500390565b60005b838110156137c45781810151838201526020016137ac565b8381111561289f5750506000910152565b6000826137e4576137e4613818565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff811681146138c757600080fd5b5056fea264697066735822122004f193ad403a2048e6ef0c1fc9da9b9f522fe2ad030c99737c73f0f04901cf7464736f6c63430008070033'\n\nexport const computeConstantProductPoolAddress = ({\n factoryAddress,\n tokenA,\n tokenB,\n fee,\n twap\n}: {\n factoryAddress: string\n tokenA: Token\n tokenB: Token\n fee: Fee\n twap: boolean\n}): string => {\n // does safety checks\n const [token0, token1] = tokenA.sortsBefore(tokenB) ? [tokenA, tokenB] : [tokenB, tokenA]\n\n const deployData = defaultAbiCoder.encode(\n ['address', 'address', 'uint256', 'bool'],\n [...[token0.address, token1.address].sort(), fee, twap]\n )\n\n // Compute init code hash based off the bytecode, deployData & masterDeployerAddress\n const CONSTANT_PRODUCT_POOL_INIT_CODE_HASH = computePoolInitCodeHash({\n creationCode: CONSTANT_PRODUCT_POOL_CREATION_CODE,\n deployData,\n masterDeployerAddress: MASTER_DEPLOYER_ADDRESS\n })\n\n // Compute pool address\n return getCreate2Address(factoryAddress, keccak256(['bytes'], [deployData]), CONSTANT_PRODUCT_POOL_INIT_CODE_HASH)\n}\n","import JSBI from 'jsbi'\nimport invariant from 'tiny-invariant'\n\nexport const MAX_SAFE_INTEGER = JSBI.BigInt(Number.MAX_SAFE_INTEGER)\n\nconst ZERO = JSBI.BigInt(0)\nconst ONE = JSBI.BigInt(1)\nconst TWO = JSBI.BigInt(2)\n\n/**\n * Computes floor(sqrt(value))\n * @param value the value for which to compute the square root, rounded down\n */\nexport function sqrt(value: JSBI): JSBI {\n invariant(JSBI.greaterThanOrEqual(value, ZERO), 'NEGATIVE')\n\n // rely on built in sqrt if possible\n if (JSBI.lessThan(value, MAX_SAFE_INTEGER)) {\n return JSBI.BigInt(Math.floor(Math.sqrt(JSBI.toNumber(value))))\n }\n\n let z: JSBI\n let x: JSBI\n z = value\n x = JSBI.add(JSBI.divide(value, TWO), ONE)\n while (JSBI.lessThan(x, z)) {\n z = x\n x = JSBI.divide(JSBI.add(JSBI.divide(value, x), x), TWO)\n }\n return z\n}\n","import { FACTORY_ADDRESS, MINIMUM_LIQUIDITY, ONE, ZERO, _1000, _997 } from '../constants'\nimport { InsufficientInputAmountError, InsufficientReservesError } from '../errors'\n\nimport { CurrencyAmount } from './CurrencyAmount'\nimport { Fee } from '../enums'\nimport JSBI from 'jsbi'\nimport { Price } from './Price'\nimport { Token } from './Token'\nimport { computeConstantProductPoolAddress } from '../functions/computeConstantProductPoolAddress'\nimport invariant from 'tiny-invariant'\nimport { sqrt } from '../functions/sqrt'\n\nexport class ConstantProductPool {\n public readonly liquidityToken: Token\n public readonly fee: Fee\n public readonly twap: boolean\n private readonly tokenAmounts: [CurrencyAmount<Token>, CurrencyAmount<Token>]\n\n public static getAddress(tokenA: Token, tokenB: Token, fee: Fee = 25, twap: boolean = true): string {\n return computeConstantProductPoolAddress({\n factoryAddress: FACTORY_ADDRESS[tokenA.chainId],\n tokenA,\n tokenB,\n fee,\n twap\n })\n }\n\n public constructor(\n currencyAmountA: CurrencyAmount<Token>,\n currencyAmountB: CurrencyAmount<Token>,\n fee: Fee = 25,\n twap: boolean = true\n ) {\n const currencyAmounts = currencyAmountA.currency.sortsBefore(currencyAmountB.currency) // does safety checks\n ? [currencyAmountA, currencyAmountB]\n : [currencyAmountB, currencyAmountA]\n this.liquidityToken = new Token(\n currencyAmounts[0].currency.chainId,\n ConstantProductPool.getAddress(currencyAmounts[0].currency, currencyAmounts[1].currency, fee, twap),\n 18,\n 'SLP',\n 'Sushi LP Token'\n )\n this.fee = fee\n this.twap = twap\n this.tokenAmounts = currencyAmounts as [CurrencyAmount<Token>, CurrencyAmount<Token>]\n }\n\n /**\n * Returns true if the token is either token0 or token1\n * @param token to check\n */\n public involvesToken(token: Token): boolean {\n return token.equals(this.token0) || token.equals(this.token1)\n }\n\n /**\n * Returns the current mid price of the pair in terms of token0, i.e. the ratio of reserve1 to reserve0\n */\n public get token0Price(): Price<Token, Token> {\n const result = this.tokenAmounts[1].divide(this.tokenAmounts[0])\n return new Price(this.token0, this.token1, result.denominator, result.numerator)\n }\n\n /**\n * Returns the current mid price of the pair in terms of token1, i.e. the ratio of reserve0 to reserve1\n */\n public get token1Price(): Price<Token, Token> {\n const result = this.tokenAmounts[0].divide(this.tokenAmounts[1])\n return new Price(this.token1, this.token0, result.denominator, result.numerator)\n }\n\n /**\n * Return the price of the given token in terms of the other token in the pair.\n * @param token token to return price of\n */\n public priceOf(token: Token): Price<Token, Token> {\n invariant(this.involvesToken(token), 'TOKEN')\n return token.equals(this.token0) ? this.token0Price : this.token1Price\n }\n\n /**\n * Returns the chain ID of the tokens in the pair.\n */\n public get chainId(): number {\n return this.token0.chainId\n }\n\n public get token0(): Token {\n return this.tokenAmounts[0].currency\n }\n\n public get token1(): Token {\n return this.tokenAmounts[1].currency\n }\n\n public get reserve0(): CurrencyAmount<Token> {\n return this.tokenAmounts[0]\n }\n\n public get reserve1(): CurrencyAmount<Token> {\n return this.tokenAmounts[1]\n }\n\n public reserveOf(token: Token): CurrencyAmount<Token> {\n invariant(this.involvesToken(token), 'TOKEN')\n return token.equals(this.token0) ? this.reserve0 : this.reserve1\n }\n\n public getOutputAmount(inputAmount: CurrencyAmount<Token>): [CurrencyAmount<Token>, ConstantProductPool] {\n invariant(this.involvesToken(inputAmount.currency), 'TOKEN')\n if (JSBI.equal(this.reserve0.quotient, ZERO) || JSBI.equal(this.reserve1.quotient, ZERO)) {\n throw new InsufficientReservesError()\n }\n const inputReserve = this.reserveOf(inputAmount.currency)\n const outputReserve = this.reserveOf(inputAmount.currency.equals(this.token0) ? this.token1 : this.token0)\n const inputAmountWithFee = JSBI.multiply(inputAmount.quotient, _997)\n const numerator = JSBI.multiply(inputAmountWithFee, outputReserve.quotient)\n const denominator = JSBI.add(JSBI.multiply(inputReserve.quotient, _1000), inputAmountWithFee)\n const outputAmount = CurrencyAmount.fromRawAmount(\n inputAmount.currency.equals(this.token0) ? this.token1 : this.token0,\n JSBI.divide(numerator, denominator)\n )\n if (JSBI.equal(outputAmount.quotient, ZERO)) {\n throw new InsufficientInputAmountError()\n }\n return [outputAmount, new ConstantProductPool(inputReserve.add(inputAmount), outputReserve.subtract(outputAmount))]\n }\n\n public getInputAmount(outputAmount: CurrencyAmount<Token>): [CurrencyAmount<Token>, ConstantProductPool] {\n invariant(this.involvesToken(outputAmount.currency), 'TOKEN')\n if (\n JSBI.equal(this.reserve0.quotient, ZERO) ||\n JSBI.equal(this.reserve1.quotient, ZERO) ||\n JSBI.greaterThanOrEqual(outputAmount.quotient, this.reserveOf(outputAmount.currency).quotient)\n ) {\n throw new InsufficientReservesError()\n }\n\n const outputReserve = this.reserveOf(outputAmount.currency)\n const inputReserve = this.reserveOf(outputAmount.currency.equals(this.token0) ? this.token1 : this.token0)\n const numerator = JSBI.multiply(JSBI.multiply(inputReserve.quotient, outputAmount.quotient), _1000)\n const denominator = JSBI.multiply(\n JSBI.subtract(outputReserve.quotient, outputAmount.quotient),\n _997 // 3%\n )\n const inputAmount = CurrencyAmount.fromRawAmount(\n outputAmount.currency.equals(this.token0) ? this.token1 : this.token0,\n JSBI.add(JSBI.divide(numerator, denominator), ONE)\n )\n return [\n inputAmount,\n new ConstantProductPool(inputReserve.add(inputAmount), outputReserve.subtract(outputAmount), this.fee, this.twap)\n ]\n }\n\n public getLiquidityMinted(\n totalSupply: CurrencyAmount<Token>,\n tokenAmountA: CurrencyAmount<Token>,\n tokenAmountB: CurrencyAmount<Token>\n ): CurrencyAmount<Token> {\n invariant(totalSupply.currency.equals(this.liquidityToken), 'LIQUIDITY')\n const tokenAmounts = tokenAmountA.currency.sortsBefore(tokenAmountB.currency) // does safety checks\n ? [tokenAmountA, tokenAmountB]\n : [tokenAmountB, tokenAmountA]\n invariant(tokenAmounts[0].currency.equals(this.token0) && tokenAmounts[1].currency.equals(this.token1), 'TOKEN')\n\n let liquidity: JSBI\n if (JSBI.equal(totalSupply.quotient, ZERO)) {\n liquidity = JSBI.subtract(\n sqrt(JSBI.multiply(tokenAmounts[0].quotient, tokenAmounts[1].quotient)),\n MINIMUM_LIQUIDITY\n )\n } else {\n const amount0 = JSBI.divide(JSBI.multiply(tokenAmounts[0].quotient, totalSupply.quotient), this.reserve0.quotient)\n const amount1 = JSBI.divide(JSBI.multiply(tokenAmounts[1].quotient, totalSupply.quotient), this.reserve1.quotient)\n liquidity = JSBI.lessThanOrEqual(amount0, amount1) ? amount0 : amount1\n }\n if (!JSBI.greaterThan(liquidity, ZERO)) {\n throw new InsufficientInputAmountError()\n }\n return CurrencyAmount.fromRawAmount(this.liquidityToken, liquidity)\n }\n\n public getLiquidityValue(\n token: Token,\n totalSupply: CurrencyAmount<Token>,\n liquidity: CurrencyAmount<Token>\n ): CurrencyAmount<Token> {\n invariant(this.involvesToken(token), 'TOKEN')\n invariant(totalSupply.currency.equals(this.liquidityToken), 'TOTAL_SUPPLY')\n invariant(liquidity.currency.equals(this.liquidityToken), 'LIQUIDITY')\n invariant(JSBI.lessThanOrEqual(liquidity.quotient, totalSupply.quotient), 'LIQUIDITY')\n return CurrencyAmount.fromRawAmount(\n token,\n JSBI.divide(JSBI.multiply(liquidity.quotient, this.reserveOf(token).quotient), totalSupply.quotient)\n )\n }\n}\n","import { keccak256, pack } from '@ethersproject/solidity'\n\nimport { INIT_CODE_HASH } from '../constants'\nimport { Token } from '../entities'\nimport { getCreate2Address } from '@ethersproject/address'\n\nexport const computePairAddress = ({\n factoryAddress,\n tokenA,\n tokenB\n}: {\n factoryAddress: string\n tokenA: Token\n tokenB: Token\n}): string => {\n const [token0, token1] = tokenA.sortsBefore(tokenB) ? [tokenA, tokenB] : [tokenB, tokenA] // does safety checks\n return getCreate2Address(\n factoryAddress,\n keccak256(['bytes'], [pack(['address', 'address'], [token0.address, token1.address])]),\n INIT_CODE_HASH[token0.chainId]\n )\n}\n","import { FACTORY_ADDRESS, FIVE, MINIMUM_LIQUIDITY, ONE, ZERO, _1000, _997 } from '../constants'\nimport { InsufficientInputAmountError, InsufficientReservesError } from '../errors'\n\nimport { BigintIsh } from '../types'\nimport { CurrencyAmount } from './CurrencyAmount'\nimport JSBI from 'jsbi'\nimport { Price } from './Price'\nimport { Token } from './Token'\nimport { computePairAddress } from '../functions/computePairAddress'\nimport invariant from 'tiny-invariant'\nimport { sqrt } from '../functions/sqrt'\n\nexport class Pair {\n public readonly liquidityToken: Token\n private readonly tokenAmounts: [CurrencyAmount<Token>, CurrencyAmount<Token>]\n\n public static getAddress(tokenA: Token, tokenB: Token): string {\n return computePairAddress({\n factoryAddress: FACTORY_ADDRESS[tokenA.chainId],\n tokenA,\n tokenB\n })\n }\n\n public constructor(currencyAmountA: CurrencyAmount<Token>, currencyAmountB: CurrencyAmount<Token>) {\n const currencyAmounts = currencyAmountA.currency.sortsBefore(currencyAmountB.currency) // does safety checks\n ? [currencyAmountA, currencyAmountB]\n : [currencyAmountB, currencyAmountA]\n this.liquidityToken = new Token(\n currencyAmounts[0].currency.chainId,\n Pair.getAddress(currencyAmounts[0].currency, currencyAmounts[1].currency),\n 18,\n 'UNI-V2',\n 'Uniswap V2'\n )\n this.tokenAmounts = currencyAmounts as [CurrencyAmount<Token>, CurrencyAmount<Token>]\n }\n\n /**\n * Returns true if the token is either token0 or token1\n * @param token to check\n */\n public involvesToken(token: Token): boolean {\n return token.equals(this.token0) || token.equals(this.token1)\n }\n\n /**\n * Returns the current mid price of the pair in terms of token0, i.e. the ratio of reserve1 to reserve0\n */\n public get token0Price(): Price<Token, Token> {\n const result = this.tokenAmounts[1].divide(this.tokenAmounts[0])\n return new Price(this.token0, this.token1, result.denominator, result.numerator)\n }\n\n /**\n * Returns the current mid price of the pair in terms of token1, i.e. the ratio of reserve0 to reserve1\n */\n public get token1Price(): Price<Token, Token> {\n const result = this.tokenAmounts[0].divide(this.tokenAmounts[1])\n return new Price(this.token1, this.token0, result.denominator, result.numerator)\n }\n\n /**\n * Return the price of the given token in terms of the other token in the pair.\n * @param token token to return price of\n */\n public priceOf(token: Token): Price<Token, Token> {\n invariant(this.involvesToken(token), 'TOKEN')\n return token.equals(this.token0) ? this.token0Price : this.token1Price\n }\n\n /**\n * Returns the chain ID of the tokens in the pair.\n */\n public get chainId(): number {\n return this.token0.chainId\n }\n\n public get token0(): Token {\n return this.tokenAmounts[0].currency\n }\n\n public get token1(): Token {\n return this.tokenAmounts[1].currency\n }\n\n public get reserve0(): CurrencyAmount<Token> {\n return this.tokenAmounts[0]\n }\n\n public get reserve1(): CurrencyAmount<Token> {\n return this.tokenAmounts[1]\n }\n\n public reserveOf(token: Token): CurrencyAmount<Token> {\n invariant(this.involvesToken(token), 'TOKEN')\n return token.equals(this.token0) ? this.reserve0 : this.reserve1\n }\n\n public getOutputAmount(inputAmount: CurrencyAmount<Token>): [CurrencyAmount<Token>, Pair] {\n invariant(this.involvesToken(inputAmount.currency), 'TOKEN')\n if (JSBI.equal(this.reserve0.quotient, ZERO) || JSBI.equal(this.reserve1.quotient, ZERO)) {\n throw new InsufficientReservesError()\n }\n const inputReserve = this.reserveOf(inputAmount.currency)\n const outputReserve = this.reserveOf(inputAmount.currency.equals(this.token0) ? this.token1 : this.token0)\n const inputAmountWithFee = JSBI.multiply(inputAmount.quotient, _997)\n const numerator = JSBI.multiply(inputAmountWithFee, outputReserve.quotient)\n const denominator = JSBI.add(JSBI.multiply(inputReserve.quotient, _1000), inputAmountWithFee)\n const outputAmount = CurrencyAmount.fromRawAmount(\n inputAmount.currency.equals(this.token0) ? this.token1 : this.token0,\n JSBI.divide(numerator, denominator)\n )\n if (JSBI.equal(outputAmount.quotient, ZERO)) {\n throw new InsufficientInputAmountError()\n }\n return [outputAmount, new Pair(inputReserve.add(inputAmount), outputReserve.subtract(outputAmount))]\n }\n\n public getInputAmount(outputAmount: CurrencyAmount<Token>): [CurrencyAmount<Token>, Pair] {\n invariant(this.involvesToken(outputAmount.currency), 'TOKEN')\n if (\n JSBI.equal(this.reserve0.quotient, ZERO) ||\n JSBI.equal(this.reserve1.quotient, ZERO) ||\n JSBI.greaterThanOrEqual(outputAmount.quotient, this.reserveOf(outputAmount.currency).quotient)\n ) {\n throw new InsufficientReservesError()\n }\n\n const outputReserve = this.reserveOf(outputAmount.currency)\n const inputReserve = this.reserveOf(outputAmount.currency.equals(this.token0) ? this.token1 : this.token0)\n const numerator = JSBI.multiply(JSBI.multiply(inputReserve.quotient, outputAmount.quotient), _1000)\n const denominator = JSBI.multiply(JSBI.subtract(outputReserve.quotient, outputAmount.quotient), _997)\n const inputAmount = CurrencyAmount.fromRawAmount(\n outputAmount.currency.equals(this.token0) ? this.token1 : this.token0,\n JSBI.add(JSBI.divide(numerator, denominator), ONE)\n )\n return [inputAmount, new Pair(inputReserve.add(inputAmount), outputReserve.subtract(outputAmount))]\n }\n\n public getLiquidityMinted(\n totalSupply: CurrencyAmount<Token>,\n tokenAmountA: CurrencyAmount<Token>,\n tokenAmountB: CurrencyAmount<Token>\n ): CurrencyAmount<Token> {\n invariant(totalSupply.currency.equals(this.liquidityToken), 'LIQUIDITY')\n const tokenAmounts = tokenAmountA.currency.sortsBefore(tokenAmountB.currency) // does safety checks\n ? [tokenAmountA, tokenAmountB]\n : [tokenAmountB, tokenAmountA]\n invariant(tokenAmounts[0].currency.equals(this.token0) && tokenAmounts[1].currency.equals(this.token1), 'TOKEN')\n\n let liquidity: JSBI\n if (JSBI.equal(totalSupply.quotient, ZERO)) {\n liquidity = JSBI.subtract(\n sqrt(JSBI.multiply(tokenAmounts[0].quotient, tokenAmounts[1].quotient)),\n MINIMUM_LIQUIDITY\n )\n } else {\n const amount0 = JSBI.divide(JSBI.multiply(tokenAmounts[0].quotient, totalSupply.quotient), this.reserve0.quotient)\n const amount1 = JSBI.divide(JSBI.multiply(tokenAmounts[1].quotient, totalSupply.quotient), this.reserve1.quotient)\n liquidity = JSBI.lessThanOrEqual(amount0, amount1) ? amount0 : amount1\n }\n if (!JSBI.greaterThan(liquidity, ZERO)) {\n throw new InsufficientInputAmountError()\n }\n return CurrencyAmount.fromRawAmount(this.liquidityToken, liquidity)\n }\n\n public getLiquidityValue(\n token: Token,\n totalSupply: CurrencyAmount<Token>,\n liquidity: CurrencyAmount<Token>,\n feeOn: boolean = false,\n kLast?: BigintIsh\n ): CurrencyAmount<Token> {\n invariant(this.involvesToken(token), 'TOKEN')\n invariant(totalSupply.currency.equals(this.liquidityToken), 'TOTAL_SUPPLY')\n invariant(liquidity.currency.equals(this.liquidityToken), 'LIQUIDITY')\n invariant(JSBI.lessThanOrEqual(liquidity.quotient, totalSupply.quotient), 'LIQUIDITY')\n\n let totalSupplyAdjusted: CurrencyAmount<Token>\n if (!feeOn) {\n totalSupplyAdjusted = totalSupply\n } else {\n invariant(!!kLast, 'K_LAST')\n const kLastParsed = JSBI.BigInt(kLast)\n if (!JSBI.equal(kLastParsed, ZERO)) {\n const rootK = sqrt(JSBI.multiply(this.reserve0.quotient, this.reserve1.quotient))\n const rootKLast = sqrt(kLastParsed)\n if (JSBI.greaterThan(rootK, rootKLast)) {\n const numerator = JSBI.multiply(totalSupply.quotient, JSBI.subtract(rootK, rootKLast))\n const denominator = JSBI.add(JSBI.multiply(rootK, FIVE), rootKLast)\n const feeLiquidity = JSBI.divide(numerator, denominator)\n totalSupplyAdjusted = totalSupply.add(CurrencyAmount.fromRawAmount(this.liquidityToken, feeLiquidity))\n } else {\n totalSupplyAdjusted = totalSupply\n }\n } else {\n totalSupplyAdjusted = totalSupply\n }\n }\n\n return CurrencyAmount.fromRawAmount(\n token,\n JSBI.divide(JSBI.multiply(liquidity.quotient, this.reserveOf(token).quotient), totalSupplyAdjusted.quotient)\n )\n }\n}\n","import { BigintIsh } from '../types'\nimport { Fraction } from './Fraction'\nimport JSBI from 'jsbi'\nimport { Rounding } from '../enums'\n\nconst ONE_HUNDRED = new Fraction(JSBI.BigInt(100))\n\n/**\n * Converts a fraction to a percent\n * @param fraction the fraction to convert\n */\nfunction toPercent(fraction: Fraction): Percent {\n return new Percent(fraction.numerator, fraction.denominator)\n}\n\nexport class Percent extends Fraction {\n /**\n * This boolean prevents a fraction from being interpreted as a Percent\n */\n public readonly isPercent: true = true\n\n add(other: Fraction | BigintIsh): Percent {\n return toPercent(super.add(other))\n }\n\n subtract(other: Fraction | BigintIsh): Percent {\n return toPercent(super.subtract(other))\n }\n\n multiply(other: Fraction | BigintIsh): Percent {\n return toPercent(super.multiply(other))\n }\n\n divide(other: Fraction | BigintIsh): Percent {\n return toPercent(super.divide(other))\n }\n\n public toSignificant(significantDigits: number = 5, format?: object, rounding?: Rounding): string {\n return super.multiply(ONE_HUNDRED).toSignificant(significantDigits, format, rounding)\n }\n\n public toFixed(decimalPlaces: number = 2, format?: object, rounding?: Rounding): string {\n return super.multiply(ONE_HUNDRED).toFixed(decimalPlaces, format, rounding)\n }\n}\n","import { Currency } from './Currency'\nimport { Pair } from './Pair'\nimport { Price } from './Price'\nimport { Token } from './Token'\nimport invariant from 'tiny-invariant'\n\nexport class Route<TInput extends Currency, TOutput extends Currency> {\n public readonly pairs: Pair[]\n public readonly path: Token[]\n public readonly input: TInput\n public readonly output: TOutput\n\n public constructor(pairs: Pair[], input: TInput, output: TOutput) {\n invariant(pairs.length > 0, 'PAIRS')\n const chainId: number = pairs[0].chainId\n invariant(\n pairs.every(pair => pair.chainId === chainId),\n 'CHAIN_IDS'\n )\n\n const wrappedInput = input.wrapped\n invariant(pairs[0].involvesToken(wrappedInput), 'INPUT')\n invariant(typeof output === 'undefined' || pairs[pairs.length - 1].involvesToken(output.wrapped), 'OUTPUT')\n\n const path: Token[] = [wrappedInput]\n for (const [i, pair] of pairs.entries()) {\n const currentInput = path[i]\n invariant(currentInput.equals(pair.token0) || currentInput.equals(pair.token1), 'PATH')\n const output = currentInput.equals(pair.token0) ? pair.token1 : pair.token0\n path.push(output)\n }\n\n this.pairs = pairs\n this.path = path\n this.input = input\n this.output = output\n }\n\n private _midPrice: Price<TInput, TOutput> | null = null\n\n public get midPrice(): Price<TInput, TOutput> {\n if (this._midPrice !== null) return this._midPrice\n const prices: Price<Currency, Currency>[] = []\n for (const [i, pair] of this.pairs.entries()) {\n prices.push(\n this.path[i].equals(pair.token0)\n ? new Price(pair.reserve0.currency, pair.reserve1.currency, pair.reserve0.quotient, pair.reserve1.quotient)\n : new Price(pair.reserve1.currency, pair.reserve0.currency, pair.reserve1.quotient, pair.reserve0.quotient)\n )\n }\n const reduced = prices.slice(1).reduce((accumulator, currentValue) => accumulator.multiply(currentValue), prices[0])\n return (this._midPrice = new Price(this.input, this.output, reduced.denominator, reduced.numerator))\n }\n\n public get chainId(): number {\n return this.pairs[0].chainId\n }\n}\n","import { Currency } from '../entities/Currency'\nimport { CurrencyAmount } from '../entities/CurrencyAmount'\nimport { Percent } from '../entities/Percent'\nimport { Price } from '../entities/Price'\n/**\n * Returns the percent difference between the mid price and the execution price, i.e. price impact.\n * @param midPrice mid price before the trade\n * @param inputAmount the input amount of the trade\n * @param outputAmount the output amount of the trade\n */\nexport function computePriceImpact<TBase extends Currency, TQuote extends Currency>(\n midPrice: Price<TBase, TQuote>,\n inputAmount: CurrencyAmount<TBase>,\n outputAmount: CurrencyAmount<TQuote>\n): Percent {\n const quotedOutputAmount = midPrice.quote(inputAmount)\n // calculate price impact := (exactQuote - outputAmount) / exactQuote\n const priceImpact = quotedOutputAmount.subtract(outputAmount).divide(quotedOutputAmount)\n return new Percent(priceImpact.numerator, priceImpact.denominator)\n}\n","import invariant from 'tiny-invariant'\n\n// given an array of items sorted by `comparator`, insert an item into its sort index and constrain the size to\n// `maxSize` by removing the last item\nexport function sortedInsert<T>(items: T[], add: T, maxSize: number, comparator: (a: T, b: T) => number): T | null {\n invariant(maxSize > 0, 'MAX_SIZE_ZERO')\n // this is an invariant because the interface cannot return multiple removed items if items.length exceeds maxSize\n invariant(items.length <= maxSize, 'ITEMS_SIZE')\n\n // short circuit first item add\n if (items.length === 0) {\n items.push(add)\n return null\n } else {\n const isFull = items.length === maxSize\n // short circuit if full and the additional item does not come before the last item\n if (isFull && comparator(items[items.length - 1], add) <= 0) {\n return add\n }\n\n let lo = 0,\n hi = items.length\n\n while (lo < hi) {\n const mid = (lo + hi) >>> 1\n if (comparator(items[mid], add) <= 0) {\n lo = mid + 1\n } else {\n hi = mid\n }\n }\n items.splice(lo, 0, add)\n return isFull ? items.pop()! : null\n }\n}\n","import { ONE, ZERO } from '../constants'\n\nimport { Currency } from './Currency'\nimport { CurrencyAmount } from './CurrencyAmount'\nimport { Fraction } from './Fraction'\nimport { Pair } from './Pair'\nimport { Percent } from './Percent'\nimport { Price } from './Price'\nimport { Route } from './Route'\nimport { Token } from './Token'\nimport { TradeType } from '../enums'\nimport { computePriceImpact } from '../functions/computePriceImpact'\nimport invariant from 'tiny-invariant'\nimport { sortedInsert } from '../functions/sortedInsert'\n\n// minimal interface so the input output comparator may be shared across types\ninterface InputOutput<TInput extends Currency, TOutput extends Currency> {\n readonly inputAmount: CurrencyAmount<TInput>\n readonly outputAmount: CurrencyAmount<TOutput>\n}\n\n// comparator function that allows sorting trades by their output amounts, in decreasing order, and then input amounts\n// in increasing order. i.e. the best trades have the most outputs for the least inputs and are sorted first\nexport function inputOutputComparator<TInput extends Currency, TOutput extends Currency>(\n a: InputOutput<TInput, TOutput>,\n b: InputOutput<TInput, TOutput>\n): number {\n // must have same input and output token for comparison\n invariant(a.inputAmount.currency.equals(b.inputAmount.currency), 'INPUT_CURRENCY')\n invariant(a.outputAmount.currency.equals(b.outputAmount.currency), 'OUTPUT_CURRENCY')\n if (a.outputAmount.equalTo(b.outputAmount)) {\n if (a.inputAmount.equalTo(b.inputAmount)) {\n return 0\n }\n // trade A requires less input than trade B, so A should come first\n if (a.inputAmount.lessThan(b.inputAmount)) {\n return -1\n } else {\n return 1\n }\n } else {\n // tradeA has less output than trade B, so should come second\n if (a.outputAmount.lessThan(b.outputAmount)) {\n return 1\n } else {\n return -1\n }\n }\n}\n\n// extension of the input output comparator that also considers other dimensions of the trade in ranking them\nexport function tradeComparator<TInput extends Currency, TOutput extends Currency, TTradeType extends TradeType>(\n a: Trade<TInput, TOutput, TTradeType>,\n b: Trade<TInput, TOutput, TTradeType>\n) {\n const ioComp = inputOutputComparator(a, b)\n if (ioComp !== 0) {\n return ioComp\n }\n\n // consider lowest slippage next, since these are less likely to fail\n if (a.priceImpact.lessThan(b.priceImpact)) {\n return -1\n } else if (a.priceImpact.greaterThan(b.priceImpact)) {\n return 1\n }\n\n // finally consider the number of hops since each hop costs gas\n return a.route.path.length - b.route.path.length\n}\n\nexport interface BestTradeOptions {\n // how many results to return\n maxNumResults?: number\n // the maximum number of hops a trade should contain\n maxHops?: number\n}\n\n/**\n * Represents a trade executed against a list of pairs.\n * Does not account for slippage, i.e. trades that front run this trade and move the price.\n */\nexport class Trade<TInput extends Currency, TOutput extends Currency, TTradeType extends TradeType> {\n /**\n * The route of the trade, i.e. which pairs the trade goes through and the input/output currencies.\n */\n public readonly route: Route<TInput, TOutput>\n /**\n * The type of the trade, either exact in or exact out.\n */\n public readonly tradeType: TTradeType\n /**\n * The input amount for the trade assuming no slippage.\n */\n public readonly inputAmount: CurrencyAmount<TInput>\n /**\n * The output amount for the trade assuming no slippage.\n */\n public readonly outputAmount: CurrencyAmount<TOutput>\n /**\n * The price expressed in terms of output amount/input amount.\n */\n public readonly executionPrice: Price<TInput, TOutput>\n /**\n * The percent difference between the mid price before the trade and the trade execution price.\n */\n public readonly priceImpact: Percent\n\n /**\n * Constructs an exact in trade with the given amount in and route\n * @param route route of the exact in trade\n * @param amountIn the amount being passed in\n */\n public static exactIn<TInput extends Currency, TOutput extends Currency>(\n route: Route<TInput, TOutput>,\n amountIn: CurrencyAmount<TInput>\n ): Trade<TInput, TOutput, TradeType.EXACT_INPUT> {\n return new Trade(route, amountIn, TradeType.EXACT_INPUT)\n }\n\n /**\n * Constructs an exact out trade with the given amount out and route\n * @param route route of the exact out trade\n * @param amountOut the amount returned by the trade\n */\n public static exactOut<TInput extends Currency, TOutput extends Currency>(\n route: Route<TInput, TOutput>,\n amountOut: CurrencyAmount<TOutput>\n ): Trade<TInput, TOutput, TradeType.EXACT_OUTPUT> {\n return new Trade(route, amountOut, TradeType.EXACT_OUTPUT)\n }\n\n public constructor(\n route: Route<TInput, TOutput>,\n amount: TTradeType extends TradeType.EXACT_INPUT ? CurrencyAmount<TInput> : CurrencyAmount<TOutput>,\n tradeType: TTradeType\n ) {\n this.route = route\n this.tradeType = tradeType\n\n const tokenAmounts: CurrencyAmount<Token>[] = new Array(route.path.length)\n if (tradeType === TradeType.EXACT_INPUT) {\n invariant(amount.currency.equals(route.input), 'INPUT')\n tokenAmounts[0] = amount.wrapped\n for (let i = 0; i < route.path.length - 1; i++) {\n const pair = route.pairs[i]\n const [outputAmount] = pair.getOutputAmount(tokenAmounts[i])\n tokenAmounts[i + 1] = outputAmount\n }\n this.inputAmount = CurrencyAmount.fromFractionalAmount(route.input, amount.numerator, amount.denominator)\n this.outputAmount = CurrencyAmount.fromFractionalAmount(\n route.output,\n tokenAmounts[tokenAmounts.length - 1].numerator,\n tokenAmounts[tokenAmounts.length - 1].denominator\n )\n } else {\n invariant(amount.currency.equals(route.output), 'OUTPUT')\n tokenAmounts[tokenAmounts.length - 1] = amount.wrapped\n for (let i = route.path.length - 1; i > 0; i--) {\n const pair = route.pairs[i - 1]\n const [inputAmount] = pair.getInputAmount(tokenAmounts[i])\n tokenAmounts[i - 1] = inputAmount\n }\n this.inputAmount = CurrencyAmount.fromFractionalAmount(\n route.input,\n tokenAmounts[0].numerator,\n tokenAmounts[0].denominator\n )\n this.outputAmount = CurrencyAmount.fromFractionalAmount(route.output, amount.numerator, amount.denominator)\n }\n this.executionPrice = new Price(\n this.inputAmount.currency,\n this.outputAmount.currency,\n this.inputAmount.quotient,\n this.outputAmount.quotient\n )\n this.priceImpact = computePriceImpact(route.midPrice, this.inputAmount, this.outputAmount)\n }\n\n /**\n * Get the minimum amount that must be received from this trade for the given slippage tolerance\n * @param slippageTolerance tolerance of unfavorable slippage from the execution price of this trade\n */\n public minimumAmountOut(slippageTolerance: Percent): CurrencyAmount<TOutput> {\n invariant(!slippageTolerance.lessThan(ZERO), 'SLIPPAGE_TOLERANCE')\n if (this.tradeType === TradeType.EXACT_OUTPUT) {\n return this.outputAmount\n } else {\n const slippageAdjustedAmountOut = new Fraction(ONE)\n .add(slippageTolerance)\n .invert()\n .multiply(this.outputAmount.quotient).quotient\n return CurrencyAmount.fromRawAmount(this.outputAmount.currency, slippageAdjustedAmountOut)\n }\n }\n\n /**\n * Get the maximum amount in that can be spent via this trade for the given slippage tolerance\n * @param slippageTolerance tolerance of unfavorable slippage from the execution price of this trade\n */\n public maximumAmountIn(slippageTolerance: Percent): CurrencyAmount<TInput> {\n invariant(!slippageTolerance.lessThan(ZERO), 'SLIPPAGE_TOLERANCE')\n if (this.tradeType === TradeType.EXACT_INPUT) {\n return this.inputAmount\n } else {\n const slippageAdjustedAmountIn = new Fraction(ONE).add(slippageTolerance).multiply(this.inputAmount.quotient)\n .quotient\n return CurrencyAmount.fromRawAmount(this.inputAmount.currency, slippageAdjustedAmountIn)\n }\n }\n\n /**\n * Given a list of pairs, and a fixed amount in, returns the top `maxNumResults` trades that go from an input token\n * amount to an output token, making at most `maxHops` hops.\n * Note this does not consider aggregation, as routes are linear. It's possible a better route exists by splitting\n * the amount in among multiple routes.\n * @param pairs the pairs to consider in finding the best trade\n * @param nextAmountIn exact amount of input currency to spend\n * @param currencyOut the desired currency out\n * @param maxNumResults maximum number of results to return\n * @param maxHops maximum number of hops a returned trade can make, e.g. 1 hop goes through a single pair\n * @param currentPairs used in recursion; the current list of pairs\n * @param currencyAmountIn used in recursion; the original value of the currencyAmountIn parameter\n * @param bestTrades used in recursion; the current list of best trades\n */\n public static bestTradeExactIn<TInput extends Currency, TOutput extends Currency>(\n pairs: Pair[],\n currencyAmountIn: CurrencyAmount<TInput>,\n currencyOut: TOutput,\n { maxNumResults = 3, maxHops = 3 }: BestTradeOptions = {},\n // used in recursion.\n currentPairs: Pair[] = [],\n nextAmountIn: CurrencyAmount<Currency> = currencyAmountIn,\n bestTrades: Trade<TInput, TOutput, TradeType.EXACT_INPUT>[] = []\n ): Trade<TInput, TOutput, TradeType.EXACT_INPUT>[] {\n invariant(pairs.length > 0, 'PAIRS')\n invariant(maxHops > 0, 'MAX_HOPS')\n invariant(currencyAmountIn === nextAmountIn || currentPairs.length > 0, 'INVALID_RECURSION')\n\n const amountIn = nextAmountIn.wrapped\n const tokenOut = currencyOut.wrapped\n for (let i = 0; i < pairs.length; i++) {\n const pair = pairs[i]\n // pair irrelevant\n if (!pair.token0.equals(amountIn.currency) && !pair.token1.equals(amountIn.currency)) continue\n if (pair.reserve0.equalTo(ZERO) || pair.reserve1.equalTo(ZERO)) continue\n\n let amountOut: CurrencyAmount<Token>\n try {\n ;[amountOut] = pair.getOutputAmount(amountIn)\n } catch (error) {\n // input too low\n if (error.isInsufficientInputAmountError) {\n continue\n }\n throw error\n }\n // we have arrived at the output token, so this is the final trade of one of the paths\n if (amountOut.currency.equals(tokenOut)) {\n sortedInsert(\n bestTrades,\n new Trade(\n new Route([...currentPairs, pair], currencyAmountIn.currency, currencyOut),\n currencyAmountIn,\n TradeType.EXACT_INPUT\n ),\n maxNumResults,\n tradeComparator\n )\n } else if (maxHops > 1 && pairs.length > 1) {\n const pairsExcludingThisPair = pairs.slice(0, i).concat(pairs.slice(i + 1, pairs.length))\n\n // otherwise, consider all the other paths that lead from this token as long as we have not exceeded maxHops\n Trade.bestTradeExactIn(\n pairsExcludingThisPair,\n currencyAmountIn,\n currencyOut,\n {\n maxNumResults,\n maxHops: maxHops - 1\n },\n [...currentPairs, pair],\n amountOut,\n bestTrades\n )\n }\n }\n\n return bestTrades\n }\n\n /**\n * Return the execution price after accounting for slippage tolerance\n * @param slippageTolerance the allowed tolerated slippage\n */\n public worstExecutionPrice(slippageTolerance: Percent): Price<TInput, TOutput> {\n return new Price(\n this.inputAmount.currency,\n this.outputAmount.currency,\n this.maximumAmountIn(slippageTolerance).quotient,\n this.minimumAmountOut(slippageTolerance).quotient\n )\n }\n\n /**\n * similar to the above method but instead targets a fixed output amount\n * given a list of pairs, and a fixed amount out, returns the top `maxNumResults` trades that go from an input token\n * to an output token amount, making at most `maxHops` hops\n * note this does not consider aggregation, as routes are linear. it's possible a better route exists by splitting\n * the amount in among multiple routes.\n * @param pairs the pairs to consider in finding the best trade\n * @param currencyIn the currency to spend\n * @param nextAmountOut the exact amount of currency out\n * @param maxNumResults maximum number of results to return\n * @param maxHops maximum number of hops a returned trade can make, e.g. 1 hop goes through a single pair\n * @param currentPairs used in recursion; the current list of pairs\n * @param currencyAmountOut used in recursion; the original value of the currencyAmountOut parameter\n * @param bestTrades used in recursion; the current list of best trades\n */\n public static bestTradeExactOut<TInput extends Currency, TOutput extends Currency>(\n pairs: Pair[],\n currencyIn: TInput,\n currencyAmountOut: CurrencyAmount<TOutput>,\n { maxNumResults = 3, maxHops = 3 }: BestTradeOptions = {},\n // used in recursion.\n currentPairs: Pair[] = [],\n nextAmountOut: CurrencyAmount<Currency> = currencyAmountOut,\n bestTrades: Trade<TInput, TOutput, TradeType.EXACT_OUTPUT>[] = []\n ): Trade<TInput, TOutput, TradeType.EXACT_OUTPUT>[] {\n invariant(pairs.length > 0, 'PAIRS')\n invariant(maxHops > 0, 'MAX_HOPS')\n invariant(currencyAmountOut === nextAmountOut || currentPairs.length > 0, 'INVALID_RECURSION')\n\n const amountOut = nextAmountOut.wrapped\n const tokenIn = currencyIn.wrapped\n for (let i = 0; i < pairs.length; i++) {\n const pair = pairs[i]\n // pair irrelevant\n if (!pair.token0.equals(amountOut.currency) && !pair.token1.equals(amountOut.currency)) continue\n if (pair.reserve0.equalTo(ZERO) || pair.reserve1.equalTo(ZERO)) continue\n\n let amountIn: CurrencyAmount<Token>\n try {\n ;[amountIn] = pair.getInputAmount(amountOut)\n } catch (error) {\n // not enough liquidity in this pair\n if (error.isInsufficientReservesError) {\n continue\n }\n throw error\n }\n // we have arrived at the input token, so this is the first trade of one of the paths\n if (amountIn.currency.equals(tokenIn)) {\n sortedInsert(\n bestTrades,\n new Trade(\n new Route([pair, ...currentPairs], currencyIn, currencyAmountOut.currency),\n currencyAmountOut,\n TradeType.EXACT_OUTPUT\n ),\n maxNumResults,\n tradeComparator\n )\n } else if (maxHops > 1 && pairs.length > 1) {\n const pairsExcludingThisPair = pairs.slice(0, i).concat(pairs.slice(i + 1, pairs.length))\n\n // otherwise, consider all the other paths that arrive at this token as long as we have not exceeded maxHops\n Trade.bestTradeExactOut(\n pairsExcludingThisPair,\n currencyIn,\n currencyAmountOut,\n {\n maxNumResults,\n maxHops: maxHops - 1\n },\n [pair, ...currentPairs],\n amountIn,\n bestTrades\n )\n }\n }\n\n return bestTrades\n }\n}\n","import { BigNumber } from '@ethersproject/bignumber'\n\nexport interface RToken {\n name: string\n address: string\n}\n\nexport enum PoolType {\n ConstantProduct = 'ConstantProduct',\n Weighted = 'Weighted',\n Hybrid = 'Hybrid',\n ConcentratedLiquidity = 'ConcentratedLiquidity'\n}\n\nexport interface PoolInfo {\n address: string\n token0: RToken\n token1: RToken\n type: PoolType\n reserve0: BigNumber\n reserve1: BigNumber\n fee: number\n minLiquidity: number\n swapGasCost: number\n}\n\ntype Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>\ntype PartialBy<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>\ntype PoolInfoWithDefaults = PartialBy<PoolInfo, 'minLiquidity' | 'swapGasCost'>\n\nexport class Pool {\n address: string\n token0: RToken\n token1: RToken\n type: PoolType\n reserve0: BigNumber\n reserve1: BigNumber\n fee: number\n minLiquidity: number\n swapGasCost: number\n\n constructor(_info: PoolInfoWithDefaults) {\n const info = {\n minLiquidity: 1000,\n swapGasCost: 40_000,\n ..._info\n }\n this.address = info.address\n this.token0 = info.token0\n this.token1 = info.token1\n this.type = info.type\n this.reserve0 = info.reserve0\n this.reserve1 = info.reserve1\n this.fee = info.fee\n this.minLiquidity = info.minLiquidity\n this.swapGasCost = info.swapGasCost\n }\n}\n\ntype PoolInfoNoType = Omit<PoolInfoWithDefaults, 'type'>\n\nexport class RConstantProductPool extends Pool {\n constructor(info: PoolInfoNoType) {\n super({\n type: PoolType.ConstantProduct,\n ...info\n })\n }\n}\n\ntype HybridPoolInfo = PoolInfoNoType & { A: number }\n\nexport class RHybridPool extends Pool {\n A: number\n constructor(info: HybridPoolInfo) {\n super({\n type: PoolType.Hybrid,\n ...info\n })\n this.A = info.A\n }\n}\n\ntype WeightedPoolInfo = PoolInfoNoType & { weight0: number; weight1: number }\n\nexport class RWeightedPool extends Pool {\n weight0: number\n weight1: number\n constructor(info: WeightedPoolInfo) {\n super({\n type: PoolType.Weighted,\n ...info\n })\n this.weight0 = info.weight0\n this.weight1 = info.weight1\n }\n}\n\nexport const CL_MIN_TICK = -887272\nexport const CL_MAX_TICK = -CL_MIN_TICK - 1\ninterface CLTick {\n index: number\n DLiquidity: number\n}\n\ninterface CLSpecific {\n liquidity: number\n sqrtPrice: number\n nearestTick: number\n ticks: CLTick[]\n}\n\ntype CLPoolInfo = Omit<PoolInfoNoType, 'reserve0' | 'reserve1'> & CLSpecific\n\nexport class RConcentratedLiquidityPool extends Pool {\n liquidity: number\n sqrtPrice: number\n nearestTick: number\n ticks: CLTick[]\n constructor(info: CLPoolInfo) {\n super({\n type: PoolType.ConcentratedLiquidity,\n reserve0: BigNumber.from(0),\n reserve1: BigNumber.from(0),\n ...info\n })\n this.liquidity = info.liquidity\n this.sqrtPrice = info.sqrtPrice\n this.nearestTick = info.nearestTick\n this.ticks = info.ticks\n }\n}\n\nexport interface RouteLeg {\n address: string\n token: RToken\n swapPortion: number // For router contract\n absolutePortion: number // To depict at webpage for user\n}\n\nexport enum RouteStatus {\n Success = 'Success',\n NoWay = 'NoWay',\n Partial = 'Partial'\n}\nexport interface MultiRoute {\n status: RouteStatus\n amountIn: number\n amountOut: number\n legs: RouteLeg[]\n gasSpent: number\n totalAmountOut: number\n}\n","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar runtime = (function (exports) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n function define(obj, key, value) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n return obj[key];\n }\n try {\n // IE 8 has a broken Object.defineProperty that only works on DOM objects.\n define({}, \"\");\n } catch (err) {\n define = function(obj, key, value) {\n return obj[key] = value;\n };\n }\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n exports.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n define(IteratorPrototype, iteratorSymbol, function () {\n return this;\n });\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = GeneratorFunctionPrototype;\n define(Gp, \"constructor\", GeneratorFunctionPrototype);\n define(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction);\n GeneratorFunction.displayName = define(\n GeneratorFunctionPrototype,\n toStringTagSymbol,\n \"GeneratorFunction\"\n );\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n define(prototype, method, function(arg) {\n return this._invoke(method, arg);\n });\n });\n }\n\n exports.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n exports.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n define(genFun, toStringTagSymbol, \"GeneratorFunction\");\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n exports.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator, PromiseImpl) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return PromiseImpl.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return PromiseImpl.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration.\n result.value = unwrapped;\n resolve(result);\n }, function(error) {\n // If a rejected Promise was yielded, throw the rejection back\n // into the async generator function so it can be handled there.\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new PromiseImpl(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n define(AsyncIterator.prototype, asyncIteratorSymbol, function () {\n return this;\n });\n exports.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n if (PromiseImpl === void 0) PromiseImpl = Promise;\n\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList),\n PromiseImpl\n );\n\n return exports.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n // Note: [\"return\"] must be used for ES3 parsing compatibility.\n if (delegate.iterator[\"return\"]) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n define(Gp, toStringTagSymbol, \"Generator\");\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n define(Gp, iteratorSymbol, function() {\n return this;\n });\n\n define(Gp, \"toString\", function() {\n return \"[object Generator]\";\n });\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n exports.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n exports.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n\n // Regardless of whether this script is executing as a CommonJS module\n // or not, return the runtime object so that we can declare the variable\n // regeneratorRuntime in the outer scope, which allows this module to be\n // injected easily by `bin/regenerator --include-runtime script.js`.\n return exports;\n\n}(\n // If this script is executing as a CommonJS module, use module.exports\n // as the regeneratorRuntime namespace. Otherwise create a new empty\n // object. Either way, the resulting object will be used to initialize\n // the regeneratorRuntime variable at the top of this file.\n typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n // This module should not be running in strict mode, so the above\n // assignment should always work unless something is misconfigured. Just\n // in case runtime.js accidentally runs in strict mode, in modern engines\n // we can explicitly access globalThis. In older engines we can escape\n // strict mode using a global Function call. This could conceivably fail\n // if a Content Security Policy forbids using Function, but in that case\n // the proper solution is to fix the accidental strict mode problem. If\n // you've misconfigured your bundler to force strict mode and applied a\n // CSP to forbid Function, and you're not willing to fix either of those\n // problems, please detail your unique predicament in a GitHub issue.\n if (typeof globalThis === \"object\") {\n globalThis.regeneratorRuntime = runtime;\n } else {\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n }\n}\n","export const types = {\n EIP712Domain: [\n { name: 'name', type: 'string' },\n { name: 'chainId', type: 'uint256' },\n { name: 'verifyingContract', type: 'address' }\n ],\n LimitOrder: [\n { name: 'maker', type: 'address' },\n { name: 'tokenIn', type: 'address' },\n { name: 'tokenOut', type: 'address' },\n { name: 'amountIn', type: 'uint256' },\n { name: 'amountOut', type: 'uint256' },\n { name: 'recipient', type: 'address' },\n { name: 'startTime', type: 'uint256' },\n { name: 'endTime', type: 'uint256' },\n { name: 'stopPrice', type: 'uint256' },\n { name: 'oracleAddress', type: 'address' },\n { name: 'oracleData', type: 'bytes32' }\n ]\n}\n\nexport const bentoTypes = {\n EIP712Domain: [\n { name: 'name', type: 'string' },\n { name: 'chainId', type: 'uint256' },\n { name: 'verifyingContract', type: 'address' }\n ],\n SetMasterContractApproval: [\n { name: 'warning', type: 'string' },\n { name: 'user', type: 'address' },\n { name: 'masterContract', type: 'address' },\n { name: 'approved', type: 'bool' },\n { name: 'nonce', type: 'uint256' }\n ]\n}\nexport const name = 'LimitOrder'\n","import { BENTOBOX_ADDRESS, STOP_LIMIT_ORDER_ADDRESS } from '../constants'\nimport { bentoTypes, name, types } from '../types'\n\nimport { ChainId } from '../enums'\nimport { SigningKey } from '@ethersproject/signing-key'\nimport { Web3Provider } from '@ethersproject/providers'\nimport { getMessage } from 'eip-712'\nimport { splitSignature } from '@ethersproject/bytes'\n\nexport interface Domain {\n name: string\n chainId: ChainId\n verifyingContract: string\n}\n\nexport interface Message {\n maker: string\n tokenIn: string\n tokenOut: string\n amountIn: string\n amountOut: string\n recipient: string\n startTime: string\n endTime: string\n stopPrice: string\n oracleAddress: string\n oracleData: string\n}\n\nexport interface BentoApprovalMessage {\n warning: string\n user: string\n masterContract: string\n approved: boolean\n nonce: number\n}\n\nexport const getSignature = (message: Message, chainId: ChainId, privateKey: string) => {\n let domain: Domain = {\n name: name,\n chainId: chainId,\n verifyingContract: STOP_LIMIT_ORDER_ADDRESS[chainId]\n }\n return sign({ types, primaryType: 'LimitOrder', domain, message }, privateKey)\n}\n\nexport const getTypedData = (message: Message, chainId: ChainId) => {\n let domain: Domain = {\n name: name,\n chainId: chainId,\n verifyingContract: STOP_LIMIT_ORDER_ADDRESS[chainId]\n }\n return { types, primaryType: 'LimitOrder', domain, message }\n}\n\nexport const getTypedDataBento = (message: BentoApprovalMessage, chainId: ChainId) => {\n let domain: Domain = {\n name: 'BentoBox V1',\n chainId: chainId,\n verifyingContract: BENTOBOX_ADDRESS[chainId]\n }\n return {\n types: bentoTypes,\n primaryType: 'SetMasterContractApproval',\n domain,\n message\n }\n}\n\nexport const getTypeHash = (typedData: any) => {\n let message = getMessage(typedData, true).toString('hex')\n return `0x${message}`\n}\n\nconst sign = (typedData: any, privateKey: string) => {\n let message = getMessage(typedData, true)\n const signingKey = new SigningKey(privateKey)\n const { v, r, s } = signingKey.signDigest(message)\n return { v, r, s }\n}\n\nexport const getSignatureWithProvider = async (\n message: Message,\n chainId: ChainId,\n provider: Web3Provider\n): Promise<{ v: number; r: string; s: string }> => {\n const typedData = getTypedData(message, chainId)\n const signature = await provider.send('eth_signTypedData_v4', [message.maker, JSON.stringify(typedData)])\n const { v, r, s } = splitSignature(signature)\n return { v, r, s }\n}\n\nexport const getSignatureWithProviderBentobox = async (\n message: BentoApprovalMessage,\n chainId: ChainId,\n provider: Web3Provider\n): Promise<{ v: number; r: string; s: string }> => {\n const typedData = getTypedDataBento(message, chainId)\n const signature = await provider.send('eth_signTypedData_v4', [message.user, JSON.stringify(typedData)])\n const { v, r, s } = splitSignature(signature)\n return { v, r, s }\n}\n\nexport const getSignatureBento = async (bentoApproval: BentoApprovalMessage, chainId: ChainId, privateKey: string) => {\n let domain: Domain = {\n name: 'BentoBox V1',\n chainId: chainId,\n verifyingContract: BENTOBOX_ADDRESS[chainId]\n }\n return sign(\n {\n types: bentoTypes,\n primaryType: 'SetMasterContractApproval',\n domain,\n message: bentoApproval\n },\n privateKey\n )\n}\n","import { Currency } from './entities/Currency'\nimport { CurrencyAmount } from './entities/CurrencyAmount'\nimport { Percent } from './entities/Percent'\nimport { Token } from './entities/Token'\nimport { Trade } from './entities/Trade'\nimport { TradeType } from './enums/TradeType'\nimport invariant from 'tiny-invariant'\nimport { validateAndParseAddress } from './functions/validateAndParseAddress'\n\n/**\n * Options for producing the arguments to send call to the router.\n */\nexport interface TradeOptions {\n /**\n * How much the execution price is allowed to move unfavorably from the trade execution price.\n */\n allowedSlippage: Percent\n /**\n * How long the swap is valid until it expires, in seconds.\n * This will be used to produce a `deadline` parameter which is computed from when the swap call parameters\n * are generated.\n */\n ttl: number\n /**\n * The account that should receive the output of the swap.\n */\n recipient: string\n\n /**\n * Whether any of the tokens in the path are fee on transfer tokens, which should be handled with special methods\n */\n feeOnTransfer?: boolean\n}\n\nexport interface TradeOptionsDeadline extends Omit<TradeOptions, 'ttl'> {\n /**\n * When the transaction expires.\n * This is an atlernate to specifying the ttl, for when you do not want to use local time.\n */\n deadline: number\n}\n\n/**\n * The parameters to use in the call to the Uniswap V2 Router to execute a trade.\n */\nexport interface SwapParameters {\n /**\n * The method to call on the Uniswap V2 Router.\n */\n methodName: string\n /**\n * The arguments to pass to the method, all hex encoded.\n */\n args: (string | string[])[]\n /**\n * The amount of wei to send in hex.\n */\n value: string\n}\n\nexport function toHex(currencyAmount: CurrencyAmount<Currency>) {\n return `0x${currencyAmount.quotient.toString(16)}`\n}\n\nconst ZERO_HEX = '0x0'\n\n/**\n * Represents the Uniswap V2 Router, and has static methods for helping execute trades.\n */\nexport abstract class Router {\n /**\n * Cannot be constructed.\n */\n private constructor() {}\n /**\n * Produces the on-chain method name to call and the hex encoded parameters to pass as arguments for a given trade.\n * @param trade to produce call parameters for\n * @param options options for the call parameters\n */\n public static swapCallParameters(\n trade: Trade<Currency, Currency, TradeType>,\n options: TradeOptions | TradeOptionsDeadline\n ): SwapParameters {\n const etherIn = trade.inputAmount.currency.isNative\n const etherOut = trade.outputAmount.currency.isNative\n // the router does not support both ether in and out\n invariant(!(etherIn && etherOut), 'ETHER_IN_OUT')\n invariant(!('ttl' in options) || options.ttl > 0, 'TTL')\n\n const to: string = validateAndParseAddress(options.recipient)\n const amountIn: string = toHex(trade.maximumAmountIn(options.allowedSlippage))\n const amountOut: string = toHex(trade.minimumAmountOut(options.allowedSlippage))\n const path: string[] = trade.route.path.map((token: Token) => token.address)\n const deadline =\n 'ttl' in options\n ? `0x${(Math.floor(new Date().getTime() / 1000) + options.ttl).toString(16)}`\n : `0x${options.deadline.toString(16)}`\n\n const useFeeOnTransfer = Boolean(options.feeOnTransfer)\n\n let methodName: string\n let args: (string | string[])[]\n let value: string\n switch (trade.tradeType) {\n case TradeType.EXACT_INPUT:\n if (etherIn) {\n methodName = useFeeOnTransfer ? 'swapExactETHForTokensSupportingFeeOnTransferTokens' : 'swapExactETHForTokens'\n // (uint amountOutMin, address[] calldata path, address to, uint deadline)\n args = [amountOut, path, to, deadline]\n value = amountIn\n } else if (etherOut) {\n methodName = useFeeOnTransfer ? 'swapExactTokensForETHSupportingFeeOnTransferTokens' : 'swapExactTokensForETH'\n // (uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)\n args = [amountIn, amountOut, path, to, deadline]\n value = ZERO_HEX\n } else {\n methodName = useFeeOnTransfer\n ? 'swapExactTokensForTokensSupportingFeeOnTransferTokens'\n : 'swapExactTokensForTokens'\n // (uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)\n args = [amountIn, amountOut, path, to, deadline]\n value = ZERO_HEX\n }\n break\n case TradeType.EXACT_OUTPUT:\n invariant(!useFeeOnTransfer, 'EXACT_OUT_FOT')\n if (etherIn) {\n methodName = 'swapETHForExactTokens'\n // (uint amountOut, address[] calldata path, address to, uint deadline)\n args = [amountOut, path, to, deadline]\n value = amountIn\n } else if (etherOut) {\n methodName = 'swapTokensForExactETH'\n // (uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)\n args = [amountOut, amountIn, path, to, deadline]\n value = ZERO_HEX\n } else {\n methodName = 'swapTokensForExactTokens'\n // (uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)\n args = [amountOut, amountIn, path, to, deadline]\n value = ZERO_HEX\n }\n break\n }\n return {\n methodName,\n args,\n value\n }\n }\n}\n","import { BigNumber } from '@ethersproject/bignumber'\nimport {\n Pool,\n PoolType,\n RHybridPool,\n RWeightedPool,\n RConcentratedLiquidityPool,\n CL_MIN_TICK,\n CL_MAX_TICK\n} from '../types/MultiRouterTypes'\n\nconst A_PRECISION = 100\n\nconst DCacheBN = new Map<Pool, BigNumber>()\nexport function HybridComputeLiquidity(pool: RHybridPool): BigNumber {\n const res = DCacheBN.get(pool)\n if (res !== undefined) return res\n\n const r0 = pool.reserve0\n const r1 = pool.reserve1\n\n if (r0.isZero() && r1.isZero()) {\n DCacheBN.set(pool, BigNumber.from(0))\n return BigNumber.from(0)\n }\n const s = r0.add(r1)\n\n const nA = BigNumber.from(pool.A * 2)\n\n let prevD\n\n let D = s\n for (let i = 0; i < 256; i++) {\n const dP = D.mul(D)\n .div(r0)\n .mul(D)\n .div(r1)\n .div(4)\n prevD = D\n D = nA\n .mul(s)\n .div(A_PRECISION)\n .add(dP.mul(2))\n .mul(D)\n .div(\n nA\n .div(A_PRECISION)\n .sub(1)\n .mul(D)\n .add(dP.mul(3))\n )\n if (\n D.sub(prevD)\n .abs()\n .lte(1)\n ) {\n break\n }\n }\n DCacheBN.set(pool, D)\n return D\n}\n\nexport function HybridgetY(pool: RHybridPool, x: BigNumber): BigNumber {\n const D = HybridComputeLiquidity(pool)\n\n const nA = pool.A * 2\n\n let c = D.mul(D)\n .div(x.mul(2))\n .mul(D)\n .div((nA * 2) / A_PRECISION)\n let b = D.mul(A_PRECISION)\n .div(nA)\n .add(x)\n\n let yPrev\n let y = D\n for (let i = 0; i < 256; i++) {\n yPrev = y\n\n y = y\n .mul(y)\n .add(c)\n .div(\n y\n .mul(2)\n .add(b)\n .sub(D)\n )\n if (\n y\n .sub(yPrev)\n .abs()\n .lte(1)\n ) {\n break\n }\n }\n return y\n}\n\nexport function calcOutByIn(pool: Pool, amountIn: number, direction = true): number {\n const xBN = direction ? pool.reserve0 : pool.reserve1\n const yBN = direction ? pool.reserve1 : pool.reserve0\n switch (pool.type) {\n case PoolType.ConstantProduct: {\n const x = parseInt(xBN.toString())\n const y = parseInt(yBN.toString())\n return (y * amountIn) / (x / (1 - pool.fee) + amountIn)\n }\n case PoolType.Weighted: {\n const x = parseInt(xBN.toString())\n const y = parseInt(yBN.toString())\n const wPool = pool as RWeightedPool\n const weightRatio = direction ? wPool.weight0 / wPool.weight1 : wPool.weight1 / wPool.weight0\n const actualIn = amountIn * (1 - pool.fee)\n const out = y * (1 - Math.pow(x / (x + actualIn), weightRatio))\n return out\n }\n case PoolType.Hybrid: {\n // const xNew = x + amountIn*(1-pool.fee);\n // const yNew = HybridgetY(pool, xNew);\n // const dy = y - yNew;\n\n const xNewBN = xBN.add(getBigNumber(undefined, amountIn * (1 - pool.fee)))\n const yNewBN = HybridgetY(pool as RHybridPool, xNewBN)\n const dy = parseInt(yBN.sub(yNewBN).toString())\n\n return dy\n }\n case PoolType.ConcentratedLiquidity: {\n return ConcentratedLiquidityOutByIn(pool as RConcentratedLiquidityPool, amountIn, direction)\n }\n }\n}\n\nexport class OutOfLiquidity extends Error {}\n\nfunction ConcentratedLiquidityOutByIn(pool: RConcentratedLiquidityPool, inAmount: number, direction: boolean) {\n if (pool.ticks.length === 0) return 0\n if (pool.ticks[0].index > CL_MIN_TICK) pool.ticks.unshift({ index: CL_MIN_TICK, DLiquidity: 0 })\n if (pool.ticks[pool.ticks.length - 1].index < CL_MAX_TICK) pool.ticks.push({ index: CL_MAX_TICK, DLiquidity: 0 })\n\n let nextTickToCross = direction ? pool.nearestTick : pool.nearestTick + 1\n let currentPrice = pool.sqrtPrice\n let currentLiquidity = pool.liquidity\n let outAmount = 0\n let input = inAmount\n\n while (input > 0) {\n if (nextTickToCross < 0 || nextTickToCross >= pool.ticks.length) throw new OutOfLiquidity()\n\n const nextTickPrice = Math.sqrt(Math.pow(1.0001, pool.ticks[nextTickToCross].index))\n // console.log('L, P, tick, nextP', currentLiquidity,\n // currentPrice, pool.ticks[nextTickToCross].index, nextTickPrice);\n let output = 0\n\n if (direction) {\n const maxDx = (currentLiquidity * (currentPrice - nextTickPrice)) / currentPrice / nextTickPrice\n //console.log('input, maxDx', input, maxDx);\n\n if (input <= maxDx) {\n output = (currentLiquidity * currentPrice * input) / (input + currentLiquidity / currentPrice)\n input = 0\n } else {\n output = currentLiquidity * (currentPrice - nextTickPrice)\n currentPrice = nextTickPrice\n input -= maxDx\n if (pool.ticks[nextTickToCross].index % 2 === 0) {\n currentLiquidity -= pool.ticks[nextTickToCross].DLiquidity\n } else {\n currentLiquidity += pool.ticks[nextTickToCross].DLiquidity\n }\n nextTickToCross--\n }\n } else {\n const maxDy = currentLiquidity * (nextTickPrice - currentPrice)\n //console.log('input, maxDy', input, maxDy);\n if (input <= maxDy) {\n output = input / currentPrice / (currentPrice + input / currentLiquidity)\n input = 0\n } else {\n output = (currentLiquidity * (nextTickPrice - currentPrice)) / currentPrice / nextTickPrice\n currentPrice = nextTickPrice\n input -= maxDy\n if (pool.ticks[nextTickToCross].index % 2 === 0) {\n currentLiquidity += pool.ticks[nextTickToCross].DLiquidity\n } else {\n currentLiquidity -= pool.ticks[nextTickToCross].DLiquidity\n }\n nextTickToCross++\n }\n }\n\n outAmount += output * (1 - pool.fee)\n //console.log('out', outAmount);\n }\n\n return outAmount\n}\n\nexport function calcInByOut(pool: Pool, amountOut: number, direction: boolean): number {\n let input = 0\n const xBN = direction ? pool.reserve0 : pool.reserve1\n const yBN = direction ? pool.reserve1 : pool.reserve0\n switch (pool.type) {\n case PoolType.ConstantProduct: {\n const x = parseInt(xBN.toString())\n const y = parseInt(yBN.toString())\n input = (x * amountOut) / (1 - pool.fee) / (y - amountOut)\n break\n }\n case PoolType.Weighted: {\n const x = parseInt(xBN.toString())\n const y = parseInt(yBN.toString())\n const wPool = pool as RWeightedPool\n const weightRatio = direction ? wPool.weight0 / wPool.weight1 : wPool.weight1 / wPool.weight0\n input = x * (1 - pool.fee) * (Math.pow(1 - amountOut / y, -weightRatio) - 1)\n break\n }\n case PoolType.Hybrid: {\n let yNewBN = yBN.sub(getBigNumber(undefined, amountOut))\n if (yNewBN.lt(1))\n // lack of precision\n yNewBN = BigNumber.from(1)\n\n const xNewBN = HybridgetY(pool as RHybridPool, yNewBN)\n input = Math.round(parseInt(xNewBN.sub(xBN).toString()) / (1 - pool.fee))\n\n // const yNew = y - amountOut;\n // const xNew = HybridgetY(pool, yNew);\n // input = (xNew - x)/(1-pool.fee);\n break\n }\n default:\n console.error('Unknown pool type')\n }\n\n // ASSERT(() => {\n // const amount2 = calcOutByIn(pool, input, direction);\n // const res = closeValues(amountOut, amount2, 1e-6);\n // if (!res) console.log(\"Error 138:\", amountOut, amount2, Math.abs(amountOut/amount2 - 1));\n // return res;\n // });\n if (input < 1) input = 1\n return input\n}\n\nexport function calcPrice(pool: Pool, amountIn: number, takeFeeIntoAccount = true): number {\n const r0 = parseInt(pool.reserve0.toString())\n const r1 = parseInt(pool.reserve1.toString())\n const oneMinusFee = takeFeeIntoAccount ? 1 - pool.fee : 1\n switch (pool.type) {\n case PoolType.ConstantProduct: {\n const x = r0 / oneMinusFee\n return (r1 * x) / (x + amountIn) / (x + amountIn)\n }\n case PoolType.Weighted: {\n const wPool = pool as RWeightedPool\n const weightRatio = wPool.weight0 / wPool.weight1\n const x = r0 + amountIn * oneMinusFee\n return (r1 * weightRatio * oneMinusFee * Math.pow(r0 / x, weightRatio)) / x\n }\n case PoolType.Hybrid: {\n const hPool = pool as RHybridPool\n const D = parseInt(HybridComputeLiquidity(hPool).toString())\n const A = hPool.A / A_PRECISION\n const x = r0 + amountIn\n const b = 4 * A * x + D - 4 * A * D\n const ac4 = (D * D * D) / x\n const Ds = Math.sqrt(b * b + 4 * A * ac4)\n const res = (0.5 - (2 * b - ac4 / x) / Ds / 4) * oneMinusFee\n return res\n }\n }\n return 0\n}\n\nfunction calcInputByPriceConstantMean(pool: RWeightedPool, price: number) {\n const r0 = parseInt(pool.reserve0.toString())\n const r1 = parseInt(pool.reserve1.toString())\n const weightRatio = pool.weight0 / pool.weight1\n const t = r1 * price * weightRatio * (1 - pool.fee) * Math.pow(r0, weightRatio)\n return (Math.pow(t, 1 / (weightRatio + 1)) - r0) / (1 - pool.fee)\n}\n\nexport function calcInputByPrice(pool: Pool, priceEffective: number, hint = 1): number {\n switch (pool.type) {\n case PoolType.ConstantProduct: {\n const r0 = parseInt(pool.reserve0.toString())\n const r1 = parseInt(pool.reserve1.toString())\n const x = r0 / (1 - pool.fee)\n const res = Math.sqrt(r1 * x * priceEffective) - x\n return res\n }\n case PoolType.Weighted: {\n const res = calcInputByPriceConstantMean(pool as RWeightedPool, priceEffective)\n return res\n }\n case PoolType.Hybrid: {\n return revertPositive((x: number) => 1 / calcPrice(pool, x), priceEffective, hint)\n }\n }\n return 0\n}\n\n//================================= Utils ====================================\n\nexport function ASSERT(f: () => boolean, t?: string) {\n if (!f() && t) console.error(t)\n}\n\nexport function closeValues(a: number, b: number, accuracy: number): boolean {\n if (accuracy === 0) return a === b\n if (a < 1 / accuracy) return Math.abs(a - b) <= 10\n return Math.abs(a / b - 1) < accuracy\n}\n\nexport function calcSquareEquation(a: number, b: number, c: number): [number, number] {\n const D = b * b - 4 * a * c\n console.assert(D >= 0, `Discriminant is negative! ${a} ${b} ${c}`)\n const sqrtD = Math.sqrt(D)\n return [(-b - sqrtD) / 2 / a, (-b + sqrtD) / 2 / a]\n}\n\n// returns such x > 0 that f(x) = out or 0 if there is no such x or f defined not everywhere\n// hint - approximation of x to spead up the algorithm\n// f assumed to be continues monotone growth function defined everywhere\nexport function revertPositive(f: (x: number) => number, out: number, hint = 1) {\n try {\n if (out <= f(0)) return 0\n let min, max\n if (f(hint) > out) {\n min = hint / 2\n while (f(min) > out) min /= 2\n max = min * 2\n } else {\n max = hint * 2\n while (f(max) < out) max *= 2\n min = max / 2\n }\n\n while (max / min - 1 > 1e-4) {\n const x0: number = (min + max) / 2\n const y0 = f(x0)\n if (out === y0) return x0\n if (out < y0) max = x0\n else min = x0\n }\n return (min + max) / 2\n } catch (e) {\n return 0\n }\n}\n\nexport function getBigNumber(valueBN: BigNumber | undefined, value: number): BigNumber {\n if (valueBN !== undefined) return valueBN\n\n if (value < Number.MAX_SAFE_INTEGER) return BigNumber.from(Math.round(value))\n\n const exp = Math.floor(Math.log(value) / Math.LN2)\n console.assert(exp >= 51, 'Internal Error 314')\n const shift = exp - 51\n const mant = Math.round(value / Math.pow(2, shift))\n const res = BigNumber.from(mant).mul(BigNumber.from(2).pow(shift))\n return res\n}\n","import { CurrencyAmount, Price, Token } from './entities'\nimport { LAMBDA_URL, STOP_LIMIT_ORDER_ADDRESS } from './constants'\nimport { Message, getSignature, getSignatureWithProvider, getTypeHash, getTypedData } from './entities'\n\nimport { BigNumber } from '@ethersproject/bignumber'\nimport { ChainId } from './enums'\nimport { Contract } from '@ethersproject/contracts'\nimport { NonceManager } from '@ethersproject/experimental'\nimport { Signer } from '@ethersproject/abstract-signer'\nimport { Transaction } from '@ethersproject/transactions'\nimport { Web3Provider } from '@ethersproject/providers'\nimport abi from './abis/StopLimitOrder.json'\nimport { defaultAbiCoder } from '@ethersproject/abi'\nimport fetch from 'isomorphic-unfetch'\nimport { keccak256 } from '@ethersproject/solidity'\nimport { validateAndParseAddress } from './functions/validateAndParseAddress'\n\nexport interface ILimitOrderData {\n maker: string\n tokenIn: string\n tokenOut: string\n tokenInDecimals: number\n tokenOutDecimals: number\n tokenInSymbol: string\n tokenOutSymbol: string\n amountIn: string\n amountOut: string\n recipient: string\n startTime: string | number\n endTime: string | number\n stopPrice?: string\n oracleAddress?: string\n oracleData?: string\n v: number\n r: string\n s: string\n chainId: ChainId\n orderTypeHash?: string\n}\n\nexport class LimitOrder {\n public readonly maker: string\n public readonly amountIn: CurrencyAmount<Token>\n public readonly amountOut: CurrencyAmount<Token>\n public readonly recipient: string\n public readonly startTime: string\n public readonly endTime: string\n public readonly stopPrice: string\n public readonly oracleAddress: string\n public readonly oracleData: string\n public v: number\n public r: string\n public s: string\n\n static getLimitOrder(data: ILimitOrderData): LimitOrder {\n return new LimitOrder(\n data.maker,\n CurrencyAmount.fromRawAmount(\n new Token(data.chainId, data.tokenIn, data.tokenInDecimals, data.tokenInSymbol),\n data.amountIn\n ),\n CurrencyAmount.fromRawAmount(\n new Token(data.chainId, data.tokenOut, data.tokenOutDecimals, data.tokenOutSymbol),\n data.amountOut\n ),\n data.recipient,\n data.startTime,\n data.endTime,\n data.stopPrice,\n data.oracleAddress,\n data.oracleData,\n data.v,\n data.r,\n data.s\n )\n }\n\n constructor(\n maker: string,\n amountIn: CurrencyAmount<Token>,\n amountOut: CurrencyAmount<Token>,\n recipient: string,\n startTime: string | number,\n endTime: string | number,\n stopPrice = '0',\n oracleAddress = '0x0000000000000000000000000000000000000000',\n oracleData = '0x00000000000000000000000000000000000000000000000000000000000000',\n v = 0,\n r = '',\n s = ''\n ) {\n this.maker = validateAndParseAddress(maker)\n this.amountIn = amountIn\n this.amountOut = amountOut\n this.recipient = validateAndParseAddress(recipient)\n this.startTime = startTime.toString()\n this.endTime = endTime.toString()\n this.stopPrice = stopPrice\n this.oracleAddress = validateAndParseAddress(oracleAddress)\n this.oracleData = oracleData\n this.v = v\n this.r = r\n this.s = s\n }\n\n get amountInRaw(): string {\n return this.amountIn.quotient.toString()\n }\n\n get amountOutRaw(): string {\n return this.amountOut.quotient.toString()\n }\n\n get tokenInAddress(): string {\n return this.amountIn.currency.address\n }\n\n get tokenOutAddress(): string {\n return this.amountOut.currency.address\n }\n\n get tokenInDecimals(): number {\n return this.amountIn.currency.decimals\n }\n\n get tokenOutDecimals(): number {\n return this.amountOut.currency.decimals\n }\n\n get tokenInSymbol(): string {\n return this.amountIn.currency.symbol || ''\n }\n\n get tokenOutSymbol(): string {\n return this.amountOut.currency.symbol || ''\n }\n\n get chainId(): ChainId {\n return this.amountIn.currency.chainId\n }\n\n usePrice(price: Price<Token, Token>): LimitOrder {\n return new LimitOrder(\n this.maker,\n this.amountIn,\n CurrencyAmount.fromRawAmount(this.amountOut.currency, price.quote(this.amountIn).quotient.toString()),\n this.recipient,\n this.startTime,\n this.endTime,\n this.stopPrice,\n this.oracleAddress,\n this.oracleData\n )\n }\n\n signdOrderWithPrivatekey(chainId: ChainId, privateKey: string) {\n let order: Message = {\n maker: this.maker,\n tokenIn: this.tokenInAddress,\n tokenOut: this.tokenOutAddress,\n amountIn: this.amountInRaw,\n amountOut: this.amountOutRaw,\n recipient: this.recipient,\n startTime: this.startTime,\n endTime: this.endTime,\n stopPrice: this.stopPrice,\n oracleAddress: this.oracleAddress,\n oracleData: keccak256(['bytes'], [this.oracleData])\n }\n\n const { v, r, s } = getSignature(order, chainId, privateKey)\n\n this.v = v\n this.r = r\n this.s = s\n\n return { v, r, s }\n }\n\n async signOrderWithProvider(chainId: ChainId, provider: Web3Provider) {\n let order: Message = {\n maker: this.maker,\n tokenIn: this.tokenInAddress,\n tokenOut: this.tokenOutAddress,\n amountIn: this.amountInRaw,\n amountOut: this.amountOutRaw,\n recipient: this.recipient,\n startTime: this.startTime,\n endTime: this.endTime,\n stopPrice: this.stopPrice,\n oracleAddress: this.oracleAddress,\n oracleData: keccak256(['bytes'], [this.oracleData])\n }\n\n const { v, r, s } = await getSignatureWithProvider(order, chainId, provider)\n\n this.v = v\n this.r = r\n this.s = s\n\n return { v, r, s }\n }\n\n getTypedData() {\n let order: Message = {\n maker: this.maker,\n tokenIn: this.tokenInAddress,\n tokenOut: this.tokenOutAddress,\n amountIn: this.amountInRaw,\n amountOut: this.amountOutRaw,\n recipient: this.recipient,\n startTime: this.startTime,\n endTime: this.endTime,\n stopPrice: this.stopPrice,\n oracleAddress: this.oracleAddress,\n oracleData: keccak256(['bytes'], [this.oracleData])\n }\n\n return getTypedData(order, this.chainId)\n }\n\n getTypeHash() {\n let typedData = this.getTypedData()\n let digest = getTypeHash(typedData)\n return digest\n }\n\n async send() {\n const resp = await fetch(`${LAMBDA_URL}/orders/create`, {\n method: 'POST',\n body: JSON.stringify({\n maker: this.maker,\n tokenIn: this.tokenInAddress,\n tokenOut: this.tokenOutAddress,\n tokenInDecimals: this.tokenInDecimals,\n tokenOutDecimals: this.tokenOutDecimals,\n tokenInSymbol: this.tokenInSymbol,\n tokenOutSymbol: this.tokenOutSymbol,\n amountIn: this.amountInRaw,\n amountOut: this.amountOutRaw,\n recipient: this.recipient,\n startTime: this.startTime,\n endTime: this.endTime,\n stopPrice: this.stopPrice,\n oracleAddress: this.oracleAddress,\n oracleData: this.oracleData,\n v: this.v,\n r: this.r,\n s: this.s,\n chainId: this.amountIn.currency.chainId\n })\n })\n\n return resp.json()\n }\n}\n\nexport class FillLimitOrder {\n public readonly order: LimitOrder\n public readonly path: string[]\n public readonly amountExternal: BigNumber\n public readonly amountToFill: BigNumber\n public readonly limitOrderReceiver: string\n public readonly to: string\n public readonly tokenIn: string\n public readonly tokenOut: string\n public readonly limitOrderReceiverData: string\n\n constructor(\n order: LimitOrder,\n path: string[],\n amountExternal: BigNumber,\n amountToFill: BigNumber,\n limitOrderReceiver: string,\n to: string,\n keepTokenIn = false\n ) {\n this.order = order\n this.path = path.map(validateAndParseAddress)\n this.amountExternal = amountExternal\n this.amountToFill = amountToFill\n this.limitOrderReceiver = validateAndParseAddress(limitOrderReceiver)\n this.to = validateAndParseAddress(to)\n this.tokenIn = order.amountIn.currency.address\n this.tokenOut = order.amountOut.currency.address\n\n this.limitOrderReceiverData = defaultAbiCoder.encode(\n ['address[]', 'uint256', 'address', 'bool'],\n [this.path, this.amountExternal.toString(), this.to, keepTokenIn]\n )\n }\n\n public fillOrderOpen(\n signer: Signer,\n extra: {\n forceExecution?: boolean\n gasPrice?: BigNumber\n nonce?: number\n debug?: boolean\n open?: boolean\n }\n ) {\n extra.open = true\n return this.fillOrder(signer, extra)\n }\n\n public async fillOrder(\n signer: Signer | NonceManager,\n extra: {\n debug?: boolean\n forceExecution?: boolean\n gasPrice?: BigNumber\n open?: boolean\n nonce?: number\n }\n ): Promise<{ executed: boolean; transaction?: Transaction }> {\n const { gasPrice, nonce, forceExecution = false, open = false } = extra\n\n const func = open ? 'fillOrderOpen' : 'fillOrder'\n\n const orderArg = [\n this.order.maker,\n this.order.amountInRaw,\n this.order.amountOutRaw,\n this.order.recipient,\n this.order.startTime,\n this.order.endTime,\n this.order.stopPrice,\n this.order.oracleAddress,\n this.order.oracleData,\n this.amountToFill.toString(),\n this.order.v,\n this.order.r,\n this.order.s\n ]\n\n const limitOrderContract = new Contract(STOP_LIMIT_ORDER_ADDRESS[this.order.chainId], abi, signer)\n\n let gasLimit\n let executed = true\n\n if (extra.debug) console.log(orderArg, this.path, this.limitOrderReceiver, this.limitOrderReceiverData)\n\n try {\n gasLimit = await limitOrderContract.estimateGas[func](\n orderArg,\n this.path[0],\n this.path[this.path.length - 1],\n this.limitOrderReceiver,\n this.limitOrderReceiverData\n )\n gasLimit = gasLimit.mul(11).div(10)\n } catch (e) {\n if (forceExecution) {\n console.log('Failed to estimate gas, forcing execution')\n gasLimit = BigNumber.from('400000') // 400k\n executed = true\n } else {\n return { executed: false }\n }\n }\n\n const transaction: Transaction = await limitOrderContract.fillOrder(\n orderArg,\n this.path[0],\n this.path[this.path.length - 1],\n this.limitOrderReceiver,\n this.limitOrderReceiverData,\n { gasLimit, gasPrice, nonce }\n )\n\n return { executed, transaction }\n }\n}\n","import { SOLIDITY_TYPE_MAXIMA, SolidityType, ZERO } from '../constants'\n\nimport JSBI from 'jsbi'\nimport invariant from 'tiny-invariant'\n\nexport function validateSolidityTypeInstance(value: JSBI, solidityType: SolidityType): void {\n invariant(JSBI.greaterThanOrEqual(value, ZERO), `${value} is not a ${solidityType}.`)\n invariant(JSBI.lessThanOrEqual(value, SOLIDITY_TYPE_MAXIMA[solidityType]), `${value} is not a ${solidityType}.`)\n}\n"],"names":["ChainId","Rounding","TradeType","KashiAction","Fee","OrderStatus","USDC_ADDRESS","MAINNET","ROPSTEN","KOVAN","MATIC","FANTOM","BSC","HARMONY","HECO","OKEX","XDAI","ARBITRUM","AVALANCHE","MOONRIVER","FUSE","USD_ADDRESS","CELO","FACTORY_ADDRESS","RINKEBY","GÖRLI","FANTOM_TESTNET","MATIC_TESTNET","BSC_TESTNET","ARBITRUM_TESTNET","MOONBEAM_TESTNET","AVALANCHE_TESTNET","HECO_TESTNET","HARMONY_TESTNET","OKEX_TESTNET","PALM","PALM_TESTNET","TELOS","ROUTER_ADDRESS","SUSHI_ADDRESS","MASTERCHEF_ADDRESS","BAR_ADDRESS","MAKER_ADDRESS","TIMELOCK_ADDRESS","BENTOBOX_ADDRESS","KASHI_ADDRESS","SUSHISWAP_SWAPPER_ADDRESS","SUSHISWAP_MULTISWAPPER_ADDRESS","SUSHISWAP_MULTI_EXACT_SWAPPER_ADDRESS","CHAINLINK_ORACLE_ADDRESS","BORING_HELPER_ADDRESS","STOP_LIMIT_ORDER_ADDRESS","ARCHER_ROUTER_ADDRESS","MINICHEF_ADDRESS","OLD_FARMS","WETH9_ADDRESS","WNATIVE_ADDRESS","MASTERCHEF_V2_ADDRESS","ENS_REGISTRAR_ADDRESS","ZAPPER_ADDRESS","MERKLE_DISTRIBUTOR_ADDRESS","MULTICALL2_ADDRESS","MINIMUM_TARGET_UTILIZATION","BigNumber","from","MAXIMUM_TARGET_UTILIZATION","UTILIZATION_PRECISION","FULL_UTILIZATION","FULL_UTILIZATION_MINUS_MAX","sub","STARTING_INTEREST_PER_YEAR","mul","MINIMUM_INTEREST_PER_YEAR","MAXIMUM_INTEREST_PER_YEAR","INTEREST_ELASTICITY","FACTOR_PRECISION","PROTOCOL_FEE","PROTOCOL_FEE_DIVISOR","AbstractCurrency","chainId","decimals","symbol","name","Number","isSafeInteger","invariant","isInteger","serialize","this","wrapped","address","NativeCurrency","validateAndParseAddress","getAddress","error","Token","equals","other","isToken","sortsBefore","toLowerCase","USDC","USD","WETH9","WNATIVE","Avalanche","_NativeCurrency","onChain","_cache","isNative","wnative","Binance","Celo","wcelo","Ether","_etherCache","weth9","Fantom","Harmony","Heco","Matic","Movr","Okex","xDai","Palm","Fuse","Telos","SolidityType","NATIVE","MaxUint256","JSBI","BigInt","ZERO","ONE","TWO","THREE","FIVE","TEN","_100","_997","_1000","INIT_CODE_HASH","MINIMUM_LIQUIDITY","SOLIDITY_TYPE_MAXIMA","uint8","uint256","LAMBDA_URL","CAN_SET_PROTOTYPE","Object","InsufficientReservesError","_this","constructor","setPrototypeOf","prototype","Error","InsufficientInputAmountError","_this2","Decimal","toFormat","_Decimal","Big","_Big","strict","toSignificantRounding","ROUND_DOWN","ROUND_HALF_UP","ROUND_UP","toFixedRounding","Fraction","numerator","denominator","tryParseFraction","fractionish","invert","add","otherParsed","equal","multiply","subtract","lessThan","equalTo","greaterThan","divide","toSignificant","significantDigits","format","rounding","groupSeparator","set","precision","quotient","toString","div","toSignificantDigits","decimalPlaces","toFixed","DP","RM","remainder","CurrencyAmount","currency","lessThanOrEqual","decimalScale","exponentiate","fromRawAmount","rawAmount","fromFractionalAmount","added","subtracted","multiplied","divided","_Fraction","toExact","Price","baseCurrency","quoteCurrency","args","length","result","quoteAmount","baseAmount","scalar","fraction","quote","currencyAmount","adjustedForDecimals","computePoolInitCodeHash","keccak256","pack","creationCode","defaultAbiCoder","encode","deployData","masterDeployerAddress","computeConstantProductPoolAddress","factoryAddress","tokenA","tokenB","fee","twap","sort","CONSTANT_PRODUCT_POOL_INIT_CODE_HASH","getCreate2Address","MAX_SAFE_INTEGER","sqrt","value","greaterThanOrEqual","Math","floor","toNumber","z","x","ConstantProductPool","currencyAmountA","currencyAmountB","currencyAmounts","liquidityToken","tokenAmounts","involvesToken","token","token0","token1","priceOf","token0Price","token1Price","reserveOf","reserve0","reserve1","getOutputAmount","inputAmount","inputReserve","outputReserve","inputAmountWithFee","outputAmount","getInputAmount","getLiquidityMinted","totalSupply","tokenAmountA","tokenAmountB","liquidity","amount0","amount1","getLiquidityValue","computePairAddress","Pair","feeOn","kLast","totalSupplyAdjusted","kLastParsed","rootK","rootKLast","feeLiquidity","ONE_HUNDRED","toPercent","Percent","Route","pairs","input","output","every","pair","wrappedInput","path","entries","currentInput","push","_midPrice","prices","reduced","slice","reduce","accumulator","currentValue","computePriceImpact","midPrice","quotedOutputAmount","priceImpact","sortedInsert","items","maxSize","comparator","isFull","lo","hi","mid","splice","pop","inputOutputComparator","a","b","tradeComparator","ioComp","route","PoolType","Trade","amount","tradeType","Array","EXACT_INPUT","i","executionPrice","exactIn","amountIn","exactOut","amountOut","EXACT_OUTPUT","minimumAmountOut","slippageTolerance","slippageAdjustedAmountOut","maximumAmountIn","slippageAdjustedAmountIn","bestTradeExactIn","currencyAmountIn","currencyOut","currentPairs","nextAmountIn","bestTrades","maxNumResults","maxHops","tokenOut","isInsufficientInputAmountError","pairsExcludingThisPair","concat","worstExecutionPrice","bestTradeExactOut","currencyIn","currencyAmountOut","nextAmountOut","tokenIn","isInsufficientReservesError","runtime","exports","Op","hasOwn","hasOwnProperty","$Symbol","Symbol","iteratorSymbol","iterator","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","toStringTag","define","obj","key","defineProperty","enumerable","configurable","writable","err","wrap","innerFn","outerFn","self","tryLocsList","generator","create","Generator","context","Context","_invoke","state","method","arg","undefined","done","delegate","delegateResult","maybeInvokeDelegate","ContinueSentinel","sent","_sent","dispatchException","abrupt","record","tryCatch","type","makeInvokeMethod","fn","call","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","getProto","getPrototypeOf","NativeIteratorPrototype","values","Gp","defineIteratorMethods","forEach","AsyncIterator","PromiseImpl","previousPromise","callInvokeWithMethodAndArg","resolve","reject","invoke","__await","then","unwrapped","TypeError","info","resultName","next","nextLoc","pushTryEntry","locs","entry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","reset","iterable","iteratorMethod","isNaN","doneResult","displayName","isGeneratorFunction","genFun","ctor","mark","__proto__","awrap","async","Promise","iter","keys","object","reverse","skipTempReset","prev","charAt","stop","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","catch","thrown","delegateYield","module","regeneratorRuntime","accidentalStrictMode","globalThis","Function","RouteStatus","Pool","_info","minLiquidity","swapGasCost","RConstantProductPool","_Pool","ConstantProduct","RHybridPool","Hybrid","A","RWeightedPool","Weighted","weight0","weight1","RConcentratedLiquidityPool","ConcentratedLiquidity","sqrtPrice","nearestTick","ticks","types","EIP712Domain","LimitOrder","bentoTypes","SetMasterContractApproval","getSignature","message","privateKey","sign","primaryType","domain","verifyingContract","getTypedData","getTypedDataBento","getTypeHash","typedData","getMessage","SigningKey","signDigest","v","r","s","getSignatureWithProvider","provider","send","maker","JSON","stringify","splitSignature","getSignatureWithProviderBentobox","user","getSignatureBento","bentoApproval","toHex","Router","swapCallParameters","trade","options","etherIn","etherOut","ttl","methodName","to","recipient","allowedSlippage","map","deadline","Date","getTime","useFeeOnTransfer","Boolean","feeOnTransfer","DCacheBN","Map","HybridComputeLiquidity","pool","res","get","r0","r1","isZero","prevD","nA","D","dP","abs","lte","HybridgetY","yPrev","c","y","OutOfLiquidity","calcPrice","takeFeeIntoAccount","parseInt","oneMinusFee","weightRatio","pow","hPool","ac4","revertPositive","f","out","hint","min","max","x0","y0","e","getBigNumber","valueBN","round","exp","log","LN2","console","assert","shift","mant","startTime","endTime","stopPrice","oracleAddress","oracleData","getLimitOrder","data","tokenInDecimals","tokenInSymbol","tokenOutDecimals","tokenOutSymbol","usePrice","price","signdOrderWithPrivatekey","order","tokenInAddress","tokenOutAddress","amountInRaw","amountOutRaw","signOrderWithProvider","fetch","body","json","FillLimitOrder","amountExternal","amountToFill","limitOrderReceiver","keepTokenIn","limitOrderReceiverData","fillOrderOpen","signer","extra","open","fillOrder","gasPrice","nonce","forceExecution","func","orderArg","limitOrderContract","Contract","abi","executed","debug","estimateGas","gasLimit","transaction","t","direction","xBN","yBN","yNewBN","lt","xNewBN","priceEffective","calcInputByPriceConstantMean","inAmount","index","unshift","DLiquidity","nextTickToCross","currentPrice","currentLiquidity","outAmount","nextTickPrice","maxDx","maxDy","ConcentratedLiquidityOutByIn","sqrtD","accuracy","currencyA","currencyB","solidityType"],"mappings":"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"}
|