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.
GET /v0/tokens (blockchain: "btc") and in /v0/health under bridges.chains.btc only while it is live. If the token is not listed, the route is not active on that deployment yet. Quotes that pay out BTC answer 503 while the treasury is too low.Token
Like 1Click mainnet's native nep141:btc.omft.near, Tidepool lists native BTC only (no stablecoins on this chain).
| What | Value |
|---|---|
| Chain | Bitcoin testnet4, blockchain: "btc" |
| Native BTC | 8 decimals (satoshis), asset id nep141:btc.tp-omft.testnet |
| Treasury (payouts, refunds, sweep destination) | tb1qy2tthlq2ntnjvk40payyuwpnzaf365h02ze0qr |
| Confirmations required | 1 |
| Cap / minimum | 0.005 BTC (500,000 sats) / 0.0001 BTC (10,000 sats) per swap leg |
Deposit model: per-quote addresses, no memo
Bitcoin needs no memo, and 1Click itself gives Bitcoin quotes a plain deposit address. Tidepool does the same: every BTC-origin quote with depositType: "ORIGIN_CHAIN" gets its own native segwit tb1q… depositAddress (a key derived from the quote id and the server master seed). Send the exact amountIn in satoshis to it from any testnet4 wallet.
depositModeisSIMPLE(the default).ANY_INPUTdeposits are accepted, but anANY_INPUTquote that pays out BTC is rejected.POST /v0/deposit/submitwithtxHashanddepositAddressis optional: the relayer polls public Esplora APIs and detects the deposit anyway.- After 1 confirmation the relayer sweeps every confirmed output of the deposit address to the treasury in one transaction (the treasury absorbs the miner fee, so the credited amount equals what you sent), mints the NEP-141 on NEAR and credits it to the verifier. The sweep appears in the swap's
tidepool.explorerlist. - Send the full amount in one transaction. A short deposit is refunded like on every other route.
The BTC cap and minimum
Any swap with a BTC leg is rejected at quote time with a 400 if the BTC amount (input or output) is above 0.005 BTC (500,000 sats) or below 0.0001 BTC (10,000 sats, so miner fees stay small next to the amount). It covers swaps, payouts and refunds. Also:
- A payout of BTC is paid from the treasury, so quotes answer
503if the treasury cannot cover the payout plus the miner fee. ANY_INPUTquotes that pay out BTC are rejected.- Recipients and
refundTomust be valid testnet addresses (tb1…, or legacym…/n…/2…).
1. Get tBTC
The Tidepool faucet never drips BTC, to a wallet or to your intents balance (POST /v0/faucet with chain: "btc" answers 400 and names these links). Use a public testnet4 faucet:
- CypherFaucet: 0.01 tBTC, no sign-in.
- testnet4.info faucet and other testnet4 faucets listed on mempool.space/testnet4.
Make sure the faucet is a testnet4 faucet (testnet3 coins are on a different chain). The address format is the same.
2. BTC → NEAR
const quote = await OneClickService.getQuote({
dry: false, swapType: 'EXACT_INPUT', slippageTolerance: 100,
originAsset: 'nep141:btc.tp-omft.testnet',
destinationAsset: 'nep141:usdc.tidepool-sandbox.testnet',
amount: '100000', // 0.001 BTC in satoshis
depositType: 'ORIGIN_CHAIN',
refundTo: 'tb1qYourTestnet4Address', refundType: 'ORIGIN_CHAIN',
recipient: 'you.testnet', recipientType: 'DESTINATION_CHAIN',
deadline: new Date(Date.now() + 60 * 60_000).toISOString(),
});
const { depositAddress, amountIn } = quote.quote;
// Send amountIn satoshis to depositAddress on testnet4, then (optional):
await OneClickService.submitDepositTx({ txHash: '<btc txid>', depositAddress });
// Poll GET /v0/status?depositAddress=...Give the quote a generous deadline: testnet4 blocks take about 10 minutes, but can be slower or faster. Runnable: RECIPIENT=you.testnet npm run btc-deposit in tidepool-examples (it needs BTC_PRIVATE_KEY_WIF, a testnet4 key with a little tBTC, and prints the mempool.space links).
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:btc.tp-omft.testnet",
"depositType": "ORIGIN_CHAIN",
"destinationAsset": "nep141:usdc.tidepool-sandbox.testnet",
"amount": "100000",
"refundTo": "tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx",
"refundType": "ORIGIN_CHAIN",
"recipient": "user.testnet",
"recipientType": "DESTINATION_CHAIN",
"deadline": "2030-01-01T00:00:00.000Z"
}'{
"correlationId": "c91a0e71-80c9-4689-be4f-b71b69c89a3a",
"timestamp": "2026-10-30T16:28:51.397Z",
"quoteRequest": {
"dry": true,
"swapType": "EXACT_INPUT",
"slippageTolerance": 100,
"originAsset": "nep141:btc.tp-omft.testnet",
"depositType": "ORIGIN_CHAIN",
"destinationAsset": "nep141:usdc.tidepool-sandbox.testnet",
"amount": "100000",
"refundTo": "tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx",
"refundType": "ORIGIN_CHAIN",
"recipient": "user.testnet",
"recipientType": "DESTINATION_CHAIN",
"deadline": "2030-01-01T00:00:00.000Z"
},
"quote": {
"amountIn": "100000",
"amountInFormatted": "0.001",
"amountInUsd": "77.4130",
"minAmountIn": "100000",
"amountOut": "77083295",
"amountOutFormatted": "77.083295",
"amountOutUsd": "77.0646",
"minAmountOut": "76312462",
"timeEstimate": 60
},
"signature": "ed25519:4oHbZYrC7HKWjHi9Y2xSc4XDEpFPDPh4PdsygwkWZ1KMC96Atohxa6MLcVQLUpFQuFh6EGLe3K9aWf2ioEHAwv6m"
}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 → BTC
Quote with destinationAsset: 'nep141:btc.tp-omft.testnet', recipient: 'tb1qYourAddress' and recipientType: 'DESTINATION_CHAIN', then deposit on NEAR as usual. The verifier ft_withdraws the bridged token to the relayer, which pays out on testnet4 from the treasury; you receive exactly the quoted amount and the treasury pays the miner fee. Payouts are signed first and the signed transaction is recorded before it is broadcast, so a crash or retry re-broadcasts 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 testnet4 in the amount you sent.
Limits
- Testnet4 resets are rare but possible; after one the balances are gone and the route has to be bootstrapped again.
- Confirmation time. A deposit is only credited after 1 confirmation, so a swap can wait on the next block. Payouts are broadcast as soon as the swap settles on NEAR and then need a block to confirm.
- Fees. The relayer pays miner fees from the treasury (at least 2 sat/vB, following the half-hour estimate of mempool.space). The fee is not deducted from your swap.
- One treasury-signed transaction at a time. Payouts share the treasury's coins and are serialized (unconfirmed change is tracked, so back-to-back payouts work).
- Unreachable destinations. If a payout keeps being rejected, the swap stays in
PROCESSINGwith a note and needs operator attention. - Public APIs. The relayer reads and broadcasts through the public mempool.space, blockstream.info and mempool.ninja testnet4 Esplora APIs (override:
BTC_API_URLS), with failover, a shared read cache and exponential backoff on429. Public hosts rate-limit shared cloud IPs, so a deposit address is only polled every 20 seconds (every 2 minutes once its quote has expired) and rate limits can still delay a swap by a few minutes.GET /v0/healthreportsbridges.chains.btc.ok: falsewhile the treasury cannot be read.
Mapping to mainnet 1Click
Same request and response fields, blockchain: "btc", a plain depositAddress and no memo. Mainnet's asset is nep141:btc.omft.near (8 decimals); on Tidepool it is nep141:btc.tp-omft.testnet. Take the asset id from GET /v0/tokens of the environment you are calling. Mainnet has no 0.005 BTC cap and uses real mainnet addresses (bc1…).
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.
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.
XRP Ledger testnet bridge
Swap between XRP Ledger testnet and NEAR testnet through Tidepool's testnet relayer, with 1Click-style MEMO deposits (a destination tag), status and refunds. Native XRP only, capped at 100 XRP.