@circle-fin/bridge-kit 1.5.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,33 @@
1
1
  # @circle-fin/bridge-kit
2
2
 
3
+ ## 1.6.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Add Circle Forwarder support for CCTP v2 bridging.
8
+
9
+ Forwarding is a relay-assisted mode where Circle observes the burn transaction,
10
+ retrieves attestation data, and submits the destination mint on the user's
11
+ behalf. This removes most destination-side orchestration from client code.
12
+
13
+ What this enables:
14
+ - Opt-in forwarding with `useForwarder: true` so Circle handles destination mint
15
+ submission.
16
+ - Forwarder-only destinations (no destination adapter required) using
17
+ `{ recipientAddress, chain, useForwarder: true }`.
18
+ - Forwarding-fee-aware estimation and max-fee calculation when `maxFee` is
19
+ auto-derived.
20
+ - New hook-based burn actions: `cctp.v2.depositForBurnWithHook` and
21
+ `cctp.v2.customBurnWithHook`.
22
+ - New forwarding helpers: `buildForwardingHookData` and
23
+ `buildForwardingHookDataBuffer`.
24
+ - Chain-level forwarding metadata via `cctp.forwarderSupported` for route
25
+ capability checks.
26
+
27
+ Compatibility:
28
+ - Existing non-forwarded bridge flows remain unchanged.
29
+ - If you set `config.maxFee` manually, include any expected forwarding fee.
30
+
3
31
  ## 1.5.0
4
32
 
5
33
  ### Minor Changes
package/README.md CHANGED
@@ -34,19 +34,22 @@ _Making cross-chain stablecoin (USDC, and soon more tokens) transfers as simple
34
34
  - [1. **AdapterContext** - Your Transfer Endpoint](#1-adaptercontext---your-transfer-endpoint)
35
35
  - [2. **BridgeDestination** - Where Funds Go](#2-bridgedestination---where-funds-go)
36
36
  - [3. **BridgeConfig** - Transfer Settings](#3-bridgeconfig---transfer-settings)
37
- - [Complete Example with All Options](#complete-example-with-all-options)
38
37
  - [Bridge Speed Configuration](#bridge-speed-configuration)
39
38
  - [Custom Fees](#custom-fees)
40
39
  - [How Custom Fees Work](#how-custom-fees-work)
41
- - [1000 USDC Transfer Example](#1000-usdc-transfer-example)
40
+ - [1,000 USDC Transfer Example](#1000-usdc-transfer-example)
42
41
  - [Kit-Level Fee Policies](#kit-level-fee-policies)
43
42
  - [Error Handling](#error-handling)
44
43
  - [Retrying Failed Transfers](#retrying-failed-transfers)
45
- - [Examples](#examples)
46
- - [Basic Bridge Operation](#basic-bridge-operation)
47
- - [EVM to Non-EVM Bridge (EVM ↔ Solana)](#evm-to-non-evm-bridge-evm--solana)
48
- - [Third-Party Recipient](#third-party-recipient)
49
- - [Event Monitoring](#event-monitoring)
44
+ - [Method signature](#method-signature)
45
+ - [Basic usage (EVM → EVM)](#basic-usage-evm--evm)
46
+ - [When to retry vs manual intervention](#when-to-retry-vs-manual-intervention)
47
+ - [Limitations](#limitations)
48
+ - [Performance and best practices](#performance-and-best-practices)
49
+ - [Troubleshooting](#troubleshooting)
50
+ - [Forwarder Integration](#forwarder-integration)
51
+ - [Standard Bridge with Forwarder](#standard-bridge-with-forwarder)
52
+ - [Forwarder-Only Destination (No Destination Adapter)](#forwarder-only-destination-no-destination-adapter)
50
53
  - [API Reference](#api-reference)
51
54
  - [Core Methods](#core-methods)
52
55
  - [Bridge Parameters](#bridge-parameters)
@@ -54,8 +57,6 @@ _Making cross-chain stablecoin (USDC, and soon more tokens) transfers as simple
54
57
  - [Building](#building)
55
58
  - [Testing](#testing)
56
59
  - [Local Development](#local-development)
57
- - [Contributing](#contributing)
58
- - [Quick Contribution Steps](#quick-contribution-steps)
59
60
  - [Community \& Support](#community--support)
60
61
  - [License](#license)
61
62
 
@@ -80,6 +81,8 @@ The Bridge Kit enables cross-chain stablecoin transfers via a type-safe, develop
80
81
  - **📡 Real-time event monitoring**: Track progress throughout the transfer lifecycle
81
82
  - **🛡️ Robust error handling**: Graceful partial success recovery
82
83
  - **✈️ Pre-flight validation**: Verify transfers with cost estimation before execution
84
+ - **🤖 Forwarder integration**: Circle's Orbit relayer handles attestation and mint automatically
85
+ - **📭 Forwarder-only destinations**: No destination adapter required - just provide recipient address
83
86
 
84
87
  ## Architecture Flow
85
88
 
@@ -615,6 +618,93 @@ if (result.state === 'error') {
615
618
 
616
619
  > See a runnable example at `examples/basic-usdc-transfer/src/retry.ts` (script: `yarn start:retry`).
617
620
 
621
+ ## Forwarder Integration
622
+
623
+ The Bridge Kit supports Circle's Orbit relayer for automated attestation and mint handling.
624
+ When enabled, the relayer automatically fetches the attestation and submits the mint transaction on the destination chain, simplifying the bridging process.
625
+
626
+ ### Standard Bridge with Forwarder
627
+
628
+ Use `useForwarder: true` when you have adapters for both chains but want Circle to handle the mint transaction:
629
+
630
+ ```typescript
631
+ import { BridgeKit } from '@circle-fin/bridge-kit'
632
+ import { createViemAdapterFromPrivateKey } from '@circle-fin/adapter-viem-v2'
633
+
634
+ const kit = new BridgeKit()
635
+ const adapter = createViemAdapterFromPrivateKey({
636
+ privateKey: process.env.PRIVATE_KEY as `0x${string}`,
637
+ })
638
+
639
+ const result = await kit.bridge({
640
+ from: { adapter, chain: 'Ethereum' },
641
+ to: {
642
+ adapter,
643
+ chain: 'Base',
644
+ useForwarder: true, // Circle handles attestation + mint
645
+ },
646
+ amount: '100.50',
647
+ })
648
+ ```
649
+
650
+ **Benefits:**
651
+
652
+ - No manual attestation polling or destination mint submission
653
+ - Relayer handles destination mint transaction automatically
654
+ - Simplified flow with fewer client-side operations
655
+
656
+ ### Forwarder-Only Destination (No Destination Adapter)
657
+
658
+ When you don't have access to a wallet on the destination chain, use forwarder-only mode.
659
+ This is ideal for server-side transfers, custodial services, or when users don't have a wallet on the destination chain:
660
+
661
+ ```typescript
662
+ const result = await kit.bridge({
663
+ from: { adapter, chain: 'Ethereum' },
664
+ to: {
665
+ recipientAddress: '0x742d35Cc6634C0532925a3b844Bc454e4438f44e', // Recipient on destination
666
+ chain: 'Base',
667
+ useForwarder: true, // Required for forwarder-only
668
+ },
669
+ amount: '100.50',
670
+ })
671
+ ```
672
+
673
+ **Key differences from standard bridging:**
674
+
675
+ - No destination adapter required
676
+ - Mint confirmation is based on IRIS API response (not on-chain receipt)
677
+ - Mint step's `data` field will be `undefined`
678
+
679
+ **Relay fee handling:**
680
+
681
+ - Relay fee is automatically included in `maxFee` estimate
682
+ - Fee is deducted from the minted USDC at mint time
683
+ - Net received = burn amount - relay fee
684
+
685
+ ```typescript
686
+ // Estimate includes relay fee when forwarder is enabled
687
+ const estimate = await kit.estimate({
688
+ from: { adapter, chain: 'Ethereum' },
689
+ to: {
690
+ recipientAddress: '0x...',
691
+ chain: 'Base',
692
+ useForwarder: true,
693
+ },
694
+ amount: '100.50',
695
+ })
696
+
697
+ console.log(estimate.maxFee) // Includes both burn fee and relay fee
698
+ ```
699
+
700
+ > If you provide `config.maxFee` manually, include forwarder fees yourself.
701
+ > Auto-inclusion applies when the kit computes fees from route/speed.
702
+ >
703
+ > You can discover forwarder-capable chains with
704
+ > `kit.getSupportedChains({ forwarderSupported: true })`.
705
+ >
706
+ > See runnable examples at `examples/basic-usdc-transfer/src/forwarder-*.ts`.
707
+
618
708
  ## API Reference
619
709
 
620
710
  ### Core Methods
@@ -650,7 +740,14 @@ type BridgeDestination =
650
740
  | {
651
741
  adapter: Adapter // Adapter for the destination chain
652
742
  chain: ChainIdentifier // Chain identifier
653
- recipientAddress: string // Custom recipient address
743
+ recipientAddress?: string // Custom recipient address
744
+ useForwarder?: boolean // Enable Circle's Orbit relayer
745
+ }
746
+ | {
747
+ // Forwarder-only destination (no adapter required)
748
+ recipientAddress: string // Required: where to receive USDC
749
+ chain: ChainIdentifier // Chain identifier
750
+ useForwarder: true // Required: must be true
654
751
  }
655
752
  ```
656
753
 
package/chains.cjs CHANGED
@@ -302,6 +302,10 @@ defineChain({
302
302
  confirmations: 1,
303
303
  },
304
304
  },
305
+ forwarderSupported: {
306
+ source: false,
307
+ destination: false,
308
+ },
305
309
  },
306
310
  });
307
311
 
@@ -335,6 +339,10 @@ defineChain({
335
339
  confirmations: 1,
336
340
  },
337
341
  },
342
+ forwarderSupported: {
343
+ source: false,
344
+ destination: false,
345
+ },
338
346
  },
339
347
  });
340
348
 
@@ -394,6 +402,10 @@ const ArcTestnet = defineChain({
394
402
  fastConfirmations: 1,
395
403
  },
396
404
  },
405
+ forwarderSupported: {
406
+ source: true,
407
+ destination: true,
408
+ },
397
409
  },
398
410
  kitContracts: {
399
411
  bridge: BRIDGE_CONTRACT_EVM_TESTNET,
@@ -438,6 +450,10 @@ const Arbitrum = defineChain({
438
450
  fastConfirmations: 1,
439
451
  },
440
452
  },
453
+ forwarderSupported: {
454
+ source: true,
455
+ destination: true,
456
+ },
441
457
  },
442
458
  kitContracts: {
443
459
  bridge: BRIDGE_CONTRACT_EVM_MAINNET,
@@ -482,6 +498,10 @@ const ArbitrumSepolia = defineChain({
482
498
  fastConfirmations: 1,
483
499
  },
484
500
  },
501
+ forwarderSupported: {
502
+ source: true,
503
+ destination: true,
504
+ },
485
505
  },
486
506
  kitContracts: {
487
507
  bridge: BRIDGE_CONTRACT_EVM_TESTNET,
@@ -526,6 +546,10 @@ const Avalanche = defineChain({
526
546
  fastConfirmations: 1,
527
547
  },
528
548
  },
549
+ forwarderSupported: {
550
+ source: true,
551
+ destination: true,
552
+ },
529
553
  },
530
554
  kitContracts: {
531
555
  bridge: BRIDGE_CONTRACT_EVM_MAINNET,
@@ -569,6 +593,10 @@ const AvalancheFuji = defineChain({
569
593
  fastConfirmations: 1,
570
594
  },
571
595
  },
596
+ forwarderSupported: {
597
+ source: true,
598
+ destination: true,
599
+ },
572
600
  },
573
601
  rpcEndpoints: ['https://api.avax-test.network/ext/bc/C/rpc'],
574
602
  kitContracts: {
@@ -614,6 +642,10 @@ const Base = defineChain({
614
642
  fastConfirmations: 1,
615
643
  },
616
644
  },
645
+ forwarderSupported: {
646
+ source: true,
647
+ destination: true,
648
+ },
617
649
  },
618
650
  kitContracts: {
619
651
  bridge: BRIDGE_CONTRACT_EVM_MAINNET,
@@ -658,6 +690,10 @@ const BaseSepolia = defineChain({
658
690
  fastConfirmations: 1,
659
691
  },
660
692
  },
693
+ forwarderSupported: {
694
+ source: true,
695
+ destination: true,
696
+ },
661
697
  },
662
698
  kitContracts: {
663
699
  bridge: BRIDGE_CONTRACT_EVM_TESTNET,
@@ -744,6 +780,10 @@ const Codex = defineChain({
744
780
  fastConfirmations: 1,
745
781
  },
746
782
  },
783
+ forwarderSupported: {
784
+ source: true,
785
+ destination: false,
786
+ },
747
787
  },
748
788
  kitContracts: {
749
789
  bridge: BRIDGE_CONTRACT_EVM_MAINNET,
@@ -782,6 +822,10 @@ const CodexTestnet = defineChain({
782
822
  fastConfirmations: 1,
783
823
  },
784
824
  },
825
+ forwarderSupported: {
826
+ source: true,
827
+ destination: false,
828
+ },
785
829
  },
786
830
  kitContracts: {
787
831
  bridge: BRIDGE_CONTRACT_EVM_TESTNET,
@@ -826,6 +870,10 @@ const Ethereum = defineChain({
826
870
  fastConfirmations: 2,
827
871
  },
828
872
  },
873
+ forwarderSupported: {
874
+ source: true,
875
+ destination: true,
876
+ },
829
877
  },
830
878
  kitContracts: {
831
879
  bridge: BRIDGE_CONTRACT_EVM_MAINNET,
@@ -870,6 +918,10 @@ const EthereumSepolia = defineChain({
870
918
  fastConfirmations: 2,
871
919
  },
872
920
  },
921
+ forwarderSupported: {
922
+ source: true,
923
+ destination: true,
924
+ },
873
925
  },
874
926
  kitContracts: {
875
927
  bridge: BRIDGE_CONTRACT_EVM_TESTNET,
@@ -956,6 +1008,10 @@ const HyperEVM = defineChain({
956
1008
  fastConfirmations: 1,
957
1009
  },
958
1010
  },
1011
+ forwarderSupported: {
1012
+ source: true,
1013
+ destination: true,
1014
+ },
959
1015
  },
960
1016
  kitContracts: {
961
1017
  bridge: BRIDGE_CONTRACT_EVM_MAINNET,
@@ -995,6 +1051,10 @@ const HyperEVMTestnet = defineChain({
995
1051
  fastConfirmations: 1,
996
1052
  },
997
1053
  },
1054
+ forwarderSupported: {
1055
+ source: true,
1056
+ destination: true,
1057
+ },
998
1058
  },
999
1059
  kitContracts: {
1000
1060
  bridge: BRIDGE_CONTRACT_EVM_TESTNET,
@@ -1038,6 +1098,10 @@ const Ink = defineChain({
1038
1098
  fastConfirmations: 1,
1039
1099
  },
1040
1100
  },
1101
+ forwarderSupported: {
1102
+ source: true,
1103
+ destination: true,
1104
+ },
1041
1105
  },
1042
1106
  kitContracts: {
1043
1107
  bridge: BRIDGE_CONTRACT_EVM_MAINNET,
@@ -1080,6 +1144,10 @@ const InkTestnet = defineChain({
1080
1144
  fastConfirmations: 1,
1081
1145
  },
1082
1146
  },
1147
+ forwarderSupported: {
1148
+ source: true,
1149
+ destination: true,
1150
+ },
1083
1151
  },
1084
1152
  kitContracts: {
1085
1153
  bridge: BRIDGE_CONTRACT_EVM_TESTNET,
@@ -1118,6 +1186,10 @@ const Linea = defineChain({
1118
1186
  fastConfirmations: 1,
1119
1187
  },
1120
1188
  },
1189
+ forwarderSupported: {
1190
+ source: true,
1191
+ destination: true,
1192
+ },
1121
1193
  },
1122
1194
  kitContracts: {
1123
1195
  bridge: BRIDGE_CONTRACT_EVM_MAINNET,
@@ -1156,6 +1228,10 @@ const LineaSepolia = defineChain({
1156
1228
  fastConfirmations: 1,
1157
1229
  },
1158
1230
  },
1231
+ forwarderSupported: {
1232
+ source: true,
1233
+ destination: true,
1234
+ },
1159
1235
  },
1160
1236
  kitContracts: {
1161
1237
  bridge: BRIDGE_CONTRACT_EVM_TESTNET,
@@ -1196,6 +1272,10 @@ const Monad = defineChain({
1196
1272
  fastConfirmations: 1,
1197
1273
  },
1198
1274
  },
1275
+ forwarderSupported: {
1276
+ source: true,
1277
+ destination: true,
1278
+ },
1199
1279
  },
1200
1280
  kitContracts: {
1201
1281
  bridge: BRIDGE_CONTRACT_EVM_MAINNET,
@@ -1236,6 +1316,10 @@ const MonadTestnet = defineChain({
1236
1316
  fastConfirmations: 1,
1237
1317
  },
1238
1318
  },
1319
+ forwarderSupported: {
1320
+ source: true,
1321
+ destination: true,
1322
+ },
1239
1323
  },
1240
1324
  kitContracts: {
1241
1325
  bridge: BRIDGE_CONTRACT_EVM_TESTNET,
@@ -1317,6 +1401,10 @@ defineChain({
1317
1401
  confirmations: 1,
1318
1402
  },
1319
1403
  },
1404
+ forwarderSupported: {
1405
+ source: false,
1406
+ destination: false,
1407
+ },
1320
1408
  },
1321
1409
  });
1322
1410
 
@@ -1349,6 +1437,10 @@ defineChain({
1349
1437
  confirmations: 1,
1350
1438
  },
1351
1439
  },
1440
+ forwarderSupported: {
1441
+ source: false,
1442
+ destination: false,
1443
+ },
1352
1444
  },
1353
1445
  });
1354
1446
 
@@ -1390,6 +1482,10 @@ const Optimism = defineChain({
1390
1482
  fastConfirmations: 1,
1391
1483
  },
1392
1484
  },
1485
+ forwarderSupported: {
1486
+ source: true,
1487
+ destination: true,
1488
+ },
1393
1489
  },
1394
1490
  kitContracts: {
1395
1491
  bridge: BRIDGE_CONTRACT_EVM_MAINNET,
@@ -1434,6 +1530,10 @@ const OptimismSepolia = defineChain({
1434
1530
  fastConfirmations: 1,
1435
1531
  },
1436
1532
  },
1533
+ forwarderSupported: {
1534
+ source: true,
1535
+ destination: true,
1536
+ },
1437
1537
  },
1438
1538
  kitContracts: {
1439
1539
  bridge: BRIDGE_CONTRACT_EVM_TESTNET,
@@ -1474,6 +1574,10 @@ const Plume = defineChain({
1474
1574
  fastConfirmations: 1,
1475
1575
  },
1476
1576
  },
1577
+ forwarderSupported: {
1578
+ source: true,
1579
+ destination: false,
1580
+ },
1477
1581
  },
1478
1582
  kitContracts: {
1479
1583
  bridge: BRIDGE_CONTRACT_EVM_MAINNET,
@@ -1513,6 +1617,10 @@ const PlumeTestnet = defineChain({
1513
1617
  fastConfirmations: 1,
1514
1618
  },
1515
1619
  },
1620
+ forwarderSupported: {
1621
+ source: true,
1622
+ destination: false,
1623
+ },
1516
1624
  },
1517
1625
  kitContracts: {
1518
1626
  bridge: BRIDGE_CONTRACT_EVM_TESTNET,
@@ -1603,6 +1711,10 @@ const Polygon = defineChain({
1603
1711
  fastConfirmations: 13,
1604
1712
  },
1605
1713
  },
1714
+ forwarderSupported: {
1715
+ source: true,
1716
+ destination: true,
1717
+ },
1606
1718
  },
1607
1719
  kitContracts: {
1608
1720
  bridge: BRIDGE_CONTRACT_EVM_MAINNET,
@@ -1647,6 +1759,10 @@ const PolygonAmoy = defineChain({
1647
1759
  fastConfirmations: 13,
1648
1760
  },
1649
1761
  },
1762
+ forwarderSupported: {
1763
+ source: true,
1764
+ destination: true,
1765
+ },
1650
1766
  },
1651
1767
  kitContracts: {
1652
1768
  bridge: BRIDGE_CONTRACT_EVM_TESTNET,
@@ -1687,6 +1803,10 @@ const Sei = defineChain({
1687
1803
  fastConfirmations: 1,
1688
1804
  },
1689
1805
  },
1806
+ forwarderSupported: {
1807
+ source: true,
1808
+ destination: true,
1809
+ },
1690
1810
  },
1691
1811
  kitContracts: {
1692
1812
  bridge: BRIDGE_CONTRACT_EVM_MAINNET,
@@ -1726,6 +1846,10 @@ const SeiTestnet = defineChain({
1726
1846
  fastConfirmations: 1,
1727
1847
  },
1728
1848
  },
1849
+ forwarderSupported: {
1850
+ source: true,
1851
+ destination: true,
1852
+ },
1729
1853
  },
1730
1854
  kitContracts: {
1731
1855
  bridge: BRIDGE_CONTRACT_EVM_TESTNET,
@@ -1764,6 +1888,10 @@ const Sonic = defineChain({
1764
1888
  fastConfirmations: 1,
1765
1889
  },
1766
1890
  },
1891
+ forwarderSupported: {
1892
+ source: true,
1893
+ destination: true,
1894
+ },
1767
1895
  },
1768
1896
  kitContracts: {
1769
1897
  bridge: BRIDGE_CONTRACT_EVM_MAINNET,
@@ -1802,6 +1930,10 @@ const SonicTestnet = defineChain({
1802
1930
  fastConfirmations: 1,
1803
1931
  },
1804
1932
  },
1933
+ forwarderSupported: {
1934
+ source: true,
1935
+ destination: true,
1936
+ },
1805
1937
  },
1806
1938
  kitContracts: {
1807
1939
  bridge: BRIDGE_CONTRACT_EVM_TESTNET,
@@ -1845,6 +1977,10 @@ const Solana = defineChain({
1845
1977
  fastConfirmations: 3,
1846
1978
  },
1847
1979
  },
1980
+ forwarderSupported: {
1981
+ source: true,
1982
+ destination: false,
1983
+ },
1848
1984
  },
1849
1985
  kitContracts: {
1850
1986
  bridge: 'DFaauJEjmiHkPs1JG89A4p95hDWi9m9SAEERY1LQJiC3',
@@ -1887,6 +2023,10 @@ const SolanaDevnet = defineChain({
1887
2023
  fastConfirmations: 3,
1888
2024
  },
1889
2025
  },
2026
+ forwarderSupported: {
2027
+ source: true,
2028
+ destination: false,
2029
+ },
1890
2030
  },
1891
2031
  kitContracts: {
1892
2032
  bridge: 'DFaauJEjmiHkPs1JG89A4p95hDWi9m9SAEERY1LQJiC3',
@@ -1970,6 +2110,10 @@ defineChain({
1970
2110
  confirmations: 1,
1971
2111
  },
1972
2112
  },
2113
+ forwarderSupported: {
2114
+ source: false,
2115
+ destination: false,
2116
+ },
1973
2117
  },
1974
2118
  });
1975
2119
 
@@ -2003,6 +2147,10 @@ defineChain({
2003
2147
  confirmations: 1,
2004
2148
  },
2005
2149
  },
2150
+ forwarderSupported: {
2151
+ source: false,
2152
+ destination: false,
2153
+ },
2006
2154
  },
2007
2155
  });
2008
2156
 
@@ -2024,7 +2172,7 @@ const Unichain = defineChain({
2024
2172
  chainId: 130,
2025
2173
  isTestnet: false,
2026
2174
  explorerUrl: 'https://unichain.blockscout.com/tx/{hash}',
2027
- rpcEndpoints: ['https://rpc.unichain.org', 'https://mainnet.unichain.org'],
2175
+ rpcEndpoints: ['https://mainnet.unichain.org'],
2028
2176
  eurcAddress: null,
2029
2177
  usdcAddress: '0x078D782b760474a361dDA0AF3839290b0EF57AD6',
2030
2178
  cctp: {
@@ -2044,6 +2192,10 @@ const Unichain = defineChain({
2044
2192
  fastConfirmations: 1,
2045
2193
  },
2046
2194
  },
2195
+ forwarderSupported: {
2196
+ source: true,
2197
+ destination: true,
2198
+ },
2047
2199
  },
2048
2200
  kitContracts: {
2049
2201
  bridge: BRIDGE_CONTRACT_EVM_MAINNET,
@@ -2088,6 +2240,10 @@ const UnichainSepolia = defineChain({
2088
2240
  fastConfirmations: 1,
2089
2241
  },
2090
2242
  },
2243
+ forwarderSupported: {
2244
+ source: true,
2245
+ destination: true,
2246
+ },
2091
2247
  },
2092
2248
  kitContracts: {
2093
2249
  bridge: BRIDGE_CONTRACT_EVM_TESTNET,
@@ -2114,7 +2270,7 @@ const WorldChain = defineChain({
2114
2270
  explorerUrl: 'https://worldscan.org/tx/{hash}',
2115
2271
  rpcEndpoints: ['https://worldchain-mainnet.g.alchemy.com/public'],
2116
2272
  eurcAddress: null,
2117
- usdcAddress: '0x79A02482A880bCe3F13E09da970dC34dB4cD24D1',
2273
+ usdcAddress: '0x79A02482A880bCE3F13e09Da970dC34db4CD24d1',
2118
2274
  cctp: {
2119
2275
  domain: 14,
2120
2276
  contracts: {
@@ -2126,6 +2282,10 @@ const WorldChain = defineChain({
2126
2282
  fastConfirmations: 1,
2127
2283
  },
2128
2284
  },
2285
+ forwarderSupported: {
2286
+ source: true,
2287
+ destination: true,
2288
+ },
2129
2289
  },
2130
2290
  kitContracts: {
2131
2291
  bridge: BRIDGE_CONTRACT_EVM_MAINNET,
@@ -2167,6 +2327,10 @@ const WorldChainSepolia = defineChain({
2167
2327
  fastConfirmations: 1,
2168
2328
  },
2169
2329
  },
2330
+ forwarderSupported: {
2331
+ source: true,
2332
+ destination: true,
2333
+ },
2170
2334
  },
2171
2335
  kitContracts: {
2172
2336
  bridge: BRIDGE_CONTRACT_EVM_TESTNET,
@@ -2193,7 +2357,7 @@ const XDC = defineChain({
2193
2357
  chainId: 50,
2194
2358
  isTestnet: false,
2195
2359
  explorerUrl: 'https://xdcscan.io/tx/{hash}',
2196
- rpcEndpoints: ['https://erpc.xinfin.network'],
2360
+ rpcEndpoints: ['https://erpc.xdcrpc.com', 'https://erpc.xinfin.network'],
2197
2361
  eurcAddress: null,
2198
2362
  usdcAddress: '0xfA2958CB79b0491CC627c1557F441eF849Ca8eb1',
2199
2363
  cctp: {
@@ -2207,6 +2371,10 @@ const XDC = defineChain({
2207
2371
  fastConfirmations: 3,
2208
2372
  },
2209
2373
  },
2374
+ forwarderSupported: {
2375
+ source: true,
2376
+ destination: false,
2377
+ },
2210
2378
  },
2211
2379
  kitContracts: {
2212
2380
  bridge: BRIDGE_CONTRACT_EVM_MAINNET,
@@ -2245,6 +2413,10 @@ const XDCApothem = defineChain({
2245
2413
  fastConfirmations: 1,
2246
2414
  },
2247
2415
  },
2416
+ forwarderSupported: {
2417
+ source: true,
2418
+ destination: false,
2419
+ },
2248
2420
  },
2249
2421
  kitContracts: {
2250
2422
  bridge: BRIDGE_CONTRACT_EVM_TESTNET,