@xyo-network/evm-plugins 4.2.0 → 5.0.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/evm-plugins",
3
- "version": "4.2.0",
3
+ "version": "5.0.1",
4
4
  "description": "Typescript/Javascript Plugins for XYO Platform",
5
5
  "homepage": "https://xyo.network",
6
6
  "bugs": {
@@ -28,42 +28,46 @@
28
28
  },
29
29
  "module": "dist/neutral/index.mjs",
30
30
  "types": "dist/neutral/index.d.ts",
31
+ "files": [
32
+ "dist",
33
+ "src"
34
+ ],
31
35
  "dependencies": {
32
- "@xyo-network/erc1822-witness": "^4.2.0",
33
- "@xyo-network/erc1967-witness": "^4.2.0",
34
- "@xyo-network/ethereum-blockchain-plugins": "^4.2.0",
35
- "@xyo-network/evm-abi-diviner": "^4.2.0",
36
- "@xyo-network/evm-call-witness": "^4.2.0",
37
- "@xyo-network/evm-contract-witness": "^4.2.0",
38
- "@xyo-network/payloadset-plugin": "^4.3.0"
36
+ "@xyo-network/erc1822-witness": "~5.0.1",
37
+ "@xyo-network/erc1967-witness": "~5.0.1",
38
+ "@xyo-network/ethereum-blockchain-plugins": "~5.0.1",
39
+ "@xyo-network/evm-abi-diviner": "~5.0.1",
40
+ "@xyo-network/evm-call-witness": "~5.0.1",
41
+ "@xyo-network/evm-contract-witness": "~5.0.1",
42
+ "@xyo-network/payloadset-plugin": "~5.0.2"
39
43
  },
40
44
  "devDependencies": {
41
- "@xylabs/delay": "^4.15.1",
42
- "@xylabs/ts-scripts-yarn3": "^7.0.1",
43
- "@xylabs/tsconfig": "^7.0.1",
44
- "@xylabs/vitest-extended": "^4.15.1",
45
- "@xyo-network/api-call-witness": "^4.2.0",
46
- "@xyo-network/archivist-model": "^4.3.0",
47
- "@xyo-network/crypto-nft-payload-plugin": "^4.2.0",
48
- "@xyo-network/diviner-boundwitness-memory": "^4.3.0",
49
- "@xyo-network/diviner-evm-call-result-to-token-uri": "^4.2.0",
50
- "@xyo-network/diviner-model": "^4.3.0",
51
- "@xyo-network/diviner-payload-generic": "^4.3.0",
52
- "@xyo-network/diviner-payload-model": "^4.3.0",
53
- "@xyo-network/diviner-temporal-indexing": "^4.3.0",
54
- "@xyo-network/evm-nft-id-payload-plugin": "^4.2.0",
55
- "@xyo-network/manifest": "^4.3.0",
56
- "@xyo-network/module-factory-locator": "^4.3.0",
57
- "@xyo-network/module-model": "^4.3.0",
58
- "@xyo-network/node-memory": "^4.3.0",
59
- "@xyo-network/open-zeppelin-typechain": "^3.5.4",
60
- "@xyo-network/payload-model": "^4.3.0",
61
- "@xyo-network/sentinel-model": "^4.3.0",
62
- "@xyo-network/wallet": "^4.3.0",
63
- "@xyo-network/witness-evm-abstract": "^4.3.0",
64
- "@xyo-network/witness-timestamp": "^4.3.0",
65
- "typescript": "^5.8.3",
66
- "vitest": "^3.2.4"
45
+ "@xylabs/delay": "~5.0.7",
46
+ "@xylabs/ts-scripts-yarn3": "~7.1.0",
47
+ "@xylabs/tsconfig": "~7.1.0",
48
+ "@xylabs/vitest-extended": "~5.0.7",
49
+ "@xyo-network/api-call-witness": "~5.0.1",
50
+ "@xyo-network/archivist-model": "~5.0.2",
51
+ "@xyo-network/crypto-nft-payload-plugin": "~5.0.1",
52
+ "@xyo-network/diviner-boundwitness-memory": "~5.0.2",
53
+ "@xyo-network/diviner-evm-call-result-to-token-uri": "~5.0.1",
54
+ "@xyo-network/diviner-model": "~5.0.2",
55
+ "@xyo-network/diviner-payload-generic": "~5.0.2",
56
+ "@xyo-network/diviner-payload-model": "~5.0.2",
57
+ "@xyo-network/diviner-temporal-indexing": "~5.0.2",
58
+ "@xyo-network/evm-nft-id-payload-plugin": "~5.0.1",
59
+ "@xyo-network/manifest": "~5.0.2",
60
+ "@xyo-network/module-factory-locator": "~5.0.2",
61
+ "@xyo-network/module-model": "~5.0.2",
62
+ "@xyo-network/node-memory": "~5.0.2",
63
+ "@xyo-network/open-zeppelin-typechain": "~4.0.0",
64
+ "@xyo-network/payload-model": "~5.0.2",
65
+ "@xyo-network/sentinel-model": "~5.0.2",
66
+ "@xyo-network/wallet": "~5.0.2",
67
+ "@xyo-network/witness-evm-abstract": "~5.0.2",
68
+ "@xyo-network/witness-timestamp": "~5.0.2",
69
+ "typescript": "~5.9.2",
70
+ "vitest": "~3.2.4"
67
71
  },
68
72
  "publishConfig": {
69
73
  "access": "public"
@@ -0,0 +1,117 @@
1
+ import '@xylabs/vitest-extended'
2
+
3
+ import { delay } from '@xylabs/delay'
4
+ import { MemoryBoundWitnessDiviner } from '@xyo-network/diviner-boundwitness-memory'
5
+ import { EvmCallResultToNftTokenUriDiviner } from '@xyo-network/diviner-evm-call-result-to-token-uri'
6
+ import { asDivinerInstance } from '@xyo-network/diviner-model'
7
+ import { GenericPayloadDiviner } from '@xyo-network/diviner-payload-generic'
8
+ import { PayloadDivinerQuerySchema } from '@xyo-network/diviner-payload-model'
9
+ import {
10
+ TemporalIndexingDiviner,
11
+ TemporalIndexingDivinerDivinerQueryToIndexQueryDiviner,
12
+ TemporalIndexingDivinerIndexCandidateToIndexDiviner,
13
+ TemporalIndexingDivinerIndexQueryResponseToDivinerQueryResponseDiviner,
14
+ TemporalIndexingDivinerStateToIndexCandidateDiviner,
15
+ } from '@xyo-network/diviner-temporal-indexing'
16
+ import type { EvmCall, EvmCallWitnessParams } from '@xyo-network/evm-call-witness'
17
+ import {
18
+ EvmCallDiviner, EvmCallSchema, EvmCallWitness,
19
+ } from '@xyo-network/evm-call-witness'
20
+ import { isNftMetadataUri, NftMetadataUriSchema } from '@xyo-network/evm-nft-id-payload-plugin'
21
+ import type { PackageManifestPayload } from '@xyo-network/manifest'
22
+ import { ManifestWrapper } from '@xyo-network/manifest'
23
+ import { ModuleFactoryLocator } from '@xyo-network/module-factory-locator'
24
+ import { ModuleFactory } from '@xyo-network/module-model'
25
+ import type { MemoryNode } from '@xyo-network/node-memory'
26
+ import { ERC721URIStorage__factory } from '@xyo-network/open-zeppelin-typechain'
27
+ import type { Payload } from '@xyo-network/payload-model'
28
+ import { asSentinelInstance } from '@xyo-network/sentinel-model'
29
+ import { HDWallet } from '@xyo-network/wallet'
30
+ import { getProvidersFromEnv } from '@xyo-network/witness-evm-abstract'
31
+ import { TimestampWitness } from '@xyo-network/witness-timestamp'
32
+ import {
33
+ beforeAll, describe, expect,
34
+ it,
35
+ } from 'vitest'
36
+
37
+ import nftIdToNftMetadataUri from './NftIdToNftMetadataUri.json' with { type: 'json' }
38
+
39
+ const maxProviders = 2
40
+ const providers = getProvidersFromEnv(maxProviders)
41
+
42
+ describe.skipIf(providers.length === 0)('NftIdToNftMetadataUri', () => {
43
+ const chainId = 1
44
+ let node: MemoryNode
45
+ const cases = [
46
+ // Bored Apes
47
+ ['0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D', '0x0f'],
48
+ // Gutter Cat Gang
49
+ ['0xEdB61f74B0d09B2558F1eeb79B247c1F363Ae452', '0x543'],
50
+ ]
51
+ beforeAll(async () => {
52
+ const wallet = await HDWallet.random()
53
+ const locator = new ModuleFactoryLocator()
54
+ locator.register(MemoryBoundWitnessDiviner.factory())
55
+ locator.register(GenericPayloadDiviner.factory())
56
+ locator.register(TemporalIndexingDivinerDivinerQueryToIndexQueryDiviner.factory())
57
+ locator.register(TemporalIndexingDivinerIndexCandidateToIndexDiviner.factory())
58
+ locator.register(TemporalIndexingDivinerIndexQueryResponseToDivinerQueryResponseDiviner.factory())
59
+ locator.register(TemporalIndexingDivinerStateToIndexCandidateDiviner.factory())
60
+ locator.register(TemporalIndexingDiviner.factory())
61
+ locator.register(TimestampWitness.factory())
62
+ locator.register(EvmCallDiviner.factory())
63
+ locator.register(EvmCallResultToNftTokenUriDiviner.factory())
64
+ locator.register(
65
+ new ModuleFactory(EvmCallWitness, {
66
+ config: { abi: ERC721URIStorage__factory.abi },
67
+ providers: () => getProvidersFromEnv(maxProviders),
68
+ } as EvmCallWitnessParams),
69
+ { 'network.xyo.evm.interface': 'ERC721TokenUri' },
70
+ )
71
+ const manifest = nftIdToNftMetadataUri as PackageManifestPayload
72
+ const manifestWrapper = new ManifestWrapper(manifest, wallet, locator)
73
+ node = await manifestWrapper.loadNodeFromIndex(0)
74
+ const mods = await node.resolve('*')
75
+ const publicModules = manifest.nodes[0].modules?.public ?? []
76
+ expect(mods.length).toBeGreaterThan(publicModules.length)
77
+ })
78
+ describe('Sentinel', () => {
79
+ it.each(cases)('returns metadata URI for token ID', async (address, tokenId) => {
80
+ const tokenCallPayload: EvmCall = {
81
+ address, args: [tokenId], schema: EvmCallSchema,
82
+ }
83
+ const tokenSentinel = asSentinelInstance(await node.resolve('NftTokenUriSentinel'))
84
+ expect(tokenSentinel).toBeDefined()
85
+ const report = await tokenSentinel?.report([tokenCallPayload])
86
+ const results = report?.filter(isNftMetadataUri) ?? []
87
+ expect(results.length).toBe(1)
88
+ expect(results?.[0]?.address).toBe(address)
89
+ expect(results?.[0]?.chainId).toBe(chainId)
90
+ expect(results?.[0]?.tokenId).toBe(tokenId)
91
+ expect(results?.[0]?.schema).toBe(NftMetadataUriSchema)
92
+ expect(results?.[0]?.metadataUri).toBeString()
93
+ const num = Number(BigInt(tokenId)).toString()
94
+ // It is not always true that the metadata URI contains the token ID, but
95
+ // it is true for the cases we are testing
96
+ expect(results?.[0]?.metadataUri).toContain(num)
97
+ })
98
+ })
99
+ describe.skip('Index', () => {
100
+ beforeAll(async () => {
101
+ await delay(100)
102
+ })
103
+ it.each(cases)('returns indexed NftIndex results', async (address, tokenId) => {
104
+ const diviner = asDivinerInstance(await node.resolve('IndexDiviner'))
105
+ expect(diviner).toBeDefined()
106
+ const query = {
107
+ address, chainId, length: 1, schema: PayloadDivinerQuerySchema, tokenId,
108
+ }
109
+ const result = (await diviner?.divine([query])) as unknown as Payload<{ address?: string; chainId?: number; tokenId?: string }>[]
110
+ expect(result).toBeDefined()
111
+ expect(result).toBeArrayOfSize(1)
112
+ expect(result?.[0]?.address).toBe(address)
113
+ expect(result?.[0]?.chainId).toBe(chainId)
114
+ expect(result?.[0]?.tokenId).toBe(tokenId)
115
+ })
116
+ })
117
+ })
@@ -0,0 +1,119 @@
1
+ import '@xylabs/vitest-extended'
2
+
3
+ import { delay } from '@xylabs/delay'
4
+ import type { ApiCallWitnessParams, ApiUriCallPayload } from '@xyo-network/api-call-witness'
5
+ import {
6
+ ApiCallSchema, ApiCallWitness, ApiCallWitnessConfigSchema,
7
+ isApiCallJsonResult,
8
+ } from '@xyo-network/api-call-witness'
9
+ import { asArchivistInstance } from '@xyo-network/archivist-model'
10
+ import type { OpenSeaNftMetadata } from '@xyo-network/crypto-nft-payload-plugin'
11
+ import { MemoryBoundWitnessDiviner } from '@xyo-network/diviner-boundwitness-memory'
12
+ import { asDivinerInstance } from '@xyo-network/diviner-model'
13
+ import { GenericPayloadDiviner } from '@xyo-network/diviner-payload-generic'
14
+ import { PayloadDivinerQuerySchema } from '@xyo-network/diviner-payload-model'
15
+ import {
16
+ TemporalIndexingDiviner,
17
+ TemporalIndexingDivinerDivinerQueryToIndexQueryDiviner,
18
+ TemporalIndexingDivinerIndexCandidateToIndexDiviner,
19
+ TemporalIndexingDivinerIndexQueryResponseToDivinerQueryResponseDiviner,
20
+ TemporalIndexingDivinerStateToIndexCandidateDiviner,
21
+ } from '@xyo-network/diviner-temporal-indexing'
22
+ import type { PackageManifestPayload } from '@xyo-network/manifest'
23
+ import { ManifestWrapper } from '@xyo-network/manifest'
24
+ import { ModuleFactoryLocator } from '@xyo-network/module-factory-locator'
25
+ import { ModuleFactory } from '@xyo-network/module-model'
26
+ import type { MemoryNode } from '@xyo-network/node-memory'
27
+ import type { Payload } from '@xyo-network/payload-model'
28
+ import { asSentinelInstance } from '@xyo-network/sentinel-model'
29
+ import { HDWallet } from '@xyo-network/wallet'
30
+ import { getProvidersFromEnv } from '@xyo-network/witness-evm-abstract'
31
+ import { TimestampWitness } from '@xyo-network/witness-timestamp'
32
+ import {
33
+ beforeAll, describe, expect,
34
+ it,
35
+ } from 'vitest'
36
+
37
+ import nftIdToNftMetadataUri from './NftMetadataUriToNftMetadata.json' with { type: 'json' }
38
+
39
+ const maxProviders = 2
40
+ const providers = getProvidersFromEnv(maxProviders)
41
+
42
+ describe.skipIf(providers.length === 0)('NftMetadataUriToNftMetadata', () => {
43
+ let node: MemoryNode
44
+ const cases: ApiUriCallPayload[] = [
45
+ {
46
+ schema: ApiCallSchema,
47
+ // BAYC
48
+ uri: 'ipfs://QmeSjSinHpPnmXmspMjwiXyN6zS4E9zccariGR3jxcaWtq/15',
49
+ },
50
+ /* {
51
+ schema: ApiCallSchema,
52
+ // Gutter Cats
53
+ uri: 'https://gutter-cats-metadata.s3.us-east-2.amazonaws.com/metadata/1347',
54
+ }, */
55
+ ]
56
+ beforeAll(async () => {
57
+ const wallet = await HDWallet.random()
58
+ const locator = new ModuleFactoryLocator()
59
+ locator.register(MemoryBoundWitnessDiviner.factory())
60
+ locator.register(GenericPayloadDiviner.factory())
61
+ locator.register(TemporalIndexingDivinerDivinerQueryToIndexQueryDiviner.factory())
62
+ locator.register(TemporalIndexingDivinerIndexCandidateToIndexDiviner.factory())
63
+ locator.register(TemporalIndexingDivinerIndexQueryResponseToDivinerQueryResponseDiviner.factory())
64
+ locator.register(TemporalIndexingDivinerStateToIndexCandidateDiviner.factory())
65
+ locator.register(TemporalIndexingDiviner.factory())
66
+ locator.register(TimestampWitness.factory())
67
+ locator.register(
68
+ new ModuleFactory(ApiCallWitness, {
69
+ config: { schema: ApiCallWitnessConfigSchema },
70
+ ipfsGateway: '5d7b6582.beta.decentralnetworkservices.com',
71
+ } as ApiCallWitnessParams),
72
+ )
73
+ const manifest = nftIdToNftMetadataUri as PackageManifestPayload
74
+ const manifestWrapper = new ManifestWrapper(manifest, wallet, locator)
75
+ node = await manifestWrapper.loadNodeFromIndex(0)
76
+ const mods = await node.resolve('*')
77
+ const publicModules = manifest.nodes[0].modules?.public ?? []
78
+ expect(mods.length).toBeGreaterThan(publicModules.length)
79
+ })
80
+ describe('Sentinel', () => {
81
+ it.each(cases)('returns metadata URI for token ID', async (apiCall) => {
82
+ const sentinel = asSentinelInstance(await node.resolve('NftMetadataSentinel'))
83
+ expect(sentinel).toBeDefined()
84
+ const report = await sentinel?.report([apiCall])
85
+ const results = report?.filter(isApiCallJsonResult) ?? []
86
+ expect(results.length).toBe(1)
87
+ expect(results[0].data).toBeObject()
88
+ const metadata = results[0].data as OpenSeaNftMetadata
89
+ expect(metadata.image).toBeString()
90
+ expect(metadata.attributes).toBeArray()
91
+ })
92
+ })
93
+ describe.skip('Index', () => {
94
+ beforeAll(async () => {
95
+ await delay(1000)
96
+ }, 60_000)
97
+ it.each(cases)('returns indexed NftIndex results', async (apiCall) => {
98
+ const { uri } = apiCall
99
+ const archivistModule = await node.resolvePrivate('IndexArchivist')
100
+ expect(archivistModule).toBeDefined()
101
+ const archivist = asArchivistInstance(archivistModule)
102
+ expect(archivist).toBeDefined()
103
+ expect(archivist?.all).toBeDefined()
104
+ const allPayload = (await archivist?.all?.()) ?? []
105
+ console.log('uri', uri)
106
+ console.log(JSON.stringify(allPayload, null, 2))
107
+ expect(allPayload).toBeArrayOfSize(1)
108
+ const diviner = asDivinerInstance(await node.resolve('IndexDiviner'))
109
+ expect(diviner).toBeDefined()
110
+ const query = {
111
+ limit: 1, schema: PayloadDivinerQuerySchema, uri,
112
+ }
113
+ const result = (await diviner?.divine([query])) as unknown as Payload<{ uri: string }>[]
114
+ expect(result).toBeDefined()
115
+ expect(result).toBeArrayOfSize(1)
116
+ expect(result?.[0]?.uri).toBe(uri)
117
+ }, 20_000)
118
+ })
119
+ })
package/typedoc.json DELETED
@@ -1,5 +0,0 @@
1
- {
2
- "$schema": "https://typedoc.org/schema.json",
3
- "entryPoints": ["./src/index.ts"],
4
- "tsconfig": "./tsconfig.typedoc.json"
5
- }
package/xy.config.ts DELETED
@@ -1,10 +0,0 @@
1
- import type { XyTsupConfig } from '@xylabs/ts-scripts-yarn3'
2
- const config: XyTsupConfig = {
3
- compile: {
4
- browser: {},
5
- node: {},
6
- neutral: { src: true },
7
- },
8
- }
9
-
10
- export default config