UNPKG

@ethsub/sol-cli

Version:

A cli to interact with ethereum

258 lines (242 loc) 7.66 kB
const ethers = require("ethers"); const constants = require("../constants"); const {Command} = require("commander"); const {setupParentArgs, waitForTx, log} = require("./utils"); const isRelayerCmd = new Command("is-relayer") .description("Check if address is relayer") .option( "--relayer <value>", "Address to check", constants.relayerAddresses[0] ) .option( "--bridge <address>", "Bridge contract address", constants.BRIDGE_ADDRESS ) .action(async function (args) { await setupParentArgs(args, args.parent.parent); const bridgeInstance = new ethers.Contract( args.bridge, constants.ContractABIs.Bridge.abi, args.wallet ); let res = await bridgeInstance.isRelayer(args.relayer); console.log( `[${args._name}] Address ${args.relayer} ${ res ? "is" : "is not" } a relayer.` ); }); const addAdminCmd = new Command("add-admin") .description("Adds an admin") .option("--admin <address>", "Address of admin", constants.adminAddresses[0]) .option( "--bridge <address>", "Bridge contract address", constants.BRIDGE_ADDRESS ) .action(async function (args) { await setupParentArgs(args, args.parent.parent); const bridgeInstance = new ethers.Contract( args.bridge, constants.ContractABIs.Bridge.abi, args.wallet ); log(args, `Adding ${args.admin} as a admin.`); let tx = await bridgeInstance.grantRole(constants.ADMIN_ROLE, args.admin); await waitForTx(args.provider, tx.hash); }); const removeAdminCmd = new Command("remove-admin") .description("Removes an admin") .option("--admin <address>", "Address of admin", constants.adminAddresses[0]) .option( "--bridge <address>", "Bridge contract address", constants.BRIDGE_ADDRESS ) .action(async function (args) { await setupParentArgs(args, args.parent.parent); const bridgeInstance = new ethers.Contract( args.bridge, constants.ContractABIs.Bridge.abi, args.wallet ); log(args, `Removing ${args.admin} as a admin.`); let tx = await bridgeInstance.revokeRole(constants.ADMIN_ROLE, args.admin); await waitForTx(args.provider, tx.hash); }); const addRelayerCmd = new Command("add-relayer") .description("Add a relayer") .option( "--relayer <address>", "Address of relayer", constants.relayerAddresses[0] ) .option( "--bridge <address>", "Bridge contract address", constants.BRIDGE_ADDRESS ) .action(async function (args) { await setupParentArgs(args, args.parent.parent); const bridgeInstance = new ethers.Contract( args.bridge, constants.ContractABIs.Bridge.abi, args.wallet ); log(args, `Adding ${args.relayer} as a relayer.`); let tx = await bridgeInstance.adminAddRelayer(args.relayer); await waitForTx(args.provider, tx.hash); }); const removeRelayerCmd = new Command("remove-relayer") .description("Remove a relayer") .option( "--relayer <address>", "Address of relayer", constants.relayerAddresses[0] ) .option( "--bridge <address>", "Bridge contract address", constants.BRIDGE_ADDRESS ) .action(async function (args) { await setupParentArgs(args, args.parent.parent); const bridgeInstance = new ethers.Contract( args.bridge, constants.ContractABIs.Bridge.abi, args.wallet ); log(args, `Removing relayer ${args.relayer}.`); let tx = await bridgeInstance.adminRemoveRelayer(args.relayer); await waitForTx(args.provider, tx.hash); }); const setThresholdCmd = new Command("set-threshold") .description("Set relayer threshold") .option( "--bridge <address>", "Bridge contract address", constants.BRIDGE_ADDRESS ) .option("--threshold <value>", "New relayer threshold", 3) .action(async function (args) { await setupParentArgs(args, args.parent.parent); const bridgeInstance = new ethers.Contract( args.bridge, constants.ContractABIs.Bridge.abi, args.wallet ); log(args, `Setting relayer threshold to ${args.threshold}`); let tx = await bridgeInstance.adminChangeRelayerThreshold(args.threshold); await waitForTx(args.provider, tx.hash); }); const pauseTransfersCmd = new Command("pause") .description("Pause deposits and proposal on the bridge") .option( "--bridge <address>", "Bridge contract address", constants.BRIDGE_ADDRESS ) .action(async function (args) { await setupParentArgs(args, args.parent.parent); const bridgeInstance = new ethers.Contract( args.bridge, constants.ContractABIs.Bridge.abi, args.wallet ); log(args, `Pausing deposits and proposals`); let tx = await bridgeInstance.adminPauseTransfers(); await waitForTx(args.provider, tx.hash); }); const unpauseTransfersCmd = new Command("unpause") .description("Unpause deposits and proposals on the bridge") .option( "--bridge <address>", "Bridge contract address", constants.BRIDGE_ADDRESS ) .action(async function (args) { await setupParentArgs(args, args.parent.parent); const bridgeInstance = new ethers.Contract( args.bridge, constants.ContractABIs.Bridge.abi, args.wallet ); log(args, `Unpausing deposits and proposals`); let tx = await bridgeInstance.adminUnpauseTransfers(); await waitForTx(args.provider, tx.hash); }); const changeFeeCmd = new Command("set-fee") .description("Set a new fee for deposits") .option( "--bridge <address>", "Bridge contract address", constants.BRIDGE_ADDRESS ) .option("--fee <value>", "New fee (in wei)", 0) .action(async function (args) { await setupParentArgs(args, args.parent.parent); const bridgeInstance = new ethers.Contract( args.bridge, constants.ContractABIs.Bridge.abi, args.wallet ); log(args, `Setting fee to ${args.fee} wei`); let tx = await bridgeInstance.adminChangeFee(args.fee); await waitForTx(args.provider, tx.hash); }); const withdrawCmd = new Command("withdraw") .description("Withdraw funds collected from fees") .option( "--bridge <address>", "Bridge contract address", constants.BRIDGE_ADDRESS ) .option( "--handler <address>", "Handler contract address", constants.ERC20_HANDLER_ADDRESS ) .option( "--tokenContract <address>", "ERC20 or ERC721 token contract address", constants.ERC20_ADDRESS ) .option( "--recipient <address>", "Address to withdraw to", constants.relayerAddresses[0] ) .option("--amountOrId <value>", "Token ID or amount to withdraw", 1) .action(async function (args) { await setupParentArgs(args, args.parent.parent); const bridgeInstance = new ethers.Contract( args.bridge, constants.ContractABIs.Bridge.abi, args.wallet ); log( args, `Withdrawing tokens (${args.amountOrId}) in contract ${args.tokenContract} to recipient ${args.recipient}` ); let tx = await bridgeInstance.adminWithdraw( args.handler, args.tokenContract, args.recipient, args.amountOrId ); await waitForTx(args.provider, tx.hash); }); const adminCmd = new Command("admin"); adminCmd.addCommand(isRelayerCmd); adminCmd.addCommand(addAdminCmd); adminCmd.addCommand(removeAdminCmd); adminCmd.addCommand(addRelayerCmd); adminCmd.addCommand(removeRelayerCmd); adminCmd.addCommand(setThresholdCmd); adminCmd.addCommand(pauseTransfersCmd); adminCmd.addCommand(unpauseTransfersCmd); adminCmd.addCommand(changeFeeCmd); adminCmd.addCommand(withdrawCmd); module.exports = adminCmd;