This commit is contained in:
2025-10-13 09:04:00 +00:00
parent 7a3b2960f8
commit 4ee3212899
230 changed files with 40880 additions and 245 deletions
+152
View File
@@ -0,0 +1,152 @@
<?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;
}