@manifoldxyz/client-sdk
Version:
Manifold Client SDK for headless purchasing and display of Manifold products
162 lines (161 loc) • 4.78 kB
JavaScript
import { B as BaseError, g as getUrl, s as stringify, d as decodeErrorResult, i as isAddressEqual, l as localBatchGatewayUrl, a as localBatchGatewayRequest, c as call, b as concat, e as encodeAbiParameters, H as HttpRequestError, f as isHex } from "./index-BYdwpw4H.js";
class OffchainLookupError extends BaseError {
constructor({ callbackSelector, cause, data, extraData, sender, urls }) {
super(cause.shortMessage || "An error occurred while fetching for an offchain result.", {
cause,
metaMessages: [
...cause.metaMessages || [],
cause.metaMessages?.length ? "" : [],
"Offchain Gateway Call:",
urls && [
" Gateway URL(s):",
...urls.map((url) => ` ${getUrl(url)}`)
],
` Sender: ${sender}`,
` Data: ${data}`,
` Callback selector: ${callbackSelector}`,
` Extra data: ${extraData}`
].flat(),
name: "OffchainLookupError"
});
}
}
class OffchainLookupResponseMalformedError extends BaseError {
constructor({ result, url }) {
super("Offchain gateway response is malformed. Response data must be a hex value.", {
metaMessages: [
`Gateway URL: ${getUrl(url)}`,
`Response: ${stringify(result)}`
],
name: "OffchainLookupResponseMalformedError"
});
}
}
class OffchainLookupSenderMismatchError extends BaseError {
constructor({ sender, to }) {
super("Reverted sender address does not match target contract address (`to`).", {
metaMessages: [
`Contract address: ${to}`,
`OffchainLookup sender address: ${sender}`
],
name: "OffchainLookupSenderMismatchError"
});
}
}
const offchainLookupSignature = "0x556f1830";
const offchainLookupAbiItem = {
name: "OffchainLookup",
type: "error",
inputs: [
{
name: "sender",
type: "address"
},
{
name: "urls",
type: "string[]"
},
{
name: "callData",
type: "bytes"
},
{
name: "callbackFunction",
type: "bytes4"
},
{
name: "extraData",
type: "bytes"
}
]
};
async function offchainLookup(client, { blockNumber, blockTag, data, to }) {
const { args } = decodeErrorResult({
data,
abi: [offchainLookupAbiItem]
});
const [sender, urls, callData, callbackSelector, extraData] = args;
const { ccipRead } = client;
const ccipRequest_ = ccipRead && typeof ccipRead?.request === "function" ? ccipRead.request : ccipRequest;
try {
if (!isAddressEqual(to, sender))
throw new OffchainLookupSenderMismatchError({ sender, to });
const result = urls.includes(localBatchGatewayUrl) ? await localBatchGatewayRequest({
data: callData,
ccipRequest: ccipRequest_
}) : await ccipRequest_({ data: callData, sender, urls });
const { data: data_ } = await call(client, {
blockNumber,
blockTag,
data: concat([
callbackSelector,
encodeAbiParameters([{ type: "bytes" }, { type: "bytes" }], [result, extraData])
]),
to
});
return data_;
} catch (err) {
throw new OffchainLookupError({
callbackSelector,
cause: err,
data,
extraData,
sender,
urls
});
}
}
async function ccipRequest({ data, sender, urls }) {
let error = new Error("An unknown error occurred.");
for (let i = 0; i < urls.length; i++) {
const url = urls[i];
const method = url.includes("{data}") ? "GET" : "POST";
const body = method === "POST" ? { data, sender } : void 0;
const headers = method === "POST" ? { "Content-Type": "application/json" } : {};
try {
const response = await fetch(url.replace("{sender}", sender.toLowerCase()).replace("{data}", data), {
body: JSON.stringify(body),
headers,
method
});
let result;
if (response.headers.get("Content-Type")?.startsWith("application/json")) {
result = (await response.json()).data;
} else {
result = await response.text();
}
if (!response.ok) {
error = new HttpRequestError({
body,
details: result?.error ? stringify(result.error) : response.statusText,
headers: response.headers,
status: response.status,
url
});
continue;
}
if (!isHex(result)) {
error = new OffchainLookupResponseMalformedError({
result,
url
});
continue;
}
return result;
} catch (err) {
error = new HttpRequestError({
body,
details: err.message,
url
});
}
}
throw error;
}
export {
ccipRequest,
offchainLookup,
offchainLookupAbiItem,
offchainLookupSignature
};
//# sourceMappingURL=ccip-5-UmS5Nc.js.map