From edee23a7144b94b01591d3bb15d866b2c586acdb Mon Sep 17 00:00:00 2001 From: p7m Date: Mon, 27 Jun 2022 11:12:08 +0200 Subject: [PATCH 1/8] feat: create app using cli --- src/apps/koyo/contracts/index.ts | 14 ++++++++++++++ src/apps/koyo/index.ts | 3 +++ src/apps/koyo/koyo.definition.ts | 30 ++++++++++++++++++++++++++++++ src/apps/koyo/koyo.module.ts | 11 +++++++++++ 4 files changed, 58 insertions(+) create mode 100644 src/apps/koyo/contracts/index.ts create mode 100644 src/apps/koyo/index.ts create mode 100644 src/apps/koyo/koyo.definition.ts create mode 100644 src/apps/koyo/koyo.module.ts diff --git a/src/apps/koyo/contracts/index.ts b/src/apps/koyo/contracts/index.ts new file mode 100644 index 000000000..3caf45747 --- /dev/null +++ b/src/apps/koyo/contracts/index.ts @@ -0,0 +1,14 @@ +import { Injectable, Inject } from '@nestjs/common'; + +import { IAppToolkit, APP_TOOLKIT } from '~app-toolkit/app-toolkit.interface'; +import { ContractFactory } from '~contract/contracts'; +import { Network } from '~types/network.interface'; +// eslint-disable-next-line +type ContractOpts = { address: string; network: Network }; + +@Injectable() +export class KoyoContractFactory extends ContractFactory { + constructor(@Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit) { + super((network: Network) => appToolkit.getNetworkProvider(network)); + } +} diff --git a/src/apps/koyo/index.ts b/src/apps/koyo/index.ts new file mode 100644 index 000000000..246fd1bb4 --- /dev/null +++ b/src/apps/koyo/index.ts @@ -0,0 +1,3 @@ +export { KOYO_DEFINITION, KoyoAppDefinition } from './koyo.definition'; +export { KoyoAppModule } from './koyo.module'; +export { KoyoContractFactory } from './contracts'; diff --git a/src/apps/koyo/koyo.definition.ts b/src/apps/koyo/koyo.definition.ts new file mode 100644 index 000000000..35fd327a0 --- /dev/null +++ b/src/apps/koyo/koyo.definition.ts @@ -0,0 +1,30 @@ +import { Register } from '~app-toolkit/decorators'; +import { appDefinition, AppDefinition } from '~app/app.definition'; +import { AppAction, AppTag } from '~app/app.interface'; +import { Network } from '~types/network.interface'; + +export const KOYO_DEFINITION = appDefinition({ + id: 'koyo', + name: 'Kōyō Finance', + description: 'Kōyō is the first next-generation AMM protocol in the Boba ecosystem.', + url: 'https://koyo.finance', + groups: {}, + tags: [AppTag.DECENTRALIZED_EXCHANGE], + keywords: [], + links: {}, + + supportedNetworks: { + [Network.AVALANCHE_MAINNET]: [AppAction.VIEW], + }, + + primaryColor: '#fff', +}); + +@Register.AppDefinition(KOYO_DEFINITION.id) +export class KoyoAppDefinition extends AppDefinition { + constructor() { + super(KOYO_DEFINITION); + } +} + +export default KOYO_DEFINITION; diff --git a/src/apps/koyo/koyo.module.ts b/src/apps/koyo/koyo.module.ts new file mode 100644 index 000000000..001defc6a --- /dev/null +++ b/src/apps/koyo/koyo.module.ts @@ -0,0 +1,11 @@ +import { Register } from '~app-toolkit/decorators'; +import { AbstractApp } from '~app/app.dynamic-module'; + +import { KoyoContractFactory } from './contracts'; +import { KoyoAppDefinition, KOYO_DEFINITION } from './koyo.definition'; + +@Register.AppModule({ + appId: KOYO_DEFINITION.id, + providers: [KoyoAppDefinition, KoyoContractFactory], +}) +export class KoyoAppModule extends AbstractApp() {} From da3b9dea7878a14a1decaa3930e86dd928b07163 Mon Sep 17 00:00:00 2001 From: p7m Date: Mon, 27 Jun 2022 13:10:38 +0200 Subject: [PATCH 2/8] feat: add koyo finance on boba and boba network to config --- src/apps/koyo/boba/koyo.pool.token-fetcher.ts | 35 + src/apps/koyo/contracts/abis/koyo-pool.json | 367 +++++ src/apps/koyo/contracts/abis/koyo-vault.json | 491 +++++++ src/apps/koyo/contracts/ethers/KoyoPool.ts | 994 ++++++++++++++ src/apps/koyo/contracts/ethers/KoyoVault.ts | 1207 +++++++++++++++++ src/apps/koyo/contracts/ethers/common.ts | 30 + .../ethers/factories/KoyoPool__factory.ts | 919 +++++++++++++ .../ethers/factories/KoyoVault__factory.ts | 1197 ++++++++++++++++ .../koyo/contracts/ethers/factories/index.ts | 5 + src/apps/koyo/contracts/ethers/index.ts | 8 + src/apps/koyo/contracts/index.ts | 14 + .../koyo/helpers/koyo.pool.token-helper.ts | 159 +++ ...o.the-graph.pool-token-address-strategy.ts | 157 +++ src/apps/koyo/koyo.definition.ts | 15 +- src/apps/koyo/koyo.module.ts | 12 +- src/multicall/multicall.registry.ts | 1 + .../network-provider.registry.ts | 1 + src/types/network.interface.ts | 2 + 18 files changed, 5609 insertions(+), 5 deletions(-) create mode 100644 src/apps/koyo/boba/koyo.pool.token-fetcher.ts create mode 100644 src/apps/koyo/contracts/abis/koyo-pool.json create mode 100644 src/apps/koyo/contracts/abis/koyo-vault.json create mode 100644 src/apps/koyo/contracts/ethers/KoyoPool.ts create mode 100644 src/apps/koyo/contracts/ethers/KoyoVault.ts create mode 100644 src/apps/koyo/contracts/ethers/common.ts create mode 100644 src/apps/koyo/contracts/ethers/factories/KoyoPool__factory.ts create mode 100644 src/apps/koyo/contracts/ethers/factories/KoyoVault__factory.ts create mode 100644 src/apps/koyo/contracts/ethers/factories/index.ts create mode 100644 src/apps/koyo/contracts/ethers/index.ts create mode 100644 src/apps/koyo/helpers/koyo.pool.token-helper.ts create mode 100644 src/apps/koyo/helpers/koyo.the-graph.pool-token-address-strategy.ts diff --git a/src/apps/koyo/boba/koyo.pool.token-fetcher.ts b/src/apps/koyo/boba/koyo.pool.token-fetcher.ts new file mode 100644 index 000000000..8e27a2aba --- /dev/null +++ b/src/apps/koyo/boba/koyo.pool.token-fetcher.ts @@ -0,0 +1,35 @@ +import { Inject } from '@nestjs/common'; + +import { Register } from '~app-toolkit/decorators'; +import { PositionFetcher } from '~position/position-fetcher.interface'; +import { AppTokenPosition } from '~position/position.interface'; +import { Network } from '~types/network.interface'; + +import { KoyoPoolTokensHelper } from '../helpers/koyo.pool.token-helper'; +import { KoyoTheGraphPoolTokenDataStrategy } from '../helpers/koyo.the-graph.pool-token-address-strategy'; +import { KOYO_DEFINITION } from '../koyo.definition'; + +const appId = KOYO_DEFINITION.id; +const groupId = KOYO_DEFINITION.groups.pool.id; +const network = Network.BOBA_MAINNET; + +@Register.TokenPositionFetcher({ appId, groupId, network }) +export class BobaKoyoPoolTokenFetcher implements PositionFetcher { + constructor( + @Inject(KoyoPoolTokensHelper) private readonly poolTokensHelper: KoyoPoolTokensHelper, + @Inject(KoyoTheGraphPoolTokenDataStrategy) + private readonly koyoTheGraphPoolTokenDataStrategy: KoyoTheGraphPoolTokenDataStrategy, + ) {} + + getPositions() { + return this.poolTokensHelper.getTokenMarketData({ + network, + appId, + groupId, + vaultAddress: '0x2a4409cc7d2ae7ca1e3d915337d1b6ba2350d6a3', + resolvePoolTokenAddresses: this.koyoTheGraphPoolTokenDataStrategy.build({ + subgraphUrl: 'https://api.thegraph.com/subgraphs/name/koyo-finance/exchange-subgraph-boba', + }), + }); + } +} diff --git a/src/apps/koyo/contracts/abis/koyo-pool.json b/src/apps/koyo/contracts/abis/koyo-pool.json new file mode 100644 index 000000000..4856f016d --- /dev/null +++ b/src/apps/koyo/contracts/abis/koyo-pool.json @@ -0,0 +1,367 @@ +[ + { + "inputs": [ + { "internalType": "contract IVault", "name": "vault", "type": "address" }, + { "internalType": "string", "name": "name", "type": "string" }, + { "internalType": "string", "name": "symbol", "type": "string" }, + { "internalType": "contract IERC20[]", "name": "tokens", "type": "address[]" }, + { "internalType": "uint256[]", "name": "normalizedWeights", "type": "uint256[]" }, + { "internalType": "uint256", "name": "swapFeePercentage", "type": "uint256" }, + { "internalType": "uint256", "name": "pauseWindowDuration", "type": "uint256" }, + { "internalType": "uint256", "name": "bufferPeriodDuration", "type": "uint256" }, + { "internalType": "address", "name": "owner", "type": "address" } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, + { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ "indexed": false, "internalType": "bool", "name": "paused", "type": "bool" }], + "name": "PausedStateChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ "indexed": false, "internalType": "uint256", "name": "swapFeePercentage", "type": "uint256" }], + "name": "SwapFeePercentageChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, + { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [], + "name": "DOMAIN_SEPARATOR", + "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "owner", "type": "address" }, + { "internalType": "address", "name": "spender", "type": "address" } + ], + "name": "allowance", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "spender", "type": "address" }, + { "internalType": "uint256", "name": "amount", "type": "uint256" } + ], + "name": "approve", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], + "name": "balanceOf", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "spender", "type": "address" }, + { "internalType": "uint256", "name": "amount", "type": "uint256" } + ], + "name": "decreaseApproval", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "bytes4", "name": "selector", "type": "bytes4" }], + "name": "getActionId", + "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [{ "internalType": "contract IAuthorizer", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getInvariant", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLastInvariant", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getNormalizedWeights", + "outputs": [{ "internalType": "uint256[]", "name": "", "type": "uint256[]" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getOwner", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPausedState", + "outputs": [ + { "internalType": "bool", "name": "paused", "type": "bool" }, + { "internalType": "uint256", "name": "pauseWindowEndTime", "type": "uint256" }, + { "internalType": "uint256", "name": "bufferPeriodEndTime", "type": "uint256" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPoolId", + "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRate", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getSwapFeePercentage", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [{ "internalType": "contract IVault", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "spender", "type": "address" }, + { "internalType": "uint256", "name": "amount", "type": "uint256" } + ], + "name": "increaseApproval", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [{ "internalType": "string", "name": "", "type": "string" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "owner", "type": "address" }], + "name": "nonces", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, + { "internalType": "address", "name": "sender", "type": "address" }, + { "internalType": "address", "name": "recipient", "type": "address" }, + { "internalType": "uint256[]", "name": "balances", "type": "uint256[]" }, + { "internalType": "uint256", "name": "lastChangeBlock", "type": "uint256" }, + { "internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256" }, + { "internalType": "bytes", "name": "userData", "type": "bytes" } + ], + "name": "onExitPool", + "outputs": [ + { "internalType": "uint256[]", "name": "", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "", "type": "uint256[]" } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, + { "internalType": "address", "name": "sender", "type": "address" }, + { "internalType": "address", "name": "recipient", "type": "address" }, + { "internalType": "uint256[]", "name": "balances", "type": "uint256[]" }, + { "internalType": "uint256", "name": "lastChangeBlock", "type": "uint256" }, + { "internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256" }, + { "internalType": "bytes", "name": "userData", "type": "bytes" } + ], + "name": "onJoinPool", + "outputs": [ + { "internalType": "uint256[]", "name": "", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "", "type": "uint256[]" } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { "internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8" }, + { "internalType": "contract IERC20", "name": "tokenIn", "type": "address" }, + { "internalType": "contract IERC20", "name": "tokenOut", "type": "address" }, + { "internalType": "uint256", "name": "amount", "type": "uint256" }, + { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, + { "internalType": "uint256", "name": "lastChangeBlock", "type": "uint256" }, + { "internalType": "address", "name": "from", "type": "address" }, + { "internalType": "address", "name": "to", "type": "address" }, + { "internalType": "bytes", "name": "userData", "type": "bytes" } + ], + "internalType": "struct IPoolSwapStructs.SwapRequest", + "name": "request", + "type": "tuple" + }, + { "internalType": "uint256", "name": "balanceTokenIn", "type": "uint256" }, + { "internalType": "uint256", "name": "balanceTokenOut", "type": "uint256" } + ], + "name": "onSwap", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "owner", "type": "address" }, + { "internalType": "address", "name": "spender", "type": "address" }, + { "internalType": "uint256", "name": "value", "type": "uint256" }, + { "internalType": "uint256", "name": "deadline", "type": "uint256" }, + { "internalType": "uint8", "name": "v", "type": "uint8" }, + { "internalType": "bytes32", "name": "r", "type": "bytes32" }, + { "internalType": "bytes32", "name": "s", "type": "bytes32" } + ], + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, + { "internalType": "address", "name": "sender", "type": "address" }, + { "internalType": "address", "name": "recipient", "type": "address" }, + { "internalType": "uint256[]", "name": "balances", "type": "uint256[]" }, + { "internalType": "uint256", "name": "lastChangeBlock", "type": "uint256" }, + { "internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256" }, + { "internalType": "bytes", "name": "userData", "type": "bytes" } + ], + "name": "queryExit", + "outputs": [ + { "internalType": "uint256", "name": "bptIn", "type": "uint256" }, + { "internalType": "uint256[]", "name": "amountsOut", "type": "uint256[]" } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, + { "internalType": "address", "name": "sender", "type": "address" }, + { "internalType": "address", "name": "recipient", "type": "address" }, + { "internalType": "uint256[]", "name": "balances", "type": "uint256[]" }, + { "internalType": "uint256", "name": "lastChangeBlock", "type": "uint256" }, + { "internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256" }, + { "internalType": "bytes", "name": "userData", "type": "bytes" } + ], + "name": "queryJoin", + "outputs": [ + { "internalType": "uint256", "name": "bptOut", "type": "uint256" }, + { "internalType": "uint256[]", "name": "amountsIn", "type": "uint256[]" } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "bool", "name": "paused", "type": "bool" }], + "name": "setPaused", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "swapFeePercentage", "type": "uint256" }], + "name": "setSwapFeePercentage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [{ "internalType": "string", "name": "", "type": "string" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "recipient", "type": "address" }, + { "internalType": "uint256", "name": "amount", "type": "uint256" } + ], + "name": "transfer", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "sender", "type": "address" }, + { "internalType": "address", "name": "recipient", "type": "address" }, + { "internalType": "uint256", "name": "amount", "type": "uint256" } + ], + "name": "transferFrom", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "nonpayable", + "type": "function" + } +] diff --git a/src/apps/koyo/contracts/abis/koyo-vault.json b/src/apps/koyo/contracts/abis/koyo-vault.json new file mode 100644 index 000000000..9cb1bfeb4 --- /dev/null +++ b/src/apps/koyo/contracts/abis/koyo-vault.json @@ -0,0 +1,491 @@ +[ + { + "inputs": [ + { "internalType": "contract IAuthorizer", "name": "authorizer", "type": "address" }, + { "internalType": "contract IWETH", "name": "weth", "type": "address" }, + { "internalType": "uint256", "name": "pauseWindowDuration", "type": "uint256" }, + { "internalType": "uint256", "name": "bufferPeriodDuration", "type": "uint256" } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [{ "indexed": true, "internalType": "contract IAuthorizer", "name": "newAuthorizer", "type": "address" }], + "name": "AuthorizerChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "contract IERC20", "name": "token", "type": "address" }, + { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "recipient", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } + ], + "name": "ExternalBalanceTransfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "contract IFlashLoanRecipient", "name": "recipient", "type": "address" }, + { "indexed": true, "internalType": "contract IERC20", "name": "token", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "feeAmount", "type": "uint256" } + ], + "name": "FlashLoan", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "user", "type": "address" }, + { "indexed": true, "internalType": "contract IERC20", "name": "token", "type": "address" }, + { "indexed": false, "internalType": "int256", "name": "delta", "type": "int256" } + ], + "name": "InternalBalanceChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ "indexed": false, "internalType": "bool", "name": "paused", "type": "bool" }], + "name": "PausedStateChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, + { "indexed": true, "internalType": "address", "name": "liquidityProvider", "type": "address" }, + { "indexed": false, "internalType": "contract IERC20[]", "name": "tokens", "type": "address[]" }, + { "indexed": false, "internalType": "int256[]", "name": "deltas", "type": "int256[]" }, + { "indexed": false, "internalType": "uint256[]", "name": "protocolFeeAmounts", "type": "uint256[]" } + ], + "name": "PoolBalanceChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, + { "indexed": true, "internalType": "address", "name": "assetManager", "type": "address" }, + { "indexed": true, "internalType": "contract IERC20", "name": "token", "type": "address" }, + { "indexed": false, "internalType": "int256", "name": "cashDelta", "type": "int256" }, + { "indexed": false, "internalType": "int256", "name": "managedDelta", "type": "int256" } + ], + "name": "PoolBalanceManaged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, + { "indexed": true, "internalType": "address", "name": "poolAddress", "type": "address" }, + { "indexed": false, "internalType": "enum IVault.PoolSpecialization", "name": "specialization", "type": "uint8" } + ], + "name": "PoolRegistered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "relayer", "type": "address" }, + { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, + { "indexed": false, "internalType": "bool", "name": "approved", "type": "bool" } + ], + "name": "RelayerApprovalChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, + { "indexed": true, "internalType": "contract IERC20", "name": "tokenIn", "type": "address" }, + { "indexed": true, "internalType": "contract IERC20", "name": "tokenOut", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "amountIn", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "amountOut", "type": "uint256" } + ], + "name": "Swap", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, + { "indexed": false, "internalType": "contract IERC20[]", "name": "tokens", "type": "address[]" } + ], + "name": "TokensDeregistered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, + { "indexed": false, "internalType": "contract IERC20[]", "name": "tokens", "type": "address[]" }, + { "indexed": false, "internalType": "address[]", "name": "assetManagers", "type": "address[]" } + ], + "name": "TokensRegistered", + "type": "event" + }, + { + "inputs": [], + "name": "WETH", + "outputs": [{ "internalType": "contract IWETH", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8" }, + { + "components": [ + { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, + { "internalType": "uint256", "name": "assetInIndex", "type": "uint256" }, + { "internalType": "uint256", "name": "assetOutIndex", "type": "uint256" }, + { "internalType": "uint256", "name": "amount", "type": "uint256" }, + { "internalType": "bytes", "name": "userData", "type": "bytes" } + ], + "internalType": "struct IVault.BatchSwapStep[]", + "name": "swaps", + "type": "tuple[]" + }, + { "internalType": "contract IAsset[]", "name": "assets", "type": "address[]" }, + { + "components": [ + { "internalType": "address", "name": "sender", "type": "address" }, + { "internalType": "bool", "name": "fromInternalBalance", "type": "bool" }, + { "internalType": "address payable", "name": "recipient", "type": "address" }, + { "internalType": "bool", "name": "toInternalBalance", "type": "bool" } + ], + "internalType": "struct IVault.FundManagement", + "name": "funds", + "type": "tuple" + }, + { "internalType": "int256[]", "name": "limits", "type": "int256[]" }, + { "internalType": "uint256", "name": "deadline", "type": "uint256" } + ], + "name": "batchSwap", + "outputs": [{ "internalType": "int256[]", "name": "assetDeltas", "type": "int256[]" }], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, + { "internalType": "contract IERC20[]", "name": "tokens", "type": "address[]" } + ], + "name": "deregisterTokens", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, + { "internalType": "address", "name": "sender", "type": "address" }, + { "internalType": "address payable", "name": "recipient", "type": "address" }, + { + "components": [ + { "internalType": "contract IAsset[]", "name": "assets", "type": "address[]" }, + { "internalType": "uint256[]", "name": "minAmountsOut", "type": "uint256[]" }, + { "internalType": "bytes", "name": "userData", "type": "bytes" }, + { "internalType": "bool", "name": "toInternalBalance", "type": "bool" } + ], + "internalType": "struct IVault.ExitPoolRequest", + "name": "request", + "type": "tuple" + } + ], + "name": "exitPool", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "contract IFlashLoanRecipient", "name": "recipient", "type": "address" }, + { "internalType": "contract IERC20[]", "name": "tokens", "type": "address[]" }, + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, + { "internalType": "bytes", "name": "userData", "type": "bytes" } + ], + "name": "flashLoan", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "bytes4", "name": "selector", "type": "bytes4" }], + "name": "getActionId", + "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [{ "internalType": "contract IAuthorizer", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDomainSeparator", + "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "user", "type": "address" }, + { "internalType": "contract IERC20[]", "name": "tokens", "type": "address[]" } + ], + "name": "getInternalBalance", + "outputs": [{ "internalType": "uint256[]", "name": "balances", "type": "uint256[]" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "user", "type": "address" }], + "name": "getNextNonce", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPausedState", + "outputs": [ + { "internalType": "bool", "name": "paused", "type": "bool" }, + { "internalType": "uint256", "name": "pauseWindowEndTime", "type": "uint256" }, + { "internalType": "uint256", "name": "bufferPeriodEndTime", "type": "uint256" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "bytes32", "name": "poolId", "type": "bytes32" }], + "name": "getPool", + "outputs": [ + { "internalType": "address", "name": "", "type": "address" }, + { "internalType": "enum IVault.PoolSpecialization", "name": "", "type": "uint8" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, + { "internalType": "contract IERC20", "name": "token", "type": "address" } + ], + "name": "getPoolTokenInfo", + "outputs": [ + { "internalType": "uint256", "name": "cash", "type": "uint256" }, + { "internalType": "uint256", "name": "managed", "type": "uint256" }, + { "internalType": "uint256", "name": "lastChangeBlock", "type": "uint256" }, + { "internalType": "address", "name": "assetManager", "type": "address" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "bytes32", "name": "poolId", "type": "bytes32" }], + "name": "getPoolTokens", + "outputs": [ + { "internalType": "contract IERC20[]", "name": "tokens", "type": "address[]" }, + { "internalType": "uint256[]", "name": "balances", "type": "uint256[]" }, + { "internalType": "uint256", "name": "lastChangeBlock", "type": "uint256" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProtocolFeesCollector", + "outputs": [{ "internalType": "contract ProtocolFeesCollector", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "user", "type": "address" }, + { "internalType": "address", "name": "relayer", "type": "address" } + ], + "name": "hasApprovedRelayer", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, + { "internalType": "address", "name": "sender", "type": "address" }, + { "internalType": "address", "name": "recipient", "type": "address" }, + { + "components": [ + { "internalType": "contract IAsset[]", "name": "assets", "type": "address[]" }, + { "internalType": "uint256[]", "name": "maxAmountsIn", "type": "uint256[]" }, + { "internalType": "bytes", "name": "userData", "type": "bytes" }, + { "internalType": "bool", "name": "fromInternalBalance", "type": "bool" } + ], + "internalType": "struct IVault.JoinPoolRequest", + "name": "request", + "type": "tuple" + } + ], + "name": "joinPool", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { "internalType": "enum IVault.PoolBalanceOpKind", "name": "kind", "type": "uint8" }, + { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, + { "internalType": "contract IERC20", "name": "token", "type": "address" }, + { "internalType": "uint256", "name": "amount", "type": "uint256" } + ], + "internalType": "struct IVault.PoolBalanceOp[]", + "name": "ops", + "type": "tuple[]" + } + ], + "name": "managePoolBalance", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { "internalType": "enum IVault.UserBalanceOpKind", "name": "kind", "type": "uint8" }, + { "internalType": "contract IAsset", "name": "asset", "type": "address" }, + { "internalType": "uint256", "name": "amount", "type": "uint256" }, + { "internalType": "address", "name": "sender", "type": "address" }, + { "internalType": "address payable", "name": "recipient", "type": "address" } + ], + "internalType": "struct IVault.UserBalanceOp[]", + "name": "ops", + "type": "tuple[]" + } + ], + "name": "manageUserBalance", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8" }, + { + "components": [ + { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, + { "internalType": "uint256", "name": "assetInIndex", "type": "uint256" }, + { "internalType": "uint256", "name": "assetOutIndex", "type": "uint256" }, + { "internalType": "uint256", "name": "amount", "type": "uint256" }, + { "internalType": "bytes", "name": "userData", "type": "bytes" } + ], + "internalType": "struct IVault.BatchSwapStep[]", + "name": "swaps", + "type": "tuple[]" + }, + { "internalType": "contract IAsset[]", "name": "assets", "type": "address[]" }, + { + "components": [ + { "internalType": "address", "name": "sender", "type": "address" }, + { "internalType": "bool", "name": "fromInternalBalance", "type": "bool" }, + { "internalType": "address payable", "name": "recipient", "type": "address" }, + { "internalType": "bool", "name": "toInternalBalance", "type": "bool" } + ], + "internalType": "struct IVault.FundManagement", + "name": "funds", + "type": "tuple" + } + ], + "name": "queryBatchSwap", + "outputs": [{ "internalType": "int256[]", "name": "", "type": "int256[]" }], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "enum IVault.PoolSpecialization", "name": "specialization", "type": "uint8" }], + "name": "registerPool", + "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, + { "internalType": "contract IERC20[]", "name": "tokens", "type": "address[]" }, + { "internalType": "address[]", "name": "assetManagers", "type": "address[]" } + ], + "name": "registerTokens", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "contract IAuthorizer", "name": "newAuthorizer", "type": "address" }], + "name": "setAuthorizer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "bool", "name": "paused", "type": "bool" }], + "name": "setPaused", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "sender", "type": "address" }, + { "internalType": "address", "name": "relayer", "type": "address" }, + { "internalType": "bool", "name": "approved", "type": "bool" } + ], + "name": "setRelayerApproval", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, + { "internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8" }, + { "internalType": "contract IAsset", "name": "assetIn", "type": "address" }, + { "internalType": "contract IAsset", "name": "assetOut", "type": "address" }, + { "internalType": "uint256", "name": "amount", "type": "uint256" }, + { "internalType": "bytes", "name": "userData", "type": "bytes" } + ], + "internalType": "struct IVault.SingleSwap", + "name": "singleSwap", + "type": "tuple" + }, + { + "components": [ + { "internalType": "address", "name": "sender", "type": "address" }, + { "internalType": "bool", "name": "fromInternalBalance", "type": "bool" }, + { "internalType": "address payable", "name": "recipient", "type": "address" }, + { "internalType": "bool", "name": "toInternalBalance", "type": "bool" } + ], + "internalType": "struct IVault.FundManagement", + "name": "funds", + "type": "tuple" + }, + { "internalType": "uint256", "name": "limit", "type": "uint256" }, + { "internalType": "uint256", "name": "deadline", "type": "uint256" } + ], + "name": "swap", + "outputs": [{ "internalType": "uint256", "name": "amountCalculated", "type": "uint256" }], + "stateMutability": "payable", + "type": "function" + }, + { "stateMutability": "payable", "type": "receive" } +] diff --git a/src/apps/koyo/contracts/ethers/KoyoPool.ts b/src/apps/koyo/contracts/ethers/KoyoPool.ts new file mode 100644 index 000000000..ab055777a --- /dev/null +++ b/src/apps/koyo/contracts/ethers/KoyoPool.ts @@ -0,0 +1,994 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from 'ethers'; +import type { FunctionFragment, Result, EventFragment } from '@ethersproject/abi'; +import type { Listener, Provider } from '@ethersproject/providers'; +import type { TypedEventFilter, TypedEvent, TypedListener, OnEvent } from './common'; + +export declare namespace IPoolSwapStructs { + export type SwapRequestStruct = { + kind: BigNumberish; + tokenIn: string; + tokenOut: string; + amount: BigNumberish; + poolId: BytesLike; + lastChangeBlock: BigNumberish; + from: string; + to: string; + userData: BytesLike; + }; + + export type SwapRequestStructOutput = [ + number, + string, + string, + BigNumber, + string, + BigNumber, + string, + string, + string, + ] & { + kind: number; + tokenIn: string; + tokenOut: string; + amount: BigNumber; + poolId: string; + lastChangeBlock: BigNumber; + from: string; + to: string; + userData: string; + }; +} + +export interface KoyoPoolInterface extends utils.Interface { + functions: { + 'DOMAIN_SEPARATOR()': FunctionFragment; + 'allowance(address,address)': FunctionFragment; + 'approve(address,uint256)': FunctionFragment; + 'balanceOf(address)': FunctionFragment; + 'decimals()': FunctionFragment; + 'decreaseApproval(address,uint256)': FunctionFragment; + 'getActionId(bytes4)': FunctionFragment; + 'getAuthorizer()': FunctionFragment; + 'getInvariant()': FunctionFragment; + 'getLastInvariant()': FunctionFragment; + 'getNormalizedWeights()': FunctionFragment; + 'getOwner()': FunctionFragment; + 'getPausedState()': FunctionFragment; + 'getPoolId()': FunctionFragment; + 'getRate()': FunctionFragment; + 'getSwapFeePercentage()': FunctionFragment; + 'getVault()': FunctionFragment; + 'increaseApproval(address,uint256)': FunctionFragment; + 'name()': FunctionFragment; + 'nonces(address)': FunctionFragment; + 'onExitPool(bytes32,address,address,uint256[],uint256,uint256,bytes)': FunctionFragment; + 'onJoinPool(bytes32,address,address,uint256[],uint256,uint256,bytes)': FunctionFragment; + 'onSwap((uint8,address,address,uint256,bytes32,uint256,address,address,bytes),uint256,uint256)': FunctionFragment; + 'permit(address,address,uint256,uint256,uint8,bytes32,bytes32)': FunctionFragment; + 'queryExit(bytes32,address,address,uint256[],uint256,uint256,bytes)': FunctionFragment; + 'queryJoin(bytes32,address,address,uint256[],uint256,uint256,bytes)': FunctionFragment; + 'setPaused(bool)': FunctionFragment; + 'setSwapFeePercentage(uint256)': FunctionFragment; + 'symbol()': FunctionFragment; + 'totalSupply()': FunctionFragment; + 'transfer(address,uint256)': FunctionFragment; + 'transferFrom(address,address,uint256)': FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | 'DOMAIN_SEPARATOR' + | 'allowance' + | 'approve' + | 'balanceOf' + | 'decimals' + | 'decreaseApproval' + | 'getActionId' + | 'getAuthorizer' + | 'getInvariant' + | 'getLastInvariant' + | 'getNormalizedWeights' + | 'getOwner' + | 'getPausedState' + | 'getPoolId' + | 'getRate' + | 'getSwapFeePercentage' + | 'getVault' + | 'increaseApproval' + | 'name' + | 'nonces' + | 'onExitPool' + | 'onJoinPool' + | 'onSwap' + | 'permit' + | 'queryExit' + | 'queryJoin' + | 'setPaused' + | 'setSwapFeePercentage' + | 'symbol' + | 'totalSupply' + | 'transfer' + | 'transferFrom', + ): FunctionFragment; + + encodeFunctionData(functionFragment: 'DOMAIN_SEPARATOR', values?: undefined): string; + encodeFunctionData(functionFragment: 'allowance', values: [string, string]): string; + encodeFunctionData(functionFragment: 'approve', values: [string, BigNumberish]): string; + encodeFunctionData(functionFragment: 'balanceOf', values: [string]): string; + encodeFunctionData(functionFragment: 'decimals', values?: undefined): string; + encodeFunctionData(functionFragment: 'decreaseApproval', values: [string, BigNumberish]): string; + encodeFunctionData(functionFragment: 'getActionId', values: [BytesLike]): string; + encodeFunctionData(functionFragment: 'getAuthorizer', values?: undefined): string; + encodeFunctionData(functionFragment: 'getInvariant', values?: undefined): string; + encodeFunctionData(functionFragment: 'getLastInvariant', values?: undefined): string; + encodeFunctionData(functionFragment: 'getNormalizedWeights', values?: undefined): string; + encodeFunctionData(functionFragment: 'getOwner', values?: undefined): string; + encodeFunctionData(functionFragment: 'getPausedState', values?: undefined): string; + encodeFunctionData(functionFragment: 'getPoolId', values?: undefined): string; + encodeFunctionData(functionFragment: 'getRate', values?: undefined): string; + encodeFunctionData(functionFragment: 'getSwapFeePercentage', values?: undefined): string; + encodeFunctionData(functionFragment: 'getVault', values?: undefined): string; + encodeFunctionData(functionFragment: 'increaseApproval', values: [string, BigNumberish]): string; + encodeFunctionData(functionFragment: 'name', values?: undefined): string; + encodeFunctionData(functionFragment: 'nonces', values: [string]): string; + encodeFunctionData( + functionFragment: 'onExitPool', + values: [BytesLike, string, string, BigNumberish[], BigNumberish, BigNumberish, BytesLike], + ): string; + encodeFunctionData( + functionFragment: 'onJoinPool', + values: [BytesLike, string, string, BigNumberish[], BigNumberish, BigNumberish, BytesLike], + ): string; + encodeFunctionData( + functionFragment: 'onSwap', + values: [IPoolSwapStructs.SwapRequestStruct, BigNumberish, BigNumberish], + ): string; + encodeFunctionData( + functionFragment: 'permit', + values: [string, string, BigNumberish, BigNumberish, BigNumberish, BytesLike, BytesLike], + ): string; + encodeFunctionData( + functionFragment: 'queryExit', + values: [BytesLike, string, string, BigNumberish[], BigNumberish, BigNumberish, BytesLike], + ): string; + encodeFunctionData( + functionFragment: 'queryJoin', + values: [BytesLike, string, string, BigNumberish[], BigNumberish, BigNumberish, BytesLike], + ): string; + encodeFunctionData(functionFragment: 'setPaused', values: [boolean]): string; + encodeFunctionData(functionFragment: 'setSwapFeePercentage', values: [BigNumberish]): string; + encodeFunctionData(functionFragment: 'symbol', values?: undefined): string; + encodeFunctionData(functionFragment: 'totalSupply', values?: undefined): string; + encodeFunctionData(functionFragment: 'transfer', values: [string, BigNumberish]): string; + encodeFunctionData(functionFragment: 'transferFrom', values: [string, string, BigNumberish]): string; + + decodeFunctionResult(functionFragment: 'DOMAIN_SEPARATOR', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'allowance', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'approve', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'balanceOf', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'decimals', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'decreaseApproval', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'getActionId', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'getAuthorizer', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'getInvariant', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'getLastInvariant', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'getNormalizedWeights', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'getOwner', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'getPausedState', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'getPoolId', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'getRate', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'getSwapFeePercentage', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'getVault', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'increaseApproval', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'name', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'nonces', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'onExitPool', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'onJoinPool', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'onSwap', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'permit', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'queryExit', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'queryJoin', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'setPaused', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'setSwapFeePercentage', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'symbol', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'totalSupply', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'transfer', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'transferFrom', data: BytesLike): Result; + + events: { + 'Approval(address,address,uint256)': EventFragment; + 'PausedStateChanged(bool)': EventFragment; + 'SwapFeePercentageChanged(uint256)': EventFragment; + 'Transfer(address,address,uint256)': EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: 'Approval'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'PausedStateChanged'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'SwapFeePercentageChanged'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'Transfer'): EventFragment; +} + +export interface ApprovalEventObject { + owner: string; + spender: string; + value: BigNumber; +} +export type ApprovalEvent = TypedEvent<[string, string, BigNumber], ApprovalEventObject>; + +export type ApprovalEventFilter = TypedEventFilter; + +export interface PausedStateChangedEventObject { + paused: boolean; +} +export type PausedStateChangedEvent = TypedEvent<[boolean], PausedStateChangedEventObject>; + +export type PausedStateChangedEventFilter = TypedEventFilter; + +export interface SwapFeePercentageChangedEventObject { + swapFeePercentage: BigNumber; +} +export type SwapFeePercentageChangedEvent = TypedEvent<[BigNumber], SwapFeePercentageChangedEventObject>; + +export type SwapFeePercentageChangedEventFilter = TypedEventFilter; + +export interface TransferEventObject { + from: string; + to: string; + value: BigNumber; +} +export type TransferEvent = TypedEvent<[string, string, BigNumber], TransferEventObject>; + +export type TransferEventFilter = TypedEventFilter; + +export interface KoyoPool extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: KoyoPoolInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined, + ): Promise>; + + listeners(eventFilter?: TypedEventFilter): Array>; + listeners(eventName?: string): Array; + removeAllListeners(eventFilter: TypedEventFilter): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise<[string]>; + + allowance(owner: string, spender: string, overrides?: CallOverrides): Promise<[BigNumber]>; + + approve( + spender: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + balanceOf(account: string, overrides?: CallOverrides): Promise<[BigNumber]>; + + decimals(overrides?: CallOverrides): Promise<[number]>; + + decreaseApproval( + spender: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + getActionId(selector: BytesLike, overrides?: CallOverrides): Promise<[string]>; + + getAuthorizer(overrides?: CallOverrides): Promise<[string]>; + + getInvariant(overrides?: CallOverrides): Promise<[BigNumber]>; + + getLastInvariant(overrides?: CallOverrides): Promise<[BigNumber]>; + + getNormalizedWeights(overrides?: CallOverrides): Promise<[BigNumber[]]>; + + getOwner(overrides?: CallOverrides): Promise<[string]>; + + getPausedState(overrides?: CallOverrides): Promise< + [boolean, BigNumber, BigNumber] & { + paused: boolean; + pauseWindowEndTime: BigNumber; + bufferPeriodEndTime: BigNumber; + } + >; + + getPoolId(overrides?: CallOverrides): Promise<[string]>; + + getRate(overrides?: CallOverrides): Promise<[BigNumber]>; + + getSwapFeePercentage(overrides?: CallOverrides): Promise<[BigNumber]>; + + getVault(overrides?: CallOverrides): Promise<[string]>; + + increaseApproval( + spender: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + name(overrides?: CallOverrides): Promise<[string]>; + + nonces(owner: string, overrides?: CallOverrides): Promise<[BigNumber]>; + + onExitPool( + poolId: BytesLike, + sender: string, + recipient: string, + balances: BigNumberish[], + lastChangeBlock: BigNumberish, + protocolSwapFeePercentage: BigNumberish, + userData: BytesLike, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + onJoinPool( + poolId: BytesLike, + sender: string, + recipient: string, + balances: BigNumberish[], + lastChangeBlock: BigNumberish, + protocolSwapFeePercentage: BigNumberish, + userData: BytesLike, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + onSwap( + request: IPoolSwapStructs.SwapRequestStruct, + balanceTokenIn: BigNumberish, + balanceTokenOut: BigNumberish, + overrides?: CallOverrides, + ): Promise<[BigNumber]>; + + permit( + owner: string, + spender: string, + value: BigNumberish, + deadline: BigNumberish, + v: BigNumberish, + r: BytesLike, + s: BytesLike, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + queryExit( + poolId: BytesLike, + sender: string, + recipient: string, + balances: BigNumberish[], + lastChangeBlock: BigNumberish, + protocolSwapFeePercentage: BigNumberish, + userData: BytesLike, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + queryJoin( + poolId: BytesLike, + sender: string, + recipient: string, + balances: BigNumberish[], + lastChangeBlock: BigNumberish, + protocolSwapFeePercentage: BigNumberish, + userData: BytesLike, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + setPaused( + paused: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + setSwapFeePercentage( + swapFeePercentage: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + symbol(overrides?: CallOverrides): Promise<[string]>; + + totalSupply(overrides?: CallOverrides): Promise<[BigNumber]>; + + transfer( + recipient: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + transferFrom( + sender: string, + recipient: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + }; + + DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; + + allowance(owner: string, spender: string, overrides?: CallOverrides): Promise; + + approve( + spender: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + balanceOf(account: string, overrides?: CallOverrides): Promise; + + decimals(overrides?: CallOverrides): Promise; + + decreaseApproval( + spender: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + getActionId(selector: BytesLike, overrides?: CallOverrides): Promise; + + getAuthorizer(overrides?: CallOverrides): Promise; + + getInvariant(overrides?: CallOverrides): Promise; + + getLastInvariant(overrides?: CallOverrides): Promise; + + getNormalizedWeights(overrides?: CallOverrides): Promise; + + getOwner(overrides?: CallOverrides): Promise; + + getPausedState(overrides?: CallOverrides): Promise< + [boolean, BigNumber, BigNumber] & { + paused: boolean; + pauseWindowEndTime: BigNumber; + bufferPeriodEndTime: BigNumber; + } + >; + + getPoolId(overrides?: CallOverrides): Promise; + + getRate(overrides?: CallOverrides): Promise; + + getSwapFeePercentage(overrides?: CallOverrides): Promise; + + getVault(overrides?: CallOverrides): Promise; + + increaseApproval( + spender: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + name(overrides?: CallOverrides): Promise; + + nonces(owner: string, overrides?: CallOverrides): Promise; + + onExitPool( + poolId: BytesLike, + sender: string, + recipient: string, + balances: BigNumberish[], + lastChangeBlock: BigNumberish, + protocolSwapFeePercentage: BigNumberish, + userData: BytesLike, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + onJoinPool( + poolId: BytesLike, + sender: string, + recipient: string, + balances: BigNumberish[], + lastChangeBlock: BigNumberish, + protocolSwapFeePercentage: BigNumberish, + userData: BytesLike, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + onSwap( + request: IPoolSwapStructs.SwapRequestStruct, + balanceTokenIn: BigNumberish, + balanceTokenOut: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + permit( + owner: string, + spender: string, + value: BigNumberish, + deadline: BigNumberish, + v: BigNumberish, + r: BytesLike, + s: BytesLike, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + queryExit( + poolId: BytesLike, + sender: string, + recipient: string, + balances: BigNumberish[], + lastChangeBlock: BigNumberish, + protocolSwapFeePercentage: BigNumberish, + userData: BytesLike, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + queryJoin( + poolId: BytesLike, + sender: string, + recipient: string, + balances: BigNumberish[], + lastChangeBlock: BigNumberish, + protocolSwapFeePercentage: BigNumberish, + userData: BytesLike, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + setPaused(paused: boolean, overrides?: Overrides & { from?: string | Promise }): Promise; + + setSwapFeePercentage( + swapFeePercentage: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + symbol(overrides?: CallOverrides): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transfer( + recipient: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + transferFrom( + sender: string, + recipient: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + callStatic: { + DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; + + allowance(owner: string, spender: string, overrides?: CallOverrides): Promise; + + approve(spender: string, amount: BigNumberish, overrides?: CallOverrides): Promise; + + balanceOf(account: string, overrides?: CallOverrides): Promise; + + decimals(overrides?: CallOverrides): Promise; + + decreaseApproval(spender: string, amount: BigNumberish, overrides?: CallOverrides): Promise; + + getActionId(selector: BytesLike, overrides?: CallOverrides): Promise; + + getAuthorizer(overrides?: CallOverrides): Promise; + + getInvariant(overrides?: CallOverrides): Promise; + + getLastInvariant(overrides?: CallOverrides): Promise; + + getNormalizedWeights(overrides?: CallOverrides): Promise; + + getOwner(overrides?: CallOverrides): Promise; + + getPausedState(overrides?: CallOverrides): Promise< + [boolean, BigNumber, BigNumber] & { + paused: boolean; + pauseWindowEndTime: BigNumber; + bufferPeriodEndTime: BigNumber; + } + >; + + getPoolId(overrides?: CallOverrides): Promise; + + getRate(overrides?: CallOverrides): Promise; + + getSwapFeePercentage(overrides?: CallOverrides): Promise; + + getVault(overrides?: CallOverrides): Promise; + + increaseApproval(spender: string, amount: BigNumberish, overrides?: CallOverrides): Promise; + + name(overrides?: CallOverrides): Promise; + + nonces(owner: string, overrides?: CallOverrides): Promise; + + onExitPool( + poolId: BytesLike, + sender: string, + recipient: string, + balances: BigNumberish[], + lastChangeBlock: BigNumberish, + protocolSwapFeePercentage: BigNumberish, + userData: BytesLike, + overrides?: CallOverrides, + ): Promise<[BigNumber[], BigNumber[]]>; + + onJoinPool( + poolId: BytesLike, + sender: string, + recipient: string, + balances: BigNumberish[], + lastChangeBlock: BigNumberish, + protocolSwapFeePercentage: BigNumberish, + userData: BytesLike, + overrides?: CallOverrides, + ): Promise<[BigNumber[], BigNumber[]]>; + + onSwap( + request: IPoolSwapStructs.SwapRequestStruct, + balanceTokenIn: BigNumberish, + balanceTokenOut: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + permit( + owner: string, + spender: string, + value: BigNumberish, + deadline: BigNumberish, + v: BigNumberish, + r: BytesLike, + s: BytesLike, + overrides?: CallOverrides, + ): Promise; + + queryExit( + poolId: BytesLike, + sender: string, + recipient: string, + balances: BigNumberish[], + lastChangeBlock: BigNumberish, + protocolSwapFeePercentage: BigNumberish, + userData: BytesLike, + overrides?: CallOverrides, + ): Promise<[BigNumber, BigNumber[]] & { bptIn: BigNumber; amountsOut: BigNumber[] }>; + + queryJoin( + poolId: BytesLike, + sender: string, + recipient: string, + balances: BigNumberish[], + lastChangeBlock: BigNumberish, + protocolSwapFeePercentage: BigNumberish, + userData: BytesLike, + overrides?: CallOverrides, + ): Promise<[BigNumber, BigNumber[]] & { bptOut: BigNumber; amountsIn: BigNumber[] }>; + + setPaused(paused: boolean, overrides?: CallOverrides): Promise; + + setSwapFeePercentage(swapFeePercentage: BigNumberish, overrides?: CallOverrides): Promise; + + symbol(overrides?: CallOverrides): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transfer(recipient: string, amount: BigNumberish, overrides?: CallOverrides): Promise; + + transferFrom(sender: string, recipient: string, amount: BigNumberish, overrides?: CallOverrides): Promise; + }; + + filters: { + 'Approval(address,address,uint256)'( + owner?: string | null, + spender?: string | null, + value?: null, + ): ApprovalEventFilter; + Approval(owner?: string | null, spender?: string | null, value?: null): ApprovalEventFilter; + + 'PausedStateChanged(bool)'(paused?: null): PausedStateChangedEventFilter; + PausedStateChanged(paused?: null): PausedStateChangedEventFilter; + + 'SwapFeePercentageChanged(uint256)'(swapFeePercentage?: null): SwapFeePercentageChangedEventFilter; + SwapFeePercentageChanged(swapFeePercentage?: null): SwapFeePercentageChangedEventFilter; + + 'Transfer(address,address,uint256)'(from?: string | null, to?: string | null, value?: null): TransferEventFilter; + Transfer(from?: string | null, to?: string | null, value?: null): TransferEventFilter; + }; + + estimateGas: { + DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; + + allowance(owner: string, spender: string, overrides?: CallOverrides): Promise; + + approve( + spender: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + balanceOf(account: string, overrides?: CallOverrides): Promise; + + decimals(overrides?: CallOverrides): Promise; + + decreaseApproval( + spender: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + getActionId(selector: BytesLike, overrides?: CallOverrides): Promise; + + getAuthorizer(overrides?: CallOverrides): Promise; + + getInvariant(overrides?: CallOverrides): Promise; + + getLastInvariant(overrides?: CallOverrides): Promise; + + getNormalizedWeights(overrides?: CallOverrides): Promise; + + getOwner(overrides?: CallOverrides): Promise; + + getPausedState(overrides?: CallOverrides): Promise; + + getPoolId(overrides?: CallOverrides): Promise; + + getRate(overrides?: CallOverrides): Promise; + + getSwapFeePercentage(overrides?: CallOverrides): Promise; + + getVault(overrides?: CallOverrides): Promise; + + increaseApproval( + spender: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + name(overrides?: CallOverrides): Promise; + + nonces(owner: string, overrides?: CallOverrides): Promise; + + onExitPool( + poolId: BytesLike, + sender: string, + recipient: string, + balances: BigNumberish[], + lastChangeBlock: BigNumberish, + protocolSwapFeePercentage: BigNumberish, + userData: BytesLike, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + onJoinPool( + poolId: BytesLike, + sender: string, + recipient: string, + balances: BigNumberish[], + lastChangeBlock: BigNumberish, + protocolSwapFeePercentage: BigNumberish, + userData: BytesLike, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + onSwap( + request: IPoolSwapStructs.SwapRequestStruct, + balanceTokenIn: BigNumberish, + balanceTokenOut: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + permit( + owner: string, + spender: string, + value: BigNumberish, + deadline: BigNumberish, + v: BigNumberish, + r: BytesLike, + s: BytesLike, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + queryExit( + poolId: BytesLike, + sender: string, + recipient: string, + balances: BigNumberish[], + lastChangeBlock: BigNumberish, + protocolSwapFeePercentage: BigNumberish, + userData: BytesLike, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + queryJoin( + poolId: BytesLike, + sender: string, + recipient: string, + balances: BigNumberish[], + lastChangeBlock: BigNumberish, + protocolSwapFeePercentage: BigNumberish, + userData: BytesLike, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + setPaused(paused: boolean, overrides?: Overrides & { from?: string | Promise }): Promise; + + setSwapFeePercentage( + swapFeePercentage: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + symbol(overrides?: CallOverrides): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transfer( + recipient: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + transferFrom( + sender: string, + recipient: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + }; + + populateTransaction: { + DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; + + allowance(owner: string, spender: string, overrides?: CallOverrides): Promise; + + approve( + spender: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + balanceOf(account: string, overrides?: CallOverrides): Promise; + + decimals(overrides?: CallOverrides): Promise; + + decreaseApproval( + spender: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + getActionId(selector: BytesLike, overrides?: CallOverrides): Promise; + + getAuthorizer(overrides?: CallOverrides): Promise; + + getInvariant(overrides?: CallOverrides): Promise; + + getLastInvariant(overrides?: CallOverrides): Promise; + + getNormalizedWeights(overrides?: CallOverrides): Promise; + + getOwner(overrides?: CallOverrides): Promise; + + getPausedState(overrides?: CallOverrides): Promise; + + getPoolId(overrides?: CallOverrides): Promise; + + getRate(overrides?: CallOverrides): Promise; + + getSwapFeePercentage(overrides?: CallOverrides): Promise; + + getVault(overrides?: CallOverrides): Promise; + + increaseApproval( + spender: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + name(overrides?: CallOverrides): Promise; + + nonces(owner: string, overrides?: CallOverrides): Promise; + + onExitPool( + poolId: BytesLike, + sender: string, + recipient: string, + balances: BigNumberish[], + lastChangeBlock: BigNumberish, + protocolSwapFeePercentage: BigNumberish, + userData: BytesLike, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + onJoinPool( + poolId: BytesLike, + sender: string, + recipient: string, + balances: BigNumberish[], + lastChangeBlock: BigNumberish, + protocolSwapFeePercentage: BigNumberish, + userData: BytesLike, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + onSwap( + request: IPoolSwapStructs.SwapRequestStruct, + balanceTokenIn: BigNumberish, + balanceTokenOut: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + permit( + owner: string, + spender: string, + value: BigNumberish, + deadline: BigNumberish, + v: BigNumberish, + r: BytesLike, + s: BytesLike, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + queryExit( + poolId: BytesLike, + sender: string, + recipient: string, + balances: BigNumberish[], + lastChangeBlock: BigNumberish, + protocolSwapFeePercentage: BigNumberish, + userData: BytesLike, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + queryJoin( + poolId: BytesLike, + sender: string, + recipient: string, + balances: BigNumberish[], + lastChangeBlock: BigNumberish, + protocolSwapFeePercentage: BigNumberish, + userData: BytesLike, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + setPaused( + paused: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + setSwapFeePercentage( + swapFeePercentage: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + symbol(overrides?: CallOverrides): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transfer( + recipient: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + transferFrom( + sender: string, + recipient: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + }; +} diff --git a/src/apps/koyo/contracts/ethers/KoyoVault.ts b/src/apps/koyo/contracts/ethers/KoyoVault.ts new file mode 100644 index 000000000..602f94520 --- /dev/null +++ b/src/apps/koyo/contracts/ethers/KoyoVault.ts @@ -0,0 +1,1207 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PayableOverrides, + PopulatedTransaction, + Signer, + utils, +} from 'ethers'; +import type { FunctionFragment, Result, EventFragment } from '@ethersproject/abi'; +import type { Listener, Provider } from '@ethersproject/providers'; +import type { TypedEventFilter, TypedEvent, TypedListener, OnEvent } from './common'; + +export declare namespace IVault { + export type BatchSwapStepStruct = { + poolId: BytesLike; + assetInIndex: BigNumberish; + assetOutIndex: BigNumberish; + amount: BigNumberish; + userData: BytesLike; + }; + + export type BatchSwapStepStructOutput = [string, BigNumber, BigNumber, BigNumber, string] & { + poolId: string; + assetInIndex: BigNumber; + assetOutIndex: BigNumber; + amount: BigNumber; + userData: string; + }; + + export type FundManagementStruct = { + sender: string; + fromInternalBalance: boolean; + recipient: string; + toInternalBalance: boolean; + }; + + export type FundManagementStructOutput = [string, boolean, string, boolean] & { + sender: string; + fromInternalBalance: boolean; + recipient: string; + toInternalBalance: boolean; + }; + + export type ExitPoolRequestStruct = { + assets: string[]; + minAmountsOut: BigNumberish[]; + userData: BytesLike; + toInternalBalance: boolean; + }; + + export type ExitPoolRequestStructOutput = [string[], BigNumber[], string, boolean] & { + assets: string[]; + minAmountsOut: BigNumber[]; + userData: string; + toInternalBalance: boolean; + }; + + export type JoinPoolRequestStruct = { + assets: string[]; + maxAmountsIn: BigNumberish[]; + userData: BytesLike; + fromInternalBalance: boolean; + }; + + export type JoinPoolRequestStructOutput = [string[], BigNumber[], string, boolean] & { + assets: string[]; + maxAmountsIn: BigNumber[]; + userData: string; + fromInternalBalance: boolean; + }; + + export type PoolBalanceOpStruct = { + kind: BigNumberish; + poolId: BytesLike; + token: string; + amount: BigNumberish; + }; + + export type PoolBalanceOpStructOutput = [number, string, string, BigNumber] & { + kind: number; + poolId: string; + token: string; + amount: BigNumber; + }; + + export type UserBalanceOpStruct = { + kind: BigNumberish; + asset: string; + amount: BigNumberish; + sender: string; + recipient: string; + }; + + export type UserBalanceOpStructOutput = [number, string, BigNumber, string, string] & { + kind: number; + asset: string; + amount: BigNumber; + sender: string; + recipient: string; + }; + + export type SingleSwapStruct = { + poolId: BytesLike; + kind: BigNumberish; + assetIn: string; + assetOut: string; + amount: BigNumberish; + userData: BytesLike; + }; + + export type SingleSwapStructOutput = [string, number, string, string, BigNumber, string] & { + poolId: string; + kind: number; + assetIn: string; + assetOut: string; + amount: BigNumber; + userData: string; + }; +} + +export interface KoyoVaultInterface extends utils.Interface { + functions: { + 'WETH()': FunctionFragment; + 'batchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool),int256[],uint256)': FunctionFragment; + 'deregisterTokens(bytes32,address[])': FunctionFragment; + 'exitPool(bytes32,address,address,(address[],uint256[],bytes,bool))': FunctionFragment; + 'flashLoan(address,address[],uint256[],bytes)': FunctionFragment; + 'getActionId(bytes4)': FunctionFragment; + 'getAuthorizer()': FunctionFragment; + 'getDomainSeparator()': FunctionFragment; + 'getInternalBalance(address,address[])': FunctionFragment; + 'getNextNonce(address)': FunctionFragment; + 'getPausedState()': FunctionFragment; + 'getPool(bytes32)': FunctionFragment; + 'getPoolTokenInfo(bytes32,address)': FunctionFragment; + 'getPoolTokens(bytes32)': FunctionFragment; + 'getProtocolFeesCollector()': FunctionFragment; + 'hasApprovedRelayer(address,address)': FunctionFragment; + 'joinPool(bytes32,address,address,(address[],uint256[],bytes,bool))': FunctionFragment; + 'managePoolBalance((uint8,bytes32,address,uint256)[])': FunctionFragment; + 'manageUserBalance((uint8,address,uint256,address,address)[])': FunctionFragment; + 'queryBatchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool))': FunctionFragment; + 'registerPool(uint8)': FunctionFragment; + 'registerTokens(bytes32,address[],address[])': FunctionFragment; + 'setAuthorizer(address)': FunctionFragment; + 'setPaused(bool)': FunctionFragment; + 'setRelayerApproval(address,address,bool)': FunctionFragment; + 'swap((bytes32,uint8,address,address,uint256,bytes),(address,bool,address,bool),uint256,uint256)': FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | 'WETH' + | 'batchSwap' + | 'deregisterTokens' + | 'exitPool' + | 'flashLoan' + | 'getActionId' + | 'getAuthorizer' + | 'getDomainSeparator' + | 'getInternalBalance' + | 'getNextNonce' + | 'getPausedState' + | 'getPool' + | 'getPoolTokenInfo' + | 'getPoolTokens' + | 'getProtocolFeesCollector' + | 'hasApprovedRelayer' + | 'joinPool' + | 'managePoolBalance' + | 'manageUserBalance' + | 'queryBatchSwap' + | 'registerPool' + | 'registerTokens' + | 'setAuthorizer' + | 'setPaused' + | 'setRelayerApproval' + | 'swap', + ): FunctionFragment; + + encodeFunctionData(functionFragment: 'WETH', values?: undefined): string; + encodeFunctionData( + functionFragment: 'batchSwap', + values: [ + BigNumberish, + IVault.BatchSwapStepStruct[], + string[], + IVault.FundManagementStruct, + BigNumberish[], + BigNumberish, + ], + ): string; + encodeFunctionData(functionFragment: 'deregisterTokens', values: [BytesLike, string[]]): string; + encodeFunctionData( + functionFragment: 'exitPool', + values: [BytesLike, string, string, IVault.ExitPoolRequestStruct], + ): string; + encodeFunctionData(functionFragment: 'flashLoan', values: [string, string[], BigNumberish[], BytesLike]): string; + encodeFunctionData(functionFragment: 'getActionId', values: [BytesLike]): string; + encodeFunctionData(functionFragment: 'getAuthorizer', values?: undefined): string; + encodeFunctionData(functionFragment: 'getDomainSeparator', values?: undefined): string; + encodeFunctionData(functionFragment: 'getInternalBalance', values: [string, string[]]): string; + encodeFunctionData(functionFragment: 'getNextNonce', values: [string]): string; + encodeFunctionData(functionFragment: 'getPausedState', values?: undefined): string; + encodeFunctionData(functionFragment: 'getPool', values: [BytesLike]): string; + encodeFunctionData(functionFragment: 'getPoolTokenInfo', values: [BytesLike, string]): string; + encodeFunctionData(functionFragment: 'getPoolTokens', values: [BytesLike]): string; + encodeFunctionData(functionFragment: 'getProtocolFeesCollector', values?: undefined): string; + encodeFunctionData(functionFragment: 'hasApprovedRelayer', values: [string, string]): string; + encodeFunctionData( + functionFragment: 'joinPool', + values: [BytesLike, string, string, IVault.JoinPoolRequestStruct], + ): string; + encodeFunctionData(functionFragment: 'managePoolBalance', values: [IVault.PoolBalanceOpStruct[]]): string; + encodeFunctionData(functionFragment: 'manageUserBalance', values: [IVault.UserBalanceOpStruct[]]): string; + encodeFunctionData( + functionFragment: 'queryBatchSwap', + values: [BigNumberish, IVault.BatchSwapStepStruct[], string[], IVault.FundManagementStruct], + ): string; + encodeFunctionData(functionFragment: 'registerPool', values: [BigNumberish]): string; + encodeFunctionData(functionFragment: 'registerTokens', values: [BytesLike, string[], string[]]): string; + encodeFunctionData(functionFragment: 'setAuthorizer', values: [string]): string; + encodeFunctionData(functionFragment: 'setPaused', values: [boolean]): string; + encodeFunctionData(functionFragment: 'setRelayerApproval', values: [string, string, boolean]): string; + encodeFunctionData( + functionFragment: 'swap', + values: [IVault.SingleSwapStruct, IVault.FundManagementStruct, BigNumberish, BigNumberish], + ): string; + + decodeFunctionResult(functionFragment: 'WETH', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'batchSwap', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'deregisterTokens', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'exitPool', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'flashLoan', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'getActionId', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'getAuthorizer', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'getDomainSeparator', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'getInternalBalance', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'getNextNonce', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'getPausedState', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'getPool', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'getPoolTokenInfo', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'getPoolTokens', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'getProtocolFeesCollector', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'hasApprovedRelayer', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'joinPool', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'managePoolBalance', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'manageUserBalance', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'queryBatchSwap', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'registerPool', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'registerTokens', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'setAuthorizer', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'setPaused', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'setRelayerApproval', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'swap', data: BytesLike): Result; + + events: { + 'AuthorizerChanged(address)': EventFragment; + 'ExternalBalanceTransfer(address,address,address,uint256)': EventFragment; + 'FlashLoan(address,address,uint256,uint256)': EventFragment; + 'InternalBalanceChanged(address,address,int256)': EventFragment; + 'PausedStateChanged(bool)': EventFragment; + 'PoolBalanceChanged(bytes32,address,address[],int256[],uint256[])': EventFragment; + 'PoolBalanceManaged(bytes32,address,address,int256,int256)': EventFragment; + 'PoolRegistered(bytes32,address,uint8)': EventFragment; + 'RelayerApprovalChanged(address,address,bool)': EventFragment; + 'Swap(bytes32,address,address,uint256,uint256)': EventFragment; + 'TokensDeregistered(bytes32,address[])': EventFragment; + 'TokensRegistered(bytes32,address[],address[])': EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: 'AuthorizerChanged'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'ExternalBalanceTransfer'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'FlashLoan'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'InternalBalanceChanged'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'PausedStateChanged'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'PoolBalanceChanged'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'PoolBalanceManaged'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'PoolRegistered'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'RelayerApprovalChanged'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'Swap'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'TokensDeregistered'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'TokensRegistered'): EventFragment; +} + +export interface AuthorizerChangedEventObject { + newAuthorizer: string; +} +export type AuthorizerChangedEvent = TypedEvent<[string], AuthorizerChangedEventObject>; + +export type AuthorizerChangedEventFilter = TypedEventFilter; + +export interface ExternalBalanceTransferEventObject { + token: string; + sender: string; + recipient: string; + amount: BigNumber; +} +export type ExternalBalanceTransferEvent = TypedEvent< + [string, string, string, BigNumber], + ExternalBalanceTransferEventObject +>; + +export type ExternalBalanceTransferEventFilter = TypedEventFilter; + +export interface FlashLoanEventObject { + recipient: string; + token: string; + amount: BigNumber; + feeAmount: BigNumber; +} +export type FlashLoanEvent = TypedEvent<[string, string, BigNumber, BigNumber], FlashLoanEventObject>; + +export type FlashLoanEventFilter = TypedEventFilter; + +export interface InternalBalanceChangedEventObject { + user: string; + token: string; + delta: BigNumber; +} +export type InternalBalanceChangedEvent = TypedEvent<[string, string, BigNumber], InternalBalanceChangedEventObject>; + +export type InternalBalanceChangedEventFilter = TypedEventFilter; + +export interface PausedStateChangedEventObject { + paused: boolean; +} +export type PausedStateChangedEvent = TypedEvent<[boolean], PausedStateChangedEventObject>; + +export type PausedStateChangedEventFilter = TypedEventFilter; + +export interface PoolBalanceChangedEventObject { + poolId: string; + liquidityProvider: string; + tokens: string[]; + deltas: BigNumber[]; + protocolFeeAmounts: BigNumber[]; +} +export type PoolBalanceChangedEvent = TypedEvent< + [string, string, string[], BigNumber[], BigNumber[]], + PoolBalanceChangedEventObject +>; + +export type PoolBalanceChangedEventFilter = TypedEventFilter; + +export interface PoolBalanceManagedEventObject { + poolId: string; + assetManager: string; + token: string; + cashDelta: BigNumber; + managedDelta: BigNumber; +} +export type PoolBalanceManagedEvent = TypedEvent< + [string, string, string, BigNumber, BigNumber], + PoolBalanceManagedEventObject +>; + +export type PoolBalanceManagedEventFilter = TypedEventFilter; + +export interface PoolRegisteredEventObject { + poolId: string; + poolAddress: string; + specialization: number; +} +export type PoolRegisteredEvent = TypedEvent<[string, string, number], PoolRegisteredEventObject>; + +export type PoolRegisteredEventFilter = TypedEventFilter; + +export interface RelayerApprovalChangedEventObject { + relayer: string; + sender: string; + approved: boolean; +} +export type RelayerApprovalChangedEvent = TypedEvent<[string, string, boolean], RelayerApprovalChangedEventObject>; + +export type RelayerApprovalChangedEventFilter = TypedEventFilter; + +export interface SwapEventObject { + poolId: string; + tokenIn: string; + tokenOut: string; + amountIn: BigNumber; + amountOut: BigNumber; +} +export type SwapEvent = TypedEvent<[string, string, string, BigNumber, BigNumber], SwapEventObject>; + +export type SwapEventFilter = TypedEventFilter; + +export interface TokensDeregisteredEventObject { + poolId: string; + tokens: string[]; +} +export type TokensDeregisteredEvent = TypedEvent<[string, string[]], TokensDeregisteredEventObject>; + +export type TokensDeregisteredEventFilter = TypedEventFilter; + +export interface TokensRegisteredEventObject { + poolId: string; + tokens: string[]; + assetManagers: string[]; +} +export type TokensRegisteredEvent = TypedEvent<[string, string[], string[]], TokensRegisteredEventObject>; + +export type TokensRegisteredEventFilter = TypedEventFilter; + +export interface KoyoVault extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: KoyoVaultInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined, + ): Promise>; + + listeners(eventFilter?: TypedEventFilter): Array>; + listeners(eventName?: string): Array; + removeAllListeners(eventFilter: TypedEventFilter): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + WETH(overrides?: CallOverrides): Promise<[string]>; + + batchSwap( + kind: BigNumberish, + swaps: IVault.BatchSwapStepStruct[], + assets: string[], + funds: IVault.FundManagementStruct, + limits: BigNumberish[], + deadline: BigNumberish, + overrides?: PayableOverrides & { from?: string | Promise }, + ): Promise; + + deregisterTokens( + poolId: BytesLike, + tokens: string[], + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + exitPool( + poolId: BytesLike, + sender: string, + recipient: string, + request: IVault.ExitPoolRequestStruct, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + flashLoan( + recipient: string, + tokens: string[], + amounts: BigNumberish[], + userData: BytesLike, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + getActionId(selector: BytesLike, overrides?: CallOverrides): Promise<[string]>; + + getAuthorizer(overrides?: CallOverrides): Promise<[string]>; + + getDomainSeparator(overrides?: CallOverrides): Promise<[string]>; + + getInternalBalance( + user: string, + tokens: string[], + overrides?: CallOverrides, + ): Promise<[BigNumber[]] & { balances: BigNumber[] }>; + + getNextNonce(user: string, overrides?: CallOverrides): Promise<[BigNumber]>; + + getPausedState(overrides?: CallOverrides): Promise< + [boolean, BigNumber, BigNumber] & { + paused: boolean; + pauseWindowEndTime: BigNumber; + bufferPeriodEndTime: BigNumber; + } + >; + + getPool(poolId: BytesLike, overrides?: CallOverrides): Promise<[string, number]>; + + getPoolTokenInfo( + poolId: BytesLike, + token: string, + overrides?: CallOverrides, + ): Promise< + [BigNumber, BigNumber, BigNumber, string] & { + cash: BigNumber; + managed: BigNumber; + lastChangeBlock: BigNumber; + assetManager: string; + } + >; + + getPoolTokens( + poolId: BytesLike, + overrides?: CallOverrides, + ): Promise< + [string[], BigNumber[], BigNumber] & { + tokens: string[]; + balances: BigNumber[]; + lastChangeBlock: BigNumber; + } + >; + + getProtocolFeesCollector(overrides?: CallOverrides): Promise<[string]>; + + hasApprovedRelayer(user: string, relayer: string, overrides?: CallOverrides): Promise<[boolean]>; + + joinPool( + poolId: BytesLike, + sender: string, + recipient: string, + request: IVault.JoinPoolRequestStruct, + overrides?: PayableOverrides & { from?: string | Promise }, + ): Promise; + + managePoolBalance( + ops: IVault.PoolBalanceOpStruct[], + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + manageUserBalance( + ops: IVault.UserBalanceOpStruct[], + overrides?: PayableOverrides & { from?: string | Promise }, + ): Promise; + + queryBatchSwap( + kind: BigNumberish, + swaps: IVault.BatchSwapStepStruct[], + assets: string[], + funds: IVault.FundManagementStruct, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + registerPool( + specialization: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + registerTokens( + poolId: BytesLike, + tokens: string[], + assetManagers: string[], + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + setAuthorizer( + newAuthorizer: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + setPaused( + paused: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + setRelayerApproval( + sender: string, + relayer: string, + approved: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + swap( + singleSwap: IVault.SingleSwapStruct, + funds: IVault.FundManagementStruct, + limit: BigNumberish, + deadline: BigNumberish, + overrides?: PayableOverrides & { from?: string | Promise }, + ): Promise; + }; + + WETH(overrides?: CallOverrides): Promise; + + batchSwap( + kind: BigNumberish, + swaps: IVault.BatchSwapStepStruct[], + assets: string[], + funds: IVault.FundManagementStruct, + limits: BigNumberish[], + deadline: BigNumberish, + overrides?: PayableOverrides & { from?: string | Promise }, + ): Promise; + + deregisterTokens( + poolId: BytesLike, + tokens: string[], + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + exitPool( + poolId: BytesLike, + sender: string, + recipient: string, + request: IVault.ExitPoolRequestStruct, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + flashLoan( + recipient: string, + tokens: string[], + amounts: BigNumberish[], + userData: BytesLike, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + getActionId(selector: BytesLike, overrides?: CallOverrides): Promise; + + getAuthorizer(overrides?: CallOverrides): Promise; + + getDomainSeparator(overrides?: CallOverrides): Promise; + + getInternalBalance(user: string, tokens: string[], overrides?: CallOverrides): Promise; + + getNextNonce(user: string, overrides?: CallOverrides): Promise; + + getPausedState(overrides?: CallOverrides): Promise< + [boolean, BigNumber, BigNumber] & { + paused: boolean; + pauseWindowEndTime: BigNumber; + bufferPeriodEndTime: BigNumber; + } + >; + + getPool(poolId: BytesLike, overrides?: CallOverrides): Promise<[string, number]>; + + getPoolTokenInfo( + poolId: BytesLike, + token: string, + overrides?: CallOverrides, + ): Promise< + [BigNumber, BigNumber, BigNumber, string] & { + cash: BigNumber; + managed: BigNumber; + lastChangeBlock: BigNumber; + assetManager: string; + } + >; + + getPoolTokens( + poolId: BytesLike, + overrides?: CallOverrides, + ): Promise< + [string[], BigNumber[], BigNumber] & { + tokens: string[]; + balances: BigNumber[]; + lastChangeBlock: BigNumber; + } + >; + + getProtocolFeesCollector(overrides?: CallOverrides): Promise; + + hasApprovedRelayer(user: string, relayer: string, overrides?: CallOverrides): Promise; + + joinPool( + poolId: BytesLike, + sender: string, + recipient: string, + request: IVault.JoinPoolRequestStruct, + overrides?: PayableOverrides & { from?: string | Promise }, + ): Promise; + + managePoolBalance( + ops: IVault.PoolBalanceOpStruct[], + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + manageUserBalance( + ops: IVault.UserBalanceOpStruct[], + overrides?: PayableOverrides & { from?: string | Promise }, + ): Promise; + + queryBatchSwap( + kind: BigNumberish, + swaps: IVault.BatchSwapStepStruct[], + assets: string[], + funds: IVault.FundManagementStruct, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + registerPool( + specialization: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + registerTokens( + poolId: BytesLike, + tokens: string[], + assetManagers: string[], + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + setAuthorizer( + newAuthorizer: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + setPaused(paused: boolean, overrides?: Overrides & { from?: string | Promise }): Promise; + + setRelayerApproval( + sender: string, + relayer: string, + approved: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + swap( + singleSwap: IVault.SingleSwapStruct, + funds: IVault.FundManagementStruct, + limit: BigNumberish, + deadline: BigNumberish, + overrides?: PayableOverrides & { from?: string | Promise }, + ): Promise; + + callStatic: { + WETH(overrides?: CallOverrides): Promise; + + batchSwap( + kind: BigNumberish, + swaps: IVault.BatchSwapStepStruct[], + assets: string[], + funds: IVault.FundManagementStruct, + limits: BigNumberish[], + deadline: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + deregisterTokens(poolId: BytesLike, tokens: string[], overrides?: CallOverrides): Promise; + + exitPool( + poolId: BytesLike, + sender: string, + recipient: string, + request: IVault.ExitPoolRequestStruct, + overrides?: CallOverrides, + ): Promise; + + flashLoan( + recipient: string, + tokens: string[], + amounts: BigNumberish[], + userData: BytesLike, + overrides?: CallOverrides, + ): Promise; + + getActionId(selector: BytesLike, overrides?: CallOverrides): Promise; + + getAuthorizer(overrides?: CallOverrides): Promise; + + getDomainSeparator(overrides?: CallOverrides): Promise; + + getInternalBalance(user: string, tokens: string[], overrides?: CallOverrides): Promise; + + getNextNonce(user: string, overrides?: CallOverrides): Promise; + + getPausedState(overrides?: CallOverrides): Promise< + [boolean, BigNumber, BigNumber] & { + paused: boolean; + pauseWindowEndTime: BigNumber; + bufferPeriodEndTime: BigNumber; + } + >; + + getPool(poolId: BytesLike, overrides?: CallOverrides): Promise<[string, number]>; + + getPoolTokenInfo( + poolId: BytesLike, + token: string, + overrides?: CallOverrides, + ): Promise< + [BigNumber, BigNumber, BigNumber, string] & { + cash: BigNumber; + managed: BigNumber; + lastChangeBlock: BigNumber; + assetManager: string; + } + >; + + getPoolTokens( + poolId: BytesLike, + overrides?: CallOverrides, + ): Promise< + [string[], BigNumber[], BigNumber] & { + tokens: string[]; + balances: BigNumber[]; + lastChangeBlock: BigNumber; + } + >; + + getProtocolFeesCollector(overrides?: CallOverrides): Promise; + + hasApprovedRelayer(user: string, relayer: string, overrides?: CallOverrides): Promise; + + joinPool( + poolId: BytesLike, + sender: string, + recipient: string, + request: IVault.JoinPoolRequestStruct, + overrides?: CallOverrides, + ): Promise; + + managePoolBalance(ops: IVault.PoolBalanceOpStruct[], overrides?: CallOverrides): Promise; + + manageUserBalance(ops: IVault.UserBalanceOpStruct[], overrides?: CallOverrides): Promise; + + queryBatchSwap( + kind: BigNumberish, + swaps: IVault.BatchSwapStepStruct[], + assets: string[], + funds: IVault.FundManagementStruct, + overrides?: CallOverrides, + ): Promise; + + registerPool(specialization: BigNumberish, overrides?: CallOverrides): Promise; + + registerTokens( + poolId: BytesLike, + tokens: string[], + assetManagers: string[], + overrides?: CallOverrides, + ): Promise; + + setAuthorizer(newAuthorizer: string, overrides?: CallOverrides): Promise; + + setPaused(paused: boolean, overrides?: CallOverrides): Promise; + + setRelayerApproval(sender: string, relayer: string, approved: boolean, overrides?: CallOverrides): Promise; + + swap( + singleSwap: IVault.SingleSwapStruct, + funds: IVault.FundManagementStruct, + limit: BigNumberish, + deadline: BigNumberish, + overrides?: CallOverrides, + ): Promise; + }; + + filters: { + 'AuthorizerChanged(address)'(newAuthorizer?: string | null): AuthorizerChangedEventFilter; + AuthorizerChanged(newAuthorizer?: string | null): AuthorizerChangedEventFilter; + + 'ExternalBalanceTransfer(address,address,address,uint256)'( + token?: string | null, + sender?: string | null, + recipient?: null, + amount?: null, + ): ExternalBalanceTransferEventFilter; + ExternalBalanceTransfer( + token?: string | null, + sender?: string | null, + recipient?: null, + amount?: null, + ): ExternalBalanceTransferEventFilter; + + 'FlashLoan(address,address,uint256,uint256)'( + recipient?: string | null, + token?: string | null, + amount?: null, + feeAmount?: null, + ): FlashLoanEventFilter; + FlashLoan(recipient?: string | null, token?: string | null, amount?: null, feeAmount?: null): FlashLoanEventFilter; + + 'InternalBalanceChanged(address,address,int256)'( + user?: string | null, + token?: string | null, + delta?: null, + ): InternalBalanceChangedEventFilter; + InternalBalanceChanged( + user?: string | null, + token?: string | null, + delta?: null, + ): InternalBalanceChangedEventFilter; + + 'PausedStateChanged(bool)'(paused?: null): PausedStateChangedEventFilter; + PausedStateChanged(paused?: null): PausedStateChangedEventFilter; + + 'PoolBalanceChanged(bytes32,address,address[],int256[],uint256[])'( + poolId?: BytesLike | null, + liquidityProvider?: string | null, + tokens?: null, + deltas?: null, + protocolFeeAmounts?: null, + ): PoolBalanceChangedEventFilter; + PoolBalanceChanged( + poolId?: BytesLike | null, + liquidityProvider?: string | null, + tokens?: null, + deltas?: null, + protocolFeeAmounts?: null, + ): PoolBalanceChangedEventFilter; + + 'PoolBalanceManaged(bytes32,address,address,int256,int256)'( + poolId?: BytesLike | null, + assetManager?: string | null, + token?: string | null, + cashDelta?: null, + managedDelta?: null, + ): PoolBalanceManagedEventFilter; + PoolBalanceManaged( + poolId?: BytesLike | null, + assetManager?: string | null, + token?: string | null, + cashDelta?: null, + managedDelta?: null, + ): PoolBalanceManagedEventFilter; + + 'PoolRegistered(bytes32,address,uint8)'( + poolId?: BytesLike | null, + poolAddress?: string | null, + specialization?: null, + ): PoolRegisteredEventFilter; + PoolRegistered( + poolId?: BytesLike | null, + poolAddress?: string | null, + specialization?: null, + ): PoolRegisteredEventFilter; + + 'RelayerApprovalChanged(address,address,bool)'( + relayer?: string | null, + sender?: string | null, + approved?: null, + ): RelayerApprovalChangedEventFilter; + RelayerApprovalChanged( + relayer?: string | null, + sender?: string | null, + approved?: null, + ): RelayerApprovalChangedEventFilter; + + 'Swap(bytes32,address,address,uint256,uint256)'( + poolId?: BytesLike | null, + tokenIn?: string | null, + tokenOut?: string | null, + amountIn?: null, + amountOut?: null, + ): SwapEventFilter; + Swap( + poolId?: BytesLike | null, + tokenIn?: string | null, + tokenOut?: string | null, + amountIn?: null, + amountOut?: null, + ): SwapEventFilter; + + 'TokensDeregistered(bytes32,address[])'(poolId?: BytesLike | null, tokens?: null): TokensDeregisteredEventFilter; + TokensDeregistered(poolId?: BytesLike | null, tokens?: null): TokensDeregisteredEventFilter; + + 'TokensRegistered(bytes32,address[],address[])'( + poolId?: BytesLike | null, + tokens?: null, + assetManagers?: null, + ): TokensRegisteredEventFilter; + TokensRegistered(poolId?: BytesLike | null, tokens?: null, assetManagers?: null): TokensRegisteredEventFilter; + }; + + estimateGas: { + WETH(overrides?: CallOverrides): Promise; + + batchSwap( + kind: BigNumberish, + swaps: IVault.BatchSwapStepStruct[], + assets: string[], + funds: IVault.FundManagementStruct, + limits: BigNumberish[], + deadline: BigNumberish, + overrides?: PayableOverrides & { from?: string | Promise }, + ): Promise; + + deregisterTokens( + poolId: BytesLike, + tokens: string[], + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + exitPool( + poolId: BytesLike, + sender: string, + recipient: string, + request: IVault.ExitPoolRequestStruct, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + flashLoan( + recipient: string, + tokens: string[], + amounts: BigNumberish[], + userData: BytesLike, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + getActionId(selector: BytesLike, overrides?: CallOverrides): Promise; + + getAuthorizer(overrides?: CallOverrides): Promise; + + getDomainSeparator(overrides?: CallOverrides): Promise; + + getInternalBalance(user: string, tokens: string[], overrides?: CallOverrides): Promise; + + getNextNonce(user: string, overrides?: CallOverrides): Promise; + + getPausedState(overrides?: CallOverrides): Promise; + + getPool(poolId: BytesLike, overrides?: CallOverrides): Promise; + + getPoolTokenInfo(poolId: BytesLike, token: string, overrides?: CallOverrides): Promise; + + getPoolTokens(poolId: BytesLike, overrides?: CallOverrides): Promise; + + getProtocolFeesCollector(overrides?: CallOverrides): Promise; + + hasApprovedRelayer(user: string, relayer: string, overrides?: CallOverrides): Promise; + + joinPool( + poolId: BytesLike, + sender: string, + recipient: string, + request: IVault.JoinPoolRequestStruct, + overrides?: PayableOverrides & { from?: string | Promise }, + ): Promise; + + managePoolBalance( + ops: IVault.PoolBalanceOpStruct[], + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + manageUserBalance( + ops: IVault.UserBalanceOpStruct[], + overrides?: PayableOverrides & { from?: string | Promise }, + ): Promise; + + queryBatchSwap( + kind: BigNumberish, + swaps: IVault.BatchSwapStepStruct[], + assets: string[], + funds: IVault.FundManagementStruct, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + registerPool( + specialization: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + registerTokens( + poolId: BytesLike, + tokens: string[], + assetManagers: string[], + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + setAuthorizer( + newAuthorizer: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + setPaused(paused: boolean, overrides?: Overrides & { from?: string | Promise }): Promise; + + setRelayerApproval( + sender: string, + relayer: string, + approved: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + swap( + singleSwap: IVault.SingleSwapStruct, + funds: IVault.FundManagementStruct, + limit: BigNumberish, + deadline: BigNumberish, + overrides?: PayableOverrides & { from?: string | Promise }, + ): Promise; + }; + + populateTransaction: { + WETH(overrides?: CallOverrides): Promise; + + batchSwap( + kind: BigNumberish, + swaps: IVault.BatchSwapStepStruct[], + assets: string[], + funds: IVault.FundManagementStruct, + limits: BigNumberish[], + deadline: BigNumberish, + overrides?: PayableOverrides & { from?: string | Promise }, + ): Promise; + + deregisterTokens( + poolId: BytesLike, + tokens: string[], + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + exitPool( + poolId: BytesLike, + sender: string, + recipient: string, + request: IVault.ExitPoolRequestStruct, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + flashLoan( + recipient: string, + tokens: string[], + amounts: BigNumberish[], + userData: BytesLike, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + getActionId(selector: BytesLike, overrides?: CallOverrides): Promise; + + getAuthorizer(overrides?: CallOverrides): Promise; + + getDomainSeparator(overrides?: CallOverrides): Promise; + + getInternalBalance(user: string, tokens: string[], overrides?: CallOverrides): Promise; + + getNextNonce(user: string, overrides?: CallOverrides): Promise; + + getPausedState(overrides?: CallOverrides): Promise; + + getPool(poolId: BytesLike, overrides?: CallOverrides): Promise; + + getPoolTokenInfo(poolId: BytesLike, token: string, overrides?: CallOverrides): Promise; + + getPoolTokens(poolId: BytesLike, overrides?: CallOverrides): Promise; + + getProtocolFeesCollector(overrides?: CallOverrides): Promise; + + hasApprovedRelayer(user: string, relayer: string, overrides?: CallOverrides): Promise; + + joinPool( + poolId: BytesLike, + sender: string, + recipient: string, + request: IVault.JoinPoolRequestStruct, + overrides?: PayableOverrides & { from?: string | Promise }, + ): Promise; + + managePoolBalance( + ops: IVault.PoolBalanceOpStruct[], + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + manageUserBalance( + ops: IVault.UserBalanceOpStruct[], + overrides?: PayableOverrides & { from?: string | Promise }, + ): Promise; + + queryBatchSwap( + kind: BigNumberish, + swaps: IVault.BatchSwapStepStruct[], + assets: string[], + funds: IVault.FundManagementStruct, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + registerPool( + specialization: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + registerTokens( + poolId: BytesLike, + tokens: string[], + assetManagers: string[], + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + setAuthorizer( + newAuthorizer: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + setPaused( + paused: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + setRelayerApproval( + sender: string, + relayer: string, + approved: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + swap( + singleSwap: IVault.SingleSwapStruct, + funds: IVault.FundManagementStruct, + limit: BigNumberish, + deadline: BigNumberish, + overrides?: PayableOverrides & { from?: string | Promise }, + ): Promise; + }; +} diff --git a/src/apps/koyo/contracts/ethers/common.ts b/src/apps/koyo/contracts/ethers/common.ts new file mode 100644 index 000000000..6cfb10425 --- /dev/null +++ b/src/apps/koyo/contracts/ethers/common.ts @@ -0,0 +1,30 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { Listener } from '@ethersproject/providers'; +import type { Event, EventFilter } from 'ethers'; + +export interface TypedEvent = any, TArgsObject = any> extends Event { + args: TArgsArray & TArgsObject; +} + +export interface TypedEventFilter<_TEvent extends TypedEvent> extends EventFilter {} + +export interface TypedListener { + (...listenerArg: [...__TypechainArgsArray, TEvent]): void; +} + +type __TypechainArgsArray = T extends TypedEvent ? U : never; + +export interface OnEvent { + (eventFilter: TypedEventFilter, listener: TypedListener): TRes; + (eventName: string, listener: Listener): TRes; +} + +export type MinEthersFactory = { + deploy(...a: ARGS[]): Promise; +}; + +export type GetContractTypeFromFactory = F extends MinEthersFactory ? C : never; + +export type GetARGsTypeFromFactory = F extends MinEthersFactory ? Parameters : never; diff --git a/src/apps/koyo/contracts/ethers/factories/KoyoPool__factory.ts b/src/apps/koyo/contracts/ethers/factories/KoyoPool__factory.ts new file mode 100644 index 000000000..a7058dd01 --- /dev/null +++ b/src/apps/koyo/contracts/ethers/factories/KoyoPool__factory.ts @@ -0,0 +1,919 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from 'ethers'; +import type { Provider } from '@ethersproject/providers'; +import type { KoyoPool, KoyoPoolInterface } from '../KoyoPool'; + +const _abi = [ + { + inputs: [ + { + internalType: 'contract IVault', + name: 'vault', + type: 'address', + }, + { + internalType: 'string', + name: 'name', + type: 'string', + }, + { + internalType: 'string', + name: 'symbol', + type: 'string', + }, + { + internalType: 'contract IERC20[]', + name: 'tokens', + type: 'address[]', + }, + { + internalType: 'uint256[]', + name: 'normalizedWeights', + type: 'uint256[]', + }, + { + internalType: 'uint256', + name: 'swapFeePercentage', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'pauseWindowDuration', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'bufferPeriodDuration', + type: 'uint256', + }, + { + internalType: 'address', + name: 'owner', + type: 'address', + }, + ], + stateMutability: 'nonpayable', + type: 'constructor', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'owner', + type: 'address', + }, + { + indexed: true, + internalType: 'address', + name: 'spender', + type: 'address', + }, + { + indexed: false, + internalType: 'uint256', + name: 'value', + type: 'uint256', + }, + ], + name: 'Approval', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'bool', + name: 'paused', + type: 'bool', + }, + ], + name: 'PausedStateChanged', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'uint256', + name: 'swapFeePercentage', + type: 'uint256', + }, + ], + name: 'SwapFeePercentageChanged', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'from', + type: 'address', + }, + { + indexed: true, + internalType: 'address', + name: 'to', + type: 'address', + }, + { + indexed: false, + internalType: 'uint256', + name: 'value', + type: 'uint256', + }, + ], + name: 'Transfer', + type: 'event', + }, + { + inputs: [], + name: 'DOMAIN_SEPARATOR', + outputs: [ + { + internalType: 'bytes32', + name: '', + type: 'bytes32', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'owner', + type: 'address', + }, + { + internalType: 'address', + name: 'spender', + type: 'address', + }, + ], + name: 'allowance', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'spender', + type: 'address', + }, + { + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + ], + name: 'approve', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'account', + type: 'address', + }, + ], + name: 'balanceOf', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'decimals', + outputs: [ + { + internalType: 'uint8', + name: '', + type: 'uint8', + }, + ], + stateMutability: 'pure', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'spender', + type: 'address', + }, + { + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + ], + name: 'decreaseApproval', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes4', + name: 'selector', + type: 'bytes4', + }, + ], + name: 'getActionId', + outputs: [ + { + internalType: 'bytes32', + name: '', + type: 'bytes32', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getAuthorizer', + outputs: [ + { + internalType: 'contract IAuthorizer', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getInvariant', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getLastInvariant', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getNormalizedWeights', + outputs: [ + { + internalType: 'uint256[]', + name: '', + type: 'uint256[]', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getOwner', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getPausedState', + outputs: [ + { + internalType: 'bool', + name: 'paused', + type: 'bool', + }, + { + internalType: 'uint256', + name: 'pauseWindowEndTime', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'bufferPeriodEndTime', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getPoolId', + outputs: [ + { + internalType: 'bytes32', + name: '', + type: 'bytes32', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getRate', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getSwapFeePercentage', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getVault', + outputs: [ + { + internalType: 'contract IVault', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'spender', + type: 'address', + }, + { + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + ], + name: 'increaseApproval', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'name', + outputs: [ + { + internalType: 'string', + name: '', + type: 'string', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'owner', + type: 'address', + }, + ], + name: 'nonces', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'poolId', + type: 'bytes32', + }, + { + internalType: 'address', + name: 'sender', + type: 'address', + }, + { + internalType: 'address', + name: 'recipient', + type: 'address', + }, + { + internalType: 'uint256[]', + name: 'balances', + type: 'uint256[]', + }, + { + internalType: 'uint256', + name: 'lastChangeBlock', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'protocolSwapFeePercentage', + type: 'uint256', + }, + { + internalType: 'bytes', + name: 'userData', + type: 'bytes', + }, + ], + name: 'onExitPool', + outputs: [ + { + internalType: 'uint256[]', + name: '', + type: 'uint256[]', + }, + { + internalType: 'uint256[]', + name: '', + type: 'uint256[]', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'poolId', + type: 'bytes32', + }, + { + internalType: 'address', + name: 'sender', + type: 'address', + }, + { + internalType: 'address', + name: 'recipient', + type: 'address', + }, + { + internalType: 'uint256[]', + name: 'balances', + type: 'uint256[]', + }, + { + internalType: 'uint256', + name: 'lastChangeBlock', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'protocolSwapFeePercentage', + type: 'uint256', + }, + { + internalType: 'bytes', + name: 'userData', + type: 'bytes', + }, + ], + name: 'onJoinPool', + outputs: [ + { + internalType: 'uint256[]', + name: '', + type: 'uint256[]', + }, + { + internalType: 'uint256[]', + name: '', + type: 'uint256[]', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + components: [ + { + internalType: 'enum IVault.SwapKind', + name: 'kind', + type: 'uint8', + }, + { + internalType: 'contract IERC20', + name: 'tokenIn', + type: 'address', + }, + { + internalType: 'contract IERC20', + name: 'tokenOut', + type: 'address', + }, + { + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + { + internalType: 'bytes32', + name: 'poolId', + type: 'bytes32', + }, + { + internalType: 'uint256', + name: 'lastChangeBlock', + type: 'uint256', + }, + { + internalType: 'address', + name: 'from', + type: 'address', + }, + { + internalType: 'address', + name: 'to', + type: 'address', + }, + { + internalType: 'bytes', + name: 'userData', + type: 'bytes', + }, + ], + internalType: 'struct IPoolSwapStructs.SwapRequest', + name: 'request', + type: 'tuple', + }, + { + internalType: 'uint256', + name: 'balanceTokenIn', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'balanceTokenOut', + type: 'uint256', + }, + ], + name: 'onSwap', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'owner', + type: 'address', + }, + { + internalType: 'address', + name: 'spender', + type: 'address', + }, + { + internalType: 'uint256', + name: 'value', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'deadline', + type: 'uint256', + }, + { + internalType: 'uint8', + name: 'v', + type: 'uint8', + }, + { + internalType: 'bytes32', + name: 'r', + type: 'bytes32', + }, + { + internalType: 'bytes32', + name: 's', + type: 'bytes32', + }, + ], + name: 'permit', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'poolId', + type: 'bytes32', + }, + { + internalType: 'address', + name: 'sender', + type: 'address', + }, + { + internalType: 'address', + name: 'recipient', + type: 'address', + }, + { + internalType: 'uint256[]', + name: 'balances', + type: 'uint256[]', + }, + { + internalType: 'uint256', + name: 'lastChangeBlock', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'protocolSwapFeePercentage', + type: 'uint256', + }, + { + internalType: 'bytes', + name: 'userData', + type: 'bytes', + }, + ], + name: 'queryExit', + outputs: [ + { + internalType: 'uint256', + name: 'bptIn', + type: 'uint256', + }, + { + internalType: 'uint256[]', + name: 'amountsOut', + type: 'uint256[]', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'poolId', + type: 'bytes32', + }, + { + internalType: 'address', + name: 'sender', + type: 'address', + }, + { + internalType: 'address', + name: 'recipient', + type: 'address', + }, + { + internalType: 'uint256[]', + name: 'balances', + type: 'uint256[]', + }, + { + internalType: 'uint256', + name: 'lastChangeBlock', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'protocolSwapFeePercentage', + type: 'uint256', + }, + { + internalType: 'bytes', + name: 'userData', + type: 'bytes', + }, + ], + name: 'queryJoin', + outputs: [ + { + internalType: 'uint256', + name: 'bptOut', + type: 'uint256', + }, + { + internalType: 'uint256[]', + name: 'amountsIn', + type: 'uint256[]', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bool', + name: 'paused', + type: 'bool', + }, + ], + name: 'setPaused', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: 'swapFeePercentage', + type: 'uint256', + }, + ], + name: 'setSwapFeePercentage', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'symbol', + outputs: [ + { + internalType: 'string', + name: '', + type: 'string', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'totalSupply', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'recipient', + type: 'address', + }, + { + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + ], + name: 'transfer', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'sender', + type: 'address', + }, + { + internalType: 'address', + name: 'recipient', + type: 'address', + }, + { + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + ], + name: 'transferFrom', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, +]; + +export class KoyoPool__factory { + static readonly abi = _abi; + static createInterface(): KoyoPoolInterface { + return new utils.Interface(_abi) as KoyoPoolInterface; + } + static connect(address: string, signerOrProvider: Signer | Provider): KoyoPool { + return new Contract(address, _abi, signerOrProvider) as KoyoPool; + } +} diff --git a/src/apps/koyo/contracts/ethers/factories/KoyoVault__factory.ts b/src/apps/koyo/contracts/ethers/factories/KoyoVault__factory.ts new file mode 100644 index 000000000..4960aa80e --- /dev/null +++ b/src/apps/koyo/contracts/ethers/factories/KoyoVault__factory.ts @@ -0,0 +1,1197 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from 'ethers'; +import type { Provider } from '@ethersproject/providers'; +import type { KoyoVault, KoyoVaultInterface } from '../KoyoVault'; + +const _abi = [ + { + inputs: [ + { + internalType: 'contract IAuthorizer', + name: 'authorizer', + type: 'address', + }, + { + internalType: 'contract IWETH', + name: 'weth', + type: 'address', + }, + { + internalType: 'uint256', + name: 'pauseWindowDuration', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'bufferPeriodDuration', + type: 'uint256', + }, + ], + stateMutability: 'nonpayable', + type: 'constructor', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'contract IAuthorizer', + name: 'newAuthorizer', + type: 'address', + }, + ], + name: 'AuthorizerChanged', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'contract IERC20', + name: 'token', + type: 'address', + }, + { + indexed: true, + internalType: 'address', + name: 'sender', + type: 'address', + }, + { + indexed: false, + internalType: 'address', + name: 'recipient', + type: 'address', + }, + { + indexed: false, + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + ], + name: 'ExternalBalanceTransfer', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'contract IFlashLoanRecipient', + name: 'recipient', + type: 'address', + }, + { + indexed: true, + internalType: 'contract IERC20', + name: 'token', + type: 'address', + }, + { + indexed: false, + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + { + indexed: false, + internalType: 'uint256', + name: 'feeAmount', + type: 'uint256', + }, + ], + name: 'FlashLoan', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'user', + type: 'address', + }, + { + indexed: true, + internalType: 'contract IERC20', + name: 'token', + type: 'address', + }, + { + indexed: false, + internalType: 'int256', + name: 'delta', + type: 'int256', + }, + ], + name: 'InternalBalanceChanged', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'bool', + name: 'paused', + type: 'bool', + }, + ], + name: 'PausedStateChanged', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'poolId', + type: 'bytes32', + }, + { + indexed: true, + internalType: 'address', + name: 'liquidityProvider', + type: 'address', + }, + { + indexed: false, + internalType: 'contract IERC20[]', + name: 'tokens', + type: 'address[]', + }, + { + indexed: false, + internalType: 'int256[]', + name: 'deltas', + type: 'int256[]', + }, + { + indexed: false, + internalType: 'uint256[]', + name: 'protocolFeeAmounts', + type: 'uint256[]', + }, + ], + name: 'PoolBalanceChanged', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'poolId', + type: 'bytes32', + }, + { + indexed: true, + internalType: 'address', + name: 'assetManager', + type: 'address', + }, + { + indexed: true, + internalType: 'contract IERC20', + name: 'token', + type: 'address', + }, + { + indexed: false, + internalType: 'int256', + name: 'cashDelta', + type: 'int256', + }, + { + indexed: false, + internalType: 'int256', + name: 'managedDelta', + type: 'int256', + }, + ], + name: 'PoolBalanceManaged', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'poolId', + type: 'bytes32', + }, + { + indexed: true, + internalType: 'address', + name: 'poolAddress', + type: 'address', + }, + { + indexed: false, + internalType: 'enum IVault.PoolSpecialization', + name: 'specialization', + type: 'uint8', + }, + ], + name: 'PoolRegistered', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'relayer', + type: 'address', + }, + { + indexed: true, + internalType: 'address', + name: 'sender', + type: 'address', + }, + { + indexed: false, + internalType: 'bool', + name: 'approved', + type: 'bool', + }, + ], + name: 'RelayerApprovalChanged', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'poolId', + type: 'bytes32', + }, + { + indexed: true, + internalType: 'contract IERC20', + name: 'tokenIn', + type: 'address', + }, + { + indexed: true, + internalType: 'contract IERC20', + name: 'tokenOut', + type: 'address', + }, + { + indexed: false, + internalType: 'uint256', + name: 'amountIn', + type: 'uint256', + }, + { + indexed: false, + internalType: 'uint256', + name: 'amountOut', + type: 'uint256', + }, + ], + name: 'Swap', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'poolId', + type: 'bytes32', + }, + { + indexed: false, + internalType: 'contract IERC20[]', + name: 'tokens', + type: 'address[]', + }, + ], + name: 'TokensDeregistered', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'poolId', + type: 'bytes32', + }, + { + indexed: false, + internalType: 'contract IERC20[]', + name: 'tokens', + type: 'address[]', + }, + { + indexed: false, + internalType: 'address[]', + name: 'assetManagers', + type: 'address[]', + }, + ], + name: 'TokensRegistered', + type: 'event', + }, + { + inputs: [], + name: 'WETH', + outputs: [ + { + internalType: 'contract IWETH', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'enum IVault.SwapKind', + name: 'kind', + type: 'uint8', + }, + { + components: [ + { + internalType: 'bytes32', + name: 'poolId', + type: 'bytes32', + }, + { + internalType: 'uint256', + name: 'assetInIndex', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'assetOutIndex', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + { + internalType: 'bytes', + name: 'userData', + type: 'bytes', + }, + ], + internalType: 'struct IVault.BatchSwapStep[]', + name: 'swaps', + type: 'tuple[]', + }, + { + internalType: 'contract IAsset[]', + name: 'assets', + type: 'address[]', + }, + { + components: [ + { + internalType: 'address', + name: 'sender', + type: 'address', + }, + { + internalType: 'bool', + name: 'fromInternalBalance', + type: 'bool', + }, + { + internalType: 'address payable', + name: 'recipient', + type: 'address', + }, + { + internalType: 'bool', + name: 'toInternalBalance', + type: 'bool', + }, + ], + internalType: 'struct IVault.FundManagement', + name: 'funds', + type: 'tuple', + }, + { + internalType: 'int256[]', + name: 'limits', + type: 'int256[]', + }, + { + internalType: 'uint256', + name: 'deadline', + type: 'uint256', + }, + ], + name: 'batchSwap', + outputs: [ + { + internalType: 'int256[]', + name: 'assetDeltas', + type: 'int256[]', + }, + ], + stateMutability: 'payable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'poolId', + type: 'bytes32', + }, + { + internalType: 'contract IERC20[]', + name: 'tokens', + type: 'address[]', + }, + ], + name: 'deregisterTokens', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'poolId', + type: 'bytes32', + }, + { + internalType: 'address', + name: 'sender', + type: 'address', + }, + { + internalType: 'address payable', + name: 'recipient', + type: 'address', + }, + { + components: [ + { + internalType: 'contract IAsset[]', + name: 'assets', + type: 'address[]', + }, + { + internalType: 'uint256[]', + name: 'minAmountsOut', + type: 'uint256[]', + }, + { + internalType: 'bytes', + name: 'userData', + type: 'bytes', + }, + { + internalType: 'bool', + name: 'toInternalBalance', + type: 'bool', + }, + ], + internalType: 'struct IVault.ExitPoolRequest', + name: 'request', + type: 'tuple', + }, + ], + name: 'exitPool', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'contract IFlashLoanRecipient', + name: 'recipient', + type: 'address', + }, + { + internalType: 'contract IERC20[]', + name: 'tokens', + type: 'address[]', + }, + { + internalType: 'uint256[]', + name: 'amounts', + type: 'uint256[]', + }, + { + internalType: 'bytes', + name: 'userData', + type: 'bytes', + }, + ], + name: 'flashLoan', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes4', + name: 'selector', + type: 'bytes4', + }, + ], + name: 'getActionId', + outputs: [ + { + internalType: 'bytes32', + name: '', + type: 'bytes32', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getAuthorizer', + outputs: [ + { + internalType: 'contract IAuthorizer', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getDomainSeparator', + outputs: [ + { + internalType: 'bytes32', + name: '', + type: 'bytes32', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'user', + type: 'address', + }, + { + internalType: 'contract IERC20[]', + name: 'tokens', + type: 'address[]', + }, + ], + name: 'getInternalBalance', + outputs: [ + { + internalType: 'uint256[]', + name: 'balances', + type: 'uint256[]', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'user', + type: 'address', + }, + ], + name: 'getNextNonce', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getPausedState', + outputs: [ + { + internalType: 'bool', + name: 'paused', + type: 'bool', + }, + { + internalType: 'uint256', + name: 'pauseWindowEndTime', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'bufferPeriodEndTime', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'poolId', + type: 'bytes32', + }, + ], + name: 'getPool', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + { + internalType: 'enum IVault.PoolSpecialization', + name: '', + type: 'uint8', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'poolId', + type: 'bytes32', + }, + { + internalType: 'contract IERC20', + name: 'token', + type: 'address', + }, + ], + name: 'getPoolTokenInfo', + outputs: [ + { + internalType: 'uint256', + name: 'cash', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'managed', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'lastChangeBlock', + type: 'uint256', + }, + { + internalType: 'address', + name: 'assetManager', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'poolId', + type: 'bytes32', + }, + ], + name: 'getPoolTokens', + outputs: [ + { + internalType: 'contract IERC20[]', + name: 'tokens', + type: 'address[]', + }, + { + internalType: 'uint256[]', + name: 'balances', + type: 'uint256[]', + }, + { + internalType: 'uint256', + name: 'lastChangeBlock', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getProtocolFeesCollector', + outputs: [ + { + internalType: 'contract ProtocolFeesCollector', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'user', + type: 'address', + }, + { + internalType: 'address', + name: 'relayer', + type: 'address', + }, + ], + name: 'hasApprovedRelayer', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'poolId', + type: 'bytes32', + }, + { + internalType: 'address', + name: 'sender', + type: 'address', + }, + { + internalType: 'address', + name: 'recipient', + type: 'address', + }, + { + components: [ + { + internalType: 'contract IAsset[]', + name: 'assets', + type: 'address[]', + }, + { + internalType: 'uint256[]', + name: 'maxAmountsIn', + type: 'uint256[]', + }, + { + internalType: 'bytes', + name: 'userData', + type: 'bytes', + }, + { + internalType: 'bool', + name: 'fromInternalBalance', + type: 'bool', + }, + ], + internalType: 'struct IVault.JoinPoolRequest', + name: 'request', + type: 'tuple', + }, + ], + name: 'joinPool', + outputs: [], + stateMutability: 'payable', + type: 'function', + }, + { + inputs: [ + { + components: [ + { + internalType: 'enum IVault.PoolBalanceOpKind', + name: 'kind', + type: 'uint8', + }, + { + internalType: 'bytes32', + name: 'poolId', + type: 'bytes32', + }, + { + internalType: 'contract IERC20', + name: 'token', + type: 'address', + }, + { + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + ], + internalType: 'struct IVault.PoolBalanceOp[]', + name: 'ops', + type: 'tuple[]', + }, + ], + name: 'managePoolBalance', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + components: [ + { + internalType: 'enum IVault.UserBalanceOpKind', + name: 'kind', + type: 'uint8', + }, + { + internalType: 'contract IAsset', + name: 'asset', + type: 'address', + }, + { + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + { + internalType: 'address', + name: 'sender', + type: 'address', + }, + { + internalType: 'address payable', + name: 'recipient', + type: 'address', + }, + ], + internalType: 'struct IVault.UserBalanceOp[]', + name: 'ops', + type: 'tuple[]', + }, + ], + name: 'manageUserBalance', + outputs: [], + stateMutability: 'payable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'enum IVault.SwapKind', + name: 'kind', + type: 'uint8', + }, + { + components: [ + { + internalType: 'bytes32', + name: 'poolId', + type: 'bytes32', + }, + { + internalType: 'uint256', + name: 'assetInIndex', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'assetOutIndex', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + { + internalType: 'bytes', + name: 'userData', + type: 'bytes', + }, + ], + internalType: 'struct IVault.BatchSwapStep[]', + name: 'swaps', + type: 'tuple[]', + }, + { + internalType: 'contract IAsset[]', + name: 'assets', + type: 'address[]', + }, + { + components: [ + { + internalType: 'address', + name: 'sender', + type: 'address', + }, + { + internalType: 'bool', + name: 'fromInternalBalance', + type: 'bool', + }, + { + internalType: 'address payable', + name: 'recipient', + type: 'address', + }, + { + internalType: 'bool', + name: 'toInternalBalance', + type: 'bool', + }, + ], + internalType: 'struct IVault.FundManagement', + name: 'funds', + type: 'tuple', + }, + ], + name: 'queryBatchSwap', + outputs: [ + { + internalType: 'int256[]', + name: '', + type: 'int256[]', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'enum IVault.PoolSpecialization', + name: 'specialization', + type: 'uint8', + }, + ], + name: 'registerPool', + outputs: [ + { + internalType: 'bytes32', + name: '', + type: 'bytes32', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'poolId', + type: 'bytes32', + }, + { + internalType: 'contract IERC20[]', + name: 'tokens', + type: 'address[]', + }, + { + internalType: 'address[]', + name: 'assetManagers', + type: 'address[]', + }, + ], + name: 'registerTokens', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'contract IAuthorizer', + name: 'newAuthorizer', + type: 'address', + }, + ], + name: 'setAuthorizer', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bool', + name: 'paused', + type: 'bool', + }, + ], + name: 'setPaused', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'sender', + type: 'address', + }, + { + internalType: 'address', + name: 'relayer', + type: 'address', + }, + { + internalType: 'bool', + name: 'approved', + type: 'bool', + }, + ], + name: 'setRelayerApproval', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + components: [ + { + internalType: 'bytes32', + name: 'poolId', + type: 'bytes32', + }, + { + internalType: 'enum IVault.SwapKind', + name: 'kind', + type: 'uint8', + }, + { + internalType: 'contract IAsset', + name: 'assetIn', + type: 'address', + }, + { + internalType: 'contract IAsset', + name: 'assetOut', + type: 'address', + }, + { + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + { + internalType: 'bytes', + name: 'userData', + type: 'bytes', + }, + ], + internalType: 'struct IVault.SingleSwap', + name: 'singleSwap', + type: 'tuple', + }, + { + components: [ + { + internalType: 'address', + name: 'sender', + type: 'address', + }, + { + internalType: 'bool', + name: 'fromInternalBalance', + type: 'bool', + }, + { + internalType: 'address payable', + name: 'recipient', + type: 'address', + }, + { + internalType: 'bool', + name: 'toInternalBalance', + type: 'bool', + }, + ], + internalType: 'struct IVault.FundManagement', + name: 'funds', + type: 'tuple', + }, + { + internalType: 'uint256', + name: 'limit', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'deadline', + type: 'uint256', + }, + ], + name: 'swap', + outputs: [ + { + internalType: 'uint256', + name: 'amountCalculated', + type: 'uint256', + }, + ], + stateMutability: 'payable', + type: 'function', + }, + { + stateMutability: 'payable', + type: 'receive', + }, +]; + +export class KoyoVault__factory { + static readonly abi = _abi; + static createInterface(): KoyoVaultInterface { + return new utils.Interface(_abi) as KoyoVaultInterface; + } + static connect(address: string, signerOrProvider: Signer | Provider): KoyoVault { + return new Contract(address, _abi, signerOrProvider) as KoyoVault; + } +} diff --git a/src/apps/koyo/contracts/ethers/factories/index.ts b/src/apps/koyo/contracts/ethers/factories/index.ts new file mode 100644 index 000000000..fc949f10a --- /dev/null +++ b/src/apps/koyo/contracts/ethers/factories/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export { KoyoPool__factory } from './KoyoPool__factory'; +export { KoyoVault__factory } from './KoyoVault__factory'; diff --git a/src/apps/koyo/contracts/ethers/index.ts b/src/apps/koyo/contracts/ethers/index.ts new file mode 100644 index 000000000..aa61c1f9d --- /dev/null +++ b/src/apps/koyo/contracts/ethers/index.ts @@ -0,0 +1,8 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export type { KoyoPool } from './KoyoPool'; +export type { KoyoVault } from './KoyoVault'; +export * as factories from './factories'; +export { KoyoPool__factory } from './factories/KoyoPool__factory'; +export { KoyoVault__factory } from './factories/KoyoVault__factory'; diff --git a/src/apps/koyo/contracts/index.ts b/src/apps/koyo/contracts/index.ts index 3caf45747..2c9f6dd1d 100644 --- a/src/apps/koyo/contracts/index.ts +++ b/src/apps/koyo/contracts/index.ts @@ -3,6 +3,10 @@ import { Injectable, Inject } from '@nestjs/common'; import { IAppToolkit, APP_TOOLKIT } from '~app-toolkit/app-toolkit.interface'; import { ContractFactory } from '~contract/contracts'; import { Network } from '~types/network.interface'; + +import { KoyoPool__factory } from './ethers'; +import { KoyoVault__factory } from './ethers'; + // eslint-disable-next-line type ContractOpts = { address: string; network: Network }; @@ -11,4 +15,14 @@ export class KoyoContractFactory extends ContractFactory { constructor(@Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit) { super((network: Network) => appToolkit.getNetworkProvider(network)); } + + koyoPool({ address, network }: ContractOpts) { + return KoyoPool__factory.connect(address, this.appToolkit.getNetworkProvider(network)); + } + koyoVault({ address, network }: ContractOpts) { + return KoyoVault__factory.connect(address, this.appToolkit.getNetworkProvider(network)); + } } + +export type { KoyoPool } from './ethers'; +export type { KoyoVault } from './ethers'; diff --git a/src/apps/koyo/helpers/koyo.pool.token-helper.ts b/src/apps/koyo/helpers/koyo.pool.token-helper.ts new file mode 100644 index 000000000..844484cda --- /dev/null +++ b/src/apps/koyo/helpers/koyo.pool.token-helper.ts @@ -0,0 +1,159 @@ +import { Inject, Injectable } from '@nestjs/common'; +import _ from 'lodash'; +import { isEmpty, isUndefined } from 'lodash'; + +import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; +import { buildDollarDisplayItem } from '~app-toolkit/helpers/presentation/display-item.present'; +import { getTokenImg } from '~app-toolkit/helpers/presentation/image.present'; +import { ContractType } from '~position/contract.interface'; +import { AppTokenPosition } from '~position/position.interface'; +import { AppGroupsDefinition } from '~position/position.service'; +import { Network } from '~types/network.interface'; + +import { KoyoContractFactory } from '../contracts'; + +export enum KoyoPoolLabelStrategy { + TOKEN_SYMBOLS = 'token-symbols', + POOL_NAME = 'pool-name', +} + +type KoyoPoolTokenDataProps = { + liquidity: number; + fee: number; + reserves: number[]; + weights: number[]; + volume: number; +}; + +type GetKoyoPoolTokensParams = { + network: Network; + appId: string; + groupId: string; + appTokenDependencies?: AppGroupsDefinition[]; + vaultAddress: string; + minLiquidity?: number; + resolvePoolTokenAddresses: (opts: { + appId: string; + network: Network; + }) => Promise<{ address: string; volume: number }[]>; + resolvePoolLabelStrategy?: () => KoyoPoolLabelStrategy; +}; + +@Injectable() +export class KoyoPoolTokensHelper { + constructor( + @Inject(APP_TOOLKIT) private readonly appToolkit: IAppToolkit, + @Inject(KoyoContractFactory) private readonly contractFactory: KoyoContractFactory, + ) {} + + async getTokenMarketData({ + network, + appId, + groupId, + appTokenDependencies = [], + vaultAddress, + minLiquidity = 0, + resolvePoolTokenAddresses, + resolvePoolLabelStrategy = () => KoyoPoolLabelStrategy.TOKEN_SYMBOLS, + }: GetKoyoPoolTokensParams) { + const multicall = this.appToolkit.getMulticall(network); + const prices = await this.appToolkit.getBaseTokenPrices(network); + const appTokens = await this.appToolkit.getAppTokenPositions(...appTokenDependencies); + const poolTokenData = await resolvePoolTokenAddresses({ appId, network }); + const vaultContract = this.contractFactory.koyoVault({ network, address: vaultAddress }); + + const pools = await Promise.all( + poolTokenData.map(async ({ address, volume }) => { + const type = ContractType.APP_TOKEN; + const poolContract = this.contractFactory.koyoPool({ network, address }); + const poolId = await multicall.wrap(poolContract).getPoolId(); + + // Resolve underlying tokens + const poolTokensRaw = await multicall.wrap(vaultContract).getPoolTokens(poolId); + const tokenAddresses = poolTokensRaw.tokens.map(v => v.toLowerCase()); + const tokensRaw = tokenAddresses.map(tokenAddress => { + const baseToken = prices.find(price => price.address === tokenAddress); + const appToken = appTokens.find(p => p.address === tokenAddress); + return appToken ?? baseToken; + }); + + if (tokensRaw.some(isUndefined)) return null; + const tokens = _.compact(tokensRaw); + + const reserves = tokens.map((t, i) => Number(poolTokensRaw.balances[i]) / 10 ** t.decimals); + const liquidity = tokens.reduce((acc, v, i) => acc + v.price * reserves[i], 0); + if (liquidity < minLiquidity) return null; + + const [decimals, supplyRaw, symbol, feeRaw, weightsRaw] = await Promise.all([ + multicall.wrap(poolContract).decimals(), + multicall.wrap(poolContract).totalSupply(), + multicall.wrap(poolContract).symbol(), + multicall + .wrap(poolContract) + .getSwapFeePercentage() + .catch(() => '100000000000000000'), + multicall + .wrap(poolContract) + .getNormalizedWeights() + .catch(() => []), + ]); + // Data Props + const supply = Number(supplyRaw) / 10 ** decimals; + const fee = Number(feeRaw) / 10 ** 18; + const price = liquidity / supply; + const pricePerShare = reserves.map(r => r / supply); + const reservePercentages = tokens.map((t, i) => reserves[i] * (t.price / liquidity)); + const weights = tokens.map((_, i) => + isEmpty(weightsRaw) ? 1 / tokens.length : Number(weightsRaw[i]) / 10 ** 18, + ); + + // Display Props + const labelStrategy = resolvePoolLabelStrategy(); + const label = + labelStrategy === KoyoPoolLabelStrategy.POOL_NAME + ? await multicall.wrap(poolContract).name() + : tokens.map(v => v.symbol).join(' / '); + const secondaryLabel = reservePercentages.map(p => `${Math.round(p * 100)}%`).join(' / '); + const images = tokens.map(v => getTokenImg(v.address, network)); + + const token: AppTokenPosition = { + type, + address, + network, + appId, + groupId, + symbol, + decimals, + supply, + price, + pricePerShare, + tokens, + + dataProps: { + fee, + liquidity, + reserves, + weights, + volume, + }, + + displayProps: { + label, + secondaryLabel, + images, + statsItems: [ + { + label: 'Liquidity', + value: buildDollarDisplayItem(liquidity), + }, + ], + }, + }; + + return token; + }), + ); + + return _.compact(pools); + } +} diff --git a/src/apps/koyo/helpers/koyo.the-graph.pool-token-address-strategy.ts b/src/apps/koyo/helpers/koyo.the-graph.pool-token-address-strategy.ts new file mode 100644 index 000000000..b2a8b9b6d --- /dev/null +++ b/src/apps/koyo/helpers/koyo.the-graph.pool-token-address-strategy.ts @@ -0,0 +1,157 @@ +import { Inject, Injectable } from '@nestjs/common'; +import { gql } from 'graphql-request'; + +import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; +import { BLOCKS_PER_DAY } from '~app-toolkit/constants/blocks'; +import { Cache } from '~cache/cache.decorator'; +import { Network } from '~types/network.interface'; + +type GetPoolsResponse = { + pools: { + address: string; + poolType: string; + swapFee: string; + tokensList: string; + totalLiquidity: string; + totalSwapVolume: string; + totalSwapFee: string; + totalShares: string; + tokens: { + address: string; + symbol: string; + decimals: number; + balance: string; + weight: string; + }[]; + }[]; +}; + +const DEFAULT_GET_CURRENT_POOLS_QUERY = gql` + query getPools($minLiquidity: Int) { + pools( + first: 250 + skip: 0 + orderBy: totalLiquidity + orderDirection: desc + where: { totalShares_gt: 0.01, totalLiquidity_gt: $minLiquidity } + ) { + address + poolType + swapFee + tokensList + totalLiquidity + totalSwapVolume + totalSwapFee + totalShares + tokens { + address + symbol + decimals + balance + weight + } + } + } +`; + +const DEFAULT_GET_PAST_POOLS_QUERY = gql` + query getPools($minLiquidity: Int, $blockYesterday: Int) { + pools( + first: 250 + skip: 0 + orderBy: totalLiquidity + orderDirection: desc + where: { totalShares_gt: 0.01, totalLiquidity_gt: $minLiquidity } + block: { number: $blockYesterday } + ) { + address + poolType + swapFee + tokensList + totalLiquidity + totalSwapVolume + totalSwapFee + totalShares + tokens { + address + symbol + decimals + balance + weight + } + } + } +`; + +type KoyoTheGraphPoolTokenDataStrategyParams = { + subgraphUrl: string; + minLiquidity?: number; + currentPoolsQuery?: string; + pastPoolsQuery?: string; +}; + +@Injectable() +export class KoyoTheGraphPoolTokenDataStrategy { + constructor(@Inject(APP_TOOLKIT) private readonly appToolkit: IAppToolkit) {} + + @Cache({ + instance: 'business', + key: (network: Network) => `studio-koyo-events-pool-token-addresses:${network}:koyo`, + ttl: 5 * 60, + }) + async getPoolAddresses( + subgraphUrl: string, + minLiquidity: number, + currentPoolsQuery: string, + pastPoolsQuery: string, + network: Network, + ) { + const provider = this.appToolkit.getNetworkProvider(network); + const graphHelper = this.appToolkit.helpers.theGraphHelper; + const blockToday = await provider.getBlockNumber(); + const blockYesterday = blockToday - BLOCKS_PER_DAY[network]; + + const [currentPoolsResponse, pastPoolsResponse] = await Promise.all([ + graphHelper.request({ + endpoint: subgraphUrl, + query: currentPoolsQuery, + variables: { + minLiquidity, + }, + }), + graphHelper.request({ + endpoint: subgraphUrl, + query: pastPoolsQuery, + variables: { + blockYesterday, + minLiquidity, + }, + }), + ]); + + return currentPoolsResponse.pools.map(pool => { + const pastPool = pastPoolsResponse.pools.find(p => p.address === pool.address); + const volume = pastPool ? Number(pool.totalSwapVolume) - Number(pastPool.totalSwapVolume) : 0; + return { address: pool.address, volume }; + }); + } + + build({ + subgraphUrl, + minLiquidity = 0, + currentPoolsQuery = DEFAULT_GET_CURRENT_POOLS_QUERY, + pastPoolsQuery = DEFAULT_GET_PAST_POOLS_QUERY, + }: KoyoTheGraphPoolTokenDataStrategyParams) { + return async ({ network }: { network: Network }) => { + const poolAddresses = await this.getPoolAddresses( + subgraphUrl, + minLiquidity, + currentPoolsQuery, + pastPoolsQuery, + network, + ); + + return poolAddresses; + }; + } +} diff --git a/src/apps/koyo/koyo.definition.ts b/src/apps/koyo/koyo.definition.ts index 35fd327a0..b67f89442 100644 --- a/src/apps/koyo/koyo.definition.ts +++ b/src/apps/koyo/koyo.definition.ts @@ -1,6 +1,6 @@ import { Register } from '~app-toolkit/decorators'; import { appDefinition, AppDefinition } from '~app/app.definition'; -import { AppAction, AppTag } from '~app/app.interface'; +import { AppAction, AppTag, GroupType } from '~app/app.interface'; import { Network } from '~types/network.interface'; export const KOYO_DEFINITION = appDefinition({ @@ -8,13 +8,20 @@ export const KOYO_DEFINITION = appDefinition({ name: 'Kōyō Finance', description: 'Kōyō is the first next-generation AMM protocol in the Boba ecosystem.', url: 'https://koyo.finance', - groups: {}, + groups: { + pool: { id: 'pool', type: GroupType.TOKEN, label: 'Pools' }, + }, tags: [AppTag.DECENTRALIZED_EXCHANGE], keywords: [], - links: {}, + + links: { + github: 'https://github.com/koyo-finance/', + twitter: 'https://twitter.com/koyofinance/', + discord: 'https://docs.koyo.finance/discord/', + }, supportedNetworks: { - [Network.AVALANCHE_MAINNET]: [AppAction.VIEW], + [Network.BOBA_MAINNET]: [AppAction.VIEW], }, primaryColor: '#fff', diff --git a/src/apps/koyo/koyo.module.ts b/src/apps/koyo/koyo.module.ts index 001defc6a..caea7957a 100644 --- a/src/apps/koyo/koyo.module.ts +++ b/src/apps/koyo/koyo.module.ts @@ -1,11 +1,21 @@ import { Register } from '~app-toolkit/decorators'; import { AbstractApp } from '~app/app.dynamic-module'; +import { BobaKoyoPoolTokenFetcher } from './boba/koyo.pool.token-fetcher'; import { KoyoContractFactory } from './contracts'; +import { KoyoPoolTokensHelper } from './helpers/koyo.pool.token-helper'; +import { KoyoTheGraphPoolTokenDataStrategy } from './helpers/koyo.the-graph.pool-token-address-strategy'; import { KoyoAppDefinition, KOYO_DEFINITION } from './koyo.definition'; @Register.AppModule({ appId: KOYO_DEFINITION.id, - providers: [KoyoAppDefinition, KoyoContractFactory], + providers: [ + BobaKoyoPoolTokenFetcher, + KoyoAppDefinition, + KoyoContractFactory, + KoyoPoolTokensHelper, + KoyoTheGraphPoolTokenDataStrategy, + ], + exports: [KoyoPoolTokensHelper, KoyoTheGraphPoolTokenDataStrategy], }) export class KoyoAppModule extends AbstractApp() {} diff --git a/src/multicall/multicall.registry.ts b/src/multicall/multicall.registry.ts index b74f6b85d..9661a8b67 100644 --- a/src/multicall/multicall.registry.ts +++ b/src/multicall/multicall.registry.ts @@ -15,5 +15,6 @@ export const MULTICALL_ADDRESSES: Record = { [Network.CRONOS_MAINNET]: '0x845c4753954c347175b4179b2d5b18de1629f94f', [Network.AURORA_MAINNET]: '0x67d66e8ec1fd25d98b3ccd3b19b7dc4b4b7fc493', [Network.EVMOS_MAINNET]: '0xa7d0561ead7da21bd6d2f0bc89849c60703be505', + [Network.BOBA_MAINNET]: '0x1E3d8eB89D99dcc23284DCe40f3A72a3Ef4cDDfA', [Network.BITCOIN_MAINNET]: null, }; diff --git a/src/network-provider/network-provider.registry.ts b/src/network-provider/network-provider.registry.ts index bfc8eeab1..6f18c742b 100644 --- a/src/network-provider/network-provider.registry.ts +++ b/src/network-provider/network-provider.registry.ts @@ -15,4 +15,5 @@ export const DEFAULT_REGISTRY: Record, [Network.CRONOS_MAINNET]: 'https://evm-cronos.crypto.org', [Network.AURORA_MAINNET]: 'https://mainnet.aurora.dev', [Network.EVMOS_MAINNET]: 'https://eth.bd.evmos.org:8545', + [Network.BOBA_MAINNET]: 'https://mainnet.boba.network/', }; diff --git a/src/types/network.interface.ts b/src/types/network.interface.ts index 2356c95a6..db58ad90d 100644 --- a/src/types/network.interface.ts +++ b/src/types/network.interface.ts @@ -14,6 +14,7 @@ export enum Network { CRONOS_MAINNET = 'cronos', AURORA_MAINNET = 'aurora', EVMOS_MAINNET = 'evmos', + BOBA_MAINNET = 'boba', } export const NETWORK_IDS: Record = { @@ -33,4 +34,5 @@ export const NETWORK_IDS: Record = { [Network.AURORA_MAINNET]: 1313161554, [Network.EVMOS_MAINNET]: 9001, [Network.BITCOIN_MAINNET]: 1285, + [Network.BOBA_MAINNET]: 288, }; From f0ab4436061ea0f72416ac3e57a28371eb4704c9 Mon Sep 17 00:00:00 2001 From: p7m Date: Wed, 13 Jul 2022 16:50:16 +0200 Subject: [PATCH 3/8] feat: support koyo on aurora --- src/apps/koyo/{boba => aurora}/koyo.pool.token-fetcher.ts | 8 ++++---- src/apps/koyo/koyo.definition.ts | 2 +- src/apps/koyo/koyo.module.ts | 4 ++-- src/main.module.ts | 2 +- src/multicall/multicall.registry.ts | 1 - src/network-provider/network-provider.registry.ts | 1 - src/types/network.interface.ts | 2 -- 7 files changed, 8 insertions(+), 12 deletions(-) rename src/apps/koyo/{boba => aurora}/koyo.pool.token-fetcher.ts (83%) diff --git a/src/apps/koyo/boba/koyo.pool.token-fetcher.ts b/src/apps/koyo/aurora/koyo.pool.token-fetcher.ts similarity index 83% rename from src/apps/koyo/boba/koyo.pool.token-fetcher.ts rename to src/apps/koyo/aurora/koyo.pool.token-fetcher.ts index 8e27a2aba..00ffe6524 100644 --- a/src/apps/koyo/boba/koyo.pool.token-fetcher.ts +++ b/src/apps/koyo/aurora/koyo.pool.token-fetcher.ts @@ -11,10 +11,10 @@ import { KOYO_DEFINITION } from '../koyo.definition'; const appId = KOYO_DEFINITION.id; const groupId = KOYO_DEFINITION.groups.pool.id; -const network = Network.BOBA_MAINNET; +const network = Network.AURORA_MAINNET; @Register.TokenPositionFetcher({ appId, groupId, network }) -export class BobaKoyoPoolTokenFetcher implements PositionFetcher { +export class AuroraKoyoPoolTokenFetcher implements PositionFetcher { constructor( @Inject(KoyoPoolTokensHelper) private readonly poolTokensHelper: KoyoPoolTokensHelper, @Inject(KoyoTheGraphPoolTokenDataStrategy) @@ -26,9 +26,9 @@ export class BobaKoyoPoolTokenFetcher implements PositionFetcher ({ zapperApi: { url: process.env.ZAPPER_API_URL ?? 'https://api.zapper.fi', - key: process.env.ZAPPER_API_KEY ?? '96e0cc51-a62e-42ca-acee-910ea7d2a241', + key: process.env.ZAPPER_API_KEY ?? 'ad01527e-8133-4a68-ad67-fbf8d9040ad1', }, apiResolvedPositions: compact((process.env.API_RESOLVED_POSITIONS ?? '').split(',')), }), diff --git a/src/multicall/multicall.registry.ts b/src/multicall/multicall.registry.ts index 9661a8b67..b74f6b85d 100644 --- a/src/multicall/multicall.registry.ts +++ b/src/multicall/multicall.registry.ts @@ -15,6 +15,5 @@ export const MULTICALL_ADDRESSES: Record = { [Network.CRONOS_MAINNET]: '0x845c4753954c347175b4179b2d5b18de1629f94f', [Network.AURORA_MAINNET]: '0x67d66e8ec1fd25d98b3ccd3b19b7dc4b4b7fc493', [Network.EVMOS_MAINNET]: '0xa7d0561ead7da21bd6d2f0bc89849c60703be505', - [Network.BOBA_MAINNET]: '0x1E3d8eB89D99dcc23284DCe40f3A72a3Ef4cDDfA', [Network.BITCOIN_MAINNET]: null, }; diff --git a/src/network-provider/network-provider.registry.ts b/src/network-provider/network-provider.registry.ts index 6f18c742b..bfc8eeab1 100644 --- a/src/network-provider/network-provider.registry.ts +++ b/src/network-provider/network-provider.registry.ts @@ -15,5 +15,4 @@ export const DEFAULT_REGISTRY: Record, [Network.CRONOS_MAINNET]: 'https://evm-cronos.crypto.org', [Network.AURORA_MAINNET]: 'https://mainnet.aurora.dev', [Network.EVMOS_MAINNET]: 'https://eth.bd.evmos.org:8545', - [Network.BOBA_MAINNET]: 'https://mainnet.boba.network/', }; diff --git a/src/types/network.interface.ts b/src/types/network.interface.ts index db58ad90d..2356c95a6 100644 --- a/src/types/network.interface.ts +++ b/src/types/network.interface.ts @@ -14,7 +14,6 @@ export enum Network { CRONOS_MAINNET = 'cronos', AURORA_MAINNET = 'aurora', EVMOS_MAINNET = 'evmos', - BOBA_MAINNET = 'boba', } export const NETWORK_IDS: Record = { @@ -34,5 +33,4 @@ export const NETWORK_IDS: Record = { [Network.AURORA_MAINNET]: 1313161554, [Network.EVMOS_MAINNET]: 9001, [Network.BITCOIN_MAINNET]: 1285, - [Network.BOBA_MAINNET]: 288, }; From 5a8123f261f2a3efe08b309b77b88e3244d8722e Mon Sep 17 00:00:00 2001 From: p7m Date: Thu, 14 Jul 2022 11:39:53 +0200 Subject: [PATCH 4/8] feat: support koyo on moonriver --- src/apps/koyo/aurora/koyo.balance-fetcher.ts | 37 +++++++++++++++++++ src/apps/koyo/koyo.definition.ts | 4 +- src/apps/koyo/koyo.module.ts | 6 +++ .../koyo/moonriver/koyo.balance-fetcher.ts | 37 +++++++++++++++++++ .../koyo/moonriver/koyo.pool.token-fetcher.ts | 35 ++++++++++++++++++ 5 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 src/apps/koyo/aurora/koyo.balance-fetcher.ts create mode 100644 src/apps/koyo/moonriver/koyo.balance-fetcher.ts create mode 100644 src/apps/koyo/moonriver/koyo.pool.token-fetcher.ts diff --git a/src/apps/koyo/aurora/koyo.balance-fetcher.ts b/src/apps/koyo/aurora/koyo.balance-fetcher.ts new file mode 100644 index 000000000..8a184a591 --- /dev/null +++ b/src/apps/koyo/aurora/koyo.balance-fetcher.ts @@ -0,0 +1,37 @@ +import { Inject } from '@nestjs/common'; + +import { TokenBalanceHelper } from '~app-toolkit'; +import { Register } from '~app-toolkit/decorators'; +import { presentBalanceFetcherResponse } from '~app-toolkit/helpers/presentation/balance-fetcher-response.present'; +import { BalanceFetcher } from '~balance/balance-fetcher.interface'; +import { Network } from '~types/network.interface'; + +import { KOYO_DEFINITION } from '../koyo.definition'; + +const appId = KOYO_DEFINITION.id; +const network = Network.AURORA_MAINNET; + +@Register.BalanceFetcher(appId, network) +export class AuroraKoyoBalanceFetcher implements BalanceFetcher { + constructor(@Inject(TokenBalanceHelper) private readonly tokenBalanceHelper: TokenBalanceHelper) {} + + async getPoolBalances(address: string) { + return this.tokenBalanceHelper.getTokenBalances({ + address, + network, + appId, + groupId: KOYO_DEFINITION.groups.pool.id, + }); + } + + async getBalances(address: string) { + const [poolBalances] = await Promise.all([this.getPoolBalances(address)]); + + return presentBalanceFetcherResponse([ + { + label: 'Pools', + assets: poolBalances, + }, + ]); + } +} diff --git a/src/apps/koyo/koyo.definition.ts b/src/apps/koyo/koyo.definition.ts index cd8915e0a..6e55b7fda 100644 --- a/src/apps/koyo/koyo.definition.ts +++ b/src/apps/koyo/koyo.definition.ts @@ -6,7 +6,8 @@ import { Network } from '~types/network.interface'; export const KOYO_DEFINITION = appDefinition({ id: 'koyo', name: 'Kōyō Finance', - description: 'Kōyō is the first next-generation AMM protocol in the Boba ecosystem.', + description: + 'Kōyō is a AMM protocol based on Balancer aimed at providing stable pools alongside variable rate, multi token pools.', url: 'https://koyo.finance', groups: { pool: { id: 'pool', type: GroupType.TOKEN, label: 'Pools' }, @@ -22,6 +23,7 @@ export const KOYO_DEFINITION = appDefinition({ supportedNetworks: { [Network.AURORA_MAINNET]: [AppAction.VIEW], + [Network.MOONRIVER_MAINNET]: [AppAction.VIEW], }, primaryColor: '#fff', diff --git a/src/apps/koyo/koyo.module.ts b/src/apps/koyo/koyo.module.ts index af2f5479a..149dd5fa0 100644 --- a/src/apps/koyo/koyo.module.ts +++ b/src/apps/koyo/koyo.module.ts @@ -1,16 +1,22 @@ import { Register } from '~app-toolkit/decorators'; import { AbstractApp } from '~app/app.dynamic-module'; +import { AuroraKoyoBalanceFetcher } from './aurora/koyo.balance-fetcher'; import { AuroraKoyoPoolTokenFetcher } from './aurora/koyo.pool.token-fetcher'; import { KoyoContractFactory } from './contracts'; import { KoyoPoolTokensHelper } from './helpers/koyo.pool.token-helper'; import { KoyoTheGraphPoolTokenDataStrategy } from './helpers/koyo.the-graph.pool-token-address-strategy'; import { KoyoAppDefinition, KOYO_DEFINITION } from './koyo.definition'; +import { MoonriverKoyoBalanceFetcher } from './moonriver/koyo.balance-fetcher'; +import { MoonriverKoyoPoolTokenFetcher } from './moonriver/koyo.pool.token-fetcher'; @Register.AppModule({ appId: KOYO_DEFINITION.id, providers: [ AuroraKoyoPoolTokenFetcher, + AuroraKoyoBalanceFetcher, + MoonriverKoyoPoolTokenFetcher, + MoonriverKoyoBalanceFetcher, KoyoAppDefinition, KoyoContractFactory, KoyoPoolTokensHelper, diff --git a/src/apps/koyo/moonriver/koyo.balance-fetcher.ts b/src/apps/koyo/moonriver/koyo.balance-fetcher.ts new file mode 100644 index 000000000..ab3fda52c --- /dev/null +++ b/src/apps/koyo/moonriver/koyo.balance-fetcher.ts @@ -0,0 +1,37 @@ +import { Inject } from '@nestjs/common'; + +import { TokenBalanceHelper } from '~app-toolkit'; +import { Register } from '~app-toolkit/decorators'; +import { presentBalanceFetcherResponse } from '~app-toolkit/helpers/presentation/balance-fetcher-response.present'; +import { BalanceFetcher } from '~balance/balance-fetcher.interface'; +import { Network } from '~types/network.interface'; + +import { KOYO_DEFINITION } from '../koyo.definition'; + +const appId = KOYO_DEFINITION.id; +const network = Network.MOONRIVER_MAINNET; + +@Register.BalanceFetcher(appId, network) +export class MoonriverKoyoBalanceFetcher implements BalanceFetcher { + constructor(@Inject(TokenBalanceHelper) private readonly tokenBalanceHelper: TokenBalanceHelper) {} + + async getPoolBalances(address: string) { + return this.tokenBalanceHelper.getTokenBalances({ + address, + network, + appId, + groupId: KOYO_DEFINITION.groups.pool.id, + }); + } + + async getBalances(address: string) { + const [poolBalances] = await Promise.all([this.getPoolBalances(address)]); + + return presentBalanceFetcherResponse([ + { + label: 'Pools', + assets: poolBalances, + }, + ]); + } +} diff --git a/src/apps/koyo/moonriver/koyo.pool.token-fetcher.ts b/src/apps/koyo/moonriver/koyo.pool.token-fetcher.ts new file mode 100644 index 000000000..b6177ec21 --- /dev/null +++ b/src/apps/koyo/moonriver/koyo.pool.token-fetcher.ts @@ -0,0 +1,35 @@ +import { Inject } from '@nestjs/common'; + +import { Register } from '~app-toolkit/decorators'; +import { PositionFetcher } from '~position/position-fetcher.interface'; +import { AppTokenPosition } from '~position/position.interface'; +import { Network } from '~types/network.interface'; + +import { KoyoPoolTokensHelper } from '../helpers/koyo.pool.token-helper'; +import { KoyoTheGraphPoolTokenDataStrategy } from '../helpers/koyo.the-graph.pool-token-address-strategy'; +import { KOYO_DEFINITION } from '../koyo.definition'; + +const appId = KOYO_DEFINITION.id; +const groupId = KOYO_DEFINITION.groups.pool.id; +const network = Network.MOONRIVER_MAINNET; + +@Register.TokenPositionFetcher({ appId, groupId, network }) +export class MoonriverKoyoPoolTokenFetcher implements PositionFetcher { + constructor( + @Inject(KoyoPoolTokensHelper) private readonly poolTokensHelper: KoyoPoolTokensHelper, + @Inject(KoyoTheGraphPoolTokenDataStrategy) + private readonly koyoTheGraphPoolTokenDataStrategy: KoyoTheGraphPoolTokenDataStrategy, + ) {} + + getPositions() { + return this.poolTokensHelper.getTokenMarketData({ + network, + appId, + groupId, + vaultAddress: '0xEa1E627c12DF4e054D61FD408Ff7186353aC6cA1', + resolvePoolTokenAddresses: this.koyoTheGraphPoolTokenDataStrategy.build({ + subgraphUrl: 'https://api.thegraph.com/subgraphs/name/koyo-finance/exchange-subgraph-moonriver', + }), + }); + } +} From 8c48572fd94b16b78b5bac444da7a8461a86f6a4 Mon Sep 17 00:00:00 2001 From: p7m Date: Thu, 14 Jul 2022 11:44:28 +0200 Subject: [PATCH 5/8] chore: add koyo logo --- src/apps/koyo/assets/logo.png | Bin 0 -> 130987 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/apps/koyo/assets/logo.png diff --git a/src/apps/koyo/assets/logo.png b/src/apps/koyo/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a485731529296a8eca1e98800a6c9bf2f68754db GIT binary patch literal 130987 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

Y{i>=2FwzT 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� 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 z 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 AkpKVy literal 0 HcmV?d00001 From b15d8bea8951a444e286480d13cfad4c20db8511 Mon Sep 17 00:00:00 2001 From: p7m Date: Thu, 14 Jul 2022 14:29:07 +0200 Subject: [PATCH 6/8] fix: use balancer as base --- .../koyo/aurora/koyo.pool.token-fetcher.ts | 12 +- .../koyo/helpers/koyo.pool.token-helper.ts | 159 ------------------ ...o.the-graph.pool-token-address-strategy.ts | 157 ----------------- src/apps/koyo/koyo.module.ts | 7 +- .../koyo/moonriver/koyo.pool.token-fetcher.ts | 12 +- 5 files changed, 14 insertions(+), 333 deletions(-) delete mode 100644 src/apps/koyo/helpers/koyo.pool.token-helper.ts delete mode 100644 src/apps/koyo/helpers/koyo.the-graph.pool-token-address-strategy.ts diff --git a/src/apps/koyo/aurora/koyo.pool.token-fetcher.ts b/src/apps/koyo/aurora/koyo.pool.token-fetcher.ts index 00ffe6524..4b52d31eb 100644 --- a/src/apps/koyo/aurora/koyo.pool.token-fetcher.ts +++ b/src/apps/koyo/aurora/koyo.pool.token-fetcher.ts @@ -1,12 +1,12 @@ import { Inject } from '@nestjs/common'; import { Register } from '~app-toolkit/decorators'; +import { BalancerV2PoolTokensHelper } from '~apps/balancer-v2'; +import { BalancerV2TheGraphPoolTokenDataStrategy } from '~apps/balancer-v2/helpers/balancer-v2.the-graph.pool-token-address-strategy'; import { PositionFetcher } from '~position/position-fetcher.interface'; import { AppTokenPosition } from '~position/position.interface'; import { Network } from '~types/network.interface'; -import { KoyoPoolTokensHelper } from '../helpers/koyo.pool.token-helper'; -import { KoyoTheGraphPoolTokenDataStrategy } from '../helpers/koyo.the-graph.pool-token-address-strategy'; import { KOYO_DEFINITION } from '../koyo.definition'; const appId = KOYO_DEFINITION.id; @@ -16,9 +16,9 @@ const network = Network.AURORA_MAINNET; @Register.TokenPositionFetcher({ appId, groupId, network }) export class AuroraKoyoPoolTokenFetcher implements PositionFetcher { constructor( - @Inject(KoyoPoolTokensHelper) private readonly poolTokensHelper: KoyoPoolTokensHelper, - @Inject(KoyoTheGraphPoolTokenDataStrategy) - private readonly koyoTheGraphPoolTokenDataStrategy: KoyoTheGraphPoolTokenDataStrategy, + @Inject(BalancerV2PoolTokensHelper) private readonly poolTokensHelper: BalancerV2PoolTokensHelper, + @Inject(BalancerV2TheGraphPoolTokenDataStrategy) + private readonly theGraphPoolTokenDataStrategy: BalancerV2TheGraphPoolTokenDataStrategy, ) {} getPositions() { @@ -27,7 +27,7 @@ export class AuroraKoyoPoolTokenFetcher implements PositionFetcher Promise<{ address: string; volume: number }[]>; - resolvePoolLabelStrategy?: () => KoyoPoolLabelStrategy; -}; - -@Injectable() -export class KoyoPoolTokensHelper { - constructor( - @Inject(APP_TOOLKIT) private readonly appToolkit: IAppToolkit, - @Inject(KoyoContractFactory) private readonly contractFactory: KoyoContractFactory, - ) {} - - async getTokenMarketData({ - network, - appId, - groupId, - appTokenDependencies = [], - vaultAddress, - minLiquidity = 0, - resolvePoolTokenAddresses, - resolvePoolLabelStrategy = () => KoyoPoolLabelStrategy.TOKEN_SYMBOLS, - }: GetKoyoPoolTokensParams) { - const multicall = this.appToolkit.getMulticall(network); - const prices = await this.appToolkit.getBaseTokenPrices(network); - const appTokens = await this.appToolkit.getAppTokenPositions(...appTokenDependencies); - const poolTokenData = await resolvePoolTokenAddresses({ appId, network }); - const vaultContract = this.contractFactory.koyoVault({ network, address: vaultAddress }); - - const pools = await Promise.all( - poolTokenData.map(async ({ address, volume }) => { - const type = ContractType.APP_TOKEN; - const poolContract = this.contractFactory.koyoPool({ network, address }); - const poolId = await multicall.wrap(poolContract).getPoolId(); - - // Resolve underlying tokens - const poolTokensRaw = await multicall.wrap(vaultContract).getPoolTokens(poolId); - const tokenAddresses = poolTokensRaw.tokens.map(v => v.toLowerCase()); - const tokensRaw = tokenAddresses.map(tokenAddress => { - const baseToken = prices.find(price => price.address === tokenAddress); - const appToken = appTokens.find(p => p.address === tokenAddress); - return appToken ?? baseToken; - }); - - if (tokensRaw.some(isUndefined)) return null; - const tokens = _.compact(tokensRaw); - - const reserves = tokens.map((t, i) => Number(poolTokensRaw.balances[i]) / 10 ** t.decimals); - const liquidity = tokens.reduce((acc, v, i) => acc + v.price * reserves[i], 0); - if (liquidity < minLiquidity) return null; - - const [decimals, supplyRaw, symbol, feeRaw, weightsRaw] = await Promise.all([ - multicall.wrap(poolContract).decimals(), - multicall.wrap(poolContract).totalSupply(), - multicall.wrap(poolContract).symbol(), - multicall - .wrap(poolContract) - .getSwapFeePercentage() - .catch(() => '100000000000000000'), - multicall - .wrap(poolContract) - .getNormalizedWeights() - .catch(() => []), - ]); - // Data Props - const supply = Number(supplyRaw) / 10 ** decimals; - const fee = Number(feeRaw) / 10 ** 18; - const price = liquidity / supply; - const pricePerShare = reserves.map(r => r / supply); - const reservePercentages = tokens.map((t, i) => reserves[i] * (t.price / liquidity)); - const weights = tokens.map((_, i) => - isEmpty(weightsRaw) ? 1 / tokens.length : Number(weightsRaw[i]) / 10 ** 18, - ); - - // Display Props - const labelStrategy = resolvePoolLabelStrategy(); - const label = - labelStrategy === KoyoPoolLabelStrategy.POOL_NAME - ? await multicall.wrap(poolContract).name() - : tokens.map(v => v.symbol).join(' / '); - const secondaryLabel = reservePercentages.map(p => `${Math.round(p * 100)}%`).join(' / '); - const images = tokens.map(v => getTokenImg(v.address, network)); - - const token: AppTokenPosition = { - type, - address, - network, - appId, - groupId, - symbol, - decimals, - supply, - price, - pricePerShare, - tokens, - - dataProps: { - fee, - liquidity, - reserves, - weights, - volume, - }, - - displayProps: { - label, - secondaryLabel, - images, - statsItems: [ - { - label: 'Liquidity', - value: buildDollarDisplayItem(liquidity), - }, - ], - }, - }; - - return token; - }), - ); - - return _.compact(pools); - } -} diff --git a/src/apps/koyo/helpers/koyo.the-graph.pool-token-address-strategy.ts b/src/apps/koyo/helpers/koyo.the-graph.pool-token-address-strategy.ts deleted file mode 100644 index b2a8b9b6d..000000000 --- a/src/apps/koyo/helpers/koyo.the-graph.pool-token-address-strategy.ts +++ /dev/null @@ -1,157 +0,0 @@ -import { Inject, Injectable } from '@nestjs/common'; -import { gql } from 'graphql-request'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { BLOCKS_PER_DAY } from '~app-toolkit/constants/blocks'; -import { Cache } from '~cache/cache.decorator'; -import { Network } from '~types/network.interface'; - -type GetPoolsResponse = { - pools: { - address: string; - poolType: string; - swapFee: string; - tokensList: string; - totalLiquidity: string; - totalSwapVolume: string; - totalSwapFee: string; - totalShares: string; - tokens: { - address: string; - symbol: string; - decimals: number; - balance: string; - weight: string; - }[]; - }[]; -}; - -const DEFAULT_GET_CURRENT_POOLS_QUERY = gql` - query getPools($minLiquidity: Int) { - pools( - first: 250 - skip: 0 - orderBy: totalLiquidity - orderDirection: desc - where: { totalShares_gt: 0.01, totalLiquidity_gt: $minLiquidity } - ) { - address - poolType - swapFee - tokensList - totalLiquidity - totalSwapVolume - totalSwapFee - totalShares - tokens { - address - symbol - decimals - balance - weight - } - } - } -`; - -const DEFAULT_GET_PAST_POOLS_QUERY = gql` - query getPools($minLiquidity: Int, $blockYesterday: Int) { - pools( - first: 250 - skip: 0 - orderBy: totalLiquidity - orderDirection: desc - where: { totalShares_gt: 0.01, totalLiquidity_gt: $minLiquidity } - block: { number: $blockYesterday } - ) { - address - poolType - swapFee - tokensList - totalLiquidity - totalSwapVolume - totalSwapFee - totalShares - tokens { - address - symbol - decimals - balance - weight - } - } - } -`; - -type KoyoTheGraphPoolTokenDataStrategyParams = { - subgraphUrl: string; - minLiquidity?: number; - currentPoolsQuery?: string; - pastPoolsQuery?: string; -}; - -@Injectable() -export class KoyoTheGraphPoolTokenDataStrategy { - constructor(@Inject(APP_TOOLKIT) private readonly appToolkit: IAppToolkit) {} - - @Cache({ - instance: 'business', - key: (network: Network) => `studio-koyo-events-pool-token-addresses:${network}:koyo`, - ttl: 5 * 60, - }) - async getPoolAddresses( - subgraphUrl: string, - minLiquidity: number, - currentPoolsQuery: string, - pastPoolsQuery: string, - network: Network, - ) { - const provider = this.appToolkit.getNetworkProvider(network); - const graphHelper = this.appToolkit.helpers.theGraphHelper; - const blockToday = await provider.getBlockNumber(); - const blockYesterday = blockToday - BLOCKS_PER_DAY[network]; - - const [currentPoolsResponse, pastPoolsResponse] = await Promise.all([ - graphHelper.request({ - endpoint: subgraphUrl, - query: currentPoolsQuery, - variables: { - minLiquidity, - }, - }), - graphHelper.request({ - endpoint: subgraphUrl, - query: pastPoolsQuery, - variables: { - blockYesterday, - minLiquidity, - }, - }), - ]); - - return currentPoolsResponse.pools.map(pool => { - const pastPool = pastPoolsResponse.pools.find(p => p.address === pool.address); - const volume = pastPool ? Number(pool.totalSwapVolume) - Number(pastPool.totalSwapVolume) : 0; - return { address: pool.address, volume }; - }); - } - - build({ - subgraphUrl, - minLiquidity = 0, - currentPoolsQuery = DEFAULT_GET_CURRENT_POOLS_QUERY, - pastPoolsQuery = DEFAULT_GET_PAST_POOLS_QUERY, - }: KoyoTheGraphPoolTokenDataStrategyParams) { - return async ({ network }: { network: Network }) => { - const poolAddresses = await this.getPoolAddresses( - subgraphUrl, - minLiquidity, - currentPoolsQuery, - pastPoolsQuery, - network, - ); - - return poolAddresses; - }; - } -} diff --git a/src/apps/koyo/koyo.module.ts b/src/apps/koyo/koyo.module.ts index 149dd5fa0..3b56bf4b0 100644 --- a/src/apps/koyo/koyo.module.ts +++ b/src/apps/koyo/koyo.module.ts @@ -1,17 +1,17 @@ import { Register } from '~app-toolkit/decorators'; import { AbstractApp } from '~app/app.dynamic-module'; +import { BalancerV2AppModule } from '~apps/balancer-v2'; import { AuroraKoyoBalanceFetcher } from './aurora/koyo.balance-fetcher'; import { AuroraKoyoPoolTokenFetcher } from './aurora/koyo.pool.token-fetcher'; import { KoyoContractFactory } from './contracts'; -import { KoyoPoolTokensHelper } from './helpers/koyo.pool.token-helper'; -import { KoyoTheGraphPoolTokenDataStrategy } from './helpers/koyo.the-graph.pool-token-address-strategy'; import { KoyoAppDefinition, KOYO_DEFINITION } from './koyo.definition'; import { MoonriverKoyoBalanceFetcher } from './moonriver/koyo.balance-fetcher'; import { MoonriverKoyoPoolTokenFetcher } from './moonriver/koyo.pool.token-fetcher'; @Register.AppModule({ appId: KOYO_DEFINITION.id, + imports: [BalancerV2AppModule], providers: [ AuroraKoyoPoolTokenFetcher, AuroraKoyoBalanceFetcher, @@ -19,9 +19,6 @@ import { MoonriverKoyoPoolTokenFetcher } from './moonriver/koyo.pool.token-fetch MoonriverKoyoBalanceFetcher, KoyoAppDefinition, KoyoContractFactory, - KoyoPoolTokensHelper, - KoyoTheGraphPoolTokenDataStrategy, ], - exports: [KoyoPoolTokensHelper, KoyoTheGraphPoolTokenDataStrategy], }) export class KoyoAppModule extends AbstractApp() {} diff --git a/src/apps/koyo/moonriver/koyo.pool.token-fetcher.ts b/src/apps/koyo/moonriver/koyo.pool.token-fetcher.ts index b6177ec21..557bda205 100644 --- a/src/apps/koyo/moonriver/koyo.pool.token-fetcher.ts +++ b/src/apps/koyo/moonriver/koyo.pool.token-fetcher.ts @@ -1,12 +1,12 @@ import { Inject } from '@nestjs/common'; import { Register } from '~app-toolkit/decorators'; +import { BalancerV2PoolTokensHelper } from '~apps/balancer-v2'; +import { BalancerV2TheGraphPoolTokenDataStrategy } from '~apps/balancer-v2/helpers/balancer-v2.the-graph.pool-token-address-strategy'; import { PositionFetcher } from '~position/position-fetcher.interface'; import { AppTokenPosition } from '~position/position.interface'; import { Network } from '~types/network.interface'; -import { KoyoPoolTokensHelper } from '../helpers/koyo.pool.token-helper'; -import { KoyoTheGraphPoolTokenDataStrategy } from '../helpers/koyo.the-graph.pool-token-address-strategy'; import { KOYO_DEFINITION } from '../koyo.definition'; const appId = KOYO_DEFINITION.id; @@ -16,9 +16,9 @@ const network = Network.MOONRIVER_MAINNET; @Register.TokenPositionFetcher({ appId, groupId, network }) export class MoonriverKoyoPoolTokenFetcher implements PositionFetcher { constructor( - @Inject(KoyoPoolTokensHelper) private readonly poolTokensHelper: KoyoPoolTokensHelper, - @Inject(KoyoTheGraphPoolTokenDataStrategy) - private readonly koyoTheGraphPoolTokenDataStrategy: KoyoTheGraphPoolTokenDataStrategy, + @Inject(BalancerV2PoolTokensHelper) private readonly poolTokensHelper: BalancerV2PoolTokensHelper, + @Inject(BalancerV2TheGraphPoolTokenDataStrategy) + private readonly theGraphPoolTokenDataStrategy: BalancerV2TheGraphPoolTokenDataStrategy, ) {} getPositions() { @@ -27,7 +27,7 @@ export class MoonriverKoyoPoolTokenFetcher implements PositionFetcher Date: Thu, 14 Jul 2022 14:30:33 +0200 Subject: [PATCH 7/8] fix: lowercase addresses --- src/apps/koyo/aurora/koyo.pool.token-fetcher.ts | 2 +- src/apps/koyo/moonriver/koyo.pool.token-fetcher.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/koyo/aurora/koyo.pool.token-fetcher.ts b/src/apps/koyo/aurora/koyo.pool.token-fetcher.ts index 4b52d31eb..ea9016722 100644 --- a/src/apps/koyo/aurora/koyo.pool.token-fetcher.ts +++ b/src/apps/koyo/aurora/koyo.pool.token-fetcher.ts @@ -26,7 +26,7 @@ export class AuroraKoyoPoolTokenFetcher implements PositionFetcher Date: Thu, 14 Jul 2022 14:50:47 +0200 Subject: [PATCH 8/8] fix: only import required modules --- src/apps/koyo/contracts/abis/koyo-pool.json | 367 ----- src/apps/koyo/contracts/abis/koyo-vault.json | 491 ------- src/apps/koyo/contracts/ethers/KoyoPool.ts | 994 -------------- src/apps/koyo/contracts/ethers/KoyoVault.ts | 1207 ----------------- src/apps/koyo/contracts/ethers/common.ts | 30 - .../ethers/factories/KoyoPool__factory.ts | 919 ------------- .../ethers/factories/KoyoVault__factory.ts | 1197 ---------------- .../koyo/contracts/ethers/factories/index.ts | 5 - src/apps/koyo/contracts/ethers/index.ts | 8 - src/apps/koyo/contracts/index.ts | 28 - src/apps/koyo/koyo.module.ts | 10 +- 11 files changed, 6 insertions(+), 5250 deletions(-) delete mode 100644 src/apps/koyo/contracts/abis/koyo-pool.json delete mode 100644 src/apps/koyo/contracts/abis/koyo-vault.json delete mode 100644 src/apps/koyo/contracts/ethers/KoyoPool.ts delete mode 100644 src/apps/koyo/contracts/ethers/KoyoVault.ts delete mode 100644 src/apps/koyo/contracts/ethers/common.ts delete mode 100644 src/apps/koyo/contracts/ethers/factories/KoyoPool__factory.ts delete mode 100644 src/apps/koyo/contracts/ethers/factories/KoyoVault__factory.ts delete mode 100644 src/apps/koyo/contracts/ethers/factories/index.ts delete mode 100644 src/apps/koyo/contracts/ethers/index.ts delete mode 100644 src/apps/koyo/contracts/index.ts diff --git a/src/apps/koyo/contracts/abis/koyo-pool.json b/src/apps/koyo/contracts/abis/koyo-pool.json deleted file mode 100644 index 4856f016d..000000000 --- a/src/apps/koyo/contracts/abis/koyo-pool.json +++ /dev/null @@ -1,367 +0,0 @@ -[ - { - "inputs": [ - { "internalType": "contract IVault", "name": "vault", "type": "address" }, - { "internalType": "string", "name": "name", "type": "string" }, - { "internalType": "string", "name": "symbol", "type": "string" }, - { "internalType": "contract IERC20[]", "name": "tokens", "type": "address[]" }, - { "internalType": "uint256[]", "name": "normalizedWeights", "type": "uint256[]" }, - { "internalType": "uint256", "name": "swapFeePercentage", "type": "uint256" }, - { "internalType": "uint256", "name": "pauseWindowDuration", "type": "uint256" }, - { "internalType": "uint256", "name": "bufferPeriodDuration", "type": "uint256" }, - { "internalType": "address", "name": "owner", "type": "address" } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "bool", "name": "paused", "type": "bool" }], - "name": "PausedStateChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "uint256", "name": "swapFeePercentage", "type": "uint256" }], - "name": "SwapFeePercentageChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "Transfer", - "type": "event" - }, - { - "inputs": [], - "name": "DOMAIN_SEPARATOR", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "owner", "type": "address" }, - { "internalType": "address", "name": "spender", "type": "address" } - ], - "name": "allowance", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "approve", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], - "name": "balanceOf", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "decreaseApproval", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "bytes4", "name": "selector", "type": "bytes4" }], - "name": "getActionId", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getAuthorizer", - "outputs": [{ "internalType": "contract IAuthorizer", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getInvariant", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getLastInvariant", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getNormalizedWeights", - "outputs": [{ "internalType": "uint256[]", "name": "", "type": "uint256[]" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getOwner", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getPausedState", - "outputs": [ - { "internalType": "bool", "name": "paused", "type": "bool" }, - { "internalType": "uint256", "name": "pauseWindowEndTime", "type": "uint256" }, - { "internalType": "uint256", "name": "bufferPeriodEndTime", "type": "uint256" } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getPoolId", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getRate", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getSwapFeePercentage", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getVault", - "outputs": [{ "internalType": "contract IVault", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "increaseApproval", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "owner", "type": "address" }], - "name": "nonces", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, - { "internalType": "address", "name": "sender", "type": "address" }, - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "uint256[]", "name": "balances", "type": "uint256[]" }, - { "internalType": "uint256", "name": "lastChangeBlock", "type": "uint256" }, - { "internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256" }, - { "internalType": "bytes", "name": "userData", "type": "bytes" } - ], - "name": "onExitPool", - "outputs": [ - { "internalType": "uint256[]", "name": "", "type": "uint256[]" }, - { "internalType": "uint256[]", "name": "", "type": "uint256[]" } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, - { "internalType": "address", "name": "sender", "type": "address" }, - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "uint256[]", "name": "balances", "type": "uint256[]" }, - { "internalType": "uint256", "name": "lastChangeBlock", "type": "uint256" }, - { "internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256" }, - { "internalType": "bytes", "name": "userData", "type": "bytes" } - ], - "name": "onJoinPool", - "outputs": [ - { "internalType": "uint256[]", "name": "", "type": "uint256[]" }, - { "internalType": "uint256[]", "name": "", "type": "uint256[]" } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { "internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8" }, - { "internalType": "contract IERC20", "name": "tokenIn", "type": "address" }, - { "internalType": "contract IERC20", "name": "tokenOut", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" }, - { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, - { "internalType": "uint256", "name": "lastChangeBlock", "type": "uint256" }, - { "internalType": "address", "name": "from", "type": "address" }, - { "internalType": "address", "name": "to", "type": "address" }, - { "internalType": "bytes", "name": "userData", "type": "bytes" } - ], - "internalType": "struct IPoolSwapStructs.SwapRequest", - "name": "request", - "type": "tuple" - }, - { "internalType": "uint256", "name": "balanceTokenIn", "type": "uint256" }, - { "internalType": "uint256", "name": "balanceTokenOut", "type": "uint256" } - ], - "name": "onSwap", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "owner", "type": "address" }, - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "value", "type": "uint256" }, - { "internalType": "uint256", "name": "deadline", "type": "uint256" }, - { "internalType": "uint8", "name": "v", "type": "uint8" }, - { "internalType": "bytes32", "name": "r", "type": "bytes32" }, - { "internalType": "bytes32", "name": "s", "type": "bytes32" } - ], - "name": "permit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, - { "internalType": "address", "name": "sender", "type": "address" }, - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "uint256[]", "name": "balances", "type": "uint256[]" }, - { "internalType": "uint256", "name": "lastChangeBlock", "type": "uint256" }, - { "internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256" }, - { "internalType": "bytes", "name": "userData", "type": "bytes" } - ], - "name": "queryExit", - "outputs": [ - { "internalType": "uint256", "name": "bptIn", "type": "uint256" }, - { "internalType": "uint256[]", "name": "amountsOut", "type": "uint256[]" } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, - { "internalType": "address", "name": "sender", "type": "address" }, - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "uint256[]", "name": "balances", "type": "uint256[]" }, - { "internalType": "uint256", "name": "lastChangeBlock", "type": "uint256" }, - { "internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256" }, - { "internalType": "bytes", "name": "userData", "type": "bytes" } - ], - "name": "queryJoin", - "outputs": [ - { "internalType": "uint256", "name": "bptOut", "type": "uint256" }, - { "internalType": "uint256[]", "name": "amountsIn", "type": "uint256[]" } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "bool", "name": "paused", "type": "bool" }], - "name": "setPaused", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "swapFeePercentage", "type": "uint256" }], - "name": "setSwapFeePercentage", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "transfer", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "sender", "type": "address" }, - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "transferFrom", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - } -] diff --git a/src/apps/koyo/contracts/abis/koyo-vault.json b/src/apps/koyo/contracts/abis/koyo-vault.json deleted file mode 100644 index 9cb1bfeb4..000000000 --- a/src/apps/koyo/contracts/abis/koyo-vault.json +++ /dev/null @@ -1,491 +0,0 @@ -[ - { - "inputs": [ - { "internalType": "contract IAuthorizer", "name": "authorizer", "type": "address" }, - { "internalType": "contract IWETH", "name": "weth", "type": "address" }, - { "internalType": "uint256", "name": "pauseWindowDuration", "type": "uint256" }, - { "internalType": "uint256", "name": "bufferPeriodDuration", "type": "uint256" } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [{ "indexed": true, "internalType": "contract IAuthorizer", "name": "newAuthorizer", "type": "address" }], - "name": "AuthorizerChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "contract IERC20", "name": "token", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, - { "indexed": false, "internalType": "address", "name": "recipient", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "ExternalBalanceTransfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "contract IFlashLoanRecipient", "name": "recipient", "type": "address" }, - { "indexed": true, "internalType": "contract IERC20", "name": "token", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "feeAmount", "type": "uint256" } - ], - "name": "FlashLoan", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "user", "type": "address" }, - { "indexed": true, "internalType": "contract IERC20", "name": "token", "type": "address" }, - { "indexed": false, "internalType": "int256", "name": "delta", "type": "int256" } - ], - "name": "InternalBalanceChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "bool", "name": "paused", "type": "bool" }], - "name": "PausedStateChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, - { "indexed": true, "internalType": "address", "name": "liquidityProvider", "type": "address" }, - { "indexed": false, "internalType": "contract IERC20[]", "name": "tokens", "type": "address[]" }, - { "indexed": false, "internalType": "int256[]", "name": "deltas", "type": "int256[]" }, - { "indexed": false, "internalType": "uint256[]", "name": "protocolFeeAmounts", "type": "uint256[]" } - ], - "name": "PoolBalanceChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, - { "indexed": true, "internalType": "address", "name": "assetManager", "type": "address" }, - { "indexed": true, "internalType": "contract IERC20", "name": "token", "type": "address" }, - { "indexed": false, "internalType": "int256", "name": "cashDelta", "type": "int256" }, - { "indexed": false, "internalType": "int256", "name": "managedDelta", "type": "int256" } - ], - "name": "PoolBalanceManaged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, - { "indexed": true, "internalType": "address", "name": "poolAddress", "type": "address" }, - { "indexed": false, "internalType": "enum IVault.PoolSpecialization", "name": "specialization", "type": "uint8" } - ], - "name": "PoolRegistered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "relayer", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, - { "indexed": false, "internalType": "bool", "name": "approved", "type": "bool" } - ], - "name": "RelayerApprovalChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, - { "indexed": true, "internalType": "contract IERC20", "name": "tokenIn", "type": "address" }, - { "indexed": true, "internalType": "contract IERC20", "name": "tokenOut", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "amountIn", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "amountOut", "type": "uint256" } - ], - "name": "Swap", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, - { "indexed": false, "internalType": "contract IERC20[]", "name": "tokens", "type": "address[]" } - ], - "name": "TokensDeregistered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, - { "indexed": false, "internalType": "contract IERC20[]", "name": "tokens", "type": "address[]" }, - { "indexed": false, "internalType": "address[]", "name": "assetManagers", "type": "address[]" } - ], - "name": "TokensRegistered", - "type": "event" - }, - { - "inputs": [], - "name": "WETH", - "outputs": [{ "internalType": "contract IWETH", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8" }, - { - "components": [ - { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, - { "internalType": "uint256", "name": "assetInIndex", "type": "uint256" }, - { "internalType": "uint256", "name": "assetOutIndex", "type": "uint256" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" }, - { "internalType": "bytes", "name": "userData", "type": "bytes" } - ], - "internalType": "struct IVault.BatchSwapStep[]", - "name": "swaps", - "type": "tuple[]" - }, - { "internalType": "contract IAsset[]", "name": "assets", "type": "address[]" }, - { - "components": [ - { "internalType": "address", "name": "sender", "type": "address" }, - { "internalType": "bool", "name": "fromInternalBalance", "type": "bool" }, - { "internalType": "address payable", "name": "recipient", "type": "address" }, - { "internalType": "bool", "name": "toInternalBalance", "type": "bool" } - ], - "internalType": "struct IVault.FundManagement", - "name": "funds", - "type": "tuple" - }, - { "internalType": "int256[]", "name": "limits", "type": "int256[]" }, - { "internalType": "uint256", "name": "deadline", "type": "uint256" } - ], - "name": "batchSwap", - "outputs": [{ "internalType": "int256[]", "name": "assetDeltas", "type": "int256[]" }], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, - { "internalType": "contract IERC20[]", "name": "tokens", "type": "address[]" } - ], - "name": "deregisterTokens", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, - { "internalType": "address", "name": "sender", "type": "address" }, - { "internalType": "address payable", "name": "recipient", "type": "address" }, - { - "components": [ - { "internalType": "contract IAsset[]", "name": "assets", "type": "address[]" }, - { "internalType": "uint256[]", "name": "minAmountsOut", "type": "uint256[]" }, - { "internalType": "bytes", "name": "userData", "type": "bytes" }, - { "internalType": "bool", "name": "toInternalBalance", "type": "bool" } - ], - "internalType": "struct IVault.ExitPoolRequest", - "name": "request", - "type": "tuple" - } - ], - "name": "exitPool", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "contract IFlashLoanRecipient", "name": "recipient", "type": "address" }, - { "internalType": "contract IERC20[]", "name": "tokens", "type": "address[]" }, - { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, - { "internalType": "bytes", "name": "userData", "type": "bytes" } - ], - "name": "flashLoan", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "bytes4", "name": "selector", "type": "bytes4" }], - "name": "getActionId", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getAuthorizer", - "outputs": [{ "internalType": "contract IAuthorizer", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getDomainSeparator", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "user", "type": "address" }, - { "internalType": "contract IERC20[]", "name": "tokens", "type": "address[]" } - ], - "name": "getInternalBalance", - "outputs": [{ "internalType": "uint256[]", "name": "balances", "type": "uint256[]" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "user", "type": "address" }], - "name": "getNextNonce", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getPausedState", - "outputs": [ - { "internalType": "bool", "name": "paused", "type": "bool" }, - { "internalType": "uint256", "name": "pauseWindowEndTime", "type": "uint256" }, - { "internalType": "uint256", "name": "bufferPeriodEndTime", "type": "uint256" } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "bytes32", "name": "poolId", "type": "bytes32" }], - "name": "getPool", - "outputs": [ - { "internalType": "address", "name": "", "type": "address" }, - { "internalType": "enum IVault.PoolSpecialization", "name": "", "type": "uint8" } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, - { "internalType": "contract IERC20", "name": "token", "type": "address" } - ], - "name": "getPoolTokenInfo", - "outputs": [ - { "internalType": "uint256", "name": "cash", "type": "uint256" }, - { "internalType": "uint256", "name": "managed", "type": "uint256" }, - { "internalType": "uint256", "name": "lastChangeBlock", "type": "uint256" }, - { "internalType": "address", "name": "assetManager", "type": "address" } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "bytes32", "name": "poolId", "type": "bytes32" }], - "name": "getPoolTokens", - "outputs": [ - { "internalType": "contract IERC20[]", "name": "tokens", "type": "address[]" }, - { "internalType": "uint256[]", "name": "balances", "type": "uint256[]" }, - { "internalType": "uint256", "name": "lastChangeBlock", "type": "uint256" } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getProtocolFeesCollector", - "outputs": [{ "internalType": "contract ProtocolFeesCollector", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "user", "type": "address" }, - { "internalType": "address", "name": "relayer", "type": "address" } - ], - "name": "hasApprovedRelayer", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, - { "internalType": "address", "name": "sender", "type": "address" }, - { "internalType": "address", "name": "recipient", "type": "address" }, - { - "components": [ - { "internalType": "contract IAsset[]", "name": "assets", "type": "address[]" }, - { "internalType": "uint256[]", "name": "maxAmountsIn", "type": "uint256[]" }, - { "internalType": "bytes", "name": "userData", "type": "bytes" }, - { "internalType": "bool", "name": "fromInternalBalance", "type": "bool" } - ], - "internalType": "struct IVault.JoinPoolRequest", - "name": "request", - "type": "tuple" - } - ], - "name": "joinPool", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { "internalType": "enum IVault.PoolBalanceOpKind", "name": "kind", "type": "uint8" }, - { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, - { "internalType": "contract IERC20", "name": "token", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "internalType": "struct IVault.PoolBalanceOp[]", - "name": "ops", - "type": "tuple[]" - } - ], - "name": "managePoolBalance", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { "internalType": "enum IVault.UserBalanceOpKind", "name": "kind", "type": "uint8" }, - { "internalType": "contract IAsset", "name": "asset", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" }, - { "internalType": "address", "name": "sender", "type": "address" }, - { "internalType": "address payable", "name": "recipient", "type": "address" } - ], - "internalType": "struct IVault.UserBalanceOp[]", - "name": "ops", - "type": "tuple[]" - } - ], - "name": "manageUserBalance", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8" }, - { - "components": [ - { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, - { "internalType": "uint256", "name": "assetInIndex", "type": "uint256" }, - { "internalType": "uint256", "name": "assetOutIndex", "type": "uint256" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" }, - { "internalType": "bytes", "name": "userData", "type": "bytes" } - ], - "internalType": "struct IVault.BatchSwapStep[]", - "name": "swaps", - "type": "tuple[]" - }, - { "internalType": "contract IAsset[]", "name": "assets", "type": "address[]" }, - { - "components": [ - { "internalType": "address", "name": "sender", "type": "address" }, - { "internalType": "bool", "name": "fromInternalBalance", "type": "bool" }, - { "internalType": "address payable", "name": "recipient", "type": "address" }, - { "internalType": "bool", "name": "toInternalBalance", "type": "bool" } - ], - "internalType": "struct IVault.FundManagement", - "name": "funds", - "type": "tuple" - } - ], - "name": "queryBatchSwap", - "outputs": [{ "internalType": "int256[]", "name": "", "type": "int256[]" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "enum IVault.PoolSpecialization", "name": "specialization", "type": "uint8" }], - "name": "registerPool", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, - { "internalType": "contract IERC20[]", "name": "tokens", "type": "address[]" }, - { "internalType": "address[]", "name": "assetManagers", "type": "address[]" } - ], - "name": "registerTokens", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "contract IAuthorizer", "name": "newAuthorizer", "type": "address" }], - "name": "setAuthorizer", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "bool", "name": "paused", "type": "bool" }], - "name": "setPaused", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "sender", "type": "address" }, - { "internalType": "address", "name": "relayer", "type": "address" }, - { "internalType": "bool", "name": "approved", "type": "bool" } - ], - "name": "setRelayerApproval", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, - { "internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8" }, - { "internalType": "contract IAsset", "name": "assetIn", "type": "address" }, - { "internalType": "contract IAsset", "name": "assetOut", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" }, - { "internalType": "bytes", "name": "userData", "type": "bytes" } - ], - "internalType": "struct IVault.SingleSwap", - "name": "singleSwap", - "type": "tuple" - }, - { - "components": [ - { "internalType": "address", "name": "sender", "type": "address" }, - { "internalType": "bool", "name": "fromInternalBalance", "type": "bool" }, - { "internalType": "address payable", "name": "recipient", "type": "address" }, - { "internalType": "bool", "name": "toInternalBalance", "type": "bool" } - ], - "internalType": "struct IVault.FundManagement", - "name": "funds", - "type": "tuple" - }, - { "internalType": "uint256", "name": "limit", "type": "uint256" }, - { "internalType": "uint256", "name": "deadline", "type": "uint256" } - ], - "name": "swap", - "outputs": [{ "internalType": "uint256", "name": "amountCalculated", "type": "uint256" }], - "stateMutability": "payable", - "type": "function" - }, - { "stateMutability": "payable", "type": "receive" } -] diff --git a/src/apps/koyo/contracts/ethers/KoyoPool.ts b/src/apps/koyo/contracts/ethers/KoyoPool.ts deleted file mode 100644 index ab055777a..000000000 --- a/src/apps/koyo/contracts/ethers/KoyoPool.ts +++ /dev/null @@ -1,994 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import type { - BaseContract, - BigNumber, - BigNumberish, - BytesLike, - CallOverrides, - ContractTransaction, - Overrides, - PopulatedTransaction, - Signer, - utils, -} from 'ethers'; -import type { FunctionFragment, Result, EventFragment } from '@ethersproject/abi'; -import type { Listener, Provider } from '@ethersproject/providers'; -import type { TypedEventFilter, TypedEvent, TypedListener, OnEvent } from './common'; - -export declare namespace IPoolSwapStructs { - export type SwapRequestStruct = { - kind: BigNumberish; - tokenIn: string; - tokenOut: string; - amount: BigNumberish; - poolId: BytesLike; - lastChangeBlock: BigNumberish; - from: string; - to: string; - userData: BytesLike; - }; - - export type SwapRequestStructOutput = [ - number, - string, - string, - BigNumber, - string, - BigNumber, - string, - string, - string, - ] & { - kind: number; - tokenIn: string; - tokenOut: string; - amount: BigNumber; - poolId: string; - lastChangeBlock: BigNumber; - from: string; - to: string; - userData: string; - }; -} - -export interface KoyoPoolInterface extends utils.Interface { - functions: { - 'DOMAIN_SEPARATOR()': FunctionFragment; - 'allowance(address,address)': FunctionFragment; - 'approve(address,uint256)': FunctionFragment; - 'balanceOf(address)': FunctionFragment; - 'decimals()': FunctionFragment; - 'decreaseApproval(address,uint256)': FunctionFragment; - 'getActionId(bytes4)': FunctionFragment; - 'getAuthorizer()': FunctionFragment; - 'getInvariant()': FunctionFragment; - 'getLastInvariant()': FunctionFragment; - 'getNormalizedWeights()': FunctionFragment; - 'getOwner()': FunctionFragment; - 'getPausedState()': FunctionFragment; - 'getPoolId()': FunctionFragment; - 'getRate()': FunctionFragment; - 'getSwapFeePercentage()': FunctionFragment; - 'getVault()': FunctionFragment; - 'increaseApproval(address,uint256)': FunctionFragment; - 'name()': FunctionFragment; - 'nonces(address)': FunctionFragment; - 'onExitPool(bytes32,address,address,uint256[],uint256,uint256,bytes)': FunctionFragment; - 'onJoinPool(bytes32,address,address,uint256[],uint256,uint256,bytes)': FunctionFragment; - 'onSwap((uint8,address,address,uint256,bytes32,uint256,address,address,bytes),uint256,uint256)': FunctionFragment; - 'permit(address,address,uint256,uint256,uint8,bytes32,bytes32)': FunctionFragment; - 'queryExit(bytes32,address,address,uint256[],uint256,uint256,bytes)': FunctionFragment; - 'queryJoin(bytes32,address,address,uint256[],uint256,uint256,bytes)': FunctionFragment; - 'setPaused(bool)': FunctionFragment; - 'setSwapFeePercentage(uint256)': FunctionFragment; - 'symbol()': FunctionFragment; - 'totalSupply()': FunctionFragment; - 'transfer(address,uint256)': FunctionFragment; - 'transferFrom(address,address,uint256)': FunctionFragment; - }; - - getFunction( - nameOrSignatureOrTopic: - | 'DOMAIN_SEPARATOR' - | 'allowance' - | 'approve' - | 'balanceOf' - | 'decimals' - | 'decreaseApproval' - | 'getActionId' - | 'getAuthorizer' - | 'getInvariant' - | 'getLastInvariant' - | 'getNormalizedWeights' - | 'getOwner' - | 'getPausedState' - | 'getPoolId' - | 'getRate' - | 'getSwapFeePercentage' - | 'getVault' - | 'increaseApproval' - | 'name' - | 'nonces' - | 'onExitPool' - | 'onJoinPool' - | 'onSwap' - | 'permit' - | 'queryExit' - | 'queryJoin' - | 'setPaused' - | 'setSwapFeePercentage' - | 'symbol' - | 'totalSupply' - | 'transfer' - | 'transferFrom', - ): FunctionFragment; - - encodeFunctionData(functionFragment: 'DOMAIN_SEPARATOR', values?: undefined): string; - encodeFunctionData(functionFragment: 'allowance', values: [string, string]): string; - encodeFunctionData(functionFragment: 'approve', values: [string, BigNumberish]): string; - encodeFunctionData(functionFragment: 'balanceOf', values: [string]): string; - encodeFunctionData(functionFragment: 'decimals', values?: undefined): string; - encodeFunctionData(functionFragment: 'decreaseApproval', values: [string, BigNumberish]): string; - encodeFunctionData(functionFragment: 'getActionId', values: [BytesLike]): string; - encodeFunctionData(functionFragment: 'getAuthorizer', values?: undefined): string; - encodeFunctionData(functionFragment: 'getInvariant', values?: undefined): string; - encodeFunctionData(functionFragment: 'getLastInvariant', values?: undefined): string; - encodeFunctionData(functionFragment: 'getNormalizedWeights', values?: undefined): string; - encodeFunctionData(functionFragment: 'getOwner', values?: undefined): string; - encodeFunctionData(functionFragment: 'getPausedState', values?: undefined): string; - encodeFunctionData(functionFragment: 'getPoolId', values?: undefined): string; - encodeFunctionData(functionFragment: 'getRate', values?: undefined): string; - encodeFunctionData(functionFragment: 'getSwapFeePercentage', values?: undefined): string; - encodeFunctionData(functionFragment: 'getVault', values?: undefined): string; - encodeFunctionData(functionFragment: 'increaseApproval', values: [string, BigNumberish]): string; - encodeFunctionData(functionFragment: 'name', values?: undefined): string; - encodeFunctionData(functionFragment: 'nonces', values: [string]): string; - encodeFunctionData( - functionFragment: 'onExitPool', - values: [BytesLike, string, string, BigNumberish[], BigNumberish, BigNumberish, BytesLike], - ): string; - encodeFunctionData( - functionFragment: 'onJoinPool', - values: [BytesLike, string, string, BigNumberish[], BigNumberish, BigNumberish, BytesLike], - ): string; - encodeFunctionData( - functionFragment: 'onSwap', - values: [IPoolSwapStructs.SwapRequestStruct, BigNumberish, BigNumberish], - ): string; - encodeFunctionData( - functionFragment: 'permit', - values: [string, string, BigNumberish, BigNumberish, BigNumberish, BytesLike, BytesLike], - ): string; - encodeFunctionData( - functionFragment: 'queryExit', - values: [BytesLike, string, string, BigNumberish[], BigNumberish, BigNumberish, BytesLike], - ): string; - encodeFunctionData( - functionFragment: 'queryJoin', - values: [BytesLike, string, string, BigNumberish[], BigNumberish, BigNumberish, BytesLike], - ): string; - encodeFunctionData(functionFragment: 'setPaused', values: [boolean]): string; - encodeFunctionData(functionFragment: 'setSwapFeePercentage', values: [BigNumberish]): string; - encodeFunctionData(functionFragment: 'symbol', values?: undefined): string; - encodeFunctionData(functionFragment: 'totalSupply', values?: undefined): string; - encodeFunctionData(functionFragment: 'transfer', values: [string, BigNumberish]): string; - encodeFunctionData(functionFragment: 'transferFrom', values: [string, string, BigNumberish]): string; - - decodeFunctionResult(functionFragment: 'DOMAIN_SEPARATOR', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'allowance', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'approve', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'balanceOf', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'decimals', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'decreaseApproval', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'getActionId', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'getAuthorizer', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'getInvariant', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'getLastInvariant', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'getNormalizedWeights', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'getOwner', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'getPausedState', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'getPoolId', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'getRate', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'getSwapFeePercentage', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'getVault', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'increaseApproval', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'name', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'nonces', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'onExitPool', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'onJoinPool', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'onSwap', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'permit', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'queryExit', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'queryJoin', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'setPaused', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'setSwapFeePercentage', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'symbol', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'totalSupply', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'transfer', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'transferFrom', data: BytesLike): Result; - - events: { - 'Approval(address,address,uint256)': EventFragment; - 'PausedStateChanged(bool)': EventFragment; - 'SwapFeePercentageChanged(uint256)': EventFragment; - 'Transfer(address,address,uint256)': EventFragment; - }; - - getEvent(nameOrSignatureOrTopic: 'Approval'): EventFragment; - getEvent(nameOrSignatureOrTopic: 'PausedStateChanged'): EventFragment; - getEvent(nameOrSignatureOrTopic: 'SwapFeePercentageChanged'): EventFragment; - getEvent(nameOrSignatureOrTopic: 'Transfer'): EventFragment; -} - -export interface ApprovalEventObject { - owner: string; - spender: string; - value: BigNumber; -} -export type ApprovalEvent = TypedEvent<[string, string, BigNumber], ApprovalEventObject>; - -export type ApprovalEventFilter = TypedEventFilter; - -export interface PausedStateChangedEventObject { - paused: boolean; -} -export type PausedStateChangedEvent = TypedEvent<[boolean], PausedStateChangedEventObject>; - -export type PausedStateChangedEventFilter = TypedEventFilter; - -export interface SwapFeePercentageChangedEventObject { - swapFeePercentage: BigNumber; -} -export type SwapFeePercentageChangedEvent = TypedEvent<[BigNumber], SwapFeePercentageChangedEventObject>; - -export type SwapFeePercentageChangedEventFilter = TypedEventFilter; - -export interface TransferEventObject { - from: string; - to: string; - value: BigNumber; -} -export type TransferEvent = TypedEvent<[string, string, BigNumber], TransferEventObject>; - -export type TransferEventFilter = TypedEventFilter; - -export interface KoyoPool extends BaseContract { - connect(signerOrProvider: Signer | Provider | string): this; - attach(addressOrName: string): this; - deployed(): Promise; - - interface: KoyoPoolInterface; - - queryFilter( - event: TypedEventFilter, - fromBlockOrBlockhash?: string | number | undefined, - toBlock?: string | number | undefined, - ): Promise>; - - listeners(eventFilter?: TypedEventFilter): Array>; - listeners(eventName?: string): Array; - removeAllListeners(eventFilter: TypedEventFilter): this; - removeAllListeners(eventName?: string): this; - off: OnEvent; - on: OnEvent; - once: OnEvent; - removeListener: OnEvent; - - functions: { - DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise<[string]>; - - allowance(owner: string, spender: string, overrides?: CallOverrides): Promise<[BigNumber]>; - - approve( - spender: string, - amount: BigNumberish, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - balanceOf(account: string, overrides?: CallOverrides): Promise<[BigNumber]>; - - decimals(overrides?: CallOverrides): Promise<[number]>; - - decreaseApproval( - spender: string, - amount: BigNumberish, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - getActionId(selector: BytesLike, overrides?: CallOverrides): Promise<[string]>; - - getAuthorizer(overrides?: CallOverrides): Promise<[string]>; - - getInvariant(overrides?: CallOverrides): Promise<[BigNumber]>; - - getLastInvariant(overrides?: CallOverrides): Promise<[BigNumber]>; - - getNormalizedWeights(overrides?: CallOverrides): Promise<[BigNumber[]]>; - - getOwner(overrides?: CallOverrides): Promise<[string]>; - - getPausedState(overrides?: CallOverrides): Promise< - [boolean, BigNumber, BigNumber] & { - paused: boolean; - pauseWindowEndTime: BigNumber; - bufferPeriodEndTime: BigNumber; - } - >; - - getPoolId(overrides?: CallOverrides): Promise<[string]>; - - getRate(overrides?: CallOverrides): Promise<[BigNumber]>; - - getSwapFeePercentage(overrides?: CallOverrides): Promise<[BigNumber]>; - - getVault(overrides?: CallOverrides): Promise<[string]>; - - increaseApproval( - spender: string, - amount: BigNumberish, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - name(overrides?: CallOverrides): Promise<[string]>; - - nonces(owner: string, overrides?: CallOverrides): Promise<[BigNumber]>; - - onExitPool( - poolId: BytesLike, - sender: string, - recipient: string, - balances: BigNumberish[], - lastChangeBlock: BigNumberish, - protocolSwapFeePercentage: BigNumberish, - userData: BytesLike, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - onJoinPool( - poolId: BytesLike, - sender: string, - recipient: string, - balances: BigNumberish[], - lastChangeBlock: BigNumberish, - protocolSwapFeePercentage: BigNumberish, - userData: BytesLike, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - onSwap( - request: IPoolSwapStructs.SwapRequestStruct, - balanceTokenIn: BigNumberish, - balanceTokenOut: BigNumberish, - overrides?: CallOverrides, - ): Promise<[BigNumber]>; - - permit( - owner: string, - spender: string, - value: BigNumberish, - deadline: BigNumberish, - v: BigNumberish, - r: BytesLike, - s: BytesLike, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - queryExit( - poolId: BytesLike, - sender: string, - recipient: string, - balances: BigNumberish[], - lastChangeBlock: BigNumberish, - protocolSwapFeePercentage: BigNumberish, - userData: BytesLike, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - queryJoin( - poolId: BytesLike, - sender: string, - recipient: string, - balances: BigNumberish[], - lastChangeBlock: BigNumberish, - protocolSwapFeePercentage: BigNumberish, - userData: BytesLike, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - setPaused( - paused: boolean, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - setSwapFeePercentage( - swapFeePercentage: BigNumberish, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - symbol(overrides?: CallOverrides): Promise<[string]>; - - totalSupply(overrides?: CallOverrides): Promise<[BigNumber]>; - - transfer( - recipient: string, - amount: BigNumberish, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - transferFrom( - sender: string, - recipient: string, - amount: BigNumberish, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - }; - - DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; - - allowance(owner: string, spender: string, overrides?: CallOverrides): Promise; - - approve( - spender: string, - amount: BigNumberish, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - balanceOf(account: string, overrides?: CallOverrides): Promise; - - decimals(overrides?: CallOverrides): Promise; - - decreaseApproval( - spender: string, - amount: BigNumberish, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - getActionId(selector: BytesLike, overrides?: CallOverrides): Promise; - - getAuthorizer(overrides?: CallOverrides): Promise; - - getInvariant(overrides?: CallOverrides): Promise; - - getLastInvariant(overrides?: CallOverrides): Promise; - - getNormalizedWeights(overrides?: CallOverrides): Promise; - - getOwner(overrides?: CallOverrides): Promise; - - getPausedState(overrides?: CallOverrides): Promise< - [boolean, BigNumber, BigNumber] & { - paused: boolean; - pauseWindowEndTime: BigNumber; - bufferPeriodEndTime: BigNumber; - } - >; - - getPoolId(overrides?: CallOverrides): Promise; - - getRate(overrides?: CallOverrides): Promise; - - getSwapFeePercentage(overrides?: CallOverrides): Promise; - - getVault(overrides?: CallOverrides): Promise; - - increaseApproval( - spender: string, - amount: BigNumberish, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - name(overrides?: CallOverrides): Promise; - - nonces(owner: string, overrides?: CallOverrides): Promise; - - onExitPool( - poolId: BytesLike, - sender: string, - recipient: string, - balances: BigNumberish[], - lastChangeBlock: BigNumberish, - protocolSwapFeePercentage: BigNumberish, - userData: BytesLike, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - onJoinPool( - poolId: BytesLike, - sender: string, - recipient: string, - balances: BigNumberish[], - lastChangeBlock: BigNumberish, - protocolSwapFeePercentage: BigNumberish, - userData: BytesLike, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - onSwap( - request: IPoolSwapStructs.SwapRequestStruct, - balanceTokenIn: BigNumberish, - balanceTokenOut: BigNumberish, - overrides?: CallOverrides, - ): Promise; - - permit( - owner: string, - spender: string, - value: BigNumberish, - deadline: BigNumberish, - v: BigNumberish, - r: BytesLike, - s: BytesLike, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - queryExit( - poolId: BytesLike, - sender: string, - recipient: string, - balances: BigNumberish[], - lastChangeBlock: BigNumberish, - protocolSwapFeePercentage: BigNumberish, - userData: BytesLike, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - queryJoin( - poolId: BytesLike, - sender: string, - recipient: string, - balances: BigNumberish[], - lastChangeBlock: BigNumberish, - protocolSwapFeePercentage: BigNumberish, - userData: BytesLike, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - setPaused(paused: boolean, overrides?: Overrides & { from?: string | Promise }): Promise; - - setSwapFeePercentage( - swapFeePercentage: BigNumberish, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - symbol(overrides?: CallOverrides): Promise; - - totalSupply(overrides?: CallOverrides): Promise; - - transfer( - recipient: string, - amount: BigNumberish, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - transferFrom( - sender: string, - recipient: string, - amount: BigNumberish, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - callStatic: { - DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; - - allowance(owner: string, spender: string, overrides?: CallOverrides): Promise; - - approve(spender: string, amount: BigNumberish, overrides?: CallOverrides): Promise; - - balanceOf(account: string, overrides?: CallOverrides): Promise; - - decimals(overrides?: CallOverrides): Promise; - - decreaseApproval(spender: string, amount: BigNumberish, overrides?: CallOverrides): Promise; - - getActionId(selector: BytesLike, overrides?: CallOverrides): Promise; - - getAuthorizer(overrides?: CallOverrides): Promise; - - getInvariant(overrides?: CallOverrides): Promise; - - getLastInvariant(overrides?: CallOverrides): Promise; - - getNormalizedWeights(overrides?: CallOverrides): Promise; - - getOwner(overrides?: CallOverrides): Promise; - - getPausedState(overrides?: CallOverrides): Promise< - [boolean, BigNumber, BigNumber] & { - paused: boolean; - pauseWindowEndTime: BigNumber; - bufferPeriodEndTime: BigNumber; - } - >; - - getPoolId(overrides?: CallOverrides): Promise; - - getRate(overrides?: CallOverrides): Promise; - - getSwapFeePercentage(overrides?: CallOverrides): Promise; - - getVault(overrides?: CallOverrides): Promise; - - increaseApproval(spender: string, amount: BigNumberish, overrides?: CallOverrides): Promise; - - name(overrides?: CallOverrides): Promise; - - nonces(owner: string, overrides?: CallOverrides): Promise; - - onExitPool( - poolId: BytesLike, - sender: string, - recipient: string, - balances: BigNumberish[], - lastChangeBlock: BigNumberish, - protocolSwapFeePercentage: BigNumberish, - userData: BytesLike, - overrides?: CallOverrides, - ): Promise<[BigNumber[], BigNumber[]]>; - - onJoinPool( - poolId: BytesLike, - sender: string, - recipient: string, - balances: BigNumberish[], - lastChangeBlock: BigNumberish, - protocolSwapFeePercentage: BigNumberish, - userData: BytesLike, - overrides?: CallOverrides, - ): Promise<[BigNumber[], BigNumber[]]>; - - onSwap( - request: IPoolSwapStructs.SwapRequestStruct, - balanceTokenIn: BigNumberish, - balanceTokenOut: BigNumberish, - overrides?: CallOverrides, - ): Promise; - - permit( - owner: string, - spender: string, - value: BigNumberish, - deadline: BigNumberish, - v: BigNumberish, - r: BytesLike, - s: BytesLike, - overrides?: CallOverrides, - ): Promise; - - queryExit( - poolId: BytesLike, - sender: string, - recipient: string, - balances: BigNumberish[], - lastChangeBlock: BigNumberish, - protocolSwapFeePercentage: BigNumberish, - userData: BytesLike, - overrides?: CallOverrides, - ): Promise<[BigNumber, BigNumber[]] & { bptIn: BigNumber; amountsOut: BigNumber[] }>; - - queryJoin( - poolId: BytesLike, - sender: string, - recipient: string, - balances: BigNumberish[], - lastChangeBlock: BigNumberish, - protocolSwapFeePercentage: BigNumberish, - userData: BytesLike, - overrides?: CallOverrides, - ): Promise<[BigNumber, BigNumber[]] & { bptOut: BigNumber; amountsIn: BigNumber[] }>; - - setPaused(paused: boolean, overrides?: CallOverrides): Promise; - - setSwapFeePercentage(swapFeePercentage: BigNumberish, overrides?: CallOverrides): Promise; - - symbol(overrides?: CallOverrides): Promise; - - totalSupply(overrides?: CallOverrides): Promise; - - transfer(recipient: string, amount: BigNumberish, overrides?: CallOverrides): Promise; - - transferFrom(sender: string, recipient: string, amount: BigNumberish, overrides?: CallOverrides): Promise; - }; - - filters: { - 'Approval(address,address,uint256)'( - owner?: string | null, - spender?: string | null, - value?: null, - ): ApprovalEventFilter; - Approval(owner?: string | null, spender?: string | null, value?: null): ApprovalEventFilter; - - 'PausedStateChanged(bool)'(paused?: null): PausedStateChangedEventFilter; - PausedStateChanged(paused?: null): PausedStateChangedEventFilter; - - 'SwapFeePercentageChanged(uint256)'(swapFeePercentage?: null): SwapFeePercentageChangedEventFilter; - SwapFeePercentageChanged(swapFeePercentage?: null): SwapFeePercentageChangedEventFilter; - - 'Transfer(address,address,uint256)'(from?: string | null, to?: string | null, value?: null): TransferEventFilter; - Transfer(from?: string | null, to?: string | null, value?: null): TransferEventFilter; - }; - - estimateGas: { - DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; - - allowance(owner: string, spender: string, overrides?: CallOverrides): Promise; - - approve( - spender: string, - amount: BigNumberish, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - balanceOf(account: string, overrides?: CallOverrides): Promise; - - decimals(overrides?: CallOverrides): Promise; - - decreaseApproval( - spender: string, - amount: BigNumberish, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - getActionId(selector: BytesLike, overrides?: CallOverrides): Promise; - - getAuthorizer(overrides?: CallOverrides): Promise; - - getInvariant(overrides?: CallOverrides): Promise; - - getLastInvariant(overrides?: CallOverrides): Promise; - - getNormalizedWeights(overrides?: CallOverrides): Promise; - - getOwner(overrides?: CallOverrides): Promise; - - getPausedState(overrides?: CallOverrides): Promise; - - getPoolId(overrides?: CallOverrides): Promise; - - getRate(overrides?: CallOverrides): Promise; - - getSwapFeePercentage(overrides?: CallOverrides): Promise; - - getVault(overrides?: CallOverrides): Promise; - - increaseApproval( - spender: string, - amount: BigNumberish, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - name(overrides?: CallOverrides): Promise; - - nonces(owner: string, overrides?: CallOverrides): Promise; - - onExitPool( - poolId: BytesLike, - sender: string, - recipient: string, - balances: BigNumberish[], - lastChangeBlock: BigNumberish, - protocolSwapFeePercentage: BigNumberish, - userData: BytesLike, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - onJoinPool( - poolId: BytesLike, - sender: string, - recipient: string, - balances: BigNumberish[], - lastChangeBlock: BigNumberish, - protocolSwapFeePercentage: BigNumberish, - userData: BytesLike, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - onSwap( - request: IPoolSwapStructs.SwapRequestStruct, - balanceTokenIn: BigNumberish, - balanceTokenOut: BigNumberish, - overrides?: CallOverrides, - ): Promise; - - permit( - owner: string, - spender: string, - value: BigNumberish, - deadline: BigNumberish, - v: BigNumberish, - r: BytesLike, - s: BytesLike, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - queryExit( - poolId: BytesLike, - sender: string, - recipient: string, - balances: BigNumberish[], - lastChangeBlock: BigNumberish, - protocolSwapFeePercentage: BigNumberish, - userData: BytesLike, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - queryJoin( - poolId: BytesLike, - sender: string, - recipient: string, - balances: BigNumberish[], - lastChangeBlock: BigNumberish, - protocolSwapFeePercentage: BigNumberish, - userData: BytesLike, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - setPaused(paused: boolean, overrides?: Overrides & { from?: string | Promise }): Promise; - - setSwapFeePercentage( - swapFeePercentage: BigNumberish, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - symbol(overrides?: CallOverrides): Promise; - - totalSupply(overrides?: CallOverrides): Promise; - - transfer( - recipient: string, - amount: BigNumberish, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - transferFrom( - sender: string, - recipient: string, - amount: BigNumberish, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - }; - - populateTransaction: { - DOMAIN_SEPARATOR(overrides?: CallOverrides): Promise; - - allowance(owner: string, spender: string, overrides?: CallOverrides): Promise; - - approve( - spender: string, - amount: BigNumberish, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - balanceOf(account: string, overrides?: CallOverrides): Promise; - - decimals(overrides?: CallOverrides): Promise; - - decreaseApproval( - spender: string, - amount: BigNumberish, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - getActionId(selector: BytesLike, overrides?: CallOverrides): Promise; - - getAuthorizer(overrides?: CallOverrides): Promise; - - getInvariant(overrides?: CallOverrides): Promise; - - getLastInvariant(overrides?: CallOverrides): Promise; - - getNormalizedWeights(overrides?: CallOverrides): Promise; - - getOwner(overrides?: CallOverrides): Promise; - - getPausedState(overrides?: CallOverrides): Promise; - - getPoolId(overrides?: CallOverrides): Promise; - - getRate(overrides?: CallOverrides): Promise; - - getSwapFeePercentage(overrides?: CallOverrides): Promise; - - getVault(overrides?: CallOverrides): Promise; - - increaseApproval( - spender: string, - amount: BigNumberish, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - name(overrides?: CallOverrides): Promise; - - nonces(owner: string, overrides?: CallOverrides): Promise; - - onExitPool( - poolId: BytesLike, - sender: string, - recipient: string, - balances: BigNumberish[], - lastChangeBlock: BigNumberish, - protocolSwapFeePercentage: BigNumberish, - userData: BytesLike, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - onJoinPool( - poolId: BytesLike, - sender: string, - recipient: string, - balances: BigNumberish[], - lastChangeBlock: BigNumberish, - protocolSwapFeePercentage: BigNumberish, - userData: BytesLike, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - onSwap( - request: IPoolSwapStructs.SwapRequestStruct, - balanceTokenIn: BigNumberish, - balanceTokenOut: BigNumberish, - overrides?: CallOverrides, - ): Promise; - - permit( - owner: string, - spender: string, - value: BigNumberish, - deadline: BigNumberish, - v: BigNumberish, - r: BytesLike, - s: BytesLike, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - queryExit( - poolId: BytesLike, - sender: string, - recipient: string, - balances: BigNumberish[], - lastChangeBlock: BigNumberish, - protocolSwapFeePercentage: BigNumberish, - userData: BytesLike, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - queryJoin( - poolId: BytesLike, - sender: string, - recipient: string, - balances: BigNumberish[], - lastChangeBlock: BigNumberish, - protocolSwapFeePercentage: BigNumberish, - userData: BytesLike, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - setPaused( - paused: boolean, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - setSwapFeePercentage( - swapFeePercentage: BigNumberish, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - symbol(overrides?: CallOverrides): Promise; - - totalSupply(overrides?: CallOverrides): Promise; - - transfer( - recipient: string, - amount: BigNumberish, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - transferFrom( - sender: string, - recipient: string, - amount: BigNumberish, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - }; -} diff --git a/src/apps/koyo/contracts/ethers/KoyoVault.ts b/src/apps/koyo/contracts/ethers/KoyoVault.ts deleted file mode 100644 index 602f94520..000000000 --- a/src/apps/koyo/contracts/ethers/KoyoVault.ts +++ /dev/null @@ -1,1207 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import type { - BaseContract, - BigNumber, - BigNumberish, - BytesLike, - CallOverrides, - ContractTransaction, - Overrides, - PayableOverrides, - PopulatedTransaction, - Signer, - utils, -} from 'ethers'; -import type { FunctionFragment, Result, EventFragment } from '@ethersproject/abi'; -import type { Listener, Provider } from '@ethersproject/providers'; -import type { TypedEventFilter, TypedEvent, TypedListener, OnEvent } from './common'; - -export declare namespace IVault { - export type BatchSwapStepStruct = { - poolId: BytesLike; - assetInIndex: BigNumberish; - assetOutIndex: BigNumberish; - amount: BigNumberish; - userData: BytesLike; - }; - - export type BatchSwapStepStructOutput = [string, BigNumber, BigNumber, BigNumber, string] & { - poolId: string; - assetInIndex: BigNumber; - assetOutIndex: BigNumber; - amount: BigNumber; - userData: string; - }; - - export type FundManagementStruct = { - sender: string; - fromInternalBalance: boolean; - recipient: string; - toInternalBalance: boolean; - }; - - export type FundManagementStructOutput = [string, boolean, string, boolean] & { - sender: string; - fromInternalBalance: boolean; - recipient: string; - toInternalBalance: boolean; - }; - - export type ExitPoolRequestStruct = { - assets: string[]; - minAmountsOut: BigNumberish[]; - userData: BytesLike; - toInternalBalance: boolean; - }; - - export type ExitPoolRequestStructOutput = [string[], BigNumber[], string, boolean] & { - assets: string[]; - minAmountsOut: BigNumber[]; - userData: string; - toInternalBalance: boolean; - }; - - export type JoinPoolRequestStruct = { - assets: string[]; - maxAmountsIn: BigNumberish[]; - userData: BytesLike; - fromInternalBalance: boolean; - }; - - export type JoinPoolRequestStructOutput = [string[], BigNumber[], string, boolean] & { - assets: string[]; - maxAmountsIn: BigNumber[]; - userData: string; - fromInternalBalance: boolean; - }; - - export type PoolBalanceOpStruct = { - kind: BigNumberish; - poolId: BytesLike; - token: string; - amount: BigNumberish; - }; - - export type PoolBalanceOpStructOutput = [number, string, string, BigNumber] & { - kind: number; - poolId: string; - token: string; - amount: BigNumber; - }; - - export type UserBalanceOpStruct = { - kind: BigNumberish; - asset: string; - amount: BigNumberish; - sender: string; - recipient: string; - }; - - export type UserBalanceOpStructOutput = [number, string, BigNumber, string, string] & { - kind: number; - asset: string; - amount: BigNumber; - sender: string; - recipient: string; - }; - - export type SingleSwapStruct = { - poolId: BytesLike; - kind: BigNumberish; - assetIn: string; - assetOut: string; - amount: BigNumberish; - userData: BytesLike; - }; - - export type SingleSwapStructOutput = [string, number, string, string, BigNumber, string] & { - poolId: string; - kind: number; - assetIn: string; - assetOut: string; - amount: BigNumber; - userData: string; - }; -} - -export interface KoyoVaultInterface extends utils.Interface { - functions: { - 'WETH()': FunctionFragment; - 'batchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool),int256[],uint256)': FunctionFragment; - 'deregisterTokens(bytes32,address[])': FunctionFragment; - 'exitPool(bytes32,address,address,(address[],uint256[],bytes,bool))': FunctionFragment; - 'flashLoan(address,address[],uint256[],bytes)': FunctionFragment; - 'getActionId(bytes4)': FunctionFragment; - 'getAuthorizer()': FunctionFragment; - 'getDomainSeparator()': FunctionFragment; - 'getInternalBalance(address,address[])': FunctionFragment; - 'getNextNonce(address)': FunctionFragment; - 'getPausedState()': FunctionFragment; - 'getPool(bytes32)': FunctionFragment; - 'getPoolTokenInfo(bytes32,address)': FunctionFragment; - 'getPoolTokens(bytes32)': FunctionFragment; - 'getProtocolFeesCollector()': FunctionFragment; - 'hasApprovedRelayer(address,address)': FunctionFragment; - 'joinPool(bytes32,address,address,(address[],uint256[],bytes,bool))': FunctionFragment; - 'managePoolBalance((uint8,bytes32,address,uint256)[])': FunctionFragment; - 'manageUserBalance((uint8,address,uint256,address,address)[])': FunctionFragment; - 'queryBatchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool))': FunctionFragment; - 'registerPool(uint8)': FunctionFragment; - 'registerTokens(bytes32,address[],address[])': FunctionFragment; - 'setAuthorizer(address)': FunctionFragment; - 'setPaused(bool)': FunctionFragment; - 'setRelayerApproval(address,address,bool)': FunctionFragment; - 'swap((bytes32,uint8,address,address,uint256,bytes),(address,bool,address,bool),uint256,uint256)': FunctionFragment; - }; - - getFunction( - nameOrSignatureOrTopic: - | 'WETH' - | 'batchSwap' - | 'deregisterTokens' - | 'exitPool' - | 'flashLoan' - | 'getActionId' - | 'getAuthorizer' - | 'getDomainSeparator' - | 'getInternalBalance' - | 'getNextNonce' - | 'getPausedState' - | 'getPool' - | 'getPoolTokenInfo' - | 'getPoolTokens' - | 'getProtocolFeesCollector' - | 'hasApprovedRelayer' - | 'joinPool' - | 'managePoolBalance' - | 'manageUserBalance' - | 'queryBatchSwap' - | 'registerPool' - | 'registerTokens' - | 'setAuthorizer' - | 'setPaused' - | 'setRelayerApproval' - | 'swap', - ): FunctionFragment; - - encodeFunctionData(functionFragment: 'WETH', values?: undefined): string; - encodeFunctionData( - functionFragment: 'batchSwap', - values: [ - BigNumberish, - IVault.BatchSwapStepStruct[], - string[], - IVault.FundManagementStruct, - BigNumberish[], - BigNumberish, - ], - ): string; - encodeFunctionData(functionFragment: 'deregisterTokens', values: [BytesLike, string[]]): string; - encodeFunctionData( - functionFragment: 'exitPool', - values: [BytesLike, string, string, IVault.ExitPoolRequestStruct], - ): string; - encodeFunctionData(functionFragment: 'flashLoan', values: [string, string[], BigNumberish[], BytesLike]): string; - encodeFunctionData(functionFragment: 'getActionId', values: [BytesLike]): string; - encodeFunctionData(functionFragment: 'getAuthorizer', values?: undefined): string; - encodeFunctionData(functionFragment: 'getDomainSeparator', values?: undefined): string; - encodeFunctionData(functionFragment: 'getInternalBalance', values: [string, string[]]): string; - encodeFunctionData(functionFragment: 'getNextNonce', values: [string]): string; - encodeFunctionData(functionFragment: 'getPausedState', values?: undefined): string; - encodeFunctionData(functionFragment: 'getPool', values: [BytesLike]): string; - encodeFunctionData(functionFragment: 'getPoolTokenInfo', values: [BytesLike, string]): string; - encodeFunctionData(functionFragment: 'getPoolTokens', values: [BytesLike]): string; - encodeFunctionData(functionFragment: 'getProtocolFeesCollector', values?: undefined): string; - encodeFunctionData(functionFragment: 'hasApprovedRelayer', values: [string, string]): string; - encodeFunctionData( - functionFragment: 'joinPool', - values: [BytesLike, string, string, IVault.JoinPoolRequestStruct], - ): string; - encodeFunctionData(functionFragment: 'managePoolBalance', values: [IVault.PoolBalanceOpStruct[]]): string; - encodeFunctionData(functionFragment: 'manageUserBalance', values: [IVault.UserBalanceOpStruct[]]): string; - encodeFunctionData( - functionFragment: 'queryBatchSwap', - values: [BigNumberish, IVault.BatchSwapStepStruct[], string[], IVault.FundManagementStruct], - ): string; - encodeFunctionData(functionFragment: 'registerPool', values: [BigNumberish]): string; - encodeFunctionData(functionFragment: 'registerTokens', values: [BytesLike, string[], string[]]): string; - encodeFunctionData(functionFragment: 'setAuthorizer', values: [string]): string; - encodeFunctionData(functionFragment: 'setPaused', values: [boolean]): string; - encodeFunctionData(functionFragment: 'setRelayerApproval', values: [string, string, boolean]): string; - encodeFunctionData( - functionFragment: 'swap', - values: [IVault.SingleSwapStruct, IVault.FundManagementStruct, BigNumberish, BigNumberish], - ): string; - - decodeFunctionResult(functionFragment: 'WETH', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'batchSwap', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'deregisterTokens', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'exitPool', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'flashLoan', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'getActionId', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'getAuthorizer', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'getDomainSeparator', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'getInternalBalance', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'getNextNonce', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'getPausedState', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'getPool', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'getPoolTokenInfo', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'getPoolTokens', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'getProtocolFeesCollector', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'hasApprovedRelayer', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'joinPool', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'managePoolBalance', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'manageUserBalance', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'queryBatchSwap', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'registerPool', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'registerTokens', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'setAuthorizer', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'setPaused', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'setRelayerApproval', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'swap', data: BytesLike): Result; - - events: { - 'AuthorizerChanged(address)': EventFragment; - 'ExternalBalanceTransfer(address,address,address,uint256)': EventFragment; - 'FlashLoan(address,address,uint256,uint256)': EventFragment; - 'InternalBalanceChanged(address,address,int256)': EventFragment; - 'PausedStateChanged(bool)': EventFragment; - 'PoolBalanceChanged(bytes32,address,address[],int256[],uint256[])': EventFragment; - 'PoolBalanceManaged(bytes32,address,address,int256,int256)': EventFragment; - 'PoolRegistered(bytes32,address,uint8)': EventFragment; - 'RelayerApprovalChanged(address,address,bool)': EventFragment; - 'Swap(bytes32,address,address,uint256,uint256)': EventFragment; - 'TokensDeregistered(bytes32,address[])': EventFragment; - 'TokensRegistered(bytes32,address[],address[])': EventFragment; - }; - - getEvent(nameOrSignatureOrTopic: 'AuthorizerChanged'): EventFragment; - getEvent(nameOrSignatureOrTopic: 'ExternalBalanceTransfer'): EventFragment; - getEvent(nameOrSignatureOrTopic: 'FlashLoan'): EventFragment; - getEvent(nameOrSignatureOrTopic: 'InternalBalanceChanged'): EventFragment; - getEvent(nameOrSignatureOrTopic: 'PausedStateChanged'): EventFragment; - getEvent(nameOrSignatureOrTopic: 'PoolBalanceChanged'): EventFragment; - getEvent(nameOrSignatureOrTopic: 'PoolBalanceManaged'): EventFragment; - getEvent(nameOrSignatureOrTopic: 'PoolRegistered'): EventFragment; - getEvent(nameOrSignatureOrTopic: 'RelayerApprovalChanged'): EventFragment; - getEvent(nameOrSignatureOrTopic: 'Swap'): EventFragment; - getEvent(nameOrSignatureOrTopic: 'TokensDeregistered'): EventFragment; - getEvent(nameOrSignatureOrTopic: 'TokensRegistered'): EventFragment; -} - -export interface AuthorizerChangedEventObject { - newAuthorizer: string; -} -export type AuthorizerChangedEvent = TypedEvent<[string], AuthorizerChangedEventObject>; - -export type AuthorizerChangedEventFilter = TypedEventFilter; - -export interface ExternalBalanceTransferEventObject { - token: string; - sender: string; - recipient: string; - amount: BigNumber; -} -export type ExternalBalanceTransferEvent = TypedEvent< - [string, string, string, BigNumber], - ExternalBalanceTransferEventObject ->; - -export type ExternalBalanceTransferEventFilter = TypedEventFilter; - -export interface FlashLoanEventObject { - recipient: string; - token: string; - amount: BigNumber; - feeAmount: BigNumber; -} -export type FlashLoanEvent = TypedEvent<[string, string, BigNumber, BigNumber], FlashLoanEventObject>; - -export type FlashLoanEventFilter = TypedEventFilter; - -export interface InternalBalanceChangedEventObject { - user: string; - token: string; - delta: BigNumber; -} -export type InternalBalanceChangedEvent = TypedEvent<[string, string, BigNumber], InternalBalanceChangedEventObject>; - -export type InternalBalanceChangedEventFilter = TypedEventFilter; - -export interface PausedStateChangedEventObject { - paused: boolean; -} -export type PausedStateChangedEvent = TypedEvent<[boolean], PausedStateChangedEventObject>; - -export type PausedStateChangedEventFilter = TypedEventFilter; - -export interface PoolBalanceChangedEventObject { - poolId: string; - liquidityProvider: string; - tokens: string[]; - deltas: BigNumber[]; - protocolFeeAmounts: BigNumber[]; -} -export type PoolBalanceChangedEvent = TypedEvent< - [string, string, string[], BigNumber[], BigNumber[]], - PoolBalanceChangedEventObject ->; - -export type PoolBalanceChangedEventFilter = TypedEventFilter; - -export interface PoolBalanceManagedEventObject { - poolId: string; - assetManager: string; - token: string; - cashDelta: BigNumber; - managedDelta: BigNumber; -} -export type PoolBalanceManagedEvent = TypedEvent< - [string, string, string, BigNumber, BigNumber], - PoolBalanceManagedEventObject ->; - -export type PoolBalanceManagedEventFilter = TypedEventFilter; - -export interface PoolRegisteredEventObject { - poolId: string; - poolAddress: string; - specialization: number; -} -export type PoolRegisteredEvent = TypedEvent<[string, string, number], PoolRegisteredEventObject>; - -export type PoolRegisteredEventFilter = TypedEventFilter; - -export interface RelayerApprovalChangedEventObject { - relayer: string; - sender: string; - approved: boolean; -} -export type RelayerApprovalChangedEvent = TypedEvent<[string, string, boolean], RelayerApprovalChangedEventObject>; - -export type RelayerApprovalChangedEventFilter = TypedEventFilter; - -export interface SwapEventObject { - poolId: string; - tokenIn: string; - tokenOut: string; - amountIn: BigNumber; - amountOut: BigNumber; -} -export type SwapEvent = TypedEvent<[string, string, string, BigNumber, BigNumber], SwapEventObject>; - -export type SwapEventFilter = TypedEventFilter; - -export interface TokensDeregisteredEventObject { - poolId: string; - tokens: string[]; -} -export type TokensDeregisteredEvent = TypedEvent<[string, string[]], TokensDeregisteredEventObject>; - -export type TokensDeregisteredEventFilter = TypedEventFilter; - -export interface TokensRegisteredEventObject { - poolId: string; - tokens: string[]; - assetManagers: string[]; -} -export type TokensRegisteredEvent = TypedEvent<[string, string[], string[]], TokensRegisteredEventObject>; - -export type TokensRegisteredEventFilter = TypedEventFilter; - -export interface KoyoVault extends BaseContract { - connect(signerOrProvider: Signer | Provider | string): this; - attach(addressOrName: string): this; - deployed(): Promise; - - interface: KoyoVaultInterface; - - queryFilter( - event: TypedEventFilter, - fromBlockOrBlockhash?: string | number | undefined, - toBlock?: string | number | undefined, - ): Promise>; - - listeners(eventFilter?: TypedEventFilter): Array>; - listeners(eventName?: string): Array; - removeAllListeners(eventFilter: TypedEventFilter): this; - removeAllListeners(eventName?: string): this; - off: OnEvent; - on: OnEvent; - once: OnEvent; - removeListener: OnEvent; - - functions: { - WETH(overrides?: CallOverrides): Promise<[string]>; - - batchSwap( - kind: BigNumberish, - swaps: IVault.BatchSwapStepStruct[], - assets: string[], - funds: IVault.FundManagementStruct, - limits: BigNumberish[], - deadline: BigNumberish, - overrides?: PayableOverrides & { from?: string | Promise }, - ): Promise; - - deregisterTokens( - poolId: BytesLike, - tokens: string[], - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - exitPool( - poolId: BytesLike, - sender: string, - recipient: string, - request: IVault.ExitPoolRequestStruct, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - flashLoan( - recipient: string, - tokens: string[], - amounts: BigNumberish[], - userData: BytesLike, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - getActionId(selector: BytesLike, overrides?: CallOverrides): Promise<[string]>; - - getAuthorizer(overrides?: CallOverrides): Promise<[string]>; - - getDomainSeparator(overrides?: CallOverrides): Promise<[string]>; - - getInternalBalance( - user: string, - tokens: string[], - overrides?: CallOverrides, - ): Promise<[BigNumber[]] & { balances: BigNumber[] }>; - - getNextNonce(user: string, overrides?: CallOverrides): Promise<[BigNumber]>; - - getPausedState(overrides?: CallOverrides): Promise< - [boolean, BigNumber, BigNumber] & { - paused: boolean; - pauseWindowEndTime: BigNumber; - bufferPeriodEndTime: BigNumber; - } - >; - - getPool(poolId: BytesLike, overrides?: CallOverrides): Promise<[string, number]>; - - getPoolTokenInfo( - poolId: BytesLike, - token: string, - overrides?: CallOverrides, - ): Promise< - [BigNumber, BigNumber, BigNumber, string] & { - cash: BigNumber; - managed: BigNumber; - lastChangeBlock: BigNumber; - assetManager: string; - } - >; - - getPoolTokens( - poolId: BytesLike, - overrides?: CallOverrides, - ): Promise< - [string[], BigNumber[], BigNumber] & { - tokens: string[]; - balances: BigNumber[]; - lastChangeBlock: BigNumber; - } - >; - - getProtocolFeesCollector(overrides?: CallOverrides): Promise<[string]>; - - hasApprovedRelayer(user: string, relayer: string, overrides?: CallOverrides): Promise<[boolean]>; - - joinPool( - poolId: BytesLike, - sender: string, - recipient: string, - request: IVault.JoinPoolRequestStruct, - overrides?: PayableOverrides & { from?: string | Promise }, - ): Promise; - - managePoolBalance( - ops: IVault.PoolBalanceOpStruct[], - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - manageUserBalance( - ops: IVault.UserBalanceOpStruct[], - overrides?: PayableOverrides & { from?: string | Promise }, - ): Promise; - - queryBatchSwap( - kind: BigNumberish, - swaps: IVault.BatchSwapStepStruct[], - assets: string[], - funds: IVault.FundManagementStruct, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - registerPool( - specialization: BigNumberish, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - registerTokens( - poolId: BytesLike, - tokens: string[], - assetManagers: string[], - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - setAuthorizer( - newAuthorizer: string, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - setPaused( - paused: boolean, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - setRelayerApproval( - sender: string, - relayer: string, - approved: boolean, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - swap( - singleSwap: IVault.SingleSwapStruct, - funds: IVault.FundManagementStruct, - limit: BigNumberish, - deadline: BigNumberish, - overrides?: PayableOverrides & { from?: string | Promise }, - ): Promise; - }; - - WETH(overrides?: CallOverrides): Promise; - - batchSwap( - kind: BigNumberish, - swaps: IVault.BatchSwapStepStruct[], - assets: string[], - funds: IVault.FundManagementStruct, - limits: BigNumberish[], - deadline: BigNumberish, - overrides?: PayableOverrides & { from?: string | Promise }, - ): Promise; - - deregisterTokens( - poolId: BytesLike, - tokens: string[], - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - exitPool( - poolId: BytesLike, - sender: string, - recipient: string, - request: IVault.ExitPoolRequestStruct, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - flashLoan( - recipient: string, - tokens: string[], - amounts: BigNumberish[], - userData: BytesLike, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - getActionId(selector: BytesLike, overrides?: CallOverrides): Promise; - - getAuthorizer(overrides?: CallOverrides): Promise; - - getDomainSeparator(overrides?: CallOverrides): Promise; - - getInternalBalance(user: string, tokens: string[], overrides?: CallOverrides): Promise; - - getNextNonce(user: string, overrides?: CallOverrides): Promise; - - getPausedState(overrides?: CallOverrides): Promise< - [boolean, BigNumber, BigNumber] & { - paused: boolean; - pauseWindowEndTime: BigNumber; - bufferPeriodEndTime: BigNumber; - } - >; - - getPool(poolId: BytesLike, overrides?: CallOverrides): Promise<[string, number]>; - - getPoolTokenInfo( - poolId: BytesLike, - token: string, - overrides?: CallOverrides, - ): Promise< - [BigNumber, BigNumber, BigNumber, string] & { - cash: BigNumber; - managed: BigNumber; - lastChangeBlock: BigNumber; - assetManager: string; - } - >; - - getPoolTokens( - poolId: BytesLike, - overrides?: CallOverrides, - ): Promise< - [string[], BigNumber[], BigNumber] & { - tokens: string[]; - balances: BigNumber[]; - lastChangeBlock: BigNumber; - } - >; - - getProtocolFeesCollector(overrides?: CallOverrides): Promise; - - hasApprovedRelayer(user: string, relayer: string, overrides?: CallOverrides): Promise; - - joinPool( - poolId: BytesLike, - sender: string, - recipient: string, - request: IVault.JoinPoolRequestStruct, - overrides?: PayableOverrides & { from?: string | Promise }, - ): Promise; - - managePoolBalance( - ops: IVault.PoolBalanceOpStruct[], - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - manageUserBalance( - ops: IVault.UserBalanceOpStruct[], - overrides?: PayableOverrides & { from?: string | Promise }, - ): Promise; - - queryBatchSwap( - kind: BigNumberish, - swaps: IVault.BatchSwapStepStruct[], - assets: string[], - funds: IVault.FundManagementStruct, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - registerPool( - specialization: BigNumberish, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - registerTokens( - poolId: BytesLike, - tokens: string[], - assetManagers: string[], - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - setAuthorizer( - newAuthorizer: string, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - setPaused(paused: boolean, overrides?: Overrides & { from?: string | Promise }): Promise; - - setRelayerApproval( - sender: string, - relayer: string, - approved: boolean, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - swap( - singleSwap: IVault.SingleSwapStruct, - funds: IVault.FundManagementStruct, - limit: BigNumberish, - deadline: BigNumberish, - overrides?: PayableOverrides & { from?: string | Promise }, - ): Promise; - - callStatic: { - WETH(overrides?: CallOverrides): Promise; - - batchSwap( - kind: BigNumberish, - swaps: IVault.BatchSwapStepStruct[], - assets: string[], - funds: IVault.FundManagementStruct, - limits: BigNumberish[], - deadline: BigNumberish, - overrides?: CallOverrides, - ): Promise; - - deregisterTokens(poolId: BytesLike, tokens: string[], overrides?: CallOverrides): Promise; - - exitPool( - poolId: BytesLike, - sender: string, - recipient: string, - request: IVault.ExitPoolRequestStruct, - overrides?: CallOverrides, - ): Promise; - - flashLoan( - recipient: string, - tokens: string[], - amounts: BigNumberish[], - userData: BytesLike, - overrides?: CallOverrides, - ): Promise; - - getActionId(selector: BytesLike, overrides?: CallOverrides): Promise; - - getAuthorizer(overrides?: CallOverrides): Promise; - - getDomainSeparator(overrides?: CallOverrides): Promise; - - getInternalBalance(user: string, tokens: string[], overrides?: CallOverrides): Promise; - - getNextNonce(user: string, overrides?: CallOverrides): Promise; - - getPausedState(overrides?: CallOverrides): Promise< - [boolean, BigNumber, BigNumber] & { - paused: boolean; - pauseWindowEndTime: BigNumber; - bufferPeriodEndTime: BigNumber; - } - >; - - getPool(poolId: BytesLike, overrides?: CallOverrides): Promise<[string, number]>; - - getPoolTokenInfo( - poolId: BytesLike, - token: string, - overrides?: CallOverrides, - ): Promise< - [BigNumber, BigNumber, BigNumber, string] & { - cash: BigNumber; - managed: BigNumber; - lastChangeBlock: BigNumber; - assetManager: string; - } - >; - - getPoolTokens( - poolId: BytesLike, - overrides?: CallOverrides, - ): Promise< - [string[], BigNumber[], BigNumber] & { - tokens: string[]; - balances: BigNumber[]; - lastChangeBlock: BigNumber; - } - >; - - getProtocolFeesCollector(overrides?: CallOverrides): Promise; - - hasApprovedRelayer(user: string, relayer: string, overrides?: CallOverrides): Promise; - - joinPool( - poolId: BytesLike, - sender: string, - recipient: string, - request: IVault.JoinPoolRequestStruct, - overrides?: CallOverrides, - ): Promise; - - managePoolBalance(ops: IVault.PoolBalanceOpStruct[], overrides?: CallOverrides): Promise; - - manageUserBalance(ops: IVault.UserBalanceOpStruct[], overrides?: CallOverrides): Promise; - - queryBatchSwap( - kind: BigNumberish, - swaps: IVault.BatchSwapStepStruct[], - assets: string[], - funds: IVault.FundManagementStruct, - overrides?: CallOverrides, - ): Promise; - - registerPool(specialization: BigNumberish, overrides?: CallOverrides): Promise; - - registerTokens( - poolId: BytesLike, - tokens: string[], - assetManagers: string[], - overrides?: CallOverrides, - ): Promise; - - setAuthorizer(newAuthorizer: string, overrides?: CallOverrides): Promise; - - setPaused(paused: boolean, overrides?: CallOverrides): Promise; - - setRelayerApproval(sender: string, relayer: string, approved: boolean, overrides?: CallOverrides): Promise; - - swap( - singleSwap: IVault.SingleSwapStruct, - funds: IVault.FundManagementStruct, - limit: BigNumberish, - deadline: BigNumberish, - overrides?: CallOverrides, - ): Promise; - }; - - filters: { - 'AuthorizerChanged(address)'(newAuthorizer?: string | null): AuthorizerChangedEventFilter; - AuthorizerChanged(newAuthorizer?: string | null): AuthorizerChangedEventFilter; - - 'ExternalBalanceTransfer(address,address,address,uint256)'( - token?: string | null, - sender?: string | null, - recipient?: null, - amount?: null, - ): ExternalBalanceTransferEventFilter; - ExternalBalanceTransfer( - token?: string | null, - sender?: string | null, - recipient?: null, - amount?: null, - ): ExternalBalanceTransferEventFilter; - - 'FlashLoan(address,address,uint256,uint256)'( - recipient?: string | null, - token?: string | null, - amount?: null, - feeAmount?: null, - ): FlashLoanEventFilter; - FlashLoan(recipient?: string | null, token?: string | null, amount?: null, feeAmount?: null): FlashLoanEventFilter; - - 'InternalBalanceChanged(address,address,int256)'( - user?: string | null, - token?: string | null, - delta?: null, - ): InternalBalanceChangedEventFilter; - InternalBalanceChanged( - user?: string | null, - token?: string | null, - delta?: null, - ): InternalBalanceChangedEventFilter; - - 'PausedStateChanged(bool)'(paused?: null): PausedStateChangedEventFilter; - PausedStateChanged(paused?: null): PausedStateChangedEventFilter; - - 'PoolBalanceChanged(bytes32,address,address[],int256[],uint256[])'( - poolId?: BytesLike | null, - liquidityProvider?: string | null, - tokens?: null, - deltas?: null, - protocolFeeAmounts?: null, - ): PoolBalanceChangedEventFilter; - PoolBalanceChanged( - poolId?: BytesLike | null, - liquidityProvider?: string | null, - tokens?: null, - deltas?: null, - protocolFeeAmounts?: null, - ): PoolBalanceChangedEventFilter; - - 'PoolBalanceManaged(bytes32,address,address,int256,int256)'( - poolId?: BytesLike | null, - assetManager?: string | null, - token?: string | null, - cashDelta?: null, - managedDelta?: null, - ): PoolBalanceManagedEventFilter; - PoolBalanceManaged( - poolId?: BytesLike | null, - assetManager?: string | null, - token?: string | null, - cashDelta?: null, - managedDelta?: null, - ): PoolBalanceManagedEventFilter; - - 'PoolRegistered(bytes32,address,uint8)'( - poolId?: BytesLike | null, - poolAddress?: string | null, - specialization?: null, - ): PoolRegisteredEventFilter; - PoolRegistered( - poolId?: BytesLike | null, - poolAddress?: string | null, - specialization?: null, - ): PoolRegisteredEventFilter; - - 'RelayerApprovalChanged(address,address,bool)'( - relayer?: string | null, - sender?: string | null, - approved?: null, - ): RelayerApprovalChangedEventFilter; - RelayerApprovalChanged( - relayer?: string | null, - sender?: string | null, - approved?: null, - ): RelayerApprovalChangedEventFilter; - - 'Swap(bytes32,address,address,uint256,uint256)'( - poolId?: BytesLike | null, - tokenIn?: string | null, - tokenOut?: string | null, - amountIn?: null, - amountOut?: null, - ): SwapEventFilter; - Swap( - poolId?: BytesLike | null, - tokenIn?: string | null, - tokenOut?: string | null, - amountIn?: null, - amountOut?: null, - ): SwapEventFilter; - - 'TokensDeregistered(bytes32,address[])'(poolId?: BytesLike | null, tokens?: null): TokensDeregisteredEventFilter; - TokensDeregistered(poolId?: BytesLike | null, tokens?: null): TokensDeregisteredEventFilter; - - 'TokensRegistered(bytes32,address[],address[])'( - poolId?: BytesLike | null, - tokens?: null, - assetManagers?: null, - ): TokensRegisteredEventFilter; - TokensRegistered(poolId?: BytesLike | null, tokens?: null, assetManagers?: null): TokensRegisteredEventFilter; - }; - - estimateGas: { - WETH(overrides?: CallOverrides): Promise; - - batchSwap( - kind: BigNumberish, - swaps: IVault.BatchSwapStepStruct[], - assets: string[], - funds: IVault.FundManagementStruct, - limits: BigNumberish[], - deadline: BigNumberish, - overrides?: PayableOverrides & { from?: string | Promise }, - ): Promise; - - deregisterTokens( - poolId: BytesLike, - tokens: string[], - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - exitPool( - poolId: BytesLike, - sender: string, - recipient: string, - request: IVault.ExitPoolRequestStruct, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - flashLoan( - recipient: string, - tokens: string[], - amounts: BigNumberish[], - userData: BytesLike, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - getActionId(selector: BytesLike, overrides?: CallOverrides): Promise; - - getAuthorizer(overrides?: CallOverrides): Promise; - - getDomainSeparator(overrides?: CallOverrides): Promise; - - getInternalBalance(user: string, tokens: string[], overrides?: CallOverrides): Promise; - - getNextNonce(user: string, overrides?: CallOverrides): Promise; - - getPausedState(overrides?: CallOverrides): Promise; - - getPool(poolId: BytesLike, overrides?: CallOverrides): Promise; - - getPoolTokenInfo(poolId: BytesLike, token: string, overrides?: CallOverrides): Promise; - - getPoolTokens(poolId: BytesLike, overrides?: CallOverrides): Promise; - - getProtocolFeesCollector(overrides?: CallOverrides): Promise; - - hasApprovedRelayer(user: string, relayer: string, overrides?: CallOverrides): Promise; - - joinPool( - poolId: BytesLike, - sender: string, - recipient: string, - request: IVault.JoinPoolRequestStruct, - overrides?: PayableOverrides & { from?: string | Promise }, - ): Promise; - - managePoolBalance( - ops: IVault.PoolBalanceOpStruct[], - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - manageUserBalance( - ops: IVault.UserBalanceOpStruct[], - overrides?: PayableOverrides & { from?: string | Promise }, - ): Promise; - - queryBatchSwap( - kind: BigNumberish, - swaps: IVault.BatchSwapStepStruct[], - assets: string[], - funds: IVault.FundManagementStruct, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - registerPool( - specialization: BigNumberish, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - registerTokens( - poolId: BytesLike, - tokens: string[], - assetManagers: string[], - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - setAuthorizer( - newAuthorizer: string, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - setPaused(paused: boolean, overrides?: Overrides & { from?: string | Promise }): Promise; - - setRelayerApproval( - sender: string, - relayer: string, - approved: boolean, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - swap( - singleSwap: IVault.SingleSwapStruct, - funds: IVault.FundManagementStruct, - limit: BigNumberish, - deadline: BigNumberish, - overrides?: PayableOverrides & { from?: string | Promise }, - ): Promise; - }; - - populateTransaction: { - WETH(overrides?: CallOverrides): Promise; - - batchSwap( - kind: BigNumberish, - swaps: IVault.BatchSwapStepStruct[], - assets: string[], - funds: IVault.FundManagementStruct, - limits: BigNumberish[], - deadline: BigNumberish, - overrides?: PayableOverrides & { from?: string | Promise }, - ): Promise; - - deregisterTokens( - poolId: BytesLike, - tokens: string[], - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - exitPool( - poolId: BytesLike, - sender: string, - recipient: string, - request: IVault.ExitPoolRequestStruct, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - flashLoan( - recipient: string, - tokens: string[], - amounts: BigNumberish[], - userData: BytesLike, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - getActionId(selector: BytesLike, overrides?: CallOverrides): Promise; - - getAuthorizer(overrides?: CallOverrides): Promise; - - getDomainSeparator(overrides?: CallOverrides): Promise; - - getInternalBalance(user: string, tokens: string[], overrides?: CallOverrides): Promise; - - getNextNonce(user: string, overrides?: CallOverrides): Promise; - - getPausedState(overrides?: CallOverrides): Promise; - - getPool(poolId: BytesLike, overrides?: CallOverrides): Promise; - - getPoolTokenInfo(poolId: BytesLike, token: string, overrides?: CallOverrides): Promise; - - getPoolTokens(poolId: BytesLike, overrides?: CallOverrides): Promise; - - getProtocolFeesCollector(overrides?: CallOverrides): Promise; - - hasApprovedRelayer(user: string, relayer: string, overrides?: CallOverrides): Promise; - - joinPool( - poolId: BytesLike, - sender: string, - recipient: string, - request: IVault.JoinPoolRequestStruct, - overrides?: PayableOverrides & { from?: string | Promise }, - ): Promise; - - managePoolBalance( - ops: IVault.PoolBalanceOpStruct[], - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - manageUserBalance( - ops: IVault.UserBalanceOpStruct[], - overrides?: PayableOverrides & { from?: string | Promise }, - ): Promise; - - queryBatchSwap( - kind: BigNumberish, - swaps: IVault.BatchSwapStepStruct[], - assets: string[], - funds: IVault.FundManagementStruct, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - registerPool( - specialization: BigNumberish, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - registerTokens( - poolId: BytesLike, - tokens: string[], - assetManagers: string[], - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - setAuthorizer( - newAuthorizer: string, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - setPaused( - paused: boolean, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - setRelayerApproval( - sender: string, - relayer: string, - approved: boolean, - overrides?: Overrides & { from?: string | Promise }, - ): Promise; - - swap( - singleSwap: IVault.SingleSwapStruct, - funds: IVault.FundManagementStruct, - limit: BigNumberish, - deadline: BigNumberish, - overrides?: PayableOverrides & { from?: string | Promise }, - ): Promise; - }; -} diff --git a/src/apps/koyo/contracts/ethers/common.ts b/src/apps/koyo/contracts/ethers/common.ts deleted file mode 100644 index 6cfb10425..000000000 --- a/src/apps/koyo/contracts/ethers/common.ts +++ /dev/null @@ -1,30 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import type { Listener } from '@ethersproject/providers'; -import type { Event, EventFilter } from 'ethers'; - -export interface TypedEvent = any, TArgsObject = any> extends Event { - args: TArgsArray & TArgsObject; -} - -export interface TypedEventFilter<_TEvent extends TypedEvent> extends EventFilter {} - -export interface TypedListener { - (...listenerArg: [...__TypechainArgsArray, TEvent]): void; -} - -type __TypechainArgsArray = T extends TypedEvent ? U : never; - -export interface OnEvent { - (eventFilter: TypedEventFilter, listener: TypedListener): TRes; - (eventName: string, listener: Listener): TRes; -} - -export type MinEthersFactory = { - deploy(...a: ARGS[]): Promise; -}; - -export type GetContractTypeFromFactory = F extends MinEthersFactory ? C : never; - -export type GetARGsTypeFromFactory = F extends MinEthersFactory ? Parameters : never; diff --git a/src/apps/koyo/contracts/ethers/factories/KoyoPool__factory.ts b/src/apps/koyo/contracts/ethers/factories/KoyoPool__factory.ts deleted file mode 100644 index a7058dd01..000000000 --- a/src/apps/koyo/contracts/ethers/factories/KoyoPool__factory.ts +++ /dev/null @@ -1,919 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ - -import { Contract, Signer, utils } from 'ethers'; -import type { Provider } from '@ethersproject/providers'; -import type { KoyoPool, KoyoPoolInterface } from '../KoyoPool'; - -const _abi = [ - { - inputs: [ - { - internalType: 'contract IVault', - name: 'vault', - type: 'address', - }, - { - internalType: 'string', - name: 'name', - type: 'string', - }, - { - internalType: 'string', - name: 'symbol', - type: 'string', - }, - { - internalType: 'contract IERC20[]', - name: 'tokens', - type: 'address[]', - }, - { - internalType: 'uint256[]', - name: 'normalizedWeights', - type: 'uint256[]', - }, - { - internalType: 'uint256', - name: 'swapFeePercentage', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'pauseWindowDuration', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'bufferPeriodDuration', - type: 'uint256', - }, - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - ], - stateMutability: 'nonpayable', - type: 'constructor', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Approval', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'bool', - name: 'paused', - type: 'bool', - }, - ], - name: 'PausedStateChanged', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'uint256', - name: 'swapFeePercentage', - type: 'uint256', - }, - ], - name: 'SwapFeePercentageChanged', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'from', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'to', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Transfer', - type: 'event', - }, - { - inputs: [], - name: 'DOMAIN_SEPARATOR', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - ], - name: 'allowance', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'approve', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'account', - type: 'address', - }, - ], - name: 'balanceOf', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'decimals', - outputs: [ - { - internalType: 'uint8', - name: '', - type: 'uint8', - }, - ], - stateMutability: 'pure', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'decreaseApproval', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes4', - name: 'selector', - type: 'bytes4', - }, - ], - name: 'getActionId', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getAuthorizer', - outputs: [ - { - internalType: 'contract IAuthorizer', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getInvariant', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getLastInvariant', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getNormalizedWeights', - outputs: [ - { - internalType: 'uint256[]', - name: '', - type: 'uint256[]', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getOwner', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getPausedState', - outputs: [ - { - internalType: 'bool', - name: 'paused', - type: 'bool', - }, - { - internalType: 'uint256', - name: 'pauseWindowEndTime', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'bufferPeriodEndTime', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getPoolId', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getRate', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getSwapFeePercentage', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getVault', - outputs: [ - { - internalType: 'contract IVault', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'increaseApproval', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'name', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - ], - name: 'nonces', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - { - internalType: 'address', - name: 'sender', - type: 'address', - }, - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256[]', - name: 'balances', - type: 'uint256[]', - }, - { - internalType: 'uint256', - name: 'lastChangeBlock', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'protocolSwapFeePercentage', - type: 'uint256', - }, - { - internalType: 'bytes', - name: 'userData', - type: 'bytes', - }, - ], - name: 'onExitPool', - outputs: [ - { - internalType: 'uint256[]', - name: '', - type: 'uint256[]', - }, - { - internalType: 'uint256[]', - name: '', - type: 'uint256[]', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - { - internalType: 'address', - name: 'sender', - type: 'address', - }, - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256[]', - name: 'balances', - type: 'uint256[]', - }, - { - internalType: 'uint256', - name: 'lastChangeBlock', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'protocolSwapFeePercentage', - type: 'uint256', - }, - { - internalType: 'bytes', - name: 'userData', - type: 'bytes', - }, - ], - name: 'onJoinPool', - outputs: [ - { - internalType: 'uint256[]', - name: '', - type: 'uint256[]', - }, - { - internalType: 'uint256[]', - name: '', - type: 'uint256[]', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - components: [ - { - internalType: 'enum IVault.SwapKind', - name: 'kind', - type: 'uint8', - }, - { - internalType: 'contract IERC20', - name: 'tokenIn', - type: 'address', - }, - { - internalType: 'contract IERC20', - name: 'tokenOut', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - { - internalType: 'uint256', - name: 'lastChangeBlock', - type: 'uint256', - }, - { - internalType: 'address', - name: 'from', - type: 'address', - }, - { - internalType: 'address', - name: 'to', - type: 'address', - }, - { - internalType: 'bytes', - name: 'userData', - type: 'bytes', - }, - ], - internalType: 'struct IPoolSwapStructs.SwapRequest', - name: 'request', - type: 'tuple', - }, - { - internalType: 'uint256', - name: 'balanceTokenIn', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'balanceTokenOut', - type: 'uint256', - }, - ], - name: 'onSwap', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'deadline', - type: 'uint256', - }, - { - internalType: 'uint8', - name: 'v', - type: 'uint8', - }, - { - internalType: 'bytes32', - name: 'r', - type: 'bytes32', - }, - { - internalType: 'bytes32', - name: 's', - type: 'bytes32', - }, - ], - name: 'permit', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - { - internalType: 'address', - name: 'sender', - type: 'address', - }, - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256[]', - name: 'balances', - type: 'uint256[]', - }, - { - internalType: 'uint256', - name: 'lastChangeBlock', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'protocolSwapFeePercentage', - type: 'uint256', - }, - { - internalType: 'bytes', - name: 'userData', - type: 'bytes', - }, - ], - name: 'queryExit', - outputs: [ - { - internalType: 'uint256', - name: 'bptIn', - type: 'uint256', - }, - { - internalType: 'uint256[]', - name: 'amountsOut', - type: 'uint256[]', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - { - internalType: 'address', - name: 'sender', - type: 'address', - }, - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256[]', - name: 'balances', - type: 'uint256[]', - }, - { - internalType: 'uint256', - name: 'lastChangeBlock', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'protocolSwapFeePercentage', - type: 'uint256', - }, - { - internalType: 'bytes', - name: 'userData', - type: 'bytes', - }, - ], - name: 'queryJoin', - outputs: [ - { - internalType: 'uint256', - name: 'bptOut', - type: 'uint256', - }, - { - internalType: 'uint256[]', - name: 'amountsIn', - type: 'uint256[]', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bool', - name: 'paused', - type: 'bool', - }, - ], - name: 'setPaused', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'swapFeePercentage', - type: 'uint256', - }, - ], - name: 'setSwapFeePercentage', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'symbol', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalSupply', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transfer', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'sender', - type: 'address', - }, - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transferFrom', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, -]; - -export class KoyoPool__factory { - static readonly abi = _abi; - static createInterface(): KoyoPoolInterface { - return new utils.Interface(_abi) as KoyoPoolInterface; - } - static connect(address: string, signerOrProvider: Signer | Provider): KoyoPool { - return new Contract(address, _abi, signerOrProvider) as KoyoPool; - } -} diff --git a/src/apps/koyo/contracts/ethers/factories/KoyoVault__factory.ts b/src/apps/koyo/contracts/ethers/factories/KoyoVault__factory.ts deleted file mode 100644 index 4960aa80e..000000000 --- a/src/apps/koyo/contracts/ethers/factories/KoyoVault__factory.ts +++ /dev/null @@ -1,1197 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ - -import { Contract, Signer, utils } from 'ethers'; -import type { Provider } from '@ethersproject/providers'; -import type { KoyoVault, KoyoVaultInterface } from '../KoyoVault'; - -const _abi = [ - { - inputs: [ - { - internalType: 'contract IAuthorizer', - name: 'authorizer', - type: 'address', - }, - { - internalType: 'contract IWETH', - name: 'weth', - type: 'address', - }, - { - internalType: 'uint256', - name: 'pauseWindowDuration', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'bufferPeriodDuration', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'constructor', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'contract IAuthorizer', - name: 'newAuthorizer', - type: 'address', - }, - ], - name: 'AuthorizerChanged', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'contract IERC20', - name: 'token', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'sender', - type: 'address', - }, - { - indexed: false, - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'ExternalBalanceTransfer', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'contract IFlashLoanRecipient', - name: 'recipient', - type: 'address', - }, - { - indexed: true, - internalType: 'contract IERC20', - name: 'token', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'feeAmount', - type: 'uint256', - }, - ], - name: 'FlashLoan', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'user', - type: 'address', - }, - { - indexed: true, - internalType: 'contract IERC20', - name: 'token', - type: 'address', - }, - { - indexed: false, - internalType: 'int256', - name: 'delta', - type: 'int256', - }, - ], - name: 'InternalBalanceChanged', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'bool', - name: 'paused', - type: 'bool', - }, - ], - name: 'PausedStateChanged', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - { - indexed: true, - internalType: 'address', - name: 'liquidityProvider', - type: 'address', - }, - { - indexed: false, - internalType: 'contract IERC20[]', - name: 'tokens', - type: 'address[]', - }, - { - indexed: false, - internalType: 'int256[]', - name: 'deltas', - type: 'int256[]', - }, - { - indexed: false, - internalType: 'uint256[]', - name: 'protocolFeeAmounts', - type: 'uint256[]', - }, - ], - name: 'PoolBalanceChanged', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - { - indexed: true, - internalType: 'address', - name: 'assetManager', - type: 'address', - }, - { - indexed: true, - internalType: 'contract IERC20', - name: 'token', - type: 'address', - }, - { - indexed: false, - internalType: 'int256', - name: 'cashDelta', - type: 'int256', - }, - { - indexed: false, - internalType: 'int256', - name: 'managedDelta', - type: 'int256', - }, - ], - name: 'PoolBalanceManaged', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - { - indexed: true, - internalType: 'address', - name: 'poolAddress', - type: 'address', - }, - { - indexed: false, - internalType: 'enum IVault.PoolSpecialization', - name: 'specialization', - type: 'uint8', - }, - ], - name: 'PoolRegistered', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'relayer', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'sender', - type: 'address', - }, - { - indexed: false, - internalType: 'bool', - name: 'approved', - type: 'bool', - }, - ], - name: 'RelayerApprovalChanged', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - { - indexed: true, - internalType: 'contract IERC20', - name: 'tokenIn', - type: 'address', - }, - { - indexed: true, - internalType: 'contract IERC20', - name: 'tokenOut', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amountIn', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amountOut', - type: 'uint256', - }, - ], - name: 'Swap', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - { - indexed: false, - internalType: 'contract IERC20[]', - name: 'tokens', - type: 'address[]', - }, - ], - name: 'TokensDeregistered', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - { - indexed: false, - internalType: 'contract IERC20[]', - name: 'tokens', - type: 'address[]', - }, - { - indexed: false, - internalType: 'address[]', - name: 'assetManagers', - type: 'address[]', - }, - ], - name: 'TokensRegistered', - type: 'event', - }, - { - inputs: [], - name: 'WETH', - outputs: [ - { - internalType: 'contract IWETH', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'enum IVault.SwapKind', - name: 'kind', - type: 'uint8', - }, - { - components: [ - { - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - { - internalType: 'uint256', - name: 'assetInIndex', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'assetOutIndex', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - internalType: 'bytes', - name: 'userData', - type: 'bytes', - }, - ], - internalType: 'struct IVault.BatchSwapStep[]', - name: 'swaps', - type: 'tuple[]', - }, - { - internalType: 'contract IAsset[]', - name: 'assets', - type: 'address[]', - }, - { - components: [ - { - internalType: 'address', - name: 'sender', - type: 'address', - }, - { - internalType: 'bool', - name: 'fromInternalBalance', - type: 'bool', - }, - { - internalType: 'address payable', - name: 'recipient', - type: 'address', - }, - { - internalType: 'bool', - name: 'toInternalBalance', - type: 'bool', - }, - ], - internalType: 'struct IVault.FundManagement', - name: 'funds', - type: 'tuple', - }, - { - internalType: 'int256[]', - name: 'limits', - type: 'int256[]', - }, - { - internalType: 'uint256', - name: 'deadline', - type: 'uint256', - }, - ], - name: 'batchSwap', - outputs: [ - { - internalType: 'int256[]', - name: 'assetDeltas', - type: 'int256[]', - }, - ], - stateMutability: 'payable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - { - internalType: 'contract IERC20[]', - name: 'tokens', - type: 'address[]', - }, - ], - name: 'deregisterTokens', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - { - internalType: 'address', - name: 'sender', - type: 'address', - }, - { - internalType: 'address payable', - name: 'recipient', - type: 'address', - }, - { - components: [ - { - internalType: 'contract IAsset[]', - name: 'assets', - type: 'address[]', - }, - { - internalType: 'uint256[]', - name: 'minAmountsOut', - type: 'uint256[]', - }, - { - internalType: 'bytes', - name: 'userData', - type: 'bytes', - }, - { - internalType: 'bool', - name: 'toInternalBalance', - type: 'bool', - }, - ], - internalType: 'struct IVault.ExitPoolRequest', - name: 'request', - type: 'tuple', - }, - ], - name: 'exitPool', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'contract IFlashLoanRecipient', - name: 'recipient', - type: 'address', - }, - { - internalType: 'contract IERC20[]', - name: 'tokens', - type: 'address[]', - }, - { - internalType: 'uint256[]', - name: 'amounts', - type: 'uint256[]', - }, - { - internalType: 'bytes', - name: 'userData', - type: 'bytes', - }, - ], - name: 'flashLoan', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes4', - name: 'selector', - type: 'bytes4', - }, - ], - name: 'getActionId', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getAuthorizer', - outputs: [ - { - internalType: 'contract IAuthorizer', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getDomainSeparator', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'user', - type: 'address', - }, - { - internalType: 'contract IERC20[]', - name: 'tokens', - type: 'address[]', - }, - ], - name: 'getInternalBalance', - outputs: [ - { - internalType: 'uint256[]', - name: 'balances', - type: 'uint256[]', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'user', - type: 'address', - }, - ], - name: 'getNextNonce', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getPausedState', - outputs: [ - { - internalType: 'bool', - name: 'paused', - type: 'bool', - }, - { - internalType: 'uint256', - name: 'pauseWindowEndTime', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'bufferPeriodEndTime', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - ], - name: 'getPool', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - { - internalType: 'enum IVault.PoolSpecialization', - name: '', - type: 'uint8', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - { - internalType: 'contract IERC20', - name: 'token', - type: 'address', - }, - ], - name: 'getPoolTokenInfo', - outputs: [ - { - internalType: 'uint256', - name: 'cash', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'managed', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'lastChangeBlock', - type: 'uint256', - }, - { - internalType: 'address', - name: 'assetManager', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - ], - name: 'getPoolTokens', - outputs: [ - { - internalType: 'contract IERC20[]', - name: 'tokens', - type: 'address[]', - }, - { - internalType: 'uint256[]', - name: 'balances', - type: 'uint256[]', - }, - { - internalType: 'uint256', - name: 'lastChangeBlock', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getProtocolFeesCollector', - outputs: [ - { - internalType: 'contract ProtocolFeesCollector', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'user', - type: 'address', - }, - { - internalType: 'address', - name: 'relayer', - type: 'address', - }, - ], - name: 'hasApprovedRelayer', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - { - internalType: 'address', - name: 'sender', - type: 'address', - }, - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - components: [ - { - internalType: 'contract IAsset[]', - name: 'assets', - type: 'address[]', - }, - { - internalType: 'uint256[]', - name: 'maxAmountsIn', - type: 'uint256[]', - }, - { - internalType: 'bytes', - name: 'userData', - type: 'bytes', - }, - { - internalType: 'bool', - name: 'fromInternalBalance', - type: 'bool', - }, - ], - internalType: 'struct IVault.JoinPoolRequest', - name: 'request', - type: 'tuple', - }, - ], - name: 'joinPool', - outputs: [], - stateMutability: 'payable', - type: 'function', - }, - { - inputs: [ - { - components: [ - { - internalType: 'enum IVault.PoolBalanceOpKind', - name: 'kind', - type: 'uint8', - }, - { - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - { - internalType: 'contract IERC20', - name: 'token', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - internalType: 'struct IVault.PoolBalanceOp[]', - name: 'ops', - type: 'tuple[]', - }, - ], - name: 'managePoolBalance', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - components: [ - { - internalType: 'enum IVault.UserBalanceOpKind', - name: 'kind', - type: 'uint8', - }, - { - internalType: 'contract IAsset', - name: 'asset', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - internalType: 'address', - name: 'sender', - type: 'address', - }, - { - internalType: 'address payable', - name: 'recipient', - type: 'address', - }, - ], - internalType: 'struct IVault.UserBalanceOp[]', - name: 'ops', - type: 'tuple[]', - }, - ], - name: 'manageUserBalance', - outputs: [], - stateMutability: 'payable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'enum IVault.SwapKind', - name: 'kind', - type: 'uint8', - }, - { - components: [ - { - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - { - internalType: 'uint256', - name: 'assetInIndex', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'assetOutIndex', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - internalType: 'bytes', - name: 'userData', - type: 'bytes', - }, - ], - internalType: 'struct IVault.BatchSwapStep[]', - name: 'swaps', - type: 'tuple[]', - }, - { - internalType: 'contract IAsset[]', - name: 'assets', - type: 'address[]', - }, - { - components: [ - { - internalType: 'address', - name: 'sender', - type: 'address', - }, - { - internalType: 'bool', - name: 'fromInternalBalance', - type: 'bool', - }, - { - internalType: 'address payable', - name: 'recipient', - type: 'address', - }, - { - internalType: 'bool', - name: 'toInternalBalance', - type: 'bool', - }, - ], - internalType: 'struct IVault.FundManagement', - name: 'funds', - type: 'tuple', - }, - ], - name: 'queryBatchSwap', - outputs: [ - { - internalType: 'int256[]', - name: '', - type: 'int256[]', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'enum IVault.PoolSpecialization', - name: 'specialization', - type: 'uint8', - }, - ], - name: 'registerPool', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - { - internalType: 'contract IERC20[]', - name: 'tokens', - type: 'address[]', - }, - { - internalType: 'address[]', - name: 'assetManagers', - type: 'address[]', - }, - ], - name: 'registerTokens', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'contract IAuthorizer', - name: 'newAuthorizer', - type: 'address', - }, - ], - name: 'setAuthorizer', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bool', - name: 'paused', - type: 'bool', - }, - ], - name: 'setPaused', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'sender', - type: 'address', - }, - { - internalType: 'address', - name: 'relayer', - type: 'address', - }, - { - internalType: 'bool', - name: 'approved', - type: 'bool', - }, - ], - name: 'setRelayerApproval', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - components: [ - { - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - { - internalType: 'enum IVault.SwapKind', - name: 'kind', - type: 'uint8', - }, - { - internalType: 'contract IAsset', - name: 'assetIn', - type: 'address', - }, - { - internalType: 'contract IAsset', - name: 'assetOut', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - internalType: 'bytes', - name: 'userData', - type: 'bytes', - }, - ], - internalType: 'struct IVault.SingleSwap', - name: 'singleSwap', - type: 'tuple', - }, - { - components: [ - { - internalType: 'address', - name: 'sender', - type: 'address', - }, - { - internalType: 'bool', - name: 'fromInternalBalance', - type: 'bool', - }, - { - internalType: 'address payable', - name: 'recipient', - type: 'address', - }, - { - internalType: 'bool', - name: 'toInternalBalance', - type: 'bool', - }, - ], - internalType: 'struct IVault.FundManagement', - name: 'funds', - type: 'tuple', - }, - { - internalType: 'uint256', - name: 'limit', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'deadline', - type: 'uint256', - }, - ], - name: 'swap', - outputs: [ - { - internalType: 'uint256', - name: 'amountCalculated', - type: 'uint256', - }, - ], - stateMutability: 'payable', - type: 'function', - }, - { - stateMutability: 'payable', - type: 'receive', - }, -]; - -export class KoyoVault__factory { - static readonly abi = _abi; - static createInterface(): KoyoVaultInterface { - return new utils.Interface(_abi) as KoyoVaultInterface; - } - static connect(address: string, signerOrProvider: Signer | Provider): KoyoVault { - return new Contract(address, _abi, signerOrProvider) as KoyoVault; - } -} diff --git a/src/apps/koyo/contracts/ethers/factories/index.ts b/src/apps/koyo/contracts/ethers/factories/index.ts deleted file mode 100644 index fc949f10a..000000000 --- a/src/apps/koyo/contracts/ethers/factories/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -export { KoyoPool__factory } from './KoyoPool__factory'; -export { KoyoVault__factory } from './KoyoVault__factory'; diff --git a/src/apps/koyo/contracts/ethers/index.ts b/src/apps/koyo/contracts/ethers/index.ts deleted file mode 100644 index aa61c1f9d..000000000 --- a/src/apps/koyo/contracts/ethers/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -export type { KoyoPool } from './KoyoPool'; -export type { KoyoVault } from './KoyoVault'; -export * as factories from './factories'; -export { KoyoPool__factory } from './factories/KoyoPool__factory'; -export { KoyoVault__factory } from './factories/KoyoVault__factory'; diff --git a/src/apps/koyo/contracts/index.ts b/src/apps/koyo/contracts/index.ts deleted file mode 100644 index 2c9f6dd1d..000000000 --- a/src/apps/koyo/contracts/index.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Injectable, Inject } from '@nestjs/common'; - -import { IAppToolkit, APP_TOOLKIT } from '~app-toolkit/app-toolkit.interface'; -import { ContractFactory } from '~contract/contracts'; -import { Network } from '~types/network.interface'; - -import { KoyoPool__factory } from './ethers'; -import { KoyoVault__factory } from './ethers'; - -// eslint-disable-next-line -type ContractOpts = { address: string; network: Network }; - -@Injectable() -export class KoyoContractFactory extends ContractFactory { - constructor(@Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit) { - super((network: Network) => appToolkit.getNetworkProvider(network)); - } - - koyoPool({ address, network }: ContractOpts) { - return KoyoPool__factory.connect(address, this.appToolkit.getNetworkProvider(network)); - } - koyoVault({ address, network }: ContractOpts) { - return KoyoVault__factory.connect(address, this.appToolkit.getNetworkProvider(network)); - } -} - -export type { KoyoPool } from './ethers'; -export type { KoyoVault } from './ethers'; diff --git a/src/apps/koyo/koyo.module.ts b/src/apps/koyo/koyo.module.ts index 3b56bf4b0..e7972ffef 100644 --- a/src/apps/koyo/koyo.module.ts +++ b/src/apps/koyo/koyo.module.ts @@ -1,24 +1,26 @@ import { Register } from '~app-toolkit/decorators'; import { AbstractApp } from '~app/app.dynamic-module'; -import { BalancerV2AppModule } from '~apps/balancer-v2'; +import { BalancerV2ContractFactory } from '~apps/balancer-v2/contracts/index'; +import { BalancerV2PoolTokensHelper } from '~apps/balancer-v2/helpers/balancer-v2.pool.token-helper'; +import { BalancerV2TheGraphPoolTokenDataStrategy } from '~apps/balancer-v2/helpers/balancer-v2.the-graph.pool-token-address-strategy'; import { AuroraKoyoBalanceFetcher } from './aurora/koyo.balance-fetcher'; import { AuroraKoyoPoolTokenFetcher } from './aurora/koyo.pool.token-fetcher'; -import { KoyoContractFactory } from './contracts'; import { KoyoAppDefinition, KOYO_DEFINITION } from './koyo.definition'; import { MoonriverKoyoBalanceFetcher } from './moonriver/koyo.balance-fetcher'; import { MoonriverKoyoPoolTokenFetcher } from './moonriver/koyo.pool.token-fetcher'; @Register.AppModule({ appId: KOYO_DEFINITION.id, - imports: [BalancerV2AppModule], providers: [ + BalancerV2ContractFactory, + BalancerV2TheGraphPoolTokenDataStrategy, + BalancerV2PoolTokensHelper, AuroraKoyoPoolTokenFetcher, AuroraKoyoBalanceFetcher, MoonriverKoyoPoolTokenFetcher, MoonriverKoyoBalanceFetcher, KoyoAppDefinition, - KoyoContractFactory, ], }) export class KoyoAppModule extends AbstractApp() {}