@xyo-network/crypto-contract-function-read-plugin 2.78.0 → 2.78.1
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.
- package/dist/browser/CryptoContractDiviner.d.cts +3 -4
- package/dist/browser/CryptoContractDiviner.d.cts.map +1 -1
- package/dist/browser/CryptoContractDiviner.d.mts +3 -4
- package/dist/browser/CryptoContractDiviner.d.mts.map +1 -1
- package/dist/browser/CryptoContractDiviner.d.ts +3 -4
- package/dist/browser/CryptoContractDiviner.d.ts.map +1 -1
- package/dist/browser/Plugin.d.cts +33 -3
- package/dist/browser/Plugin.d.cts.map +1 -1
- package/dist/browser/Plugin.d.mts +33 -3
- package/dist/browser/Plugin.d.mts.map +1 -1
- package/dist/browser/Plugin.d.ts +33 -3
- package/dist/browser/Plugin.d.ts.map +1 -1
- package/dist/browser/Witness.d.cts +5 -5
- package/dist/browser/Witness.d.cts.map +1 -1
- package/dist/browser/Witness.d.mts +5 -5
- package/dist/browser/Witness.d.mts.map +1 -1
- package/dist/browser/Witness.d.ts +5 -5
- package/dist/browser/Witness.d.ts.map +1 -1
- package/dist/browser/index.cjs +40 -42
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.js +42 -44
- package/dist/browser/index.js.map +1 -1
- package/dist/node/CryptoContractDiviner.d.cts +3 -4
- package/dist/node/CryptoContractDiviner.d.cts.map +1 -1
- package/dist/node/CryptoContractDiviner.d.mts +3 -4
- package/dist/node/CryptoContractDiviner.d.mts.map +1 -1
- package/dist/node/CryptoContractDiviner.d.ts +3 -4
- package/dist/node/CryptoContractDiviner.d.ts.map +1 -1
- package/dist/node/Plugin.d.cts +33 -3
- package/dist/node/Plugin.d.cts.map +1 -1
- package/dist/node/Plugin.d.mts +33 -3
- package/dist/node/Plugin.d.mts.map +1 -1
- package/dist/node/Plugin.d.ts +33 -3
- package/dist/node/Plugin.d.ts.map +1 -1
- package/dist/node/Witness.d.cts +5 -5
- package/dist/node/Witness.d.cts.map +1 -1
- package/dist/node/Witness.d.mts +5 -5
- package/dist/node/Witness.d.mts.map +1 -1
- package/dist/node/Witness.d.ts +5 -5
- package/dist/node/Witness.d.ts.map +1 -1
- package/dist/node/index.js +42 -42
- package/dist/node/index.js.map +1 -1
- package/dist/node/index.mjs +44 -44
- package/dist/node/index.mjs.map +1 -1
- package/package.json +14 -14
- package/src/CryptoContractDiviner.ts +5 -19
- package/src/Erc721Sentinel.json +11 -37
- package/src/Witness.ts +44 -40
- package/src/Erc721SentinelFull.json +0 -212
package/dist/node/index.js
CHANGED
|
@@ -35,50 +35,58 @@ var import_payload_model2 = require("@xyo-network/payload-model");
|
|
|
35
35
|
var import_payloadset_plugin = require("@xyo-network/payloadset-plugin");
|
|
36
36
|
|
|
37
37
|
// src/Witness.ts
|
|
38
|
+
var import_bignumber = require("@ethersproject/bignumber");
|
|
39
|
+
var import_contracts = require("@ethersproject/contracts");
|
|
38
40
|
var import_assert = require("@xylabs/assert");
|
|
39
|
-
var import_promise = require("@xylabs/promise");
|
|
40
41
|
var import_abstract_witness = require("@xyo-network/abstract-witness");
|
|
41
42
|
var import_crypto_contract_function_read_payload_plugin = require("@xyo-network/crypto-contract-function-read-payload-plugin");
|
|
42
43
|
var import_payload_model = require("@xyo-network/payload-model");
|
|
43
|
-
var import_ethers = require("ethers");
|
|
44
44
|
var CryptoContractFunctionReadWitness = class extends import_abstract_witness.AbstractWitness {
|
|
45
45
|
static configSchemas = [import_crypto_contract_function_read_payload_plugin.CryptoContractFunctionReadWitnessConfigSchema];
|
|
46
46
|
async observeHandler(inPayloads = []) {
|
|
47
47
|
await this.started("throw");
|
|
48
48
|
try {
|
|
49
|
-
const observations = await Promise.
|
|
50
|
-
inPayloads.filter((0, import_payload_model.isPayloadOfSchemaType)(import_crypto_contract_function_read_payload_plugin.CryptoContractFunctionCallSchema)).map(async (
|
|
51
|
-
const
|
|
52
|
-
const
|
|
53
|
-
const validatedAddress = (0, import_assert.assertEx)(address, "Missing address");
|
|
54
|
-
const validatedFunctionName = (0, import_assert.assertEx)(functionName, "Missing
|
|
55
|
-
const
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
49
|
+
const observations = await Promise.all(
|
|
50
|
+
inPayloads.filter((0, import_payload_model.isPayloadOfSchemaType)(import_crypto_contract_function_read_payload_plugin.CryptoContractFunctionCallSchema)).map(async ({ functionName, args, address }) => {
|
|
51
|
+
const { providers } = this.params;
|
|
52
|
+
const provider = providers[Date.now() % providers.length];
|
|
53
|
+
const validatedAddress = (0, import_assert.assertEx)(address ?? this.config.address, "Missing address");
|
|
54
|
+
const validatedFunctionName = (0, import_assert.assertEx)(functionName ?? this.config.functionName, "Missing address");
|
|
55
|
+
const mergedArgs = [...args ?? this.config.args ?? []];
|
|
56
|
+
const contract = new import_contracts.Contract(validatedAddress, this.config.contract, provider);
|
|
57
|
+
try {
|
|
58
|
+
const result = await contract.callStatic[validatedFunctionName](...mergedArgs);
|
|
59
|
+
const transformedResult = import_bignumber.BigNumber.isBigNumber(result) ? result.toHexString() : result;
|
|
60
|
+
const observation = {
|
|
61
|
+
address: validatedAddress,
|
|
62
|
+
args: mergedArgs,
|
|
63
|
+
chainId: provider.network.chainId,
|
|
64
|
+
functionName: validatedFunctionName,
|
|
65
|
+
result: transformedResult,
|
|
66
|
+
schema: import_crypto_contract_function_read_payload_plugin.CryptoContractFunctionCallResultSchema
|
|
67
|
+
};
|
|
68
|
+
return observation;
|
|
69
|
+
} catch (ex) {
|
|
70
|
+
const error = ex;
|
|
71
|
+
console.log(`Error [${this.config.name}]: ${error.code}`);
|
|
72
|
+
const observation = {
|
|
73
|
+
address: validatedAddress,
|
|
74
|
+
args: mergedArgs,
|
|
75
|
+
chainId: provider.network.chainId,
|
|
76
|
+
error: error.code,
|
|
77
|
+
functionName: validatedFunctionName,
|
|
78
|
+
schema: import_crypto_contract_function_read_payload_plugin.CryptoContractFunctionCallResultSchema
|
|
79
|
+
};
|
|
80
|
+
return observation;
|
|
81
|
+
}
|
|
74
82
|
})
|
|
75
83
|
);
|
|
76
|
-
return observations
|
|
84
|
+
return observations;
|
|
77
85
|
} catch (ex) {
|
|
78
86
|
const error = ex;
|
|
79
87
|
console.log(`Error [${this.config.name}]: ${error.message}`);
|
|
88
|
+
throw error;
|
|
80
89
|
}
|
|
81
|
-
return [];
|
|
82
90
|
}
|
|
83
91
|
};
|
|
84
92
|
|
|
@@ -97,24 +105,15 @@ var CryptoContractFunctionReadWitnessPlugin = () => (0, import_payloadset_plugin
|
|
|
97
105
|
var import_assert2 = require("@xylabs/assert");
|
|
98
106
|
var import_abstract_diviner = require("@xyo-network/abstract-diviner");
|
|
99
107
|
var import_crypto_contract_function_read_payload_plugin2 = require("@xyo-network/crypto-contract-function-read-payload-plugin");
|
|
100
|
-
var import_hash = require("@xyo-network/hash");
|
|
101
108
|
var import_payload_model3 = require("@xyo-network/payload-model");
|
|
102
109
|
var CryptoContractDivinerConfigSchema = "network.xyo.crypto.contract.diviner.config";
|
|
103
110
|
var ContractInfoSchema = "network.xyo.crypto.contract.info";
|
|
104
111
|
var CryptoContractDiviner = class _CryptoContractDiviner extends import_abstract_diviner.AbstractDiviner {
|
|
105
112
|
static configSchemas = [CryptoContractDivinerConfigSchema];
|
|
106
|
-
static findCallResult(address, functionName,
|
|
113
|
+
static findCallResult(address, functionName, payloads) {
|
|
114
|
+
var _a;
|
|
107
115
|
const foundPayload = payloads.find((payload) => payload.functionName === functionName && payload.address === address);
|
|
108
|
-
return foundPayload == null ? void 0 :
|
|
109
|
-
}
|
|
110
|
-
static async generateCallHash(address, functionName, params) {
|
|
111
|
-
const callPayload = {
|
|
112
|
-
address,
|
|
113
|
-
functionName,
|
|
114
|
-
params,
|
|
115
|
-
schema: import_crypto_contract_function_read_payload_plugin2.CryptoContractFunctionCallSchema
|
|
116
|
-
};
|
|
117
|
-
return await import_hash.PayloadHasher.hashAsync(callPayload);
|
|
116
|
+
return (_a = (0, import_crypto_contract_function_read_payload_plugin2.asCryptoContractFunctionCallSuccess)(foundPayload)) == null ? void 0 : _a.result;
|
|
118
117
|
}
|
|
119
118
|
static matchingExistingField(objs, field) {
|
|
120
119
|
var _a;
|
|
@@ -155,7 +154,8 @@ var CryptoContractDiviner = class _CryptoContractDiviner extends import_abstract
|
|
|
155
154
|
}
|
|
156
155
|
reduceResults(callResults) {
|
|
157
156
|
return callResults.reduce((prev, callResult) => {
|
|
158
|
-
|
|
157
|
+
var _a;
|
|
158
|
+
prev[callResult.functionName] = (_a = (0, import_crypto_contract_function_read_payload_plugin2.asCryptoContractFunctionCallSuccess)(callResult)) == null ? void 0 : _a.result;
|
|
159
159
|
return prev;
|
|
160
160
|
}, {});
|
|
161
161
|
}
|
package/dist/node/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts","../../src/Plugin.ts","../../src/Witness.ts","../../src/CryptoContractDiviner.ts"],"sourcesContent":["import { CryptoContractFunctionReadWitnessPlugin } from './Plugin'\n\nexport * from './CryptoContractDiviner'\nexport * from './Witness'\n\nexport { CryptoContractFunctionReadWitnessPlugin }\n\n// eslint-disable-next-line import/no-default-export\nexport default CryptoContractFunctionReadWitnessPlugin\n","import { NftSchema } from '@xyo-network/crypto-nft-payload-plugin'\nimport { PayloadSetSchema } from '@xyo-network/payload-model'\nimport { createPayloadSetWitnessPlugin } from '@xyo-network/payloadset-plugin'\n\nimport { CryptoContractFunctionReadWitness } from './Witness'\n\nexport const CryptoContractFunctionReadWitnessPlugin = () =>\n createPayloadSetWitnessPlugin<CryptoContractFunctionReadWitness>(\n { required: { [NftSchema]: 1 }, schema: PayloadSetSchema },\n {\n witness: async (params) => {\n const result = await CryptoContractFunctionReadWitness.create(params)\n return result\n },\n },\n )\n","import { assertEx } from '@xylabs/assert'\nimport { fulfilled } from '@xylabs/promise'\nimport { AbstractWitness } from '@xyo-network/abstract-witness'\nimport {\n CryptoContractFunctionCall,\n CryptoContractFunctionCallResult,\n CryptoContractFunctionCallResultSchema,\n CryptoContractFunctionCallSchema,\n CryptoContractFunctionReadWitnessConfig,\n CryptoContractFunctionReadWitnessConfigSchema,\n} from '@xyo-network/crypto-contract-function-read-payload-plugin'\nimport { AnyConfigSchema } from '@xyo-network/module-model'\nimport { isPayloadOfSchemaType } from '@xyo-network/payload-model'\nimport { WitnessParams } from '@xyo-network/witness-model'\nimport { BigNumber, Contract } from 'ethers'\n\nexport type CryptoContractFunctionReadWitnessParams<TContract extends Contract> = WitnessParams<\n AnyConfigSchema<CryptoContractFunctionReadWitnessConfig>,\n {\n factory: (address: string) => TContract\n }\n>\n\nexport class CryptoContractFunctionReadWitness<\n TContract extends Contract = Contract,\n TParams extends CryptoContractFunctionReadWitnessParams<TContract> = CryptoContractFunctionReadWitnessParams<TContract>,\n> extends AbstractWitness<TParams, CryptoContractFunctionCall<keyof TContract['callStatic']>, CryptoContractFunctionCallResult> {\n static override configSchemas = [CryptoContractFunctionReadWitnessConfigSchema]\n\n protected override async observeHandler(\n inPayloads: CryptoContractFunctionCall<keyof TContract['callStatic']>[] = [],\n ): Promise<CryptoContractFunctionCallResult[]> {\n await this.started('throw')\n try {\n const observations = await Promise.allSettled(\n inPayloads.filter(isPayloadOfSchemaType(CryptoContractFunctionCallSchema)).map(async (callPayload) => {\n const fullCallPayload = { ...{ params: [] }, ...this.config.call, ...callPayload }\n const { address, functionName, params } = fullCallPayload\n const validatedAddress = assertEx(address, 'Missing address')\n const validatedFunctionName = assertEx(functionName, 'Missing functionName')\n const contract = this.params.factory(validatedAddress)\n const func = assertEx(contract.callStatic[validatedFunctionName], `functionName [${validatedFunctionName}] not found`)\n const rawResult = await (async () => {\n if (params.length > 0) {\n return await func(...(params ?? []))\n /*const x = ERC721Enumerable__factory.connect(validatedAddress, contract.provider)\n return await x.tokenByIndex(0)*/\n } else {\n return await func(...(params ?? []))\n }\n })()\n const result: CryptoContractFunctionCallResult['result'] = BigNumber.isBigNumber(rawResult)\n ? { type: 'BigNumber', value: rawResult.toHexString() }\n : { value: rawResult }\n const observation: CryptoContractFunctionCallResult = {\n address: validatedAddress,\n chainId: (await contract.provider.getNetwork()).chainId,\n functionName: validatedFunctionName,\n params,\n result,\n schema: CryptoContractFunctionCallResultSchema,\n }\n return observation\n }),\n )\n return observations.filter(fulfilled).map((p) => p.value)\n } catch (ex) {\n const error = ex as Error\n console.log(`Error [${this.config.name}]: ${error.message}`)\n }\n\n return []\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Promisable } from '@xylabs/promise'\nimport { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport {\n ContractFunctionResult,\n CryptoContractFunctionCall,\n CryptoContractFunctionCallResult,\n CryptoContractFunctionCallResultSchema,\n CryptoContractFunctionCallSchema,\n} from '@xyo-network/crypto-contract-function-read-payload-plugin'\nimport { DivinerConfig, DivinerParams } from '@xyo-network/diviner-model'\nimport { PayloadHasher } from '@xyo-network/hash'\nimport { isPayloadOfSchemaType, Payload } from '@xyo-network/payload-model'\n\nexport type FindCallResult<TResult = string, TPayload = Payload> = [TResult, TPayload] | [undefined, TPayload] | [undefined, undefined]\n\nexport const CryptoContractDivinerConfigSchema = 'network.xyo.crypto.contract.diviner.config'\nexport type CryptoContractDivinerConfigSchema = typeof CryptoContractDivinerConfigSchema\n\nexport type CryptoContractDivinerConfig = DivinerConfig<{\n schema: CryptoContractDivinerConfigSchema\n}>\nexport type CryptoContractDivinerParams = DivinerParams<CryptoContractDivinerConfig>\n\nexport const ContractInfoSchema = 'network.xyo.crypto.contract.info'\nexport type ContractInfoSchema = typeof ContractInfoSchema\n\nexport type ContractInfo = Payload<\n {\n address: string\n chainId: string\n results?: Record<string, ContractFunctionResult>\n },\n ContractInfoSchema\n>\n\nexport class CryptoContractDiviner<TParams extends CryptoContractDivinerParams = CryptoContractDivinerParams> extends AbstractDiviner<TParams> {\n static override configSchemas = [CryptoContractDivinerConfigSchema]\n\n protected static findCallResult<TResult = string>(\n address: string,\n functionName: string,\n params: unknown[],\n payloads: CryptoContractFunctionCallResult[],\n ): TResult | undefined {\n const foundPayload = payloads.find((payload) => payload.functionName === functionName && payload.address === address)\n return foundPayload?.result.value as TResult | undefined\n }\n\n protected static async generateCallHash(address: string, functionName: string, params: unknown[]) {\n const callPayload: CryptoContractFunctionCall = {\n address,\n functionName,\n params,\n schema: CryptoContractFunctionCallSchema,\n }\n return await PayloadHasher.hashAsync(callPayload)\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 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: CryptoContractFunctionCallResult[]): ContractInfo {\n return {\n address: assertEx(CryptoContractDiviner.matchingExistingField(callResults, 'address'), 'Mismatched address'),\n chainId: assertEx(CryptoContractDiviner.matchingExistingField(callResults, 'chainId'), 'Mismatched chainId'),\n schema: ContractInfoSchema,\n }\n }\n\n protected override async divineHandler(inPayloads: CryptoContractFunctionCallResult[] = []): Promise<ContractInfo[]> {\n const callResults = inPayloads.filter(isPayloadOfSchemaType<CryptoContractFunctionCallResult>(CryptoContractFunctionCallResultSchema))\n const addresses = Object.keys(\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 info: ContractInfo = {\n ...{ results: await this.reduceResults(foundCallResults) },\n ...this.contractInfoRequiredFields(foundCallResults),\n }\n return info\n }),\n )\n\n return result\n }\n\n protected reduceResults(callResults: CryptoContractFunctionCallResult[]): Promisable<ContractInfo['results']> {\n return callResults.reduce<Record<string, ContractFunctionResult>>((prev, callResult) => {\n prev[callResult.functionName] = callResult.result\n return prev\n }, {})\n }\n}\n"],"mappings":"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","names":["import_payload_model","import_assert","import_crypto_contract_function_read_payload_plugin","import_payload_model","result"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../src/Plugin.ts","../../src/Witness.ts","../../src/CryptoContractDiviner.ts"],"sourcesContent":["import { CryptoContractFunctionReadWitnessPlugin } from './Plugin'\n\nexport * from './CryptoContractDiviner'\nexport * from './Witness'\n\nexport { CryptoContractFunctionReadWitnessPlugin }\n\n// eslint-disable-next-line import/no-default-export\nexport default CryptoContractFunctionReadWitnessPlugin\n","import { NftSchema } from '@xyo-network/crypto-nft-payload-plugin'\nimport { PayloadSetSchema } from '@xyo-network/payload-model'\nimport { createPayloadSetWitnessPlugin } from '@xyo-network/payloadset-plugin'\n\nimport { CryptoContractFunctionReadWitness } from './Witness'\n\nexport const CryptoContractFunctionReadWitnessPlugin = () =>\n createPayloadSetWitnessPlugin<CryptoContractFunctionReadWitness>(\n { required: { [NftSchema]: 1 }, schema: PayloadSetSchema },\n {\n witness: async (params) => {\n const result = await CryptoContractFunctionReadWitness.create(params)\n return result\n },\n },\n )\n","import { BigNumber } from '@ethersproject/bignumber'\nimport { Contract } from '@ethersproject/contracts'\nimport { JsonRpcProvider } from '@ethersproject/providers'\nimport { assertEx } from '@xylabs/assert'\nimport { AbstractWitness } from '@xyo-network/abstract-witness'\nimport {\n CryptoContractFunctionCall,\n CryptoContractFunctionCallFailure,\n CryptoContractFunctionCallResult,\n CryptoContractFunctionCallResultSchema,\n CryptoContractFunctionCallSchema,\n CryptoContractFunctionCallSuccess,\n CryptoContractFunctionReadWitnessConfig,\n CryptoContractFunctionReadWitnessConfigSchema,\n} from '@xyo-network/crypto-contract-function-read-payload-plugin'\nimport { AnyConfigSchema } from '@xyo-network/module-model'\nimport { isPayloadOfSchemaType } from '@xyo-network/payload-model'\nimport { WitnessParams } from '@xyo-network/witness-model'\n\nexport type CryptoContractFunctionReadWitnessParams = WitnessParams<\n AnyConfigSchema<CryptoContractFunctionReadWitnessConfig>,\n {\n providers: JsonRpcProvider[]\n }\n>\n\nexport class CryptoContractFunctionReadWitness<\n TParams extends CryptoContractFunctionReadWitnessParams = CryptoContractFunctionReadWitnessParams,\n> extends AbstractWitness<TParams, CryptoContractFunctionCall, CryptoContractFunctionCallResult> {\n static override configSchemas = [CryptoContractFunctionReadWitnessConfigSchema]\n\n protected override async observeHandler(inPayloads: CryptoContractFunctionCall[] = []): Promise<CryptoContractFunctionCallResult[]> {\n await this.started('throw')\n try {\n const observations = await Promise.all(\n inPayloads.filter(isPayloadOfSchemaType(CryptoContractFunctionCallSchema)).map(async ({ functionName, args, address }) => {\n const { providers } = this.params\n const provider = providers[Date.now() % providers.length] //pick a random provider\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 ?? [])]\n\n const contract = new Contract(validatedAddress, this.config.contract, provider)\n try {\n const result = await contract.callStatic[validatedFunctionName](...mergedArgs)\n const transformedResult = BigNumber.isBigNumber(result) ? result.toHexString() : result\n const observation: CryptoContractFunctionCallSuccess = {\n address: validatedAddress,\n args: mergedArgs,\n chainId: provider.network.chainId,\n functionName: validatedFunctionName,\n result: transformedResult,\n schema: CryptoContractFunctionCallResultSchema,\n }\n return observation\n } catch (ex) {\n const error = ex as Error & { code: string }\n console.log(`Error [${this.config.name}]: ${error.code}`)\n const observation: CryptoContractFunctionCallFailure = {\n address: validatedAddress,\n args: mergedArgs,\n chainId: provider.network.chainId,\n error: error.code,\n functionName: validatedFunctionName,\n schema: CryptoContractFunctionCallResultSchema,\n }\n return observation\n }\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","import { assertEx } from '@xylabs/assert'\nimport { Promisable } from '@xylabs/promise'\nimport { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport {\n asCryptoContractFunctionCallSuccess,\n CryptoContractFunctionCallResult,\n CryptoContractFunctionCallResultSchema,\n} from '@xyo-network/crypto-contract-function-read-payload-plugin'\nimport { DivinerConfig, DivinerParams } from '@xyo-network/diviner-model'\nimport { isPayloadOfSchemaType, Payload } from '@xyo-network/payload-model'\n\nexport type FindCallResult<TResult = string, TPayload = Payload> = [TResult, TPayload] | [undefined, TPayload] | [undefined, undefined]\n\nexport const CryptoContractDivinerConfigSchema = 'network.xyo.crypto.contract.diviner.config'\nexport type CryptoContractDivinerConfigSchema = typeof CryptoContractDivinerConfigSchema\n\nexport type CryptoContractDivinerConfig = DivinerConfig<{\n schema: CryptoContractDivinerConfigSchema\n}>\nexport type CryptoContractDivinerParams = DivinerParams<CryptoContractDivinerConfig>\n\nexport const ContractInfoSchema = 'network.xyo.crypto.contract.info'\nexport type ContractInfoSchema = typeof ContractInfoSchema\n\nexport type ContractInfo = Payload<\n {\n address: string\n chainId: string\n results?: Record<string, unknown>\n },\n ContractInfoSchema\n>\n\nexport class CryptoContractDiviner<TParams extends CryptoContractDivinerParams = CryptoContractDivinerParams> extends AbstractDiviner<TParams> {\n static override configSchemas = [CryptoContractDivinerConfigSchema]\n\n protected static findCallResult<TResult = string>(\n address: string,\n functionName: string,\n payloads: CryptoContractFunctionCallResult[],\n ): TResult | undefined {\n const foundPayload = payloads.find((payload) => payload.functionName === functionName && payload.address === address)\n return asCryptoContractFunctionCallSuccess(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 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: CryptoContractFunctionCallResult[]): ContractInfo {\n return {\n address: assertEx(CryptoContractDiviner.matchingExistingField(callResults, 'address'), 'Mismatched address'),\n chainId: assertEx(CryptoContractDiviner.matchingExistingField(callResults, 'chainId'), 'Mismatched chainId'),\n schema: ContractInfoSchema,\n }\n }\n\n protected override async divineHandler(inPayloads: CryptoContractFunctionCallResult[] = []): Promise<ContractInfo[]> {\n const callResults = inPayloads.filter(isPayloadOfSchemaType<CryptoContractFunctionCallResult>(CryptoContractFunctionCallResultSchema))\n const addresses = Object.keys(\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 info: ContractInfo = {\n ...{ results: await this.reduceResults(foundCallResults) },\n ...this.contractInfoRequiredFields(foundCallResults),\n }\n return info\n }),\n )\n\n return result\n }\n\n protected reduceResults(callResults: CryptoContractFunctionCallResult[]): Promisable<ContractInfo['results']> {\n return callResults.reduce<Record<string, unknown>>((prev, callResult) => {\n prev[callResult.functionName] = asCryptoContractFunctionCallSuccess(callResult)?.result\n return prev\n }, {})\n }\n}\n"],"mappings":"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","names":["import_payload_model","import_assert","import_crypto_contract_function_read_payload_plugin","import_payload_model","result"]}
|
package/dist/node/index.mjs
CHANGED
|
@@ -4,8 +4,9 @@ import { PayloadSetSchema } from "@xyo-network/payload-model";
|
|
|
4
4
|
import { createPayloadSetWitnessPlugin } from "@xyo-network/payloadset-plugin";
|
|
5
5
|
|
|
6
6
|
// src/Witness.ts
|
|
7
|
+
import { BigNumber } from "@ethersproject/bignumber";
|
|
8
|
+
import { Contract } from "@ethersproject/contracts";
|
|
7
9
|
import { assertEx } from "@xylabs/assert";
|
|
8
|
-
import { fulfilled } from "@xylabs/promise";
|
|
9
10
|
import { AbstractWitness } from "@xyo-network/abstract-witness";
|
|
10
11
|
import {
|
|
11
12
|
CryptoContractFunctionCallResultSchema,
|
|
@@ -13,45 +14,52 @@ import {
|
|
|
13
14
|
CryptoContractFunctionReadWitnessConfigSchema
|
|
14
15
|
} from "@xyo-network/crypto-contract-function-read-payload-plugin";
|
|
15
16
|
import { isPayloadOfSchemaType } from "@xyo-network/payload-model";
|
|
16
|
-
import { BigNumber } from "ethers";
|
|
17
17
|
var CryptoContractFunctionReadWitness = class extends AbstractWitness {
|
|
18
18
|
static configSchemas = [CryptoContractFunctionReadWitnessConfigSchema];
|
|
19
19
|
async observeHandler(inPayloads = []) {
|
|
20
20
|
await this.started("throw");
|
|
21
21
|
try {
|
|
22
|
-
const observations = await Promise.
|
|
23
|
-
inPayloads.filter(isPayloadOfSchemaType(CryptoContractFunctionCallSchema)).map(async (
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
const validatedAddress = assertEx(address, "Missing address");
|
|
27
|
-
const validatedFunctionName = assertEx(functionName, "Missing
|
|
28
|
-
const
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
22
|
+
const observations = await Promise.all(
|
|
23
|
+
inPayloads.filter(isPayloadOfSchemaType(CryptoContractFunctionCallSchema)).map(async ({ functionName, args, address }) => {
|
|
24
|
+
const { providers } = this.params;
|
|
25
|
+
const provider = providers[Date.now() % providers.length];
|
|
26
|
+
const validatedAddress = assertEx(address ?? this.config.address, "Missing address");
|
|
27
|
+
const validatedFunctionName = assertEx(functionName ?? this.config.functionName, "Missing address");
|
|
28
|
+
const mergedArgs = [...args ?? this.config.args ?? []];
|
|
29
|
+
const contract = new Contract(validatedAddress, this.config.contract, provider);
|
|
30
|
+
try {
|
|
31
|
+
const result = await contract.callStatic[validatedFunctionName](...mergedArgs);
|
|
32
|
+
const transformedResult = BigNumber.isBigNumber(result) ? result.toHexString() : result;
|
|
33
|
+
const observation = {
|
|
34
|
+
address: validatedAddress,
|
|
35
|
+
args: mergedArgs,
|
|
36
|
+
chainId: provider.network.chainId,
|
|
37
|
+
functionName: validatedFunctionName,
|
|
38
|
+
result: transformedResult,
|
|
39
|
+
schema: CryptoContractFunctionCallResultSchema
|
|
40
|
+
};
|
|
41
|
+
return observation;
|
|
42
|
+
} catch (ex) {
|
|
43
|
+
const error = ex;
|
|
44
|
+
console.log(`Error [${this.config.name}]: ${error.code}`);
|
|
45
|
+
const observation = {
|
|
46
|
+
address: validatedAddress,
|
|
47
|
+
args: mergedArgs,
|
|
48
|
+
chainId: provider.network.chainId,
|
|
49
|
+
error: error.code,
|
|
50
|
+
functionName: validatedFunctionName,
|
|
51
|
+
schema: CryptoContractFunctionCallResultSchema
|
|
52
|
+
};
|
|
53
|
+
return observation;
|
|
54
|
+
}
|
|
47
55
|
})
|
|
48
56
|
);
|
|
49
|
-
return observations
|
|
57
|
+
return observations;
|
|
50
58
|
} catch (ex) {
|
|
51
59
|
const error = ex;
|
|
52
60
|
console.log(`Error [${this.config.name}]: ${error.message}`);
|
|
61
|
+
throw error;
|
|
53
62
|
}
|
|
54
|
-
return [];
|
|
55
63
|
}
|
|
56
64
|
};
|
|
57
65
|
|
|
@@ -70,27 +78,18 @@ var CryptoContractFunctionReadWitnessPlugin = () => createPayloadSetWitnessPlugi
|
|
|
70
78
|
import { assertEx as assertEx2 } from "@xylabs/assert";
|
|
71
79
|
import { AbstractDiviner } from "@xyo-network/abstract-diviner";
|
|
72
80
|
import {
|
|
73
|
-
|
|
74
|
-
|
|
81
|
+
asCryptoContractFunctionCallSuccess,
|
|
82
|
+
CryptoContractFunctionCallResultSchema as CryptoContractFunctionCallResultSchema2
|
|
75
83
|
} from "@xyo-network/crypto-contract-function-read-payload-plugin";
|
|
76
|
-
import { PayloadHasher } from "@xyo-network/hash";
|
|
77
84
|
import { isPayloadOfSchemaType as isPayloadOfSchemaType2 } from "@xyo-network/payload-model";
|
|
78
85
|
var CryptoContractDivinerConfigSchema = "network.xyo.crypto.contract.diviner.config";
|
|
79
86
|
var ContractInfoSchema = "network.xyo.crypto.contract.info";
|
|
80
87
|
var CryptoContractDiviner = class _CryptoContractDiviner extends AbstractDiviner {
|
|
81
88
|
static configSchemas = [CryptoContractDivinerConfigSchema];
|
|
82
|
-
static findCallResult(address, functionName,
|
|
89
|
+
static findCallResult(address, functionName, payloads) {
|
|
90
|
+
var _a;
|
|
83
91
|
const foundPayload = payloads.find((payload) => payload.functionName === functionName && payload.address === address);
|
|
84
|
-
return foundPayload == null ? void 0 :
|
|
85
|
-
}
|
|
86
|
-
static async generateCallHash(address, functionName, params) {
|
|
87
|
-
const callPayload = {
|
|
88
|
-
address,
|
|
89
|
-
functionName,
|
|
90
|
-
params,
|
|
91
|
-
schema: CryptoContractFunctionCallSchema2
|
|
92
|
-
};
|
|
93
|
-
return await PayloadHasher.hashAsync(callPayload);
|
|
92
|
+
return (_a = asCryptoContractFunctionCallSuccess(foundPayload)) == null ? void 0 : _a.result;
|
|
94
93
|
}
|
|
95
94
|
static matchingExistingField(objs, field) {
|
|
96
95
|
var _a;
|
|
@@ -131,7 +130,8 @@ var CryptoContractDiviner = class _CryptoContractDiviner extends AbstractDiviner
|
|
|
131
130
|
}
|
|
132
131
|
reduceResults(callResults) {
|
|
133
132
|
return callResults.reduce((prev, callResult) => {
|
|
134
|
-
|
|
133
|
+
var _a;
|
|
134
|
+
prev[callResult.functionName] = (_a = asCryptoContractFunctionCallSuccess(callResult)) == null ? void 0 : _a.result;
|
|
135
135
|
return prev;
|
|
136
136
|
}, {});
|
|
137
137
|
}
|
package/dist/node/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/Plugin.ts","../../src/Witness.ts","../../src/CryptoContractDiviner.ts","../../src/index.ts"],"sourcesContent":["import { NftSchema } from '@xyo-network/crypto-nft-payload-plugin'\nimport { PayloadSetSchema } from '@xyo-network/payload-model'\nimport { createPayloadSetWitnessPlugin } from '@xyo-network/payloadset-plugin'\n\nimport { CryptoContractFunctionReadWitness } from './Witness'\n\nexport const CryptoContractFunctionReadWitnessPlugin = () =>\n createPayloadSetWitnessPlugin<CryptoContractFunctionReadWitness>(\n { required: { [NftSchema]: 1 }, schema: PayloadSetSchema },\n {\n witness: async (params) => {\n const result = await CryptoContractFunctionReadWitness.create(params)\n return result\n },\n },\n )\n","import { assertEx } from '@xylabs/assert'\nimport { fulfilled } from '@xylabs/promise'\nimport { AbstractWitness } from '@xyo-network/abstract-witness'\nimport {\n CryptoContractFunctionCall,\n CryptoContractFunctionCallResult,\n CryptoContractFunctionCallResultSchema,\n CryptoContractFunctionCallSchema,\n CryptoContractFunctionReadWitnessConfig,\n CryptoContractFunctionReadWitnessConfigSchema,\n} from '@xyo-network/crypto-contract-function-read-payload-plugin'\nimport { AnyConfigSchema } from '@xyo-network/module-model'\nimport { isPayloadOfSchemaType } from '@xyo-network/payload-model'\nimport { WitnessParams } from '@xyo-network/witness-model'\nimport { BigNumber, Contract } from 'ethers'\n\nexport type CryptoContractFunctionReadWitnessParams<TContract extends Contract> = WitnessParams<\n AnyConfigSchema<CryptoContractFunctionReadWitnessConfig>,\n {\n factory: (address: string) => TContract\n }\n>\n\nexport class CryptoContractFunctionReadWitness<\n TContract extends Contract = Contract,\n TParams extends CryptoContractFunctionReadWitnessParams<TContract> = CryptoContractFunctionReadWitnessParams<TContract>,\n> extends AbstractWitness<TParams, CryptoContractFunctionCall<keyof TContract['callStatic']>, CryptoContractFunctionCallResult> {\n static override configSchemas = [CryptoContractFunctionReadWitnessConfigSchema]\n\n protected override async observeHandler(\n inPayloads: CryptoContractFunctionCall<keyof TContract['callStatic']>[] = [],\n ): Promise<CryptoContractFunctionCallResult[]> {\n await this.started('throw')\n try {\n const observations = await Promise.allSettled(\n inPayloads.filter(isPayloadOfSchemaType(CryptoContractFunctionCallSchema)).map(async (callPayload) => {\n const fullCallPayload = { ...{ params: [] }, ...this.config.call, ...callPayload }\n const { address, functionName, params } = fullCallPayload\n const validatedAddress = assertEx(address, 'Missing address')\n const validatedFunctionName = assertEx(functionName, 'Missing functionName')\n const contract = this.params.factory(validatedAddress)\n const func = assertEx(contract.callStatic[validatedFunctionName], `functionName [${validatedFunctionName}] not found`)\n const rawResult = await (async () => {\n if (params.length > 0) {\n return await func(...(params ?? []))\n /*const x = ERC721Enumerable__factory.connect(validatedAddress, contract.provider)\n return await x.tokenByIndex(0)*/\n } else {\n return await func(...(params ?? []))\n }\n })()\n const result: CryptoContractFunctionCallResult['result'] = BigNumber.isBigNumber(rawResult)\n ? { type: 'BigNumber', value: rawResult.toHexString() }\n : { value: rawResult }\n const observation: CryptoContractFunctionCallResult = {\n address: validatedAddress,\n chainId: (await contract.provider.getNetwork()).chainId,\n functionName: validatedFunctionName,\n params,\n result,\n schema: CryptoContractFunctionCallResultSchema,\n }\n return observation\n }),\n )\n return observations.filter(fulfilled).map((p) => p.value)\n } catch (ex) {\n const error = ex as Error\n console.log(`Error [${this.config.name}]: ${error.message}`)\n }\n\n return []\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Promisable } from '@xylabs/promise'\nimport { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport {\n ContractFunctionResult,\n CryptoContractFunctionCall,\n CryptoContractFunctionCallResult,\n CryptoContractFunctionCallResultSchema,\n CryptoContractFunctionCallSchema,\n} from '@xyo-network/crypto-contract-function-read-payload-plugin'\nimport { DivinerConfig, DivinerParams } from '@xyo-network/diviner-model'\nimport { PayloadHasher } from '@xyo-network/hash'\nimport { isPayloadOfSchemaType, Payload } from '@xyo-network/payload-model'\n\nexport type FindCallResult<TResult = string, TPayload = Payload> = [TResult, TPayload] | [undefined, TPayload] | [undefined, undefined]\n\nexport const CryptoContractDivinerConfigSchema = 'network.xyo.crypto.contract.diviner.config'\nexport type CryptoContractDivinerConfigSchema = typeof CryptoContractDivinerConfigSchema\n\nexport type CryptoContractDivinerConfig = DivinerConfig<{\n schema: CryptoContractDivinerConfigSchema\n}>\nexport type CryptoContractDivinerParams = DivinerParams<CryptoContractDivinerConfig>\n\nexport const ContractInfoSchema = 'network.xyo.crypto.contract.info'\nexport type ContractInfoSchema = typeof ContractInfoSchema\n\nexport type ContractInfo = Payload<\n {\n address: string\n chainId: string\n results?: Record<string, ContractFunctionResult>\n },\n ContractInfoSchema\n>\n\nexport class CryptoContractDiviner<TParams extends CryptoContractDivinerParams = CryptoContractDivinerParams> extends AbstractDiviner<TParams> {\n static override configSchemas = [CryptoContractDivinerConfigSchema]\n\n protected static findCallResult<TResult = string>(\n address: string,\n functionName: string,\n params: unknown[],\n payloads: CryptoContractFunctionCallResult[],\n ): TResult | undefined {\n const foundPayload = payloads.find((payload) => payload.functionName === functionName && payload.address === address)\n return foundPayload?.result.value as TResult | undefined\n }\n\n protected static async generateCallHash(address: string, functionName: string, params: unknown[]) {\n const callPayload: CryptoContractFunctionCall = {\n address,\n functionName,\n params,\n schema: CryptoContractFunctionCallSchema,\n }\n return await PayloadHasher.hashAsync(callPayload)\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 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: CryptoContractFunctionCallResult[]): ContractInfo {\n return {\n address: assertEx(CryptoContractDiviner.matchingExistingField(callResults, 'address'), 'Mismatched address'),\n chainId: assertEx(CryptoContractDiviner.matchingExistingField(callResults, 'chainId'), 'Mismatched chainId'),\n schema: ContractInfoSchema,\n }\n }\n\n protected override async divineHandler(inPayloads: CryptoContractFunctionCallResult[] = []): Promise<ContractInfo[]> {\n const callResults = inPayloads.filter(isPayloadOfSchemaType<CryptoContractFunctionCallResult>(CryptoContractFunctionCallResultSchema))\n const addresses = Object.keys(\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 info: ContractInfo = {\n ...{ results: await this.reduceResults(foundCallResults) },\n ...this.contractInfoRequiredFields(foundCallResults),\n }\n return info\n }),\n )\n\n return result\n }\n\n protected reduceResults(callResults: CryptoContractFunctionCallResult[]): Promisable<ContractInfo['results']> {\n return callResults.reduce<Record<string, ContractFunctionResult>>((prev, callResult) => {\n prev[callResult.functionName] = callResult.result\n return prev\n }, {})\n }\n}\n","import { CryptoContractFunctionReadWitnessPlugin } from './Plugin'\n\nexport * from './CryptoContractDiviner'\nexport * from './Witness'\n\nexport { CryptoContractFunctionReadWitnessPlugin }\n\n// eslint-disable-next-line import/no-default-export\nexport default CryptoContractFunctionReadWitnessPlugin\n"],"mappings":"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","names":["assertEx","CryptoContractFunctionCallResultSchema","CryptoContractFunctionCallSchema","isPayloadOfSchemaType","result"]}
|
|
1
|
+
{"version":3,"sources":["../../src/Plugin.ts","../../src/Witness.ts","../../src/CryptoContractDiviner.ts","../../src/index.ts"],"sourcesContent":["import { NftSchema } from '@xyo-network/crypto-nft-payload-plugin'\nimport { PayloadSetSchema } from '@xyo-network/payload-model'\nimport { createPayloadSetWitnessPlugin } from '@xyo-network/payloadset-plugin'\n\nimport { CryptoContractFunctionReadWitness } from './Witness'\n\nexport const CryptoContractFunctionReadWitnessPlugin = () =>\n createPayloadSetWitnessPlugin<CryptoContractFunctionReadWitness>(\n { required: { [NftSchema]: 1 }, schema: PayloadSetSchema },\n {\n witness: async (params) => {\n const result = await CryptoContractFunctionReadWitness.create(params)\n return result\n },\n },\n )\n","import { BigNumber } from '@ethersproject/bignumber'\nimport { Contract } from '@ethersproject/contracts'\nimport { JsonRpcProvider } from '@ethersproject/providers'\nimport { assertEx } from '@xylabs/assert'\nimport { AbstractWitness } from '@xyo-network/abstract-witness'\nimport {\n CryptoContractFunctionCall,\n CryptoContractFunctionCallFailure,\n CryptoContractFunctionCallResult,\n CryptoContractFunctionCallResultSchema,\n CryptoContractFunctionCallSchema,\n CryptoContractFunctionCallSuccess,\n CryptoContractFunctionReadWitnessConfig,\n CryptoContractFunctionReadWitnessConfigSchema,\n} from '@xyo-network/crypto-contract-function-read-payload-plugin'\nimport { AnyConfigSchema } from '@xyo-network/module-model'\nimport { isPayloadOfSchemaType } from '@xyo-network/payload-model'\nimport { WitnessParams } from '@xyo-network/witness-model'\n\nexport type CryptoContractFunctionReadWitnessParams = WitnessParams<\n AnyConfigSchema<CryptoContractFunctionReadWitnessConfig>,\n {\n providers: JsonRpcProvider[]\n }\n>\n\nexport class CryptoContractFunctionReadWitness<\n TParams extends CryptoContractFunctionReadWitnessParams = CryptoContractFunctionReadWitnessParams,\n> extends AbstractWitness<TParams, CryptoContractFunctionCall, CryptoContractFunctionCallResult> {\n static override configSchemas = [CryptoContractFunctionReadWitnessConfigSchema]\n\n protected override async observeHandler(inPayloads: CryptoContractFunctionCall[] = []): Promise<CryptoContractFunctionCallResult[]> {\n await this.started('throw')\n try {\n const observations = await Promise.all(\n inPayloads.filter(isPayloadOfSchemaType(CryptoContractFunctionCallSchema)).map(async ({ functionName, args, address }) => {\n const { providers } = this.params\n const provider = providers[Date.now() % providers.length] //pick a random provider\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 ?? [])]\n\n const contract = new Contract(validatedAddress, this.config.contract, provider)\n try {\n const result = await contract.callStatic[validatedFunctionName](...mergedArgs)\n const transformedResult = BigNumber.isBigNumber(result) ? result.toHexString() : result\n const observation: CryptoContractFunctionCallSuccess = {\n address: validatedAddress,\n args: mergedArgs,\n chainId: provider.network.chainId,\n functionName: validatedFunctionName,\n result: transformedResult,\n schema: CryptoContractFunctionCallResultSchema,\n }\n return observation\n } catch (ex) {\n const error = ex as Error & { code: string }\n console.log(`Error [${this.config.name}]: ${error.code}`)\n const observation: CryptoContractFunctionCallFailure = {\n address: validatedAddress,\n args: mergedArgs,\n chainId: provider.network.chainId,\n error: error.code,\n functionName: validatedFunctionName,\n schema: CryptoContractFunctionCallResultSchema,\n }\n return observation\n }\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","import { assertEx } from '@xylabs/assert'\nimport { Promisable } from '@xylabs/promise'\nimport { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport {\n asCryptoContractFunctionCallSuccess,\n CryptoContractFunctionCallResult,\n CryptoContractFunctionCallResultSchema,\n} from '@xyo-network/crypto-contract-function-read-payload-plugin'\nimport { DivinerConfig, DivinerParams } from '@xyo-network/diviner-model'\nimport { isPayloadOfSchemaType, Payload } from '@xyo-network/payload-model'\n\nexport type FindCallResult<TResult = string, TPayload = Payload> = [TResult, TPayload] | [undefined, TPayload] | [undefined, undefined]\n\nexport const CryptoContractDivinerConfigSchema = 'network.xyo.crypto.contract.diviner.config'\nexport type CryptoContractDivinerConfigSchema = typeof CryptoContractDivinerConfigSchema\n\nexport type CryptoContractDivinerConfig = DivinerConfig<{\n schema: CryptoContractDivinerConfigSchema\n}>\nexport type CryptoContractDivinerParams = DivinerParams<CryptoContractDivinerConfig>\n\nexport const ContractInfoSchema = 'network.xyo.crypto.contract.info'\nexport type ContractInfoSchema = typeof ContractInfoSchema\n\nexport type ContractInfo = Payload<\n {\n address: string\n chainId: string\n results?: Record<string, unknown>\n },\n ContractInfoSchema\n>\n\nexport class CryptoContractDiviner<TParams extends CryptoContractDivinerParams = CryptoContractDivinerParams> extends AbstractDiviner<TParams> {\n static override configSchemas = [CryptoContractDivinerConfigSchema]\n\n protected static findCallResult<TResult = string>(\n address: string,\n functionName: string,\n payloads: CryptoContractFunctionCallResult[],\n ): TResult | undefined {\n const foundPayload = payloads.find((payload) => payload.functionName === functionName && payload.address === address)\n return asCryptoContractFunctionCallSuccess(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 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: CryptoContractFunctionCallResult[]): ContractInfo {\n return {\n address: assertEx(CryptoContractDiviner.matchingExistingField(callResults, 'address'), 'Mismatched address'),\n chainId: assertEx(CryptoContractDiviner.matchingExistingField(callResults, 'chainId'), 'Mismatched chainId'),\n schema: ContractInfoSchema,\n }\n }\n\n protected override async divineHandler(inPayloads: CryptoContractFunctionCallResult[] = []): Promise<ContractInfo[]> {\n const callResults = inPayloads.filter(isPayloadOfSchemaType<CryptoContractFunctionCallResult>(CryptoContractFunctionCallResultSchema))\n const addresses = Object.keys(\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 info: ContractInfo = {\n ...{ results: await this.reduceResults(foundCallResults) },\n ...this.contractInfoRequiredFields(foundCallResults),\n }\n return info\n }),\n )\n\n return result\n }\n\n protected reduceResults(callResults: CryptoContractFunctionCallResult[]): Promisable<ContractInfo['results']> {\n return callResults.reduce<Record<string, unknown>>((prev, callResult) => {\n prev[callResult.functionName] = asCryptoContractFunctionCallSuccess(callResult)?.result\n return prev\n }, {})\n }\n}\n","import { CryptoContractFunctionReadWitnessPlugin } from './Plugin'\n\nexport * from './CryptoContractDiviner'\nexport * from './Witness'\n\nexport { CryptoContractFunctionReadWitnessPlugin }\n\n// eslint-disable-next-line import/no-default-export\nexport default CryptoContractFunctionReadWitnessPlugin\n"],"mappings":"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","names":["assertEx","CryptoContractFunctionCallResultSchema","isPayloadOfSchemaType","result"]}
|
package/package.json
CHANGED
|
@@ -12,26 +12,26 @@
|
|
|
12
12
|
"dependencies": {
|
|
13
13
|
"@xylabs/assert": "^2.13.3",
|
|
14
14
|
"@xylabs/promise": "^2.13.3",
|
|
15
|
-
"@xyo-network/abstract-diviner": "~2.78.
|
|
16
|
-
"@xyo-network/abstract-witness": "~2.78.
|
|
17
|
-
"@xyo-network/crypto-contract-function-read-payload-plugin": "~2.78.
|
|
18
|
-
"@xyo-network/crypto-nft-payload-plugin": "~2.78.
|
|
19
|
-
"@xyo-network/diviner-model": "~2.78.
|
|
20
|
-
"@xyo-network/hash": "~2.78.
|
|
21
|
-
"@xyo-network/module-model": "~2.78.
|
|
22
|
-
"@xyo-network/payload-model": "~2.78.
|
|
23
|
-
"@xyo-network/payloadset-plugin": "~2.78.
|
|
24
|
-
"@xyo-network/witness-model": "~2.78.
|
|
15
|
+
"@xyo-network/abstract-diviner": "~2.78.1",
|
|
16
|
+
"@xyo-network/abstract-witness": "~2.78.1",
|
|
17
|
+
"@xyo-network/crypto-contract-function-read-payload-plugin": "~2.78.1",
|
|
18
|
+
"@xyo-network/crypto-nft-payload-plugin": "~2.78.1",
|
|
19
|
+
"@xyo-network/diviner-model": "~2.78.1",
|
|
20
|
+
"@xyo-network/hash": "~2.78.1",
|
|
21
|
+
"@xyo-network/module-model": "~2.78.1",
|
|
22
|
+
"@xyo-network/payload-model": "~2.78.1",
|
|
23
|
+
"@xyo-network/payloadset-plugin": "~2.78.1",
|
|
24
|
+
"@xyo-network/witness-model": "~2.78.1"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@ethersproject/providers": "^5.7.2",
|
|
28
28
|
"@xylabs/jest-helpers": "^2.13.3",
|
|
29
29
|
"@xylabs/ts-scripts-yarn3": "^3.1.13",
|
|
30
30
|
"@xylabs/tsconfig": "^3.1.13",
|
|
31
|
-
"@xyo-network/account": "~2.78.
|
|
32
|
-
"@xyo-network/manifest": "~2.78.
|
|
31
|
+
"@xyo-network/account": "~2.78.1",
|
|
32
|
+
"@xyo-network/manifest": "~2.78.1",
|
|
33
33
|
"@xyo-network/open-zeppelin-typechain": "^2.2.11",
|
|
34
|
-
"@xyo-network/sentinel-model": "~2.78.
|
|
34
|
+
"@xyo-network/sentinel-model": "~2.78.1",
|
|
35
35
|
"ethers": "^5.7.2",
|
|
36
36
|
"jest": "^29.7.0",
|
|
37
37
|
"typescript": "^5.2.2"
|
|
@@ -76,5 +76,5 @@
|
|
|
76
76
|
"url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js.git"
|
|
77
77
|
},
|
|
78
78
|
"sideEffects": false,
|
|
79
|
-
"version": "2.78.
|
|
79
|
+
"version": "2.78.1"
|
|
80
80
|
}
|
|
@@ -2,14 +2,11 @@ import { assertEx } from '@xylabs/assert'
|
|
|
2
2
|
import { Promisable } from '@xylabs/promise'
|
|
3
3
|
import { AbstractDiviner } from '@xyo-network/abstract-diviner'
|
|
4
4
|
import {
|
|
5
|
-
|
|
6
|
-
CryptoContractFunctionCall,
|
|
5
|
+
asCryptoContractFunctionCallSuccess,
|
|
7
6
|
CryptoContractFunctionCallResult,
|
|
8
7
|
CryptoContractFunctionCallResultSchema,
|
|
9
|
-
CryptoContractFunctionCallSchema,
|
|
10
8
|
} from '@xyo-network/crypto-contract-function-read-payload-plugin'
|
|
11
9
|
import { DivinerConfig, DivinerParams } from '@xyo-network/diviner-model'
|
|
12
|
-
import { PayloadHasher } from '@xyo-network/hash'
|
|
13
10
|
import { isPayloadOfSchemaType, Payload } from '@xyo-network/payload-model'
|
|
14
11
|
|
|
15
12
|
export type FindCallResult<TResult = string, TPayload = Payload> = [TResult, TPayload] | [undefined, TPayload] | [undefined, undefined]
|
|
@@ -29,7 +26,7 @@ export type ContractInfo = Payload<
|
|
|
29
26
|
{
|
|
30
27
|
address: string
|
|
31
28
|
chainId: string
|
|
32
|
-
results?: Record<string,
|
|
29
|
+
results?: Record<string, unknown>
|
|
33
30
|
},
|
|
34
31
|
ContractInfoSchema
|
|
35
32
|
>
|
|
@@ -40,21 +37,10 @@ export class CryptoContractDiviner<TParams extends CryptoContractDivinerParams =
|
|
|
40
37
|
protected static findCallResult<TResult = string>(
|
|
41
38
|
address: string,
|
|
42
39
|
functionName: string,
|
|
43
|
-
params: unknown[],
|
|
44
40
|
payloads: CryptoContractFunctionCallResult[],
|
|
45
41
|
): TResult | undefined {
|
|
46
42
|
const foundPayload = payloads.find((payload) => payload.functionName === functionName && payload.address === address)
|
|
47
|
-
return foundPayload?.result
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
protected static async generateCallHash(address: string, functionName: string, params: unknown[]) {
|
|
51
|
-
const callPayload: CryptoContractFunctionCall = {
|
|
52
|
-
address,
|
|
53
|
-
functionName,
|
|
54
|
-
params,
|
|
55
|
-
schema: CryptoContractFunctionCallSchema,
|
|
56
|
-
}
|
|
57
|
-
return await PayloadHasher.hashAsync(callPayload)
|
|
43
|
+
return asCryptoContractFunctionCallSuccess(foundPayload)?.result as TResult | undefined
|
|
58
44
|
}
|
|
59
45
|
|
|
60
46
|
protected static matchingExistingField<R = string, T extends Payload = Payload>(objs: T[], field: keyof T): R | undefined {
|
|
@@ -98,8 +84,8 @@ export class CryptoContractDiviner<TParams extends CryptoContractDivinerParams =
|
|
|
98
84
|
}
|
|
99
85
|
|
|
100
86
|
protected reduceResults(callResults: CryptoContractFunctionCallResult[]): Promisable<ContractInfo['results']> {
|
|
101
|
-
return callResults.reduce<Record<string,
|
|
102
|
-
prev[callResult.functionName] = callResult
|
|
87
|
+
return callResults.reduce<Record<string, unknown>>((prev, callResult) => {
|
|
88
|
+
prev[callResult.functionName] = asCryptoContractFunctionCallSuccess(callResult)?.result
|
|
103
89
|
return prev
|
|
104
90
|
}, {})
|
|
105
91
|
}
|
package/src/Erc721Sentinel.json
CHANGED
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
"nodes": [
|
|
4
4
|
{
|
|
5
5
|
"config": {
|
|
6
|
-
"accountPath": "m/44'/60'/1'/0'/0'",
|
|
7
6
|
"name": "NftInfo",
|
|
8
7
|
"schema": "network.xyo.node.config"
|
|
9
8
|
},
|
|
@@ -11,11 +10,8 @@
|
|
|
11
10
|
"public": [
|
|
12
11
|
{
|
|
13
12
|
"config": {
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
-
"functionName": "name",
|
|
17
|
-
"params": []
|
|
18
|
-
},
|
|
13
|
+
"functionName": "name",
|
|
14
|
+
"params": [],
|
|
19
15
|
"labels": {
|
|
20
16
|
"network.xyo.crypto.contract.interface": "Erc721"
|
|
21
17
|
},
|
|
@@ -26,11 +22,8 @@
|
|
|
26
22
|
},
|
|
27
23
|
{
|
|
28
24
|
"config": {
|
|
29
|
-
"
|
|
30
|
-
"
|
|
31
|
-
"functionName": "symbol",
|
|
32
|
-
"params": []
|
|
33
|
-
},
|
|
25
|
+
"functionName": "symbol",
|
|
26
|
+
"params": [],
|
|
34
27
|
"labels": {
|
|
35
28
|
"network.xyo.crypto.contract.interface": "Erc721"
|
|
36
29
|
},
|
|
@@ -41,10 +34,7 @@
|
|
|
41
34
|
},
|
|
42
35
|
{
|
|
43
36
|
"config": {
|
|
44
|
-
"
|
|
45
|
-
"call": {
|
|
46
|
-
"functionName": "tokenURI"
|
|
47
|
-
},
|
|
37
|
+
"functionName": "tokenURI",
|
|
48
38
|
"labels": {
|
|
49
39
|
"network.xyo.crypto.contract.interface": "Erc721"
|
|
50
40
|
},
|
|
@@ -55,10 +45,7 @@
|
|
|
55
45
|
},
|
|
56
46
|
{
|
|
57
47
|
"config": {
|
|
58
|
-
"
|
|
59
|
-
"call": {
|
|
60
|
-
"functionName": "ownerOf"
|
|
61
|
-
},
|
|
48
|
+
"functionName": "ownerOf",
|
|
62
49
|
"labels": {
|
|
63
50
|
"network.xyo.crypto.contract.interface": "Erc721"
|
|
64
51
|
},
|
|
@@ -69,11 +56,8 @@
|
|
|
69
56
|
},
|
|
70
57
|
{
|
|
71
58
|
"config": {
|
|
72
|
-
"
|
|
73
|
-
"
|
|
74
|
-
"functionName": "totalSupply",
|
|
75
|
-
"params": []
|
|
76
|
-
},
|
|
59
|
+
"functionName": "totalSupply",
|
|
60
|
+
"params": [],
|
|
77
61
|
"labels": {
|
|
78
62
|
"network.xyo.crypto.contract.interface": "Erc721Enumerable"
|
|
79
63
|
},
|
|
@@ -84,10 +68,7 @@
|
|
|
84
68
|
},
|
|
85
69
|
{
|
|
86
70
|
"config": {
|
|
87
|
-
"
|
|
88
|
-
"call": {
|
|
89
|
-
"functionName": "tokenByIndex"
|
|
90
|
-
},
|
|
71
|
+
"functionName": "tokenByIndex",
|
|
91
72
|
"labels": {
|
|
92
73
|
"network.xyo.crypto.contract.interface": "Erc721Enumerable"
|
|
93
74
|
},
|
|
@@ -98,11 +79,8 @@
|
|
|
98
79
|
},
|
|
99
80
|
{
|
|
100
81
|
"config": {
|
|
101
|
-
"
|
|
102
|
-
"
|
|
103
|
-
"functionName": "uri",
|
|
104
|
-
"params": []
|
|
105
|
-
},
|
|
82
|
+
"functionName": "uri",
|
|
83
|
+
"params": [],
|
|
106
84
|
"labels": {
|
|
107
85
|
"network.xyo.crypto.contract.interface": "Erc1155"
|
|
108
86
|
},
|
|
@@ -113,7 +91,6 @@
|
|
|
113
91
|
},
|
|
114
92
|
{
|
|
115
93
|
"config": {
|
|
116
|
-
"accountPath": "m/44'/60'/1'/2'/0'",
|
|
117
94
|
"language": "javascript",
|
|
118
95
|
"name": "Erc721ContractInfoDiviner",
|
|
119
96
|
"schema": "network.xyo.crypto.contract.diviner.config"
|
|
@@ -121,7 +98,6 @@
|
|
|
121
98
|
},
|
|
122
99
|
{
|
|
123
100
|
"config": {
|
|
124
|
-
"accountPath": "m/44'/60'/1'/2'/1'",
|
|
125
101
|
"language": "javascript",
|
|
126
102
|
"name": "Erc1155ContractInfoDiviner",
|
|
127
103
|
"schema": "network.xyo.crypto.contract.diviner.config"
|
|
@@ -129,7 +105,6 @@
|
|
|
129
105
|
},
|
|
130
106
|
{
|
|
131
107
|
"config": {
|
|
132
|
-
"accountPath": "m/44'/60'/1'/3'/0'",
|
|
133
108
|
"language": "javascript",
|
|
134
109
|
"name": "NftInfoSentinel",
|
|
135
110
|
"schema": "network.xyo.sentinel.config",
|
|
@@ -170,7 +145,6 @@
|
|
|
170
145
|
},
|
|
171
146
|
{
|
|
172
147
|
"config": {
|
|
173
|
-
"accountPath": "m/44'/60'/1'/3'/1'",
|
|
174
148
|
"language": "javascript",
|
|
175
149
|
"name": "NftTokenInfoSentinel",
|
|
176
150
|
"schema": "network.xyo.sentinel.config",
|