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:
parent
b60325cbcb
commit
76c06692df
@ -9,6 +9,7 @@ const FixtureServer = require('./fixture-server');
|
|||||||
const PhishingWarningPageServer = require('./phishing-warning-page-server');
|
const PhishingWarningPageServer = require('./phishing-warning-page-server');
|
||||||
const { buildWebDriver } = require('./webdriver');
|
const { buildWebDriver } = require('./webdriver');
|
||||||
const { ensureXServerIsRunning } = require('./x-server');
|
const { ensureXServerIsRunning } = require('./x-server');
|
||||||
|
const GanacheSeeder = require('./seeder/ganache-seeder');
|
||||||
|
|
||||||
const tinyDelayMs = 200;
|
const tinyDelayMs = 200;
|
||||||
const regularDelayMs = tinyDelayMs * 2;
|
const regularDelayMs = tinyDelayMs * 2;
|
||||||
@ -23,6 +24,7 @@ async function withFixtures(options, testSuite) {
|
|||||||
dapp,
|
dapp,
|
||||||
fixtures,
|
fixtures,
|
||||||
ganacheOptions,
|
ganacheOptions,
|
||||||
|
smartContract,
|
||||||
driverOptions,
|
driverOptions,
|
||||||
dappOptions,
|
dappOptions,
|
||||||
title,
|
title,
|
||||||
@ -46,6 +48,14 @@ async function withFixtures(options, testSuite) {
|
|||||||
let failed = false;
|
let failed = false;
|
||||||
try {
|
try {
|
||||||
await ganacheServer.start(ganacheOptions);
|
await ganacheServer.start(ganacheOptions);
|
||||||
|
let contractRegistry;
|
||||||
|
|
||||||
|
if (smartContract) {
|
||||||
|
const ganacheSeeder = new GanacheSeeder(true);
|
||||||
|
await ganacheSeeder.deploySmartContract(smartContract);
|
||||||
|
contractRegistry = ganacheSeeder.getContractRegistry();
|
||||||
|
}
|
||||||
|
|
||||||
if (ganacheOptions?.concurrent) {
|
if (ganacheOptions?.concurrent) {
|
||||||
const { port, chainId } = ganacheOptions.concurrent;
|
const { port, chainId } = ganacheOptions.concurrent;
|
||||||
secondaryGanacheServer = new Ganache();
|
secondaryGanacheServer = new Ganache();
|
||||||
@ -100,6 +110,7 @@ async function withFixtures(options, testSuite) {
|
|||||||
await testSuite({
|
await testSuite({
|
||||||
driver,
|
driver,
|
||||||
mockServer,
|
mockServer,
|
||||||
|
contractRegistry,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (process.env.SELENIUM_BROWSER === 'chrome') {
|
if (process.env.SELENIUM_BROWSER === 'chrome') {
|
||||||
|
28
test/e2e/seeder/ganache-contract-address-registry.js
Normal file
28
test/e2e/seeder/ganache-contract-address-registry.js
Normal 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;
|
88
test/e2e/seeder/ganache-seeder.js
Normal file
88
test/e2e/seeder/ganache-seeder.js
Normal 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;
|
43
test/e2e/seeder/smart-contracts.js
Normal file
43
test/e2e/seeder/smart-contracts.js
Normal 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 };
|
Loading…
Reference in New Issue
Block a user