Navigation Menu

Skip to content
This repository has been archived by the owner on Jan 24, 2024. It is now read-only.

Commit

Permalink
feat(abracadabra): Add support for magicAPE (#2341)
Browse files Browse the repository at this point in the history
* feat: Add abstract Erc4626VaultTemplateTokenFetcher

* feat(abracadabra): Add support for magicAPE

* feat(abracadabra): Add support for magicAPE cauldron

* refactor: Use Erc4627VaultTemplateTokenFetcher for magicGLP

---------

Co-authored-by: William Poulin <will@zapper.fi>
  • Loading branch information
0xmDreamy and wpoulin committed Feb 21, 2023
1 parent e8117dc commit 0706feb
Show file tree
Hide file tree
Showing 17 changed files with 2,871 additions and 797 deletions.
2 changes: 2 additions & 0 deletions src/apps/abracadabra/abracadabra.module.ts
Expand Up @@ -16,6 +16,7 @@ import { AbracadabraContractFactory } 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';
Expand All @@ -37,6 +38,7 @@ import { FantomAbracadabraStakedSpellTokenFetcher } from './fantom/abracadabra.s
BinanceSmartChainAbracadabraCauldronContractPositionFetcher,
EthereumAbracadabraCauldronContractPositionFetcher,
EthereumAbracadabraFarmContractPositionFetcher,
EthereumAbracadabraMagicApeTokenFetcher,
EthereumAbracadabraMspellContractPositionFetcher,
EthereumAbracadabraStakedSpellTokenFetcher,
FantomAbracadabraCauldronContractPositionFetcher,
Expand Down
Expand Up @@ -11,4 +11,3 @@ export const S_SPELL_ADDRESS = '0xf7428ffcb2581a2804998efbb036a43255c8a8d3';
export const SPELL_ADDRESS = '0xf7428ffcb2581a2804998efbb036a43255c8a8d3';

export const MAGIC_GLP_ADDRESS = '0x85667409a723684fe1e57dd1abde8d88c2f54214';
export const S_GLP_ADDRESS = '0x5402b5f40310bded796c7d0f3ff6683f5c0cffdf';
@@ -1,45 +1,17 @@
import { Inject } from '@nestjs/common';
import { ethers } from 'ethers';

import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface';
import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator';
import { Erc20 } from '~contract/contracts';
import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher';
import {
GetAddressesParams,
DefaultAppTokenDefinition,
GetUnderlyingTokensParams,
UnderlyingTokenDefinition,
GetPricePerShareParams,
DefaultAppTokenDataProps,
} from '~position/template/app-token.template.types';

import { AbracadabraContractFactory } from '../contracts';
import { GetDisplayPropsParams, UnderlyingTokenDefinition } from '~position/template/app-token.template.types';
import { Erc4626VaultTemplateTokenFetcher } from '~position/template/erc4626-vault.template.token-fetcher';

import { MAGIC_GLP_ADDRESS, S_GLP_ADDRESS } from './abracadabra.arbitrum.constants';
import { MAGIC_GLP_ADDRESS } from './abracadabra.arbitrum.constants';

@PositionTemplate()
export class ArbitrumAbracadabraMagicGlpTokenFetcher extends AppTokenTemplatePositionFetcher<Erc20> {
export class ArbitrumAbracadabraMagicGlpTokenFetcher extends Erc4626VaultTemplateTokenFetcher {
groupLabel = 'Magic GLP';
vaultAddress = MAGIC_GLP_ADDRESS;

constructor(
@Inject(APP_TOOLKIT) public readonly appToolkit: IAppToolkit,
@Inject(AbracadabraContractFactory) private readonly abracadabraContractFactory: AbracadabraContractFactory,
) {
super(appToolkit);
}

getContract(_address: string): Erc20 {
return this.abracadabraContractFactory.erc20({ address: _address, network: this.network });
}

async getAddresses(_params: GetAddressesParams<DefaultAppTokenDefinition>): Promise<string[]> {
return [MAGIC_GLP_ADDRESS];
}

async getUnderlyingTokenDefinitions(
_params: GetUnderlyingTokensParams<Erc20, DefaultAppTokenDefinition>,
): Promise<UnderlyingTokenDefinition[]> {
// Override as the underlying is sGLP, but users expect to see GLP
async getUnderlyingTokenDefinitions(): Promise<UnderlyingTokenDefinition[]> {
const glpTokenDefinitions = await this.appToolkit.getAppTokenPositionsFromDatabase({
appId: 'gmx',
groupIds: ['glp'],
Expand All @@ -51,28 +23,7 @@ export class ArbitrumAbracadabraMagicGlpTokenFetcher extends AppTokenTemplatePos
return [{ address: glpUnderlying.address, network: this.network }];
}

async getPricePerShare({
contract,
appToken,
}: GetPricePerShareParams<Erc20, DefaultAppTokenDataProps, DefaultAppTokenDefinition>): Promise<number[]> {
const glpContract = this.abracadabraContractFactory.erc20({
address: S_GLP_ADDRESS,
network: this.network,
});
const [totalSupply, balanceOf] = await Promise.all([
contract.totalSupply(),
glpContract.balanceOf(appToken.address),
]);

const glpDecimals = await glpContract.decimals();
const pricePerShare =
parseFloat(ethers.utils.formatUnits(balanceOf, glpDecimals)) /
parseFloat(ethers.utils.formatUnits(totalSupply, glpDecimals));

return [pricePerShare];
}

async getLabel(): Promise<string> {
return 'magicGLP';
async getLabel({ contract }: GetDisplayPropsParams<Erc20>): Promise<string> {
return contract.name();
}
}
Expand Up @@ -44,5 +44,6 @@ export class EthereumAbracadabraCauldronContractPositionFetcher extends Abracada
'0x85f60D3ea4E86Af43c9D4E9CC9095281fC25c405', // Migrated WBTC
'0x7259e152103756e1616A77Ae982353c3751A6a90', // yvCrv3Crypto
'0x1062eB452f8C7A94276437ec1F4aAca9b1495B72', // Stargate USDT (POF)
'0x692887E8877C6Dd31593cda44c382DB5b289B684', // magicAPE
];
}
@@ -0,0 +1,14 @@
import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator';
import { Erc20 } from '~contract/contracts';
import { GetDisplayPropsParams } from '~position/template/app-token.template.types';
import { Erc4626VaultTemplateTokenFetcher } from '~position/template/erc4626-vault.template.token-fetcher';

@PositionTemplate()
export class EthereumAbracadabraMagicApeTokenFetcher extends Erc4626VaultTemplateTokenFetcher {
groupLabel = 'Magic APE';
vaultAddress = '0xf35b31B941D94B249EaDED041DB1b05b7097fEb6';

async getLabel({ contract }: GetDisplayPropsParams<Erc20>): Promise<string> {
return contract.name();
}
}

0 comments on commit 0706feb

Please sign in to comment.