diff --git a/packages/ensjs/.eslintrc.json b/packages/ensjs/.eslintrc.json index d32360e3..2907f403 100644 --- a/packages/ensjs/.eslintrc.json +++ b/packages/ensjs/.eslintrc.json @@ -36,7 +36,9 @@ ], "no-useless-return": ["off"], "radix": ["error", "as-needed"], - "no-bitwise": ["off"] + "no-bitwise": ["off"], + "import/no-extraneous-dependencies": ["off"], + "no-empty": ["error", { "allowEmptyCatch": true }] }, "ignorePatterns": ["node_modules", "dist", "data", "cache", "esbuild.js"] } diff --git a/packages/ensjs/ens-test-env.config.js b/packages/ensjs/ens-test-env.config.js index 199f0f2d..cf2f9bff 100644 --- a/packages/ensjs/ens-test-env.config.js +++ b/packages/ensjs/ens-test-env.config.js @@ -6,6 +6,9 @@ require('dotenv').config({ process.env.ADDRESS_ETH_REGISTRAR = '0xc5a5C42992dECbae36851359345FE25997F5C42d' process.env.ADDRESS_NAME_WRAPPER = '0x9E545E3C0baAB3E08CdfD552C960A1050f373042' +process.env.BATCH_GATEWAY_URLS = JSON.stringify([ + 'https://universal-offchain-unwrapper.ens-cf.workers.dev/', +]) /** * @type {import('@ensdomains/ens-test-env').ENSTestEnvConfig} diff --git a/packages/ensjs/package.json b/packages/ensjs/package.json index a885cbc1..2159b99b 100644 --- a/packages/ensjs/package.json +++ b/packages/ensjs/package.json @@ -82,7 +82,7 @@ }, "devDependencies": { "@ensdomains/buffer": "^0.0.13", - "@ensdomains/ens-contracts": "^0.0.14", + "@ensdomains/ens-contracts": "^0.0.15", "@ensdomains/ens-test-env": "workspace:*", "@ethersproject/abi": "^5.6.0", "@ethersproject/providers": "^5.6.2", @@ -100,7 +100,7 @@ "eslint-plugin-jest": "^27.0.1", "ganache": "^7.4.0", "glob": "^8.0.3", - "hardhat": "^2.10.1", + "hardhat": "2.10.2", "hardhat-abi-exporter": "^2.8.0", "hardhat-deploy": "^0.11.12", "jest": "^27.5.1", diff --git a/packages/ensjs/src/contracts/getContractAddress.ts b/packages/ensjs/src/contracts/getContractAddress.ts index e0e0f89b..274b9932 100644 --- a/packages/ensjs/src/contracts/getContractAddress.ts +++ b/packages/ensjs/src/contracts/getContractAddress.ts @@ -49,7 +49,7 @@ const addresses: Record< '1': '0x580AF46E06DaaD47eb5940526FD64d95b815Cb70', '3': '0x74e20bd2a1fe0cdbe45b9a1d89cb7e0a45b36376', '4': '0x74e20bd2a1fe0cdbe45b9a1d89cb7e0a45b36376', - '5': '0x9380F1974D2B7064eA0c0EC251968D8c69f0Ae31', + '5': '0x687c30Cc44bFA39A1449e86E172BF002E7b3f0b0', }, BulkRenewal: { '1': '0xfF252725f6122A92551A5FA9a6b6bf10eb0Be035', diff --git a/packages/ensjs/src/functions/batchWrappers.ts b/packages/ensjs/src/functions/batchWrappers.ts index e54f63bc..8cf9c03d 100644 --- a/packages/ensjs/src/functions/batchWrappers.ts +++ b/packages/ensjs/src/functions/batchWrappers.ts @@ -1,5 +1,6 @@ import { ethers } from 'ethers' import { ENSArgs } from '..' +import ccipLookup from '../utils/ccip' import { hexEncodeName } from '../utils/hexEncodedName' export const universalWrapper = { @@ -11,16 +12,16 @@ export const universalWrapper = { const universalResolver = await contracts?.getUniversalResolver()! return { to: universalResolver.address, - data: universalResolver.interface.encodeFunctionData('resolve', [ - hexEncodeName(name), - data, - ]), + data: universalResolver.interface.encodeFunctionData( + 'resolve(bytes,bytes)', + [hexEncodeName(name), data], + ), } }, decode: async ({ contracts }: ENSArgs<'contracts'>, data: string) => { const universalResolver = await contracts?.getUniversalResolver()! const response = universalResolver.interface.decodeFunctionResult( - 'resolve', + 'resolve(bytes,bytes)', data, ) if (!response || !response[0]) { @@ -75,7 +76,11 @@ export const multicallWrapper = { ]), } }, - async decode({ contracts }: ENSArgs<'contracts'>, data: string) { + async decode( + { contracts, provider }: ENSArgs<'contracts' | 'provider'>, + data: string, + transactions: ethers.providers.TransactionRequest[], + ) { if (!data) return const multicall = await contracts?.getMulticall()! try { @@ -83,9 +88,35 @@ export const multicallWrapper = { 'tryAggregate', data, ) - return result - } catch (e) { - return e + const ccipChecked = await Promise.all( + (result as [boolean, string][]).map( + async ([success, returnData], i) => { + let newArr: [boolean, string] = [success, returnData] + // OffchainLookup(address,string[],bytes,bytes4,bytes) + if (!success && returnData.startsWith('0x556f1830')) { + try { + const newData = await ccipLookup( + provider!, + transactions[i], + returnData, + ) + if (newData) { + newArr = [true, newData] + } + } catch {} + } + return { + ...newArr, + success: newArr[0], + returnData: newArr[1], + } + }, + ), + ) + return ccipChecked + } catch (e: any) { + console.error(e) + return } }, } diff --git a/packages/ensjs/src/functions/getName.ts b/packages/ensjs/src/functions/getName.ts index d1026ed1..b84d6e3d 100644 --- a/packages/ensjs/src/functions/getName.ts +++ b/packages/ensjs/src/functions/getName.ts @@ -6,7 +6,7 @@ const raw = async ({ contracts }: ENSArgs<'contracts'>, address: string) => { const reverseNode = `${address.toLowerCase().substring(2)}.addr.reverse` return { to: universalResolver.address, - data: universalResolver.interface.encodeFunctionData('reverse', [ + data: universalResolver.interface.encodeFunctionData('reverse(bytes)', [ hexEncodeName(reverseNode), ]), } @@ -21,7 +21,7 @@ const decode = async ( const universalResolver = await contracts?.getUniversalResolver()! try { const result = universalResolver.interface.decodeFunctionResult( - 'reverse', + 'reverse(bytes)', data, ) return { diff --git a/packages/ensjs/src/functions/getOwner.ts b/packages/ensjs/src/functions/getOwner.ts index ce0b8275..2d9079f5 100644 --- a/packages/ensjs/src/functions/getOwner.ts +++ b/packages/ensjs/src/functions/getOwner.ts @@ -100,7 +100,7 @@ const decode = async ( name: string, contract?: 'nameWrapper' | 'registry' | 'registrar', ): Promise => { - if (data === null) return + if (!data) return const labels = name.split('.') if (contract || labels.length === 1) { const singleOwner = singleContractOwnerDecode(data) @@ -119,7 +119,7 @@ const decode = async ( } } const result = await multicallWrapper.decode(data) - if (result === null) return + if (!result) return const nameWrapper = await contracts?.getNameWrapper()! const decodedData = [result[0][1], result[1][1], result[2]?.[1]].map( @@ -163,6 +163,7 @@ const decode = async ( // this means that the subname is wrapped if ( registryOwner === nameWrapper.address && + nameWrapperOwner && ethers.utils.hexStripZeros(nameWrapperOwner) !== '0x' ) { return { @@ -186,6 +187,7 @@ const decode = async ( // and for wrapped names, owner and registrant are the same thing if ( registryOwner === nameWrapper.address && + nameWrapperOwner && ethers.utils.hexStripZeros(nameWrapperOwner) !== '0x' ) { return { diff --git a/packages/ensjs/src/functions/getProfile-ccip.test.ts b/packages/ensjs/src/functions/getProfile-ccip.test.ts new file mode 100644 index 00000000..b7fc6133 --- /dev/null +++ b/packages/ensjs/src/functions/getProfile-ccip.test.ts @@ -0,0 +1,29 @@ +import dotenv from 'dotenv' +import { ENS } from '..' +import setup from '../tests/setup' + +dotenv.config() + +let ensInstance: ENS + +beforeAll(async () => { + ;({ ensInstance } = await setup(true)) +}) + +jest.setTimeout(20000) + +describe('getProfile', () => { + it('should return a profile from a ccip-read name', async () => { + const result = await ensInstance.getProfile('1.offchainexample.eth', { + fallback: { + texts: ['email', 'description'], + contentHash: true, + coinTypes: ['0', '60'], + }, + }) + expect(result).toBeTruthy() + if (result) { + expect(result.address).toBe('0x41563129cDbbD0c5D3e1c86cf9563926b243834d') + } + }) +}) diff --git a/packages/ensjs/src/functions/getProfile.test.ts b/packages/ensjs/src/functions/getProfile.test.ts index ab0cfb4e..08df68f4 100644 --- a/packages/ensjs/src/functions/getProfile.test.ts +++ b/packages/ensjs/src/functions/getProfile.test.ts @@ -129,7 +129,7 @@ describe('getProfile', () => { '0x70997970C51812dc3A010C7d01b50e0d17dc79C8', ) expect(result.resolverAddress).toBe( - deploymentAddresses.NoMulticallResolver.toLowerCase(), + deploymentAddresses.NoMulticallResolver, ) } }) diff --git a/packages/ensjs/src/functions/getProfile.ts b/packages/ensjs/src/functions/getProfile.ts index f6da76ab..723491c4 100644 --- a/packages/ensjs/src/functions/getProfile.ts +++ b/packages/ensjs/src/functions/getProfile.ts @@ -1,5 +1,6 @@ import { formatsByName } from '@ensdomains/address-encoder' import { ethers } from 'ethers' +import { hexStripZeros } from 'ethers/lib/utils' import { ENSArgs } from '..' import { decodeContenthash, DecodedContentHash } from '../utils/contentHash' import { hexEncodeName } from '../utils/hexEncodedName' @@ -18,6 +19,12 @@ type ProfileResponse = { coinTypes?: string[] } +type FallbackRecords = { + contentHash?: boolean + texts?: string[] + coinTypes?: string[] +} + type DataItem = { key: string | number type: 'addr' | 'text' | 'contentHash' @@ -41,19 +48,25 @@ type ResolvedProfile = { reverseResolverAddress?: string } +type CallObj = { + key: string + data: { + to: string + data: string + } + type: 'addr' | 'text' | 'contentHash' +} + const makeMulticallData = async ( { _getAddr, _getContentHash, _getText, - resolverMulticallWrapper, - }: ENSArgs< - '_getText' | '_getAddr' | '_getContentHash' | 'resolverMulticallWrapper' - >, + }: ENSArgs<'_getText' | '_getAddr' | '_getContentHash'>, name: string, options: InternalProfileOptions, ) => { - let calls: any[] = [] + let calls: (CallObj | null)[] = [] if (options.texts) calls = [ ...calls, @@ -61,7 +74,7 @@ const makeMulticallData = async ( options.texts.map(async (x) => ({ key: x, data: await _getText.raw(name, x), - type: 'text', + type: 'text' as const, })), )), ] @@ -73,7 +86,7 @@ const makeMulticallData = async ( options.coinTypes.map(async (x) => ({ key: x, data: await _getAddr.raw(name, x, true), - type: 'addr', + type: 'addr' as const, })), )), ] @@ -82,21 +95,19 @@ const makeMulticallData = async ( calls.push({ key: 'contentHash', data: await _getContentHash.raw(name), - type: 'contenthash', + type: 'contentHash' as const, }) } - if (!calls.find((x) => x.key === '60')) { + if (!calls.find((x) => x!.key === '60')) { calls.push({ key: '60', data: await _getAddr.raw(name, '60', true), - type: 'addr', + type: 'addr' as const, }) } - const prRawData = await resolverMulticallWrapper.raw(calls.map((x) => x.data)) - - return { data: prRawData.data, calls } + return { data: calls.map((x) => x!.data.data), calls } } const fetchWithoutResolverMulticall = async ( @@ -116,9 +127,11 @@ const fetchWithoutResolverMulticall = async ( data: call.data.data, })) - return (await multicallWrapper(callsWithResolver)).map( - (x: [boolean, string]) => x[1], - ) + const results = await multicallWrapper(callsWithResolver) + + if (!results || !results.length) return [] + + return results.map((x: [boolean, string]) => x[1]) } const formatRecords = async ( @@ -139,7 +152,7 @@ const formatRecords = async ( key: calls[i].key, type: calls[i].type, } - if (itemRet.type === 'contenthash') { + if (itemRet.type === 'contentHash') { ;[decodedFromAbi] = ethers.utils.defaultAbiCoder.decode( ['bytes'], item, @@ -171,7 +184,7 @@ const formatRecords = async ( } catch { return } - case 'contenthash': + case 'contentHash': try { itemRet = { ...itemRet, @@ -217,7 +230,7 @@ const formatRecords = async ( } } else if (options.contentHash) { const foundRecord = returnedRecords.find( - (item: any) => item.type === 'contenthash', + (item: any) => item.type === 'contentHash', ) returnedResponse.contentHash = foundRecord ? foundRecord.value : null } @@ -240,7 +253,6 @@ const getDataForName = async ( _getAddr, _getContentHash, _getText, - resolverMulticallWrapper, multicallWrapper, }: ENSArgs< | 'contracts' @@ -252,62 +264,77 @@ const getDataForName = async ( >, name: string, options: InternalProfileOptions, - fallbackResolver?: string, specificResolver?: string, ) => { - const universalResolver = await contracts?.getUniversalResolver() + const universalResolver = await contracts?.getUniversalResolver()! const { data, calls } = await makeMulticallData( - { _getAddr, _getContentHash, _getText, resolverMulticallWrapper }, + { _getAddr, _getContentHash, _getText }, name, options, ) - let resolvedData: any - let useFallbackResolver = false - try { - if (specificResolver) { + let recordData: (string | null)[] | undefined + let resolverAddress: string | undefined = specificResolver + + if (specificResolver) { + try { const publicResolver = await contracts?.getPublicResolver( undefined, specificResolver, ) - resolvedData = await publicResolver?.callStatic.multicall( - calls.map((x) => x.data), + recordData = await publicResolver?.callStatic.multicall(data) + } catch (e: any) { + console.error('getProfile error:', e) + recordData = await fetchWithoutResolverMulticall( + { multicallWrapper }, + calls as CallObj[], + resolverAddress!, ) - } else { - resolvedData = await universalResolver?.resolve(hexEncodeName(name), data) } - } catch { - useFallbackResolver = true - } - - let resolverAddress: string - let recordData: any - - if (useFallbackResolver) { - resolverAddress = specificResolver || fallbackResolver! - recordData = await fetchWithoutResolverMulticall( - { multicallWrapper }, - calls, - resolverAddress, - ) } else { - resolverAddress = specificResolver || resolvedData['1'] - if (specificResolver) { - recordData = resolvedData - } else { - ;[recordData] = await resolverMulticallWrapper.decode(resolvedData['0']) + const resolvedData = await universalResolver['resolve(bytes,bytes[])']( + hexEncodeName(name), + data, + { + ccipReadEnabled: true, + }, + ) + recordData = [...resolvedData['0']] + resolverAddress = resolvedData['1'] + for (let i = 0; i < recordData.length; i += 1) { + // error code for reverted call in batch + // this is expected when using offchain resolvers, so should be ignored + if (recordData[i]!.startsWith('0x0d1947a9')) { + calls[i] = null + recordData[i] = null + } + } + } + if ( + !resolverAddress || + !recordData || + hexStripZeros(resolverAddress) === '0x' + ) { + return { + address: null, + records: {}, + resolverAddress: null, } } - const matchAddress = recordData[calls.findIndex((x) => x.key === '60')] + const filteredCalls = calls.filter((x) => x) as CallObj[] + const filteredRecordData = recordData.filter((x) => x) + + const matchAddress = + filteredRecordData[filteredCalls.findIndex((x) => x.key === '60')] return { address: matchAddress && (await _getAddr.decode(matchAddress)), records: await formatRecords( { _getAddr, _getContentHash, _getText }, - recordData, - calls, + filteredRecordData, + filteredCalls, options, ), resolverAddress, @@ -332,7 +359,6 @@ const graphFetch = async ( addr { id } - address } } } @@ -379,14 +405,7 @@ const graphFetch = async ( const returnedRecords: ProfileResponse = {} - if (!resolverResponse) return { isMigrated, createdAt } - - if (!wantedRecords) - return { - isMigrated, - createdAt, - graphResolverAddress: resolverResponse.address || resolverAddress, - } + if (!resolverResponse || !wantedRecords) return { isMigrated, createdAt } Object.keys(wantedRecords).forEach((key: string) => { const data = wantedRecords[key as keyof ProfileOptions] @@ -403,7 +422,6 @@ const graphFetch = async ( ...returnedRecords, isMigrated, createdAt, - graphResolverAddress: resolverResponse.address || resolverAddress, } } @@ -415,6 +433,7 @@ type ProfileOptions = { type InputProfileOptions = ProfileOptions & { resolverAddress?: string + fallback?: FallbackRecords } const getProfileFromName = async ( @@ -438,7 +457,7 @@ const getProfileFromName = async ( name: string, options?: InputProfileOptions, ) => { - const { resolverAddress, ..._options } = options || {} + const { resolverAddress, fallback, ..._options } = options || {} const optsLength = Object.keys(_options).length let usingOptions: InputProfileOptions | undefined if (!optsLength || _options?.texts === true || _options?.coinTypes === true) { @@ -452,35 +471,69 @@ const getProfileFromName = async ( usingOptions, resolverAddress, ) - if (!graphResult) return - const { - isMigrated, - createdAt, - graphResolverAddress, - ...wantedRecords - }: { - isMigrated: boolean - createdAt: string - graphResolverAddress?: string - } & InternalProfileOptions = graphResult - if (!graphResolverAddress && !options?.resolverAddress) - return { isMigrated, createdAt, message: "Name doesn't have a resolver" } - const result = await getDataForName( - { - contracts, - _getAddr, - _getContentHash, - _getText, - resolverMulticallWrapper, - multicallWrapper, - }, - name, - usingOptions ? wantedRecords : (options as InternalProfileOptions), - graphResolverAddress, - options?.resolverAddress!, - ) - if (!result) - return { isMigrated, createdAt, message: "Records fetch didn't complete" } + let isMigrated: boolean | null = null + let createdAt: string | null = null + let result: Awaited> | null = null + if (!graphResult) { + if (!fallback) return + result = await getDataForName( + { + contracts, + _getAddr, + _getContentHash, + _getText, + resolverMulticallWrapper, + multicallWrapper, + }, + name, + fallback, + undefined, + ) + } else { + const { + isMigrated: _isMigrated, + createdAt: _createdAt, + ...wantedRecords + }: { + isMigrated: boolean + createdAt: string + } & InternalProfileOptions = graphResult + isMigrated = _isMigrated + createdAt = _createdAt + let recordsWithFallback = usingOptions + ? wantedRecords + : (_options as InternalProfileOptions) + if ( + (Object.keys(recordsWithFallback).length === 0 || + (!recordsWithFallback.coinTypes && + !recordsWithFallback.texts && + Object.keys(recordsWithFallback.contentHash || {}).length === 0)) && + fallback + ) { + recordsWithFallback = fallback + } + result = await getDataForName( + { + contracts, + _getAddr, + _getContentHash, + _getText, + resolverMulticallWrapper, + multicallWrapper, + }, + name, + recordsWithFallback, + options?.resolverAddress!, + ) + } + if (!result?.resolverAddress) + return { + isMigrated, + createdAt, + message: !result + ? "Records fetch didn't complete" + : "Name doesn't have a resolver", + } return { ...result, isMigrated, createdAt, message: undefined } } @@ -537,6 +590,13 @@ const getProfileFromAddress = async ( } } +const mapCoinTypes = (coin: string) => { + if (!Number.isNaN(parseInt(coin))) { + return coin + } + return `${formatsByName[coin.toUpperCase()].coinType}` +} + export default async function ( { contracts, @@ -560,13 +620,13 @@ export default async function ( nameOrAddress: string, options?: InputProfileOptions, ): Promise { - if (options && options.coinTypes && typeof options.coinTypes !== 'boolean') { - options.coinTypes = options.coinTypes.map((coin: string) => { - if (!Number.isNaN(parseInt(coin))) { - return coin - } - return `${formatsByName[coin.toUpperCase()].coinType}` - }) + if (options) { + if (options.coinTypes && typeof options.coinTypes !== 'boolean') { + options.coinTypes = options.coinTypes.map(mapCoinTypes) + } + if (options.fallback && options.fallback.coinTypes) { + options.fallback.coinTypes = options.fallback.coinTypes.map(mapCoinTypes) + } } const inputType = parseInputType(nameOrAddress) diff --git a/packages/ensjs/src/functions/setName.test.ts b/packages/ensjs/src/functions/setName.test.ts index d8527491..3cf1430f 100644 --- a/packages/ensjs/src/functions/setName.test.ts +++ b/packages/ensjs/src/functions/setName.test.ts @@ -29,7 +29,9 @@ describe('setName', () => { const universalResolver = await ensInstance.contracts!.getUniversalResolver()! const reverseNode = `${accounts[1].toLowerCase().substring(2)}.addr.reverse` - const result = await universalResolver.reverse(hexEncodeName(reverseNode)) + const result = await universalResolver['reverse(bytes)']( + hexEncodeName(reverseNode), + ) expect(result[0]).toBe('test123.eth') }) it("should return a transaction for setting another address' name", async () => { @@ -52,7 +54,9 @@ describe('setName', () => { const universalResolver = await ensInstance.contracts!.getUniversalResolver()! const reverseNode = `${accounts[1].toLowerCase().substring(2)}.addr.reverse` - const result = await universalResolver.reverse(hexEncodeName(reverseNode)) + const result = await universalResolver['reverse(bytes)']( + hexEncodeName(reverseNode), + ) expect(result[0]).toBe('test123.eth') }) }) diff --git a/packages/ensjs/src/functions/setRecord.test.ts b/packages/ensjs/src/functions/setRecord.test.ts index 4de19234..18709f53 100644 --- a/packages/ensjs/src/functions/setRecord.test.ts +++ b/packages/ensjs/src/functions/setRecord.test.ts @@ -28,7 +28,7 @@ describe('setRecord', () => { const universalResolver = await ensInstance.contracts!.getUniversalResolver()! const publicResolver = await ensInstance.contracts!.getPublicResolver()! - const encodedText = await universalResolver.resolve( + const encodedText = await universalResolver['resolve(bytes,bytes)']( hexEncodeName('test123.eth'), publicResolver.interface.encodeFunctionData('text', [ namehash('test123.eth'), @@ -56,7 +56,7 @@ describe('setRecord', () => { const universalResolver = await ensInstance.contracts!.getUniversalResolver()! const publicResolver = await ensInstance.contracts!.getPublicResolver()! - const encodedAddr = await universalResolver.resolve( + const encodedAddr = await universalResolver['resolve(bytes,bytes)']( hexEncodeName('test123.eth'), publicResolver.interface.encodeFunctionData('addr(bytes32,uint256)', [ namehash('test123.eth'), @@ -84,7 +84,7 @@ describe('setRecord', () => { const universalResolver = await ensInstance.contracts!.getUniversalResolver()! const publicResolver = await ensInstance.contracts!.getPublicResolver()! - const encodedContent = await universalResolver.resolve( + const encodedContent = await universalResolver['resolve(bytes,bytes)']( hexEncodeName('test123.eth'), publicResolver.interface.encodeFunctionData('contenthash', [ namehash('test123.eth'), diff --git a/packages/ensjs/src/functions/setRecords.test.ts b/packages/ensjs/src/functions/setRecords.test.ts index 555466d2..c66371db 100644 --- a/packages/ensjs/src/functions/setRecords.test.ts +++ b/packages/ensjs/src/functions/setRecords.test.ts @@ -31,14 +31,14 @@ describe('setRecords', () => { const universalResolver = await ensInstance.contracts!.getUniversalResolver()! const publicResolver = await ensInstance.contracts!.getPublicResolver()! - const encodedText = await universalResolver.resolve( + const encodedText = await universalResolver['resolve(bytes,bytes)']( hexEncodeName('test123.eth'), publicResolver.interface.encodeFunctionData('text', [ namehash('test123.eth'), 'foo', ]), ) - const encodedAddr = await universalResolver.resolve( + const encodedAddr = await universalResolver['resolve(bytes,bytes)']( hexEncodeName('test123.eth'), publicResolver.interface.encodeFunctionData('addr(bytes32,uint256)', [ namehash('test123.eth'), diff --git a/packages/ensjs/src/generated/NameWrapper.ts b/packages/ensjs/src/generated/NameWrapper.ts index 3f5d498e..351ea776 100644 --- a/packages/ensjs/src/generated/NameWrapper.ts +++ b/packages/ensjs/src/generated/NameWrapper.ts @@ -40,6 +40,7 @@ export interface NameWrapperInterface extends utils.Interface { "isTokenOwnerOrApproved(bytes32,address)": FunctionFragment; "isWrapped(bytes32)": FunctionFragment; "metadataService()": FunctionFragment; + "name()": FunctionFragment; "names(bytes32)": FunctionFragment; "onERC721Received(address,address,uint256,bytes)": FunctionFragment; "owner()": FunctionFragment; @@ -87,6 +88,7 @@ export interface NameWrapperInterface extends utils.Interface { | "isTokenOwnerOrApproved" | "isWrapped" | "metadataService" + | "name" | "names" | "onERC721Received" | "owner" @@ -162,6 +164,7 @@ export interface NameWrapperInterface extends utils.Interface { functionFragment: "metadataService", values?: undefined ): string; + encodeFunctionData(functionFragment: "name", values?: undefined): string; encodeFunctionData( functionFragment: "names", values: [PromiseOrValue] @@ -398,6 +401,7 @@ export interface NameWrapperInterface extends utils.Interface { functionFragment: "metadataService", data: BytesLike ): Result; + decodeFunctionResult(functionFragment: "name", data: BytesLike): Result; decodeFunctionResult(functionFragment: "names", data: BytesLike): Result; decodeFunctionResult( functionFragment: "onERC721Received", @@ -701,6 +705,8 @@ export interface NameWrapper extends BaseContract { metadataService(overrides?: CallOverrides): Promise<[string]>; + name(overrides?: CallOverrides): Promise<[string]>; + names( arg0: PromiseOrValue, overrides?: CallOverrides @@ -963,6 +969,8 @@ export interface NameWrapper extends BaseContract { metadataService(overrides?: CallOverrides): Promise; + name(overrides?: CallOverrides): Promise; + names( arg0: PromiseOrValue, overrides?: CallOverrides @@ -1225,6 +1233,8 @@ export interface NameWrapper extends BaseContract { metadataService(overrides?: CallOverrides): Promise; + name(overrides?: CallOverrides): Promise; + names( arg0: PromiseOrValue, overrides?: CallOverrides @@ -1588,6 +1598,8 @@ export interface NameWrapper extends BaseContract { metadataService(overrides?: CallOverrides): Promise; + name(overrides?: CallOverrides): Promise; + names( arg0: PromiseOrValue, overrides?: CallOverrides @@ -1851,6 +1863,8 @@ export interface NameWrapper extends BaseContract { metadataService(overrides?: CallOverrides): Promise; + name(overrides?: CallOverrides): Promise; + names( arg0: PromiseOrValue, overrides?: CallOverrides diff --git a/packages/ensjs/src/generated/UniversalResolver.ts b/packages/ensjs/src/generated/UniversalResolver.ts index 47094393..fe5eca39 100644 --- a/packages/ensjs/src/generated/UniversalResolver.ts +++ b/packages/ensjs/src/generated/UniversalResolver.ts @@ -4,8 +4,11 @@ import type { BaseContract, BigNumber, + BigNumberish, BytesLike, CallOverrides, + ContractTransaction, + Overrides, PopulatedTransaction, Signer, utils, @@ -22,31 +25,81 @@ import type { export interface UniversalResolverInterface extends utils.Interface { functions: { + "_resolveSingle(bytes,bytes,string[],bytes4,bytes)": FunctionFragment; + "batchGatewayURLs(uint256)": FunctionFragment; "findResolver(bytes)": FunctionFragment; "registry()": FunctionFragment; + "resolve(bytes,bytes,string[])": FunctionFragment; + "resolve(bytes,bytes[])": FunctionFragment; + "resolve(bytes,bytes[],string[])": FunctionFragment; "resolve(bytes,bytes)": FunctionFragment; "resolveCallback(bytes,bytes)": FunctionFragment; + "resolveSingleCallback(bytes,bytes)": FunctionFragment; + "reverse(bytes,string[])": FunctionFragment; "reverse(bytes)": FunctionFragment; + "reverseCallback(bytes,bytes)": FunctionFragment; "supportsInterface(bytes4)": FunctionFragment; }; getFunction( nameOrSignatureOrTopic: + | "_resolveSingle" + | "batchGatewayURLs" | "findResolver" | "registry" - | "resolve" + | "resolve(bytes,bytes,string[])" + | "resolve(bytes,bytes[])" + | "resolve(bytes,bytes[],string[])" + | "resolve(bytes,bytes)" | "resolveCallback" - | "reverse" + | "resolveSingleCallback" + | "reverse(bytes,string[])" + | "reverse(bytes)" + | "reverseCallback" | "supportsInterface" ): FunctionFragment; + encodeFunctionData( + functionFragment: "_resolveSingle", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue[], + PromiseOrValue, + PromiseOrValue + ] + ): string; + encodeFunctionData( + functionFragment: "batchGatewayURLs", + values: [PromiseOrValue] + ): string; encodeFunctionData( functionFragment: "findResolver", values: [PromiseOrValue] ): string; encodeFunctionData(functionFragment: "registry", values?: undefined): string; encodeFunctionData( - functionFragment: "resolve", + functionFragment: "resolve(bytes,bytes,string[])", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue[] + ] + ): string; + encodeFunctionData( + functionFragment: "resolve(bytes,bytes[])", + values: [PromiseOrValue, PromiseOrValue[]] + ): string; + encodeFunctionData( + functionFragment: "resolve(bytes,bytes[],string[])", + values: [ + PromiseOrValue, + PromiseOrValue[], + PromiseOrValue[] + ] + ): string; + encodeFunctionData( + functionFragment: "resolve(bytes,bytes)", values: [PromiseOrValue, PromiseOrValue] ): string; encodeFunctionData( @@ -54,25 +107,75 @@ export interface UniversalResolverInterface extends utils.Interface { values: [PromiseOrValue, PromiseOrValue] ): string; encodeFunctionData( - functionFragment: "reverse", + functionFragment: "resolveSingleCallback", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "reverse(bytes,string[])", + values: [PromiseOrValue, PromiseOrValue[]] + ): string; + encodeFunctionData( + functionFragment: "reverse(bytes)", values: [PromiseOrValue] ): string; + encodeFunctionData( + functionFragment: "reverseCallback", + values: [PromiseOrValue, PromiseOrValue] + ): string; encodeFunctionData( functionFragment: "supportsInterface", values: [PromiseOrValue] ): string; + decodeFunctionResult( + functionFragment: "_resolveSingle", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "batchGatewayURLs", + data: BytesLike + ): Result; decodeFunctionResult( functionFragment: "findResolver", data: BytesLike ): Result; decodeFunctionResult(functionFragment: "registry", data: BytesLike): Result; - decodeFunctionResult(functionFragment: "resolve", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "resolve(bytes,bytes,string[])", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "resolve(bytes,bytes[])", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "resolve(bytes,bytes[],string[])", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "resolve(bytes,bytes)", + data: BytesLike + ): Result; decodeFunctionResult( functionFragment: "resolveCallback", data: BytesLike ): Result; - decodeFunctionResult(functionFragment: "reverse", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "resolveSingleCallback", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "reverse(bytes,string[])", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "reverse(bytes)", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "reverseCallback", + data: BytesLike + ): Result; decodeFunctionResult( functionFragment: "supportsInterface", data: BytesLike @@ -108,6 +211,20 @@ export interface UniversalResolver extends BaseContract { removeListener: OnEvent; functions: { + _resolveSingle( + name: PromiseOrValue, + data: PromiseOrValue, + gateways: PromiseOrValue[], + callbackFunction: PromiseOrValue, + metaData: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string, string]>; + + batchGatewayURLs( + arg0: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string]>; + findResolver( name: PromiseOrValue, overrides?: CallOverrides @@ -115,7 +232,27 @@ export interface UniversalResolver extends BaseContract { registry(overrides?: CallOverrides): Promise<[string]>; - resolve( + "resolve(bytes,bytes,string[])"( + name: PromiseOrValue, + data: PromiseOrValue, + gateways: PromiseOrValue[], + overrides?: CallOverrides + ): Promise<[string, string]>; + + "resolve(bytes,bytes[])"( + name: PromiseOrValue, + data: PromiseOrValue[], + overrides?: CallOverrides + ): Promise<[string[], string]>; + + "resolve(bytes,bytes[],string[])"( + name: PromiseOrValue, + data: PromiseOrValue[], + gateways: PromiseOrValue[], + overrides?: CallOverrides + ): Promise<[string[], string]>; + + "resolve(bytes,bytes)"( name: PromiseOrValue, data: PromiseOrValue, overrides?: CallOverrides @@ -124,20 +261,52 @@ export interface UniversalResolver extends BaseContract { resolveCallback( response: PromiseOrValue, extraData: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + resolveSingleCallback( + response: PromiseOrValue, + extraData: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + "reverse(bytes,string[])"( + reverseName: PromiseOrValue, + gateways: PromiseOrValue[], overrides?: CallOverrides - ): Promise<[string]>; + ): Promise<[string, string, string, string]>; - reverse( + "reverse(bytes)"( reverseName: PromiseOrValue, overrides?: CallOverrides ): Promise<[string, string, string, string]>; + reverseCallback( + response: PromiseOrValue, + extraData: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + supportsInterface( interfaceId: PromiseOrValue, overrides?: CallOverrides ): Promise<[boolean]>; }; + _resolveSingle( + name: PromiseOrValue, + data: PromiseOrValue, + gateways: PromiseOrValue[], + callbackFunction: PromiseOrValue, + metaData: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string, string]>; + + batchGatewayURLs( + arg0: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + findResolver( name: PromiseOrValue, overrides?: CallOverrides @@ -145,7 +314,27 @@ export interface UniversalResolver extends BaseContract { registry(overrides?: CallOverrides): Promise; - resolve( + "resolve(bytes,bytes,string[])"( + name: PromiseOrValue, + data: PromiseOrValue, + gateways: PromiseOrValue[], + overrides?: CallOverrides + ): Promise<[string, string]>; + + "resolve(bytes,bytes[])"( + name: PromiseOrValue, + data: PromiseOrValue[], + overrides?: CallOverrides + ): Promise<[string[], string]>; + + "resolve(bytes,bytes[],string[])"( + name: PromiseOrValue, + data: PromiseOrValue[], + gateways: PromiseOrValue[], + overrides?: CallOverrides + ): Promise<[string[], string]>; + + "resolve(bytes,bytes)"( name: PromiseOrValue, data: PromiseOrValue, overrides?: CallOverrides @@ -154,20 +343,52 @@ export interface UniversalResolver extends BaseContract { resolveCallback( response: PromiseOrValue, extraData: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + resolveSingleCallback( + response: PromiseOrValue, + extraData: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + "reverse(bytes,string[])"( + reverseName: PromiseOrValue, + gateways: PromiseOrValue[], overrides?: CallOverrides - ): Promise; + ): Promise<[string, string, string, string]>; - reverse( + "reverse(bytes)"( reverseName: PromiseOrValue, overrides?: CallOverrides ): Promise<[string, string, string, string]>; + reverseCallback( + response: PromiseOrValue, + extraData: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + supportsInterface( interfaceId: PromiseOrValue, overrides?: CallOverrides ): Promise; callStatic: { + _resolveSingle( + name: PromiseOrValue, + data: PromiseOrValue, + gateways: PromiseOrValue[], + callbackFunction: PromiseOrValue, + metaData: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string, string]>; + + batchGatewayURLs( + arg0: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + findResolver( name: PromiseOrValue, overrides?: CallOverrides @@ -175,7 +396,27 @@ export interface UniversalResolver extends BaseContract { registry(overrides?: CallOverrides): Promise; - resolve( + "resolve(bytes,bytes,string[])"( + name: PromiseOrValue, + data: PromiseOrValue, + gateways: PromiseOrValue[], + overrides?: CallOverrides + ): Promise<[string, string]>; + + "resolve(bytes,bytes[])"( + name: PromiseOrValue, + data: PromiseOrValue[], + overrides?: CallOverrides + ): Promise<[string[], string]>; + + "resolve(bytes,bytes[],string[])"( + name: PromiseOrValue, + data: PromiseOrValue[], + gateways: PromiseOrValue[], + overrides?: CallOverrides + ): Promise<[string[], string]>; + + "resolve(bytes,bytes)"( name: PromiseOrValue, data: PromiseOrValue, overrides?: CallOverrides @@ -185,13 +426,31 @@ export interface UniversalResolver extends BaseContract { response: PromiseOrValue, extraData: PromiseOrValue, overrides?: CallOverrides - ): Promise; + ): Promise<[string[], string]>; - reverse( + resolveSingleCallback( + response: PromiseOrValue, + extraData: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string, string]>; + + "reverse(bytes,string[])"( + reverseName: PromiseOrValue, + gateways: PromiseOrValue[], + overrides?: CallOverrides + ): Promise<[string, string, string, string]>; + + "reverse(bytes)"( reverseName: PromiseOrValue, overrides?: CallOverrides ): Promise<[string, string, string, string]>; + reverseCallback( + response: PromiseOrValue, + extraData: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string, string, string, string]>; + supportsInterface( interfaceId: PromiseOrValue, overrides?: CallOverrides @@ -201,6 +460,20 @@ export interface UniversalResolver extends BaseContract { filters: {}; estimateGas: { + _resolveSingle( + name: PromiseOrValue, + data: PromiseOrValue, + gateways: PromiseOrValue[], + callbackFunction: PromiseOrValue, + metaData: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + batchGatewayURLs( + arg0: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + findResolver( name: PromiseOrValue, overrides?: CallOverrides @@ -208,7 +481,27 @@ export interface UniversalResolver extends BaseContract { registry(overrides?: CallOverrides): Promise; - resolve( + "resolve(bytes,bytes,string[])"( + name: PromiseOrValue, + data: PromiseOrValue, + gateways: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + + "resolve(bytes,bytes[])"( + name: PromiseOrValue, + data: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + + "resolve(bytes,bytes[],string[])"( + name: PromiseOrValue, + data: PromiseOrValue[], + gateways: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + + "resolve(bytes,bytes)"( name: PromiseOrValue, data: PromiseOrValue, overrides?: CallOverrides @@ -217,14 +510,32 @@ export interface UniversalResolver extends BaseContract { resolveCallback( response: PromiseOrValue, extraData: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + resolveSingleCallback( + response: PromiseOrValue, + extraData: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + "reverse(bytes,string[])"( + reverseName: PromiseOrValue, + gateways: PromiseOrValue[], overrides?: CallOverrides ): Promise; - reverse( + "reverse(bytes)"( reverseName: PromiseOrValue, overrides?: CallOverrides ): Promise; + reverseCallback( + response: PromiseOrValue, + extraData: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + supportsInterface( interfaceId: PromiseOrValue, overrides?: CallOverrides @@ -232,6 +543,20 @@ export interface UniversalResolver extends BaseContract { }; populateTransaction: { + _resolveSingle( + name: PromiseOrValue, + data: PromiseOrValue, + gateways: PromiseOrValue[], + callbackFunction: PromiseOrValue, + metaData: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + batchGatewayURLs( + arg0: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + findResolver( name: PromiseOrValue, overrides?: CallOverrides @@ -239,7 +564,27 @@ export interface UniversalResolver extends BaseContract { registry(overrides?: CallOverrides): Promise; - resolve( + "resolve(bytes,bytes,string[])"( + name: PromiseOrValue, + data: PromiseOrValue, + gateways: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + + "resolve(bytes,bytes[])"( + name: PromiseOrValue, + data: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + + "resolve(bytes,bytes[],string[])"( + name: PromiseOrValue, + data: PromiseOrValue[], + gateways: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + + "resolve(bytes,bytes)"( name: PromiseOrValue, data: PromiseOrValue, overrides?: CallOverrides @@ -248,14 +593,32 @@ export interface UniversalResolver extends BaseContract { resolveCallback( response: PromiseOrValue, extraData: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + resolveSingleCallback( + response: PromiseOrValue, + extraData: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + "reverse(bytes,string[])"( + reverseName: PromiseOrValue, + gateways: PromiseOrValue[], overrides?: CallOverrides ): Promise; - reverse( + "reverse(bytes)"( reverseName: PromiseOrValue, overrides?: CallOverrides ): Promise; + reverseCallback( + response: PromiseOrValue, + extraData: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + supportsInterface( interfaceId: PromiseOrValue, overrides?: CallOverrides diff --git a/packages/ensjs/src/generated/factories/NameWrapper__factory.ts b/packages/ensjs/src/generated/factories/NameWrapper__factory.ts index 51a4a594..74bc9b34 100644 --- a/packages/ensjs/src/generated/factories/NameWrapper__factory.ts +++ b/packages/ensjs/src/generated/factories/NameWrapper__factory.ts @@ -582,6 +582,19 @@ const _abi = [ stateMutability: "view", type: "function", }, + { + inputs: [], + name: "name", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, { inputs: [ { diff --git a/packages/ensjs/src/generated/factories/UniversalResolver__factory.ts b/packages/ensjs/src/generated/factories/UniversalResolver__factory.ts index 3e8ff25f..4cdcf305 100644 --- a/packages/ensjs/src/generated/factories/UniversalResolver__factory.ts +++ b/packages/ensjs/src/generated/factories/UniversalResolver__factory.ts @@ -17,6 +17,11 @@ const _abi = [ name: "_registry", type: "address", }, + { + internalType: "string[]", + name: "_urls", + type: "string[]", + }, ], stateMutability: "nonpayable", type: "constructor", @@ -52,6 +57,69 @@ const _abi = [ name: "OffchainLookup", type: "error", }, + { + inputs: [ + { + internalType: "bytes", + name: "name", + type: "bytes", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "string[]", + name: "gateways", + type: "string[]", + }, + { + internalType: "bytes4", + name: "callbackFunction", + type: "bytes4", + }, + { + internalType: "bytes", + name: "metaData", + type: "bytes", + }, + ], + name: "_resolveSingle", + outputs: [ + { + internalType: "bytes", + name: "", + type: "bytes", + }, + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + name: "batchGatewayURLs", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, { inputs: [ { @@ -89,6 +157,103 @@ const _abi = [ stateMutability: "view", type: "function", }, + { + inputs: [ + { + internalType: "bytes", + name: "name", + type: "bytes", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "string[]", + name: "gateways", + type: "string[]", + }, + ], + name: "resolve", + outputs: [ + { + internalType: "bytes", + name: "", + type: "bytes", + }, + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "name", + type: "bytes", + }, + { + internalType: "bytes[]", + name: "data", + type: "bytes[]", + }, + ], + name: "resolve", + outputs: [ + { + internalType: "bytes[]", + name: "", + type: "bytes[]", + }, + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "name", + type: "bytes", + }, + { + internalType: "bytes[]", + name: "data", + type: "bytes[]", + }, + { + internalType: "string[]", + name: "gateways", + type: "string[]", + }, + ], + name: "resolve", + outputs: [ + { + internalType: "bytes[]", + name: "", + type: "bytes[]", + }, + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, { inputs: [ { @@ -132,12 +297,85 @@ const _abi = [ }, ], name: "resolveCallback", + outputs: [ + { + internalType: "bytes[]", + name: "", + type: "bytes[]", + }, + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "response", + type: "bytes", + }, + { + internalType: "bytes", + name: "extraData", + type: "bytes", + }, + ], + name: "resolveSingleCallback", outputs: [ { internalType: "bytes", name: "", type: "bytes", }, + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "reverseName", + type: "bytes", + }, + { + internalType: "string[]", + name: "gateways", + type: "string[]", + }, + ], + name: "reverse", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + { + internalType: "address", + name: "", + type: "address", + }, + { + internalType: "address", + name: "", + type: "address", + }, + { + internalType: "address", + name: "", + type: "address", + }, ], stateMutability: "view", type: "function", @@ -176,6 +414,45 @@ const _abi = [ stateMutability: "view", type: "function", }, + { + inputs: [ + { + internalType: "bytes", + name: "response", + type: "bytes", + }, + { + internalType: "bytes", + name: "extraData", + type: "bytes", + }, + ], + name: "reverseCallback", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + { + internalType: "address", + name: "", + type: "address", + }, + { + internalType: "address", + name: "", + type: "address", + }, + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, { inputs: [ { diff --git a/packages/ensjs/src/index.ts b/packages/ensjs/src/index.ts index 4743b5d8..7b7533f3 100644 --- a/packages/ensjs/src/index.ts +++ b/packages/ensjs/src/index.ts @@ -43,8 +43,8 @@ import type setName from './functions/setName' import type setRecord from './functions/setRecord' import type setRecords from './functions/setRecords' import type setResolver from './functions/setResolver' -import type transferName from './functions/transferName' import type transferController from './functions/transferController' +import type transferName from './functions/transferName' import type transferSubname from './functions/transferSubname' import type unwrapName from './functions/unwrapName' import type wrapName from './functions/wrapName' diff --git a/packages/ensjs/src/tests/setup.ts b/packages/ensjs/src/tests/setup.ts index 30471099..0ce61bc1 100644 --- a/packages/ensjs/src/tests/setup.ts +++ b/packages/ensjs/src/tests/setup.ts @@ -17,30 +17,44 @@ export const deploymentAddresses = JSON.parse( string > -const createENS = (graphURI: string) => +const createENS = (graphURI: string, useReal?: boolean) => new ENS({ graphURI, - getContractAddress: () => (contractName) => - deploymentAddresses[ - contractName === 'ENSRegistryWithFallback' - ? 'ENSRegistry' - : contractName - ], + getContractAddress: useReal + ? undefined + : () => (contractName) => + deploymentAddresses[ + contractName === 'ENSRegistryWithFallback' + ? 'ENSRegistry' + : contractName + ], }) export default async (useReal?: boolean) => { - const graphURI = useReal - ? 'https://api.thegraph.com/subgraphs/name/ensdomains/ensropsten' - : 'http://localhost:8000/subgraphs/name/graphprotocol/ens' - - const provider = new ethers.providers.JsonRpcProvider( - 'http://localhost:8545', - 1337, + const { graphURI, providerURI, chainId } = useReal + ? { + graphURI: + 'https://api.thegraph.com/subgraphs/name/ensdomains/ensgoerli', + providerURI: 'https://web3.ens.domains/v1/goerli', + chainId: 5, + } + : { + graphURI: 'http://localhost:8000/subgraphs/name/graphprotocol/ens', + providerURI: 'http://localhost:8545', + chainId: 1337, + } + const provider = new ethers.providers.StaticJsonRpcProvider( + providerURI, + chainId, ) - let ensInstance = createENS(graphURI) + let ensInstance = createENS(graphURI, useReal) await ensInstance.setProvider(provider) + if (useReal) { + return { ensInstance, revert: () => {}, createSnapshot: () => {}, provider } + } + let snapshot = await provider.send('evm_snapshot', []) const revert = async (customSnapshot?: any) => { diff --git a/packages/ensjs/src/utils/ccip.ts b/packages/ensjs/src/utils/ccip.ts new file mode 100644 index 00000000..5383b483 --- /dev/null +++ b/packages/ensjs/src/utils/ccip.ts @@ -0,0 +1,148 @@ +import type { BaseProvider, TransactionRequest } from '@ethersproject/providers' +import { BigNumber, Transaction } from 'ethers' +import { + arrayify, + BytesLike, + hexConcat, + hexDataSlice, + toUtf8String, +} from 'ethers/lib/utils' + +function bytesPad(value: Uint8Array): Uint8Array { + if (value.length % 32 === 0) { + return value + } + + const result = new Uint8Array(Math.ceil(value.length / 32) * 32) + result.set(value) + return result +} + +function numPad(value: number): Uint8Array { + const result = arrayify(value) + if (result.length > 32) { + throw new Error('internal; should not happen') + } + + const padded = new Uint8Array(32) + padded.set(result, 32 - result.length) + return padded +} + +// ABI Encodes a series of (bytes, bytes, ...) +function encodeBytes(datas: Array) { + const result: Array = [] + + let byteCount = 0 + + // Add place-holders for pointers as we add items + for (let i = 0; i < datas.length; i += 1) { + result.push(new Uint8Array(0)) + byteCount += 32 + } + + for (let i = 0; i < datas.length; i += 1) { + const data = arrayify(datas[i]) + + // Update the bytes offset + result[i] = numPad(byteCount) + + // The length and padded value of data + result.push(numPad(data.length)) + result.push(bytesPad(data)) + byteCount += 32 + Math.ceil(data.length / 32) * 32 + } + + return hexConcat(result) +} + +function _parseBytes(result: string, start: number): null | string { + if (result === '0x') { + return null + } + + const offset = BigNumber.from( + hexDataSlice(result, start, start + 32), + ).toNumber() + const length = BigNumber.from( + hexDataSlice(result, offset, offset + 32), + ).toNumber() + + return hexDataSlice(result, offset + 32, offset + 32 + length) +} + +function _parseString(result: string, start: number): null | string { + try { + const bytes = _parseBytes(result, start) + if (bytes == null) return null + return toUtf8String(bytes) + } catch (error) {} + return null +} + +const ccipLookup = async ( + provider: BaseProvider, + transaction: TransactionRequest, + result: string, +) => { + const txSender = transaction.to! + try { + const data = hexDataSlice(result, 4) + + // Check the sender of the OffchainLookup matches the transaction + const sender = hexDataSlice(data, 0, 32) + if (!BigNumber.from(sender).eq(txSender)) { + throw new Error('CCIP Read sender did not match') + } + + // Read the URLs from the response + const urls: Array = [] + const urlsOffset = BigNumber.from(hexDataSlice(data, 32, 64)).toNumber() + const urlsLength = BigNumber.from( + hexDataSlice(data, urlsOffset, urlsOffset + 32), + ).toNumber() + const urlsData = hexDataSlice(data, urlsOffset + 32) + for (let u = 0; u < urlsLength; u += 1) { + const url = _parseString(urlsData, u * 32) + if (url == null) { + throw new Error('CCIP Read contained corrupt URL string') + } + urls.push(url) + } + + // Get the CCIP calldata to forward + const calldata = _parseBytes(data, 64) + + // Get the callbackSelector (bytes4) + if (!BigNumber.from(hexDataSlice(data, 100, 128)).isZero()) { + throw new Error('CCIP Read callback selected included junk') + } + const callbackSelector = hexDataSlice(data, 96, 100) + + // Get the extra data to send back to the contract as context + const extraData = _parseBytes(data, 128) + + const ccipResult = await provider.ccipReadFetch( + transaction, + calldata!, + urls, + ) + if (ccipResult == null) { + throw new Error('CCIP Read disabled or provided no URLs') + } + + const tx = { + to: sender, + data: hexConcat([ + callbackSelector, + encodeBytes([ccipResult, extraData!]), + ]), + } + + return await provider._call(tx, 'latest', 1) + } catch (error) { + console.error(error) + } +} + +export default ccipLookup diff --git a/packages/ensjs/src/utils/singleCall.ts b/packages/ensjs/src/utils/singleCall.ts index 82e75178..e2d497e6 100644 --- a/packages/ensjs/src/utils/singleCall.ts +++ b/packages/ensjs/src/utils/singleCall.ts @@ -11,6 +11,6 @@ export default async ( ) => func .raw(ensData, ...data) - .then((rawData) => provider.call(rawData)) + .then((rawData) => provider.call({ ...rawData, ccipReadEnabled: true })) .catch(() => null) .then((ret) => func.decode(ensData, ret, ...data)) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f43d97fd..113b3bec 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -31,14 +31,14 @@ importers: '@typescript-eslint/eslint-plugin': 5.33.0_njno5y7ry2l2lcmiu4tywxkwnq '@typescript-eslint/parser': 5.33.0_qugx7qdu5zevzvxaiqyxfiwquq eslint: 8.21.0 - eslint-config-airbnb: 19.0.4_wuiky6cubxtu43ziiwyfli5ujm + eslint-config-airbnb: 19.0.4_jatgrcxl4x7ywe7ak6cnjca2ae eslint-config-airbnb-base: 15.0.0_jatgrcxl4x7ywe7ak6cnjca2ae eslint-config-airbnb-typescript: 16.2.0_2p33354vws2q7hfbt5tyy4qhyy eslint-config-prettier: 8.5.0_eslint@8.21.0 eslint-plugin-import: 2.26.0_qfqnhzzittf54udqwes54xx65q eslint-plugin-prettier: 4.2.1_h62lvancfh4b7r6zn2dgodrh5e prettier: 2.7.1 - ts-node: 10.9.1_cvilj4l3ytrlnvtlqw3tscihve + ts-node: 10.9.1_typescript@4.7.4 typescript: 4.7.4 dependenciesMeta: ens-contracts: @@ -86,7 +86,7 @@ importers: '@ensdomains/content-hash': ^2.5.7 '@ensdomains/dnsprovejs': ^0.4.1 '@ensdomains/dnssecoraclejs': ^0.2.7 - '@ensdomains/ens-contracts': ^0.0.14 + '@ensdomains/ens-contracts': ^0.0.15 '@ensdomains/ens-test-env': workspace:* '@ethersproject/abi': ^5.6.0 '@ethersproject/providers': ^5.6.2 @@ -108,7 +108,7 @@ importers: glob: ^8.0.3 graphql: ^16.3.0 graphql-request: next - hardhat: ^2.10.1 + hardhat: 2.10.2 hardhat-abi-exporter: ^2.8.0 hardhat-deploy: ^0.11.12 idna-uts46-hx: 3.4.0 @@ -129,31 +129,31 @@ importers: '@ensdomains/address-encoder': 0.2.16 '@ensdomains/content-hash': 2.5.7 '@ensdomains/dnsprovejs': 0.4.1 - '@ensdomains/dnssecoraclejs': 0.2.7_d6ldzaponmmh23p4zb2uzwqa2y + '@ensdomains/dnssecoraclejs': 0.2.7_timjjj5ssgey6ctscbdzvpmswi dns-packet: 5.4.0 ethers: 5.6.9 graphql: 16.6.0 - graphql-request: 5.0.1-next.1_graphql@16.6.0 + graphql-request: 5.0.1-next.2_graphql@16.6.0 idna-uts46-hx: 3.4.0 traverse: 0.6.6 devDependencies: - '@ensdomains/buffer': 0.0.13_miwpojjjcowsqunohrlnj24nmm - '@ensdomains/ens-contracts': 0.0.14_miwpojjjcowsqunohrlnj24nmm + '@ensdomains/buffer': 0.0.13_hardhat@2.10.2 + '@ensdomains/ens-contracts': 0.0.15_hardhat@2.10.2 '@ensdomains/ens-test-env': link:../ens-test-env '@ethersproject/abi': 5.6.4 '@ethersproject/providers': 5.6.8 '@nomiclabs/hardhat-ethers': /hardhat-deploy-ethers/0.3.0-beta.13_illgchr2x7f55uzbyysl5sx6wu '@openzeppelin/contracts': 4.7.3 - '@openzeppelin/test-helpers': 0.5.16_bn.js@4.12.0 + '@openzeppelin/test-helpers': 0.5.16 '@swc/core': 1.2.241 '@swc/jest': 0.2.22_@swc+core@1.2.241 - '@typechain/ethers-v5': 10.1.0_3a2z4xo3ofaclmnvqkkolsxa2u + '@typechain/ethers-v5': 10.1.0_fbp5tbcdjjq4jan7wzeon4p3qq '@types/bn.js': 5.1.0 '@types/jest': 27.5.2 '@types/traverse': 0.6.32 dotenv: 16.0.1 esbuild: 0.15.6 - eslint-plugin-jest: 27.0.1_gxsh7ni3jr2i4mnimuxscncbum + eslint-plugin-jest: 27.0.1_g4n3hsjlbmz4ag5o32ytojordu ganache: 7.4.1 glob: 8.0.3 hardhat: 2.10.2_6oasmw356qmm23djlsjgkwvrtm @@ -166,8 +166,8 @@ importers: node-fetch: 3.2.10 node-fetch-commonjs: 3.1.1 solc: 0.8.16 - ts-jest: 27.1.5_n5dgf3tunmvnqk6zg2hpxei2pm - ts-node: 10.9.1_ffej6ugorxkxnq7ysrxqxyfy6a + ts-jest: 27.1.5_2adzr5bv2qpyd5zjpgodfe3dyu + ts-node: 10.9.1_litewngskstwdadyxlilaik57a typechain: 8.1.0_typescript@4.7.4 typescript: 4.7.4 wait-on: 6.0.1 @@ -463,14 +463,6 @@ packages: '@babel/helper-plugin-utils': 7.18.9 dev: true - /@babel/runtime-corejs3/7.19.1: - resolution: {integrity: sha512-j2vJGnkopRzH+ykJ8h68wrHnEUmtK//E723jjixiAl/PPf6FhqY/vYRcMVlNydRKQjQsTsYEjpx+DZMIvnGk/g==} - engines: {node: '>=6.9.0'} - dependencies: - core-js-pure: 3.25.5 - regenerator-runtime: 0.13.9 - dev: true - /@babel/runtime/7.18.9: resolution: {integrity: sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==} engines: {node: '>=6.9.0'} @@ -554,10 +546,10 @@ packages: resolution: {integrity: sha512-EOFqiWnN36EyyBAgHFTsabFcFICUALt41SiDm/4pAw4V36R4lD4wHcnZcqCYki9m1fMaeWGHrdqxmrMa8iiSTQ==} dev: false - /@ensdomains/buffer/0.0.13_miwpojjjcowsqunohrlnj24nmm: + /@ensdomains/buffer/0.0.13_hardhat@2.10.2: resolution: {integrity: sha512-8aA+U/e4S54ebPwcge1HHvvpgXLKxPd6EOSegMlrTvBnKB8RwB3OpNyflaikD6KqzIwDaBaH8bvnTrMcfpV7oQ==} dependencies: - '@nomiclabs/hardhat-truffle5': 2.0.6_miwpojjjcowsqunohrlnj24nmm + '@nomiclabs/hardhat-truffle5': 2.0.6_hardhat@2.10.2 transitivePeerDependencies: - '@nomiclabs/hardhat-web3' - bufferutil @@ -588,11 +580,11 @@ packages: typescript-logging: 1.0.1 dev: false - /@ensdomains/dnssecoraclejs/0.2.7_d6ldzaponmmh23p4zb2uzwqa2y: + /@ensdomains/dnssecoraclejs/0.2.7_timjjj5ssgey6ctscbdzvpmswi: resolution: {integrity: sha512-k2DDXAwAI/gjEBTu4vsIvjeL+TcfJ6JkVgC0X7KHlccBCNT/vQMiwvExtFWwGtt3aHPXjLTVehzvM4VZcu1Xow==} dependencies: '@ensdomains/dnsprovejs': 0.4.1 - '@ensdomains/ens-contracts': 0.0.7_d6ldzaponmmh23p4zb2uzwqa2y + '@ensdomains/ens-contracts': 0.0.7_timjjj5ssgey6ctscbdzvpmswi dns-packet: 5.4.0 dotenv: 8.6.0 ethers: 5.6.9 @@ -613,10 +605,10 @@ packages: - web3-utils dev: false - /@ensdomains/ens-contracts/0.0.14_miwpojjjcowsqunohrlnj24nmm: - resolution: {integrity: sha512-a56QCIZyPPLcScJ/aW2pSOddbMoFiREUOArNwbtqPgWK0oHvAzuoMs9uKTUYIqDLG20nMhbTRuigdpN7gPUeJg==} + /@ensdomains/ens-contracts/0.0.15_hardhat@2.10.2: + resolution: {integrity: sha512-fOmGylPbsHWjhD3iXz1pyi5VuyW25ahbjjUIjaKwC5MBULJYJDFb2sHlK8P4bxVep2pTGfV3XUhdFVMiEE4LLQ==} dependencies: - '@ensdomains/buffer': 0.0.13_miwpojjjcowsqunohrlnj24nmm + '@ensdomains/buffer': 0.0.13_hardhat@2.10.2 '@ensdomains/solsha1': 0.0.3 '@openzeppelin/contracts': 4.7.3 dns-packet: 5.4.0 @@ -641,10 +633,10 @@ packages: '@openzeppelin/contracts': 4.7.3 dev: false - /@ensdomains/ens-contracts/0.0.7_d6ldzaponmmh23p4zb2uzwqa2y: + /@ensdomains/ens-contracts/0.0.7_timjjj5ssgey6ctscbdzvpmswi: resolution: {integrity: sha512-adlWSrtBh85CNM1hsrsNxWrSx6g37DOCkWP5vBT/HtXnpNtvL49Z1Ueum55lN8YifTWo2Kqb1mgPojjLY99f5w==} dependencies: - '@ensdomains/buffer': 0.0.13_miwpojjjcowsqunohrlnj24nmm + '@ensdomains/buffer': 0.0.13_hardhat@2.10.2 '@ensdomains/solsha1': 0.0.3 '@openzeppelin/contracts': 4.7.3 dns-packet: 5.4.0 @@ -1488,21 +1480,19 @@ packages: fastq: 1.13.0 dev: true - /@nomiclabs/hardhat-truffle5/2.0.6_miwpojjjcowsqunohrlnj24nmm: + /@nomiclabs/hardhat-truffle5/2.0.6_hardhat@2.10.2: resolution: {integrity: sha512-kzkpVEX36yOmdhCJHesu+1nB+fiaKpMrvUSVd0Ox6Jila+8aSxeHTC4bbEBOIqJcvOQZ3sj5fzuE5VjhNkZkvw==} peerDependencies: '@nomiclabs/hardhat-web3': ^2.0.0 hardhat: ^2.6.4 web3: ^1.0.0-beta.36 dependencies: - '@nomiclabs/hardhat-web3': 2.0.0_hardhat@2.10.2+web3@1.7.5 - '@nomiclabs/truffle-contract': 4.5.10_xo2ir75lhq3wbj3meh5xw2sdzq + '@nomiclabs/truffle-contract': 4.5.10 '@types/chai': 4.3.3 chai: 4.3.6 ethereumjs-util: 7.1.5 fs-extra: 7.0.1 hardhat: 2.10.2_6oasmw356qmm23djlsjgkwvrtm - web3: 1.7.5 transitivePeerDependencies: - bufferutil - encoding @@ -1529,17 +1519,7 @@ packages: hardhat: 2.10.2_6oasmw356qmm23djlsjgkwvrtm dev: false - /@nomiclabs/hardhat-web3/2.0.0_hardhat@2.10.2+web3@1.7.5: - resolution: {integrity: sha512-zt4xN+D+fKl3wW2YlTX3k9APR3XZgPkxJYf36AcliJn3oujnKEVRZaHu0PhgLjO+gR+F/kiYayo9fgd2L8970Q==} - peerDependencies: - hardhat: ^2.0.0 - web3: ^1.0.0-beta.36 - dependencies: - '@types/bignumber.js': 5.0.0 - hardhat: 2.10.2_6oasmw356qmm23djlsjgkwvrtm - web3: 1.7.5 - - /@nomiclabs/truffle-contract/4.5.10_xo2ir75lhq3wbj3meh5xw2sdzq: + /@nomiclabs/truffle-contract/4.5.10: resolution: {integrity: sha512-nF/6InFV+0hUvutyFgsdOMCoYlr//2fJbRER4itxYtQtc4/O1biTwZIKRu+5l2J5Sq6LU2WX7vZHtDgQdhWxIQ==} peerDependencies: web3: ^1.2.1 @@ -1550,19 +1530,14 @@ packages: dependencies: '@ensdomains/ensjs': 2.1.0 '@truffle/blockchain-utils': 0.1.4 - '@truffle/contract-schema': 3.4.9 - '@truffle/debug-utils': 6.0.32 + '@truffle/contract-schema': 3.4.10 + '@truffle/debug-utils': 6.0.35 '@truffle/error': 0.1.1 - '@truffle/interface-adapter': 0.5.21 + '@truffle/interface-adapter': 0.5.22 bignumber.js: 7.2.1 ethereum-ens: 0.8.0 ethers: 4.0.49 source-map-support: 0.5.21 - web3: 1.7.5 - web3-core-helpers: 1.7.5 - web3-core-promievent: 1.7.5 - web3-eth-abi: 1.7.5 - web3-utils: 1.7.5 transitivePeerDependencies: - bufferutil - encoding @@ -1579,14 +1554,14 @@ packages: /@openzeppelin/contracts/4.7.3: resolution: {integrity: sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw==} - /@openzeppelin/test-helpers/0.5.16_bn.js@4.12.0: + /@openzeppelin/test-helpers/0.5.16: resolution: {integrity: sha512-T1EvspSfH1qQO/sgGlskLfYVBbqzJR23SZzYl/6B2JnT4EhThcI85UpvDk0BkLWKaDScQTabGHt4GzHW+3SfZg==} dependencies: '@openzeppelin/contract-loader': 0.6.3 '@truffle/contract': 4.6.2 ansi-colors: 3.2.4 chai: 4.3.6 - chai-bn: 0.2.2_bn.js@4.12.0+chai@4.3.6 + chai-bn: 0.2.2_chai@4.3.6 ethjs-abi: 0.2.1 lodash.flatten: 4.4.0 semver: 5.7.1 @@ -1934,40 +1909,16 @@ packages: engines: {node: '>= 6'} dev: true - /@truffle/abi-utils/0.2.17: - resolution: {integrity: sha512-Lz8bDjEYInaesdpP3ENVnDkfSkEmrV2z9BNcIEQPQnqdB5x/H+rIrWGny7LV6rX3Kz3kAerF8eGBFh7Z/dEhZw==} - dependencies: - change-case: 3.0.2 - faker: 5.5.3 - fast-check: 3.1.1 - /@truffle/abi-utils/0.3.2: resolution: {integrity: sha512-32queMD64YKL/tmQgSV4Xs073dIaZ9tp7NP1icjwvFSA3Q9yeu7ApYbSbYMsx9H9zWkkVOsfcoJ2kJEieOCzsA==} dependencies: change-case: 3.0.2 fast-check: 3.1.1 web3-utils: 1.7.4 - dev: true /@truffle/blockchain-utils/0.1.4: resolution: {integrity: sha512-HegAo5A8UX9vE8dtceBRgCY207gOb9wj54c8mNOOWHcFpkyJz7kZYGo44As6Imh10/0hD2j7vHQ56Jf+uszJ3A==} - /@truffle/codec/0.14.2: - resolution: {integrity: sha512-rFyj/TnIZ3N9n6cTcaEUbOXktGqZH/Mk48VjN/NT7f585zpCP82YmGTAxJwn61HuT2Zan8bksSElMivjUHKHeg==} - dependencies: - '@truffle/abi-utils': 0.2.17 - '@truffle/compile-common': 0.7.34 - big.js: 6.2.1 - bn.js: 5.2.1 - cbor: 5.2.0 - debug: 4.3.4 - lodash: 4.17.21 - semver: 7.3.7 - utf8: 3.0.0 - web3-utils: 1.7.4 - transitivePeerDependencies: - - supports-color - /@truffle/codec/0.14.5: resolution: {integrity: sha512-3FCpTJe6o7LGWUfrSdguMpdpH1PTn3u7bIfbj6Cfdzym2OAVSgxTgdlqC1poepbk0xcOVcUW+EsqNwLMqmBiPA==} dependencies: @@ -1983,20 +1934,12 @@ packages: web3-utils: 1.7.4 transitivePeerDependencies: - supports-color - dev: true - - /@truffle/compile-common/0.7.34: - resolution: {integrity: sha512-NA8HuTCw6pgTpCyMd7M70Ii8AVD921R95UnXB3dwVWwEyV1OksaAsTKfdLxeLnFR4ISkK6o2NqpFb/lM3+V+9w==} - dependencies: - '@truffle/error': 0.1.1 - colors: 1.4.0 /@truffle/compile-common/0.8.1: resolution: {integrity: sha512-7mzzG9Cfrn+fDT5Sqi7B6pccvIIV5w/GM8/56YgnjysbDzy5aZ6mv0fe37ZbcznEVQ35NJjBy+lEr/ozOGXwQA==} dependencies: '@truffle/error': 0.1.1 colors: 1.4.0 - dev: true /@truffle/contract-schema/3.4.10: resolution: {integrity: sha512-BhRNRoRvlj2th6E5RNS0BnS0ZxQe01JJz8I7MjkGqdeXSvrn6qDCAnbmvhNgUv0l5h8w5+gBOQhAJhILf1shdQ==} @@ -2005,15 +1948,6 @@ packages: debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: true - - /@truffle/contract-schema/3.4.9: - resolution: {integrity: sha512-nhYMXWbUs6dMYHL1f8DTkRk/uo1sADK0yeSYXo/p/7nqnjlHzqrr75BBsKbB7OFIVT05des+GFNQJqBaRZVdxQ==} - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color /@truffle/contract/4.6.2: resolution: {integrity: sha512-OZZIDmKtHgZS2Q6sCczNe8OfTuMWpRaAo3vwY49LGGs0VXLiwc7nIcCFh+bMg14IRK6vBN4pWE9W9eWSBFy31Q==} @@ -2038,18 +1972,6 @@ packages: - utf-8-validate dev: true - /@truffle/debug-utils/6.0.32: - resolution: {integrity: sha512-q/fDMQwY2qxIYuJs0oIIBxS26GNfFl0m5TVwkjoUlcg18O7LwnrnSezXcZw+id4k90kKqWtnjXD0/ZXX/gyXyw==} - dependencies: - '@truffle/codec': 0.14.2 - '@trufflesuite/chromafi': 3.0.0 - bn.js: 5.2.1 - chalk: 2.4.2 - debug: 4.3.4 - highlightjs-solidity: 2.0.5 - transitivePeerDependencies: - - supports-color - /@truffle/debug-utils/6.0.35: resolution: {integrity: sha512-GuLsc+GFEYiUM683GWh4/ol3jkBts5a601detVWu1Xo5/bSL5gxooOjgOTovjA8dimCjkyi/DnK2yHHC+q+g0g==} dependencies: @@ -2061,22 +1983,10 @@ packages: highlightjs-solidity: 2.0.5 transitivePeerDependencies: - supports-color - dev: true /@truffle/error/0.1.1: resolution: {integrity: sha512-sE7c9IHIGdbK4YayH4BC8i8qMjoAOeg6nUXUDZZp8wlU21/EMpaG+CLx+KqcIPyR+GSWIW3Dm0PXkr2nlggFDA==} - /@truffle/interface-adapter/0.5.21: - resolution: {integrity: sha512-2ltbu3upsWS0TAQu1kLQc048XlXNmDkCzH6iebX4dg3VBB+l7oG/pu5+/kl8t+LRfzGoEMLKwOQt7vk0Vm3PNA==} - dependencies: - bn.js: 5.2.1 - ethers: 4.0.49 - web3: 1.7.4 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - /@truffle/interface-adapter/0.5.22: resolution: {integrity: sha512-Bgl5Afb1mPVNedI8CJzZQzVIdrZWSXISTBrXPZmppD4Q+6V1RUzlLxiaGGB4gYHOA+U0pBzD8MCcSycPAD9RsA==} dependencies: @@ -2087,7 +1997,6 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: true /@trufflesuite/bigint-buffer/1.1.10: resolution: {integrity: sha512-pYIQC5EcMmID74t26GCC67946mgTJFiLXOT/BYozgrd4UEY2JHEGLhWi9cMiQCt5BSqFEvKkCHNnoj82SRjiEw==} @@ -2120,7 +2029,7 @@ packages: /@tsconfig/node16/1.0.3: resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} - /@typechain/ethers-v5/10.1.0_3a2z4xo3ofaclmnvqkkolsxa2u: + /@typechain/ethers-v5/10.1.0_fbp5tbcdjjq4jan7wzeon4p3qq: resolution: {integrity: sha512-3LIb+eUpV3mNCrjUKT5oqp8PBsZYSnVrkfk6pY/ZM0boRs2mKxjFZ7bktx42vfDye8PPz3NxtW4DL5NsNsFqlg==} peerDependencies: '@ethersproject/abi': ^5.0.0 @@ -2131,7 +2040,6 @@ packages: typescript: '>=4.3.0' dependencies: '@ethersproject/abi': 5.6.4 - '@ethersproject/bytes': 5.6.1 '@ethersproject/providers': 5.6.8 ethers: 5.6.9 lodash: 4.17.21 @@ -2182,12 +2090,6 @@ packages: '@babel/types': 7.18.10 dev: true - /@types/bignumber.js/5.0.0: - resolution: {integrity: sha512-0DH7aPGCClywOFaxxjE6UwpN2kQYe9LwuDQMv+zYA97j5GkOMo8e66LYT+a8JYU7jfmUFRZLa9KycxHDsKXJCA==} - deprecated: This is a stub types definition for bignumber.js (https://github.com/MikeMcl/bignumber.js/). bignumber.js provides its own type definitions, so you don't need @types/bignumber.js installed! - dependencies: - bignumber.js: 9.1.0 - /@types/bn.js/4.11.6: resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} dependencies: @@ -2484,6 +2386,23 @@ packages: - typescript dev: true + /@typescript-eslint/utils/5.33.0_typescript@4.7.4: + resolution: {integrity: sha512-JxOAnXt9oZjXLIiXb5ZIcZXiwVHCkqZgof0O8KPgz7C7y0HS42gi75PdPlqh1Tf109M0fyUw45Ao6JLo7S5AHw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@types/json-schema': 7.0.11 + '@typescript-eslint/scope-manager': 5.33.0 + '@typescript-eslint/types': 5.33.0 + '@typescript-eslint/typescript-estree': 5.33.0_typescript@4.7.4 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + /@typescript-eslint/visitor-keys/5.33.0: resolution: {integrity: sha512-/XsqCzD4t+Y9p5wd9HZiptuGKBlaZO5showwqODii5C0nZawxWLF+Q6k5wYHBrQv96h6GYKyqqMHCSTqta8Kiw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2549,7 +2468,7 @@ packages: engines: {node: '>=6'} dependencies: buffer: 5.7.1 - immediate: 3.2.3 + immediate: 3.3.0 level-concat-iterator: 2.0.1 level-supports: 1.0.1 xtend: 4.0.2 @@ -2743,14 +2662,6 @@ packages: /argparse/2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - /aria-query/4.2.2: - resolution: {integrity: sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==} - engines: {node: '>=6.0'} - dependencies: - '@babel/runtime': 7.18.9 - '@babel/runtime-corejs3': 7.19.1 - dev: true - /arr-diff/2.0.0: resolution: {integrity: sha512-dtXTVMkh6VkEEA7OhXnN1Ecb8aAGFdZ1LFxtOCoqj4qkyOJMt7+qs6Ahdy6p/NQCPYsRSXXivhSB/J5E9jmYKA==} engines: {node: '>=0.10.0'} @@ -2836,16 +2747,6 @@ packages: es-shim-unscopables: 1.0.0 dev: true - /array.prototype.flatmap/1.3.0: - resolution: {integrity: sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.1 - es-shim-unscopables: 1.0.0 - dev: true - /array.prototype.reduce/1.0.4: resolution: {integrity: sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw==} engines: {node: '>= 0.4'} @@ -2882,10 +2783,6 @@ packages: engines: {node: '>=0.10.0'} dev: false - /ast-types-flow/0.0.7: - resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} - dev: true - /async-each/1.0.3: resolution: {integrity: sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==} dev: false @@ -2932,11 +2829,6 @@ packages: /aws4/1.11.0: resolution: {integrity: sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==} - /axe-core/4.4.3: - resolution: {integrity: sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w==} - engines: {node: '>=4'} - dev: true - /axios/0.21.4_debug@4.3.4: resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} dependencies: @@ -2952,10 +2844,6 @@ packages: transitivePeerDependencies: - debug - /axobject-query/2.2.0: - resolution: {integrity: sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==} - dev: true - /babel-code-frame/6.26.0: resolution: {integrity: sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==} dependencies: @@ -3979,13 +3867,12 @@ packages: bignumber.js: 9.1.0 nofilter: 1.0.4 - /chai-bn/0.2.2_bn.js@4.12.0+chai@4.3.6: + /chai-bn/0.2.2_chai@4.3.6: resolution: {integrity: sha512-MzjelH0p8vWn65QKmEq/DLBG1Hle4WeyqT79ANhXZhn/UxRWO0OogkAxi5oGGtfzwU9bZR8mvbvYdoqNVWQwFg==} peerDependencies: bn.js: ^4.11.0 chai: ^4.0.0 dependencies: - bn.js: 4.12.0 chai: 4.3.6 dev: true @@ -4413,6 +4300,7 @@ packages: /core-js-pure/3.25.5: resolution: {integrity: sha512-oml3M22pHM+igfWHDfdLVq2ShWmjM2V4L+dQEBs0DWVIqEm9WHCwGAlZ6BmyBQGy5sFrJmcx+856D9lVKyGWYg==} requiresBuild: true + dev: false /core-js/2.6.12: resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} @@ -4575,10 +4463,6 @@ packages: es5-ext: 0.10.62 type: 1.2.0 - /damerau-levenshtein/1.0.8: - resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - dev: true - /dashdash/1.14.1: resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} engines: {node: '>=0.10'} @@ -4995,10 +4879,6 @@ packages: /emoji-regex/8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - /emoji-regex/9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: true - /encode-utf8/1.0.3: resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} dev: true @@ -5416,7 +5296,7 @@ packages: eslint-plugin-import: 2.26.0_qfqnhzzittf54udqwes54xx65q dev: true - /eslint-config-airbnb/19.0.4_wuiky6cubxtu43ziiwyfli5ujm: + /eslint-config-airbnb/19.0.4_jatgrcxl4x7ywe7ak6cnjca2ae: resolution: {integrity: sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==} engines: {node: ^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -5429,9 +5309,6 @@ packages: eslint: 8.21.0 eslint-config-airbnb-base: 15.0.0_jatgrcxl4x7ywe7ak6cnjca2ae eslint-plugin-import: 2.26.0_qfqnhzzittf54udqwes54xx65q - eslint-plugin-jsx-a11y: 6.6.1_eslint@8.21.0 - eslint-plugin-react: 7.31.8_eslint@8.21.0 - eslint-plugin-react-hooks: 4.6.0_eslint@8.21.0 object.assign: 4.1.3 object.entries: 1.1.5 dev: true @@ -5514,7 +5391,7 @@ packages: - supports-color dev: true - /eslint-plugin-jest/27.0.1_gxsh7ni3jr2i4mnimuxscncbum: + /eslint-plugin-jest/27.0.1_g4n3hsjlbmz4ag5o32ytojordu: resolution: {integrity: sha512-LosUsrkwVSs/8Z/I8Hqn5vWgTEsHrfIquDEKOsV8/cl+gbFR4tiRCE1AimEotsHjSC0Rx1tYm6vPhw8C3ktmmg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -5527,36 +5404,13 @@ packages: jest: optional: true dependencies: - '@typescript-eslint/utils': 5.33.0_qugx7qdu5zevzvxaiqyxfiwquq - eslint: 8.21.0 + '@typescript-eslint/utils': 5.33.0_typescript@4.7.4 jest: 27.5.1_ts-node@10.9.1 transitivePeerDependencies: - supports-color - typescript dev: true - /eslint-plugin-jsx-a11y/6.6.1_eslint@8.21.0: - resolution: {integrity: sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==} - engines: {node: '>=4.0'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - dependencies: - '@babel/runtime': 7.18.9 - aria-query: 4.2.2 - array-includes: 3.1.5 - ast-types-flow: 0.0.7 - axe-core: 4.4.3 - axobject-query: 2.2.0 - damerau-levenshtein: 1.0.8 - emoji-regex: 9.2.2 - eslint: 8.21.0 - has: 1.0.3 - jsx-ast-utils: 3.3.3 - language-tags: 1.0.5 - minimatch: 3.1.2 - semver: 6.3.0 - dev: true - /eslint-plugin-prettier/4.2.1_h62lvancfh4b7r6zn2dgodrh5e: resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} engines: {node: '>=12.0.0'} @@ -5574,38 +5428,6 @@ packages: prettier-linter-helpers: 1.0.0 dev: true - /eslint-plugin-react-hooks/4.6.0_eslint@8.21.0: - resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - dependencies: - eslint: 8.21.0 - dev: true - - /eslint-plugin-react/7.31.8_eslint@8.21.0: - resolution: {integrity: sha512-5lBTZmgQmARLLSYiwI71tiGVTLUuqXantZM6vlSY39OaDSV0M7+32K5DnLkmFrwTe+Ksz0ffuLUC91RUviVZfw==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - dependencies: - array-includes: 3.1.5 - array.prototype.flatmap: 1.3.0 - doctrine: 2.1.0 - eslint: 8.21.0 - estraverse: 5.3.0 - jsx-ast-utils: 3.3.3 - minimatch: 3.1.2 - object.entries: 1.1.5 - object.fromentries: 2.0.5 - object.hasown: 1.1.1 - object.values: 1.1.5 - prop-types: 15.8.1 - resolve: 2.0.0-next.4 - semver: 6.3.0 - string.prototype.matchall: 4.0.7 - dev: true - /eslint-scope/5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} @@ -5622,6 +5444,15 @@ packages: estraverse: 5.3.0 dev: true + /eslint-utils/3.0.0: + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + dependencies: + eslint-visitor-keys: 2.1.0 + dev: true + /eslint-utils/3.0.0_eslint@8.21.0: resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} @@ -6383,9 +6214,6 @@ packages: checkpoint-store: 1.1.0 dev: false - /faker/5.5.3: - resolution: {integrity: sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g==} - /fast-check/3.1.1: resolution: {integrity: sha512-3vtXinVyuUKCKFKYcwXhGE6NtGWkqF8Yh3rvMZNzmwz8EPrgoc/v4pDdLHyLnCyCI5MZpZZkDEwFyXyEONOxpA==} engines: {node: '>=8.0.0'} @@ -7095,8 +6923,8 @@ packages: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} dev: true - /graphql-request/5.0.1-next.1_graphql@16.6.0: - resolution: {integrity: sha512-yo7HvMp12X9UX88PdtNGD2b6hZH553uLNb6mUByxt+QTC5HagG24qndfvpFy9+aVeKTQ6RtNHYhjw1lLDmqBQg==} + /graphql-request/5.0.1-next.2_graphql@16.6.0: + resolution: {integrity: sha512-wenr1clu45bJ97J37dvnrN1/Wq4JfUvnay745ZuNqsDf3Znb0V+mRGNWuXJygEsfTFHyIo3VALaUug5Sq7lYYg==} peerDependencies: graphql: 14 - 16 dependencies: @@ -7230,7 +7058,7 @@ packages: source-map-support: 0.5.21 stacktrace-parser: 0.1.10 true-case-path: 2.2.1 - ts-node: 10.9.1_ffej6ugorxkxnq7ysrxqxyfy6a + ts-node: 10.9.1_litewngskstwdadyxlilaik57a tsort: 0.0.1 typescript: 4.7.4 undici: 5.9.1 @@ -8112,7 +7940,7 @@ packages: pretty-format: 27.5.1 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.1_ffej6ugorxkxnq7ysrxqxyfy6a + ts-node: 10.9.1_litewngskstwdadyxlilaik57a transitivePeerDependencies: - bufferutil - canvas @@ -8711,14 +8539,6 @@ packages: json-schema: 0.4.0 verror: 1.10.0 - /jsx-ast-utils/3.3.3: - resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==} - engines: {node: '>=4.0'} - dependencies: - array-includes: 3.1.5 - object.assign: 4.1.3 - dev: true - /keccak/3.0.1: resolution: {integrity: sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==} engines: {node: '>=10.0.0'} @@ -8787,16 +8607,6 @@ packages: engines: {node: '>=6'} dev: true - /language-subtag-registry/0.3.22: - resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} - dev: true - - /language-tags/1.0.5: - resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==} - dependencies: - language-subtag-registry: 0.3.22 - dev: true - /lcid/1.0.0: resolution: {integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==} engines: {node: '>=0.10.0'} @@ -9096,6 +8906,7 @@ packages: hasBin: true dependencies: js-tokens: 4.0.0 + dev: false /loupe/2.3.4: resolution: {integrity: sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==} @@ -9912,15 +9723,6 @@ packages: es-abstract: 1.20.1 dev: true - /object.fromentries/2.0.5: - resolution: {integrity: sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.1 - dev: true - /object.getownpropertydescriptors/2.1.4: resolution: {integrity: sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ==} engines: {node: '>= 0.8'} @@ -9931,13 +9733,6 @@ packages: es-abstract: 1.20.1 dev: false - /object.hasown/1.1.1: - resolution: {integrity: sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==} - dependencies: - define-properties: 1.1.4 - es-abstract: 1.20.1 - dev: true - /object.omit/2.0.1: resolution: {integrity: sha512-UiAM5mhmIuKLsOvrL+B0U2d1hXHF3bFYWIuH1LMpuV2EJEHG1Ntz06PgLEHjm6VFd87NpH8rastvPoyv6UW2fA==} engines: {node: '>=0.10.0'} @@ -10462,14 +10257,6 @@ packages: sisteransi: 1.0.5 dev: true - /prop-types/15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react-is: 16.13.1 - dev: true - /propagate/2.0.1: resolution: {integrity: sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==} engines: {node: '>= 8'} @@ -10643,10 +10430,6 @@ packages: iconv-lite: 0.4.24 unpipe: 1.0.0 - /react-is/16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - dev: true - /react-is/17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} dev: true @@ -10888,15 +10671,6 @@ packages: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - /resolve/2.0.0-next.4: - resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} - hasBin: true - dependencies: - is-core-module: 2.10.0 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - /responselike/1.0.2: resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==} dependencies: @@ -11566,19 +11340,6 @@ packages: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - /string.prototype.matchall/4.0.7: - resolution: {integrity: sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.1 - get-intrinsic: 1.1.2 - has-symbols: 1.0.3 - internal-slot: 1.0.3 - regexp.prototype.flags: 1.4.3 - side-channel: 1.0.4 - dev: true - /string.prototype.trim/1.2.6: resolution: {integrity: sha512-8lMR2m+U0VJTPp6JjvJTtGyc4FIGq9CdRt7O9p6T0e6K4vjU+OP+SQJpbe/SBmRcCUIvNUnjsbmY6lnMp8MhsQ==} engines: {node: '>= 0.4'} @@ -12020,7 +11781,7 @@ packages: ts-essentials: 1.0.4 dev: false - /ts-jest/27.1.5_n5dgf3tunmvnqk6zg2hpxei2pm: + /ts-jest/27.1.5_2adzr5bv2qpyd5zjpgodfe3dyu: resolution: {integrity: sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true @@ -12041,7 +11802,6 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.18.10 '@types/jest': 27.5.2 bs-logger: 0.2.6 esbuild: 0.15.6 @@ -12056,7 +11816,7 @@ packages: yargs-parser: 20.2.9 dev: true - /ts-node/10.9.1_cvilj4l3ytrlnvtlqw3tscihve: + /ts-node/10.9.1_litewngskstwdadyxlilaik57a: resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -12071,11 +11831,11 @@ packages: optional: true dependencies: '@cspotcode/source-map-support': 0.8.1 + '@swc/core': 1.2.241 '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 - '@types/node': 18.6.5 acorn: 8.8.0 acorn-walk: 8.2.0 arg: 4.1.3 @@ -12085,9 +11845,8 @@ packages: typescript: 4.7.4 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - dev: true - /ts-node/10.9.1_ffej6ugorxkxnq7ysrxqxyfy6a: + /ts-node/10.9.1_typescript@4.7.4: resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -12102,12 +11861,10 @@ packages: optional: true dependencies: '@cspotcode/source-map-support': 0.8.1 - '@swc/core': 1.2.241 '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 - '@types/node': 18.6.5 acorn: 8.8.0 acorn-walk: 8.2.0 arg: 4.1.3 @@ -12117,6 +11874,7 @@ packages: typescript: 4.7.4 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + dev: true /tsconfig-paths/3.14.1: resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==}