UNPKG

@web3-onboard/core

Version:

Web3-Onboard makes it simple to connect Ethereum hardware and software wallets to your dapp. Features standardized spec compliant web3 providers for all supported wallets, framework agnostic modern javascript UI with code splitting, CSS customization, mul

187 lines (182 loc) 6.14 kB
import { s as stringify, d as decodeErrorResult, c as call, e as encodeAbiParameters, H as HttpRequestError } from './index-021f6a62.js'; import { B as BaseError, W as getUrl, m as isAddress, n as InvalidAddressError, J as concat, i as isHex } from './transactionRequest-be6a8ea9.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(), }); Object.defineProperty(this, "name", { enumerable: true, configurable: true, writable: true, value: '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)}`, ], }); Object.defineProperty(this, "name", { enumerable: true, configurable: true, writable: true, value: '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}`, ], }); Object.defineProperty(this, "name", { enumerable: true, configurable: true, writable: true, value: 'OffchainLookupSenderMismatchError' }); } } function isAddressEqual(a, b) { if (!isAddress(a, { strict: false })) throw new InvalidAddressError({ address: a }); if (!isAddress(b, { strict: false })) throw new InvalidAddressError({ address: b }); return a.toLowerCase() === b.toLowerCase(); } 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 = 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 } : undefined; try { const response = await fetch(url.replace('{sender}', sender).replace('{data}', data), { body: JSON.stringify(body), 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-c78d2f16.js.map