Skip to content

Latest commit

 

History

History
103 lines (96 loc) · 3.36 KB

File metadata and controls

103 lines (96 loc) · 3.36 KB
const { ethers } = require("ethers");
const dotenv = require("dotenv");

const chains = require("../constants/chains");
/* Get contract addresses from the file we generated by running the deploy script */
const {
	AVAX_BRIDGE_ADDRESS,
	AVAX_TOKEN_ADDRESS,
	SUBNET_BRIDGE_ADDRESS,
} = require("../variables/contractAddresses");
/* Get ABIs of the contracts directly from the artifact folder created by hardhat after each compilation */
const SUBNET_BRIDGE_ABI =
	require("../artifacts/contracts/Bridge/SubnetBridge.sol/SubnetBridge").abi;
const AVAX_BRIDGE_ABI =
	require("../artifacts/contracts/Bridge/AvaxBridge.sol/AvaxBridge").abi;
const AVAX_TOKEN_ABI =
	require("../artifacts/contracts/Token/AvaxToken.sol/AvaxToken").abi;
dotenv.config();

/* 
  BurnOrLock script that allows us to both burn and lock tokens
  On Avax it allows us to lock ERC20 tokens
  On Subnet it allows us to burn native tokens
*/
module.exports = burnOrLock = async (from, amount) => {
	let provider;
	let signer;
	let bridgeContract;
	/* This script takes command line argument to indicate which chain we are using */
	if (from === "avax") {
		/* Initialize; provider, signer and tokenContract */
		provider = new ethers.providers.JsonRpcProvider(chains.avax.rpcUrl);
		signer = new ethers.Wallet(process.env.BRIDGE_USER_PRIVATE_KEY, provider);
		const tokenContract = new ethers.Contract(
			AVAX_TOKEN_ADDRESS,
			AVAX_TOKEN_ABI,
			signer
		);

		/* Approve bridge to use the token of the sender before trying to lock tokens */
		const approveTx = await tokenContract.approve(
			AVAX_BRIDGE_ADDRESS,
			ethers.utils.parseEther(amount)
		);
		await approveTx.wait();

		/* Initialize bridgeContract  */
		bridgeContract = new ethers.Contract(
			AVAX_BRIDGE_ADDRESS,
			AVAX_BRIDGE_ABI,
			signer
		);

		/* User locks ERC20 tokens to the bridge */
		const lockTx = await bridgeContract.lock(
			signer.address,
			ethers.utils.parseEther(amount)
		);
		const minedTx = await lockTx.wait();

		console.log("Successfully locked amount on avax: ", amount);
		console.log("At block: ", minedTx.blockNumber);
		/* Get user's ERC20 balance after lock */
		const newUserBalance = await tokenContract.balanceOf(signer.address);
		/* Get bridge's ERC20 balance after lock */
		const newBridgeBalance = await tokenContract.balanceOf(AVAX_BRIDGE_ADDRESS);
		console.log(
			"Updated balance of user after lock: ",
			ethers.utils.formatEther(newUserBalance)
		);
		console.log(
			"Updated balance of bridge after lock: ",
			ethers.utils.formatEther(newBridgeBalance)
		);
	} else if (from === "subnet") {
		/* Initialize; provider, signer and tokenContract */
		provider = new ethers.providers.JsonRpcProvider(chains.subnet.rpcUrl);
		signer = new ethers.Wallet(process.env.BRIDGE_USER_PRIVATE_KEY, provider);
		bridgeContract = new ethers.Contract(
			SUBNET_BRIDGE_ADDRESS,
			SUBNET_BRIDGE_ABI,
			signer
		);
		/* User burns native tokens */
		const burnTx = await bridgeContract.burn(signer.address, {
			value: ethers.utils.parseEther(amount),
		});
		const minedTx = await burnTx.wait();
		console.log("Successfully burned amount on subnet: ", amount);
		console.log("At block: ", minedTx.blockNumber);

		/* Get user's native token balance after burn */
		const newUserBalance = await signer.getBalance();
		console.log(
			"Updated balance of user after burn: ",
			ethers.utils.formatEther(newUserBalance)
		);
	} else {
		return;
	}
};