curl --request POST \
--url https://hedgin.xyz/api/external/v1/transactions/dlmm/add-range \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"vault": "So11111111111111111111111111111111111111112",
"position": "So11111111111111111111111111111111111111112",
"targetUpperBinId": 123,
"amountX": "1000000",
"amountY": "1000000",
"maxActiveBinSlippage": 500,
"activeBinId": 123,
"cursorBinId": 123,
"lowerBinId": 123,
"upperBinId": 123
}
'import requests
url = "https://hedgin.xyz/api/external/v1/transactions/dlmm/add-range"
payload = {
"vault": "So11111111111111111111111111111111111111112",
"position": "So11111111111111111111111111111111111111112",
"targetUpperBinId": 123,
"amountX": "1000000",
"amountY": "1000000",
"maxActiveBinSlippage": 500,
"activeBinId": 123,
"cursorBinId": 123,
"lowerBinId": 123,
"upperBinId": 123
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
vault: 'So11111111111111111111111111111111111111112',
position: 'So11111111111111111111111111111111111111112',
targetUpperBinId: 123,
amountX: '1000000',
amountY: '1000000',
maxActiveBinSlippage: 500,
activeBinId: 123,
cursorBinId: 123,
lowerBinId: 123,
upperBinId: 123
})
};
fetch('https://hedgin.xyz/api/external/v1/transactions/dlmm/add-range', 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://hedgin.xyz/api/external/v1/transactions/dlmm/add-range",
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([
'vault' => 'So11111111111111111111111111111111111111112',
'position' => 'So11111111111111111111111111111111111111112',
'targetUpperBinId' => 123,
'amountX' => '1000000',
'amountY' => '1000000',
'maxActiveBinSlippage' => 500,
'activeBinId' => 123,
'cursorBinId' => 123,
'lowerBinId' => 123,
'upperBinId' => 123
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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://hedgin.xyz/api/external/v1/transactions/dlmm/add-range"
payload := strings.NewReader("{\n \"vault\": \"So11111111111111111111111111111111111111112\",\n \"position\": \"So11111111111111111111111111111111111111112\",\n \"targetUpperBinId\": 123,\n \"amountX\": \"1000000\",\n \"amountY\": \"1000000\",\n \"maxActiveBinSlippage\": 500,\n \"activeBinId\": 123,\n \"cursorBinId\": 123,\n \"lowerBinId\": 123,\n \"upperBinId\": 123\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://hedgin.xyz/api/external/v1/transactions/dlmm/add-range")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"vault\": \"So11111111111111111111111111111111111111112\",\n \"position\": \"So11111111111111111111111111111111111111112\",\n \"targetUpperBinId\": 123,\n \"amountX\": \"1000000\",\n \"amountY\": \"1000000\",\n \"maxActiveBinSlippage\": 500,\n \"activeBinId\": 123,\n \"cursorBinId\": 123,\n \"lowerBinId\": 123,\n \"upperBinId\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://hedgin.xyz/api/external/v1/transactions/dlmm/add-range")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"vault\": \"So11111111111111111111111111111111111111112\",\n \"position\": \"So11111111111111111111111111111111111111112\",\n \"targetUpperBinId\": 123,\n \"amountX\": \"1000000\",\n \"amountY\": \"1000000\",\n \"maxActiveBinSlippage\": 500,\n \"activeBinId\": 123,\n \"cursorBinId\": 123,\n \"lowerBinId\": 123,\n \"upperBinId\": 123\n}"
response = http.request(request)
puts response.read_body{
"vault": "So11111111111111111111111111111111111111112",
"result": [
{
"transaction": "aSDinaTvuI8gbWludGxpZnk=",
"simulation": {
"unitsConsumed": 123,
"deferred": true
},
"ticket": "<string>",
"blockhash": "<string>",
"sendConcurrently": true,
"next": {
"path": "jupiter/sweep",
"body": {}
}
}
]
}{
"error": {
"code": "Validation",
"message": "vault must be a public key"
}
}{
"error": {
"code": "Unauthorized",
"message": "Invalid API key"
}
}{
"error": {
"code": "Forbidden",
"message": "Action is not enabled for this key"
}
}{
"error": {
"code": "NotFound",
"message": "Vault not found"
}
}{
"error": {
"code": "Stale",
"message": "pool price moved; refresh before flipping"
}
}{
"error": {
"code": "BodyTooLarge",
"message": "Request body is too large"
}
}{
"error": {
"code": "SlippageToleranceExceeded",
"message": "Transaction rejected during simulation or preflight"
}
}{
"error": {
"code": "RateLimited",
"message": "Too many requests, slow down"
}
}{
"error": {
"code": "Internal",
"message": "Service temporarily unavailable"
}
}{
"error": {
"code": "JupiterQuoteFailed",
"message": "Service temporarily unavailable"
}
}{
"error": {
"code": "RpcUnavailable",
"message": "Service temporarily unavailable"
}
}Fund a wide position
Requires key scope dlmm/add-range.
Returns an unsigned v0 transaction for the manager to sign. Do not send payer: the API sets it to the key’s manager and rejects a body that contains it. Unknown fields are ignored. The key’s manager must be the vault’s current on-chain authority, and the vault must be in the key’s allowlist when the key has one.
Continuation action. Builds the funding batch for a wide position from cursorBinId to the end of the position or selection. Send the next.body from a confirmed dlmm/extend step. Returns 400 when the position range changed since the flow started.
curl --request POST \
--url https://hedgin.xyz/api/external/v1/transactions/dlmm/add-range \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"vault": "So11111111111111111111111111111111111111112",
"position": "So11111111111111111111111111111111111111112",
"targetUpperBinId": 123,
"amountX": "1000000",
"amountY": "1000000",
"maxActiveBinSlippage": 500,
"activeBinId": 123,
"cursorBinId": 123,
"lowerBinId": 123,
"upperBinId": 123
}
'import requests
url = "https://hedgin.xyz/api/external/v1/transactions/dlmm/add-range"
payload = {
"vault": "So11111111111111111111111111111111111111112",
"position": "So11111111111111111111111111111111111111112",
"targetUpperBinId": 123,
"amountX": "1000000",
"amountY": "1000000",
"maxActiveBinSlippage": 500,
"activeBinId": 123,
"cursorBinId": 123,
"lowerBinId": 123,
"upperBinId": 123
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
vault: 'So11111111111111111111111111111111111111112',
position: 'So11111111111111111111111111111111111111112',
targetUpperBinId: 123,
amountX: '1000000',
amountY: '1000000',
maxActiveBinSlippage: 500,
activeBinId: 123,
cursorBinId: 123,
lowerBinId: 123,
upperBinId: 123
})
};
fetch('https://hedgin.xyz/api/external/v1/transactions/dlmm/add-range', 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://hedgin.xyz/api/external/v1/transactions/dlmm/add-range",
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([
'vault' => 'So11111111111111111111111111111111111111112',
'position' => 'So11111111111111111111111111111111111111112',
'targetUpperBinId' => 123,
'amountX' => '1000000',
'amountY' => '1000000',
'maxActiveBinSlippage' => 500,
'activeBinId' => 123,
'cursorBinId' => 123,
'lowerBinId' => 123,
'upperBinId' => 123
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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://hedgin.xyz/api/external/v1/transactions/dlmm/add-range"
payload := strings.NewReader("{\n \"vault\": \"So11111111111111111111111111111111111111112\",\n \"position\": \"So11111111111111111111111111111111111111112\",\n \"targetUpperBinId\": 123,\n \"amountX\": \"1000000\",\n \"amountY\": \"1000000\",\n \"maxActiveBinSlippage\": 500,\n \"activeBinId\": 123,\n \"cursorBinId\": 123,\n \"lowerBinId\": 123,\n \"upperBinId\": 123\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://hedgin.xyz/api/external/v1/transactions/dlmm/add-range")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"vault\": \"So11111111111111111111111111111111111111112\",\n \"position\": \"So11111111111111111111111111111111111111112\",\n \"targetUpperBinId\": 123,\n \"amountX\": \"1000000\",\n \"amountY\": \"1000000\",\n \"maxActiveBinSlippage\": 500,\n \"activeBinId\": 123,\n \"cursorBinId\": 123,\n \"lowerBinId\": 123,\n \"upperBinId\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://hedgin.xyz/api/external/v1/transactions/dlmm/add-range")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"vault\": \"So11111111111111111111111111111111111111112\",\n \"position\": \"So11111111111111111111111111111111111111112\",\n \"targetUpperBinId\": 123,\n \"amountX\": \"1000000\",\n \"amountY\": \"1000000\",\n \"maxActiveBinSlippage\": 500,\n \"activeBinId\": 123,\n \"cursorBinId\": 123,\n \"lowerBinId\": 123,\n \"upperBinId\": 123\n}"
response = http.request(request)
puts response.read_body{
"vault": "So11111111111111111111111111111111111111112",
"result": [
{
"transaction": "aSDinaTvuI8gbWludGxpZnk=",
"simulation": {
"unitsConsumed": 123,
"deferred": true
},
"ticket": "<string>",
"blockhash": "<string>",
"sendConcurrently": true,
"next": {
"path": "jupiter/sweep",
"body": {}
}
}
]
}{
"error": {
"code": "Validation",
"message": "vault must be a public key"
}
}{
"error": {
"code": "Unauthorized",
"message": "Invalid API key"
}
}{
"error": {
"code": "Forbidden",
"message": "Action is not enabled for this key"
}
}{
"error": {
"code": "NotFound",
"message": "Vault not found"
}
}{
"error": {
"code": "Stale",
"message": "pool price moved; refresh before flipping"
}
}{
"error": {
"code": "BodyTooLarge",
"message": "Request body is too large"
}
}{
"error": {
"code": "SlippageToleranceExceeded",
"message": "Transaction rejected during simulation or preflight"
}
}{
"error": {
"code": "RateLimited",
"message": "Too many requests, slow down"
}
}{
"error": {
"code": "Internal",
"message": "Service temporarily unavailable"
}
}{
"error": {
"code": "JupiterQuoteFailed",
"message": "Service temporarily unavailable"
}
}{
"error": {
"code": "RpcUnavailable",
"message": "Service temporarily unavailable"
}
}Authorizations
API key issued by a Hedgin administrator, in the form hv1_<id>_<secret>. <id> is 1 to 48 characters and <secret> is 32 to 128 characters, both from [A-Za-z0-9_-].
Body
Vault the transaction acts on.
^[1-9A-HJ-NP-Za-km-z]{32,44}$"So11111111111111111111111111111111111111112"
DLMM position owned by the vault.
^[1-9A-HJ-NP-Za-km-z]{32,44}$"So11111111111111111111111111111111111111112"
Inclusive last bin the position must reach.
Token X to add, base units.
20^\d+$"1000000"
Token Y to add, base units.
20^\d+$"1000000"
Meteora DLMM liquidity distribution.
spot, curve, bidAsk How many bins the pool's active bin may move before the transaction fails.
0 <= x <= 1000Active bin observed when the flow started. The build fails with 409 Stale when the live active bin is further away than maxActiveBinSlippage.
First bin still to fund. Must lie inside the position or selection.
Inclusive first bin of a sub-range. Send it together with upperBinId or omit both.
Inclusive last bin of a sub-range. Must lie inside the position.
