@@ -25,6 +25,7 @@ import {
25
25
getBlock ,
26
26
FUEL_CALL_TX_PARAMS ,
27
27
hardhatSkipTime ,
28
+ fuels_parseEther ,
28
29
} from '@fuel-bridge/test-utils' ;
29
30
import chai from 'chai' ;
30
31
import { toBeHex , parseEther } from 'ethers' ;
@@ -36,6 +37,8 @@ import type {
36
37
MessageProof ,
37
38
} from 'fuels' ;
38
39
40
+ import { fundWithdrawalTransactionWithBaseAssetResource } from '../utils/utils' ;
41
+
39
42
const { expect } = chai ;
40
43
41
44
describe ( 'Bridging ERC20 tokens' , async function ( ) {
@@ -64,7 +67,8 @@ describe('Bridging ERC20 tokens', async function () {
64
67
fuelTokenSender : FuelWallet ,
65
68
ethereumTokenReceiverAddress : string ,
66
69
NUM_TOKENS : bigint ,
67
- DECIMAL_DIFF : bigint
70
+ DECIMAL_DIFF : bigint ,
71
+ useMessageCoin : boolean
68
72
) : Promise < MessageProof > {
69
73
// withdraw tokens back to the base chain
70
74
fuel_bridge . account = fuelTokenSender ;
@@ -73,24 +77,22 @@ describe('Bridging ERC20 tokens', async function () {
73
77
const fuelTokenSenderBalance = await fuelTokenSender . getBalance (
74
78
fuel_testAssetId
75
79
) ;
76
- const transactionRequest = await fuel_bridge . functions
77
- . withdraw ( paddedAddress )
78
- . addContracts ( [ fuel_bridge , fuel_bridgeImpl ] )
79
- . txParams ( {
80
- tip : 0 ,
81
- maxFee : 1 ,
82
- } )
83
- . callParams ( {
84
- forward : {
85
- amount : new BN ( NUM_TOKENS . toString ( ) ) . div (
86
- new BN ( DECIMAL_DIFF . toString ( ) )
87
- ) ,
88
- assetId : fuel_testAssetId ,
89
- } ,
90
- } )
91
- . fundWithRequiredCoins ( ) ;
80
+
81
+ const transactionRequest =
82
+ await fundWithdrawalTransactionWithBaseAssetResource (
83
+ env ,
84
+ fuel_bridge ,
85
+ fuelTokenSender ,
86
+ paddedAddress ,
87
+ NUM_TOKENS ,
88
+ 9n ,
89
+ fuel_bridgeImpl ,
90
+ fuel_testAssetId ,
91
+ useMessageCoin
92
+ ) ;
92
93
93
94
const tx = await fuelTokenSender . sendTransaction ( transactionRequest ) ;
95
+
94
96
const fWithdrawTxResult = await tx . waitForResult ( ) ;
95
97
expect ( fWithdrawTxResult . status ) . to . equal ( 'success' ) ;
96
98
@@ -347,6 +349,59 @@ describe('Bridging ERC20 tokens', async function () {
347
349
) ;
348
350
} ) ;
349
351
352
+ it ( 'Bridge ETH to Fuel to be used as Message Coin during token withdrawal' , async ( ) => {
353
+ // use the FuelMessagePortal to directly send ETH which should be immediately spendable
354
+ const tx = await env . eth . fuelMessagePortal
355
+ . connect ( ethereumTokenSender )
356
+ . depositETH ( fuelTokenReceiverAddress , {
357
+ value : parseEther ( '1' ) ,
358
+ } ) ;
359
+ const receipt = await tx . wait ( ) ;
360
+ expect ( receipt . status ) . to . equal ( 1 ) ;
361
+
362
+ // parse events from logs
363
+ const filter = env . eth . fuelMessagePortal . filters . MessageSent (
364
+ null , // Args set to null since there should be just 1 event for MessageSent
365
+ null ,
366
+ null ,
367
+ null ,
368
+ null
369
+ ) ;
370
+
371
+ const [ event , ...restOfEvents ] =
372
+ await env . eth . fuelMessagePortal . queryFilter (
373
+ filter ,
374
+ receipt . blockNumber ,
375
+ receipt . blockNumber
376
+ ) ;
377
+ expect ( restOfEvents . length ) . to . be . eq ( 0 ) ; // Should be only 1 event
378
+
379
+ const fuelETHMessageNonce = new BN ( event . args . nonce . toString ( ) ) ;
380
+
381
+ fuelTokenMessageReceiver = fuelTokenReceiver . address ;
382
+
383
+ // wait for message to appear in fuel client
384
+ expect (
385
+ await waitForMessage (
386
+ env . fuel . provider ,
387
+ fuelTokenMessageReceiver ,
388
+ fuelETHMessageNonce ,
389
+ FUEL_MESSAGE_TIMEOUT_MS
390
+ )
391
+ ) . to . not . be . null ;
392
+
393
+ // verify the incoming messages generated when base asset is minted on fuel
394
+ const incomingMessagesonFuel = await env . fuel . signers [ 0 ] . getMessages ( ) ;
395
+
396
+ // eth as bridged once at the start
397
+ expect ( incomingMessagesonFuel . messages . length === 1 ) . to . be . true ;
398
+
399
+ // 1 eth was bridged
400
+ expect (
401
+ incomingMessagesonFuel . messages [ 0 ] . amount . eq ( fuels_parseEther ( '1' ) )
402
+ ) . to . be . true ;
403
+ } ) ;
404
+
350
405
it ( 'Bridge ERC20 token with permit via FuelERC20Gateway' , async ( ) => {
351
406
const tokenName = await eth_permitTestToken . name ( ) ;
352
407
const tokenAddress = await eth_permitTestToken . getAddress ( ) ;
@@ -591,7 +646,8 @@ describe('Bridging ERC20 tokens', async function () {
591
646
fuelTokenSender ,
592
647
ethereumTokenReceiverAddress ,
593
648
NUM_TOKENS ,
594
- DECIMAL_DIFF
649
+ DECIMAL_DIFF ,
650
+ true
595
651
) ;
596
652
} ) ;
597
653
@@ -726,7 +782,8 @@ describe('Bridging ERC20 tokens', async function () {
726
782
fuelTokenSender ,
727
783
ethereumTokenReceiverAddress ,
728
784
NUM_TOKENS ,
729
- DECIMAL_DIFF
785
+ DECIMAL_DIFF ,
786
+ false
730
787
) ;
731
788
732
789
// relay message
0 commit comments