From efa10034011e1386ee18659f233d4f05901ead1a Mon Sep 17 00:00:00 2001 From: 0xButterfield <100517047+0xButterfield@users.noreply.github.com> Date: Wed, 20 Jul 2022 14:48:32 +0200 Subject: [PATCH] feat(aura): Add Aura Finance (#892) --- src/apps/aura/assets/logo.png | Bin 0 -> 119024 bytes src/apps/aura/aura.definition.ts | 65 + src/apps/aura/aura.module.ts | 37 + src/apps/aura/aura.types.ts | 25 + src/apps/aura/contracts/abis/aura-locker.json | 1337 +++++++++++++++ .../aura/contracts/abis/aura-masterchef.json | 544 ++++++ src/apps/aura/contracts/abis/aura-token.json | 470 ++++++ .../aura-virtual-balance-reward-pool.json | 452 +++++ .../aura/contracts/abis/balancer-helpers.json | 148 ++ .../aura/contracts/abis/base-reward-pool.json | 679 ++++++++ src/apps/aura/contracts/ethers/AuraLocker.ts | 1466 +++++++++++++++++ .../aura/contracts/ethers/AuraMasterchef.ts | 652 ++++++++ src/apps/aura/contracts/ethers/AuraToken.ts | 560 +++++++ .../ethers/AuraVirtualBalanceRewardPool.ts | 532 ++++++ .../aura/contracts/ethers/BalancerHelpers.ts | 197 +++ .../aura/contracts/ethers/BaseRewardPool.ts | 759 +++++++++ src/apps/aura/contracts/ethers/common.ts | 30 + .../ethers/factories/AuraLocker__factory.ts | 1355 +++++++++++++++ .../factories/AuraMasterchef__factory.ts | 562 +++++++ .../ethers/factories/AuraToken__factory.ts | 488 ++++++ .../AuraVirtualBalanceRewardPool__factory.ts | 473 ++++++ .../factories/BalancerHelpers__factory.ts | 166 ++ .../factories/BaseRewardPool__factory.ts | 738 +++++++++ .../aura/contracts/ethers/factories/index.ts | 9 + src/apps/aura/contracts/ethers/index.ts | 16 + src/apps/aura/contracts/index.ts | 48 + .../aura/ethereum/aura.balance-fetcher.ts | 211 +++ .../aura.chef.contract-position-fetcher.ts | 60 + .../aura/ethereum/aura.chef.token-fetcher.ts | 173 ++ .../aura.locker.contract-position-fetcher.ts | 142 ++ .../aura.pools.contract-position-fetcher.ts | 64 + .../aura/ethereum/aura.pools.token-fetcher.ts | 122 ++ .../aura.staking.contract-position-fetcher.ts | 38 + .../helpers/aura.balancer-pools-helper.ts | 148 ++ .../helpers/aura.base-reward-pool-helper.ts | 209 +++ src/apps/aura/index.ts | 3 + 36 files changed, 12978 insertions(+) create mode 100644 src/apps/aura/assets/logo.png create mode 100644 src/apps/aura/aura.definition.ts create mode 100644 src/apps/aura/aura.module.ts create mode 100644 src/apps/aura/aura.types.ts create mode 100644 src/apps/aura/contracts/abis/aura-locker.json create mode 100644 src/apps/aura/contracts/abis/aura-masterchef.json create mode 100644 src/apps/aura/contracts/abis/aura-token.json create mode 100644 src/apps/aura/contracts/abis/aura-virtual-balance-reward-pool.json create mode 100644 src/apps/aura/contracts/abis/balancer-helpers.json create mode 100644 src/apps/aura/contracts/abis/base-reward-pool.json create mode 100644 src/apps/aura/contracts/ethers/AuraLocker.ts create mode 100644 src/apps/aura/contracts/ethers/AuraMasterchef.ts create mode 100644 src/apps/aura/contracts/ethers/AuraToken.ts create mode 100644 src/apps/aura/contracts/ethers/AuraVirtualBalanceRewardPool.ts create mode 100644 src/apps/aura/contracts/ethers/BalancerHelpers.ts create mode 100644 src/apps/aura/contracts/ethers/BaseRewardPool.ts create mode 100644 src/apps/aura/contracts/ethers/common.ts create mode 100644 src/apps/aura/contracts/ethers/factories/AuraLocker__factory.ts create mode 100644 src/apps/aura/contracts/ethers/factories/AuraMasterchef__factory.ts create mode 100644 src/apps/aura/contracts/ethers/factories/AuraToken__factory.ts create mode 100644 src/apps/aura/contracts/ethers/factories/AuraVirtualBalanceRewardPool__factory.ts create mode 100644 src/apps/aura/contracts/ethers/factories/BalancerHelpers__factory.ts create mode 100644 src/apps/aura/contracts/ethers/factories/BaseRewardPool__factory.ts create mode 100644 src/apps/aura/contracts/ethers/factories/index.ts create mode 100644 src/apps/aura/contracts/ethers/index.ts create mode 100644 src/apps/aura/contracts/index.ts create mode 100644 src/apps/aura/ethereum/aura.balance-fetcher.ts create mode 100644 src/apps/aura/ethereum/aura.chef.contract-position-fetcher.ts create mode 100644 src/apps/aura/ethereum/aura.chef.token-fetcher.ts create mode 100644 src/apps/aura/ethereum/aura.locker.contract-position-fetcher.ts create mode 100644 src/apps/aura/ethereum/aura.pools.contract-position-fetcher.ts create mode 100644 src/apps/aura/ethereum/aura.pools.token-fetcher.ts create mode 100644 src/apps/aura/ethereum/aura.staking.contract-position-fetcher.ts create mode 100644 src/apps/aura/helpers/aura.balancer-pools-helper.ts create mode 100644 src/apps/aura/helpers/aura.base-reward-pool-helper.ts create mode 100644 src/apps/aura/index.ts diff --git a/src/apps/aura/assets/logo.png b/src/apps/aura/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f76ad8bf1c49ac9b6aed57f43012162ddea7d240 GIT binary patch literal 119024 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�`PT_*i|)^0C={ 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�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 JPDHLkV1fdd(;)x= literal 0 HcmV?d00001 diff --git a/src/apps/aura/aura.definition.ts b/src/apps/aura/aura.definition.ts new file mode 100644 index 000000000..40a3d975a --- /dev/null +++ b/src/apps/aura/aura.definition.ts @@ -0,0 +1,65 @@ +import { Register } from '~app-toolkit/decorators'; +import { appDefinition, AppDefinition } from '~app/app.definition'; +import { AppAction, AppTag, GroupType } from '~app/app.interface'; +import { Network } from '~types/network.interface'; + +export const AURA_DEFINITION = appDefinition({ + id: 'aura', + name: 'Aura Finance', + description: + 'Aura Finance is a governance and liquidity aggregation protocol built on top of Balancer, with platform-agnostic support for any ve-token system.', + url: 'https://app.aura.finance', + + groups: { + chef: { + id: 'chef', + type: GroupType.TOKEN, + label: 'auraBAL Rewards', + }, + staking: { + id: 'staking', + type: GroupType.TOKEN, + label: 'Staked auraBAL', + }, + pools: { + id: 'pools', + type: GroupType.TOKEN, + label: 'Balancer Pools', + }, + locker: { + id: 'locker', + type: GroupType.POSITION, + label: 'Locked AURA', + }, + }, + + tags: [AppTag.LIQUIDITY_POOL], + keywords: [], + + links: { + twitter: 'https://twitter.com/AuraFinance', + discord: 'https://discord.gg/aurafinance', + medium: 'https://mirror.xyz/0xfEE0Bbe31345a7c27368534fEf45a57133FF3A86', + github: 'https://github.com/aurafinance', + }, + + supportedNetworks: { + [Network.ETHEREUM_MAINNET]: [AppAction.VIEW], + }, + + primaryColor: '#7c3aed', + + token: { + address: '0xc0c293ce456ff0ed870add98a0828dd4d2903dbf', + network: Network.ETHEREUM_MAINNET, + }, +}); + +@Register.AppDefinition(AURA_DEFINITION.id) +export class AuraAppDefinition extends AppDefinition { + constructor() { + super(AURA_DEFINITION); + } +} + +export default AURA_DEFINITION; diff --git a/src/apps/aura/aura.module.ts b/src/apps/aura/aura.module.ts new file mode 100644 index 000000000..a4e395b30 --- /dev/null +++ b/src/apps/aura/aura.module.ts @@ -0,0 +1,37 @@ +import { Register } from '~app-toolkit/decorators'; +import { AbstractApp } from '~app/app.dynamic-module'; +import { BalancerV2AppModule } from '~apps/balancer-v2'; +import { SynthetixAppModule } from '~apps/synthetix'; + +import { AuraAppDefinition, AURA_DEFINITION } from './aura.definition'; +import { AuraContractFactory } from './contracts'; +import { EthereumAuraBalanceFetcher } from './ethereum/aura.balance-fetcher'; +import { EthereumAuraChefContractPositionFetcher } from './ethereum/aura.chef.contract-position-fetcher'; +import { EthereumAuraChefTokenFetcher } from './ethereum/aura.chef.token-fetcher'; +import { EthereumAuraLockerContractPositionFetcher } from './ethereum/aura.locker.contract-position-fetcher'; +import { EthereumAuraPoolsContractPositionFetcher } from './ethereum/aura.pools.contract-position-fetcher'; +import { EthereumAuraPoolsTokenFetcher } from './ethereum/aura.pools.token-fetcher'; +import { EthereumAuraStakingContractPositionFetcher } from './ethereum/aura.staking.contract-position-fetcher'; +import { AuraBalancerPoolsHelper } from './helpers/aura.balancer-pools-helper'; +import { AuraBaseRewardPoolHelper } from './helpers/aura.base-reward-pool-helper'; + +@Register.AppModule({ + appId: AURA_DEFINITION.id, + imports: [SynthetixAppModule, BalancerV2AppModule], + providers: [ + AuraAppDefinition, + AuraContractFactory, + // Ethereum + EthereumAuraBalanceFetcher, + EthereumAuraChefTokenFetcher, + EthereumAuraPoolsTokenFetcher, + EthereumAuraChefContractPositionFetcher, + EthereumAuraPoolsContractPositionFetcher, + EthereumAuraLockerContractPositionFetcher, + EthereumAuraStakingContractPositionFetcher, + // Helpers + AuraBalancerPoolsHelper, + AuraBaseRewardPoolHelper, + ], +}) +export class AuraAppModule extends AbstractApp() {} diff --git a/src/apps/aura/aura.types.ts b/src/apps/aura/aura.types.ts new file mode 100644 index 000000000..c736704ae --- /dev/null +++ b/src/apps/aura/aura.types.ts @@ -0,0 +1,25 @@ +export type AuraBaseRewardPoolDataProps = { + extraRewards: { address: string; rewardToken: string }[]; + rewardToken: string; +}; + +export type BalancerPool = { + id: string; + address: string; + name: string; + poolType: string; + swapFee: number; + symbol: string; + tokensList: string; + totalLiquidity: number; + totalSwapVolume: number; + totalSwapFee: number; + totalShares: number; + tokens: { + address: string; + symbol: string; + decimals: number; + balance: number; + weight: number; + }[]; +}; diff --git a/src/apps/aura/contracts/abis/aura-locker.json b/src/apps/aura/contracts/abis/aura-locker.json new file mode 100644 index 000000000..aa0545710 --- /dev/null +++ b/src/apps/aura/contracts/abis/aura-locker.json @@ -0,0 +1,1337 @@ +[ + { + "inputs": [ + { + "internalType": "string", + "name": "_nameArg", + "type": "string" + }, + { + "internalType": "string", + "name": "_symbolArg", + "type": "string" + }, + { + "internalType": "address", + "name": "_stakingToken", + "type": "address" + }, + { + "internalType": "address", + "name": "_cvxCrv", + "type": "address" + }, + { + "internalType": "address", + "name": "_cvxCrvStaking", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "blacklisted", + "type": "bool" + } + ], + "name": "BlacklistModified", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "delegator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fromDelegate", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "toDelegate", + "type": "address" + } + ], + "name": "DelegateChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "delegate", + "type": "address" + } + ], + "name": "DelegateCheckpointed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "rate", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "delay", + "type": "uint256" + } + ], + "name": "KickIncentiveSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_kicked", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_reward", + "type": "uint256" + } + ], + "name": "KickReward", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "_token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_reward", + "type": "uint256" + } + ], + "name": "RewardAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_rewardsToken", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_reward", + "type": "uint256" + } + ], + "name": "RewardPaid", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "Shutdown", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_paidAmount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_lockedAmount", + "type": "uint256" + } + ], + "name": "Staked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bool", + "name": "_relocked", + "type": "bool" + } + ], + "name": "Withdrawn", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_rewardsToken", + "type": "address" + }, + { + "internalType": "address", + "name": "_distributor", + "type": "address" + } + ], + "name": "addReward", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_rewardsToken", + "type": "address" + }, + { + "internalType": "address", + "name": "_distributor", + "type": "address" + }, + { + "internalType": "bool", + "name": "_approved", + "type": "bool" + } + ], + "name": "approveRewardDistributor", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_epoch", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "balanceAtEpochOf", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "balances", + "outputs": [ + { + "internalType": "uint112", + "name": "locked", + "type": "uint112" + }, + { + "internalType": "uint32", + "name": "nextUnlockIndex", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "blacklist", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "checkpointEpoch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint32", + "name": "pos", + "type": "uint32" + } + ], + "name": "checkpoints", + "outputs": [ + { + "components": [ + { + "internalType": "uint224", + "name": "votes", + "type": "uint224" + }, + { + "internalType": "uint32", + "name": "epochStart", + "type": "uint32" + } + ], + "internalType": "struct AuraLocker.DelegateeCheckpoint", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "claimableRewards", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct AuraLocker.EarnedData[]", + "name": "userRewards", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "cvxCrv", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "cvxcrvStaking", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newDelegatee", + "type": "address" + } + ], + "name": "delegate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "delegateeUnlocks", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "delegates", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "denominator", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "emergencyWithdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "epochCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "epochs", + "outputs": [ + { + "internalType": "uint224", + "name": "supply", + "type": "uint224" + }, + { + "internalType": "uint32", + "name": "date", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_time", + "type": "uint256" + } + ], + "name": "findEpochId", + "outputs": [ + { + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "name": "getPastTotalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "name": "getPastVotes", + "outputs": [ + { + "internalType": "uint256", + "name": "votes", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "bool", + "name": "_stake", + "type": "bool" + } + ], + "name": "getReward", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "getReward", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "bool[]", + "name": "_skipIdx", + "type": "bool[]" + } + ], + "name": "getReward", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "getVotes", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isShutdown", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "kickExpiredLocks", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "kickRewardEpochDelay", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "kickRewardPerEpoch", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_rewardsToken", + "type": "address" + } + ], + "name": "lastTimeRewardApplicable", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "lock", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "lockDuration", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "lockedBalances", + "outputs": [ + { + "internalType": "uint256", + "name": "total", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "unlockable", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "locked", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint112", + "name": "amount", + "type": "uint112" + }, + { + "internalType": "uint32", + "name": "unlockTime", + "type": "uint32" + } + ], + "internalType": "struct AuraLocker.LockedBalance[]", + "name": "lockData", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lockedSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "bool", + "name": "_blacklisted", + "type": "bool" + } + ], + "name": "modifyBlacklist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "newRewardRatio", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "numCheckpoints", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bool", + "name": "_relock", + "type": "bool" + } + ], + "name": "processExpiredLocks", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_rewardsToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_rewards", + "type": "uint256" + } + ], + "name": "queueNewRewards", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "queuedRewards", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_tokenAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenAmount", + "type": "uint256" + } + ], + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "rewardData", + "outputs": [ + { + "internalType": "uint32", + "name": "periodFinish", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "lastUpdateTime", + "type": "uint32" + }, + { + "internalType": "uint96", + "name": "rewardRate", + "type": "uint96" + }, + { + "internalType": "uint96", + "name": "rewardPerTokenStored", + "type": "uint96" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "rewardDistributors", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_rewardsToken", + "type": "address" + } + ], + "name": "rewardPerToken", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "rewardTokens", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardsDuration", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "setApprovals", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_rate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_delay", + "type": "uint256" + } + ], + "name": "setKickIncentive", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "shutdown", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "stakingToken", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "supply", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_epoch", + "type": "uint256" + } + ], + "name": "totalSupplyAtEpoch", + "outputs": [ + { + "internalType": "uint256", + "name": "supply", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "userData", + "outputs": [ + { + "internalType": "uint128", + "name": "rewardPerTokenPaid", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "rewards", + "type": "uint128" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "userLocks", + "outputs": [ + { + "internalType": "uint112", + "name": "amount", + "type": "uint112" + }, + { + "internalType": "uint32", + "name": "unlockTime", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + } +] diff --git a/src/apps/aura/contracts/abis/aura-masterchef.json b/src/apps/aura/contracts/abis/aura-masterchef.json new file mode 100644 index 000000000..3b0cedc23 --- /dev/null +++ b/src/apps/aura/contracts/abis/aura-masterchef.json @@ -0,0 +1,544 @@ +[ + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "_cvx", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_rewardPerBlock", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_startBlock", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_endBlock", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "pid", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Deposit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "pid", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "EmergencyWithdraw", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "pid", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "RewardPaid", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "pid", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Withdraw", + "type": "event" + }, + { + "inputs": [], + "name": "BONUS_MULTIPLIER", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_allocPoint", + "type": "uint256" + }, + { + "internalType": "contract IERC20", + "name": "_lpToken", + "type": "address" + }, + { + "internalType": "contract IRewarder", + "name": "_rewarder", + "type": "address" + } + ], + "name": "add", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_pid", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "claim", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "cvx", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_pid", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "deposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_pid", + "type": "uint256" + } + ], + "name": "emergencyWithdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "endBlock", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_from", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_to", + "type": "uint256" + } + ], + "name": "getMultiplier", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "isAddedPool", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "massUpdatePools", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_pid", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "pendingCvx", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "poolInfo", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "lpToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "allocPoint", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lastRewardBlock", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "accCvxPerShare", + "type": "uint256" + }, + { + "internalType": "contract IRewarder", + "name": "rewarder", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "poolLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "rewardPerBlock", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_pid", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_allocPoint", + "type": "uint256" + }, + { + "internalType": "contract IRewarder", + "name": "_rewarder", + "type": "address" + }, + { + "internalType": "bool", + "name": "_updateRewarder", + "type": "bool" + } + ], + "name": "set", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "startBlock", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalAllocPoint", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_pid", + "type": "uint256" + } + ], + "name": "updatePool", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "userInfo", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rewardDebt", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_pid", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +] diff --git a/src/apps/aura/contracts/abis/aura-token.json b/src/apps/aura/contracts/abis/aura-token.json new file mode 100644 index 000000000..d379dad19 --- /dev/null +++ b/src/apps/aura/contracts/abis/aura-token.json @@ -0,0 +1,470 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "_proxy", + "type": "address" + }, + { + "internalType": "string", + "name": "_nameArg", + "type": "string" + }, + { + "internalType": "string", + "name": "_symbolArg", + "type": "string" + } + ], + "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": [], + "name": "Initialised", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOperator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOperator", + "type": "address" + } + ], + "name": "OperatorChanged", + "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": "EMISSIONS_MAX_SUPPLY", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INIT_MINT_AMOUNT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "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": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "address", + "name": "_minter", + "type": "address" + } + ], + "name": "init", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "minter", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "minterMint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "operator", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "reductionPerCliff", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalCliffs", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "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" + }, + { + "inputs": [], + "name": "updateOperator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "vecrvProxy", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } +] diff --git a/src/apps/aura/contracts/abis/aura-virtual-balance-reward-pool.json b/src/apps/aura/contracts/abis/aura-virtual-balance-reward-pool.json new file mode 100644 index 000000000..e9ed226e5 --- /dev/null +++ b/src/apps/aura/contracts/abis/aura-virtual-balance-reward-pool.json @@ -0,0 +1,452 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "deposit_", + "type": "address" + }, + { + "internalType": "address", + "name": "reward_", + "type": "address" + }, + { + "internalType": "address", + "name": "op_", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "reward", + "type": "uint256" + } + ], + "name": "RewardAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "reward", + "type": "uint256" + } + ], + "name": "RewardPaid", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Staked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Withdrawn", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "currentRewards", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "deposits", + "outputs": [ + { + "internalType": "contract IDeposit", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "donate", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "duration", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "earned", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getReward", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "getReward", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "historicalRewards", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastTimeRewardApplicable", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastUpdateTime", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "newRewardRatio", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "operator", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "periodFinish", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_rewards", + "type": "uint256" + } + ], + "name": "queueNewRewards", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "queuedRewards", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardPerToken", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardPerTokenStored", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardRate", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardToken", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "rewards", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "stake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "userRewardPerTokenPaid", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +] diff --git a/src/apps/aura/contracts/abis/balancer-helpers.json b/src/apps/aura/contracts/abis/balancer-helpers.json new file mode 100644 index 000000000..3c0392a1d --- /dev/null +++ b/src/apps/aura/contracts/abis/balancer-helpers.json @@ -0,0 +1,148 @@ +[ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "_vault", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "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": "minAmountsOut", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + }, + { + "internalType": "bool", + "name": "toInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.ExitPoolRequest", + "name": "request", + "type": "tuple" + } + ], + "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" + }, + { + "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": "queryJoin", + "outputs": [ + { + "internalType": "uint256", + "name": "bptOut", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "amountsIn", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "vault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } +] diff --git a/src/apps/aura/contracts/abis/base-reward-pool.json b/src/apps/aura/contracts/abis/base-reward-pool.json new file mode 100644 index 000000000..7f525d89b --- /dev/null +++ b/src/apps/aura/contracts/abis/base-reward-pool.json @@ -0,0 +1,679 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "BaseRewardPool", + "sourceName": "convex-platform/contracts/contracts/BaseRewardPool.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "pid_", + "type": "uint256" + }, + { + "internalType": "address", + "name": "stakingToken_", + "type": "address" + }, + { + "internalType": "address", + "name": "rewardToken_", + "type": "address" + }, + { + "internalType": "address", + "name": "operator_", + "type": "address" + }, + { + "internalType": "address", + "name": "rewardManager_", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "reward", + "type": "uint256" + } + ], + "name": "RewardAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "reward", + "type": "uint256" + } + ], + "name": "RewardPaid", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Staked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Withdrawn", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_reward", + "type": "address" + } + ], + "name": "addExtraReward", + "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": "clearExtraRewards", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "currentRewards", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "donate", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "duration", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "earned", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "extraRewards", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "extraRewardsLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getReward", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "bool", + "name": "_claimExtras", + "type": "bool" + } + ], + "name": "getReward", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "historicalRewards", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastTimeRewardApplicable", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastUpdateTime", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "newRewardRatio", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "operator", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "periodFinish", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pid", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "processIdleRewards", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_rewards", + "type": "uint256" + } + ], + "name": "queueNewRewards", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "queuedRewards", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardManager", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardPerToken", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardPerTokenStored", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardRate", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardToken", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "rewards", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "stake", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "stakeAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_for", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "stakeFor", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "stakingToken", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "userRewardPerTokenPaid", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "claim", + "type": "bool" + } + ], + "name": "withdraw", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bool", + "name": "claim", + "type": "bool" + } + ], + "name": "withdrawAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bool", + "name": "claim", + "type": "bool" + } + ], + "name": "withdrawAllAndUnwrap", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "claim", + "type": "bool" + } + ], + "name": "withdrawAndUnwrap", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x61012060405260008055600060015560006004556000600555600060065534801561002957600080fd5b50604051611d09380380611d09833981810160405260a081101561004c57600080fd5b50805160208201516040830151606080850151608095860151610100959095526001600160601b031993821b841660a05291811b8316909452831b811660c052911b1660e05260805160601c60a05160601c60c05160601c60e05160601c61010051611beb61011e60003980610cd4528061106d528061175e5250806105ae52806106305280610acd52508061099c52806109cb5280610ca5528061179552508061069d52806108975280610e595280610eab5280610f75525080610c7c528061109e52806110dd5250611beb6000f3fe608060405234801561001057600080fd5b50600436106102265760003560e01c80636c8bcee811610130578063a694fc3a116100b8578063df136d651161007c578063df136d65146104f6578063ebe2b12b146104fe578063f106845414610506578063f14faf6f1461050e578063f7c618c11461052b57610226565b8063a694fc3a1461049c578063c32e7202146104b9578063c8f33c91146104de578063cd3daf9d146104e6578063d55a23f4146104ee57610226565b80637b0a47ee116100ff5780637b0a47ee1461045657806380faa57d1461045e5780638b876347146104665780638dcb40611461048c578063901a7d531461049457610226565b80636c8bcee8146103f25780637050ccd9146103fa57806370a082311461042857806372f702f31461044e57610226565b806338d07436116101b357806349f039a21161018257806349f039a214610380578063570ca7351461039f578063590a41f5146103a75780635e43c47b146103c457806363d38c3b146103ea57610226565b806338d074361461032e5780633d18b912146103535780633e8b83e31461035b57806340c354461461036357610226565b80630fb5a6b4116101fa5780630fb5a6b4146102b757806318160ddd146102bf5780631c1c6fe5146102c7578063262d3d6d146102e65780632ee40908146102ee57610226565b80628cc2621461022b5780630569d388146102635780630700037d1461026d5780630f4ef8a614610293575b600080fd5b6102516004803603602081101561024157600080fd5b50356001600160a01b0316610533565b60408051918252519081900360200190f35b61026b6105a3565b005b6102516004803603602081101561028357600080fd5b50356001600160a01b031661061c565b61029b61062e565b604080516001600160a01b039092168252519081900360200190f35b610251610652565b610251610659565b61026b600480360360208110156102dd57600080fd5b50351515610660565b61025161067e565b61031a6004803603604081101561030457600080fd5b506001600160a01b038135169060200135610684565b604080519115158252519081900360200190f35b61031a6004803603604081101561034457600080fd5b5080359060200135151561070e565b61031a610919565b61026b61092e565b61029b6004803603602081101561037957600080fd5b5035610959565b61026b6004803603602081101561039657600080fd5b50351515610980565b61029b61099a565b61031a600480360360208110156103bd57600080fd5b50356109be565b61031a600480360360208110156103da57600080fd5b50356001600160a01b0316610ac0565b610251610be0565b610251610be6565b61031a6004803603604081101561041057600080fd5b506001600160a01b0381351690602001351515610bec565b6102516004803603602081101561043e57600080fd5b50356001600160a01b0316610e3c565b61029b610e57565b610251610e7b565b610251610e81565b6102516004803603602081101561047c57600080fd5b50356001600160a01b0316610e94565b61031a610ea6565b610251610f56565b61031a600480360360208110156104b257600080fd5b5035610f5c565b61031a600480360360408110156104cf57600080fd5b50803590602001351515610fdb565b610251611005565b61025161100b565b610251611059565b61025161105f565b610251611065565b61025161106b565b61031a6004803603602081101561052457600080fd5b503561108f565b61029b6110db565b6001600160a01b038116600090815260096020908152604080832054600890925282205461059b919061059590670de0b6b3a76400009061058f906105809061057a61100b565b906110ff565b61058988610e3c565b9061115c565b906111bc565b90611223565b90505b919050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461060e576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b61061a600b6000611b0a565b565b60096020526000908152604090205481565b7f000000000000000000000000000000000000000000000000000000000000000081565b62093a8081565b6007545b90565b336000908152600a602052604090205461067a908261070e565b5050565b60065481565b6000610690828461127d565b6106c56001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333085611419565b6040805183815290516001600160a01b038516917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a25060015b92915050565b60003361071961100b565b600355610724610e81565b6002556001600160a01b0381161561076b5761073f81610533565b6001600160a01b0382166000908152600960209081526040808320939093556003546008909152919020555b600084116107c0576040805162461bcd60e51b815260206004820152601e60248201527f526577617264506f6f6c203a2043616e6e6f7420776974686472617720300000604482015290519081900360640190fd5b60005b600b5481101561085357600b81815481106107da57fe5b60009182526020822001546040805163f3fef3a360e01b81523360048201526024810189905290516001600160a01b039092169263f3fef3a39260448084019382900301818387803b15801561082f57600080fd5b505af1158015610843573d6000803e3d6000fd5b5050600190920191506107c39050565b5060075461086190856110ff565b600755336000908152600a602052604090205461087e90856110ff565b336000818152600a60205260409020919091556108c6907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169086611479565b60408051858152905133917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a2821561090f5761090d336001610bec565b505b5060019392505050565b6000610926336001610bec565b506001905090565b600054421015801561094257506000600454115b1561061a576109526004546114d0565b6000600455565b600b818154811061096657fe5b6000918252602090912001546001600160a01b0316905081565b336000908152600a602052604090205461067a9082610fdb565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a2b576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b600454610a39908390611223565b91506000544210610a5a57610a4d826114d0565b506000600455600161059e565b60008054610a7690610a6f9062093a806110ff565b42906110ff565b60015490915081026000610a908561058f846103e861115c565b905061033e811015610aaf57610aa5856114d0565b6000600455610ab5565b60048590555b506001949350505050565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b2d576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b6001600160a01b038216610b7a576040805162461bcd60e51b815260206004820152600f60248201526e217265776172642073657474696e6760881b604482015290519081900360640190fd5b600b54600c11610b8c5750600061059e565b50600b8054600181810183556000929092527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0384166001600160a01b0319909116179055919050565b60045481565b61033e81565b600082610bf761100b565b600355610c02610e81565b6002556001600160a01b03811615610c4957610c1d81610533565b6001600160a01b0382166000908152600960209081526040808320939093556003546008909152919020555b6000610c5485610533565b90508015610d9a576001600160a01b03808616600090815260096020526040812055610ca3907f0000000000000000000000000000000000000000000000000000000000000000168683611479565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166371192b177f000000000000000000000000000000000000000000000000000000000000000087846040518463ffffffff1660e01b815260040180848152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015610d4257600080fd5b505af1158015610d56573d6000803e3d6000fd5b50506040805184815290516001600160a01b03891693507fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e048692509081900360200190a25b8315610ab55760005b600b54811015610e3057600b8181548110610dba57fe5b600091825260208220015460408051630c00007b60e41b81526001600160a01b038a811660048301529151919092169263c00007b0926024808201939182900301818387803b158015610e0c57600080fd5b505af1158015610e20573d6000803e3d6000fd5b505060019092019150610da39050565b50506001949350505050565b6001600160a01b03166000908152600a602052604090205490565b7f000000000000000000000000000000000000000000000000000000000000000081565b60015481565b6000610e8f426000546115f4565b905090565b60086020526000908152604090205481565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f1657600080fd5b505afa158015610f2a573d6000803e3d6000fd5b505050506040513d6020811015610f4057600080fd5b50519050610f4d81610f5c565b50600191505090565b60055481565b6000610f68823361127d565b610f9d6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333085611419565b60408051838152905133917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a2506001919050565b6000610fe883333361160a565b508115610ffc57610ffa336001610bec565b505b50600192915050565b60025481565b6000611015610659565b611022575060035461065d565b610e8f611050611030610659565b61058f670de0b6b3a764000061058960015461058960025461057a610e81565b60035490611223565b600b5490565b60035481565b60005481565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006110c66001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333085611419565b6004546110d39083611223565b600455919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600082821115611156576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008261116b57506000610708565b8282028284828161117857fe5b04146111b55760405162461bcd60e51b8152600401808060200182810382526021815260200180611b6b6021913960400191505060405180910390fd5b9392505050565b6000808211611212576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161121b57fe5b049392505050565b6000828201838110156111b5576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b8061128661100b565b600355611291610e81565b6002556001600160a01b038116156112d8576112ac81610533565b6001600160a01b0382166000908152600960209081526040808320939093556003546008909152919020555b6000831161132d576040805162461bcd60e51b815260206004820152601b60248201527f526577617264506f6f6c203a2043616e6e6f74207374616b6520300000000000604482015290519081900360640190fd5b60005b600b548110156113c457600b818154811061134757fe5b6000918252602082200154604080516356e4bb9760e11b81526001600160a01b038781166004830152602482018990529151919092169263adc9772e926044808201939182900301818387803b1580156113a057600080fd5b505af11580156113b4573d6000803e3d6000fd5b5050600190920191506113309050565b506007546113d29084611223565b6007556001600160a01b0382166000908152600a60205260409020546113f89084611223565b6001600160a01b039092166000908152600a60205260409020919091555050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261147390859061183c565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526114cb90849061183c565b505050565b60006114da61100b565b6003556114e5610e81565b6002556001600160a01b0381161561152c5761150081610533565b6001600160a01b0382166000908152600960209081526040808320939093556003546008909152919020555b6006546115399083611223565b600655600054421061155a576115528262093a806111bc565b6001556115a2565b6000805461156890426110ff565b905060006115816001548361115c90919063ffffffff16565b905061158d8482611223565b935061159c8462093a806111bc565b60015550505b60058290554260028190556115ba9062093a80611223565b6000556040805183815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a15050565b600081831061160357816111b5565b5090919050565b60008261161561100b565b600355611620610e81565b6002556001600160a01b038116156116675761163b81610533565b6001600160a01b0382166000908152600960209081526040808320939093556003546008909152919020555b60005b600b548110156116fe57600b818154811061168157fe5b60009182526020822001546040805163f3fef3a360e01b81526001600160a01b038981166004830152602482018b90529151919092169263f3fef3a3926044808201939182900301818387803b1580156116da57600080fd5b505af11580156116ee573d6000803e3d6000fd5b50506001909201915061166a9050565b5060075461170c90866110ff565b6007556001600160a01b0384166000908152600a602052604090205461173290866110ff565b6001600160a01b038086166000908152600a60205260408082209390935582516305335c3960e21b81527f0000000000000000000000000000000000000000000000000000000000000000600482015260248101899052868316604482015292517f0000000000000000000000000000000000000000000000000000000000000000909216926314cd70e4926064808301939282900301818387803b1580156117da57600080fd5b505af11580156117ee573d6000803e3d6000fd5b50506040805188815290516001600160a01b03881693507f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d592509081900360200190a2506001949350505050565b6060611891826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166118ed9092919063ffffffff16565b8051909150156114cb578080602001905160208110156118b057600080fd5b50516114cb5760405162461bcd60e51b815260040180806020018281038252602a815260200180611b8c602a913960400191505060405180910390fd5b60606118fc8484600085611904565b949350505050565b6060824710156119455760405162461bcd60e51b8152600401808060200182810382526026815260200180611b456026913960400191505060405180910390fd5b61194e85611a60565b61199f576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106119de5780518252601f1990920191602091820191016119bf565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611a40576040519150601f19603f3d011682016040523d82523d6000602084013e611a45565b606091505b5091509150611a55828286611a66565b979650505050505050565b3b151590565b60608315611a755750816111b5565b825115611a855782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611acf578181015183820152602001611ab7565b50505050905090810190601f168015611afc5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5080546000825590600052602060002090810190611b289190611b2b565b50565b5b80821115611b405760008155600101611b2c565b509056fe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220d0d4834e546c839bf06d5243f76bcbd47043cf984843f141cd50e7972377895864736f6c634300060c0033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102265760003560e01c80636c8bcee811610130578063a694fc3a116100b8578063df136d651161007c578063df136d65146104f6578063ebe2b12b146104fe578063f106845414610506578063f14faf6f1461050e578063f7c618c11461052b57610226565b8063a694fc3a1461049c578063c32e7202146104b9578063c8f33c91146104de578063cd3daf9d146104e6578063d55a23f4146104ee57610226565b80637b0a47ee116100ff5780637b0a47ee1461045657806380faa57d1461045e5780638b876347146104665780638dcb40611461048c578063901a7d531461049457610226565b80636c8bcee8146103f25780637050ccd9146103fa57806370a082311461042857806372f702f31461044e57610226565b806338d07436116101b357806349f039a21161018257806349f039a214610380578063570ca7351461039f578063590a41f5146103a75780635e43c47b146103c457806363d38c3b146103ea57610226565b806338d074361461032e5780633d18b912146103535780633e8b83e31461035b57806340c354461461036357610226565b80630fb5a6b4116101fa5780630fb5a6b4146102b757806318160ddd146102bf5780631c1c6fe5146102c7578063262d3d6d146102e65780632ee40908146102ee57610226565b80628cc2621461022b5780630569d388146102635780630700037d1461026d5780630f4ef8a614610293575b600080fd5b6102516004803603602081101561024157600080fd5b50356001600160a01b0316610533565b60408051918252519081900360200190f35b61026b6105a3565b005b6102516004803603602081101561028357600080fd5b50356001600160a01b031661061c565b61029b61062e565b604080516001600160a01b039092168252519081900360200190f35b610251610652565b610251610659565b61026b600480360360208110156102dd57600080fd5b50351515610660565b61025161067e565b61031a6004803603604081101561030457600080fd5b506001600160a01b038135169060200135610684565b604080519115158252519081900360200190f35b61031a6004803603604081101561034457600080fd5b5080359060200135151561070e565b61031a610919565b61026b61092e565b61029b6004803603602081101561037957600080fd5b5035610959565b61026b6004803603602081101561039657600080fd5b50351515610980565b61029b61099a565b61031a600480360360208110156103bd57600080fd5b50356109be565b61031a600480360360208110156103da57600080fd5b50356001600160a01b0316610ac0565b610251610be0565b610251610be6565b61031a6004803603604081101561041057600080fd5b506001600160a01b0381351690602001351515610bec565b6102516004803603602081101561043e57600080fd5b50356001600160a01b0316610e3c565b61029b610e57565b610251610e7b565b610251610e81565b6102516004803603602081101561047c57600080fd5b50356001600160a01b0316610e94565b61031a610ea6565b610251610f56565b61031a600480360360208110156104b257600080fd5b5035610f5c565b61031a600480360360408110156104cf57600080fd5b50803590602001351515610fdb565b610251611005565b61025161100b565b610251611059565b61025161105f565b610251611065565b61025161106b565b61031a6004803603602081101561052457600080fd5b503561108f565b61029b6110db565b6001600160a01b038116600090815260096020908152604080832054600890925282205461059b919061059590670de0b6b3a76400009061058f906105809061057a61100b565b906110ff565b61058988610e3c565b9061115c565b906111bc565b90611223565b90505b919050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461060e576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b61061a600b6000611b0a565b565b60096020526000908152604090205481565b7f000000000000000000000000000000000000000000000000000000000000000081565b62093a8081565b6007545b90565b336000908152600a602052604090205461067a908261070e565b5050565b60065481565b6000610690828461127d565b6106c56001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333085611419565b6040805183815290516001600160a01b038516917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a25060015b92915050565b60003361071961100b565b600355610724610e81565b6002556001600160a01b0381161561076b5761073f81610533565b6001600160a01b0382166000908152600960209081526040808320939093556003546008909152919020555b600084116107c0576040805162461bcd60e51b815260206004820152601e60248201527f526577617264506f6f6c203a2043616e6e6f7420776974686472617720300000604482015290519081900360640190fd5b60005b600b5481101561085357600b81815481106107da57fe5b60009182526020822001546040805163f3fef3a360e01b81523360048201526024810189905290516001600160a01b039092169263f3fef3a39260448084019382900301818387803b15801561082f57600080fd5b505af1158015610843573d6000803e3d6000fd5b5050600190920191506107c39050565b5060075461086190856110ff565b600755336000908152600a602052604090205461087e90856110ff565b336000818152600a60205260409020919091556108c6907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169086611479565b60408051858152905133917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a2821561090f5761090d336001610bec565b505b5060019392505050565b6000610926336001610bec565b506001905090565b600054421015801561094257506000600454115b1561061a576109526004546114d0565b6000600455565b600b818154811061096657fe5b6000918252602090912001546001600160a01b0316905081565b336000908152600a602052604090205461067a9082610fdb565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a2b576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b600454610a39908390611223565b91506000544210610a5a57610a4d826114d0565b506000600455600161059e565b60008054610a7690610a6f9062093a806110ff565b42906110ff565b60015490915081026000610a908561058f846103e861115c565b905061033e811015610aaf57610aa5856114d0565b6000600455610ab5565b60048590555b506001949350505050565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b2d576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b6001600160a01b038216610b7a576040805162461bcd60e51b815260206004820152600f60248201526e217265776172642073657474696e6760881b604482015290519081900360640190fd5b600b54600c11610b8c5750600061059e565b50600b8054600181810183556000929092527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0384166001600160a01b0319909116179055919050565b60045481565b61033e81565b600082610bf761100b565b600355610c02610e81565b6002556001600160a01b03811615610c4957610c1d81610533565b6001600160a01b0382166000908152600960209081526040808320939093556003546008909152919020555b6000610c5485610533565b90508015610d9a576001600160a01b03808616600090815260096020526040812055610ca3907f0000000000000000000000000000000000000000000000000000000000000000168683611479565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166371192b177f000000000000000000000000000000000000000000000000000000000000000087846040518463ffffffff1660e01b815260040180848152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015610d4257600080fd5b505af1158015610d56573d6000803e3d6000fd5b50506040805184815290516001600160a01b03891693507fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e048692509081900360200190a25b8315610ab55760005b600b54811015610e3057600b8181548110610dba57fe5b600091825260208220015460408051630c00007b60e41b81526001600160a01b038a811660048301529151919092169263c00007b0926024808201939182900301818387803b158015610e0c57600080fd5b505af1158015610e20573d6000803e3d6000fd5b505060019092019150610da39050565b50506001949350505050565b6001600160a01b03166000908152600a602052604090205490565b7f000000000000000000000000000000000000000000000000000000000000000081565b60015481565b6000610e8f426000546115f4565b905090565b60086020526000908152604090205481565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f1657600080fd5b505afa158015610f2a573d6000803e3d6000fd5b505050506040513d6020811015610f4057600080fd5b50519050610f4d81610f5c565b50600191505090565b60055481565b6000610f68823361127d565b610f9d6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333085611419565b60408051838152905133917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a2506001919050565b6000610fe883333361160a565b508115610ffc57610ffa336001610bec565b505b50600192915050565b60025481565b6000611015610659565b611022575060035461065d565b610e8f611050611030610659565b61058f670de0b6b3a764000061058960015461058960025461057a610e81565b60035490611223565b600b5490565b60035481565b60005481565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006110c66001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333085611419565b6004546110d39083611223565b600455919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600082821115611156576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008261116b57506000610708565b8282028284828161117857fe5b04146111b55760405162461bcd60e51b8152600401808060200182810382526021815260200180611b6b6021913960400191505060405180910390fd5b9392505050565b6000808211611212576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161121b57fe5b049392505050565b6000828201838110156111b5576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b8061128661100b565b600355611291610e81565b6002556001600160a01b038116156112d8576112ac81610533565b6001600160a01b0382166000908152600960209081526040808320939093556003546008909152919020555b6000831161132d576040805162461bcd60e51b815260206004820152601b60248201527f526577617264506f6f6c203a2043616e6e6f74207374616b6520300000000000604482015290519081900360640190fd5b60005b600b548110156113c457600b818154811061134757fe5b6000918252602082200154604080516356e4bb9760e11b81526001600160a01b038781166004830152602482018990529151919092169263adc9772e926044808201939182900301818387803b1580156113a057600080fd5b505af11580156113b4573d6000803e3d6000fd5b5050600190920191506113309050565b506007546113d29084611223565b6007556001600160a01b0382166000908152600a60205260409020546113f89084611223565b6001600160a01b039092166000908152600a60205260409020919091555050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261147390859061183c565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526114cb90849061183c565b505050565b60006114da61100b565b6003556114e5610e81565b6002556001600160a01b0381161561152c5761150081610533565b6001600160a01b0382166000908152600960209081526040808320939093556003546008909152919020555b6006546115399083611223565b600655600054421061155a576115528262093a806111bc565b6001556115a2565b6000805461156890426110ff565b905060006115816001548361115c90919063ffffffff16565b905061158d8482611223565b935061159c8462093a806111bc565b60015550505b60058290554260028190556115ba9062093a80611223565b6000556040805183815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a15050565b600081831061160357816111b5565b5090919050565b60008261161561100b565b600355611620610e81565b6002556001600160a01b038116156116675761163b81610533565b6001600160a01b0382166000908152600960209081526040808320939093556003546008909152919020555b60005b600b548110156116fe57600b818154811061168157fe5b60009182526020822001546040805163f3fef3a360e01b81526001600160a01b038981166004830152602482018b90529151919092169263f3fef3a3926044808201939182900301818387803b1580156116da57600080fd5b505af11580156116ee573d6000803e3d6000fd5b50506001909201915061166a9050565b5060075461170c90866110ff565b6007556001600160a01b0384166000908152600a602052604090205461173290866110ff565b6001600160a01b038086166000908152600a60205260408082209390935582516305335c3960e21b81527f0000000000000000000000000000000000000000000000000000000000000000600482015260248101899052868316604482015292517f0000000000000000000000000000000000000000000000000000000000000000909216926314cd70e4926064808301939282900301818387803b1580156117da57600080fd5b505af11580156117ee573d6000803e3d6000fd5b50506040805188815290516001600160a01b03881693507f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d592509081900360200190a2506001949350505050565b6060611891826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166118ed9092919063ffffffff16565b8051909150156114cb578080602001905160208110156118b057600080fd5b50516114cb5760405162461bcd60e51b815260040180806020018281038252602a815260200180611b8c602a913960400191505060405180910390fd5b60606118fc8484600085611904565b949350505050565b6060824710156119455760405162461bcd60e51b8152600401808060200182810382526026815260200180611b456026913960400191505060405180910390fd5b61194e85611a60565b61199f576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106119de5780518252601f1990920191602091820191016119bf565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611a40576040519150601f19603f3d011682016040523d82523d6000602084013e611a45565b606091505b5091509150611a55828286611a66565b979650505050505050565b3b151590565b60608315611a755750816111b5565b825115611a855782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611acf578181015183820152602001611ab7565b50505050905090810190601f168015611afc5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5080546000825590600052602060002090810190611b289190611b2b565b50565b5b80821115611b405760008155600101611b2c565b509056fe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220d0d4834e546c839bf06d5243f76bcbd47043cf984843f141cd50e7972377895864736f6c634300060c0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/src/apps/aura/contracts/ethers/AuraLocker.ts b/src/apps/aura/contracts/ethers/AuraLocker.ts new file mode 100644 index 000000000..ecca563ca --- /dev/null +++ b/src/apps/aura/contracts/ethers/AuraLocker.ts @@ -0,0 +1,1466 @@ +/* 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 AuraLocker { + export type DelegateeCheckpointStruct = { + votes: BigNumberish; + epochStart: BigNumberish; + }; + + export type DelegateeCheckpointStructOutput = [BigNumber, number] & { + votes: BigNumber; + epochStart: number; + }; + + export type EarnedDataStruct = { token: string; amount: BigNumberish }; + + export type EarnedDataStructOutput = [string, BigNumber] & { + token: string; + amount: BigNumber; + }; + + export type LockedBalanceStruct = { + amount: BigNumberish; + unlockTime: BigNumberish; + }; + + export type LockedBalanceStructOutput = [BigNumber, number] & { + amount: BigNumber; + unlockTime: number; + }; +} + +export interface AuraLockerInterface extends utils.Interface { + functions: { + 'addReward(address,address)': FunctionFragment; + 'approveRewardDistributor(address,address,bool)': FunctionFragment; + 'balanceAtEpochOf(uint256,address)': FunctionFragment; + 'balanceOf(address)': FunctionFragment; + 'balances(address)': FunctionFragment; + 'blacklist(address)': FunctionFragment; + 'checkpointEpoch()': FunctionFragment; + 'checkpoints(address,uint32)': FunctionFragment; + 'claimableRewards(address)': FunctionFragment; + 'cvxCrv()': FunctionFragment; + 'cvxcrvStaking()': FunctionFragment; + 'decimals()': FunctionFragment; + 'delegate(address)': FunctionFragment; + 'delegateeUnlocks(address,uint256)': FunctionFragment; + 'delegates(address)': FunctionFragment; + 'denominator()': FunctionFragment; + 'emergencyWithdraw()': FunctionFragment; + 'epochCount()': FunctionFragment; + 'epochs(uint256)': FunctionFragment; + 'findEpochId(uint256)': FunctionFragment; + 'getPastTotalSupply(uint256)': FunctionFragment; + 'getPastVotes(address,uint256)': FunctionFragment; + 'getReward(address,bool)': FunctionFragment; + 'getReward(address)': FunctionFragment; + 'getReward(address,bool[])': FunctionFragment; + 'getVotes(address)': FunctionFragment; + 'isShutdown()': FunctionFragment; + 'kickExpiredLocks(address)': FunctionFragment; + 'kickRewardEpochDelay()': FunctionFragment; + 'kickRewardPerEpoch()': FunctionFragment; + 'lastTimeRewardApplicable(address)': FunctionFragment; + 'lock(address,uint256)': FunctionFragment; + 'lockDuration()': FunctionFragment; + 'lockedBalances(address)': FunctionFragment; + 'lockedSupply()': FunctionFragment; + 'modifyBlacklist(address,bool)': FunctionFragment; + 'name()': FunctionFragment; + 'newRewardRatio()': FunctionFragment; + 'numCheckpoints(address)': FunctionFragment; + 'owner()': FunctionFragment; + 'processExpiredLocks(bool)': FunctionFragment; + 'queueNewRewards(address,uint256)': FunctionFragment; + 'queuedRewards(address)': FunctionFragment; + 'recoverERC20(address,uint256)': FunctionFragment; + 'renounceOwnership()': FunctionFragment; + 'rewardData(address)': FunctionFragment; + 'rewardDistributors(address,address)': FunctionFragment; + 'rewardPerToken(address)': FunctionFragment; + 'rewardTokens(uint256)': FunctionFragment; + 'rewardsDuration()': FunctionFragment; + 'setApprovals()': FunctionFragment; + 'setKickIncentive(uint256,uint256)': FunctionFragment; + 'shutdown()': FunctionFragment; + 'stakingToken()': FunctionFragment; + 'symbol()': FunctionFragment; + 'totalSupply()': FunctionFragment; + 'totalSupplyAtEpoch(uint256)': FunctionFragment; + 'transferOwnership(address)': FunctionFragment; + 'userData(address,address)': FunctionFragment; + 'userLocks(address,uint256)': FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | 'addReward' + | 'approveRewardDistributor' + | 'balanceAtEpochOf' + | 'balanceOf' + | 'balances' + | 'blacklist' + | 'checkpointEpoch' + | 'checkpoints' + | 'claimableRewards' + | 'cvxCrv' + | 'cvxcrvStaking' + | 'decimals' + | 'delegate' + | 'delegateeUnlocks' + | 'delegates' + | 'denominator' + | 'emergencyWithdraw' + | 'epochCount' + | 'epochs' + | 'findEpochId' + | 'getPastTotalSupply' + | 'getPastVotes' + | 'getReward(address,bool)' + | 'getReward(address)' + | 'getReward(address,bool[])' + | 'getVotes' + | 'isShutdown' + | 'kickExpiredLocks' + | 'kickRewardEpochDelay' + | 'kickRewardPerEpoch' + | 'lastTimeRewardApplicable' + | 'lock' + | 'lockDuration' + | 'lockedBalances' + | 'lockedSupply' + | 'modifyBlacklist' + | 'name' + | 'newRewardRatio' + | 'numCheckpoints' + | 'owner' + | 'processExpiredLocks' + | 'queueNewRewards' + | 'queuedRewards' + | 'recoverERC20' + | 'renounceOwnership' + | 'rewardData' + | 'rewardDistributors' + | 'rewardPerToken' + | 'rewardTokens' + | 'rewardsDuration' + | 'setApprovals' + | 'setKickIncentive' + | 'shutdown' + | 'stakingToken' + | 'symbol' + | 'totalSupply' + | 'totalSupplyAtEpoch' + | 'transferOwnership' + | 'userData' + | 'userLocks', + ): FunctionFragment; + + encodeFunctionData(functionFragment: 'addReward', values: [string, string]): string; + encodeFunctionData(functionFragment: 'approveRewardDistributor', values: [string, string, boolean]): string; + encodeFunctionData(functionFragment: 'balanceAtEpochOf', values: [BigNumberish, string]): string; + encodeFunctionData(functionFragment: 'balanceOf', values: [string]): string; + encodeFunctionData(functionFragment: 'balances', values: [string]): string; + encodeFunctionData(functionFragment: 'blacklist', values: [string]): string; + encodeFunctionData(functionFragment: 'checkpointEpoch', values?: undefined): string; + encodeFunctionData(functionFragment: 'checkpoints', values: [string, BigNumberish]): string; + encodeFunctionData(functionFragment: 'claimableRewards', values: [string]): string; + encodeFunctionData(functionFragment: 'cvxCrv', values?: undefined): string; + encodeFunctionData(functionFragment: 'cvxcrvStaking', values?: undefined): string; + encodeFunctionData(functionFragment: 'decimals', values?: undefined): string; + encodeFunctionData(functionFragment: 'delegate', values: [string]): string; + encodeFunctionData(functionFragment: 'delegateeUnlocks', values: [string, BigNumberish]): string; + encodeFunctionData(functionFragment: 'delegates', values: [string]): string; + encodeFunctionData(functionFragment: 'denominator', values?: undefined): string; + encodeFunctionData(functionFragment: 'emergencyWithdraw', values?: undefined): string; + encodeFunctionData(functionFragment: 'epochCount', values?: undefined): string; + encodeFunctionData(functionFragment: 'epochs', values: [BigNumberish]): string; + encodeFunctionData(functionFragment: 'findEpochId', values: [BigNumberish]): string; + encodeFunctionData(functionFragment: 'getPastTotalSupply', values: [BigNumberish]): string; + encodeFunctionData(functionFragment: 'getPastVotes', values: [string, BigNumberish]): string; + encodeFunctionData(functionFragment: 'getReward(address,bool)', values: [string, boolean]): string; + encodeFunctionData(functionFragment: 'getReward(address)', values: [string]): string; + encodeFunctionData(functionFragment: 'getReward(address,bool[])', values: [string, boolean[]]): string; + encodeFunctionData(functionFragment: 'getVotes', values: [string]): string; + encodeFunctionData(functionFragment: 'isShutdown', values?: undefined): string; + encodeFunctionData(functionFragment: 'kickExpiredLocks', values: [string]): string; + encodeFunctionData(functionFragment: 'kickRewardEpochDelay', values?: undefined): string; + encodeFunctionData(functionFragment: 'kickRewardPerEpoch', values?: undefined): string; + encodeFunctionData(functionFragment: 'lastTimeRewardApplicable', values: [string]): string; + encodeFunctionData(functionFragment: 'lock', values: [string, BigNumberish]): string; + encodeFunctionData(functionFragment: 'lockDuration', values?: undefined): string; + encodeFunctionData(functionFragment: 'lockedBalances', values: [string]): string; + encodeFunctionData(functionFragment: 'lockedSupply', values?: undefined): string; + encodeFunctionData(functionFragment: 'modifyBlacklist', values: [string, boolean]): string; + encodeFunctionData(functionFragment: 'name', values?: undefined): string; + encodeFunctionData(functionFragment: 'newRewardRatio', values?: undefined): string; + encodeFunctionData(functionFragment: 'numCheckpoints', values: [string]): string; + encodeFunctionData(functionFragment: 'owner', values?: undefined): string; + encodeFunctionData(functionFragment: 'processExpiredLocks', values: [boolean]): string; + encodeFunctionData(functionFragment: 'queueNewRewards', values: [string, BigNumberish]): string; + encodeFunctionData(functionFragment: 'queuedRewards', values: [string]): string; + encodeFunctionData(functionFragment: 'recoverERC20', values: [string, BigNumberish]): string; + encodeFunctionData(functionFragment: 'renounceOwnership', values?: undefined): string; + encodeFunctionData(functionFragment: 'rewardData', values: [string]): string; + encodeFunctionData(functionFragment: 'rewardDistributors', values: [string, string]): string; + encodeFunctionData(functionFragment: 'rewardPerToken', values: [string]): string; + encodeFunctionData(functionFragment: 'rewardTokens', values: [BigNumberish]): string; + encodeFunctionData(functionFragment: 'rewardsDuration', values?: undefined): string; + encodeFunctionData(functionFragment: 'setApprovals', values?: undefined): string; + encodeFunctionData(functionFragment: 'setKickIncentive', values: [BigNumberish, BigNumberish]): string; + encodeFunctionData(functionFragment: 'shutdown', values?: undefined): string; + encodeFunctionData(functionFragment: 'stakingToken', values?: undefined): string; + encodeFunctionData(functionFragment: 'symbol', values?: undefined): string; + encodeFunctionData(functionFragment: 'totalSupply', values?: undefined): string; + encodeFunctionData(functionFragment: 'totalSupplyAtEpoch', values: [BigNumberish]): string; + encodeFunctionData(functionFragment: 'transferOwnership', values: [string]): string; + encodeFunctionData(functionFragment: 'userData', values: [string, string]): string; + encodeFunctionData(functionFragment: 'userLocks', values: [string, BigNumberish]): string; + + decodeFunctionResult(functionFragment: 'addReward', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'approveRewardDistributor', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'balanceAtEpochOf', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'balanceOf', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'balances', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'blacklist', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'checkpointEpoch', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'checkpoints', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'claimableRewards', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'cvxCrv', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'cvxcrvStaking', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'decimals', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'delegate', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'delegateeUnlocks', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'delegates', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'denominator', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'emergencyWithdraw', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'epochCount', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'epochs', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'findEpochId', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'getPastTotalSupply', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'getPastVotes', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'getReward(address,bool)', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'getReward(address)', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'getReward(address,bool[])', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'getVotes', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'isShutdown', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'kickExpiredLocks', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'kickRewardEpochDelay', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'kickRewardPerEpoch', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'lastTimeRewardApplicable', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'lock', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'lockDuration', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'lockedBalances', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'lockedSupply', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'modifyBlacklist', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'name', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'newRewardRatio', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'numCheckpoints', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'owner', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'processExpiredLocks', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'queueNewRewards', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'queuedRewards', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'recoverERC20', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'renounceOwnership', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'rewardData', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'rewardDistributors', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'rewardPerToken', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'rewardTokens', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'rewardsDuration', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'setApprovals', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'setKickIncentive', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'shutdown', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'stakingToken', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'symbol', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'totalSupply', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'totalSupplyAtEpoch', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'transferOwnership', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'userData', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'userLocks', data: BytesLike): Result; + + events: { + 'BlacklistModified(address,bool)': EventFragment; + 'DelegateChanged(address,address,address)': EventFragment; + 'DelegateCheckpointed(address)': EventFragment; + 'KickIncentiveSet(uint256,uint256)': EventFragment; + 'KickReward(address,address,uint256)': EventFragment; + 'OwnershipTransferred(address,address)': EventFragment; + 'Recovered(address,uint256)': EventFragment; + 'RewardAdded(address,uint256)': EventFragment; + 'RewardPaid(address,address,uint256)': EventFragment; + 'Shutdown()': EventFragment; + 'Staked(address,uint256,uint256)': EventFragment; + 'Withdrawn(address,uint256,bool)': EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: 'BlacklistModified'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'DelegateChanged'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'DelegateCheckpointed'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'KickIncentiveSet'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'KickReward'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'OwnershipTransferred'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'Recovered'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'RewardAdded'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'RewardPaid'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'Shutdown'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'Staked'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'Withdrawn'): EventFragment; +} + +export interface BlacklistModifiedEventObject { + account: string; + blacklisted: boolean; +} +export type BlacklistModifiedEvent = TypedEvent<[string, boolean], BlacklistModifiedEventObject>; + +export type BlacklistModifiedEventFilter = TypedEventFilter; + +export interface DelegateChangedEventObject { + delegator: string; + fromDelegate: string; + toDelegate: string; +} +export type DelegateChangedEvent = TypedEvent<[string, string, string], DelegateChangedEventObject>; + +export type DelegateChangedEventFilter = TypedEventFilter; + +export interface DelegateCheckpointedEventObject { + delegate: string; +} +export type DelegateCheckpointedEvent = TypedEvent<[string], DelegateCheckpointedEventObject>; + +export type DelegateCheckpointedEventFilter = TypedEventFilter; + +export interface KickIncentiveSetEventObject { + rate: BigNumber; + delay: BigNumber; +} +export type KickIncentiveSetEvent = TypedEvent<[BigNumber, BigNumber], KickIncentiveSetEventObject>; + +export type KickIncentiveSetEventFilter = TypedEventFilter; + +export interface KickRewardEventObject { + _user: string; + _kicked: string; + _reward: BigNumber; +} +export type KickRewardEvent = TypedEvent<[string, string, BigNumber], KickRewardEventObject>; + +export type KickRewardEventFilter = TypedEventFilter; + +export interface OwnershipTransferredEventObject { + previousOwner: string; + newOwner: string; +} +export type OwnershipTransferredEvent = TypedEvent<[string, string], OwnershipTransferredEventObject>; + +export type OwnershipTransferredEventFilter = TypedEventFilter; + +export interface RecoveredEventObject { + _token: string; + _amount: BigNumber; +} +export type RecoveredEvent = TypedEvent<[string, BigNumber], RecoveredEventObject>; + +export type RecoveredEventFilter = TypedEventFilter; + +export interface RewardAddedEventObject { + _token: string; + _reward: BigNumber; +} +export type RewardAddedEvent = TypedEvent<[string, BigNumber], RewardAddedEventObject>; + +export type RewardAddedEventFilter = TypedEventFilter; + +export interface RewardPaidEventObject { + _user: string; + _rewardsToken: string; + _reward: BigNumber; +} +export type RewardPaidEvent = TypedEvent<[string, string, BigNumber], RewardPaidEventObject>; + +export type RewardPaidEventFilter = TypedEventFilter; + +export interface ShutdownEventObject {} +export type ShutdownEvent = TypedEvent<[], ShutdownEventObject>; + +export type ShutdownEventFilter = TypedEventFilter; + +export interface StakedEventObject { + _user: string; + _paidAmount: BigNumber; + _lockedAmount: BigNumber; +} +export type StakedEvent = TypedEvent<[string, BigNumber, BigNumber], StakedEventObject>; + +export type StakedEventFilter = TypedEventFilter; + +export interface WithdrawnEventObject { + _user: string; + _amount: BigNumber; + _relocked: boolean; +} +export type WithdrawnEvent = TypedEvent<[string, BigNumber, boolean], WithdrawnEventObject>; + +export type WithdrawnEventFilter = TypedEventFilter; + +export interface AuraLocker extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: AuraLockerInterface; + + 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: { + addReward( + _rewardsToken: string, + _distributor: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + approveRewardDistributor( + _rewardsToken: string, + _distributor: string, + _approved: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + balanceAtEpochOf( + _epoch: BigNumberish, + _user: string, + overrides?: CallOverrides, + ): Promise<[BigNumber] & { amount: BigNumber }>; + + balanceOf(_user: string, overrides?: CallOverrides): Promise<[BigNumber] & { amount: BigNumber }>; + + balances( + arg0: string, + overrides?: CallOverrides, + ): Promise<[BigNumber, number] & { locked: BigNumber; nextUnlockIndex: number }>; + + blacklist(arg0: string, overrides?: CallOverrides): Promise<[boolean]>; + + checkpointEpoch(overrides?: Overrides & { from?: string | Promise }): Promise; + + checkpoints( + account: string, + pos: BigNumberish, + overrides?: CallOverrides, + ): Promise<[AuraLocker.DelegateeCheckpointStructOutput]>; + + claimableRewards( + _account: string, + overrides?: CallOverrides, + ): Promise< + [AuraLocker.EarnedDataStructOutput[]] & { + userRewards: AuraLocker.EarnedDataStructOutput[]; + } + >; + + cvxCrv(overrides?: CallOverrides): Promise<[string]>; + + cvxcrvStaking(overrides?: CallOverrides): Promise<[string]>; + + decimals(overrides?: CallOverrides): Promise<[number]>; + + delegate( + newDelegatee: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + delegateeUnlocks(arg0: string, arg1: BigNumberish, overrides?: CallOverrides): Promise<[BigNumber]>; + + delegates(account: string, overrides?: CallOverrides): Promise<[string]>; + + denominator(overrides?: CallOverrides): Promise<[BigNumber]>; + + emergencyWithdraw(overrides?: Overrides & { from?: string | Promise }): Promise; + + epochCount(overrides?: CallOverrides): Promise<[BigNumber]>; + + epochs( + arg0: BigNumberish, + overrides?: CallOverrides, + ): Promise<[BigNumber, number] & { supply: BigNumber; date: number }>; + + findEpochId(_time: BigNumberish, overrides?: CallOverrides): Promise<[BigNumber] & { epoch: BigNumber }>; + + getPastTotalSupply(timestamp: BigNumberish, overrides?: CallOverrides): Promise<[BigNumber]>; + + getPastVotes( + account: string, + timestamp: BigNumberish, + overrides?: CallOverrides, + ): Promise<[BigNumber] & { votes: BigNumber }>; + + 'getReward(address,bool)'( + _account: string, + _stake: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + 'getReward(address)'( + _account: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + 'getReward(address,bool[])'( + _account: string, + _skipIdx: boolean[], + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + getVotes(account: string, overrides?: CallOverrides): Promise<[BigNumber]>; + + isShutdown(overrides?: CallOverrides): Promise<[boolean]>; + + kickExpiredLocks( + _account: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + kickRewardEpochDelay(overrides?: CallOverrides): Promise<[BigNumber]>; + + kickRewardPerEpoch(overrides?: CallOverrides): Promise<[BigNumber]>; + + lastTimeRewardApplicable(_rewardsToken: string, overrides?: CallOverrides): Promise<[BigNumber]>; + + lock( + _account: string, + _amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + lockDuration(overrides?: CallOverrides): Promise<[BigNumber]>; + + lockedBalances( + _user: string, + overrides?: CallOverrides, + ): Promise< + [BigNumber, BigNumber, BigNumber, AuraLocker.LockedBalanceStructOutput[]] & { + total: BigNumber; + unlockable: BigNumber; + locked: BigNumber; + lockData: AuraLocker.LockedBalanceStructOutput[]; + } + >; + + lockedSupply(overrides?: CallOverrides): Promise<[BigNumber]>; + + modifyBlacklist( + _account: string, + _blacklisted: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + name(overrides?: CallOverrides): Promise<[string]>; + + newRewardRatio(overrides?: CallOverrides): Promise<[BigNumber]>; + + numCheckpoints(account: string, overrides?: CallOverrides): Promise<[number]>; + + owner(overrides?: CallOverrides): Promise<[string]>; + + processExpiredLocks( + _relock: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + queueNewRewards( + _rewardsToken: string, + _rewards: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + queuedRewards(arg0: string, overrides?: CallOverrides): Promise<[BigNumber]>; + + recoverERC20( + _tokenAddress: string, + _tokenAmount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + renounceOwnership(overrides?: Overrides & { from?: string | Promise }): Promise; + + rewardData( + arg0: string, + overrides?: CallOverrides, + ): Promise< + [number, number, BigNumber, BigNumber] & { + periodFinish: number; + lastUpdateTime: number; + rewardRate: BigNumber; + rewardPerTokenStored: BigNumber; + } + >; + + rewardDistributors(arg0: string, arg1: string, overrides?: CallOverrides): Promise<[boolean]>; + + rewardPerToken(_rewardsToken: string, overrides?: CallOverrides): Promise<[BigNumber]>; + + rewardTokens(arg0: BigNumberish, overrides?: CallOverrides): Promise<[string]>; + + rewardsDuration(overrides?: CallOverrides): Promise<[BigNumber]>; + + setApprovals(overrides?: Overrides & { from?: string | Promise }): Promise; + + setKickIncentive( + _rate: BigNumberish, + _delay: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + shutdown(overrides?: Overrides & { from?: string | Promise }): Promise; + + stakingToken(overrides?: CallOverrides): Promise<[string]>; + + symbol(overrides?: CallOverrides): Promise<[string]>; + + totalSupply(overrides?: CallOverrides): Promise<[BigNumber] & { supply: BigNumber }>; + + totalSupplyAtEpoch(_epoch: BigNumberish, overrides?: CallOverrides): Promise<[BigNumber] & { supply: BigNumber }>; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + userData( + arg0: string, + arg1: string, + overrides?: CallOverrides, + ): Promise< + [BigNumber, BigNumber] & { + rewardPerTokenPaid: BigNumber; + rewards: BigNumber; + } + >; + + userLocks( + arg0: string, + arg1: BigNumberish, + overrides?: CallOverrides, + ): Promise<[BigNumber, number] & { amount: BigNumber; unlockTime: number }>; + }; + + addReward( + _rewardsToken: string, + _distributor: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + approveRewardDistributor( + _rewardsToken: string, + _distributor: string, + _approved: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + balanceAtEpochOf(_epoch: BigNumberish, _user: string, overrides?: CallOverrides): Promise; + + balanceOf(_user: string, overrides?: CallOverrides): Promise; + + balances( + arg0: string, + overrides?: CallOverrides, + ): Promise<[BigNumber, number] & { locked: BigNumber; nextUnlockIndex: number }>; + + blacklist(arg0: string, overrides?: CallOverrides): Promise; + + checkpointEpoch(overrides?: Overrides & { from?: string | Promise }): Promise; + + checkpoints( + account: string, + pos: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + claimableRewards(_account: string, overrides?: CallOverrides): Promise; + + cvxCrv(overrides?: CallOverrides): Promise; + + cvxcrvStaking(overrides?: CallOverrides): Promise; + + decimals(overrides?: CallOverrides): Promise; + + delegate( + newDelegatee: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + delegateeUnlocks(arg0: string, arg1: BigNumberish, overrides?: CallOverrides): Promise; + + delegates(account: string, overrides?: CallOverrides): Promise; + + denominator(overrides?: CallOverrides): Promise; + + emergencyWithdraw(overrides?: Overrides & { from?: string | Promise }): Promise; + + epochCount(overrides?: CallOverrides): Promise; + + epochs( + arg0: BigNumberish, + overrides?: CallOverrides, + ): Promise<[BigNumber, number] & { supply: BigNumber; date: number }>; + + findEpochId(_time: BigNumberish, overrides?: CallOverrides): Promise; + + getPastTotalSupply(timestamp: BigNumberish, overrides?: CallOverrides): Promise; + + getPastVotes(account: string, timestamp: BigNumberish, overrides?: CallOverrides): Promise; + + 'getReward(address,bool)'( + _account: string, + _stake: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + 'getReward(address)'( + _account: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + 'getReward(address,bool[])'( + _account: string, + _skipIdx: boolean[], + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + getVotes(account: string, overrides?: CallOverrides): Promise; + + isShutdown(overrides?: CallOverrides): Promise; + + kickExpiredLocks( + _account: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + kickRewardEpochDelay(overrides?: CallOverrides): Promise; + + kickRewardPerEpoch(overrides?: CallOverrides): Promise; + + lastTimeRewardApplicable(_rewardsToken: string, overrides?: CallOverrides): Promise; + + lock( + _account: string, + _amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + lockDuration(overrides?: CallOverrides): Promise; + + lockedBalances( + _user: string, + overrides?: CallOverrides, + ): Promise< + [BigNumber, BigNumber, BigNumber, AuraLocker.LockedBalanceStructOutput[]] & { + total: BigNumber; + unlockable: BigNumber; + locked: BigNumber; + lockData: AuraLocker.LockedBalanceStructOutput[]; + } + >; + + lockedSupply(overrides?: CallOverrides): Promise; + + modifyBlacklist( + _account: string, + _blacklisted: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + name(overrides?: CallOverrides): Promise; + + newRewardRatio(overrides?: CallOverrides): Promise; + + numCheckpoints(account: string, overrides?: CallOverrides): Promise; + + owner(overrides?: CallOverrides): Promise; + + processExpiredLocks( + _relock: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + queueNewRewards( + _rewardsToken: string, + _rewards: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + queuedRewards(arg0: string, overrides?: CallOverrides): Promise; + + recoverERC20( + _tokenAddress: string, + _tokenAmount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + renounceOwnership(overrides?: Overrides & { from?: string | Promise }): Promise; + + rewardData( + arg0: string, + overrides?: CallOverrides, + ): Promise< + [number, number, BigNumber, BigNumber] & { + periodFinish: number; + lastUpdateTime: number; + rewardRate: BigNumber; + rewardPerTokenStored: BigNumber; + } + >; + + rewardDistributors(arg0: string, arg1: string, overrides?: CallOverrides): Promise; + + rewardPerToken(_rewardsToken: string, overrides?: CallOverrides): Promise; + + rewardTokens(arg0: BigNumberish, overrides?: CallOverrides): Promise; + + rewardsDuration(overrides?: CallOverrides): Promise; + + setApprovals(overrides?: Overrides & { from?: string | Promise }): Promise; + + setKickIncentive( + _rate: BigNumberish, + _delay: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + shutdown(overrides?: Overrides & { from?: string | Promise }): Promise; + + stakingToken(overrides?: CallOverrides): Promise; + + symbol(overrides?: CallOverrides): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + totalSupplyAtEpoch(_epoch: BigNumberish, overrides?: CallOverrides): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + userData( + arg0: string, + arg1: string, + overrides?: CallOverrides, + ): Promise< + [BigNumber, BigNumber] & { + rewardPerTokenPaid: BigNumber; + rewards: BigNumber; + } + >; + + userLocks( + arg0: string, + arg1: BigNumberish, + overrides?: CallOverrides, + ): Promise<[BigNumber, number] & { amount: BigNumber; unlockTime: number }>; + + callStatic: { + addReward(_rewardsToken: string, _distributor: string, overrides?: CallOverrides): Promise; + + approveRewardDistributor( + _rewardsToken: string, + _distributor: string, + _approved: boolean, + overrides?: CallOverrides, + ): Promise; + + balanceAtEpochOf(_epoch: BigNumberish, _user: string, overrides?: CallOverrides): Promise; + + balanceOf(_user: string, overrides?: CallOverrides): Promise; + + balances( + arg0: string, + overrides?: CallOverrides, + ): Promise<[BigNumber, number] & { locked: BigNumber; nextUnlockIndex: number }>; + + blacklist(arg0: string, overrides?: CallOverrides): Promise; + + checkpointEpoch(overrides?: CallOverrides): Promise; + + checkpoints( + account: string, + pos: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + claimableRewards(_account: string, overrides?: CallOverrides): Promise; + + cvxCrv(overrides?: CallOverrides): Promise; + + cvxcrvStaking(overrides?: CallOverrides): Promise; + + decimals(overrides?: CallOverrides): Promise; + + delegate(newDelegatee: string, overrides?: CallOverrides): Promise; + + delegateeUnlocks(arg0: string, arg1: BigNumberish, overrides?: CallOverrides): Promise; + + delegates(account: string, overrides?: CallOverrides): Promise; + + denominator(overrides?: CallOverrides): Promise; + + emergencyWithdraw(overrides?: CallOverrides): Promise; + + epochCount(overrides?: CallOverrides): Promise; + + epochs( + arg0: BigNumberish, + overrides?: CallOverrides, + ): Promise<[BigNumber, number] & { supply: BigNumber; date: number }>; + + findEpochId(_time: BigNumberish, overrides?: CallOverrides): Promise; + + getPastTotalSupply(timestamp: BigNumberish, overrides?: CallOverrides): Promise; + + getPastVotes(account: string, timestamp: BigNumberish, overrides?: CallOverrides): Promise; + + 'getReward(address,bool)'(_account: string, _stake: boolean, overrides?: CallOverrides): Promise; + + 'getReward(address)'(_account: string, overrides?: CallOverrides): Promise; + + 'getReward(address,bool[])'(_account: string, _skipIdx: boolean[], overrides?: CallOverrides): Promise; + + getVotes(account: string, overrides?: CallOverrides): Promise; + + isShutdown(overrides?: CallOverrides): Promise; + + kickExpiredLocks(_account: string, overrides?: CallOverrides): Promise; + + kickRewardEpochDelay(overrides?: CallOverrides): Promise; + + kickRewardPerEpoch(overrides?: CallOverrides): Promise; + + lastTimeRewardApplicable(_rewardsToken: string, overrides?: CallOverrides): Promise; + + lock(_account: string, _amount: BigNumberish, overrides?: CallOverrides): Promise; + + lockDuration(overrides?: CallOverrides): Promise; + + lockedBalances( + _user: string, + overrides?: CallOverrides, + ): Promise< + [BigNumber, BigNumber, BigNumber, AuraLocker.LockedBalanceStructOutput[]] & { + total: BigNumber; + unlockable: BigNumber; + locked: BigNumber; + lockData: AuraLocker.LockedBalanceStructOutput[]; + } + >; + + lockedSupply(overrides?: CallOverrides): Promise; + + modifyBlacklist(_account: string, _blacklisted: boolean, overrides?: CallOverrides): Promise; + + name(overrides?: CallOverrides): Promise; + + newRewardRatio(overrides?: CallOverrides): Promise; + + numCheckpoints(account: string, overrides?: CallOverrides): Promise; + + owner(overrides?: CallOverrides): Promise; + + processExpiredLocks(_relock: boolean, overrides?: CallOverrides): Promise; + + queueNewRewards(_rewardsToken: string, _rewards: BigNumberish, overrides?: CallOverrides): Promise; + + queuedRewards(arg0: string, overrides?: CallOverrides): Promise; + + recoverERC20(_tokenAddress: string, _tokenAmount: BigNumberish, overrides?: CallOverrides): Promise; + + renounceOwnership(overrides?: CallOverrides): Promise; + + rewardData( + arg0: string, + overrides?: CallOverrides, + ): Promise< + [number, number, BigNumber, BigNumber] & { + periodFinish: number; + lastUpdateTime: number; + rewardRate: BigNumber; + rewardPerTokenStored: BigNumber; + } + >; + + rewardDistributors(arg0: string, arg1: string, overrides?: CallOverrides): Promise; + + rewardPerToken(_rewardsToken: string, overrides?: CallOverrides): Promise; + + rewardTokens(arg0: BigNumberish, overrides?: CallOverrides): Promise; + + rewardsDuration(overrides?: CallOverrides): Promise; + + setApprovals(overrides?: CallOverrides): Promise; + + setKickIncentive(_rate: BigNumberish, _delay: BigNumberish, overrides?: CallOverrides): Promise; + + shutdown(overrides?: CallOverrides): Promise; + + stakingToken(overrides?: CallOverrides): Promise; + + symbol(overrides?: CallOverrides): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + totalSupplyAtEpoch(_epoch: BigNumberish, overrides?: CallOverrides): Promise; + + transferOwnership(newOwner: string, overrides?: CallOverrides): Promise; + + userData( + arg0: string, + arg1: string, + overrides?: CallOverrides, + ): Promise< + [BigNumber, BigNumber] & { + rewardPerTokenPaid: BigNumber; + rewards: BigNumber; + } + >; + + userLocks( + arg0: string, + arg1: BigNumberish, + overrides?: CallOverrides, + ): Promise<[BigNumber, number] & { amount: BigNumber; unlockTime: number }>; + }; + + filters: { + 'BlacklistModified(address,bool)'(account?: null, blacklisted?: null): BlacklistModifiedEventFilter; + BlacklistModified(account?: null, blacklisted?: null): BlacklistModifiedEventFilter; + + 'DelegateChanged(address,address,address)'( + delegator?: string | null, + fromDelegate?: string | null, + toDelegate?: string | null, + ): DelegateChangedEventFilter; + DelegateChanged( + delegator?: string | null, + fromDelegate?: string | null, + toDelegate?: string | null, + ): DelegateChangedEventFilter; + + 'DelegateCheckpointed(address)'(delegate?: string | null): DelegateCheckpointedEventFilter; + DelegateCheckpointed(delegate?: string | null): DelegateCheckpointedEventFilter; + + 'KickIncentiveSet(uint256,uint256)'(rate?: null, delay?: null): KickIncentiveSetEventFilter; + KickIncentiveSet(rate?: null, delay?: null): KickIncentiveSetEventFilter; + + 'KickReward(address,address,uint256)'( + _user?: string | null, + _kicked?: string | null, + _reward?: null, + ): KickRewardEventFilter; + KickReward(_user?: string | null, _kicked?: string | null, _reward?: null): KickRewardEventFilter; + + 'OwnershipTransferred(address,address)'( + previousOwner?: string | null, + newOwner?: string | null, + ): OwnershipTransferredEventFilter; + OwnershipTransferred(previousOwner?: string | null, newOwner?: string | null): OwnershipTransferredEventFilter; + + 'Recovered(address,uint256)'(_token?: null, _amount?: null): RecoveredEventFilter; + Recovered(_token?: null, _amount?: null): RecoveredEventFilter; + + 'RewardAdded(address,uint256)'(_token?: string | null, _reward?: null): RewardAddedEventFilter; + RewardAdded(_token?: string | null, _reward?: null): RewardAddedEventFilter; + + 'RewardPaid(address,address,uint256)'( + _user?: string | null, + _rewardsToken?: string | null, + _reward?: null, + ): RewardPaidEventFilter; + RewardPaid(_user?: string | null, _rewardsToken?: string | null, _reward?: null): RewardPaidEventFilter; + + 'Shutdown()'(): ShutdownEventFilter; + Shutdown(): ShutdownEventFilter; + + 'Staked(address,uint256,uint256)'( + _user?: string | null, + _paidAmount?: null, + _lockedAmount?: null, + ): StakedEventFilter; + Staked(_user?: string | null, _paidAmount?: null, _lockedAmount?: null): StakedEventFilter; + + 'Withdrawn(address,uint256,bool)'(_user?: string | null, _amount?: null, _relocked?: null): WithdrawnEventFilter; + Withdrawn(_user?: string | null, _amount?: null, _relocked?: null): WithdrawnEventFilter; + }; + + estimateGas: { + addReward( + _rewardsToken: string, + _distributor: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + approveRewardDistributor( + _rewardsToken: string, + _distributor: string, + _approved: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + balanceAtEpochOf(_epoch: BigNumberish, _user: string, overrides?: CallOverrides): Promise; + + balanceOf(_user: string, overrides?: CallOverrides): Promise; + + balances(arg0: string, overrides?: CallOverrides): Promise; + + blacklist(arg0: string, overrides?: CallOverrides): Promise; + + checkpointEpoch(overrides?: Overrides & { from?: string | Promise }): Promise; + + checkpoints(account: string, pos: BigNumberish, overrides?: CallOverrides): Promise; + + claimableRewards(_account: string, overrides?: CallOverrides): Promise; + + cvxCrv(overrides?: CallOverrides): Promise; + + cvxcrvStaking(overrides?: CallOverrides): Promise; + + decimals(overrides?: CallOverrides): Promise; + + delegate(newDelegatee: string, overrides?: Overrides & { from?: string | Promise }): Promise; + + delegateeUnlocks(arg0: string, arg1: BigNumberish, overrides?: CallOverrides): Promise; + + delegates(account: string, overrides?: CallOverrides): Promise; + + denominator(overrides?: CallOverrides): Promise; + + emergencyWithdraw(overrides?: Overrides & { from?: string | Promise }): Promise; + + epochCount(overrides?: CallOverrides): Promise; + + epochs(arg0: BigNumberish, overrides?: CallOverrides): Promise; + + findEpochId(_time: BigNumberish, overrides?: CallOverrides): Promise; + + getPastTotalSupply(timestamp: BigNumberish, overrides?: CallOverrides): Promise; + + getPastVotes(account: string, timestamp: BigNumberish, overrides?: CallOverrides): Promise; + + 'getReward(address,bool)'( + _account: string, + _stake: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + 'getReward(address)'( + _account: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + 'getReward(address,bool[])'( + _account: string, + _skipIdx: boolean[], + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + getVotes(account: string, overrides?: CallOverrides): Promise; + + isShutdown(overrides?: CallOverrides): Promise; + + kickExpiredLocks(_account: string, overrides?: Overrides & { from?: string | Promise }): Promise; + + kickRewardEpochDelay(overrides?: CallOverrides): Promise; + + kickRewardPerEpoch(overrides?: CallOverrides): Promise; + + lastTimeRewardApplicable(_rewardsToken: string, overrides?: CallOverrides): Promise; + + lock( + _account: string, + _amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + lockDuration(overrides?: CallOverrides): Promise; + + lockedBalances(_user: string, overrides?: CallOverrides): Promise; + + lockedSupply(overrides?: CallOverrides): Promise; + + modifyBlacklist( + _account: string, + _blacklisted: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + name(overrides?: CallOverrides): Promise; + + newRewardRatio(overrides?: CallOverrides): Promise; + + numCheckpoints(account: string, overrides?: CallOverrides): Promise; + + owner(overrides?: CallOverrides): Promise; + + processExpiredLocks( + _relock: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + queueNewRewards( + _rewardsToken: string, + _rewards: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + queuedRewards(arg0: string, overrides?: CallOverrides): Promise; + + recoverERC20( + _tokenAddress: string, + _tokenAmount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + renounceOwnership(overrides?: Overrides & { from?: string | Promise }): Promise; + + rewardData(arg0: string, overrides?: CallOverrides): Promise; + + rewardDistributors(arg0: string, arg1: string, overrides?: CallOverrides): Promise; + + rewardPerToken(_rewardsToken: string, overrides?: CallOverrides): Promise; + + rewardTokens(arg0: BigNumberish, overrides?: CallOverrides): Promise; + + rewardsDuration(overrides?: CallOverrides): Promise; + + setApprovals(overrides?: Overrides & { from?: string | Promise }): Promise; + + setKickIncentive( + _rate: BigNumberish, + _delay: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + shutdown(overrides?: Overrides & { from?: string | Promise }): Promise; + + stakingToken(overrides?: CallOverrides): Promise; + + symbol(overrides?: CallOverrides): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + totalSupplyAtEpoch(_epoch: BigNumberish, overrides?: CallOverrides): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + userData(arg0: string, arg1: string, overrides?: CallOverrides): Promise; + + userLocks(arg0: string, arg1: BigNumberish, overrides?: CallOverrides): Promise; + }; + + populateTransaction: { + addReward( + _rewardsToken: string, + _distributor: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + approveRewardDistributor( + _rewardsToken: string, + _distributor: string, + _approved: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + balanceAtEpochOf(_epoch: BigNumberish, _user: string, overrides?: CallOverrides): Promise; + + balanceOf(_user: string, overrides?: CallOverrides): Promise; + + balances(arg0: string, overrides?: CallOverrides): Promise; + + blacklist(arg0: string, overrides?: CallOverrides): Promise; + + checkpointEpoch(overrides?: Overrides & { from?: string | Promise }): Promise; + + checkpoints(account: string, pos: BigNumberish, overrides?: CallOverrides): Promise; + + claimableRewards(_account: string, overrides?: CallOverrides): Promise; + + cvxCrv(overrides?: CallOverrides): Promise; + + cvxcrvStaking(overrides?: CallOverrides): Promise; + + decimals(overrides?: CallOverrides): Promise; + + delegate( + newDelegatee: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + delegateeUnlocks(arg0: string, arg1: BigNumberish, overrides?: CallOverrides): Promise; + + delegates(account: string, overrides?: CallOverrides): Promise; + + denominator(overrides?: CallOverrides): Promise; + + emergencyWithdraw(overrides?: Overrides & { from?: string | Promise }): Promise; + + epochCount(overrides?: CallOverrides): Promise; + + epochs(arg0: BigNumberish, overrides?: CallOverrides): Promise; + + findEpochId(_time: BigNumberish, overrides?: CallOverrides): Promise; + + getPastTotalSupply(timestamp: BigNumberish, overrides?: CallOverrides): Promise; + + getPastVotes(account: string, timestamp: BigNumberish, overrides?: CallOverrides): Promise; + + 'getReward(address,bool)'( + _account: string, + _stake: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + 'getReward(address)'( + _account: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + 'getReward(address,bool[])'( + _account: string, + _skipIdx: boolean[], + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + getVotes(account: string, overrides?: CallOverrides): Promise; + + isShutdown(overrides?: CallOverrides): Promise; + + kickExpiredLocks( + _account: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + kickRewardEpochDelay(overrides?: CallOverrides): Promise; + + kickRewardPerEpoch(overrides?: CallOverrides): Promise; + + lastTimeRewardApplicable(_rewardsToken: string, overrides?: CallOverrides): Promise; + + lock( + _account: string, + _amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + lockDuration(overrides?: CallOverrides): Promise; + + lockedBalances(_user: string, overrides?: CallOverrides): Promise; + + lockedSupply(overrides?: CallOverrides): Promise; + + modifyBlacklist( + _account: string, + _blacklisted: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + name(overrides?: CallOverrides): Promise; + + newRewardRatio(overrides?: CallOverrides): Promise; + + numCheckpoints(account: string, overrides?: CallOverrides): Promise; + + owner(overrides?: CallOverrides): Promise; + + processExpiredLocks( + _relock: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + queueNewRewards( + _rewardsToken: string, + _rewards: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + queuedRewards(arg0: string, overrides?: CallOverrides): Promise; + + recoverERC20( + _tokenAddress: string, + _tokenAmount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + renounceOwnership(overrides?: Overrides & { from?: string | Promise }): Promise; + + rewardData(arg0: string, overrides?: CallOverrides): Promise; + + rewardDistributors(arg0: string, arg1: string, overrides?: CallOverrides): Promise; + + rewardPerToken(_rewardsToken: string, overrides?: CallOverrides): Promise; + + rewardTokens(arg0: BigNumberish, overrides?: CallOverrides): Promise; + + rewardsDuration(overrides?: CallOverrides): Promise; + + setApprovals(overrides?: Overrides & { from?: string | Promise }): Promise; + + setKickIncentive( + _rate: BigNumberish, + _delay: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + shutdown(overrides?: Overrides & { from?: string | Promise }): Promise; + + stakingToken(overrides?: CallOverrides): Promise; + + symbol(overrides?: CallOverrides): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + totalSupplyAtEpoch(_epoch: BigNumberish, overrides?: CallOverrides): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + userData(arg0: string, arg1: string, overrides?: CallOverrides): Promise; + + userLocks(arg0: string, arg1: BigNumberish, overrides?: CallOverrides): Promise; + }; +} diff --git a/src/apps/aura/contracts/ethers/AuraMasterchef.ts b/src/apps/aura/contracts/ethers/AuraMasterchef.ts new file mode 100644 index 000000000..3ed2760af --- /dev/null +++ b/src/apps/aura/contracts/ethers/AuraMasterchef.ts @@ -0,0 +1,652 @@ +/* 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 interface AuraMasterchefInterface extends utils.Interface { + functions: { + 'BONUS_MULTIPLIER()': FunctionFragment; + 'add(uint256,address,address)': FunctionFragment; + 'claim(uint256,address)': FunctionFragment; + 'cvx()': FunctionFragment; + 'deposit(uint256,uint256)': FunctionFragment; + 'emergencyWithdraw(uint256)': FunctionFragment; + 'endBlock()': FunctionFragment; + 'getMultiplier(uint256,uint256)': FunctionFragment; + 'isAddedPool(address)': FunctionFragment; + 'massUpdatePools()': FunctionFragment; + 'owner()': FunctionFragment; + 'pendingCvx(uint256,address)': FunctionFragment; + 'poolInfo(uint256)': FunctionFragment; + 'poolLength()': FunctionFragment; + 'renounceOwnership()': FunctionFragment; + 'rewardPerBlock()': FunctionFragment; + 'set(uint256,uint256,address,bool)': FunctionFragment; + 'startBlock()': FunctionFragment; + 'totalAllocPoint()': FunctionFragment; + 'transferOwnership(address)': FunctionFragment; + 'updatePool(uint256)': FunctionFragment; + 'userInfo(uint256,address)': FunctionFragment; + 'withdraw(uint256,uint256)': FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | 'BONUS_MULTIPLIER' + | 'add' + | 'claim' + | 'cvx' + | 'deposit' + | 'emergencyWithdraw' + | 'endBlock' + | 'getMultiplier' + | 'isAddedPool' + | 'massUpdatePools' + | 'owner' + | 'pendingCvx' + | 'poolInfo' + | 'poolLength' + | 'renounceOwnership' + | 'rewardPerBlock' + | 'set' + | 'startBlock' + | 'totalAllocPoint' + | 'transferOwnership' + | 'updatePool' + | 'userInfo' + | 'withdraw', + ): FunctionFragment; + + encodeFunctionData(functionFragment: 'BONUS_MULTIPLIER', values?: undefined): string; + encodeFunctionData(functionFragment: 'add', values: [BigNumberish, string, string]): string; + encodeFunctionData(functionFragment: 'claim', values: [BigNumberish, string]): string; + encodeFunctionData(functionFragment: 'cvx', values?: undefined): string; + encodeFunctionData(functionFragment: 'deposit', values: [BigNumberish, BigNumberish]): string; + encodeFunctionData(functionFragment: 'emergencyWithdraw', values: [BigNumberish]): string; + encodeFunctionData(functionFragment: 'endBlock', values?: undefined): string; + encodeFunctionData(functionFragment: 'getMultiplier', values: [BigNumberish, BigNumberish]): string; + encodeFunctionData(functionFragment: 'isAddedPool', values: [string]): string; + encodeFunctionData(functionFragment: 'massUpdatePools', values?: undefined): string; + encodeFunctionData(functionFragment: 'owner', values?: undefined): string; + encodeFunctionData(functionFragment: 'pendingCvx', values: [BigNumberish, string]): string; + encodeFunctionData(functionFragment: 'poolInfo', values: [BigNumberish]): string; + encodeFunctionData(functionFragment: 'poolLength', values?: undefined): string; + encodeFunctionData(functionFragment: 'renounceOwnership', values?: undefined): string; + encodeFunctionData(functionFragment: 'rewardPerBlock', values?: undefined): string; + encodeFunctionData(functionFragment: 'set', values: [BigNumberish, BigNumberish, string, boolean]): string; + encodeFunctionData(functionFragment: 'startBlock', values?: undefined): string; + encodeFunctionData(functionFragment: 'totalAllocPoint', values?: undefined): string; + encodeFunctionData(functionFragment: 'transferOwnership', values: [string]): string; + encodeFunctionData(functionFragment: 'updatePool', values: [BigNumberish]): string; + encodeFunctionData(functionFragment: 'userInfo', values: [BigNumberish, string]): string; + encodeFunctionData(functionFragment: 'withdraw', values: [BigNumberish, BigNumberish]): string; + + decodeFunctionResult(functionFragment: 'BONUS_MULTIPLIER', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'add', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'claim', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'cvx', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'deposit', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'emergencyWithdraw', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'endBlock', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'getMultiplier', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'isAddedPool', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'massUpdatePools', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'owner', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'pendingCvx', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'poolInfo', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'poolLength', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'renounceOwnership', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'rewardPerBlock', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'set', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'startBlock', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'totalAllocPoint', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'transferOwnership', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'updatePool', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'userInfo', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'withdraw', data: BytesLike): Result; + + events: { + 'Deposit(address,uint256,uint256)': EventFragment; + 'EmergencyWithdraw(address,uint256,uint256)': EventFragment; + 'OwnershipTransferred(address,address)': EventFragment; + 'RewardPaid(address,uint256,uint256)': EventFragment; + 'Withdraw(address,uint256,uint256)': EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: 'Deposit'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'EmergencyWithdraw'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'OwnershipTransferred'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'RewardPaid'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'Withdraw'): EventFragment; +} + +export interface DepositEventObject { + user: string; + pid: BigNumber; + amount: BigNumber; +} +export type DepositEvent = TypedEvent<[string, BigNumber, BigNumber], DepositEventObject>; + +export type DepositEventFilter = TypedEventFilter; + +export interface EmergencyWithdrawEventObject { + user: string; + pid: BigNumber; + amount: BigNumber; +} +export type EmergencyWithdrawEvent = TypedEvent<[string, BigNumber, BigNumber], EmergencyWithdrawEventObject>; + +export type EmergencyWithdrawEventFilter = TypedEventFilter; + +export interface OwnershipTransferredEventObject { + previousOwner: string; + newOwner: string; +} +export type OwnershipTransferredEvent = TypedEvent<[string, string], OwnershipTransferredEventObject>; + +export type OwnershipTransferredEventFilter = TypedEventFilter; + +export interface RewardPaidEventObject { + user: string; + pid: BigNumber; + amount: BigNumber; +} +export type RewardPaidEvent = TypedEvent<[string, BigNumber, BigNumber], RewardPaidEventObject>; + +export type RewardPaidEventFilter = TypedEventFilter; + +export interface WithdrawEventObject { + user: string; + pid: BigNumber; + amount: BigNumber; +} +export type WithdrawEvent = TypedEvent<[string, BigNumber, BigNumber], WithdrawEventObject>; + +export type WithdrawEventFilter = TypedEventFilter; + +export interface AuraMasterchef extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: AuraMasterchefInterface; + + 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: { + BONUS_MULTIPLIER(overrides?: CallOverrides): Promise<[BigNumber]>; + + add( + _allocPoint: BigNumberish, + _lpToken: string, + _rewarder: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + claim( + _pid: BigNumberish, + _account: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + cvx(overrides?: CallOverrides): Promise<[string]>; + + deposit( + _pid: BigNumberish, + _amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + emergencyWithdraw( + _pid: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + endBlock(overrides?: CallOverrides): Promise<[BigNumber]>; + + getMultiplier(_from: BigNumberish, _to: BigNumberish, overrides?: CallOverrides): Promise<[BigNumber]>; + + isAddedPool(arg0: string, overrides?: CallOverrides): Promise<[boolean]>; + + massUpdatePools(overrides?: Overrides & { from?: string | Promise }): Promise; + + owner(overrides?: CallOverrides): Promise<[string]>; + + pendingCvx(_pid: BigNumberish, _user: string, overrides?: CallOverrides): Promise<[BigNumber]>; + + poolInfo( + arg0: BigNumberish, + overrides?: CallOverrides, + ): Promise< + [string, BigNumber, BigNumber, BigNumber, string] & { + lpToken: string; + allocPoint: BigNumber; + lastRewardBlock: BigNumber; + accCvxPerShare: BigNumber; + rewarder: string; + } + >; + + poolLength(overrides?: CallOverrides): Promise<[BigNumber]>; + + renounceOwnership(overrides?: Overrides & { from?: string | Promise }): Promise; + + rewardPerBlock(overrides?: CallOverrides): Promise<[BigNumber]>; + + set( + _pid: BigNumberish, + _allocPoint: BigNumberish, + _rewarder: string, + _updateRewarder: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + startBlock(overrides?: CallOverrides): Promise<[BigNumber]>; + + totalAllocPoint(overrides?: CallOverrides): Promise<[BigNumber]>; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + updatePool( + _pid: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + userInfo( + arg0: BigNumberish, + arg1: string, + overrides?: CallOverrides, + ): Promise<[BigNumber, BigNumber] & { amount: BigNumber; rewardDebt: BigNumber }>; + + withdraw( + _pid: BigNumberish, + _amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + }; + + BONUS_MULTIPLIER(overrides?: CallOverrides): Promise; + + add( + _allocPoint: BigNumberish, + _lpToken: string, + _rewarder: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + claim( + _pid: BigNumberish, + _account: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + cvx(overrides?: CallOverrides): Promise; + + deposit( + _pid: BigNumberish, + _amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + emergencyWithdraw( + _pid: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + endBlock(overrides?: CallOverrides): Promise; + + getMultiplier(_from: BigNumberish, _to: BigNumberish, overrides?: CallOverrides): Promise; + + isAddedPool(arg0: string, overrides?: CallOverrides): Promise; + + massUpdatePools(overrides?: Overrides & { from?: string | Promise }): Promise; + + owner(overrides?: CallOverrides): Promise; + + pendingCvx(_pid: BigNumberish, _user: string, overrides?: CallOverrides): Promise; + + poolInfo( + arg0: BigNumberish, + overrides?: CallOverrides, + ): Promise< + [string, BigNumber, BigNumber, BigNumber, string] & { + lpToken: string; + allocPoint: BigNumber; + lastRewardBlock: BigNumber; + accCvxPerShare: BigNumber; + rewarder: string; + } + >; + + poolLength(overrides?: CallOverrides): Promise; + + renounceOwnership(overrides?: Overrides & { from?: string | Promise }): Promise; + + rewardPerBlock(overrides?: CallOverrides): Promise; + + set( + _pid: BigNumberish, + _allocPoint: BigNumberish, + _rewarder: string, + _updateRewarder: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + startBlock(overrides?: CallOverrides): Promise; + + totalAllocPoint(overrides?: CallOverrides): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + updatePool( + _pid: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + userInfo( + arg0: BigNumberish, + arg1: string, + overrides?: CallOverrides, + ): Promise<[BigNumber, BigNumber] & { amount: BigNumber; rewardDebt: BigNumber }>; + + withdraw( + _pid: BigNumberish, + _amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + callStatic: { + BONUS_MULTIPLIER(overrides?: CallOverrides): Promise; + + add(_allocPoint: BigNumberish, _lpToken: string, _rewarder: string, overrides?: CallOverrides): Promise; + + claim(_pid: BigNumberish, _account: string, overrides?: CallOverrides): Promise; + + cvx(overrides?: CallOverrides): Promise; + + deposit(_pid: BigNumberish, _amount: BigNumberish, overrides?: CallOverrides): Promise; + + emergencyWithdraw(_pid: BigNumberish, overrides?: CallOverrides): Promise; + + endBlock(overrides?: CallOverrides): Promise; + + getMultiplier(_from: BigNumberish, _to: BigNumberish, overrides?: CallOverrides): Promise; + + isAddedPool(arg0: string, overrides?: CallOverrides): Promise; + + massUpdatePools(overrides?: CallOverrides): Promise; + + owner(overrides?: CallOverrides): Promise; + + pendingCvx(_pid: BigNumberish, _user: string, overrides?: CallOverrides): Promise; + + poolInfo( + arg0: BigNumberish, + overrides?: CallOverrides, + ): Promise< + [string, BigNumber, BigNumber, BigNumber, string] & { + lpToken: string; + allocPoint: BigNumber; + lastRewardBlock: BigNumber; + accCvxPerShare: BigNumber; + rewarder: string; + } + >; + + poolLength(overrides?: CallOverrides): Promise; + + renounceOwnership(overrides?: CallOverrides): Promise; + + rewardPerBlock(overrides?: CallOverrides): Promise; + + set( + _pid: BigNumberish, + _allocPoint: BigNumberish, + _rewarder: string, + _updateRewarder: boolean, + overrides?: CallOverrides, + ): Promise; + + startBlock(overrides?: CallOverrides): Promise; + + totalAllocPoint(overrides?: CallOverrides): Promise; + + transferOwnership(newOwner: string, overrides?: CallOverrides): Promise; + + updatePool(_pid: BigNumberish, overrides?: CallOverrides): Promise; + + userInfo( + arg0: BigNumberish, + arg1: string, + overrides?: CallOverrides, + ): Promise<[BigNumber, BigNumber] & { amount: BigNumber; rewardDebt: BigNumber }>; + + withdraw(_pid: BigNumberish, _amount: BigNumberish, overrides?: CallOverrides): Promise; + }; + + filters: { + 'Deposit(address,uint256,uint256)'( + user?: string | null, + pid?: BigNumberish | null, + amount?: null, + ): DepositEventFilter; + Deposit(user?: string | null, pid?: BigNumberish | null, amount?: null): DepositEventFilter; + + 'EmergencyWithdraw(address,uint256,uint256)'( + user?: string | null, + pid?: BigNumberish | null, + amount?: null, + ): EmergencyWithdrawEventFilter; + EmergencyWithdraw(user?: string | null, pid?: BigNumberish | null, amount?: null): EmergencyWithdrawEventFilter; + + 'OwnershipTransferred(address,address)'( + previousOwner?: string | null, + newOwner?: string | null, + ): OwnershipTransferredEventFilter; + OwnershipTransferred(previousOwner?: string | null, newOwner?: string | null): OwnershipTransferredEventFilter; + + 'RewardPaid(address,uint256,uint256)'( + user?: string | null, + pid?: BigNumberish | null, + amount?: null, + ): RewardPaidEventFilter; + RewardPaid(user?: string | null, pid?: BigNumberish | null, amount?: null): RewardPaidEventFilter; + + 'Withdraw(address,uint256,uint256)'( + user?: string | null, + pid?: BigNumberish | null, + amount?: null, + ): WithdrawEventFilter; + Withdraw(user?: string | null, pid?: BigNumberish | null, amount?: null): WithdrawEventFilter; + }; + + estimateGas: { + BONUS_MULTIPLIER(overrides?: CallOverrides): Promise; + + add( + _allocPoint: BigNumberish, + _lpToken: string, + _rewarder: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + claim( + _pid: BigNumberish, + _account: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + cvx(overrides?: CallOverrides): Promise; + + deposit( + _pid: BigNumberish, + _amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + emergencyWithdraw( + _pid: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + endBlock(overrides?: CallOverrides): Promise; + + getMultiplier(_from: BigNumberish, _to: BigNumberish, overrides?: CallOverrides): Promise; + + isAddedPool(arg0: string, overrides?: CallOverrides): Promise; + + massUpdatePools(overrides?: Overrides & { from?: string | Promise }): Promise; + + owner(overrides?: CallOverrides): Promise; + + pendingCvx(_pid: BigNumberish, _user: string, overrides?: CallOverrides): Promise; + + poolInfo(arg0: BigNumberish, overrides?: CallOverrides): Promise; + + poolLength(overrides?: CallOverrides): Promise; + + renounceOwnership(overrides?: Overrides & { from?: string | Promise }): Promise; + + rewardPerBlock(overrides?: CallOverrides): Promise; + + set( + _pid: BigNumberish, + _allocPoint: BigNumberish, + _rewarder: string, + _updateRewarder: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + startBlock(overrides?: CallOverrides): Promise; + + totalAllocPoint(overrides?: CallOverrides): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + updatePool(_pid: BigNumberish, overrides?: Overrides & { from?: string | Promise }): Promise; + + userInfo(arg0: BigNumberish, arg1: string, overrides?: CallOverrides): Promise; + + withdraw( + _pid: BigNumberish, + _amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + }; + + populateTransaction: { + BONUS_MULTIPLIER(overrides?: CallOverrides): Promise; + + add( + _allocPoint: BigNumberish, + _lpToken: string, + _rewarder: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + claim( + _pid: BigNumberish, + _account: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + cvx(overrides?: CallOverrides): Promise; + + deposit( + _pid: BigNumberish, + _amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + emergencyWithdraw( + _pid: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + endBlock(overrides?: CallOverrides): Promise; + + getMultiplier(_from: BigNumberish, _to: BigNumberish, overrides?: CallOverrides): Promise; + + isAddedPool(arg0: string, overrides?: CallOverrides): Promise; + + massUpdatePools(overrides?: Overrides & { from?: string | Promise }): Promise; + + owner(overrides?: CallOverrides): Promise; + + pendingCvx(_pid: BigNumberish, _user: string, overrides?: CallOverrides): Promise; + + poolInfo(arg0: BigNumberish, overrides?: CallOverrides): Promise; + + poolLength(overrides?: CallOverrides): Promise; + + renounceOwnership(overrides?: Overrides & { from?: string | Promise }): Promise; + + rewardPerBlock(overrides?: CallOverrides): Promise; + + set( + _pid: BigNumberish, + _allocPoint: BigNumberish, + _rewarder: string, + _updateRewarder: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + startBlock(overrides?: CallOverrides): Promise; + + totalAllocPoint(overrides?: CallOverrides): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + updatePool( + _pid: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + userInfo(arg0: BigNumberish, arg1: string, overrides?: CallOverrides): Promise; + + withdraw( + _pid: BigNumberish, + _amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + }; +} diff --git a/src/apps/aura/contracts/ethers/AuraToken.ts b/src/apps/aura/contracts/ethers/AuraToken.ts new file mode 100644 index 000000000..0fcc91f39 --- /dev/null +++ b/src/apps/aura/contracts/ethers/AuraToken.ts @@ -0,0 +1,560 @@ +/* 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 interface AuraTokenInterface extends utils.Interface { + functions: { + 'EMISSIONS_MAX_SUPPLY()': FunctionFragment; + 'INIT_MINT_AMOUNT()': FunctionFragment; + 'allowance(address,address)': FunctionFragment; + 'approve(address,uint256)': FunctionFragment; + 'balanceOf(address)': FunctionFragment; + 'decimals()': FunctionFragment; + 'decreaseAllowance(address,uint256)': FunctionFragment; + 'increaseAllowance(address,uint256)': FunctionFragment; + 'init(address,address)': FunctionFragment; + 'mint(address,uint256)': FunctionFragment; + 'minter()': FunctionFragment; + 'minterMint(address,uint256)': FunctionFragment; + 'name()': FunctionFragment; + 'operator()': FunctionFragment; + 'reductionPerCliff()': FunctionFragment; + 'symbol()': FunctionFragment; + 'totalCliffs()': FunctionFragment; + 'totalSupply()': FunctionFragment; + 'transfer(address,uint256)': FunctionFragment; + 'transferFrom(address,address,uint256)': FunctionFragment; + 'updateOperator()': FunctionFragment; + 'vecrvProxy()': FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | 'EMISSIONS_MAX_SUPPLY' + | 'INIT_MINT_AMOUNT' + | 'allowance' + | 'approve' + | 'balanceOf' + | 'decimals' + | 'decreaseAllowance' + | 'increaseAllowance' + | 'init' + | 'mint' + | 'minter' + | 'minterMint' + | 'name' + | 'operator' + | 'reductionPerCliff' + | 'symbol' + | 'totalCliffs' + | 'totalSupply' + | 'transfer' + | 'transferFrom' + | 'updateOperator' + | 'vecrvProxy', + ): FunctionFragment; + + encodeFunctionData(functionFragment: 'EMISSIONS_MAX_SUPPLY', values?: undefined): string; + encodeFunctionData(functionFragment: 'INIT_MINT_AMOUNT', 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: 'decreaseAllowance', values: [string, BigNumberish]): string; + encodeFunctionData(functionFragment: 'increaseAllowance', values: [string, BigNumberish]): string; + encodeFunctionData(functionFragment: 'init', values: [string, string]): string; + encodeFunctionData(functionFragment: 'mint', values: [string, BigNumberish]): string; + encodeFunctionData(functionFragment: 'minter', values?: undefined): string; + encodeFunctionData(functionFragment: 'minterMint', values: [string, BigNumberish]): string; + encodeFunctionData(functionFragment: 'name', values?: undefined): string; + encodeFunctionData(functionFragment: 'operator', values?: undefined): string; + encodeFunctionData(functionFragment: 'reductionPerCliff', values?: undefined): string; + encodeFunctionData(functionFragment: 'symbol', values?: undefined): string; + encodeFunctionData(functionFragment: 'totalCliffs', values?: undefined): string; + encodeFunctionData(functionFragment: 'totalSupply', values?: undefined): string; + encodeFunctionData(functionFragment: 'transfer', values: [string, BigNumberish]): string; + encodeFunctionData(functionFragment: 'transferFrom', values: [string, string, BigNumberish]): string; + encodeFunctionData(functionFragment: 'updateOperator', values?: undefined): string; + encodeFunctionData(functionFragment: 'vecrvProxy', values?: undefined): string; + + decodeFunctionResult(functionFragment: 'EMISSIONS_MAX_SUPPLY', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'INIT_MINT_AMOUNT', 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: 'decreaseAllowance', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'increaseAllowance', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'init', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'mint', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'minter', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'minterMint', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'name', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'operator', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'reductionPerCliff', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'symbol', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'totalCliffs', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'totalSupply', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'transfer', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'transferFrom', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'updateOperator', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'vecrvProxy', data: BytesLike): Result; + + events: { + 'Approval(address,address,uint256)': EventFragment; + 'Initialised()': EventFragment; + 'OperatorChanged(address,address)': EventFragment; + 'Transfer(address,address,uint256)': EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: 'Approval'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'Initialised'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'OperatorChanged'): 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 InitialisedEventObject {} +export type InitialisedEvent = TypedEvent<[], InitialisedEventObject>; + +export type InitialisedEventFilter = TypedEventFilter; + +export interface OperatorChangedEventObject { + previousOperator: string; + newOperator: string; +} +export type OperatorChangedEvent = TypedEvent<[string, string], OperatorChangedEventObject>; + +export type OperatorChangedEventFilter = TypedEventFilter; + +export interface TransferEventObject { + from: string; + to: string; + value: BigNumber; +} +export type TransferEvent = TypedEvent<[string, string, BigNumber], TransferEventObject>; + +export type TransferEventFilter = TypedEventFilter; + +export interface AuraToken extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: AuraTokenInterface; + + 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: { + EMISSIONS_MAX_SUPPLY(overrides?: CallOverrides): Promise<[BigNumber]>; + + INIT_MINT_AMOUNT(overrides?: CallOverrides): Promise<[BigNumber]>; + + 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]>; + + decreaseAllowance( + spender: string, + subtractedValue: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + increaseAllowance( + spender: string, + addedValue: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + init( + _to: string, + _minter: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + mint( + _to: string, + _amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + minter(overrides?: CallOverrides): Promise<[string]>; + + minterMint( + _to: string, + _amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + name(overrides?: CallOverrides): Promise<[string]>; + + operator(overrides?: CallOverrides): Promise<[string]>; + + reductionPerCliff(overrides?: CallOverrides): Promise<[BigNumber]>; + + symbol(overrides?: CallOverrides): Promise<[string]>; + + totalCliffs(overrides?: CallOverrides): Promise<[BigNumber]>; + + 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; + + updateOperator(overrides?: Overrides & { from?: string | Promise }): Promise; + + vecrvProxy(overrides?: CallOverrides): Promise<[string]>; + }; + + EMISSIONS_MAX_SUPPLY(overrides?: CallOverrides): Promise; + + INIT_MINT_AMOUNT(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; + + decreaseAllowance( + spender: string, + subtractedValue: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + increaseAllowance( + spender: string, + addedValue: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + init( + _to: string, + _minter: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + mint( + _to: string, + _amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + minter(overrides?: CallOverrides): Promise; + + minterMint( + _to: string, + _amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + name(overrides?: CallOverrides): Promise; + + operator(overrides?: CallOverrides): Promise; + + reductionPerCliff(overrides?: CallOverrides): Promise; + + symbol(overrides?: CallOverrides): Promise; + + totalCliffs(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; + + updateOperator(overrides?: Overrides & { from?: string | Promise }): Promise; + + vecrvProxy(overrides?: CallOverrides): Promise; + + callStatic: { + EMISSIONS_MAX_SUPPLY(overrides?: CallOverrides): Promise; + + INIT_MINT_AMOUNT(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; + + decreaseAllowance(spender: string, subtractedValue: BigNumberish, overrides?: CallOverrides): Promise; + + increaseAllowance(spender: string, addedValue: BigNumberish, overrides?: CallOverrides): Promise; + + init(_to: string, _minter: string, overrides?: CallOverrides): Promise; + + mint(_to: string, _amount: BigNumberish, overrides?: CallOverrides): Promise; + + minter(overrides?: CallOverrides): Promise; + + minterMint(_to: string, _amount: BigNumberish, overrides?: CallOverrides): Promise; + + name(overrides?: CallOverrides): Promise; + + operator(overrides?: CallOverrides): Promise; + + reductionPerCliff(overrides?: CallOverrides): Promise; + + symbol(overrides?: CallOverrides): Promise; + + totalCliffs(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; + + updateOperator(overrides?: CallOverrides): Promise; + + vecrvProxy(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; + + 'Initialised()'(): InitialisedEventFilter; + Initialised(): InitialisedEventFilter; + + 'OperatorChanged(address,address)'( + previousOperator?: string | null, + newOperator?: string | null, + ): OperatorChangedEventFilter; + OperatorChanged(previousOperator?: string | null, newOperator?: string | null): OperatorChangedEventFilter; + + 'Transfer(address,address,uint256)'(from?: string | null, to?: string | null, value?: null): TransferEventFilter; + Transfer(from?: string | null, to?: string | null, value?: null): TransferEventFilter; + }; + + estimateGas: { + EMISSIONS_MAX_SUPPLY(overrides?: CallOverrides): Promise; + + INIT_MINT_AMOUNT(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; + + decreaseAllowance( + spender: string, + subtractedValue: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + increaseAllowance( + spender: string, + addedValue: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + init(_to: string, _minter: string, overrides?: Overrides & { from?: string | Promise }): Promise; + + mint( + _to: string, + _amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + minter(overrides?: CallOverrides): Promise; + + minterMint( + _to: string, + _amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + name(overrides?: CallOverrides): Promise; + + operator(overrides?: CallOverrides): Promise; + + reductionPerCliff(overrides?: CallOverrides): Promise; + + symbol(overrides?: CallOverrides): Promise; + + totalCliffs(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; + + updateOperator(overrides?: Overrides & { from?: string | Promise }): Promise; + + vecrvProxy(overrides?: CallOverrides): Promise; + }; + + populateTransaction: { + EMISSIONS_MAX_SUPPLY(overrides?: CallOverrides): Promise; + + INIT_MINT_AMOUNT(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; + + decreaseAllowance( + spender: string, + subtractedValue: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + increaseAllowance( + spender: string, + addedValue: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + init( + _to: string, + _minter: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + mint( + _to: string, + _amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + minter(overrides?: CallOverrides): Promise; + + minterMint( + _to: string, + _amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + name(overrides?: CallOverrides): Promise; + + operator(overrides?: CallOverrides): Promise; + + reductionPerCliff(overrides?: CallOverrides): Promise; + + symbol(overrides?: CallOverrides): Promise; + + totalCliffs(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; + + updateOperator(overrides?: Overrides & { from?: string | Promise }): Promise; + + vecrvProxy(overrides?: CallOverrides): Promise; + }; +} diff --git a/src/apps/aura/contracts/ethers/AuraVirtualBalanceRewardPool.ts b/src/apps/aura/contracts/ethers/AuraVirtualBalanceRewardPool.ts new file mode 100644 index 000000000..11523c92c --- /dev/null +++ b/src/apps/aura/contracts/ethers/AuraVirtualBalanceRewardPool.ts @@ -0,0 +1,532 @@ +/* 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 interface AuraVirtualBalanceRewardPoolInterface extends utils.Interface { + functions: { + 'balanceOf(address)': FunctionFragment; + 'currentRewards()': FunctionFragment; + 'deposits()': FunctionFragment; + 'donate(uint256)': FunctionFragment; + 'duration()': FunctionFragment; + 'earned(address)': FunctionFragment; + 'getReward()': FunctionFragment; + 'getReward(address)': FunctionFragment; + 'historicalRewards()': FunctionFragment; + 'lastTimeRewardApplicable()': FunctionFragment; + 'lastUpdateTime()': FunctionFragment; + 'newRewardRatio()': FunctionFragment; + 'operator()': FunctionFragment; + 'periodFinish()': FunctionFragment; + 'queueNewRewards(uint256)': FunctionFragment; + 'queuedRewards()': FunctionFragment; + 'rewardPerToken()': FunctionFragment; + 'rewardPerTokenStored()': FunctionFragment; + 'rewardRate()': FunctionFragment; + 'rewardToken()': FunctionFragment; + 'rewards(address)': FunctionFragment; + 'stake(address,uint256)': FunctionFragment; + 'totalSupply()': FunctionFragment; + 'userRewardPerTokenPaid(address)': FunctionFragment; + 'withdraw(address,uint256)': FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | 'balanceOf' + | 'currentRewards' + | 'deposits' + | 'donate' + | 'duration' + | 'earned' + | 'getReward()' + | 'getReward(address)' + | 'historicalRewards' + | 'lastTimeRewardApplicable' + | 'lastUpdateTime' + | 'newRewardRatio' + | 'operator' + | 'periodFinish' + | 'queueNewRewards' + | 'queuedRewards' + | 'rewardPerToken' + | 'rewardPerTokenStored' + | 'rewardRate' + | 'rewardToken' + | 'rewards' + | 'stake' + | 'totalSupply' + | 'userRewardPerTokenPaid' + | 'withdraw', + ): FunctionFragment; + + encodeFunctionData(functionFragment: 'balanceOf', values: [string]): string; + encodeFunctionData(functionFragment: 'currentRewards', values?: undefined): string; + encodeFunctionData(functionFragment: 'deposits', values?: undefined): string; + encodeFunctionData(functionFragment: 'donate', values: [BigNumberish]): string; + encodeFunctionData(functionFragment: 'duration', values?: undefined): string; + encodeFunctionData(functionFragment: 'earned', values: [string]): string; + encodeFunctionData(functionFragment: 'getReward()', values?: undefined): string; + encodeFunctionData(functionFragment: 'getReward(address)', values: [string]): string; + encodeFunctionData(functionFragment: 'historicalRewards', values?: undefined): string; + encodeFunctionData(functionFragment: 'lastTimeRewardApplicable', values?: undefined): string; + encodeFunctionData(functionFragment: 'lastUpdateTime', values?: undefined): string; + encodeFunctionData(functionFragment: 'newRewardRatio', values?: undefined): string; + encodeFunctionData(functionFragment: 'operator', values?: undefined): string; + encodeFunctionData(functionFragment: 'periodFinish', values?: undefined): string; + encodeFunctionData(functionFragment: 'queueNewRewards', values: [BigNumberish]): string; + encodeFunctionData(functionFragment: 'queuedRewards', values?: undefined): string; + encodeFunctionData(functionFragment: 'rewardPerToken', values?: undefined): string; + encodeFunctionData(functionFragment: 'rewardPerTokenStored', values?: undefined): string; + encodeFunctionData(functionFragment: 'rewardRate', values?: undefined): string; + encodeFunctionData(functionFragment: 'rewardToken', values?: undefined): string; + encodeFunctionData(functionFragment: 'rewards', values: [string]): string; + encodeFunctionData(functionFragment: 'stake', values: [string, BigNumberish]): string; + encodeFunctionData(functionFragment: 'totalSupply', values?: undefined): string; + encodeFunctionData(functionFragment: 'userRewardPerTokenPaid', values: [string]): string; + encodeFunctionData(functionFragment: 'withdraw', values: [string, BigNumberish]): string; + + decodeFunctionResult(functionFragment: 'balanceOf', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'currentRewards', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'deposits', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'donate', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'duration', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'earned', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'getReward()', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'getReward(address)', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'historicalRewards', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'lastTimeRewardApplicable', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'lastUpdateTime', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'newRewardRatio', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'operator', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'periodFinish', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'queueNewRewards', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'queuedRewards', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'rewardPerToken', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'rewardPerTokenStored', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'rewardRate', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'rewardToken', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'rewards', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'stake', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'totalSupply', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'userRewardPerTokenPaid', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'withdraw', data: BytesLike): Result; + + events: { + 'RewardAdded(uint256)': EventFragment; + 'RewardPaid(address,uint256)': EventFragment; + 'Staked(address,uint256)': EventFragment; + 'Withdrawn(address,uint256)': EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: 'RewardAdded'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'RewardPaid'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'Staked'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'Withdrawn'): EventFragment; +} + +export interface RewardAddedEventObject { + reward: BigNumber; +} +export type RewardAddedEvent = TypedEvent<[BigNumber], RewardAddedEventObject>; + +export type RewardAddedEventFilter = TypedEventFilter; + +export interface RewardPaidEventObject { + user: string; + reward: BigNumber; +} +export type RewardPaidEvent = TypedEvent<[string, BigNumber], RewardPaidEventObject>; + +export type RewardPaidEventFilter = TypedEventFilter; + +export interface StakedEventObject { + user: string; + amount: BigNumber; +} +export type StakedEvent = TypedEvent<[string, BigNumber], StakedEventObject>; + +export type StakedEventFilter = TypedEventFilter; + +export interface WithdrawnEventObject { + user: string; + amount: BigNumber; +} +export type WithdrawnEvent = TypedEvent<[string, BigNumber], WithdrawnEventObject>; + +export type WithdrawnEventFilter = TypedEventFilter; + +export interface AuraVirtualBalanceRewardPool extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: AuraVirtualBalanceRewardPoolInterface; + + 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: { + balanceOf(account: string, overrides?: CallOverrides): Promise<[BigNumber]>; + + currentRewards(overrides?: CallOverrides): Promise<[BigNumber]>; + + deposits(overrides?: CallOverrides): Promise<[string]>; + + donate( + _amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + duration(overrides?: CallOverrides): Promise<[BigNumber]>; + + earned(account: string, overrides?: CallOverrides): Promise<[BigNumber]>; + + 'getReward()'(overrides?: Overrides & { from?: string | Promise }): Promise; + + 'getReward(address)'( + _account: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + historicalRewards(overrides?: CallOverrides): Promise<[BigNumber]>; + + lastTimeRewardApplicable(overrides?: CallOverrides): Promise<[BigNumber]>; + + lastUpdateTime(overrides?: CallOverrides): Promise<[BigNumber]>; + + newRewardRatio(overrides?: CallOverrides): Promise<[BigNumber]>; + + operator(overrides?: CallOverrides): Promise<[string]>; + + periodFinish(overrides?: CallOverrides): Promise<[BigNumber]>; + + queueNewRewards( + _rewards: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + queuedRewards(overrides?: CallOverrides): Promise<[BigNumber]>; + + rewardPerToken(overrides?: CallOverrides): Promise<[BigNumber]>; + + rewardPerTokenStored(overrides?: CallOverrides): Promise<[BigNumber]>; + + rewardRate(overrides?: CallOverrides): Promise<[BigNumber]>; + + rewardToken(overrides?: CallOverrides): Promise<[string]>; + + rewards(arg0: string, overrides?: CallOverrides): Promise<[BigNumber]>; + + stake( + _account: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + totalSupply(overrides?: CallOverrides): Promise<[BigNumber]>; + + userRewardPerTokenPaid(arg0: string, overrides?: CallOverrides): Promise<[BigNumber]>; + + withdraw( + _account: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + }; + + balanceOf(account: string, overrides?: CallOverrides): Promise; + + currentRewards(overrides?: CallOverrides): Promise; + + deposits(overrides?: CallOverrides): Promise; + + donate( + _amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + duration(overrides?: CallOverrides): Promise; + + earned(account: string, overrides?: CallOverrides): Promise; + + 'getReward()'(overrides?: Overrides & { from?: string | Promise }): Promise; + + 'getReward(address)'( + _account: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + historicalRewards(overrides?: CallOverrides): Promise; + + lastTimeRewardApplicable(overrides?: CallOverrides): Promise; + + lastUpdateTime(overrides?: CallOverrides): Promise; + + newRewardRatio(overrides?: CallOverrides): Promise; + + operator(overrides?: CallOverrides): Promise; + + periodFinish(overrides?: CallOverrides): Promise; + + queueNewRewards( + _rewards: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + queuedRewards(overrides?: CallOverrides): Promise; + + rewardPerToken(overrides?: CallOverrides): Promise; + + rewardPerTokenStored(overrides?: CallOverrides): Promise; + + rewardRate(overrides?: CallOverrides): Promise; + + rewardToken(overrides?: CallOverrides): Promise; + + rewards(arg0: string, overrides?: CallOverrides): Promise; + + stake( + _account: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + userRewardPerTokenPaid(arg0: string, overrides?: CallOverrides): Promise; + + withdraw( + _account: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + callStatic: { + balanceOf(account: string, overrides?: CallOverrides): Promise; + + currentRewards(overrides?: CallOverrides): Promise; + + deposits(overrides?: CallOverrides): Promise; + + donate(_amount: BigNumberish, overrides?: CallOverrides): Promise; + + duration(overrides?: CallOverrides): Promise; + + earned(account: string, overrides?: CallOverrides): Promise; + + 'getReward()'(overrides?: CallOverrides): Promise; + + 'getReward(address)'(_account: string, overrides?: CallOverrides): Promise; + + historicalRewards(overrides?: CallOverrides): Promise; + + lastTimeRewardApplicable(overrides?: CallOverrides): Promise; + + lastUpdateTime(overrides?: CallOverrides): Promise; + + newRewardRatio(overrides?: CallOverrides): Promise; + + operator(overrides?: CallOverrides): Promise; + + periodFinish(overrides?: CallOverrides): Promise; + + queueNewRewards(_rewards: BigNumberish, overrides?: CallOverrides): Promise; + + queuedRewards(overrides?: CallOverrides): Promise; + + rewardPerToken(overrides?: CallOverrides): Promise; + + rewardPerTokenStored(overrides?: CallOverrides): Promise; + + rewardRate(overrides?: CallOverrides): Promise; + + rewardToken(overrides?: CallOverrides): Promise; + + rewards(arg0: string, overrides?: CallOverrides): Promise; + + stake(_account: string, amount: BigNumberish, overrides?: CallOverrides): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + userRewardPerTokenPaid(arg0: string, overrides?: CallOverrides): Promise; + + withdraw(_account: string, amount: BigNumberish, overrides?: CallOverrides): Promise; + }; + + filters: { + 'RewardAdded(uint256)'(reward?: null): RewardAddedEventFilter; + RewardAdded(reward?: null): RewardAddedEventFilter; + + 'RewardPaid(address,uint256)'(user?: string | null, reward?: null): RewardPaidEventFilter; + RewardPaid(user?: string | null, reward?: null): RewardPaidEventFilter; + + 'Staked(address,uint256)'(user?: string | null, amount?: null): StakedEventFilter; + Staked(user?: string | null, amount?: null): StakedEventFilter; + + 'Withdrawn(address,uint256)'(user?: string | null, amount?: null): WithdrawnEventFilter; + Withdrawn(user?: string | null, amount?: null): WithdrawnEventFilter; + }; + + estimateGas: { + balanceOf(account: string, overrides?: CallOverrides): Promise; + + currentRewards(overrides?: CallOverrides): Promise; + + deposits(overrides?: CallOverrides): Promise; + + donate(_amount: BigNumberish, overrides?: Overrides & { from?: string | Promise }): Promise; + + duration(overrides?: CallOverrides): Promise; + + earned(account: string, overrides?: CallOverrides): Promise; + + 'getReward()'(overrides?: Overrides & { from?: string | Promise }): Promise; + + 'getReward(address)'( + _account: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + historicalRewards(overrides?: CallOverrides): Promise; + + lastTimeRewardApplicable(overrides?: CallOverrides): Promise; + + lastUpdateTime(overrides?: CallOverrides): Promise; + + newRewardRatio(overrides?: CallOverrides): Promise; + + operator(overrides?: CallOverrides): Promise; + + periodFinish(overrides?: CallOverrides): Promise; + + queueNewRewards( + _rewards: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + queuedRewards(overrides?: CallOverrides): Promise; + + rewardPerToken(overrides?: CallOverrides): Promise; + + rewardPerTokenStored(overrides?: CallOverrides): Promise; + + rewardRate(overrides?: CallOverrides): Promise; + + rewardToken(overrides?: CallOverrides): Promise; + + rewards(arg0: string, overrides?: CallOverrides): Promise; + + stake( + _account: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + userRewardPerTokenPaid(arg0: string, overrides?: CallOverrides): Promise; + + withdraw( + _account: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + }; + + populateTransaction: { + balanceOf(account: string, overrides?: CallOverrides): Promise; + + currentRewards(overrides?: CallOverrides): Promise; + + deposits(overrides?: CallOverrides): Promise; + + donate( + _amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + duration(overrides?: CallOverrides): Promise; + + earned(account: string, overrides?: CallOverrides): Promise; + + 'getReward()'(overrides?: Overrides & { from?: string | Promise }): Promise; + + 'getReward(address)'( + _account: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + historicalRewards(overrides?: CallOverrides): Promise; + + lastTimeRewardApplicable(overrides?: CallOverrides): Promise; + + lastUpdateTime(overrides?: CallOverrides): Promise; + + newRewardRatio(overrides?: CallOverrides): Promise; + + operator(overrides?: CallOverrides): Promise; + + periodFinish(overrides?: CallOverrides): Promise; + + queueNewRewards( + _rewards: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + queuedRewards(overrides?: CallOverrides): Promise; + + rewardPerToken(overrides?: CallOverrides): Promise; + + rewardPerTokenStored(overrides?: CallOverrides): Promise; + + rewardRate(overrides?: CallOverrides): Promise; + + rewardToken(overrides?: CallOverrides): Promise; + + rewards(arg0: string, overrides?: CallOverrides): Promise; + + stake( + _account: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + userRewardPerTokenPaid(arg0: string, overrides?: CallOverrides): Promise; + + withdraw( + _account: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + }; +} diff --git a/src/apps/aura/contracts/ethers/BalancerHelpers.ts b/src/apps/aura/contracts/ethers/BalancerHelpers.ts new file mode 100644 index 000000000..b1ed91a15 --- /dev/null +++ b/src/apps/aura/contracts/ethers/BalancerHelpers.ts @@ -0,0 +1,197 @@ +/* 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 } from '@ethersproject/abi'; +import type { Listener, Provider } from '@ethersproject/providers'; +import type { TypedEventFilter, TypedEvent, TypedListener, OnEvent } from './common'; + +export declare namespace IVault { + 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 interface BalancerHelpersInterface extends utils.Interface { + functions: { + 'queryExit(bytes32,address,address,(address[],uint256[],bytes,bool))': FunctionFragment; + 'queryJoin(bytes32,address,address,(address[],uint256[],bytes,bool))': FunctionFragment; + 'vault()': FunctionFragment; + }; + + getFunction(nameOrSignatureOrTopic: 'queryExit' | 'queryJoin' | 'vault'): FunctionFragment; + + encodeFunctionData( + functionFragment: 'queryExit', + values: [BytesLike, string, string, IVault.ExitPoolRequestStruct], + ): string; + encodeFunctionData( + functionFragment: 'queryJoin', + values: [BytesLike, string, string, IVault.JoinPoolRequestStruct], + ): string; + encodeFunctionData(functionFragment: 'vault', values?: undefined): string; + + decodeFunctionResult(functionFragment: 'queryExit', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'queryJoin', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'vault', data: BytesLike): Result; + + events: {}; +} + +export interface BalancerHelpers extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: BalancerHelpersInterface; + + 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: { + queryExit( + poolId: BytesLike, + sender: string, + recipient: string, + request: IVault.ExitPoolRequestStruct, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + queryJoin( + poolId: BytesLike, + sender: string, + recipient: string, + request: IVault.JoinPoolRequestStruct, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + vault(overrides?: CallOverrides): Promise<[string]>; + }; + + queryExit( + poolId: BytesLike, + sender: string, + recipient: string, + request: IVault.ExitPoolRequestStruct, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + queryJoin( + poolId: BytesLike, + sender: string, + recipient: string, + request: IVault.JoinPoolRequestStruct, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + vault(overrides?: CallOverrides): Promise; + + callStatic: { + queryExit( + poolId: BytesLike, + sender: string, + recipient: string, + request: IVault.ExitPoolRequestStruct, + overrides?: CallOverrides, + ): Promise<[BigNumber, BigNumber[]] & { bptIn: BigNumber; amountsOut: BigNumber[] }>; + + queryJoin( + poolId: BytesLike, + sender: string, + recipient: string, + request: IVault.JoinPoolRequestStruct, + overrides?: CallOverrides, + ): Promise<[BigNumber, BigNumber[]] & { bptOut: BigNumber; amountsIn: BigNumber[] }>; + + vault(overrides?: CallOverrides): Promise; + }; + + filters: {}; + + estimateGas: { + queryExit( + poolId: BytesLike, + sender: string, + recipient: string, + request: IVault.ExitPoolRequestStruct, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + queryJoin( + poolId: BytesLike, + sender: string, + recipient: string, + request: IVault.JoinPoolRequestStruct, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + vault(overrides?: CallOverrides): Promise; + }; + + populateTransaction: { + queryExit( + poolId: BytesLike, + sender: string, + recipient: string, + request: IVault.ExitPoolRequestStruct, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + queryJoin( + poolId: BytesLike, + sender: string, + recipient: string, + request: IVault.JoinPoolRequestStruct, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + vault(overrides?: CallOverrides): Promise; + }; +} diff --git a/src/apps/aura/contracts/ethers/BaseRewardPool.ts b/src/apps/aura/contracts/ethers/BaseRewardPool.ts new file mode 100644 index 000000000..4731e150b --- /dev/null +++ b/src/apps/aura/contracts/ethers/BaseRewardPool.ts @@ -0,0 +1,759 @@ +/* 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 interface BaseRewardPoolInterface extends utils.Interface { + functions: { + 'addExtraReward(address)': FunctionFragment; + 'balanceOf(address)': FunctionFragment; + 'clearExtraRewards()': FunctionFragment; + 'currentRewards()': FunctionFragment; + 'donate(uint256)': FunctionFragment; + 'duration()': FunctionFragment; + 'earned(address)': FunctionFragment; + 'extraRewards(uint256)': FunctionFragment; + 'extraRewardsLength()': FunctionFragment; + 'getReward()': FunctionFragment; + 'getReward(address,bool)': FunctionFragment; + 'historicalRewards()': FunctionFragment; + 'lastTimeRewardApplicable()': FunctionFragment; + 'lastUpdateTime()': FunctionFragment; + 'newRewardRatio()': FunctionFragment; + 'operator()': FunctionFragment; + 'periodFinish()': FunctionFragment; + 'pid()': FunctionFragment; + 'processIdleRewards()': FunctionFragment; + 'queueNewRewards(uint256)': FunctionFragment; + 'queuedRewards()': FunctionFragment; + 'rewardManager()': FunctionFragment; + 'rewardPerToken()': FunctionFragment; + 'rewardPerTokenStored()': FunctionFragment; + 'rewardRate()': FunctionFragment; + 'rewardToken()': FunctionFragment; + 'rewards(address)': FunctionFragment; + 'stake(uint256)': FunctionFragment; + 'stakeAll()': FunctionFragment; + 'stakeFor(address,uint256)': FunctionFragment; + 'stakingToken()': FunctionFragment; + 'totalSupply()': FunctionFragment; + 'userRewardPerTokenPaid(address)': FunctionFragment; + 'withdraw(uint256,bool)': FunctionFragment; + 'withdrawAll(bool)': FunctionFragment; + 'withdrawAllAndUnwrap(bool)': FunctionFragment; + 'withdrawAndUnwrap(uint256,bool)': FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | 'addExtraReward' + | 'balanceOf' + | 'clearExtraRewards' + | 'currentRewards' + | 'donate' + | 'duration' + | 'earned' + | 'extraRewards' + | 'extraRewardsLength' + | 'getReward()' + | 'getReward(address,bool)' + | 'historicalRewards' + | 'lastTimeRewardApplicable' + | 'lastUpdateTime' + | 'newRewardRatio' + | 'operator' + | 'periodFinish' + | 'pid' + | 'processIdleRewards' + | 'queueNewRewards' + | 'queuedRewards' + | 'rewardManager' + | 'rewardPerToken' + | 'rewardPerTokenStored' + | 'rewardRate' + | 'rewardToken' + | 'rewards' + | 'stake' + | 'stakeAll' + | 'stakeFor' + | 'stakingToken' + | 'totalSupply' + | 'userRewardPerTokenPaid' + | 'withdraw' + | 'withdrawAll' + | 'withdrawAllAndUnwrap' + | 'withdrawAndUnwrap', + ): FunctionFragment; + + encodeFunctionData(functionFragment: 'addExtraReward', values: [string]): string; + encodeFunctionData(functionFragment: 'balanceOf', values: [string]): string; + encodeFunctionData(functionFragment: 'clearExtraRewards', values?: undefined): string; + encodeFunctionData(functionFragment: 'currentRewards', values?: undefined): string; + encodeFunctionData(functionFragment: 'donate', values: [BigNumberish]): string; + encodeFunctionData(functionFragment: 'duration', values?: undefined): string; + encodeFunctionData(functionFragment: 'earned', values: [string]): string; + encodeFunctionData(functionFragment: 'extraRewards', values: [BigNumberish]): string; + encodeFunctionData(functionFragment: 'extraRewardsLength', values?: undefined): string; + encodeFunctionData(functionFragment: 'getReward()', values?: undefined): string; + encodeFunctionData(functionFragment: 'getReward(address,bool)', values: [string, boolean]): string; + encodeFunctionData(functionFragment: 'historicalRewards', values?: undefined): string; + encodeFunctionData(functionFragment: 'lastTimeRewardApplicable', values?: undefined): string; + encodeFunctionData(functionFragment: 'lastUpdateTime', values?: undefined): string; + encodeFunctionData(functionFragment: 'newRewardRatio', values?: undefined): string; + encodeFunctionData(functionFragment: 'operator', values?: undefined): string; + encodeFunctionData(functionFragment: 'periodFinish', values?: undefined): string; + encodeFunctionData(functionFragment: 'pid', values?: undefined): string; + encodeFunctionData(functionFragment: 'processIdleRewards', values?: undefined): string; + encodeFunctionData(functionFragment: 'queueNewRewards', values: [BigNumberish]): string; + encodeFunctionData(functionFragment: 'queuedRewards', values?: undefined): string; + encodeFunctionData(functionFragment: 'rewardManager', values?: undefined): string; + encodeFunctionData(functionFragment: 'rewardPerToken', values?: undefined): string; + encodeFunctionData(functionFragment: 'rewardPerTokenStored', values?: undefined): string; + encodeFunctionData(functionFragment: 'rewardRate', values?: undefined): string; + encodeFunctionData(functionFragment: 'rewardToken', values?: undefined): string; + encodeFunctionData(functionFragment: 'rewards', values: [string]): string; + encodeFunctionData(functionFragment: 'stake', values: [BigNumberish]): string; + encodeFunctionData(functionFragment: 'stakeAll', values?: undefined): string; + encodeFunctionData(functionFragment: 'stakeFor', values: [string, BigNumberish]): string; + encodeFunctionData(functionFragment: 'stakingToken', values?: undefined): string; + encodeFunctionData(functionFragment: 'totalSupply', values?: undefined): string; + encodeFunctionData(functionFragment: 'userRewardPerTokenPaid', values: [string]): string; + encodeFunctionData(functionFragment: 'withdraw', values: [BigNumberish, boolean]): string; + encodeFunctionData(functionFragment: 'withdrawAll', values: [boolean]): string; + encodeFunctionData(functionFragment: 'withdrawAllAndUnwrap', values: [boolean]): string; + encodeFunctionData(functionFragment: 'withdrawAndUnwrap', values: [BigNumberish, boolean]): string; + + decodeFunctionResult(functionFragment: 'addExtraReward', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'balanceOf', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'clearExtraRewards', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'currentRewards', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'donate', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'duration', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'earned', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'extraRewards', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'extraRewardsLength', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'getReward()', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'getReward(address,bool)', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'historicalRewards', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'lastTimeRewardApplicable', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'lastUpdateTime', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'newRewardRatio', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'operator', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'periodFinish', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'pid', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'processIdleRewards', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'queueNewRewards', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'queuedRewards', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'rewardManager', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'rewardPerToken', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'rewardPerTokenStored', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'rewardRate', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'rewardToken', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'rewards', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'stake', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'stakeAll', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'stakeFor', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'stakingToken', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'totalSupply', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'userRewardPerTokenPaid', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'withdraw', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'withdrawAll', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'withdrawAllAndUnwrap', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'withdrawAndUnwrap', data: BytesLike): Result; + + events: { + 'RewardAdded(uint256)': EventFragment; + 'RewardPaid(address,uint256)': EventFragment; + 'Staked(address,uint256)': EventFragment; + 'Withdrawn(address,uint256)': EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: 'RewardAdded'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'RewardPaid'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'Staked'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'Withdrawn'): EventFragment; +} + +export interface RewardAddedEventObject { + reward: BigNumber; +} +export type RewardAddedEvent = TypedEvent<[BigNumber], RewardAddedEventObject>; + +export type RewardAddedEventFilter = TypedEventFilter; + +export interface RewardPaidEventObject { + user: string; + reward: BigNumber; +} +export type RewardPaidEvent = TypedEvent<[string, BigNumber], RewardPaidEventObject>; + +export type RewardPaidEventFilter = TypedEventFilter; + +export interface StakedEventObject { + user: string; + amount: BigNumber; +} +export type StakedEvent = TypedEvent<[string, BigNumber], StakedEventObject>; + +export type StakedEventFilter = TypedEventFilter; + +export interface WithdrawnEventObject { + user: string; + amount: BigNumber; +} +export type WithdrawnEvent = TypedEvent<[string, BigNumber], WithdrawnEventObject>; + +export type WithdrawnEventFilter = TypedEventFilter; + +export interface BaseRewardPool extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: BaseRewardPoolInterface; + + 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: { + addExtraReward( + _reward: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + balanceOf(account: string, overrides?: CallOverrides): Promise<[BigNumber]>; + + clearExtraRewards(overrides?: Overrides & { from?: string | Promise }): Promise; + + currentRewards(overrides?: CallOverrides): Promise<[BigNumber]>; + + donate( + _amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + duration(overrides?: CallOverrides): Promise<[BigNumber]>; + + earned(account: string, overrides?: CallOverrides): Promise<[BigNumber]>; + + extraRewards(arg0: BigNumberish, overrides?: CallOverrides): Promise<[string]>; + + extraRewardsLength(overrides?: CallOverrides): Promise<[BigNumber]>; + + 'getReward()'(overrides?: Overrides & { from?: string | Promise }): Promise; + + 'getReward(address,bool)'( + _account: string, + _claimExtras: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + historicalRewards(overrides?: CallOverrides): Promise<[BigNumber]>; + + lastTimeRewardApplicable(overrides?: CallOverrides): Promise<[BigNumber]>; + + lastUpdateTime(overrides?: CallOverrides): Promise<[BigNumber]>; + + newRewardRatio(overrides?: CallOverrides): Promise<[BigNumber]>; + + operator(overrides?: CallOverrides): Promise<[string]>; + + periodFinish(overrides?: CallOverrides): Promise<[BigNumber]>; + + pid(overrides?: CallOverrides): Promise<[BigNumber]>; + + processIdleRewards(overrides?: Overrides & { from?: string | Promise }): Promise; + + queueNewRewards( + _rewards: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + queuedRewards(overrides?: CallOverrides): Promise<[BigNumber]>; + + rewardManager(overrides?: CallOverrides): Promise<[string]>; + + rewardPerToken(overrides?: CallOverrides): Promise<[BigNumber]>; + + rewardPerTokenStored(overrides?: CallOverrides): Promise<[BigNumber]>; + + rewardRate(overrides?: CallOverrides): Promise<[BigNumber]>; + + rewardToken(overrides?: CallOverrides): Promise<[string]>; + + rewards(arg0: string, overrides?: CallOverrides): Promise<[BigNumber]>; + + stake( + _amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + stakeAll(overrides?: Overrides & { from?: string | Promise }): Promise; + + stakeFor( + _for: string, + _amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + stakingToken(overrides?: CallOverrides): Promise<[string]>; + + totalSupply(overrides?: CallOverrides): Promise<[BigNumber]>; + + userRewardPerTokenPaid(arg0: string, overrides?: CallOverrides): Promise<[BigNumber]>; + + withdraw( + amount: BigNumberish, + claim: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + withdrawAll( + claim: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + withdrawAllAndUnwrap( + claim: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + withdrawAndUnwrap( + amount: BigNumberish, + claim: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + }; + + addExtraReward( + _reward: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + balanceOf(account: string, overrides?: CallOverrides): Promise; + + clearExtraRewards(overrides?: Overrides & { from?: string | Promise }): Promise; + + currentRewards(overrides?: CallOverrides): Promise; + + donate( + _amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + duration(overrides?: CallOverrides): Promise; + + earned(account: string, overrides?: CallOverrides): Promise; + + extraRewards(arg0: BigNumberish, overrides?: CallOverrides): Promise; + + extraRewardsLength(overrides?: CallOverrides): Promise; + + 'getReward()'(overrides?: Overrides & { from?: string | Promise }): Promise; + + 'getReward(address,bool)'( + _account: string, + _claimExtras: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + historicalRewards(overrides?: CallOverrides): Promise; + + lastTimeRewardApplicable(overrides?: CallOverrides): Promise; + + lastUpdateTime(overrides?: CallOverrides): Promise; + + newRewardRatio(overrides?: CallOverrides): Promise; + + operator(overrides?: CallOverrides): Promise; + + periodFinish(overrides?: CallOverrides): Promise; + + pid(overrides?: CallOverrides): Promise; + + processIdleRewards(overrides?: Overrides & { from?: string | Promise }): Promise; + + queueNewRewards( + _rewards: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + queuedRewards(overrides?: CallOverrides): Promise; + + rewardManager(overrides?: CallOverrides): Promise; + + rewardPerToken(overrides?: CallOverrides): Promise; + + rewardPerTokenStored(overrides?: CallOverrides): Promise; + + rewardRate(overrides?: CallOverrides): Promise; + + rewardToken(overrides?: CallOverrides): Promise; + + rewards(arg0: string, overrides?: CallOverrides): Promise; + + stake( + _amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + stakeAll(overrides?: Overrides & { from?: string | Promise }): Promise; + + stakeFor( + _for: string, + _amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + stakingToken(overrides?: CallOverrides): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + userRewardPerTokenPaid(arg0: string, overrides?: CallOverrides): Promise; + + withdraw( + amount: BigNumberish, + claim: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + withdrawAll( + claim: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + withdrawAllAndUnwrap( + claim: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + withdrawAndUnwrap( + amount: BigNumberish, + claim: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + callStatic: { + addExtraReward(_reward: string, overrides?: CallOverrides): Promise; + + balanceOf(account: string, overrides?: CallOverrides): Promise; + + clearExtraRewards(overrides?: CallOverrides): Promise; + + currentRewards(overrides?: CallOverrides): Promise; + + donate(_amount: BigNumberish, overrides?: CallOverrides): Promise; + + duration(overrides?: CallOverrides): Promise; + + earned(account: string, overrides?: CallOverrides): Promise; + + extraRewards(arg0: BigNumberish, overrides?: CallOverrides): Promise; + + extraRewardsLength(overrides?: CallOverrides): Promise; + + 'getReward()'(overrides?: CallOverrides): Promise; + + 'getReward(address,bool)'(_account: string, _claimExtras: boolean, overrides?: CallOverrides): Promise; + + historicalRewards(overrides?: CallOverrides): Promise; + + lastTimeRewardApplicable(overrides?: CallOverrides): Promise; + + lastUpdateTime(overrides?: CallOverrides): Promise; + + newRewardRatio(overrides?: CallOverrides): Promise; + + operator(overrides?: CallOverrides): Promise; + + periodFinish(overrides?: CallOverrides): Promise; + + pid(overrides?: CallOverrides): Promise; + + processIdleRewards(overrides?: CallOverrides): Promise; + + queueNewRewards(_rewards: BigNumberish, overrides?: CallOverrides): Promise; + + queuedRewards(overrides?: CallOverrides): Promise; + + rewardManager(overrides?: CallOverrides): Promise; + + rewardPerToken(overrides?: CallOverrides): Promise; + + rewardPerTokenStored(overrides?: CallOverrides): Promise; + + rewardRate(overrides?: CallOverrides): Promise; + + rewardToken(overrides?: CallOverrides): Promise; + + rewards(arg0: string, overrides?: CallOverrides): Promise; + + stake(_amount: BigNumberish, overrides?: CallOverrides): Promise; + + stakeAll(overrides?: CallOverrides): Promise; + + stakeFor(_for: string, _amount: BigNumberish, overrides?: CallOverrides): Promise; + + stakingToken(overrides?: CallOverrides): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + userRewardPerTokenPaid(arg0: string, overrides?: CallOverrides): Promise; + + withdraw(amount: BigNumberish, claim: boolean, overrides?: CallOverrides): Promise; + + withdrawAll(claim: boolean, overrides?: CallOverrides): Promise; + + withdrawAllAndUnwrap(claim: boolean, overrides?: CallOverrides): Promise; + + withdrawAndUnwrap(amount: BigNumberish, claim: boolean, overrides?: CallOverrides): Promise; + }; + + filters: { + 'RewardAdded(uint256)'(reward?: null): RewardAddedEventFilter; + RewardAdded(reward?: null): RewardAddedEventFilter; + + 'RewardPaid(address,uint256)'(user?: string | null, reward?: null): RewardPaidEventFilter; + RewardPaid(user?: string | null, reward?: null): RewardPaidEventFilter; + + 'Staked(address,uint256)'(user?: string | null, amount?: null): StakedEventFilter; + Staked(user?: string | null, amount?: null): StakedEventFilter; + + 'Withdrawn(address,uint256)'(user?: string | null, amount?: null): WithdrawnEventFilter; + Withdrawn(user?: string | null, amount?: null): WithdrawnEventFilter; + }; + + estimateGas: { + addExtraReward(_reward: string, overrides?: Overrides & { from?: string | Promise }): Promise; + + balanceOf(account: string, overrides?: CallOverrides): Promise; + + clearExtraRewards(overrides?: Overrides & { from?: string | Promise }): Promise; + + currentRewards(overrides?: CallOverrides): Promise; + + donate(_amount: BigNumberish, overrides?: Overrides & { from?: string | Promise }): Promise; + + duration(overrides?: CallOverrides): Promise; + + earned(account: string, overrides?: CallOverrides): Promise; + + extraRewards(arg0: BigNumberish, overrides?: CallOverrides): Promise; + + extraRewardsLength(overrides?: CallOverrides): Promise; + + 'getReward()'(overrides?: Overrides & { from?: string | Promise }): Promise; + + 'getReward(address,bool)'( + _account: string, + _claimExtras: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + historicalRewards(overrides?: CallOverrides): Promise; + + lastTimeRewardApplicable(overrides?: CallOverrides): Promise; + + lastUpdateTime(overrides?: CallOverrides): Promise; + + newRewardRatio(overrides?: CallOverrides): Promise; + + operator(overrides?: CallOverrides): Promise; + + periodFinish(overrides?: CallOverrides): Promise; + + pid(overrides?: CallOverrides): Promise; + + processIdleRewards(overrides?: Overrides & { from?: string | Promise }): Promise; + + queueNewRewards( + _rewards: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + queuedRewards(overrides?: CallOverrides): Promise; + + rewardManager(overrides?: CallOverrides): Promise; + + rewardPerToken(overrides?: CallOverrides): Promise; + + rewardPerTokenStored(overrides?: CallOverrides): Promise; + + rewardRate(overrides?: CallOverrides): Promise; + + rewardToken(overrides?: CallOverrides): Promise; + + rewards(arg0: string, overrides?: CallOverrides): Promise; + + stake(_amount: BigNumberish, overrides?: Overrides & { from?: string | Promise }): Promise; + + stakeAll(overrides?: Overrides & { from?: string | Promise }): Promise; + + stakeFor( + _for: string, + _amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + stakingToken(overrides?: CallOverrides): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + userRewardPerTokenPaid(arg0: string, overrides?: CallOverrides): Promise; + + withdraw( + amount: BigNumberish, + claim: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + withdrawAll(claim: boolean, overrides?: Overrides & { from?: string | Promise }): Promise; + + withdrawAllAndUnwrap( + claim: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + withdrawAndUnwrap( + amount: BigNumberish, + claim: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + }; + + populateTransaction: { + addExtraReward( + _reward: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + balanceOf(account: string, overrides?: CallOverrides): Promise; + + clearExtraRewards(overrides?: Overrides & { from?: string | Promise }): Promise; + + currentRewards(overrides?: CallOverrides): Promise; + + donate( + _amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + duration(overrides?: CallOverrides): Promise; + + earned(account: string, overrides?: CallOverrides): Promise; + + extraRewards(arg0: BigNumberish, overrides?: CallOverrides): Promise; + + extraRewardsLength(overrides?: CallOverrides): Promise; + + 'getReward()'(overrides?: Overrides & { from?: string | Promise }): Promise; + + 'getReward(address,bool)'( + _account: string, + _claimExtras: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + historicalRewards(overrides?: CallOverrides): Promise; + + lastTimeRewardApplicable(overrides?: CallOverrides): Promise; + + lastUpdateTime(overrides?: CallOverrides): Promise; + + newRewardRatio(overrides?: CallOverrides): Promise; + + operator(overrides?: CallOverrides): Promise; + + periodFinish(overrides?: CallOverrides): Promise; + + pid(overrides?: CallOverrides): Promise; + + processIdleRewards(overrides?: Overrides & { from?: string | Promise }): Promise; + + queueNewRewards( + _rewards: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + queuedRewards(overrides?: CallOverrides): Promise; + + rewardManager(overrides?: CallOverrides): Promise; + + rewardPerToken(overrides?: CallOverrides): Promise; + + rewardPerTokenStored(overrides?: CallOverrides): Promise; + + rewardRate(overrides?: CallOverrides): Promise; + + rewardToken(overrides?: CallOverrides): Promise; + + rewards(arg0: string, overrides?: CallOverrides): Promise; + + stake( + _amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + stakeAll(overrides?: Overrides & { from?: string | Promise }): Promise; + + stakeFor( + _for: string, + _amount: BigNumberish, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + stakingToken(overrides?: CallOverrides): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + userRewardPerTokenPaid(arg0: string, overrides?: CallOverrides): Promise; + + withdraw( + amount: BigNumberish, + claim: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + withdrawAll( + claim: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + withdrawAllAndUnwrap( + claim: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + + withdrawAndUnwrap( + amount: BigNumberish, + claim: boolean, + overrides?: Overrides & { from?: string | Promise }, + ): Promise; + }; +} diff --git a/src/apps/aura/contracts/ethers/common.ts b/src/apps/aura/contracts/ethers/common.ts new file mode 100644 index 000000000..6cfb10425 --- /dev/null +++ b/src/apps/aura/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/aura/contracts/ethers/factories/AuraLocker__factory.ts b/src/apps/aura/contracts/ethers/factories/AuraLocker__factory.ts new file mode 100644 index 000000000..b7872c137 --- /dev/null +++ b/src/apps/aura/contracts/ethers/factories/AuraLocker__factory.ts @@ -0,0 +1,1355 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from 'ethers'; +import type { Provider } from '@ethersproject/providers'; +import type { AuraLocker, AuraLockerInterface } from '../AuraLocker'; + +const _abi = [ + { + inputs: [ + { + internalType: 'string', + name: '_nameArg', + type: 'string', + }, + { + internalType: 'string', + name: '_symbolArg', + type: 'string', + }, + { + internalType: 'address', + name: '_stakingToken', + type: 'address', + }, + { + internalType: 'address', + name: '_cvxCrv', + type: 'address', + }, + { + internalType: 'address', + name: '_cvxCrvStaking', + type: 'address', + }, + ], + stateMutability: 'nonpayable', + type: 'constructor', + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'address', + name: 'account', + type: 'address', + }, + { + indexed: false, + internalType: 'bool', + name: 'blacklisted', + type: 'bool', + }, + ], + name: 'BlacklistModified', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'delegator', + type: 'address', + }, + { + indexed: true, + internalType: 'address', + name: 'fromDelegate', + type: 'address', + }, + { + indexed: true, + internalType: 'address', + name: 'toDelegate', + type: 'address', + }, + ], + name: 'DelegateChanged', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'delegate', + type: 'address', + }, + ], + name: 'DelegateCheckpointed', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'uint256', + name: 'rate', + type: 'uint256', + }, + { + indexed: false, + internalType: 'uint256', + name: 'delay', + type: 'uint256', + }, + ], + name: 'KickIncentiveSet', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: '_user', + type: 'address', + }, + { + indexed: true, + internalType: 'address', + name: '_kicked', + type: 'address', + }, + { + indexed: false, + internalType: 'uint256', + name: '_reward', + type: 'uint256', + }, + ], + name: 'KickReward', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'previousOwner', + type: 'address', + }, + { + indexed: true, + internalType: 'address', + name: 'newOwner', + type: 'address', + }, + ], + name: 'OwnershipTransferred', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'address', + name: '_token', + type: 'address', + }, + { + indexed: false, + internalType: 'uint256', + name: '_amount', + type: 'uint256', + }, + ], + name: 'Recovered', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: '_token', + type: 'address', + }, + { + indexed: false, + internalType: 'uint256', + name: '_reward', + type: 'uint256', + }, + ], + name: 'RewardAdded', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: '_user', + type: 'address', + }, + { + indexed: true, + internalType: 'address', + name: '_rewardsToken', + type: 'address', + }, + { + indexed: false, + internalType: 'uint256', + name: '_reward', + type: 'uint256', + }, + ], + name: 'RewardPaid', + type: 'event', + }, + { + anonymous: false, + inputs: [], + name: 'Shutdown', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: '_user', + type: 'address', + }, + { + indexed: false, + internalType: 'uint256', + name: '_paidAmount', + type: 'uint256', + }, + { + indexed: false, + internalType: 'uint256', + name: '_lockedAmount', + type: 'uint256', + }, + ], + name: 'Staked', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: '_user', + type: 'address', + }, + { + indexed: false, + internalType: 'uint256', + name: '_amount', + type: 'uint256', + }, + { + indexed: false, + internalType: 'bool', + name: '_relocked', + type: 'bool', + }, + ], + name: 'Withdrawn', + type: 'event', + }, + { + inputs: [ + { + internalType: 'address', + name: '_rewardsToken', + type: 'address', + }, + { + internalType: 'address', + name: '_distributor', + type: 'address', + }, + ], + name: 'addReward', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '_rewardsToken', + type: 'address', + }, + { + internalType: 'address', + name: '_distributor', + type: 'address', + }, + { + internalType: 'bool', + name: '_approved', + type: 'bool', + }, + ], + name: 'approveRewardDistributor', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_epoch', + type: 'uint256', + }, + { + internalType: 'address', + name: '_user', + type: 'address', + }, + ], + name: 'balanceAtEpochOf', + outputs: [ + { + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '_user', + type: 'address', + }, + ], + name: 'balanceOf', + outputs: [ + { + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + name: 'balances', + outputs: [ + { + internalType: 'uint112', + name: 'locked', + type: 'uint112', + }, + { + internalType: 'uint32', + name: 'nextUnlockIndex', + type: 'uint32', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + name: 'blacklist', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'checkpointEpoch', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'account', + type: 'address', + }, + { + internalType: 'uint32', + name: 'pos', + type: 'uint32', + }, + ], + name: 'checkpoints', + outputs: [ + { + components: [ + { + internalType: 'uint224', + name: 'votes', + type: 'uint224', + }, + { + internalType: 'uint32', + name: 'epochStart', + type: 'uint32', + }, + ], + internalType: 'struct AuraLocker.DelegateeCheckpoint', + name: '', + type: 'tuple', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '_account', + type: 'address', + }, + ], + name: 'claimableRewards', + outputs: [ + { + components: [ + { + internalType: 'address', + name: 'token', + type: 'address', + }, + { + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + ], + internalType: 'struct AuraLocker.EarnedData[]', + name: 'userRewards', + type: 'tuple[]', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'cvxCrv', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'cvxcrvStaking', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'decimals', + outputs: [ + { + internalType: 'uint8', + name: '', + type: 'uint8', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'newDelegatee', + type: 'address', + }, + ], + name: 'delegate', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + name: 'delegateeUnlocks', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'account', + type: 'address', + }, + ], + name: 'delegates', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'denominator', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'emergencyWithdraw', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'epochCount', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + name: 'epochs', + outputs: [ + { + internalType: 'uint224', + name: 'supply', + type: 'uint224', + }, + { + internalType: 'uint32', + name: 'date', + type: 'uint32', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_time', + type: 'uint256', + }, + ], + name: 'findEpochId', + outputs: [ + { + internalType: 'uint256', + name: 'epoch', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: 'timestamp', + type: 'uint256', + }, + ], + name: 'getPastTotalSupply', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'account', + type: 'address', + }, + { + internalType: 'uint256', + name: 'timestamp', + type: 'uint256', + }, + ], + name: 'getPastVotes', + outputs: [ + { + internalType: 'uint256', + name: 'votes', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '_account', + type: 'address', + }, + { + internalType: 'bool', + name: '_stake', + type: 'bool', + }, + ], + name: 'getReward', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '_account', + type: 'address', + }, + ], + name: 'getReward', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '_account', + type: 'address', + }, + { + internalType: 'bool[]', + name: '_skipIdx', + type: 'bool[]', + }, + ], + name: 'getReward', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'account', + type: 'address', + }, + ], + name: 'getVotes', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'isShutdown', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '_account', + type: 'address', + }, + ], + name: 'kickExpiredLocks', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'kickRewardEpochDelay', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'kickRewardPerEpoch', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '_rewardsToken', + type: 'address', + }, + ], + name: 'lastTimeRewardApplicable', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '_account', + type: 'address', + }, + { + internalType: 'uint256', + name: '_amount', + type: 'uint256', + }, + ], + name: 'lock', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'lockDuration', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '_user', + type: 'address', + }, + ], + name: 'lockedBalances', + outputs: [ + { + internalType: 'uint256', + name: 'total', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'unlockable', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'locked', + type: 'uint256', + }, + { + components: [ + { + internalType: 'uint112', + name: 'amount', + type: 'uint112', + }, + { + internalType: 'uint32', + name: 'unlockTime', + type: 'uint32', + }, + ], + internalType: 'struct AuraLocker.LockedBalance[]', + name: 'lockData', + type: 'tuple[]', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'lockedSupply', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '_account', + type: 'address', + }, + { + internalType: 'bool', + name: '_blacklisted', + type: 'bool', + }, + ], + name: 'modifyBlacklist', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'name', + outputs: [ + { + internalType: 'string', + name: '', + type: 'string', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'newRewardRatio', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'account', + type: 'address', + }, + ], + name: 'numCheckpoints', + outputs: [ + { + internalType: 'uint32', + name: '', + type: 'uint32', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'owner', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bool', + name: '_relock', + type: 'bool', + }, + ], + name: 'processExpiredLocks', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '_rewardsToken', + type: 'address', + }, + { + internalType: 'uint256', + name: '_rewards', + type: 'uint256', + }, + ], + name: 'queueNewRewards', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + name: 'queuedRewards', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '_tokenAddress', + type: 'address', + }, + { + internalType: 'uint256', + name: '_tokenAmount', + type: 'uint256', + }, + ], + name: 'recoverERC20', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'renounceOwnership', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + name: 'rewardData', + outputs: [ + { + internalType: 'uint32', + name: 'periodFinish', + type: 'uint32', + }, + { + internalType: 'uint32', + name: 'lastUpdateTime', + type: 'uint32', + }, + { + internalType: 'uint96', + name: 'rewardRate', + type: 'uint96', + }, + { + internalType: 'uint96', + name: 'rewardPerTokenStored', + type: 'uint96', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + name: 'rewardDistributors', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '_rewardsToken', + type: 'address', + }, + ], + name: 'rewardPerToken', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + name: 'rewardTokens', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'rewardsDuration', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'setApprovals', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_rate', + type: 'uint256', + }, + { + internalType: 'uint256', + name: '_delay', + type: 'uint256', + }, + ], + name: 'setKickIncentive', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'shutdown', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'stakingToken', + outputs: [ + { + internalType: 'contract IERC20', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'symbol', + outputs: [ + { + internalType: 'string', + name: '', + type: 'string', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'totalSupply', + outputs: [ + { + internalType: 'uint256', + name: 'supply', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_epoch', + type: 'uint256', + }, + ], + name: 'totalSupplyAtEpoch', + outputs: [ + { + internalType: 'uint256', + name: 'supply', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'newOwner', + type: 'address', + }, + ], + name: 'transferOwnership', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + name: 'userData', + outputs: [ + { + internalType: 'uint128', + name: 'rewardPerTokenPaid', + type: 'uint128', + }, + { + internalType: 'uint128', + name: 'rewards', + type: 'uint128', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + name: 'userLocks', + outputs: [ + { + internalType: 'uint112', + name: 'amount', + type: 'uint112', + }, + { + internalType: 'uint32', + name: 'unlockTime', + type: 'uint32', + }, + ], + stateMutability: 'view', + type: 'function', + }, +]; + +export class AuraLocker__factory { + static readonly abi = _abi; + static createInterface(): AuraLockerInterface { + return new utils.Interface(_abi) as AuraLockerInterface; + } + static connect(address: string, signerOrProvider: Signer | Provider): AuraLocker { + return new Contract(address, _abi, signerOrProvider) as AuraLocker; + } +} diff --git a/src/apps/aura/contracts/ethers/factories/AuraMasterchef__factory.ts b/src/apps/aura/contracts/ethers/factories/AuraMasterchef__factory.ts new file mode 100644 index 000000000..12f9b01a6 --- /dev/null +++ b/src/apps/aura/contracts/ethers/factories/AuraMasterchef__factory.ts @@ -0,0 +1,562 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from 'ethers'; +import type { Provider } from '@ethersproject/providers'; +import type { AuraMasterchef, AuraMasterchefInterface } from '../AuraMasterchef'; + +const _abi = [ + { + inputs: [ + { + internalType: 'contract IERC20', + name: '_cvx', + type: 'address', + }, + { + internalType: 'uint256', + name: '_rewardPerBlock', + type: 'uint256', + }, + { + internalType: 'uint256', + name: '_startBlock', + type: 'uint256', + }, + { + internalType: 'uint256', + name: '_endBlock', + type: 'uint256', + }, + ], + stateMutability: 'nonpayable', + type: 'constructor', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'user', + type: 'address', + }, + { + indexed: true, + internalType: 'uint256', + name: 'pid', + type: 'uint256', + }, + { + indexed: false, + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + ], + name: 'Deposit', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'user', + type: 'address', + }, + { + indexed: true, + internalType: 'uint256', + name: 'pid', + type: 'uint256', + }, + { + indexed: false, + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + ], + name: 'EmergencyWithdraw', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'previousOwner', + type: 'address', + }, + { + indexed: true, + internalType: 'address', + name: 'newOwner', + type: 'address', + }, + ], + name: 'OwnershipTransferred', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'user', + type: 'address', + }, + { + indexed: true, + internalType: 'uint256', + name: 'pid', + type: 'uint256', + }, + { + indexed: false, + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + ], + name: 'RewardPaid', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'user', + type: 'address', + }, + { + indexed: true, + internalType: 'uint256', + name: 'pid', + type: 'uint256', + }, + { + indexed: false, + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + ], + name: 'Withdraw', + type: 'event', + }, + { + inputs: [], + name: 'BONUS_MULTIPLIER', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_allocPoint', + type: 'uint256', + }, + { + internalType: 'contract IERC20', + name: '_lpToken', + type: 'address', + }, + { + internalType: 'contract IRewarder', + name: '_rewarder', + type: 'address', + }, + ], + name: 'add', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_pid', + type: 'uint256', + }, + { + internalType: 'address', + name: '_account', + type: 'address', + }, + ], + name: 'claim', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'cvx', + outputs: [ + { + internalType: 'contract IERC20', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_pid', + type: 'uint256', + }, + { + internalType: 'uint256', + name: '_amount', + type: 'uint256', + }, + ], + name: 'deposit', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_pid', + type: 'uint256', + }, + ], + name: 'emergencyWithdraw', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'endBlock', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_from', + type: 'uint256', + }, + { + internalType: 'uint256', + name: '_to', + type: 'uint256', + }, + ], + name: 'getMultiplier', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + name: 'isAddedPool', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'massUpdatePools', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'owner', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_pid', + type: 'uint256', + }, + { + internalType: 'address', + name: '_user', + type: 'address', + }, + ], + name: 'pendingCvx', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + name: 'poolInfo', + outputs: [ + { + internalType: 'contract IERC20', + name: 'lpToken', + type: 'address', + }, + { + internalType: 'uint256', + name: 'allocPoint', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'lastRewardBlock', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'accCvxPerShare', + type: 'uint256', + }, + { + internalType: 'contract IRewarder', + name: 'rewarder', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'poolLength', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'renounceOwnership', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'rewardPerBlock', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_pid', + type: 'uint256', + }, + { + internalType: 'uint256', + name: '_allocPoint', + type: 'uint256', + }, + { + internalType: 'contract IRewarder', + name: '_rewarder', + type: 'address', + }, + { + internalType: 'bool', + name: '_updateRewarder', + type: 'bool', + }, + ], + name: 'set', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'startBlock', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'totalAllocPoint', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'newOwner', + type: 'address', + }, + ], + name: 'transferOwnership', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_pid', + type: 'uint256', + }, + ], + name: 'updatePool', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + name: 'userInfo', + outputs: [ + { + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'rewardDebt', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_pid', + type: 'uint256', + }, + { + internalType: 'uint256', + name: '_amount', + type: 'uint256', + }, + ], + name: 'withdraw', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, +]; + +export class AuraMasterchef__factory { + static readonly abi = _abi; + static createInterface(): AuraMasterchefInterface { + return new utils.Interface(_abi) as AuraMasterchefInterface; + } + static connect(address: string, signerOrProvider: Signer | Provider): AuraMasterchef { + return new Contract(address, _abi, signerOrProvider) as AuraMasterchef; + } +} diff --git a/src/apps/aura/contracts/ethers/factories/AuraToken__factory.ts b/src/apps/aura/contracts/ethers/factories/AuraToken__factory.ts new file mode 100644 index 000000000..d7ff09a43 --- /dev/null +++ b/src/apps/aura/contracts/ethers/factories/AuraToken__factory.ts @@ -0,0 +1,488 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from 'ethers'; +import type { Provider } from '@ethersproject/providers'; +import type { AuraToken, AuraTokenInterface } from '../AuraToken'; + +const _abi = [ + { + inputs: [ + { + internalType: 'address', + name: '_proxy', + type: 'address', + }, + { + internalType: 'string', + name: '_nameArg', + type: 'string', + }, + { + internalType: 'string', + name: '_symbolArg', + type: 'string', + }, + ], + 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: [], + name: 'Initialised', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'previousOperator', + type: 'address', + }, + { + indexed: true, + internalType: 'address', + name: 'newOperator', + type: 'address', + }, + ], + name: 'OperatorChanged', + 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: 'EMISSIONS_MAX_SUPPLY', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'INIT_MINT_AMOUNT', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + 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: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'spender', + type: 'address', + }, + { + internalType: 'uint256', + name: 'subtractedValue', + type: 'uint256', + }, + ], + name: 'decreaseAllowance', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'spender', + type: 'address', + }, + { + internalType: 'uint256', + name: 'addedValue', + type: 'uint256', + }, + ], + name: 'increaseAllowance', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '_to', + type: 'address', + }, + { + internalType: 'address', + name: '_minter', + type: 'address', + }, + ], + name: 'init', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '_to', + type: 'address', + }, + { + internalType: 'uint256', + name: '_amount', + type: 'uint256', + }, + ], + name: 'mint', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'minter', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '_to', + type: 'address', + }, + { + internalType: 'uint256', + name: '_amount', + type: 'uint256', + }, + ], + name: 'minterMint', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'name', + outputs: [ + { + internalType: 'string', + name: '', + type: 'string', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'operator', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'reductionPerCliff', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'symbol', + outputs: [ + { + internalType: 'string', + name: '', + type: 'string', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'totalCliffs', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + 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', + }, + { + inputs: [], + name: 'updateOperator', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'vecrvProxy', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, +]; + +export class AuraToken__factory { + static readonly abi = _abi; + static createInterface(): AuraTokenInterface { + return new utils.Interface(_abi) as AuraTokenInterface; + } + static connect(address: string, signerOrProvider: Signer | Provider): AuraToken { + return new Contract(address, _abi, signerOrProvider) as AuraToken; + } +} diff --git a/src/apps/aura/contracts/ethers/factories/AuraVirtualBalanceRewardPool__factory.ts b/src/apps/aura/contracts/ethers/factories/AuraVirtualBalanceRewardPool__factory.ts new file mode 100644 index 000000000..9ff44807c --- /dev/null +++ b/src/apps/aura/contracts/ethers/factories/AuraVirtualBalanceRewardPool__factory.ts @@ -0,0 +1,473 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from 'ethers'; +import type { Provider } from '@ethersproject/providers'; +import type { + AuraVirtualBalanceRewardPool, + AuraVirtualBalanceRewardPoolInterface, +} from '../AuraVirtualBalanceRewardPool'; + +const _abi = [ + { + inputs: [ + { + internalType: 'address', + name: 'deposit_', + type: 'address', + }, + { + internalType: 'address', + name: 'reward_', + type: 'address', + }, + { + internalType: 'address', + name: 'op_', + type: 'address', + }, + ], + stateMutability: 'nonpayable', + type: 'constructor', + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'uint256', + name: 'reward', + type: 'uint256', + }, + ], + name: 'RewardAdded', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'user', + type: 'address', + }, + { + indexed: false, + internalType: 'uint256', + name: 'reward', + type: 'uint256', + }, + ], + name: 'RewardPaid', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'user', + type: 'address', + }, + { + indexed: false, + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + ], + name: 'Staked', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'user', + type: 'address', + }, + { + indexed: false, + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + ], + name: 'Withdrawn', + type: 'event', + }, + { + inputs: [ + { + internalType: 'address', + name: 'account', + type: 'address', + }, + ], + name: 'balanceOf', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'currentRewards', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'deposits', + outputs: [ + { + internalType: 'contract IDeposit', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_amount', + type: 'uint256', + }, + ], + name: 'donate', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'duration', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'account', + type: 'address', + }, + ], + name: 'earned', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getReward', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '_account', + type: 'address', + }, + ], + name: 'getReward', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'historicalRewards', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'lastTimeRewardApplicable', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'lastUpdateTime', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'newRewardRatio', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'operator', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'periodFinish', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_rewards', + type: 'uint256', + }, + ], + name: 'queueNewRewards', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'queuedRewards', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'rewardPerToken', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'rewardPerTokenStored', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'rewardRate', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'rewardToken', + outputs: [ + { + internalType: 'contract IERC20', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + name: 'rewards', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '_account', + type: 'address', + }, + { + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + ], + name: 'stake', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'totalSupply', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + name: 'userRewardPerTokenPaid', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '_account', + type: 'address', + }, + { + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + ], + name: 'withdraw', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, +]; + +export class AuraVirtualBalanceRewardPool__factory { + static readonly abi = _abi; + static createInterface(): AuraVirtualBalanceRewardPoolInterface { + return new utils.Interface(_abi) as AuraVirtualBalanceRewardPoolInterface; + } + static connect(address: string, signerOrProvider: Signer | Provider): AuraVirtualBalanceRewardPool { + return new Contract(address, _abi, signerOrProvider) as AuraVirtualBalanceRewardPool; + } +} diff --git a/src/apps/aura/contracts/ethers/factories/BalancerHelpers__factory.ts b/src/apps/aura/contracts/ethers/factories/BalancerHelpers__factory.ts new file mode 100644 index 000000000..7f33ab200 --- /dev/null +++ b/src/apps/aura/contracts/ethers/factories/BalancerHelpers__factory.ts @@ -0,0 +1,166 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from 'ethers'; +import type { Provider } from '@ethersproject/providers'; +import type { BalancerHelpers, BalancerHelpersInterface } from '../BalancerHelpers'; + +const _abi = [ + { + inputs: [ + { + internalType: 'contract IVault', + name: '_vault', + type: 'address', + }, + ], + stateMutability: 'nonpayable', + type: 'constructor', + }, + { + 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: 'minAmountsOut', + type: 'uint256[]', + }, + { + internalType: 'bytes', + name: 'userData', + type: 'bytes', + }, + { + internalType: 'bool', + name: 'toInternalBalance', + type: 'bool', + }, + ], + internalType: 'struct IVault.ExitPoolRequest', + name: 'request', + type: 'tuple', + }, + ], + 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', + }, + { + 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: 'queryJoin', + outputs: [ + { + internalType: 'uint256', + name: 'bptOut', + type: 'uint256', + }, + { + internalType: 'uint256[]', + name: 'amountsIn', + type: 'uint256[]', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'vault', + outputs: [ + { + internalType: 'contract IVault', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, +]; + +export class BalancerHelpers__factory { + static readonly abi = _abi; + static createInterface(): BalancerHelpersInterface { + return new utils.Interface(_abi) as BalancerHelpersInterface; + } + static connect(address: string, signerOrProvider: Signer | Provider): BalancerHelpers { + return new Contract(address, _abi, signerOrProvider) as BalancerHelpers; + } +} diff --git a/src/apps/aura/contracts/ethers/factories/BaseRewardPool__factory.ts b/src/apps/aura/contracts/ethers/factories/BaseRewardPool__factory.ts new file mode 100644 index 000000000..60de0cbdc --- /dev/null +++ b/src/apps/aura/contracts/ethers/factories/BaseRewardPool__factory.ts @@ -0,0 +1,738 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { Signer, utils, Contract, ContractFactory, BigNumberish, Overrides } from 'ethers'; +import type { Provider, TransactionRequest } from '@ethersproject/providers'; +import type { BaseRewardPool, BaseRewardPoolInterface } from '../BaseRewardPool'; + +const _abi = [ + { + inputs: [ + { + internalType: 'uint256', + name: 'pid_', + type: 'uint256', + }, + { + internalType: 'address', + name: 'stakingToken_', + type: 'address', + }, + { + internalType: 'address', + name: 'rewardToken_', + type: 'address', + }, + { + internalType: 'address', + name: 'operator_', + type: 'address', + }, + { + internalType: 'address', + name: 'rewardManager_', + type: 'address', + }, + ], + stateMutability: 'nonpayable', + type: 'constructor', + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'uint256', + name: 'reward', + type: 'uint256', + }, + ], + name: 'RewardAdded', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'user', + type: 'address', + }, + { + indexed: false, + internalType: 'uint256', + name: 'reward', + type: 'uint256', + }, + ], + name: 'RewardPaid', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'user', + type: 'address', + }, + { + indexed: false, + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + ], + name: 'Staked', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'user', + type: 'address', + }, + { + indexed: false, + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + ], + name: 'Withdrawn', + type: 'event', + }, + { + inputs: [ + { + internalType: 'address', + name: '_reward', + type: 'address', + }, + ], + name: 'addExtraReward', + 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: 'clearExtraRewards', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'currentRewards', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_amount', + type: 'uint256', + }, + ], + name: 'donate', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'duration', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'account', + type: 'address', + }, + ], + name: 'earned', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + name: 'extraRewards', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'extraRewardsLength', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getReward', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '_account', + type: 'address', + }, + { + internalType: 'bool', + name: '_claimExtras', + type: 'bool', + }, + ], + name: 'getReward', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'historicalRewards', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'lastTimeRewardApplicable', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'lastUpdateTime', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'newRewardRatio', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'operator', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'periodFinish', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'pid', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'processIdleRewards', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_rewards', + type: 'uint256', + }, + ], + name: 'queueNewRewards', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'queuedRewards', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'rewardManager', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'rewardPerToken', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'rewardPerTokenStored', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'rewardRate', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'rewardToken', + outputs: [ + { + internalType: 'contract IERC20', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + name: 'rewards', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_amount', + type: 'uint256', + }, + ], + name: 'stake', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'stakeAll', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '_for', + type: 'address', + }, + { + internalType: 'uint256', + name: '_amount', + type: 'uint256', + }, + ], + name: 'stakeFor', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'stakingToken', + outputs: [ + { + internalType: 'contract IERC20', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'totalSupply', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + name: 'userRewardPerTokenPaid', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + { + internalType: 'bool', + name: 'claim', + type: 'bool', + }, + ], + name: 'withdraw', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bool', + name: 'claim', + type: 'bool', + }, + ], + name: 'withdrawAll', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bool', + name: 'claim', + type: 'bool', + }, + ], + name: 'withdrawAllAndUnwrap', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + { + internalType: 'bool', + name: 'claim', + type: 'bool', + }, + ], + name: 'withdrawAndUnwrap', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, +]; + +const _bytecode = + '0x61012060405260008055600060015560006004556000600555600060065534801561002957600080fd5b50604051611d09380380611d09833981810160405260a081101561004c57600080fd5b50805160208201516040830151606080850151608095860151610100959095526001600160601b031993821b841660a05291811b8316909452831b811660c052911b1660e05260805160601c60a05160601c60c05160601c60e05160601c61010051611beb61011e60003980610cd4528061106d528061175e5250806105ae52806106305280610acd52508061099c52806109cb5280610ca5528061179552508061069d52806108975280610e595280610eab5280610f75525080610c7c528061109e52806110dd5250611beb6000f3fe608060405234801561001057600080fd5b50600436106102265760003560e01c80636c8bcee811610130578063a694fc3a116100b8578063df136d651161007c578063df136d65146104f6578063ebe2b12b146104fe578063f106845414610506578063f14faf6f1461050e578063f7c618c11461052b57610226565b8063a694fc3a1461049c578063c32e7202146104b9578063c8f33c91146104de578063cd3daf9d146104e6578063d55a23f4146104ee57610226565b80637b0a47ee116100ff5780637b0a47ee1461045657806380faa57d1461045e5780638b876347146104665780638dcb40611461048c578063901a7d531461049457610226565b80636c8bcee8146103f25780637050ccd9146103fa57806370a082311461042857806372f702f31461044e57610226565b806338d07436116101b357806349f039a21161018257806349f039a214610380578063570ca7351461039f578063590a41f5146103a75780635e43c47b146103c457806363d38c3b146103ea57610226565b806338d074361461032e5780633d18b912146103535780633e8b83e31461035b57806340c354461461036357610226565b80630fb5a6b4116101fa5780630fb5a6b4146102b757806318160ddd146102bf5780631c1c6fe5146102c7578063262d3d6d146102e65780632ee40908146102ee57610226565b80628cc2621461022b5780630569d388146102635780630700037d1461026d5780630f4ef8a614610293575b600080fd5b6102516004803603602081101561024157600080fd5b50356001600160a01b0316610533565b60408051918252519081900360200190f35b61026b6105a3565b005b6102516004803603602081101561028357600080fd5b50356001600160a01b031661061c565b61029b61062e565b604080516001600160a01b039092168252519081900360200190f35b610251610652565b610251610659565b61026b600480360360208110156102dd57600080fd5b50351515610660565b61025161067e565b61031a6004803603604081101561030457600080fd5b506001600160a01b038135169060200135610684565b604080519115158252519081900360200190f35b61031a6004803603604081101561034457600080fd5b5080359060200135151561070e565b61031a610919565b61026b61092e565b61029b6004803603602081101561037957600080fd5b5035610959565b61026b6004803603602081101561039657600080fd5b50351515610980565b61029b61099a565b61031a600480360360208110156103bd57600080fd5b50356109be565b61031a600480360360208110156103da57600080fd5b50356001600160a01b0316610ac0565b610251610be0565b610251610be6565b61031a6004803603604081101561041057600080fd5b506001600160a01b0381351690602001351515610bec565b6102516004803603602081101561043e57600080fd5b50356001600160a01b0316610e3c565b61029b610e57565b610251610e7b565b610251610e81565b6102516004803603602081101561047c57600080fd5b50356001600160a01b0316610e94565b61031a610ea6565b610251610f56565b61031a600480360360208110156104b257600080fd5b5035610f5c565b61031a600480360360408110156104cf57600080fd5b50803590602001351515610fdb565b610251611005565b61025161100b565b610251611059565b61025161105f565b610251611065565b61025161106b565b61031a6004803603602081101561052457600080fd5b503561108f565b61029b6110db565b6001600160a01b038116600090815260096020908152604080832054600890925282205461059b919061059590670de0b6b3a76400009061058f906105809061057a61100b565b906110ff565b61058988610e3c565b9061115c565b906111bc565b90611223565b90505b919050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461060e576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b61061a600b6000611b0a565b565b60096020526000908152604090205481565b7f000000000000000000000000000000000000000000000000000000000000000081565b62093a8081565b6007545b90565b336000908152600a602052604090205461067a908261070e565b5050565b60065481565b6000610690828461127d565b6106c56001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333085611419565b6040805183815290516001600160a01b038516917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a25060015b92915050565b60003361071961100b565b600355610724610e81565b6002556001600160a01b0381161561076b5761073f81610533565b6001600160a01b0382166000908152600960209081526040808320939093556003546008909152919020555b600084116107c0576040805162461bcd60e51b815260206004820152601e60248201527f526577617264506f6f6c203a2043616e6e6f7420776974686472617720300000604482015290519081900360640190fd5b60005b600b5481101561085357600b81815481106107da57fe5b60009182526020822001546040805163f3fef3a360e01b81523360048201526024810189905290516001600160a01b039092169263f3fef3a39260448084019382900301818387803b15801561082f57600080fd5b505af1158015610843573d6000803e3d6000fd5b5050600190920191506107c39050565b5060075461086190856110ff565b600755336000908152600a602052604090205461087e90856110ff565b336000818152600a60205260409020919091556108c6907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169086611479565b60408051858152905133917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a2821561090f5761090d336001610bec565b505b5060019392505050565b6000610926336001610bec565b506001905090565b600054421015801561094257506000600454115b1561061a576109526004546114d0565b6000600455565b600b818154811061096657fe5b6000918252602090912001546001600160a01b0316905081565b336000908152600a602052604090205461067a9082610fdb565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a2b576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b600454610a39908390611223565b91506000544210610a5a57610a4d826114d0565b506000600455600161059e565b60008054610a7690610a6f9062093a806110ff565b42906110ff565b60015490915081026000610a908561058f846103e861115c565b905061033e811015610aaf57610aa5856114d0565b6000600455610ab5565b60048590555b506001949350505050565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b2d576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b6001600160a01b038216610b7a576040805162461bcd60e51b815260206004820152600f60248201526e217265776172642073657474696e6760881b604482015290519081900360640190fd5b600b54600c11610b8c5750600061059e565b50600b8054600181810183556000929092527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0384166001600160a01b0319909116179055919050565b60045481565b61033e81565b600082610bf761100b565b600355610c02610e81565b6002556001600160a01b03811615610c4957610c1d81610533565b6001600160a01b0382166000908152600960209081526040808320939093556003546008909152919020555b6000610c5485610533565b90508015610d9a576001600160a01b03808616600090815260096020526040812055610ca3907f0000000000000000000000000000000000000000000000000000000000000000168683611479565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166371192b177f000000000000000000000000000000000000000000000000000000000000000087846040518463ffffffff1660e01b815260040180848152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015610d4257600080fd5b505af1158015610d56573d6000803e3d6000fd5b50506040805184815290516001600160a01b03891693507fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e048692509081900360200190a25b8315610ab55760005b600b54811015610e3057600b8181548110610dba57fe5b600091825260208220015460408051630c00007b60e41b81526001600160a01b038a811660048301529151919092169263c00007b0926024808201939182900301818387803b158015610e0c57600080fd5b505af1158015610e20573d6000803e3d6000fd5b505060019092019150610da39050565b50506001949350505050565b6001600160a01b03166000908152600a602052604090205490565b7f000000000000000000000000000000000000000000000000000000000000000081565b60015481565b6000610e8f426000546115f4565b905090565b60086020526000908152604090205481565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f1657600080fd5b505afa158015610f2a573d6000803e3d6000fd5b505050506040513d6020811015610f4057600080fd5b50519050610f4d81610f5c565b50600191505090565b60055481565b6000610f68823361127d565b610f9d6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333085611419565b60408051838152905133917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a2506001919050565b6000610fe883333361160a565b508115610ffc57610ffa336001610bec565b505b50600192915050565b60025481565b6000611015610659565b611022575060035461065d565b610e8f611050611030610659565b61058f670de0b6b3a764000061058960015461058960025461057a610e81565b60035490611223565b600b5490565b60035481565b60005481565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006110c66001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333085611419565b6004546110d39083611223565b600455919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600082821115611156576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008261116b57506000610708565b8282028284828161117857fe5b04146111b55760405162461bcd60e51b8152600401808060200182810382526021815260200180611b6b6021913960400191505060405180910390fd5b9392505050565b6000808211611212576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161121b57fe5b049392505050565b6000828201838110156111b5576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b8061128661100b565b600355611291610e81565b6002556001600160a01b038116156112d8576112ac81610533565b6001600160a01b0382166000908152600960209081526040808320939093556003546008909152919020555b6000831161132d576040805162461bcd60e51b815260206004820152601b60248201527f526577617264506f6f6c203a2043616e6e6f74207374616b6520300000000000604482015290519081900360640190fd5b60005b600b548110156113c457600b818154811061134757fe5b6000918252602082200154604080516356e4bb9760e11b81526001600160a01b038781166004830152602482018990529151919092169263adc9772e926044808201939182900301818387803b1580156113a057600080fd5b505af11580156113b4573d6000803e3d6000fd5b5050600190920191506113309050565b506007546113d29084611223565b6007556001600160a01b0382166000908152600a60205260409020546113f89084611223565b6001600160a01b039092166000908152600a60205260409020919091555050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261147390859061183c565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526114cb90849061183c565b505050565b60006114da61100b565b6003556114e5610e81565b6002556001600160a01b0381161561152c5761150081610533565b6001600160a01b0382166000908152600960209081526040808320939093556003546008909152919020555b6006546115399083611223565b600655600054421061155a576115528262093a806111bc565b6001556115a2565b6000805461156890426110ff565b905060006115816001548361115c90919063ffffffff16565b905061158d8482611223565b935061159c8462093a806111bc565b60015550505b60058290554260028190556115ba9062093a80611223565b6000556040805183815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a15050565b600081831061160357816111b5565b5090919050565b60008261161561100b565b600355611620610e81565b6002556001600160a01b038116156116675761163b81610533565b6001600160a01b0382166000908152600960209081526040808320939093556003546008909152919020555b60005b600b548110156116fe57600b818154811061168157fe5b60009182526020822001546040805163f3fef3a360e01b81526001600160a01b038981166004830152602482018b90529151919092169263f3fef3a3926044808201939182900301818387803b1580156116da57600080fd5b505af11580156116ee573d6000803e3d6000fd5b50506001909201915061166a9050565b5060075461170c90866110ff565b6007556001600160a01b0384166000908152600a602052604090205461173290866110ff565b6001600160a01b038086166000908152600a60205260408082209390935582516305335c3960e21b81527f0000000000000000000000000000000000000000000000000000000000000000600482015260248101899052868316604482015292517f0000000000000000000000000000000000000000000000000000000000000000909216926314cd70e4926064808301939282900301818387803b1580156117da57600080fd5b505af11580156117ee573d6000803e3d6000fd5b50506040805188815290516001600160a01b03881693507f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d592509081900360200190a2506001949350505050565b6060611891826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166118ed9092919063ffffffff16565b8051909150156114cb578080602001905160208110156118b057600080fd5b50516114cb5760405162461bcd60e51b815260040180806020018281038252602a815260200180611b8c602a913960400191505060405180910390fd5b60606118fc8484600085611904565b949350505050565b6060824710156119455760405162461bcd60e51b8152600401808060200182810382526026815260200180611b456026913960400191505060405180910390fd5b61194e85611a60565b61199f576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106119de5780518252601f1990920191602091820191016119bf565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611a40576040519150601f19603f3d011682016040523d82523d6000602084013e611a45565b606091505b5091509150611a55828286611a66565b979650505050505050565b3b151590565b60608315611a755750816111b5565b825115611a855782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611acf578181015183820152602001611ab7565b50505050905090810190601f168015611afc5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5080546000825590600052602060002090810190611b289190611b2b565b50565b5b80821115611b405760008155600101611b2c565b509056fe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220d0d4834e546c839bf06d5243f76bcbd47043cf984843f141cd50e7972377895864736f6c634300060c0033'; + +type BaseRewardPoolConstructorParams = [signer?: Signer] | ConstructorParameters; + +const isSuperArgs = (xs: BaseRewardPoolConstructorParams): xs is ConstructorParameters => + xs.length > 1; + +export class BaseRewardPool__factory extends ContractFactory { + constructor(...args: BaseRewardPoolConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override deploy( + pid_: BigNumberish, + stakingToken_: string, + rewardToken_: string, + operator_: string, + rewardManager_: string, + overrides?: Overrides & { from?: string | Promise }, + ): Promise { + return super.deploy( + pid_, + stakingToken_, + rewardToken_, + operator_, + rewardManager_, + overrides || {}, + ) as Promise; + } + override getDeployTransaction( + pid_: BigNumberish, + stakingToken_: string, + rewardToken_: string, + operator_: string, + rewardManager_: string, + overrides?: Overrides & { from?: string | Promise }, + ): TransactionRequest { + return super.getDeployTransaction(pid_, stakingToken_, rewardToken_, operator_, rewardManager_, overrides || {}); + } + override attach(address: string): BaseRewardPool { + return super.attach(address) as BaseRewardPool; + } + override connect(signer: Signer): BaseRewardPool__factory { + return super.connect(signer) as BaseRewardPool__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): BaseRewardPoolInterface { + return new utils.Interface(_abi) as BaseRewardPoolInterface; + } + static connect(address: string, signerOrProvider: Signer | Provider): BaseRewardPool { + return new Contract(address, _abi, signerOrProvider) as BaseRewardPool; + } +} diff --git a/src/apps/aura/contracts/ethers/factories/index.ts b/src/apps/aura/contracts/ethers/factories/index.ts new file mode 100644 index 000000000..519ba4887 --- /dev/null +++ b/src/apps/aura/contracts/ethers/factories/index.ts @@ -0,0 +1,9 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export { AuraLocker__factory } from './AuraLocker__factory'; +export { AuraMasterchef__factory } from './AuraMasterchef__factory'; +export { AuraToken__factory } from './AuraToken__factory'; +export { AuraVirtualBalanceRewardPool__factory } from './AuraVirtualBalanceRewardPool__factory'; +export { BalancerHelpers__factory } from './BalancerHelpers__factory'; +export { BaseRewardPool__factory } from './BaseRewardPool__factory'; diff --git a/src/apps/aura/contracts/ethers/index.ts b/src/apps/aura/contracts/ethers/index.ts new file mode 100644 index 000000000..072ff25ca --- /dev/null +++ b/src/apps/aura/contracts/ethers/index.ts @@ -0,0 +1,16 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export type { AuraLocker } from './AuraLocker'; +export type { AuraMasterchef } from './AuraMasterchef'; +export type { AuraToken } from './AuraToken'; +export type { AuraVirtualBalanceRewardPool } from './AuraVirtualBalanceRewardPool'; +export type { BalancerHelpers } from './BalancerHelpers'; +export type { BaseRewardPool } from './BaseRewardPool'; +export * as factories from './factories'; +export { AuraLocker__factory } from './factories/AuraLocker__factory'; +export { AuraMasterchef__factory } from './factories/AuraMasterchef__factory'; +export { AuraToken__factory } from './factories/AuraToken__factory'; +export { AuraVirtualBalanceRewardPool__factory } from './factories/AuraVirtualBalanceRewardPool__factory'; +export { BalancerHelpers__factory } from './factories/BalancerHelpers__factory'; +export { BaseRewardPool__factory } from './factories/BaseRewardPool__factory'; diff --git a/src/apps/aura/contracts/index.ts b/src/apps/aura/contracts/index.ts new file mode 100644 index 000000000..9b92266f9 --- /dev/null +++ b/src/apps/aura/contracts/index.ts @@ -0,0 +1,48 @@ +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 { AuraLocker__factory } from './ethers'; +import { AuraMasterchef__factory } from './ethers'; +import { AuraToken__factory } from './ethers'; +import { AuraVirtualBalanceRewardPool__factory } from './ethers'; +import { BalancerHelpers__factory } from './ethers'; +import { BaseRewardPool__factory } from './ethers'; + +// eslint-disable-next-line +type ContractOpts = { address: string; network: Network }; + +@Injectable() +export class AuraContractFactory extends ContractFactory { + constructor(@Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit) { + super((network: Network) => appToolkit.getNetworkProvider(network)); + } + + auraLocker({ address, network }: ContractOpts) { + return AuraLocker__factory.connect(address, this.appToolkit.getNetworkProvider(network)); + } + auraMasterchef({ address, network }: ContractOpts) { + return AuraMasterchef__factory.connect(address, this.appToolkit.getNetworkProvider(network)); + } + auraToken({ address, network }: ContractOpts) { + return AuraToken__factory.connect(address, this.appToolkit.getNetworkProvider(network)); + } + auraVirtualBalanceRewardPool({ address, network }: ContractOpts) { + return AuraVirtualBalanceRewardPool__factory.connect(address, this.appToolkit.getNetworkProvider(network)); + } + balancerHelpers({ address, network }: ContractOpts) { + return BalancerHelpers__factory.connect(address, this.appToolkit.getNetworkProvider(network)); + } + baseRewardPool({ address, network }: ContractOpts) { + return BaseRewardPool__factory.connect(address, this.appToolkit.getNetworkProvider(network)); + } +} + +export type { AuraLocker } from './ethers'; +export type { AuraMasterchef } from './ethers'; +export type { AuraToken } from './ethers'; +export type { AuraVirtualBalanceRewardPool } from './ethers'; +export type { BalancerHelpers } from './ethers'; +export type { BaseRewardPool } from './ethers'; diff --git a/src/apps/aura/ethereum/aura.balance-fetcher.ts b/src/apps/aura/ethereum/aura.balance-fetcher.ts new file mode 100644 index 000000000..2b2f9f0e1 --- /dev/null +++ b/src/apps/aura/ethereum/aura.balance-fetcher.ts @@ -0,0 +1,211 @@ +import { Inject } from '@nestjs/common'; +import { BigNumber } from 'ethers'; +import { compact } from 'lodash'; + +import { drillBalance } from '~app-toolkit'; +import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; +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 { isClaimable, isSupplied, isLocked } from '~position/position.utils'; +import { Network } from '~types/network.interface'; + +import { AURA_DEFINITION } from '../aura.definition'; +import { AuraBaseRewardPoolDataProps } from '../aura.types'; +import { AuraContractFactory, AuraMasterchef, AuraVirtualBalanceRewardPool } from '../contracts'; +import { AuraBaseRewardPoolHelper } from '../helpers/aura.base-reward-pool-helper'; + +const appId = AURA_DEFINITION.id; +const groups = AURA_DEFINITION.groups; +const network = Network.ETHEREUM_MAINNET; + +type GetBaseRewardPoolBalancesParams = { + address: string; + groupId: string; +}; + +@Register.BalanceFetcher(appId, network) +export class EthereumAuraBalanceFetcher implements BalanceFetcher { + constructor( + @Inject(APP_TOOLKIT) private readonly appToolkit: IAppToolkit, + @Inject(AuraContractFactory) private readonly auraContractFactory: AuraContractFactory, + @Inject(AuraBaseRewardPoolHelper) private readonly auraBaseRewardPoolHelper: AuraBaseRewardPoolHelper, + ) {} + + async getBaseRewardPoolBalances({ address, groupId }: GetBaseRewardPoolBalancesParams) { + return this.appToolkit.helpers.contractPositionBalanceHelper.getContractPositionBalances( + { + appId, + groupId, + network, + address, + resolveBalances: async ({ address, contractPosition, multicall }) => { + const stakedToken = contractPosition.tokens.find(isSupplied); + const claimableTokens = contractPosition.tokens.filter(isClaimable); + + const rewardToken = claimableTokens.find( + ({ address }) => address.toLowerCase() === contractPosition.dataProps.rewardToken.toLowerCase(), + ); + const auraToken = claimableTokens.find( + ({ address }) => address.toLowerCase() === AURA_DEFINITION.token!.address, + ); + const extraRewardTokens = compact( + claimableTokens.filter(({ address }) => + contractPosition.dataProps.extraRewards.find( + extraReward => extraReward.rewardToken.toLowerCase() === address.toLowerCase(), + ), + ), + ); + + const baseRewardPool = this.auraContractFactory.baseRewardPool(contractPosition); + + const extraRewardPools: AuraVirtualBalanceRewardPool[] = contractPosition.dataProps.extraRewards + .filter(({ rewardToken }) => + extraRewardTokens.find(token => token.address.toLowerCase() === rewardToken.toLowerCase()), + ) + .map(({ address }) => this.auraContractFactory.auraVirtualBalanceRewardPool({ address, network })); + + const [stakedBalanceRaw, rewardBalanceRaw, ...extraRewardBalancesRaw] = await Promise.all([ + multicall.wrap(baseRewardPool).balanceOf(address), + multicall.wrap(baseRewardPool).earned(address), + ...extraRewardPools.map(virtualBalanceRewardPool => + multicall.wrap(virtualBalanceRewardPool).earned(address), + ), + ]); + + const auraRewardBalanceRaw = await this.auraBaseRewardPoolHelper.getAuraMintedForRewardToken({ + rewardTokenAmount: rewardBalanceRaw, + network, + }); + + return compact([ + stakedToken ? drillBalance(stakedToken, stakedBalanceRaw.toString()) : null, + rewardToken ? drillBalance(rewardToken, rewardBalanceRaw.toString()) : null, + auraToken ? drillBalance(auraToken, auraRewardBalanceRaw.toString()) : null, + ...extraRewardBalancesRaw.map((balanceRaw, index) => { + const extraRewardToken = extraRewardTokens[index]; + return extraRewardToken ? drillBalance(extraRewardToken, balanceRaw.toString()) : null; + }), + ]); + }, + }, + ); + } + + async getChefBalances(address: string) { + return this.appToolkit.helpers.masterChefContractPositionBalanceHelper.getBalances({ + appId, + groupId: groups.chef.id, + network, + address, + resolveChefContract: ({ contractAddress, network }) => + this.auraContractFactory.auraMasterchef({ address: contractAddress, network }), + resolveStakedTokenBalance: this.appToolkit.helpers.masterChefDefaultStakedBalanceStrategy.build({ + resolveStakedBalance: ({ contract, multicall, contractPosition }) => + multicall + .wrap(contract) + .userInfo(contractPosition.dataProps.poolIndex, address) + .then(v => v.amount), + }), + resolveClaimableTokenBalances: this.appToolkit.helpers.masterChefDefaultClaimableBalanceStrategy.build({ + resolveClaimableBalance: async ({ contract, contractPosition, multicall, address }) => { + const provider = this.appToolkit.getNetworkProvider(network); + const block = await provider.getBlockNumber(); + + const { poolIndex } = contractPosition.dataProps; + const [poolInfo, userInfo, totalAllocPoint, rewardPerBlock, endBlock] = await Promise.all([ + multicall.wrap(contract).poolInfo(poolIndex), + multicall.wrap(contract).userInfo(poolIndex, address), + multicall.wrap(contract).totalAllocPoint(), + multicall.wrap(contract).rewardPerBlock(), + multicall.wrap(contract).endBlock(), + ]); + + if (userInfo.amount.eq(0)) { + return 0; + } + + const lpToken = this.appToolkit.globalContracts.erc20({ address: poolInfo.lpToken, network }); + const lpSupply = await lpToken.balanceOf(contract.address); + + let { accCvxPerShare } = poolInfo; + if (poolInfo.lastRewardBlock.lt(block) && lpSupply.gt(0)) { + const clampedTo = Math.min(block, Number(endBlock)); + const clampedFrom = Math.min(Number(poolInfo.lastRewardBlock), Number(endBlock)); + const multiplier = BigNumber.from(clampedTo - clampedFrom); + const reward = multiplier.mul(rewardPerBlock).mul(poolInfo.allocPoint).div(totalAllocPoint); + accCvxPerShare = accCvxPerShare.add(reward.mul(10 ** 12).div(lpSupply)); + } + + return userInfo.amount + .mul(accCvxPerShare) + .div(10 ** 12) + .sub(userInfo.rewardDebt); + }, + }), + }); + } + + async getLockerBalances(address: string) { + const auraLockerAddress = '0x3fa73f1e5d8a792c80f426fc8f84fbf7ce9bbcac'; + + return this.appToolkit.helpers.contractPositionBalanceHelper.getContractPositionBalances({ + network, + appId, + address, + groupId: groups.locker.id, + resolveBalances: async ({ address, contractPosition, multicall, network }) => { + const auraLocker = this.auraContractFactory.auraLocker({ + address: auraLockerAddress, + network, + }); + + const [lockedBalances, claimableRewards] = await Promise.all([ + multicall.wrap(auraLocker).lockedBalances(address), + multicall.wrap(auraLocker).claimableRewards(address), + ]); + + const { unlockable, locked } = lockedBalances; + + const lockedToken = contractPosition.tokens.find(isLocked); + const suppliedToken = contractPosition.tokens.find(isSupplied); // Same as locked (ie AURA), but unlocked + const claimableTokens = contractPosition.tokens.filter(isClaimable); + + return compact([ + lockedToken ? drillBalance(lockedToken, locked.toString()) : null, + suppliedToken ? drillBalance(suppliedToken, unlockable.toString()) : null, + ...claimableRewards.map(({ token, amount }) => { + const claimableToken = claimableTokens.find(t => t.address.toLowerCase() === token.toLowerCase()); + return claimableToken ? drillBalance(claimableToken, amount.toString()) : null; + }), + ]); + }, + }); + } + + private async getStakingBalances(address: string) { + return this.getBaseRewardPoolBalances({ address, groupId: groups.staking.id }); + } + + private async getPoolsBalances(address: string) { + return this.getBaseRewardPoolBalances({ address, groupId: groups.pools.id }); + } + + async getBalances(address: string) { + const groupBalances = await Promise.all([ + this.getLockerBalances(address), + this.getChefBalances(address), + this.getStakingBalances(address), + this.getPoolsBalances(address), + ]); + + return presentBalanceFetcherResponse( + groupBalances + .filter(assets => assets.length > 0) + .map(assets => ({ + assets, + label: groups[assets[0].groupId].label, + })), + ); + } +} diff --git a/src/apps/aura/ethereum/aura.chef.contract-position-fetcher.ts b/src/apps/aura/ethereum/aura.chef.contract-position-fetcher.ts new file mode 100644 index 000000000..f40a0b2f6 --- /dev/null +++ b/src/apps/aura/ethereum/aura.chef.contract-position-fetcher.ts @@ -0,0 +1,60 @@ +import { Inject } from '@nestjs/common'; + +import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; +import { Register } from '~app-toolkit/decorators'; +import { BALANCER_V2_DEFINITION } from '~apps/balancer-v2'; +import { PositionFetcher } from '~position/position-fetcher.interface'; +import { ContractPosition } from '~position/position.interface'; +import { Network } from '~types/network.interface'; + +import { AURA_DEFINITION } from '../aura.definition'; +import { AuraContractFactory, AuraMasterchef } from '../contracts'; + +const appId = AURA_DEFINITION.id; +const groupId = AURA_DEFINITION.groups.chef.id; +const network = Network.ETHEREUM_MAINNET; + +@Register.ContractPositionFetcher({ appId, groupId, network }) +export class EthereumAuraChefContractPositionFetcher implements PositionFetcher { + constructor( + @Inject(APP_TOOLKIT) private readonly appToolkit: IAppToolkit, + @Inject(AuraContractFactory) private readonly auraContractFactory: AuraContractFactory, + ) {} + + async getPositions() { + return this.appToolkit.helpers.masterChefContractPositionHelper.getContractPositions({ + address: '0x1ab80f7fb46b25b7e0b2cfac23fc88ac37aaf4e9', + network, + appId, + groupId, + dependencies: [ + { appId, network, groupIds: [groupId] }, + { appId: BALANCER_V2_DEFINITION.id, network, groupIds: [BALANCER_V2_DEFINITION.groups.pool.id] }, + ], + resolvePoolIndexIsValid: async ({ contract, poolIndex, multicall }) => + // pid 0 is deprecated + poolIndex > 0 && poolIndex < Number(await multicall.wrap(contract).poolLength()), + resolveLiquidity: ({ depositTokenAddress, address, multicall }) => + multicall + .wrap(this.appToolkit.globalContracts.erc20({ network, address: depositTokenAddress })) + .balanceOf(address), + resolveDepositTokenAddress: ({ contract, multicall, poolIndex }) => + multicall + .wrap(contract) + .poolInfo(poolIndex) + .then(v => v.lpToken), + resolveRewardRate: async ({ contract, multicall, poolIndex }) => { + const [rewardPerBlock, totalAllocPoint, { allocPoint }] = await Promise.all([ + multicall.wrap(contract).rewardPerBlock(), + multicall.wrap(contract).totalAllocPoint(), + multicall.wrap(contract).poolInfo(poolIndex), + ]); + + return rewardPerBlock.mul(allocPoint.mul(1000).div(totalAllocPoint)).div(1000); + }, + resolvePoolLength: ({ multicall, contract }) => multicall.wrap(contract).poolLength(), + resolveContract: ({ address, network }) => this.auraContractFactory.auraMasterchef({ address, network }), + resolveRewardTokenAddresses: ({ multicall, contract }) => multicall.wrap(contract).cvx(), + }); + } +} diff --git a/src/apps/aura/ethereum/aura.chef.token-fetcher.ts b/src/apps/aura/ethereum/aura.chef.token-fetcher.ts new file mode 100644 index 000000000..b2a85caf6 --- /dev/null +++ b/src/apps/aura/ethereum/aura.chef.token-fetcher.ts @@ -0,0 +1,173 @@ +import { Inject } from '@nestjs/common'; +import { BigNumber, utils } from 'ethers'; +import { compact } from 'lodash'; + +import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; +import { Register } from '~app-toolkit/decorators'; +import { buildDollarDisplayItem } from '~app-toolkit/helpers/presentation/display-item.present'; +import { getTokenImg } from '~app-toolkit/helpers/presentation/image.present'; +import { BALANCER_V2_DEFINITION } from '~apps/balancer-v2'; +import { ContractType } from '~position/contract.interface'; +import { PositionFetcher } from '~position/position-fetcher.interface'; +import { AppTokenPosition } from '~position/position.interface'; +import { Network } from '~types/network.interface'; + +import { AURA_DEFINITION } from '../aura.definition'; +import { BalancerPool } from '../aura.types'; +import { AuraContractFactory } from '../contracts'; +import { AuraBalancerPoolsHelper } from '../helpers/aura.balancer-pools-helper'; + +type GetAuraBALStableParams = { auraBAL: AppTokenPosition | null; balancerPool: BalancerPool }; + +const appId = AURA_DEFINITION.id; +const groupId = AURA_DEFINITION.groups.chef.id; +const network = Network.ETHEREUM_MAINNET; + +const AURA_BAL_ADDRESS = '0x616e8bfa43f920657b3497dbf40d6b1a02d4608d'; +const B_80BAL_20WETH_ADDRESS = '0x5c6ee304399dbdb9c8ef030ab642b10820db8f56'; +const STABLE_POOL_ID = '0x3dd0843a028c86e0b760b1a76929d1c5ef93a2dd000200000000000000000249'; + +@Register.TokenPositionFetcher({ appId, groupId, network }) +export class EthereumAuraChefTokenFetcher implements PositionFetcher { + constructor( + @Inject(APP_TOOLKIT) private readonly appToolkit: IAppToolkit, + @Inject(AuraContractFactory) private readonly auraContractFactory: AuraContractFactory, + @Inject(AuraBalancerPoolsHelper) private readonly auraBalancerPoolsHelper: AuraBalancerPoolsHelper, + ) {} + + async getPositions() { + const balancerPool = await this.auraBalancerPoolsHelper.getBalancerPool(STABLE_POOL_ID); + if (!balancerPool) { + return []; + } + + const auraBAL = await this.getAuraBAL(balancerPool); + + const auraBALStable = await this.getAuraBALStable({ auraBAL, balancerPool }); + + return compact([auraBAL, auraBALStable]); + } + + private async getAuraBALPrice(balancerPool: BalancerPool) { + const { tokens, totalLiquidity, totalShares } = balancerPool; + + const auraBAL = tokens.find(token => token.address === AURA_BAL_ADDRESS); + if (!auraBAL) { + return null; + } + + // Single-sided join: add 100 auraBAL + const auraBALAmount = utils.parseUnits('100', auraBAL.decimals); + const maxAmountsIn = tokens.map(token => (token.address === AURA_BAL_ADDRESS ? auraBALAmount : BigNumber.from(0))); + + const { bptOut } = await this.auraBalancerPoolsHelper.getBPTOut({ balancerPool, maxAmountsIn }); + + const bptPerAuraBALRaw = bptOut.mul(utils.parseEther('1')).div(auraBALAmount); + const bptPerAuraBAL = Number(bptPerAuraBALRaw) / 10 ** 18; + + const bptPrice = totalLiquidity / totalShares; + + const auraBALPrice = bptPrice / bptPerAuraBAL; + return auraBALPrice; + } + + private async getAuraBAL(balancerPool: BalancerPool) { + const tokenData = balancerPool.tokens.find(token => token.address === AURA_BAL_ADDRESS); + if (!tokenData) { + return null; + } + + const { address, symbol, decimals } = tokenData; + + const contract = this.appToolkit.globalContracts.erc20({ address, network }); + const totalSupplyRaw = await contract.totalSupply(); + + const supply = Number(totalSupplyRaw) / 10 ** decimals; + + const price = await this.getAuraBALPrice(balancerPool); + if (!price) { + return null; + } + + const liquidity = price * supply; + + const token: AppTokenPosition = { + type: ContractType.APP_TOKEN, + appId, + groupId, + address, + tokens: [], + price, + pricePerShare: 1, + symbol, + decimals, + supply, + network, + dataProps: {}, + displayProps: { + label: symbol, + images: [getTokenImg(address)], + statsItems: [ + { + label: 'Liquidity', + value: buildDollarDisplayItem(liquidity), + }, + ], + }, + }; + + return token; + } + + async getAuraBALStable({ auraBAL, balancerPool }: GetAuraBALStableParams) { + if (!auraBAL) { + return null; + } + + const appTokens = await this.appToolkit.getAppTokenPositions({ + appId: BALANCER_V2_DEFINITION.id, + network, + groupIds: [BALANCER_V2_DEFINITION.groups.pool.id], + }); + + const b80BAL20WETH = appTokens.find(token => token.address.toLowerCase() === B_80BAL_20WETH_ADDRESS); + if (!b80BAL20WETH) { + return null; + } + + const { symbol, address, totalLiquidity, totalShares } = balancerPool; + + const tokens = [auraBAL, b80BAL20WETH]; + + const price = totalLiquidity / totalShares; + + const token: AppTokenPosition = { + type: ContractType.APP_TOKEN, + address, + network, + appId, + groupId, + symbol, + decimals: 18, + supply: totalShares, + price, + pricePerShare: 1, + tokens, + dataProps: { + liquidity: totalLiquidity, + }, + displayProps: { + label: symbol, + images: tokens.map(v => getTokenImg(v.address, network)), + statsItems: [ + { + label: 'Liquidity', + value: buildDollarDisplayItem(totalLiquidity), + }, + ], + }, + }; + + return token; + } +} diff --git a/src/apps/aura/ethereum/aura.locker.contract-position-fetcher.ts b/src/apps/aura/ethereum/aura.locker.contract-position-fetcher.ts new file mode 100644 index 000000000..0a3fb85ed --- /dev/null +++ b/src/apps/aura/ethereum/aura.locker.contract-position-fetcher.ts @@ -0,0 +1,142 @@ +import { Inject } from '@nestjs/common'; +import { BigNumber } from 'ethers'; +import { gql } from 'graphql-request'; +import { compact } from 'lodash'; + +import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; +import { Register } from '~app-toolkit/decorators'; +import { + buildDollarDisplayItem, + buildPercentageDisplayItem, +} from '~app-toolkit/helpers/presentation/display-item.present'; +import { getTokenImg } from '~app-toolkit/helpers/presentation/image.present'; +import { SynthetixSingleStakingRoiStrategy } from '~apps/synthetix'; +import { ContractType } from '~position/contract.interface'; +import { PositionFetcher } from '~position/position-fetcher.interface'; +import { ContractPosition } from '~position/position.interface'; +import { claimable, locked, supplied } from '~position/position.utils'; +import { Network } from '~types/network.interface'; + +import { AURA_DEFINITION } from '../aura.definition'; +import { AuraContractFactory, AuraLocker } from '../contracts'; + +const appId = AURA_DEFINITION.id; +const groupId = AURA_DEFINITION.groups.locker.id; +const network = Network.ETHEREUM_MAINNET; + +type AuraLockerQuery = { + auraLocker: { + totalSupply: string; + rewardData: { + token: { id: string }; + rewardRate: string; + }[]; + }; +}; + +const AURA_LOCKER_QUERY = gql` + { + auraLocker(id: "auraLocker") { + totalSupply + rewardData { + rewardRate + token { + id + } + } + } + } +`; + +@Register.ContractPositionFetcher({ appId, groupId, network }) +export class EthereumAuraLockerContractPositionFetcher implements PositionFetcher { + constructor( + @Inject(APP_TOOLKIT) private readonly appToolkit: IAppToolkit, + @Inject(AuraContractFactory) private readonly auraContractFactory: AuraContractFactory, + @Inject(SynthetixSingleStakingRoiStrategy) private readonly roiStrategy: SynthetixSingleStakingRoiStrategy, + ) {} + + async getPositions() { + const address = '0x3fa73f1e5d8a792c80f426fc8f84fbf7ce9bbcac'; + + const contract = this.auraContractFactory.auraLocker({ address, network }); + const multicall = this.appToolkit.getMulticall(network); + + const baseTokens = await this.appToolkit.getBaseTokenPrices(network); + const appTokens = await this.appToolkit.getAppTokenPositions({ + appId, + groupIds: [AURA_DEFINITION.groups.chef.id], + network, + }); + + const allTokens = [...baseTokens, ...appTokens]; + + const auraToken = allTokens.find(t => t.address.toLowerCase() === AURA_DEFINITION.token!.address.toLowerCase()); + if (!auraToken) return []; + + const { totalSupply, rewardData } = await this.getAuraLockerData(); + + const rewardTokenMatches = compact( + rewardData.map(({ address, rewardRate }) => { + const token = allTokens.find(token => token.address.toLowerCase() === address); + return token ? { token, rewardRate } : null; + }), + ); + + const lockedToken = locked(auraToken); + const unlockedToken = supplied(auraToken); + const rewardTokens = rewardTokenMatches.map(({ token }) => claimable(token)); + const tokens = [lockedToken, unlockedToken, ...rewardTokens]; + + const liquidity = (Number(totalSupply) / 10 ** lockedToken.decimals) * lockedToken.price; + + const roisStrategy = this.roiStrategy.build({ + resolveRewardRates: async () => rewardTokenMatches.map(({ rewardRate }) => rewardRate), + }); + const rois = await roisStrategy({ + contract, + multicall, + rewardTokens, + address, + network, + stakedToken: lockedToken, + liquidity, + }); + + const position: ContractPosition = { + type: ContractType.POSITION, + appId, + groupId, + address, + network, + tokens, + dataProps: { + liquidity, + rois, + }, + displayProps: { + label: 'Vote-locked Aura (vlAURA)', + images: [getTokenImg(lockedToken.address, network)], + statsItems: [ + { label: 'APR', value: buildPercentageDisplayItem(rois.yearlyROI * 100) }, + { label: 'Liquidity', value: buildDollarDisplayItem(liquidity) }, + ], + }, + }; + + return [position]; + } + + private async getAuraLockerData() { + const { + auraLocker: { rewardData, totalSupply }, + } = await this.appToolkit.helpers.theGraphHelper.request({ + endpoint: 'https://api.thegraph.com/subgraphs/name/aurafinance/aura', + query: AURA_LOCKER_QUERY, + }); + return { + totalSupply: BigNumber.from(totalSupply), + rewardData: rewardData.map(({ token: { id }, rewardRate }) => ({ address: id.toLowerCase(), rewardRate })), + }; + } +} diff --git a/src/apps/aura/ethereum/aura.pools.contract-position-fetcher.ts b/src/apps/aura/ethereum/aura.pools.contract-position-fetcher.ts new file mode 100644 index 000000000..81bd5f3c8 --- /dev/null +++ b/src/apps/aura/ethereum/aura.pools.contract-position-fetcher.ts @@ -0,0 +1,64 @@ +import { Inject } from '@nestjs/common'; +import { gql } from 'graphql-request'; +import { compact } from 'lodash'; + +import { IAppToolkit, APP_TOOLKIT } from '~app-toolkit/app-toolkit.interface'; +import { Register } from '~app-toolkit/decorators'; +import { AuraBaseRewardPoolHelper } from '~apps/aura/helpers/aura.base-reward-pool-helper'; +import { BALANCER_V2_DEFINITION } from '~apps/balancer-v2'; +import { PositionFetcher } from '~position/position-fetcher.interface'; +import { ContractPosition } from '~position/position.interface'; +import { Network } from '~types/network.interface'; + +import { AURA_DEFINITION } from '../aura.definition'; +import { AuraContractFactory } from '../contracts'; + +const appId = AURA_DEFINITION.id; +const groupId = AURA_DEFINITION.groups.pools.id; +const network = Network.ETHEREUM_MAINNET; + +type RewardPools = { + pools: { + rewardPool: string; + }[]; +}; + +const REWARD_POOLS_QUERY = gql` + { + pools(where: { isFactoryPool: true }) { + rewardPool + } + } +`; + +@Register.ContractPositionFetcher({ appId, groupId, network }) +export class EthereumAuraPoolsContractPositionFetcher implements PositionFetcher { + constructor( + @Inject(APP_TOOLKIT) private readonly appToolkit: IAppToolkit, + @Inject(AuraContractFactory) private readonly auraContractFactory: AuraContractFactory, + @Inject(AuraBaseRewardPoolHelper) private readonly auraBaseRewardPoolHelper: AuraBaseRewardPoolHelper, + ) {} + + async getPositions() { + const rewardPools = await this.getRewardPools(); + + return this.auraBaseRewardPoolHelper.getBaseRewardPoolContractPositions({ + appId, + network, + groupId, + dependencies: [ + { appId: BALANCER_V2_DEFINITION.id, network, groupIds: [BALANCER_V2_DEFINITION.groups.pool.id] }, + { appId, network, groupIds: [AURA_DEFINITION.groups.chef.id, groupId] }, + ], + rewardPools, + }); + } + + private async getRewardPools() { + const { pools } = await this.appToolkit.helpers.theGraphHelper.request({ + endpoint: 'https://api.thegraph.com/subgraphs/name/aurafinance/aura', + query: REWARD_POOLS_QUERY, + }); + return compact(pools.map(pool => pool.rewardPool)); + } +} diff --git a/src/apps/aura/ethereum/aura.pools.token-fetcher.ts b/src/apps/aura/ethereum/aura.pools.token-fetcher.ts new file mode 100644 index 000000000..33cb5b24a --- /dev/null +++ b/src/apps/aura/ethereum/aura.pools.token-fetcher.ts @@ -0,0 +1,122 @@ +import { Inject } from '@nestjs/common'; +import { gql } from 'graphql-request'; +import { compact } from 'lodash'; + +import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; +import { Register } from '~app-toolkit/decorators'; +import { getTokenImg } from '~app-toolkit/helpers/presentation/image.present'; +import { BALANCER_V2_DEFINITION } from '~apps/balancer-v2'; +import { ContractType } from '~position/contract.interface'; +import { PositionFetcher } from '~position/position-fetcher.interface'; +import { AppTokenPosition } from '~position/position.interface'; +import { Network } from '~types/network.interface'; + +import { AURA_DEFINITION } from '../aura.definition'; +import { AuraContractFactory } from '../contracts'; + +type Pools = { + pools: { + depositToken: { + id: string; + symbol: string; + name: string; + decimals: number; + }; + lpToken: { + id: string; + symbol: string; + name: string; + decimals: number; + }; + totalSupply: string; + }[]; +}; + +const appId = AURA_DEFINITION.id; +const groupId = AURA_DEFINITION.groups.pools.id; +const network = Network.ETHEREUM_MAINNET; + +const QUERY = gql` + { + pools(where: { isFactoryPool: true }) { + depositToken { + id + symbol + name + decimals + } + lpToken { + id + symbol + decimals + name + } + totalSupply + rewardPool + } + } +`; + +@Register.TokenPositionFetcher({ appId, groupId, network }) +export class EthereumAuraPoolsTokenFetcher implements PositionFetcher { + constructor( + @Inject(APP_TOOLKIT) private readonly appToolkit: IAppToolkit, + @Inject(AuraContractFactory) private readonly auraContractFactory: AuraContractFactory, + ) {} + + async getPositions() { + const appTokens = await this.appToolkit.getAppTokenPositions( + { + appId: BALANCER_V2_DEFINITION.id, + groupIds: [BALANCER_V2_DEFINITION.groups.pool.id], + network, + }, + { + appId, + groupIds: [AURA_DEFINITION.groups.chef.id], + network, + }, + ); + + const { pools } = await this.appToolkit.helpers.theGraphHelper.request({ + endpoint: 'https://api.thegraph.com/subgraphs/name/aurafinance/aura', + query: QUERY, + }); + + // Aura platform deposit tokens (e.g. aBPT tokens) + const depositTokens = pools.map( + ({ depositToken, lpToken: { id: lpTokenAddress }, totalSupply }) => { + const address = depositToken.id.toLowerCase(); + const { decimals, symbol } = depositToken; + + const lpToken = appTokens.find(token => token.address.toLowerCase() === lpTokenAddress.toLowerCase()); + if (!lpToken) { + return null; + } + + const supply = Number(totalSupply) / 10 ** decimals; + + return { + type: ContractType.APP_TOKEN, + appId, + groupId, + network, + address, + decimals, + symbol, + supply, + price: lpToken.price, + tokens: [lpToken], + displayProps: { + label: symbol, + images: [getTokenImg(address)], + }, + dataProps: {}, + pricePerShare: 1, + }; + }, + ); + + return compact(depositTokens); + } +} diff --git a/src/apps/aura/ethereum/aura.staking.contract-position-fetcher.ts b/src/apps/aura/ethereum/aura.staking.contract-position-fetcher.ts new file mode 100644 index 000000000..631bd8109 --- /dev/null +++ b/src/apps/aura/ethereum/aura.staking.contract-position-fetcher.ts @@ -0,0 +1,38 @@ +import { Inject } from '@nestjs/common'; + +import { IAppToolkit, APP_TOOLKIT } from '~app-toolkit/app-toolkit.interface'; +import { Register } from '~app-toolkit/decorators'; +import { AuraBaseRewardPoolHelper } from '~apps/aura/helpers/aura.base-reward-pool-helper'; +import { BALANCER_V2_DEFINITION } from '~apps/balancer-v2'; +import { PositionFetcher } from '~position/position-fetcher.interface'; +import { ContractPosition } from '~position/position.interface'; +import { Network } from '~types/network.interface'; + +import { AURA_DEFINITION } from '../aura.definition'; +import { AuraContractFactory } from '../contracts'; + +const appId = AURA_DEFINITION.id; +const groupId = AURA_DEFINITION.groups.staking.id; +const network = Network.ETHEREUM_MAINNET; + +@Register.ContractPositionFetcher({ appId, groupId, network }) +export class EthereumAuraStakingContractPositionFetcher implements PositionFetcher { + constructor( + @Inject(APP_TOOLKIT) private readonly appToolkit: IAppToolkit, + @Inject(AuraContractFactory) private readonly auraContractFactory: AuraContractFactory, + @Inject(AuraBaseRewardPoolHelper) private readonly auraBaseRewardPoolHelper: AuraBaseRewardPoolHelper, + ) {} + + async getPositions() { + return this.auraBaseRewardPoolHelper.getBaseRewardPoolContractPositions({ + appId, + network, + groupId, + dependencies: [ + { appId: BALANCER_V2_DEFINITION.id, network, groupIds: [BALANCER_V2_DEFINITION.groups.pool.id] }, + { appId, network, groupIds: [groupId, AURA_DEFINITION.groups.chef.id] }, + ], + rewardPools: ['0x5e5ea2048475854a5702f5b8468a51ba1296efcc'], + }); + } +} diff --git a/src/apps/aura/helpers/aura.balancer-pools-helper.ts b/src/apps/aura/helpers/aura.balancer-pools-helper.ts new file mode 100644 index 000000000..12638b90a --- /dev/null +++ b/src/apps/aura/helpers/aura.balancer-pools-helper.ts @@ -0,0 +1,148 @@ +import { Inject, Injectable } from '@nestjs/common'; +import { BigNumber, ethers } from 'ethers'; +import { gql } from 'graphql-request'; + +import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; +import { Cache } from '~cache/cache.decorator'; +import { Network } from '~types'; + +import { AURA_DEFINITION } from '../aura.definition'; +import { BalancerPool } from '../aura.types'; +import { AuraContractFactory } from '../index'; + +type GetPoolResponse = { + pool: { + id: string; + address: string; + name: string; + poolType: string; + swapFee: string; + symbol: string; + tokensList: string; + totalLiquidity: string; + totalSwapVolume: string; + totalSwapFee: string; + totalShares: string; + tokens: { + address: string; + symbol: string; + decimals: number; + balance: string; + weight: string; + }[]; + } | null; +}; + +type GetBPTOutParams = { balancerPool: BalancerPool; maxAmountsIn: BigNumber[]; sender?: string; recipient?: string }; + +const GET_POOL_QUERY = gql` + query getPool($id: ID!) { + pool(id: $id) { + id + address + name + poolType + swapFee + symbol + tokensList + totalLiquidity + totalSwapVolume + totalSwapFee + totalShares + tokens { + address + symbol + decimals + balance + weight + } + } + } +`; + +const BALANCER_VAULT = '0xba12222222228d8ba445958a75a0704d566bf2c8'; + +const network = Network.ETHEREUM_MAINNET; + +@Injectable() +export class AuraBalancerPoolsHelper { + constructor( + @Inject(APP_TOOLKIT) private readonly appToolkit: IAppToolkit, + @Inject(AuraContractFactory) private readonly auraContractFactory: AuraContractFactory, + ) {} + + @Cache({ + key: (poolId: string) => `apps-v3:${AURA_DEFINITION.id}:balancer-pools-${poolId}`, + ttl: 15 * 60, // 15 minutes + }) + async getBalancerPool(poolId: string): Promise { + const { pool } = await this.appToolkit.helpers.theGraphHelper.request({ + endpoint: 'https://api.thegraph.com/subgraphs/name/balancer-labs/balancer-v2', + query: GET_POOL_QUERY, + variables: { id: poolId }, + }); + + if (!pool) { + return null; + } + + const { + id, + address, + name, + poolType, + swapFee, + symbol, + tokensList, + totalLiquidity, + totalSwapVolume, + totalSwapFee, + totalShares, + tokens, + } = pool; + + return { + id, + address, + name, + poolType, + swapFee: Number(swapFee), + symbol, + tokensList, + totalLiquidity: Number(totalLiquidity), + totalSwapVolume: Number(totalSwapVolume), + totalSwapFee: Number(totalSwapFee), + totalShares: Number(totalShares), + tokens: tokens.map(({ address, balance, symbol, decimals, weight }) => ({ + address, + balance: Number(balance), + symbol, + decimals, + weight: Number(weight), + })), + }; + } + + async getBPTOut({ + balancerPool, + maxAmountsIn, + sender = BALANCER_VAULT, + recipient = BALANCER_VAULT, + }: GetBPTOutParams) { + const { id, tokens } = balancerPool; + + const balancerHelpers = this.auraContractFactory.balancerHelpers({ + address: '0x5aDDCCa35b7A0D07C74063c48700C8590E87864E', + network, + }); + + const joinPoolRequestStruct = { + assets: tokens.map(token => token.address), + maxAmountsIn, + userData: ethers.utils.defaultAbiCoder.encode(['uint256', 'uint256[]', 'uint256'], [1, maxAmountsIn, 0]), + fromInternalBalance: false, + }; + + return balancerHelpers.callStatic.queryJoin(id, sender, recipient, joinPoolRequestStruct); + } +} diff --git a/src/apps/aura/helpers/aura.base-reward-pool-helper.ts b/src/apps/aura/helpers/aura.base-reward-pool-helper.ts new file mode 100644 index 000000000..5efc0ee95 --- /dev/null +++ b/src/apps/aura/helpers/aura.base-reward-pool-helper.ts @@ -0,0 +1,209 @@ +import { Inject, Injectable } from '@nestjs/common'; +import { BigNumber } from 'ethers'; + +import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; +import { AURA_DEFINITION, AuraContractFactory } from '~apps/aura'; +import { AuraBaseRewardPoolDataProps } from '~apps/aura/aura.types'; +import { BaseRewardPool } from '~apps/aura/contracts'; +import { SynthetixSingleStakingIsActiveStrategy, SynthetixSingleStakingRoiStrategy } from '~apps/synthetix'; +import { ContractPosition } from '~position/position.interface'; +import { AppGroupsDefinition } from '~position/position.service'; +import { Network } from '~types'; + +type GetRewardsDataPropsParams = { + network: Network; + rewardPools: string[]; +}; + +type GetBaseRewardPoolContractPositionsParams = { + appId: string; + groupId: string; + network: Network; + dependencies: AppGroupsDefinition[]; + rewardPools: string[]; +}; + +type GetAuraMintedForRewardTokenParams = { + rewardTokenAmount: BigNumber; + network: Network; +}; + +type GetAuraRewardRateParams = { + rewardRate: BigNumber; + network: Network; +}; + +@Injectable() +export class AuraBaseRewardPoolHelper { + constructor( + @Inject(APP_TOOLKIT) private readonly appToolkit: IAppToolkit, + @Inject(AuraContractFactory) private readonly auraContractFactory: AuraContractFactory, + @Inject(SynthetixSingleStakingIsActiveStrategy) + private readonly isActiveStrategy: SynthetixSingleStakingIsActiveStrategy, + @Inject(SynthetixSingleStakingRoiStrategy) private readonly roiStrategy: SynthetixSingleStakingRoiStrategy, + ) {} + + async getBaseRewardPoolContractPositions({ + appId, + groupId, + network, + dependencies, + rewardPools, + }: GetBaseRewardPoolContractPositionsParams) { + // Get the reward tokens and extra rewards up front because we need some + // extra dataProps in order to resolve earned rewards across base reward + // pools and virtual reward pools + const rewardsDataProps = await this.getRewardsDataProps({ rewardPools, network }); + + const contractPositions: ContractPosition[] = + await this.appToolkit.helpers.singleStakingFarmContractPositionHelper.getContractPositions({ + network, + appId, + groupId, + dependencies, + resolveFarmContract: ({ address, network }) => this.auraContractFactory.baseRewardPool({ address, network }), + resolveFarmAddresses: () => rewardPools, + resolveLiquidity: ({ contract, multicall }) => multicall.wrap(contract).totalSupply(), + resolveIsActive: this.isActiveStrategy.build({ + resolvePeriodFinish: ({ contract, multicall }) => multicall.wrap(contract).periodFinish(), + }), + resolveRewardTokenAddresses: async ({ contract }) => { + const rewards = rewardsDataProps.find(r => r.rewardPool === contract.address)!; + const { rewardToken, extraRewards } = rewards; + return [rewardToken, AURA_DEFINITION.token!.address, ...extraRewards.map(r => r.rewardToken)]; + }, + resolveStakedTokenAddress: ({ contract, multicall }) => multicall.wrap(contract).stakingToken(), + resolveRois: opts => { + const strategy = this.roiStrategy.build({ + resolveRewardRates: async ({ contract, multicall }) => { + // Platform reward (e.g. BAL) + const rewardRate = await contract.rewardRate(); + + const { extraRewards } = rewardsDataProps.find(r => r.rewardPool === contract.address)!; + + // AURA reward and extra rewards + const otherRewardRates = await Promise.all([ + this.getAuraRewardRate({ network, rewardRate }), + ...extraRewards.map(({ address }) => + multicall + .wrap(this.auraContractFactory.auraVirtualBalanceRewardPool({ address, network })) + .rewardRate(), + ), + ]); + + return [rewardRate, ...otherRewardRates]; + }, + }); + return strategy(opts); + }, + }); + + return contractPositions.map>( + ({ dataProps, ...contractPosition }) => { + const { extraRewards, rewardToken } = rewardsDataProps.find(r => r.rewardPool === contractPosition.address)!; + return { + ...contractPosition, + dataProps: { ...dataProps, extraRewards, rewardToken }, + }; + }, + ); + } + + async getAuraMintedForRewardToken({ rewardTokenAmount, network }: GetAuraMintedForRewardTokenParams) { + // All values are static/immutable + const maxSupply = BigNumber.from(10).pow(26); + const initMintAmount = BigNumber.from(10).pow(25).mul(5); + const emissionsMaxSupply = BigNumber.from(10).pow(25).mul(5); + const totalCliffs = BigNumber.from(500); + const reductionPerCliff = emissionsMaxSupply.div(totalCliffs); + + const contract = this.auraContractFactory.auraToken({ address: AURA_DEFINITION.token!.address, network }); + const totalSupply = await contract.totalSupply(); + + const emissionsMinted = totalSupply.sub(initMintAmount); + + // e.g. reductionPerCliff = 5e25 / 500 = 1e23 + // e.g. cliff = 1e25 / 1e23 = 100 + const cliff = emissionsMinted.div(reductionPerCliff); + + // e.g. 100 < 500 + if (cliff.lt(totalCliffs)) { + // e.g. (new) reduction = (500 - 100) * 2.5 + 700 = 1700; + // e.g. (new) reduction = (500 - 250) * 2.5 + 700 = 1325; + // e.g. (new) reduction = (500 - 400) * 2.5 + 700 = 950; + const reduction = totalCliffs.sub(cliff).mul(5).div(2).add(700); + // e.g. (new) amount = 1e19 * 1700 / 500 = 34e18; + // e.g. (new) amount = 1e19 * 1325 / 500 = 26.5e18; + // e.g. (new) amount = 1e19 * 950 / 500 = 19e17; + let amount = rewardTokenAmount.mul(reduction).div(totalCliffs); + + // e.g. amtTillMax = 5e25 - 1e25 = 4e25 + const amtTillMax = maxSupply.sub(emissionsMinted); + if (amount.gt(amtTillMax)) { + amount = amtTillMax; + } + + return amount; + } + + return BigNumber.from(0); + } + + private async getAuraRewardRate({ rewardRate, network }: GetAuraRewardRateParams) { + if (rewardRate.eq(0)) { + return BigNumber.from(0); + } + + // Annualise rewardRate to get an amount of reward token earned per year + const secondsPerYear = 86400 * 7 * 365; + const rewardTokenAmount = rewardRate.mul(secondsPerYear); + + // Get the AURA amount minted for that period + const auraRewardRate = await this.getAuraMintedForRewardToken({ rewardTokenAmount, network }); + + // Get per-second value (i.e. the AURA reward rate) + if (auraRewardRate.gt(0)) { + return auraRewardRate.div(secondsPerYear); + } + return auraRewardRate; + } + + private async getRewardsDataProps({ + rewardPools, + network, + }: GetRewardsDataPropsParams): Promise< + { rewardPool: string; rewardToken: string; extraRewards: { address: string; rewardToken: string }[] }[] + > { + const multicall = this.appToolkit.getMulticall(network); + + return Promise.all( + rewardPools.map(async rewardPool => { + const contract = this.auraContractFactory.baseRewardPool({ address: rewardPool, network }); + + const extraRewardsLength = Number(await contract.extraRewardsLength()); + + let extraRewards: { address: string; rewardToken: string }[] = []; + + if (extraRewardsLength > 0) { + const indexes = [...Array(extraRewardsLength).keys()]; + const extraRewardsAddresses = await Promise.all( + indexes.map(index => multicall.wrap(contract).extraRewards(index)), + ); + const extraRewardTokens = await Promise.all( + extraRewardsAddresses + .map(address => this.auraContractFactory.auraVirtualBalanceRewardPool({ address, network })) + .map(contract => multicall.wrap(contract).rewardToken()), + ); + extraRewards = extraRewardsAddresses.map((address, index) => ({ + address: address.toLowerCase(), + rewardToken: extraRewardTokens[index].toLowerCase(), + })); + } + + const rewardToken = (await multicall.wrap(contract).rewardToken()).toLowerCase(); + + return { rewardPool, rewardToken, extraRewards }; + }), + ); + } +} diff --git a/src/apps/aura/index.ts b/src/apps/aura/index.ts new file mode 100644 index 000000000..c5803fcc1 --- /dev/null +++ b/src/apps/aura/index.ts @@ -0,0 +1,3 @@ +export { AURA_DEFINITION, AuraAppDefinition } from './aura.definition'; +export { AuraAppModule } from './aura.module'; +export { AuraContractFactory } from './contracts';