@xyo-network/diviner-evm-call-result-to-token-uri 3.4.4 → 3.4.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,151 +5,16 @@ var EvmCallResultToNftTokenUriDivinerSchema = "network.xyo.evm.call.results.meta
5
5
  var EvmCallResultToNftTokenUriDivinerConfigSchema = `${EvmCallResultToNftTokenUriDivinerSchema}.config`;
6
6
 
7
7
  // src/Diviner.ts
8
- import { AbstractDiviner as AbstractDiviner2 } from "@xyo-network/diviner-abstract";
9
- import { NftMetadataUriSchema } from "@xyo-network/evm-nft-id-payload-plugin";
10
- import { isPayloadOfSchemaType as isPayloadOfSchemaType4 } from "@xyo-network/payload-model";
11
-
12
- // ../../../dist/neutral/index.mjs
13
- import { assertEx } from "@xylabs/assert";
14
8
  import { AbstractDiviner } from "@xyo-network/diviner-abstract";
15
- import { isPayloadOfSchemaType as isPayloadOfSchemaType2 } from "@xyo-network/payload-model";
9
+ import { EvmCallResultsSchema } from "@xyo-network/evm-call-witness";
10
+ import { NftMetadataUriSchema } from "@xyo-network/evm-nft-id-payload-plugin";
16
11
  import { isPayloadOfSchemaType } from "@xyo-network/payload-model";
17
- import { assertEx as assertEx2 } from "@xylabs/assert";
18
- import { isHexZero } from "@xylabs/hex";
19
- import { getErc1822SlotStatus } from "@xyo-network/erc1822-witness";
20
- import { getErc1967SlotStatus } from "@xyo-network/erc1967-witness";
21
- import { isPayloadOfSchemaType as isPayloadOfSchemaType3 } from "@xyo-network/payload-model";
22
- import { AbstractEvmWitness } from "@xyo-network/witness-evm-abstract";
23
- import { Contract } from "ethers";
24
- var EvmCallDivinerLabels = { "network.xyo.crypto.contract.info": "diviner" };
25
- var EvmCallSchema = "network.xyo.evm.call";
26
- var EvmCallResultSchema = "network.xyo.evm.call.result";
27
- var isEvmCallSuccess = (payload) => {
28
- return payload?.result !== void 0;
29
- };
30
- var isEvmCallResult = isPayloadOfSchemaType(EvmCallResultSchema);
31
- var asEvmCallSuccess = (payload) => isEvmCallSuccess(payload) ? payload : void 0;
32
- var EvmCallDivinerConfigSchema = "network.xyo.evm.call.diviner.config";
33
- var EvmCallResultsSchema = "network.xyo.evm.call.results";
34
- var EvmCallDiviner = class _EvmCallDiviner extends AbstractDiviner {
35
- static configSchemas = [...super.configSchemas, EvmCallDivinerConfigSchema];
36
- static defaultConfigSchema = EvmCallDivinerConfigSchema;
37
- static labels = { ...super.labels, ...EvmCallDivinerLabels };
38
- static findCallResult(address, functionName, payloads) {
39
- const foundPayload = payloads.find((payload) => payload.functionName === functionName && payload.address === address);
40
- return asEvmCallSuccess(foundPayload)?.result;
41
- }
42
- static matchingExistingField(objs, field) {
43
- const expectedValue = objs.at(0)?.[field];
44
- const didNotMatch = objs.reduce((prev, obj) => {
45
- return prev || obj[field] !== expectedValue;
46
- }, false);
47
- return didNotMatch ? void 0 : expectedValue;
48
- }
49
- contractInfoRequiredFields(callResults) {
50
- return {
51
- address: assertEx(_EvmCallDiviner.matchingExistingField(callResults, "address"), () => "Mismatched address"),
52
- chainId: assertEx(_EvmCallDiviner.matchingExistingField(callResults, "chainId"), () => "Mismatched chainId"),
53
- schema: EvmCallResultsSchema
54
- };
55
- }
56
- async divineHandler(inPayloads = []) {
57
- const callResults = inPayloads.filter(isPayloadOfSchemaType2(EvmCallResultSchema));
58
- const addresses = Object.keys(
59
- // eslint-disable-next-line unicorn/no-array-reduce
60
- callResults.reduce((prev, result2) => {
61
- if (result2.address) {
62
- prev[result2.address] = true;
63
- }
64
- return prev;
65
- }, {})
66
- );
67
- const result = await Promise.all(
68
- addresses.map(async (address) => {
69
- const foundCallResults = callResults.filter((callResult) => callResult.address === address);
70
- const results = {
71
- results: await this.reduceResults(foundCallResults),
72
- ...this.contractInfoRequiredFields(foundCallResults)
73
- };
74
- return results;
75
- })
76
- );
77
- return result;
78
- }
79
- reduceResults(callResults) {
80
- return callResults.reduce((prev, callResult) => {
81
- const typedCallResult = asEvmCallSuccess(callResult);
82
- if (typedCallResult) {
83
- prev[callResult.functionName] = { args: typedCallResult.args, result: typedCallResult?.result };
84
- }
85
- return prev;
86
- }, {});
87
- }
88
- };
89
- var EvmCallWitnessConfigSchema = "network.xyo.evm.call.witness.config";
90
- var EvmCallWitness = class extends AbstractEvmWitness {
91
- static configSchemas = [...super.configSchemas, EvmCallWitnessConfigSchema];
92
- static defaultConfigSchema = EvmCallWitnessConfigSchema;
93
- get abi() {
94
- return assertEx2(this.config.abi, () => "Missing abi");
95
- }
96
- async observeHandler(inPayloads = []) {
97
- await this.started("throw");
98
- await this.getProviders();
99
- try {
100
- const observations = await Promise.all(
101
- inPayloads.filter(isPayloadOfSchemaType3(EvmCallSchema)).map(async ({
102
- functionName,
103
- args,
104
- address,
105
- block: payloadBlock
106
- }) => {
107
- const validatedAddress = assertEx2(address ?? this.config.address, () => "Missing address");
108
- const validatedFunctionName = assertEx2(functionName ?? this.config.functionName, () => "Missing address");
109
- const mergedArgs = [...args ?? this.config.args ?? []];
110
- const provider = await this.getProvider(true, true);
111
- const block = this.config.block ?? payloadBlock ?? await provider.getBlockNumber();
112
- const erc1967Status = await getErc1967SlotStatus(provider, validatedAddress, block);
113
- const erc1822Status = await getErc1822SlotStatus(provider, validatedAddress, block);
114
- const implementation = isHexZero(erc1967Status.slots.implementation ?? "0x00") ? erc1822Status.implementation : erc1967Status.implementation;
115
- const contract = new Contract(implementation, this.abi, provider);
116
- let transformedResult;
117
- try {
118
- const result = await contract[validatedFunctionName](...mergedArgs);
119
- transformedResult = typeof result === "bigint" ? `0x${result.toString(16)}` : result;
120
- } catch {
121
- }
122
- const observation = {
123
- address: validatedAddress,
124
- args: mergedArgs,
125
- block,
126
- chainId: Number((await provider.getNetwork()).chainId),
127
- functionName: validatedFunctionName,
128
- result: transformedResult,
129
- schema: EvmCallResultSchema
130
- };
131
- if (implementation !== validatedAddress) {
132
- observation.implementation = implementation;
133
- }
134
- return observation;
135
- })
136
- );
137
- return observations;
138
- } catch (ex) {
139
- const error = ex;
140
- console.log(`Error [${this.config.name}]: ${error.message}`);
141
- throw error;
142
- }
143
- }
144
- };
145
-
146
- // src/Diviner.ts
147
- var EvmCallResultToNftTokenUriDiviner = class extends AbstractDiviner2 {
12
+ var EvmCallResultToNftTokenUriDiviner = class extends AbstractDiviner {
148
13
  static configSchemas = [...super.configSchemas, EvmCallResultToNftTokenUriDivinerConfigSchema];
149
14
  static defaultConfigSchema = EvmCallResultToNftTokenUriDivinerConfigSchema;
150
15
  // TODO: Add support for ERC1155 with `uri` function in addition to current ERC721 `tokenURI` support
151
16
  divineHandler(payloads = []) {
152
- const evmCallResults = payloads.filter(isPayloadOfSchemaType4(EvmCallResultsSchema));
17
+ const evmCallResults = payloads.filter(isPayloadOfSchemaType(EvmCallResultsSchema));
153
18
  const erc721CallResults = evmCallResults.filter((p) => {
154
19
  const casted = p;
155
20
  return casted.results?.tokenURI?.result !== void 0 && (p.results?.tokenURI?.args?.length ?? 0) > 0;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Schema.ts","../../src/Config.ts","../../src/Diviner.ts","../../../../../src/Diviner.ts","../../../../../src/Labels.ts","../../../../../src/Payload.ts","../../../../../src/model.ts","../../../../../src/Witness.ts"],"sourcesContent":["/**\n * The schema for the EVM call result to NFT token URI diviner.\n */\nexport const EvmCallResultToNftTokenUriDivinerSchema = 'network.xyo.evm.call.results.metadata.uri.diviner'\n/**\n * The schema for the EVM call result to NFT token URI diviner.\n */\nexport type EvmCallResultToNftTokenUriDivinerSchema = typeof EvmCallResultToNftTokenUriDivinerSchema\n","import type { DivinerConfig } from '@xyo-network/diviner-model'\n\nimport { EvmCallResultToNftTokenUriDivinerSchema } from './Schema.ts'\n\n/**\n * The config schema for the EVM call result to NFT token URI diviner\n */\nexport const EvmCallResultToNftTokenUriDivinerConfigSchema = `${EvmCallResultToNftTokenUriDivinerSchema}.config`\n/**\n * The config schema for the EVM call result to NFT token URI diviner\n */\nexport type EvmCallResultToNftTokenUriDivinerConfigSchema = typeof EvmCallResultToNftTokenUriDivinerConfigSchema\n\n/**\n * The config for the EVM call result to NFT token URI diviner\n */\nexport type EvmCallResultToNftTokenUriDivinerConfig = DivinerConfig<{ schema: EvmCallResultToNftTokenUriDivinerConfigSchema }>\n","import { AbstractDiviner } from '@xyo-network/diviner-abstract'\n// eslint-disable-next-line workspaces/no-absolute-imports\nimport type { EvmCallResults } from '@xyo-network/evm-call-witness'\nimport type { NftMetadataUri } from '@xyo-network/evm-nft-id-payload-plugin'\nimport { NftMetadataUriSchema } from '@xyo-network/evm-nft-id-payload-plugin'\nimport type { Payload, Schema } from '@xyo-network/payload-model'\nimport { isPayloadOfSchemaType } from '@xyo-network/payload-model'\n\nimport { EvmCallResultsSchema } from '../../../..'\nimport { EvmCallResultToNftTokenUriDivinerConfigSchema } from './Config.ts'\nimport type { EvmCallResultToNftTokenUriDivinerParams } from './Params.ts'\nimport type { EvmTokenUriCallResults } from './Payload.ts'\n\nexport class EvmCallResultToNftTokenUriDiviner<\n TParams extends EvmCallResultToNftTokenUriDivinerParams = EvmCallResultToNftTokenUriDivinerParams,\n> extends AbstractDiviner<TParams, Payload, NftMetadataUri> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, EvmCallResultToNftTokenUriDivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = EvmCallResultToNftTokenUriDivinerConfigSchema\n\n // TODO: Add support for ERC1155 with `uri` function in addition to current ERC721 `tokenURI` support\n protected override divineHandler(payloads: Payload[] = []): NftMetadataUri[] {\n const evmCallResults = payloads.filter(isPayloadOfSchemaType<EvmCallResults>(EvmCallResultsSchema))\n const erc721CallResults = evmCallResults\n .filter((p): p is EvmTokenUriCallResults => {\n const casted = p as EvmTokenUriCallResults\n return casted.results?.tokenURI?.result !== undefined && (p.results?.tokenURI?.args?.length ?? 0) > 0\n })\n .map<NftMetadataUri>((p) => {\n const {\n address, chainId, results,\n } = p\n const { args, result } = results.tokenURI\n const tokenId = args[0]\n const num = Number(BigInt(tokenId)).toString()\n const metadataUri = result?.includes('{id}') ? result.replace('{id}', num) : result\n return {\n address, chainId, metadataUri, schema: NftMetadataUriSchema, tokenId,\n }\n })\n return erc721CallResults\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { Promisable } from '@xylabs/promise'\nimport { AbstractDiviner } from '@xyo-network/diviner-abstract'\nimport type { DivinerConfig, DivinerParams } from '@xyo-network/diviner-model'\nimport type { Payload, Schema } from '@xyo-network/payload-model'\nimport { isPayloadOfSchemaType } from '@xyo-network/payload-model'\n\nimport { EvmCallDivinerLabels } from './Labels.ts'\nimport type { EvmCallResult } from './Payload.ts'\nimport { asEvmCallSuccess, EvmCallResultSchema } from './Payload.ts'\n\nexport type FindCallResult<TResult = string, TPayload = Payload> = [TResult, TPayload] | [undefined, TPayload] | [undefined, undefined]\n\nexport const EvmCallDivinerConfigSchema = 'network.xyo.evm.call.diviner.config'\nexport type EvmCallDivinerConfigSchema = typeof EvmCallDivinerConfigSchema\n\nexport type EvmCallDivinerConfig = DivinerConfig<{\n schema: EvmCallDivinerConfigSchema\n}>\nexport type EvmCallDivinerParams = DivinerParams<EvmCallDivinerConfig>\n\nexport const EvmCallResultsSchema = 'network.xyo.evm.call.results'\nexport type EvmCallResultsSchema = typeof EvmCallResultsSchema\n\nexport type EvmCallResults = Payload<\n {\n address: string\n chainId: number\n results?: Record<\n string,\n {\n args?: unknown[]\n result: unknown\n }\n >\n },\n EvmCallResultsSchema\n>\n\nexport class EvmCallDiviner<TParams extends EvmCallDivinerParams = EvmCallDivinerParams> extends AbstractDiviner<TParams> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, EvmCallDivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = EvmCallDivinerConfigSchema\n static override readonly labels: EvmCallDivinerLabels = { ...super.labels, ...EvmCallDivinerLabels }\n\n protected static findCallResult<TResult = string>(address: string, functionName: string, payloads: EvmCallResult[]): TResult | undefined {\n const foundPayload = payloads.find(payload => payload.functionName === functionName && payload.address === address)\n return asEvmCallSuccess(foundPayload)?.result as TResult | undefined\n }\n\n protected static matchingExistingField<R = string, T extends Payload = Payload>(objs: T[], field: keyof T): R | undefined {\n const expectedValue = objs.at(0)?.[field] as R\n // eslint-disable-next-line unicorn/no-array-reduce\n const didNotMatch = objs.reduce((prev, obj) => {\n return prev || obj[field] !== expectedValue\n }, false)\n return didNotMatch ? undefined : expectedValue\n }\n\n protected contractInfoRequiredFields(callResults: EvmCallResult[]): EvmCallResults {\n return {\n address: assertEx(EvmCallDiviner.matchingExistingField(callResults, 'address'), () => 'Mismatched address'),\n chainId: assertEx(EvmCallDiviner.matchingExistingField(callResults, 'chainId'), () => 'Mismatched chainId'),\n schema: EvmCallResultsSchema,\n }\n }\n\n protected override async divineHandler(inPayloads: EvmCallResult[] = []): Promise<EvmCallResults[]> {\n const callResults = inPayloads.filter(isPayloadOfSchemaType<EvmCallResult>(EvmCallResultSchema))\n const addresses = Object.keys(\n // eslint-disable-next-line unicorn/no-array-reduce\n callResults.reduce<Record<string, boolean>>((prev, result) => {\n if (result.address) {\n prev[result.address] = true\n }\n return prev\n }, {}),\n )\n const result = await Promise.all(\n addresses.map(async (address) => {\n const foundCallResults = callResults.filter(callResult => callResult.address === address)\n const results: EvmCallResults = {\n results: await this.reduceResults(foundCallResults),\n ...this.contractInfoRequiredFields(foundCallResults),\n }\n return results\n }),\n )\n\n return result\n }\n\n protected reduceResults(callResults: EvmCallResult[]): Promisable<EvmCallResults['results']> {\n // eslint-disable-next-line unicorn/no-array-reduce\n return callResults.reduce<\n Record<\n string,\n {\n args?: unknown[]\n result: unknown\n }\n >\n >((prev, callResult) => {\n const typedCallResult = asEvmCallSuccess(callResult)\n if (typedCallResult) {\n prev[callResult.functionName] = { args: typedCallResult.args, result: typedCallResult?.result }\n }\n return prev\n }, {})\n }\n}\n","import type { Labels } from '@xyo-network/module-model'\n\n/**\n * Labels for Crypto Contract Diviner components\n */\nexport interface EvmCallDivinerLabels extends Labels {\n 'network.xyo.crypto.contract.info': 'diviner'\n}\n\n/**\n * Labels for Crypto Contract Diviner components\n */\nexport const EvmCallDivinerLabels: EvmCallDivinerLabels = { 'network.xyo.crypto.contract.info': 'diviner' }\n","import type { Payload } from '@xyo-network/payload-model'\nimport { isPayloadOfSchemaType } from '@xyo-network/payload-model'\n\nexport const EvmCallSchema = 'network.xyo.evm.call'\nexport type EvmCallSchema = typeof EvmCallSchema\n\nexport type EvmCall = Payload<\n {\n address?: string\n args?: unknown[]\n block?: number\n functionName?: string\n },\n EvmCallSchema\n>\n\nexport const EvmCallResultSchema = 'network.xyo.evm.call.result'\nexport type EvmCallResultSchema = typeof EvmCallResultSchema\n\nexport type EvmCallResultBase = Payload<\n {\n address: string\n args: unknown[]\n block?: number\n chainId: number\n functionName: string\n implementation?: string\n },\n EvmCallResultSchema\n>\n\nexport type EvmCallSuccess = EvmCallResultBase & {\n result: unknown\n}\n\nexport type EvmCallFailure = EvmCallResultBase & {\n error: string\n}\n\nexport type EvmCallResult = EvmCallSuccess | EvmCallFailure\n\nexport const isEvmCallSuccess = (payload?: EvmCallResult): payload is EvmCallSuccess => {\n return (payload as EvmCallSuccess | undefined)?.result !== undefined\n}\n\nexport const isEvmCallFailure = (payload?: EvmCallResult): payload is EvmCallFailure => {\n return (payload as EvmCallFailure | undefined)?.error !== undefined\n}\n\nexport const isEvmCallResult = isPayloadOfSchemaType<EvmCallResult>(EvmCallResultSchema)\n\nexport const asEvmCallSuccess = (payload?: EvmCallResult) => (isEvmCallSuccess(payload) ? payload : undefined)\n\nexport const asEvmCallFailure = (payload?: EvmCallResult) => (isEvmCallFailure(payload) ? payload : undefined)\n","import type { EvmWitnessConfig, EvmWitnessParams } from '@xyo-network/witness-evm-abstract'\nimport type { JsonFragment } from 'ethers'\n\nexport type Abi = string | ReadonlyArray<JsonFragment | string>\n\nexport const EvmCallWitnessConfigSchema = 'network.xyo.evm.call.witness.config'\nexport type EvmCallWitnessConfigSchema = typeof EvmCallWitnessConfigSchema\n\nexport type EvmCallWitnessConfig = EvmWitnessConfig<\n {\n abi?: Abi\n address?: string\n args?: unknown[]\n block?: number\n functionName?: string\n },\n EvmCallWitnessConfigSchema\n>\n\nexport type EvmCallWitnessParams = EvmWitnessParams<EvmCallWitnessConfig>\n","import { assertEx } from '@xylabs/assert'\nimport { isHexZero } from '@xylabs/hex'\nimport type { JsonObject } from '@xylabs/object'\nimport { getErc1822SlotStatus } from '@xyo-network/erc1822-witness'\nimport { getErc1967SlotStatus } from '@xyo-network/erc1967-witness'\nimport type { Schema } from '@xyo-network/payload-model'\nimport { isPayloadOfSchemaType } from '@xyo-network/payload-model'\nimport { AbstractEvmWitness } from '@xyo-network/witness-evm-abstract'\nimport type { InterfaceAbi } from 'ethers'\nimport { Contract } from 'ethers'\n\nimport type { EvmCallWitnessParams } from './model.ts'\nimport { EvmCallWitnessConfigSchema } from './model.ts'\nimport type {\n EvmCall, EvmCallResult,\n EvmCallSuccess,\n} from './Payload.ts'\nimport { EvmCallResultSchema, EvmCallSchema } from './Payload.ts'\n\nexport class EvmCallWitness<TParams extends EvmCallWitnessParams = EvmCallWitnessParams> extends AbstractEvmWitness<TParams, EvmCall, EvmCallResult> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, EvmCallWitnessConfigSchema]\n static override readonly defaultConfigSchema: Schema = EvmCallWitnessConfigSchema\n\n get abi() {\n return assertEx(this.config.abi, () => 'Missing abi') as InterfaceAbi\n }\n\n protected override async observeHandler(inPayloads: EvmCall[] = []): Promise<EvmCallResult[]> {\n await this.started('throw')\n // calling it here to make sure we rests the cache\n await this.getProviders()\n try {\n const observations = await Promise.all(\n inPayloads.filter(isPayloadOfSchemaType<EvmCall>(EvmCallSchema)).map(async ({\n functionName, args, address, block: payloadBlock,\n }) => {\n const validatedAddress = assertEx(address ?? this.config.address, () => 'Missing address')\n const validatedFunctionName = assertEx(functionName ?? this.config.functionName, () => 'Missing address')\n const mergedArgs = [...(args ?? this.config.args ?? [])] as JsonObject[]\n\n const provider = await this.getProvider(true, true)\n\n const block = this.config.block ?? payloadBlock ?? (await provider.getBlockNumber())\n\n // Check if ERC-1967 Upgradeable\n const erc1967Status = await getErc1967SlotStatus(provider, validatedAddress, block)\n\n // Check if ERC-1822 Upgradeable\n const erc1822Status = await getErc1822SlotStatus(provider, validatedAddress, block)\n\n const implementation = isHexZero(erc1967Status.slots.implementation ?? '0x00') ? erc1822Status.implementation : erc1967Status.implementation\n\n const contract = new Contract(implementation, this.abi, provider)\n let transformedResult: unknown\n try {\n const result = await contract[validatedFunctionName](...mergedArgs)\n transformedResult = typeof result === 'bigint' ? `0x${result.toString(16)}` : result\n } catch {\n // const error = ex as Error & { code: string }\n // this.logger.error(`Error [${this.config.name}]: ${error.code} : ${error.message}`)\n }\n const observation: EvmCallSuccess = {\n address: validatedAddress,\n args: mergedArgs,\n block,\n chainId: Number((await provider.getNetwork()).chainId),\n functionName: validatedFunctionName,\n result: transformedResult,\n schema: EvmCallResultSchema,\n }\n if (implementation !== validatedAddress) {\n observation.implementation = implementation\n }\n // console.log(`observation: ${JSON.stringify(observation, null, 2)}`)\n return observation\n }),\n )\n return observations\n } catch (ex) {\n const error = ex as Error\n console.log(`Error [${this.config.name}]: ${error.message}`)\n throw error\n }\n }\n}\n"],"mappings":"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","names":["AbstractDiviner","isPayloadOfSchemaType","isPayloadOfSchemaType","assertEx","isPayloadOfSchemaType","result","assertEx","AbstractDiviner","isPayloadOfSchemaType"]}
1
+ {"version":3,"sources":["../../src/Schema.ts","../../src/Config.ts","../../src/Diviner.ts"],"sourcesContent":["/**\n * The schema for the EVM call result to NFT token URI diviner.\n */\nexport const EvmCallResultToNftTokenUriDivinerSchema = 'network.xyo.evm.call.results.metadata.uri.diviner'\n/**\n * The schema for the EVM call result to NFT token URI diviner.\n */\nexport type EvmCallResultToNftTokenUriDivinerSchema = typeof EvmCallResultToNftTokenUriDivinerSchema\n","import type { DivinerConfig } from '@xyo-network/diviner-model'\n\nimport { EvmCallResultToNftTokenUriDivinerSchema } from './Schema.ts'\n\n/**\n * The config schema for the EVM call result to NFT token URI diviner\n */\nexport const EvmCallResultToNftTokenUriDivinerConfigSchema = `${EvmCallResultToNftTokenUriDivinerSchema}.config`\n/**\n * The config schema for the EVM call result to NFT token URI diviner\n */\nexport type EvmCallResultToNftTokenUriDivinerConfigSchema = typeof EvmCallResultToNftTokenUriDivinerConfigSchema\n\n/**\n * The config for the EVM call result to NFT token URI diviner\n */\nexport type EvmCallResultToNftTokenUriDivinerConfig = DivinerConfig<{ schema: EvmCallResultToNftTokenUriDivinerConfigSchema }>\n","import { AbstractDiviner } from '@xyo-network/diviner-abstract'\n// eslint-disable-next-line workspaces/no-absolute-imports\nimport { EvmCallResultsSchema, type EvmCallResults } from '@xyo-network/evm-call-witness'\nimport type { NftMetadataUri } from '@xyo-network/evm-nft-id-payload-plugin'\nimport { NftMetadataUriSchema } from '@xyo-network/evm-nft-id-payload-plugin'\nimport type { Payload, Schema } from '@xyo-network/payload-model'\nimport { isPayloadOfSchemaType } from '@xyo-network/payload-model'\n\nimport { EvmCallResultToNftTokenUriDivinerConfigSchema } from './Config.ts'\nimport type { EvmCallResultToNftTokenUriDivinerParams } from './Params.ts'\nimport type { EvmTokenUriCallResults } from './Payload.ts'\n\nexport class EvmCallResultToNftTokenUriDiviner<\n TParams extends EvmCallResultToNftTokenUriDivinerParams = EvmCallResultToNftTokenUriDivinerParams,\n> extends AbstractDiviner<TParams, Payload, NftMetadataUri> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, EvmCallResultToNftTokenUriDivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = EvmCallResultToNftTokenUriDivinerConfigSchema\n\n // TODO: Add support for ERC1155 with `uri` function in addition to current ERC721 `tokenURI` support\n protected override divineHandler(payloads: Payload[] = []): NftMetadataUri[] {\n const evmCallResults = payloads.filter(isPayloadOfSchemaType<EvmCallResults>(EvmCallResultsSchema))\n const erc721CallResults = evmCallResults\n .filter((p): p is EvmTokenUriCallResults => {\n const casted = p as EvmTokenUriCallResults\n return casted.results?.tokenURI?.result !== undefined && (p.results?.tokenURI?.args?.length ?? 0) > 0\n })\n .map<NftMetadataUri>((p) => {\n const {\n address, chainId, results,\n } = p\n const { args, result } = results.tokenURI\n const tokenId = args[0]\n const num = Number(BigInt(tokenId)).toString()\n const metadataUri = result?.includes('{id}') ? result.replace('{id}', num) : result\n return {\n address, chainId, metadataUri, schema: NftMetadataUriSchema, tokenId,\n }\n })\n return erc721CallResults\n }\n}\n"],"mappings":";AAGO,IAAM,0CAA0C;;;ACIhD,IAAM,gDAAgD,GAAG,uCAAuC;;;ACPvG,SAAS,uBAAuB;AAEhC,SAAS,4BAAiD;AAE1D,SAAS,4BAA4B;AAErC,SAAS,6BAA6B;AAM/B,IAAM,oCAAN,cAEG,gBAAkD;AAAA,EAC1D,OAAyB,gBAA0B,CAAC,GAAG,MAAM,eAAe,6CAA6C;AAAA,EACzH,OAAyB,sBAA8B;AAAA;AAAA,EAGpC,cAAc,WAAsB,CAAC,GAAqB;AAC3E,UAAM,iBAAiB,SAAS,OAAO,sBAAsC,oBAAoB,CAAC;AAClG,UAAM,oBAAoB,eACvB,OAAO,CAAC,MAAmC;AAC1C,YAAM,SAAS;AACf,aAAO,OAAO,SAAS,UAAU,WAAW,WAAc,EAAE,SAAS,UAAU,MAAM,UAAU,KAAK;AAAA,IACtG,CAAC,EACA,IAAoB,CAAC,MAAM;AAC1B,YAAM;AAAA,QACJ;AAAA,QAAS;AAAA,QAAS;AAAA,MACpB,IAAI;AACJ,YAAM,EAAE,MAAM,OAAO,IAAI,QAAQ;AACjC,YAAM,UAAU,KAAK,CAAC;AACtB,YAAM,MAAM,OAAO,OAAO,OAAO,CAAC,EAAE,SAAS;AAC7C,YAAM,cAAc,QAAQ,SAAS,MAAM,IAAI,OAAO,QAAQ,QAAQ,GAAG,IAAI;AAC7E,aAAO;AAAA,QACL;AAAA,QAAS;AAAA,QAAS;AAAA,QAAa,QAAQ;AAAA,QAAsB;AAAA,MAC/D;AAAA,IACF,CAAC;AACH,WAAO;AAAA,EACT;AACF;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"Diviner.d.ts","sourceRoot":"","sources":["../../src/Diviner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAG/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAA;AAE5E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AAKjE,OAAO,KAAK,EAAE,uCAAuC,EAAE,MAAM,aAAa,CAAA;AAG1E,qBAAa,iCAAiC,CAC5C,OAAO,SAAS,uCAAuC,GAAG,uCAAuC,CACjG,SAAQ,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,CAAC;IACzD,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAA0E;IAC1H,gBAAyB,mBAAmB,EAAE,MAAM,CAAgD;cAGjF,aAAa,CAAC,QAAQ,GAAE,OAAO,EAAO,GAAG,cAAc,EAAE;CAqB7E"}
1
+ {"version":3,"file":"Diviner.d.ts","sourceRoot":"","sources":["../../src/Diviner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAG/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAA;AAE5E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AAIjE,OAAO,KAAK,EAAE,uCAAuC,EAAE,MAAM,aAAa,CAAA;AAG1E,qBAAa,iCAAiC,CAC5C,OAAO,SAAS,uCAAuC,GAAG,uCAAuC,CACjG,SAAQ,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,CAAC;IACzD,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAA0E;IAC1H,gBAAyB,mBAAmB,EAAE,MAAM,CAAgD;cAGjF,aAAa,CAAC,QAAQ,GAAE,OAAO,EAAO,GAAG,cAAc,EAAE;CAqB7E"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/diviner-evm-call-result-to-token-uri",
3
- "version": "3.4.4",
3
+ "version": "3.4.6",
4
4
  "description": "Typescript/Javascript Plugins for XYO Platform",
5
5
  "homepage": "https://xyo.network",
6
6
  "bugs": {
@@ -29,21 +29,21 @@
29
29
  "module": "dist/neutral/index.mjs",
30
30
  "types": "dist/types/index.d.ts",
31
31
  "dependencies": {
32
- "@xyo-network/diviner-abstract": "^3.9.36",
33
- "@xyo-network/diviner-model": "^3.9.36",
34
- "@xyo-network/evm-call-witness": "^3.4.4",
35
- "@xyo-network/evm-nft-id-payload-plugin": "^3.4.4",
36
- "@xyo-network/module-model": "^3.9.36",
37
- "@xyo-network/payload-model": "^3.9.36",
38
- "ethers": "^6.13.5"
32
+ "@xyo-network/diviner-abstract": "^3.10.6",
33
+ "@xyo-network/diviner-model": "^3.10.6",
34
+ "@xyo-network/evm-call-witness": "^3.4.6",
35
+ "@xyo-network/evm-nft-id-payload-plugin": "^3.4.6",
36
+ "@xyo-network/module-model": "^3.10.6",
37
+ "@xyo-network/payload-model": "^3.10.6",
38
+ "ethers": "^6.13.6"
39
39
  },
40
40
  "devDependencies": {
41
- "@xylabs/ts-scripts-yarn3": "^6.0.5",
42
- "@xylabs/tsconfig": "^6.0.5",
43
- "@xylabs/vitest-extended": "^4.6.0",
44
- "@xyo-network/evm-nft-id-payload-plugin": "^3.4.4",
41
+ "@xylabs/ts-scripts-yarn3": "^6.2.1",
42
+ "@xylabs/tsconfig": "^6.2.1",
43
+ "@xylabs/vitest-extended": "^4.7.15",
44
+ "@xyo-network/evm-nft-id-payload-plugin": "^3.4.6",
45
45
  "typescript": "^5.8.2",
46
- "vitest": "^3.0.8"
46
+ "vitest": "^3.1.1"
47
47
  },
48
48
  "publishConfig": {
49
49
  "access": "public"
package/src/Diviner.ts CHANGED
@@ -1,12 +1,11 @@
1
1
  import { AbstractDiviner } from '@xyo-network/diviner-abstract'
2
2
  // eslint-disable-next-line workspaces/no-absolute-imports
3
- import type { EvmCallResults } from '@xyo-network/evm-call-witness'
3
+ import { EvmCallResultsSchema, type EvmCallResults } from '@xyo-network/evm-call-witness'
4
4
  import type { NftMetadataUri } from '@xyo-network/evm-nft-id-payload-plugin'
5
5
  import { NftMetadataUriSchema } from '@xyo-network/evm-nft-id-payload-plugin'
6
6
  import type { Payload, Schema } from '@xyo-network/payload-model'
7
7
  import { isPayloadOfSchemaType } from '@xyo-network/payload-model'
8
8
 
9
- import { EvmCallResultsSchema } from '../../../..'
10
9
  import { EvmCallResultToNftTokenUriDivinerConfigSchema } from './Config.ts'
11
10
  import type { EvmCallResultToNftTokenUriDivinerParams } from './Params.ts'
12
11
  import type { EvmTokenUriCallResults } from './Payload.ts'