forked from cerc-io/ipld-eth-server
Roy Crihfield
6d7487152c
Now uses: * ipld direct_by_leaf StateDB for basic queries * trie_by_cid StateDB for trie slice and proof queries Also: * vulcanize => cerc refactor * Backend method to close dbs * state tests are in multiple packages, to allow separate ginkgo suites * removes gap-filler module * integration tests and github workflows * run stack-orchestrator for testnet * fix various issues with tests, hardhat server, dockerfile * fix cmd flags / env vars * fix flaky tests and clean up code * remove unused code, scripts * remove outdated docs * update version
159 lines
4.0 KiB
JavaScript
159 lines
4.0 KiB
JavaScript
const fastify = require('fastify')({ logger: true });
|
|
const hre = require("hardhat");
|
|
|
|
const {
|
|
deployContract,
|
|
isDeployed
|
|
} = require("solidity-create2-deployer");
|
|
|
|
const { getStorageSlotKey, deployCreate2Factory } = require('./utils');
|
|
|
|
const CREATE2_FACTORY_ADDRESS = '0x4a27c059FD7E383854Ea7DE6Be9c390a795f6eE3'
|
|
|
|
// readiness check
|
|
fastify.get('/v1/healthz', async (req, reply) => {
|
|
reply
|
|
.code(200)
|
|
.header('Content-Type', 'application/json; charset=utf-8')
|
|
.send({ success: true })
|
|
});
|
|
|
|
fastify.get('/v1/sendEth', async (req, reply) => {
|
|
const to = req.query.to;
|
|
const value = hre.ethers.utils.parseEther(req.query.value);
|
|
|
|
const owner = await hre.ethers.getSigner();
|
|
const tx = await owner.sendTransaction({to, value}).then(tx => tx.wait());
|
|
|
|
return {
|
|
from: tx.from,
|
|
to: tx.to,
|
|
txHash: tx.hash,
|
|
blockNumber: tx.blockNumber,
|
|
blockHash: tx.blockHash,
|
|
}
|
|
});
|
|
|
|
function contractCreator(name) {
|
|
return async (req, reply) => {
|
|
const contract = await hre.ethers.getContractFactory(name);
|
|
const instance = await contract.deploy();
|
|
const rct = await instance.deployTransaction.wait();
|
|
|
|
return {
|
|
address: instance.address,
|
|
txHash: rct.transactionHash,
|
|
blockNumber: rct.blockNumber,
|
|
blockHash: rct.blockHash,
|
|
}
|
|
}
|
|
}
|
|
|
|
function contractDestroyer(name) {
|
|
return async (req, reply) => {
|
|
const addr = req.query.addr;
|
|
const contract = await hre.ethers.getContractFactory(name);
|
|
const instance = contract.attach(addr);
|
|
const rct = await instance.destroy().then(tx => tx.wait());
|
|
|
|
return {
|
|
blockNumber: rct.blockNumber,
|
|
}
|
|
}
|
|
}
|
|
|
|
fastify.get('/v1/deployContract', contractCreator("GLDToken"));
|
|
fastify.get('/v1/destroyContract', contractDestroyer("GLDToken"));
|
|
|
|
fastify.get('/v1/deploySLVContract', contractCreator("SLVToken"));
|
|
fastify.get('/v1/destroySLVContract', contractDestroyer("SLVToken"));
|
|
|
|
fastify.get('/v1/incrementCountA', async (req, reply) => {
|
|
const addr = req.query.addr;
|
|
|
|
const SLVToken = await hre.ethers.getContractFactory("SLVToken");
|
|
const token = await SLVToken.attach(addr);
|
|
|
|
const tx = await token.incrementCountA();
|
|
const receipt = await tx.wait();
|
|
|
|
return {
|
|
blockNumber: receipt.blockNumber,
|
|
}
|
|
});
|
|
|
|
fastify.get('/v1/incrementCountB', async (req, reply) => {
|
|
const addr = req.query.addr;
|
|
|
|
const SLVToken = await hre.ethers.getContractFactory("SLVToken");
|
|
const token = await SLVToken.attach(addr);
|
|
|
|
const tx = await token.incrementCountB();
|
|
const receipt = await tx.wait();
|
|
|
|
return {
|
|
blockNumber: receipt.blockNumber,
|
|
}
|
|
});
|
|
|
|
fastify.get('/v1/getStorageKey', async (req, reply) => {
|
|
const contract = req.query.contract;
|
|
const label = req.query.label;
|
|
|
|
const key = await getStorageSlotKey(contract, label)
|
|
|
|
return {
|
|
key
|
|
}
|
|
});
|
|
|
|
fastify.get('/v1/create2Contract', async (req, reply) => {
|
|
const contract = req.query.contract;
|
|
const salt = req.query.salt;
|
|
|
|
const provider = hre.ethers.provider;
|
|
const signer = await hre.ethers.getSigner();
|
|
const isFactoryDeployed = await isDeployed(CREATE2_FACTORY_ADDRESS, provider);
|
|
|
|
if (!isFactoryDeployed) {
|
|
await deployCreate2Factory(provider, signer);
|
|
}
|
|
|
|
const contractFactory = await hre.ethers.getContractFactory(contract);
|
|
const bytecode = contractFactory.bytecode;
|
|
const constructorTypes = [];
|
|
const constructorArgs = [];
|
|
|
|
const createArgs = {
|
|
salt,
|
|
contractBytecode: bytecode,
|
|
constructorTypes: constructorTypes,
|
|
constructorArgs: constructorArgs,
|
|
signer
|
|
};
|
|
const { txHash, address, receipt } = await deployContract(createArgs);
|
|
const success = await isDeployed(address, provider);
|
|
|
|
if (success) {
|
|
return {
|
|
address,
|
|
txHash,
|
|
blockNumber: receipt.blockNumber,
|
|
blockHash: receipt.blockHash,
|
|
}
|
|
}
|
|
});
|
|
|
|
async function main() {
|
|
try {
|
|
await fastify.listen({ port: 3000, host: '0.0.0.0' });
|
|
} catch (err) {
|
|
fastify.log.error(err);
|
|
process.exit(1);
|
|
}
|
|
}
|
|
|
|
process.on('SIGINT', () => fastify.close().then(() => process.exit(1)));
|
|
|
|
main();
|