mirror of
https://github.com/status-im/eth_ava_bridge.git
synced 2025-02-21 07:18:11 +00:00
add execute deposit
This commit is contained in:
parent
fd7cb2165c
commit
70f3920a9e
@ -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.
|
||||
|
@ -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
|
||||
);
|
||||
})
|
||||
});
|
||||
|
@ -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));
|
||||
|
Loading…
x
Reference in New Issue
Block a user