|
|
@@ -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);
|
|
|
+
|
|
|
}
|
|
|
}
|