@subsquid/solana-stream 0.1.4 → 0.2.0-portal-api.889aff
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/lib/archive/portal.d.ts +15 -0
- package/lib/archive/portal.d.ts.map +1 -0
- package/lib/archive/portal.js +117 -0
- package/lib/archive/portal.js.map +1 -0
- package/lib/archive/source.d.ts.map +1 -1
- package/lib/archive/source.js +7 -0
- package/lib/archive/source.js.map +1 -1
- package/lib/source.d.ts +9 -0
- package/lib/source.d.ts.map +1 -1
- package/lib/source.js +48 -18
- package/lib/source.js.map +1 -1
- package/package.json +5 -4
- package/src/archive/portal.ts +128 -0
- package/src/archive/source.ts +7 -0
- package/src/source.ts +67 -21
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { BlockHeader } from '@subsquid/solana-normalization';
|
|
2
|
+
import { Base58Bytes } from '@subsquid/solana-rpc-data';
|
|
3
|
+
import { RangeRequestList } from '@subsquid/util-internal-range';
|
|
4
|
+
import { PartialBlock } from '../data/partial';
|
|
5
|
+
import { DataRequest } from '../data/request';
|
|
6
|
+
import { PortalClient } from '@subsquid/portal-client';
|
|
7
|
+
export declare class SolanaPortal {
|
|
8
|
+
private client;
|
|
9
|
+
constructor(client: PortalClient);
|
|
10
|
+
getFinalizedHeight(): Promise<number>;
|
|
11
|
+
getBlockHash(height: number): Promise<Base58Bytes | undefined>;
|
|
12
|
+
getBlockHeader(height: number): Promise<BlockHeader>;
|
|
13
|
+
getBlockStream(requests: RangeRequestList<DataRequest>, stopOnHead?: boolean | undefined): AsyncIterable<PartialBlock[]>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=portal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portal.d.ts","sourceRoot":"","sources":["../../src/archive/portal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,gCAAgC,CAAA;AAC1D,OAAO,EAAC,WAAW,EAAC,MAAM,2BAA2B,CAAA;AAErD,OAAO,EAAsB,gBAAgB,EAAC,MAAM,+BAA+B,CAAA;AAGnF,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAC,WAAW,EAAC,MAAM,iBAAiB,CAAA;AAE3C,OAAO,EAAC,YAAY,EAAC,MAAM,yBAAyB,CAAA;AAEpD,qBAAa,YAAY;IACT,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,YAAY;IAExC,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC;IAI/B,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAgB9D,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAyBnD,cAAc,CACjB,QAAQ,EAAE,gBAAgB,CAAC,WAAW,CAAC,EACvC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,GACjC,aAAa,CAAC,YAAY,EAAE,CAAC;CAiEnC"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SolanaPortal = void 0;
|
|
7
|
+
const util_internal_1 = require("@subsquid/util-internal");
|
|
8
|
+
const util_internal_range_1 = require("@subsquid/util-internal-range");
|
|
9
|
+
const util_internal_validation_1 = require("@subsquid/util-internal-validation");
|
|
10
|
+
const assert_1 = __importDefault(require("assert"));
|
|
11
|
+
const schema_1 = require("./schema");
|
|
12
|
+
class SolanaPortal {
|
|
13
|
+
constructor(client) {
|
|
14
|
+
this.client = client;
|
|
15
|
+
}
|
|
16
|
+
getFinalizedHeight() {
|
|
17
|
+
return this.client.getFinalizedHeight();
|
|
18
|
+
}
|
|
19
|
+
async getBlockHash(height) {
|
|
20
|
+
let blocks = await this.client.getFinalizedQuery({
|
|
21
|
+
type: 'solana',
|
|
22
|
+
fromBlock: height,
|
|
23
|
+
toBlock: height,
|
|
24
|
+
fields: {
|
|
25
|
+
block: {
|
|
26
|
+
hash: true,
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
includeAllBlocks: true,
|
|
30
|
+
});
|
|
31
|
+
(0, assert_1.default)(blocks.length == 1);
|
|
32
|
+
return blocks[0].header.hash;
|
|
33
|
+
}
|
|
34
|
+
async getBlockHeader(height) {
|
|
35
|
+
let blocks = await this.client.getFinalizedQuery({
|
|
36
|
+
type: 'solana',
|
|
37
|
+
fromBlock: height,
|
|
38
|
+
toBlock: height,
|
|
39
|
+
includeAllBlocks: true,
|
|
40
|
+
fields: {
|
|
41
|
+
block: {
|
|
42
|
+
hash: true,
|
|
43
|
+
number: true,
|
|
44
|
+
slot: true,
|
|
45
|
+
parentSlot: true,
|
|
46
|
+
parentHash: true,
|
|
47
|
+
timestamp: true,
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
(0, assert_1.default)(blocks.length == 1);
|
|
52
|
+
let { number, ...rest } = blocks[0].header;
|
|
53
|
+
return {
|
|
54
|
+
height: number,
|
|
55
|
+
...rest,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
async *getBlockStream(requests, stopOnHead) {
|
|
59
|
+
let archiveRequests = (0, util_internal_range_1.mapRangeRequestList)(requests, (req) => {
|
|
60
|
+
let { fields, includeAllBlocks, ...items } = req;
|
|
61
|
+
let archiveItems = {};
|
|
62
|
+
let key;
|
|
63
|
+
for (key in items) {
|
|
64
|
+
archiveItems[key] = items[key]?.map((it) => ({ ...it.where, ...it.include }));
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
type: 'solana',
|
|
68
|
+
fields: {
|
|
69
|
+
block: { ...fields?.block, number: true, hash: true, parentHash: true },
|
|
70
|
+
transaction: { ...fields?.transaction, transactionIndex: true },
|
|
71
|
+
instruction: { ...fields?.instruction, transactionIndex: true, instructionAddress: true },
|
|
72
|
+
log: { ...fields?.log, instructionAddress: true, logIndex: true, transactionIndex: true },
|
|
73
|
+
balance: { ...fields?.balance, transactionIndex: true, account: true },
|
|
74
|
+
tokenBalance: { ...fields?.tokenBalance, transactionIndex: true, account: true },
|
|
75
|
+
reward: { ...fields?.reward, pubkey: true },
|
|
76
|
+
},
|
|
77
|
+
includeAllBlocks,
|
|
78
|
+
...archiveItems,
|
|
79
|
+
};
|
|
80
|
+
});
|
|
81
|
+
for (let req of archiveRequests) {
|
|
82
|
+
let lastBlock = req.range.from - 1;
|
|
83
|
+
let endBlock = req.range.to || Infinity;
|
|
84
|
+
let query = {
|
|
85
|
+
fromBlock: lastBlock + 1,
|
|
86
|
+
toBlock: endBlock,
|
|
87
|
+
...req.request,
|
|
88
|
+
};
|
|
89
|
+
for await (let { blocks: batch } of this.client.getFinalizedStream(query, { stopOnHead })) {
|
|
90
|
+
(0, assert_1.default)(batch.length > 0, 'boundary blocks are expected to be included');
|
|
91
|
+
lastBlock = (0, util_internal_1.last)(batch).header.number;
|
|
92
|
+
let blocks = (0, util_internal_validation_1.cast)((0, util_internal_validation_1.array)((0, schema_1.getDataSchema)((0, util_internal_1.assertNotNull)(req?.request.fields))), batch).map((b) => {
|
|
93
|
+
let { header: { number, ...hdr }, ...items } = b;
|
|
94
|
+
return {
|
|
95
|
+
header: { height: number, ...hdr },
|
|
96
|
+
transactions: items.transactions || [],
|
|
97
|
+
instructions: items.instructions || [],
|
|
98
|
+
logs: items.logs || [],
|
|
99
|
+
balances: items.balances || [],
|
|
100
|
+
tokenBalances: items.tokenBalances || [],
|
|
101
|
+
rewards: items.rewards || [],
|
|
102
|
+
};
|
|
103
|
+
});
|
|
104
|
+
yield blocks;
|
|
105
|
+
}
|
|
106
|
+
// stream ended before requested range,
|
|
107
|
+
// which means we reached the last available block
|
|
108
|
+
// should not happen if stopOnHead is set to false
|
|
109
|
+
if (lastBlock < endBlock) {
|
|
110
|
+
(0, assert_1.default)(stopOnHead, 'unexpected end of stream');
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
exports.SolanaPortal = SolanaPortal;
|
|
117
|
+
//# sourceMappingURL=portal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portal.js","sourceRoot":"","sources":["../../src/archive/portal.ts"],"names":[],"mappings":";;;;;;AAEA,2DAA2D;AAC3D,uEAAmF;AACnF,iFAA8D;AAC9D,oDAA2B;AAG3B,qCAAsC;AAGtC,MAAa,YAAY;IACrB,YAAoB,MAAoB;QAApB,WAAM,GAAN,MAAM,CAAc;IAAG,CAAC;IAE5C,kBAAkB;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAA;IAC3C,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAc;QAC7B,IAAI,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC;YAC7C,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,MAAM;YACjB,OAAO,EAAE,MAAM;YACf,MAAM,EAAE;gBACJ,KAAK,EAAE;oBACH,IAAI,EAAE,IAAI;iBACb;aACJ;YACD,gBAAgB,EAAE,IAAI;SACzB,CAAC,CAAA;QACF,IAAA,gBAAM,EAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAA;QAC1B,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAA;IAChC,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAc;QAC/B,IAAI,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC;YAC7C,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,MAAM;YACjB,OAAO,EAAE,MAAM;YACf,gBAAgB,EAAE,IAAI;YACtB,MAAM,EAAE;gBACJ,KAAK,EAAE;oBACH,IAAI,EAAE,IAAI;oBACV,MAAM,EAAE,IAAI;oBACZ,IAAI,EAAE,IAAI;oBACV,UAAU,EAAE,IAAI;oBAChB,UAAU,EAAE,IAAI;oBAChB,SAAS,EAAE,IAAI;iBAClB;aACJ;SACJ,CAAC,CAAA;QACF,IAAA,gBAAM,EAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAA;QAC1B,IAAI,EAAC,MAAM,EAAE,GAAG,IAAI,EAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;QACxC,OAAO;YACH,MAAM,EAAE,MAAM;YACd,GAAG,IAAI;SACK,CAAA;IACpB,CAAC;IAED,KAAK,CAAC,CAAC,cAAc,CACjB,QAAuC,EACvC,UAAgC;QAEhC,IAAI,eAAe,GAAG,IAAA,yCAAmB,EAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;YACxD,IAAI,EAAC,MAAM,EAAE,gBAAgB,EAAE,GAAG,KAAK,EAAC,GAAG,GAAG,CAAA;YAC9C,IAAI,YAAY,GAAwB,EAAE,CAAA;YAC1C,IAAI,GAAuB,CAAA;YAC3B,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;gBAChB,YAAY,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAC,GAAG,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,EAAC,CAAC,CAAC,CAAA;YAC/E,CAAC;YACD,OAAO;gBACH,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE;oBACJ,KAAK,EAAE,EAAC,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAC;oBACrE,WAAW,EAAE,EAAC,GAAG,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,IAAI,EAAC;oBAC7D,WAAW,EAAE,EAAC,GAAG,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAC;oBACvF,GAAG,EAAE,EAAC,GAAG,MAAM,EAAE,GAAG,EAAE,kBAAkB,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAC;oBACvF,OAAO,EAAE,EAAC,GAAG,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAC;oBACpE,YAAY,EAAE,EAAC,GAAG,MAAM,EAAE,YAAY,EAAE,gBAAgB,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAC;oBAC9E,MAAM,EAAE,EAAC,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAC;iBAC5C;gBACD,gBAAgB;gBAChB,GAAG,YAAY;aAClB,CAAA;QACL,CAAC,CAAC,CAAA;QAEF,KAAK,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;YAC9B,IAAI,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAA;YAClC,IAAI,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,QAAQ,CAAA;YACvC,IAAI,KAAK,GAAG;gBACR,SAAS,EAAE,SAAS,GAAG,CAAC;gBACxB,OAAO,EAAE,QAAQ;gBACjB,GAAG,GAAG,CAAC,OAAO;aACjB,CAAA;YAED,IAAI,KAAK,EAAE,IAAI,EAAC,MAAM,EAAE,KAAK,EAAC,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,KAAK,EAAE,EAAC,UAAU,EAAC,CAAC,EAAE,CAAC;gBACpF,IAAA,gBAAM,EAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,6CAA6C,CAAC,CAAA;gBACvE,SAAS,GAAG,IAAA,oBAAI,EAAC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAA;gBAErC,IAAI,MAAM,GAAG,IAAA,+BAAI,EAAC,IAAA,gCAAK,EAAC,IAAA,sBAAa,EAAC,IAAA,6BAAa,EAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;oBACzF,IAAI,EACA,MAAM,EAAE,EAAC,MAAM,EAAE,GAAG,GAAG,EAAC,EACxB,GAAG,KAAK,EACX,GAAG,CAAC,CAAA;oBACL,OAAO;wBACH,MAAM,EAAE,EAAC,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,EAAC;wBAChC,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,EAAE;wBACtC,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,EAAE;wBACtC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE;wBACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,EAAE;wBAC9B,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,EAAE;wBACxC,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE;qBAC/B,CAAA;gBACL,CAAC,CAAC,CAAA;gBAEF,MAAM,MAAM,CAAA;YAChB,CAAC;YAED,uCAAuC;YACvC,kDAAkD;YAClD,kDAAkD;YAClD,IAAI,SAAS,GAAG,QAAQ,EAAE,CAAC;gBACvB,IAAA,gBAAM,EAAC,UAAU,EAAE,0BAA0B,CAAC,CAAA;gBAC9C,MAAK;YACT,CAAC;QACL,CAAC;IACL,CAAC;CACJ;AApHD,oCAoHC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../src/archive/source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,gCAAgC,CAAA;AAC1D,OAAO,EAAC,WAAW,EAAC,MAAM,2BAA2B,CAAA;AAErD,OAAO,EAAC,aAAa,EAAC,MAAM,wCAAwC,CAAA;AAEpE,OAAO,EAAoC,gBAAgB,EAAC,MAAM,+BAA+B,CAAA;AAGjG,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAC,WAAW,EAAC,MAAM,iBAAiB,CAAA;AAI3C,qBAAa,aAAa;IACV,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,aAAa;IAEzC,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC;IAI/B,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../src/archive/source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,gCAAgC,CAAA;AAC1D,OAAO,EAAC,WAAW,EAAC,MAAM,2BAA2B,CAAA;AAErD,OAAO,EAAC,aAAa,EAAC,MAAM,wCAAwC,CAAA;AAEpE,OAAO,EAAoC,gBAAgB,EAAC,MAAM,+BAA+B,CAAA;AAGjG,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAC,WAAW,EAAC,MAAM,iBAAiB,CAAA;AAI3C,qBAAa,aAAa;IACV,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,aAAa;IAEzC,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC;IAI/B,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAgB9D,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAyBnD,cAAc,CAAC,QAAQ,EAAE,gBAAgB,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,aAAa,CAAC,YAAY,EAAE,CAAC;CAkDlI"}
|
package/lib/archive/source.js
CHANGED
|
@@ -22,6 +22,11 @@ class SolanaArchive {
|
|
|
22
22
|
type: 'solana',
|
|
23
23
|
fromBlock: height,
|
|
24
24
|
toBlock: height,
|
|
25
|
+
fields: {
|
|
26
|
+
block: {
|
|
27
|
+
hash: true,
|
|
28
|
+
}
|
|
29
|
+
},
|
|
25
30
|
includeAllBlocks: true
|
|
26
31
|
});
|
|
27
32
|
(0, assert_1.default)(blocks.length == 1);
|
|
@@ -35,6 +40,8 @@ class SolanaArchive {
|
|
|
35
40
|
includeAllBlocks: true,
|
|
36
41
|
fields: {
|
|
37
42
|
block: {
|
|
43
|
+
hash: true,
|
|
44
|
+
number: true,
|
|
38
45
|
slot: true,
|
|
39
46
|
parentSlot: true,
|
|
40
47
|
parentHash: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source.js","sourceRoot":"","sources":["../../src/archive/source.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"source.js","sourceRoot":"","sources":["../../src/archive/source.ts"],"names":[],"mappings":"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"}
|
package/lib/source.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { FiniteRange, Range } from '@subsquid/util-internal-range';
|
|
|
3
3
|
import { Block, FieldSelection } from './data/model';
|
|
4
4
|
import { BalanceRequest, InstructionRequest, LogRequest, RewardRequest, TokenBalanceRequest, TransactionRequest } from './data/request';
|
|
5
5
|
import { SolanaRpcClient } from './rpc/client';
|
|
6
|
+
import { PortalClientOptions } from '@subsquid/portal-client';
|
|
6
7
|
export interface GatewaySettings {
|
|
7
8
|
/**
|
|
8
9
|
* Subsquid Network Gateway url
|
|
@@ -13,6 +14,13 @@ export interface GatewaySettings {
|
|
|
13
14
|
*/
|
|
14
15
|
requestTimeout?: number;
|
|
15
16
|
}
|
|
17
|
+
export interface PortalSettings extends Omit<PortalClientOptions, 'http'> {
|
|
18
|
+
/**
|
|
19
|
+
* Request timeout in ms
|
|
20
|
+
*/
|
|
21
|
+
requestTimeout?: number;
|
|
22
|
+
retryAttempts?: number;
|
|
23
|
+
}
|
|
16
24
|
export interface RpcSettings {
|
|
17
25
|
/**
|
|
18
26
|
* RPC client
|
|
@@ -64,6 +72,7 @@ export declare class DataSourceBuilder<F extends FieldSelection = {}> {
|
|
|
64
72
|
* source.setGateway('https://v2.archive.subsquid.io/network/solana-mainnet')
|
|
65
73
|
*/
|
|
66
74
|
setGateway(url: string | GatewaySettings): this;
|
|
75
|
+
setPortal(url: string | PortalSettings): this;
|
|
67
76
|
/**
|
|
68
77
|
* Set up RPC data ingestion
|
|
69
78
|
*/
|
package/lib/source.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../src/source.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,WAAW,EAAC,MAAM,2BAA2B,CAAA;AAIrD,OAAO,EAEH,WAAW,EAGX,KAAK,EAGR,MAAM,+BAA+B,CAAA;AAItC,OAAO,EAAC,KAAK,EAAe,cAAc,EAAC,MAAM,cAAc,CAAA;AAE/D,OAAO,EACH,cAAc,EAEd,kBAAkB,EAClB,UAAU,EACV,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EACrB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAC,eAAe,EAAC,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../src/source.ts"],"names":[],"mappings":"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"}
|
package/lib/source.js
CHANGED
|
@@ -22,6 +22,8 @@ const assert_1 = __importDefault(require("assert"));
|
|
|
22
22
|
const source_1 = require("./archive/source");
|
|
23
23
|
const fields_1 = require("./data/fields");
|
|
24
24
|
const source_2 = require("./rpc/source");
|
|
25
|
+
const portal_1 = require("./archive/portal");
|
|
26
|
+
const portal_client_1 = require("@subsquid/portal-client");
|
|
25
27
|
class DataSourceBuilder {
|
|
26
28
|
constructor() {
|
|
27
29
|
this.requests = [];
|
|
@@ -36,11 +38,22 @@ class DataSourceBuilder {
|
|
|
36
38
|
* source.setGateway('https://v2.archive.subsquid.io/network/solana-mainnet')
|
|
37
39
|
*/
|
|
38
40
|
setGateway(url) {
|
|
41
|
+
(0, assert_1.default)(this.archive?.type !== 'gateway', '.setGateway() can not be used together with .setPortal()');
|
|
39
42
|
if (typeof url == 'string') {
|
|
40
|
-
this.archive = { url };
|
|
43
|
+
this.archive = { url, type: 'gateway' };
|
|
41
44
|
}
|
|
42
45
|
else {
|
|
43
|
-
this.archive = url;
|
|
46
|
+
this.archive = { ...url, type: 'gateway' };
|
|
47
|
+
}
|
|
48
|
+
return this;
|
|
49
|
+
}
|
|
50
|
+
setPortal(url) {
|
|
51
|
+
(0, assert_1.default)(this.archive?.type !== 'gateway', '.setPortal() can not be used together with .setGateway()');
|
|
52
|
+
if (typeof url == 'string') {
|
|
53
|
+
this.archive = { url, type: 'portal', };
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
this.archive = { ...url, type: 'portal' };
|
|
44
57
|
}
|
|
45
58
|
return this;
|
|
46
59
|
}
|
|
@@ -191,11 +204,11 @@ class SolanaDataSource {
|
|
|
191
204
|
}
|
|
192
205
|
else {
|
|
193
206
|
let archive = this.createArchive();
|
|
194
|
-
let
|
|
195
|
-
if (
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
207
|
+
let hash = await archive.getBlockHash(height);
|
|
208
|
+
if (hash == null && this.rpc) {
|
|
209
|
+
hash = await this.rpc.getBlockHash(height);
|
|
210
|
+
}
|
|
211
|
+
return hash;
|
|
199
212
|
}
|
|
200
213
|
}
|
|
201
214
|
async assertConsistency() {
|
|
@@ -255,17 +268,34 @@ class SolanaDataSource {
|
|
|
255
268
|
}
|
|
256
269
|
createArchive(agent) {
|
|
257
270
|
(0, assert_1.default)(this.archiveSettings);
|
|
258
|
-
let
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
271
|
+
let headers = {
|
|
272
|
+
'x-squid-id': this.getSquidId(),
|
|
273
|
+
};
|
|
274
|
+
return this.archiveSettings.type === 'gateway'
|
|
275
|
+
? new source_1.SolanaArchive(new util_internal_archive_client_1.ArchiveClient({
|
|
276
|
+
http: new http_client_1.HttpClient({
|
|
277
|
+
headers: {
|
|
278
|
+
'x-squid-id': this.getSquidId(),
|
|
279
|
+
},
|
|
280
|
+
agent,
|
|
281
|
+
}),
|
|
282
|
+
url: this.archiveSettings.url,
|
|
283
|
+
queryTimeout: this.archiveSettings.requestTimeout,
|
|
284
|
+
}))
|
|
285
|
+
: new portal_1.SolanaPortal(new portal_client_1.PortalClient({
|
|
286
|
+
http: new http_client_1.HttpClient({
|
|
287
|
+
headers,
|
|
288
|
+
agent,
|
|
289
|
+
httpTimeout: this.archiveSettings.requestTimeout,
|
|
290
|
+
retryAttempts: this.archiveSettings.retryAttempts ?? Infinity,
|
|
291
|
+
}),
|
|
292
|
+
url: this.archiveSettings.url,
|
|
293
|
+
minBytes: this.archiveSettings.minBytes,
|
|
294
|
+
maxIdleTime: this.archiveSettings.maxIdleTime,
|
|
295
|
+
maxBytes: this.archiveSettings.maxBytes,
|
|
296
|
+
maxWaitTime: this.archiveSettings.maxWaitTime,
|
|
297
|
+
headPollInterval: this.archiveSettings.headPollInterval,
|
|
298
|
+
}));
|
|
269
299
|
}
|
|
270
300
|
getSquidId() {
|
|
271
301
|
return (0, util_internal_processor_tools_1.getOrGenerateSquidId)();
|
package/lib/source.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source.js","sourceRoot":"","sources":["../src/source.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,uDAA2D;AAG3D,2DAAkE;AAClE,yFAAoE;AACpE,2FAA4E;AAC5E,uEAQsC;AACtC,oDAA2B;AAC3B,6CAA8C;AAC9C,0CAAuC;AAavC,yCAA0C;
|
|
1
|
+
{"version":3,"file":"source.js","sourceRoot":"","sources":["../src/source.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@subsquid/solana-stream",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0-portal-api.889aff",
|
|
4
4
|
"description": "Solana block data streamer",
|
|
5
5
|
"license": "GPL-3.0-or-later",
|
|
6
6
|
"repository": "git@github.com:subsquid/squid.git",
|
|
@@ -14,9 +14,9 @@
|
|
|
14
14
|
"main": "lib/index.js",
|
|
15
15
|
"dependencies": {
|
|
16
16
|
"@subsquid/http-client": "^1.6.0",
|
|
17
|
-
"@subsquid/logger": "^1.
|
|
17
|
+
"@subsquid/logger": "^1.3.3",
|
|
18
18
|
"@subsquid/rpc-client": "^4.11.0",
|
|
19
|
-
"@subsquid/solana-normalization": "^0.0.
|
|
19
|
+
"@subsquid/solana-normalization": "^0.0.3",
|
|
20
20
|
"@subsquid/solana-rpc": "^0.0.4",
|
|
21
21
|
"@subsquid/solana-rpc-data": "^0.0.3",
|
|
22
22
|
"@subsquid/util-internal": "^3.2.0",
|
|
@@ -26,7 +26,8 @@
|
|
|
26
26
|
"@subsquid/util-internal-processor-tools": "^4.2.1",
|
|
27
27
|
"@subsquid/util-internal-range": "^0.3.0",
|
|
28
28
|
"@subsquid/util-internal-validation": "^0.7.0",
|
|
29
|
-
"bs58": "^5.0.0"
|
|
29
|
+
"bs58": "^5.0.0",
|
|
30
|
+
"@subsquid/portal-client": "0.0.1-portal-api.889aff"
|
|
30
31
|
},
|
|
31
32
|
"devDependencies": {
|
|
32
33
|
"@types/node": "^18.18.14",
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import {BlockHeader} from '@subsquid/solana-normalization'
|
|
2
|
+
import {Base58Bytes} from '@subsquid/solana-rpc-data'
|
|
3
|
+
import {assertNotNull, last} from '@subsquid/util-internal'
|
|
4
|
+
import {mapRangeRequestList, RangeRequestList} from '@subsquid/util-internal-range'
|
|
5
|
+
import {array, cast} from '@subsquid/util-internal-validation'
|
|
6
|
+
import assert from 'assert'
|
|
7
|
+
import {PartialBlock} from '../data/partial'
|
|
8
|
+
import {DataRequest} from '../data/request'
|
|
9
|
+
import {getDataSchema} from './schema'
|
|
10
|
+
import {PortalClient} from '@subsquid/portal-client'
|
|
11
|
+
|
|
12
|
+
export class SolanaPortal {
|
|
13
|
+
constructor(private client: PortalClient) {}
|
|
14
|
+
|
|
15
|
+
getFinalizedHeight(): Promise<number> {
|
|
16
|
+
return this.client.getFinalizedHeight()
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
async getBlockHash(height: number): Promise<Base58Bytes | undefined> {
|
|
20
|
+
let blocks = await this.client.getFinalizedQuery({
|
|
21
|
+
type: 'solana',
|
|
22
|
+
fromBlock: height,
|
|
23
|
+
toBlock: height,
|
|
24
|
+
fields: {
|
|
25
|
+
block: {
|
|
26
|
+
hash: true,
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
includeAllBlocks: true,
|
|
30
|
+
})
|
|
31
|
+
assert(blocks.length == 1)
|
|
32
|
+
return blocks[0].header.hash
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
async getBlockHeader(height: number): Promise<BlockHeader> {
|
|
36
|
+
let blocks = await this.client.getFinalizedQuery({
|
|
37
|
+
type: 'solana',
|
|
38
|
+
fromBlock: height,
|
|
39
|
+
toBlock: height,
|
|
40
|
+
includeAllBlocks: true,
|
|
41
|
+
fields: {
|
|
42
|
+
block: {
|
|
43
|
+
hash: true,
|
|
44
|
+
number: true,
|
|
45
|
+
slot: true,
|
|
46
|
+
parentSlot: true,
|
|
47
|
+
parentHash: true,
|
|
48
|
+
timestamp: true,
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
})
|
|
52
|
+
assert(blocks.length == 1)
|
|
53
|
+
let {number, ...rest} = blocks[0].header
|
|
54
|
+
return {
|
|
55
|
+
height: number,
|
|
56
|
+
...rest,
|
|
57
|
+
} as BlockHeader
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
async *getBlockStream(
|
|
61
|
+
requests: RangeRequestList<DataRequest>,
|
|
62
|
+
stopOnHead?: boolean | undefined
|
|
63
|
+
): AsyncIterable<PartialBlock[]> {
|
|
64
|
+
let archiveRequests = mapRangeRequestList(requests, (req) => {
|
|
65
|
+
let {fields, includeAllBlocks, ...items} = req
|
|
66
|
+
let archiveItems: Record<string, any> = {}
|
|
67
|
+
let key: keyof typeof items
|
|
68
|
+
for (key in items) {
|
|
69
|
+
archiveItems[key] = items[key]?.map((it) => ({...it.where, ...it.include}))
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
type: 'solana',
|
|
73
|
+
fields: {
|
|
74
|
+
block: {...fields?.block, number: true, hash: true, parentHash: true},
|
|
75
|
+
transaction: {...fields?.transaction, transactionIndex: true},
|
|
76
|
+
instruction: {...fields?.instruction, transactionIndex: true, instructionAddress: true},
|
|
77
|
+
log: {...fields?.log, instructionAddress: true, logIndex: true, transactionIndex: true},
|
|
78
|
+
balance: {...fields?.balance, transactionIndex: true, account: true},
|
|
79
|
+
tokenBalance: {...fields?.tokenBalance, transactionIndex: true, account: true},
|
|
80
|
+
reward: {...fields?.reward, pubkey: true},
|
|
81
|
+
},
|
|
82
|
+
includeAllBlocks,
|
|
83
|
+
...archiveItems,
|
|
84
|
+
}
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
for (let req of archiveRequests) {
|
|
88
|
+
let lastBlock = req.range.from - 1
|
|
89
|
+
let endBlock = req.range.to || Infinity
|
|
90
|
+
let query = {
|
|
91
|
+
fromBlock: lastBlock + 1,
|
|
92
|
+
toBlock: endBlock,
|
|
93
|
+
...req.request,
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
for await (let {blocks: batch} of this.client.getFinalizedStream(query, {stopOnHead})) {
|
|
97
|
+
assert(batch.length > 0, 'boundary blocks are expected to be included')
|
|
98
|
+
lastBlock = last(batch).header.number
|
|
99
|
+
|
|
100
|
+
let blocks = cast(array(getDataSchema(assertNotNull(req?.request.fields))), batch).map((b) => {
|
|
101
|
+
let {
|
|
102
|
+
header: {number, ...hdr},
|
|
103
|
+
...items
|
|
104
|
+
} = b
|
|
105
|
+
return {
|
|
106
|
+
header: {height: number, ...hdr},
|
|
107
|
+
transactions: items.transactions || [],
|
|
108
|
+
instructions: items.instructions || [],
|
|
109
|
+
logs: items.logs || [],
|
|
110
|
+
balances: items.balances || [],
|
|
111
|
+
tokenBalances: items.tokenBalances || [],
|
|
112
|
+
rewards: items.rewards || [],
|
|
113
|
+
}
|
|
114
|
+
})
|
|
115
|
+
|
|
116
|
+
yield blocks
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// stream ended before requested range,
|
|
120
|
+
// which means we reached the last available block
|
|
121
|
+
// should not happen if stopOnHead is set to false
|
|
122
|
+
if (lastBlock < endBlock) {
|
|
123
|
+
assert(stopOnHead, 'unexpected end of stream')
|
|
124
|
+
break
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
package/src/archive/source.ts
CHANGED
|
@@ -23,6 +23,11 @@ export class SolanaArchive {
|
|
|
23
23
|
type: 'solana',
|
|
24
24
|
fromBlock: height,
|
|
25
25
|
toBlock: height,
|
|
26
|
+
fields: {
|
|
27
|
+
block: {
|
|
28
|
+
hash: true,
|
|
29
|
+
}
|
|
30
|
+
},
|
|
26
31
|
includeAllBlocks: true
|
|
27
32
|
})
|
|
28
33
|
assert(blocks.length == 1)
|
|
@@ -37,6 +42,8 @@ export class SolanaArchive {
|
|
|
37
42
|
includeAllBlocks: true,
|
|
38
43
|
fields: {
|
|
39
44
|
block: {
|
|
45
|
+
hash: true,
|
|
46
|
+
number: true,
|
|
40
47
|
slot: true,
|
|
41
48
|
parentSlot: true,
|
|
42
49
|
parentHash: true,
|
package/src/source.ts
CHANGED
|
@@ -29,6 +29,8 @@ import {
|
|
|
29
29
|
} from './data/request'
|
|
30
30
|
import {SolanaRpcClient} from './rpc/client'
|
|
31
31
|
import {RpcDataSource} from './rpc/source'
|
|
32
|
+
import {SolanaPortal} from './archive/portal'
|
|
33
|
+
import {PortalClient, PortalClientOptions} from '@subsquid/portal-client'
|
|
32
34
|
|
|
33
35
|
|
|
34
36
|
export interface GatewaySettings {
|
|
@@ -43,6 +45,16 @@ export interface GatewaySettings {
|
|
|
43
45
|
}
|
|
44
46
|
|
|
45
47
|
|
|
48
|
+
export interface PortalSettings extends Omit<PortalClientOptions, 'http'> {
|
|
49
|
+
/**
|
|
50
|
+
* Request timeout in ms
|
|
51
|
+
*/
|
|
52
|
+
requestTimeout?: number
|
|
53
|
+
|
|
54
|
+
retryAttempts?: number
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
|
|
46
58
|
export interface RpcSettings {
|
|
47
59
|
/**
|
|
48
60
|
* RPC client
|
|
@@ -86,7 +98,7 @@ export class DataSourceBuilder<F extends FieldSelection = {}> {
|
|
|
86
98
|
private requests: RangeRequest<DataRequest>[] = []
|
|
87
99
|
private fields?: FieldSelection
|
|
88
100
|
private blockRange?: Range
|
|
89
|
-
private archive?: GatewaySettings
|
|
101
|
+
private archive?: GatewaySettings & {type: 'gateway'} | PortalSettings & {type: 'portal'}
|
|
90
102
|
private rpc?: RpcSettings
|
|
91
103
|
|
|
92
104
|
/**
|
|
@@ -99,14 +111,27 @@ export class DataSourceBuilder<F extends FieldSelection = {}> {
|
|
|
99
111
|
* source.setGateway('https://v2.archive.subsquid.io/network/solana-mainnet')
|
|
100
112
|
*/
|
|
101
113
|
setGateway(url: string | GatewaySettings): this {
|
|
114
|
+
assert(this.archive?.type !== 'gateway', '.setGateway() can not be used together with .setPortal()')
|
|
102
115
|
if (typeof url == 'string') {
|
|
103
|
-
this.archive = {url}
|
|
116
|
+
this.archive = {url, type: 'gateway'}
|
|
104
117
|
} else {
|
|
105
|
-
this.archive = url
|
|
118
|
+
this.archive = {...url, type: 'gateway'}
|
|
106
119
|
}
|
|
107
120
|
return this
|
|
108
121
|
}
|
|
109
122
|
|
|
123
|
+
|
|
124
|
+
setPortal(url: string | PortalSettings): this {
|
|
125
|
+
assert(this.archive?.type !== 'gateway', '.setPortal() can not be used together with .setGateway()')
|
|
126
|
+
if (typeof url == 'string') {
|
|
127
|
+
this.archive = {url, type: 'portal', }
|
|
128
|
+
} else {
|
|
129
|
+
this.archive = {...url, type: 'portal'}
|
|
130
|
+
}
|
|
131
|
+
return this
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
|
|
110
135
|
/**
|
|
111
136
|
* Set up RPC data ingestion
|
|
112
137
|
*/
|
|
@@ -267,7 +292,7 @@ class SolanaDataSource implements DataSource<PartialBlock> {
|
|
|
267
292
|
|
|
268
293
|
constructor(
|
|
269
294
|
private requests: RangeRequestList<DataRequest>,
|
|
270
|
-
private archiveSettings?: GatewaySettings,
|
|
295
|
+
private archiveSettings?: GatewaySettings & {type: 'gateway'} | PortalSettings & {type: 'portal'},
|
|
271
296
|
rpcSettings?: RpcSettings
|
|
272
297
|
) {
|
|
273
298
|
assert(this.archiveSettings || rpcSettings, 'either archive or RPC should be provided')
|
|
@@ -292,9 +317,11 @@ class SolanaDataSource implements DataSource<PartialBlock> {
|
|
|
292
317
|
return this.rpc.getBlockHash(height)
|
|
293
318
|
} else {
|
|
294
319
|
let archive = this.createArchive()
|
|
295
|
-
let
|
|
296
|
-
if (
|
|
297
|
-
|
|
320
|
+
let hash = await archive.getBlockHash(height)
|
|
321
|
+
if (hash == null && this.rpc) {
|
|
322
|
+
hash = await this.rpc.getBlockHash(height)
|
|
323
|
+
}
|
|
324
|
+
return hash
|
|
298
325
|
}
|
|
299
326
|
}
|
|
300
327
|
|
|
@@ -366,23 +393,42 @@ class SolanaDataSource implements DataSource<PartialBlock> {
|
|
|
366
393
|
yield* this.rpc.getBlockStream(requests)
|
|
367
394
|
}
|
|
368
395
|
|
|
369
|
-
private createArchive(agent?: HttpAgent): SolanaArchive {
|
|
396
|
+
private createArchive(agent?: HttpAgent): SolanaArchive | SolanaPortal {
|
|
370
397
|
assert(this.archiveSettings)
|
|
371
398
|
|
|
372
|
-
let
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
},
|
|
376
|
-
agent
|
|
377
|
-
})
|
|
399
|
+
let headers = {
|
|
400
|
+
'x-squid-id': this.getSquidId(),
|
|
401
|
+
}
|
|
378
402
|
|
|
379
|
-
return
|
|
380
|
-
new
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
403
|
+
return this.archiveSettings.type === 'gateway'
|
|
404
|
+
? new SolanaArchive(
|
|
405
|
+
new ArchiveClient({
|
|
406
|
+
http: new HttpClient({
|
|
407
|
+
headers: {
|
|
408
|
+
'x-squid-id': this.getSquidId(),
|
|
409
|
+
},
|
|
410
|
+
agent,
|
|
411
|
+
}),
|
|
412
|
+
url: this.archiveSettings.url,
|
|
413
|
+
queryTimeout: this.archiveSettings.requestTimeout,
|
|
414
|
+
})
|
|
415
|
+
)
|
|
416
|
+
: new SolanaPortal(
|
|
417
|
+
new PortalClient({
|
|
418
|
+
http: new HttpClient({
|
|
419
|
+
headers,
|
|
420
|
+
agent,
|
|
421
|
+
httpTimeout: this.archiveSettings.requestTimeout,
|
|
422
|
+
retryAttempts: this.archiveSettings.retryAttempts ?? Infinity,
|
|
423
|
+
}),
|
|
424
|
+
url: this.archiveSettings.url,
|
|
425
|
+
minBytes: this.archiveSettings.minBytes,
|
|
426
|
+
maxIdleTime: this.archiveSettings.maxIdleTime,
|
|
427
|
+
maxBytes: this.archiveSettings.maxBytes,
|
|
428
|
+
maxWaitTime: this.archiveSettings.maxWaitTime,
|
|
429
|
+
headPollInterval: this.archiveSettings.headPollInterval,
|
|
430
|
+
})
|
|
431
|
+
)
|
|
386
432
|
}
|
|
387
433
|
|
|
388
434
|
@def
|