@@ -25,14 +25,33 @@ export const fetchContractFromEtherscan = async (plugin, endpoint: string | Netw
2525 // Prefer central V2 API host with chainid param (works across Etherscan-supported networks)
2626 const v2CentralUrl = 'https://api.etherscan.io/v2/api?chainid=' + chainId + '&module=contract&action=getsourcecode&address=' + contractAddress + '&apikey=' + etherscanKey
2727 let response = await fetch ( v2CentralUrl )
28+ let centralV2Status = response . status ;
29+ let centralV2StatusText = response . statusText ;
2830
2931 // If central V2 not OK, try per-network V2, then per-network V1
3032 if ( ! response . ok ) {
3133 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 {
3440 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+ }
3655 }
3756 }
3857
0 commit comments