Skip to main content

Overview

USDCx bridging allows you to move USDC issued by Circle between Ethereum and Canton seamlessly. This functionality leverages Circle’s XReserve, enabling fast, secure, and compliant movement of USDCx across chains while maintaining token integrity.

Supported Bridging Actions

HIFI currently supports the following USDCx bridging functionalities:
  • Mint USDCx from Ethereum to Canton – Lock USDC on Ethereum and mint USDCx in Canton.
  • Burn USDCx from Canton to Ethereum – Burn USDCx in Canton and release USDC on Ethereum.

How USDCx Bridging Works

1

Create Bridging Request

The user initiates a bridging request from either Ethereum or Canton, specifying the amount and destination chain. A bridging quote is returned for review.
2

Accept Bridging Quote

The user accepts the bridging quote to confirm the operation and proceed with the bridge.
3

Bridge Processing

HIFI processes the bridging operation, validating the source transaction and preparing the destination chain transfer.
4

Mint or Release Tokens

Tokens are either minted on the destination chain (Canton) or released back on Ethereum, depending on the bridging direction.
5

Accept Transfer Offer on Canton

For bridges minting USDCx on Canton, a corresponding transfer offer is created. The user must accept the offer to receive USDCx in their Canton wallet.
6

Completion

The user’s wallet balance is updated, and a bridging transaction hash is recorded for auditing and reference.

Mint USDCx to Canton

To mint USDCx on Canton, we will first use the Create Bridge endpoint to initiate a cross-chain transfer.

Create Bridging Request

Request:
curl -X POST "https://sandbox.hifibridge.com/v2/wallets/bridges" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "requestId": "1d860428-1d0b-47c5-9e65-98961ff59215",
    "amount": 10,
    "source": {
      "userId": "usr_abc123",
      "chain": "ETHEREUM",
      "currency": "usdc"
    },
    "destination": {
      "userId": "usr_abc123",
      "chain": "CANTON",
      "currency": "usdcx"
    }
  }'
{
  "transferType": "WALLET.BRIDGE",
  "transferDetails": {
    "id": "brg_abc123",
    "requestId": "1d860428-1d0b-47c5-9e65-98961ff59215",
    "createdAt": "2025-02-24T17:44:54.781519+00:00",
    "updatedAt": "2025-02-24T17:44:54.781519+00:00",
    "amount": 10,
    "status": "OPEN_QUOTE",
    "source": {
      "userId": "usr_abc123",
      "walletAddress": "0xE9cfBf1D690565579D823264170eE357f80e9A34",
      "walletId": "wallet_abc123",
      "chain": "ETHEREUM",
      "currency": "usdc"
    },
    "destination": {
      "userId": "usr_abc123",
      "walletAddress": "HIFI-validator-1::1220e636b510224be2c15b4436c0eb72558fdd6a93268b3605fad7f27f58192910e6",
      "walletId": "wallet_abc456",
      "chain": "CANTON",
      "currency": "usdcx"
    },
    "receipt": {
      "transactionHash": null,
      "operations": {
        "mint": null,
        "burn": null,
        "approve": null
      }
    },
    "quoteInformation": {
      "sendGross": {
        "amount": "10.00",
        "currency": "usdc"
      },
      "sendNet": {
        "amount": "10.00",
        "currency": "usdc"
      },
      "receiveGross": {
        "amount": "10.00",
        "currency": "usdcx"
      },
      "receiveNet": {
        "amount": "10.00",
        "currency": "usdcx"
      },
      "rate": "1",
      "railFee": {
        "amount": "0",
        "currency": "usdc"
      }
    }
  }
}

Accept Bridging Request

Accept the quote to kick off the bridging process Request:
curl -X POST "https://sandbox.hifibridge.com/v2/wallets/bridges/:transactionId/accept" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
{
  "transferType": "WALLET.BRIDGE",
  "transferDetails": {
    "id": "brg_abc123",
    "requestId": "1d860428-1d0b-47c5-9e65-98961ff59215",
    "createdAt": "2025-02-24T17:44:54.781519+00:00",
    "updatedAt": "2025-02-24T17:44:54.781519+00:00",
    "amount": 10,
    "status": "SOURCE_INITIATED",
    "source": {
      "userId": "usr_abc123",
      "walletAddress": "0xE9cfBf1D690565579D823264170eE357f80e9A34",
	  "walletId": "wallet_abc123",
      "chain": "ETHEREUM",
      "currency": "usdc"
    },
    "destination": {
      "userId": "usr_abc123",
      "walletAddress": "HIFI-validator-1::1220e636b510224be2c15b4436c0eb72558fdd6a93268b3605fad7f27f58192910e6",
      "walletId": "wallet_abc456",
      "chain": "CANTON",
      "currency": "usdcx"
    },
    "receipt": {
      "transactionHash": null,
      "operations": {
        "mint": null,
        "burn": null,
        "approve": null
      }
    },
    "quoteInformation": {
      "sendGross": {
        "amount": "10.00",
        "currency": "usdc"
      },
      "sendNet": {
        "amount": "10.00",
        "currency": "usdc"
      },
      "receiveGross": {
        "amount": "10.00",
        "currency": "usdcx"
      },
      "receiveNet": {
        "amount": "10.00",
        "currency": "usdcx"
      },
      "rate": "1",
      "railFee": {
        "amount": "0",
        "currency": "usdc"
      }
    }
  }
}

Accept Transfer Offer

Once the bridging transaction reaches the COMPLETED status, the destination object will include an associatedCantonOffer field.
This field contains the corresponding Canton transfer offer that has been created and is ready to be accepted by the recipient wallet.
Only destination wallets within the HIFI system will have the associatedCantonOffer populated.
The associated transfer offer will have an expirtation date for 30 days from offer creation, please make sure to accept the offer before the expiration time.
Example Completed Bridging Transaction
{
  "transferType": "WALLET.BRIDGE",
  "transferDetails": {
    "id": "brg_abc123",
    "requestId": "1d860428-1d0b-47c5-9e65-98961ff59215",
    "createdAt": "2025-02-24T17:44:54.781519+00:00",
    "updatedAt": "2025-02-24T17:44:54.781519+00:00",
    "amount": 10,
    "status": "SOURCE_INITIATED",
    "source": {...},
    "destination": {
      "userId": "usr_abc123",
      "walletAddress": "HIFI-validator-1::1220e636b510224be2c15b4436c0eb72558fdd6a93268b3605fad7f27f58192910e6",
      "walletId": "wallet_abc456",
      "chain": "CANTON",
      "currency": "usdcx",
	  "associatedCantonOffer": "23860428-121b-47c5-9e65-98gr1ff59215"
    },
    "receipt": {...},
    "quoteInformation": {...}
  }
}
You can use the walletId under the destination object and the offerId from the associatedCantonOffer to accept the offer:
curl -X POST "https://api.hifibridge.com/v2/wallets/<walletId>/offers/<offerId>/accept" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json"
For more details, please refer to Accept Transfer Offer**.**

Burn USDCx on Canton and Receive on Ethereum

To release USDC back on Ethereum, simply use the Create Bridge endpoint to initiate a cross-chain transfer from Canton to Ethereum. This request will burn USDCx on Canton and, once completed, release the corresponding USDC on Ethereum and deposit directly to the recipient’s wallet.
Currently, a flat 4.75 USDC fee is charged at the protocol level by Circle’s XReserve for each burn transaction.

Create Bridging Request

Request:
curl -X POST "https://sandbox.hifibridge.com/v2/wallets/bridges" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "requestId": "1d860428-1d0b-47c5-9e65-98961ff59215",
    "amount": 10,
    "source": {
      "userId": "usr_abc123",
      "chain": "CANTON",
      "currency": "usdcx"
    },
    "destination": {
      "userId": "usr_abc123",
      "chain": "ETHEREUM",
      "currency": "usdc"
    }
  }'
{
  "transferType": "WALLET.BRIDGE",
  "transferDetails": {
    "id": "brg_abc123",
    "requestId": "1d860428-1d0b-47c5-9e65-98961ff59215",
    "createdAt": "2025-02-24T17:44:54.781519+00:00",
    "updatedAt": "2025-02-24T17:44:54.781519+00:00",
    "amount": 10,
    "status": "OPEN_QUOTE",
    "source": {
      "userId": "usr_abc123",
      "walletAddress": "HIFI-validator-1::1220e636b510224be2c15b4436c0eb72558fdd6a93268b3605fad7f27f58192910e6",
      "walletId": "wallet_abc456",
      "chain": "CANTON",
      "currency": "usdcx"
    },
    "destination": {
      "userId": "usr_abc123",
      "walletAddress": "0xE9cfBf1D690565579D823264170eE357f80e9A34",
      "walletId": "wallet_abc123",
      "chain": "ETHEREUM",
      "currency": "usdc"
    },
    "receipt": {
      "transactionHash": null,
      "operations": {
        "mint": null,
        "burn": null,
        "approve": null
      }
    },
    "quoteInformation": {
      "sendGross": {
        "amount": "10.00",
        "currency": "usdcx"
      },
      "sendNet": {
        "amount": "10.00",
        "currency": "usdcx"
      },
      "receiveGross": {
        "amount": "5.25",
        "currency": "usdc"
      },
      "receiveNet": {
        "amount": "5.25",
        "currency": "usdc"
      },
      "rate": "1",
      "railFee": {
        "amount": "4.75",
        "currency": "usdc"
      }
    }
  }
}

Accept Bridging Request

Accept the quote to kick off the bridging process Request:
curl -X POST "https://sandbox.hifibridge.com/v2/wallets/bridges/:transactionId/accept" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
{
  "transferType": "WALLET.BRIDGE",
  "transferDetails": {
    "id": "brg_abc123",
    "requestId": "1d860428-1d0b-47c5-9e65-98961ff59215",
    "createdAt": "2025-02-24T17:44:54.781519+00:00",
    "updatedAt": "2025-02-24T17:44:54.781519+00:00",
    "amount": 10,
    "status": "SOURCE_INITIATED",
    "source": {
      "userId": "usr_abc123",
      "walletAddress": "0xE9cfBf1D690565579D823264170eE357f80e9A34",
	  "walletId": "wallet_abc123",
      "chain": "ETHEREUM",
      "currency": "usdc"
    },
    "destination": {
      "userId": "usr_abc123",
      "walletAddress": "HIFI-validator-1::1220e636b510224be2c15b4436c0eb72558fdd6a93268b3605fad7f27f58192910e6",
      "walletId": "wallet_abc456",
      "chain": "CANTON",
      "currency": "usdcx"
    },
    "receipt": {
      "transactionHash": null,
      "operations": {
        "mint": null,
        "burn": null,
        "approve": null
      }
    },
    "quoteInformation": {
      "sendGross": {
        "amount": "10.00",
        "currency": "usdc"
      },
      "sendNet": {
        "amount": "10.00",
        "currency": "usdc"
      },
      "receiveGross": {
        "amount": "10.00",
        "currency": "usdcx"
      },
      "receiveNet": {
        "amount": "10.00",
        "currency": "usdcx"
      },
      "rate": "1",
      "railFee": {
        "amount": "0",
        "currency": "usdc"
      }
    }
  }
}

Getting Help