WIN-2308041133\Administrator 6 months ago
parent
commit
e25c340280
1 changed files with 75 additions and 24 deletions
  1. 75 24
      application/api/controller/Pay.php

+ 75 - 24
application/api/controller/Pay.php

@@ -6,6 +6,7 @@ use app\common\controller\Api;
 use blockchain\TronService;
 use blockchain\Web3Service;
 use fast\Random;
+use GuzzleHttp\Exception\RequestException;
 use think\Validate;
 use think\Db;
 use app\common\model\MoneyLog;
@@ -944,35 +945,85 @@ class Pay extends Api
     }
     public function test(){
         $service = Web3Service::instance('bsc', 'usdt', '');
-        $info =$service->getLastTransfer([], ['0xbfc3b2193653ebf94bfa3fe586627b9c01f26db9'],1748293200);
+//        $info =$service->getLastTransfer([], ['0xbfc3b2193653ebf94bfa3fe586627b9c01f26db9'],1748293200);
 
+// 设置常量
+        define('BSC_BLOCKS_PER_SECOND', 3); // BSC平均每秒3个区块
+        $toAddress = '0xbfc3b2193653ebf94bfa3fe586627b9c01f26db9';
+        $targetTimestamp = 1748379600;
 
+// 计算起始区块(基于时间戳估算)
+        $currentTimestamp = time();
+        $currentBlockEstimate = intval($currentTimestamp * BSC_BLOCKS_PER_SECOND);
+        $startBlockEstimate = intval($targetTimestamp * BSC_BLOCKS_PER_SECOND);
 
-        foreach ($info as $k => $v){
-            $value = $v->params['value']->toString();
-            var_dump($value);
-            $value = bcdiv($value, bcpow(10, get_token_info('bsc',$v['token'], 'decimal')), 12);
-            var_dump($value);die();
+// 分页参数
+        $pageSize = 500; // 初始分页大小(区块数)
+        $maxPages = 100; // 最大分页次数
+        $allTransfers = [];
+
+// 分页查询
+        for ($i = 0; $i < $maxPages; $i++) {
+            $fromBlock = $startBlockEstimate + ($i * $pageSize);
+            $toBlock = $fromBlock + $pageSize - 1;
+
+            // 确保不查询超过当前区块
+            if ($fromBlock > $currentBlockEstimate) break;
+
+            try {
+                $transfers = $service->getLastTransfer(
+                    [],
+                    [$toAddress],
+                    0, // 禁用时间戳过滤
+                    $fromBlock,
+                    min($toBlock, $currentBlockEstimate)
+                );
+
+                $allTransfers = array_merge($allTransfers, $transfers);
+
+                // 成功时增大分页
+                $pageSize = min(5000, $pageSize * 2);
+
+            } catch (RequestException $e) {
+                if (strpos($e->getMessage(), '413') !== false) {
+                    // 减小分页并重试当前范围
+                    $pageSize = max(100, intval($pageSize / 2));
+                    $i--; // 重试当前页
+                    continue;
+                }
+                throw $e;
+            }
+
+            // 添加延迟防止请求过密
+            usleep(100000); // 100ms
+
+            // 提前终止条件:已查询到足够新的区块
+            $latestTransferTimestamp = !empty($transfers) ? max(array_column($transfers, 'timestamp')) : 0;
+            if ($latestTransferTimestamp >= $currentTimestamp - 60) { // 最新1分钟内
+                break;
+            }
         }
 
+// 时间戳过滤
+        $filteredTransfers = array_filter($allTransfers, function($t) use ($targetTimestamp) {
+            return $t->timestamp >= $targetTimestamp;
+        });
+
+// 排序并获取最新转账
+        usort($filteredTransfers, function($a, $b) {
+            return $b->timestamp - $a->timestamp;
+        });
+
+        $info = $filteredTransfers[0] ?? null;
+
+//        foreach ($info as $k => $v){
+//            $value = $v->params['value']->toString();
+//            var_dump($value);
+//            $value = bcdiv($value, bcpow(10, get_token_info('bsc',$v['token'], 'decimal')), 12);
+//            var_dump($value);die();
+//        }
+
         var_dump($info);die();
-//        $info =$service->getLastTransfer(['0x83105BDFAc1a15DF3C22D019Ac2F2937AC1Ef098'], ['0x8f5f8daC38461E5b1A6b230D30433f8A593CCD57'], 1748315888);
-//// 1. 确保地址全小写
-//        $fromAddress = '0x83105bdfac1a15df3c22d019ac2f2937ac1ef098';
-//        $toAddress = '0x8f5f8dac38461e5b1a6b230d30433f8a593ccd57';
-//
-//// 2. 手动构造最小化的过滤条件
-//        $filter = [
-//            'fromBlock' => '0x' . dechex(28000000), // 起始区块高度
-//            'toBlock' => 'latest',
-//            'topics' => [
-//                '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', // USDT Transfer事件签名
-//                '0x000000000000000000000000' . substr($fromAddress, 2), // 发送方
-//                '0x000000000000000000000000' . substr($toAddress, 2)    // 接收方
-//            ]
-//        ];
-//
-//// 3. 直接调用底层方法(避免封装方法添加额外参数)
-//        $transfers = $service->getEth()->getLogs($filter);
+
     }
 }