@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.
- package/LICENSE +165 -0
- package/README.md +13 -0
- package/dist/cjs/Diviner.js +68 -0
- package/dist/cjs/Diviner.js.map +1 -0
- package/dist/cjs/index.js +6 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/docs.json +10956 -0
- package/dist/esm/Diviner.js +60 -0
- package/dist/esm/Diviner.js.map +1 -0
- package/dist/esm/index.js +3 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/types/Diviner.d.ts +11 -0
- package/dist/types/Diviner.d.ts.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -0
- package/package.json +54 -0
- package/src/Diviner.ts +74 -0
- package/src/index.ts +2 -0
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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