diff --git a/src/apps/teahouse/contracts/ethers/index.ts b/src/apps/teahouse/contracts/ethers/index.ts index 8f537dd17..352b0d5a7 100644 --- a/src/apps/teahouse/contracts/ethers/index.ts +++ b/src/apps/teahouse/contracts/ethers/index.ts @@ -1,6 +1,6 @@ /* Autogenerated file. Do not edit manually. */ /* tslint:disable */ /* eslint-disable */ -export type { TeahouseVault } from './TeahouseVault'; +export type { TeahouseVault} from './TeahouseVault'; export * as factories from './factories'; export { TeahouseVault__factory } from './factories/TeahouseVault__factory'; diff --git a/src/apps/teahouse/ethereum/teahouse.vaults.token-fetcher.ts b/src/apps/teahouse/ethereum/teahouse.vaults.token-fetcher.ts new file mode 100644 index 000000000..7818080fe --- /dev/null +++ b/src/apps/teahouse/ethereum/teahouse.vaults.token-fetcher.ts @@ -0,0 +1,58 @@ +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 { GetUnderlyingTokensParams } from '~position/template/app-token.template.types'; + +import { TeahouseVault, TeahouseContractFactory } from '../contracts'; + +@PositionTemplate() +export class EthereumTeahouseVaultsTokenFetcher extends AppTokenTemplatePositionFetcher { + groupLabel = 'Vault share'; + + constructor( + @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, + @Inject(TeahouseContractFactory) protected readonly contractFactory: TeahouseContractFactory, + ) { + super(appToolkit); + } + + getContract(address: string) { + return this.contractFactory.teahouseVault({ network: this.network, address }); + } + + async getAddresses() { + return [ + '0xe1b3c128c0d0a9e41ab3ff8f0984e5d5bef81677', + '0xb54e2764bef6994245527f75eb8f180c484c404d', + '0x478afa95f40bf5504cff32796c20bfd0b4e38330', + '0x9ed9c1c0f1c68666668a7aedec5fec95abc7f943', + ]; + } + + async getUnderlyingTokenDefinitions({ contract }: GetUnderlyingTokensParams) { + return [{ address: await contract.asset(), network: this.network }]; + } + + async getPricePerShare({ contract }) { + const assetAddress = await contract.asset(); + const assetContract = this.getContract(assetAddress); + const assetDecimals = await assetContract.decimals(); + const shareDecimals = await contract.decimals(); + const globalState = await contract.globalState(); + const currentIndex = globalState[2]; + const enterNextCycleEventFilter = await contract.filters.EnterNextCycle(null, currentIndex - 1); + const enterNextCycleEvent = await contract.queryFilter(enterNextCycleEventFilter, null, null); + const priceNumerator = enterNextCycleEvent[0].args.priceNumerator; + const priceDenominator = enterNextCycleEvent[0].args.priceDenominator; + const pricePerShare = + priceNumerator + .mul('1' + '0'.repeat(shareDecimals)) + .mul(100000000) + .div(priceDenominator) + .div('1' + '0'.repeat(assetDecimals)) + .toNumber() / 100000000; + return [pricePerShare]; + } +} diff --git a/src/apps/teahouse/optimism/teahouse.vaults.contract-position-fetcher.ts b/src/apps/teahouse/optimism/teahouse.vaults.contract-position-fetcher.ts deleted file mode 100644 index 11e509b0a..000000000 --- a/src/apps/teahouse/optimism/teahouse.vaults.contract-position-fetcher.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { Inject } from '@nestjs/common'; -import { BigNumberish } from 'ethers'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { MetaType } from '~position/position.interface'; -import { ContractPositionTemplatePositionFetcher } from '~position/template/contract-position.template.position-fetcher'; -import { - GetTokenBalancesParams, - GetTokenDefinitionsParams, -} from '~position/template/contract-position.template.types'; - -import { TeahouseVault, TeahouseContractFactory } from '../contracts'; - -@PositionTemplate() -export class OptimismTeahouseVaultsContractPositionFetcher extends ContractPositionTemplatePositionFetcher { - groupLabel = 'Vault'; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(TeahouseContractFactory) private readonly contractFactory: TeahouseContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string): TeahouseVault { - return this.contractFactory.teahouseVault({ network: this.network, address }); - } - - async getDefinitions() { - return [ - { address: '0x9ae039f9de94542f6f1b3fba60223e6aa4f411af' }, - { address: '0xee1e02609a480bdc9d9651c200d90222b6691f03' }, - ]; - } - - async getTokenDefinitions({ contract }: GetTokenDefinitionsParams) { - return [ - { - address: await contract.asset(), - metaType: MetaType.SUPPLIED, - network: this.network, - }, - ]; - } - - async getLabel({ contract }) { - return await contract.name(); - } - - async getTokenBalancesPerPosition({ address, contract }: GetTokenBalancesParams): Promise { - const userState = await contract.userState(address); - const balance = await contract.balanceOf(address); - const requestedDeposits = userState.requestedDeposits; - return [balance.add(requestedDeposits)]; - } -} diff --git a/src/apps/teahouse/optimism/teahouse.vaults.token-fetcher.ts b/src/apps/teahouse/optimism/teahouse.vaults.token-fetcher.ts new file mode 100644 index 000000000..0da05cc0b --- /dev/null +++ b/src/apps/teahouse/optimism/teahouse.vaults.token-fetcher.ts @@ -0,0 +1,53 @@ +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 { GetUnderlyingTokensParams } from '~position/template/app-token.template.types'; + +import { TeahouseVault, TeahouseContractFactory } from '../contracts'; + +@PositionTemplate() +export class OptimismTeahouseVaultsTokenFetcher extends AppTokenTemplatePositionFetcher { + groupLabel = 'Vault share'; + + constructor( + @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, + @Inject(TeahouseContractFactory) protected readonly contractFactory: TeahouseContractFactory, + ) { + super(appToolkit); + } + + getContract(address: string) { + return this.contractFactory.teahouseVault({ network: this.network, address }); + } + + async getAddresses() { + return ['0x9ae039f9de94542f6f1b3fba60223e6aa4f411af', '0xee1e02609a480bdc9d9651c200d90222b6691f03']; + } + + async getUnderlyingTokenDefinitions({ contract }: GetUnderlyingTokensParams) { + return [{ address: await contract.asset(), network: this.network }]; + } + + async getPricePerShare({ contract }) { + const assetAddress = await contract.asset(); + const assetContract = this.getContract(assetAddress); + const assetDecimals = await assetContract.decimals(); + const shareDecimals = await contract.decimals(); + const globalState = await contract.globalState(); + const currentIndex = globalState[2]; + const enterNextCycleEventFilter = await contract.filters.EnterNextCycle(null, currentIndex - 1); + const enterNextCycleEvent = await contract.queryFilter(enterNextCycleEventFilter, null, null); + const priceNumerator = enterNextCycleEvent[0].args.priceNumerator; + const priceDenominator = enterNextCycleEvent[0].args.priceDenominator; + const pricePerShare = + priceNumerator + .mul('1' + '0'.repeat(shareDecimals)) + .mul(100000000) + .div(priceDenominator) + .div('1' + '0'.repeat(assetDecimals)) + .toNumber() / 100000000; + return [pricePerShare]; + } +} diff --git a/src/apps/teahouse/teahouse.module.ts b/src/apps/teahouse/teahouse.module.ts index 19f5abd78..ded868204 100644 --- a/src/apps/teahouse/teahouse.module.ts +++ b/src/apps/teahouse/teahouse.module.ts @@ -3,12 +3,10 @@ import { Module } from '@nestjs/common'; import { AbstractApp } from '~app/app.dynamic-module'; import { TeahouseContractFactory } from './contracts'; -import { OptimismTeahouseVaultsContractPositionFetcher } from './optimism/teahouse.vaults.contract-position-fetcher'; +import { EthereumTeahouseVaultsTokenFetcher } from './ethereum/teahouse.vaults.token-fetcher'; +import { OptimismTeahouseVaultsTokenFetcher } from './optimism/teahouse.vaults.token-fetcher'; @Module({ - providers: [ - TeahouseContractFactory, - OptimismTeahouseVaultsContractPositionFetcher, - ], + providers: [TeahouseContractFactory, EthereumTeahouseVaultsTokenFetcher, OptimismTeahouseVaultsTokenFetcher], }) -export class TeahouseAppModule extends AbstractApp() { } +export class TeahouseAppModule extends AbstractApp() {}