configuration.steps.ts
1 import { ChainId } from '@aave/contract-helpers'; 2 import { JsonRpcProvider } from '@ethersproject/providers'; 3 import { Wallet } from '@ethersproject/wallet'; 4 5 import { CustomizedBridge } from '../tools/bridge'; 6 import { DEFAULT_TEST_ACCOUNT, TenderlyVnet } from '../tools/tenderly'; 7 8 const URL = Cypress.env('URL'); 9 const PERSIST_FORK_AFTER_RUN = Cypress.env('PERSIST_FORK_AFTER_RUN') || false; 10 11 export const configEnvWithTenderly = ({ 12 chainId, 13 market, 14 tokens, 15 unpause, 16 wallet, 17 enableTestnet = false, 18 urlSuffix = '', 19 }: { 20 chainId: number; 21 market: string; 22 tokens?: { tokenAddress: string; donorAddress?: string; tokenCount?: string }[]; 23 unpause?: boolean; 24 wallet?: { address: string; privateKey: string }; 25 enableTestnet?: boolean; 26 urlSuffix?: string; 27 }) => { 28 const tenderly = new TenderlyVnet({ vnetNetworkID: chainId }); 29 const walletAddress: string = wallet != null ? wallet.address : DEFAULT_TEST_ACCOUNT.address; 30 const privateKey: string = wallet != null ? wallet.privateKey : DEFAULT_TEST_ACCOUNT.privateKey; 31 let provider: JsonRpcProvider; 32 let signer: Wallet; 33 let auth: Cypress.AUTWindow; 34 before(async () => { 35 await tenderly.init(); 36 await new Promise((resolve) => setTimeout(resolve, 3000)); 37 await tenderly.add_balance_rpc(walletAddress); 38 if (unpause) { 39 await tenderly.unpauseMarket(); 40 } 41 42 if (tokens) { 43 await Promise.all( 44 tokens.map((token) => 45 tenderly.getERC20Token( 46 walletAddress, 47 token.tokenAddress, 48 token.donorAddress, 49 token.tokenCount 50 ) 51 ) 52 ); 53 } 54 }); 55 before('Open main page', () => { 56 let url = URL as string; 57 if (urlSuffix) { 58 url = `${url}/${urlSuffix}`; 59 } 60 61 const rpc = tenderly.get_rpc_url(); 62 provider = new JsonRpcProvider(rpc, 3030); 63 signer = new Wallet(privateKey, provider); 64 cy.visit(url, { 65 onBeforeLoad(win) { 66 // eslint-disable-next-line 67 (win as any).ethereum = new CustomizedBridge(signer, provider); 68 auth = win; 69 win.localStorage.setItem('forkEnabled', 'true'); 70 // forks are always expected to run on chainId 3030 71 win.localStorage.setItem('forkNetworkId', '3030'); 72 win.localStorage.setItem('forkBaseChainId', chainId.toString()); 73 win.localStorage.setItem('forkRPCUrl', rpc); 74 win.localStorage.setItem('walletProvider', 'injected'); 75 win.localStorage.setItem('selectedAccount', walletAddress.toLowerCase()); 76 win.localStorage.setItem('selectedMarket', market); 77 win.localStorage.setItem('testnetsEnabled', enableTestnet.toString()); 78 // win.localStorage.setItem('userAcceptedAnalytics', 'true'); 79 }, 80 }); 81 }); 82 before('Save env variables', () => { 83 window.tenderly = tenderly; 84 window.address = walletAddress; 85 window.chainId = chainId.toString(); 86 window.rpc = tenderly.get_rpc_url(); 87 window.market = market; 88 window.testnetsEnabled = enableTestnet.toString(); 89 window.url = URL; 90 window.privateKey = privateKey; 91 window.provider = provider; 92 window.signer = signer; 93 window.auth = auth; 94 }); 95 after(async () => { 96 if (!PERSIST_FORK_AFTER_RUN) { 97 cy.log('deleting vnet'); 98 await tenderly.deleteVnet(); 99 } 100 }); 101 }; 102 103 const createConfigWithTenderlyFork = 104 (chainId: number, defaultMarket: string) => 105 ({ 106 market = defaultMarket, 107 tokens, 108 v3, 109 wallet, 110 urlSuffix, 111 }: { 112 market?: string; 113 tokens?: { tokenAddress: string }[]; 114 v3?: boolean; 115 wallet?: { address: string; privateKey: string }; 116 urlSuffix?: string; 117 }) => 118 configEnvWithTenderly({ chainId, market, tokens, unpause: v3, wallet, urlSuffix }); 119 120 export const configEnvWithTenderlyMainnetFork = createConfigWithTenderlyFork( 121 ChainId.mainnet, 122 'fork_proto_mainnet' 123 ); 124 export const configEnvWithTenderlyPolygonFork = createConfigWithTenderlyFork( 125 ChainId.polygon, 126 'fork_proto_polygon' 127 ); 128 export const configEnvWithTenderlyAvalancheFork = createConfigWithTenderlyFork( 129 ChainId.avalanche, 130 'fork_proto_avalanche' 131 ); 132 export const configEnvWithTenderlyAvalancheFujiFork = createConfigWithTenderlyFork( 133 ChainId.fuji, 134 'proto_fuji_v3' 135 ); 136 export const configEnvWithTenderlyOptimismFork = createConfigWithTenderlyFork( 137 ChainId.optimism, 138 'fork_proto_optimism_v3' 139 ); 140 141 export const configEnvWithTenderlyBaseFork = createConfigWithTenderlyFork( 142 ChainId.base, 143 'fork_proto_base_v3' 144 ); 145 export const configEnvWithTenderlyArbitrumFork = createConfigWithTenderlyFork( 146 ChainId.arbitrum_one, 147 'fork_proto_arbitrum_v3' 148 ); 149 export const configEnvWithTenderlyBnbFork = createConfigWithTenderlyFork( 150 ChainId.bnb, 151 'fork_proto_bnb_v3' 152 ); 153 export const configEnvWithTenderlyAEthereumV3Fork = createConfigWithTenderlyFork( 154 ChainId.mainnet, 155 'fork_proto_mainnet_v3' 156 ); 157 export const configEnvWithTenderlyGnosisFork = createConfigWithTenderlyFork( 158 ChainId.xdai, 159 'fork_proto_gnosis_v3' 160 ); 161 export const configEnvWithTenderlyGoerliGhoFork = createConfigWithTenderlyFork( 162 ChainId.goerli, 163 'fork_proto_goerli_gho_v3' 164 ); 165 export const configEnvWithTenderlySepoliaGhoFork = createConfigWithTenderlyFork( 166 ChainId.sepolia, 167 'fork_proto_sepolia_gho_v3' 168 ); 169 170 const createConfigWithOrigin = (market: string, mockedAddress: string) => { 171 before('Open main page', () => { 172 cy.visit(URL, { 173 onBeforeLoad(win) { 174 // forks are always expected to run on chainId 3030 175 win.localStorage.setItem('selectedMarket', market); 176 win.localStorage.setItem('walletProvider', 'read_only_mode'); 177 win.localStorage.setItem('readOnlyModeAddress', mockedAddress); 178 }, 179 }); 180 }); 181 }; 182 183 export const configEnvMetis = (mockedAddress: string) => 184 createConfigWithOrigin('proto_metis_v3', mockedAddress); 185 export const configEnvScroll = (mockedAddress: string) => 186 createConfigWithOrigin('proto_scroll_v3', mockedAddress);