@@ -25,14 +25,33 @@ export const fetchContractFromEtherscan = async (plugin, endpoint: string | Netw
25
25
// Prefer central V2 API host with chainid param (works across Etherscan-supported networks)
26
26
const v2CentralUrl = 'https://api.etherscan.io/v2/api?chainid=' + chainId + '&module=contract&action=getsourcecode&address=' + contractAddress + '&apikey=' + etherscanKey
27
27
let response = await fetch ( v2CentralUrl )
28
+ let centralV2Status = response . status ;
29
+ let centralV2StatusText = response . statusText ;
28
30
29
31
// If central V2 not OK, try per-network V2, then per-network V1
30
32
if ( ! response . ok ) {
31
33
const v2PerNetworkUrl = 'https://' + endpointStr + '/v2/api?chainid=' + chainId + '&module=contract&action=getsourcecode&address=' + contractAddress + '&apikey=' + etherscanKey
32
- response = await fetch ( v2PerNetworkUrl )
33
- if ( ! response . ok ) {
34
+ let v2PerNetworkResponse = await fetch ( v2PerNetworkUrl )
35
+ let v2PerNetworkStatus = v2PerNetworkResponse . status ;
36
+ let v2PerNetworkStatusText = v2PerNetworkResponse . statusText ;
37
+ if ( v2PerNetworkResponse . ok ) {
38
+ response = v2PerNetworkResponse ;
39
+ } else {
34
40
const v1Url = 'https://' + endpointStr + '/api?module=contract&action=getsourcecode&address=' + contractAddress + '&apikey=' + etherscanKey
35
- response = await fetch ( v1Url )
41
+ let v1Response = await fetch ( v1Url )
42
+ let v1Status = v1Response . status ;
43
+ let v1StatusText = v1Response . statusText ;
44
+ if ( v1Response . ok ) {
45
+ response = v1Response ;
46
+ } else {
47
+ // All three endpoints failed, throw a descriptive error
48
+ throw new Error (
49
+ `All Etherscan API endpoints failed:\n` +
50
+ `Central V2: ${ v2CentralUrl } [${ centralV2Status } ${ centralV2StatusText } ]\n` +
51
+ `Per-network V2: ${ v2PerNetworkUrl } [${ v2PerNetworkStatus } ${ v2PerNetworkStatusText } ]\n` +
52
+ `Per-network V1: ${ v1Url } [${ v1Status } ${ v1StatusText } ]`
53
+ ) ;
54
+ }
36
55
}
37
56
}
38
57
0 commit comments