Skip to content

Commit c59e4ca

Browse files
committed
Add tests
1 parent eeb6623 commit c59e4ca

File tree

3 files changed

+101
-2
lines changed

3 files changed

+101
-2
lines changed

contracts/test/strategies/crosschain/_crosschain-helpers.js

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,18 +147,27 @@ const encodeCCTPMessage = (
147147
return `0x${versionStr}${sourceDomainStr}${empty18Bytes}${senderStr}${recipientStr}${empty20Bytes}${messageBodyStr}`;
148148
};
149149

150-
const encodeBurnMessageBody = (sender, recipient, amount, hookData) => {
150+
const encodeBurnMessageBody = (
151+
sender,
152+
recipient,
153+
burnToken,
154+
amount,
155+
hookData
156+
) => {
151157
const senderEncoded = ethers.utils.defaultAbiCoder
152158
.encode(["address"], [sender])
153159
.slice(2);
154160
const recipientEncoded = ethers.utils.defaultAbiCoder
155161
.encode(["address"], [recipient])
156162
.slice(2);
163+
const burnTokenEncoded = ethers.utils.defaultAbiCoder
164+
.encode(["address"], [burnToken])
165+
.slice(2);
157166
const amountEncoded = ethers.utils.defaultAbiCoder
158167
.encode(["uint256"], [amount])
159168
.slice(2);
160169
const encodedHookData = hookData.slice(2);
161-
return `0x00000001${empty16Bytes}${recipientEncoded}${amountEncoded}${senderEncoded}${empty16Bytes.repeat(
170+
return `0x00000001${burnTokenEncoded}${recipientEncoded}${amountEncoded}${senderEncoded}${empty16Bytes.repeat(
162171
3
163172
)}${encodedHookData}`;
164173
};

contracts/test/strategies/crosschain/crosschain-master-strategy.mainnet.fork-test.js

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,7 @@ describe("ForkTest: CrossChainMasterStrategy", function () {
316316
const burnPayload = encodeBurnMessageBody(
317317
crossChainMasterStrategy.address,
318318
crossChainMasterStrategy.address,
319+
addresses.base.USDC,
319320
usdcUnits("2342"),
320321
balancePayload
321322
);
@@ -493,5 +494,57 @@ describe("ForkTest: CrossChainMasterStrategy", function () {
493494
await crossChainMasterStrategy.remoteStrategyBalance();
494495
expect(remoteStrategyBalanceAfter).to.eq(remoteStrategyBalanceBefore);
495496
});
497+
498+
it("Should revert if the burn token is not peer USDC", async function () {
499+
const { crossChainMasterStrategy, strategist } = fixture;
500+
501+
if (await crossChainMasterStrategy.isTransferPending()) {
502+
// Skip if there's a pending transfer
503+
console.log(
504+
"Skipping balance check message fork test because there's a pending transfer"
505+
);
506+
return;
507+
}
508+
509+
// set an arbitrary remote strategy balance
510+
await setRemoteStrategyBalance(
511+
crossChainMasterStrategy,
512+
usdcUnits("123456")
513+
);
514+
515+
const lastNonce = (
516+
await crossChainMasterStrategy.lastTransferNonce()
517+
).toNumber();
518+
519+
// Replace transmitter to mock transmitter
520+
await replaceMessageTransmitter();
521+
522+
// Build check balance payload
523+
const balancePayload = encodeBalanceCheckMessageBody(
524+
lastNonce,
525+
usdcUnits("12345"),
526+
true // withdrawal confirmation
527+
);
528+
const burnPayload = encodeBurnMessageBody(
529+
crossChainMasterStrategy.address,
530+
crossChainMasterStrategy.address,
531+
addresses.mainnet.WETH, // Not peer USDC
532+
usdcUnits("2342"),
533+
balancePayload
534+
);
535+
const message = encodeCCTPMessage(
536+
6,
537+
addresses.CCTPTokenMessengerV2,
538+
addresses.CCTPTokenMessengerV2,
539+
burnPayload
540+
);
541+
542+
// Relay the message with fake attestation
543+
const tx = crossChainMasterStrategy
544+
.connect(strategist)
545+
.relay(message, "0x");
546+
547+
await expect(tx).to.be.revertedWith("Invalid burn token");
548+
});
496549
});
497550
});

contracts/test/strategies/crosschain/crosschain-remote-strategy.base.fork-test.js

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ describe("ForkTest: CrossChainRemoteStrategy", function () {
143143
const burnPayload = encodeBurnMessageBody(
144144
crossChainRemoteStrategy.address,
145145
crossChainRemoteStrategy.address,
146+
addresses.mainnet.USDC,
146147
depositAmount,
147148
depositPayload
148149
);
@@ -246,4 +247,40 @@ describe("ForkTest: CrossChainRemoteStrategy", function () {
246247
);
247248
expect(balanceAfter).to.approxEqual(expectedBalance);
248249
});
250+
251+
it("Should revert if the burn token is not peer USDC", async function () {
252+
const { crossChainRemoteStrategy, strategist } = fixture;
253+
254+
const nonceBefore = await crossChainRemoteStrategy.lastTransferNonce();
255+
256+
const depositAmount = usdcUnits("1234.56");
257+
258+
// Replace transmitter to mock transmitter
259+
await replaceMessageTransmitter();
260+
261+
const nextNonce = nonceBefore.toNumber() + 1;
262+
263+
// Build deposit message
264+
const depositPayload = encodeDepositMessageBody(nextNonce, depositAmount);
265+
const burnPayload = encodeBurnMessageBody(
266+
crossChainRemoteStrategy.address,
267+
crossChainRemoteStrategy.address,
268+
addresses.base.WETH, // Not peer USDC
269+
depositAmount,
270+
depositPayload
271+
);
272+
const message = encodeCCTPMessage(
273+
0,
274+
addresses.CCTPTokenMessengerV2,
275+
addresses.CCTPTokenMessengerV2,
276+
burnPayload
277+
);
278+
279+
// Relay the message
280+
const tx = crossChainRemoteStrategy
281+
.connect(strategist)
282+
.relay(message, "0x");
283+
284+
await expect(tx).to.be.revertedWith("Invalid burn token");
285+
});
249286
});

0 commit comments

Comments
 (0)