使用私钥通过 API 扩展订单
这是使用私钥通过 API 密钥扩展订单的完整示例。
Last updated
这是使用私钥通过 API 密钥扩展订单的完整示例。
Last updated
要求:TronWeb 版本 5.3.2
npm i tronweb@5.3.2 @noble/secp256k1@1.7.1
(了解更多:)
const TronWeb = require('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()