add execute deposit

This commit is contained in:
Barry Gitarts 2021-01-28 14:42:17 -05:00
parent fd7cb2165c
commit 70f3920a9e
3 changed files with 59 additions and 14 deletions

View File

@ -5,6 +5,7 @@ import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/presets/ERC20PresetMinterPauser.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20Burnable.sol";
/**
@title Manages deposited ERC20s.
@author ChainSafe Systems.

View File

@ -1,5 +1,5 @@
import { ethers, } from "hardhat";
import { Signer } from "ethers";
import { BigNumber, Bytes, BytesLike, Signer } from "ethers";
import chai from "chai";
import { solidity } from "ethereum-waffle";
@ -9,8 +9,9 @@ import { MintableERC20 } from "../types/MintableERC20";
import {
createResourceID,
toWei,
generateDepositMetaData,
generateDepositDataHash,
createERCDepositData,
generateDepositMetaData
} from "../utils/helpers";
chai.use(solidity);
@ -19,7 +20,7 @@ const { expect } = chai;
describe("Bridge", function () {
const ETHEREUM_CHAIN_ID: number = 1;
const AVA_CHAIN_ID: number = 2;
const relayerThreshold: number = 0;
const relayerThreshold: number = 2;
let accounts: Signer[];
let bridge: Bridge;
let erc20Handler: ERC20Handler;
@ -34,9 +35,17 @@ describe("Bridge", function () {
});
it("should deploy bridge contract", async function () {
const [deployer, depositer, recipient, relayer1, relayer2] = accounts;
const initialRelayers = [await relayer1.getAddress(), await relayer2.getAddress()];
deployerAddress = await accounts[0].getAddress();
const bridgeFactory = await ethers.getContractFactory("Bridge");
const _bridge = await bridgeFactory.deploy(ETHEREUM_CHAIN_ID, [], relayerThreshold, 0, 100) as Bridge;
const _bridge = await bridgeFactory.deploy(
ETHEREUM_CHAIN_ID,
initialRelayers,
relayerThreshold,
0,
100
) as Bridge;
expect(_bridge).to.have.property('deployTransaction');
bridge = _bridge;
});
@ -61,6 +70,8 @@ describe("Bridge", function () {
);
});
let depositNonce: BigNumber;
let encodedMetaData: string;
it("Should deposit erc20 into the bridge", async function () {
const [deployer, depositer, recipient] = accounts;
depositerAddress = await depositer.getAddress();
@ -69,14 +80,42 @@ describe("Bridge", function () {
await sntEthereum.mint(depositerAddress, toWei("100"));
await sntDepositer.approve(erc20Handler.address, toWei("1"));
const encodedMetaData = generateDepositMetaData(1, recipientAddress);
encodedMetaData = createERCDepositData(toWei('1'), recipientAddress);
const bridgeDepositer = bridge.connect(depositer);
const deposit = bridgeDepositer.deposit(
const deposit = await bridgeDepositer.deposit(
AVA_CHAIN_ID,
sntEthereumResourceId,
encodedMetaData
);
await expect(deposit)
.to.emit(bridgeDepositer, 'Deposit');
const receipt = await deposit.wait(1);
const events = receipt.events;
const depositEvent = events?.find(x => x.event == 'Deposit');
depositNonce = depositEvent?.args?.depositNonce
expect(depositNonce).to.eq(1)
});
it("Should execute deposit", async function () {
const [deployer, depositer, recipient, relayer1, relayer2] = accounts;
const bridgeRelayer1: Bridge = bridge.connect(relayer1);
const bridgeRelayer2: Bridge = bridge.connect(relayer2);
const depositDataHash = generateDepositDataHash(erc20Handler.address, encodedMetaData);
const relay1Vote = await bridgeRelayer1.voteProposal(
ETHEREUM_CHAIN_ID,
depositNonce,
sntEthereumResourceId,
depositDataHash
);
const relay2Vote = await bridgeRelayer2.voteProposal(
ETHEREUM_CHAIN_ID,
depositNonce,
sntEthereumResourceId,
depositDataHash
);
const executeProposal = await bridgeRelayer2.executeProposal(
ETHEREUM_CHAIN_ID,
depositNonce,
encodedMetaData,
sntEthereumResourceId
);
})
});

View File

@ -1,12 +1,14 @@
import { utils } from "ethers";
import { Address } from "cluster";
import { BigNumberish, BytesLike, utils } from "ethers";
const {
hexZeroPad,
hexlify,
formatBytes32String,
keccak256
} = utils;
const AbiCoder = new utils.AbiCoder;
export const toHex = (covertThis: any, padding: number) => {
export const toHex = (covertThis: any, padding: any) => {
return hexZeroPad(hexlify(covertThis), padding);
};
@ -20,22 +22,25 @@ export const abiEncode = (valueTypes: any[], values: any[]) => {
};
export const generateDepositMetaData = (amount: number, recipientAddress: string) => {
console.log({recipientAddress})
const addressLength = 20;
return abiEncode(
['uint256', 'uint256', 'bytes'],
[amount, addressLength, recipientAddress]
['uint256', 'uint256', 'bytes'],
[1, addressLength, recipientAddress]
);
}
export const toWei = (x: string) => utils.parseEther(x);
export const createERCDepositData = (
tokenAmountOrID: number,
lenRecipientAddress: number,
tokenAmountOrID: BigNumberish,
recipientAddress: string
): string => {
const lenRecipientAddress = 20;
return '0x' +
toHex(tokenAmountOrID, 32).substr(2) + // Token amount or ID to deposit (32 bytes)
toHex(lenRecipientAddress, 32).substr(2) + // len(recipientAddress) (32 bytes)
recipientAddress.substr(2); // recipientAddress (?? bytes)
};
export const generateDepositDataHash = (handler: string, depositData: string): BytesLike => keccak256(handler + depositData.substr(2));