diff --git a/test/contractsv2/BridgeL2GasTokensSovereignChains.test.ts b/test/contractsv2/BridgeL2GasTokensSovereignChains.test.ts index b14acb30..f0fdadd1 100644 --- a/test/contractsv2/BridgeL2GasTokensSovereignChains.test.ts +++ b/test/contractsv2/BridgeL2GasTokensSovereignChains.test.ts @@ -1,13 +1,9 @@ import {expect} from "chai"; import {ethers, upgrades} from "hardhat"; import { - VerifierRollupHelperMock, ERC20PermitMock, - PolygonRollupManagerMock, - PolygonZkEVMGlobalExitRoot, - PolygonZkEVMBridgeV2, - PolygonZkEVMV2, - PolygonRollupBase, + GlobalExitRootManagerL2SovereignChain, + BridgeL2SovereignChain, TokenWrapped, } from "../../typechain-types"; import {takeSnapshot, time} from "@nomicfoundation/hardhat-network-helpers"; @@ -30,16 +26,17 @@ function computeGlobalIndex(indexLocal: any, indexRollup: any, isMainnet: Boolea } } -describe("PolygonZkEVMBridge Gas tokens tests", () => { +describe("SovereignChainBridge Gas tokens tests", () => { upgrades.silenceWarnings(); - let polygonZkEVMBridgeContract: PolygonZkEVMBridgeV2; + let sovereignChainBridgeContract: BridgeL2SovereignChain; let polTokenContract: ERC20PermitMock; - let polygonZkEVMGlobalExitRoot: PolygonZkEVMGlobalExitRoot; + let sovereignChainGlobalExitRoot: GlobalExitRootManagerL2SovereignChain; let deployer: any; let rollupManager: any; let acc1: any; + let bridgeManager: any; const tokenName = "Matic Token"; const tokenSymbol = "MATIC"; @@ -51,12 +48,11 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { ); const networkIDMainnet = 0; const networkIDRollup = 1; + const networkIDRollup2 = 2; const LEAF_TYPE_ASSET = 0; const LEAF_TYPE_MESSAGE = 1; - const polygonZkEVMAddress = ethers.ZeroAddress; - let gasTokenAddress: any; let gasTokenNetwork: any; let gasTokenMetadata: any; @@ -64,20 +60,24 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { beforeEach("Deploy contracts", async () => { // load signers - [deployer, rollupManager, acc1] = await ethers.getSigners(); + [deployer, rollupManager, acc1, bridgeManager] = await ethers.getSigners(); + // Set trusted sequencer as coinbase for sovereign chains + await ethers.provider.send("hardhat_setCoinbase", [deployer.address]); // deploy PolygonZkEVMBridge - const polygonZkEVMBridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); - polygonZkEVMBridgeContract = (await upgrades.deployProxy(polygonZkEVMBridgeFactory, [], { + const BridgeL2SovereignChainFactory = await ethers.getContractFactory("BridgeL2SovereignChain"); + sovereignChainBridgeContract = (await upgrades.deployProxy(BridgeL2SovereignChainFactory, [], { initializer: false, unsafeAllow: ["constructor"], - })) as unknown as PolygonZkEVMBridgeV2; + })) as unknown as BridgeL2SovereignChain; // deploy global exit root manager - const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory("PolygonZkEVMGlobalExitRoot"); - polygonZkEVMGlobalExitRoot = await PolygonZkEVMGlobalExitRootFactory.deploy( + const SovereignChainGlobalExitRootFactory = await ethers.getContractFactory( + "GlobalExitRootManagerL2SovereignChain" + ); + sovereignChainGlobalExitRoot = await SovereignChainGlobalExitRootFactory.deploy( rollupManager.address, - polygonZkEVMBridgeContract.target + sovereignChainBridgeContract.target ); // deploy token @@ -93,19 +93,20 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { gasTokenNetwork = 0; gasTokenMetadata = metadataToken; - await polygonZkEVMBridgeContract.initialize( - networkIDMainnet, + await sovereignChainBridgeContract.initialize( + networkIDRollup2, polTokenContract.target, // zero for ether 0, // zero for ether - polygonZkEVMGlobalExitRoot.target, + sovereignChainGlobalExitRoot.target, rollupManager.address, - metadataToken + metadataToken, + ethers.Typed.address(bridgeManager.address) ); // calculate the weth address: const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped"); // create2 parameters - const minimalBytecodeProxy = await polygonZkEVMBridgeContract.BASE_INIT_BYTECODE_WRAPPED_TOKEN(); + const minimalBytecodeProxy = await sovereignChainBridgeContract.BASE_INIT_BYTECODE_WRAPPED_TOKEN(); const WETHName = "Wrapped Ether"; const WETHSymbol = "WETH"; const WETHDecimals = 18; @@ -116,23 +117,25 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataWETH]); const precalculatedWeth = await ethers.getCreate2Address( - polygonZkEVMBridgeContract.target as string, + sovereignChainBridgeContract.target as string, ethers.ZeroHash, // zero only for weth hashInitCode ); WETHToken = tokenWrappedFactory.attach(precalculatedWeth) as TokenWrapped; - expect(await polygonZkEVMBridgeContract.WETHToken()).to.be.equal(WETHToken.target); + expect(await sovereignChainBridgeContract.WETHToken()).to.be.equal(WETHToken.target); }); it("should check the constructor parameters", async () => { - expect(await polygonZkEVMBridgeContract.globalExitRootManager()).to.be.equal(polygonZkEVMGlobalExitRoot.target); - expect(await polygonZkEVMBridgeContract.networkID()).to.be.equal(networkIDMainnet); - expect(await polygonZkEVMBridgeContract.polygonRollupManager()).to.be.equal(rollupManager.address); + expect(await sovereignChainBridgeContract.globalExitRootManager()).to.be.equal( + sovereignChainGlobalExitRoot.target + ); + expect(await sovereignChainBridgeContract.networkID()).to.be.equal(networkIDRollup2); + expect(await sovereignChainBridgeContract.polygonRollupManager()).to.be.equal(rollupManager.address); - expect(await polygonZkEVMBridgeContract.gasTokenAddress()).to.be.equal(gasTokenAddress); - expect(await polygonZkEVMBridgeContract.gasTokenNetwork()).to.be.equal(gasTokenNetwork); - expect(await polygonZkEVMBridgeContract.gasTokenMetadata()).to.be.equal(gasTokenMetadata); + expect(await sovereignChainBridgeContract.gasTokenAddress()).to.be.equal(gasTokenAddress); + expect(await sovereignChainBridgeContract.gasTokenNetwork()).to.be.equal(gasTokenNetwork); + expect(await sovereignChainBridgeContract.gasTokenMetadata()).to.be.equal(gasTokenMetadata); }); it("should check the initalized function", async () => { @@ -148,42 +151,42 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { networkIDMainnet, ethers.ZeroAddress, // zero for ether 1, // zero for ether - polygonZkEVMGlobalExitRoot.target, + sovereignChainGlobalExitRoot.target, rollupManager.address, "0x" ) - ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "GasTokenNetworkMustBeZeroOnEther"); + ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "GasTokenNetworkMustBeZeroOnEther"); }); it("should check the emergency state", async () => { - expect(await polygonZkEVMBridgeContract.isEmergencyState()).to.be.equal(false); + expect(await sovereignChainBridgeContract.isEmergencyState()).to.be.equal(false); - await expect(polygonZkEVMBridgeContract.activateEmergencyState()).to.be.revertedWithCustomError( - polygonZkEVMBridgeContract, + await expect(sovereignChainBridgeContract.activateEmergencyState()).to.be.revertedWithCustomError( + sovereignChainBridgeContract, "OnlyRollupManager" ); - await expect(polygonZkEVMBridgeContract.connect(rollupManager).activateEmergencyState()).to.emit( - polygonZkEVMBridgeContract, + await expect(sovereignChainBridgeContract.connect(rollupManager).activateEmergencyState()).to.emit( + sovereignChainBridgeContract, "EmergencyStateActivated" ); - expect(await polygonZkEVMBridgeContract.isEmergencyState()).to.be.equal(true); + expect(await sovereignChainBridgeContract.isEmergencyState()).to.be.equal(true); await expect( - polygonZkEVMBridgeContract.connect(deployer).deactivateEmergencyState() - ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "OnlyRollupManager"); + sovereignChainBridgeContract.connect(deployer).deactivateEmergencyState() + ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "OnlyRollupManager"); - await expect(polygonZkEVMBridgeContract.connect(rollupManager).deactivateEmergencyState()).to.emit( - polygonZkEVMBridgeContract, + await expect(sovereignChainBridgeContract.connect(rollupManager).deactivateEmergencyState()).to.emit( + sovereignChainBridgeContract, "EmergencyStateDeactivated" ); - expect(await polygonZkEVMBridgeContract.isEmergencyState()).to.be.equal(false); + expect(await sovereignChainBridgeContract.isEmergencyState()).to.be.equal(false); }); - it("should PolygonZkEVM bridge asset and verify merkle proof", async () => { - const depositCount = await polygonZkEVMBridgeContract.depositCount(); - const originNetwork = networkIDMainnet; + it("should SovereignChain bridge asset and verify merkle proof", async () => { + const depositCount = await sovereignChainBridgeContract.depositCount(); + const originNetwork = networkIDRollup2; const tokenAddress = polTokenContract.target; const amount = ethers.parseEther("10"); const destinationNetwork = networkIDRollup; @@ -193,14 +196,14 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); const balanceDeployer = await polTokenContract.balanceOf(deployer.address); - const balanceBridge = await polTokenContract.balanceOf(polygonZkEVMBridgeContract.target); + const balanceBridge = await polTokenContract.balanceOf(sovereignChainBridgeContract.target); - const rollupExitRoot = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); + const mainnetExitRoot = ethers.ZeroHash; // create a new deposit - await expect(polTokenContract.approve(polygonZkEVMBridgeContract.target, amount)) + await expect(polTokenContract.approve(sovereignChainBridgeContract.target, amount)) .to.emit(polTokenContract, "Approval") - .withArgs(deployer.address, polygonZkEVMBridgeContract.target, amount); + .withArgs(deployer.address, sovereignChainBridgeContract.target, amount); // pre compute root merkle tree in Js const height = 32; @@ -215,10 +218,10 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { metadataHash ); merkleTree.add(leafValue); - const rootJSMainnet = merkleTree.getRoot(); + const rootJSSovereignRollup = merkleTree.getRoot(); await expect( - polygonZkEVMBridgeContract.bridgeAsset( + sovereignChainBridgeContract.bridgeAsset( destinationNetwork, destinationAddress, amount, @@ -227,10 +230,10 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { "0x", {value: 1} ) - ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "MsgValueNotZero"); + ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "MsgValueNotZero"); await expect( - polygonZkEVMBridgeContract.bridgeAsset( + sovereignChainBridgeContract.bridgeAsset( destinationNetwork, destinationAddress, amount, @@ -239,7 +242,7 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { "0x" ) ) - .to.emit(polygonZkEVMBridgeContract, "BridgeEvent") + .to.emit(sovereignChainBridgeContract, "BridgeEvent") .withArgs( LEAF_TYPE_ASSET, originNetwork, @@ -249,17 +252,17 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { amount, metadata, depositCount - ) - .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") - .withArgs(rootJSMainnet, rollupExitRoot); + ); expect(await polTokenContract.balanceOf(deployer.address)).to.be.equal(balanceDeployer - amount); - expect(await polTokenContract.balanceOf(polygonZkEVMBridgeContract.target)).to.be.equal(balanceBridge + amount); - expect(await polygonZkEVMBridgeContract.lastUpdatedDepositCount()).to.be.equal(1); + expect(await polTokenContract.balanceOf(sovereignChainBridgeContract.target)).to.be.equal( + balanceBridge + amount + ); + expect(await sovereignChainBridgeContract.lastUpdatedDepositCount()).to.be.equal(1); // check merkle root with SC - const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); - expect(rootSCMainnet).to.be.equal(rootJSMainnet); + const rootSCMainnet = await sovereignChainBridgeContract.getRoot(); + expect(rootSCMainnet).to.be.equal(rootJSSovereignRollup); // check merkle proof const proof = merkleTree.getProofTreeByIndex(0); @@ -267,17 +270,17 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { // verify merkle proof expect(verifyMerkleProof(leafValue, proof, index, rootSCMainnet)).to.be.equal(true); - expect(await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proof, index, rootSCMainnet)).to.be.equal( - true - ); + expect( + await sovereignChainBridgeContract.verifyMerkleProof(leafValue, proof, index, rootSCMainnet) + ).to.be.equal(true); - const computedGlobalExitRoot = calculateGlobalExitRoot(rootJSMainnet, rollupExitRoot); - expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); + const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rootJSSovereignRollup); + expect(computedGlobalExitRoot).to.be.equal(await sovereignChainGlobalExitRoot.getLastGlobalExitRoot()); }); it("should PolygonZkEVMBridge message and verify merkle proof", async () => { - const depositCount = await polygonZkEVMBridgeContract.depositCount(); - const originNetwork = networkIDMainnet; + const depositCount = await sovereignChainBridgeContract.depositCount(); + const originNetwork = networkIDRollup2; const originAddress = deployer.address; const amount = ethers.parseEther("10"); const destinationNetwork = networkIDRollup; @@ -285,7 +288,7 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { const metadata = metadataToken; const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); - const rollupExitRoot = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); + const mainnetExitRoot = ethers.ZeroHash; // pre compute root merkle tree in Js const height = 32; @@ -300,20 +303,20 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { metadataHash ); merkleTree.add(leafValue); - const rootJSMainnet = merkleTree.getRoot(); + const rootJSSovereignChain = merkleTree.getRoot(); // using gas TOkens cannot use bridge message with etther await expect( - polygonZkEVMBridgeContract.bridgeMessage(destinationNetwork, destinationAddress, true, metadata, { + sovereignChainBridgeContract.bridgeMessage(destinationNetwork, destinationAddress, true, metadata, { value: amount, }) - ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "NoValueInMessagesOnGasTokenNetworks"); + ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "NoValueInMessagesOnGasTokenNetworks"); // Use bridgeMessageWETH instead! // cannot use value await expect( - polygonZkEVMBridgeContract.bridgeMessageWETH( + sovereignChainBridgeContract.bridgeMessageWETH( destinationNetwork, destinationAddress, amount, @@ -327,19 +330,31 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { // Use bridgeMessageWETH instead! await expect( - polygonZkEVMBridgeContract.bridgeMessageWETH(destinationNetwork, destinationAddress, amount, true, metadata) + sovereignChainBridgeContract.bridgeMessageWETH( + destinationNetwork, + destinationAddress, + amount, + true, + metadata + ) ).to.be.revertedWith("ERC20: burn amount exceeds balance"); // Mock mint weth - await ethers.provider.send("hardhat_impersonateAccount", [polygonZkEVMBridgeContract.target]); - const bridgeMock = await ethers.getSigner(polygonZkEVMBridgeContract.target as any); + await ethers.provider.send("hardhat_impersonateAccount", [sovereignChainBridgeContract.target]); + const bridgeMock = await ethers.getSigner(sovereignChainBridgeContract.target as any); await WETHToken.connect(bridgeMock).mint(deployer.address, amount, {gasPrice: 0}); await expect( - polygonZkEVMBridgeContract.bridgeMessageWETH(destinationNetwork, destinationAddress, amount, true, metadata) + sovereignChainBridgeContract.bridgeMessageWETH( + destinationNetwork, + destinationAddress, + amount, + true, + metadata + ) ) - .to.emit(polygonZkEVMBridgeContract, "BridgeEvent") + .to.emit(sovereignChainBridgeContract, "BridgeEvent") .withArgs( LEAF_TYPE_MESSAGE, originNetwork, @@ -352,27 +367,27 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { ); // check merkle root with SC - const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); - expect(rootSCMainnet).to.be.equal(rootJSMainnet); + const rootSCSovereignChain = await sovereignChainBridgeContract.getRoot(); + expect(rootSCSovereignChain).to.be.equal(rootJSSovereignChain); // check merkle proof const proof = merkleTree.getProofTreeByIndex(0); const index = 0; // verify merkle proof - expect(verifyMerkleProof(leafValue, proof, index, rootSCMainnet)).to.be.equal(true); - expect(await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proof, index, rootSCMainnet)).to.be.equal( - true - ); + expect(verifyMerkleProof(leafValue, proof, index, rootSCSovereignChain)).to.be.equal(true); + expect( + await sovereignChainBridgeContract.verifyMerkleProof(leafValue, proof, index, rootSCSovereignChain) + ).to.be.equal(true); - const computedGlobalExitRoot = calculateGlobalExitRoot(rootJSMainnet, rollupExitRoot); - expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); + const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rootJSSovereignChain); + expect(computedGlobalExitRoot).to.be.equal(await sovereignChainGlobalExitRoot.getLastGlobalExitRoot()); // bridge message without value is fine await expect( - polygonZkEVMBridgeContract.bridgeMessage(destinationNetwork, destinationAddress, true, metadata, {}) + sovereignChainBridgeContract.bridgeMessage(destinationNetwork, destinationAddress, true, metadata, {}) ) - .to.emit(polygonZkEVMBridgeContract, "BridgeEvent") + .to.emit(sovereignChainBridgeContract, "BridgeEvent") .withArgs( LEAF_TYPE_MESSAGE, originNetwork, @@ -385,9 +400,9 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { ); }); - it("should PolygonZkEVM bridge asset and message to check global exit root updates", async () => { - const depositCount = await polygonZkEVMBridgeContract.depositCount(); - const originNetwork = networkIDMainnet; + it("should SovereignChain bridge asset and message to check global exit root updates", async () => { + const depositCount = await sovereignChainBridgeContract.depositCount(); + const originNetwork = networkIDRollup2; const tokenAddress = polTokenContract.target; const amount = ethers.parseEther("10"); const destinationNetwork = networkIDRollup; @@ -397,14 +412,14 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); const balanceDeployer = await polTokenContract.balanceOf(deployer.address); - const balanceBridge = await polTokenContract.balanceOf(polygonZkEVMBridgeContract.target); + const balanceBridge = await polTokenContract.balanceOf(sovereignChainBridgeContract.target); - const rollupExitRoot = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); + const mainnetExitRoot = ethers.ZeroHash; // create a new deposit - await expect(polTokenContract.approve(polygonZkEVMBridgeContract.target, amount)) + await expect(polTokenContract.approve(sovereignChainBridgeContract.target, amount)) .to.emit(polTokenContract, "Approval") - .withArgs(deployer.address, polygonZkEVMBridgeContract.target, amount); + .withArgs(deployer.address, sovereignChainBridgeContract.target, amount); // pre compute root merkle tree in Js const height = 32; @@ -419,10 +434,10 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { metadataHash ); merkleTree.add(leafValue); - const rootJSMainnet = merkleTree.getRoot(); + const rootJSSovereignChain = merkleTree.getRoot(); await expect( - polygonZkEVMBridgeContract.bridgeAsset( + sovereignChainBridgeContract.bridgeAsset( destinationNetwork, destinationAddress, amount, @@ -431,7 +446,7 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { "0x" ) ) - .to.emit(polygonZkEVMBridgeContract, "BridgeEvent") + .to.emit(sovereignChainBridgeContract, "BridgeEvent") .withArgs( LEAF_TYPE_ASSET, originNetwork, @@ -444,41 +459,41 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { ); expect(await polTokenContract.balanceOf(deployer.address)).to.be.equal(balanceDeployer - amount); - expect(await polTokenContract.balanceOf(polygonZkEVMBridgeContract.target)).to.be.equal(balanceBridge + amount); - expect(await polygonZkEVMBridgeContract.lastUpdatedDepositCount()).to.be.equal(0); - expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(ethers.ZeroHash); + expect(await polTokenContract.balanceOf(sovereignChainBridgeContract.target)).to.be.equal( + balanceBridge + amount + ); + expect(await sovereignChainBridgeContract.lastUpdatedDepositCount()).to.be.equal(0); + expect(await sovereignChainGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(ethers.ZeroHash); // check merkle root with SC - const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); - expect(rootSCMainnet).to.be.equal(rootJSMainnet); + const rootSCSovereignChain = await sovereignChainBridgeContract.getRoot(); + expect(rootSCSovereignChain).to.be.equal(rootJSSovereignChain); // Update global exit root - await expect(polygonZkEVMBridgeContract.updateGlobalExitRoot()) - .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") - .withArgs(rootJSMainnet, rollupExitRoot); + await expect(sovereignChainBridgeContract.updateGlobalExitRoot()); // no state changes since there are not any deposit pending to be updated - await polygonZkEVMBridgeContract.updateGlobalExitRoot(); - expect(await polygonZkEVMBridgeContract.lastUpdatedDepositCount()).to.be.equal(1); - expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(rootJSMainnet); + await sovereignChainBridgeContract.updateGlobalExitRoot(); + expect(await sovereignChainBridgeContract.lastUpdatedDepositCount()).to.be.equal(1); + expect(await sovereignChainGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(mainnetExitRoot); - const computedGlobalExitRoot = calculateGlobalExitRoot(rootJSMainnet, rollupExitRoot); - expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); + const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rootJSSovereignChain); + expect(computedGlobalExitRoot).to.be.equal(await sovereignChainGlobalExitRoot.getLastGlobalExitRoot()); // bridge message await expect( - polygonZkEVMBridgeContract.bridgeMessage(destinationNetwork, destinationAddress, false, metadata, { + sovereignChainBridgeContract.bridgeMessage(destinationNetwork, destinationAddress, false, metadata, { value: amount, }) - ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "NoValueInMessagesOnGasTokenNetworks"); + ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "NoValueInMessagesOnGasTokenNetworks"); // Mock mint weth - await ethers.provider.send("hardhat_impersonateAccount", [polygonZkEVMBridgeContract.target]); - const bridgeMock = await ethers.getSigner(polygonZkEVMBridgeContract.target as any); + await ethers.provider.send("hardhat_impersonateAccount", [sovereignChainBridgeContract.target]); + const bridgeMock = await ethers.getSigner(sovereignChainBridgeContract.target as any); await WETHToken.connect(bridgeMock).mint(deployer.address, amount, {gasPrice: 0}); await expect( - polygonZkEVMBridgeContract.bridgeMessageWETH( + sovereignChainBridgeContract.bridgeMessageWETH( destinationNetwork, destinationAddress, amount, @@ -486,7 +501,7 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { metadata ) ) - .to.emit(polygonZkEVMBridgeContract, "BridgeEvent") + .to.emit(sovereignChainBridgeContract, "BridgeEvent") .withArgs( LEAF_TYPE_MESSAGE, originNetwork, @@ -497,17 +512,14 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { metadata, 1 ); - expect(await polygonZkEVMBridgeContract.lastUpdatedDepositCount()).to.be.equal(1); - expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(rootJSMainnet); + expect(await sovereignChainBridgeContract.lastUpdatedDepositCount()).to.be.equal(1); + expect(await sovereignChainGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(mainnetExitRoot); // Update global exit root - await expect(polygonZkEVMBridgeContract.updateGlobalExitRoot()).to.emit( - polygonZkEVMGlobalExitRoot, - "UpdateGlobalExitRoot" - ); + await sovereignChainBridgeContract.updateGlobalExitRoot(); - expect(await polygonZkEVMBridgeContract.lastUpdatedDepositCount()).to.be.equal(2); - expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.not.be.equal(rootJSMainnet); + expect(await sovereignChainBridgeContract.lastUpdatedDepositCount()).to.be.equal(2); + expect(await sovereignChainGlobalExitRoot.lastMainnetExitRoot()).to.not.be.equal(rootJSSovereignChain); // Just to have the metric of a low cost bridge Asset const tokenAddress2 = WETHToken.target; // Ether @@ -515,7 +527,7 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { await WETHToken.connect(bridgeMock).mint(deployer.address, amount2, {gasPrice: 0}); await expect( - polygonZkEVMBridgeContract.bridgeAsset( + sovereignChainBridgeContract.bridgeAsset( destinationNetwork, destinationAddress, amount2, @@ -524,10 +536,10 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { "0x" ) ) - .to.emit(polygonZkEVMBridgeContract, "BridgeEvent") + .to.emit(sovereignChainBridgeContract, "BridgeEvent") .withArgs( LEAF_TYPE_ASSET, - originNetwork, + 0, // weth bridge ethers.ZeroAddress, destinationNetwork, destinationAddress, @@ -539,155 +551,17 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { .withArgs(deployer.address, ethers.ZeroAddress, amount2); }); - it("should claim Gas tokens from Mainnet to Mainnet", async () => { - const originNetwork = networkIDMainnet; - const tokenAddress = polTokenContract.target; - const amount = ethers.parseEther("10"); - const destinationNetwork = networkIDMainnet; - const destinationAddress = acc1.address; - - const metadata = metadataToken; - const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); - - const rollupExitRoot = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); - - // compute root merkle tree in Js - const height = 32; - const merkleTreeLocal = new MerkleTreeBridge(height); - const leafValue = getLeafValue( - LEAF_TYPE_ASSET, - originNetwork, - tokenAddress, - destinationNetwork, - destinationAddress, - amount, - metadataHash - ); - merkleTreeLocal.add(leafValue); - - const mainnetExitRoot = merkleTreeLocal.getRoot(); - const indexRollup = 0; - - // check only rollup account with update rollup exit root - await expect(polygonZkEVMGlobalExitRoot.updateExitRoot(mainnetExitRoot)).to.be.revertedWithCustomError( - polygonZkEVMGlobalExitRoot, - "OnlyAllowedContracts" - ); - - // add rollup Merkle root - await ethers.provider.send("hardhat_impersonateAccount", [polygonZkEVMBridgeContract.target]); - const bridgemoCK = await ethers.getSigner(polygonZkEVMBridgeContract.target as any); - - // await deployer.sendTransaction({ - // to: bridgemoCK.address, - // value: ethers.parseEther("1"), - // }); - - await expect(polygonZkEVMGlobalExitRoot.connect(bridgemoCK).updateExitRoot(mainnetExitRoot, {gasPrice: 0})) - .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") - .withArgs(mainnetExitRoot, rollupExitRoot); - - // check roots - const rollupExitRootSC = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); - expect(rollupExitRootSC).to.be.equal(rollupExitRoot); - const mainnetExitRootSC = await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot(); - expect(mainnetExitRootSC).to.be.equal(mainnetExitRoot); - - const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC); - expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); - - // check merkle proof - - // Merkle proof local - const indexLocal = 0; - const proofLocal = merkleTreeLocal.getProofTreeByIndex(indexLocal); - - // verify merkle proof - expect(verifyMerkleProof(leafValue, proofLocal, indexLocal, mainnetExitRoot)).to.be.equal(true); - - const globalIndex = computeGlobalIndex(indexLocal, indexRollup, true); - - /* - * claim - * Can't claim without native (ether) - */ - await expect( - polygonZkEVMBridgeContract.claimAsset( - proofLocal, - proofLocal, - globalIndex, - mainnetExitRoot, - rollupExitRootSC, - originNetwork, - tokenAddress, - destinationNetwork, - destinationAddress, - amount, - metadata - ) - ).to.be.reverted; - - await setBalance(polygonZkEVMBridgeContract.target as any, amount); - - expect(false).to.be.equal(await polygonZkEVMBridgeContract.isClaimed(indexLocal, indexRollup + 1)); - - const initialBalance = await ethers.provider.getBalance(polygonZkEVMBridgeContract.target); - - await expect( - polygonZkEVMBridgeContract.claimAsset( - proofLocal, - proofLocal, - globalIndex, - mainnetExitRoot, - rollupExitRootSC, - originNetwork, - tokenAddress, - destinationNetwork, - destinationAddress, - amount, - metadata, - { - gasPrice: 0, - } - ) - ) - .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") - .withArgs(globalIndex, originNetwork, tokenAddress, destinationAddress, amount); - - // Can't claim because nullifier - await expect( - polygonZkEVMBridgeContract.claimAsset( - proofLocal, - proofLocal, - globalIndex, - mainnetExitRoot, - rollupExitRootSC, - originNetwork, - tokenAddress, - destinationNetwork, - destinationAddress, - amount, - metadata - ) - ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "AlreadyClaimed"); - expect(true).to.be.equal(await polygonZkEVMBridgeContract.isClaimed(indexLocal, indexRollup + 1)); - - expect(initialBalance - amount).to.be.equal( - await ethers.provider.getBalance(polygonZkEVMBridgeContract.target) - ); - }); - - it("should claim tokens Gas tokens from Mainnet to Mainnet", async () => { + it("should claim Gas tokens from SovereignChain to SovereignChain", async () => { const originNetwork = networkIDMainnet; const tokenAddress = polTokenContract.target; const amount = ethers.parseEther("10"); - const destinationNetwork = networkIDMainnet; + const destinationNetwork = networkIDRollup2; const destinationAddress = acc1.address; const metadata = metadataToken; const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); - const mainnetExitRoot = await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot(); + const mainnetExitRoot = ethers.ZeroHash; // compute root merkle tree in Js const height = 32; @@ -705,7 +579,6 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { const rootLocalRollup = merkleTreeLocal.getRoot(); const indexRollup = 5; - // Try claim with 10 rollup leafs const merkleTreeRollup = new MerkleTreeBridge(height); for (let i = 0; i < 10; i++) { @@ -715,53 +588,57 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { merkleTreeRollup.add(ethers.toBeHex(ethers.toQuantity(ethers.randomBytes(32)), 32)); } } - const rootRollup = merkleTreeRollup.getRoot(); - // check only rollup account with update rollup exit root - await expect(polygonZkEVMGlobalExitRoot.updateExitRoot(rootRollup)).to.be.revertedWithCustomError( - polygonZkEVMGlobalExitRoot, + await expect(sovereignChainGlobalExitRoot.updateExitRoot(rootRollup)).to.be.revertedWithCustomError( + sovereignChainGlobalExitRoot, "OnlyAllowedContracts" ); // add rollup Merkle root - await expect(polygonZkEVMGlobalExitRoot.connect(rollupManager).updateExitRoot(rootRollup)) - .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") - .withArgs(mainnetExitRoot, rootRollup); + await ethers.provider.send("hardhat_impersonateAccount", [sovereignChainBridgeContract.target]); + const bridgeMock = await ethers.getSigner(sovereignChainBridgeContract.target as any); + + await sovereignChainGlobalExitRoot.connect(bridgeMock).updateExitRoot(rootRollup, {gasPrice: 0}); // check roots - const rollupExitRootSC = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); - expect(rollupExitRootSC).to.be.equal(rootRollup); + const sovereignChainExitRootSC = await sovereignChainGlobalExitRoot.lastRollupExitRoot(); + expect(sovereignChainExitRootSC).to.be.equal(rootRollup); + const mainnetExitRootSC = await sovereignChainGlobalExitRoot.lastMainnetExitRoot(); + expect(mainnetExitRootSC).to.be.equal(mainnetExitRoot); - const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC); - expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); + const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rootRollup); + expect(computedGlobalExitRoot).to.be.equal(await sovereignChainGlobalExitRoot.getLastGlobalExitRoot()); + // Insert global exit root + expect(await sovereignChainGlobalExitRoot.insertGlobalExitRoot(computedGlobalExitRoot)) + .to.emit(sovereignChainGlobalExitRoot, "InsertGlobalExitRoot") + .withArgs(computedGlobalExitRoot); // check merkle proof // Merkle proof local const indexLocal = 0; const proofLocal = merkleTreeLocal.getProofTreeByIndex(indexLocal); - // Merkle proof local + // Merkle proof rollup const proofRollup = merkleTreeRollup.getProofTreeByIndex(indexRollup); // verify merkle proof + expect(verifyMerkleProof(leafValue, proofLocal, indexLocal, rootLocalRollup)).to.be.equal(true); expect(verifyMerkleProof(rootLocalRollup, proofRollup, indexRollup, rootRollup)).to.be.equal(true); - expect( - await polygonZkEVMBridgeContract.verifyMerkleProof(rootLocalRollup, proofRollup, indexRollup, rootRollup) - ).to.be.equal(true); const globalIndex = computeGlobalIndex(indexLocal, indexRollup, false); + /* * claim - * Can't claim without tokens + * Can't claim without native (ether) */ await expect( - polygonZkEVMBridgeContract.claimAsset( + sovereignChainBridgeContract.claimAsset( proofLocal, proofRollup, - Number(globalIndex), - mainnetExitRoot, - rollupExitRootSC, + globalIndex, + rootLocalRollup, + sovereignChainExitRootSC, originNetwork, tokenAddress, destinationNetwork, @@ -771,36 +648,41 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { ) ).to.be.reverted; - await setBalance(polygonZkEVMBridgeContract.target as any, amount); + await setBalance(sovereignChainBridgeContract.target as any, amount); - expect(false).to.be.equal(await polygonZkEVMBridgeContract.isClaimed(indexLocal, indexRollup + 1)); + expect(false).to.be.equal(await sovereignChainBridgeContract.isClaimed(indexLocal, indexRollup + 1)); + + const initialBalance = await ethers.provider.getBalance(sovereignChainBridgeContract.target); await expect( - polygonZkEVMBridgeContract.claimAsset( + sovereignChainBridgeContract.claimAsset( proofLocal, proofRollup, globalIndex, mainnetExitRoot, - rollupExitRootSC, + sovereignChainExitRootSC, originNetwork, tokenAddress, destinationNetwork, destinationAddress, amount, - metadata + metadata, + { + gasPrice: 0, + } ) ) - .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") + .to.emit(sovereignChainBridgeContract, "ClaimEvent") .withArgs(globalIndex, originNetwork, tokenAddress, destinationAddress, amount); // Can't claim because nullifier await expect( - polygonZkEVMBridgeContract.claimAsset( + sovereignChainBridgeContract.claimAsset( proofLocal, proofRollup, globalIndex, mainnetExitRoot, - rollupExitRootSC, + sovereignChainExitRootSC, originNetwork, tokenAddress, destinationNetwork, @@ -808,21 +690,25 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { amount, metadata ) - ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "AlreadyClaimed"); - expect(true).to.be.equal(await polygonZkEVMBridgeContract.isClaimed(indexLocal, indexRollup + 1)); + ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "AlreadyClaimed"); + expect(true).to.be.equal(await sovereignChainBridgeContract.isClaimed(indexLocal, indexRollup + 1)); + + expect(initialBalance - amount).to.be.equal( + await ethers.provider.getBalance(sovereignChainBridgeContract.target) + ); }); - it("should claim tokens from Rollup to Mainnet", async () => { + it("should claim tokens from SovereignChain to SovereignChain2", async () => { const originNetwork = networkIDRollup; const tokenAddress = polTokenContract.target; const amount = ethers.parseEther("10"); - const destinationNetwork = networkIDMainnet; + const destinationNetwork = networkIDRollup2; const destinationAddress = deployer.address; const metadata = metadataToken; const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); - const mainnetExitRoot = await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot(); + const mainnetExitRoot = await sovereignChainGlobalExitRoot.lastMainnetExitRoot(); // compute root merkle tree in Js const height = 32; @@ -850,23 +736,27 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { const rootRollup = merkleTreeRollup.getRoot(); // check only rollup account with update rollup exit root - await expect(polygonZkEVMGlobalExitRoot.updateExitRoot(rootRollup)).to.be.revertedWithCustomError( - polygonZkEVMGlobalExitRoot, + await expect(sovereignChainGlobalExitRoot.updateExitRoot(rootRollup)).to.be.revertedWithCustomError( + sovereignChainGlobalExitRoot, "OnlyAllowedContracts" ); // add rollup Merkle root - await expect(polygonZkEVMGlobalExitRoot.connect(rollupManager).updateExitRoot(rootRollup)) - .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") - .withArgs(mainnetExitRoot, rootRollup); + await ethers.provider.send("hardhat_impersonateAccount", [sovereignChainBridgeContract.target]); + const bridgeMock = await ethers.getSigner(sovereignChainBridgeContract.target as any); + await sovereignChainGlobalExitRoot.connect(bridgeMock).updateExitRoot(rootRollup, {gasPrice: 0}); // check roots - const rollupExitRootSC = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); + const rollupExitRootSC = await sovereignChainGlobalExitRoot.lastRollupExitRoot(); expect(rollupExitRootSC).to.be.equal(rootRollup); const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC); - expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); + expect(computedGlobalExitRoot).to.be.equal(await sovereignChainGlobalExitRoot.getLastGlobalExitRoot()); + // Insert global exit root + expect(await sovereignChainGlobalExitRoot.insertGlobalExitRoot(computedGlobalExitRoot)) + .to.emit(sovereignChainGlobalExitRoot, "InsertGlobalExitRoot") + .withArgs(computedGlobalExitRoot); // check merkle proof // Merkle proof local @@ -881,20 +771,20 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { expect(verifyMerkleProof(leafValue, proofLocal, indexLocal, rootLocalRollup)).to.be.equal(true); expect(verifyMerkleProof(rootLocalRollup, proofRollup, indexRollup, rootRollup)).to.be.equal(true); expect( - await polygonZkEVMBridgeContract.verifyMerkleProof(rootLocalRollup, proofRollup, indexRollup, rootRollup) + await sovereignChainBridgeContract.verifyMerkleProof(rootLocalRollup, proofRollup, indexRollup, rootRollup) ).to.be.equal(true); const globalIndex = computeGlobalIndex(indexLocal, indexRollup, false); - expect(false).to.be.equal(await polygonZkEVMBridgeContract.isClaimed(indexLocal, indexRollup + 1)); + expect(false).to.be.equal(await sovereignChainBridgeContract.isClaimed(indexLocal, indexRollup + 1)); // claim const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped"); // create2 parameters const salt = ethers.solidityPackedKeccak256(["uint32", "address"], [networkIDRollup, tokenAddress]); - const minimalBytecodeProxy = await polygonZkEVMBridgeContract.BASE_INIT_BYTECODE_WRAPPED_TOKEN(); + const minimalBytecodeProxy = await sovereignChainBridgeContract.BASE_INIT_BYTECODE_WRAPPED_TOKEN(); const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataToken]); const precalculateWrappedErc20 = await ethers.getCreate2Address( - polygonZkEVMBridgeContract.target as string, + sovereignChainBridgeContract.target as string, salt, hashInitCode ); @@ -902,7 +792,7 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { // Use precalculatedWrapperAddress and check if matches expect( - await polygonZkEVMBridgeContract.precalculatedWrapperAddress( + await sovereignChainBridgeContract.precalculatedWrapperAddress( networkIDRollup, tokenAddress, tokenName, @@ -912,7 +802,7 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { ).to.be.equal(precalculateWrappedErc20); await expect( - polygonZkEVMBridgeContract.claimAsset( + sovereignChainBridgeContract.claimAsset( proofLocal, proofRollup, globalIndex, @@ -926,25 +816,25 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { metadata ) ) - .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") + .to.emit(sovereignChainBridgeContract, "ClaimEvent") .withArgs(globalIndex, originNetwork, tokenAddress, destinationAddress, amount) - .to.emit(polygonZkEVMBridgeContract, "NewWrappedToken") + .to.emit(sovereignChainBridgeContract, "NewWrappedToken") .withArgs(originNetwork, tokenAddress, precalculateWrappedErc20, metadata) .to.emit(newWrappedToken, "Transfer") .withArgs(ethers.ZeroAddress, destinationAddress, amount); - const newTokenInfo = await polygonZkEVMBridgeContract.wrappedTokenToTokenInfo(precalculateWrappedErc20); + const newTokenInfo = await sovereignChainBridgeContract.wrappedTokenToTokenInfo(precalculateWrappedErc20); expect(newTokenInfo.originNetwork).to.be.equal(networkIDRollup); expect(newTokenInfo.originTokenAddress).to.be.equal(tokenAddress); - expect(await polygonZkEVMBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal( + expect(await sovereignChainBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal( precalculateWrappedErc20 ); - expect(await polygonZkEVMBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal( + expect(await sovereignChainBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal( precalculateWrappedErc20 ); - expect(await polygonZkEVMBridgeContract.tokenInfoToWrappedToken(salt)).to.be.equal(precalculateWrappedErc20); + expect(await sovereignChainBridgeContract.tokenInfoToWrappedToken(salt)).to.be.equal(precalculateWrappedErc20); // Check the wrapper info expect(await newWrappedToken.name()).to.be.equal(tokenName); @@ -953,7 +843,7 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { // Can't claim because nullifier await expect( - polygonZkEVMBridgeContract.claimAsset( + sovereignChainBridgeContract.claimAsset( proofLocal, proofRollup, globalIndex, @@ -966,8 +856,8 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { amount, metadata ) - ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "AlreadyClaimed"); - expect(true).to.be.equal(await polygonZkEVMBridgeContract.isClaimed(indexLocal, indexRollup + 1)); + ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "AlreadyClaimed"); + expect(true).to.be.equal(await sovereignChainBridgeContract.isClaimed(indexLocal, indexRollup + 1)); expect(await newWrappedToken.totalSupply()).to.be.equal(amount); @@ -980,7 +870,7 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { const globalIndex2 = computeGlobalIndex(index2, indexRollup, false); await expect( - polygonZkEVMBridgeContract.claimAsset( + sovereignChainBridgeContract.claimAsset( proof2, proofRollup, globalIndex2, @@ -994,22 +884,22 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { metadata ) ) - .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") + .to.emit(sovereignChainBridgeContract, "ClaimEvent") .withArgs(globalIndex2, originNetwork, tokenAddress, destinationAddress, amount) .to.emit(newWrappedToken, "Transfer") .withArgs(ethers.ZeroAddress, destinationAddress, amount); // Burn Tokens - const depositCount = await polygonZkEVMBridgeContract.depositCount(); + const depositCount = await sovereignChainBridgeContract.depositCount(); const wrappedTokenAddress = newWrappedToken.target; const newDestinationNetwork = networkIDRollup; - const rollupExitRoot = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); + const rollupExitRoot = await sovereignChainGlobalExitRoot.lastRollupExitRoot(); // create a new deposit - await expect(newWrappedToken.approve(polygonZkEVMBridgeContract.target, amount)) + await expect(newWrappedToken.approve(sovereignChainBridgeContract.target, amount)) .to.emit(newWrappedToken, "Approval") - .withArgs(deployer.address, polygonZkEVMBridgeContract.target, amount); + .withArgs(deployer.address, sovereignChainBridgeContract.target, amount); /* * pre compute root merkle tree in Js @@ -1030,7 +920,7 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { amount, metadataHashMainnet ); - const leafValueMainnetSC = await polygonZkEVMBridgeContract.getLeafValue( + const leafValueMainnetSC = await sovereignChainBridgeContract.getLeafValue( LEAF_TYPE_ASSET, originNetwork, originTokenAddress, @@ -1042,13 +932,13 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { expect(leafValueMainnet).to.be.equal(leafValueMainnetSC); merkleTreeMainnet.add(leafValueMainnet); - const rootJSMainnet = merkleTreeMainnet.getRoot(); + const rootJSMainnet = ethers.ZeroHash; // Tokens are burnt expect(await newWrappedToken.totalSupply()).to.be.equal(amount * 2n); expect(await newWrappedToken.balanceOf(destinationAddress)).to.be.equal(amount * 2n); await expect( - polygonZkEVMBridgeContract.bridgeAsset( + sovereignChainBridgeContract.bridgeAsset( newDestinationNetwork, destinationAddress, amount, @@ -1057,7 +947,7 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { "0x" ) ) - .to.emit(polygonZkEVMBridgeContract, "BridgeEvent") + .to.emit(sovereignChainBridgeContract, "BridgeEvent") .withArgs( LEAF_TYPE_ASSET, originNetwork, @@ -1068,40 +958,38 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { metadataMainnet, depositCount ) - .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") - .withArgs(rootJSMainnet, rollupExitRoot) .to.emit(newWrappedToken, "Transfer") .withArgs(deployer.address, ethers.ZeroAddress, amount); expect(await newWrappedToken.totalSupply()).to.be.equal(amount); expect(await newWrappedToken.balanceOf(deployer.address)).to.be.equal(amount); - expect(await newWrappedToken.balanceOf(polygonZkEVMBridgeContract.target)).to.be.equal(0); + expect(await newWrappedToken.balanceOf(sovereignChainBridgeContract.target)).to.be.equal(0); // check merkle root with SC - const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); - expect(rootSCMainnet).to.be.equal(rootJSMainnet); + const rootSCSovereignChain = await sovereignChainBridgeContract.getRoot(); // check merkle proof const proofMainnet = merkleTreeMainnet.getProofTreeByIndex(0); const indexMainnet = 0; // verify merkle proof - expect(verifyMerkleProof(leafValueMainnet, proofMainnet, indexMainnet, rootSCMainnet)).to.be.equal(true); + expect(verifyMerkleProof(leafValueMainnet, proofMainnet, indexMainnet, rootSCSovereignChain)).to.be.equal(true); expect( - await polygonZkEVMBridgeContract.verifyMerkleProof( + await sovereignChainBridgeContract.verifyMerkleProof( leafValueMainnet, proofMainnet, indexMainnet, - rootSCMainnet + rootSCSovereignChain ) ).to.be.equal(true); - const computedGlobalExitRoot2 = calculateGlobalExitRoot(rootJSMainnet, rollupExitRoot); - expect(computedGlobalExitRoot2).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); + const rollupExitRoot2 = await sovereignChainGlobalExitRoot.lastRollupExitRoot(); + const computedGlobalExitRoot2 = calculateGlobalExitRoot(rootJSMainnet, rollupExitRoot2); + expect(computedGlobalExitRoot2).to.be.equal(await sovereignChainGlobalExitRoot.getLastGlobalExitRoot()); }); it("should PolygonZkEVMBridge and sync the current root with events", async () => { - const depositCount = await polygonZkEVMBridgeContract.depositCount(); + const depositCount = await sovereignChainBridgeContract.depositCount(); const originNetwork = networkIDMainnet; const tokenAddress = ethers.ZeroAddress; // gasToken const amount = ethers.parseEther("10"); @@ -1112,7 +1000,7 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { // create 3 new deposit await expect( - polygonZkEVMBridgeContract.bridgeAsset( + sovereignChainBridgeContract.bridgeAsset( destinationNetwork, destinationAddress, amount, @@ -1122,7 +1010,7 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { {value: amount} ) ) - .to.emit(polygonZkEVMBridgeContract, "BridgeEvent") + .to.emit(sovereignChainBridgeContract, "BridgeEvent") .withArgs( LEAF_TYPE_ASSET, originNetwork, @@ -1135,7 +1023,7 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { ); await expect( - polygonZkEVMBridgeContract.bridgeAsset( + sovereignChainBridgeContract.bridgeAsset( destinationNetwork, destinationAddress, amount, @@ -1145,7 +1033,7 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { {value: amount} ) ) - .to.emit(polygonZkEVMBridgeContract, "BridgeEvent") + .to.emit(sovereignChainBridgeContract, "BridgeEvent") .withArgs( LEAF_TYPE_ASSET, originNetwork, @@ -1158,7 +1046,7 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { ); await expect( - polygonZkEVMBridgeContract.bridgeAsset( + sovereignChainBridgeContract.bridgeAsset( destinationNetwork, destinationAddress, amount, @@ -1168,7 +1056,7 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { {value: amount} ) ) - .to.emit(polygonZkEVMBridgeContract, "BridgeEvent") + .to.emit(sovereignChainBridgeContract, "BridgeEvent") .withArgs( LEAF_TYPE_ASSET, originNetwork, @@ -1185,7 +1073,7 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { const merkleTree = new MerkleTreeBridge(height); // Get the deposit's events - const filter = polygonZkEVMBridgeContract.filters.BridgeEvent( + const filter = sovereignChainBridgeContract.filters.BridgeEvent( undefined, undefined, undefined, @@ -1195,7 +1083,7 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { undefined, undefined ); - const events = await polygonZkEVMBridgeContract.queryFilter(filter, 0, "latest"); + const events = await sovereignChainBridgeContract.queryFilter(filter, 0, "latest"); events.forEach((e) => { const {args} = e; const leafValue = getLeafValue( @@ -1211,7 +1099,7 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { }); // Check merkle root with SC - const rootSC = await polygonZkEVMBridgeContract.getRoot(); + const rootSC = await sovereignChainBridgeContract.getRoot(); const rootJS = merkleTree.getRoot(); expect(rootSC).to.be.equal(rootJS); @@ -1222,13 +1110,13 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { const originNetwork = networkIDMainnet; const tokenAddress = polTokenContract.target; const amount = ethers.parseEther("10"); - const destinationNetwork = networkIDMainnet; + const destinationNetwork = networkIDRollup2; const destinationAddress = deployer.address; const metadata = metadataToken; const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); - const mainnetExitRoot = await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot(); + const mainnetExitRoot = await sovereignChainGlobalExitRoot.lastMainnetExitRoot(); // compute root merkle tree in Js const height = 32; @@ -1253,16 +1141,20 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { const rollupRoot = merkleTreeRollup.getRoot(); // add rollup Merkle root - await expect(polygonZkEVMGlobalExitRoot.connect(rollupManager).updateExitRoot(rollupRoot)) - .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") - .withArgs(mainnetExitRoot, rollupRoot); + await ethers.provider.send("hardhat_impersonateAccount", [sovereignChainBridgeContract.target]); + const bridgeMock = await ethers.getSigner(sovereignChainBridgeContract.target as any); + await sovereignChainGlobalExitRoot.connect(bridgeMock).updateExitRoot(rollupRoot, {gasPrice: 0}); // check roots - const rollupExitRootSC = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); + const rollupExitRootSC = await sovereignChainGlobalExitRoot.lastRollupExitRoot(); expect(rollupExitRootSC).to.be.equal(rollupRoot); const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC); - expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); + expect(computedGlobalExitRoot).to.be.equal(await sovereignChainGlobalExitRoot.getLastGlobalExitRoot()); + // Insert global exit root + expect(await sovereignChainGlobalExitRoot.insertGlobalExitRoot(computedGlobalExitRoot)) + .to.emit(sovereignChainGlobalExitRoot, "InsertGlobalExitRoot") + .withArgs(computedGlobalExitRoot); // check merkle proof const index = 0; @@ -1272,13 +1164,13 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { // verify merkle proof expect(verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup)).to.be.equal(true); expect( - await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup) + await sovereignChainBridgeContract.verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup) ).to.be.equal(true); const globalIndex = computeGlobalIndex(index, index, false); // Can't claim without tokens await expect( - polygonZkEVMBridgeContract.claimAsset( + sovereignChainBridgeContract.claimAsset( proofLocal, proofRollup, globalIndex, @@ -1293,28 +1185,11 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { ) ).to.be.reverted; - await setBalance(polygonZkEVMBridgeContract.target as any, amount); - - // Check Destination network does not match assert - // await expect( - // polygonZkEVMBridgeContract.claimAsset( - // proofLocal, - // proofRollup, - // globalIndex, - // mainnetExitRoot, - // rollupExitRootSC, - // originNetwork, - // tokenAddress, - // destinationNetwork, - // destinationAddress, - // amount, - // metadata - // ) - // ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "DestinationNetworkInvalid"); + await setBalance(sovereignChainBridgeContract.target as any, amount); // Check GlobalExitRoot invalid assert await expect( - polygonZkEVMBridgeContract.claimAsset( + sovereignChainBridgeContract.claimAsset( proofLocal, proofRollup, globalIndex, @@ -1327,11 +1202,11 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { amount, metadata ) - ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "GlobalExitRootInvalid"); + ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "GlobalExitRootInvalid"); // Check Invalid smt proof assert await expect( - polygonZkEVMBridgeContract.claimAsset( + sovereignChainBridgeContract.claimAsset( proofLocal, proofRollup, globalIndex + 1n, @@ -1344,10 +1219,10 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { amount, metadata ) - ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "InvalidSmtProof"); + ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "InvalidSmtProof"); await expect( - polygonZkEVMBridgeContract.claimAsset( + sovereignChainBridgeContract.claimAsset( proofLocal, proofRollup, globalIndex, @@ -1361,12 +1236,12 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { metadata ) ) - .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") + .to.emit(sovereignChainBridgeContract, "ClaimEvent") .withArgs(index, originNetwork, tokenAddress, destinationAddress, amount); // Check Already claimed_claim await expect( - polygonZkEVMBridgeContract.claimAsset( + sovereignChainBridgeContract.claimAsset( proofLocal, proofRollup, globalIndex, @@ -1379,7 +1254,7 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { amount, metadata ) - ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "AlreadyClaimed"); + ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "AlreadyClaimed"); }); it("should claim ether", async () => { @@ -1387,13 +1262,13 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { const originNetwork = networkIDMainnet; const tokenAddress = ethers.ZeroAddress; // ether const amount = ethers.parseEther("10"); - const destinationNetwork = networkIDMainnet; + const destinationNetwork = networkIDRollup2; const destinationAddress = deployer.address; const metadata = "0x"; // since is ether does not have metadata const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); - const mainnetExitRoot = await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot(); + const mainnetExitRoot = await sovereignChainGlobalExitRoot.lastMainnetExitRoot(); // compute root merkle tree in Js const height = 32; @@ -1416,16 +1291,20 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { const rollupRoot = merkleTreeRollup.getRoot(); // add rollup Merkle root - await expect(polygonZkEVMGlobalExitRoot.connect(rollupManager).updateExitRoot(rollupRoot)) - .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") - .withArgs(mainnetExitRoot, rollupRoot); + await ethers.provider.send("hardhat_impersonateAccount", [sovereignChainBridgeContract.target]); + const bridgeMock = await ethers.getSigner(sovereignChainBridgeContract.target as any); + await sovereignChainGlobalExitRoot.connect(bridgeMock).updateExitRoot(rollupRoot, {gasPrice: 0}); // check roots - const rollupExitRootSC = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); + const rollupExitRootSC = await sovereignChainGlobalExitRoot.lastRollupExitRoot(); expect(rollupExitRootSC).to.be.equal(rollupRoot); const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC); - expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); + expect(computedGlobalExitRoot).to.be.equal(await sovereignChainGlobalExitRoot.getLastGlobalExitRoot()); + // Insert global exit root + expect(await sovereignChainGlobalExitRoot.insertGlobalExitRoot(computedGlobalExitRoot)) + .to.emit(sovereignChainGlobalExitRoot, "InsertGlobalExitRoot") + .withArgs(computedGlobalExitRoot); // check merkle proof const index = 0; @@ -1436,12 +1315,12 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { // verify merkle proof expect(verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup)).to.be.equal(true); expect( - await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup) + await sovereignChainBridgeContract.verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup) ).to.be.equal(true); // claim weth await expect( - polygonZkEVMBridgeContract.claimAsset( + sovereignChainBridgeContract.claimAsset( proofLocal, proofRollup, globalIndex, @@ -1455,7 +1334,7 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { metadata ) ) - .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") + .to.emit(sovereignChainBridgeContract, "ClaimEvent") .withArgs(index, originNetwork, tokenAddress, destinationAddress, amount) .to.emit(WETHToken, "Transfer") .withArgs(ethers.ZeroAddress, deployer.address, amount); @@ -1466,7 +1345,7 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { // Can't claim because nullifier await expect( - polygonZkEVMBridgeContract.claimAsset( + sovereignChainBridgeContract.claimAsset( proofLocal, proofRollup, globalIndex, @@ -1479,7 +1358,7 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { amount, metadata ) - ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "AlreadyClaimed"); + ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "AlreadyClaimed"); }); it("should claim message", async () => { @@ -1487,13 +1366,13 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { const originNetwork = networkIDMainnet; const tokenAddress = ethers.ZeroAddress; // ether const amount = ethers.parseEther("10"); - const destinationNetwork = networkIDMainnet; + const destinationNetwork = networkIDRollup2; const destinationAddress = deployer.address; const metadata = "0x176923791298713271763697869132"; // since is ether does not have metadata const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); - const mainnetExitRoot = await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot(); + const mainnetExitRoot = await sovereignChainGlobalExitRoot.lastMainnetExitRoot(); // compute root merkle tree in Js const height = 32; @@ -1516,17 +1395,20 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { const rollupRoot = merkleTreeRollup.getRoot(); // add rollup Merkle root - await expect(polygonZkEVMGlobalExitRoot.connect(rollupManager).updateExitRoot(rollupRoot)) - .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") - .withArgs(mainnetExitRoot, rollupRoot); + await ethers.provider.send("hardhat_impersonateAccount", [sovereignChainBridgeContract.target]); + const bridgeMock = await ethers.getSigner(sovereignChainBridgeContract.target as any); + await sovereignChainGlobalExitRoot.connect(bridgeMock).updateExitRoot(rollupRoot, {gasPrice: 0}); // check roots - const rollupExitRootSC = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); + const rollupExitRootSC = await sovereignChainGlobalExitRoot.lastRollupExitRoot(); expect(rollupExitRootSC).to.be.equal(rollupRoot); const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC); - expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); - + expect(computedGlobalExitRoot).to.be.equal(await sovereignChainGlobalExitRoot.getLastGlobalExitRoot()); + // Insert global exit root + expect(await sovereignChainGlobalExitRoot.insertGlobalExitRoot(computedGlobalExitRoot)) + .to.emit(sovereignChainGlobalExitRoot, "InsertGlobalExitRoot") + .withArgs(computedGlobalExitRoot); // check merkle proof const index = 0; const proofLocal = merkleTree.getProofTreeByIndex(0); @@ -1536,7 +1418,7 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { // verify merkle proof expect(verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup)).to.be.equal(true); expect( - await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup) + await sovereignChainBridgeContract.verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup) ).to.be.equal(true); /* @@ -1544,7 +1426,7 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { * Can't claim a message as an assets */ await expect( - polygonZkEVMBridgeContract.claimAsset( + sovereignChainBridgeContract.claimAsset( proofLocal, proofRollup, globalIndex, @@ -1557,13 +1439,13 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { amount, metadata ) - ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "InvalidSmtProof"); + ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "InvalidSmtProof"); const balanceDeployer = await ethers.provider.getBalance(deployer.address); // Check mainnet destination assert await expect( - polygonZkEVMBridgeContract.claimAsset( + sovereignChainBridgeContract.claimAsset( proofLocal, proofRollup, globalIndex, @@ -1576,10 +1458,10 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { amount, metadata ) - ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "InvalidSmtProof"); + ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "InvalidSmtProof"); await expect( - polygonZkEVMBridgeContract.claimMessage( + sovereignChainBridgeContract.claimMessage( proofLocal, proofRollup, globalIndex, @@ -1593,7 +1475,7 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { metadata ) ) - .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") + .to.emit(sovereignChainBridgeContract, "ClaimEvent") .withArgs(index, originNetwork, tokenAddress, destinationAddress, amount) .to.emit(WETHToken, "Transfer") .withArgs(ethers.ZeroAddress, deployer.address, amount); @@ -1604,7 +1486,7 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { // Can't claim because nullifier await expect( - polygonZkEVMBridgeContract.claimMessage( + sovereignChainBridgeContract.claimMessage( proofLocal, proofRollup, globalIndex, @@ -1617,6 +1499,6 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { amount, metadata ) - ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "AlreadyClaimed"); + ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "AlreadyClaimed"); }); }); diff --git a/test/contractsv2/BridgeL2SovereignChain.test.ts b/test/contractsv2/BridgeL2SovereignChain.test.ts index a2370eec..b466e58e 100644 --- a/test/contractsv2/BridgeL2SovereignChain.test.ts +++ b/test/contractsv2/BridgeL2SovereignChain.test.ts @@ -1,16 +1,12 @@ import {expect} from "chai"; import {ethers, upgrades} from "hardhat"; import { - VerifierRollupHelperMock, ERC20PermitMock, - PolygonRollupManagerMock, GlobalExitRootManagerL2SovereignChain, BridgeL2SovereignChain, TokenWrapped, } from "../../typechain-types"; -import {takeSnapshot, time} from "@nomicfoundation/hardhat-network-helpers"; import {processorUtils, contractUtils, MTBridge, mtBridgeUtils} from "@0xpolygonhermez/zkevm-commonjs"; -const {calculateSnarkInput, calculateAccInputHash, calculateBatchHashData} = contractUtils; const MerkleTreeBridge = MTBridge; const {verifyMerkleProof, getLeafValue} = mtBridgeUtils; @@ -715,7 +711,7 @@ describe("BridgeL2SovereignChain Contract", () => { const indexLocal = 0; const proofLocal = merkleTreeLocal.getProofTreeByIndex(indexLocal); - // Merkle proof local + // Merkle proof rollup const proofRollup = merkleTreeRollup.getProofTreeByIndex(indexRollup); // verify merkle proof