diff --git a/packages/contracts-bridge/contracts/test/EthereumBridgeRouter.t.sol b/packages/contracts-bridge/contracts/test/EthereumBridgeRouter.t.sol index 14f1859d..91e78e61 100644 --- a/packages/contracts-bridge/contracts/test/EthereumBridgeRouter.t.sol +++ b/packages/contracts-bridge/contracts/test/EthereumBridgeRouter.t.sol @@ -3,6 +3,7 @@ pragma solidity 0.7.6; import {TypeCasts} from "@nomad-xyz/contracts-core/contracts/libs/TypeCasts.sol"; import {BridgeRouterBaseTest} from "./BridgeRouterBase.t.sol"; +import {EventAccountant} from "../accountants/EventAccountant.sol"; contract EthereumBridgeRouterTest is BridgeRouterBaseTest { using TypeCasts for bytes32; @@ -35,21 +36,26 @@ contract EthereumBridgeRouterTest is BridgeRouterBaseTest { vm.expectEmit(true, true, false, true, address(localToken)); emit Transfer(address(bridgeRouter), recipient, amount); bridgeRouter.exposed_giveLocal(address(localToken), amount, recipient); + } + function test_giveLocalAffected() public { + uint256 amount = 1000; + address recipient = address(33); // test with each affected tokens // This checks for events on the mock accountant // Accountant logic is tested separately address payable[14] memory affected = accountant.affectedAssets(); for (uint256 i = 0; i < affected.length; i++) { address a = affected[i]; - vm.expectEmit( - true, - true, - false, - true, - address(bridgeRouter.accountant()) + vm.expectCall( + address(accountant), + abi.encodeWithSelector( + EventAccountant.record.selector, + a, + recipient, + amount + ) ); - emit MockAcctCalled(a, recipient, amount); bridgeRouter.exposed_giveLocal(a, amount, recipient); } } diff --git a/packages/contracts-bridge/contracts/test/utils/BridgeTest.sol b/packages/contracts-bridge/contracts/test/utils/BridgeTest.sol index 98779bbb..be3757ca 100644 --- a/packages/contracts-bridge/contracts/test/utils/BridgeTest.sol +++ b/packages/contracts-bridge/contracts/test/utils/BridgeTest.sol @@ -104,13 +104,9 @@ contract BridgeTestFixture is NomadTest { mockUpdaterPK = 420; mockUpdater = vm.addr(mockUpdaterPK); remoteBridgeRouter = vm.addr(99123).addressToBytes32(); - accountant = NFTRecoveryAccountantHarness( - address(new MockAccountant()) - ); mockHome = new MockHome(homeDomain); home = address(mockHome); mockReplica = address(0xBEEFEFEEFEF); - // Create implementations tokenRegistry = new TokenRegistryHarness(); xAppConnectionManager = new XAppConnectionManager(); @@ -122,6 +118,11 @@ contract BridgeTestFixture is NomadTest { ); // Tests that concern the EThereumBridgeRouter, they will already have called // setUpEthereumBridgeRouter(), which means that the address will not be address(0) + if (address(accountant) == address(0)) { + accountant = NFTRecoveryAccountantHarness( + address(new MockAccountant()) + ); + } if (address(bridgeRouter) == address(0)) { setUpBridgeRouter(); } diff --git a/packages/contracts-ops/contracts/test/Reboot.t.sol b/packages/contracts-ops/contracts/test/Reboot.t.sol index 1c493622..53bc9f3f 100644 --- a/packages/contracts-ops/contracts/test/Reboot.t.sol +++ b/packages/contracts-ops/contracts/test/Reboot.t.sol @@ -8,7 +8,7 @@ import {NomadTest} from "@nomad-xyz/contracts-core/contracts/test/utils/NomadTes contract RebootTest is RebootLogic, NomadTest { string remote; string constant testDomain = "ethereum"; - uint256 constant testDomainBlock = 15_977_624; + uint256 constant testDomainBlock = 16_083_970; function setUpReboot(string memory testName) public { // ALL diff --git a/packages/contracts-ops/contracts/test/RebootEthereumBridgeRouter.t.sol b/packages/contracts-ops/contracts/test/RebootEthereumBridgeRouter.t.sol index bc03feca..71d2fccb 100644 --- a/packages/contracts-ops/contracts/test/RebootEthereumBridgeRouter.t.sol +++ b/packages/contracts-ops/contracts/test/RebootEthereumBridgeRouter.t.sol @@ -8,18 +8,23 @@ import {UpgradeBeacon} from "@nomad-xyz/contracts-core/contracts/upgrade/Upgrade import {NomadTest} from "@nomad-xyz/contracts-core/contracts/test/utils/NomadTest.sol"; import {BridgeTestFixture} from "@nomad-xyz/contracts-bridge/contracts/test/utils/BridgeTest.sol"; import {BridgeRouterBaseTest} from "@nomad-xyz/contracts-bridge/contracts/test/BridgeRouterBase.t.sol"; -import {BridgeRouterTest} from "@nomad-xyz/contracts-bridge/contracts/test/BridgeRouter.t.sol"; +import {EthereumBridgeRouterTest} from "@nomad-xyz/contracts-bridge/contracts/test/EthereumBridgeRouter.t.sol"; +import {NFTRecoveryAccountantHarness} from "@nomad-xyz/contracts-bridge/contracts/test/harness/NFTAccountantHarness.sol"; import {EthereumBridgeRouterHarness} from "@nomad-xyz/contracts-bridge/contracts/test/harness/BridgeRouterHarness.sol"; import {TokenRegistryHarness} from "@nomad-xyz/contracts-bridge/contracts/test/harness/TokenRegistryHarness.sol"; import {IBridgeRouterHarness} from "@nomad-xyz/contracts-bridge/contracts/test/harness/IBridgeRouterHarness.sol"; import {BridgeToken} from "@nomad-xyz/contracts-bridge/contracts/BridgeToken.sol"; import {TokenRegistry} from "@nomad-xyz/contracts-bridge/contracts/TokenRegistry.sol"; -contract EthereumBridgeRouterRebootTest is RebootTest, BridgeRouterTest { +contract EthereumBridgeRouterRebootTest is + RebootTest, + EthereumBridgeRouterTest +{ address bridgeRouterHarnessImpl; + address accountantHarnessImpl; address tokenRegistryHarnessImpl; - function setUp() public override(BridgeRouterBaseTest, NomadTest) { + function setUp() public override(EthereumBridgeRouterTest, NomadTest) { setUpReboot("ethBridgeRouter"); require( keccak256(bytes(localDomainName)) == keccak256(bytes("ethereum")), @@ -34,9 +39,14 @@ contract EthereumBridgeRouterRebootTest is RebootTest, BridgeRouterTest { address(getBridgeRouter(localDomainName)) ); vm.label(address(bridgeRouter), "bridgeRouter"); + accountant = NFTRecoveryAccountantHarness( + address(getAccountant(localDomainName)) + ); + vm.label(address(accountant), "accountant"); // upgrade to harness setUp_upgradeTokenRegistryHarness(); setUp_upgradeBridgeRouterHarness(); + setUp_upgradeAccountantHarness(); // load necessary contracts xAppConnectionManager = getXAppConnectionManager(localDomainName); vm.label(address(xAppConnectionManager), "XAppConnectionManager"); @@ -94,8 +104,36 @@ contract EthereumBridgeRouterRebootTest is RebootTest, BridgeRouterTest { ); } + function setUp_upgradeAccountantHarness() public { + accountantHarnessImpl = address( + new NFTRecoveryAccountantHarness( + address(getBridgeRouter(localDomainName)), + address(getFundsRecipient(localDomainName)) + ) + ); + vm.label(accountantHarnessImpl, "accountantHarnessImpl"); + vm.writeJson( + vm.toString(accountantHarnessImpl), + outputPath, + bridgeAttributePath(localDomainName, "accountant.implementation") + ); + reloadConfig(); + pushSingleUpgrade(accountantUpgrade(localDomainName), localDomainName); + prankExecuteRecoveryManager( + address(getGovernanceRouter(localDomainName)), + getDomainNumber(localDomainName) + ); + } + function test_setUp_rebootBridgeRouter() public { // check that the harnesses have harness methods available + assertEq( + address(accountant), + address( + EthereumBridgeRouterHarness(address(getBridgeRouter(localDomainName))) + .accountant() + ) + ); assertEq( bridgeRouterHarnessImpl, bridgeRouterUpgrade(localDomainName).implementation @@ -104,6 +142,10 @@ contract EthereumBridgeRouterRebootTest is RebootTest, BridgeRouterTest { tokenRegistryHarnessImpl, tokenRegistryUpgrade(localDomainName).implementation ); + assertEq( + accountantHarnessImpl, + accountantUpgrade(localDomainName).implementation + ); bridgeRouter.exposed_dust(address(this)); tokenRegistry.exposed_localDomain(); }