Skip to content

Bridge USDT in

Bridging in turns USDT on Ethereum, or BSC-USD on BNB Chain, into kUSDT on Kaspa L1. You lock the USDT in the vault on that chain. After the deposit is final, the bridge signers approve it and kUSDT is created at your Kaspa address.

Item Why
USDT on Ethereum, or BSC-USD on BNB Chain The amount you bridge, between 10 and 100 000 USDT per deposit
An EVM wallet with some ETH or BNB To pay gas for two transactions: approve and deposit
A Kaspa address Where your kUSDT will arrive. A Schnorr address (kaspa:q…) is the usual choice

On testnet the vaults hold MockUSDT, a test token that anyone can mint, paying only gas. Its address is 0x5bF185d9ce3A194b7090f069398580A66fb1F8a1 on both Sepolia and BSC testnet. The web app’s Bridge page and the wallet’s Bridge tab have “Get 1,000 test USDT”, which calls that open mint from your EVM account.

Bridge in: from a USDT deposit to kUSDT on KaspaThe user deposits USDT into the vault, which emits a Deposit event with a nonce. After the deposit's block is finalized, each of the five signers reads the event from its own RPC, checks it, and signs the mint digest. The coordinator collects at least three signatures and submits a mint transaction to BridgeMint on Kaspa. BridgeMint checks the quorum, the nonce and the limits, and creates the recipient's KCC20 state.UserEVM walletKusdtVaultEthereum or BNB ChainSigners (5)each on its own nodesCoordinatoruntrusted relayBridgeMintKaspa L1deposit(units, scheme, owner)after approving units × scale1emits Deposit(nonce, …,units, fee, minted)23Finality: wait until the deposit's block is at or below the chain's finalized blockreads the eventfrom the signer's own RPC4checks nonce, recipient, limits;Schnorr-signs the mint digest53 or more signaturesSchnorr, 64 bytes each6mint(chain, first_nonce, …)1 to 3 consecutive deposits7checks quorum, nonce, limits;creates KCC20 state(s)8kUSDT arrives in the recipient's KCC20 stateamount = minted9
Bridge in. Numbers match the steps on this page. Anyone may submit the mint transaction; the coordinator is only a convenience.
  1. Deposit. In the web app, choose the chain, enter the amount and your Kaspa address. The app converts the address into a KCC-2 owner (see Kaspa recipients). Your EVM wallet then asks you to approve the vault to take exactly that amount, and then to call deposit(units, ownerScheme, owner). On Ethereum there can be a third prompt first: Ethereum’s USDT refuses to change a non-zero allowance, so the app resets an old allowance to 0 before it approves. The app then follows the deposit until it is minted.
  2. The vault records it. The vault takes the USDT, keeps the fee, and emits a Deposit event with the next deposit number (the nonce) and the amount to mint.
  3. Finality. The bridge waits until the deposit’s block is at or below the chain’s finalized block, the point after which the chain does not reverse it. See Finality.
  4. Each signer reads the deposit from its own Ethereum or BNB Chain node. It never relies on what another party reports.
  5. Each signer checks and signs. A signer checks the event and signs the mint digest, a hash that names the kUSDT deployment, the chain, the nonce, your owner and the amount.
  6. The coordinator collects signatures. The coordinator is a relay that gathers at least 3 signatures.
  7. Mint. A mint transaction is submitted to BridgeMint on Kaspa. One transaction can mint 1 to 3 consecutive deposits of the same chain.
  8. BridgeMint checks everything on-chain: the 3 signatures, that the nonce is the next one for that chain, the rate limit, the hard cap, and the exact shape of the new kUSDT state.
  9. Your kUSDT arrives as a KCC-20 state owned by your Kaspa address, holding exactly the minted amount.

You receive minted = units − fee. The fee is 0.20 % of the deposit, at least 0.50 USDT. The proportional part rounds up to the next base unit (10⁻⁶ USDT).

Deposit Fee kUSDT minted
10 USDT 0.50 9.50
100 USDT 0.50 99.50
250 USDT 0.50 249.50
1 000 USDT 2.00 998.00
10 000 USDT 20.00 9 980.00
100 000 USDT 200.00 99 800.00

Below 250 USDT the 0.50 USDT minimum applies. Above it, the 0.20 % rate applies.

Your new kUSDT state also carries 1.5 KAS (the deployment’s token value). Kaspa requires every output to carry KAS in proportion to the storage it uses, and covenant outputs count double (see Storage mass). The coordinator’s Kaspa funding pays it, out of the deposit fee. From then on the KAS is yours: it stays in your token UTXO and travels with the token when you spend it.

The wait is mostly the source chain’s finality. After that, the signers, the coordinator and a Kaspa confirmation add a short delay. A busy day can add more: minting draws on an allowance of 500 000 USDT that refills over 24 hours, and a deposit waits if the allowance is used up. See Limits.

  • The deposit reverts. Nothing is taken. Common causes: an amount outside 10 to 100 000 USDT, a missing approval, or the vault being paused.
  • The deposit is never minted. Deposits are minted strictly in nonce order. If a deposit can never be minted, 4 of the 5 signers can skip its nonce on Kaspa, and the vault then refunds exactly the amount it would have minted to the address that made the deposit. See Refunds.

Developers can call the vault directly. units is the amount in base units of 10⁻⁶ USDT, whatever the token’s decimals:

// Approve units × scale of the token first. scale = 1 on Ethereum, 10^12 on BNB Chain.
uint64 nonce = vault.deposit(units, ownerScheme, owner);

ownerScheme and owner come from your Kaspa address as described in Kaspa recipients. A wrong owner cannot be corrected after the mint, so check the conversion with a small deposit first.