@@ -19,6 +19,16 @@ import "forge-std/Test.sol";
19
19
import "openzeppelin-contracts/contracts/access/Ownable.sol " ;
20
20
21
21
contract AxelarTransceiverTest is Test {
22
+ event ContractCall (
23
+ address indexed sender ,
24
+ string destinationChain ,
25
+ string destinationContractAddress ,
26
+ bytes32 indexed payloadHash ,
27
+ bytes payload
28
+ );
29
+
30
+ event AxelarChainIdSet (uint16 chainId , string chainName , string transceiverAddress );
31
+
22
32
address constant OWNER = address (1004 );
23
33
24
34
uint64 constant RATE_LIMIT_DURATION = 0 ;
@@ -34,9 +44,6 @@ contract AxelarTransceiverTest is Test {
34
44
WstEthL2TokenHarness token;
35
45
36
46
function setUp () public {
37
- string memory url = "https://ethereum-sepolia-rpc.publicnode.com " ;
38
- vm.createSelectFork (url);
39
-
40
47
gateway = IAxelarGateway (new MockAxelarGateway ());
41
48
gasService = IAxelarGasService (address (new MockAxelarGasService ()));
42
49
@@ -75,12 +82,31 @@ contract AxelarTransceiverTest is Test {
75
82
string memory chainName = "chainName " ;
76
83
string memory axelarAddress = "axelarAddress " ;
77
84
85
+ vm.expectEmit (address (transceiver));
86
+ emit AxelarChainIdSet (chainId, chainName, axelarAddress);
87
+
78
88
vm.prank (OWNER);
79
89
transceiver.setAxelarChainId (chainId, chainName, axelarAddress);
80
- /*assertEq(transceiver.idToAxelarChainIds(chainId), chainName);
81
- assertEq(transceiver.axelarChainIdToId(chainName),chainId);
82
- assertEq(transceiver.idToAxelarAddress(chainId), axelarAddress);
83
- assertEq(transceiver.axelarAddressToId(axelarAddress), chainId);*/
90
+ }
91
+
92
+ function test_setAxelarChainIdDuplicateChainId () public {
93
+ uint16 chainId = 1 ;
94
+ string memory chainName = "chainName " ;
95
+ string memory axelarAddress = "axelarAddress " ;
96
+
97
+ vm.expectEmit (address (transceiver));
98
+ emit AxelarChainIdSet (chainId, chainName, axelarAddress);
99
+
100
+ vm.prank (OWNER);
101
+ transceiver.setAxelarChainId (chainId, chainName, axelarAddress);
102
+
103
+ vm.prank (OWNER);
104
+ vm.expectRevert (abi.encodeWithSignature ("ChainIdAlreadySet(uint16) " , chainId));
105
+ transceiver.setAxelarChainId (chainId, chainName, axelarAddress);
106
+
107
+ vm.prank (OWNER);
108
+ vm.expectRevert (abi.encodeWithSignature ("AxelarChainIdAlreadySet(string) " , chainName));
109
+ transceiver.setAxelarChainId (chainId + 1 , chainName, axelarAddress);
84
110
}
85
111
86
112
function test_setAxelarChainIdNotOwner () public {
@@ -101,11 +127,18 @@ contract AxelarTransceiverTest is Test {
101
127
bytes32 recipientNttManagerAddress = bytes32 (uint256 (1010 ));
102
128
bytes memory nttManagerMessage = bytes ("nttManagerMessage " );
103
129
bytes32 refundAddress = bytes32 (uint256 (1011 ));
130
+ bytes memory payload = abi.encode (manager, nttManagerMessage, recipientNttManagerAddress);
104
131
TransceiverStructs.TransceiverInstruction memory instruction =
105
132
TransceiverStructs.TransceiverInstruction (0 , bytes ("" ));
106
133
107
134
vm.prank (OWNER);
108
135
transceiver.setAxelarChainId (chainId, chainName, axelarAddress);
136
+
137
+ vm.expectEmit (address (gateway));
138
+ emit ContractCall (
139
+ address (transceiver), chainName, axelarAddress, keccak256 (payload), payload
140
+ );
141
+
109
142
vm.prank (address (manager));
110
143
transceiver.sendMessage (
111
144
chainId, instruction, nttManagerMessage, recipientNttManagerAddress, refundAddress
@@ -167,6 +200,7 @@ contract AxelarTransceiverTest is Test {
167
200
uint16 chainId = 2 ;
168
201
string memory chainName = "chainName " ;
169
202
string memory axelarAddress = "axelarAddress " ;
203
+ bytes32 messageId = bytes32 (uint256 (25 ));
170
204
bytes32 recipientNttManagerAddress = bytes32 (uint256 (uint160 (address (manager))));
171
205
172
206
bytes32 to = bytes32 (uint256 (1234 ));
@@ -184,9 +218,9 @@ contract AxelarTransceiverTest is Test {
184
218
bytes memory nttManagerMessage;
185
219
{
186
220
uint16 length = uint16 (nttPayload.length );
187
- bytes32 messageId = bytes32 (uint256 (0 ));
221
+ bytes32 nttMessageId = bytes32 (uint256 (0 ));
188
222
bytes32 sender = bytes32 (uint256 (1 ));
189
- nttManagerMessage = abi.encodePacked (messageId , sender, length, nttPayload);
223
+ nttManagerMessage = abi.encodePacked (nttMessageId , sender, length, nttPayload);
190
224
}
191
225
192
226
bytes32 sourceNttManagerAddress = bytes32 (uint256 (1012 ));
@@ -201,21 +235,29 @@ contract AxelarTransceiverTest is Test {
201
235
token.setMinter (OWNER);
202
236
vm.prank (OWNER);
203
237
token.mint (address (manager), amount);
238
+ gateway.approveContractCall (messageId, chainName, axelarAddress, keccak256 (payload));
204
239
205
- transceiver.execute (bytes32 ( 0 ) , chainName, axelarAddress, payload);
240
+ transceiver.execute (messageId , chainName, axelarAddress, payload);
206
241
207
242
if (token.balanceOf (fromWormholeFormat (to)) != amount) revert ("Amount Incorrect " );
243
+
244
+ vm.prank (OWNER);
245
+ token.mint (address (manager), amount);
246
+ vm.expectRevert (abi.encodeWithSignature ("NotApprovedByGateway() " ));
247
+ transceiver.execute (bytes32 (0 ), chainName, axelarAddress, payload);
208
248
}
209
249
210
250
function test_executeNotTrustedAddress () public {
211
251
string memory chainName = "chainName " ;
212
252
string memory axelarAddress = "axelarAddress " ;
213
253
bytes memory payload = bytes ("" );
254
+ bytes32 messageId = keccak256 (bytes ("message Id " ));
255
+ gateway.approveContractCall (messageId, chainName, axelarAddress, keccak256 (payload));
214
256
vm.expectRevert (
215
257
abi.encodeWithSignature (
216
258
"InvalidSibling(uint16,string,string) " , 0 , chainName, axelarAddress
217
259
)
218
260
);
219
- transceiver.execute (bytes32 ( 0 ) , chainName, axelarAddress, payload);
261
+ transceiver.execute (messageId , chainName, axelarAddress, payload);
220
262
}
221
263
}
0 commit comments