Extend order by API using private key
This is full example extend order by API key using private key
Last updated
This is full example extend order by API key using private key
Last updated
Requirement: TronWeb version 5.3.2
npm i tronweb@5.3.2 @noble/secp256k1@1.7.1
(Read more: )
import { TronWeb } from 'tronweb';
const TRONSAVE_API_URL = "https://api.tronsave.io"
const RECEIVER = "your-receiver-address"
const RESOURCE_TYPE = "ENERGY"
const REQUESTER_ADDRESS = "TFwUFWr3QV376677Z8VWXxGUAMFSrq1MbM"
const PRIVATE_KEY = "your-private-key"
const TRON_FULL_NODE = "https://api.trongrid.io"
const TRONSAVE_RECEIVER_ADDRESS = "TWZEhq5JuUVvGtutNgnRBATbF8BnHGyn4S"; //in testnet mode change it to "TATT1UzHRikft98bRFqApFTsaSw73ycfoS"
// Initialize TronWeb instance
const tronWeb = new TronWeb({
fullNode: TRON_FULL_NODE,
solidityNode: TRON_FULL_NODE,
eventServer: TRON_FULL_NODE,
});
const GetEstimateExtendData = async (requester, extendTo, maxPriceAccepted) => {
const url = TRONSAVE_API_URL + `/v2/get-extendable-delegates`
const body = {
extendTo, //time in seconds you want to extend to
receiver: RECEIVER, //the address that receives the resource delegate
requester, //the address that requests the resource delegate
maxPriceAccepted, //Optional. Number the maximum price you want to pay to extend
resourceType: RESOURCE_TYPE, //ENERGY or BANDWIDTH. optional. The default is ENERGY
}
const data = await fetch(url, {
method: "POST",
headers: {
"content-type": "application/json",
},
body: JSON.stringify(body)
})
const response = await data.json()
/**
* Example response
* @link
{
"error": false,
"message": "Success",
"data": {
"extendOrderBook": [
{
"price": 784,
"value": 1002
}
],
"totalDelegateAmount": 5003,
"totalAvailableExtendAmount": 5003,
"totalEstimateTrx": 4085783,
"isAbleToExtend": true,
"yourBalance": 2377366851,
"extendData": [
{
"delegator": "TGGVrYaT8Xoos...6dmSZkohGGcouYL4",
"isExtend": true,
"extraAmount": 0,
"extendTo": 1745833276
},
{
"delegator": "TQBV7xU489Rq8Z...zBhJMdrDr51wA2",
"isExtend": true,
"extraAmount": 0,
"extendTo": 1745833276
},
{
"delegator": "TSHZv6xsYHMRCbdVh...qNozxaPPjDR6",
"isExtend": true,
"extraAmount": 0,
"extendTo": 1745833276
}
]
}
}
*/
return response
}
const GetSignedTx = async (totalEstimateTrx) => {
const dataSendTrx = await tronWeb.transactionBuilder.sendTrx(TRONSAVE_RECEIVER_ADDRESS, totalEstimateTrx, REQUESTER_ADDRESS);
const signedTx = await tronWeb.trx.sign(dataSendTrx, PRIVATE_KEY);
return signedTx;
};
/**
* @param {number} extendTo time in seconds you want to extend to
* @param {boolean} maxPriceAccepted number maximum price you want to pay to extend
* @returns
*/
const SendExtendRequest = async (extendTo, maxPriceAccepted) => {
const url = TRONSAVE_API_URL + `/v2/extend-request`
// Get estimate extendable delegates
const estimateResponse = await GetEstimateExtendData(REQUESTER_ADDRESS, extendTo, maxPriceAccepted)
const extendData = estimateResponse.data?.extendData
// check if there are extendable delegates
if (extendData && extendData.length) {
const totalEstimateTrx = estimateResponse.data?.totalEstimateTrx
// Build a signed transaction by using the private key
const signedTx = await GetSignedTx(totalEstimateTrx)
const body = {
extendData: extendData,
receiver: RECEIVER,
signedTx
}
const data = await fetch(url, {
method: "POST",
headers: {
"content-type": "application/json",
},
body: JSON.stringify(body)
})
const response = await data.json()
/**
* Example response
{
error: false,
message: 'Success',
data: { orderId: '680b5ac7b09a385fb3d582ff' }
}
*/
return response
}
return []
}
//Example run code
const ClientCode = async () => {
const extendTo = Math.floor(new Date().getTime() / 1000) + 3 * 86400 //Extend to 3 next days
const maxPriceAccepted = 900
const response = await SendExtendRequest(extendTo, maxPriceAccepted)
console.log(response)
}
ClientCode()
<?php
// Configuration
const TRONSAVE_API_URL = "https://api.tronsave.io";
const RECEIVER = "your-receiver-address";
const RESOURCE_TYPE = "ENERGY";
const REQUESTER_ADDRESS = "TFwUFWr3QV376677Z8VWXxGUAMFSrq1MbM";
const PRIVATE_KEY = "your-private-key";
const TRON_FULL_NODE = "https://api.trongrid.io";
const TRONSAVE_RECEIVER_ADDRESS = "TWZEhq5JuUVvGtutNgnRBATbF8BnHGyn4S";
/**
* Get estimate extend data
* @param string $requester
* @param int $extendTo
* @param int $maxPriceAccepted
* @return array
*/
function getEstimateExtendData(string $requester, int $extendTo, int $maxPriceAccepted): array {
$url = TRONSAVE_API_URL . "/v2/get-extendable-delegates";
$body = [
'extendTo' => $extendTo,
'receiver' => RECEIVER,
'requester' => $requester,
'maxPriceAccepted' => $maxPriceAccepted,
'resourceType' => RESOURCE_TYPE,
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($body));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json'
]);
$response = curl_exec($ch);
curl_close($ch);
return json_decode($response, true);
}
/**
* Get signed transaction
* @param int $totalEstimateTrx
* @return array
*/
function getSignedTx(int $totalEstimateTrx): array {
// This is a placeholder. In real implementation, you would use TronWeb PHP SDK
return [
'visible' => false,
'txID' => '...',
'raw_data' => [
'contract' => [
[
'parameter' => [
'value' => [
'amount' => $totalEstimateTrx,
'owner_address' => REQUESTER_ADDRESS,
'to_address' => TRONSAVE_RECEIVER_ADDRESS
],
'type_url' => 'type.googleapis.com/protocol.TransferContract'
],
'type' => 'TransferContract'
]
]
]
];
}
/**
* Send extend request
* @param int $extendTo
* @param int $maxPriceAccepted
* @return array
*/
function sendExtendRequest(int $extendTo, int $maxPriceAccepted): array {
$url = TRONSAVE_API_URL . "/v2/extend-request";
$estimateResponse = getEstimateExtendData(REQUESTER_ADDRESS, $extendTo, $maxPriceAccepted);
$extendData = $estimateResponse['data']['extendData'] ?? [];
if (!empty($extendData)) {
$totalEstimateTrx = $estimateResponse['data']['totalEstimateTrx'];
$signedTx = getSignedTx($totalEstimateTrx);
$body = [
'extendData' => $extendData,
'receiver' => RECEIVER,
'signedTx' => $signedTx
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($body));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json'
]);
$response = curl_exec($ch);
curl_close($ch);
return json_decode($response, true);
}
return [];
}
// Example run code
try {
$extendTo = time() + (3 * 86400); // Extend to 3 next days
$maxPriceAccepted = 900;
$response = sendExtendRequest($extendTo, $maxPriceAccepted);
print_r($response);
} catch (Exception $e) {
echo "Error: " . $e->getMessage() . "\n";
}
//import time
import requests
from typing import Dict, Any, Optional
# Configuration
TRONSAVE_API_URL = "https://api.tronsave.io"
RECEIVER = "your-receiver-address"
RESOURCE_TYPE = "ENERGY"
REQUESTER_ADDRESS = "TFwUFWr3QV376677Z8VWXxGUAMFSrq1MbM"
PRIVATE_KEY = "your-private-key"
TRON_FULL_NODE = "https://api.trongrid.io"
TRONSAVE_RECEIVER_ADDRESS = "TWZEhq5JuUVvGtutNgnRBATbF8BnHGyn4S"
def get_estimate_extend_data(requester: str, extend_to: int, max_price_accepted: int) -> Dict[str, Any]:
"""Get estimate extend data"""
url = f"{TRONSAVE_API_URL}/v2/get-extendable-delegates"
body = {
'extendTo': extend_to,
'receiver': RECEIVER,
'requester': requester,
'maxPriceAccepted': max_price_accepted,
'resourceType': RESOURCE_TYPE,
}
response = requests.post(url, json=body)
return response.json()
def get_signed_tx(total_estimate_trx: int) -> Dict[str, Any]:
"""Get signed transaction"""
# This is a placeholder. In real implementation, you would use TronWeb Python SDK
return {
'visible': False,
'txID': '...',
'raw_data': {
'contract': [{
'parameter': {
'value': {
'amount': total_estimate_trx,
'owner_address': REQUESTER_ADDRESS,
'to_address': TRONSAVE_RECEIVER_ADDRESS
},
'type_url': 'type.googleapis.com/protocol.TransferContract'
},
'type': 'TransferContract'
}]
}
}
def send_extend_request(extend_to: int, max_price_accepted: int) -> Dict[str, Any]:
"""Send extend request"""
url = f"{TRONSAVE_API_URL}/v2/extend-request"
estimate_response = get_estimate_extend_data(REQUESTER_ADDRESS, extend_to, max_price_accepted)
extend_data = estimate_response.get('data', {}).get('extendData', [])
if extend_data:
total_estimate_trx = estimate_response['data']['totalEstimateTrx']
signed_tx = get_signed_tx(total_estimate_trx)
body = {
'extendData': extend_data,
'receiver': RECEIVER,
'signedTx': signed_tx
}
response = requests.post(url, json=body)
return response.json()
return {}
def main() -> None:
"""Main function"""
try:
extend_to = int(time.time()) + (3 * 86400) # Extend to 3 next days
max_price_accepted = 900
response = send_extend_request(extend_to, max_price_accepted)
print("Response:", response)
except Exception as e:
print(f"Error: {str(e)}")
if __name__ == "__main__":
main()