From efe6f5aa4df251ac7d8f4af2b9d6203739a8a025 Mon Sep 17 00:00:00 2001 From: William Poulin Date: Tue, 9 Jan 2024 15:13:17 -0500 Subject: [PATCH] fix(apps): App token migration to ATI (#3179) * fix(apps): App token migration to ATI * fix(app-tokens): App token migration * fix(app-tokens): More pp token migration --- src/apps/abracadabra/abracadabra.module.ts | 8 - .../abracadabra.arbitrum.constants.ts | 9 - .../abracadabra.magic-glp.token-fetcher.ts | 20 - .../abracadabra.magic-glp.token-fetcher.ts | 14 - .../abracadabra.magic-ape.token-fetcher.ts | 71 -- .../abracadabra.magic-glp.token-fetcher.ts | 112 --- .../abracadabra.magic-ape.token-fetcher.ts | 10 - .../abracadabra.staked-spell.token-fetcher.ts | 10 - src/apps/aelin/aelin.module.ts | 2 - .../optimism/aelin.v-aelin.token-fetcher.ts | 10 - src/apps/beethoven-x/beethoven-x.module.ts | 2 - .../beethoven-x.f-beets.token-fetcher.ts | 10 - src/apps/chicken-bond/chicken-bond.module.ts | 7 +- .../chicken-bond.blusd.token-fetcher.ts | 52 -- .../gamma-strategies.x-gamma.token-fetcher.ts | 9 - .../gamma-strategies.module.ts | 2 - .../hector-network.s-hec-v1.token-fetcher.ts | 10 - .../hector-network.s-hec-v2.token-fetcher.ts | 10 - .../hector-network.ws-hec.token-fetcher.ts | 10 - .../hector-network/hector-network.module.ts | 6 - src/apps/insurace/assets/logo.png | Bin 24742 -> 0 bytes .../insurace.mining.token-fetcher.ts | 45 - .../insurace.mining.token-fetcher.ts | 45 - .../common/insurace.mining.token-fetcher.ts | 103 --- .../contracts/abis/insurace-pool-token.json | 341 ------- .../abis/insurace-stakers-pool-v-2.json | 848 ----------------- src/apps/insurace/contracts/index.ts | 4 - .../contracts/viem.contract-factory.ts | 20 - .../contracts/viem/InsuracePoolToken.ts | 791 ---------------- .../contracts/viem/InsuraceStakersPoolV2.ts | 862 ------------------ src/apps/insurace/contracts/viem/index.ts | 9 - .../ethereum/insurace.mining.token-fetcher.ts | 55 -- src/apps/insurace/insurace.module.ts | 24 - .../polygon/insurace.mining.token-fetcher.ts | 44 - src/apps/manifold-finance/assets/logo.png | Bin 56974 -> 0 bytes .../contracts/abis/x-fold.json | 322 ------- src/apps/manifold-finance/contracts/index.ts | 4 - .../contracts/viem.contract-factory.ts | 17 - .../manifold-finance/contracts/viem/XFold.ts | 787 ---------------- .../manifold-finance/contracts/viem/index.ts | 7 - .../manifold-finance.staking.token-fetcher.ts | 10 - .../manifold-finance.module.ts | 11 - .../ethereum/maple.x-mpl.token-fetcher.ts | 10 - src/apps/maple/maple.module.ts | 2 - .../avalanche/penguin.i-pefi.token-fetcher.ts | 10 - .../avalanche/penguin.x-pefi.token-fetcher.ts | 10 - src/apps/penguin/penguin.module.ts | 4 - .../arbitrum/pirex.pxglp.token-fetcher.ts | 9 - .../arbitrum/pirex.pxgmx.token-fetcher.ts | 9 - src/apps/pirex/assets/logo.png | Bin 12263 -> 0 bytes .../pirex/contracts/abis/pirex-px-cvx.json | 312 ------- src/apps/pirex/contracts/index.ts | 4 - .../pirex/contracts/viem.contract-factory.ts | 17 - src/apps/pirex/contracts/viem/PirexPxCvx.ts | 738 --------------- src/apps/pirex/contracts/viem/index.ts | 7 - .../ethereum/pirex.pxbtrfly.token-fetcher.ts | 9 - .../ethereum/pirex.pxcvx.token-fetcher.ts | 9 - src/apps/pirex/pirex.module.ts | 20 - ...acted-cartel.wx-btrfly-v1.token-fetcher.ts | 10 - ...redacted-cartel.wx-btrfly.token-fetcher.ts | 10 - .../redacted-cartel.x-btrfly.token-fetcher.ts | 11 - .../redacted-cartel/redacted-cartel.module.ts | 6 - .../avalanche/steak-hut.ve.token-fetcher.ts | 10 - src/apps/steak-hut/steak-hut.module.ts | 5 +- .../trader-joe.ve-joe.token-fetcher.ts | 43 - src/apps/trader-joe/trader-joe.module.ts | 2 - .../vela/arbitrum/vela.vlp.token-fetcher.ts | 10 - .../vela/common/vela.vlp.token-fetcher.ts | 53 -- src/apps/vela/vela.module.ts | 3 +- .../velodrome-v2.pool.token-fetcher.ts | 75 -- src/apps/velodrome-v2/velodrome-v2.module.ts | 2 - 71 files changed, 3 insertions(+), 6140 deletions(-) delete mode 100644 src/apps/abracadabra/arbitrum/abracadabra.magic-glp.token-fetcher.ts delete mode 100644 src/apps/abracadabra/avalanche/abracadabra.magic-glp.token-fetcher.ts delete mode 100644 src/apps/abracadabra/common/abracadabra.magic-ape.token-fetcher.ts delete mode 100644 src/apps/abracadabra/common/abracadabra.magic-glp.token-fetcher.ts delete mode 100644 src/apps/abracadabra/ethereum/abracadabra.magic-ape.token-fetcher.ts delete mode 100644 src/apps/abracadabra/ethereum/abracadabra.staked-spell.token-fetcher.ts delete mode 100644 src/apps/aelin/optimism/aelin.v-aelin.token-fetcher.ts delete mode 100644 src/apps/beethoven-x/fantom/beethoven-x.f-beets.token-fetcher.ts delete mode 100644 src/apps/chicken-bond/ethereum/chicken-bond.blusd.token-fetcher.ts delete mode 100644 src/apps/gamma-strategies/ethereum/gamma-strategies.x-gamma.token-fetcher.ts delete mode 100644 src/apps/hector-network/fantom/hector-network.s-hec-v1.token-fetcher.ts delete mode 100644 src/apps/hector-network/fantom/hector-network.s-hec-v2.token-fetcher.ts delete mode 100644 src/apps/hector-network/fantom/hector-network.ws-hec.token-fetcher.ts delete mode 100644 src/apps/insurace/assets/logo.png delete mode 100644 src/apps/insurace/avalanche/insurace.mining.token-fetcher.ts delete mode 100644 src/apps/insurace/binance-smart-chain/insurace.mining.token-fetcher.ts delete mode 100644 src/apps/insurace/common/insurace.mining.token-fetcher.ts delete mode 100644 src/apps/insurace/contracts/abis/insurace-pool-token.json delete mode 100644 src/apps/insurace/contracts/abis/insurace-stakers-pool-v-2.json delete mode 100644 src/apps/insurace/contracts/index.ts delete mode 100644 src/apps/insurace/contracts/viem.contract-factory.ts delete mode 100644 src/apps/insurace/contracts/viem/InsuracePoolToken.ts delete mode 100644 src/apps/insurace/contracts/viem/InsuraceStakersPoolV2.ts delete mode 100644 src/apps/insurace/contracts/viem/index.ts delete mode 100644 src/apps/insurace/ethereum/insurace.mining.token-fetcher.ts delete mode 100644 src/apps/insurace/insurace.module.ts delete mode 100644 src/apps/insurace/polygon/insurace.mining.token-fetcher.ts delete mode 100644 src/apps/manifold-finance/assets/logo.png delete mode 100644 src/apps/manifold-finance/contracts/abis/x-fold.json delete mode 100644 src/apps/manifold-finance/contracts/index.ts delete mode 100644 src/apps/manifold-finance/contracts/viem.contract-factory.ts delete mode 100644 src/apps/manifold-finance/contracts/viem/XFold.ts delete mode 100644 src/apps/manifold-finance/contracts/viem/index.ts delete mode 100644 src/apps/manifold-finance/ethereum/manifold-finance.staking.token-fetcher.ts delete mode 100644 src/apps/manifold-finance/manifold-finance.module.ts delete mode 100644 src/apps/maple/ethereum/maple.x-mpl.token-fetcher.ts delete mode 100644 src/apps/penguin/avalanche/penguin.i-pefi.token-fetcher.ts delete mode 100644 src/apps/penguin/avalanche/penguin.x-pefi.token-fetcher.ts delete mode 100644 src/apps/pirex/arbitrum/pirex.pxglp.token-fetcher.ts delete mode 100644 src/apps/pirex/arbitrum/pirex.pxgmx.token-fetcher.ts delete mode 100644 src/apps/pirex/assets/logo.png delete mode 100644 src/apps/pirex/contracts/abis/pirex-px-cvx.json delete mode 100644 src/apps/pirex/contracts/index.ts delete mode 100644 src/apps/pirex/contracts/viem.contract-factory.ts delete mode 100644 src/apps/pirex/contracts/viem/PirexPxCvx.ts delete mode 100644 src/apps/pirex/contracts/viem/index.ts delete mode 100644 src/apps/pirex/ethereum/pirex.pxbtrfly.token-fetcher.ts delete mode 100644 src/apps/pirex/ethereum/pirex.pxcvx.token-fetcher.ts delete mode 100644 src/apps/pirex/pirex.module.ts delete mode 100644 src/apps/redacted-cartel/ethereum/redacted-cartel.wx-btrfly-v1.token-fetcher.ts delete mode 100644 src/apps/redacted-cartel/ethereum/redacted-cartel.wx-btrfly.token-fetcher.ts delete mode 100644 src/apps/redacted-cartel/ethereum/redacted-cartel.x-btrfly.token-fetcher.ts delete mode 100644 src/apps/steak-hut/avalanche/steak-hut.ve.token-fetcher.ts delete mode 100644 src/apps/trader-joe/avalanche/trader-joe.ve-joe.token-fetcher.ts delete mode 100644 src/apps/vela/arbitrum/vela.vlp.token-fetcher.ts delete mode 100644 src/apps/vela/common/vela.vlp.token-fetcher.ts delete mode 100644 src/apps/velodrome-v2/optimism/velodrome-v2.pool.token-fetcher.ts diff --git a/src/apps/abracadabra/abracadabra.module.ts b/src/apps/abracadabra/abracadabra.module.ts index 4ed2efb09..4a062deb5 100644 --- a/src/apps/abracadabra/abracadabra.module.ts +++ b/src/apps/abracadabra/abracadabra.module.ts @@ -6,20 +6,16 @@ import { ArbitrumAbracadabraCauldronContractPositionFetcher } from './arbitrum/a import { ArbitrumAbracadabraFarmBoostedContractPositionFetcher } from './arbitrum/abracadabra.farm-boosted.contract-position-fetcher'; import { ArbitrumAbracadabraFarmContractPositionFetcher } from './arbitrum/abracadabra.farm.contract-position-fetcher'; import { ArbitrumAbracadabraMspellContractPositionFetcher } from './arbitrum/abracadabra.m-spell.contract-position-fetcher'; -import { ArbitrumAbracadabraMagicGlpTokenFetcher } from './arbitrum/abracadabra.magic-glp.token-fetcher'; import { ArbitrumAbracadabraStakedSpellTokenFetcher } from './arbitrum/abracadabra.staked-spell.token-fetcher'; import { AvalancheAbracadabraCauldronContractPositionFetcher } from './avalanche/abracadabra.cauldron.contract-position-fetcher'; import { AvalancheAbracadabraFarmContractPositionFetcher } from './avalanche/abracadabra.farm.contract-position-fetcher'; import { AvalancheAbracadabraMspellContractPositionFetcher } from './avalanche/abracadabra.m-spell.contract-position-fetcher'; -import { AvalancheAbracadabraMagicGlpTokenFetcher } from './avalanche/abracadabra.magic-glp.token-fetcher'; import { AvalancheAbracadabraStakedSpellTokenFetcher } from './avalanche/abracadabra.staked-spell.token-fetcher'; import { BinanceSmartChainAbracadabraCauldronContractPositionFetcher } from './binance-smart-chain/abracadabra.cauldron.contract-position-fetcher'; import { AbracadabraViemContractFactory } from './contracts'; import { EthereumAbracadabraCauldronContractPositionFetcher } from './ethereum/abracadabra.cauldron.contract-position-fetcher'; import { EthereumAbracadabraFarmContractPositionFetcher } from './ethereum/abracadabra.farm.contract-position-fetcher'; import { EthereumAbracadabraMspellContractPositionFetcher } from './ethereum/abracadabra.m-spell.contract-position-fetcher'; -import { EthereumAbracadabraMagicApeTokenFetcher } from './ethereum/abracadabra.magic-ape.token-fetcher'; -import { EthereumAbracadabraStakedSpellTokenFetcher } from './ethereum/abracadabra.staked-spell.token-fetcher'; import { FantomAbracadabraCauldronContractPositionFetcher } from './fantom/abracadabra.cauldron.contract-position-fetcher'; import { FantomAbracadabraFarmContractPositionFetcher } from './fantom/abracadabra.farm.contract-position-fetcher'; import { FantomAbracadabraMspellContractPositionFetcher } from './fantom/abracadabra.m-spell.contract-position-fetcher'; @@ -33,14 +29,12 @@ import { OptimismAbracadabraErc20VaultsTokenFetcher } from './optimism/abracadab // Arbitrum ArbitrumAbracadabraCauldronContractPositionFetcher, ArbitrumAbracadabraFarmContractPositionFetcher, - ArbitrumAbracadabraMagicGlpTokenFetcher, ArbitrumAbracadabraMspellContractPositionFetcher, ArbitrumAbracadabraStakedSpellTokenFetcher, ArbitrumAbracadabraFarmBoostedContractPositionFetcher, // Avalanche AvalancheAbracadabraCauldronContractPositionFetcher, AvalancheAbracadabraFarmContractPositionFetcher, - AvalancheAbracadabraMagicGlpTokenFetcher, AvalancheAbracadabraMspellContractPositionFetcher, AvalancheAbracadabraStakedSpellTokenFetcher, // Binance-smart-chain @@ -48,9 +42,7 @@ import { OptimismAbracadabraErc20VaultsTokenFetcher } from './optimism/abracadab // Ethereum EthereumAbracadabraCauldronContractPositionFetcher, EthereumAbracadabraFarmContractPositionFetcher, - EthereumAbracadabraMagicApeTokenFetcher, EthereumAbracadabraMspellContractPositionFetcher, - EthereumAbracadabraStakedSpellTokenFetcher, // Fantom FantomAbracadabraCauldronContractPositionFetcher, FantomAbracadabraFarmContractPositionFetcher, diff --git a/src/apps/abracadabra/arbitrum/abracadabra.arbitrum.constants.ts b/src/apps/abracadabra/arbitrum/abracadabra.arbitrum.constants.ts index 8be5980e6..1f64b0c03 100644 --- a/src/apps/abracadabra/arbitrum/abracadabra.arbitrum.constants.ts +++ b/src/apps/abracadabra/arbitrum/abracadabra.arbitrum.constants.ts @@ -12,19 +12,10 @@ export const ARBITRUM_CAULDRONS: AbracadabraCauldronContractPositionDefinition[] { version: 'V4', type: 'REGULAR', address: '0x66805f6e719d7e67d46e8b2501c1237980996c6a' }, // gmLINK ]; -export const ARBITRUM_GLP_TOKEN_ADDRESS = '0x4277f8f2c384827b5273592ff7cebd9f2c1ac258'; -export const AVALANCHE_GLP_TOKEN_ADDRESS = '0x01234181085565ed162a948b6a5e88758cd7c7b8'; - export const CURVE_MIM_3POOL_FARM = '0x839de324a1ab773f76a53900d70ac1b913d2b387'; export const M_SPELL_ADDRESS = '0x1df188958a8674b5177f77667b8d173c3cdd9e51'; export const S_SPELL_ADDRESS = '0xf7428ffcb2581a2804998efbb036a43255c8a8d3'; export const SPELL_ADDRESS = '0xf7428ffcb2581a2804998efbb036a43255c8a8d3'; -export const MAGIC_GLP_ADDRESS = '0x85667409a723684fe1e57dd1abde8d88c2f54214'; -export const GLP_REWARD_TRACKER_ADDRESSES = [ - '0x4e971a87900b931ff39d1aad67697f49835400b6', - '0x1addd80e6039594ee970e5872d247bf0414c8903', -]; -export const MAGIC_GLP_HARVESTOR_ADDRESS = '0xc99a4863173ef52ccb7ea05440da0e37ba39c139'; export const MAGIC_GLP_ANNUAL_HARVESTS = HOURS_PER_YEAR; diff --git a/src/apps/abracadabra/arbitrum/abracadabra.magic-glp.token-fetcher.ts b/src/apps/abracadabra/arbitrum/abracadabra.magic-glp.token-fetcher.ts deleted file mode 100644 index ec81c758e..000000000 --- a/src/apps/abracadabra/arbitrum/abracadabra.magic-glp.token-fetcher.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; - -import { AbracadabraMagicGlpTokenFetcher } from '../common/abracadabra.magic-glp.token-fetcher'; - -import { - ARBITRUM_GLP_TOKEN_ADDRESS, - GLP_REWARD_TRACKER_ADDRESSES, - MAGIC_GLP_ADDRESS, - MAGIC_GLP_ANNUAL_HARVESTS, - MAGIC_GLP_HARVESTOR_ADDRESS, -} from './abracadabra.arbitrum.constants'; - -@PositionTemplate() -export class ArbitrumAbracadabraMagicGlpTokenFetcher extends AbracadabraMagicGlpTokenFetcher { - vaultAddress = MAGIC_GLP_ADDRESS; - rewardTrackerAddresses = GLP_REWARD_TRACKER_ADDRESSES; - magicGlpHarvestorAddress = MAGIC_GLP_HARVESTOR_ADDRESS; - magicGlpAnnualHarvests = MAGIC_GLP_ANNUAL_HARVESTS; - glpTokenAddress = ARBITRUM_GLP_TOKEN_ADDRESS; -} diff --git a/src/apps/abracadabra/avalanche/abracadabra.magic-glp.token-fetcher.ts b/src/apps/abracadabra/avalanche/abracadabra.magic-glp.token-fetcher.ts deleted file mode 100644 index 77cdd7c21..000000000 --- a/src/apps/abracadabra/avalanche/abracadabra.magic-glp.token-fetcher.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; - -import { AVALANCHE_GLP_TOKEN_ADDRESS } from '../arbitrum/abracadabra.arbitrum.constants'; -import { HOURS_PER_YEAR } from '../common/abracadabra.common.constants'; -import { AbracadabraMagicGlpTokenFetcher } from '../common/abracadabra.magic-glp.token-fetcher'; - -@PositionTemplate() -export class AvalancheAbracadabraMagicGlpTokenFetcher extends AbracadabraMagicGlpTokenFetcher { - vaultAddress = '0x5efc10c353fa30c5758037fdf0a233e971ecc2e0'; - rewardTrackerAddresses = ['0xd2d1162512f927a7e282ef43a362659e4f2a728f', '0x9e295b5b976a184b14ad8cd72413ad846c299660']; - magicGlpHarvestorAddress = '0x05b3b96df07b4630373ae7506e51777b547335b0'; - magicGlpAnnualHarvests = HOURS_PER_YEAR; - glpTokenAddress = AVALANCHE_GLP_TOKEN_ADDRESS; -} diff --git a/src/apps/abracadabra/common/abracadabra.magic-ape.token-fetcher.ts b/src/apps/abracadabra/common/abracadabra.magic-ape.token-fetcher.ts deleted file mode 100644 index 90e320774..000000000 --- a/src/apps/abracadabra/common/abracadabra.magic-ape.token-fetcher.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { getTokenImg } from '~app-toolkit/helpers/presentation/image.present'; -import { Erc4626 } from '~contract/contracts/viem'; -import { - DefaultAppTokenDataProps, - DefaultAppTokenDefinition, - GetDataPropsParams, - GetDisplayPropsParams, -} from '~position/template/app-token.template.types'; -import { Erc4626VaultTemplateTokenFetcher } from '~position/template/erc4626-vault.template.token-fetcher'; - -import { AbracadabraViemContractFactory } from '../contracts'; - -const BASIS_POINTS_DIVISOR = 10000; - -export abstract class AbracadabraMagicApeTokenFetcher extends Erc4626VaultTemplateTokenFetcher { - groupLabel = 'Magic APE'; - - abstract get magicApeAnnualHarvests(): number | Promise; - abstract get magicApeLensAddress(): string | Promise; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(AbracadabraViemContractFactory) protected readonly contractFactory: AbracadabraViemContractFactory, - ) { - super(appToolkit); - } - - async getLabel({ contract }: GetDisplayPropsParams): Promise { - return contract.read.name(); - } - - async getImages({ - appToken, - }: GetDisplayPropsParams): Promise { - return [getTokenImg(appToken.address, this.network)]; - } - - async getApy({ - multicall, - appToken, - }: GetDataPropsParams): Promise { - const [magicApeLensAddress, magicApeAnnualHarvests] = await Promise.all([ - this.magicApeLensAddress, - this.magicApeAnnualHarvests, - ]); - const magicApe = multicall.wrap( - this.contractFactory.abracadabraMagicApe({ - address: appToken.address, - network: this.network, - }), - ); - const magicApeLens = multicall.wrap( - this.contractFactory.abracadabraMagicApeLens({ - address: magicApeLensAddress, - network: this.network, - }), - ); - - const [feePercent, apr] = await Promise.all([ - magicApe.read.feePercentBips().then(feeBips => feeBips / BASIS_POINTS_DIVISOR), - magicApeLens.read.getApeCoinInfo().then(apeCoinInfo => Number(apeCoinInfo.apr) / BASIS_POINTS_DIVISOR), - ]); - - const apy = Math.pow(1 + apr / magicApeAnnualHarvests, magicApeAnnualHarvests) - 1; - const apyWithFees = apy * (1 - feePercent); - return apyWithFees * 100; - } -} diff --git a/src/apps/abracadabra/common/abracadabra.magic-glp.token-fetcher.ts b/src/apps/abracadabra/common/abracadabra.magic-glp.token-fetcher.ts deleted file mode 100644 index 7839a25a0..000000000 --- a/src/apps/abracadabra/common/abracadabra.magic-glp.token-fetcher.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { Inject } from '@nestjs/common'; -import { BigNumber } from 'ethers'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { getTokenImg } from '~app-toolkit/helpers/presentation/image.present'; -import { Erc4626 } from '~contract/contracts/viem'; -import { isAppToken } from '~position/position.interface'; -import { - DefaultAppTokenDataProps, - DefaultAppTokenDefinition, - GetDataPropsParams, - GetDisplayPropsParams, - UnderlyingTokenDefinition, -} from '~position/template/app-token.template.types'; -import { Erc4626VaultTemplateTokenFetcher } from '~position/template/erc4626-vault.template.token-fetcher'; - -import { AbracadabraViemContractFactory } from '../contracts'; - -const SECONDS_PER_YEAR = 31536000; -const BASIS_POINTS_DIVISOR = 10000; - -export abstract class AbracadabraMagicGlpTokenFetcher extends Erc4626VaultTemplateTokenFetcher { - groupLabel = 'Magic GLP'; - abstract glpTokenAddress: string; - abstract get rewardTrackerAddresses(): string[] | Promise[]; - abstract get magicGlpHarvestorAddress(): string | Promise; - abstract get magicGlpAnnualHarvests(): number | Promise; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(AbracadabraViemContractFactory) protected readonly contractFactory: AbracadabraViemContractFactory, - ) { - super(appToolkit); - } - - async getUnderlyingTokenDefinitions(): Promise { - // Override as the underlying is sGLP, but users expect to see GLP - return [{ address: this.glpTokenAddress, network: this.network }]; - } - - async getLabel({ contract }: GetDisplayPropsParams): Promise { - return contract.read.name(); - } - - async getImages({ - appToken, - }: GetDisplayPropsParams): Promise { - return [getTokenImg(appToken.address, this.network)]; - } - - async getApy({ - multicall, - appToken, - tokenLoader, - }: GetDataPropsParams): Promise { - const [magicGlpHarvestorAddress, magicGlpAnnualHarvests, rewardTrackerAddresses] = await Promise.all([ - this.magicGlpHarvestorAddress, - this.magicGlpAnnualHarvests, - Promise.all(this.rewardTrackerAddresses), - ]); - const magicGlpHarvestor = multicall.wrap( - this.contractFactory.abracadabraMagicGlpHarvestor({ - address: magicGlpHarvestorAddress, - network: this.network, - }), - ); - const rewardTrackers = rewardTrackerAddresses.map(rewardTrackerAddress => - multicall.wrap( - this.contractFactory.gmxRewardTracker({ - address: rewardTrackerAddress, - network: this.network, - }), - ), - ); - - const [magicGlpFeeProcent, annualUsdRewards] = await Promise.all([ - magicGlpHarvestor.read.feePercentBips().then(magicGlpFeeProcent => magicGlpFeeProcent / BASIS_POINTS_DIVISOR), - Promise.all( - rewardTrackers.map(async tracker => { - const [tokensPerInterval, rewardToken] = await Promise.all([ - tracker.read.tokensPerInterval(), - tracker.read.rewardToken().then(rewardTokenAddress => - tokenLoader.getOne({ - network: this.network, - address: rewardTokenAddress, - }), - ), - ]); - - if (rewardToken == null) { - return 0; - } else { - const tokensPerYearRaw = BigNumber.from(tokensPerInterval).mul(SECONDS_PER_YEAR); - const tokensPerYear = Number(tokensPerYearRaw) / 10 ** rewardToken.decimals; - return tokensPerYear * rewardToken.price; - } - }), - ), - ]); - - const glp = appToken.tokens[0]; - const glpSupplyUsd = isAppToken(glp) ? glp.supply * glp.price : null; - if (glpSupplyUsd == null || glpSupplyUsd <= 0) { - return 0; - } else { - const apr = annualUsdRewards.map(annualUsdReward => annualUsdReward / glpSupplyUsd).reduce((a, b) => a + b, 0); - const apy = Math.pow(1 + apr / magicGlpAnnualHarvests, magicGlpAnnualHarvests) - 1; - const apyWithFees = apy * (1 - magicGlpFeeProcent); - return apyWithFees * 100; - } - } -} diff --git a/src/apps/abracadabra/ethereum/abracadabra.magic-ape.token-fetcher.ts b/src/apps/abracadabra/ethereum/abracadabra.magic-ape.token-fetcher.ts deleted file mode 100644 index 33612c919..000000000 --- a/src/apps/abracadabra/ethereum/abracadabra.magic-ape.token-fetcher.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; - -import { AbracadabraMagicApeTokenFetcher } from '../common/abracadabra.magic-ape.token-fetcher'; - -@PositionTemplate() -export class EthereumAbracadabraMagicApeTokenFetcher extends AbracadabraMagicApeTokenFetcher { - vaultAddress = '0xf35b31b941d94b249eaded041db1b05b7097feb6'; - magicApeAnnualHarvests = 730; - magicApeLensAddress = '0xefdac7dd721985b4bd7fede78465fe3525b468fd'; -} diff --git a/src/apps/abracadabra/ethereum/abracadabra.staked-spell.token-fetcher.ts b/src/apps/abracadabra/ethereum/abracadabra.staked-spell.token-fetcher.ts deleted file mode 100644 index 3e1a3270c..000000000 --- a/src/apps/abracadabra/ethereum/abracadabra.staked-spell.token-fetcher.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { VaultTemplateTokenFetcher } from '~position/template/vault.template.token-fetcher'; - -@PositionTemplate() -export class EthereumAbracadabraStakedSpellTokenFetcher extends VaultTemplateTokenFetcher { - groupLabel = 'Staked SPELL'; - - vaultAddress = '0x26fa3fffb6efe8c1e69103acb4044c26b9a106a9'; - underlyingTokenAddress = '0x090185f2135308bad17527004364ebcc2d37e5f6'; -} diff --git a/src/apps/aelin/aelin.module.ts b/src/apps/aelin/aelin.module.ts index e0d977f44..32b3c9946 100644 --- a/src/apps/aelin/aelin.module.ts +++ b/src/apps/aelin/aelin.module.ts @@ -6,7 +6,6 @@ import { AelinViemContractFactory } from './contracts'; import { EthereumAelinPoolTokenFetcher } from './ethereum/aelin.pool.token-fetcher'; import { OptimismAelinFarmContractPositionFetcher } from './optimism/aelin.farm.contract-position-fetcher'; import { OptimismAelinPoolTokenFetcher } from './optimism/aelin.pool.token-fetcher'; -import { OptimismAelinVAelinTokenFetcher } from './optimism/aelin.v-aelin.token-fetcher'; @Module({ providers: [ @@ -15,7 +14,6 @@ import { OptimismAelinVAelinTokenFetcher } from './optimism/aelin.v-aelin.token- EthereumAelinPoolTokenFetcher, // Optimism OptimismAelinPoolTokenFetcher, - OptimismAelinVAelinTokenFetcher, OptimismAelinFarmContractPositionFetcher, ], }) diff --git a/src/apps/aelin/optimism/aelin.v-aelin.token-fetcher.ts b/src/apps/aelin/optimism/aelin.v-aelin.token-fetcher.ts deleted file mode 100644 index 244421c97..000000000 --- a/src/apps/aelin/optimism/aelin.v-aelin.token-fetcher.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { WrapperTemplateTokenFetcher } from '~position/template/wrapper.template.token-fetcher'; - -@PositionTemplate() -export class OptimismAelinVAelinTokenFetcher extends WrapperTemplateTokenFetcher { - groupLabel = 'vAELIN'; - - vaultAddress = '0x780f70882ff4929d1a658a4e8ec8d4316b24748a'; - underlyingTokenAddress = '0x61baadcf22d2565b0f471b291c475db5555e0b76'; -} diff --git a/src/apps/beethoven-x/beethoven-x.module.ts b/src/apps/beethoven-x/beethoven-x.module.ts index 8a05c34e4..360c7a5eb 100644 --- a/src/apps/beethoven-x/beethoven-x.module.ts +++ b/src/apps/beethoven-x/beethoven-x.module.ts @@ -5,7 +5,6 @@ import { BalancerV2ViemContractFactory } from '~apps/balancer-v2/contracts'; import { BeethovenXViemContractFactory } from './contracts'; import { FantomBeethovenXChefContractPositionFetcher } from './fantom/beethoven-x.chef.contract-position-fetcher'; -import { FantomBeethovenXFBeetsTokenFetcher } from './fantom/beethoven-x.f-beets.token-fetcher'; import { FantomBeethovenXPoolTokenFetcher } from './fantom/beethoven-x.pool.token-fetcher'; import { OptimismBeethovenXFarmContractPositionFetcher } from './optimism/beethoven-x.farm.contract-position-fetcher'; import { OptimismBeethovenXPoolTokenFetcher } from './optimism/beethoven-x.pool.token-fetcher'; @@ -17,7 +16,6 @@ import { OptimismBeethovenXPoolTokenFetcher } from './optimism/beethoven-x.pool. // Fantom FantomBeethovenXChefContractPositionFetcher, FantomBeethovenXPoolTokenFetcher, - FantomBeethovenXFBeetsTokenFetcher, // Optimism OptimismBeethovenXFarmContractPositionFetcher, OptimismBeethovenXPoolTokenFetcher, diff --git a/src/apps/beethoven-x/fantom/beethoven-x.f-beets.token-fetcher.ts b/src/apps/beethoven-x/fantom/beethoven-x.f-beets.token-fetcher.ts deleted file mode 100644 index 8c34c584c..000000000 --- a/src/apps/beethoven-x/fantom/beethoven-x.f-beets.token-fetcher.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { VaultTemplateTokenFetcher } from '~position/template/vault.template.token-fetcher'; - -@PositionTemplate() -export class FantomBeethovenXFBeetsTokenFetcher extends VaultTemplateTokenFetcher { - groupLabel = 'Staking'; - - vaultAddress = '0xfcef8a994209d6916eb2c86cdd2afd60aa6f54b1'; - underlyingTokenAddress = '0xcde5a11a4acb4ee4c805352cec57e236bdbc3837'; -} diff --git a/src/apps/chicken-bond/chicken-bond.module.ts b/src/apps/chicken-bond/chicken-bond.module.ts index f3afc5340..4fb83a630 100644 --- a/src/apps/chicken-bond/chicken-bond.module.ts +++ b/src/apps/chicken-bond/chicken-bond.module.ts @@ -3,14 +3,9 @@ import { Module } from '@nestjs/common'; import { AbstractApp } from '~app/app.dynamic-module'; import { ChickenBondViemContractFactory } from './contracts'; -import { EthereumChickenBondBlusdTokenFetcher } from './ethereum/chicken-bond.blusd.token-fetcher'; import { EthereumChickenBondBondContractPositionFetcher } from './ethereum/chicken-bond.bond.contract-position-fetcher'; @Module({ - providers: [ - ChickenBondViemContractFactory, - EthereumChickenBondBlusdTokenFetcher, - EthereumChickenBondBondContractPositionFetcher, - ], + providers: [ChickenBondViemContractFactory, EthereumChickenBondBondContractPositionFetcher], }) export class ChickenBondAppModule extends AbstractApp() {} diff --git a/src/apps/chicken-bond/ethereum/chicken-bond.blusd.token-fetcher.ts b/src/apps/chicken-bond/ethereum/chicken-bond.blusd.token-fetcher.ts deleted file mode 100644 index 55988a0c1..000000000 --- a/src/apps/chicken-bond/ethereum/chicken-bond.blusd.token-fetcher.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { Inject } from '@nestjs/common'; -import { BigNumber } from 'ethers'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { GetPriceParams } from '~position/template/app-token.template.types'; - -import { ChickenBondViemContractFactory } from '../contracts'; -import { ChickenBondBlusd } from '../contracts/viem'; - -@PositionTemplate() -export class EthereumChickenBondBlusdTokenFetcher extends AppTokenTemplatePositionFetcher { - groupLabel = 'bLUSD'; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(ChickenBondViemContractFactory) protected readonly contractFactory: ChickenBondViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.chickenBondBlusd({ address, network: this.network }); - } - - async getAddresses() { - return ['0xb9d7dddca9a4ac480991865efef82e01273f79c3']; - } - - async getUnderlyingTokenDefinitions() { - return [{ address: '0x5f98805a4e8be255a32880fdec7f6728c6568ba0', network: this.network }]; - } - - async getPricePerShare() { - return [1]; - } - - async getPrice({ multicall }: GetPriceParams): Promise { - // Temporary solution until Curve is migrated to template - const curvePoolContract = this.contractFactory.curvePool({ - address: '0x74ed5d42203806c8cdcf2f04ca5f60dc777b901c', - network: this.network, - }); - const oneUnit = BigNumber.from(10).pow(18).toString(); - - const priceRaw = await multicall.wrap(curvePoolContract).read.get_dy([BigInt(0), BigInt(1), BigInt(oneUnit)]); - const price = Number(priceRaw) / 10 ** 18; - - return price; - } -} diff --git a/src/apps/gamma-strategies/ethereum/gamma-strategies.x-gamma.token-fetcher.ts b/src/apps/gamma-strategies/ethereum/gamma-strategies.x-gamma.token-fetcher.ts deleted file mode 100644 index a3ae1fb22..000000000 --- a/src/apps/gamma-strategies/ethereum/gamma-strategies.x-gamma.token-fetcher.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { VaultTemplateTokenFetcher } from '~position/template/vault.template.token-fetcher'; - -@PositionTemplate() -export class EthereumGammaStrategiesXGammaTokenFetcher extends VaultTemplateTokenFetcher { - groupLabel = 'xGAMMA'; - vaultAddress = '0x26805021988f1a45dc708b5fb75fc75f21747d8c'; - underlyingTokenAddress = '0x6bea7cfef803d1e3d5f7c0103f7ded065644e197'; -} diff --git a/src/apps/gamma-strategies/gamma-strategies.module.ts b/src/apps/gamma-strategies/gamma-strategies.module.ts index e8a310084..9e776ead4 100644 --- a/src/apps/gamma-strategies/gamma-strategies.module.ts +++ b/src/apps/gamma-strategies/gamma-strategies.module.ts @@ -8,7 +8,6 @@ import { CeloGammaStrategiesPoolTokenFetcher } from './celo/gamma-strategies.poo import { GammaStrategiesDefinitionResolver } from './common/gamma-strategies.definition-resolver'; import { GammaStrategiesViemContractFactory } from './contracts'; import { EthereumGammaStrategiesPoolTokenFetcher } from './ethereum/gamma-strategies.pool.token-fetcher'; -import { EthereumGammaStrategiesXGammaTokenFetcher } from './ethereum/gamma-strategies.x-gamma.token-fetcher'; import { OptimismGammaStrategiesPoolTokenFetcher } from './optimism/gamma-strategies.pool.token-fetcher'; import { OptimismGammaStrategiesUniFarmContractPositionFetcher } from './optimism/gamma-strategies.uni-farm.contract-position-fetcher'; import { PolygonGammaStrategiesPoolTokenFetcher } from './polygon/gamma-strategies.pool.token-fetcher'; @@ -20,7 +19,6 @@ import { PolygonGammaStrategiesQuickSwapFarmContractPositionFetcher } from './po ArbitrumGammaStrategiesZyberFarmContractPositionFetcher, CeloGammaStrategiesPoolTokenFetcher, EthereumGammaStrategiesPoolTokenFetcher, - EthereumGammaStrategiesXGammaTokenFetcher, GammaStrategiesViemContractFactory, GammaStrategiesDefinitionResolver, OptimismGammaStrategiesPoolTokenFetcher, diff --git a/src/apps/hector-network/fantom/hector-network.s-hec-v1.token-fetcher.ts b/src/apps/hector-network/fantom/hector-network.s-hec-v1.token-fetcher.ts deleted file mode 100644 index ac3593556..000000000 --- a/src/apps/hector-network/fantom/hector-network.s-hec-v1.token-fetcher.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { WrapperTemplateTokenFetcher } from '~position/template/wrapper.template.token-fetcher'; - -@PositionTemplate() -export class FantomHectorNetworkSHecV1TokenFetcher extends WrapperTemplateTokenFetcher { - groupLabel = 'Staked HEC V1'; - - vaultAddress = '0x36f26880c6406b967bdb9901cde43abc9d53f106'; - underlyingTokenAddress = '0x5c4fdfc5233f935f20d2adba572f770c2e377ab0'; -} diff --git a/src/apps/hector-network/fantom/hector-network.s-hec-v2.token-fetcher.ts b/src/apps/hector-network/fantom/hector-network.s-hec-v2.token-fetcher.ts deleted file mode 100644 index 325c99719..000000000 --- a/src/apps/hector-network/fantom/hector-network.s-hec-v2.token-fetcher.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { WrapperTemplateTokenFetcher } from '~position/template/wrapper.template.token-fetcher'; - -@PositionTemplate() -export class FantomHectorNetworkSHecV2TokenFetcher extends WrapperTemplateTokenFetcher { - groupLabel = 'Staked HEC V2'; - - vaultAddress = '0x75bdef24285013387a47775828bec90b91ca9a5f'; - underlyingTokenAddress = '0x5c4fdfc5233f935f20d2adba572f770c2e377ab0'; -} diff --git a/src/apps/hector-network/fantom/hector-network.ws-hec.token-fetcher.ts b/src/apps/hector-network/fantom/hector-network.ws-hec.token-fetcher.ts deleted file mode 100644 index 7ef850ec1..000000000 --- a/src/apps/hector-network/fantom/hector-network.ws-hec.token-fetcher.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { VaultTemplateTokenFetcher } from '~position/template/vault.template.token-fetcher'; - -@PositionTemplate() -export class FantomHectorNetworkWsHecTokenFetcher extends VaultTemplateTokenFetcher { - groupLabel = 'Wrapped sHEC V2'; - - vaultAddress = '0x94ccf60f700146bea8ef7832820800e2dfa92eda'; - underlyingTokenAddress = '0x75bdef24285013387a47775828bec90b91ca9a5f'; -} diff --git a/src/apps/hector-network/hector-network.module.ts b/src/apps/hector-network/hector-network.module.ts index a40704c38..0981561e6 100644 --- a/src/apps/hector-network/hector-network.module.ts +++ b/src/apps/hector-network/hector-network.module.ts @@ -7,10 +7,7 @@ import { HectorNetworkViemContractFactory } from './contracts'; import { FantomHectorNetworkBondNoTreasuryContractPositionFetcher } from './fantom/hector-network.bond-no-treasury.contract-position-fetcher'; import { FantomHectorNetworkBondContractPositionFetcher } from './fantom/hector-network.bond.contract-position-fetcher'; import { FantomHectorNetworkFarmContractPositionFetcher } from './fantom/hector-network.farm.contract-position-fetcher'; -import { FantomHectorNetworkSHecV1TokenFetcher } from './fantom/hector-network.s-hec-v1.token-fetcher'; -import { FantomHectorNetworkSHecV2TokenFetcher } from './fantom/hector-network.s-hec-v2.token-fetcher'; import { FantomHectorNetworkStakeBondContractPositionFetcher } from './fantom/hector-network.stake-bond.contract-position-fetcher'; -import { FantomHectorNetworkWsHecTokenFetcher } from './fantom/hector-network.ws-hec.token-fetcher'; @Module({ providers: [ @@ -18,10 +15,7 @@ import { FantomHectorNetworkWsHecTokenFetcher } from './fantom/hector-network.ws FantomHectorNetworkBondContractPositionFetcher, FantomHectorNetworkBondNoTreasuryContractPositionFetcher, FantomHectorNetworkFarmContractPositionFetcher, - FantomHectorNetworkSHecV1TokenFetcher, - FantomHectorNetworkSHecV2TokenFetcher, FantomHectorNetworkStakeBondContractPositionFetcher, - FantomHectorNetworkWsHecTokenFetcher, HectorNetworkViemContractFactory, ], diff --git a/src/apps/insurace/assets/logo.png b/src/apps/insurace/assets/logo.png deleted file mode 100644 index a9ae842dd013bdf427bca40c2f7d0d6e3f60aedd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24742 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 a0Th(~*8uilJ|18INKsZzrb@~z^#1|SGQ6h% diff --git a/src/apps/insurace/avalanche/insurace.mining.token-fetcher.ts b/src/apps/insurace/avalanche/insurace.mining.token-fetcher.ts deleted file mode 100644 index 264c1981e..000000000 --- a/src/apps/insurace/avalanche/insurace.mining.token-fetcher.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { ZERO_ADDRESS } from '~app-toolkit/constants/address'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; - -import { InsuraceMiningTokenDefinition, InsuraceMiningTokenFetcher } from '../common/insurace.mining.token-fetcher'; - -@PositionTemplate() -export class AvalancheInsuraceMiningTokenFetcher extends InsuraceMiningTokenFetcher { - groupLabel = 'Mining Pools'; - insurTokenAddress = '0x544c42fbb96b39b21df61cf322b5edc285ee7429'; - stakersPoolV2Address = '0xf851cbb9940f8baebd1d0eaf259335c108e9e893'; - - async getDefinitions(): Promise { - const governanceMiningPools = [ - { - address: '0x563d10af7395db31f9b0030b39fc4e3ef2598fee', - underlyingTokenAddress: '0x544c42fbb96b39b21df61cf322b5edc285ee7429', // INSUR - }, - ]; - - const underwritingMiningPools = [ - { - address: '0xdecafc91000d4d3802a0562a8fb896f29b6a7480', - underlyingTokenAddress: ZERO_ADDRESS, // AVAX - }, - { - address: '0xa29b59a149f62d390dee27b144c0092ca7dbba96', - underlyingTokenAddress: '0xd586e7f844cea2f87f50152665bcbc2c279d8d70', // DAI.e - }, - { - address: '0x5b9d6666398b86e2541b08b00468ae6434f79441', - underlyingTokenAddress: '0xa7d7079b0fead91f3e65f86e8915cb59c1a4c664', // USDC.e - }, - { - address: '0xdbbb520b40c7b7c6498dbd532aee5e28c62b3611', - underlyingTokenAddress: '0xc7198437980c041c805a1edcba50c1ce5db95118', // USDT.e - }, - { - address: '0x22182ee443e109472fa3ff95311e4532ff5880f9', - underlyingTokenAddress: '0x49d5c2bdffac6ce2bfdb6640f4f80f226bc10bab', // WETH.e - }, - ]; - - return [...governanceMiningPools, ...underwritingMiningPools]; - } -} diff --git a/src/apps/insurace/binance-smart-chain/insurace.mining.token-fetcher.ts b/src/apps/insurace/binance-smart-chain/insurace.mining.token-fetcher.ts deleted file mode 100644 index fce4bbba9..000000000 --- a/src/apps/insurace/binance-smart-chain/insurace.mining.token-fetcher.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { ZERO_ADDRESS } from '~app-toolkit/constants/address'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; - -import { InsuraceMiningTokenDefinition, InsuraceMiningTokenFetcher } from '../common/insurace.mining.token-fetcher'; - -@PositionTemplate() -export class BinanceSmartChainInsuraceMiningTokenFetcher extends InsuraceMiningTokenFetcher { - groupLabel = 'Mining Pools'; - insurTokenAddress = '0x3192ccddf1cdce4ff055ebc80f3f0231b86a7e30'; - stakersPoolV2Address = '0xd50e8ce9d5c1f5228bcc77e318907bb4960578ef'; - - async getDefinitions(): Promise { - const governanceMiningPools = [ - { - address: '0xa5eb163588e25f6de18b9e164ba39daa6086f52b', - underlyingTokenAddress: '0x3192ccddf1cdce4ff055ebc80f3f0231b86a7e30', // INSUR - }, - ]; - - const underwritingMiningPools = [ - { - address: '0x563d10af7395db31f9b0030b39fc4e3ef2598fee', - underlyingTokenAddress: ZERO_ADDRESS, // BNB - }, - { - address: '0xdbbb520b40c7b7c6498dbd532aee5e28c62b3611', - underlyingTokenAddress: '0xe9e7cea3dedca5984780bafc599bd69add087d56', // BUSD - }, - { - address: '0xf2ce369b6e2b96952741af463dddd7061f565946', - underlyingTokenAddress: '0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d', // USDC - }, - { - address: '0x22182ee443e109472fa3ff95311e4532ff5880f9', - underlyingTokenAddress: '0x55d398326f99059ff775485246999027b3197955', // USDT - }, - { - address: '0x5b9d6666398b86e2541b08b00468ae6434f79441', - underlyingTokenAddress: '0x2170ed0880ac9a755fd29b2688956bd959f933f8', // ETH - }, - ]; - - return [...governanceMiningPools, ...underwritingMiningPools]; - } -} diff --git a/src/apps/insurace/common/insurace.mining.token-fetcher.ts b/src/apps/insurace/common/insurace.mining.token-fetcher.ts deleted file mode 100644 index 965178f0c..000000000 --- a/src/apps/insurace/common/insurace.mining.token-fetcher.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { Inject } from '@nestjs/common'; -import { BigNumber } from 'ethers'; - -import { IAppToolkit, APP_TOOLKIT } from '~app-toolkit/app-toolkit.interface'; -import { BLOCKS_PER_DAY } from '~app-toolkit/constants/blocks'; -import { getLabelFromToken } from '~app-toolkit/helpers/presentation/image.present'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { - DefaultAppTokenDataProps, - DefaultAppTokenDefinition, - GetAddressesParams, - GetDataPropsParams, - GetDisplayPropsParams, - GetPricePerShareParams, - GetUnderlyingTokensParams, -} from '~position/template/app-token.template.types'; - -import { InsuraceViemContractFactory } from '../contracts'; -import { InsuracePoolToken } from '../contracts/viem'; - -export type InsuraceMiningTokenDefinition = { - address: string; - underlyingTokenAddress: string; -}; - -export abstract class InsuraceMiningTokenFetcher extends AppTokenTemplatePositionFetcher< - InsuracePoolToken, - DefaultAppTokenDataProps, - InsuraceMiningTokenDefinition -> { - abstract insurTokenAddress: string; - abstract stakersPoolV2Address: string; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(InsuraceViemContractFactory) protected readonly contractFactory: InsuraceViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.insuracePoolToken({ address, network: this.network }); - } - - async getAddresses({ definitions }: GetAddressesParams) { - return definitions.map(v => v.address); - } - - async getUnderlyingTokenDefinitions({ - definition, - }: GetUnderlyingTokensParams) { - return [{ address: definition.underlyingTokenAddress, network: this.network }]; - } - - async getPricePerShare({ - appToken, - multicall, - }: GetPricePerShareParams) { - const stakersPool = this.contractFactory.insuraceStakersPoolV2({ - address: this.stakersPoolV2Address, - network: this.network, - }); - - const reserveRaw = await multicall.wrap(stakersPool).read.stakedAmountPT([appToken.tokens[0].address]); - const reserve = Number(reserveRaw) / 10 ** appToken.tokens[0].decimals; - - const pricePerShare = reserve / appToken.supply; - return [pricePerShare]; - } - - async getApy({ - appToken, - multicall, - tokenLoader, - }: GetDataPropsParams) { - const insurToken = await tokenLoader.getOne({ address: this.insurTokenAddress, network: this.network }); - if (!insurToken) return 0; - - const stakersPool = this.contractFactory.insuraceStakersPoolV2({ - address: this.stakersPoolV2Address, - network: this.network, - }); - - const [totalInsurPerBlock, totalPoolWeight, poolWeight] = await Promise.all([ - multicall.wrap(stakersPool).read.rewardPerBlock(), - multicall.wrap(stakersPool).read.totalPoolWeight(), - multicall.wrap(stakersPool).read.poolWeightPT([appToken.address]), - ]); - - if (Number(totalPoolWeight) <= 0) return 0; - const liquidity = appToken.price * appToken.supply; - const insurPerBlock = - Number(BigNumber.from(totalInsurPerBlock).mul(poolWeight).div(totalPoolWeight)) / 10 ** insurToken.decimals; - const blocksPerYear = 365 * BLOCKS_PER_DAY[this.network]; - - const apy = ((insurPerBlock * blocksPerYear * insurToken.price) / liquidity) * 100; - return apy; - } - - async getLabel({ appToken }: GetDisplayPropsParams) { - return getLabelFromToken(appToken.tokens[0]); - } -} diff --git a/src/apps/insurace/contracts/abis/insurace-pool-token.json b/src/apps/insurace/contracts/abis/insurace-pool-token.json deleted file mode 100644 index c1b9f03e8..000000000 --- a/src/apps/insurace/contracts/abis/insurace-pool-token.json +++ /dev/null @@ -1,341 +0,0 @@ -[ - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": 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": "account", "type": "address" }], - "name": "Paused", - "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": "_amount", "type": "uint256" } - ], - "name": "TokenBurn", - "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": "_amount", "type": "uint256" } - ], - "name": "TokenMint", - "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" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "address", "name": "account", "type": "address" }], - "name": "Unpaused", - "type": "event" - }, - { - "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": [ - { "internalType": "address", "name": "_account", "type": "address" }, - { "internalType": "uint256", "name": "_amount", "type": "uint256" }, - { "internalType": "uint256", "name": "_poolRewardPerLPToken", "type": "uint256" } - ], - "name": "burn", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "burnWeightPH", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "_account", "type": "address" }], - "name": "burnableAmtOf", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "burnableAmtPH", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "_account", "type": "address" }, - { "internalType": "uint256", "name": "_amount", "type": "uint256" } - ], - "name": "canMintPerAccountCap", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "_amount", "type": "uint256" }], - "name": "canMintPerTotalSupply", - "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": "string", "name": "_name", "type": "string" }, - { "internalType": "string", "name": "_symbol", "type": "string" }, - { "internalType": "uint8", "name": "_decimals", "type": "uint8" } - ], - "name": "initializeLPToken", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "lpTokenBurner", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "lpTokenMinter", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "_account", "type": "address" }, - { "internalType": "uint256", "name": "_amount", "type": "uint256" }, - { "internalType": "uint256", "name": "_poolRewardPerLPToken", "type": "uint256" } - ], - "name": "mint", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { "inputs": [], "name": "pauseAll", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [], - "name": "paused", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "pendingBurnAmtPH", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "perAccountCap", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "_account", "type": "address" }, - { "internalType": "uint256", "name": "_amount", "type": "uint256" }, - { "internalType": "uint256", "name": "_blockWeightDuration", "type": "uint256" } - ], - "name": "proposeToBurn", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { "inputs": [], "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "rewardDebt", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "_account", "type": "address" }], - "name": "rewardDebtOf", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "_lpTokenMinter", "type": "address" }, - { "internalType": "address", "name": "_lpTokenBurner", "type": "address" } - ], - "name": "setup", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint8", "name": "_decimals", "type": "uint8" }], - "name": "setupDecimals", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "_totalSupplyCap", "type": "uint256" }, - { "internalType": "uint256", "name": "_perAccountCap", "type": "uint256" } - ], - "name": "setupMintCap", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupplyCap", - "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": [{ "internalType": "address", "name": "newOwner", "type": "address" }], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { "inputs": [], "name": "unPauseAll", "outputs": [], "stateMutability": "nonpayable", "type": "function" } -] diff --git a/src/apps/insurace/contracts/abis/insurace-stakers-pool-v-2.json b/src/apps/insurace/contracts/abis/insurace-stakers-pool-v-2.json deleted file mode 100644 index 39c858d2e..000000000 --- a/src/apps/insurace/contracts/abis/insurace-stakers-pool-v-2.json +++ /dev/null @@ -1,848 +0,0 @@ -[ - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "_fromToken", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "_paymentToken", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_settleAmtPT", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_claimId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_fromRate", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_toRate", - "type": "uint256" - } - ], - "name": "ClaimPayoutEvent", - "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": "account", - "type": "address" - } - ], - "name": "Paused", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "_rewardStartBlock", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_rewardEndBlock", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_rewardPerBlock", - "type": "uint256" - } - ], - "name": "SetRewardInfo", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "signer", - "type": "address" - }, - { - "indexed": false, - "internalType": "bool", - "name": "enabled", - "type": "bool" - } - ], - "name": "SetStakersPoolSignerEvent", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_token", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "StakedAmountPTEvent", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "Unpaused", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "addStkAmount", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_fromToken", - "type": "address" - }, - { - "internalType": "address", - "name": "_paymentToken", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_settleAmtPT", - "type": "uint256" - }, - { - "internalType": "address", - "name": "_claimToSettlementPool", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_claimId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_fromRate", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_toRate", - "type": "uint256" - } - ], - "name": "claimPayout", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_lpToken", - "type": "address" - } - ], - "name": "getPoolRewardPerLPToken", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_lpToken", - "type": "address" - } - ], - "name": "getRewardPerBlockPerPool", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getRewardToken", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_token", - "type": "address" - } - ], - "name": "getStakedAmountPT", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - }, - { - "internalType": "address", - "name": "_lpToken", - "type": "address" - }, - { - "internalType": "address", - "name": "_to", - "type": "address" - } - ], - "name": "harvestRewards", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "harvestedRewardsPerAPerLPT", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "initializeStakersPoolV2", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "insurTokenAddress", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "nonceFlagMap", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "paused", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "poolLastCalcBlock", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "poolRewardPerLPToken", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "poolWeightPT", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_lpToken", - "type": "address" - } - ], - "name": "reCalcPoolPT", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_rewardPerBlock", - "type": "uint256" - }, - { - "internalType": "address[]", - "name": "_lpTokens", - "type": "address[]" - }, - { - "internalType": "uint256[]", - "name": "_weightList", - "type": "uint256[]" - }, - { - "internalType": "uint256", - "name": "_nounce", - "type": "uint256" - }, - { - "internalType": "uint8[]", - "name": "v", - "type": "uint8[]" - }, - { - "internalType": "bytes32[]", - "name": "r", - "type": "bytes32[]" - }, - { - "internalType": "bytes32[]", - "name": "s", - "type": "bytes32[]" - } - ], - "name": "rebalancePools", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "rewardEndBlock", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "rewardPerBlock", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "rewardStartBlock", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "securityMatrix", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_lpToken", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_poolWeightPT", - "type": "uint256" - }, - { - "internalType": "address[]", - "name": "_lpTokens", - "type": "address[]" - } - ], - "name": "setPoolWeight", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_rewardStartBlock", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_rewardEndBlock", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_rewardPerBlock", - "type": "uint256" - }, - { - "internalType": "address[]", - "name": "_lpTokens", - "type": "address[]" - } - ], - "name": "setRewardInfo", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "signer", - "type": "address" - }, - { - "internalType": "bool", - "name": "enabled", - "type": "bool" - } - ], - "name": "setStakersPoolSigner", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - }, - { - "internalType": "address", - "name": "_lpToken", - "type": "address" - } - ], - "name": "settlePendingRewards", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_securityMatrix", - "type": "address" - }, - { - "internalType": "address", - "name": "_insurTokenAddress", - "type": "address" - } - ], - "name": "setup", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - }, - { - "internalType": "address", - "name": "_lpToken", - "type": "address" - } - ], - "name": "showHarvestRewards", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - }, - { - "internalType": "address", - "name": "_lpToken", - "type": "address" - } - ], - "name": "showPendingRewards", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "signerFlagMap", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "stakedAmountPT", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "stkRewardsPerAPerLPT", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalPoolWeight", - "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": "address payable", - "name": "_to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_withdrawAmtAfterFee", - "type": "uint256" - }, - { - "internalType": "address", - "name": "_token", - "type": "address" - }, - { - "internalType": "address", - "name": "_feePool", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_fee", - "type": "uint256" - } - ], - "name": "withdrawTokens", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } -] diff --git a/src/apps/insurace/contracts/index.ts b/src/apps/insurace/contracts/index.ts deleted file mode 100644 index 5dcfebdf6..000000000 --- a/src/apps/insurace/contracts/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -export * from './viem.contract-factory'; diff --git a/src/apps/insurace/contracts/viem.contract-factory.ts b/src/apps/insurace/contracts/viem.contract-factory.ts deleted file mode 100644 index a60ab5c45..000000000 --- a/src/apps/insurace/contracts/viem.contract-factory.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Injectable, Inject } from '@nestjs/common'; - -import { IAppToolkit, APP_TOOLKIT } from '~app-toolkit/app-toolkit.interface'; -import { Network } from '~types/network.interface'; - -import { InsuracePoolToken__factory, InsuraceStakersPoolV2__factory } from './viem'; - -type ContractOpts = { address: string; network: Network }; - -@Injectable() -export class InsuraceViemContractFactory { - constructor(@Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit) {} - - insuracePoolToken({ address, network }: ContractOpts) { - return InsuracePoolToken__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } - insuraceStakersPoolV2({ address, network }: ContractOpts) { - return InsuraceStakersPoolV2__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } -} diff --git a/src/apps/insurace/contracts/viem/InsuracePoolToken.ts b/src/apps/insurace/contracts/viem/InsuracePoolToken.ts deleted file mode 100644 index ecfb98741..000000000 --- a/src/apps/insurace/contracts/viem/InsuracePoolToken.ts +++ /dev/null @@ -1,791 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const insuracePoolTokenAbi = [ - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Approval', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: 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: 'account', - type: 'address', - }, - ], - name: 'Paused', - 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: '_amount', - type: 'uint256', - }, - ], - name: 'TokenBurn', - 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: '_amount', - type: 'uint256', - }, - ], - name: 'TokenMint', - 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', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: 'account', - type: 'address', - }, - ], - name: 'Unpaused', - type: 'event', - }, - { - 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: [ - { - internalType: 'address', - name: '_account', - type: 'address', - }, - { - internalType: 'uint256', - name: '_amount', - type: 'uint256', - }, - { - internalType: 'uint256', - name: '_poolRewardPerLPToken', - type: 'uint256', - }, - ], - name: 'burn', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'burnWeightPH', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_account', - type: 'address', - }, - ], - name: 'burnableAmtOf', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'burnableAmtPH', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_account', - type: 'address', - }, - { - internalType: 'uint256', - name: '_amount', - type: 'uint256', - }, - ], - name: 'canMintPerAccountCap', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_amount', - type: 'uint256', - }, - ], - name: 'canMintPerTotalSupply', - 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: 'string', - name: '_name', - type: 'string', - }, - { - internalType: 'string', - name: '_symbol', - type: 'string', - }, - { - internalType: 'uint8', - name: '_decimals', - type: 'uint8', - }, - ], - name: 'initializeLPToken', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'lpTokenBurner', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'lpTokenMinter', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_account', - type: 'address', - }, - { - internalType: 'uint256', - name: '_amount', - type: 'uint256', - }, - { - internalType: 'uint256', - name: '_poolRewardPerLPToken', - type: 'uint256', - }, - ], - name: 'mint', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'name', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'owner', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'pauseAll', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'paused', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'pendingBurnAmtPH', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'perAccountCap', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_account', - type: 'address', - }, - { - internalType: 'uint256', - name: '_amount', - type: 'uint256', - }, - { - internalType: 'uint256', - name: '_blockWeightDuration', - type: 'uint256', - }, - ], - name: 'proposeToBurn', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'renounceOwnership', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'rewardDebt', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_account', - type: 'address', - }, - ], - name: 'rewardDebtOf', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_lpTokenMinter', - type: 'address', - }, - { - internalType: 'address', - name: '_lpTokenBurner', - type: 'address', - }, - ], - name: 'setup', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint8', - name: '_decimals', - type: 'uint8', - }, - ], - name: 'setupDecimals', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_totalSupplyCap', - type: 'uint256', - }, - { - internalType: 'uint256', - name: '_perAccountCap', - type: 'uint256', - }, - ], - name: 'setupMintCap', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'symbol', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalSupply', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalSupplyCap', - 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: [ - { - internalType: 'address', - name: 'newOwner', - type: 'address', - }, - ], - name: 'transferOwnership', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'unPauseAll', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, -] as const; - -export type InsuracePoolToken = typeof insuracePoolTokenAbi; -export type InsuracePoolTokenContract = GetContractReturnType; - -export class InsuracePoolToken__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: insuracePoolTokenAbi, publicClient: client }); - } -} diff --git a/src/apps/insurace/contracts/viem/InsuraceStakersPoolV2.ts b/src/apps/insurace/contracts/viem/InsuraceStakersPoolV2.ts deleted file mode 100644 index 38f092be2..000000000 --- a/src/apps/insurace/contracts/viem/InsuraceStakersPoolV2.ts +++ /dev/null @@ -1,862 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const insuraceStakersPoolV2Abi = [ - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: '_fromToken', - type: 'address', - }, - { - indexed: false, - internalType: 'address', - name: '_paymentToken', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: '_settleAmtPT', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: '_claimId', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: '_fromRate', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: '_toRate', - type: 'uint256', - }, - ], - name: 'ClaimPayoutEvent', - 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: 'account', - type: 'address', - }, - ], - name: 'Paused', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'uint256', - name: '_rewardStartBlock', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: '_rewardEndBlock', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: '_rewardPerBlock', - type: 'uint256', - }, - ], - name: 'SetRewardInfo', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'signer', - type: 'address', - }, - { - indexed: false, - internalType: 'bool', - name: 'enabled', - type: 'bool', - }, - ], - name: 'SetStakersPoolSignerEvent', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: '_token', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: '_amount', - type: 'uint256', - }, - ], - name: 'StakedAmountPTEvent', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: 'account', - type: 'address', - }, - ], - name: 'Unpaused', - type: 'event', - }, - { - inputs: [ - { - internalType: 'address', - name: '_token', - type: 'address', - }, - { - internalType: 'uint256', - name: '_amount', - type: 'uint256', - }, - ], - name: 'addStkAmount', - outputs: [], - stateMutability: 'payable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_fromToken', - type: 'address', - }, - { - internalType: 'address', - name: '_paymentToken', - type: 'address', - }, - { - internalType: 'uint256', - name: '_settleAmtPT', - type: 'uint256', - }, - { - internalType: 'address', - name: '_claimToSettlementPool', - type: 'address', - }, - { - internalType: 'uint256', - name: '_claimId', - type: 'uint256', - }, - { - internalType: 'uint256', - name: '_fromRate', - type: 'uint256', - }, - { - internalType: 'uint256', - name: '_toRate', - type: 'uint256', - }, - ], - name: 'claimPayout', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_lpToken', - type: 'address', - }, - ], - name: 'getPoolRewardPerLPToken', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_lpToken', - type: 'address', - }, - ], - name: 'getRewardPerBlockPerPool', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getRewardToken', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_token', - type: 'address', - }, - ], - name: 'getStakedAmountPT', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_account', - type: 'address', - }, - { - internalType: 'address', - name: '_lpToken', - type: 'address', - }, - { - internalType: 'address', - name: '_to', - type: 'address', - }, - ], - name: 'harvestRewards', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'harvestedRewardsPerAPerLPT', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'initializeStakersPoolV2', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'insurTokenAddress', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - name: 'nonceFlagMap', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'owner', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'paused', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'poolLastCalcBlock', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'poolRewardPerLPToken', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'poolWeightPT', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_lpToken', - type: 'address', - }, - ], - name: 'reCalcPoolPT', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_rewardPerBlock', - type: 'uint256', - }, - { - internalType: 'address[]', - name: '_lpTokens', - type: 'address[]', - }, - { - internalType: 'uint256[]', - name: '_weightList', - type: 'uint256[]', - }, - { - internalType: 'uint256', - name: '_nounce', - type: 'uint256', - }, - { - internalType: 'uint8[]', - name: 'v', - type: 'uint8[]', - }, - { - internalType: 'bytes32[]', - name: 'r', - type: 'bytes32[]', - }, - { - internalType: 'bytes32[]', - name: 's', - type: 'bytes32[]', - }, - ], - name: 'rebalancePools', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'renounceOwnership', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'rewardEndBlock', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'rewardPerBlock', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'rewardStartBlock', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'securityMatrix', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_lpToken', - type: 'address', - }, - { - internalType: 'uint256', - name: '_poolWeightPT', - type: 'uint256', - }, - { - internalType: 'address[]', - name: '_lpTokens', - type: 'address[]', - }, - ], - name: 'setPoolWeight', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_rewardStartBlock', - type: 'uint256', - }, - { - internalType: 'uint256', - name: '_rewardEndBlock', - type: 'uint256', - }, - { - internalType: 'uint256', - name: '_rewardPerBlock', - type: 'uint256', - }, - { - internalType: 'address[]', - name: '_lpTokens', - type: 'address[]', - }, - ], - name: 'setRewardInfo', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'signer', - type: 'address', - }, - { - internalType: 'bool', - name: 'enabled', - type: 'bool', - }, - ], - name: 'setStakersPoolSigner', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_account', - type: 'address', - }, - { - internalType: 'address', - name: '_lpToken', - type: 'address', - }, - ], - name: 'settlePendingRewards', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_securityMatrix', - type: 'address', - }, - { - internalType: 'address', - name: '_insurTokenAddress', - type: 'address', - }, - ], - name: 'setup', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_account', - type: 'address', - }, - { - internalType: 'address', - name: '_lpToken', - type: 'address', - }, - ], - name: 'showHarvestRewards', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_account', - type: 'address', - }, - { - internalType: 'address', - name: '_lpToken', - type: 'address', - }, - ], - name: 'showPendingRewards', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'signerFlagMap', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'stakedAmountPT', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'stkRewardsPerAPerLPT', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalPoolWeight', - 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: 'address payable', - name: '_to', - type: 'address', - }, - { - internalType: 'uint256', - name: '_withdrawAmtAfterFee', - type: 'uint256', - }, - { - internalType: 'address', - name: '_token', - type: 'address', - }, - { - internalType: 'address', - name: '_feePool', - type: 'address', - }, - { - internalType: 'uint256', - name: '_fee', - type: 'uint256', - }, - ], - name: 'withdrawTokens', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, -] as const; - -export type InsuraceStakersPoolV2 = typeof insuraceStakersPoolV2Abi; -export type InsuraceStakersPoolV2Contract = GetContractReturnType; - -export class InsuraceStakersPoolV2__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: insuraceStakersPoolV2Abi, publicClient: client }); - } -} diff --git a/src/apps/insurace/contracts/viem/index.ts b/src/apps/insurace/contracts/viem/index.ts deleted file mode 100644 index 40f287139..000000000 --- a/src/apps/insurace/contracts/viem/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ - -export type { InsuracePoolToken } from './InsuracePoolToken'; -export type { InsuraceStakersPoolV2 } from './InsuraceStakersPoolV2'; - -export { InsuracePoolToken__factory } from './InsuracePoolToken'; -export { InsuraceStakersPoolV2__factory } from './InsuraceStakersPoolV2'; diff --git a/src/apps/insurace/ethereum/insurace.mining.token-fetcher.ts b/src/apps/insurace/ethereum/insurace.mining.token-fetcher.ts deleted file mode 100644 index 69b766f6a..000000000 --- a/src/apps/insurace/ethereum/insurace.mining.token-fetcher.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { ZERO_ADDRESS } from '~app-toolkit/constants/address'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; - -import { InsuraceMiningTokenDefinition, InsuraceMiningTokenFetcher } from '../common/insurace.mining.token-fetcher'; - -@PositionTemplate() -export class EthereumInsuraceMiningTokenFetcher extends InsuraceMiningTokenFetcher { - groupLabel = 'Mining Pools'; - insurTokenAddress = '0x544c42fbb96b39b21df61cf322b5edc285ee7429'; - stakersPoolV2Address = '0x136d841d4bece3fc0e4debb94356d8b6b4b93209'; - - async getDefinitions(): Promise { - const governanceMiningPools = [ - { - address: '0x7e68521a2814a84868da716b9f436b53e6764c1d', - underlyingTokenAddress: '0x544c42fbb96b39b21df61cf322b5edc285ee7429', // INSUR - }, - ]; - const underwritingMiningPools = [ - { - address: '0xdf8bec949367b677b7c951219ed66035ddc73d3f', - underlyingTokenAddress: ZERO_ADDRESS, // ETH - }, - { - address: '0xee516e05cecfee5fe72930f3b38b87594434fd00', - underlyingTokenAddress: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', // WETH - }, - { - address: '0x5157e052ae30381e38874a9b3452aabc9f145182', - underlyingTokenAddress: '0x6b175474e89094c44da98b954eedeac495271d0f', // DAI - }, - { - address: '0x3d9317a27f3d83f0821deeeb0befdb68d4c9cd47', - underlyingTokenAddress: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', // USDC - }, - { - address: '0x8ce730bbaf5ed1b9e8cf2d857f474bdcdeb22275', - underlyingTokenAddress: '0xdac17f958d2ee523a2206206994597c13d831ec7', // USDT - }, - { - address: '0xd9aae8f651f323cbb39e328b8fda741d11a231e0', - underlyingTokenAddress: '0xe2f2a5c287993345a840db3b0845fbc70f5935a5', // mUSD - }, - ]; - - const liquidityMiningPools = [ - { - address: '0x07d8d49c5751566962a5169a9c8efdf64d1ca00b', - underlyingTokenAddress: '0x169bf778a5eadab0209c0524ea5ce8e7a616e33b', // Uniswap V2 INSUR/USDC LP - }, - ]; - - return [...governanceMiningPools, ...underwritingMiningPools, ...liquidityMiningPools]; - } -} diff --git a/src/apps/insurace/insurace.module.ts b/src/apps/insurace/insurace.module.ts deleted file mode 100644 index 67962660e..000000000 --- a/src/apps/insurace/insurace.module.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Module } from '@nestjs/common'; - -import { AbstractApp } from '~app/app.dynamic-module'; - -import { AvalancheInsuraceMiningTokenFetcher } from './avalanche/insurace.mining.token-fetcher'; -import { BinanceSmartChainInsuraceMiningTokenFetcher } from './binance-smart-chain/insurace.mining.token-fetcher'; -import { InsuraceViemContractFactory } from './contracts'; -import { EthereumInsuraceMiningTokenFetcher } from './ethereum/insurace.mining.token-fetcher'; -import { PolygonInsuraceMiningTokenFetcher } from './polygon/insurace.mining.token-fetcher'; - -@Module({ - providers: [ - InsuraceViemContractFactory, - // Avalanche - AvalancheInsuraceMiningTokenFetcher, - // Binance-smart-chain - BinanceSmartChainInsuraceMiningTokenFetcher, - // Ethereum - EthereumInsuraceMiningTokenFetcher, - // Polygon - PolygonInsuraceMiningTokenFetcher, - ], -}) -export class InsuraceAppModule extends AbstractApp() {} diff --git a/src/apps/insurace/polygon/insurace.mining.token-fetcher.ts b/src/apps/insurace/polygon/insurace.mining.token-fetcher.ts deleted file mode 100644 index 653f10c3a..000000000 --- a/src/apps/insurace/polygon/insurace.mining.token-fetcher.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { ZERO_ADDRESS } from '~app-toolkit/constants/address'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; - -import { InsuraceMiningTokenDefinition, InsuraceMiningTokenFetcher } from '../common/insurace.mining.token-fetcher'; - -@PositionTemplate() -export class PolygonInsuraceMiningTokenFetcher extends InsuraceMiningTokenFetcher { - groupLabel = 'Mining Pools'; - insurTokenAddress = '0x8a0e8b4b0903929f47c3ea30973940d4a9702067'; - stakersPoolV2Address = '0xd2171abb60d2994cf9acb767f2116cf47bbf596f'; - - async getDefinitions(): Promise { - const governanceMiningPools = [ - { - address: '0xdbbb520b40c7b7c6498dbd532aee5e28c62b3611', - underlyingTokenAddress: '0x8a0e8b4b0903929f47c3ea30973940d4a9702067', // INSUR - }, - ]; - const underwritingMiningPools = [ - { - underlyingTokenAddress: ZERO_ADDRESS, // MATIC - address: '0x599b132328a07b51b833609314824570a99ab9b0', - }, - { - underlyingTokenAddress: '0x8f3cf7ad23cd3cadbd9735aff958023239c6a063', // DAI - address: '0x09eaa5c29cb01b39b544db165f484a0d015e562b', - }, - { - underlyingTokenAddress: '0x2791bca1f2de4661ed88a30c99a7a9449aa84174', // USDC - address: '0xdecafc91000d4d3802a0562a8fb896f29b6a7480', - }, - { - underlyingTokenAddress: '0xc2132d05d31c914a87c6611c10748aeb04b58e8f', // USDT - address: '0xa29b59a149f62d390dee27b144c0092ca7dbba96', - }, - { - underlyingTokenAddress: '0x7ceb23fd6bc0add59e62ac25578270cff1b9f619', // WETH - address: '0x563d10af7395db31f9b0030b39fc4e3ef2598fee', - }, - ]; - - return [...governanceMiningPools, ...underwritingMiningPools]; - } -} diff --git a/src/apps/manifold-finance/assets/logo.png b/src/apps/manifold-finance/assets/logo.png deleted file mode 100644 index 14858aa107cd5ba330aee1d5c23b093612470f00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56974 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 Ud$@LH(f|Me07*qoM6N<$f*C@&5dZ)H diff --git a/src/apps/manifold-finance/contracts/abis/x-fold.json b/src/apps/manifold-finance/contracts/abis/x-fold.json deleted file mode 100644 index 670965506..000000000 --- a/src/apps/manifold-finance/contracts/abis/x-fold.json +++ /dev/null @@ -1,322 +0,0 @@ -[ - { - "inputs": [ - { "internalType": "string", "name": "sharesSymbol", "type": "string" }, - { "internalType": "string", "name": "sharesName", "type": "string" }, - { "internalType": "contract IERC20", "name": "token_", "type": "address" }, - { "internalType": "address", "name": "initialOperator", "type": "address" } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "bytes32", "name": "txHash", "type": "bytes32" }, - { "indexed": true, "internalType": "address", "name": "target", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" }, - { "indexed": false, "internalType": "bytes", "name": "data", "type": "bytes" } - ], - "name": "CancelTransaction", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "bytes32", "name": "txHash", "type": "bytes32" }, - { "indexed": true, "internalType": "address", "name": "target", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" }, - { "indexed": false, "internalType": "bytes", "name": "data", "type": "bytes" } - ], - "name": "ExecuteTransaction", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "bytes32", "name": "txHash", "type": "bytes32" }, - { "indexed": true, "internalType": "address", "name": "target", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" }, - { "indexed": false, "internalType": "bytes", "name": "data", "type": "bytes" }, - { "indexed": false, "internalType": "uint256", "name": "eta", "type": "uint256" } - ], - "name": "QueueTransaction", - "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": "DELAY", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "DOMAIN_SEPARATOR", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "GRACE_PERIOD", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "", "type": "address" }, - { "internalType": "address", "name": "", "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": "user", "type": "address" }], - "name": "balanceOf", - "outputs": [{ "internalType": "uint256", "name": "balance", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "to", "type": "address" }, - { "internalType": "uint256", "name": "shares", "type": "uint256" } - ], - "name": "burn", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "from", "type": "address" }, - { "internalType": "address", "name": "to", "type": "address" }, - { "internalType": "uint256", "name": "shares", "type": "uint256" } - ], - "name": "burnFrom", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "target", "type": "address" }, - { "internalType": "uint256", "name": "value", "type": "uint256" }, - { "internalType": "bytes", "name": "data", "type": "bytes" } - ], - "name": "cancelTransaction", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "target", "type": "address" }, - { "internalType": "uint256", "name": "value", "type": "uint256" }, - { "internalType": "bytes", "name": "data", "type": "bytes" } - ], - "name": "executeTransaction", - "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "amount", "type": "uint256" }, - { "internalType": "address", "name": "operatorVote", "type": "address" } - ], - "name": "mint", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "nonces", - "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": "pendingOperator", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pendingOperatorTime", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "owner_", "type": "address" }, - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "value", "type": "uint256" }, - { "internalType": "uint256", "name": "deadline", "type": "uint256" }, - { "internalType": "uint8", "name": "v", "type": "uint8" }, - { "internalType": "bytes32", "name": "r", "type": "bytes32" }, - { "internalType": "bytes32", "name": "s", "type": "bytes32" } - ], - "name": "permit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "target", "type": "address" }, - { "internalType": "uint256", "name": "value", "type": "uint256" }, - { "internalType": "bytes", "name": "data", "type": "bytes" } - ], - "name": "queueTransaction", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "name": "queuedTransactions", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "newOperator", "type": "address" }], - "name": "setOperator", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "token", - "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": "to", "type": "address" }, - { "internalType": "uint256", "name": "shares", "type": "uint256" } - ], - "name": "transfer", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "from", "type": "address" }, - { "internalType": "address", "name": "to", "type": "address" }, - { "internalType": "uint256", "name": "shares", "type": "uint256" } - ], - "name": "transferFrom", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "userVote", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "users", - "outputs": [ - { "internalType": "uint128", "name": "balance", "type": "uint128" }, - { "internalType": "uint128", "name": "lockedUntil", "type": "uint128" } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "operatorVote", "type": "address" }], - "name": "vote", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "votes", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - } -] diff --git a/src/apps/manifold-finance/contracts/index.ts b/src/apps/manifold-finance/contracts/index.ts deleted file mode 100644 index 5dcfebdf6..000000000 --- a/src/apps/manifold-finance/contracts/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -export * from './viem.contract-factory'; diff --git a/src/apps/manifold-finance/contracts/viem.contract-factory.ts b/src/apps/manifold-finance/contracts/viem.contract-factory.ts deleted file mode 100644 index 088ba9f00..000000000 --- a/src/apps/manifold-finance/contracts/viem.contract-factory.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Injectable, Inject } from '@nestjs/common'; - -import { IAppToolkit, APP_TOOLKIT } from '~app-toolkit/app-toolkit.interface'; -import { Network } from '~types/network.interface'; - -import { XFold__factory } from './viem'; - -type ContractOpts = { address: string; network: Network }; - -@Injectable() -export class ManifoldFinanceViemContractFactory { - constructor(@Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit) {} - - xFold({ address, network }: ContractOpts) { - return XFold__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } -} diff --git a/src/apps/manifold-finance/contracts/viem/XFold.ts b/src/apps/manifold-finance/contracts/viem/XFold.ts deleted file mode 100644 index 11c181808..000000000 --- a/src/apps/manifold-finance/contracts/viem/XFold.ts +++ /dev/null @@ -1,787 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const xFoldAbi = [ - { - inputs: [ - { - internalType: 'string', - name: 'sharesSymbol', - type: 'string', - }, - { - internalType: 'string', - name: 'sharesName', - type: 'string', - }, - { - internalType: 'contract IERC20', - name: 'token_', - type: 'address', - }, - { - internalType: 'address', - name: 'initialOperator', - type: 'address', - }, - ], - stateMutability: 'nonpayable', - type: 'constructor', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Approval', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'bytes32', - name: 'txHash', - type: 'bytes32', - }, - { - indexed: true, - internalType: 'address', - name: 'target', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - { - indexed: false, - internalType: 'bytes', - name: 'data', - type: 'bytes', - }, - ], - name: 'CancelTransaction', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'bytes32', - name: 'txHash', - type: 'bytes32', - }, - { - indexed: true, - internalType: 'address', - name: 'target', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - { - indexed: false, - internalType: 'bytes', - name: 'data', - type: 'bytes', - }, - ], - name: 'ExecuteTransaction', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'bytes32', - name: 'txHash', - type: 'bytes32', - }, - { - indexed: true, - internalType: 'address', - name: 'target', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - { - indexed: false, - internalType: 'bytes', - name: 'data', - type: 'bytes', - }, - { - indexed: false, - internalType: 'uint256', - name: 'eta', - type: 'uint256', - }, - ], - name: 'QueueTransaction', - 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: 'DELAY', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'DOMAIN_SEPARATOR', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'GRACE_PERIOD', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - { - internalType: 'address', - name: '', - 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: 'user', - type: 'address', - }, - ], - name: 'balanceOf', - outputs: [ - { - internalType: 'uint256', - name: 'balance', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'to', - type: 'address', - }, - { - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - ], - name: 'burn', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'from', - type: 'address', - }, - { - internalType: 'address', - name: 'to', - type: 'address', - }, - { - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - ], - name: 'burnFrom', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'target', - type: 'address', - }, - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - { - internalType: 'bytes', - name: 'data', - type: 'bytes', - }, - ], - name: 'cancelTransaction', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'decimals', - outputs: [ - { - internalType: 'uint8', - name: '', - type: 'uint8', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'target', - type: 'address', - }, - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - { - internalType: 'bytes', - name: 'data', - type: 'bytes', - }, - ], - name: 'executeTransaction', - outputs: [ - { - internalType: 'bytes', - name: '', - type: 'bytes', - }, - ], - stateMutability: 'payable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - internalType: 'address', - name: 'operatorVote', - type: 'address', - }, - ], - name: 'mint', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'name', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'nonces', - 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: 'pendingOperator', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'pendingOperatorTime', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner_', - type: 'address', - }, - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'deadline', - type: 'uint256', - }, - { - internalType: 'uint8', - name: 'v', - type: 'uint8', - }, - { - internalType: 'bytes32', - name: 'r', - type: 'bytes32', - }, - { - internalType: 'bytes32', - name: 's', - type: 'bytes32', - }, - ], - name: 'permit', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'target', - type: 'address', - }, - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - { - internalType: 'bytes', - name: 'data', - type: 'bytes', - }, - ], - name: 'queueTransaction', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - name: 'queuedTransactions', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'newOperator', - type: 'address', - }, - ], - name: 'setOperator', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'symbol', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'token', - 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: 'to', - type: 'address', - }, - { - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - ], - name: 'transfer', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'from', - type: 'address', - }, - { - internalType: 'address', - name: 'to', - type: 'address', - }, - { - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - ], - name: 'transferFrom', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'userVote', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'users', - outputs: [ - { - internalType: 'uint128', - name: 'balance', - type: 'uint128', - }, - { - internalType: 'uint128', - name: 'lockedUntil', - type: 'uint128', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'operatorVote', - type: 'address', - }, - ], - name: 'vote', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'votes', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, -] as const; - -export type XFold = typeof xFoldAbi; -export type XFoldContract = GetContractReturnType; - -export class XFold__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: xFoldAbi, publicClient: client }); - } -} diff --git a/src/apps/manifold-finance/contracts/viem/index.ts b/src/apps/manifold-finance/contracts/viem/index.ts deleted file mode 100644 index b2869faa4..000000000 --- a/src/apps/manifold-finance/contracts/viem/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ - -export type { XFold } from './XFold'; - -export { XFold__factory } from './XFold'; diff --git a/src/apps/manifold-finance/ethereum/manifold-finance.staking.token-fetcher.ts b/src/apps/manifold-finance/ethereum/manifold-finance.staking.token-fetcher.ts deleted file mode 100644 index 977a9437d..000000000 --- a/src/apps/manifold-finance/ethereum/manifold-finance.staking.token-fetcher.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { WrapperTemplateTokenFetcher } from '~position/template/wrapper.template.token-fetcher'; - -@PositionTemplate() -export class EthereumManifoldFinanceStakingTokenFetcher extends WrapperTemplateTokenFetcher { - groupLabel = 'xFOLD'; - - vaultAddress = '0x454bd9e2b29eb5963048cc1a8bd6fd44e89899cb'; - underlyingTokenAddress = '0xd084944d3c05cd115c09d072b9f44ba3e0e45921'; -} diff --git a/src/apps/manifold-finance/manifold-finance.module.ts b/src/apps/manifold-finance/manifold-finance.module.ts deleted file mode 100644 index ad0a27ea6..000000000 --- a/src/apps/manifold-finance/manifold-finance.module.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Module } from '@nestjs/common'; - -import { AbstractApp } from '~app/app.dynamic-module'; - -import { ManifoldFinanceViemContractFactory } from './contracts'; -import { EthereumManifoldFinanceStakingTokenFetcher } from './ethereum/manifold-finance.staking.token-fetcher'; - -@Module({ - providers: [EthereumManifoldFinanceStakingTokenFetcher, ManifoldFinanceViemContractFactory], -}) -export class ManifoldFinanceAppModule extends AbstractApp() {} diff --git a/src/apps/maple/ethereum/maple.x-mpl.token-fetcher.ts b/src/apps/maple/ethereum/maple.x-mpl.token-fetcher.ts deleted file mode 100644 index fe392fea8..000000000 --- a/src/apps/maple/ethereum/maple.x-mpl.token-fetcher.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { VaultTemplateTokenFetcher } from '~position/template/vault.template.token-fetcher'; - -@PositionTemplate() -export class EthereumMapleXMplTokenFetcher extends VaultTemplateTokenFetcher { - groupLabel = 'xMPL'; - - vaultAddress = '0x4937a209d4cdbd3ecd48857277cfd4da4d82914c'; - underlyingTokenAddress = '0x33349b282065b0284d756f0577fb39c158f935e6'; -} diff --git a/src/apps/maple/maple.module.ts b/src/apps/maple/maple.module.ts index 4d1ff883a..8e062f54a 100644 --- a/src/apps/maple/maple.module.ts +++ b/src/apps/maple/maple.module.ts @@ -6,14 +6,12 @@ import { MaplePoolDefinitionResolver } from './common/maple.pool.definition-reso import { MapleViemContractFactory } from './contracts'; import { EthereumMaplePendingWithdrawalContractPositionFetcher } from './ethereum/maple.pending-withdrawal.contract-position-fetcher'; import { EthereumMaplePoolTokenFetcher } from './ethereum/maple.pool.token-fetcher'; -import { EthereumMapleXMplTokenFetcher } from './ethereum/maple.x-mpl.token-fetcher'; @Module({ providers: [ MapleViemContractFactory, MaplePoolDefinitionResolver, EthereumMaplePoolTokenFetcher, - EthereumMapleXMplTokenFetcher, EthereumMaplePendingWithdrawalContractPositionFetcher, ], }) diff --git a/src/apps/penguin/avalanche/penguin.i-pefi.token-fetcher.ts b/src/apps/penguin/avalanche/penguin.i-pefi.token-fetcher.ts deleted file mode 100644 index f93a7465d..000000000 --- a/src/apps/penguin/avalanche/penguin.i-pefi.token-fetcher.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { VaultTemplateTokenFetcher } from '~position/template/vault.template.token-fetcher'; - -@PositionTemplate() -export class AvalanchePenguinIPefiTokenFetcher extends VaultTemplateTokenFetcher { - groupLabel = 'iPEFI'; - - vaultAddress = '0xe9476e16fe488b90ada9ab5c7c2ada81014ba9ee'; - underlyingTokenAddress = '0xe896cdeaac9615145c0ca09c8cd5c25bced6384c'; -} diff --git a/src/apps/penguin/avalanche/penguin.x-pefi.token-fetcher.ts b/src/apps/penguin/avalanche/penguin.x-pefi.token-fetcher.ts deleted file mode 100644 index d2e58b721..000000000 --- a/src/apps/penguin/avalanche/penguin.x-pefi.token-fetcher.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { VaultTemplateTokenFetcher } from '~position/template/vault.template.token-fetcher'; - -@PositionTemplate() -export class AvalanchePenguinXPefiTokenFetcher extends VaultTemplateTokenFetcher { - groupLabel = 'xPEFI'; - - vaultAddress = '0xd79a36056c271b988c5f1953e664e61416a9820f'; - underlyingTokenAddress = '0xe896cdeaac9615145c0ca09c8cd5c25bced6384c'; -} diff --git a/src/apps/penguin/penguin.module.ts b/src/apps/penguin/penguin.module.ts index 13dcab096..dd9916a8e 100644 --- a/src/apps/penguin/penguin.module.ts +++ b/src/apps/penguin/penguin.module.ts @@ -4,9 +4,7 @@ import { AbstractApp } from '~app/app.dynamic-module'; import { AvalanchePenguinChefV1FarmContractPositionFetcher } from './avalanche/penguin.chef-v1-farm.contract-position-fetcher'; import { AvalanchePenguinChefV2FarmContractPositionFetcher } from './avalanche/penguin.chef-v2-farm.contract-position-fetcher'; -import { AvalanchePenguinIPefiTokenFetcher } from './avalanche/penguin.i-pefi.token-fetcher'; import { AvalanchePenguinVaultClaimableContractPositionFetcher } from './avalanche/penguin.vault-claimable.contract-position-fetcher'; -import { AvalanchePenguinXPefiTokenFetcher } from './avalanche/penguin.x-pefi.token-fetcher'; import { PenguinViemContractFactory } from './contracts'; @Module({ @@ -14,8 +12,6 @@ import { PenguinViemContractFactory } from './contracts'; PenguinViemContractFactory, AvalanchePenguinChefV1FarmContractPositionFetcher, AvalanchePenguinChefV2FarmContractPositionFetcher, - AvalanchePenguinIPefiTokenFetcher, - AvalanchePenguinXPefiTokenFetcher, AvalanchePenguinVaultClaimableContractPositionFetcher, ], }) diff --git a/src/apps/pirex/arbitrum/pirex.pxglp.token-fetcher.ts b/src/apps/pirex/arbitrum/pirex.pxglp.token-fetcher.ts deleted file mode 100644 index 2aedda7de..000000000 --- a/src/apps/pirex/arbitrum/pirex.pxglp.token-fetcher.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { WrapperTemplateTokenFetcher } from '~position/template/wrapper.template.token-fetcher'; - -@PositionTemplate() -export class ArbitrumPirexPxGlpTokenFetcher extends WrapperTemplateTokenFetcher { - groupLabel = 'Pirex GMX'; - vaultAddress = '0x0eac365e4d7de0e293078bd771ba7d0ba9a4c892'; - underlyingTokenAddress = '0x4277f8f2c384827b5273592ff7cebd9f2c1ac258'; -} diff --git a/src/apps/pirex/arbitrum/pirex.pxgmx.token-fetcher.ts b/src/apps/pirex/arbitrum/pirex.pxgmx.token-fetcher.ts deleted file mode 100644 index 295ed7ebd..000000000 --- a/src/apps/pirex/arbitrum/pirex.pxgmx.token-fetcher.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { WrapperTemplateTokenFetcher } from '~position/template/wrapper.template.token-fetcher'; - -@PositionTemplate() -export class ArbitrumPirexPxGmxTokenFetcher extends WrapperTemplateTokenFetcher { - groupLabel = 'Pirex GMX'; - vaultAddress = '0x9a592b4539e22eeb8b2a3df679d572c7712ef999'; - underlyingTokenAddress = '0xfc5a1a6eb076a2c7ad06ed22c90d7e710e35ad0a'; -} diff --git a/src/apps/pirex/assets/logo.png b/src/apps/pirex/assets/logo.png deleted file mode 100644 index 10f4153f4163c0aeacef7e6560ce310700850d9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12263 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 Q&V2w>MN7F<@m1*m0-&pKcmMzZ diff --git a/src/apps/pirex/contracts/abis/pirex-px-cvx.json b/src/apps/pirex/contracts/abis/pirex-px-cvx.json deleted file mode 100644 index 64b6bf5e1..000000000 --- a/src/apps/pirex/contracts/abis/pirex-px-cvx.json +++ /dev/null @@ -1,312 +0,0 @@ -[ - { "inputs": [], "name": "InvalidEpoch", "type": "error" }, - { "inputs": [], "name": "InvalidFuturesRewards", "type": "error" }, - { "inputs": [], "name": "MismatchedFuturesRewards", "type": "error" }, - { "inputs": [], "name": "NoOperator", "type": "error" }, - { "inputs": [], "name": "NotAuthorized", "type": "error" }, - { "inputs": [], "name": "Paused", "type": "error" }, - { "inputs": [], "name": "ZeroAddress", "type": "error" }, - { "inputs": [], "name": "ZeroAmount", "type": "error" }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "Approval", - "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": "operator", "type": "address" }], - "name": "SetOperator", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "uint256", "name": "id", "type": "uint256" }], - "name": "Snapshot", - "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": "amount", "type": "uint256" } - ], - "name": "Transfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "uint256", "name": "epoch", "type": "uint256" }, - { "indexed": false, "internalType": "uint256[]", "name": "futuresRewards", "type": "uint256[]" } - ], - "name": "UpdateEpochFuturesRewards", - "type": "event" - }, - { - "inputs": [], - "name": "DOMAIN_SEPARATOR", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "epoch", "type": "uint256" }, - { "internalType": "bytes32", "name": "token", "type": "bytes32" }, - { "internalType": "uint256", "name": "snapshotReward", "type": "uint256" }, - { "internalType": "uint256", "name": "futuresReward", "type": "uint256" } - ], - "name": "addEpochRewardMetadata", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "", "type": "address" }, - { "internalType": "address", "name": "", "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": "", "type": "address" }], - "name": "balanceOf", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "account", "type": "address" }, - { "internalType": "uint256", "name": "snapshotId", "type": "uint256" } - ], - "name": "balanceOfAt", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "account", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "burn", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getCurrentEpoch", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getCurrentSnapshotId", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "epoch", "type": "uint256" }], - "name": "getEpoch", - "outputs": [ - { "internalType": "uint256", "name": "snapshotId", "type": "uint256" }, - { "internalType": "bytes32[]", "name": "rewards", "type": "bytes32[]" }, - { "internalType": "uint256[]", "name": "snapshotRewards", "type": "uint256[]" }, - { "internalType": "uint256[]", "name": "futuresRewards", "type": "uint256[]" } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "account", "type": "address" }, - { "internalType": "uint256", "name": "epoch", "type": "uint256" } - ], - "name": "getEpochRedeemedSnapshotRewards", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "account", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "mint", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "nonces", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "operator", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "from", "type": "address" }, - { "internalType": "address", "name": "to", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "operatorApprove", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "owner", "type": "address" }, - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "value", "type": "uint256" }, - { "internalType": "uint256", "name": "deadline", "type": "uint256" }, - { "internalType": "uint8", "name": "v", "type": "uint8" }, - { "internalType": "bytes32", "name": "r", "type": "bytes32" }, - { "internalType": "bytes32", "name": "s", "type": "bytes32" } - ], - "name": "permit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { "inputs": [], "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [ - { "internalType": "address", "name": "account", "type": "address" }, - { "internalType": "uint256", "name": "epoch", "type": "uint256" }, - { "internalType": "uint256", "name": "redeemed", "type": "uint256" } - ], - "name": "setEpochRedeemedSnapshotRewards", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "_operator", "type": "address" }], - "name": "setOperator", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { "inputs": [], "name": "takeEpochSnapshot", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "snapshotId", "type": "uint256" }], - "name": "totalSupplyAt", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "to", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "transfer", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "from", "type": "address" }, - { "internalType": "address", "name": "to", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "transferFrom", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "newOwner", "type": "address" }], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "epoch", "type": "uint256" }, - { "internalType": "uint256[]", "name": "futuresRewards", "type": "uint256[]" } - ], - "name": "updateEpochFuturesRewards", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } -] diff --git a/src/apps/pirex/contracts/index.ts b/src/apps/pirex/contracts/index.ts deleted file mode 100644 index 5dcfebdf6..000000000 --- a/src/apps/pirex/contracts/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -export * from './viem.contract-factory'; diff --git a/src/apps/pirex/contracts/viem.contract-factory.ts b/src/apps/pirex/contracts/viem.contract-factory.ts deleted file mode 100644 index a042e1c08..000000000 --- a/src/apps/pirex/contracts/viem.contract-factory.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Injectable, Inject } from '@nestjs/common'; - -import { IAppToolkit, APP_TOOLKIT } from '~app-toolkit/app-toolkit.interface'; -import { Network } from '~types/network.interface'; - -import { PirexPxCvx__factory } from './viem'; - -type ContractOpts = { address: string; network: Network }; - -@Injectable() -export class PirexViemContractFactory { - constructor(@Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit) {} - - pirexPxCvx({ address, network }: ContractOpts) { - return PirexPxCvx__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } -} diff --git a/src/apps/pirex/contracts/viem/PirexPxCvx.ts b/src/apps/pirex/contracts/viem/PirexPxCvx.ts deleted file mode 100644 index 3ff43e6d6..000000000 --- a/src/apps/pirex/contracts/viem/PirexPxCvx.ts +++ /dev/null @@ -1,738 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const pirexPxCvxAbi = [ - { - inputs: [], - name: 'InvalidEpoch', - type: 'error', - }, - { - inputs: [], - name: 'InvalidFuturesRewards', - type: 'error', - }, - { - inputs: [], - name: 'MismatchedFuturesRewards', - type: 'error', - }, - { - inputs: [], - name: 'NoOperator', - type: 'error', - }, - { - inputs: [], - name: 'NotAuthorized', - type: 'error', - }, - { - inputs: [], - name: 'Paused', - type: 'error', - }, - { - inputs: [], - name: 'ZeroAddress', - type: 'error', - }, - { - inputs: [], - name: 'ZeroAmount', - type: 'error', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'Approval', - 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: 'operator', - type: 'address', - }, - ], - name: 'SetOperator', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'uint256', - name: 'id', - type: 'uint256', - }, - ], - name: 'Snapshot', - 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: 'amount', - type: 'uint256', - }, - ], - name: 'Transfer', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'uint256', - name: 'epoch', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256[]', - name: 'futuresRewards', - type: 'uint256[]', - }, - ], - name: 'UpdateEpochFuturesRewards', - type: 'event', - }, - { - inputs: [], - name: 'DOMAIN_SEPARATOR', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'epoch', - type: 'uint256', - }, - { - internalType: 'bytes32', - name: 'token', - type: 'bytes32', - }, - { - internalType: 'uint256', - name: 'snapshotReward', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'futuresReward', - type: 'uint256', - }, - ], - name: 'addEpochRewardMetadata', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - { - internalType: 'address', - name: '', - 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: '', - type: 'address', - }, - ], - name: 'balanceOf', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'account', - type: 'address', - }, - { - internalType: 'uint256', - name: 'snapshotId', - type: 'uint256', - }, - ], - name: 'balanceOfAt', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'account', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'burn', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'decimals', - outputs: [ - { - internalType: 'uint8', - name: '', - type: 'uint8', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getCurrentEpoch', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getCurrentSnapshotId', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'epoch', - type: 'uint256', - }, - ], - name: 'getEpoch', - outputs: [ - { - internalType: 'uint256', - name: 'snapshotId', - type: 'uint256', - }, - { - internalType: 'bytes32[]', - name: 'rewards', - type: 'bytes32[]', - }, - { - internalType: 'uint256[]', - name: 'snapshotRewards', - type: 'uint256[]', - }, - { - internalType: 'uint256[]', - name: 'futuresRewards', - type: 'uint256[]', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'account', - type: 'address', - }, - { - internalType: 'uint256', - name: 'epoch', - type: 'uint256', - }, - ], - name: 'getEpochRedeemedSnapshotRewards', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'account', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'mint', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'name', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'nonces', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'operator', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'from', - type: 'address', - }, - { - internalType: 'address', - name: 'to', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'operatorApprove', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'owner', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'deadline', - type: 'uint256', - }, - { - internalType: 'uint8', - name: 'v', - type: 'uint8', - }, - { - internalType: 'bytes32', - name: 'r', - type: 'bytes32', - }, - { - internalType: 'bytes32', - name: 's', - type: 'bytes32', - }, - ], - name: 'permit', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'renounceOwnership', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'account', - type: 'address', - }, - { - internalType: 'uint256', - name: 'epoch', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'redeemed', - type: 'uint256', - }, - ], - name: 'setEpochRedeemedSnapshotRewards', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_operator', - type: 'address', - }, - ], - name: 'setOperator', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'symbol', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'takeEpochSnapshot', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'totalSupply', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'snapshotId', - type: 'uint256', - }, - ], - name: 'totalSupplyAt', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'to', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transfer', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'from', - type: 'address', - }, - { - internalType: 'address', - name: 'to', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transferFrom', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'newOwner', - type: 'address', - }, - ], - name: 'transferOwnership', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'epoch', - type: 'uint256', - }, - { - internalType: 'uint256[]', - name: 'futuresRewards', - type: 'uint256[]', - }, - ], - name: 'updateEpochFuturesRewards', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, -] as const; - -export type PirexPxCvx = typeof pirexPxCvxAbi; -export type PirexPxCvxContract = GetContractReturnType; - -export class PirexPxCvx__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: pirexPxCvxAbi, publicClient: client }); - } -} diff --git a/src/apps/pirex/contracts/viem/index.ts b/src/apps/pirex/contracts/viem/index.ts deleted file mode 100644 index 32368f855..000000000 --- a/src/apps/pirex/contracts/viem/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ - -export type { PirexPxCvx } from './PirexPxCvx'; - -export { PirexPxCvx__factory } from './PirexPxCvx'; diff --git a/src/apps/pirex/ethereum/pirex.pxbtrfly.token-fetcher.ts b/src/apps/pirex/ethereum/pirex.pxbtrfly.token-fetcher.ts deleted file mode 100644 index 7b3cd05e2..000000000 --- a/src/apps/pirex/ethereum/pirex.pxbtrfly.token-fetcher.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { WrapperTemplateTokenFetcher } from '~position/template/wrapper.template.token-fetcher'; - -@PositionTemplate() -export class EthereumPirexPxBtrflyTokenFetcher extends WrapperTemplateTokenFetcher { - groupLabel = 'Pirex BTRFLY'; - vaultAddress = '0x10978db3885ba79bf1bc823e108085fb88e6f02f'; - underlyingTokenAddress = '0xc55126051b22ebb829d00368f4b12bde432de5da'; -} diff --git a/src/apps/pirex/ethereum/pirex.pxcvx.token-fetcher.ts b/src/apps/pirex/ethereum/pirex.pxcvx.token-fetcher.ts deleted file mode 100644 index a7ae63e7a..000000000 --- a/src/apps/pirex/ethereum/pirex.pxcvx.token-fetcher.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { WrapperTemplateTokenFetcher } from '~position/template/wrapper.template.token-fetcher'; - -@PositionTemplate() -export class EthereumPirexPxCvxTokenFetcher extends WrapperTemplateTokenFetcher { - groupLabel = 'Pirex Convex'; - vaultAddress = '0xbce0cf87f513102f22232436cca2ca49e815c3ac'; - underlyingTokenAddress = '0x4e3fbd56cd56c3e72c1403e103b45db9da5b9d2b'; -} diff --git a/src/apps/pirex/pirex.module.ts b/src/apps/pirex/pirex.module.ts deleted file mode 100644 index fd9cbf63e..000000000 --- a/src/apps/pirex/pirex.module.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Module } from '@nestjs/common'; - -import { AbstractApp } from '~app/app.dynamic-module'; - -import { ArbitrumPirexPxGlpTokenFetcher } from './arbitrum/pirex.pxglp.token-fetcher'; -import { ArbitrumPirexPxGmxTokenFetcher } from './arbitrum/pirex.pxgmx.token-fetcher'; -import { PirexViemContractFactory } from './contracts'; -import { EthereumPirexPxBtrflyTokenFetcher } from './ethereum/pirex.pxbtrfly.token-fetcher'; -import { EthereumPirexPxCvxTokenFetcher } from './ethereum/pirex.pxcvx.token-fetcher'; - -@Module({ - providers: [ - ArbitrumPirexPxGlpTokenFetcher, - ArbitrumPirexPxGmxTokenFetcher, - EthereumPirexPxCvxTokenFetcher, - EthereumPirexPxBtrflyTokenFetcher, - PirexViemContractFactory, - ], -}) -export class PirexAppModule extends AbstractApp() {} diff --git a/src/apps/redacted-cartel/ethereum/redacted-cartel.wx-btrfly-v1.token-fetcher.ts b/src/apps/redacted-cartel/ethereum/redacted-cartel.wx-btrfly-v1.token-fetcher.ts deleted file mode 100644 index 7f5937fff..000000000 --- a/src/apps/redacted-cartel/ethereum/redacted-cartel.wx-btrfly-v1.token-fetcher.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { VaultTemplateTokenFetcher } from '~position/template/vault.template.token-fetcher'; - -@PositionTemplate() -export class EthereumRedactedCartelWxBtrflyV1TokenFetcher extends VaultTemplateTokenFetcher { - groupLabel = 'wxBTRFLY v1'; - - vaultAddress = '0x186e55c0bebd2f69348d94c4a27556d93c5bd36c'; - underlyingTokenAddress = '0xcc94faf235cc5d3bf4bed3a30db5984306c86abc'; -} diff --git a/src/apps/redacted-cartel/ethereum/redacted-cartel.wx-btrfly.token-fetcher.ts b/src/apps/redacted-cartel/ethereum/redacted-cartel.wx-btrfly.token-fetcher.ts deleted file mode 100644 index b56779da7..000000000 --- a/src/apps/redacted-cartel/ethereum/redacted-cartel.wx-btrfly.token-fetcher.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { VaultTemplateTokenFetcher } from '~position/template/vault.template.token-fetcher'; - -@PositionTemplate() -export class EthereumRedactedCartelWxBtrflyTokenFetcher extends VaultTemplateTokenFetcher { - groupLabel = 'wxBTRFLY'; - - vaultAddress = '0x4b16d95ddf1ae4fe8227ed7b7e80cf13275e61c9'; - underlyingTokenAddress = '0xcc94faf235cc5d3bf4bed3a30db5984306c86abc'; -} diff --git a/src/apps/redacted-cartel/ethereum/redacted-cartel.x-btrfly.token-fetcher.ts b/src/apps/redacted-cartel/ethereum/redacted-cartel.x-btrfly.token-fetcher.ts deleted file mode 100644 index e394c62a9..000000000 --- a/src/apps/redacted-cartel/ethereum/redacted-cartel.x-btrfly.token-fetcher.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { WrapperWithReserveTemplateTokenFetcher } from '~position/template/wrapper-with-reserve.template.token-fetcher'; - -@PositionTemplate() -export class EthereumRedactedCartelXBtrflyTokenFetcher extends WrapperWithReserveTemplateTokenFetcher { - groupLabel = 'xBTRFLY'; - - vaultAddress = '0xcc94faf235cc5d3bf4bed3a30db5984306c86abc'; - underlyingTokenAddress = '0xc0d4ceb216b3ba9c3701b291766fdcba977cec3a'; - reserveAddress = '0xbde4dfb0dbb0dd8833efb6c5bd0ce048c852c487'; -} diff --git a/src/apps/redacted-cartel/redacted-cartel.module.ts b/src/apps/redacted-cartel/redacted-cartel.module.ts index b8f95f7b1..f114f2ac2 100644 --- a/src/apps/redacted-cartel/redacted-cartel.module.ts +++ b/src/apps/redacted-cartel/redacted-cartel.module.ts @@ -6,16 +6,10 @@ import { RedactedEarningsResolver } from './common/redacted.earnings-resolver'; import { RedactedCartelViemContractFactory } from './contracts'; import { EthereumRedactedCartelBondContractPositionFetcher } from './ethereum/redacted-cartel.bond.contract-position-fetcher'; import { EthereumRedactedCartelRevenueLockContractPositionFetcher } from './ethereum/redacted-cartel.revenue-lock.contract-position-fetcher'; -import { EthereumRedactedCartelWxBtrflyV1TokenFetcher } from './ethereum/redacted-cartel.wx-btrfly-v1.token-fetcher'; -import { EthereumRedactedCartelWxBtrflyTokenFetcher } from './ethereum/redacted-cartel.wx-btrfly.token-fetcher'; -import { EthereumRedactedCartelXBtrflyTokenFetcher } from './ethereum/redacted-cartel.x-btrfly.token-fetcher'; @Module({ providers: [ RedactedCartelViemContractFactory, - EthereumRedactedCartelXBtrflyTokenFetcher, - EthereumRedactedCartelWxBtrflyTokenFetcher, - EthereumRedactedCartelWxBtrflyV1TokenFetcher, EthereumRedactedCartelBondContractPositionFetcher, EthereumRedactedCartelRevenueLockContractPositionFetcher, RedactedEarningsResolver, diff --git a/src/apps/steak-hut/avalanche/steak-hut.ve.token-fetcher.ts b/src/apps/steak-hut/avalanche/steak-hut.ve.token-fetcher.ts deleted file mode 100644 index 1c40bc0b2..000000000 --- a/src/apps/steak-hut/avalanche/steak-hut.ve.token-fetcher.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { WrapperTemplateTokenFetcher } from '~position/template/wrapper.template.token-fetcher'; - -@PositionTemplate() -export class AvalancheSteakHutVeTokenFetcher extends WrapperTemplateTokenFetcher { - groupLabel = 'Voting Escrow'; - - vaultAddress = '0xe7250b05bd8dee615ecc681eda1196add5156f2b'; - underlyingTokenAddress = '0x6e84a6216ea6dacc71ee8e6b0a5b7322eebc0fdd'; -} diff --git a/src/apps/steak-hut/steak-hut.module.ts b/src/apps/steak-hut/steak-hut.module.ts index e0c0226ec..b2b689d3d 100644 --- a/src/apps/steak-hut/steak-hut.module.ts +++ b/src/apps/steak-hut/steak-hut.module.ts @@ -4,16 +4,13 @@ import { AbstractApp } from '~app/app.dynamic-module'; import { AvalancheSteakHutPoolContractPositionFetcher } from './avalanche/steak-hut.pool.contract-position-fetcher'; import { AvalancheSteakHutStakingContractPositionFetcher } from './avalanche/steak-hut.staking.contract-position-fetcher'; -import { AvalancheSteakHutVeTokenFetcher } from './avalanche/steak-hut.ve.token-fetcher'; import { SteakHutViemContractFactory } from './contracts'; @Module({ providers: [ + SteakHutViemContractFactory, AvalancheSteakHutPoolContractPositionFetcher, AvalancheSteakHutStakingContractPositionFetcher, - AvalancheSteakHutVeTokenFetcher, - - SteakHutViemContractFactory, ], }) export class SteakHutAppModule extends AbstractApp() {} diff --git a/src/apps/trader-joe/avalanche/trader-joe.ve-joe.token-fetcher.ts b/src/apps/trader-joe/avalanche/trader-joe.ve-joe.token-fetcher.ts deleted file mode 100644 index 1bef8da85..000000000 --- a/src/apps/trader-joe/avalanche/trader-joe.ve-joe.token-fetcher.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; - -import { TraderJoeViemContractFactory } from '../contracts'; -import { TraderJoeVeJoe } from '../contracts/viem/TraderJoeVeJoe'; - -@PositionTemplate() -export class AvalancheTraderJoeVeJoeTokenFetcher extends AppTokenTemplatePositionFetcher { - groupLabel = 'veJOE'; - isExcludedFromBalances = true; - isExcludedFromExplore = true; - isExcludedFromTvl = true; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(TraderJoeViemContractFactory) protected readonly contractFactory: TraderJoeViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.traderJoeVeJoe({ address, network: this.network }); - } - - async getAddresses(): Promise { - return ['0x3cabf341943bc8466245e4d6f1ae0f8d071a1456']; - } - - async getUnderlyingTokenDefinitions() { - return []; - } - - async getPricePerShare() { - return [1]; - } - - async getPrice() { - return 0; // Valueless token - } -} diff --git a/src/apps/trader-joe/trader-joe.module.ts b/src/apps/trader-joe/trader-joe.module.ts index 347c4c571..de144ba77 100644 --- a/src/apps/trader-joe/trader-joe.module.ts +++ b/src/apps/trader-joe/trader-joe.module.ts @@ -9,7 +9,6 @@ import { AvalancheTraderJoeChefV3FarmContractPositionFetcher } from './avalanche import { AvalancheTraderJoePoolTokenFetcher } from './avalanche/trader-joe.pool.token-fetcher'; import { AvalancheTraderJoeSJoeContractPositionFetcher } from './avalanche/trader-joe.s-joe.contract-position-fetcher'; import { AvalancheTraderJoeVeJoeContractPositionFetcher } from './avalanche/trader-joe.ve-joe-farm.contract-position-fetcher'; -import { AvalancheTraderJoeVeJoeTokenFetcher } from './avalanche/trader-joe.ve-joe.token-fetcher'; import { AvalancheTraderJoeXJoeTokenFetcher } from './avalanche/trader-joe.x-joe.token-fetcher'; import { TraderJoeViemContractFactory } from './contracts'; @@ -24,7 +23,6 @@ import { TraderJoeViemContractFactory } from './contracts'; AvalancheTraderJoeXJoeTokenFetcher, AvalancheTraderJoeSJoeContractPositionFetcher, AvalancheTraderJoeVeJoeContractPositionFetcher, - AvalancheTraderJoeVeJoeTokenFetcher, ], }) export class TraderJoeAppModule extends AbstractApp() {} diff --git a/src/apps/vela/arbitrum/vela.vlp.token-fetcher.ts b/src/apps/vela/arbitrum/vela.vlp.token-fetcher.ts deleted file mode 100644 index 369cf5a98..000000000 --- a/src/apps/vela/arbitrum/vela.vlp.token-fetcher.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; - -import { VelaVlpTokenFetcher } from '../common/vela.vlp.token-fetcher'; - -@PositionTemplate() -export class ArbitrumVelaVlpTokenFetcher extends VelaVlpTokenFetcher { - vlpAddress = '0xc5b2d9fda8a82e8dcecd5e9e6e99b78a9188eb05'; - usdcAddress = '0xff970a61a04b1ca14834a43f5de4533ebddb5cc8'; - vaultAddress = '0xc4abade3a15064f9e3596943c699032748b13352'; -} diff --git a/src/apps/vela/common/vela.vlp.token-fetcher.ts b/src/apps/vela/common/vela.vlp.token-fetcher.ts deleted file mode 100644 index d7536ab55..000000000 --- a/src/apps/vela/common/vela.vlp.token-fetcher.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { Erc20 } from '~contract/contracts/viem'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { UnderlyingTokenDefinition, GetPricePerShareParams } from '~position/template/app-token.template.types'; - -import { VelaViemContractFactory } from '../contracts'; - -export abstract class VelaVlpTokenFetcher extends AppTokenTemplatePositionFetcher { - groupLabel = 'VLP'; - - abstract vlpAddress: string; - abstract usdcAddress: string; - abstract vaultAddress: string; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(VelaViemContractFactory) private readonly velaContractFactory: VelaViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.appToolkit.globalViemContracts.erc20({ - address, - network: this.network, - }); - } - - async getAddresses(): Promise { - return [this.vlpAddress]; - } - - async getUnderlyingTokenDefinitions(): Promise { - return [{ address: this.usdcAddress, network: this.network }]; - } - - async getPricePerShare({ multicall }: GetPricePerShareParams): Promise { - const velaVault = multicall.wrap( - this.velaContractFactory.velaVault({ - address: this.vaultAddress, - network: this.network, - }), - ); - const basisPointsDivisor = 100000; - - const vlpPrice = await velaVault.read.getVLPPrice(); - const pricePerShare = Number(vlpPrice) / Number(basisPointsDivisor); - - return [pricePerShare]; - } -} diff --git a/src/apps/vela/vela.module.ts b/src/apps/vela/vela.module.ts index d9a411d85..529ac2e7f 100644 --- a/src/apps/vela/vela.module.ts +++ b/src/apps/vela/vela.module.ts @@ -3,10 +3,9 @@ import { Module } from '@nestjs/common'; import { AbstractApp } from '~app/app.dynamic-module'; import { ArbitrumVelaVlpFarmContractPositionFetcher } from './arbitrum/vela.token-farm.contract-position-fetcher'; -import { ArbitrumVelaVlpTokenFetcher } from './arbitrum/vela.vlp.token-fetcher'; import { VelaViemContractFactory } from './contracts'; @Module({ - providers: [ArbitrumVelaVlpFarmContractPositionFetcher, ArbitrumVelaVlpTokenFetcher, VelaViemContractFactory], + providers: [ArbitrumVelaVlpFarmContractPositionFetcher, VelaViemContractFactory], }) export class VelaAppModule extends AbstractApp() {} diff --git a/src/apps/velodrome-v2/optimism/velodrome-v2.pool.token-fetcher.ts b/src/apps/velodrome-v2/optimism/velodrome-v2.pool.token-fetcher.ts deleted file mode 100644 index 19d3da6c0..000000000 --- a/src/apps/velodrome-v2/optimism/velodrome-v2.pool.token-fetcher.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { Inject } from '@nestjs/common'; -import { range } from 'lodash'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { getLabelFromToken } from '~app-toolkit/helpers/presentation/image.present'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { - GetAddressesParams, - GetDisplayPropsParams, - GetPricePerShareParams, - GetUnderlyingTokensParams, -} from '~position/template/app-token.template.types'; - -import { VelodromeV2ViemContractFactory } from '../contracts'; -import { VelodromeV2Pool } from '../contracts/viem/VelodromeV2Pool'; - -@PositionTemplate() -export class OptimismVelodromeV2PoolTokenFetcher extends AppTokenTemplatePositionFetcher { - groupLabel = 'Pools'; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(VelodromeV2ViemContractFactory) protected readonly contractFactory: VelodromeV2ViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.velodromeV2Pool({ address, network: this.network }); - } - - async getDefinitions() { - const multicall = this.appToolkit.getViemMulticall(this.network); - const factoryContract = this.contractFactory.velodromeV2PoolFactory({ - address: '0xf1046053aa5682b4f9a81b5481394da16be5ff5a', - network: this.network, - }); - - const poolLength = await multicall.wrap(factoryContract).read.allPoolsLength(); - - const poolAddresses = await Promise.all( - range(0, Number(poolLength)).map(async i => { - const poolAddressRaw = await multicall.wrap(factoryContract).read.allPools([BigInt(i)]); - return { address: poolAddressRaw.toLowerCase() }; - }), - ); - - return poolAddresses; - } - - async getAddresses({ definitions }: GetAddressesParams) { - return definitions.map(v => v.address); - } - - async getUnderlyingTokenDefinitions({ contract }: GetUnderlyingTokensParams) { - const [token0, token1] = await contract.read.tokens(); - - return [ - { address: token0.toLowerCase(), network: this.network }, - { address: token1.toLowerCase(), network: this.network }, - ]; - } - - async getPricePerShare({ contract, appToken }: GetPricePerShareParams) { - const [reserveRaw0, reserveRaw1] = await Promise.all([contract.read.reserve0(), contract.read.reserve1()]); - - const reserves = [reserveRaw0, reserveRaw1].map((v, i) => Number(v) / 10 ** appToken.tokens[i].decimals); - return reserves.map(v => v / appToken.supply); - } - - async getLabel({ appToken }: GetDisplayPropsParams) { - return appToken.tokens.map(v => getLabelFromToken(v)).join(' / '); - } -} diff --git a/src/apps/velodrome-v2/velodrome-v2.module.ts b/src/apps/velodrome-v2/velodrome-v2.module.ts index 951f6e197..3e9fe5943 100644 --- a/src/apps/velodrome-v2/velodrome-v2.module.ts +++ b/src/apps/velodrome-v2/velodrome-v2.module.ts @@ -6,14 +6,12 @@ import { VelodromeV2AddressesResolver } from './common/velodrome-v2.addresses-re import { VelodromeV2ViemContractFactory } from './contracts'; import { OptimismVelodromeV2BribeContractPositionFetcher } from './optimism/velodrome-v2.bribe.contract-position-fetcher'; import { OptimismVelodromeV2GaugeContractPositionFetcher } from './optimism/velodrome-v2.gauge.contract-position-fetcher'; -import { OptimismVelodromeV2PoolTokenFetcher } from './optimism/velodrome-v2.pool.token-fetcher'; import { OptimismVelodromeV2VotingEscrowContractPositionFetcher } from './optimism/velodrome-v2.voting-escrow.contract-position-fetcher'; @Module({ providers: [ VelodromeV2ViemContractFactory, VelodromeV2AddressesResolver, - OptimismVelodromeV2PoolTokenFetcher, OptimismVelodromeV2VotingEscrowContractPositionFetcher, OptimismVelodromeV2GaugeContractPositionFetcher, OptimismVelodromeV2BribeContractPositionFetcher,