@xyo-network/diviner-address-history 2.56.0

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.
@@ -0,0 +1,60 @@
1
+ import { assertEx } from '@xylabs/assert';
2
+ import { AbstractDiviner } from '@xyo-network/abstract-diviner';
3
+ import { ArchivistGetQuerySchema } from '@xyo-network/archivist-model';
4
+ import { ArchivistWrapper } from '@xyo-network/archivist-wrapper';
5
+ import { BoundWitnessSchema } from '@xyo-network/boundwitness-model';
6
+ import { BoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper';
7
+ import { AddressHistoryDivinerConfigSchema } from '@xyo-network/diviner-address-history-model';
8
+ import { PayloadWrapper } from '@xyo-network/payload-wrapper';
9
+ // This diviner returns the most recent boundwitness signed by the address that can be found
10
+ // if multiple broken chains are found, all the heads are returned
11
+ export class AddressHistoryDiviner extends AbstractDiviner {
12
+ static configSchema = AddressHistoryDivinerConfigSchema;
13
+ get queryAddress() {
14
+ return assertEx(this.config.address, 'Missing address');
15
+ }
16
+ async divine(payloads) {
17
+ assertEx(!payloads?.length, 'MemoryAddressHistoryDiviner.divine does not allow payloads to be sent');
18
+ const archivists = (await this.resolve({ query: [[ArchivistGetQuerySchema]] }))?.map((archivist) => ArchivistWrapper.wrap(archivist, this.account)) ?? [];
19
+ assertEx(archivists.length > 0, 'Did not find any archivists');
20
+ const bwLists = (await Promise.all(archivists.map(async (archivist) => {
21
+ const all = await archivist.all();
22
+ return all.filter((payload) => payload.schema === BoundWitnessSchema);
23
+ }))).flat();
24
+ const bwRecords = this.buildWrapperRecords(bwLists);
25
+ const chains = Object.values(this.buildAddressChains(this.queryAddress, bwRecords));
26
+ //return the heads of each chain (get the last bw on each chain)
27
+ return chains.map((chain) => assertEx(PayloadWrapper.unwrap(chain.shift())));
28
+ }
29
+ buildAddressChains(address, bwRecords) {
30
+ const arrayedResult = Object.entries(bwRecords).reduce((prev, [key, value]) => {
31
+ prev[key] = [value];
32
+ return prev;
33
+ }, {});
34
+ return Object.entries(bwRecords).reduce((prev, [key, value]) => {
35
+ //check if key is still there (may have been deleted as prevHash)
36
+ if (prev[key]) {
37
+ const previousHash = value.prev(address);
38
+ if (previousHash) {
39
+ //if we have the previousHash, move this bw to its chain
40
+ if (prev[previousHash]) {
41
+ prev[key].push(...prev[previousHash]);
42
+ delete prev[previousHash];
43
+ }
44
+ }
45
+ }
46
+ return prev;
47
+ }, arrayedResult);
48
+ }
49
+ //build object with hashes as keys and wrappers as values
50
+ buildWrapperRecords(lists) {
51
+ return lists
52
+ .filter((bw) => bw.addresses.includes(this.queryAddress))
53
+ .reduce((bwRecords, bw) => {
54
+ const wrapper = new BoundWitnessWrapper(bw);
55
+ bwRecords[wrapper.hash] = wrapper;
56
+ return bwRecords;
57
+ }, {});
58
+ }
59
+ }
60
+ //# sourceMappingURL=Diviner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Diviner.js","sourceRoot":"","sources":["../../src/Diviner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from './Diviner';
2
+ export * from '@xyo-network/diviner-address-history-model';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA;AACzB,cAAc,4CAA4C,CAAA"}
@@ -0,0 +1,11 @@
1
+ import { AbstractDiviner } from '@xyo-network/abstract-diviner';
2
+ import { AddressHistoryDivinerParams } from '@xyo-network/diviner-address-history-model';
3
+ import { Payload } from '@xyo-network/payload-model';
4
+ export declare class AddressHistoryDiviner<TParams extends AddressHistoryDivinerParams = AddressHistoryDivinerParams> extends AbstractDiviner<TParams> {
5
+ static configSchema: "network.xyo.diviner.address.history.config";
6
+ get queryAddress(): string;
7
+ divine(payloads?: Payload[]): Promise<Payload[]>;
8
+ private buildAddressChains;
9
+ private buildWrapperRecords;
10
+ }
11
+ //# sourceMappingURL=Diviner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Diviner.d.ts","sourceRoot":"","sources":["../../src/Diviner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAK/D,OAAO,EAAqC,2BAA2B,EAAE,MAAM,4CAA4C,CAAA;AAC3H,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAMpD,qBAAa,qBAAqB,CAAC,OAAO,SAAS,2BAA2B,GAAG,2BAA2B,CAAE,SAAQ,eAAe,CAAC,OAAO,CAAC;IAC5I,OAAgB,YAAY,+CAAoC;IAEhE,IAAI,YAAY,WAEf;IAEK,MAAM,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAsBtD,OAAO,CAAC,kBAAkB;IAsB1B,OAAO,CAAC,mBAAmB;CAS5B"}
@@ -0,0 +1,3 @@
1
+ export * from './Diviner';
2
+ export * from '@xyo-network/diviner-address-history-model';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA;AACzB,cAAc,4CAA4C,CAAA"}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@xyo-network/diviner-address-history",
3
+ "author": {
4
+ "email": "support@xyo.network",
5
+ "name": "XYO Development Team",
6
+ "url": "https://xyo.network"
7
+ },
8
+ "bugs": {
9
+ "email": "support@xyo.network",
10
+ "url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js/issues"
11
+ },
12
+ "dependencies": {
13
+ "@xyo-network/diviner-address-history-model": "^2.56.0"
14
+ },
15
+ "devDependencies": {
16
+ "@xylabs/ts-scripts-yarn3": "^2.16.5",
17
+ "@xylabs/tsconfig": "^2.16.5",
18
+ "typescript": "^4.9.5"
19
+ },
20
+ "description": "Primary SDK for using XYO Protocol 2.0",
21
+ "browser": "dist/esm/index.js",
22
+ "docs": "dist/docs.json",
23
+ "exports": {
24
+ ".": {
25
+ "node": {
26
+ "import": "./dist/esm/index.js",
27
+ "require": "./dist/cjs/index.js"
28
+ },
29
+ "browser": {
30
+ "import": "./dist/esm/index.js",
31
+ "require": "./dist/cjs/index.js"
32
+ },
33
+ "default": "./dist/esm/index.js"
34
+ },
35
+ "./dist/docs.json": {
36
+ "default": "./dist/docs.json"
37
+ },
38
+ "./package.json": "./package.json"
39
+ },
40
+ "main": "dist/cjs/index.js",
41
+ "module": "dist/esm/index.js",
42
+ "homepage": "https://xyo.network",
43
+ "license": "LGPL-3.0",
44
+ "publishConfig": {
45
+ "access": "public"
46
+ },
47
+ "repository": {
48
+ "type": "git",
49
+ "url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js.git"
50
+ },
51
+ "sideEffects": false,
52
+ "types": "dist/types/index.d.ts",
53
+ "version": "2.56.0"
54
+ }
package/src/Diviner.ts ADDED
@@ -0,0 +1,74 @@
1
+ import { assertEx } from '@xylabs/assert'
2
+ import { AbstractDiviner } from '@xyo-network/abstract-diviner'
3
+ import { ArchivistGetQuerySchema } from '@xyo-network/archivist-model'
4
+ import { ArchivistWrapper } from '@xyo-network/archivist-wrapper'
5
+ import { BoundWitness, BoundWitnessSchema } from '@xyo-network/boundwitness-model'
6
+ import { BoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'
7
+ import { AddressHistoryDivinerConfigSchema, AddressHistoryDivinerParams } from '@xyo-network/diviner-address-history-model'
8
+ import { Payload } from '@xyo-network/payload-model'
9
+ import { PayloadWrapper } from '@xyo-network/payload-wrapper'
10
+
11
+ // This diviner returns the most recent boundwitness signed by the address that can be found
12
+ // if multiple broken chains are found, all the heads are returned
13
+
14
+ export class AddressHistoryDiviner<TParams extends AddressHistoryDivinerParams = AddressHistoryDivinerParams> extends AbstractDiviner<TParams> {
15
+ static override configSchema = AddressHistoryDivinerConfigSchema
16
+
17
+ get queryAddress() {
18
+ return assertEx(this.config.address, 'Missing address')
19
+ }
20
+
21
+ async divine(payloads?: Payload[]): Promise<Payload[]> {
22
+ assertEx(!payloads?.length, 'MemoryAddressHistoryDiviner.divine does not allow payloads to be sent')
23
+ const archivists =
24
+ (await this.resolve({ query: [[ArchivistGetQuerySchema]] }))?.map((archivist) => ArchivistWrapper.wrap(archivist, this.account)) ?? []
25
+ assertEx(archivists.length > 0, 'Did not find any archivists')
26
+ const bwLists = (
27
+ await Promise.all(
28
+ archivists.map(async (archivist) => {
29
+ const all = await archivist.all()
30
+ return all.filter((payload) => payload.schema === BoundWitnessSchema) as BoundWitness[]
31
+ }),
32
+ )
33
+ ).flat()
34
+
35
+ const bwRecords = this.buildWrapperRecords(bwLists)
36
+
37
+ const chains = Object.values(this.buildAddressChains(this.queryAddress, bwRecords))
38
+
39
+ //return the heads of each chain (get the last bw on each chain)
40
+ return chains.map((chain) => assertEx(PayloadWrapper.unwrap(chain.shift())))
41
+ }
42
+
43
+ private buildAddressChains(address: string, bwRecords: Record<string, BoundWitnessWrapper>): Record<string, BoundWitnessWrapper[]> {
44
+ const arrayedResult = Object.entries(bwRecords).reduce<Record<string, BoundWitnessWrapper[]>>((prev, [key, value]) => {
45
+ prev[key] = [value]
46
+ return prev
47
+ }, {})
48
+ return Object.entries(bwRecords).reduce<Record<string, BoundWitnessWrapper[]>>((prev, [key, value]) => {
49
+ //check if key is still there (may have been deleted as prevHash)
50
+ if (prev[key]) {
51
+ const previousHash = value.prev(address)
52
+ if (previousHash) {
53
+ //if we have the previousHash, move this bw to its chain
54
+ if (prev[previousHash]) {
55
+ prev[key].push(...prev[previousHash])
56
+ delete prev[previousHash]
57
+ }
58
+ }
59
+ }
60
+ return prev
61
+ }, arrayedResult)
62
+ }
63
+
64
+ //build object with hashes as keys and wrappers as values
65
+ private buildWrapperRecords(lists: BoundWitness[]) {
66
+ return lists
67
+ .filter((bw) => bw.addresses.includes(this.queryAddress))
68
+ .reduce<Record<string, BoundWitnessWrapper>>((bwRecords, bw) => {
69
+ const wrapper = new BoundWitnessWrapper(bw)
70
+ bwRecords[wrapper.hash] = wrapper
71
+ return bwRecords
72
+ }, {})
73
+ }
74
+ }
package/src/index.ts ADDED
@@ -0,0 +1,2 @@
1
+ export * from './Diviner'
2
+ export * from '@xyo-network/diviner-address-history-model'