Sui testnet bridge
Swap between Sui testnet and NEAR testnet through Tidepool's testnet relayer, with per-quote deposit addresses, status and refunds. Native SUI (capped at 10 SUI) plus Tidepool test USDC and USDT.
GET /v0/tokens (blockchain: "sui") and in /v0/health under bridges.chains.sui only while it is live. If the tokens are not listed, the route is not active on that deployment yet.Tokens
| What | Value |
|---|---|
| Chain | Sui testnet, blockchain: "sui" |
| Native SUI | 9 decimals (MIST), asset id nep141:sui.tp-omft.testnet, contractAddress is the coin type 0x2::sui::SUI |
| Test USDC (6 decimals, Move coin) | 0x71a32ced7702bba9a8d23a122971d5973baa610f1689306176ac4f364d68bb3c::tusdc::TUSDC, asset id nep141:sui-f6ecfe107e72d22b7a646dd2cc4f1b2876349c0c.tp-omft.testnet |
| Test USDT (6 decimals, Move coin) | 0x71a32ced7702bba9a8d23a122971d5973baa610f1689306176ac4f364d68bb3c::tusdt::TUSDT, asset id nep141:sui-add896332c906e599cee03f2154d067937d12a26.tp-omft.testnet |
| Treasury (gas sponsor, payouts, refunds) | 0x565662f245d0a66f567aa71499589f70fee8c2a5af20e8614429371fbe4f252c |
| Move package (test coins) | 0x71a32ced7702bba9a8d23a122971d5973baa610f1689306176ac4f364d68bb3c |
The issued-coin id is nep141:sui-<last 20 bytes of keccak256(the coin type string)>.tp-omft.testnet, the same rule 1Click uses on mainnet (for example its Sui USDC is nep141:sui-c1b81ecaf27933252d31a963bc5e9458f13c18ce.omft.near). The coin type is the canonical 0x…::module::STRUCT string with the package address in full. The two test coins are Tidepool's own Move coins, not Circle or Tether tokens; the treasury holds their TreasuryCaps and mints them for payouts and the faucet.
Deposit model: per-quote addresses, no memo
Sui needs no memo, and 1Click itself gives Sui quotes a plain deposit address. Tidepool does the same: every Sui-origin quote gets its own 0x… depositAddress (an ed25519 key derived from the quote id and the server master seed). Send the exact amountIn of the origin asset to it from any wallet:
- SUI: an ordinary transfer of SUI coins (
splitCoinsfrom gas,transferObjects). - USDC or USDT: transfer
Coin<…>objects of that test coin to the address. Do not send a different coin type: it is not credited. depositModeisSIMPLE(the default).ANY_INPUTdeposits are accepted as on Solana, but anANY_INPUTquote that pays out SUI is rejected.POST /v0/deposit/submitwithtxHash(the Sui transaction digest) anddepositAddressis optional: the relayer watches the address and detects the deposit anyway.- After the deposit is seen, the relayer sweeps the deposit address into the treasury with a sponsored transaction (the sender is the deposit address, the treasury pays the gas, both sign), then mints the NEP-141 on NEAR and credits it to the verifier. The sweep appears in the swap's
tidepool.explorerlist.
The SUI cap (10 SUI)
Any swap with a SUI leg is rejected at quote time with a 400 if the SUI amount (input or output) exceeds 10 SUI (10,000,000,000 MIST). It covers swaps, payouts and refunds. Why: the treasury is funded by the public Sui testnet faucet, which gives a few SUI per request, so a small cap keeps one user from draining it. Also:
- A payout of SUI is paid from the treasury, so quotes answer
503if the treasury cannot cover the payout plus gas. ANY_INPUTquotes that pay out SUI to a Sui address are rejected.- USDC and USDT legs are not capped.
- Recipients and
refundTomust be full0x+ 64 hex addresses.
1. Get tokens
SUI: the public Sui testnet faucet (the Tidepool faucet never drips SUI to wallets). USDC and USDT: Tidepool's faucet, no trustline or token account is needed on Sui.
curl -X POST https://www.usetidepool.tech/v0/faucet -H 'content-type: application/json' \
-d '{"chain":"sui","address":"0xYourSuiAddress"}'2. Sui → NEAR
const quote = await OneClickService.getQuote({
dry: false, swapType: 'EXACT_INPUT', slippageTolerance: 100,
originAsset: 'nep141:sui.tp-omft.testnet',
destinationAsset: 'nep141:usdc.tidepool-sandbox.testnet',
amount: '500000000', // 0.5 SUI in MIST
depositType: 'ORIGIN_CHAIN',
refundTo: '0xYourSuiAddress', refundType: 'ORIGIN_CHAIN',
recipient: 'you.testnet', recipientType: 'DESTINATION_CHAIN',
deadline: new Date(Date.now() + 30 * 60_000).toISOString(),
});
const { depositAddress, amountIn } = quote.quote;
// Transfer amountIn MIST of SUI to depositAddress, then (optional):
await OneClickService.submitDepositTx({ txHash: '<sui tx digest>', depositAddress });
// Poll GET /v0/status?depositAddress=...Runnable: RECIPIENT=you.testnet npm run sui-deposit in tidepool-examples (it needs SUI_SECRET_KEY, a testnet key with a little SUI, and prints the Suiscan links). The example builds the transaction offline because @mysten/sui 1.x cannot resolve one over gRPC; the public Sui JSON-RPC is deprecated, so Tidepool itself talks to the testnet fullnode over gRPC.
Full quote request and response
The request below sets every required field (plus depositMode: "MEMO" where this route needs it). It is a dry quote, so nothing is created. The response is the real, complete body from the live deployment on 2026-10-30; prices move, so your amounts will differ. Optional fields such as appFees or referral are in Swap types.
curl -X POST https://www.usetidepool.tech/v0/quote -H 'content-type: application/json' -d '{
"dry": true,
"swapType": "EXACT_INPUT",
"slippageTolerance": 100,
"originAsset": "nep141:sui.tp-omft.testnet",
"depositType": "ORIGIN_CHAIN",
"destinationAsset": "nep141:usdc.tidepool-sandbox.testnet",
"amount": "1000000000",
"refundTo": "0x0000000000000000000000000000000000000000000000000000000000000abc",
"refundType": "ORIGIN_CHAIN",
"recipient": "user.testnet",
"recipientType": "DESTINATION_CHAIN",
"deadline": "2030-01-01T00:00:00.000Z"
}'{
"correlationId": "7b84a64a-ac9c-485c-a920-7da25aaab9c0",
"timestamp": "2026-10-30T16:28:50.908Z",
"quoteRequest": {
"dry": true,
"swapType": "EXACT_INPUT",
"slippageTolerance": 100,
"originAsset": "nep141:sui.tp-omft.testnet",
"depositType": "ORIGIN_CHAIN",
"destinationAsset": "nep141:usdc.tidepool-sandbox.testnet",
"amount": "1000000000",
"refundTo": "0x0000000000000000000000000000000000000000000000000000000000000abc",
"refundType": "ORIGIN_CHAIN",
"recipient": "user.testnet",
"recipientType": "DESTINATION_CHAIN",
"deadline": "2030-01-01T00:00:00.000Z"
},
"quote": {
"amountIn": "1000000000",
"amountInFormatted": "1",
"amountInUsd": "0.8939",
"minAmountIn": "1000000000",
"amountOut": "890048",
"amountOutFormatted": "0.890048",
"amountOutUsd": "0.8898",
"minAmountOut": "881147",
"timeEstimate": 60
},
"signature": "ed25519:3yMmBTHmPUAVni58zimoMN5R6haczNKRoYtNXrGb5LArQAQB3VAa8xvUBVJ8nfrVEkeStabFvcwqkYXxzdHZFpHb"
}With "dry": false and a deadline between a minute and a day ahead, the quote also carries depositAddress, deadline and timeWhenInactive. See Quotes and pricing and the status response for what comes back after the deposit.
3. NEAR → Sui
Quote with a Sui destinationAsset, recipient: '0xYourSuiAddress' and recipientType: 'DESTINATION_CHAIN', then deposit on NEAR as usual. The verifier ft_withdraws the bridged token to the relayer, which pays out on Sui from the treasury: SUI is split from the treasury's gas coins, USDC and USDT are minted straight to your address with the TreasuryCap. Payouts are signed first and the signed transaction (with a deterministic digest) is recorded before it is sent, so a crash or retry re-submits the same bytes and never pays twice.
Refunds
Same reasons as every route (DEADLINE_PASSED, PARTIAL_DEPOSIT, …). A refund with refundType: "ORIGIN_CHAIN" is paid from the treasury to refundTo on Sui in the asset you sent (a SUI refund is a transfer; a USDC or USDT refund is a mint).
Limits
- Testnet resets. Sui testnet is wiped from time to time. After a reset the package, coins and balances are gone and the route has to be bootstrapped again.
- Coin objects only. Sui testnet faucet funds can land in an address balance rather than as Coin objects; the relayer only spends Coin objects, so the treasury keeps a large SUI coin for gas and payouts.
- One treasury-signed transaction at a time. Payouts and sweeps share the treasury gas coin, so they are serialized.
- Faucet. The USDC/USDT faucet spends treasury gas, so it has a global daily cap (
SUI_FAUCET_DAILY_MAX, default 300 drips per day) on top of the usual per-address and per-IP limits. - Unreachable destinations. If a payout keeps failing on-chain, the swap stays in
PROCESSINGwith a note and needs operator attention. - Fullnode. The relayer uses the public testnet fullnode (override:
SUI_GRPC_URL); congestion or rate limits can delay a swap.
Mapping to mainnet 1Click
Same request and response fields, blockchain: "sui", a plain depositAddress and no memo. Mainnet lists Sui assets as nep141:sui….omft.near ids with the same keccak256 rule. Take the Sui asset ids from GET /v0/tokens of the environment you are calling. Mainnet has no 10 SUI cap and uses real Sui addresses. 1Click lists no Sui USDT on mainnet; the Tidepool USDT exists so testnet has the same pair as the other chains.
Verified flows
Run on Sui testnet and NEAR testnet on 2026-10-29 with e2e-sui.ts from tidepool-examples:
| Flow | Result | Transactions |
|---|---|---|
| SUI → NEAR USDC (0.5 SUI) | SUCCESS, 0.468548 USDC | deposit DmqCUaUjsUkRpRHbbGXW1Uy6xyGrskLzhodC4VkY1iSg, sweep 7o8onuJ59nZLVzfC7o2x4dPeCjr5A7SjsQZ3C9s23Ee8, swap j2GbEeGp3zRL3YzQieXCiwPik2qGCRZf9mKHSHdurpg |
| NEAR USDC → SUI (5 USDC) | SUCCESS, 5.287716181 SUI | swap 8VeJfdWQRx1y6zmiWWksJrQfeZLBcEcyANasuAYFPKvz, payout 7Hwo7yiX9hXoWZvWGsgnZt9KBzpnYQ6vn2r9FpC1kF6d |
| NEAR USDC → Sui USDC (5 USDC) | SUCCESS, 4.987 USDC (minted) | swap FPqvYzDshjoRHqTys46PhqLDVEouV6YQ89hBJebKvjnB, payout 3JqTr3ExgP9doBksvZ3hiN8WwiLkM9EbJPoduKYnRYgM |
| Short deposit refund (0.4 of 1 SUI) | REFUNDED, 0.4 SUI returned | deposit 3GCUXMeV1oQtg3Bg7vFsZoUUv6WEdAitPVyW8wHxU3f7, refund 638k9zGrjt4HGEv9Vf89Cp9ymfeB7X3k4YUVB2cTr3Gf |
Faucet, chain: "sui" | 100 USDC + 100 USDT minted | BHcfFQ7hyhGxUTfkgoKgXcHGyJpvTKChm56AZzsEnmRE |
Faucet, intents alias sui | 0.5 SUI + 100 USDC + 100 USDT credited in the verifier | HfLTnhrhFP6T25pXVcfWxGXQHjexC3sE72FPuSD3VGMA |
| Over-cap quote (10.000000001 SUI), a 1,000 USDC → SUI quote, a malformed recipient | 400 each | none |
Community-built · not affiliated with NEAR. Tidepool is community-built and not affiliated with NEAR, Defuse or 1Click. Testnet only; test tokens have no value. Built by @realchriswilder.
Stellar testnet bridge
Swap between Stellar testnet and NEAR testnet through Tidepool's testnet relayer, with 1Click-style MEMO deposits, status and refunds. Native XLM (capped at 100 XLM) plus Tidepool test USDC and USDT.
Bitcoin testnet4 bridge
Swap native testnet4 BTC (tBTC) and NEAR testnet tokens through Tidepool's testnet relayer: per-quote native segwit deposit addresses, no memo, status and refunds. Native BTC only, capped at 0.005 BTC per swap.