UNPKG

fuel-core

Version:

Essential javascript architecture for the Fuel side chain

190 lines (159 loc) 6.43 kB
const { utils, Contract, Wallet, providers, ContractFactory } = require('ethers'); const _utils = require('../utils/utils'); const structs = require('../structs/structs'); const interfaces = require('../interfaces/interfaces'); const errors = require('../errors/errors'); const types = require('../types/types'); const HTTPProvider = require('ethjs-provider-http'); const FuelBytecode = require('./Fuel.code.js'); const FakeDaiBytecode = require('./FakeDai.code.js'); const { getReceipt } = require('../blocks/processBlock'); const write = require('write'); const oldConfig = require('../config/config'); const env = require('../config/process'); const MysqlDB = require('../dbs/MysqlDB'); types.TypeHex(env.block_production_key, 32); types.TypeHex(env.faucet_key, 32); const inputs = new MysqlDB({ // for storing remotly for lambda processing host: env.mysql_host, port: parseInt(env.mysql_port, 10), database: env.mysql_database, user: env.mysql_user, password: env.mysql_password, table: 'faucet_inputs', indexValue: false, }); const web3Provider = new HTTPProvider(env.web3_provider); const blockProducer = new Wallet(env.block_production_key, new providers.Web3Provider(web3Provider)); const faucetProducer = new Wallet(env.faucet_key, new providers.Web3Provider(web3Provider)); const faucetSigner = new utils.SigningKey(env.faucet_key); const rpc = interfaces.FuelRPC({ web3Provider }); // Deployment of Network / Faucet async function deploy() { try { // Create inputs table await inputs.create(); const __chain_id = env.chain_id || '3'; // default to ropsten.. const __network = oldConfig.networks[__chain_id]; if (!__network) { throw new Error('Invalid chain ID or network not found in old configuration..'); } console.log(`Fuel deployment sequence started on Chain ID ${__chain_id} "${__network}".`); // Fuel Factory const FuelFactory = new ContractFactory(interfaces.FuelInterface.abi, FuelBytecode, blockProducer); // Notice we pass in "Hello World" as the parameter to the constructor const fuelContract = await FuelFactory.deploy(blockProducer.address); await fuelContract.deployed(); console.log('Fuel contract deployed to', fuelContract.address); // Check finalization delay if (!(await fuelContract.FINALIZATION_DELAY()).eq(50400)) { throw new Error('Invalid finalization delay!'); } if (!(await fuelContract.SUBMISSION_DELAY()).eq(14400)) { throw new Error('Invalid submission delay!'); } if (!(await fuelContract.BOND_SIZE()).eq(utils.parseEther('.1'))) { throw new Error('Invalid bond size!'); } // Fuel Factory const FakeDaiFactory = new ContractFactory(interfaces.FakeDaiInterface.abi, FakeDaiBytecode, faucetProducer); // Notice we pass in "Hello World" as the parameter to the constructor const fakeDaiContract = await FakeDaiFactory.deploy(faucetProducer.address); await fakeDaiContract.deployed(env.chain_id || _utils.big(3)); console.log('FakeDai contract deployed to', fakeDaiContract.address); // Mint stuff.. const mintAmount = utils.parseEther('1000000000000000000000'); const mintTx = await fakeDaiContract.mint(faucetProducer.address, mintAmount); await mintTx.wait(); const mintReceipt = await rpc('eth_getTransactionReceipt', mintTx.hash); console.log('Mint tx status', mintReceipt.status); // Approval process. const approvalTx = await fakeDaiContract.approve(fuelContract.address, mintAmount); await approvalTx.wait(); const approvalReceipt = await rpc('eth_getTransactionReceipt', approvalTx.hash); console.log('Approval tx status', approvalReceipt.status); // Connect to Fuel contract from faucet const faucetFuelContract = fuelContract.connect(faucetProducer); const depositTx = await faucetFuelContract.deposit( faucetProducer.address, fakeDaiContract.address, mintAmount); await depositTx.wait(); const depositReceipt = await rpc('eth_getTransactionReceipt', depositTx.hash); console.log('Deposit tx status', depositReceipt.status); // Determine Deposit RLP const depositRLP = _utils.RLP.encode([ faucetProducer.address, fakeDaiContract.address, _utils.big(depositReceipt.blockNumber).toHexString(), _utils.big(1).toHexString(), mintAmount.toHexString(), ]); const depositHashID = structs.constructDepositHashID({ ethereumBlockNumber: _utils.big(depositReceipt.blockNumber), token: fakeDaiContract.address, account: faucetProducer.address, }); console.log('Deposit Hash', depositHashID, 'Deposit RLP data', depositRLP); const __addresses = Object.assign({}, oldConfig.addresses, { [__network]: { fuel: fuelContract.address, fakeDai: fakeDaiContract.address, ether: '0x0000000000000000000000000000000000000000', }, }); const __faucet = Object.assign({}, oldConfig.faucet, { [__network]: { key: `${interfaces.FuelDBKeys.deposit}${depositHashID.slice(2)}`, value: `${depositRLP}`, depositHashID: `${depositHashID}`, ethereumBlockNumber: `${_utils.big(depositReceipt.blockNumber).toHexString()}`, token: `${String(fakeDaiContract.address).toLowerCase()}`, account: `${String(faucetProducer.address).toLowerCase()}`, }, }); const __ids = Object.assign({}, oldConfig.ids, { [__network]: { '0x0000000000000000000000000000000000000000': '0', [`${String(fakeDaiContract.address).toLowerCase()}`]: '1', }, }); // Add to faucets inputs await inputs.put(__faucet[__network].key, __faucet[__network].value); console.log('Writting details to ./config/config.js file..'); await write('./config/config.js', ` // Tokens const addresses = ${JSON.stringify(__addresses, null, 2)}; // Faucet const faucet = ${JSON.stringify(__faucet, null, 2)}; // Networks const networks = { '3': 'ropsten', '5': 'goerli', '4': 'rinkeby', '10': 'local', }; // Ids const ids = ${JSON.stringify(__ids, null, 2)}; module.exports = { addresses, networks, faucet, ids, }; `); console.log('Deployment sequence complete.'); // Deposit / Hash / Stuff complete.. } catch (error) { throw new errors.ByPassError(error); } } deploy() .then(console.log) .catch(console.error);