UNPKG

coinley-checkout

Version:

A React SDK for Coinley cryptocurrency payment processing with multi-network support

164 lines (163 loc) 4.85 kB
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