Removing Liquidity
In this guide, we will use an example of DotSwap process to show how to remove liquidity from a pool, which includes:
Removing
Pre-remove Request
Get Unsigned Remove PSBT
Send Signed Remove PSBT
Get Estimated Remove Amount
The removing interface for Runes/BRC20/ARC20 is the same, differentiated by
coin_type_*
.
token
POST /brc20swap/v2/pre_remove_liquid HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 196
{
"tick1": "text",
"tick2": "text",
"coin_type_1": "text",
"coin_type_2": "text",
"percent": "text",
"payer_btc_addr": "text",
"payer_ord_addr": "text",
"payer_pub_key": "text",
"slipper": "text",
"fee_rate": "text"
}
{
"code": 1,
"msg": "text",
"data": {
"expect_amount1": "text",
"expect_amount2": "text",
"expect_transfer_fee": 1,
"check_sum": "text",
"tx_size": 1,
"usr_cnt": 1,
"vins": [
"text"
]
},
"req_id": "text"
}
Example
{
"tick1": "BTC",
"tick2": "RUNEONERUNEONE",
"coin_type_1": "btc",
"coin_type_2": "runes",
"payer_ord_addr": "tb1qge80xavle7c7k0tk7vceaavwcgpsr3jchl0w3e",
"payer_btc_addr": "tb1qge80xavle7c7k0tk7vceaavwcgpsr3jchl0w3e",
"percent": "15",
"slipper": "12",
"fee_rate": "57",
"payer_pub_key": "02d3ac7452920b1cc4653516dd4f4381a2df0a8c0aac6e3446e633a73ea63eee81:02d3ac7452920b1cc4653516dd4f4381a2df0a8c0aac6e3446e633a73ea63eee81"
}
token
POST /brc20swap/v2/create_remove_liquid_psbt HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 327
{
"tick1": "text",
"tick2": "text",
"coin_type_1": "text",
"coin_type_2": "text",
"percent": "text",
"payer_btc_addr": "text",
"payer_ord_addr": "text",
"payer_pub_key": "text",
"slipper": "text",
"fee_rate": "text",
"expect_amount1": "text",
"expect_amount2": "text",
"expect_transfer_fee": 1,
"check_sum": "text",
"tx_size": 1,
"usr_cnt": 1,
"vins": [
"text"
]
}
{
"code": 1,
"msg": "text",
"data": {
"order_id": "text",
"psbt": "text",
"checksum": "text"
},
"req_id": "text"
}
Example
{
"expect_amount1": "1500",
"expect_amount2": "75",
"expect_transfer_fee": 20121,
"check_sum": "D6CCF094281BC79DD4AF6E7A7FBF1CDA",
"tx_size": 353,
"usr_cnt": 1,
"vins": [
"6cf1c2614a4eaaadf68769909b04687a2ddc4d6082fe4a78654dfad08a9a9323:6"
],
"tick1": "BTC",
"tick2": "RUNEONERUNEONE",
"coin_type_1": "btc",
"coin_type_2": "runes",
"payer_ord_addr": "tb1qge80xavle7c7k0tk7vceaavwcgpsr3jchl0w3e",
"payer_btc_addr": "tb1qge80xavle7c7k0tk7vceaavwcgpsr3jchl0w3e",
"percent": "15",
"slipper": "12",
"fee_rate": "57",
"payer_pub_key": "02d3ac7452920b1cc4653516dd4f4381a2df0a8c0aac6e3446e633a73ea63eee81:02d3ac7452920b1cc4653516dd4f4381a2df0a8c0aac6e3446e633a73ea63eee81"
}
token
POST /brc20swap/v2/remove_liquid_by_psbt HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 96
{
"order_id": "text",
"psbt": "text",
"checksum": "text",
"to_sign_inputs": [
{
"index": 1,
"type": "text"
}
]
}
{
"code": 1,
"msg": "text",
"data": null,
"req_id": "text"
}
Example
{
"psbt": "70736274ff01007d020000000123939a8ad0fa4d65784afe82604ddc2d7a68049b906987f6adaa4e4a61c2f16c0600000000ffffffff02994e00000000000022512054f638dfba2ea8d607a59ec681a1ec479f741b0f505a116fe20172fde877eede52ca040000000000160014464ef3759fcfb1eb3d76f3319ef58ec20301c658000000000001011ffc3a050000000000160014464ef3759fcfb1eb3d76f3319ef58ec20301c65801086b0247304402200b398be45be70f30793de6e31aa9a9007a954f391f82e12b7a72c663af5d94570220230c28c921ca20e94669fab5abb7baf9cc908d121d2a5ffb96643e02c2d529bd012102d3ac7452920b1cc4653516dd4f4381a2df0a8c0aac6e3446e633a73ea63eee81000000",
"order_id": "liquid_972788279311073280",
"checksum": "CAA324EB56C64FA1A6646C9AED0E2BAF",
"to_sign_inputs": null
}
token
Decimal, Percentage, Integer
Only BTC for now
POST /brc20swap/get_liquid_info HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 115
{
"address": "text",
"lp_precent": 1,
"from_tick": "text",
"to_tick": "text",
"from_coin_type": "text",
"to_coin_type": "text"
}
{
"code": 1,
"msg": "text",
"data": {
"from_amount": "text",
"to_amount": "text",
"mutisign_fee_proportion": "text"
}
}
Example
{
"address": "tb1qge80xavle7c7k0tk7vceaavwcgpsr3jchl0w3e",
"lp_precent": 35,
"from_tick": "BTC",
"to_tick": "RUNEONERUNEONE",
"from_coin_type": "btc",
"to_coin_type": "runes"
}
Explanation on Fees
The actual amount received by the user will have the key custodial service's fee deducted, which is calculated using the mutisign_fee_proportion
field returned by the backend (initially 0.3%, and may adjust in the future if the key custodial service changes).
Fee Calculation
Removing BTC-BRC20: Fee = BTC satoshi amount * 0.3%
Removing BTC-ARC20: Fee = BTC satoshi amount * 0.3% + ARC20 satoshi amount * 0.3%
Removing BRC20-BRC20: Free
Calculation of the Actual Amount Received by the User:
if (from_coin_type === "btc") {
finally_from_amount = from_amount * (1 - mutisign_fee_proportion);
if (to_coin_type === "arc20") {
finally_from_amount =
finally_from_amount - to_amount * mutisign_fee_proportion;
}
finally_to_amount = to_amount;
}
if (to_coin_type === "btc") {
finally_from_amount = from_amount;
finally_to_amount = to_amount * (1 - mutisign_fee_proportion);
if (to_coin_type === "arc20") {
finally_to_amount =
finally_to_amount - from_amount * mutisign_fee_proportion;
}
}
Last updated
Was this helpful?