Skip to content

Commit

Permalink
fix: adequate fix to pufETH case
Browse files Browse the repository at this point in the history
  • Loading branch information
MishaShWoof committed Oct 24, 2024
1 parent d2380d3 commit 5d9d2b0
Show file tree
Hide file tree
Showing 8 changed files with 143 additions and 26 deletions.
8 changes: 8 additions & 0 deletions deployments/mainnet/weth/relations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,5 +30,13 @@ export default {
}
}
},
'ERC1967Proxy': {
artifact: 'contracts/ERC20.sol:ERC20',
delegates: {
field: {
slot: '0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc'
}
}
},
};

14 changes: 2 additions & 12 deletions deployments/relations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,7 @@ const relationConfigMap: RelationConfigMap = {
})
);
},
alias: async (token) => {
if(token.address == '0xD9A442856C234a39a81a089C06451EBAa4306a72'){
return 'pufETH';
}
return token.symbol();
},
alias: async (token) => token.symbol(),
},
assetPriceFeeds: {
field: async (comet) => {
Expand All @@ -48,12 +43,7 @@ const relationConfigMap: RelationConfigMap = {
})
);
},
alias: async (_, { assets }, i) =>{
if(assets[i].address == '0xD9A442856C234a39a81a089C06451EBAa4306a72'){
return 'pufETH:priceFeed';
}
return(`${await assets[i].symbol()}:priceFeed`);
},
alias: async (_, { assets }, i) => `${await assets[i].symbol()}:priceFeed`,
},
cometAdmin: {
field: {
Expand Down
17 changes: 16 additions & 1 deletion plugins/deployment_manager/RelationConfig.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Contract, utils } from 'ethers';
import { DeploymentManagerConfig } from './type-extensions';
import { Address, Alias } from './Types';
import { getSymbol } from '../../scenario/utils/symbolGetter';

export type Ctx = { [aliasTemplate: string]: Contract[] };

Expand Down Expand Up @@ -104,6 +105,7 @@ export async function readAlias(
aliasRender: AliasRender,
context: Ctx,
path: Contract[],
network: string,
): Promise<Alias> {
const { template: aliasTemplate, i } = aliasRender;
if (typeof aliasTemplate === 'string') {
Expand All @@ -113,7 +115,20 @@ export async function readAlias(
return aliasTemplate;
}
} else if (typeof aliasTemplate === 'function') {
return await aliasTemplate(contract, context, i, path);
try {
return await aliasTemplate(contract, context, i, path);
} catch (e) {
if(e == 'Error TypeError: token.symbol is not a function'){
throw new Error(`Error calling alias function: ${e}`);
}
if(`${aliasTemplate}` == 'async (token) => token.symbol()'){
return await getSymbol(contract.address, network);
}
else if(`${aliasTemplate}` == 'async (_, { assets }, i) => `${await assets[i].symbol()}:priceFeed`'){
return await getSymbol(context.assets[i].address, network) + ':priceFeed';
}
throw new Error(`Invalid` + aliasTemplate);
}
} else {
throw new Error(`Invalid alias template: ${JSON.stringify(aliasTemplate)}`);
}
Expand Down
16 changes: 8 additions & 8 deletions plugins/deployment_manager/Spider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -170,12 +170,12 @@ async function crawl(
if (addressConfig.artifact) {
//trace(` ... has artifact specified (${addressConfig.artifact})`);
const build = await localBuild(null, hre, addressConfig.artifact, network, address);
const alias = await readAlias(build.contract, aliasRender, context, path);
const alias = await readAlias(build.contract, aliasRender, context, path, network);
return maybeProcess(alias, build, addressConfig);
} else {
//trace(' ... no artifact specified');
const build = await remoteBuild(cache, hre, network, address);
const alias = await readAlias(build.contract, aliasRender, context, path);
const alias = await readAlias(build.contract, aliasRender, context, path, network);
return maybeProcess(alias, build, addressConfig);
}
}
Expand All @@ -190,12 +190,12 @@ async function crawl(
if (aliasTemplateConfig.artifact) {
//trace(` ... has artifact specified (${aliasTemplateConfig.artifact})`);
const build = await localBuild(null, hre, aliasTemplateConfig.artifact, network, address);
const alias = await readAlias(build.contract, aliasRender, context, path);
const alias = await readAlias(build.contract, aliasRender, context, path, network);
return maybeProcess(alias, build, aliasTemplateConfig);
} else {
//trace(' ... no artifact specified');
const build = await remoteBuild(cache, hre, network, address);
const alias = await readAlias(build.contract, aliasRender, context, path);
const alias = await readAlias(build.contract, aliasRender, context, path, network);
return maybeProcess(alias, build, aliasTemplateConfig);
}
} else {
Expand All @@ -209,16 +209,16 @@ async function crawl(
if (contractConfig.artifact) {
//trace(` ... has artifact specified (${contractConfig.artifact})`);
const build_ = await localBuild(null, hre, contractConfig.artifact, network, address);
const alias = await readAlias(build_.contract, aliasRender, context, path);
const alias = await readAlias(build_.contract, aliasRender, context, path, network);
return maybeProcess(alias, build_, contractConfig);
} else {
//trace(' ... no artifact specified');
const alias = await readAlias(build.contract, aliasRender, context, path);
const alias = await readAlias(build.contract, aliasRender, context, path, network);
return maybeProcess(alias, build, contractConfig);
}
} else {
//trace(` ... no contract config (${build.buildFile.contract})`);
const alias = await readAlias(build.contract, aliasRender, context, path);
const alias = await readAlias(build.contract, aliasRender, context, path, network);
const aliasConfig = relations[alias];
if (aliasConfig) {
//trace(` ... has alias config (${alias})`);
Expand All @@ -230,7 +230,7 @@ async function crawl(
}
} else {
//trace(' ... is not a contract');
const alias = await readAlias(undefined, aliasRender, context, path);
const alias = await readAlias(undefined, aliasRender, context, path, network);
return maybeStore(alias, address, aliases), alias;
}
}
Expand Down
3 changes: 2 additions & 1 deletion scenario/LiquidationBotScenario.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { ethers, event, exp, wait } from '../test/helpers';
import CometActor from './context/CometActor';
import { CometInterface, OnChainLiquidator } from '../build/types';
import { getPoolConfig, flashLoanPools } from '../scripts/liquidation_bot/liquidateUnderwaterBorrowers';
import { getConfigForScenario } from './utils/scenarioHelper';

interface LiquidationAddresses {
balancerVault: string;
Expand Down Expand Up @@ -829,7 +830,7 @@ scenario(
const [initialNumAbsorbs, initialNumAbsorbed] = await comet.liquidatorPoints(betty.address);

const borrowCapacity = await borrowCapacityForAsset(comet, albert, 0);
const borrowAmount = (borrowCapacity.mul(75n)).div(100n);
const borrowAmount = (borrowCapacity.mul(BigInt(getConfigForScenario(_context).liquidationNumerator))).div(100n);

await albert.withdrawAsset({
asset: baseToken,
Expand Down
12 changes: 9 additions & 3 deletions scenario/context/CometContext.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import { AddressLike, getAddressFromNumber, resolveAddress } from './Address';
import { fastGovernanceExecute, max, mineBlocks, setNextBaseFeeToZero, setNextBlockTimestamp } from '../utils';
import { DynamicConstraint, StaticConstraint } from '../../plugins/scenario/Scenario';
import { Requirements } from '../constraints/Requirements';
import { getSymbol } from '../utils/symbolGetter';

export type ActorMap = { [name: string]: CometActor };
export type AssetMap = { [name: string]: CometAsset };
Expand Down Expand Up @@ -375,10 +376,15 @@ async function getAssets(context: CometContext): Promise<{ [symbol: string]: Com

return Object.fromEntries(await Promise.all(assetAddresses.map(async (address) => {
const erc20 = ERC20__factory.connect(address, signer);
if(address == '0xD9A442856C234a39a81a089C06451EBAa4306a72') {
return ['pufETH', new CometAsset(erc20)];
try {
return [await erc20.symbol(),
new CometAsset(erc20)
];
} catch (e) {
return [await getSymbol(address, context.world.base.network),
new CometAsset(erc20)
];
}
return [await erc20.symbol(), new CometAsset(erc20)];
})));
}

Expand Down
7 changes: 6 additions & 1 deletion scenario/utils/scenarioHelper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,12 @@ const config = {
liquidationBase1: 1000,
liquidationAsset: 200,
liquidationDenominator: 90,
liquidationNumerator: 90,
rewardsAsset: 10000,
rewardsBase: 1000,
transferBase: 1000,
transferAsset: 5000,
interestSeconds: 110
interestSeconds: 110,
};

export function getConfigForScenario(ctx: CometContext) {
Expand All @@ -41,6 +42,10 @@ export function getConfigForScenario(ctx: CometContext) {
config.interestSeconds = 70;
}

if (ctx.world.base.network === 'mainnet' && ctx.world.base.deployment === 'weth') {
config.liquidationNumerator = 60;
}

if (ctx.world.base.network === 'base' && ctx.world.base.deployment === 'aero') {
config.interestSeconds = 110;
}
Expand Down
92 changes: 92 additions & 0 deletions scenario/utils/symbolGetter.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
import 'dotenv/config';
const {
INFURA_KEY,
QUICKNODE_KEY
} = process.env;

const configs = {
mainnet: {
url: 'https://mainnet.infura.io/v3/' + INFURA_KEY,
},
sepolia: {
url: 'https://sepolia.infura.io/v3/' + INFURA_KEY,
},
polygon: {
url: 'https://polygon-mainnet.infura.io/v3/' + INFURA_KEY,
},
optimism: {
url: 'https://optimism-mainnet.infura.io/v3/' + INFURA_KEY,
},
base: {
url: 'https://fluent-prettiest-scion.base-mainnet.quiknode.pro/' + QUICKNODE_KEY,
},
arbitrum: {
url: 'https://arbitrum-mainnet.infura.io/v3/' + INFURA_KEY,
},
avalanche: {
url: 'https://api.avax.network/ext/bc/C/rpc',
},
fuji: {
url: 'https://api.avax-test.network/ext/bc/C/rpc',
},
mumbai: {
url: 'https://polygon-mumbai.infura.io/v3/' + INFURA_KEY,
},
arbitrumGoerli: {
url: 'https://arbitrum-goerli.infura.io/v3/' + INFURA_KEY,
},
baseGoerli: {
url: 'https://goerli.base.org/',
},
lineaGoerli: {
url: 'https://linea-goerli.infura.io/v3/' + INFURA_KEY,
},
scrollGoerli: {
url: 'https://alpha-rpc.scroll.io/l2',
},
scroll: {
url: 'https://rpc.scroll.io',
}
};

export async function getSymbol(
address: string,
network: string
) : Promise<string> {
const link = configs[network].url;
try {
const response = await fetch(link, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
jsonrpc: '2.0',
method: 'eth_call',
params: [
{
to: address,
data: '0x95d89b41'
},
'latest'
],
id: 1
})
});

const data = await response.json();
if(data.result.length <= 2) {
throw new Error('Error fetching symbol from address: ' + address);
}
const hexString = data.result.slice(2);
const relevantHex = hexString.slice(64);
const lengthHex = relevantHex.slice(0, 64);
const length = parseInt(lengthHex, 16);
const stringHex = relevantHex.slice(64, 64 + length * 2);
const bytes = new Uint8Array(stringHex.match(/.{1,2}/g).map((byte: string) => parseInt(byte, 16)));
const symbol = new TextDecoder().decode(bytes);
return(symbol);
} catch (error) {
throw new Error('Error fetching symbol: ' + error);
}
}

0 comments on commit 5d9d2b0

Please sign in to comment.