Skip to content

Commit

Permalink
feat: configurable chain configuration
Browse files Browse the repository at this point in the history
  • Loading branch information
ColonelJ committed May 13, 2022
1 parent f658021 commit 80b93fa
Show file tree
Hide file tree
Showing 41 changed files with 474 additions and 349 deletions.
4 changes: 2 additions & 2 deletions dex-template/__DexName__-e2e.test.ts.template
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@ import { testE2E } from '../../../tests/utils-e2e';
import { Tokens, Holders, NativeTokenSymbols } from '../../../tests/constants-e2e';
import {
Network,
ProviderURL,
ContractMethod,
SwapSide,
} from '../../constants';
import { StaticJsonRpcProvider } from '@ethersproject/providers';
import { generateConfig } from '../../config';

/*
README
Expand Down Expand Up @@ -57,7 +57,7 @@ describe('__DexName__ E2E', () => {
const network = Network.MAINNET;
const tokens = Tokens[network];
const holders = Holders[network];
const provider = new StaticJsonRpcProvider(ProviderURL[network], network);
const provider = new StaticJsonRpcProvider(generateConfig(network).httpProvider, network);

// TODO: Modify the tokenASymbol, tokenBSymbol, tokenAAmount;
const tokenASymbol: string = 'tokenASymbol';
Expand Down
4 changes: 2 additions & 2 deletions dex-template/__DexName__.ts.template
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import {
Network,
} from '../../constants';
import { StatefulEventSubscriber } from '../../stateful-event-subscriber';
import { wrapETH, getDexKeysWithNetwork } from '../../utils';
import { getDexKeysWithNetwork } from '../../utils';
import { IDex } from '../../dex/idex';
import { IDexHelper } from '../../dex-helper/idex-helper';
import {
Expand Down Expand Up @@ -119,7 +119,7 @@ export class __DexName__
protected adapters = Adapters[network],
// TODO: add any additional optional params to support other fork DEXes
) {
super(dexHelper.augustusAddress, dexHelper.provider);
super(dexHelper.config.data.augustusAddress, dexHelper.provider);
this.logger = dexHelper.getLogger(dexKey);
this.eventPools = new __DexName__EventPool(
dexKey,
Expand Down
2 changes: 1 addition & 1 deletion scripts/dex-integration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ async function createFolder(newDexPath: string) {
try {
await mkdirAsync(newDexPath);
} catch (e) {
if (e.code === 'EEXIST') {
if (e && (e as any).code === 'EEXIST') {
throw new Error(
`Dex folder ${
newDexPath.split('/').slice(-1)[0]
Expand Down
183 changes: 183 additions & 0 deletions src/config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
import { Config, Address, Token } from './types';
import { Network } from './constants';
import { isETHAddress } from './utils';

// Hardcoded and envionment values from which actual config is derived
type BaseConfig = {
network: number;
networkName: string;
isTestnet: boolean;
mainnetNetwork?: number;
nativeTokenName?: string;
nativeTokenSymbol: string;
wrappedNativeTokenName?: string;
wrappedNativeTokenSymbol?: string;
wrappedNativeTokenAddress: Address;
hasEIP1559: boolean;
augustusAddress: Address;
tokenTransferProxyAddress: Address;
multicallV2Address: Address;
httpProvider?: string;
adapterAddresses: { [name: string]: Address };
uniswapV2ExchangeRouterAddress: Address;
};

const baseConfigs: { [network: number]: BaseConfig } = {
[Network.MAINNET]: {
network: Network.MAINNET,
networkName: 'Ethereum Mainnet',
isTestnet: false,
nativeTokenName: 'Ether',
nativeTokenSymbol: 'ETH',
wrappedNativeTokenAddress: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
hasEIP1559: true,
augustusAddress: '0xDEF171Fe48CF0115B1d80b88dc8eAB59176FEe57',
tokenTransferProxyAddress: '0x216b4b4ba9f3e719726886d34a177484278bfcae',
multicallV2Address: '0x5BA1e12693Dc8F9c48aAD8770482f4739bEeD696',
httpProvider: process.env.HTTP_PROVIDER,
adapterAddresses: {
Adapter01: '0x3a0430bf7cd2633af111ce3204db4b0990857a6f',
Adapter02: '0xFC2Ba6E830a04C25e207B8214b26d8C713F6881F',
Adapter03: '0x9Cf0b60C2133f67443fdf8a1bB952E2e6783d5DF',
BuyAdapter: '0x8D562A7D63248Ebfdd19B26665161cf867e5c10A',
},
uniswapV2ExchangeRouterAddress:
'0xF9234CB08edb93c0d4a4d4c70cC3FfD070e78e07',
},
[Network.ROPSTEN]: {
network: Network.ROPSTEN,
networkName: 'Ethereum Ropsten Testnet',
isTestnet: true,
mainnetNetwork: Network.MAINNET,
nativeTokenName: 'Ether',
nativeTokenSymbol: 'ETH',
wrappedNativeTokenAddress: '0xc778417E063141139Fce010982780140Aa0cD5Ab',
hasEIP1559: true,
augustusAddress: '0xDEF171Fe48CF0115B1d80b88dc8eAB59176FEe57',
tokenTransferProxyAddress: '0x216b4b4ba9f3e719726886d34a177484278bfcae',
multicallV2Address: '0x5BA1e12693Dc8F9c48aAD8770482f4739bEeD696',
httpProvider: process.env.HTTP_PROVIDER_3,
adapterAddresses: {
RopstenAdapter01: '0x74fF86C61CF66334dCfc999814DE4695B4BaE57b',
RopstenBuyAdapter: '0xDDbaC07C9ef96D6E792c25Ff934E7e111241BFf1',
},
uniswapV2ExchangeRouterAddress:
'0x53e693c6C7FFC4446c53B205Cf513105Bf140D7b',
},
[Network.BSC]: {
network: Network.BSC,
networkName: 'Binance Smart Chain Mainnet',
isTestnet: false,
nativeTokenSymbol: 'BNB',
wrappedNativeTokenAddress: '0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c',
hasEIP1559: false,
augustusAddress: '0xDEF171Fe48CF0115B1d80b88dc8eAB59176FEe57',
tokenTransferProxyAddress: '0x216b4b4ba9f3e719726886d34a177484278bfcae',
multicallV2Address: '0xC50F4c1E81c873B2204D7eFf7069Ffec6Fbe136D',
httpProvider: process.env.HTTP_PROVIDER_56,
adapterAddresses: {
BscAdapter01: '0xcEC935682c0b510fb91c0A12275Bb7e14EEBE87c',
BscBuyAdapter: '0xdA0DAFbbC95d96bAb164c847112e15c0299541f6',
},
uniswapV2ExchangeRouterAddress:
'0x53e693c6C7FFC4446c53B205Cf513105Bf140D7b',
},
[Network.POLYGON]: {
network: Network.POLYGON,
networkName: 'Polygon Mainnet',
isTestnet: false,
nativeTokenName: 'Matic',
nativeTokenSymbol: 'MATIC',
wrappedNativeTokenAddress: '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270',
hasEIP1559: true,
augustusAddress: '0xDEF171Fe48CF0115B1d80b88dc8eAB59176FEe57',
tokenTransferProxyAddress: '0x216b4b4ba9f3e719726886d34a177484278bfcae',
multicallV2Address: '0x275617327c958bD06b5D6b871E7f491D76113dd8',
httpProvider: process.env.HTTP_PROVIDER_137,
adapterAddresses: {
PolygonAdapter01: '0xD458FA906121d9081970Ed3937df50C8Ba88E9c0',
PolygonAdapter02: '0xe56823aC543c81f747eD95F3f095b5A19224bd3a',
PolygonBuyAdapter: '0x34E0E6448A648Fc0b340679C4F16e5ACC4Bf4c95',
},
uniswapV2ExchangeRouterAddress:
'0xf3938337F7294fEf84e9B2c6D548A93F956Cc281',
},
[Network.AVALANCHE]: {
network: Network.AVALANCHE,
networkName: 'Avalanche Mainnet C-Chain',
isTestnet: false,
nativeTokenName: 'Avax',
nativeTokenSymbol: 'AVAX',
wrappedNativeTokenAddress: '0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7',
hasEIP1559: true,
augustusAddress: '0xDEF171Fe48CF0115B1d80b88dc8eAB59176FEe57',
tokenTransferProxyAddress: '0x216b4b4ba9f3e719726886d34a177484278bfcae',
multicallV2Address: '0xd7Fc8aD069f95B6e2835f4DEff03eF84241cF0E1',
httpProvider: process.env.HTTP_PROVIDER_43114,
adapterAddresses: {
AvalancheAdapter01: '0xaaD116D3b51893bD00bFBAf337824A15796eD97a',
AvalancheBuyAdapter: '0x05d0c2b58fF6c05bcc3e5F2D797bEB77e0A4CC7b',
},
uniswapV2ExchangeRouterAddress:
'0x53e693c6C7FFC4446c53B205Cf513105Bf140D7b',
},
[Network.FANTOM]: {
network: Network.FANTOM,
networkName: 'Fantom Opera Mainnet',
isTestnet: false,
nativeTokenName: 'Fantom',
nativeTokenSymbol: 'FTM',
wrappedNativeTokenAddress: '0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83',
hasEIP1559: false,
augustusAddress: '0xDEF171Fe48CF0115B1d80b88dc8eAB59176FEe57',
tokenTransferProxyAddress: '0x216b4b4ba9f3e719726886d34a177484278bfcae',
multicallV2Address: '0xdC6E2b14260F972ad4e5a31c68294Fba7E720701',
httpProvider: process.env.HTTP_PROVIDER_250,
adapterAddresses: {
FantomAdapter01: '0x7EE3C983cA38c370F296FE14a31bEaC5b1c9a9FE',
FantomBuyAdapter: '0x3032B8c9CF91C791A8EcC2c7831A11279f419386',
},
uniswapV2ExchangeRouterAddress:
'0xAB86e2bC9ec5485a9b60E684BA6d49bf4686ACC2',
},
};

// Should not be used, except by configuration service or internal test code
export function generateConfig(network: number): Config {
const baseConfig = baseConfigs[network];
const nativeTokenName =
baseConfig.nativeTokenName || baseConfig.nativeTokenSymbol;
if (!baseConfig.httpProvider) {
throw new Error(`Missing HTTP Provider for network ${network}`);
}
return {
network: baseConfig.network,
networkName: baseConfig.networkName,
isTestnet: baseConfig.isTestnet,
mainnetNetwork: baseConfig.mainnetNetwork,
nativeTokenName,
nativeTokenSymbol: baseConfig.nativeTokenSymbol,
wrappedNativeTokenName:
baseConfig.wrappedNativeTokenName || `Wrapped ${nativeTokenName}`,
wrappedNativeTokenSymbol:
baseConfig.wrappedNativeTokenSymbol || `W${baseConfig.nativeTokenSymbol}`,
wrappedNativeTokenAddress: baseConfig.wrappedNativeTokenAddress,
hasEIP1559: baseConfig.hasEIP1559,
augustusAddress: baseConfig.augustusAddress,
tokenTransferProxyAddress: baseConfig.tokenTransferProxyAddress,
multicallV2Address: baseConfig.multicallV2Address,
httpProvider: baseConfig.httpProvider,
adapterAddresses: { ...baseConfig.adapterAddresses },
uniswapV2ExchangeRouterAddress: baseConfig.uniswapV2ExchangeRouterAddress,
};
}

export class ConfigHelper {
constructor(public data: Config) {}

wrapETH(token: Token): Token {
return isETHAddress(token.address)
? { address: this.data.wrappedNativeTokenAddress, decimals: 18 }
: token;
}
}
36 changes: 0 additions & 36 deletions src/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,39 +30,3 @@ export enum Network {
ZK_SYNC_MAINNET = 271,
ZK_SYNC_ROPSTEN = 273,
}

export const MULTI_V2: { [network: number]: Address } = {
[Network.MAINNET]: '0x5BA1e12693Dc8F9c48aAD8770482f4739bEeD696',
[Network.ROPSTEN]: '0x5BA1e12693Dc8F9c48aAD8770482f4739bEeD696',
[Network.BSC]: '0xC50F4c1E81c873B2204D7eFf7069Ffec6Fbe136D',
[Network.POLYGON]: '0x275617327c958bD06b5D6b871E7f491D76113dd8',
[Network.AVALANCHE]: '0xd7Fc8aD069f95B6e2835f4DEff03eF84241cF0E1',
[Network.FANTOM]: '0xdC6E2b14260F972ad4e5a31c68294Fba7E720701',
};

export const ProviderURL: { [network: number]: string } = {
[Network.MAINNET]: process.env.HTTP_PROVIDER || '',
[Network.ROPSTEN]: process.env.HTTP_PROVIDER_3 || '',
[Network.BSC]: process.env.HTTP_PROVIDER_56 || '',
[Network.POLYGON]: process.env.HTTP_PROVIDER_137 || '',
[Network.FANTOM]: process.env.HTTP_PROVIDER_250 || '',
[Network.AVALANCHE]: process.env.HTTP_PROVIDER_43114 || '',
};

export const TokenTransferProxyAddress: { [nid: number]: Address } = {
[Network.MAINNET]: '0x216b4b4ba9f3e719726886d34a177484278bfcae',
[Network.ROPSTEN]: '0x216b4b4ba9f3e719726886d34a177484278bfcae',
[Network.BSC]: '0x216b4b4ba9f3e719726886d34a177484278bfcae',
[Network.POLYGON]: '0x216b4b4ba9f3e719726886d34a177484278bfcae',
[Network.AVALANCHE]: '0x216b4b4ba9f3e719726886d34a177484278bfcae',
[Network.FANTOM]: '0x216b4b4ba9f3e719726886d34a177484278bfcae',
};

export const AugustusAddress: { [nid: number]: Address } = {
[Network.MAINNET]: '0xDEF171Fe48CF0115B1d80b88dc8eAB59176FEe57',
[Network.ROPSTEN]: '0xDEF171Fe48CF0115B1d80b88dc8eAB59176FEe57',
[Network.BSC]: '0xDEF171Fe48CF0115B1d80b88dc8eAB59176FEe57',
[Network.POLYGON]: '0xDEF171Fe48CF0115B1d80b88dc8eAB59176FEe57',
[Network.AVALANCHE]: '0xDEF171Fe48CF0115B1d80b88dc8eAB59176FEe57',
[Network.FANTOM]: '0xDEF171Fe48CF0115B1d80b88dc8eAB59176FEe57',
};
15 changes: 9 additions & 6 deletions src/dex-helper/dummy-dex-helper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@ import {
} from './index';
import axios from 'axios';
import { Address, LoggerConstructor, Token } from '../types';
import { MULTI_V2, ProviderURL, AugustusAddress } from '../constants';
// import { Contract } from '@ethersproject/contracts';
import { StaticJsonRpcProvider, Provider } from '@ethersproject/providers';
import multiABIV2 from '../abi/multi-v2.json';
import log4js from 'log4js';
import Web3 from 'web3';
import { Contract } from 'web3-eth-contract';
import { generateConfig, ConfigHelper } from '../config';

// This is a dummy cache for testing purposes
class DummyCache implements ICache {
Expand Down Expand Up @@ -89,9 +89,9 @@ class DummyBlockManager implements IBlockManager {
}

export class DummyDexHelper implements IDexHelper {
config: ConfigHelper;
cache: ICache;
httpRequest: IRequestWrapper;
augustusAddress: Address;
provider: Provider;
multiContract: Contract;
blockManager: IBlockManager;
Expand All @@ -100,14 +100,17 @@ export class DummyDexHelper implements IDexHelper {
getTokenUSDPrice: (token: Token, amount: bigint) => Promise<number>;

constructor(network: number) {
this.config = new ConfigHelper(generateConfig(network));
this.cache = new DummyCache();
this.httpRequest = new DummyRequestWrapper();
this.augustusAddress = AugustusAddress[network];
this.provider = new StaticJsonRpcProvider(ProviderURL[network], network);
this.web3Provider = new Web3(ProviderURL[network]);
this.provider = new StaticJsonRpcProvider(
this.config.data.httpProvider,
network,
);
this.web3Provider = new Web3(this.config.data.httpProvider);
this.multiContract = new this.web3Provider.eth.Contract(
multiABIV2 as any,
MULTI_V2[network],
this.config.data.multicallV2Address,
);
this.blockManager = new DummyBlockManager();
this.getLogger = name => log4js.getLogger(name);
Expand Down
3 changes: 2 additions & 1 deletion src/dex-helper/idex-helper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,12 @@ import { IBlockManager } from './iblock-manager';
import Web3 from 'web3';
import { Contract } from 'web3-eth-contract';
import { Token } from '../types';
import { ConfigHelper } from '../config';

export interface IDexHelper {
config: ConfigHelper;
cache: ICache;
httpRequest: IRequestWrapper;
augustusAddress: Address;
multiContract: Contract;
provider: Provider;
web3Provider: Web3;
Expand Down
13 changes: 6 additions & 7 deletions src/dex/aave-v1/aave-v1-e2e.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,10 @@ dotenv.config();

import { testE2E } from '../../../tests/utils-e2e';
import { Tokens, Holders } from '../../../tests/constants-e2e';
import {
Network,
ProviderURL,
ContractMethod,
SwapSide,
} from '../../constants';
import { Network, ContractMethod, SwapSide } from '../../constants';
import { StaticJsonRpcProvider } from '@ethersproject/providers';
import { aaveV1GetToken } from './tokens';
import { generateConfig } from '../../config';

jest.setTimeout(1000 * 60 * 3);

Expand All @@ -19,7 +15,10 @@ describe('AaveV1 E2E', () => {
const dexKey = 'AaveV1';
const network = Network.MAINNET;
const holders = Holders[network];
const provider = new StaticJsonRpcProvider(ProviderURL[network], network);
const provider = new StaticJsonRpcProvider(
generateConfig(network).httpProvider,
network,
);
// TODO: Modify the USDTSymbol, aUSDTSymbol, aETHAmount;

const aETHSymbol: string = 'aETH';
Expand Down
2 changes: 1 addition & 1 deletion src/dex/aave-v1/aave-v1.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ export class AaveV1
protected dexKey: string,
protected dexHelper: IDexHelper, // TODO: add any additional optional params to support other fork DEXes
) {
super(dexHelper.augustusAddress, dexHelper.provider);
super(dexHelper.config.data.augustusAddress, dexHelper.provider);
this.logger = dexHelper.getLogger(dexKey);
this.aavePool = new Interface(AAVE_LENDING_POOL_ABI_V1 as JsonFragment[]);
this.aContract = new Interface(ERC20 as JsonFragment[]);
Expand Down
Loading

0 comments on commit 80b93fa

Please sign in to comment.