/ cypress / support / steps / configuration.steps.ts
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);