Răsfoiți Sursa

trx手续费

doge 22 ore în urmă
părinte
comite
c751c68a99
5 a modificat fișierele cu 50 adăugiri și 8 ștergeri
  1. 13 0
      app/Helpers/TronHelper.php
  2. 26 6
      app/Services/CollectService.php
  3. 2 0
      config/app.php
  4. 6 0
      example.env
  5. 3 2
      node/index.js

+ 13 - 0
app/Helpers/TronHelper.php

@@ -73,6 +73,17 @@ class TronHelper
         return trim((string) config('app.tron_pro_api_key', ''));
     }
 
+    public static function getUsdtTransferFeeLimitTrx(): float
+    {
+        $value = (float) config('app.tron_usdt_transfer_fee_limit', 30);
+        return $value > 0 ? $value : 30.0;
+    }
+
+    public static function getUsdtTransferFeeLimitSun(): int
+    {
+        return (int) round(self::getUsdtTransferFeeLimitTrx() * 1000000);
+    }
+
     public static function throttleTronRequest(int $seconds = self::GLOBAL_TRON_RATE_LIMIT_SECONDS, string $key = self::GLOBAL_TRON_RATE_LIMIT_KEY): void
     {
         $store = self::getTronRateLimitStore();
@@ -155,6 +166,7 @@ class TronHelper
         }
         $contractAddress = self::getContractAddress('USDT');
         $apiKey = self::getTronProApiKey();
+        $feeLimitSun = self::getUsdtTransferFeeLimitSun();
         $parts = [
             escapeshellcmd($nodeBin),
             escapeshellarg($nodeScript),
@@ -163,6 +175,7 @@ class TronHelper
             escapeshellarg($contractAddress),
             escapeshellarg($fullNodeUrl),
             escapeshellarg($amount),
+            escapeshellarg($feeLimitSun),
         ];
         if ($apiKey !== '') {
             $parts[] = escapeshellarg($apiKey);

+ 26 - 6
app/Services/CollectService.php

@@ -20,6 +20,12 @@ class CollectService extends BaseService
 {
     public static string $MODEL = Collect::class;
     public static $THRESHOLD = 10; // 最小归集金额(USDT)
+
+    public static function getRequiredTrxBalance(): float
+    {
+        $value = (float) config('app.collect_required_trx_balance', 15);
+        return $value > 0 ? $value : 15.0;
+    }
     /**
      * @description: 模型
      * @return {string}
@@ -301,6 +307,7 @@ class CollectService extends BaseService
             'member_id' => $memberId,
             'from_address' => $walletInfo->address,
             'threshold' => self::$THRESHOLD,
+            'required_trx_balance' => self::getRequiredTrxBalance(),
             'to_address' => $to_address,
             'has_trx_private_key' => !empty($trx_private_key),
         ]);
@@ -354,14 +361,20 @@ class CollectService extends BaseService
             $privateKey = $wallets['private_key'];
             $trxBalance = TronHelper::getTrxBalance($v['from_address']);
             $item['trx_balance'] = $trxBalance;
+            $requiredTrxBalance = self::getRequiredTrxBalance();
+            $item['required_trx_balance'] = $requiredTrxBalance;
 
-            if ($trxBalance < 10) {
-                $trxResult = TronHelper::sendTrx($trx_private_key, $v['from_address'], 10);
+            if ($trxBalance < $requiredTrxBalance) {
+                $topupAmount = round($requiredTrxBalance - $trxBalance, 6);
+                $item['trx_topup_amount'] = $topupAmount;
+                $trxResult = TronHelper::sendTrx($trx_private_key, $v['from_address'], $topupAmount);
                 $item['trx_topup_result'] = $trxResult;
                 Log::info('syncCollectStayByMember topup trx', [
                     'member_id' => $memberId,
                     'from_address' => $v['from_address'],
                     'trx_balance' => $trxBalance,
+                    'required_trx_balance' => $requiredTrxBalance,
+                    'topup_amount' => $topupAmount,
                     'result' => $trxResult,
                 ]);
 
@@ -384,7 +397,7 @@ class CollectService extends BaseService
 
                 $trxBalance = TronHelper::getTrxBalance($v['from_address']);
                 $item['trx_balance_after_topup'] = $trxBalance;
-                if ($trxBalance < 10) {
+                if ($trxBalance < $requiredTrxBalance) {
                     $error = 'TRX余额仍不足,停止归集';
                     $data['status'] = self::model()::STATUS_STAY;
                     $data['to_address'] = null;
@@ -460,6 +473,7 @@ class CollectService extends BaseService
 
         Log::info('syncCollectStay start', [
             'threshold' => self::$THRESHOLD,
+            'required_trx_balance' => self::getRequiredTrxBalance(),
             'to_address' => $to_address,
             'has_trx_private_key' => !empty($trx_private_key),
         ]);
@@ -508,13 +522,19 @@ class CollectService extends BaseService
             $privateKey = $wallets['private_key'];
             $trxBalance = TronHelper::getTrxBalance($v['from_address']);
             $item['trx_balance'] = $trxBalance;
+            $requiredTrxBalance = self::getRequiredTrxBalance();
+            $item['required_trx_balance'] = $requiredTrxBalance;
 
-            if($trxBalance < 10){
-                $trxResult = TronHelper::sendTrx($trx_private_key,$v['from_address'],10);
+            if($trxBalance < $requiredTrxBalance){
+                $topupAmount = round($requiredTrxBalance - $trxBalance, 6);
+                $item['trx_topup_amount'] = $topupAmount;
+                $trxResult = TronHelper::sendTrx($trx_private_key,$v['from_address'],$topupAmount);
                 $item['trx_topup_result'] = $trxResult;
                 Log::info('syncCollectStay topup trx', [
                     'from_address' => $v['from_address'],
                     'trx_balance' => $trxBalance,
+                    'required_trx_balance' => $requiredTrxBalance,
+                    'topup_amount' => $topupAmount,
                     'result' => $trxResult,
                 ]);
 
@@ -537,7 +557,7 @@ class CollectService extends BaseService
 
                 $trxBalance = TronHelper::getTrxBalance($v['from_address']);
                 $item['trx_balance_after_topup'] = $trxBalance;
-                if ($trxBalance < 10) {
+                if ($trxBalance < $requiredTrxBalance) {
                     $error = 'TRX余额仍不足,停止归集';
                     $data['status'] = self::model()::STATUS_STAY;
                     $data['to_address'] = null;

+ 2 - 0
config/app.php

@@ -8,6 +8,8 @@ return [
     'trx_private_key' => env('TRX_PRIVATE_KEY',''),
     'tron_network' => env('TRON_NETWORK','main'),
     'tron_pro_api_key' => env('TRON_PRO_API_KEY',''),
+    'tron_usdt_transfer_fee_limit' => env('TRON_USDT_TRANSFER_FEE_LIMIT', '30'),
+    'collect_required_trx_balance' => env('COLLECT_REQUIRED_TRX_BALANCE', '15'),
 
     // 第三方支付配置
     'tree_payment_merchant_id' => env('TREE_PAYMENT_MERCHANT_ID',''),

+ 6 - 0
example.env

@@ -58,6 +58,12 @@ TRON_NETWORK=main
 # TronGrid API Key
 TRON_PRO_API_KEY=
 
+# TRC20-USDT 转账最大手续费(TRX)
+TRON_USDT_TRANSFER_FEE_LIMIT=30
+
+# 归集前来源地址至少保留的 TRX 余额
+COLLECT_REQUIRED_TRX_BALANCE=15
+
 #钱宝第三方支付配置
 TREE_PAYMENT_MERCHANT_ID= 
 TREE_PAYMENT_SECRET=

+ 3 - 2
node/index.js

@@ -6,7 +6,8 @@ const toAddress = process.argv[3];
 const contractAddress = process.argv[4];
 const fullNodeUrl = process.argv[5] || 'https://api.trongrid.io'; // 默认主网
 const amount = parseFloat(process.argv[6]); // 默认转1个USDT
-const tronProApiKey = process.argv[7] || '';
+const feeLimitSun = parseInt(process.argv[7] || '100000000', 10);
+const tronProApiKey = process.argv[8] || '';
 
 // 2. 初始化 TronWeb 实例
 const tronWeb = new TronWeb({
@@ -24,7 +25,7 @@ async function sendTRC20() {
             try {
                 const contract = await tronWeb.contract().at(contractAddress);
                 const tx = await contract.methods.transfer(toAddress, usdtAmount).send({
-                    feeLimit: 10_000_000,
+                    feeLimit: feeLimitSun,
                 }, privateKey);
 
                 console.log(JSON.stringify({ success: true, txid: tx }));