@galacticcouncil/sdk 7.2.0 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/aave/abi/AavePool.ts", "../src/aave/abi/AavePoolDataProvider.ts", "../src/aave/const.ts", "../src/evm/chain.ts", "../src/evm/client.ts", "../src/aave/AaveClient.ts", "../src/utils/h160.ts", "../src/consts.ts", "../src/utils/erc20.ts", "../src/utils/bignumber.ts", "../src/aave/AaveUtils.ts", "../src/api/PolkadotApi.ts", "../src/client/AssetClient.ts", "../src/client/BalanceClient.ts", "../src/client/FarmClient.ts", "../src/errors.ts", "../src/pool/CachingPoolService.ts", "../src/pool/PoolService.ts", "../src/pool/types.ts", "../src/pool/aave/AavePool.ts", "../src/pool/aave/AavePoolClient.ts", "../src/utils/json.ts", "../src/pool/PoolClient.ts", "../src/pool/lbp/LbpMath.ts", "../src/utils/mapper.ts", "../src/pool/lbp/LbpPool.ts", "../src/pool/lbp/LbpPoolClient.ts", "../src/pool/omni/OmniMath.ts", "../src/pool/omni/OmniPool.ts", "../src/pool/omni/OmniPoolClient.ts", "../src/pool/xyk/XykMath.ts", "../src/pool/xyk/XykPool.ts", "../src/pool/xyk/XykPoolClient.ts", "../src/pool/stable/StableMath.ts", "../src/pool/stable/StableSwap.ts", "../src/pool/stable/StableSwapClient.ts", "../src/pool/PoolFactory.ts", "../src/utils/Queue.ts", "../src/sor/route/bfs.ts", "../src/sor/route/graph.ts", "../src/sor/route/suggester.ts", "../src/sor/Router.ts", "../src/utils/math.ts", "../src/sor/types.ts", "../src/sor/TradeRouter.ts", "../src/sor/TradeUtils.ts"],
4
+ "sourcesContent": ["export const AAVE_POOL_ABI = [\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'reserve',\n type: 'address',\n },\n {\n indexed: false,\n internalType: 'address',\n name: 'user',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'onBehalfOf',\n type: 'address',\n },\n {\n indexed: false,\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n {\n indexed: true,\n internalType: 'uint16',\n name: 'referralCode',\n type: 'uint16',\n },\n ],\n name: 'Supply',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'reserve',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'user',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'to',\n type: 'address',\n },\n {\n indexed: false,\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n ],\n name: 'Withdraw',\n type: 'event',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n {\n internalType: 'address',\n name: 'to',\n type: 'address',\n },\n ],\n name: 'withdraw',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'reserve',\n type: 'address',\n },\n {\n indexed: false,\n internalType: 'address',\n name: 'user',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'onBehalfOf',\n type: 'address',\n },\n {\n indexed: false,\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n {\n indexed: false,\n internalType: 'enum DataTypes.InterestRateMode',\n name: 'interestRateMode',\n type: 'uint8',\n },\n {\n indexed: false,\n internalType: 'uint256',\n name: 'borrowRate',\n type: 'uint256',\n },\n {\n indexed: true,\n internalType: 'uint16',\n name: 'referralCode',\n type: 'uint16',\n },\n ],\n name: 'Borrow',\n type: 'event',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'interestRateMode',\n type: 'uint256',\n },\n {\n internalType: 'uint16',\n name: 'referralCode',\n type: 'uint16',\n },\n {\n internalType: 'address',\n name: 'onBehalfOf',\n type: 'address',\n },\n ],\n name: 'borrow',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'reserve',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'user',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'repayer',\n type: 'address',\n },\n {\n indexed: false,\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n {\n indexed: false,\n internalType: 'bool',\n name: 'useATokens',\n type: 'bool',\n },\n ],\n name: 'Repay',\n type: 'event',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'user',\n type: 'address',\n },\n ],\n name: 'getUserAccountData',\n outputs: [\n {\n internalType: 'uint256',\n name: 'totalCollateralBase',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'totalDebtBase',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'availableBorrowsBase',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'currentLiquidationThreshold',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'ltv',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'healthFactor',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n] as const;\n", "export const AAVE_POOL_DATA_PROVIDER_ABI = [\n {\n inputs: [\n {\n internalType: 'contract IEACAggregatorProxy',\n name: '_networkBaseTokenPriceInUsdProxyAggregator',\n type: 'address',\n },\n {\n internalType: 'contract IEACAggregatorProxy',\n name: '_marketReferenceCurrencyPriceInUsdProxyAggregator',\n type: 'address',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'constructor',\n },\n {\n inputs: [],\n name: 'ETH_CURRENCY_UNIT',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'MKR_ADDRESS',\n outputs: [\n {\n internalType: 'address',\n name: '',\n type: 'address',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'bytes32',\n name: '_bytes32',\n type: 'bytes32',\n },\n ],\n name: 'bytes32ToString',\n outputs: [\n {\n internalType: 'string',\n name: '',\n type: 'string',\n },\n ],\n stateMutability: 'pure',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'contract IPoolAddressesProvider',\n name: 'provider',\n type: 'address',\n },\n ],\n name: 'getReservesData',\n outputs: [\n {\n components: [\n {\n internalType: 'address',\n name: 'underlyingAsset',\n type: 'address',\n },\n {\n internalType: 'string',\n name: 'name',\n type: 'string',\n },\n {\n internalType: 'string',\n name: 'symbol',\n type: 'string',\n },\n {\n internalType: 'uint256',\n name: 'decimals',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'baseLTVasCollateral',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'reserveLiquidationThreshold',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'reserveLiquidationBonus',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'reserveFactor',\n type: 'uint256',\n },\n {\n internalType: 'bool',\n name: 'usageAsCollateralEnabled',\n type: 'bool',\n },\n {\n internalType: 'bool',\n name: 'borrowingEnabled',\n type: 'bool',\n },\n {\n internalType: 'bool',\n name: 'stableBorrowRateEnabled',\n type: 'bool',\n },\n {\n internalType: 'bool',\n name: 'isActive',\n type: 'bool',\n },\n {\n internalType: 'bool',\n name: 'isFrozen',\n type: 'bool',\n },\n {\n internalType: 'uint128',\n name: 'liquidityIndex',\n type: 'uint128',\n },\n {\n internalType: 'uint128',\n name: 'variableBorrowIndex',\n type: 'uint128',\n },\n {\n internalType: 'uint128',\n name: 'liquidityRate',\n type: 'uint128',\n },\n {\n internalType: 'uint128',\n name: 'variableBorrowRate',\n type: 'uint128',\n },\n {\n internalType: 'uint128',\n name: 'stableBorrowRate',\n type: 'uint128',\n },\n {\n internalType: 'uint40',\n name: 'lastUpdateTimestamp',\n type: 'uint40',\n },\n {\n internalType: 'address',\n name: 'aTokenAddress',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'stableDebtTokenAddress',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'variableDebtTokenAddress',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'interestRateStrategyAddress',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'availableLiquidity',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'totalPrincipalStableDebt',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'averageStableRate',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'stableDebtLastUpdateTimestamp',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'totalScaledVariableDebt',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'priceInMarketReferenceCurrency',\n type: 'uint256',\n },\n {\n internalType: 'address',\n name: 'priceOracle',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'variableRateSlope1',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'variableRateSlope2',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'stableRateSlope1',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'stableRateSlope2',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'baseStableBorrowRate',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'baseVariableBorrowRate',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'optimalUsageRatio',\n type: 'uint256',\n },\n {\n internalType: 'bool',\n name: 'isPaused',\n type: 'bool',\n },\n {\n internalType: 'bool',\n name: 'isSiloedBorrowing',\n type: 'bool',\n },\n {\n internalType: 'uint128',\n name: 'accruedToTreasury',\n type: 'uint128',\n },\n {\n internalType: 'uint128',\n name: 'unbacked',\n type: 'uint128',\n },\n {\n internalType: 'uint128',\n name: 'isolationModeTotalDebt',\n type: 'uint128',\n },\n {\n internalType: 'bool',\n name: 'flashLoanEnabled',\n type: 'bool',\n },\n {\n internalType: 'uint256',\n name: 'debtCeiling',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'debtCeilingDecimals',\n type: 'uint256',\n },\n {\n internalType: 'uint8',\n name: 'eModeCategoryId',\n type: 'uint8',\n },\n {\n internalType: 'uint256',\n name: 'borrowCap',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'supplyCap',\n type: 'uint256',\n },\n {\n internalType: 'uint16',\n name: 'eModeLtv',\n type: 'uint16',\n },\n {\n internalType: 'uint16',\n name: 'eModeLiquidationThreshold',\n type: 'uint16',\n },\n {\n internalType: 'uint16',\n name: 'eModeLiquidationBonus',\n type: 'uint16',\n },\n {\n internalType: 'address',\n name: 'eModePriceSource',\n type: 'address',\n },\n {\n internalType: 'string',\n name: 'eModeLabel',\n type: 'string',\n },\n {\n internalType: 'bool',\n name: 'borrowableInIsolation',\n type: 'bool',\n },\n ],\n internalType: 'struct IUiPoolDataProviderV3.AggregatedReserveData[]',\n name: '',\n type: 'tuple[]',\n },\n {\n components: [\n {\n internalType: 'uint256',\n name: 'marketReferenceCurrencyUnit',\n type: 'uint256',\n },\n {\n internalType: 'int256',\n name: 'marketReferenceCurrencyPriceInUsd',\n type: 'int256',\n },\n {\n internalType: 'int256',\n name: 'networkBaseTokenPriceInUsd',\n type: 'int256',\n },\n {\n internalType: 'uint8',\n name: 'networkBaseTokenPriceDecimals',\n type: 'uint8',\n },\n ],\n internalType: 'struct IUiPoolDataProviderV3.BaseCurrencyInfo',\n name: '',\n type: 'tuple',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'contract IPoolAddressesProvider',\n name: 'provider',\n type: 'address',\n },\n ],\n name: 'getReservesList',\n outputs: [\n {\n internalType: 'address[]',\n name: '',\n type: 'address[]',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'contract IPoolAddressesProvider',\n name: 'provider',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'user',\n type: 'address',\n },\n ],\n name: 'getUserReservesData',\n outputs: [\n {\n components: [\n {\n internalType: 'address',\n name: 'underlyingAsset',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'scaledATokenBalance',\n type: 'uint256',\n },\n {\n internalType: 'bool',\n name: 'usageAsCollateralEnabledOnUser',\n type: 'bool',\n },\n {\n internalType: 'uint256',\n name: 'stableBorrowRate',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'scaledVariableDebt',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'principalStableDebt',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'stableBorrowLastUpdateTimestamp',\n type: 'uint256',\n },\n ],\n internalType: 'struct IUiPoolDataProviderV3.UserReserveData[]',\n name: '',\n type: 'tuple[]',\n },\n {\n internalType: 'uint8',\n name: '',\n type: 'uint8',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'marketReferenceCurrencyPriceInUsdProxyAggregator',\n outputs: [\n {\n internalType: 'contract IEACAggregatorProxy',\n name: '',\n type: 'address',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'networkBaseTokenPriceInUsdProxyAggregator',\n outputs: [\n {\n internalType: 'contract IEACAggregatorProxy',\n name: '',\n type: 'address',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n] as const;\n", "export const AAVE_POOL_PROXY = '0x1b02E051683b5cfaC5929C25E84adb26ECf87B38';\nexport const AAVE_POOL_DATA_PROVIDER =\n '0x112b087b60C1a166130d59266363C45F8aa99db0';\n\nexport const AAVE_LENDING_POOL_ADDRESS =\n '0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691';\n\nexport const AAVE_GAS_LIMIT = 1_000_000n;\nexport const AAVE_ROUNDING_THRESHOLD = 5;\nexport const AAVE_UINT_256_MAX = BigInt(\n '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'\n);\n", "import { defineChain, Chain } from 'viem';\n\nconst rpcHttpList = [\n 'https://rpc.hydradx.cloud',\n 'https://hydration-rpc.n.dwellir.com',\n 'https://hydration.dotters.network',\n 'https://rpc.helikon.io/hydradx',\n 'https://hydration.ibp.network',\n 'https://rpc.cay.hydration.cloud',\n 'https://rpc.parm.hydration.cloud',\n 'https://rpc.roach.hydration.cloud',\n 'https://rpc.zipp.hydration.cloud',\n 'https://rpc.sin.hydration.cloud',\n 'https://rpc.coke.hydration.cloud',\n];\n\nconst rpcWebsocketList = [\n 'wss://rpc.hydradx.cloud',\n 'wss://hydration-rpc.n.dwellir.com',\n 'wss://hydration.dotters.network',\n 'wss://rpc.helikon.io/hydradx',\n 'wss://hydration.ibp.network',\n 'wss://rpc.cay.hydration.cloud',\n 'wss://rpc.parm.hydration.cloud',\n 'wss://rpc.roach.hydration.cloud',\n 'wss://rpc.zipp.hydration.cloud',\n 'wss://rpc.sin.hydration.cloud',\n 'wss://rpc.coke.hydration.cloud',\n];\n\nexport const evmMainnet: Chain = defineChain({\n id: 222222,\n name: 'Hydration',\n network: 'hydration',\n nativeCurrency: {\n decimals: 18,\n name: 'WETH',\n symbol: 'WETH',\n },\n rpcUrls: {\n public: {\n http: rpcHttpList,\n webSocket: rpcWebsocketList,\n },\n default: {\n http: rpcHttpList,\n webSocket: rpcWebsocketList,\n },\n },\n blockExplorers: {\n default: {\n name: 'Hydration Explorer',\n url: 'https://explorer.evm.hydration.cloud',\n },\n },\n testnet: false,\n});\n", "import {\n createPublicClient,\n createWalletClient,\n custom,\n http,\n webSocket,\n Chain,\n PublicClient,\n WalletClient,\n} from 'viem';\n\nimport { evmMainnet } from './chain';\n\nexport class EvmClient {\n readonly chain: Chain;\n\n constructor(chain?: Chain) {\n this.chain = chain ? chain : evmMainnet;\n }\n\n get chainId(): number {\n return this.chain.id;\n }\n\n get chainCurrency(): string {\n return this.chain.nativeCurrency.symbol;\n }\n\n get chainDecimals(): number {\n return this.chain.nativeCurrency.decimals;\n }\n\n getProvider(): PublicClient {\n return createPublicClient({\n chain: this.chain,\n transport: http(),\n });\n }\n\n getWsProvider(): PublicClient {\n return createPublicClient({\n chain: this.chain,\n transport: webSocket(),\n });\n }\n\n getSigner(address: string): WalletClient {\n return createWalletClient({\n account: address as `0x${string}`,\n chain: this.chain,\n transport: custom((window as any).ethereum),\n });\n }\n}\n", "import { AAVE_POOL_ABI, AAVE_POOL_DATA_PROVIDER_ABI } from './abi';\nimport {\n AAVE_LENDING_POOL_ADDRESS,\n AAVE_POOL_DATA_PROVIDER,\n AAVE_POOL_PROXY,\n} from './const';\n\nimport { EvmClient } from '../evm';\n\nexport class AaveClient {\n private evmClient: EvmClient;\n\n constructor() {\n this.evmClient = new EvmClient();\n }\n\n async getReservesData() {\n const evmProvider = this.evmClient.getProvider();\n const output = await evmProvider.readContract({\n abi: AAVE_POOL_DATA_PROVIDER_ABI,\n address: AAVE_POOL_DATA_PROVIDER as `0x${string}`,\n args: [AAVE_LENDING_POOL_ADDRESS as `0x${string}`],\n functionName: 'getReservesData',\n });\n return output;\n }\n\n async getUserReservesData(user: string) {\n const evmProvider = this.evmClient.getProvider();\n const output = await evmProvider.readContract({\n abi: AAVE_POOL_DATA_PROVIDER_ABI,\n address: AAVE_POOL_DATA_PROVIDER as `0x${string}`,\n args: [AAVE_LENDING_POOL_ADDRESS as `0x${string}`, user as `0x${string}`],\n functionName: 'getUserReservesData',\n });\n return output;\n }\n\n async getUserAccountData(user: string) {\n const evmProvider = this.evmClient.getProvider();\n const output = await evmProvider.readContract({\n abi: AAVE_POOL_ABI,\n address: AAVE_POOL_PROXY as `0x${string}`,\n args: [user as `0x${string}`],\n functionName: 'getUserAccountData',\n });\n return output;\n }\n}\n", "import { decodeAddress, encodeAddress } from '@polkadot/util-crypto';\nimport { hexToU8a, isHex, u8aToHex } from '@polkadot/util';\n\nimport { Buffer } from 'buffer';\n\nimport { HYDRADX_SS58_PREFIX } from '../consts';\n\nconst prefixBytes = Buffer.from('ETH\\0');\n\nexport function isEvmAccount(address: string): boolean {\n if (!address) return false;\n\n try {\n const pub = decodeAddress(address, true);\n return Buffer.from(pub.subarray(0, prefixBytes.length)).equals(prefixBytes);\n } catch {\n return false;\n }\n}\n\nexport function isEvmAddress(address: string): boolean {\n if (!/^0x[a-fA-F0-9]{40}$/.test(address)) {\n return false;\n }\n return true;\n}\n\nexport function isSs58Address(address: string): boolean {\n try {\n const bytes = isHex(address) ? hexToU8a(address) : decodeAddress(address);\n encodeAddress(bytes);\n return true;\n } catch (error) {\n return false;\n }\n}\n\nexport class H160 {\n static prefixBytes = Buffer.from('ETH\\0');\n\n static toAccount = (address: string) => {\n const addressBytes = Buffer.from(address.slice(2), 'hex');\n return encodeAddress(\n new Uint8Array(\n Buffer.concat([H160.prefixBytes, addressBytes, Buffer.alloc(8)])\n ),\n HYDRADX_SS58_PREFIX\n );\n };\n\n static fromAccount = (address: string) => {\n const decodedBytes = decodeAddress(address);\n const addressBytes = decodedBytes.slice(H160.prefixBytes.length, -8);\n return '0x' + Buffer.from(addressBytes).toString('hex');\n };\n\n static fromSS58 = (address: string) => {\n const decodedBytes = decodeAddress(address);\n const slicedBytes = decodedBytes.slice(0, 20);\n return u8aToHex(slicedBytes);\n };\n\n static fromAny = (address: string) => {\n if (isEvmAddress(address)) {\n return address;\n }\n\n if (isEvmAccount(address)) {\n return H160.fromAccount(address);\n }\n\n if (isSs58Address(address)) {\n return H160.fromSS58(address);\n }\n\n throw new Error('Unknown address type');\n };\n}\n", "export const BASILISK_PARACHAIN_ID = 2090;\n\nexport const DENOMINATOR = 1000;\n\nexport const HUB_ASSET_ID = '1';\n\nexport const HYDRADX_PARACHAIN_ID = 2034;\nexport const HYDRADX_SS58_PREFIX = 63;\n\nexport const RUNTIME_DECIMALS = 18;\n\nexport const SYSTEM_ASSET_ID = '0';\nexport const SYSTEM_ASSET_DECIMALS = 12;\n\nexport const TRADEABLE_DEFAULT = 15; // Allows all (buy/sell)\n", "export class ERC20 {\n static fromAssetId(assetId: string) {\n const id = Number(assetId);\n const evmAddressBuffer = Buffer.alloc(20, 0);\n evmAddressBuffer[15] = 1;\n evmAddressBuffer.writeUInt32BE(id, 16);\n\n return '0x' + evmAddressBuffer.toString('hex');\n }\n\n static toAssetId(address: string) {\n const addressBuffer = Buffer.from(address.replace('0x', ''), 'hex');\n if (addressBuffer.length !== 20 || !this.isAssetAddress(address)) {\n return null;\n }\n return addressBuffer.readUInt32BE(16);\n }\n\n static isAssetAddress(address: string) {\n const PREFIX_BUFFER = Buffer.from(\n '0000000000000000000000000000000100000000',\n 'hex'\n );\n const addressBuffer = Buffer.from(address.replace('0x', ''), 'hex');\n if (addressBuffer.length !== 20) {\n return false;\n }\n return addressBuffer.subarray(0, 16).equals(PREFIX_BUFFER.subarray(0, 16));\n }\n}\n", "import { BigNumber } from 'bignumber.js';\n\nexport const DECIMAL_PLACES = 12;\n\nBigNumber.config({\n EXPONENTIAL_AT: [-100, 100],\n ROUNDING_MODE: 4,\n DECIMAL_PLACES: DECIMAL_PLACES,\n});\n\nexport const ZERO = bnum(0);\nexport const ONE = bnum(1);\nexport const INFINITY = bnum('Infinity');\n\nexport function scale(input: BigNumber, decimalPlaces: number): BigNumber {\n const scalePow = new BigNumber(decimalPlaces.toString());\n const scaleMul = new BigNumber(10).pow(scalePow);\n return input.times(scaleMul);\n}\n\nexport function bnum(val: string | number | bigint | BigNumber): BigNumber {\n return new BigNumber(val.toString());\n}\n\nexport { BigNumber };\n", "import { AaveClient } from './AaveClient';\nimport { AaveCtx, AaveReserveCtx } from './types';\n\nimport { H160 } from '../utils/h160';\nimport { ERC20 } from '../utils/erc20';\n\nimport { bnum, BigNumber, ZERO, scale } from '../utils/bignumber';\nimport { Amount } from '../types';\n\nconst RAY = bnum('1e27');\nconst TARGET_WITHDRAW_HF = bnum('1.01');\n\nexport class AaveUtils {\n private client: AaveClient;\n\n constructor() {\n this.client = new AaveClient();\n }\n\n async loadAaveCtx(user: string): Promise<AaveCtx> {\n const to = H160.fromAny(user);\n\n const [poolReserves, userReserves, userData] = await Promise.all([\n this.client.getReservesData(),\n this.client.getUserReservesData(to),\n this.client.getUserAccountData(to),\n ]);\n\n const [pReserves] = poolReserves;\n const [uReserves, userEmodeCategoryId] = userReserves;\n const [\n totalCollateralBase,\n totalDebtBase,\n _availableBorrowsBase,\n _currentLiquidationThreshold,\n _ltv,\n healthFactor,\n ] = userData;\n\n const hf = bnum(healthFactor)\n .dividedBy(1e18)\n .decimalPlaces(6, BigNumber.ROUND_DOWN);\n\n const totalCollateral = bnum(totalCollateralBase);\n const totalDebt = bnum(totalDebtBase);\n\n const reserves: AaveReserveCtx[] = [];\n\n for (const uReserve of uReserves) {\n const reserveAsset = uReserve.underlyingAsset.toLowerCase();\n\n const pReserve = pReserves.find(\n ({ underlyingAsset }) => underlyingAsset.toLowerCase() === reserveAsset\n );\n\n if (!pReserve)\n throw new Error('Missing pool reserve for ' + reserveAsset);\n\n const scaledABalance = bnum(uReserve.scaledATokenBalance);\n const liquidityIndex = bnum(pReserve.liquidityIndex);\n const priceInRef = bnum(pReserve.priceInMarketReferenceCurrency);\n\n const aTokenBalance = scaledABalance\n .multipliedBy(liquidityIndex)\n .dividedBy(RAY)\n .decimalPlaces(0, BigNumber.ROUND_DOWN);\n\n const reserveLiquidationThreshold = bnum(\n userEmodeCategoryId === pReserve.eModeCategoryId\n ? pReserve.eModeLiquidationThreshold\n : pReserve.reserveLiquidationThreshold\n ).div(10000);\n\n const isCollateral =\n pReserve.usageAsCollateralEnabled &&\n uReserve.usageAsCollateralEnabledOnUser &&\n bnum(uReserve.scaledATokenBalance).gt(0);\n\n const reserveId = ERC20.toAssetId(reserveAsset);\n\n reserves.push({\n aTokenBalance,\n decimals: Number(pReserve.decimals),\n isCollateral,\n priceInRef,\n reserveId,\n reserveAsset,\n reserveLiquidationThreshold,\n });\n }\n\n return {\n healthFactor: hf.toNumber(),\n totalCollateral: totalCollateral,\n totalDebt: totalDebt,\n reserves: reserves,\n };\n }\n\n /**\n * Get current user health factor\n *\n * @param user - user address\n * @returns health factor decimal value\n */\n async getHealthFactor(user: string): Promise<number> {\n const to = H160.fromAny(user);\n const userData = await this.client.getUserAccountData(to);\n const [\n _totalCollateralBase,\n _totalDebtBase,\n _availableBorrowsBase,\n _currentLiquidationThreshold,\n _ltv,\n healthFactor,\n ] = userData;\n\n const hf = bnum(healthFactor)\n .dividedBy(1e18)\n .decimalPlaces(6, BigNumber.ROUND_DOWN);\n\n return hf.toNumber();\n }\n\n /**\n * Estimate health factor after aToken withdraw\n *\n * @param user - user address\n * @param reserve - reserve on-chain id (registry)\n * @param supplyAmount - aToken withdrawAmount amount (decimal)\n * @returns health factor decimal value\n */\n async getHealthFactorAfterWithdraw(\n user: string,\n reserve: string,\n withdrawAmount: string\n ): Promise<number> {\n const { totalCollateral, totalDebt, reserves } =\n await this.loadAaveCtx(user);\n\n const reserveAsset = ERC20.fromAssetId(reserve);\n const reserveCtx = reserves.find((r) => r.reserveAsset === reserveAsset);\n\n if (!reserveCtx) throw new Error('Missing reserve ctx for ' + reserveAsset);\n\n const { decimals, isCollateral, priceInRef, reserveLiquidationThreshold } =\n reserveCtx;\n\n const withdrawAmountNative = scale(\n bnum(withdrawAmount),\n decimals\n ).decimalPlaces(0, 1);\n\n // Convert withdraw amount to reference currency units\n const withdrawRef = isCollateral\n ? withdrawAmountNative\n .multipliedBy(priceInRef)\n .dividedBy(bnum(10).pow(decimals))\n .decimalPlaces(0, BigNumber.ROUND_DOWN)\n : ZERO;\n\n const adjustedCollateral = totalCollateral.minus(withdrawRef);\n\n // HF = 0 if no collateral\n if (adjustedCollateral.lte(0)) return 0;\n\n // HF = (C * LT) / D\n const healthFactor = adjustedCollateral\n .multipliedBy(reserveLiquidationThreshold)\n .dividedBy(totalDebt)\n .decimalPlaces(6, BigNumber.ROUND_DOWN);\n\n return healthFactor.toNumber();\n }\n\n /**\n * Estimate health factor after reserve supply\n *\n * @param user - user address\n * @param reserve - reserve on-chain id (registry)\n * @param supplyAmount - reserve supply amount (decimal)\n * @returns health factor decimal value\n */\n async getHealthFactorAfterSupply(\n user: string,\n reserve: string,\n supplyAmount: string\n ): Promise<number> {\n const { totalCollateral, totalDebt, reserves } =\n await this.loadAaveCtx(user);\n\n const reserveAsset = ERC20.fromAssetId(reserve);\n const reserveCtx = reserves.find((r) => r.reserveAsset === reserveAsset);\n\n if (!reserveCtx) throw new Error('Missing reserve ctx for ' + reserveAsset);\n\n const { decimals, priceInRef, reserveLiquidationThreshold } = reserveCtx;\n\n const supplyAmountNative = scale(\n bnum(supplyAmount),\n decimals\n ).decimalPlaces(0, 1);\n\n // Convert supply amount to reference currency units\n const supplyRef = supplyAmountNative\n .multipliedBy(priceInRef)\n .dividedBy(bnum(10).pow(decimals))\n .decimalPlaces(0, BigNumber.ROUND_DOWN);\n\n const newCollateral = totalCollateral.plus(supplyRef);\n\n // Avoid division by zero\n if (newCollateral.lte(0)) return 0;\n\n // HF = (C * LT) / B\n const healthFactor = newCollateral\n .multipliedBy(reserveLiquidationThreshold)\n .dividedBy(totalDebt)\n .decimalPlaces(6, BigNumber.ROUND_DOWN);\n\n return healthFactor.toNumber();\n }\n\n /**\n * Get MAX withdraw balance for given user reserve\n *\n * @param user - user address\n * @param reserve - reserve on-chain id (registry)\n * @returns aToken max withdrawable balance\n */\n async getMaxWithdraw(user: string, reserve: string): Promise<Amount> {\n const { totalCollateral, totalDebt, reserves } =\n await this.loadAaveCtx(user);\n\n const reserveAsset = ERC20.fromAssetId(reserve);\n const reserveCtx = reserves.find((r) => r.reserveAsset === reserveAsset);\n\n if (!reserveCtx) throw new Error('Missing reserve ctx for ' + reserveAsset);\n\n return this.calculateWithdrawMax(reserveCtx, totalCollateral, totalDebt);\n }\n\n /**\n * Get MAX withdraw balances for all user reserves\n *\n * @param user - user address\n * @returns aTokens max withdrawable balances\n */\n async getMaxWithdrawAll(user: string): Promise<Record<number, Amount>> {\n const { totalCollateral, totalDebt, reserves } =\n await this.loadAaveCtx(user);\n\n const result: Record<number, Amount> = {};\n\n for (const reserve of reserves) {\n const amount = this.calculateWithdrawMax(\n reserve,\n totalCollateral,\n totalDebt\n );\n\n if (reserve.reserveId) {\n result[reserve.reserveId] = amount;\n }\n }\n return result;\n }\n\n private calculateWithdrawMax(\n reserve: AaveReserveCtx,\n totalCollateral: BigNumber,\n totalDebt: BigNumber\n ) {\n const { aTokenBalance, decimals, priceInRef, reserveLiquidationThreshold } =\n reserve;\n\n const requiredCollateral = TARGET_WITHDRAW_HF.multipliedBy(totalDebt)\n .div(reserveLiquidationThreshold)\n .decimalPlaces(0, BigNumber.ROUND_UP);\n\n const withdrawableRef = totalCollateral\n .minus(requiredCollateral)\n .decimalPlaces(0, 1);\n\n if (withdrawableRef.lte(0)) {\n return {\n amount: ZERO,\n decimals: decimals,\n };\n }\n\n const withdrawableTokens = withdrawableRef\n .multipliedBy(bnum(10).pow(decimals)) // apply token decimals\n .dividedBy(priceInRef) // divide by ref price decimals\n .decimalPlaces(0, BigNumber.ROUND_DOWN);\n\n const maxWithdrawable = BigNumber.minimum(\n aTokenBalance,\n withdrawableTokens\n );\n\n return {\n amount: maxWithdrawable,\n decimals,\n } as Amount;\n }\n}\n", "import { ApiPromise } from '@polkadot/api';\nimport { CallDryRunEffects } from '@polkadot/types/interfaces';\nimport { SubmittableExtrinsic } from '@polkadot/api/promise/types';\n\nimport '@galacticcouncil/api-augment/hydradx';\nimport '@galacticcouncil/api-augment/basilisk';\n\nexport abstract class PolkadotApiClient {\n protected readonly api: ApiPromise;\n\n constructor(api: ApiPromise) {\n this.api = api;\n }\n\n get chainDecimals() {\n return this.api.registry.chainDecimals[0];\n }\n\n get chainToken() {\n return this.api.registry.chainTokens[0];\n }\n\n async dryRun(\n account: string,\n extrinsic: SubmittableExtrinsic\n ): Promise<CallDryRunEffects> {\n let result;\n try {\n result = await this.api.call.dryRunApi.dryRunCall(\n {\n System: { Signed: account },\n },\n extrinsic.inner.toHex()\n );\n } catch (e) {\n console.error(e);\n throw new Error('Dry run execution failed!');\n }\n\n if (result.isOk) {\n return result.asOk;\n }\n console.log(result.asErr.toHuman());\n throw new Error('Dry run execution error!');\n }\n\n protected log(message?: any, ...optionalParams: any[]) {\n const debug =\n typeof window === 'undefined'\n ? process.env['GC_DEBUG']\n : window.localStorage.getItem('gc.debug');\n\n const logOn = this.getLogValue(debug);\n if (logOn) {\n console.log(message, ...optionalParams);\n }\n }\n\n private getLogValue(value: any) {\n switch (value) {\n case true:\n case 'true':\n case 1:\n case '1':\n case 'on':\n case 'yes':\n return true;\n default:\n return false;\n }\n }\n}\n", "import type {\n HydradxRuntimeXcmAssetLocation,\n PalletAssetRegistryAssetDetails,\n PalletAssetRegistryAssetMetadata,\n PalletStableswapPoolInfo,\n} from '@polkadot/types/lookup';\nimport { ApiPromise } from '@polkadot/api';\nimport { Option, StorageKey } from '@polkadot/types';\nimport { ITuple } from '@polkadot/types-codec/types';\nimport { u32, u64 } from '@polkadot/types-codec';\n\nimport { PolkadotApiClient } from '../api';\nimport { SYSTEM_ASSET_ID } from '../consts';\nimport { Asset, AssetMetadata, Bond, ExternalAsset } from '../types';\n\nexport class AssetClient extends PolkadotApiClient {\n private SUPPORTED_TYPES = [\n 'StableSwap',\n 'Bond',\n 'Token',\n 'External',\n 'Erc20',\n ];\n\n constructor(api: ApiPromise) {\n super(api);\n }\n\n async safeSharesQuery(): Promise<Map<string, PalletStableswapPoolInfo>> {\n try {\n const entries = await this.api.query.stableswap.pools.entries();\n return new Map(\n entries.map(\n ([\n {\n args: [id],\n },\n value,\n ]) => [id.toString(), value.unwrap()]\n )\n );\n } catch (error) {\n return new Map([]);\n }\n }\n\n async safeBondsQuery(): Promise<Map<string, ITuple<[u32, u64]>>> {\n try {\n const entries = await this.api.query.bonds.bonds.entries();\n return new Map(\n entries.map(\n ([\n {\n args: [id],\n },\n value,\n ]) => {\n return [id.toString(), value.unwrap()];\n }\n )\n );\n } catch (error) {\n return new Map([]);\n }\n }\n\n async metadataQuery(): Promise<Map<string, AssetMetadata>> {\n try {\n const entries =\n await this.api.query.assetRegistry.assetMetadataMap.entries<\n Option<PalletAssetRegistryAssetMetadata>\n >();\n return new Map(\n entries.map(\n ([\n {\n args: [id],\n },\n value,\n ]) => {\n const { decimals, symbol } = value.unwrap();\n return [\n id.toString(),\n {\n decimals: decimals.toNumber(),\n symbol: symbol.toHuman() as string,\n },\n ];\n }\n )\n );\n } catch (error) {\n return new Map([]);\n }\n }\n\n async locationsQuery(): Promise<Map<string, HydradxRuntimeXcmAssetLocation>> {\n try {\n const entries =\n await this.api.query.assetRegistry.assetLocations.entries();\n return new Map(\n entries.map(\n ([\n {\n args: [id],\n },\n value,\n ]) => {\n return [id.toString(), value.unwrap()];\n }\n )\n );\n } catch (error) {\n return new Map([]);\n }\n }\n\n private getSystemTokenName(chainToken: string) {\n switch (chainToken) {\n case 'HDX':\n return 'Hydration';\n case 'BSX':\n return 'Basilisk';\n default:\n return chainToken;\n }\n }\n\n private getToken(\n tokenKey: string,\n details: PalletAssetRegistryAssetDetails,\n metadata: Map<string, AssetMetadata>,\n location?: HydradxRuntimeXcmAssetLocation\n ): Asset {\n if (tokenKey == SYSTEM_ASSET_ID) {\n const defaultAssetEd = this.api.consts.balances.existentialDeposit;\n return {\n id: SYSTEM_ASSET_ID,\n name: this.getSystemTokenName(this.chainToken),\n symbol: this.chainToken,\n decimals: this.chainDecimals,\n icon: this.chainToken,\n type: 'Token',\n isSufficient: true,\n existentialDeposit: defaultAssetEd.toString(),\n } as Asset;\n }\n\n const { name, assetType, isSufficient, existentialDeposit } = details;\n const { symbol, decimals } = metadata.get(tokenKey) ?? {};\n return {\n id: tokenKey,\n name: name.toHuman(),\n symbol: symbol,\n decimals: decimals,\n icon: symbol,\n type: assetType.toHuman(),\n isSufficient: isSufficient ? isSufficient.toHuman() : true,\n location: location?.toJSON(),\n existentialDeposit: existentialDeposit.toString(),\n } as Asset;\n }\n\n private getBond(\n tokenKey: string,\n details: PalletAssetRegistryAssetDetails,\n metadata: Map<string, AssetMetadata>,\n bond: ITuple<[u32, u64]>\n ): Bond {\n const [underlyingAsset, maturity] = bond;\n const { assetType, isSufficient, existentialDeposit } = details;\n const { symbol, decimals } = this.getToken(\n underlyingAsset.toString(),\n details,\n metadata\n );\n const bondMaturity = maturity.toNumber();\n const bondFormatter = new Intl.DateTimeFormat('en-GB');\n const bondName = [symbol, 'Bond', bondFormatter.format(bondMaturity)].join(\n ' '\n );\n return {\n id: tokenKey,\n name: bondName,\n symbol: symbol + 'b',\n decimals: decimals,\n icon: symbol,\n type: assetType.toString(),\n isSufficient: isSufficient.toHuman(),\n existentialDeposit: existentialDeposit.toString(),\n underlyingAssetId: underlyingAsset.toString(),\n maturity: bondMaturity,\n } as Bond;\n }\n\n private getShares(\n tokenKey: string,\n details: PalletAssetRegistryAssetDetails,\n metadata: Map<string, AssetMetadata>,\n share: PalletStableswapPoolInfo\n ): Asset {\n const { assets } = share;\n const { name, symbol, assetType, isSufficient, existentialDeposit } =\n details;\n const poolTokens = assets.map((asset) => asset.toString());\n const poolEntries = poolTokens.map((token: string) => {\n const { symbol } = this.getToken(token, details, metadata);\n return [token, symbol];\n });\n const meta = Object.fromEntries(poolEntries);\n const symbols = Object.values(meta);\n return {\n id: tokenKey,\n name: symbols.join(', '),\n symbol: symbol?.isSome ? symbol.toHuman() : name.toHuman(),\n decimals: 18,\n icon: symbols.join('/'),\n type: assetType.toString(),\n isSufficient: isSufficient.toHuman(),\n existentialDeposit: existentialDeposit.toString(),\n meta: meta,\n } as Asset;\n }\n\n private getExternal(\n tokenKey: string,\n details: PalletAssetRegistryAssetDetails,\n external?: ExternalAsset[],\n location?: HydradxRuntimeXcmAssetLocation\n ): Asset {\n const token = this.getToken(tokenKey, details, new Map(), location);\n const ext = external?.find((a) => a.internalId === token.id);\n\n return ext\n ? {\n ...token,\n decimals: ext.decimals,\n name: ext.name,\n symbol: ext.symbol,\n icon: ext.symbol,\n isWhiteListed: ext.isWhiteListed,\n }\n : token;\n }\n\n private normalizeMetadata(\n assets: [StorageKey<[u32]>, Option<PalletAssetRegistryAssetDetails>][],\n metadata: Map<string, AssetMetadata>\n ): Map<string, AssetMetadata> {\n return metadata.size\n ? metadata\n : new Map(\n assets.map(\n ([\n {\n args: [id],\n },\n value,\n ]) => {\n const { decimals, symbol } = value.unwrap();\n return [\n id.toString(),\n {\n decimals: Number(decimals.toString()),\n symbol: symbol.toHuman() as string,\n },\n ];\n }\n )\n );\n }\n\n private getSupportedAssets(\n assets: [StorageKey<[u32]>, Option<PalletAssetRegistryAssetDetails>][]\n ) {\n return assets.filter(([_args, state]) => {\n if (state.isNone) {\n return false;\n }\n const details = state.unwrap();\n return this.isSupportedAsset(details);\n });\n }\n\n async getOnChainAssets(\n includeInvalid?: boolean,\n external?: ExternalAsset[]\n ): Promise<Asset[]> {\n const [assets, assetLocations, shares, bonds, legacyMetadata] =\n await Promise.all([\n this.api.query.assetRegistry.assets.entries(),\n this.locationsQuery(),\n this.safeSharesQuery(),\n this.safeBondsQuery(),\n this.metadataQuery(),\n ]);\n\n const supportedAssets = this.getSupportedAssets(assets);\n const metadata = this.normalizeMetadata(supportedAssets, legacyMetadata);\n\n const assetsWithMeta = supportedAssets.map(\n ([\n {\n args: [id],\n },\n value,\n ]) => {\n const details = value.unwrap();\n const location = assetLocations.get(id.toString());\n\n const { assetType } = details;\n switch (assetType.toString()) {\n case 'Bond':\n const bond = bonds.get(id.toString());\n return this.getBond(id.toString(), details, metadata, bond!);\n case 'StableSwap':\n const share = shares.get(id.toString());\n return this.getShares(id.toString(), details, metadata, share!);\n case 'External':\n return this.getExternal(id.toString(), details, external, location);\n default:\n return this.getToken(id.toString(), details, metadata, location);\n }\n }\n );\n\n return includeInvalid\n ? assetsWithMeta\n : assetsWithMeta.filter((a) => this.isValidAsset(a));\n }\n\n private isValidAsset(asset: Asset): boolean {\n const decimalSign = Math.sign(asset.decimals);\n return !!asset.symbol && (decimalSign === 0 || decimalSign === 1);\n }\n\n private isSupportedAsset(details: PalletAssetRegistryAssetDetails): boolean {\n const type = details.assetType.toString();\n return this.SUPPORTED_TYPES.includes(type);\n }\n}\n", "import { ApiPromise } from '@polkadot/api';\nimport { OrmlTokensAccountData } from '@polkadot/types/lookup';\nimport { UnsubscribePromise } from '@polkadot/api-base/types';\n\nimport { PolkadotApiClient } from '../api';\nimport { SYSTEM_ASSET_ID } from '../consts';\nimport { Asset } from '../types';\nimport { BigNumber } from '../utils/bignumber';\n\nexport class BalanceClient extends PolkadotApiClient {\n constructor(api: ApiPromise) {\n super(api);\n }\n\n async getBalance(account: string, assetId: string): Promise<BigNumber> {\n const asset = await this.api.query.assetRegistry.assets(assetId);\n const { assetType } = asset.unwrap();\n\n if (assetType.toString() === 'Erc20') {\n return this.getErc20Balance(account, assetId);\n }\n\n return assetId === SYSTEM_ASSET_ID\n ? this.getSystemBalance(account)\n : this.getTokenBalance(account, assetId);\n }\n\n async getSystemBalance(account: string): Promise<BigNumber> {\n const { data } = await this.api.query.system.account(account);\n return this.calculateFreeBalance(data);\n }\n\n async getTokenBalance(account: string, assetId: string): Promise<BigNumber> {\n const { free, reserved, frozen } = await this.api.query.tokens.accounts(\n account,\n assetId\n );\n return this.calculateFreeBalance({ free, feeFrozen: reserved, frozen });\n }\n\n async getErc20Balance(account: string, assetId: string): Promise<BigNumber> {\n const { free, reserved, frozen } = await this.getTokenBalanceData(\n account,\n assetId\n );\n return this.calculateFreeBalance({ free, feeFrozen: 0n, frozen });\n }\n\n async subscribeSystemBalance(\n address: string,\n onChange: (token: string, balance: BigNumber) => void\n ): UnsubscribePromise {\n return this.api.query.system.account(address, ({ data }) =>\n onChange(SYSTEM_ASSET_ID, this.calculateFreeBalance(data))\n );\n }\n\n async subscribeTokenBalance(\n address: string,\n assets: Asset[],\n onChange: (balances: [string, BigNumber][]) => void\n ): UnsubscribePromise {\n const supported = assets\n .filter((a) => a.type !== 'Erc20')\n .filter((a) => a.id !== SYSTEM_ASSET_ID);\n\n const callArgs = supported.map((a) => [address, a.id]);\n return this.api.query.tokens.accounts.multi(callArgs, (balances) => {\n const result: [string, BigNumber][] = [];\n balances.forEach((data, i) => {\n const freeBalance = this.calculateFreeBalance(data);\n const token = callArgs[i][1];\n result.push([token, freeBalance]);\n });\n onChange(result);\n });\n }\n\n async subscribeErc20Balance(\n address: string,\n assets: Asset[],\n onChange: (balances: [string, BigNumber][]) => void\n ): UnsubscribePromise {\n const supported = assets.filter((a) => a.type === 'Erc20');\n\n const getErc20Balance = async () => {\n const result: [string, BigNumber][] = [];\n const balances: [string, BigNumber][] = await Promise.all(\n supported.map(async (token: Asset) => [\n token.id,\n await this.getErc20Balance(address, token.id),\n ])\n );\n balances.forEach(([token, balance]) => {\n result.push([token, balance]);\n });\n onChange(result);\n };\n\n await getErc20Balance();\n return this.api.rpc.chain.subscribeNewHeads(async () => {\n getErc20Balance();\n });\n }\n\n async getTokenBalanceData(account: string, assetId: string) {\n return this.api.call.currenciesApi.account<OrmlTokensAccountData>(\n assetId,\n account\n );\n }\n\n protected calculateFreeBalance(data: any): BigNumber {\n const { free, miscFrozen, feeFrozen, frozen } = data;\n const freeBN = new BigNumber(free);\n const miscFrozenBN = new BigNumber(miscFrozen || frozen);\n const feeFrozenBN = new BigNumber(feeFrozen || 0n);\n const maxFrozenBN = miscFrozenBN.gt(feeFrozenBN)\n ? miscFrozenBN\n : feeFrozenBN;\n return freeBN.minus(maxFrozenBN);\n }\n}\n", "import { fixed_from_rational } from '@galacticcouncil/math-liquidity-mining';\n\nimport { ApiPromise } from '@polkadot/api';\nimport { GenericAccountId32 } from '@polkadot/types';\nimport { AccountId32 } from '@polkadot/types/interfaces';\nimport { PalletLiquidityMiningGlobalFarmData } from '@polkadot/types/lookup';\nimport { u32 } from '@polkadot/types-codec';\nimport { Registry } from '@polkadot/types-codec/types';\n\nimport { u8aConcat } from '@polkadot/util';\nimport { U8aLike } from '@polkadot/util/types';\nimport { isAddress } from '@polkadot/util-crypto';\n\nimport { PolkadotApiClient } from '../api';\nimport { BigNumber, ZERO } from '../utils/bignumber';\n\nimport { BalanceClient } from './BalanceClient';\n\nexport class FarmClient extends PolkadotApiClient {\n protected readonly balanceClient: BalanceClient;\n\n constructor(api: ApiPromise) {\n super(api);\n this.balanceClient = new BalanceClient(api);\n }\n\n private secondsInYear = new BigNumber(365.2425).times(24).times(60).times(60);\n\n private async getOmnipoolFarms(assetId: string) {\n const activeYieldFarmIds =\n await this.api.query.omnipoolWarehouseLM.activeYieldFarm.entries(assetId);\n\n const farms = await Promise.all(\n activeYieldFarmIds.map(async ([storageKey, option]) => {\n const [, globalFarmIdRaw] = storageKey.args;\n\n const yieldFarmId = option.unwrap().toString();\n const globalFarmId = globalFarmIdRaw.toString();\n\n const globalFarm = (\n await this.api.query.omnipoolWarehouseLM.globalFarm(globalFarmId)\n ).unwrap();\n const yieldFarm = (\n await this.api.query.omnipoolWarehouseLM.yieldFarm(\n assetId,\n globalFarmId,\n yieldFarmId\n )\n ).unwrap();\n\n const priceAdjustment =\n (await this.getOraclePrice(globalFarm)) ??\n globalFarm.priceAdjustment.toString();\n\n const accountResolver = this.getAccountResolver(this.api.registry);\n const potAddress = accountResolver(\n Number(globalFarmId),\n false\n ).toString();\n const rewardCurrency = globalFarm.rewardCurrency.toString();\n\n const balance = await this.balanceClient.getTokenBalanceData(\n potAddress,\n rewardCurrency\n );\n\n return {\n assetId,\n globalFarm,\n yieldFarm,\n priceAdjustment,\n potBalance: balance.free.toString(),\n };\n })\n );\n\n return farms;\n }\n\n private async getIsolatedPoolFarms(assetId: string) {\n const activeYieldFarmIds =\n await this.api.query.xykWarehouseLM.activeYieldFarm.entries(assetId);\n\n const farms = await Promise.all(\n activeYieldFarmIds.map(async ([storageKey, option]) => {\n const [, globalFarmIdRaw] = storageKey.args;\n\n const yieldFarmId = option.unwrap().toString();\n const globalFarmId = globalFarmIdRaw.toString();\n\n const globalFarm = (\n await this.api.query.xykWarehouseLM.globalFarm(globalFarmId)\n ).unwrap();\n const yieldFarm = (\n await this.api.query.xykWarehouseLM.yieldFarm(\n assetId,\n globalFarmId,\n yieldFarmId\n )\n ).unwrap();\n\n const priceAdjustment =\n (await this.getOraclePrice(globalFarm)) ??\n globalFarm.priceAdjustment.toString();\n\n const accountResolver = this.getAccountResolver(this.api.registry);\n const potAddress = accountResolver(\n Number(globalFarmId),\n true\n ).toString();\n const rewardCurrency = globalFarm.rewardCurrency.toString();\n const balance = await this.balanceClient.getTokenBalanceData(\n potAddress,\n rewardCurrency\n );\n\n return {\n assetId,\n globalFarm,\n yieldFarm,\n priceAdjustment,\n potBalance: balance.free.toString(),\n };\n })\n );\n\n return farms;\n }\n\n async getOraclePrice(globalFarm: PalletLiquidityMiningGlobalFarmData) {\n const rewardCurrency = globalFarm.rewardCurrency.toString();\n const incentivizedAsset = globalFarm.incentivizedAsset.toString();\n\n const orderedAssets = [rewardCurrency, incentivizedAsset].sort() as [\n string,\n string,\n ];\n\n if (rewardCurrency === incentivizedAsset)\n return new BigNumber(1).shiftedBy(18).toString();\n\n const res = await this.api.query.emaOracle.oracles(\n 'omnipool',\n orderedAssets,\n 'TenMinutes'\n );\n\n if (res.isNone) return undefined;\n\n const [data] = res.unwrap();\n const n = data.price.n.toString();\n const d = data.price.d.toString();\n\n let oraclePrice;\n if (Number(rewardCurrency) < Number(incentivizedAsset)) {\n oraclePrice = fixed_from_rational(n, d);\n } else {\n oraclePrice = fixed_from_rational(d, n);\n }\n\n return oraclePrice;\n }\n\n private getGlobalRewardPerPeriod(\n totalSharesZ: BigNumber,\n yieldPerPeriod: BigNumber,\n maxRewardPerPeriod: BigNumber,\n priceAdjustemnt: string\n ) {\n const globalRewardPerPeriod_ = totalSharesZ\n .times(yieldPerPeriod)\n .shiftedBy(-18);\n\n const globalRewardPerPeriod = globalRewardPerPeriod_\n .times(priceAdjustemnt)\n .shiftedBy(-18);\n\n const isFarmFull = globalRewardPerPeriod.gte(maxRewardPerPeriod);\n\n return isFarmFull ? maxRewardPerPeriod : globalRewardPerPeriod;\n }\n\n private getPoolYieldPerPeriod(\n globalRewardPerPeriod: BigNumber,\n multiplier: BigNumber,\n totalSharesZ: BigNumber,\n priceAdjustemnt: string\n ) {\n return globalRewardPerPeriod\n .times(multiplier)\n .div(totalSharesZ.times(priceAdjustemnt).shiftedBy(-18));\n }\n\n private padEndU8a(value: U8aLike, length: number) {\n return u8aConcat(value, Array(Math.max(0, length - value.length)).fill(0));\n }\n\n private getAccountResolver =\n (registry: Registry) =>\n (sub: u32 | number, isXyk?: boolean): AccountId32 => {\n // TYPE_ID based on Substrate\n const TYPE_ID = 'modl';\n const PALLET_ID = isXyk ? '0x78796b4c4d704944' : '0x4f6d6e6957684c4d';\n\n return new GenericAccountId32(\n registry,\n this.padEndU8a(\n u8aConcat(\n TYPE_ID,\n PALLET_ID,\n typeof sub !== 'number' ? sub.toU8a() : [sub]\n ),\n 32\n )\n );\n };\n\n /**\n * Return list of all available assets from substrate based pools\n * @param {string} id - asset id within omnipool or address of isolated pool\n * @param {'omnipool' | 'isolatedpool'} type - type of pool\n * @returns {string} sum of all active farm APRS\n */\n async getFarmApr(id: string, type: 'omnipool' | 'isolatedpool') {\n if (type === 'isolatedpool' && !isAddress(id))\n throw new Error('You must pass an address of isolated pool as id');\n\n if (type === 'omnipool' && isAddress(id))\n throw new Error('You must pass an asset id of omnipool');\n\n const blockTime = 6;\n\n const farms =\n type === 'omnipool'\n ? await this.getOmnipoolFarms(id)\n : await this.getIsolatedPoolFarms(id);\n\n if (!farms.length) return undefined;\n\n const aprs = farms.map(\n ({ yieldFarm, globalFarm, priceAdjustment, potBalance }) => {\n const totalSharesZ = new BigNumber(globalFarm.totalSharesZ.toString());\n const plannedYieldingPeriods =\n globalFarm.plannedYieldingPeriods.toString();\n const yieldPerPeriod = new BigNumber(\n globalFarm.yieldPerPeriod.toString()\n );\n const maxRewardPerPeriod = new BigNumber(\n globalFarm.maxRewardPerPeriod.toString()\n );\n const blocksPerPeriod = globalFarm.blocksPerPeriod.toString();\n\n const multiplier = new BigNumber(\n yieldFarm.multiplier.toString()\n ).shiftedBy(-18);\n\n const periodsPerYear = this.secondsInYear.div(\n new BigNumber(blockTime).times(blocksPerPeriod)\n );\n\n let apr;\n\n if (totalSharesZ.isZero()) {\n apr = yieldPerPeriod.times(multiplier).times(periodsPerYear);\n } else {\n const globalRewardPerPeriod = this.getGlobalRewardPerPeriod(\n totalSharesZ,\n yieldPerPeriod,\n maxRewardPerPeriod,\n priceAdjustment\n );\n const poolYieldPerPeriod = this.getPoolYieldPerPeriod(\n globalRewardPerPeriod,\n multiplier,\n totalSharesZ,\n priceAdjustment\n );\n\n apr = poolYieldPerPeriod.times(periodsPerYear);\n }\n\n const distributedRewards = new BigNumber(\n globalFarm.pendingRewards.toString()\n ).plus(globalFarm.accumulatedPaidRewards.toString());\n const maxRewards = maxRewardPerPeriod.times(plannedYieldingPeriods);\n\n const potMaxRewards = potBalance\n ? distributedRewards.plus(potBalance)\n : maxRewards;\n\n const isDistributed = distributedRewards.div(potMaxRewards).gte(0.999);\n\n return isDistributed\n ? ZERO\n : apr.div(type === 'isolatedpool' ? 2 : 1).times(100);\n }\n );\n\n const aprSum = aprs.reduce((acc, apr) => acc.plus(apr), ZERO).toString();\n\n return aprSum;\n }\n}\n", "import { PoolType } from './pool';\n\nexport class PoolNotFound extends Error {\n constructor(poolType: PoolType) {\n super();\n this.message = `${poolType} pool invalid`;\n this.name = 'PoolNotFound';\n }\n}\n\nexport class PoolConfigNotFound extends Error {\n constructor(poolType: PoolType, param: string) {\n super();\n this.message = `${poolType} pool missing ${param}`;\n this.name = 'PoolConfigNotFound';\n }\n}\n\nexport class RouteNotFound extends Error {\n constructor(assetIn: string, assetOut: string) {\n super();\n this.message = `Route from ${assetIn} to ${assetOut} not found in pool configuration`;\n this.name = 'RouteNotFound';\n }\n}\n\nexport class AssetNotFound extends Error {\n constructor(asset: string) {\n super();\n this.message = `Asset ${asset} not available in current network`;\n this.name = 'AssetNotFound';\n }\n}\n\nexport class StorageConfigNotFound extends Error {\n constructor(param: string) {\n super();\n this.message = `Storage missing ${param}`;\n this.name = 'StorageConfigNotFound';\n }\n}\n\nexport class SubscriptionNotSupported extends Error {\n constructor(subscriptionType: string) {\n super();\n this.message = `Subscription type \"${subscriptionType}\" not supported`;\n this.name = 'SubscriptionNotSupported';\n }\n}\n\nexport class ProviderConfigNotFound extends Error {\n constructor(message: string) {\n super();\n this.message = `${message}`;\n this.name = 'ProviderConfigNotFound';\n }\n}\n", "import { ApiPromise } from '@polkadot/api';\nimport { LRUCache } from '@thi.ng/cache';\n\nimport { Pool, PoolFees, PoolPair } from './types';\n\nimport { PoolService } from './PoolService';\n\nexport class CachingPoolService extends PoolService {\n private feeCache: LRUCache<string, PoolFees>;\n private disconnectSubscribeNewHeads: (() => void) | null = null;\n\n constructor(api: ApiPromise) {\n super(api);\n this.feeCache = new LRUCache<string, PoolFees>(null);\n this.api.rpc.chain\n .subscribeNewHeads(async (_lastHeader) => {\n this.feeCache.release();\n })\n .then((subsFn) => {\n this.disconnectSubscribeNewHeads = subsFn;\n });\n }\n\n async getPoolFees(poolPair: PoolPair, pool: Pool): Promise<PoolFees> {\n const key = [pool.address, poolPair.assetIn, poolPair.assetOut].join('-');\n const hasKey = this.feeCache.has(key);\n if (hasKey) {\n return this.feeCache.get(key)!;\n } else {\n const fees = await super.getPoolFees(poolPair, pool);\n this.feeCache.set(key, fees);\n return fees;\n }\n }\n\n async destroy(): Promise<void> {\n this.log(`Destroying pool cache! \\nItems: [${this.feeCache.length}]`);\n this.feeCache.release();\n this.disconnectSubscribeNewHeads?.();\n }\n}\n", "import { ApiPromise } from '@polkadot/api';\n\nimport { memoize1 } from '@thi.ng/memoize';\n\nimport { PolkadotApiClient } from '../api';\nimport { AssetClient } from '../client';\nimport { PoolNotFound } from '../errors';\nimport { Asset, ExternalAsset } from '../types';\n\nimport { AavePoolClient } from './aave';\nimport { LbpPoolClient } from './lbp';\nimport { OmniPoolClient } from './omni';\nimport { XykPoolClient } from './xyk';\nimport { StableSwapClient } from './stable';\n\nimport {\n IPoolService,\n Pool,\n PoolBase,\n PoolFees,\n PoolPair,\n PoolType,\n} from './types';\n\nimport { PoolClient } from './PoolClient';\n\nexport class PoolService extends PolkadotApiClient implements IPoolService {\n protected readonly api: ApiPromise;\n\n protected readonly assetClient: AssetClient;\n\n protected readonly aaveClient: AavePoolClient;\n protected readonly xykClient: XykPoolClient;\n protected readonly omniClient: OmniPoolClient;\n protected readonly lbpClient: LbpPoolClient;\n protected readonly stableClient: StableSwapClient;\n\n protected readonly clients: PoolClient[] = [];\n\n protected onChainAssets: Asset[] = [];\n\n private memRegistry = memoize1((mem: number) => {\n this.log(`Registry mem ${mem} sync`);\n return this.syncRegistry();\n });\n\n constructor(api: ApiPromise) {\n super(api);\n this.api = api;\n this.assetClient = new AssetClient(this.api);\n this.aaveClient = new AavePoolClient(this.api);\n this.xykClient = new XykPoolClient(this.api);\n this.omniClient = new OmniPoolClient(this.api);\n this.lbpClient = new LbpPoolClient(this.api);\n this.stableClient = new StableSwapClient(this.api);\n this.clients = [\n this.aaveClient,\n this.xykClient,\n this.omniClient,\n this.lbpClient,\n this.stableClient,\n ];\n }\n\n get assets(): Asset[] {\n return this.onChainAssets;\n }\n\n get isRegistrySynced(): boolean {\n return this.onChainAssets.length > 0;\n }\n\n async syncRegistry(external?: ExternalAsset[]) {\n const assets = await this.assetClient.getOnChainAssets(false, external);\n this.clients.forEach((c) => c.withAssets(assets));\n this.onChainAssets = assets;\n }\n\n async getPools(includeOnly: PoolType[]): Promise<PoolBase[]> {\n if (!this.isRegistrySynced) {\n await this.memRegistry(1);\n }\n\n if (includeOnly.length == 0) {\n const pools = await Promise.all(\n this.clients\n .filter((client) => client.isSupported())\n .map((client) => client.getPoolsMem())\n );\n return pools.flat();\n }\n\n const pools = await Promise.all(\n this.clients\n .filter((client) => includeOnly.some((t) => t === client.getPoolType()))\n .map((client) => client.getPoolsMem())\n );\n return pools.flat();\n }\n\n destroy() {\n this.aaveClient.unsubscribe();\n this.xykClient.unsubscribe();\n this.omniClient.unsubscribe();\n this.lbpClient.unsubscribe();\n this.stableClient.unsubscribe();\n }\n\n async getPoolFees(poolPair: PoolPair, pool: Pool): Promise<PoolFees> {\n switch (pool.type) {\n case PoolType.Aave:\n return this.aaveClient.getPoolFees(poolPair, pool.address);\n case PoolType.XYK:\n return this.xykClient.getPoolFees(poolPair, pool.address);\n case PoolType.Omni:\n return this.omniClient.getPoolFees(poolPair, pool.address);\n case PoolType.LBP:\n return this.lbpClient.getPoolFees(poolPair, pool.address);\n case PoolType.Stable:\n return this.stableClient.getPoolFees(poolPair, pool.address);\n default:\n throw new PoolNotFound(pool.type);\n }\n }\n}\n", "import type { Asset } from '../types';\nimport type { BigNumber } from '../utils/bignumber';\n\nexport enum PoolType {\n Aave = 'Aave',\n LBP = 'Lbp',\n Omni = 'Omnipool',\n Stable = 'Stableswap',\n XYK = 'Xyk',\n}\n\nexport enum PoolError {\n UnknownError = 'UnknownError',\n InsufficientTradingAmount = 'InsufficientTradingAmount',\n MaxInRatioExceeded = 'MaxInRatioExceeded',\n MaxOutRatioExceeded = 'MaxOutRatioExceeded',\n TradeNotAllowed = 'TradeNotAllowed',\n}\n\nexport interface PoolPair {\n assetIn: string;\n assetOut: string;\n decimalsIn: number;\n decimalsOut: number;\n balanceIn: BigNumber;\n balanceOut: BigNumber;\n assetInED: BigNumber;\n assetOutED: BigNumber;\n}\n\nexport type PoolBase = {\n address: string;\n id?: string;\n type: PoolType;\n tokens: PoolToken[];\n maxInRatio: number;\n maxOutRatio: number;\n minTradingLimit: number;\n};\n\nexport interface PoolToken extends Asset {\n id: string;\n balance: string;\n tradeable?: number;\n}\n\nexport type PoolLimits = Pick<\n PoolBase,\n 'maxInRatio' | 'maxOutRatio' | 'minTradingLimit'\n>;\n\nexport type PoolFee = [numerator: number, denominator: number];\n\n// Pool fee marker interface\nexport type PoolFees = {\n min?: PoolFee;\n max?: PoolFee;\n};\n\nexport type PoolSell = {\n calculatedOut: BigNumber;\n};\n\nexport type PoolBuy = {\n calculatedIn: BigNumber;\n};\n\nexport type PoolSwap = {\n amountIn: BigNumber;\n amountOut: BigNumber;\n feePct: number;\n errors: PoolError[];\n};\n\nexport type SellCtx = PoolSwap & PoolSell;\nexport type BuyCtx = PoolSwap & PoolBuy;\n\nexport interface Pool extends PoolBase {\n validatePair(tokenIn: string, tokenOut: string): boolean;\n parsePair(tokenIn: string, tokenOut: string): PoolPair;\n validateAndBuy(\n poolPair: PoolPair,\n amountOut: BigNumber,\n dynamicFees: PoolFees | null\n ): BuyCtx;\n validateAndSell(\n poolPair: PoolPair,\n amountOut: BigNumber,\n dynamicFees: PoolFees | null\n ): SellCtx;\n calculateInGivenOut(poolPair: PoolPair, amountOut: BigNumber): BigNumber;\n calculateOutGivenIn(poolPair: PoolPair, amountIn: BigNumber): BigNumber;\n spotPriceInGivenOut(poolPair: PoolPair): BigNumber;\n spotPriceOutGivenIn(poolPair: PoolPair): BigNumber;\n}\n\nexport interface IPoolService {\n getPools(includeOnly?: PoolType[]): Promise<PoolBase[]>;\n getPoolFees(poolPair: PoolPair, pool: Pool): Promise<PoolFees>;\n}\n\nexport type Hop = {\n pool: PoolType;\n poolAddress: string;\n poolId?: string;\n assetIn: string;\n assetOut: string;\n};\n", "import {\n BuyCtx,\n Pool,\n PoolBase,\n PoolError,\n PoolFees,\n PoolPair,\n PoolToken,\n PoolType,\n SellCtx,\n} from '../types';\nimport { BigNumber, bnum, ONE, scale, ZERO } from '../../utils/bignumber';\n\nexport class AavePool implements Pool {\n type: PoolType;\n address: string;\n tokens: PoolToken[];\n maxInRatio: number;\n maxOutRatio: number;\n minTradingLimit: number;\n\n static fromPool(pool: PoolBase): AavePool {\n return new AavePool(\n pool.address,\n pool.tokens as PoolToken[],\n pool.maxInRatio,\n pool.maxOutRatio,\n pool.minTradingLimit\n );\n }\n\n constructor(\n address: string,\n tokens: PoolToken[],\n maxInRation: number,\n maxOutRatio: number,\n minTradeLimit: number\n ) {\n this.type = PoolType.Aave;\n this.address = address;\n this.tokens = tokens;\n this.maxInRatio = maxInRation;\n this.maxOutRatio = maxOutRatio;\n this.minTradingLimit = minTradeLimit;\n }\n\n validatePair(_tokenIn: string, _tokenOut: string): boolean {\n return true;\n }\n\n parsePair(tokenIn: string, tokenOut: string): PoolPair {\n const tokensMap = new Map(this.tokens.map((token) => [token.id, token]));\n const tokenInMeta = tokensMap.get(tokenIn);\n const tokenOutMeta = tokensMap.get(tokenOut);\n\n if (tokenInMeta == null) throw new Error('Pool does not contain tokenIn');\n if (tokenOutMeta == null) throw new Error('Pool does not contain tokenOut');\n\n const balanceIn = bnum(tokenInMeta.balance);\n const balanceOut = bnum(tokenOutMeta.balance);\n\n return {\n assetIn: tokenIn,\n assetOut: tokenOut,\n decimalsIn: tokenInMeta.decimals,\n decimalsOut: tokenOutMeta.decimals,\n balanceIn: balanceIn,\n balanceOut: balanceOut,\n assetInED: ZERO,\n assetOutED: ZERO,\n } as PoolPair;\n }\n\n validateAndBuy(\n poolPair: PoolPair,\n amountOut: BigNumber,\n _fees: PoolFees\n ): BuyCtx {\n const calculatedIn = this.calculateInGivenOut(poolPair, amountOut);\n const errors: PoolError[] = [];\n\n if (amountOut.isGreaterThan(poolPair.balanceOut)) {\n errors.push(PoolError.TradeNotAllowed);\n }\n\n return {\n amountIn: calculatedIn,\n calculatedIn: calculatedIn,\n amountOut: amountOut,\n feePct: 0,\n errors: errors,\n } as BuyCtx;\n }\n\n validateAndSell(\n poolPair: PoolPair,\n amountIn: BigNumber,\n _fees: PoolFees\n ): SellCtx {\n const calculatedOut = this.calculateOutGivenIn(poolPair, amountIn);\n const errors: PoolError[] = [];\n\n if (calculatedOut.isGreaterThan(poolPair.balanceOut)) {\n errors.push(PoolError.TradeNotAllowed);\n }\n\n return {\n amountIn: amountIn,\n calculatedOut: calculatedOut,\n amountOut: calculatedOut,\n feePct: 0,\n errors: errors,\n } as SellCtx;\n }\n\n calculateInGivenOut(_poolPair: PoolPair, amountOut: BigNumber): BigNumber {\n return amountOut;\n }\n\n calculateOutGivenIn(_poolPair: PoolPair, amountIn: BigNumber): BigNumber {\n return amountIn;\n }\n\n spotPriceInGivenOut(poolPair: PoolPair): BigNumber {\n return scale(ONE, poolPair.decimalsOut);\n }\n\n spotPriceOutGivenIn(poolPair: PoolPair): BigNumber {\n return scale(ONE, poolPair.decimalsIn);\n }\n\n calculateTradeFee(_amount: BigNumber, _fees: PoolFees): BigNumber {\n return ZERO;\n }\n}\n", "import type { Vec } from '@polkadot/types';\nimport { UnsubscribePromise } from '@polkadot/api-base/types';\nimport { encodeAddress } from '@polkadot/util-crypto';\nimport { stringToU8a } from '@polkadot/util';\n\nimport { decodeEventLog } from 'viem';\n\nimport { AAVE_POOL_ABI } from '../../aave';\nimport { HYDRADX_SS58_PREFIX } from '../../consts';\n\nimport { ERC20 } from '../../utils/erc20';\nimport { findNestedKey } from '../../utils/json';\n\nimport {\n PoolBase,\n PoolType,\n PoolLimits,\n PoolFees,\n PoolToken,\n PoolPair,\n} from '../types';\nimport { PoolClient } from '../PoolClient';\n\nimport { AaveTradeExecutorPoolData } from './types';\n\nconst SYNC_MM_EVENTS = ['Supply', 'Withdraw', 'Repay', 'Borrow'];\n\nexport class AavePoolClient extends PoolClient {\n isSupported(): boolean {\n return this.api.call.aaveTradeExecutor.pools !== undefined;\n }\n\n async loadPools(): Promise<PoolBase[]> {\n const poolAssets =\n await this.api.call.aaveTradeExecutor.pools<\n Vec<AaveTradeExecutorPoolData>\n >();\n\n return poolAssets.map(({ reserve, atoken, liqudityIn, liqudityOut }) => {\n return {\n address: this.getPoolId(reserve.toString(), atoken.toString()),\n type: PoolType.Aave,\n tokens: [\n {\n id: reserve.toString(),\n balance: liqudityIn.toString(),\n } as PoolToken,\n {\n id: atoken.toString(),\n balance: liqudityOut.toString(),\n } as PoolToken,\n ],\n ...this.getPoolLimits(),\n } as PoolBase;\n });\n }\n\n async getPoolFees(_poolPair: PoolPair, _address: string): Promise<PoolFees> {\n return {} as PoolFees;\n }\n\n getPoolType(): PoolType {\n return PoolType.Aave;\n }\n\n private getPoolId(reserve: string, atoken: string): string {\n const id = reserve + '/' + atoken;\n return encodeAddress(stringToU8a(id.padEnd(32, '\\0')), HYDRADX_SS58_PREFIX);\n }\n\n protected subscribePoolChange(pool: PoolBase): UnsubscribePromise {\n const [reserve, atoken] = pool.tokens;\n\n const reserveId = this.getReserveH160Id(reserve);\n\n return this.api.query.system.events((events) => {\n events.forEach((record) => {\n const { event } = record;\n const eventKey = `${event.section}:${event.method}`;\n\n if ('router:Executed' === eventKey) {\n const { assetIn, assetOut } = event.data.toHuman() as any;\n const aIn = assetIn.replace(/,/g, '');\n const aOut = assetOut.replace(/,/g, '');\n\n if (aIn === atoken.id || aOut === atoken.id) {\n this.log(`Sync AAVE [router:Executed] :: ${aIn}:${aOut}`);\n this.updatePoolState(pool);\n }\n }\n\n if ('evm:Log' === eventKey) {\n const { log } = event.data.toHuman() as any;\n try {\n const { eventName, args } = decodeEventLog({\n abi: AAVE_POOL_ABI,\n topics: log.topics,\n data: log.data,\n });\n if (\n SYNC_MM_EVENTS.includes(eventName) &&\n args.reserve.toLowerCase() === reserveId.toLowerCase()\n ) {\n this.log(\n `Sync AAVE [evm:Log] :: ${eventName} ${reserve.symbol}(${reserve.id})`\n );\n this.updatePoolState(pool);\n }\n } catch (e) {}\n }\n });\n });\n }\n\n private async updatePoolState(pool: PoolBase) {\n const [reserve, aToken] = pool.tokens;\n\n const { liqudityIn, liqudityOut } =\n await this.api.call.aaveTradeExecutor.pool<AaveTradeExecutorPoolData>(\n reserve.id,\n aToken.id\n );\n\n pool.tokens = pool.tokens.map((t) => {\n const balance =\n t.id === reserve.id ? liqudityIn.toString() : liqudityOut.toString();\n return {\n ...t,\n balance: balance,\n } as PoolToken;\n });\n }\n\n private getReserveH160Id(reserve: PoolToken) {\n if (reserve.type === 'Erc20') {\n const accountKey20 = findNestedKey(reserve.location, 'accountKey20');\n return accountKey20['accountKey20'].key;\n }\n return ERC20.fromAssetId(reserve.id);\n }\n\n private getPoolLimits(): PoolLimits {\n return {\n maxInRatio: 0,\n maxOutRatio: 0,\n minTradingLimit: 0,\n } as PoolLimits;\n }\n}\n", "export function findNestedKey(obj: any, keyToFind: any) {\n const foundObj: any[] = [];\n JSON.stringify(obj, (_, nestedValue) => {\n if (nestedValue && nestedValue[keyToFind]) {\n foundObj.push(nestedValue);\n }\n return nestedValue;\n });\n return foundObj[0];\n}\n\nexport function findNestedObj(obj: any, keyToFind: any, valToFind: any) {\n let foundObj: any;\n JSON.stringify(obj, (_, nestedValue) => {\n if (nestedValue && nestedValue[keyToFind] === valToFind) {\n foundObj = nestedValue;\n }\n return nestedValue;\n });\n return foundObj;\n}\n\nexport const bnFormatter = (_: any, nestedValue: any) => {\n return typeof nestedValue === 'bigint' ? nestedValue.toString() : nestedValue;\n};\n", "import { ApiPromise } from '@polkadot/api';\nimport { UnsubscribePromise } from '@polkadot/api-base/types';\n\nimport { memoize1 } from '@thi.ng/memoize';\nimport { TLRUCache } from '@thi.ng/cache';\n\nimport { BalanceClient } from '../client';\nimport { Asset } from '../types';\nimport { BigNumber } from '../utils/bignumber';\n\nimport { PoolBase, PoolFees, PoolPair, PoolType } from './types';\n\nexport abstract class PoolClient extends BalanceClient {\n protected pools: PoolBase[] = [];\n protected subs: UnsubscribePromise[] = [];\n\n private assets: Map<string, Asset> = new Map([]);\n private mem: number = 0;\n\n private memPoolsCache = new TLRUCache<number, Promise<PoolBase[]>>(null, {\n maxlen: 1,\n ttl: 1 * 60 * 60 * 1000,\n release: (mem) => {\n if (this.mem > mem) {\n this.log(this.getPoolType(), `mem ${mem} released at`, new Date());\n }\n },\n });\n\n private memPools = memoize1((mem: number) => {\n this.log(this.getPoolType(), `mem ${mem} sync`);\n return this.getPools();\n }, this.memPoolsCache);\n\n constructor(api: ApiPromise) {\n super(api);\n }\n\n abstract isSupported(): boolean;\n abstract getPoolType(): PoolType;\n abstract getPoolFees(poolPair: PoolPair, address: string): Promise<PoolFees>;\n protected abstract loadPools(): Promise<PoolBase[]>;\n protected abstract subscribePoolChange(pool: PoolBase): UnsubscribePromise;\n\n get augmentedPools() {\n return this.pools\n .filter((p) => this.isValidPool(p))\n .map((p) => this.withMetadata(p));\n }\n\n /**\n * Update registry assets, evict mempool\n *\n * @param assets - registry assets\n */\n async withAssets(assets: Asset[]) {\n this.assets = new Map(assets.map((asset: Asset) => [asset.id, asset]));\n this.mem = this.mem + 1;\n }\n\n async getPoolsMem(): Promise<PoolBase[]> {\n return await this.memPools(this.mem);\n }\n\n async getPools(): Promise<PoolBase[]> {\n this.unsubscribe();\n this.pools = await this.loadPools();\n this.subs = this.subscribe();\n const type = this.getPoolType();\n this.log(type, `mem ${this.mem} pools(${this.augmentedPools.length})`);\n this.log(type, `mem ${this.mem} subs(${this.subs.length})`);\n return this.augmentedPools;\n }\n\n private subscribe() {\n const subs = this.augmentedPools.map((pool: PoolBase) => {\n const poolSubs = [];\n\n try {\n const subChange = this.subscribePoolChange(pool);\n poolSubs.push(subChange);\n } catch (e) {}\n\n if (pool.type === PoolType.Aave) {\n return poolSubs;\n }\n\n const tokenSub = this.subscribeTokensPoolBalance(pool);\n poolSubs.push(tokenSub);\n\n if (this.hasSystemAsset(pool)) {\n const subSystem = this.subscribeSystemPoolBalance(pool);\n poolSubs.push(subSystem);\n }\n\n if (this.hasErc20Asset(pool)) {\n const subErc20 = this.subscribeErc20PoolBalance(pool);\n poolSubs.push(subErc20);\n }\n\n this.subscribeLog(pool);\n return poolSubs;\n });\n\n return subs.flat();\n }\n\n private hasSystemAsset(pool: PoolBase) {\n return pool.tokens.some((t) => t.id === '0');\n }\n\n private hasErc20Asset(pool: PoolBase) {\n return pool.tokens.some((t) => t.type === 'Erc20');\n }\n\n unsubscribe() {\n this.subs.forEach((unsub) => {\n unsub.then((fn) => fn());\n });\n }\n\n private subscribeLog(pool: PoolBase) {\n const poolAddr = pool.address.substring(0, 10).concat('...');\n this.log(`${pool.type} mem ${this.mem} [${poolAddr}] balance subscribed`);\n }\n\n private subscribeSystemPoolBalance(pool: PoolBase): UnsubscribePromise {\n return this.subscribeSystemBalance(\n pool.address,\n this.updateBalanceCallback(pool)\n );\n }\n\n private subscribeTokensPoolBalance(pool: PoolBase): UnsubscribePromise {\n /**\n * Skip balance update for shared token in stablepool\n *\n * @param p - asset pool\n * @param t - pool token\n * @returns true if pool id different than token, otherwise false (shared token)\n */\n const isNotStableswap = (p: PoolBase, t: string) => p.id !== t;\n return this.subscribeTokenBalance(\n pool.address,\n pool.tokens,\n this.updateBalancesCallback(pool, isNotStableswap)\n );\n }\n\n private subscribeErc20PoolBalance(pool: PoolBase): UnsubscribePromise {\n return this.subscribeErc20Balance(\n pool.address,\n pool.tokens,\n this.updateBalancesCallback(pool, () => true)\n );\n }\n\n /**\n * Check if pool valid. Only XYK pools are being verified as those are\n * considered permissionless.\n *\n * @param pool - asset pool\n * @returns true if pool valid & assets known by registry, otherwise false\n */\n private isValidPool(pool: PoolBase): boolean {\n return pool.type === PoolType.XYK\n ? pool.tokens.every((t) => this.assets.get(t.id))\n : true;\n }\n\n /**\n * Augment pool tokens with asset metadata\n *\n * @param pool - asset pool\n * @returns asset pool with augmented tokens\n */\n private withMetadata(pool: PoolBase) {\n pool.tokens = pool.tokens.map((t) => {\n const asset = this.assets.get(t.id);\n return {\n ...t,\n ...asset,\n };\n });\n return pool;\n }\n\n private updateBalancesCallback(\n pool: PoolBase,\n canUpdate: (pool: PoolBase, token: string) => boolean\n ) {\n return function (balances: [string, BigNumber][]) {\n balances.forEach(([token, balance]) => {\n const tokenIndex = pool.tokens.findIndex((t) => t.id == token);\n if (tokenIndex >= 0 && canUpdate(pool, token)) {\n pool.tokens[tokenIndex].balance = balance.toString();\n }\n });\n };\n }\n\n private updateBalanceCallback(pool: PoolBase) {\n return function (token: string, balance: BigNumber) {\n const tokenIndex = pool.tokens.findIndex((t) => t.id == token);\n if (tokenIndex >= 0) {\n pool.tokens[tokenIndex].balance = balance.toString();\n }\n };\n }\n}\n", "import {\n calculate_in_given_out,\n calculate_out_given_in,\n calculate_linear_weights,\n calculate_pool_trade_fee,\n get_spot_price,\n} from '@galacticcouncil/math-lbp';\n\nexport class LbpMath {\n static getSpotPrice(balanceA: string, balanceB: string, weightA: string, weightB: string, amount: string): string {\n return get_spot_price(balanceA, balanceB, weightA, weightB, amount);\n }\n\n static calculateInGivenOut(\n balanceIn: string,\n balanceOut: string,\n weightIn: string,\n weightOut: string,\n amountOut: string\n ): string {\n return calculate_in_given_out(balanceIn, balanceOut, weightIn, weightOut, amountOut);\n }\n\n static calculateOutGivenIn(\n balanceIn: string,\n balanceOut: string,\n weightIn: string,\n weightOut: string,\n amountIn: string\n ): string {\n return calculate_out_given_in(balanceIn, balanceOut, weightIn, weightOut, amountIn);\n }\n\n static calculateLinearWeights(\n start: string,\n end: string,\n initialWeight: string,\n finalWeight: string,\n at: string\n ): string {\n return calculate_linear_weights(start, end, initialWeight, finalWeight, at);\n }\n\n static calculatePoolTradeFee(amount: string, feeNumerator: number, feeDenominator: number): string {\n return calculate_pool_trade_fee(amount, feeNumerator, feeDenominator);\n }\n}\n", "import { DENOMINATOR } from '../consts';\nimport { PoolFee } from '../pool';\n\nimport { BigNumber } from './bignumber';\n\nexport function toHuman(amount: BigNumber, decimals: number): string {\n return amount.shiftedBy(-1 * decimals).toString();\n}\n\nexport function toPct(fee: PoolFee): number {\n return (fee[0] / fee[1]) * 100;\n}\n\nexport function toDecimals(fee: PoolFee): number {\n return fee[0] / fee[1];\n}\n\nexport function toPoolFee(permill: number): PoolFee {\n return [permill / DENOMINATOR, DENOMINATOR] as PoolFee;\n}\n", "import {\n BuyCtx,\n Pool,\n PoolBase,\n PoolError,\n PoolFee,\n PoolFees,\n PoolPair,\n PoolToken,\n PoolType,\n SellCtx,\n} from '../types';\nimport { BigNumber, bnum, ONE, scale, ZERO } from '../../utils/bignumber';\nimport { toPct } from '../../utils/mapper';\n\nimport { LbpMath } from './LbpMath';\n\nexport type WeightedPoolPair = PoolPair & {\n weightIn: BigNumber;\n weightOut: BigNumber;\n};\n\nexport type WeightedPoolToken = PoolToken & {\n weight: BigNumber;\n};\n\nexport type LbpPoolFees = PoolFees & {\n exchangeFee: PoolFee;\n repayFee: PoolFee;\n};\n\nexport type LbpPoolBase = PoolBase & {\n fee: PoolFee;\n repayFeeApply: boolean;\n};\n\nexport class LbpPool implements Pool {\n type: PoolType;\n address: string;\n tokens: WeightedPoolToken[];\n maxInRatio: number;\n maxOutRatio: number;\n minTradingLimit: number;\n fee: PoolFee;\n repayFeeApply: boolean;\n\n static fromPool(pool: LbpPoolBase): LbpPool {\n return new LbpPool(\n pool.address,\n pool.tokens as WeightedPoolToken[],\n pool.maxInRatio,\n pool.maxOutRatio,\n pool.minTradingLimit,\n pool.fee,\n pool.repayFeeApply\n );\n }\n\n constructor(\n address: string,\n tokens: WeightedPoolToken[],\n maxInRation: number,\n maxOutRatio: number,\n minTradeLimit: number,\n fee: PoolFee,\n repayFeeApply: boolean\n ) {\n this.type = PoolType.LBP;\n this.address = address;\n this.tokens = tokens;\n this.maxInRatio = maxInRation;\n this.maxOutRatio = maxOutRatio;\n this.minTradingLimit = minTradeLimit;\n this.fee = fee;\n this.repayFeeApply = repayFeeApply;\n }\n\n validatePair(_tokenIn: string, _tokenOut: string): boolean {\n return true;\n }\n\n parsePair(tokenIn: string, tokenOut: string): WeightedPoolPair {\n const tokensMap = new Map(this.tokens.map((token) => [token.id, token]));\n const tokenInMeta = tokensMap.get(tokenIn);\n const tokenOutMeta = tokensMap.get(tokenOut);\n\n if (tokenInMeta == null) throw new Error('Pool does not contain tokenIn');\n if (tokenOutMeta == null) throw new Error('Pool does not contain tokenOut');\n\n const balanceIn = bnum(tokenInMeta.balance);\n const balanceOut = bnum(tokenOutMeta.balance);\n\n return {\n assetIn: tokenIn,\n assetOut: tokenOut,\n balanceIn: balanceIn,\n balanceOut: balanceOut,\n decimalsIn: tokenInMeta.decimals,\n decimalsOut: tokenOutMeta.decimals,\n weightIn: tokenInMeta.weight,\n weightOut: tokenOutMeta.weight,\n } as WeightedPoolPair;\n }\n\n /**\n * Validate buy transfer\n *\n * a) Accumulated asset is bought (out) from the pool for distributed asset (in) - User(Buyer) bears the fee\n * b) Distributed asset is bought (out) from the pool for accumualted asset (in) - Pool bears the fee\n */\n validateAndBuy(\n poolPair: WeightedPoolPair,\n amountOut: BigNumber,\n fees: LbpPoolFees\n ): BuyCtx {\n const feeAsset = this.tokens[0].id;\n\n const errors: PoolError[] = [];\n\n if (amountOut.isLessThan(this.minTradingLimit)) {\n errors.push(PoolError.InsufficientTradingAmount);\n }\n\n const poolOutReserve = poolPair.balanceOut.div(this.maxOutRatio);\n if (amountOut.isGreaterThan(poolOutReserve)) {\n errors.push(PoolError.MaxOutRatioExceeded);\n }\n\n if (feeAsset === poolPair.assetOut) {\n const fee = this.calculateTradeFee(amountOut, fees);\n const feePct = toPct(\n this.repayFeeApply ? fees.repayFee : fees.exchangeFee\n );\n const amountOutPlusFee = amountOut.plus(fee);\n const calculatedIn = this.calculateInGivenOut(poolPair, amountOutPlusFee);\n\n const poolInReserve = poolPair.balanceIn.div(this.maxInRatio);\n if (calculatedIn.isGreaterThan(poolInReserve)) {\n errors.push(PoolError.MaxInRatioExceeded);\n }\n\n return {\n amountIn: calculatedIn,\n calculatedIn: calculatedIn,\n amountOut: amountOut,\n feePct: feePct,\n errors: errors,\n } as BuyCtx;\n } else {\n const calculatedIn = this.calculateInGivenOut(poolPair, amountOut);\n\n const poolInReserve = poolPair.balanceIn.div(this.maxInRatio);\n if (calculatedIn.isGreaterThan(poolInReserve)) {\n errors.push(PoolError.MaxInRatioExceeded);\n }\n\n return {\n amountIn: calculatedIn,\n calculatedIn: calculatedIn,\n amountOut: amountOut,\n feePct: 0,\n errors: errors,\n } as BuyCtx;\n }\n }\n\n /**\n * Validate sell transfer\n *\n * a) Accumulated asset is sold (in) to the pool for distributed asset (out) - Pool bears the fee\n * b) Distributed asset is sold (in) to the pool for accumualted asset (out) - User(Seller) bears the fee\n */\n validateAndSell(\n poolPair: WeightedPoolPair,\n amountIn: BigNumber,\n fees: LbpPoolFees\n ): SellCtx {\n const feeAsset = this.tokens[0].id;\n\n const errors: PoolError[] = [];\n\n if (amountIn.isLessThan(this.minTradingLimit)) {\n errors.push(PoolError.InsufficientTradingAmount);\n }\n\n const poolInReserve = poolPair.balanceIn.div(this.maxInRatio);\n if (amountIn.isGreaterThan(poolInReserve)) {\n errors.push(PoolError.MaxInRatioExceeded);\n }\n\n if (feeAsset === poolPair.assetIn) {\n const calculatedOut = this.calculateOutGivenIn(poolPair, amountIn);\n\n const poolOutReserve = poolPair.balanceOut.div(this.maxOutRatio);\n if (calculatedOut.isGreaterThan(poolOutReserve)) {\n errors.push(PoolError.MaxOutRatioExceeded);\n }\n\n return {\n amountIn: amountIn,\n calculatedOut: calculatedOut,\n amountOut: calculatedOut,\n feePct: 0,\n errors: errors,\n } as SellCtx;\n } else {\n const calculatedOut = this.calculateOutGivenIn(poolPair, amountIn);\n const fee = this.calculateTradeFee(calculatedOut, fees);\n const feePct = toPct(\n this.repayFeeApply ? fees.repayFee : fees.exchangeFee\n );\n const amountOut = calculatedOut.minus(fee);\n\n const poolOutReserve = poolPair.balanceOut.div(this.maxOutRatio);\n if (amountOut.isGreaterThan(poolOutReserve)) {\n errors.push(PoolError.MaxOutRatioExceeded);\n }\n\n return {\n amountIn: amountIn,\n calculatedOut: calculatedOut,\n amountOut: amountOut,\n feePct: feePct,\n errors: errors,\n } as SellCtx;\n }\n }\n\n calculateInGivenOut(\n poolPair: WeightedPoolPair,\n amountOut: BigNumber\n ): BigNumber {\n const price = LbpMath.calculateInGivenOut(\n poolPair.balanceIn.toString(),\n poolPair.balanceOut.toString(),\n poolPair.weightIn.toString(),\n poolPair.weightOut.toString(),\n amountOut.toFixed(0)\n );\n const priceBN = bnum(price);\n return priceBN.isNegative() ? ZERO : priceBN;\n }\n\n calculateOutGivenIn(\n poolPair: WeightedPoolPair,\n amountIn: BigNumber\n ): BigNumber {\n const price = LbpMath.calculateOutGivenIn(\n poolPair.balanceIn.toString(),\n poolPair.balanceOut.toString(),\n poolPair.weightIn.toString(),\n poolPair.weightOut.toString(),\n amountIn.toFixed(0)\n );\n const priceBN = bnum(price);\n return priceBN.isNegative() ? ZERO : priceBN;\n }\n\n spotPriceInGivenOut(poolPair: WeightedPoolPair): BigNumber {\n const price = LbpMath.getSpotPrice(\n poolPair.balanceOut.toString(),\n poolPair.balanceIn.toString(),\n poolPair.weightOut.toString(),\n poolPair.weightIn.toString(),\n scale(ONE, poolPair.decimalsOut).toString()\n );\n return bnum(price);\n }\n\n spotPriceOutGivenIn(poolPair: WeightedPoolPair): BigNumber {\n const price = LbpMath.getSpotPrice(\n poolPair.balanceIn.toString(),\n poolPair.balanceOut.toString(),\n poolPair.weightIn.toString(),\n poolPair.weightOut.toString(),\n scale(ONE, poolPair.decimalsIn).toString()\n );\n return bnum(price);\n }\n\n calculateTradeFee(amount: BigNumber, fees: LbpPoolFees): BigNumber {\n const fee = LbpMath.calculatePoolTradeFee(\n amount.toString(),\n this.repayFeeApply ? fees.repayFee[0] : fees.exchangeFee[0],\n this.repayFeeApply ? fees.repayFee[1] : fees.exchangeFee[1]\n );\n return bnum(fee);\n }\n}\n", "import type { u32 } from '@polkadot/types-codec';\nimport type { PalletLbpPool } from '@polkadot/types/lookup';\nimport { UnsubscribePromise } from '@polkadot/api-base/types';\n\nimport { bnum, scale } from '../../utils/bignumber';\n\nimport {\n PoolBase,\n PoolFee,\n PoolFees,\n PoolLimits,\n PoolPair,\n PoolType,\n} from '../types';\nimport { PoolClient } from '../PoolClient';\n\nimport { LbpMath } from './LbpMath';\nimport { LbpPoolBase, LbpPoolFees, WeightedPoolToken } from './LbpPool';\n\nexport class LbpPoolClient extends PoolClient {\n private readonly MAX_FINAL_WEIGHT = scale(bnum(100), 6);\n private poolsData: Map<string, PalletLbpPool> = new Map([]);\n\n isSupported(): boolean {\n return this.api.query.lbp !== undefined;\n }\n\n async loadPools(): Promise<PoolBase[]> {\n const [poolData, validationData] = await Promise.all([\n this.api.query.lbp.poolData.entries(),\n this.api.query.parachainSystem.validationData(),\n ]);\n\n const { relayParentNumber } = validationData.unwrap();\n const pools = poolData\n .filter(([_, state]) =>\n this.isActivePool(state.unwrap(), relayParentNumber)\n )\n .map(\n async ([\n {\n args: [id],\n },\n state,\n ]) => {\n const poolData: PalletLbpPool = state.unwrap();\n const poolAddress = id.toString();\n const poolDelta = await this.getPoolDelta(\n poolAddress,\n poolData,\n relayParentNumber.toString()\n );\n\n this.poolsData.set(id.toString(), poolData);\n return {\n address: poolAddress,\n type: PoolType.LBP,\n fee: poolData.fee.toJSON() as PoolFee,\n ...poolDelta,\n ...this.getPoolLimits(),\n } as PoolBase;\n }\n );\n return Promise.all(pools);\n }\n\n async getPoolFees(_poolPair: PoolPair, address: string): Promise<PoolFees> {\n const pool = this.pools.find(\n (pool) => pool.address === address\n ) as LbpPoolBase;\n return {\n repayFee: this.getRepayFee(),\n exchangeFee: pool.fee as PoolFee,\n } as LbpPoolFees;\n }\n\n getPoolType(): PoolType {\n return PoolType.LBP;\n }\n\n async subscribePoolChange(pool: PoolBase): UnsubscribePromise {\n return this.api.query.parachainSystem.validationData(\n async (validationData) => {\n const { relayParentNumber } = validationData.unwrap();\n const poolData = this.poolsData.get(pool.address);\n const isActive = this.isActivePool(poolData!, relayParentNumber);\n\n if (isActive) {\n const poolDelta = await this.getPoolDelta(\n pool.address,\n poolData!,\n relayParentNumber.toString()\n );\n Object.assign(pool, poolDelta);\n } else {\n const inactivePoolIndex = this.pools.findIndex(\n (p) => p.address == pool.address\n );\n this.pools.splice(inactivePoolIndex, 1);\n }\n }\n );\n }\n\n private async getPoolDelta(\n poolAddress: string,\n poolEntry: PalletLbpPool,\n relayBlockNumber: string\n ): Promise<Partial<LbpPoolBase>> {\n const {\n start,\n end,\n assets,\n initialWeight,\n finalWeight,\n repayTarget,\n feeCollector,\n } = poolEntry;\n\n const linearWeight = LbpMath.calculateLinearWeights(\n start.toString(),\n end.toString(),\n initialWeight.toString(),\n finalWeight.toString(),\n relayBlockNumber\n );\n\n const [accumulated, distributed] = assets;\n const accumulatedAsset = accumulated.toString();\n const accumulatedWeight = bnum(linearWeight);\n const distributedAsset = distributed.toString();\n const distributedWeight = this.MAX_FINAL_WEIGHT.minus(\n bnum(accumulatedWeight)\n );\n\n const [repayFeeApplied, accumulatedBalance, distributedBalance] =\n await Promise.all([\n this.isRepayFeeApplied(\n accumulatedAsset,\n repayTarget.toString(),\n feeCollector.toString()\n ),\n this.getBalance(poolAddress, accumulatedAsset),\n this.getBalance(poolAddress, distributedAsset),\n ]);\n\n return {\n repayFeeApply: repayFeeApplied,\n tokens: [\n {\n id: accumulatedAsset,\n weight: accumulatedWeight,\n balance: accumulatedBalance.toString(),\n } as WeightedPoolToken,\n {\n id: distributedAsset,\n weight: distributedWeight,\n balance: distributedBalance.toString(),\n } as WeightedPoolToken,\n ],\n } as Partial<LbpPoolBase>;\n }\n\n private isActivePool(\n poolEntry: PalletLbpPool,\n relayBlockNumber: u32\n ): boolean {\n if (poolEntry.start.isEmpty || poolEntry.end.isEmpty) {\n return false;\n }\n\n const start = poolEntry.start.unwrap().toNumber();\n const end = poolEntry.end.unwrap().toNumber();\n return (\n relayBlockNumber.toNumber() >= start && relayBlockNumber.toNumber() < end\n );\n }\n\n private async isRepayFeeApplied(\n assetKey: string,\n repayTarget: string,\n feeCollector: string\n ): Promise<boolean> {\n const repayFeeTarget = bnum(repayTarget);\n if (repayFeeTarget.isZero()) {\n return false;\n }\n\n try {\n const repayFeeCurrent = await this.getBalance(assetKey, feeCollector);\n return repayFeeCurrent.isLessThan(repayFeeTarget);\n } catch (err) {\n // Collector account is empty (No trade has been executed yet)\n return true;\n }\n }\n\n private getRepayFee(): PoolFee {\n const repayFee = this.api.consts.lbp.repayFee;\n return repayFee.toJSON() as PoolFee;\n }\n\n private getPoolLimits(): PoolLimits {\n const maxInRatio = this.api.consts.lbp.maxInRatio.toJSON() as number;\n const maxOutRatio = this.api.consts.lbp.maxOutRatio.toJSON() as number;\n const minTradingLimit =\n this.api.consts.lbp.minTradingLimit.toJSON() as number;\n return {\n maxInRatio: maxInRatio,\n maxOutRatio: maxOutRatio,\n minTradingLimit: minTradingLimit,\n } as PoolLimits;\n }\n}\n", "import {\n calculate_in_given_out,\n calculate_lrna_in_given_out,\n calculate_out_given_in,\n calculate_out_given_lrna_in,\n calculate_pool_trade_fee,\n calculate_spot_price,\n calculate_lrna_spot_price,\n calculate_shares,\n calculate_liquidity_out,\n calculate_liquidity_lrna_out,\n calculate_liquidity_hub_in,\n is_sell_allowed,\n is_buy_allowed,\n is_add_liquidity_allowed,\n is_remove_liquidity_allowed,\n recalculate_asset_fee,\n recalculate_protocol_fee,\n verify_asset_cap,\n} from '@galacticcouncil/math-omnipool';\n\nimport { BigNumber } from '../../utils/bignumber';\n\nexport class OmniMath {\n static calculateSpotPrice(\n assetInBalance: string,\n assetInHubReserve: string,\n assetOutBalance: string,\n assetOutHubReserve: string\n ): string {\n return calculate_spot_price(\n assetInBalance,\n assetInHubReserve,\n assetOutBalance,\n assetOutHubReserve\n );\n }\n\n static calculateLrnaSpotPrice(\n assetBalance: string,\n assetHubReserve: string\n ): string {\n return calculate_lrna_spot_price(assetBalance, assetHubReserve);\n }\n\n static calculateInGivenOut(\n assetInBalance: string,\n assetInHubReserve: string,\n assetInShares: string,\n assetOutBalance: string,\n assetOutHubReserve: string,\n assetOutShares: string,\n amountOut: string,\n assetFee: string,\n protocolFee: string\n ): string {\n return calculate_in_given_out(\n assetInBalance,\n assetInHubReserve,\n assetInShares,\n assetOutBalance,\n assetOutHubReserve,\n assetOutShares,\n amountOut,\n assetFee,\n protocolFee\n );\n }\n\n static calculateLrnaInGivenOut(\n assetOutBalance: string,\n assetOutHubReserve: string,\n assetOutShares: string,\n amountOut: string,\n assetFee: string\n ): string {\n return calculate_lrna_in_given_out(\n assetOutBalance,\n assetOutHubReserve,\n assetOutShares,\n amountOut,\n assetFee\n );\n }\n\n static calculateOutGivenIn(\n assetInBalance: string,\n assetInHubReserve: string,\n assetInShares: string,\n assetOutBalance: string,\n assetOutHubReserve: string,\n assetOutShares: string,\n amountIn: string,\n assetFee: string,\n protocolFee: string\n ): string {\n return calculate_out_given_in(\n assetInBalance,\n assetInHubReserve,\n assetInShares,\n assetOutBalance,\n assetOutHubReserve,\n assetOutShares,\n amountIn,\n assetFee,\n protocolFee\n );\n }\n\n static calculateOutGivenLrnaIn(\n assetOutBalance: string,\n assetOutHubReserve: string,\n assetOutShares: string,\n amountOut: string,\n assetFee: string\n ): string {\n return calculate_out_given_lrna_in(\n assetOutBalance,\n assetOutHubReserve,\n assetOutShares,\n amountOut,\n assetFee\n );\n }\n\n static calculatePoolTradeFee(\n amount: string,\n feeNumerator: number,\n feeDenominator: number\n ): string {\n return calculate_pool_trade_fee(amount, feeNumerator, feeDenominator);\n }\n\n static calculateShares(\n assetReserve: string,\n assetHubReserve: string,\n assetShares: string,\n amountIn: string\n ): string {\n return calculate_shares(\n assetReserve,\n assetHubReserve,\n assetShares,\n amountIn\n );\n }\n\n static calculateLiquidityOut(\n assetReserve: string,\n assetHubReserve: string,\n assetShares: string,\n positionAmount: string,\n positionShares: string,\n positionPrice: string,\n sharesToRemove: string,\n withdrawalFee: string\n ): string {\n return calculate_liquidity_out(\n assetReserve,\n assetHubReserve,\n assetShares,\n positionAmount,\n positionShares,\n positionPrice,\n sharesToRemove,\n withdrawalFee\n );\n }\n\n static calculateLiquidityLRNAOut(\n assetReserve: string,\n assetHubReserve: string,\n assetShares: string,\n positionAmount: string,\n positionShares: string,\n positionPrice: string,\n sharesToRemove: string,\n withdrawalFee: string\n ): string {\n return calculate_liquidity_lrna_out(\n assetReserve,\n assetHubReserve,\n assetShares,\n positionAmount,\n positionShares,\n positionPrice,\n sharesToRemove,\n withdrawalFee\n );\n }\n\n static calculateCapDifference(\n assetReserve: string,\n assetHubReserve: string,\n assetCap: string,\n totalHubReserve: string\n ): string {\n const qi = BigNumber(assetHubReserve);\n const ri = BigNumber(assetReserve);\n const q = BigNumber(totalHubReserve);\n const omegaI = BigNumber(assetCap);\n\n const percentage = omegaI.shiftedBy(-18);\n const isUnderWeightCap = qi.div(q).lt(percentage);\n\n if (isUnderWeightCap) {\n const numerator = percentage.times(q).minus(qi).times(ri);\n const denominator = qi.times(BigNumber(1).minus(percentage));\n return numerator.div(denominator).toFixed(0);\n } else {\n return '0';\n }\n }\n\n static calculateLimitHubIn(\n assetReserve: string,\n assetHubReserve: string,\n assetShares: string,\n amountIn: string\n ): string {\n return calculate_liquidity_hub_in(\n assetReserve,\n assetHubReserve,\n assetShares,\n amountIn\n );\n }\n\n static isSellAllowed(bits: number): boolean {\n return is_sell_allowed(bits);\n }\n\n static isBuyAllowed(bits: number): boolean {\n return is_buy_allowed(bits);\n }\n\n static isAddLiquidityAllowed(bits: number): boolean {\n return is_add_liquidity_allowed(bits);\n }\n\n static isRemoveLiquidityAllowed(bits: number): boolean {\n return is_remove_liquidity_allowed(bits);\n }\n\n static recalculateAssetFee(\n oracleAmountIn: string,\n oracleAmountOut: string,\n oracleLiquidity: string,\n oraclePeriod: string,\n currentAssetLiquidity: string,\n previousFee: string,\n blocDifference: string,\n minFee: string,\n maxFee: string,\n decay: string,\n amplification: string\n ): string {\n return recalculate_asset_fee(\n oracleAmountIn,\n oracleAmountOut,\n oracleLiquidity,\n oraclePeriod,\n currentAssetLiquidity,\n previousFee,\n blocDifference,\n minFee,\n maxFee,\n decay,\n amplification\n );\n }\n\n static recalculateProtocolFee(\n oracleAmountIn: string,\n oracleAmountOut: string,\n oracleLiquidity: string,\n oraclePeriod: string,\n currentAssetLiquidity: string,\n previousFee: string,\n blocDifference: string,\n minFee: string,\n maxFee: string,\n decay: string,\n amplification: string\n ): string {\n return recalculate_protocol_fee(\n oracleAmountIn,\n oracleAmountOut,\n oracleLiquidity,\n oraclePeriod,\n currentAssetLiquidity,\n previousFee,\n blocDifference,\n minFee,\n maxFee,\n decay,\n amplification\n );\n }\n\n static verifyAssetCap(\n assetReserve: string,\n assetCap: string,\n hubAdded: string,\n totalHubReserve: string\n ): boolean {\n return verify_asset_cap(assetReserve, assetCap, hubAdded, totalHubReserve);\n }\n}\n", "import {\n BuyCtx,\n Pool,\n PoolBase,\n PoolError,\n PoolFee,\n PoolFees,\n PoolPair,\n PoolToken,\n PoolType,\n SellCtx,\n} from '../types';\nimport { RUNTIME_DECIMALS } from '../../consts';\nimport { BigNumber, bnum, ZERO } from '../../utils/bignumber';\nimport { toDecimals } from '../../utils/mapper';\n\nimport { OmniMath } from './OmniMath';\n\nexport type OmniPoolPair = PoolPair & {\n hubReservesIn: BigNumber;\n hubReservesOut: BigNumber;\n sharesIn: BigNumber;\n sharesOut: BigNumber;\n tradeableIn: number;\n tradeableOut: number;\n};\n\nexport type OmniPoolToken = PoolToken & {\n hubReserves: BigNumber;\n shares: BigNumber;\n cap: BigNumber;\n protocolShares: BigNumber;\n};\n\nexport type OmniPoolFees = PoolFees & {\n assetFee: PoolFee;\n protocolFee: PoolFee;\n};\n\nexport type OmniPoolBase = PoolBase & {\n hubAssetId: string;\n};\n\nexport class OmniPool implements Pool {\n type: PoolType;\n address: string;\n tokens: OmniPoolToken[];\n maxInRatio: number;\n maxOutRatio: number;\n minTradingLimit: number;\n hubAssetId: string;\n\n static fromPool(pool: OmniPoolBase): OmniPool {\n return new OmniPool(\n pool.address,\n pool.tokens as OmniPoolToken[],\n pool.maxInRatio,\n pool.maxOutRatio,\n pool.minTradingLimit,\n pool.hubAssetId\n );\n }\n\n constructor(\n address: string,\n tokens: OmniPoolToken[],\n maxInRation: number,\n maxOutRatio: number,\n minTradeLimit: number,\n hubAssetId: string\n ) {\n this.type = PoolType.Omni;\n this.address = address;\n this.tokens = tokens;\n this.maxInRatio = maxInRation;\n this.maxOutRatio = maxOutRatio;\n this.minTradingLimit = minTradeLimit;\n this.hubAssetId = hubAssetId;\n }\n\n validatePair(_tokenIn: string, tokenOut: string): boolean {\n // Buying LRNA not allowed\n if (this.hubAssetId == tokenOut) {\n return false;\n }\n return true;\n }\n\n parsePair(tokenIn: string, tokenOut: string): OmniPoolPair {\n const tokensMap = new Map(this.tokens.map((token) => [token.id, token]));\n const tokenInMeta = tokensMap.get(tokenIn);\n const tokenOutMeta = tokensMap.get(tokenOut);\n\n if (tokenInMeta == null) throw new Error('Pool does not contain tokenIn');\n if (tokenOutMeta == null) throw new Error('Pool does not contain tokenOut');\n\n const balanceIn = bnum(tokenInMeta.balance);\n const balanceOut = bnum(tokenOutMeta.balance);\n\n const assetInED = bnum(tokenInMeta.existentialDeposit);\n const assetOutED = bnum(tokenOutMeta.existentialDeposit);\n\n return {\n assetIn: tokenIn,\n assetOut: tokenOut,\n hubReservesIn: tokenInMeta.hubReserves,\n hubReservesOut: tokenOutMeta.hubReserves,\n sharesIn: tokenInMeta.shares,\n sharesOut: tokenOutMeta.shares,\n decimalsIn: tokenInMeta.decimals,\n decimalsOut: tokenOutMeta.decimals,\n balanceIn: balanceIn,\n balanceOut: balanceOut,\n tradeableIn: tokenInMeta.tradeable,\n tradeableOut: tokenOutMeta.tradeable,\n assetInED,\n assetOutED,\n } as OmniPoolPair;\n }\n\n validateAndBuy(\n poolPair: OmniPoolPair,\n amountOut: BigNumber,\n fees: OmniPoolFees\n ): BuyCtx {\n const calculatedIn = this.calculateInGivenOut(poolPair, amountOut);\n const amountIn = this.calculateInGivenOut(poolPair, amountOut, fees);\n\n const fee = amountIn.minus(calculatedIn);\n const feePct =\n calculatedIn === ZERO\n ? ZERO\n : fee.div(calculatedIn).multipliedBy(100).decimalPlaces(2);\n\n const errors: PoolError[] = [];\n const isSellAllowed = OmniMath.isSellAllowed(poolPair.tradeableIn);\n const isBuyAllowed = OmniMath.isBuyAllowed(poolPair.tradeableOut);\n\n if (!isSellAllowed || !isBuyAllowed) {\n errors.push(PoolError.TradeNotAllowed);\n }\n\n if (\n amountOut.isLessThan(this.minTradingLimit) ||\n calculatedIn.isLessThan(poolPair.assetInED)\n ) {\n errors.push(PoolError.InsufficientTradingAmount);\n }\n\n const poolOutReserve = poolPair.balanceOut.div(this.maxOutRatio);\n if (amountOut.isGreaterThan(poolOutReserve)) {\n errors.push(PoolError.MaxOutRatioExceeded);\n }\n\n const poolInReserve = poolPair.balanceIn.div(this.maxInRatio);\n if (amountIn.isGreaterThan(poolInReserve)) {\n errors.push(PoolError.MaxInRatioExceeded);\n }\n\n return {\n amountIn: amountIn,\n calculatedIn: calculatedIn,\n amountOut: amountOut,\n feePct: feePct.toNumber(),\n errors: errors,\n } as BuyCtx;\n }\n\n validateAndSell(\n poolPair: OmniPoolPair,\n amountIn: BigNumber,\n fees: OmniPoolFees\n ): SellCtx {\n const calculatedOut = this.calculateOutGivenIn(poolPair, amountIn);\n const amountOut = this.calculateOutGivenIn(poolPair, amountIn, fees);\n\n const fee = calculatedOut.minus(amountOut);\n const feePct = fee.div(calculatedOut).multipliedBy(100).decimalPlaces(2);\n\n const errors: PoolError[] = [];\n const isSellAllowed = OmniMath.isSellAllowed(poolPair.tradeableIn);\n const isBuyAllowed = OmniMath.isBuyAllowed(poolPair.tradeableOut);\n\n if (!isSellAllowed || !isBuyAllowed) {\n errors.push(PoolError.TradeNotAllowed);\n }\n\n if (\n amountIn.isLessThan(this.minTradingLimit) ||\n calculatedOut.isLessThan(poolPair.assetOutED)\n ) {\n errors.push(PoolError.InsufficientTradingAmount);\n }\n\n const poolInReserve = poolPair.balanceIn.div(this.maxInRatio);\n if (amountIn.isGreaterThan(poolInReserve)) {\n errors.push(PoolError.MaxInRatioExceeded);\n }\n\n const poolOutReserve = poolPair.balanceOut.div(this.maxOutRatio);\n if (amountOut.isGreaterThan(poolOutReserve)) {\n errors.push(PoolError.MaxOutRatioExceeded);\n }\n\n return {\n amountIn: amountIn,\n calculatedOut: calculatedOut,\n amountOut: amountOut,\n feePct: feePct.toNumber(),\n errors: errors,\n } as SellCtx;\n }\n\n calculateInGivenOut(\n poolPair: OmniPoolPair,\n amountOut: BigNumber,\n fees?: OmniPoolFees\n ): BigNumber {\n if (poolPair.assetIn == this.hubAssetId) {\n return this.calculateLrnaInGivenOut(poolPair, amountOut, fees);\n }\n\n const price = OmniMath.calculateInGivenOut(\n poolPair.balanceIn.toString(),\n poolPair.hubReservesIn.toString(),\n poolPair.sharesIn.toString(),\n poolPair.balanceOut.toString(),\n poolPair.hubReservesOut.toString(),\n poolPair.sharesOut.toString(),\n amountOut.toFixed(0),\n fees ? toDecimals(fees.assetFee).toString() : ZERO.toString(),\n fees ? toDecimals(fees.protocolFee).toString() : ZERO.toString()\n );\n const priceBN = bnum(price);\n return priceBN.isNegative() ? ZERO : priceBN;\n }\n\n calculateLrnaInGivenOut(\n poolPair: OmniPoolPair,\n amountOut: BigNumber,\n fees?: OmniPoolFees\n ): BigNumber {\n const price = OmniMath.calculateLrnaInGivenOut(\n poolPair.balanceOut.toString(),\n poolPair.hubReservesOut.toString(),\n poolPair.sharesOut.toString(),\n amountOut.toFixed(0),\n fees ? toDecimals(fees.assetFee).toString() : ZERO.toString()\n );\n const priceBN = bnum(price);\n return priceBN.isNegative() ? ZERO : priceBN;\n }\n\n calculateOutGivenIn(\n poolPair: OmniPoolPair,\n amountIn: BigNumber,\n fees?: OmniPoolFees\n ): BigNumber {\n if (poolPair.assetIn == this.hubAssetId) {\n return this.calculateOutGivenLrnaIn(poolPair, amountIn, fees);\n }\n\n const price = OmniMath.calculateOutGivenIn(\n poolPair.balanceIn.toString(),\n poolPair.hubReservesIn.toString(),\n poolPair.sharesIn.toString(),\n poolPair.balanceOut.toString(),\n poolPair.hubReservesOut.toString(),\n poolPair.sharesOut.toString(),\n amountIn.toFixed(0),\n fees ? toDecimals(fees.assetFee).toString() : ZERO.toString(),\n fees ? toDecimals(fees.protocolFee).toString() : ZERO.toString()\n );\n const priceBN = bnum(price);\n return priceBN.isNegative() ? ZERO : priceBN;\n }\n\n calculateOutGivenLrnaIn(\n poolPair: OmniPoolPair,\n amountIn: BigNumber,\n fees?: OmniPoolFees\n ): BigNumber {\n const price = OmniMath.calculateOutGivenLrnaIn(\n poolPair.balanceOut.toString(),\n poolPair.hubReservesOut.toString(),\n poolPair.sharesOut.toString(),\n amountIn.toFixed(0),\n fees ? toDecimals(fees.assetFee).toString() : ZERO.toString()\n );\n const priceBN = bnum(price);\n return priceBN.isNegative() ? ZERO : priceBN;\n }\n\n spotPriceInGivenOut(poolPair: OmniPoolPair): BigNumber {\n if (poolPair.assetIn == this.hubAssetId) {\n return this.spotPriceLrnaInGivenOut(poolPair);\n }\n\n const price = OmniMath.calculateSpotPrice(\n poolPair.balanceOut.toString(),\n poolPair.hubReservesOut.toString(),\n poolPair.balanceIn.toString(),\n poolPair.hubReservesIn.toString()\n );\n return bnum(price)\n .shiftedBy(-1 * (RUNTIME_DECIMALS - poolPair.decimalsOut))\n .decimalPlaces(0, 1);\n }\n\n spotPriceLrnaInGivenOut(poolPair: OmniPoolPair): BigNumber {\n const price = OmniMath.calculateLrnaSpotPrice(\n poolPair.hubReservesOut.toString(),\n poolPair.balanceOut.toString()\n );\n return bnum(price)\n .shiftedBy(-1 * (RUNTIME_DECIMALS - poolPair.decimalsOut))\n .decimalPlaces(0, 1);\n }\n\n spotPriceOutGivenIn(poolPair: OmniPoolPair): BigNumber {\n if (poolPair.assetIn == this.hubAssetId) {\n return this.spotPriceOutGivenLrnaIn(poolPair);\n }\n\n const price = OmniMath.calculateSpotPrice(\n poolPair.balanceIn.toString(),\n poolPair.hubReservesIn.toString(),\n poolPair.balanceOut.toString(),\n poolPair.hubReservesOut.toString()\n );\n return bnum(price)\n .shiftedBy(-1 * (RUNTIME_DECIMALS - poolPair.decimalsIn))\n .decimalPlaces(0, 1);\n }\n\n spotPriceOutGivenLrnaIn(poolPair: OmniPoolPair): BigNumber {\n const price = OmniMath.calculateLrnaSpotPrice(\n poolPair.balanceOut.toString(),\n poolPair.hubReservesOut.toString()\n );\n return bnum(price)\n .shiftedBy(-1 * (RUNTIME_DECIMALS - poolPair.decimalsIn))\n .decimalPlaces(0, 1);\n }\n}\n", "import type {\n PalletEmaOracleOracleEntry,\n PalletDynamicFeesFeeEntry,\n PalletOmnipoolAssetState,\n} from '@polkadot/types/lookup';\nimport { UnsubscribePromise } from '@polkadot/api-base/types';\nimport { encodeAddress } from '@polkadot/util-crypto';\nimport { stringToU8a } from '@polkadot/util';\nimport { ITuple } from '@polkadot/types-codec/types';\nimport { Option, u32 } from '@polkadot/types-codec';\n\nimport {\n HUB_ASSET_ID,\n HYDRADX_SS58_PREFIX,\n SYSTEM_ASSET_ID,\n} from '../../consts';\nimport { bnum } from '../../utils/bignumber';\nimport { toDecimals, toPoolFee } from '../../utils/mapper';\n\nimport {\n PoolBase,\n PoolType,\n PoolToken,\n PoolLimits,\n PoolFees,\n PoolPair,\n} from '../types';\nimport { PoolClient } from '../PoolClient';\n\nimport { OmniMath } from './OmniMath';\nimport { OmniPoolFees, OmniPoolToken } from './OmniPool';\n\ntype OmniPoolFeeRange = [number, number, number];\n\nexport class OmniPoolClient extends PoolClient {\n isSupported(): boolean {\n return this.api.query.omnipool !== undefined;\n }\n\n async loadPools(): Promise<PoolBase[]> {\n const hubAssetId = this.api.consts.omnipool.hubAssetId.toString();\n const poolAddress = this.getPoolId();\n\n const [assets, hubAssetTradeability, hubAssetBalance] = await Promise.all([\n this.api.query.omnipool.assets.entries(),\n this.api.query.omnipool.hubAssetTradability(),\n this.getBalance(poolAddress, hubAssetId),\n ]);\n\n const poolTokens = assets.map(\n async ([\n {\n args: [id],\n },\n state,\n ]) => {\n const {\n hubReserve,\n shares,\n tradable,\n cap,\n protocolShares,\n }: PalletOmnipoolAssetState = state.unwrap();\n const balance = await this.getBalance(poolAddress, id.toString());\n return {\n id: id.toString(),\n hubReserves: bnum(hubReserve.toString()),\n shares: bnum(shares.toString()),\n tradeable: tradable.bits.toNumber(),\n balance: balance.toString(),\n cap: bnum(cap.toString()),\n protocolShares: bnum(protocolShares.toString()),\n } as OmniPoolToken;\n }\n );\n\n const tokens = await Promise.all(poolTokens);\n\n // Adding LRNA info\n tokens.push({\n id: hubAssetId,\n tradeable: hubAssetTradeability.bits.toNumber(),\n balance: hubAssetBalance.toString(),\n } as OmniPoolToken);\n\n return [\n {\n address: poolAddress,\n type: PoolType.Omni,\n hubAssetId: hubAssetId,\n tokens: tokens,\n ...this.getPoolLimits(),\n } as PoolBase,\n ];\n }\n\n async getPoolFees(poolPair: PoolPair, _address: string): Promise<PoolFees> {\n const feeAsset = poolPair.assetOut;\n const protocolAsset = poolPair.assetIn;\n\n const oracleName = 'omnipool';\n const oraclePeriod = 'Short';\n\n const oracleKey = (asset: string) => {\n return asset === SYSTEM_ASSET_ID\n ? [SYSTEM_ASSET_ID, HUB_ASSET_ID]\n : [HUB_ASSET_ID, asset];\n };\n\n const [blockNumber, dynamicFees, oracleAssetFee, oracleProtocolFee] =\n await Promise.all([\n this.api.query.system.number(),\n this.api.query.dynamicFees.assetFee(feeAsset),\n this.api.query.emaOracle.oracles<\n Option<ITuple<[PalletEmaOracleOracleEntry, u32]>>\n >(oracleName, oracleKey(feeAsset), oraclePeriod),\n this.api.query.emaOracle.oracles<\n Option<ITuple<[PalletEmaOracleOracleEntry, u32]>>\n >(oracleName, oracleKey(protocolAsset), oraclePeriod),\n ]);\n\n const [assetFeeMin, assetFee, assetFeeMax] = this.getAssetFee(\n poolPair,\n blockNumber.toNumber(),\n dynamicFees,\n oracleAssetFee\n );\n\n const [protocolFeeMin, protocolFee, protocolFeeMax] =\n protocolAsset === HUB_ASSET_ID\n ? [0, 0, 0] // No protocol fee for LRNA sell\n : this.getProtocolFee(\n poolPair,\n blockNumber.toNumber(),\n dynamicFees,\n oracleProtocolFee\n );\n\n const min = assetFeeMin + protocolFeeMin;\n const max = assetFeeMax + protocolFeeMax;\n\n return {\n assetFee: toPoolFee(assetFee),\n protocolFee: toPoolFee(protocolFee),\n min: toPoolFee(min),\n max: toPoolFee(max),\n } as OmniPoolFees;\n }\n\n getPoolType(): PoolType {\n return PoolType.Omni;\n }\n\n async subscribePoolChange(pool: PoolBase): UnsubscribePromise {\n const assetsArgs = pool.tokens.map((t) => t.id);\n return this.api.query.omnipool.assets.multi(assetsArgs, (states) => {\n pool.tokens = states.map((state, i) => {\n const token = pool.tokens[i];\n if (state.isNone) return token;\n const unwrapped: PalletOmnipoolAssetState = state.unwrap();\n return this.updateTokenState(token, unwrapped);\n });\n });\n }\n\n private updateTokenState(\n token: PoolToken,\n tokenState: PalletOmnipoolAssetState\n ) {\n const { hubReserve, shares, tradable, cap, protocolShares } = tokenState;\n return {\n ...token,\n hubReserves: bnum(hubReserve.toString()),\n shares: bnum(shares.toString()),\n cap: bnum(cap.toString()),\n protocolShares: bnum(protocolShares.toString()),\n tradeable: tradable.bits.toNumber(),\n } as OmniPoolToken;\n }\n\n private getAssetFee(\n poolPair: PoolPair,\n blockNumber: number,\n dynamicFee: Option<PalletDynamicFeesFeeEntry>,\n oracle: Option<ITuple<[PalletEmaOracleOracleEntry, u32]>>\n ): OmniPoolFeeRange {\n const { assetOut, balanceOut } = poolPair;\n\n const { minFee, maxFee, decay, amplification } =\n this.api.consts.dynamicFees.assetFeeParameters;\n\n const feeMin = toPoolFee(minFee.toNumber());\n const feeMax = toPoolFee(maxFee.toNumber());\n\n if (dynamicFee.isNone || oracle.isNone) {\n return [minFee.toNumber(), minFee.toNumber(), maxFee.toNumber()];\n }\n\n const [entry] = oracle.unwrap();\n const { assetFee, timestamp } = dynamicFee.unwrap();\n\n const blockDifference = Math.max(1, blockNumber - timestamp.toNumber());\n\n let oracleAmountIn = entry.volume.bIn.toString();\n let oracleAmountOut = entry.volume.bOut.toString();\n let oracleLiquidity = entry.liquidity.b.toString();\n\n if (assetOut === SYSTEM_ASSET_ID) {\n oracleAmountIn = entry.volume.aIn.toString();\n oracleAmountOut = entry.volume.aOut.toString();\n oracleLiquidity = entry.liquidity.a.toString();\n }\n\n const feePrev = toPoolFee(assetFee.toNumber());\n const fee = OmniMath.recalculateAssetFee(\n oracleAmountIn,\n oracleAmountOut,\n oracleLiquidity,\n '9',\n balanceOut.toString(),\n toDecimals(feePrev).toString(),\n blockDifference.toString(),\n toDecimals(feeMin).toString(),\n toDecimals(feeMax).toString(),\n decay.toString(),\n amplification.toString()\n );\n return [minFee.toNumber(), Number(fee) * 1000000, maxFee.toNumber()];\n }\n\n private getProtocolFee(\n poolPair: PoolPair,\n blockNumber: number,\n dynamicFee: Option<PalletDynamicFeesFeeEntry>,\n oracle: Option<ITuple<[PalletEmaOracleOracleEntry, u32]>>\n ): OmniPoolFeeRange {\n const { assetIn, balanceIn } = poolPair;\n\n const { minFee, maxFee, decay, amplification } =\n this.api.consts.dynamicFees.protocolFeeParameters;\n\n const feeMin = toPoolFee(minFee.toNumber());\n const feeMax = toPoolFee(maxFee.toNumber());\n\n if (dynamicFee.isNone || oracle.isNone) {\n return [minFee.toNumber(), minFee.toNumber(), maxFee.toNumber()];\n }\n\n const [entry] = oracle.unwrap();\n const { protocolFee, timestamp } = dynamicFee.unwrap();\n\n const blockDifference = Math.max(1, blockNumber - timestamp.toNumber());\n\n let oracleAmountIn = entry.volume.bIn.toString();\n let oracleAmountOut = entry.volume.bOut.toString();\n let oracleLiquidity = entry.liquidity.b.toString();\n\n if (assetIn === SYSTEM_ASSET_ID) {\n oracleAmountIn = entry.volume.aIn.toString();\n oracleAmountOut = entry.volume.aOut.toString();\n oracleLiquidity = entry.liquidity.a.toString();\n }\n\n const feePrev = toPoolFee(protocolFee.toNumber());\n const fee = OmniMath.recalculateProtocolFee(\n oracleAmountIn,\n oracleAmountOut,\n oracleLiquidity,\n '9',\n balanceIn.toString(),\n toDecimals(feePrev).toString(),\n blockDifference.toString(),\n toDecimals(feeMin).toString(),\n toDecimals(feeMax).toString(),\n decay.toString(),\n amplification.toString()\n );\n return [minFee.toNumber(), Number(fee) * 1000000, maxFee.toNumber()];\n }\n\n private getPoolId(): string {\n return encodeAddress(\n stringToU8a('modlomnipool'.padEnd(32, '\\0')),\n HYDRADX_SS58_PREFIX\n );\n }\n\n private getPoolLimits(): PoolLimits {\n const maxInRatio = this.api.consts.omnipool.maxInRatio.toJSON() as number;\n const maxOutRatio = this.api.consts.omnipool.maxOutRatio.toJSON() as number;\n const minTradingLimit =\n this.api.consts.omnipool.minimumTradingLimit.toJSON() as number;\n return {\n maxInRatio: maxInRatio,\n maxOutRatio: maxOutRatio,\n minTradingLimit: minTradingLimit,\n } as PoolLimits;\n }\n}\n", "import {\n calculate_in_given_out,\n calculate_out_given_in,\n calculate_pool_trade_fee,\n get_spot_price,\n calculate_liquidity_in,\n calculate_shares,\n calculate_spot_price,\n calculate_spot_price_with_fee,\n calculate_liquidity_out_asset_a,\n calculate_liquidity_out_asset_b,\n} from '@galacticcouncil/math-xyk';\n\nexport class XykMath {\n static getSpotPrice(\n balanceA: string,\n balanceB: string,\n amount: string\n ): string {\n return get_spot_price(balanceA, balanceB, amount);\n }\n\n static calculateInGivenOut(\n balanceIn: string,\n balanceOut: string,\n amountOut: string\n ): string {\n return calculate_in_given_out(balanceIn, balanceOut, amountOut);\n }\n\n static calculateOutGivenIn(\n balanceIn: string,\n balanceOut: string,\n amountIn: string\n ): string {\n return calculate_out_given_in(balanceIn, balanceOut, amountIn);\n }\n\n static calculatePoolTradeFee(\n amount: string,\n feeNumerator: number,\n feeDenominator: number\n ): string {\n return calculate_pool_trade_fee(amount, feeNumerator, feeDenominator);\n }\n\n static calculateLiquidityIn(\n reserveA: string,\n reserveB: string,\n amountA: string\n ): string {\n return calculate_liquidity_in(reserveA, reserveB, amountA);\n }\n\n static calculateSpotPrice(balanceA: string, balanceB: string): string {\n return calculate_spot_price(balanceA, balanceB);\n }\n\n static calculateSpotPriceWithFee(\n balanceA: string,\n balanceB: string,\n feeNumerator: string,\n feeDenominator: string\n ): string {\n return calculate_spot_price_with_fee(\n balanceA,\n balanceB,\n feeNumerator,\n feeDenominator\n );\n }\n\n static calculateShares(\n reserveA: string,\n amountA: string,\n totalShares: string\n ): string {\n return calculate_shares(reserveA, amountA, totalShares);\n }\n\n static calculateLiquidityOutAssetA(\n reserveA: string,\n reserveB: string,\n shares: string,\n totalShares: string\n ): string {\n return calculate_liquidity_out_asset_a(\n reserveA,\n reserveB,\n shares,\n totalShares\n );\n }\n\n static calculateLiquidityOutAssetB(\n reserveA: string,\n reserveB: string,\n shares: string,\n totalShares: string\n ): string {\n return calculate_liquidity_out_asset_b(\n reserveA,\n reserveB,\n shares,\n totalShares\n );\n }\n}\n", "import {\n BuyCtx,\n Pool,\n PoolBase,\n PoolError,\n PoolFee,\n PoolFees,\n PoolPair,\n PoolToken,\n PoolType,\n SellCtx,\n} from '../types';\nimport { BigNumber, bnum, ONE, scale, ZERO } from '../../utils/bignumber';\nimport { toPct } from '../../utils/mapper';\n\nimport { XykMath } from './XykMath';\n\nexport type XykPoolFees = PoolFees & {\n exchangeFee: PoolFee;\n};\n\nexport class XykPool implements Pool {\n type: PoolType;\n address: string;\n tokens: PoolToken[];\n maxInRatio: number;\n maxOutRatio: number;\n minTradingLimit: number;\n\n static fromPool(pool: PoolBase): XykPool {\n return new XykPool(\n pool.address,\n pool.tokens as PoolToken[],\n pool.maxInRatio,\n pool.maxOutRatio,\n pool.minTradingLimit\n );\n }\n\n constructor(\n address: string,\n tokens: PoolToken[],\n maxInRation: number,\n maxOutRatio: number,\n minTradeLimit: number\n ) {\n this.type = PoolType.XYK;\n this.address = address;\n this.tokens = tokens;\n this.maxInRatio = maxInRation;\n this.maxOutRatio = maxOutRatio;\n this.minTradingLimit = minTradeLimit;\n }\n\n validatePair(_tokenIn: string, _tokenOut: string): boolean {\n return true;\n }\n\n parsePair(tokenIn: string, tokenOut: string): PoolPair {\n const tokensMap = new Map(this.tokens.map((token) => [token.id, token]));\n const tokenInMeta = tokensMap.get(tokenIn);\n const tokenOutMeta = tokensMap.get(tokenOut);\n\n if (tokenInMeta == null) throw new Error('Pool does not contain tokenIn');\n if (tokenOutMeta == null) throw new Error('Pool does not contain tokenOut');\n\n const balanceIn = bnum(tokenInMeta.balance);\n const balanceOut = bnum(tokenOutMeta.balance);\n\n const assetInED = bnum(tokenInMeta.existentialDeposit);\n const assetOutED = bnum(tokenOutMeta.existentialDeposit);\n\n return {\n assetIn: tokenIn,\n assetOut: tokenOut,\n decimalsIn: tokenInMeta.decimals,\n decimalsOut: tokenOutMeta.decimals,\n balanceIn: balanceIn,\n balanceOut: balanceOut,\n assetInED,\n assetOutED,\n } as PoolPair;\n }\n\n validateAndBuy(\n poolPair: PoolPair,\n amountOut: BigNumber,\n fees: XykPoolFees\n ): BuyCtx {\n const calculatedIn = this.calculateInGivenOut(poolPair, amountOut);\n\n const fee = this.calculateTradeFee(calculatedIn, fees);\n const feePct = toPct(fees.exchangeFee);\n const amountIn = calculatedIn.plus(fee);\n\n const errors: PoolError[] = [];\n\n if (\n amountOut.isLessThan(this.minTradingLimit) ||\n calculatedIn.isLessThan(poolPair.assetInED)\n ) {\n errors.push(PoolError.InsufficientTradingAmount);\n }\n\n const poolOutReserve = poolPair.balanceOut.div(this.maxOutRatio);\n if (amountOut.isGreaterThan(poolOutReserve)) {\n errors.push(PoolError.MaxOutRatioExceeded);\n }\n\n const poolInReserve = poolPair.balanceIn.div(this.maxInRatio);\n if (amountIn.isGreaterThan(poolInReserve)) {\n errors.push(PoolError.MaxInRatioExceeded);\n }\n\n return {\n amountIn: amountIn,\n calculatedIn: calculatedIn,\n amountOut: amountOut,\n feePct: feePct,\n errors: errors,\n } as BuyCtx;\n }\n\n validateAndSell(\n poolPair: PoolPair,\n amountIn: BigNumber,\n fees: XykPoolFees\n ): SellCtx {\n const calculatedOut = this.calculateOutGivenIn(poolPair, amountIn);\n\n const fee = this.calculateTradeFee(calculatedOut, fees);\n const feePct = toPct(fees.exchangeFee);\n const amountOut = calculatedOut.minus(fee);\n\n const errors: PoolError[] = [];\n\n if (\n amountIn.isLessThan(this.minTradingLimit) ||\n calculatedOut.isLessThan(poolPair.assetOutED)\n ) {\n errors.push(PoolError.InsufficientTradingAmount);\n }\n\n const poolInReserve = poolPair.balanceIn.div(this.maxInRatio);\n if (amountIn.isGreaterThan(poolInReserve)) {\n errors.push(PoolError.MaxInRatioExceeded);\n }\n\n const poolOutReserve = poolPair.balanceOut.div(this.maxOutRatio);\n if (amountOut.isGreaterThan(poolOutReserve)) {\n errors.push(PoolError.MaxOutRatioExceeded);\n }\n\n return {\n amountIn: amountIn,\n calculatedOut: calculatedOut,\n amountOut: amountOut,\n feePct: feePct,\n errors: errors,\n } as SellCtx;\n }\n\n calculateInGivenOut(poolPair: PoolPair, amountOut: BigNumber): BigNumber {\n const price = XykMath.calculateInGivenOut(\n poolPair.balanceIn.toString(),\n poolPair.balanceOut.toString(),\n amountOut.toFixed(0)\n );\n const priceBN = bnum(price);\n return priceBN.isNegative() ? ZERO : priceBN;\n }\n\n calculateOutGivenIn(poolPair: PoolPair, amountIn: BigNumber): BigNumber {\n const price = XykMath.calculateOutGivenIn(\n poolPair.balanceIn.toString(),\n poolPair.balanceOut.toString(),\n amountIn.toFixed(0)\n );\n const priceBN = bnum(price);\n return priceBN.isNegative() ? ZERO : priceBN;\n }\n\n spotPriceInGivenOut(poolPair: PoolPair): BigNumber {\n const price = XykMath.calculateSpotPrice(\n poolPair.balanceOut.toString(),\n poolPair.balanceIn.toString()\n );\n\n const base = scale(ONE, 18 - poolPair.decimalsOut);\n return bnum(price).div(base);\n }\n\n spotPriceOutGivenIn(poolPair: PoolPair): BigNumber {\n const price = XykMath.calculateSpotPrice(\n poolPair.balanceIn.toString(),\n poolPair.balanceOut.toString()\n );\n\n const base = scale(ONE, 18 - poolPair.decimalsIn);\n return bnum(price).div(base);\n }\n\n calculateTradeFee(amount: BigNumber, fees: XykPoolFees): BigNumber {\n const fee = XykMath.calculatePoolTradeFee(\n amount.toString(),\n fees.exchangeFee[0],\n fees.exchangeFee[1]\n );\n return bnum(fee);\n }\n}\n", "import type { u32 } from '@polkadot/types';\nimport type { ITuple } from '@polkadot/types/types';\nimport { UnsubscribePromise } from '@polkadot/api-base/types';\n\nimport {\n PoolBase,\n PoolType,\n PoolFee,\n PoolLimits,\n PoolFees,\n PoolToken,\n PoolPair,\n} from '../types';\nimport { PoolClient } from '../PoolClient';\n\nimport { XykPoolFees } from './XykPool';\n\nexport class XykPoolClient extends PoolClient {\n isSupported(): boolean {\n return this.api.query.xyk !== undefined;\n }\n\n async loadPools(): Promise<PoolBase[]> {\n const poolAssets = await this.api.query.xyk.poolAssets.entries();\n const pools = poolAssets.map(\n async ([\n {\n args: [id],\n },\n state,\n ]) => {\n const poolAddress = id.toString();\n const [assetA, assetB]: ITuple<[u32, u32]> = state.unwrap();\n const [assetABalance, assetBBalance] = await Promise.all([\n this.getBalance(poolAddress, assetA.toString()),\n this.getBalance(poolAddress, assetB.toString()),\n ]);\n\n return {\n address: poolAddress,\n type: PoolType.XYK,\n tokens: [\n {\n id: assetA.toString(),\n balance: assetABalance.toString(),\n } as PoolToken,\n {\n id: assetB.toString(),\n balance: assetBBalance.toString(),\n } as PoolToken,\n ],\n ...this.getPoolLimits(),\n } as PoolBase;\n }\n );\n return Promise.all(pools);\n }\n\n async getPoolFees(_poolPair: PoolPair, _address: string): Promise<PoolFees> {\n return {\n exchangeFee: this.getExchangeFee(),\n } as XykPoolFees;\n }\n\n getPoolType(): PoolType {\n return PoolType.XYK;\n }\n\n protected subscribePoolChange(_pool: PoolBase): UnsubscribePromise {\n throw new Error('Pool change subscription not supported!');\n }\n\n private getExchangeFee(): PoolFee {\n const exFee = this.api.consts.xyk.getExchangeFee;\n return exFee.toJSON() as PoolFee;\n }\n\n private getPoolLimits(): PoolLimits {\n const maxInRatio = this.api.consts.xyk.maxInRatio.toJSON() as number;\n const maxOutRatio = this.api.consts.xyk.maxOutRatio.toJSON() as number;\n const minTradingLimit =\n this.api.consts.xyk.minTradingLimit.toJSON() as number;\n return {\n maxInRatio: maxInRatio,\n maxOutRatio: maxOutRatio,\n minTradingLimit: minTradingLimit,\n } as PoolLimits;\n }\n}\n", "import {\n calculate_in_given_out,\n calculate_out_given_in,\n calculate_amplification,\n calculate_add_one_asset,\n calculate_liquidity_out_one_asset,\n calculate_pool_trade_fee,\n calculate_shares,\n calculate_shares_for_amount,\n calculate_spot_price_with_fee,\n pool_account_name,\n recalculate_peg,\n} from '@galacticcouncil/math-stableswap';\n\nexport class StableMath {\n static getPoolAddress(assetId: number): Uint8Array {\n return pool_account_name(assetId);\n }\n\n static defaultPegs(size: number) {\n const pegs = [];\n for (let i = 0; i < size; i++) {\n pegs.push(['1', '1']);\n }\n return pegs;\n }\n\n static calculateAmplification(\n initialAmp: string,\n finalAmp: string,\n initialBlock: string,\n finalBlock: string,\n currentBlock: string\n ) {\n return calculate_amplification(\n initialAmp,\n finalAmp,\n initialBlock,\n finalBlock,\n currentBlock\n );\n }\n\n static calculateInGivenOut(\n reserves: string,\n assetIn: number,\n assetOut: number,\n amountOut: string,\n amplification: string,\n fee: string,\n pegs: string\n ): string {\n return calculate_in_given_out(\n reserves,\n assetIn,\n assetOut,\n amountOut,\n amplification,\n fee,\n pegs\n );\n }\n\n static calculateAddOneAsset(\n reserves: string,\n shares: string,\n assetIn: number,\n amplification: string,\n shareIssuance: string,\n fee: string,\n pegs: string\n ) {\n return calculate_add_one_asset(\n reserves,\n shares,\n assetIn,\n amplification,\n shareIssuance,\n fee,\n pegs\n );\n }\n\n static calculateSharesForAmount(\n reserves: string,\n assetIn: number,\n amount: string,\n amplification: string,\n shareIssuance: string,\n fee: string,\n pegs: string\n ) {\n return calculate_shares_for_amount(\n reserves,\n assetIn,\n amount,\n amplification,\n shareIssuance,\n fee,\n pegs\n );\n }\n\n static calculateOutGivenIn(\n reserves: string,\n assetIn: number,\n assetOut: number,\n amountIn: string,\n amplification: string,\n fee: string,\n pegs: string\n ): string {\n return calculate_out_given_in(\n reserves,\n assetIn,\n assetOut,\n amountIn,\n amplification,\n fee,\n pegs\n );\n }\n\n static calculateLiquidityOutOneAsset(\n reserves: string,\n shares: string,\n assetOut: number,\n amplification: string,\n shareIssuance: string,\n withdrawFee: string,\n pegs: string\n ) {\n return calculate_liquidity_out_one_asset(\n reserves,\n shares,\n assetOut,\n amplification,\n shareIssuance,\n withdrawFee,\n pegs\n );\n }\n\n static calculateShares(\n reserves: string,\n assets: string,\n amplification: string,\n shareIssuance: string,\n fee: string,\n pegs: string\n ) {\n return calculate_shares(\n reserves,\n assets,\n amplification,\n shareIssuance,\n fee,\n pegs\n );\n }\n\n static calculateSpotPriceWithFee(\n poolId: string,\n reserves: string,\n amplification: string,\n assetIn: string,\n assetOut: string,\n shareIssuance: string,\n fee: string,\n pegs: string\n ): string {\n return calculate_spot_price_with_fee(\n poolId,\n reserves,\n amplification,\n assetIn,\n assetOut,\n shareIssuance,\n fee,\n pegs\n );\n }\n\n static calculatePoolTradeFee(\n amount: string,\n feeNumerator: number,\n feeDenominator: number\n ): string {\n return calculate_pool_trade_fee(amount, feeNumerator, feeDenominator);\n }\n\n static recalculatePegs(\n currentPegs: string,\n targetPegs: string,\n currentBlock: string,\n maxPegUpdate: string,\n poolFee: string\n ): [string, string[][]] {\n const pegs = recalculate_peg(\n currentPegs,\n targetPegs,\n currentBlock,\n maxPegUpdate,\n poolFee\n );\n return JSON.parse(pegs);\n }\n}\n", "import {\n BuyCtx,\n Pool,\n PoolBase,\n PoolError,\n PoolFee,\n PoolFees,\n PoolPair,\n PoolToken,\n PoolType,\n SellCtx,\n} from '../types';\nimport { TRADEABLE_DEFAULT } from '../../consts';\nimport { BigNumber, bnum, ONE, scale, ZERO } from '../../utils/bignumber';\nimport { toDecimals, toPct } from '../../utils/mapper';\n\nimport { StableMath } from './StableMath';\nimport { OmniMath } from '../omni/OmniMath';\n\nexport type StableSwapPair = PoolPair & {\n tradeableIn: number;\n tradeableOut: number;\n};\n\nexport type StableSwapFees = PoolFees & {\n fee: PoolFee;\n};\n\nexport type StableSwapBase = PoolBase & {\n amplification: string;\n id: string;\n fee: PoolFee;\n totalIssuance: string;\n pegs: string[][];\n pegsFee: PoolFee;\n};\n\nexport class StableSwap implements Pool {\n type: PoolType;\n address: string;\n tokens: PoolToken[];\n maxInRatio: number;\n maxOutRatio: number;\n minTradingLimit: number;\n amplification: string;\n id: string;\n fee: PoolFee;\n totalIssuance: string;\n pegs: string[][];\n pegsFee: PoolFee;\n\n static fromPool(pool: StableSwapBase): StableSwap {\n return new StableSwap(\n pool.address,\n pool.tokens as PoolToken[],\n pool.maxInRatio,\n pool.maxOutRatio,\n pool.minTradingLimit,\n pool.amplification,\n pool.id,\n pool.fee,\n pool.totalIssuance,\n pool.pegs,\n pool.pegsFee\n );\n }\n\n constructor(\n address: string,\n tokens: PoolToken[],\n maxInRation: number,\n maxOutRatio: number,\n minTradeLimit: number,\n amplification: string,\n id: string,\n fee: PoolFee,\n totalIssuance: string,\n pegs: string[][],\n pegsFee: PoolFee\n ) {\n this.type = PoolType.Stable;\n this.address = address;\n this.tokens = tokens;\n this.maxInRatio = maxInRation;\n this.maxOutRatio = maxOutRatio;\n this.minTradingLimit = minTradeLimit;\n this.amplification = amplification;\n this.id = id;\n this.fee = fee;\n this.totalIssuance = totalIssuance;\n this.pegs = pegs;\n this.pegsFee = pegsFee;\n }\n\n validatePair(_tokenIn: string, _tokenOut: string): boolean {\n return true;\n }\n\n parsePair(tokenIn: string, tokenOut: string): StableSwapPair {\n const tokensMap = new Map(this.tokens.map((token) => [token.id, token]));\n const tokenInMeta = tokensMap.get(tokenIn);\n const tokenOutMeta = tokensMap.get(tokenOut);\n\n if (tokenInMeta == null) throw new Error('Pool does not contain tokenIn');\n if (tokenOutMeta == null) throw new Error('Pool does not contain tokenOut');\n\n const balanceIn = bnum(tokenInMeta.balance);\n const balanceOut = bnum(tokenOutMeta.balance);\n\n const assetInED = bnum(tokenInMeta.existentialDeposit);\n const assetOutED = bnum(tokenOutMeta.existentialDeposit);\n\n return {\n assetIn: tokenIn,\n assetOut: tokenOut,\n balanceIn: balanceIn,\n balanceOut: balanceOut,\n decimalsIn: tokenInMeta.decimals,\n decimalsOut: tokenOutMeta.decimals,\n tradeableIn:\n this.id === tokenIn ? TRADEABLE_DEFAULT : tokenInMeta.tradeable,\n tradeableOut:\n this.id === tokenOut ? TRADEABLE_DEFAULT : tokenOutMeta.tradeable,\n assetInED,\n assetOutED,\n } as StableSwapPair;\n }\n\n validateAndBuy(\n poolPair: StableSwapPair,\n amountOut: BigNumber,\n fees: StableSwapFees\n ): BuyCtx {\n const calculatedIn = this.calculateInGivenOut(poolPair, amountOut);\n const amountIn = this.calculateInGivenOut(poolPair, amountOut, fees);\n const feePct = toPct(fees.fee);\n\n const errors: PoolError[] = [];\n const isSellAllowed = OmniMath.isSellAllowed(poolPair.tradeableIn);\n const isBuyAllowed = OmniMath.isBuyAllowed(poolPair.tradeableOut);\n\n if (!isSellAllowed || !isBuyAllowed) {\n errors.push(PoolError.TradeNotAllowed);\n }\n\n if (\n amountOut.isLessThan(this.minTradingLimit) ||\n calculatedIn.isLessThan(poolPair.assetInED)\n ) {\n errors.push(PoolError.InsufficientTradingAmount);\n }\n\n return {\n amountIn: amountIn,\n calculatedIn: calculatedIn,\n amountOut: amountOut,\n feePct: feePct,\n errors: errors,\n } as BuyCtx;\n }\n\n validateAndSell(\n poolPair: StableSwapPair,\n amountIn: BigNumber,\n fees: StableSwapFees\n ): SellCtx {\n const calculatedOut = this.calculateOutGivenIn(poolPair, amountIn);\n const amountOut = this.calculateOutGivenIn(poolPair, amountIn, fees);\n const feePct = toPct(fees.fee);\n\n const errors: PoolError[] = [];\n const isSellAllowed = OmniMath.isSellAllowed(poolPair.tradeableIn);\n const isBuyAllowed = OmniMath.isBuyAllowed(poolPair.tradeableOut);\n\n if (!isSellAllowed || !isBuyAllowed) {\n errors.push(PoolError.TradeNotAllowed);\n }\n\n if (\n amountIn.isLessThan(this.minTradingLimit) ||\n calculatedOut.isLessThan(poolPair.assetOutED)\n ) {\n errors.push(PoolError.InsufficientTradingAmount);\n }\n\n return {\n amountIn: amountIn,\n calculatedOut: calculatedOut,\n amountOut: amountOut,\n feePct: feePct,\n errors: errors,\n } as SellCtx;\n }\n\n private calculateIn(\n poolPair: PoolPair,\n amountOut: BigNumber,\n fees?: StableSwapFees\n ) {\n const price = StableMath.calculateInGivenOut(\n this.getReserves(),\n Number(poolPair.assetIn),\n Number(poolPair.assetOut),\n amountOut.toFixed(0),\n this.amplification,\n fees ? toDecimals(fees.fee).toString() : ZERO.toString(),\n this.getPegs()\n );\n const priceBN = bnum(price);\n return priceBN.isNegative() ? ZERO : priceBN;\n }\n\n private calculateAddOneAsset(\n poolPair: PoolPair,\n amountOut: BigNumber,\n fees?: StableSwapFees\n ) {\n const price = StableMath.calculateAddOneAsset(\n this.getReserves(),\n amountOut.toFixed(0),\n Number(poolPair.assetIn),\n this.amplification,\n this.totalIssuance,\n fees ? toDecimals(fees.fee).toString() : ZERO.toString(),\n this.getPegs()\n );\n const priceBN = bnum(price);\n return priceBN.isNegative() ? ZERO : priceBN;\n }\n\n private calculateSharesForAmount(\n poolPair: PoolPair,\n amountOut: BigNumber,\n fees?: StableSwapFees\n ) {\n const price = StableMath.calculateSharesForAmount(\n this.getReserves(),\n Number(poolPair.assetOut),\n amountOut.toFixed(0),\n this.amplification,\n this.totalIssuance,\n fees ? toDecimals(fees.fee).toString() : ZERO.toString(),\n this.getPegs()\n );\n const priceBN = bnum(price);\n return priceBN.isNegative() ? ZERO : priceBN;\n }\n\n calculateInGivenOut(\n poolPair: PoolPair,\n amountOut: BigNumber,\n fees?: StableSwapFees\n ): BigNumber {\n if (poolPair.assetOut == this.id) {\n return this.calculateAddOneAsset(poolPair, amountOut, fees);\n }\n\n if (poolPair.assetIn == this.id) {\n return this.calculateSharesForAmount(poolPair, amountOut, fees);\n }\n\n return this.calculateIn(poolPair, amountOut, fees);\n }\n\n spotPriceInGivenOut(poolPair: PoolPair): BigNumber {\n const spot = StableMath.calculateSpotPriceWithFee(\n this.id,\n this.getReserves(),\n this.amplification,\n poolPair.assetOut,\n poolPair.assetIn,\n this.totalIssuance,\n '0',\n this.getPegs()\n );\n\n if (poolPair.assetOut == this.id) {\n return bnum(spot);\n }\n\n if (poolPair.assetIn == this.id) {\n const base = scale(ONE, poolPair.decimalsIn - poolPair.decimalsOut);\n return bnum(spot).div(base);\n }\n\n const base = scale(ONE, 18 - poolPair.decimalsIn);\n return bnum(spot).div(base);\n }\n\n private calculateOut(\n poolPair: PoolPair,\n amountIn: BigNumber,\n fees?: StableSwapFees\n ) {\n const price = StableMath.calculateOutGivenIn(\n this.getReserves(),\n Number(poolPair.assetIn),\n Number(poolPair.assetOut),\n amountIn.toFixed(0),\n this.amplification,\n fees ? toDecimals(fees.fee).toString() : ZERO.toString(),\n this.getPegs()\n );\n const priceBN = bnum(price);\n return priceBN.isNegative() ? ZERO : priceBN;\n }\n\n private calculateWithdrawOneAsset(\n poolPair: PoolPair,\n amountIn: BigNumber,\n fees?: StableSwapFees\n ) {\n const price = StableMath.calculateLiquidityOutOneAsset(\n this.getReserves(),\n amountIn.toFixed(0),\n Number(poolPair.assetOut),\n this.amplification,\n this.totalIssuance,\n fees ? toDecimals(fees.fee).toString() : ZERO.toString(),\n this.getPegs()\n );\n const priceBN = bnum(price);\n return priceBN.isNegative() ? ZERO : priceBN;\n }\n\n private calculateShares(\n poolPair: PoolPair,\n amountIn: BigNumber,\n fees?: StableSwapFees\n ) {\n const price = StableMath.calculateShares(\n this.getReserves(),\n this.getAssets(poolPair.assetIn, amountIn),\n this.amplification,\n this.totalIssuance,\n fees ? toDecimals(fees.fee).toString() : ZERO.toString(),\n this.getPegs()\n );\n const priceBN = bnum(price);\n return priceBN.isNegative() ? ZERO : priceBN;\n }\n\n calculateOutGivenIn(\n poolPair: PoolPair,\n amountIn: BigNumber,\n fees?: StableSwapFees\n ): BigNumber {\n if (poolPair.assetIn == this.id) {\n return this.calculateWithdrawOneAsset(poolPair, amountIn, fees);\n }\n\n if (poolPair.assetOut == this.id) {\n return this.calculateShares(poolPair, amountIn, fees);\n }\n\n return this.calculateOut(poolPair, amountIn, fees);\n }\n\n spotPriceOutGivenIn(poolPair: PoolPair): BigNumber {\n const spot = StableMath.calculateSpotPriceWithFee(\n this.id,\n this.getReserves(),\n this.amplification,\n poolPair.assetIn,\n poolPair.assetOut,\n this.totalIssuance,\n '0',\n this.getPegs()\n );\n\n if (poolPair.assetIn == this.id) {\n return bnum(spot);\n }\n\n if (poolPair.assetOut == this.id) {\n const base = scale(ONE, poolPair.decimalsOut - poolPair.decimalsIn);\n return bnum(spot).div(base);\n }\n\n const base = scale(ONE, 18 - poolPair.decimalsOut);\n return bnum(spot).div(base);\n }\n\n calculateTradeFee(amount: BigNumber, fees: StableSwapFees): BigNumber {\n const fee = StableMath.calculatePoolTradeFee(\n amount.toString(),\n fees.fee[0],\n fees.fee[1]\n );\n return bnum(fee);\n }\n\n private getPegs(): string {\n return JSON.stringify(this.pegs);\n }\n\n private getReserves(): string {\n const reserves = this.tokens\n .filter((token) => token.id != this.id)\n .map(({ id, balance, decimals }: PoolToken) => {\n return {\n asset_id: Number(id),\n amount: balance,\n decimals: decimals,\n };\n });\n return JSON.stringify(reserves);\n }\n\n private getAssets(assetId: string, amount: BigNumber): string {\n const asset = {\n asset_id: Number(assetId),\n amount: amount.toFixed(0),\n };\n return JSON.stringify([asset]);\n }\n}\n", "import type {\n PalletEmaOracleOracleEntry,\n PalletStableswapPoolInfo,\n PalletStableswapPoolPegInfo,\n} from '@polkadot/types/lookup';\nimport { blake2AsHex, encodeAddress } from '@polkadot/util-crypto';\nimport { UnsubscribePromise } from '@polkadot/api-base/types';\nimport { Option, u32 } from '@polkadot/types-codec';\nimport { ITuple } from '@polkadot/types-codec/types';\n\nimport { HYDRADX_SS58_PREFIX, TRADEABLE_DEFAULT } from '../../consts';\nimport { toPoolFee } from '../../utils/mapper';\n\nimport {\n PoolBase,\n PoolType,\n PoolFee,\n PoolLimits,\n PoolFees,\n PoolToken,\n PoolPair,\n} from '../types';\nimport { PoolClient } from '../PoolClient';\n\nimport { StableMath } from './StableMath';\nimport { StableSwapBase, StableSwapFees } from './StableSwap';\n\nexport const AMOUNT_MAX = 340282366920938463463374607431768211455n;\n\nexport class StableSwapClient extends PoolClient {\n private stablePools: Map<string, PalletStableswapPoolInfo> = new Map([]);\n\n isSupported(): boolean {\n return this.api.query.stableswap !== undefined;\n }\n\n isPegSupported(): boolean {\n return this.api.query.stableswap.poolPegs !== undefined;\n }\n\n async loadPools(): Promise<PoolBase[]> {\n const [pools, parachainBlock] = await Promise.all([\n this.api.query.stableswap.pools.entries(),\n this.api.query.system.number(),\n ]);\n\n const blockNumber = parachainBlock.toNumber();\n const stablePools = pools.map(\n async ([\n {\n args: [id],\n },\n state,\n ]) => {\n const pool: PalletStableswapPoolInfo = state.unwrap();\n const poolId = id.toString();\n const poolAddress = this.getPoolAddress(poolId);\n\n const [poolDelta, poolTokens, poolPegs] = await Promise.all([\n this.getPoolDelta(poolId, pool, blockNumber.toString()),\n this.getPoolTokens(poolAddress, poolId, pool),\n this.getPoolPegs(poolId, pool, blockNumber.toString()),\n ]);\n\n this.stablePools.set(poolAddress, pool);\n return {\n address: poolAddress,\n id: poolId,\n type: PoolType.Stable,\n fee: toPoolFee(pool.fee.toNumber()),\n tokens: poolTokens,\n ...poolDelta,\n ...poolPegs,\n ...this.getPoolLimits(),\n } as PoolBase;\n }\n );\n return Promise.all(stablePools);\n }\n\n async getPoolFees(_poolPair: PoolPair, address: string): Promise<PoolFees> {\n const pool = this.pools.find(\n (pool) => pool.address === address\n ) as StableSwapBase;\n return {\n fee: pool.pegsFee as PoolFee,\n } as StableSwapFees;\n }\n\n getPoolType(): PoolType {\n return PoolType.Stable;\n }\n\n async subscribePoolChange(pool: PoolBase): UnsubscribePromise {\n return this.api.query.system.number(async (parachainBlock) => {\n const blockNumber = parachainBlock.toString();\n const stablePool = this.stablePools.get(pool.address);\n if (stablePool) {\n const [poolDelta, poolPegs] = await Promise.all([\n this.getPoolDelta(pool.id!, stablePool, blockNumber),\n this.getPoolPegs(pool.id!, stablePool, blockNumber),\n ]);\n Object.assign(pool, poolDelta, poolPegs);\n }\n });\n }\n\n private async getPoolDelta(\n poolId: string,\n poolInfo: PalletStableswapPoolInfo,\n blockNumber: string\n ): Promise<Partial<StableSwapBase>> {\n const {\n initialAmplification,\n finalAmplification,\n initialBlock,\n finalBlock,\n } = poolInfo;\n\n const amplification = StableMath.calculateAmplification(\n initialAmplification.toString(),\n finalAmplification.toString(),\n initialBlock.toString(),\n finalBlock.toString(),\n blockNumber\n );\n\n const totalIssuance = await this.api.query.tokens.totalIssuance(poolId);\n return {\n amplification: amplification,\n totalIssuance: totalIssuance.toString(),\n } as Partial<StableSwapBase>;\n }\n\n private async getPoolTokens(\n poolAddress: string,\n poolId: string,\n poolInfo: PalletStableswapPoolInfo\n ): Promise<PoolToken[]> {\n const { assets } = poolInfo;\n\n const poolTokens = assets.map(async (a) => {\n const [tradeability, balance] = await Promise.all([\n this.api.query.stableswap.assetTradability(poolId, a.toString()),\n this.getBalance(poolAddress, a.toString()),\n ]);\n\n return {\n id: a.toString(),\n tradeable: tradeability.bits.toNumber(),\n balance: balance.toString(),\n } as PoolToken;\n });\n\n const tokens = await Promise.all(poolTokens);\n tokens.push({\n id: poolId,\n tradeable: TRADEABLE_DEFAULT,\n balance: AMOUNT_MAX.toString(),\n } as PoolToken);\n\n return tokens;\n }\n\n private getPoolDefaultPegs(poolInfo: PalletStableswapPoolInfo) {\n const defaultFee = poolInfo.fee;\n const defaultPegs = StableMath.defaultPegs(poolInfo.assets.length);\n return {\n pegsFee: toPoolFee(defaultFee.toNumber()),\n pegs: defaultPegs,\n };\n }\n\n private async getPoolPegs(\n poolId: string,\n poolInfo: PalletStableswapPoolInfo,\n blockNumber: string\n ): Promise<Partial<StableSwapBase>> {\n if (!this.isPegSupported()) {\n return this.getPoolDefaultPegs(poolInfo);\n }\n\n const poolPegs = await this.api.query.stableswap.poolPegs(poolId);\n if (poolPegs.isNone) {\n return this.getPoolDefaultPegs(poolInfo);\n }\n\n const pegs = poolPegs.unwrap();\n\n const latestPegs = await this.getLatestPegs(poolInfo, pegs, blockNumber);\n const recentPegs = this.getRecentPegs(pegs);\n const maxPegUpdate = pegs.maxPegUpdate.toHuman();\n const fee = poolInfo.fee.toHuman();\n\n const [updatedFee, updatedPegs] = StableMath.recalculatePegs(\n JSON.stringify(recentPegs),\n JSON.stringify(latestPegs),\n blockNumber,\n maxPegUpdate.replace(/%/g, ''),\n fee.replace(/%/g, '')\n );\n\n const updatedFeePermill = Number(updatedFee) * 10000;\n return {\n pegsFee: toPoolFee(updatedFeePermill),\n pegs: updatedPegs,\n };\n }\n\n private getRecentPegs(poolPegs: PalletStableswapPoolPegInfo) {\n const { current } = poolPegs;\n return Array.from(current.entries()).map(([_, pegs]) =>\n pegs.map((p) => p.toString())\n );\n }\n\n private async getLatestPegs(\n poolInfo: PalletStableswapPoolInfo,\n poolPegs: PalletStableswapPoolPegInfo,\n blockNumber: string\n ) {\n const { source } = poolPegs;\n\n const assets = Array.from(poolInfo.assets.entries()).map(([_, id]) =>\n id.toString()\n );\n\n const latest = source.map(async (s, i) => {\n if (s.isOracle) {\n const [oracleName, oraclePeriod, oracleAsset] = s.asOracle;\n\n const oracleKey = [oracleAsset.toString(), assets[i]]\n .map((a) => Number(a))\n .sort((a, b) => a - b);\n\n const oracleEntry = await this.api.query.emaOracle.oracles<\n Option<ITuple<[PalletEmaOracleOracleEntry, u32]>>\n >(oracleName, oracleKey, oraclePeriod);\n const [{ price, updatedAt }] = oracleEntry.unwrap();\n\n const priceNum = price.n.toString();\n const priceDenom = price.d.toString();\n\n return oracleAsset.toString() === oracleKey[0].toString()\n ? [[priceNum, priceDenom], updatedAt.toString()]\n : [[priceDenom, priceNum], updatedAt.toString()];\n } else {\n return [s.asValue.map((p) => p.toString()), blockNumber];\n }\n });\n return Promise.all(latest);\n }\n\n private getPoolAddress(poolId: string) {\n const pool = Number(poolId);\n const name = StableMath.getPoolAddress(pool);\n return encodeAddress(blake2AsHex(name), HYDRADX_SS58_PREFIX);\n }\n\n private getPoolLimits(): PoolLimits {\n const minTradingLimit =\n this.api.consts.stableswap.minTradingLimit.toJSON() as number;\n return {\n maxInRatio: 0,\n maxOutRatio: 0,\n minTradingLimit: minTradingLimit,\n } as PoolLimits;\n }\n}\n", "import { LbpPool, LbpPoolBase } from './lbp';\nimport { OmniPool, OmniPoolBase } from './omni';\nimport { StableSwap, StableSwapBase } from './stable';\nimport { XykPool } from './xyk';\nimport { AavePool } from './aave';\n\nimport { Pool, PoolBase, PoolType } from './types';\n\nexport class PoolFactory {\n static get(pool: PoolBase): Pool {\n switch (pool.type) {\n case PoolType.Aave:\n return AavePool.fromPool(pool);\n case PoolType.XYK:\n return XykPool.fromPool(pool);\n case PoolType.Omni:\n return OmniPool.fromPool(pool as OmniPoolBase);\n case PoolType.LBP:\n return LbpPool.fromPool(pool as LbpPoolBase);\n case PoolType.Stable:\n return StableSwap.fromPool(pool as StableSwapBase);\n default: {\n throw new Error('Pool type ' + pool.type + ' is not supported yet');\n }\n }\n }\n}\n", "export interface IQueue<T> {\n enqueue(item: T): void;\n dequeue(): T | undefined;\n size(): number;\n}\n\nexport class Queue<T> implements IQueue<T> {\n private storage: T[] = [];\n\n constructor(private capacity: number = Infinity) {}\n\n enqueue(item: T): void {\n if (this.size() === this.capacity) {\n throw Error('Queue has reached max capacity, you cannot add more items');\n }\n this.storage.push(item);\n }\n\n dequeue(): T | undefined {\n return this.storage.shift();\n }\n\n size(): number {\n return this.storage.length;\n }\n}\n", "import { Queue } from '../../utils/Queue';\n\nexport type Path = Node[];\nexport type Node = [id: number, from: string];\n\nconst MAX_SIZE_OF_PATH = 5;\n\n/**\n * Breadth First Search.\n *\n * - uses Queue to find the shortest path\n * - slower than DFS (Depth First Search)\n * - better when dst is closer to src\n * - complexity O(N+E) where N are nodes and E are edges\n */\nexport class Bfs {\n /**\n * Check if current node is present in path or traversal within the same pool was already done\n *\n * @param x - current node\n * @param path - path\n * @returns true if node in path, otherwise false\n */\n isNotVisited(x: Node, path: Path): boolean {\n let notVisited: boolean = true;\n path.forEach((pv) => {\n if (pv[0] === x[0] || pv[1] === x[1]) {\n notVisited = false;\n }\n });\n return notVisited;\n }\n\n /**\n * Finding paths in graph from given source to destination\n *\n * @param g - routes graph containing nodes & corresponding edges\n * @param src - source node\n * @param dst - destination node or null if requesting all posible paths from src\n * @returns paths\n */\n findPaths(g: Map<number, Path>, src: number, dst: number | null): Path[] {\n // Store the result paths\n const paths: Path[] = [];\n // Store the traversing paths\n const queue = new Queue<Path>();\n // Store the current path\n const currentPath: Path = [];\n\n // First node of path has no from (initial)\n currentPath.push([src, '']);\n queue.enqueue(currentPath);\n\n while (queue.size() > 0) {\n const path = queue.dequeue();\n\n if (path == null) {\n return paths;\n }\n\n // Max number of edges to get from src to dst\n if (path.length > MAX_SIZE_OF_PATH) {\n return paths;\n }\n\n const last = path[path.length - 1];\n\n // If destination is undefined save all traversal to paths\n // If last node is the desired destination save to paths\n if (dst === null) {\n paths.push(path);\n } else if (last[0] === dst) {\n paths.push(path);\n }\n\n // Traverse to all nodes connected to current one and push path to queue\n const lastNode = g.get(last[0]);\n lastNode?.forEach((segment) => {\n if (this.isNotVisited(segment, path)) {\n const newpath = [...path];\n newpath.push(segment);\n queue.enqueue(newpath);\n }\n });\n }\n return paths;\n }\n\n /**\n * Build and populate graph\n *\n * @param nodes - list of pool assets\n * @param edges - list of all edges [id, from, to] between assets\n * @returns - traversal graph\n */\n buildAndPopulateGraph(\n nodes: string[],\n edges: [string, string, string][]\n ): Map<number, Path> {\n const graph = new Map<number, Path>();\n for (let node of nodes) {\n graph.set(parseInt(node), []);\n }\n for (const [address, from, to] of edges) {\n const fromNumber = parseInt(from);\n const toNumber = parseInt(to);\n graph.get(fromNumber)?.push([toNumber, address]);\n }\n return graph;\n }\n}\n", "import { PoolBase } from '../../pool';\n\nexport type Edge = [address: string, from: string, to: string];\n\nexport type NodeEdges = {\n [node: string]: Edge[];\n};\n\n/**\n * Calculate nodes & edges from substrate pools\n *\n * @param pools - given substrate pools\n * @returns nodes & corresponding edges\n */\nexport function getNodesAndEdges(pools: PoolBase[]): NodeEdges {\n const edgesFromNode: NodeEdges = {};\n for (const pool of pools) {\n const n = pool.tokens.length;\n for (let i = 0; i < n; i++) {\n if (!edgesFromNode[pool.tokens[i].id]) {\n edgesFromNode[pool.tokens[i].id] = [];\n }\n for (let j = 0; j < n; j++) {\n if (i == j) continue;\n const edge: Edge = [pool.address, pool.tokens[i].id, pool.tokens[j].id];\n edgesFromNode[pool.tokens[i].id].push(edge);\n }\n }\n }\n return edgesFromNode;\n}\n", "import { Bfs, Node, Path } from './bfs';\nimport { getNodesAndEdges, Edge } from './graph';\n\nimport { PoolBase } from '../../pool';\n\nexport class RouteSuggester {\n /**\n * Proposals are ideal paths from\n * 1) tokenIn to tokenOut\n * 2) tokenIn to *(all possible paths are requested)\n *\n * calculated from all permutations of tokens of given pools.\n *\n * E.g. permutation of pool A={1,3} is 2, such as {1,3}, {3,1} where 1 are 3\n * are pool assets(tokens)\n *\n * Filtering of valid paths and corresponding asset pairs is done by router itself!!!\n *\n * @param tokenIn - tokenIn\n * @param tokenOut - tokenOut or null if all possible paths from tokenIn are requested\n * @param pools - substrate based pools\n * @returns all possible path proposals\n */\n getProposals(\n tokenIn: string,\n tokenOut: string | null,\n pools: PoolBase[]\n ): Edge[][] {\n const nodeEdges = getNodesAndEdges(pools);\n const poolAssets = Object.keys(nodeEdges);\n const possiblePairs: Edge[] = poolAssets\n .map((node) => nodeEdges[node])\n .flat();\n const bfs = new Bfs();\n const bfsGraph = bfs.buildAndPopulateGraph(poolAssets, possiblePairs);\n const possiblePaths = bfs.findPaths(\n bfsGraph,\n parseInt(tokenIn),\n tokenOut ? parseInt(tokenOut) : null\n );\n return this.parsePaths(possiblePaths);\n }\n\n private parsePaths(possiblePaths: Path[]): Edge[][] {\n const paths: Edge[][] = [];\n for (const path of possiblePaths) {\n const edges: Edge[] = [];\n for (let i = 0; i < path.length; i++) {\n const from = path[i];\n const to = path[i + 1];\n if (to == null) {\n break;\n } else {\n edges.push(this.toEdge(from, to));\n }\n }\n paths.push(edges);\n }\n return paths;\n }\n\n private toEdge(from: Node, to: Node): Edge {\n return [to[1], from[0].toString(), to[0].toString()] as Edge;\n }\n}\n", "import { Edge, RouteSuggester } from './route';\n\nimport {\n Hop,\n IPoolService,\n Pool,\n PoolBase,\n PoolFactory,\n PoolType,\n} from '../pool';\nimport { Asset } from '../types';\n\nexport type RouterOptions = {\n includeOnly?: PoolType[];\n};\n\nexport class Router {\n private readonly routeSuggester: RouteSuggester;\n private readonly routerOptions: RouterOptions;\n protected readonly poolService: IPoolService;\n\n private readonly defaultRouterOptions: RouterOptions = {\n includeOnly: [],\n };\n\n /**\n * @param poolService - Fetch pool data from substrate based pools\n * @param routerOptions - Optional router options\n */\n constructor(poolService: IPoolService, routerOptions?: RouterOptions) {\n this.poolService = poolService;\n this.routeSuggester = new RouteSuggester();\n this.routerOptions = {\n ...this.defaultRouterOptions,\n ...routerOptions,\n };\n }\n\n /**\n * Return all pools\n *\n * @returns {PoolBase[]} List of all substrate based pools\n */\n async getPools(): Promise<PoolBase[]> {\n const includeOnly = this.routerOptions.includeOnly;\n return await this.poolService.getPools(includeOnly);\n }\n\n /**\n * Return list of all available assets from substrate based pools\n *\n * @returns {Asset[]} List of all available assets\n */\n async getAllAssets(): Promise<Asset[]> {\n const pools = await this.getPools();\n if (pools.length === 0) throw new Error('No pools configured');\n const asset = await this.getAssets(pools);\n return [...new Map(asset).values()];\n }\n\n /**\n * Calculate and return list of all assets, given token can be trade with\n *\n * @param {string} asset - Storage key of asset\n * @returns {Asset[]} List of all available assets, given token can be trade with\n */\n async getAssetPairs(asset: string): Promise<Asset[]> {\n const pools = await this.getPools();\n if (pools.length === 0) throw new Error('No pools configured');\n const { assets, poolsMap } = await this.validateToken(asset, pools);\n const hops = this.getPaths(asset, null, poolsMap, pools);\n const dest = hops.map((hop) => hop[hop.length - 1].assetOut);\n return this.toAssets([...new Set(dest)], assets);\n }\n\n /**\n * Calculate and return all possible paths for best swap assetIn>assetOut\n *\n * @param {string} assetIn - Storage key of assetIn\n * @param {string} assetOut - Storage key of assetOut\n * @returns {<Hop[][]>} All possible paths containing route hops\n */\n async getAllPaths(assetIn: string, assetOut: string): Promise<Hop[][]> {\n const pools = await this.getPools();\n if (pools.length === 0) throw new Error('No pools configured');\n const { poolsMap } = await this.validateTokenPair(assetIn, assetOut, pools);\n return this.getPaths(assetIn, assetOut, poolsMap, pools);\n }\n\n /**\n * Return map of all available assets from substrate based pools\n *\n * @param pools - pools\n * @returns Map of all available assets\n */\n protected async getAssets(pools: PoolBase[]): Promise<Map<string, Asset>> {\n const assets = pools\n .map((pool: PoolBase) =>\n pool.tokens.map((t) => {\n return {\n id: t.id,\n name: t.name,\n symbol: t.symbol,\n decimals: t.decimals,\n icon: t.icon,\n type: t.type,\n isSufficient: t.isSufficient,\n existentialDeposit: t.existentialDeposit,\n meta: t.meta,\n location: t.location,\n isWhiteListed: t.isWhiteListed,\n } as Asset;\n })\n )\n .flat();\n return new Map(assets.map((asset) => [asset.id, asset]));\n }\n /**\n * Calculate and return all possible paths for best swap assetIn>assetOut\n *\n * @param assetIn - Storage key of assetIn\n * @param assetOut - Storage key of assetOut\n * @param poolsMap - pools map\n * @param pools - pools\n * @returns All possible paths containing route hops\n */\n protected getPaths(\n assetIn: string,\n assetOut: string | null,\n poolsMap: Map<string, Pool>,\n pools: PoolBase[]\n ): Hop[][] {\n const routeProposals = this.routeSuggester.getProposals(\n assetIn,\n assetOut,\n pools\n );\n const routes = routeProposals\n .filter((path: Edge[]) => this.validPath(path, poolsMap))\n .map((path: Edge[]) => this.toHops(path, poolsMap));\n return routes;\n }\n\n /**\n * Ckeck if input asset pair is valid and throw expection if not\n *\n * @param assetIn - Storage key of assetIn\n * @param assetOut - Storage key of assetOut\n * @returns Pool assets & map\n */\n protected async validateTokenPair(\n assetIn: string,\n assetOut: string,\n pools: PoolBase[]\n ) {\n const assets = await this.getAssets(pools);\n if (assets.get(assetIn) == null)\n throw new Error(assetIn + ' is not supported token');\n if (assets.get(assetOut) == null)\n throw new Error(assetOut + ' is not supported token');\n const poolsMap = this.getPoolMap(pools);\n return { assets, poolsMap };\n }\n\n /**\n * Ckeck if input asset is valid and throw exception if not\n *\n * @param token - Storage key of token\n * @returns Pool assets & map\n */\n protected async validateToken(token: string, pools: PoolBase[]) {\n const assets = await this.getAssets(pools);\n if (assets.get(token) == null)\n throw new Error(token + ' is not supported token');\n const poolsMap = this.getPoolMap(pools);\n return { assets, poolsMap };\n }\n\n /**\n * Create pool map from substrate based pools\n */\n private getPoolMap(pools: PoolBase[]): Map<string, Pool> {\n return new Map<string, Pool>(\n pools.map((i) => [i.address, PoolFactory.get(i)])\n );\n }\n\n /**\n * Check if path is valid -> all edges are valid token pairs\n *\n * @param proposedPath - proposed path\n * @param poolsMap - pools map\n * @returns only valid paths\n */\n private validPath(\n proposedPath: Edge[],\n poolsMap: Map<string, Pool>\n ): boolean {\n return (\n proposedPath.length > 0 &&\n proposedPath\n .map((edge: Edge) => this.validEdge(edge, poolsMap))\n .reduce((prev, curr) => prev && curr)\n );\n }\n\n /**\n * Check if edge (token pair) of corresponding pool is valid combination\n *\n * @param edge - current edge (token pair)\n * @param poolsMap - pools map\n * @returns true if edge (token pair) is valid, otherwise false\n */\n private validEdge(\n [address, from, to]: Edge,\n poolsMap: Map<string, Pool>\n ): boolean {\n return poolsMap.get(address)?.validatePair(from, to) || false;\n }\n\n private toHops(path: Edge[], poolsMap: Map<string, Pool>): Hop[] {\n return path.map(([address, from, to]: Edge) => {\n const pool = poolsMap.get(address);\n return {\n poolAddress: address,\n poolId: pool?.id,\n pool: pool?.type,\n assetIn: from,\n assetOut: to,\n } as Hop;\n });\n }\n\n private toAssets(tokens: string[], assets: Map<string, Asset>): Asset[] {\n return tokens.map((token) => assets.get(token)!);\n }\n}\n", "import { BigNumber, bnum, ONE } from './bignumber';\n\nconst PCT_100 = bnum('100');\n\n/**\n * Percentage Difference Formula\n *\n * (|\uD835\uDC491\u2212\uD835\uDC492| / [(\uD835\uDC491+\uD835\uDC492)/2]) \u00D7 100\n *\n * This formula calculates the percentage difference by comparing\n * the absolute difference between the two values with their <b>average</b>.\n *\n * Usage: It's used when you want to find the percentage difference between\n * two quantities where both quantities are significant.\n *\n * @param v1 - 1st value\n * @param v2 - 2nd value\n * @returns Difference between two values in relation to their average\n */\nexport function calculateDiffToAvg(v1: BigNumber, v2: BigNumber): BigNumber {\n const impact = v1.minus(v2).abs().div(v1.plus(v2).div(2)).multipliedBy(100);\n return impact.decimalPlaces(2);\n}\n\n/**\n * Percentage Difference Formula (Relative Change)\n *\n * ((Vfin-Vref) / Vref) * 100\n *\n * This formula calculates the percentage difference by comparing\n * the absolute difference between the two values with the <b>reference value</b>.\n *\n * Usage: This formula isn't suitable for finding percentage differences\n * when the values being compared are not reference and final values of the\n * same quantity.\n *\n * @param vFin - final value\n * @param vRef - reference value\n * @returns Difference between a final value and a reference value in relation to the reference value\n */\nexport function calculateDiffToRef(\n vFin: BigNumber,\n vRef: BigNumber\n): BigNumber {\n const impact = vFin.minus(vRef).div(vRef).multipliedBy(100);\n return impact.decimalPlaces(2);\n}\n\n/**\n * The total fee paid for a \u2018sell\u2019 transaction\n * Suppose the trader is selling X for Y\n *\n * fee = 1 - (deltaY / delta0Y)\n *\n * @param delta0Y - the amount out if fees are zero\n * @param deltaY - the amount out if the existing nonzero fees are included in the calculation\n */\nexport function calculateSellFee(delta0Y: BigNumber, deltaY: BigNumber) {\n const total = ONE.minus(deltaY.div(delta0Y));\n return total.multipliedBy(100).decimalPlaces(2);\n}\n\n/**\n * The total fee paid for a \u2018buy\u2018 transaction\n * Suppose the trader is buying Y using X\n *\n * fee = (deltaX / delta0X) - 1\n *\n * @param delta0X - the amount in if fees are zero\n * @param deltaX - the amount in, inclusive of fees\n */\nexport function calculateBuyFee(delta0X: BigNumber, deltaX: BigNumber) {\n const total = deltaX.div(delta0X).minus(ONE);\n return total.multipliedBy(100).decimalPlaces(2);\n}\n\n/**\n * Get % fraction from amount\n *\n * @param value - amount\n * @param pct - percentage value\n * @returns fraction of given amount\n */\nexport function getFraction(value: BigNumber, pct: number): BigNumber {\n if (pct < 0.01 || pct > 100) {\n new Error('Supported range is from 0.01% - 100%');\n }\n const fraction = value.div(PCT_100).multipliedBy(pct);\n return fraction.decimalPlaces(0, 1);\n}\n", "import type { Hop, PoolBuy, PoolError, PoolSell } from '../pool';\nimport type { BigNumber } from '../utils/bignumber';\n\nexport interface Humanizer {\n toHuman(): any;\n}\n\nexport type Swap = Hop &\n Humanizer & {\n assetInDecimals: number;\n assetOutDecimals: number;\n amountIn: BigNumber;\n amountOut: BigNumber;\n spotPrice: BigNumber;\n tradeFeePct: number;\n tradeFeeRange?: [number, number];\n priceImpactPct: number;\n errors: PoolError[];\n isSupply(): boolean;\n isWithdraw(): boolean;\n };\n\nexport type SellSwap = Swap & PoolSell;\nexport type BuySwap = Swap & PoolBuy;\n\nexport enum TradeType {\n Buy = 'Buy',\n Sell = 'Sell',\n}\n\nexport interface Trade extends Humanizer {\n type: TradeType;\n amountIn: BigNumber;\n amountOut: BigNumber;\n spotPrice: BigNumber;\n tradeFee: BigNumber;\n tradeFeePct: number;\n priceImpactPct: number;\n swaps: Swap[];\n}\n", "import { Router } from './Router';\n\nimport { RouteNotFound } from '../errors';\nimport { Hop, Pool, PoolFees, PoolType } from '../pool';\nimport { Amount } from '../types';\nimport { BigNumber, bnum, scale } from '../utils/bignumber';\nimport { toHuman, toPct } from '../utils/mapper';\nimport {\n calculateSellFee,\n calculateBuyFee,\n calculateDiffToRef,\n} from '../utils/math';\n\nimport { BuySwap, SellSwap, Swap, Trade, TradeType } from './types';\n\nexport class TradeRouter extends Router {\n /**\n * Check whether trade is direct or not\n *\n * @param swaps - Trade route\n * @returns true if direct trade, otherwise false\n */\n private isDirectTrade(swaps: Swap[]) {\n return swaps.length == 1;\n }\n\n /**\n * Find best sell swap without errors, if there is none return first one found\n *\n * @param swaps - All possible sell routes\n * @returns best sell swap if exist, otherwise first one found\n */\n private findBestSellRoute(swaps: SellSwap[][]): SellSwap[] {\n const sortedResults = swaps.sort((a, b) => {\n const swapAFinal = a[a.length - 1].amountOut;\n const swapBFinal = b[b.length - 1].amountOut;\n return swapAFinal.isGreaterThan(swapBFinal) ? -1 : 1;\n });\n\n return (\n sortedResults.find((route: SellSwap[]) =>\n route.every((swap: SellSwap) => swap.errors.length == 0)\n ) || sortedResults[0]\n );\n }\n\n /**\n * Return route fee range [min,max] in case pool is using dynamic fees\n *\n * @param swaps - Trade routes\n * @returns min & max fee range if swap through the pool with dynamic fees support\n */\n private getRouteFeeRange(swaps: Swap[]): [number, number] | undefined {\n const hasDynFee = swaps.filter((s: Swap) => s.tradeFeeRange).length > 0;\n if (hasDynFee) {\n const min = swaps\n .map((s: Swap) => s.tradeFeeRange?.[0] ?? s.tradeFeePct)\n .reduce((a: number, b: number) => a + b);\n const max = swaps\n .map((s: Swap) => s.tradeFeeRange?.[1] ?? s.tradeFeePct)\n .reduce((a: number, b: number) => a + b);\n return [min, max];\n }\n }\n\n /**\n * Return pool fee range [min,max] in case pool is using dynamic fees\n *\n * @param fees - Pool fees\n * @returns min & max fee range if swap through the pool with dynamic fees support\n */\n private getPoolFeeRange(fees: PoolFees): [number, number] | undefined {\n const feeMin = fees.min ? toPct(fees.min) : undefined;\n const feeMax = fees.max ? toPct(fees.max) : undefined;\n if (feeMin && feeMax) {\n return [feeMin, feeMax];\n }\n return undefined;\n }\n\n /**\n * Calculate and return best possible sell trade for assetIn>assetOut\n *\n * @param {string} assetIn - Storage key of assetIn\n * @param {string} assetOut - Storage key of assetOut\n * @param {BigNumber} amountIn - Amount of assetIn to sell for assetOut\n * @returns Best possible sell trade of given token pair\n */\n async getBestSell(\n assetIn: string,\n assetOut: string,\n amountIn: BigNumber | string | number\n ): Promise<Trade> {\n return this.getSell(assetIn, assetOut, amountIn);\n }\n\n /**\n * Calculate and return sell trade for assetIn>assetOut\n *\n * @param {string} assetIn - Storage key of assetIn\n * @param {string} assetOut - Storage key of assetOut\n * @param {BigNumber} amountIn - Amount of assetIn to sell for assetOut\n * @param {Hop[]} route - Explicit route to use for trade\n * @returns Sell trade of given token pair\n */\n async getSell(\n assetIn: string,\n assetOut: string,\n amountIn: BigNumber | string | number,\n route?: Hop[]\n ): Promise<Trade> {\n const pools = await super.getPools();\n if (pools.length === 0) throw new Error('No pools configured');\n const { poolsMap } = await super.validateTokenPair(\n assetIn,\n assetOut,\n pools\n );\n const paths = super.getPaths(assetIn, assetOut, poolsMap, pools);\n if (paths.length === 0) throw new RouteNotFound(assetIn, assetOut);\n\n let swaps: SellSwap[];\n if (route) {\n swaps = await this.toSellSwaps(amountIn, route, poolsMap);\n } else {\n const routesPromises = paths.map(\n async (path) => await this.toSellSwaps(amountIn, path, poolsMap)\n );\n const routes = await Promise.all(routesPromises);\n swaps = this.findBestSellRoute(routes);\n }\n\n const firstSwap = swaps[0];\n const lastSwap = swaps[swaps.length - 1];\n const isDirect = this.isDirectTrade(swaps);\n\n const spotPrice = swaps\n .map((s: SellSwap) => s.spotPrice.shiftedBy(-1 * s.assetOutDecimals))\n .reduce((a: BigNumber, b: BigNumber) => a.multipliedBy(b));\n\n const bestRouteSpotPrice = scale(spotPrice, lastSwap.assetOutDecimals);\n\n const delta0Y = isDirect\n ? lastSwap.calculatedOut\n : this.calculateDelta0Y(firstSwap.amountIn, swaps, poolsMap);\n const deltaY = lastSwap.amountOut;\n\n const tradeFeePct = isDirect\n ? lastSwap.tradeFeePct\n : calculateSellFee(delta0Y, deltaY).toNumber();\n const tradeFee = delta0Y.minus(deltaY);\n const tradeFeeRange = this.getRouteFeeRange(swaps);\n\n const swapAmount = firstSwap.amountIn\n .shiftedBy(-1 * firstSwap.assetInDecimals)\n .multipliedBy(bestRouteSpotPrice);\n\n const bestRoutePriceImpact = calculateDiffToRef(delta0Y, swapAmount);\n\n return {\n type: TradeType.Sell,\n amountIn: firstSwap.amountIn,\n amountOut: lastSwap.amountOut,\n spotPrice: bestRouteSpotPrice,\n tradeFee: tradeFee,\n tradeFeePct: tradeFeePct,\n tradeFeeRange: tradeFeeRange,\n priceImpactPct: bestRoutePriceImpact.toNumber(),\n swaps: swaps,\n toHuman() {\n return {\n type: TradeType.Sell,\n amountIn: toHuman(firstSwap.amountIn, firstSwap.assetInDecimals),\n amountOut: toHuman(lastSwap.amountOut, lastSwap.assetOutDecimals),\n spotPrice: toHuman(bestRouteSpotPrice, lastSwap.assetOutDecimals),\n tradeFee: toHuman(tradeFee, lastSwap.assetOutDecimals),\n tradeFeePct: tradeFeePct,\n tradeFeeRange: tradeFeeRange,\n priceImpactPct: bestRoutePriceImpact.toNumber(),\n swaps: swaps.map((s: SellSwap) => s.toHuman()),\n };\n },\n } as Trade;\n }\n\n /**\n * Calculate the amount out for best possible trade if fees are zero\n *\n * @param amountIn - Amount of assetIn to sell for assetOut\n * @param bestRoute - Best possible trade route (sell)\n * @param poolsMap - Pools map\n * @returns the amount out for best possible trade if fees are zero\n */\n private calculateDelta0Y(\n amountIn: BigNumber,\n bestRoute: SellSwap[],\n poolsMap: Map<string, Pool>\n ) {\n const amounts: BigNumber[] = [];\n for (let i = 0; i < bestRoute.length; i++) {\n const swap = bestRoute[i];\n const pool = poolsMap.get(swap.poolAddress);\n if (pool == null) throw new Error('Pool does not exit');\n const poolPair = pool.parsePair(swap.assetIn, swap.assetOut);\n let aIn: BigNumber;\n if (i > 0) {\n aIn = amounts[i - 1];\n } else {\n aIn = amountIn;\n }\n const calculatedOut = pool.calculateOutGivenIn(poolPair, aIn);\n amounts.push(calculatedOut);\n }\n return amounts[amounts.length - 1];\n }\n\n /**\n * Calculate and return sell swaps for given path\n * - final amount of previous swap is entry to next one\n *\n * @param amountIn - Amount of assetIn to sell for assetOut\n * @param path - Current path\n * @param poolsMap - Pools map\n * @returns Sell swaps for given path with corresponding pool pairs\n */\n private async toSellSwaps(\n amountIn: BigNumber | string | number,\n path: Hop[],\n poolsMap: Map<string, Pool>\n ): Promise<SellSwap[]> {\n const swaps: SellSwap[] = [];\n for (let i = 0; i < path.length; i++) {\n const hop = path[i];\n const pool = poolsMap.get(hop.poolAddress);\n if (pool == null) throw new Error('Pool does not exit');\n\n const poolPair = pool.parsePair(hop.assetIn, hop.assetOut);\n\n let aIn: BigNumber;\n if (i > 0) {\n aIn = swaps[i - 1].amountOut;\n } else {\n aIn = scale(bnum(amountIn), poolPair.decimalsIn).decimalPlaces(0, 1);\n }\n\n const poolFees = await this.poolService.getPoolFees(poolPair, pool);\n const { amountOut, calculatedOut, feePct, errors } = pool.validateAndSell(\n poolPair,\n aIn,\n poolFees\n );\n const feePctRange = this.getPoolFeeRange(poolFees);\n const spotPrice = pool.spotPriceOutGivenIn(poolPair);\n const swapAmount = aIn\n .shiftedBy(-1 * poolPair.decimalsIn)\n .multipliedBy(spotPrice);\n const priceImpactPct = calculateDiffToRef(calculatedOut, swapAmount);\n\n swaps.push({\n ...hop,\n assetInDecimals: poolPair.decimalsIn,\n assetOutDecimals: poolPair.decimalsOut,\n amountIn: aIn,\n calculatedOut: calculatedOut,\n amountOut: amountOut,\n spotPrice: spotPrice,\n tradeFeePct: feePct,\n tradeFeeRange: feePctRange,\n priceImpactPct: priceImpactPct.toNumber(),\n errors: errors,\n isSupply() {\n return (\n pool.type === PoolType.Aave && pool.tokens[0].id === hop.assetIn\n );\n },\n isWithdraw() {\n return (\n pool.type === PoolType.Aave && pool.tokens[1].id === hop.assetIn\n );\n },\n toHuman() {\n return {\n ...hop,\n amountIn: toHuman(aIn, poolPair.decimalsIn),\n calculatedOut: toHuman(calculatedOut, poolPair.decimalsOut),\n amountOut: toHuman(amountOut, poolPair.decimalsOut),\n spotPrice: toHuman(spotPrice, poolPair.decimalsOut),\n tradeFeePct: feePct,\n tradeFeeRange: feePctRange,\n priceImpactPct: priceImpactPct.toNumber(),\n errors: errors,\n };\n },\n } as SellSwap);\n }\n return swaps;\n }\n\n /**\n * Calculate and return most liquid route for tokenIn>tokenOut\n *\n * To avoid routing through the pools with low liquidity, 0.1% from the\n * most liquid pool asset is used as reference value to determine the\n * sweet spot.\n *\n * @param {string} assetIn - Storage key of tokenIn\n * @param {string} assetOut - Storage key of tokenOut\n * @return Most liquid route of given token pair\n */\n async getMostLiquidRoute(assetIn: string, assetOut: string): Promise<Hop[]> {\n const pools = await super.getPools();\n const { poolsMap } = await super.validateTokenPair(\n assetIn,\n assetOut,\n pools\n );\n const paths = super.getPaths(assetIn, assetOut, poolsMap, pools);\n if (paths.length === 0) {\n throw new RouteNotFound(assetIn, assetOut);\n }\n\n // Get pools with assetIn (except virtual shares)\n const assetInPools = pools.filter((pool) =>\n pool.tokens.some((t) => t.id === assetIn && t.id !== pool.id)\n );\n\n // Get liquidity of assetIn sorted by DESC\n const assetInLiquidityDesc = assetInPools\n .map((p) => {\n return p.type === PoolType.Aave\n ? p.tokens\n : p.tokens.filter((t) => t.id === assetIn);\n })\n .map((t) => {\n return t\n .map((t) => bnum(t.balance).shiftedBy(-1 * t.decimals))\n .reduce((a, b) => a.plus(b));\n })\n .sort((a, b) => (b.isLessThan(a) ? -1 : 1));\n\n const liquidity = assetInLiquidityDesc[0];\n const liquidityIn = liquidity.div(100).multipliedBy(0.1);\n const routesPromises = paths.map(\n async (path) => await this.toSellSwaps(liquidityIn, path, poolsMap)\n );\n const routes = await Promise.all(routesPromises);\n const route = this.findBestSellRoute(routes);\n return route.map((r) => {\n return {\n poolAddress: r.poolAddress,\n poolId: r?.poolId,\n pool: r.pool,\n assetIn: r.assetIn,\n assetOut: r.assetOut,\n } as Hop;\n });\n }\n\n /**\n * Calculate and return best possible spot price for tokenIn>tokenOut\n *\n * @param {string} assetIn - Storage key of tokenIn\n * @param {string} assetOut - Storage key of tokenOut\n * @return Best possible spot price of given token pair, or undefined if given pair trade not supported\n */\n async getBestSpotPrice(\n assetIn: string,\n assetOut: string\n ): Promise<Amount | undefined> {\n const pools = await super.getPools();\n if (pools.length === 0) throw new Error('No pools configured');\n const { poolsMap } = await super.validateTokenPair(\n assetIn,\n assetOut,\n pools\n );\n const paths = super.getPaths(assetIn, assetOut, poolsMap, pools);\n if (paths.length === 0) {\n return Promise.resolve(undefined);\n }\n\n const route = await this.getMostLiquidRoute(assetIn, assetOut);\n const swaps = await this.toSellSwaps('1', route, poolsMap);\n\n const spotPrice = swaps\n .map((s: SellSwap) => s.spotPrice.shiftedBy(-1 * s.assetOutDecimals))\n .reduce((a: BigNumber, b: BigNumber) => a.multipliedBy(b));\n const spotPriceDecimals = swaps[swaps.length - 1].assetOutDecimals;\n const spotPriceAmount = scale(spotPrice, spotPriceDecimals);\n return { amount: spotPriceAmount, decimals: spotPriceDecimals };\n }\n\n /**\n * Find best buy swap without errors, if there is none return first one found\n *\n * @param swaps - All possible sell routes\n * @returns best sell swap if exist, otherwise first one found\n */\n private findBestBuyRoute(swaps: BuySwap[][]): BuySwap[] {\n const sortedResults = swaps.sort((a, b) => {\n const swapAFinal = a[0].amountIn;\n const swapBFinal = b[0].amountIn;\n return swapAFinal.isGreaterThan(swapBFinal) ? 1 : -1;\n });\n\n return (\n sortedResults.find((route: BuySwap[]) =>\n route.every((swap: BuySwap) => swap.errors.length == 0)\n ) || sortedResults[0]\n );\n }\n\n /**\n * Calculate and return best possible buy trade for assetIn>assetOut\n *\n * @param {string} assetIn - Storage key of assetIn\n * @param {string} assetOut - Storage key of assetOut\n * @param {BigNumber} amountOut - Amount of tokenOut to buy for tokenIn\n * @returns Best possible buy trade of given token pair\n */\n async getBestBuy(\n assetIn: string,\n assetOut: string,\n amountOut: BigNumber | string | number\n ): Promise<Trade> {\n return this.getBuy(assetIn, assetOut, amountOut);\n }\n\n /**\n * Calculate and return buy trade for assetIn>assetOut\n *\n * @param {string} assetIn - Storage key of assetIn\n * @param {string} assetOut - Storage key of assetOut\n * @param {BigNumber} amountOut - Amount of tokenOut to buy for tokenIn\n * @param {Hop[]} route - Explicit route to use for trade\n * @returns Buy trade of given token pair\n */\n async getBuy(\n assetIn: string,\n assetOut: string,\n amountOut: BigNumber | string | number,\n route?: Hop[]\n ): Promise<Trade> {\n const pools = await super.getPools();\n if (pools.length === 0) throw new Error('No pools configured');\n const { poolsMap } = await super.validateTokenPair(\n assetIn,\n assetOut,\n pools\n );\n const paths = super.getPaths(assetIn, assetOut, poolsMap, pools);\n if (paths.length === 0) throw new RouteNotFound(assetIn, assetOut);\n\n let swaps: BuySwap[];\n if (route) {\n swaps = await this.toBuySwaps(amountOut, route, poolsMap);\n } else {\n const routesPromises = paths.map(\n async (path) => await this.toBuySwaps(amountOut, path, poolsMap)\n );\n const routes = await Promise.all(routesPromises);\n swaps = this.findBestBuyRoute(routes);\n }\n\n const firstSwap = swaps[swaps.length - 1];\n const lastSwap = swaps[0];\n const isDirect = this.isDirectTrade(swaps);\n\n const spotPrice = swaps\n .map((s: BuySwap) => s.spotPrice.shiftedBy(-1 * s.assetInDecimals))\n .reduce((a: BigNumber, b: BigNumber) => a.multipliedBy(b));\n\n const bestRouteSpotPrice = scale(spotPrice, lastSwap.assetInDecimals);\n\n const delta0X = isDirect\n ? lastSwap.calculatedIn\n : this.calculateDelta0X(firstSwap.amountOut, swaps, poolsMap);\n const deltaX = lastSwap.amountIn;\n\n const tradeFeePct = isDirect\n ? lastSwap.tradeFeePct\n : calculateBuyFee(delta0X, deltaX).toNumber();\n const tradeFee = deltaX.minus(delta0X);\n const tradeFeeRange = this.getRouteFeeRange(swaps);\n\n const swapAmount = firstSwap.amountOut\n .shiftedBy(-1 * firstSwap.assetOutDecimals)\n .multipliedBy(bestRouteSpotPrice);\n\n let bestRoutePriceImpact: number;\n if (delta0X.isZero()) {\n bestRoutePriceImpact = -100;\n } else {\n bestRoutePriceImpact = calculateDiffToRef(swapAmount, delta0X).toNumber();\n }\n\n return {\n type: TradeType.Buy,\n amountOut: firstSwap.amountOut,\n amountIn: lastSwap.amountIn,\n spotPrice: bestRouteSpotPrice,\n tradeFee: tradeFee,\n tradeFeePct: tradeFeePct,\n tradeFeeRange: tradeFeeRange,\n priceImpactPct: bestRoutePriceImpact,\n swaps: swaps,\n toHuman() {\n return {\n type: TradeType.Buy,\n amountOut: toHuman(firstSwap.amountOut, firstSwap.assetOutDecimals),\n amountIn: toHuman(lastSwap.amountIn, lastSwap.assetInDecimals),\n spotPrice: toHuman(bestRouteSpotPrice, lastSwap.assetInDecimals),\n tradeFee: toHuman(tradeFee, lastSwap.assetInDecimals),\n tradeFeePct: tradeFeePct,\n tradeFeeRange: tradeFeeRange,\n priceImpactPct: bestRoutePriceImpact,\n swaps: swaps.map((s: BuySwap) => s.toHuman()),\n };\n },\n } as Trade;\n }\n\n /**\n * Calculate the amount in for best possible trade if fees are zero\n *\n * @param amountOut - Amount of assetOut to buy for assetIn\n * @param bestRoute - Best possible trade route (buy)\n * @param poolsMap - Pools map\n * @returns the amount in for best possible trade if fees are zero\n */\n private calculateDelta0X(\n amountOut: BigNumber,\n bestRoute: BuySwap[],\n poolsMap: Map<string, Pool>\n ) {\n const amounts: BigNumber[] = [];\n for (let i = bestRoute.length - 1; i >= 0; i--) {\n const swap = bestRoute[i];\n const pool = poolsMap.get(swap.poolAddress);\n if (pool == null) throw new Error('Pool does not exit');\n const poolPair = pool.parsePair(swap.assetIn, swap.assetOut);\n let aOut: BigNumber;\n if (i == bestRoute.length - 1) {\n aOut = amountOut;\n } else {\n aOut = amounts[0];\n }\n const calculatedIn = pool.calculateInGivenOut(poolPair, aOut);\n amounts.unshift(calculatedIn);\n }\n return amounts[0];\n }\n\n /**\n * Calculate and return buy swaps for given path\n * - final amount of previous swap is entry to next one\n * - calculation is done backwards (swaps in reversed order)\n *\n * @param amountOut - Amount of assetOut to buy for assetIn\n * @param path - Current path\n * @param poolsMap - Pools map\n * @returns Buy swaps for given path\n */\n private async toBuySwaps(\n amountOut: BigNumber | string | number,\n path: Hop[],\n poolsMap: Map<string, Pool>\n ): Promise<BuySwap[]> {\n const swaps: BuySwap[] = [];\n for (let i = path.length - 1; i >= 0; i--) {\n const hop = path[i];\n const pool = poolsMap.get(hop.poolAddress);\n if (pool == null) throw new Error('Pool does not exit');\n\n const poolPair = pool.parsePair(hop.assetIn, hop.assetOut);\n\n let aOut: BigNumber;\n if (i == path.length - 1) {\n aOut = scale(bnum(amountOut), poolPair.decimalsOut).decimalPlaces(0, 1);\n } else {\n aOut = swaps[0].amountIn;\n }\n\n const poolFees = await this.poolService.getPoolFees(poolPair, pool);\n const { amountIn, calculatedIn, feePct, errors } = pool.validateAndBuy(\n poolPair,\n aOut,\n poolFees\n );\n const feePctRange = this.getPoolFeeRange(poolFees);\n const spotPrice = pool.spotPriceInGivenOut(poolPair);\n\n const swapAmount = aOut\n .shiftedBy(-1 * poolPair.decimalsOut)\n .multipliedBy(spotPrice);\n let priceImpactPct: number;\n if (calculatedIn.isZero()) {\n priceImpactPct = -100;\n } else {\n priceImpactPct = calculateDiffToRef(\n swapAmount,\n calculatedIn\n ).toNumber();\n }\n\n swaps.unshift({\n ...hop,\n assetInDecimals: poolPair.decimalsIn,\n assetOutDecimals: poolPair.decimalsOut,\n amountOut: aOut,\n calculatedIn: calculatedIn,\n amountIn: amountIn,\n spotPrice: spotPrice,\n tradeFeePct: feePct,\n tradeFeeRange: feePctRange,\n priceImpactPct: priceImpactPct,\n errors: errors,\n isSupply() {\n return (\n pool.type === PoolType.Aave && pool.tokens[0].id === hop.assetIn\n );\n },\n isWithdraw() {\n return (\n pool.type === PoolType.Aave && pool.tokens[1].id === hop.assetIn\n );\n },\n toHuman() {\n return {\n ...hop,\n amountOut: toHuman(aOut, poolPair.decimalsOut),\n calculatedIn: toHuman(calculatedIn, poolPair.decimalsIn),\n amountIn: toHuman(amountIn, poolPair.decimalsIn),\n spotPrice: toHuman(spotPrice, poolPair.decimalsIn),\n tradeFeePct: feePct,\n tradeFeeRange: feePctRange,\n priceImpactPct: priceImpactPct,\n errors: errors,\n };\n },\n } as BuySwap);\n }\n return swaps;\n }\n}\n", "import { ApiPromise } from '@polkadot/api';\nimport { type SubmittableExtrinsic } from '@polkadot/api/promise/types';\n\nimport { encodeFunctionData } from 'viem';\n\nimport { PolkadotApiClient, SubstrateTransaction } from '../api';\nimport { BalanceClient } from '../client';\nimport {\n AAVE_POOL_ABI,\n AAVE_GAS_LIMIT,\n AAVE_POOL_PROXY,\n AAVE_ROUNDING_THRESHOLD,\n AAVE_UINT_256_MAX,\n} from '../aave';\nimport { EvmClient } from '../evm';\nimport { Hop, PoolType } from '../pool';\n\nimport { ERC20 } from '../utils/erc20';\nimport { H160 } from '../utils/h160';\nimport { getFraction } from '../utils/math';\n\nimport { Swap, Trade, TradeType } from './types';\n\nexport class TradeUtils extends PolkadotApiClient {\n private balanceClient: BalanceClient;\n private evmClient: EvmClient;\n\n constructor(api: ApiPromise) {\n super(api);\n this.balanceClient = new BalanceClient(api);\n this.evmClient = new EvmClient();\n }\n\n buildBuyTx(trade: Trade, slippagePct = 1): SubstrateTransaction {\n if (trade.type !== TradeType.Buy) throw new Error('Not permitted');\n\n const { amountIn, amountOut, swaps } = trade;\n\n const firstSwap = swaps[0];\n const lastSwap = swaps[swaps.length - 1];\n\n const slippage = getFraction(amountIn, slippagePct);\n\n const assetIn = firstSwap.assetIn;\n const assetOut = lastSwap.assetOut;\n const maxAmountIn = amountIn.plus(slippage);\n\n let tx: SubmittableExtrinsic;\n\n if (this.isDirectOmnipoolTrade(swaps)) {\n tx = this.api.tx.omnipool.buy(\n assetOut,\n assetIn,\n amountOut.toFixed(),\n maxAmountIn.toFixed()\n );\n } else {\n tx = this.api.tx.router.buy(\n assetIn,\n assetOut,\n amountOut.toFixed(),\n maxAmountIn.toFixed(),\n this.buildRoute(swaps)\n );\n }\n\n return {\n hex: tx.toHex(),\n name: 'RouterBuy',\n get: () => tx,\n dryRun: (account: string) => this.dryRun(account, tx),\n } as SubstrateTransaction;\n }\n\n buildSellTx(trade: Trade, slippagePct = 1): SubstrateTransaction {\n if (trade.type !== TradeType.Sell) throw new Error('Not permitted');\n\n const { amountIn, amountOut, swaps } = trade;\n\n const firstSwap = swaps[0];\n const lastSwap = swaps[swaps.length - 1];\n\n const slippage = getFraction(amountOut, slippagePct);\n\n const assetIn = firstSwap.assetIn;\n const assetOut = lastSwap.assetOut;\n const minAmountOut = amountOut.minus(slippage);\n\n let tx: SubmittableExtrinsic;\n\n if (this.isDirectOmnipoolTrade(swaps)) {\n tx = this.api.tx.omnipool.sell(\n assetIn,\n assetOut,\n amountIn.toFixed(),\n minAmountOut.toFixed()\n );\n } else {\n tx = this.api.tx.router.sell(\n assetIn,\n assetOut,\n amountIn.toFixed(),\n minAmountOut.toFixed(),\n this.buildRoute(swaps)\n );\n }\n\n return {\n hex: tx.toHex(),\n name: 'RouterSell',\n get: () => tx,\n dryRun: (account: string) => this.dryRun(account, tx),\n } as SubstrateTransaction;\n }\n\n buildSellAllTx(trade: Trade, slippagePct = 1): SubstrateTransaction {\n if (trade.type !== TradeType.Sell) throw new Error('Not permitted');\n\n const { amountOut, swaps } = trade;\n\n const firstSwap = swaps[0];\n const lastSwap = swaps[swaps.length - 1];\n\n const slippage = getFraction(amountOut, slippagePct);\n\n const assetIn = firstSwap.assetIn;\n const assetOut = lastSwap.assetOut;\n const minAmountOut = amountOut.minus(slippage);\n\n const tx: SubmittableExtrinsic = this.api.tx.router.sellAll(\n assetIn,\n assetOut,\n minAmountOut.toFixed(),\n this.buildRoute(swaps)\n );\n\n return {\n hex: tx.toHex(),\n name: 'RouterSellAll',\n get: () => tx,\n dryRun: (account: string) => this.dryRun(account, tx),\n } as SubstrateTransaction;\n }\n\n async buildWithdrawAndSellReserveTx(\n beneficiary: string,\n trade: Trade,\n slippagePct = 1\n ): Promise<SubstrateTransaction> {\n const { amountIn, amountOut, swaps } = trade;\n\n const firstSwap = swaps[0];\n const lastSwap = swaps[swaps.length - 1];\n\n if (!firstSwap.isWithdraw()) throw new Error('Not permitted');\n\n const aToken = firstSwap.assetIn;\n const reserve = firstSwap.assetOut;\n\n const [gasPrice, aTokenBalance] = await Promise.all([\n this.evmClient.getProvider().getGasPrice(),\n this.balanceClient.getBalance(beneficiary, aToken),\n ]);\n\n const isMax = amountIn.isGreaterThanOrEqualTo(\n aTokenBalance.minus(AAVE_ROUNDING_THRESHOLD)\n );\n\n const gasPriceMargin = (gasPrice * 10n) / 100n;\n\n const to = H160.fromAny(beneficiary);\n const amount = isMax ? AAVE_UINT_256_MAX : BigInt(amountIn.toFixed());\n const asset = ERC20.fromAssetId(reserve);\n\n const withdrawCalldata = encodeFunctionData({\n abi: AAVE_POOL_ABI,\n functionName: 'withdraw',\n args: [asset as `0x${string}`, amount, to as `0x${string}`],\n });\n\n const withdrawTx: SubmittableExtrinsic = this.api.tx.evm.call(\n to,\n AAVE_POOL_PROXY,\n withdrawCalldata,\n 0n,\n AAVE_GAS_LIMIT,\n gasPrice + gasPriceMargin,\n gasPrice + gasPriceMargin,\n null,\n []\n );\n\n const slippage = getFraction(amountOut, slippagePct);\n const assetIn = reserve;\n const assetOut = lastSwap.assetOut;\n const minAmountOut = amountOut.minus(slippage);\n\n const reserveSellTx: SubmittableExtrinsic = this.api.tx.router.sell(\n assetIn,\n assetOut,\n amountIn.minus(AAVE_ROUNDING_THRESHOLD).toFixed(),\n minAmountOut.toFixed(),\n this.buildRoute(swaps.slice(1))\n );\n\n const tx = this.api.tx.utility.batchAll([withdrawTx, reserveSellTx]);\n return {\n hex: tx.toHex(),\n name: 'WithdrawAndRouterReserveSell',\n get: () => tx,\n dryRun: (account: string) => this.dryRun(account, tx),\n } as SubstrateTransaction;\n }\n\n buildRoute(swaps: Swap[]) {\n return swaps.map(({ assetIn, assetOut, pool, poolId }: Hop) => {\n if (pool === PoolType.Stable) {\n return {\n pool: {\n Stableswap: poolId,\n },\n assetIn,\n assetOut,\n };\n }\n return {\n pool,\n assetIn,\n assetOut,\n };\n });\n }\n\n isDirectOmnipoolTrade(swaps: Swap[]): boolean {\n return swaps.length === 1 && swaps[0].pool === PoolType.Omni;\n }\n}\n"],
5
+ "mappings": "AAAO,IAAMA,EAAgB,CAC3B,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,UACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,OACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,aACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,SACd,KAAM,eACN,KAAM,QACR,CACF,EACA,KAAM,SACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,UACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,OACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,KACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,SACN,KAAM,SACR,CACF,EACA,KAAM,WACN,KAAM,OACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,QACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,KACN,KAAM,SACR,CACF,EACA,KAAM,WACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,UACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,OACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,aACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,kCACd,KAAM,mBACN,KAAM,OACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,aACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,SACd,KAAM,eACN,KAAM,QACR,CACF,EACA,KAAM,SACN,KAAM,OACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,QACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,mBACN,KAAM,SACR,EACA,CACE,aAAc,SACd,KAAM,eACN,KAAM,QACR,EACA,CACE,aAAc,UACd,KAAM,aACN,KAAM,SACR,CACF,EACA,KAAM,SACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,UACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,OACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,UACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,OACd,KAAM,aACN,KAAM,MACR,CACF,EACA,KAAM,QACN,KAAM,OACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,OACN,KAAM,SACR,CACF,EACA,KAAM,qBACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,sBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,gBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,uBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,8BACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,MACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,eACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,CACF,ECrQO,IAAMC,GAA8B,CACzC,CACE,OAAQ,CACN,CACE,aAAc,+BACd,KAAM,6CACN,KAAM,SACR,EACA,CACE,aAAc,+BACd,KAAM,oDACN,KAAM,SACR,CACF,EACA,gBAAiB,aACjB,KAAM,aACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,oBACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,cACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,WACN,KAAM,SACR,CACF,EACA,KAAM,kBACN,QAAS,CACP,CACE,aAAc,SACd,KAAM,GACN,KAAM,QACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,kCACd,KAAM,WACN,KAAM,SACR,CACF,EACA,KAAM,kBACN,QAAS,CACP,CACE,WAAY,CACV,CACE,aAAc,UACd,KAAM,kBACN,KAAM,SACR,EACA,CACE,aAAc,SACd,KAAM,OACN,KAAM,QACR,EACA,CACE,aAAc,SACd,KAAM,SACN,KAAM,QACR,EACA,CACE,aAAc,UACd,KAAM,WACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,sBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,8BACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,0BACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,gBACN,KAAM,SACR,EACA,CACE,aAAc,OACd,KAAM,2BACN,KAAM,MACR,EACA,CACE,aAAc,OACd,KAAM,mBACN,KAAM,MACR,EACA,CACE,aAAc,OACd,KAAM,0BACN,KAAM,MACR,EACA,CACE,aAAc,OACd,KAAM,WACN,KAAM,MACR,EACA,CACE,aAAc,OACd,KAAM,WACN,KAAM,MACR,EACA,CACE,aAAc,UACd,KAAM,iBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,sBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,gBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,qBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,mBACN,KAAM,SACR,EACA,CACE,aAAc,SACd,KAAM,sBACN,KAAM,QACR,EACA,CACE,aAAc,UACd,KAAM,gBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,yBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,2BACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,8BACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,qBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,2BACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,oBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,gCACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,0BACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,iCACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,cACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,qBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,qBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,mBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,mBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,uBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,yBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,oBACN,KAAM,SACR,EACA,CACE,aAAc,OACd,KAAM,WACN,KAAM,MACR,EACA,CACE,aAAc,OACd,KAAM,oBACN,KAAM,MACR,EACA,CACE,aAAc,UACd,KAAM,oBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,WACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,yBACN,KAAM,SACR,EACA,CACE,aAAc,OACd,KAAM,mBACN,KAAM,MACR,EACA,CACE,aAAc,UACd,KAAM,cACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,sBACN,KAAM,SACR,EACA,CACE,aAAc,QACd,KAAM,kBACN,KAAM,OACR,EACA,CACE,aAAc,UACd,KAAM,YACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,YACN,KAAM,SACR,EACA,CACE,aAAc,SACd,KAAM,WACN,KAAM,QACR,EACA,CACE,aAAc,SACd,KAAM,4BACN,KAAM,QACR,EACA,CACE,aAAc,SACd,KAAM,wBACN,KAAM,QACR,EACA,CACE,aAAc,UACd,KAAM,mBACN,KAAM,SACR,EACA,CACE,aAAc,SACd,KAAM,aACN,KAAM,QACR,EACA,CACE,aAAc,OACd,KAAM,wBACN,KAAM,MACR,CACF,EACA,aAAc,uDACd,KAAM,GACN,KAAM,SACR,EACA,CACE,WAAY,CACV,CACE,aAAc,UACd,KAAM,8BACN,KAAM,SACR,EACA,CACE,aAAc,SACd,KAAM,oCACN,KAAM,QACR,EACA,CACE,aAAc,SACd,KAAM,6BACN,KAAM,QACR,EACA,CACE,aAAc,QACd,KAAM,gCACN,KAAM,OACR,CACF,EACA,aAAc,gDACd,KAAM,GACN,KAAM,OACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,kCACd,KAAM,WACN,KAAM,SACR,CACF,EACA,KAAM,kBACN,QAAS,CACP,CACE,aAAc,YACd,KAAM,GACN,KAAM,WACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,kCACd,KAAM,WACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,OACN,KAAM,SACR,CACF,EACA,KAAM,sBACN,QAAS,CACP,CACE,WAAY,CACV,CACE,aAAc,UACd,KAAM,kBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,sBACN,KAAM,SACR,EACA,CACE,aAAc,OACd,KAAM,iCACN,KAAM,MACR,EACA,CACE,aAAc,UACd,KAAM,mBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,qBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,sBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,kCACN,KAAM,SACR,CACF,EACA,aAAc,iDACd,KAAM,GACN,KAAM,SACR,EACA,CACE,aAAc,QACd,KAAM,GACN,KAAM,OACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EAC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F,EACZ,YAAaC,EACb,gBAAiBC,CACnB,CACF,CACF,ECrNA,OACE,0BAAAC,GACA,+BAAAC,GACA,0BAAAC,GACA,+BAAAC,GACA,4BAAAC,GACA,wBAAAC,GACA,6BAAAC,GACA,oBAAAC,GACA,2BAAAC,GACA,gCAAAC,GACA,8BAAAC,GACA,mBAAAC,GACA,kBAAAC,GACA,4BAAAC,GACA,+BAAAC,GACA,yBAAAC,GACA,4BAAAC,GACA,oBAAAC,OACK,iCAIA,IAAMC,EAAN,KAAe,CACpB,OAAO,mBACLC,EACAC,EACAC,EACAC,EACQ,CACR,OAAOC,GACLJ,EACAC,EACAC,EACAC,CACF,CACF,CAEA,OAAO,uBACLE,EACAC,EACQ,CACR,OAAOC,GAA0BF,EAAcC,CAAe,CAChE,CAEA,OAAO,oBACLN,EACAC,EACAO,EACAN,EACAC,EACAM,EACAC,EACAC,EACAC,EACQ,CACR,OAAOC,GACLb,EACAC,EACAO,EACAN,EACAC,EACAM,EACAC,EACAC,EACAC,CACF,CACF,CAEA,OAAO,wBACLV,EACAC,EACAM,EACAC,EACAC,EACQ,CACR,OAAOG,GACLZ,EACAC,EACAM,EACAC,EACAC,CACF,CACF,CAEA,OAAO,oBACLX,EACAC,EACAO,EACAN,EACAC,EACAM,EACAM,EACAJ,EACAC,EACQ,CACR,OAAOI,GACLhB,EACAC,EACAO,EACAN,EACAC,EACAM,EACAM,EACAJ,EACAC,CACF,CACF,CAEA,OAAO,wBACLV,EACAC,EACAM,EACAC,EACAC,EACQ,CACR,OAAOM,GACLf,EACAC,EACAM,EACAC,EACAC,CACF,CACF,CAEA,OAAO,sBACLO,EACAC,EACAC,EACQ,CACR,OAAOC,GAAyBH,EAAQC,EAAcC,CAAc,CACtE,CAEA,OAAO,gBACLE,EACAhB,EACAiB,EACAR,EACQ,CACR,OAAOS,GACLF,EACAhB,EACAiB,EACAR,CACF,CACF,CAEA,OAAO,sBACLO,EACAhB,EACAiB,EACAE,EACAC,EACAC,EACAC,EACAC,EACQ,CACR,OAAOC,GACLR,EACAhB,EACAiB,EACAE,EACAC,EA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eAAeC,EAA6B,CACjD,OAAOH,GAAkBG,CAAO,CAClC,CAEA,OAAO,YAAYC,EAAc,CAC/B,IAAMC,EAAO,CAAC,EACd,QAASC,EAAI,EAAGA,EAAIF,EAAME,IACxBD,EAAK,KAAK,CAAC,IAAK,GAAG,CAAC,EAEtB,OAAOA,CACT,CAEA,OAAO,uBACLE,EACAC,EACAC,EACAC,EACAC,EACA,CACA,OAAOlB,GACLc,EACAC,EACAC,EACAC,EACAC,CACF,CACF,CAEA,OAAO,oBACLC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAZ,EACQ,CACR,OAAOd,GACLqB,EACAC,EACAC,EACAC,EACAC,EACAC,EACAZ,CACF,CACF,CAEA,OAAO,qBACLO,EACAM,EACAL,EACAG,EACAG,EACAF,EACAZ,EACA,CACA,OAAOX,GACLkB,EACAM,EACAL,EACAG,EACAG,EACAF,EACAZ,CACF,CACF,CAEA,OAAO,yBACLO,EACAC,EACAO,EACAJ,EACAG,EACAF,EACAZ,EACA,CACA,OAAOP,GACLc,EACAC,EACAO,EACAJ,EACAG,EACAF,EACAZ,CACF,CACF,CAEA,OAAO,oBACLO,EACAC,EACAC,EACAO,EACAL,EACAC,EACAZ,EACQ,CACR,OAAOb,GACLoB,EACAC,EACAC,EACAO,EACAL,EACAC,EACAZ,CACF,CACF,CAEA,OAAO,8BACLO,EACAM,EACAJ,EACAE,EACAG,EACAG,EACAjB,EACA,CACA,OAAOV,GACLiB,EACAM,EACAJ,EACAE,EACAG,EACAG,EACAjB,CACF,CACF,CAEA,OAAO,gBACLO,EACAW,EACAP,EACAG,EACAF,EACAZ,EACA,CACA,OAAOR,GACLe,EACAW,EACAP,EACAG,EACAF,EACAZ,CACF,CACF,CAEA,OAAO,0BACLmB,EACAZ,EACAI,EACAH,EACAC,EACAK,EACAF,EACAZ,EACQ,CACR,OAAON,GACLyB,EACAZ,EACAI,EACAH,EACAC,EACAK,EACAF,EACAZ,CACF,CACF,CAEA,OAAO,sBACLe,EACAK,EACAC,EACQ,CACR,OAAO9B,GAAyBwB,EAAQK,EAAcC,CAAc,CAC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",
6
+ "names": ["AAVE_POOL_ABI", "AAVE_POOL_DATA_PROVIDER_ABI", "AAVE_POOL_PROXY", "AAVE_POOL_DATA_PROVIDER", "AAVE_LENDING_POOL_ADDRESS", "AAVE_GAS_LIMIT", "AAVE_UINT_256_MAX", "defineChain", "rpcHttpList", "rpcWebsocketList", "evmMainnet", "createPublicClient", "createWalletClient", "custom", "http", "webSocket", "EvmClient", "chain", "evmMainnet", "createPublicClient", "http", "webSocket", "address", "createWalletClient", "custom", "AaveClient", "EvmClient", "AAVE_POOL_DATA_PROVIDER_ABI", "AAVE_POOL_DATA_PROVIDER", "AAVE_LENDING_POOL_ADDRESS", "user", "AAVE_POOL_ABI", "AAVE_POOL_PROXY", "decodeAddress", "encodeAddress", "hexToU8a", "isHex", "u8aToHex", "Buffer", "BASILISK_PARACHAIN_ID", "DENOMINATOR", "HUB_ASSET_ID", "HYDRADX_PARACHAIN_ID", "HYDRADX_SS58_PREFIX", "RUNTIME_DECIMALS", "SYSTEM_ASSET_ID", "SYSTEM_ASSET_DECIMALS", "TRADEABLE_DEFAULT", "prefixBytes", "Buffer", "isEvmAccount", "address", "pub", "decodeAddress", "isEvmAddress", "isSs58Address", "bytes", "isHex", "hexToU8a", "encodeAddress", "H160", "_H160", "addressBytes", "slicedBytes", "u8aToHex", "ERC20", "assetId", "id", "evmAddressBuffer", "address", "addressBuffer", "PREFIX_BUFFER", "BigNumber", "DECIMAL_PLACES", "ZERO", "bnum", "ONE", "INFINITY", "scale", "input", "decimalPlaces", "scalePow", "scaleMul", "val", "RAY", "bnum", "TARGET_WITHDRAW_HF", "AaveUtils", "AaveClient", "user", "to", "H160", "poolReserves", "userReserves", "userData", "pReserves", "uReserves", "userEmodeCategoryId", "totalCollateralBase", "totalDebtBase", "_availableBorrowsBase", "_currentLiquidationThreshold", "_ltv", "healthFactor", "hf", "BigNumber", "totalCollateral", "totalDebt", "reserves", "uReserve", "reserveAsset", "pReserve", "underlyingAsset", "scaledABalance", "liquidityIndex", "priceInRef", "aTokenBalance", "reserveLiquidationThreshold", "isCollateral", "reserveId", "ERC20", "_totalCollateralBase", "_totalDebtBase", "reserve", "withdrawAmount", "reserveCtx", "r", "decimals", "withdrawAmountNative", "scale", "withdrawRef", "ZERO", "adjustedCollateral", "supplyAmount", "supplyRef", "newCollateral", "result", "amount", "requiredCollateral", "withdrawableRef", "withdrawableTokens", "PolkadotApiClient", "api", "account", "extrinsic", "result", "e", "message", "optionalParams", "debug", "value", "AssetClient", "PolkadotApiClient", "api", "entries", "id", "value", "decimals", "symbol", "chainToken", "tokenKey", "details", "metadata", "location", "SYSTEM_ASSET_ID", "defaultAssetEd", "name", "assetType", "isSufficient", "existentialDeposit", "bond", "underlyingAsset", "maturity", "bondMaturity", "bondFormatter", "bondName", "share", "assets", "poolEntries", "asset", "token", "meta", "symbols", "external", "ext", "a", "_args", "state", "includeInvalid", "assetLocations", "shares", "bonds", "legacyMetadata", "supportedAssets", "assetsWithMeta", "decimalSign", "type", "BalanceClient", "PolkadotApiClient", "api", "account", "assetId", "asset", "assetType", "SYSTEM_ASSET_ID", "data", "free", "reserved", "frozen", "address", "onChange", "assets", "callArgs", "a", "balances", "result", "i", "freeBalance", "token", "supported", "getErc20Balance", "balance", "miscFrozen", "feeFrozen", "freeBN", "BigNumber", "miscFrozenBN", "feeFrozenBN", "maxFrozenBN", "fixed_from_rational", "GenericAccountId32", "u8aConcat", "isAddress", "FarmClient", "PolkadotApiClient", "api", "BalanceClient", "BigNumber", "assetId", "activeYieldFarmIds", "storageKey", "option", "globalFarmIdRaw", "yieldFarmId", "globalFarmId", "globalFarm", "yieldFarm", "priceAdjustment", "potAddress", "rewardCurrency", "balance", "incentivizedAsset", "orderedAssets", "res", "data", "n", "d", "oraclePrice", "fixed_from_rational", "totalSharesZ", "yieldPerPeriod", "maxRewardPerPeriod", "priceAdjustemnt", "globalRewardPerPeriod", "multiplier", "value", "length", "u8aConcat", "registry", "sub", "isXyk", "TYPE_ID", "PALLET_ID", "GenericAccountId32", "id", "type", "isAddress", "blockTime", "farms", "potBalance", "plannedYieldingPeriods", "blocksPerPeriod", "periodsPerYear", "apr", "distributedRewards", "maxRewards", "potMaxRewards", "ZERO", "acc", "PoolNotFound", "poolType", "PoolConfigNotFound", "param", "RouteNotFound", "assetIn", "assetOut", "AssetNotFound", "asset", "StorageConfigNotFound", "SubscriptionNotSupported", "subscriptionType", "ProviderConfigNotFound", "message", "LRUCache", "memoize1", "PoolType", "PoolError", "AavePool", "_AavePool", "pool", "address", "tokens", "maxInRation", "maxOutRatio", "minTradeLimit", "_tokenIn", "_tokenOut", "tokenIn", "tokenOut", "tokensMap", "token", "tokenInMeta", "tokenOutMeta", "balanceIn", "bnum", "balanceOut", "ZERO", "poolPair", "amountOut", "_fees", "calculatedIn", "errors", "amountIn", "calculatedOut", "_poolPair", "scale", "ONE", "_amount", "encodeAddress", "stringToU8a", "decodeEventLog", "findNestedKey", "obj", "keyToFind", "foundObj", "_", "nestedValue", "findNestedObj", "valToFind", "bnFormatter", "memoize1", "TLRUCache", "PoolClient", "BalanceClient", "TLRUCache", "mem", "memoize1", "api", "p", "assets", "asset", "type", "pool", "poolSubs", "subChange", "tokenSub", "subSystem", "subErc20", "unsub", "fn", "poolAddr", "isNotStableswap", "t", "canUpdate", "balances", "token", "balance", "tokenIndex", "SYNC_MM_EVENTS", "AavePoolClient", "PoolClient", "reserve", "atoken", "liqudityIn", "liqudityOut", "_poolPair", "_address", "id", "encodeAddress", "stringToU8a", "pool", "reserveId", "events", "record", "event", "eventKey", "assetIn", "assetOut", "aIn", "aOut", "log", "eventName", "args", "decodeEventLog", "AAVE_POOL_ABI", "aToken", "t", "balance", "findNestedKey", "ERC20", "calculate_in_given_out", "calculate_out_given_in", "calculate_linear_weights", "calculate_pool_trade_fee", "get_spot_price", "LbpMath", "balanceA", "balanceB", "weightA", "weightB", "amount", "balanceIn", "balanceOut", "weightIn", "weightOut", "amountOut", "amountIn", "start", "end", "initialWeight", "finalWeight", "at", "feeNumerator", "feeDenominator", "toHuman", "amount", "decimals", "toPct", "fee", "toDecimals", "toPoolFee", "permill", "LbpPool", "_LbpPool", "pool", "address", "tokens", "maxInRation", "maxOutRatio", "minTradeLimit", "fee", "repayFeeApply", "_tokenIn", "_tokenOut", "tokenIn", "tokenOut", "tokensMap", "token", "tokenInMeta", "tokenOutMeta", "balanceIn", "bnum", "balanceOut", "poolPair", "amountOut", "fees", "feeAsset", "errors", "poolOutReserve", "feePct", "toPct", "amountOutPlusFee", "calculatedIn", "poolInReserve", "amountIn", "calculatedOut", "price", "LbpMath", "priceBN", "ZERO", "scale", "ONE", "amount", "LbpPoolClient", "PoolClient", "scale", "bnum", "poolData", "validationData", "relayParentNumber", "pools", "_", "state", "id", "poolAddress", "poolDelta", "_poolPair", "address", "pool", "inactivePoolIndex", "p", "poolEntry", "relayBlockNumber", "start", "end", "assets", "initialWeight", "finalWeight", "repayTarget", "feeCollector", "linearWeight", "LbpMath", "accumulated", "distributed", "accumulatedAsset", "accumulatedWeight", "distributedAsset", "distributedWeight", "repayFeeApplied", "accumulatedBalance", "distributedBalance", "assetKey", "repayFeeTarget", "maxInRatio", "maxOutRatio", "minTradingLimit", "calculate_in_given_out", "calculate_lrna_in_given_out", "calculate_out_given_in", "calculate_out_given_lrna_in", "calculate_pool_trade_fee", "calculate_spot_price", "calculate_lrna_spot_price", "calculate_shares", "calculate_liquidity_out", "calculate_liquidity_lrna_out", "calculate_liquidity_hub_in", "is_sell_allowed", "is_buy_allowed", "is_add_liquidity_allowed", "is_remove_liquidity_allowed", "recalculate_asset_fee", "recalculate_protocol_fee", "verify_asset_cap", "OmniMath", "assetInBalance", "assetInHubReserve", "assetOutBalance", "assetOutHubReserve", "calculate_spot_price", "assetBalance", "assetHubReserve", "calculate_lrna_spot_price", "assetInShares", "assetOutShares", "amountOut", "assetFee", "protocolFee", "calculate_in_given_out", "calculate_lrna_in_given_out", "amountIn", "calculate_out_given_in", "calculate_out_given_lrna_in", "amount", "feeNumerator", "feeDenominator", "calculate_pool_trade_fee", "assetReserve", "assetShares", "calculate_shares", "positionAmount", "positionShares", "positionPrice", "sharesToRemove", "withdrawalFee", "calculate_liquidity_out", "calculate_liquidity_lrna_out", "assetCap", "totalHubReserve", "qi", "BigNumber", "ri", "q", "percentage", "numerator", "denominator", "calculate_liquidity_hub_in", "bits", "is_sell_allowed", "is_buy_allowed", "is_add_liquidity_allowed", "is_remove_liquidity_allowed", "oracleAmountIn", "oracleAmountOut", "oracleLiquidity", "oraclePeriod", "currentAssetLiquidity", "previousFee", "blocDifference", "minFee", "maxFee", "decay", "amplification", "recalculate_asset_fee", "recalculate_protocol_fee", "hubAdded", "verify_asset_cap", "OmniPool", "_OmniPool", "pool", "address", "tokens", "maxInRation", "maxOutRatio", "minTradeLimit", "hubAssetId", "_tokenIn", "tokenOut", "tokenIn", "tokensMap", "token", "tokenInMeta", "tokenOutMeta", "balanceIn", "bnum", "balanceOut", "assetInED", "assetOutED", "poolPair", "amountOut", "fees", "calculatedIn", "amountIn", "fee", "feePct", "ZERO", "errors", "isSellAllowed", "OmniMath", "isBuyAllowed", "poolOutReserve", "poolInReserve", "calculatedOut", "price", "toDecimals", "priceBN", "encodeAddress", "stringToU8a", "OmniPoolClient", "PoolClient", "hubAssetId", "poolAddress", "assets", "hubAssetTradeability", "hubAssetBalance", "poolTokens", "id", "state", "hubReserve", "shares", "tradable", "cap", "protocolShares", "balance", "bnum", "tokens", "poolPair", "_address", "feeAsset", "protocolAsset", "oracleName", "oraclePeriod", "oracleKey", "asset", "SYSTEM_ASSET_ID", "HUB_ASSET_ID", "blockNumber", "dynamicFees", "oracleAssetFee", "oracleProtocolFee", "assetFeeMin", "assetFee", "assetFeeMax", "protocolFeeMin", "protocolFee", "protocolFeeMax", "min", "max", "toPoolFee", "pool", "assetsArgs", "t", "states", "i", "token", "unwrapped", "tokenState", "dynamicFee", "oracle", "assetOut", "balanceOut", "minFee", "maxFee", "decay", "amplification", "feeMin", "feeMax", "entry", "timestamp", "blockDifference", "oracleAmountIn", "oracleAmountOut", "oracleLiquidity", "feePrev", "fee", "OmniMath", "toDecimals", "assetIn", "balanceIn", "encodeAddress", "stringToU8a", "maxInRatio", "maxOutRatio", "minTradingLimit", "calculate_in_given_out", "calculate_out_given_in", "calculate_pool_trade_fee", "get_spot_price", "calculate_liquidity_in", "calculate_shares", "calculate_spot_price", "calculate_spot_price_with_fee", "calculate_liquidity_out_asset_a", "calculate_liquidity_out_asset_b", "XykMath", "balanceA", "balanceB", "amount", "balanceIn", "balanceOut", "amountOut", "amountIn", "feeNumerator", "feeDenominator", "reserveA", "reserveB", "amountA", "totalShares", "shares", "XykPool", "_XykPool", "pool", "address", "tokens", "maxInRation", "maxOutRatio", "minTradeLimit", "_tokenIn", "_tokenOut", "tokenIn", "tokenOut", "tokensMap", "token", "tokenInMeta", "tokenOutMeta", "balanceIn", "bnum", "balanceOut", "assetInED", "assetOutED", "poolPair", "amountOut", "fees", "calculatedIn", "fee", "feePct", "toPct", "amountIn", "errors", "poolOutReserve", "poolInReserve", "calculatedOut", "price", "XykMath", "priceBN", "ZERO", "base", "scale", "ONE", "amount", "XykPoolClient", "PoolClient", "pools", "id", "state", "poolAddress", "assetA", "assetB", "assetABalance", "assetBBalance", "_poolPair", "_address", "_pool", "maxInRatio", "maxOutRatio", "minTradingLimit", "calculate_in_given_out", "calculate_out_given_in", "calculate_amplification", "calculate_add_one_asset", "calculate_liquidity_out_one_asset", "calculate_pool_trade_fee", "calculate_shares", "calculate_shares_for_amount", "calculate_spot_price_with_fee", "pool_account_name", "recalculate_peg", "StableMath", "assetId", "size", "pegs", "i", "initialAmp", "finalAmp", "initialBlock", "finalBlock", "currentBlock", "reserves", "assetIn", "assetOut", "amountOut", "amplification", "fee", "shares", "shareIssuance", "amount", "amountIn", "withdrawFee", "assets", "poolId", "feeNumerator", "feeDenominator", "currentPegs", "targetPegs", "maxPegUpdate", "poolFee", "StableSwap", "_StableSwap", "pool", "address", "tokens", "maxInRation", "maxOutRatio", "minTradeLimit", "amplification", "id", "fee", "totalIssuance", "pegs", "pegsFee", "_tokenIn", "_tokenOut", "tokenIn", "tokenOut", "tokensMap", "token", "tokenInMeta", "tokenOutMeta", "balanceIn", "bnum", "balanceOut", "assetInED", "assetOutED", "poolPair", "amountOut", "fees", "calculatedIn", "amountIn", "feePct", "toPct", "errors", "isSellAllowed", "OmniMath", "isBuyAllowed", "calculatedOut", "price", "StableMath", "toDecimals", "ZERO", "priceBN", "spot", "base", "scale", "ONE", "amount", "reserves", "balance", "decimals", "assetId", "asset", "blake2AsHex", "encodeAddress", "AMOUNT_MAX", "StableSwapClient", "PoolClient", "pools", "parachainBlock", "blockNumber", "stablePools", "id", "state", "pool", "poolId", "poolAddress", "poolDelta", "poolTokens", "poolPegs", "toPoolFee", "_poolPair", "address", "stablePool", "poolInfo", "initialAmplification", "finalAmplification", "initialBlock", "finalBlock", "amplification", "StableMath", "totalIssuance", "assets", "a", "tradeability", "balance", "tokens", "defaultFee", "defaultPegs", "pegs", "latestPegs", "recentPegs", "maxPegUpdate", "fee", "updatedFee", "updatedPegs", "updatedFeePermill", "current", "_", "p", "source", "latest", "s", "i", "oracleName", "oraclePeriod", "oracleAsset", "oracleKey", "b", "oracleEntry", "price", "updatedAt", "priceNum", "priceDenom", "name", "encodeAddress", "blake2AsHex", "PoolService", "PolkadotApiClient", "memoize1", "mem", "api", "AssetClient", "AavePoolClient", "XykPoolClient", "OmniPoolClient", "LbpPoolClient", "StableSwapClient", "external", "assets", "c", "includeOnly", "client", "t", "poolPair", "pool", "PoolNotFound", "CachingPoolService", "PoolService", "api", "LRUCache", "_lastHeader", "subsFn", "poolPair", "pool", "key", "fees", "PoolFactory", "pool", "AavePool", "XykPool", "OmniPool", "LbpPool", "StableSwap", "Queue", "capacity", "item", "MAX_SIZE_OF_PATH", "Bfs", "x", "path", "notVisited", "pv", "g", "src", "dst", "paths", "queue", "Queue", "currentPath", "last", "segment", "newpath", "nodes", "edges", "graph", "node", "address", "from", "to", "fromNumber", "toNumber", "getNodesAndEdges", "pools", "edgesFromNode", "pool", "n", "i", "j", "edge", "RouteSuggester", "tokenIn", "tokenOut", "pools", "nodeEdges", "getNodesAndEdges", "poolAssets", "possiblePairs", "node", "bfs", "Bfs", "bfsGraph", "possiblePaths", "paths", "path", "edges", "i", "from", "to", "Router", "poolService", "routerOptions", "RouteSuggester", "includeOnly", "pools", "asset", "assets", "poolsMap", "dest", "hop", "assetIn", "assetOut", "pool", "t", "path", "token", "i", "PoolFactory", "proposedPath", "edge", "prev", "curr", "address", "from", "to", "tokens", "PCT_100", "bnum", "calculateDiffToAvg", "v1", "v2", "calculateDiffToRef", "vFin", "vRef", "calculateSellFee", "delta0Y", "deltaY", "ONE", "calculateBuyFee", "delta0X", "deltaX", "getFraction", "value", "pct", "TradeType", "TradeRouter", "Router", "swaps", "sortedResults", "a", "b", "swapAFinal", "swapBFinal", "route", "swap", "min", "s", "max", "fees", "feeMin", "toPct", "feeMax", "assetIn", "assetOut", "amountIn", "pools", "poolsMap", "paths", "RouteNotFound", "routesPromises", "path", "routes", "firstSwap", "lastSwap", "isDirect", "spotPrice", "bestRouteSpotPrice", "scale", "delta0Y", "deltaY", "tradeFeePct", "calculateSellFee", "tradeFee", "tradeFeeRange", "swapAmount", "bestRoutePriceImpact", "calculateDiffToRef", "toHuman", "bestRoute", "amounts", "i", "pool", "poolPair", "aIn", "calculatedOut", "hop", "bnum", "poolFees", "amountOut", "feePct", "errors", "feePctRange", "priceImpactPct", "liquidityIn", "t", "p", "r", "spotPriceDecimals", "delta0X", "deltaX", "calculateBuyFee", "aOut", "calculatedIn", "encodeFunctionData", "TradeUtils", "PolkadotApiClient", "api", "BalanceClient", "EvmClient", "trade", "slippagePct", "amountIn", "amountOut", "swaps", "firstSwap", "lastSwap", "slippage", "getFraction", "assetIn", "assetOut", "maxAmountIn", "tx", "account", "minAmountOut", "beneficiary", "aToken", "reserve", "gasPrice", "aTokenBalance", "isMax", "gasPriceMargin", "to", "H160", "amount", "AAVE_UINT_256_MAX", "asset", "ERC20", "withdrawCalldata", "encodeFunctionData", "AAVE_POOL_ABI", "withdrawTx", "AAVE_POOL_PROXY", "AAVE_GAS_LIMIT", "reserveSellTx", "pool", "poolId"]
7
+ }