1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-11-28 23:06:37 +01:00

[e2e] Deploy contracts directly seeding Ganache (#14631)

* Add some experimental Ganache seeder WIP

Refactor GanacheSeeder

* Added all smart contract bytecodes and abis

* Deploy smart contract by contract name

* Clean up and fix tx hash

* Removed console logs

* Remove last console log

* Use node module path for grabbing contract constants

* Remove contract deployment example on e2e test

* Small refactor for removing extra line

Co-authored-by: seaona <mariona@gmx.es>
This commit is contained in:
David Drazic 2022-07-21 19:08:01 +02:00 committed by GitHub
parent b60325cbcb
commit 76c06692df
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 170 additions and 0 deletions

View File

@ -9,6 +9,7 @@ const FixtureServer = require('./fixture-server');
const PhishingWarningPageServer = require('./phishing-warning-page-server');
const { buildWebDriver } = require('./webdriver');
const { ensureXServerIsRunning } = require('./x-server');
const GanacheSeeder = require('./seeder/ganache-seeder');
const tinyDelayMs = 200;
const regularDelayMs = tinyDelayMs * 2;
@ -23,6 +24,7 @@ async function withFixtures(options, testSuite) {
dapp,
fixtures,
ganacheOptions,
smartContract,
driverOptions,
dappOptions,
title,
@ -46,6 +48,14 @@ async function withFixtures(options, testSuite) {
let failed = false;
try {
await ganacheServer.start(ganacheOptions);
let contractRegistry;
if (smartContract) {
const ganacheSeeder = new GanacheSeeder(true);
await ganacheSeeder.deploySmartContract(smartContract);
contractRegistry = ganacheSeeder.getContractRegistry();
}
if (ganacheOptions?.concurrent) {
const { port, chainId } = ganacheOptions.concurrent;
secondaryGanacheServer = new Ganache();
@ -100,6 +110,7 @@ async function withFixtures(options, testSuite) {
await testSuite({
driver,
mockServer,
contractRegistry,
});
if (process.env.SELENIUM_BROWSER === 'chrome') {

View File

@ -0,0 +1,28 @@
/*
* Use this class to store pre-deployed smart contract addresses of the contracts deployed to
* a local blockchain instance ran by Ganache.
*/
class GanacheContractAddressRegistry {
#addresses = {};
/**
* Store new contract address in key:value pair.
*
* @param contractName
* @param contractAddress
*/
storeNewContractAddress(contractName, contractAddress) {
this.#addresses[contractName] = contractAddress;
}
/**
* Get deployed contract address by its name (key).
*
* @param contractName
*/
getContractAddress(contractName) {
return this.#addresses[contractName];
}
}
module.exports = GanacheContractAddressRegistry;

View File

@ -0,0 +1,88 @@
const { ethers } = require('ethers');
const ganache = require('ganache');
const { contractConfiguration } = require('./smart-contracts');
const GanacheContractAddressRegistry = require('./ganache-contract-address-registry');
/*
* Ganache seeder is used to seed initial smart contract or set initial blockchain state.
*/
class GanacheSeeder {
constructor(debug = false) {
this.debug = debug;
this.smartContractRegistry = new GanacheContractAddressRegistry();
}
/**
* Deploy initial smart contracts that can be used later within the e2e tests.
*
* @param contractName
*/
async deploySmartContract(contractName) {
if (this.debug) {
console.log('Deploying smart contracts using GanacheSeeder');
}
const ethersProvider = new ethers.providers.Web3Provider(
ganache.provider(),
'any',
);
const contractFactory = new ethers.ContractFactory(
contractConfiguration[contractName].abi,
contractConfiguration[contractName].bytecode,
ethersProvider.getSigner(),
);
let contract;
if (contractName === 'hst') {
contract = await contractFactory.deploy(
contractConfiguration.hst.initialAmount,
contractConfiguration.hst.tokenName,
contractConfiguration.hst.decimalUnits,
contractConfiguration.hst.tokenSymbol,
);
} else {
contract = await contractFactory.deploy();
}
await contract.deployTransaction.wait();
if (this.debug) {
console.log(
`Contract mined! address: ${contract.address} transactionHash: ${contract.deployTransaction.hash}`,
);
}
this.storeSmartContractAddress(contractName, contract.address);
}
/**
* Store deployed smart contract address within the environment variables
* to make it available everywhere.
*
* @param contractName
* @param contractAddress
*/
storeSmartContractAddress(contractName, contractAddress) {
if (this.debug) {
console.log(
`Storing smart contract address: [${contractName}] => ${contractAddress}`,
);
}
this.smartContractRegistry.storeNewContractAddress(
contractName,
contractAddress,
);
}
/**
* Return an instance of the currently used smart contract registry.
*
* @returns GanacheContractAddressRegistry
*/
getContractRegistry() {
return this.smartContractRegistry;
}
}
module.exports = GanacheSeeder;

View File

@ -0,0 +1,43 @@
const {
hstBytecode,
hstAbi,
piggybankBytecode,
piggybankAbi,
collectiblesAbi,
collectiblesBytecode,
failingContractAbi,
failingContractBytecode,
} = require('../../../node_modules/@metamask/test-dapp/dist/constants.json');
const hstFactory = {
initialAmount: 100,
tokenName: 'TST',
decimalUnits: 4,
tokenSymbol: 'TST',
bytecode: hstBytecode,
abi: hstAbi,
};
const collectiblesFactory = {
bytecode: collectiblesBytecode,
abi: collectiblesAbi,
};
const piggybankFactory = {
bytecode: piggybankBytecode,
abi: piggybankAbi,
};
const failingContract = {
bytecode: failingContractBytecode,
abi: failingContractAbi,
};
const contractConfiguration = {
hst: hstFactory,
collectibles: collectiblesFactory,
piggybank: piggybankFactory,
failing: failingContract,
};
module.exports = { contractConfiguration };