curl --request POST \
--url https://tx-builder-testnet.avantisfi.com/v2/trade/close-coin \
--header 'Content-Type: application/json' \
--data '
{
"trader": "<string>",
"tradeIndex": 1,
"coinExposure": "<string>",
"pairIndex": 1,
"pair": "<string>",
"delegate": "<string>",
"expectedPrice": "<string>",
"executionFeeWei": "<string>"
}
'import requests
url = "https://tx-builder-testnet.avantisfi.com/v2/trade/close-coin"
payload = {
"trader": "<string>",
"tradeIndex": 1,
"coinExposure": "<string>",
"pairIndex": 1,
"pair": "<string>",
"delegate": "<string>",
"expectedPrice": "<string>",
"executionFeeWei": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
trader: '<string>',
tradeIndex: 1,
coinExposure: '<string>',
pairIndex: 1,
pair: '<string>',
delegate: '<string>',
expectedPrice: '<string>',
executionFeeWei: '<string>'
})
};
fetch('https://tx-builder-testnet.avantisfi.com/v2/trade/close-coin', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://tx-builder-testnet.avantisfi.com/v2/trade/close-coin",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'trader' => '<string>',
'tradeIndex' => 1,
'coinExposure' => '<string>',
'pairIndex' => 1,
'pair' => '<string>',
'delegate' => '<string>',
'expectedPrice' => '<string>',
'executionFeeWei' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://tx-builder-testnet.avantisfi.com/v2/trade/close-coin"
payload := strings.NewReader("{\n \"trader\": \"<string>\",\n \"tradeIndex\": 1,\n \"coinExposure\": \"<string>\",\n \"pairIndex\": 1,\n \"pair\": \"<string>\",\n \"delegate\": \"<string>\",\n \"expectedPrice\": \"<string>\",\n \"executionFeeWei\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://tx-builder-testnet.avantisfi.com/v2/trade/close-coin")
.header("Content-Type", "application/json")
.body("{\n \"trader\": \"<string>\",\n \"tradeIndex\": 1,\n \"coinExposure\": \"<string>\",\n \"pairIndex\": 1,\n \"pair\": \"<string>\",\n \"delegate\": \"<string>\",\n \"expectedPrice\": \"<string>\",\n \"executionFeeWei\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://tx-builder-testnet.avantisfi.com/v2/trade/close-coin")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"trader\": \"<string>\",\n \"tradeIndex\": 1,\n \"coinExposure\": \"<string>\",\n \"pairIndex\": 1,\n \"pair\": \"<string>\",\n \"delegate\": \"<string>\",\n \"expectedPrice\": \"<string>\",\n \"executionFeeWei\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"ok": true,
"data": {
"to": "0x0000000000000000000000000000000000000000",
"from": "0x0000000000000000000000000000000000000000",
"data": "<string>",
"value": "0x0",
"chainId": 123,
"description": "<string>",
"meta": {
"pair": "<string>",
"pairIndex": 123,
"delegated": true,
"executionFeeWei": "<string>",
"tradeIndex": 123,
"expectedPrice": 123,
"coinExposure": "<string>"
}
}
}{
"ok": false,
"error": {
"code": "BAD_REQUEST",
"message": "<string>",
"details": "<unknown>"
}
}Build a market-close transaction for a fixed base-asset exposure
Like /v2/trade/close, but the amount to close is expressed in base-asset units (e.g. close exactly 0.25 ETH of exposure). Current exposure is in GET /v2/positions → trades[].coinExposure.
curl --request POST \
--url https://tx-builder-testnet.avantisfi.com/v2/trade/close-coin \
--header 'Content-Type: application/json' \
--data '
{
"trader": "<string>",
"tradeIndex": 1,
"coinExposure": "<string>",
"pairIndex": 1,
"pair": "<string>",
"delegate": "<string>",
"expectedPrice": "<string>",
"executionFeeWei": "<string>"
}
'import requests
url = "https://tx-builder-testnet.avantisfi.com/v2/trade/close-coin"
payload = {
"trader": "<string>",
"tradeIndex": 1,
"coinExposure": "<string>",
"pairIndex": 1,
"pair": "<string>",
"delegate": "<string>",
"expectedPrice": "<string>",
"executionFeeWei": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
trader: '<string>',
tradeIndex: 1,
coinExposure: '<string>',
pairIndex: 1,
pair: '<string>',
delegate: '<string>',
expectedPrice: '<string>',
executionFeeWei: '<string>'
})
};
fetch('https://tx-builder-testnet.avantisfi.com/v2/trade/close-coin', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://tx-builder-testnet.avantisfi.com/v2/trade/close-coin",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'trader' => '<string>',
'tradeIndex' => 1,
'coinExposure' => '<string>',
'pairIndex' => 1,
'pair' => '<string>',
'delegate' => '<string>',
'expectedPrice' => '<string>',
'executionFeeWei' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://tx-builder-testnet.avantisfi.com/v2/trade/close-coin"
payload := strings.NewReader("{\n \"trader\": \"<string>\",\n \"tradeIndex\": 1,\n \"coinExposure\": \"<string>\",\n \"pairIndex\": 1,\n \"pair\": \"<string>\",\n \"delegate\": \"<string>\",\n \"expectedPrice\": \"<string>\",\n \"executionFeeWei\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://tx-builder-testnet.avantisfi.com/v2/trade/close-coin")
.header("Content-Type", "application/json")
.body("{\n \"trader\": \"<string>\",\n \"tradeIndex\": 1,\n \"coinExposure\": \"<string>\",\n \"pairIndex\": 1,\n \"pair\": \"<string>\",\n \"delegate\": \"<string>\",\n \"expectedPrice\": \"<string>\",\n \"executionFeeWei\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://tx-builder-testnet.avantisfi.com/v2/trade/close-coin")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"trader\": \"<string>\",\n \"tradeIndex\": 1,\n \"coinExposure\": \"<string>\",\n \"pairIndex\": 1,\n \"pair\": \"<string>\",\n \"delegate\": \"<string>\",\n \"expectedPrice\": \"<string>\",\n \"executionFeeWei\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"ok": true,
"data": {
"to": "0x0000000000000000000000000000000000000000",
"from": "0x0000000000000000000000000000000000000000",
"data": "<string>",
"value": "0x0",
"chainId": 123,
"description": "<string>",
"meta": {
"pair": "<string>",
"pairIndex": 123,
"delegated": true,
"executionFeeWei": "<string>",
"tradeIndex": 123,
"expectedPrice": 123,
"coinExposure": "<string>"
}
}
}{
"ok": false,
"error": {
"code": "BAD_REQUEST",
"message": "<string>",
"details": "<unknown>"
}
}Body
The trader (position owner). USDC collateral is pulled from and paid out to this address.
Position slot index for this trader + pair (0-based; a trader can hold several positions on the same pair). Read it from GET /v2/positions → trades[].trade.index.
x >= 0Exposure to close, in base-asset units (e.g. 0.5 = 0.5 ETH on ETH/USD).
Pair index (alternative to pair).
x >= 0Pair symbol, e.g. ETH/USD (separators /, -, _ accepted; case-insensitive).
1Optional pre-authorized delegate. When set, the call is wrapped in delegatedAction(trader, …) and from becomes this address — the delegate signs the transaction and pays gas. Register one via /v2/delegate/set.
The price you expect to execute at; used for the on-chain slippage check. Resolved from the live price feed when omitted.
ETH (wei) attached as msg.value and forwarded to the Avantis operator that fulfills the order. Defaults to the service value shown in /v2/meta → defaults.executionFeeWei.
Response
Success envelope: ok is true and data carries the payload documented below.