coinley-checkout
Version:
A React SDK for Coinley cryptocurrency payment processing with multi-network support
164 lines (163 loc) • 4.85 kB
JavaScript
import { y as BaseError, bh as getUrl, ay as stringify, b4 as decodeErrorResult, l as localBatchGatewayUrl, bi as localBatchGatewayRequest, aJ as call, Y as concat, G as encodeAbiParameters, bj as HttpRequestError, aK as isHex } from "./index-1c96ce10.mjs";
import { i as isAddressEqual } from "./isAddressEqual-dc4a956e.mjs";
import "react";
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-e73c375b.mjs.map