|
|
|
@ -38,7 +38,7 @@ contract FailingIsm is IInterchainSecurityModule { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
contract InterchainAccountRouterTest is Test { |
|
|
|
|
contract InterchainAccountRouterTestBase is Test { |
|
|
|
|
using TypeCasts for address; |
|
|
|
|
|
|
|
|
|
event InterchainAccountCreated( |
|
|
|
@ -55,8 +55,8 @@ contract InterchainAccountRouterTest is Test { |
|
|
|
|
|
|
|
|
|
TestInterchainGasPaymaster internal igp; |
|
|
|
|
InterchainAccountIsm internal icaIsm; |
|
|
|
|
InterchainAccountRouter internal originRouter; |
|
|
|
|
InterchainAccountRouter internal destinationRouter; |
|
|
|
|
InterchainAccountRouter internal originIcaRouter; |
|
|
|
|
InterchainAccountRouter internal destinationIcaRouter; |
|
|
|
|
bytes32 internal ismOverride; |
|
|
|
|
bytes32 internal routerOverride; |
|
|
|
|
uint256 gasPaymentQuote; |
|
|
|
@ -90,7 +90,7 @@ contract InterchainAccountRouterTest is Test { |
|
|
|
|
return InterchainAccountRouter(address(proxy)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function setUp() public { |
|
|
|
|
function setUp() public virtual { |
|
|
|
|
environment = new MockHyperlaneEnvironment(origin, destination); |
|
|
|
|
|
|
|
|
|
igp = new TestInterchainGasPaymaster(); |
|
|
|
@ -104,13 +104,13 @@ contract InterchainAccountRouterTest is Test { |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
address owner = address(this); |
|
|
|
|
originRouter = deployProxiedIcaRouter( |
|
|
|
|
originIcaRouter = deployProxiedIcaRouter( |
|
|
|
|
environment.mailboxes(origin), |
|
|
|
|
environment.igps(destination), |
|
|
|
|
icaIsm, |
|
|
|
|
owner |
|
|
|
|
); |
|
|
|
|
destinationRouter = deployProxiedIcaRouter( |
|
|
|
|
destinationIcaRouter = deployProxiedIcaRouter( |
|
|
|
|
environment.mailboxes(destination), |
|
|
|
|
environment.igps(destination), |
|
|
|
|
icaIsm, |
|
|
|
@ -119,47 +119,55 @@ contract InterchainAccountRouterTest is Test { |
|
|
|
|
|
|
|
|
|
environment.mailboxes(origin).setDefaultHook(address(igp)); |
|
|
|
|
|
|
|
|
|
routerOverride = TypeCasts.addressToBytes32(address(destinationRouter)); |
|
|
|
|
routerOverride = TypeCasts.addressToBytes32( |
|
|
|
|
address(destinationIcaRouter) |
|
|
|
|
); |
|
|
|
|
ismOverride = TypeCasts.addressToBytes32( |
|
|
|
|
address(environment.isms(destination)) |
|
|
|
|
); |
|
|
|
|
ica = destinationRouter.getLocalInterchainAccount( |
|
|
|
|
ica = destinationIcaRouter.getLocalInterchainAccount( |
|
|
|
|
origin, |
|
|
|
|
address(this), |
|
|
|
|
address(originRouter), |
|
|
|
|
address(originIcaRouter), |
|
|
|
|
address(environment.isms(destination)) |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
target = new Callable(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
receive() external payable {} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
contract InterchainAccountRouterTest is InterchainAccountRouterTestBase { |
|
|
|
|
using TypeCasts for address; |
|
|
|
|
|
|
|
|
|
function testFuzz_constructor(address _localOwner) public { |
|
|
|
|
OwnableMulticall _account = destinationRouter |
|
|
|
|
OwnableMulticall _account = destinationIcaRouter |
|
|
|
|
.getDeployedInterchainAccount( |
|
|
|
|
origin, |
|
|
|
|
_localOwner, |
|
|
|
|
address(originRouter), |
|
|
|
|
address(originIcaRouter), |
|
|
|
|
address(environment.isms(destination)) |
|
|
|
|
); |
|
|
|
|
assertEq(_account.owner(), address(destinationRouter)); |
|
|
|
|
assertEq(_account.owner(), address(destinationIcaRouter)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function testFuzz_getRemoteInterchainAccount( |
|
|
|
|
address _localOwner, |
|
|
|
|
address _ism |
|
|
|
|
) public { |
|
|
|
|
address _account = originRouter.getRemoteInterchainAccount( |
|
|
|
|
address _account = originIcaRouter.getRemoteInterchainAccount( |
|
|
|
|
address(_localOwner), |
|
|
|
|
address(destinationRouter), |
|
|
|
|
address(destinationIcaRouter), |
|
|
|
|
_ism |
|
|
|
|
); |
|
|
|
|
originRouter.enrollRemoteRouterAndIsm( |
|
|
|
|
originIcaRouter.enrollRemoteRouterAndIsm( |
|
|
|
|
destination, |
|
|
|
|
routerOverride, |
|
|
|
|
TypeCasts.addressToBytes32(_ism) |
|
|
|
|
); |
|
|
|
|
assertEq( |
|
|
|
|
originRouter.getRemoteInterchainAccount( |
|
|
|
|
originIcaRouter.getRemoteInterchainAccount( |
|
|
|
|
destination, |
|
|
|
|
address(_localOwner) |
|
|
|
|
), |
|
|
|
@ -184,16 +192,16 @@ contract InterchainAccountRouterTest is Test { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// act |
|
|
|
|
originRouter.enrollRemoteRouters(domains, routers); |
|
|
|
|
originIcaRouter.enrollRemoteRouters(domains, routers); |
|
|
|
|
|
|
|
|
|
// assert |
|
|
|
|
uint32[] memory actualDomains = originRouter.domains(); |
|
|
|
|
uint32[] memory actualDomains = originIcaRouter.domains(); |
|
|
|
|
assertEq(actualDomains.length, domains.length); |
|
|
|
|
assertEq(abi.encode(originRouter.domains()), abi.encode(domains)); |
|
|
|
|
assertEq(abi.encode(originIcaRouter.domains()), abi.encode(domains)); |
|
|
|
|
|
|
|
|
|
for (uint256 i = 0; i < count; i++) { |
|
|
|
|
bytes32 actualRouter = originRouter.routers(domains[i]); |
|
|
|
|
bytes32 actualIsm = originRouter.isms(domains[i]); |
|
|
|
|
bytes32 actualRouter = originIcaRouter.routers(domains[i]); |
|
|
|
|
bytes32 actualIsm = originIcaRouter.isms(domains[i]); |
|
|
|
|
|
|
|
|
|
assertEq(actualRouter, routers[i]); |
|
|
|
|
assertEq(actualIsm, bytes32(0)); |
|
|
|
@ -208,17 +216,17 @@ contract InterchainAccountRouterTest is Test { |
|
|
|
|
vm.assume(router != bytes32(0)); |
|
|
|
|
|
|
|
|
|
// arrange pre-condition |
|
|
|
|
bytes32 actualRouter = originRouter.routers(destination); |
|
|
|
|
bytes32 actualIsm = originRouter.isms(destination); |
|
|
|
|
bytes32 actualRouter = originIcaRouter.routers(destination); |
|
|
|
|
bytes32 actualIsm = originIcaRouter.isms(destination); |
|
|
|
|
assertEq(actualRouter, bytes32(0)); |
|
|
|
|
assertEq(actualIsm, bytes32(0)); |
|
|
|
|
|
|
|
|
|
// act |
|
|
|
|
originRouter.enrollRemoteRouterAndIsm(destination, router, ism); |
|
|
|
|
originIcaRouter.enrollRemoteRouterAndIsm(destination, router, ism); |
|
|
|
|
|
|
|
|
|
// assert |
|
|
|
|
actualRouter = originRouter.routers(destination); |
|
|
|
|
actualIsm = originRouter.isms(destination); |
|
|
|
|
actualRouter = originIcaRouter.routers(destination); |
|
|
|
|
actualIsm = originIcaRouter.isms(destination); |
|
|
|
|
assertEq(actualRouter, router); |
|
|
|
|
assertEq(actualIsm, ism); |
|
|
|
|
} |
|
|
|
@ -234,17 +242,21 @@ contract InterchainAccountRouterTest is Test { |
|
|
|
|
destinations.length != isms.length |
|
|
|
|
) { |
|
|
|
|
vm.expectRevert(bytes("length mismatch")); |
|
|
|
|
originRouter.enrollRemoteRouterAndIsms(destinations, routers, isms); |
|
|
|
|
originIcaRouter.enrollRemoteRouterAndIsms( |
|
|
|
|
destinations, |
|
|
|
|
routers, |
|
|
|
|
isms |
|
|
|
|
); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// act |
|
|
|
|
originRouter.enrollRemoteRouterAndIsms(destinations, routers, isms); |
|
|
|
|
originIcaRouter.enrollRemoteRouterAndIsms(destinations, routers, isms); |
|
|
|
|
|
|
|
|
|
// assert |
|
|
|
|
for (uint256 i = 0; i < destinations.length; i++) { |
|
|
|
|
bytes32 actualRouter = originRouter.routers(destinations[i]); |
|
|
|
|
bytes32 actualIsm = originRouter.isms(destinations[i]); |
|
|
|
|
bytes32 actualRouter = originIcaRouter.routers(destinations[i]); |
|
|
|
|
bytes32 actualIsm = originIcaRouter.isms(destinations[i]); |
|
|
|
|
assertEq(actualRouter, routers[i]); |
|
|
|
|
assertEq(actualIsm, isms[i]); |
|
|
|
|
} |
|
|
|
@ -259,13 +271,13 @@ contract InterchainAccountRouterTest is Test { |
|
|
|
|
vm.assume(routerA != bytes32(0) && routerB != bytes32(0)); |
|
|
|
|
|
|
|
|
|
// act |
|
|
|
|
originRouter.enrollRemoteRouterAndIsm(destination, routerA, ismA); |
|
|
|
|
originIcaRouter.enrollRemoteRouterAndIsm(destination, routerA, ismA); |
|
|
|
|
|
|
|
|
|
// assert |
|
|
|
|
vm.expectRevert( |
|
|
|
|
bytes("router and ISM defaults are immutable once set") |
|
|
|
|
); |
|
|
|
|
originRouter.enrollRemoteRouterAndIsm(destination, routerB, ismB); |
|
|
|
|
originIcaRouter.enrollRemoteRouterAndIsm(destination, routerB, ismB); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function testFuzz_enrollRemoteRouterAndIsmNonOwner( |
|
|
|
@ -273,14 +285,16 @@ contract InterchainAccountRouterTest is Test { |
|
|
|
|
bytes32 router, |
|
|
|
|
bytes32 ism |
|
|
|
|
) public { |
|
|
|
|
vm.assume(newOwner != address(0) && newOwner != originRouter.owner()); |
|
|
|
|
vm.assume( |
|
|
|
|
newOwner != address(0) && newOwner != originIcaRouter.owner() |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
// act |
|
|
|
|
originRouter.transferOwnership(newOwner); |
|
|
|
|
originIcaRouter.transferOwnership(newOwner); |
|
|
|
|
|
|
|
|
|
// assert |
|
|
|
|
vm.expectRevert(bytes("Ownable: caller is not the owner")); |
|
|
|
|
originRouter.enrollRemoteRouterAndIsm(destination, router, ism); |
|
|
|
|
originIcaRouter.enrollRemoteRouterAndIsm(destination, router, ism); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function getCalls( |
|
|
|
@ -300,7 +314,7 @@ contract InterchainAccountRouterTest is Test { |
|
|
|
|
|
|
|
|
|
function assertRemoteCallReceived(bytes32 data) private { |
|
|
|
|
assertEq(target.data(address(this)), bytes32(0)); |
|
|
|
|
vm.expectEmit(true, true, false, true, address(destinationRouter)); |
|
|
|
|
vm.expectEmit(true, true, false, true, address(destinationIcaRouter)); |
|
|
|
|
emit InterchainAccountCreated( |
|
|
|
|
origin, |
|
|
|
|
address(this).addressToBytes32(), |
|
|
|
@ -325,16 +339,15 @@ contract InterchainAccountRouterTest is Test { |
|
|
|
|
address owner |
|
|
|
|
) public { |
|
|
|
|
// act |
|
|
|
|
ica = destinationRouter.getDeployedInterchainAccount( |
|
|
|
|
ica = destinationIcaRouter.getDeployedInterchainAccount( |
|
|
|
|
origin, |
|
|
|
|
owner, |
|
|
|
|
address(originRouter), |
|
|
|
|
address(originIcaRouter), |
|
|
|
|
address(environment.isms(destination)) |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
(uint32 domain, bytes32 ownerBytes) = destinationRouter.accountOwners( |
|
|
|
|
address(ica) |
|
|
|
|
); |
|
|
|
|
(uint32 domain, bytes32 ownerBytes) = destinationIcaRouter |
|
|
|
|
.accountOwners(address(ica)); |
|
|
|
|
// assert |
|
|
|
|
assertEq(domain, origin); |
|
|
|
|
assertEq(ownerBytes, owner.addressToBytes32()); |
|
|
|
@ -342,19 +355,19 @@ contract InterchainAccountRouterTest is Test { |
|
|
|
|
|
|
|
|
|
function test_quoteGasPayment() public { |
|
|
|
|
// arrange |
|
|
|
|
originRouter.enrollRemoteRouterAndIsm( |
|
|
|
|
originIcaRouter.enrollRemoteRouterAndIsm( |
|
|
|
|
destination, |
|
|
|
|
routerOverride, |
|
|
|
|
ismOverride |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
// assert |
|
|
|
|
assertEq(originRouter.quoteGasPayment(destination), gasPaymentQuote); |
|
|
|
|
assertEq(originIcaRouter.quoteGasPayment(destination), gasPaymentQuote); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function test_quoteGasPayment_gasLimitOverride() public { |
|
|
|
|
// arrange |
|
|
|
|
originRouter.enrollRemoteRouterAndIsm( |
|
|
|
|
originIcaRouter.enrollRemoteRouterAndIsm( |
|
|
|
|
destination, |
|
|
|
|
routerOverride, |
|
|
|
|
ismOverride |
|
|
|
@ -362,14 +375,18 @@ contract InterchainAccountRouterTest is Test { |
|
|
|
|
|
|
|
|
|
// assert |
|
|
|
|
assertEq( |
|
|
|
|
originRouter.quoteGasPayment(destination, "", GAS_LIMIT_OVERRIDE), |
|
|
|
|
originIcaRouter.quoteGasPayment( |
|
|
|
|
destination, |
|
|
|
|
"", |
|
|
|
|
GAS_LIMIT_OVERRIDE |
|
|
|
|
), |
|
|
|
|
igp.quoteGasPayment(destination, GAS_LIMIT_OVERRIDE) |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function testFuzz_singleCallRemoteWithDefault(bytes32 data) public { |
|
|
|
|
// arrange |
|
|
|
|
originRouter.enrollRemoteRouterAndIsm( |
|
|
|
|
originIcaRouter.enrollRemoteRouterAndIsm( |
|
|
|
|
destination, |
|
|
|
|
routerOverride, |
|
|
|
|
ismOverride |
|
|
|
@ -378,7 +395,7 @@ contract InterchainAccountRouterTest is Test { |
|
|
|
|
|
|
|
|
|
// act |
|
|
|
|
CallLib.Call[] memory calls = getCalls(data); |
|
|
|
|
originRouter.callRemote{value: gasPaymentQuote}( |
|
|
|
|
originIcaRouter.callRemote{value: gasPaymentQuote}( |
|
|
|
|
destination, |
|
|
|
|
TypeCasts.bytes32ToAddress(calls[0].to), |
|
|
|
|
calls[0].value, |
|
|
|
@ -393,7 +410,7 @@ contract InterchainAccountRouterTest is Test { |
|
|
|
|
|
|
|
|
|
function testFuzz_callRemoteWithDefault(bytes32 data) public { |
|
|
|
|
// arrange |
|
|
|
|
originRouter.enrollRemoteRouterAndIsm( |
|
|
|
|
originIcaRouter.enrollRemoteRouterAndIsm( |
|
|
|
|
destination, |
|
|
|
|
routerOverride, |
|
|
|
|
ismOverride |
|
|
|
@ -401,7 +418,7 @@ contract InterchainAccountRouterTest is Test { |
|
|
|
|
uint256 balanceBefore = address(this).balance; |
|
|
|
|
|
|
|
|
|
// act |
|
|
|
|
originRouter.callRemote{value: gasPaymentQuote}( |
|
|
|
|
originIcaRouter.callRemote{value: gasPaymentQuote}( |
|
|
|
|
destination, |
|
|
|
|
getCalls(data) |
|
|
|
|
); |
|
|
|
@ -414,7 +431,7 @@ contract InterchainAccountRouterTest is Test { |
|
|
|
|
|
|
|
|
|
function testFuzz_overrideAndCallRemote(bytes32 data) public { |
|
|
|
|
// arrange |
|
|
|
|
originRouter.enrollRemoteRouterAndIsm( |
|
|
|
|
originIcaRouter.enrollRemoteRouterAndIsm( |
|
|
|
|
destination, |
|
|
|
|
routerOverride, |
|
|
|
|
ismOverride |
|
|
|
@ -422,7 +439,7 @@ contract InterchainAccountRouterTest is Test { |
|
|
|
|
uint256 balanceBefore = address(this).balance; |
|
|
|
|
|
|
|
|
|
// act |
|
|
|
|
originRouter.callRemote{value: gasPaymentQuote}( |
|
|
|
|
originIcaRouter.callRemote{value: gasPaymentQuote}( |
|
|
|
|
destination, |
|
|
|
|
getCalls(data) |
|
|
|
|
); |
|
|
|
@ -439,7 +456,7 @@ contract InterchainAccountRouterTest is Test { |
|
|
|
|
// assert error |
|
|
|
|
CallLib.Call[] memory calls = getCalls(data); |
|
|
|
|
vm.expectRevert(bytes("no router specified for destination")); |
|
|
|
|
originRouter.callRemote(destination, calls); |
|
|
|
|
originIcaRouter.callRemote(destination, calls); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function testFuzz_customMetadata_forIgp( |
|
|
|
@ -454,7 +471,7 @@ contract InterchainAccountRouterTest is Test { |
|
|
|
|
address(this), |
|
|
|
|
"" |
|
|
|
|
); |
|
|
|
|
originRouter.enrollRemoteRouterAndIsm( |
|
|
|
|
originIcaRouter.enrollRemoteRouterAndIsm( |
|
|
|
|
destination, |
|
|
|
|
routerOverride, |
|
|
|
|
ismOverride |
|
|
|
@ -462,11 +479,9 @@ contract InterchainAccountRouterTest is Test { |
|
|
|
|
uint256 balanceBefore = address(this).balance; |
|
|
|
|
|
|
|
|
|
// act |
|
|
|
|
originRouter.callRemote{value: gasLimit * igp.gasPrice() + overpayment}( |
|
|
|
|
destination, |
|
|
|
|
getCalls(data), |
|
|
|
|
metadata |
|
|
|
|
); |
|
|
|
|
originIcaRouter.callRemote{ |
|
|
|
|
value: gasLimit * igp.gasPrice() + overpayment |
|
|
|
|
}(destination, getCalls(data), metadata); |
|
|
|
|
|
|
|
|
|
// assert |
|
|
|
|
uint256 balanceAfter = address(this).balance; |
|
|
|
@ -488,7 +503,7 @@ contract InterchainAccountRouterTest is Test { |
|
|
|
|
address(this), |
|
|
|
|
"" |
|
|
|
|
); |
|
|
|
|
originRouter.enrollRemoteRouterAndIsm( |
|
|
|
|
originIcaRouter.enrollRemoteRouterAndIsm( |
|
|
|
|
destination, |
|
|
|
|
routerOverride, |
|
|
|
|
ismOverride |
|
|
|
@ -496,7 +511,11 @@ contract InterchainAccountRouterTest is Test { |
|
|
|
|
|
|
|
|
|
// act |
|
|
|
|
vm.expectRevert("IGP: insufficient interchain gas payment"); |
|
|
|
|
originRouter.callRemote{value: payment}(destination, calls, metadata); |
|
|
|
|
originIcaRouter.callRemote{value: payment}( |
|
|
|
|
destination, |
|
|
|
|
calls, |
|
|
|
|
metadata |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function testFuzz_callRemoteWithOverrides_default(bytes32 data) public { |
|
|
|
@ -504,7 +523,7 @@ contract InterchainAccountRouterTest is Test { |
|
|
|
|
uint256 balanceBefore = address(this).balance; |
|
|
|
|
|
|
|
|
|
// act |
|
|
|
|
originRouter.callRemoteWithOverrides{value: gasPaymentQuote}( |
|
|
|
|
originIcaRouter.callRemoteWithOverrides{value: gasPaymentQuote}( |
|
|
|
|
destination, |
|
|
|
|
routerOverride, |
|
|
|
|
ismOverride, |
|
|
|
@ -531,13 +550,9 @@ contract InterchainAccountRouterTest is Test { |
|
|
|
|
uint256 balanceBefore = address(this).balance; |
|
|
|
|
|
|
|
|
|
// act |
|
|
|
|
originRouter.callRemoteWithOverrides{value: gasLimit * igp.gasPrice()}( |
|
|
|
|
destination, |
|
|
|
|
routerOverride, |
|
|
|
|
ismOverride, |
|
|
|
|
getCalls(data), |
|
|
|
|
metadata |
|
|
|
|
); |
|
|
|
|
originIcaRouter.callRemoteWithOverrides{ |
|
|
|
|
value: gasLimit * igp.gasPrice() |
|
|
|
|
}(destination, routerOverride, ismOverride, getCalls(data), metadata); |
|
|
|
|
|
|
|
|
|
// assert |
|
|
|
|
uint256 balanceAfter = address(this).balance; |
|
|
|
@ -553,7 +568,7 @@ contract InterchainAccountRouterTest is Test { |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
// act |
|
|
|
|
originRouter.callRemoteWithOverrides{value: gasPaymentQuote}( |
|
|
|
|
originIcaRouter.callRemoteWithOverrides{value: gasPaymentQuote}( |
|
|
|
|
destination, |
|
|
|
|
routerOverride, |
|
|
|
|
failingIsm, |
|
|
|
@ -573,7 +588,7 @@ contract InterchainAccountRouterTest is Test { |
|
|
|
|
|
|
|
|
|
// act |
|
|
|
|
environment.mailboxes(destination).setDefaultIsm(address(failingIsm)); |
|
|
|
|
originRouter.callRemoteWithOverrides{value: gasPaymentQuote}( |
|
|
|
|
originIcaRouter.callRemoteWithOverrides{value: gasPaymentQuote}( |
|
|
|
|
destination, |
|
|
|
|
routerOverride, |
|
|
|
|
bytes32(0), |
|
|
|
@ -588,20 +603,20 @@ contract InterchainAccountRouterTest is Test { |
|
|
|
|
|
|
|
|
|
function testFuzz_getLocalInterchainAccount(bytes32 data) public { |
|
|
|
|
// check |
|
|
|
|
OwnableMulticall destinationIca = destinationRouter |
|
|
|
|
OwnableMulticall destinationIca = destinationIcaRouter |
|
|
|
|
.getLocalInterchainAccount( |
|
|
|
|
origin, |
|
|
|
|
address(this), |
|
|
|
|
address(originRouter), |
|
|
|
|
address(originIcaRouter), |
|
|
|
|
address(environment.isms(destination)) |
|
|
|
|
); |
|
|
|
|
assertEq( |
|
|
|
|
address(destinationIca), |
|
|
|
|
address( |
|
|
|
|
destinationRouter.getLocalInterchainAccount( |
|
|
|
|
destinationIcaRouter.getLocalInterchainAccount( |
|
|
|
|
origin, |
|
|
|
|
TypeCasts.addressToBytes32(address(this)), |
|
|
|
|
TypeCasts.addressToBytes32(address(originRouter)), |
|
|
|
|
TypeCasts.addressToBytes32(address(originIcaRouter)), |
|
|
|
|
address(environment.isms(destination)) |
|
|
|
|
) |
|
|
|
|
) |
|
|
|
@ -609,7 +624,7 @@ contract InterchainAccountRouterTest is Test { |
|
|
|
|
assertEq(address(destinationIca).code.length, 0); |
|
|
|
|
|
|
|
|
|
// act |
|
|
|
|
originRouter.callRemoteWithOverrides{value: gasPaymentQuote}( |
|
|
|
|
originIcaRouter.callRemoteWithOverrides{value: gasPaymentQuote}( |
|
|
|
|
destination, |
|
|
|
|
routerOverride, |
|
|
|
|
ismOverride, |
|
|
|
@ -631,10 +646,10 @@ contract InterchainAccountRouterTest is Test { |
|
|
|
|
require(success, "transfer before deploy failed"); |
|
|
|
|
|
|
|
|
|
// receive value after deployed |
|
|
|
|
destinationRouter.getDeployedInterchainAccount( |
|
|
|
|
destinationIcaRouter.getDeployedInterchainAccount( |
|
|
|
|
origin, |
|
|
|
|
address(this), |
|
|
|
|
address(originRouter), |
|
|
|
|
address(originIcaRouter), |
|
|
|
|
address(environment.isms(destination)) |
|
|
|
|
); |
|
|
|
|
assert(address(ica).code.length > 0); |
|
|
|
@ -658,7 +673,7 @@ contract InterchainAccountRouterTest is Test { |
|
|
|
|
CallLib.Call[] memory calls = new CallLib.Call[](1); |
|
|
|
|
calls[0] = call; |
|
|
|
|
|
|
|
|
|
originRouter.callRemoteWithOverrides{value: gasPaymentQuote}( |
|
|
|
|
originIcaRouter.callRemoteWithOverrides{value: gasPaymentQuote}( |
|
|
|
|
destination, |
|
|
|
|
routerOverride, |
|
|
|
|
ismOverride, |
|
|
|
@ -668,6 +683,4 @@ contract InterchainAccountRouterTest is Test { |
|
|
|
|
vm.expectCall(address(this), value, data); |
|
|
|
|
environment.processNextPendingMessage(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
receive() external payable {} |
|
|
|
|
} |
|
|
|
|