Skip to content

Commit 1c31f95

Browse files
committed
Allow CCIP-read to continue during low-level fetch failures (#4842).
1 parent 5aba496 commit 1c31f95

File tree

2 files changed

+36
-10
lines changed

2 files changed

+36
-10
lines changed

src.ts/_tests/test-providers-ccip.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ describe("Test CCIP execution", function() {
2323
assert.equal(result, keccak256(check), "response is equal");
2424
}
2525

26-
const address = "0xaeaa06a37e6421ac63120d6daddee0ffa04b43e8";
26+
const address = "0xb66e9b20258712bfb9fd40acb13d7712ef149d6e";
2727
const networkName = "sepolia";
2828

2929
const calldata = "0x1234";
@@ -176,6 +176,21 @@ describe("Test CCIP execution", function() {
176176
verify(address, calldata, result);
177177
});
178178

179+
it("testGetDeadHostFallback passes if any URL returns correctly", async function() {
180+
this.timeout(60000);
181+
182+
const provider = connect(networkName);
183+
184+
// testGetDeadHostFallback(bytes callData = "0x1234")
185+
const tx = {
186+
to: address, enableCcipRead: true,
187+
data: "0x0324be5a000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000021234000000000000000000000000000000000000000000000000000000000000"
188+
}
189+
190+
const result = await provider.call(tx);
191+
verify(address, calldata, result);
192+
});
193+
179194
it("testPost passes under normal operation", async function() {
180195
this.timeout(60000);
181196

src.ts/providers/abstract-provider.ts

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ import {
4242

4343
import type { Addressable, AddressLike } from "../address/index.js";
4444
import type { BigNumberish, BytesLike } from "../utils/index.js";
45-
import type { Listener } from "../utils/index.js";
45+
import type { FetchResponse, Listener } from "../utils/index.js";
4646

4747
import type { Networkish } from "./network.js";
4848
import type { FetchUrlFeeDataNetworkPlugin } from "./plugins-network.js";
@@ -604,15 +604,26 @@ export class AbstractProvider implements Provider {
604604

605605
let errorMessage = "unknown error";
606606

607-
const resp = await request.send();
607+
// Fetch the resource...
608+
let resp: FetchResponse;
608609
try {
609-
const result = resp.bodyJson;
610-
if (result.data) {
611-
this.emit("debug", { action: "receiveCcipReadFetchResult", request, result });
612-
return result.data;
613-
}
614-
if (result.message) { errorMessage = result.message; }
615-
this.emit("debug", { action: "receiveCcipReadFetchError", request, result });
610+
resp = await request.send();
611+
} catch (error: any) {
612+
// ...low-level fetch error (missing host, bad SSL, etc.),
613+
// so try next URL
614+
errorMessages.push(error.message);
615+
this.emit("debug", { action: "receiveCcipReadFetchError", request, result: { error } });
616+
continue;
617+
}
618+
619+
try {
620+
const result = resp.bodyJson;
621+
if (result.data) {
622+
this.emit("debug", { action: "receiveCcipReadFetchResult", request, result });
623+
return result.data;
624+
}
625+
if (result.message) { errorMessage = result.message; }
626+
this.emit("debug", { action: "receiveCcipReadFetchError", request, result });
616627
} catch (error) { }
617628

618629
// 4xx indicates the result is not present; stop

0 commit comments

Comments
 (0)