goldrat/scanner.php
2025-10-13 09:04:00 +00:00

152 lines
4.8 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
function scanwallet($address,$apiKey,$detailInfo){
$gda = new \GlobalData\Client('127.0.0.1:2207');
$client = new Client([
'base_uri' => 'https://api.etherscan.io/v2/',
'timeout' => 3.0,
]);
// 想要遍历的链ID参考官方链表
$chains = [
1 => 'Ethereum',
56 => 'BNB Smart Chain',
137 => 'Polygon',
42161 => 'Arbitrum One',
8453 => 'Base',
43114 => 'Avalanche C-Chain',
42220 => 'Celo',
59144 => 'Linea',
10 => 'OP',
130 => 'Unichain',
204 => 'opBNB',
324 => 'zkSync'
];
$flag=false;
foreach ($chains as $chainId => $chainName) {
$jump=0;
if($detailInfo){
echo "🔍[Wallet Sacnner] 正在{$chainName}({$chainId})查询{$address}...\n";
}
$secondToken=$gda->second_token;
while($secondToken<1){
if($detailInfo){
echo "⏳[Wallet Sacnner] 1s QPS triggered, will sleep for one second.";
}
usleep(1000);
$secondToken=$gda->second_token;
}
$minuteToken=$gda->minute_token;
while($minuteToken<1){
if($detailInfo){
echo "⏳[Wallet Sacnner] 1min QPS triggered, will sleep for one minute.";
}
sleep(60);
$minuteToken=$gda->minute_token;
}
$params = [
'query' => [
'module' => 'account',
'action' => 'tokentx',
'address' => $address,
'startblock' => 0,
'endblock' => 99999999,
'page' => 1,
'offset' => 5,
'sort' => 'desc',
'chainid' => $chainId,
'apikey' => $apiKey
]
];
// 尝试最多5次以应对429
for ($attempt = 1; $attempt <= 5; $attempt++) {
try {
$response = $client->get('api', $params);
$statusCode = $response->getStatusCode();
if ($statusCode == 200) {
$data = json_decode($response->getBody(), true);
if ($data['status'] === '1' && count($data['result']) > 0) {
if($detailInfo){
echo "✅[Wallet Sacnner] 地址{$address}{$chainName} 上有交易记录\n";
}
return true;
} else {
if($detailInfo){
echo "❌[Wallet Sacnner] {$chainName} 无交易。\n";
}
break;
}
} elseif ($statusCode == 429) {
// 太多请求,退让(指数退避)
$delay = pow(2, $attempt);
if($detailInfo){
echo "⚠️[Wallet Sacnner]EtherScan 429 Too Many Requests{$delay} 秒后重试...\n";
}
sleep($delay);
} else {
if($detailInfo){
echo "❗[Wallet Sacnner]EtherScan HTTP错误 {$statusCode}\n";
}
break;
}
} catch (RequestException $e) {
if($detailInfo){
echo "\033[31m❌[Wallet Sacnner]EtherScan Http Request Failed: " . $e->getMessage() . "\033[0m\n";
}
sleep(pow(2, $attempt)); // 退让
} catch (ConnectException $e) {
if($detailInfo){
echo "\033[31m❌[Wallet Sacnner]EtherScan Http Request Failed: " . $e->getMessage() . "\033[0m\n";
}
sleep(pow(2, $attempt)); // 退让
}
}
}
#Additional Morph
$baselink='https://explorer-api.morphl2.io/api/v2/addresses/'.$address.'/counters';
if($detailInfo){
echo "🔍[Wallet Sacnner] 正在Morph查询{$address}...\n";
}
try {
$client = new Client([
'base_uri' => $baselink,
'timeout' => 3.0,
'http_errors' => false,
]);
$response = $client->get($baselink);
$statusCode = $response->getStatusCode();
if ($statusCode == 200) {
$data = json_decode($response->getBody(), true);
if($data['token_transfers_count']!=0){
if($detailInfo){
echo "✅[Wallet Sacnner] 地址{$address}在 Morph 上有交易记录\n";
}
return true;
} else {
if($detailInfo){
echo "❌[Wallet Sacnner] Morph 无交易。\n";
}
}
}elseif($statusCode == 404){
if($detailInfo){
echo "❌[Wallet Sacnner] Morph 无交易。\n";
}
}else{
if($detailInfo){
echo "❗[Wallet Sacnner] Morph Explorer HTTP错误 {$statusCode}\n";
}
}
} catch (RequestException $e) {
if($detailInfo){
echo "\033[31m❌[Wallet Sacnner] Morph Explorer Http Request Failed: " . $e->getMessage() . "\033[0m\n";
}
} catch (ConnectException $e) {
if($detailInfo){
echo "\033[31m❌[Wallet Sacnner] Morph Explorer Http Request Failed: " . $e->getMessage() . "\033[0m\n";
}
}
return false;
}