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

Commit

Permalink
feat(rigoblock): optimize underlying token definitions (#2779)
Browse files Browse the repository at this point in the history
* fix(rigoblock): remove token blacklist and optimize calls

- we remove tokens that are not tracked by either coingecko or zapper (i.e. bridged tokens, tokens with 0 supply or volume, ...)
- we query the token whitelist onchain just once with "definitions".
- removed token blacklist filter from getUnderlyingTokenDefinitions

* fix(rigoblock): return only positive token balances

- filter token list for each pool by tokens where the pool holds a positive balance.

* removed abstract blockedTokenAddresses definition

* type fixes

* fix types definitions

* style: minor fix
  • Loading branch information
gabririgo committed Jun 27, 2023
1 parent b7be33e commit 8a2089b
Show file tree
Hide file tree
Showing 5 changed files with 39 additions and 42 deletions.
13 changes: 0 additions & 13 deletions src/apps/rigoblock/arbitrum/rigoblock.pool.token-fetcher.ts
Expand Up @@ -5,17 +5,4 @@ import { RigoblockPoolTokenFetcher } from '../common/rigoblock.pool.token-fetche
@PositionTemplate()
export class ArbitrumRigoblockPoolTokenFetcher extends RigoblockPoolTokenFetcher {
groupLabel = 'Smart Pools';

blockedTokenAddresses = [
'0x51318b7d00db7acc4026c88c3952b66278b6a67f', // PLS
'0x46ca8ed5465cb859bb3c3364078912c25f4d74de', // KTN
'0x873484f654a7203296931f529680449e8a642898', // iETHV
'0x3c998a2c7408b1043a047a3fe10114483ed1958d', // MYM
'0xdab8c8776a4041415a60ed6b339d8e667cf2a934', // PERPI
'0xdf6b7b551a09ddb8d879165b870e6085db027036', // BRCF
'0x79f707d68cd49ca5d9aeb33affd4477c3ea8ea8f', // ETHV
'0x9842989969687f7d249d01cae1d2ff6b7b6b6d35', // CRYPTO
'0xbad58ed9b5f26a002ea250d7a60dc6729a4a2403', // PBX
'0x7f4638a58c0615037decc86f1dae60e55fe92874', // GRG
];
}
49 changes: 39 additions & 10 deletions src/apps/rigoblock/common/rigoblock.pool.token-fetcher.ts
@@ -1,6 +1,7 @@
import { parseBytes32String } from '@ethersproject/strings';
import { BigNumber } from 'ethers';
import { Inject } from '@nestjs/common';
import { flatMap } from 'lodash';
import { compact, flatMap } from 'lodash';

import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface';
import { DefaultDataProps } from '~position/display.interface';
Expand All @@ -12,6 +13,7 @@ import {
GetPricePerShareParams,
DefaultAppTokenDataProps,
} from '~position/template/app-token.template.types';
import { BaseToken } from '~position/token.interface';

import { RigoblockContractFactory, SmartPool } from '../contracts';

Expand All @@ -22,13 +24,18 @@ type RigoblockSmartPoolDefinition = DefaultAppTokenDefinition & {
logType: PoolLogType;
address: string;
name: string;
tokenList?: WhitelistedTokenDefinition[];
};

type WhitelistedTokenDefinition = DefaultAppTokenDefinition & {
logType: PoolLogType;
address: string;
};

type RToken = BaseToken & {
hide: boolean;
}

export abstract class RigoblockPoolTokenFetcher extends AppTokenTemplatePositionFetcher<
SmartPool,
DefaultAppTokenDataProps,
Expand All @@ -42,13 +49,12 @@ export abstract class RigoblockPoolTokenFetcher extends AppTokenTemplatePosition
super(appToolkit);
}

// some tokens on L2s don't have a price feed on CG
abstract blockedTokenAddresses: string[];

extraDefinitions: RigoblockSmartPoolDefinition[] = [];

async getDefinitions(): Promise<RigoblockSmartPoolDefinition[]> {
const poolBuilders = POOL_BUILDERS[this.network] ?? [];
// we query tracked tokens here to save redundant calls
const tokenList = await this.getTokenList()

// Get all logs for each pool builder contract
const builderLogs = await Promise.all(
Expand All @@ -72,6 +78,7 @@ export abstract class RigoblockPoolTokenFetcher extends AppTokenTemplatePosition
logType,
address: poolAddress,
name: parseBytes32String(name),
tokenList,
};
}),
),
Expand All @@ -88,7 +95,19 @@ export abstract class RigoblockPoolTokenFetcher extends AppTokenTemplatePosition
return this.contractFactory.smartPool({ address, network: this.network });
}

// whitelisted tokens are filtered by those that are not tracked
async getTokenList(): Promise<WhitelistedTokenDefinition[]> {
const tokenList = [...new Set(await this.getTokenWhitelist())];
const baseTokens = await this.appToolkit.getBaseTokenPrices(this.network) as RToken[];
const trackedTokens = tokenList.map(token => {
const tokenFound = baseTokens.find(p => p.address === token.address && !p.hide);
if (!tokenFound) return null;
return token;
});
return compact(trackedTokens);
}

async getTokenWhitelist(): Promise<WhitelistedTokenDefinition[]> {
const tokenBuilders = POOL_BUILDERS[this.network] ?? [];

const tokenLogs = await Promise.all(
Expand Down Expand Up @@ -118,13 +137,23 @@ export abstract class RigoblockPoolTokenFetcher extends AppTokenTemplatePosition
);
}

async getUnderlyingTokenDefinitions() {
const results = [...new Set(await this.getTokenList())];

// we make sure no token duplicates are in the list
return results
async getUnderlyingTokenDefinitions({
multicall,
definition
}: GetDisplayPropsParams<SmartPool, DefaultDataProps, RigoblockSmartPoolDefinition>) {
// this block returns only held tokens. However, it would require less RPC calls to just multicall
// all tokens and display in UI only tokens with positive balances.
const tokens = definition.tokenList
if(!tokens || tokens?.length === 0) return[]
let heldTokens: WhitelistedTokenDefinition[] = []
for (let i = 0; i !== tokens.length; i++) {
const uTokenContract = this.contractFactory.erc20({ address: tokens[i].address, network: this.network });
const poolTokenBalance = await multicall.wrap(uTokenContract).balanceOf(definition.address);
if (poolTokenBalance && poolTokenBalance.gt(BigNumber.from(0))) { heldTokens[i] = tokens[i] };
}

return compact(heldTokens)
.map(x => ({ address: x.address.toLowerCase(), network: this.network }))
.filter(v => !this.blockedTokenAddresses.includes(v.address));
}

async getPricePerShare({
Expand Down
2 changes: 0 additions & 2 deletions src/apps/rigoblock/ethereum/rigoblock.pool.token-fetcher.ts
Expand Up @@ -5,6 +5,4 @@ import { RigoblockPoolTokenFetcher } from '../common/rigoblock.pool.token-fetche
@PositionTemplate()
export class EthereumRigoblockPoolTokenFetcher extends RigoblockPoolTokenFetcher {
groupLabel = 'Smart Pools';

blockedTokenAddresses = ['0x0000000000000000000000000000000000000001'];
}
7 changes: 0 additions & 7 deletions src/apps/rigoblock/optimism/rigoblock.pool.token-fetcher.ts
Expand Up @@ -5,11 +5,4 @@ import { RigoblockPoolTokenFetcher } from '../common/rigoblock.pool.token-fetche
@PositionTemplate()
export class OptimismRigoblockPoolTokenFetcher extends RigoblockPoolTokenFetcher {
groupLabel = 'Smart Pools';

blockedTokenAddresses = [
'0xecf46257ed31c329f204eb43e254c609dee143b3', // GRG
'0x7b0bcc23851bbf7601efc9e9fe532bf5284f65d3', // EST
'0xe4f27b04cc7729901876b44f4eaa5102ec150265', // XCHF
'0xd1917629b3e6a72e6772aab5dbe58eb7fa3c2f33', // ZRX
];
}
10 changes: 0 additions & 10 deletions src/apps/rigoblock/polygon/rigoblock.pool.token-fetcher.ts
Expand Up @@ -5,14 +5,4 @@ import { RigoblockPoolTokenFetcher } from '../common/rigoblock.pool.token-fetche
@PositionTemplate()
export class PolygonRigoblockPoolTokenFetcher extends RigoblockPoolTokenFetcher {
groupLabel = 'Smart Pools';

blockedTokenAddresses = [
'0xbc0bea8e634ec838a2a45f8a43e7e16cd2a8ba99', // GRG
'0x3ba4c387f786bfee076a58914f5bd38d668b42c3', // BNB
'0x0000000000000000000000000000000000001010', // MATIC
'0x06d02e9d62a13fc76bb229373fb3bbbd1101d2fc', // LEO
'0x210e69a578cfcdbb7a829c7c6379ac29e64a357a', // METADEX
'0x09a84f900205b1ac5f3214d3220c7317fd5f5b77', // FREC
'0x8cf745561791a43d70f75e85fbc6e3752395c5f0', // FUN
];
}

0 comments on commit 8a2089b

Please sign in to comment.