Skip to content

Commit 4a21c60

Browse files
committed
fall back to regular rpc methods if wiresaw is down
1 parent c121301 commit 4a21c60

File tree

1 file changed

+82
-60
lines changed

1 file changed

+82
-60
lines changed

packages/common/src/transports/wiresaw.ts

Lines changed: 82 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -27,86 +27,108 @@ export function wiresaw<const wiresawTransport extends Transport>(
2727
...rest,
2828
// TODO: type `request` so we don't have to cast
2929
async request(req): ReturnType<EIP1193RequestFn> {
30-
if (req.method === "eth_chainId") {
31-
if (chainId != null) return chainId;
32-
if (transport.fallbackEth) {
33-
const { request: fallbackRequest } = transport.fallbackEth(opts);
34-
return (chainId = await fallbackRequest(req));
30+
try {
31+
if (req.method === "eth_chainId") {
32+
if (chainId != null) return chainId;
33+
if (transport.fallbackEth) {
34+
const { request: fallbackRequest } = transport.fallbackEth(opts);
35+
return (chainId = await fallbackRequest(req));
36+
}
37+
return (chainId = await originalRequest(req));
3538
}
36-
return (chainId = await originalRequest(req));
37-
}
3839

39-
if (req.method === "eth_estimateGas") {
40-
return originalRequest({ ...req, method: "wiresaw_estimateGas" });
41-
}
40+
if (req.method === "eth_estimateGas") {
41+
return await originalRequest({ ...req, method: "wiresaw_estimateGas" });
42+
}
4243

43-
if (req.method === "eth_call") {
44-
return originalRequest({ ...req, method: "wiresaw_call" });
45-
}
44+
if (req.method === "eth_call") {
45+
return await originalRequest({ ...req, method: "wiresaw_call" });
46+
}
4647

47-
if (req.method === "eth_getTransactionCount") {
48-
return originalRequest({ ...req, method: "wiresaw_getTransactionCount" });
49-
}
48+
if (req.method === "eth_getTransactionCount") {
49+
return await originalRequest({ ...req, method: "wiresaw_getTransactionCount" });
50+
}
5051

51-
if (req.method === "eth_getTransactionReceipt") {
52-
return getTransactionReceipt((req.params as [Hex])[0]);
53-
}
52+
if (req.method === "eth_getTransactionReceipt") {
53+
return await getTransactionReceipt((req.params as [Hex])[0]);
54+
}
5455

55-
if (req.method === "eth_sendUserOperation") {
56-
const { userOpHash, txHash } = (await originalRequest({
57-
...req,
58-
method: "wiresaw_sendUserOperation",
59-
})) as WiresawSendUserOperationResult;
60-
transactionHashes[userOpHash] = txHash;
61-
return userOpHash;
62-
}
56+
if (req.method === "eth_sendUserOperation") {
57+
const { userOpHash, txHash } = (await originalRequest({
58+
...req,
59+
method: "wiresaw_sendUserOperation",
60+
})) as WiresawSendUserOperationResult;
61+
transactionHashes[userOpHash] = txHash;
62+
return userOpHash;
63+
}
6364

64-
if (req.method === "eth_getUserOperationReceipt") {
65-
const userOpHash = (req.params as [Hex])[0];
66-
const knownTransactionHash = transactionHashes[userOpHash];
67-
if (knownTransactionHash) {
68-
const transactionReceipt = await getTransactionReceipt(knownTransactionHash);
69-
if (transactionReceipt) {
70-
return getUserOperationReceipt(userOpHash, transactionReceipt);
65+
if (req.method === "eth_getUserOperationReceipt") {
66+
const userOpHash = (req.params as [Hex])[0];
67+
const knownTransactionHash = transactionHashes[userOpHash];
68+
if (knownTransactionHash) {
69+
const transactionReceipt = await getTransactionReceipt(knownTransactionHash);
70+
if (transactionReceipt) {
71+
return getUserOperationReceipt(userOpHash, transactionReceipt);
72+
}
73+
}
74+
if (transport.fallbackBundler) {
75+
const { request: fallbackRequest } = transport.fallbackBundler(opts);
76+
return await fallbackRequest(req);
7177
}
7278
}
73-
if (transport.fallbackBundler) {
74-
const { request: fallbackRequest } = transport.fallbackBundler(opts);
75-
return fallbackRequest(req);
76-
}
77-
}
7879

79-
if (req.method === "eth_estimateUserOperationGas") {
80-
try {
81-
return await estimateUserOperationGas({
82-
request: originalRequest,
83-
params: req.params as never,
84-
});
85-
} catch (e) {
86-
console.warn("[wiresaw] estimating user operation gas failed, falling back to bundler", e);
80+
if (req.method === "eth_estimateUserOperationGas") {
81+
try {
82+
return await estimateUserOperationGas({
83+
request: originalRequest,
84+
params: req.params as never,
85+
});
86+
} catch (e) {
87+
console.warn("[wiresaw] estimating user operation gas failed, falling back to bundler", e);
88+
}
89+
90+
if (transport.fallbackBundler) {
91+
const { request: fallbackRequest } = transport.fallbackBundler(opts);
92+
return await fallbackRequest(req);
93+
}
8794
}
8895

89-
if (transport.fallbackBundler) {
90-
const { request: fallbackRequest } = transport.fallbackBundler(opts);
91-
return fallbackRequest(req);
96+
// Fallback to regular RPC for methods that don't require wiresaw
97+
if (
98+
req.method === "eth_blockNumber" ||
99+
req.method === "eth_getBlockByNumber" ||
100+
req.method === "eth_maxPriorityFeePerGas"
101+
) {
102+
if (transport.fallbackEth) {
103+
const { request: fallbackRequest } = transport.fallbackEth(opts);
104+
return await fallbackRequest(req);
105+
}
106+
return await originalRequest(req);
92107
}
93-
}
94108

95-
// Fallback to regular RPC for methods that don't require wiresaw
96-
if (
97-
req.method === "eth_blockNumber" ||
98-
req.method === "eth_getBlockByNumber" ||
99-
req.method === "eth_maxPriorityFeePerGas"
100-
) {
109+
return await originalRequest(req);
110+
} catch (e) {
111+
console.warn("[wiresaw] request error", e);
112+
const bundlerMethods = [
113+
"eth_estimateUserOperationGas",
114+
"eth_sendUserOperation",
115+
"eth_getUserOperationReceipt",
116+
];
117+
if (bundlerMethods.includes(req.method)) {
118+
if (transport.fallbackBundler) {
119+
const { request: fallbackRequest } = transport.fallbackBundler(opts);
120+
console.warn("[wiresaw] falling back to bundler rpc", req);
121+
return fallbackRequest(req);
122+
}
123+
}
101124
if (transport.fallbackEth) {
102125
const { request: fallbackRequest } = transport.fallbackEth(opts);
126+
console.warn("[wiresaw] falling back to eth rpc", req);
103127
return fallbackRequest(req);
104128
}
105-
return originalRequest(req);
129+
throw e;
106130
}
107131

108-
return originalRequest(req);
109-
110132
async function getTransactionReceipt(hash: Hex): Promise<RpcTransactionReceipt | undefined> {
111133
// Return cached receipt if available
112134
if (transactionReceipts[hash]) return transactionReceipts[hash];

0 commit comments

Comments
 (0)