@subsquid/solana-stream 1.0.0-portal-api.d5861e → 1.0.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/lib/builder.d.ts +92 -0
- package/lib/builder.d.ts.map +1 -0
- package/lib/builder.js +182 -0
- package/lib/builder.js.map +1 -0
- package/lib/data/fields.d.ts.map +1 -1
- package/lib/data/fields.js +0 -14
- package/lib/data/fields.js.map +1 -1
- package/lib/data/model.d.ts +16 -6
- package/lib/data/model.d.ts.map +1 -1
- package/lib/data/model.js +5 -0
- package/lib/data/model.js.map +1 -1
- package/lib/data/request.d.ts +2 -3
- package/lib/data/request.d.ts.map +1 -1
- package/lib/data/type-util.d.ts +35 -13
- package/lib/data/type-util.d.ts.map +1 -1
- package/lib/index.d.ts +3 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +3 -0
- package/lib/index.js.map +1 -1
- package/lib/{merge.test.d.ts.map → portal/merge.test.d.ts.map} +1 -1
- package/lib/{merge.test.js → portal/merge.test.js} +34 -34
- package/lib/portal/merge.test.js.map +1 -0
- package/lib/portal/source.d.ts +14 -11
- package/lib/portal/source.d.ts.map +1 -1
- package/lib/portal/source.js +75 -56
- package/lib/portal/source.js.map +1 -1
- package/lib/query.d.ts +53 -0
- package/lib/query.d.ts.map +1 -0
- package/lib/query.js +102 -0
- package/lib/query.js.map +1 -0
- package/lib/source.d.ts +2 -69
- package/lib/source.d.ts.map +1 -1
- package/lib/source.js +0 -265
- package/lib/source.js.map +1 -1
- package/package.json +18 -16
- package/src/builder.ts +205 -0
- package/src/data/fields.ts +0 -20
- package/src/data/model.ts +23 -27
- package/src/data/request.ts +2 -3
- package/src/data/type-util.ts +39 -37
- package/src/index.ts +3 -0
- package/src/{merge.test.ts → portal/merge.test.ts} +2 -2
- package/src/portal/source.ts +115 -98
- package/src/query.ts +112 -0
- package/src/source.ts +3 -314
- package/lib/merge.test.js.map +0 -1
- package/lib/portal/schema.d.ts +0 -167
- package/lib/portal/schema.d.ts.map +0 -1
- package/lib/portal/schema.js +0 -117
- package/lib/portal/schema.js.map +0 -1
- package/src/portal/schema.ts +0 -136
- /package/lib/{merge.test.d.ts → portal/merge.test.d.ts} +0 -0
package/lib/query.js
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.QueryBuilder = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Builder for a single portal query - a set of item filters that share a block range.
|
|
6
|
+
*
|
|
7
|
+
* Pass a {@link QueryBuilder} or the result of {@link QueryBuilder#build}
|
|
8
|
+
* to {@link DataSourceBuilder#addQuery} to register the query.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* let query = new QueryBuilder()
|
|
13
|
+
* .setRange({from: 250_000_000})
|
|
14
|
+
* .addInstruction({where: {programId: [PROGRAM_ID]}, include: {logs: true}})
|
|
15
|
+
* .addTransaction({where: {feePayer: [FEE_PAYER]}})
|
|
16
|
+
*
|
|
17
|
+
* dataSource.addQuery(query)
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
class QueryBuilder {
|
|
21
|
+
constructor() {
|
|
22
|
+
this._range = { from: 0 };
|
|
23
|
+
this._request = {};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Restrict this query to the given block range.
|
|
27
|
+
*
|
|
28
|
+
* When omitted, the query applies from block 0 onwards.
|
|
29
|
+
*/
|
|
30
|
+
setRange(range) {
|
|
31
|
+
this._range = range;
|
|
32
|
+
return this;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Fetch every block in the query's range, even blocks without any
|
|
36
|
+
* matching items. Without this flag such blocks may be omitted.
|
|
37
|
+
*/
|
|
38
|
+
includeAllBlocks() {
|
|
39
|
+
this._request.includeAllBlocks = true;
|
|
40
|
+
return this;
|
|
41
|
+
}
|
|
42
|
+
addTransaction(options) {
|
|
43
|
+
var _a;
|
|
44
|
+
;
|
|
45
|
+
((_a = this._request).transactions ?? (_a.transactions = [])).push(options);
|
|
46
|
+
return this;
|
|
47
|
+
}
|
|
48
|
+
addInstruction(options) {
|
|
49
|
+
var _a;
|
|
50
|
+
;
|
|
51
|
+
((_a = this._request).instructions ?? (_a.instructions = [])).push(options);
|
|
52
|
+
return this;
|
|
53
|
+
}
|
|
54
|
+
addLog(options) {
|
|
55
|
+
var _a;
|
|
56
|
+
;
|
|
57
|
+
((_a = this._request).logs ?? (_a.logs = [])).push(options);
|
|
58
|
+
return this;
|
|
59
|
+
}
|
|
60
|
+
addBalance(options) {
|
|
61
|
+
var _a;
|
|
62
|
+
;
|
|
63
|
+
((_a = this._request).balances ?? (_a.balances = [])).push(options);
|
|
64
|
+
return this;
|
|
65
|
+
}
|
|
66
|
+
addTokenBalance(options) {
|
|
67
|
+
var _a;
|
|
68
|
+
;
|
|
69
|
+
((_a = this._request).tokenBalances ?? (_a.tokenBalances = [])).push(options);
|
|
70
|
+
return this;
|
|
71
|
+
}
|
|
72
|
+
addReward(options) {
|
|
73
|
+
var _a;
|
|
74
|
+
;
|
|
75
|
+
((_a = this._request).rewards ?? (_a.rewards = [])).push(options);
|
|
76
|
+
return this;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Produce an immutable {@link Query} describing the configured range
|
|
80
|
+
* and filters. Subsequent mutations of this builder do not affect
|
|
81
|
+
* the returned object.
|
|
82
|
+
*/
|
|
83
|
+
build() {
|
|
84
|
+
return {
|
|
85
|
+
range: { ...this._range },
|
|
86
|
+
request: cloneRequest(this._request),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
exports.QueryBuilder = QueryBuilder;
|
|
91
|
+
function cloneRequest(request) {
|
|
92
|
+
return {
|
|
93
|
+
includeAllBlocks: request.includeAllBlocks,
|
|
94
|
+
transactions: request.transactions?.slice(),
|
|
95
|
+
instructions: request.instructions?.slice(),
|
|
96
|
+
logs: request.logs?.slice(),
|
|
97
|
+
balances: request.balances?.slice(),
|
|
98
|
+
tokenBalances: request.tokenBalances?.slice(),
|
|
99
|
+
rewards: request.rewards?.slice(),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=query.js.map
|
package/lib/query.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":";;;AAmBA;;;;;;;;;;;;;;;GAeG;AACH,MAAa,YAAY;IAAzB;QACY,WAAM,GAAU,EAAC,IAAI,EAAE,CAAC,EAAC,CAAA;QACzB,aAAQ,GAAgB,EAAE,CAAA;IA8DtC,CAAC;IA5DG;;;;OAIG;IACH,QAAQ,CAAC,KAAY;QACjB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,OAAO,IAAI,CAAA;IACf,CAAC;IAED;;;OAGG;IACH,gBAAgB;QACZ,IAAI,CAAC,QAAQ,CAAC,gBAAgB,GAAG,IAAI,CAAA;QACrC,OAAO,IAAI,CAAA;IACf,CAAC;IAED,cAAc,CAAC,OAA2B;;QACtC,CAAC;QAAA,OAAC,IAAI,CAAC,QAAQ,EAAC,YAAY,QAAZ,YAAY,GAAK,EAAE,EAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAClD,OAAO,IAAI,CAAA;IACf,CAAC;IAED,cAAc,CAAC,OAA2B;;QACtC,CAAC;QAAA,OAAC,IAAI,CAAC,QAAQ,EAAC,YAAY,QAAZ,YAAY,GAAK,EAAE,EAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAClD,OAAO,IAAI,CAAA;IACf,CAAC;IAED,MAAM,CAAC,OAAmB;;QACtB,CAAC;QAAA,OAAC,IAAI,CAAC,QAAQ,EAAC,IAAI,QAAJ,IAAI,GAAK,EAAE,EAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC1C,OAAO,IAAI,CAAA;IACf,CAAC;IAED,UAAU,CAAC,OAAuB;;QAC9B,CAAC;QAAA,OAAC,IAAI,CAAC,QAAQ,EAAC,QAAQ,QAAR,QAAQ,GAAK,EAAE,EAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC9C,OAAO,IAAI,CAAA;IACf,CAAC;IAED,eAAe,CAAC,OAA4B;;QACxC,CAAC;QAAA,OAAC,IAAI,CAAC,QAAQ,EAAC,aAAa,QAAb,aAAa,GAAK,EAAE,EAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACnD,OAAO,IAAI,CAAA;IACf,CAAC;IAED,SAAS,CAAC,OAAsB;;QAC5B,CAAC;QAAA,OAAC,IAAI,CAAC,QAAQ,EAAC,OAAO,QAAP,OAAO,GAAK,EAAE,EAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC7C,OAAO,IAAI,CAAA;IACf,CAAC;IAED;;;;OAIG;IACH,KAAK;QACD,OAAO;YACH,KAAK,EAAE,EAAC,GAAG,IAAI,CAAC,MAAM,EAAC;YACvB,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC;SACvC,CAAA;IACL,CAAC;CACJ;AAhED,oCAgEC;AAED,SAAS,YAAY,CAAC,OAAoB;IACtC,OAAO;QACH,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;QAC1C,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,KAAK,EAAE;QAC3C,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,KAAK,EAAE;QAC3C,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE;QAC3B,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE;QACnC,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,KAAK,EAAE;QAC7C,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE;KACpC,CAAA;AACL,CAAC"}
|
package/lib/source.d.ts
CHANGED
|
@@ -1,73 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { BlockBatch, BlockRef, DataSource, DataSourceStreamOptions, TemplateRegistry } from '@subsquid/util-internal-data-source';
|
|
3
|
-
import { FiniteRange, Range, RangeRequestList } from '@subsquid/util-internal-range';
|
|
1
|
+
import { DataSource } from '@subsquid/util-internal-data-source';
|
|
4
2
|
import { Block, FieldSelection } from './data/model';
|
|
5
|
-
import { BalanceRequest, DataRequest, InstructionRequest, LogRequest, RewardRequest, TokenBalanceRequest, TransactionRequest } from './data/request';
|
|
6
|
-
interface BlockRange {
|
|
7
|
-
range?: Range;
|
|
8
|
-
}
|
|
9
|
-
export declare class DataSourceBuilder<F extends FieldSelection = {}> {
|
|
10
|
-
private requests;
|
|
11
|
-
private templates;
|
|
12
|
-
private fields?;
|
|
13
|
-
private blockRange?;
|
|
14
|
-
private archive?;
|
|
15
|
-
/**
|
|
16
|
-
* Set SQD Network Portal endpoint.
|
|
17
|
-
*
|
|
18
|
-
* SQD Network allows to get data from blocks up to
|
|
19
|
-
* infinite times faster and more efficient than via regular RPC.
|
|
20
|
-
*
|
|
21
|
-
* @example
|
|
22
|
-
* source.setPortal('https://portal.sqd.dev/datasets/solana-mainnet')
|
|
23
|
-
*/
|
|
24
|
-
setPortal(portal: string | PortalClientOptions | PortalClient): this;
|
|
25
|
-
/**
|
|
26
|
-
* Limits the range of blocks to fetch.
|
|
27
|
-
*
|
|
28
|
-
* Note, that block heights should be used instead of slots.
|
|
29
|
-
*/
|
|
30
|
-
setBlockRange(range?: Range): this;
|
|
31
|
-
/**
|
|
32
|
-
* Configure a set of fetched fields
|
|
33
|
-
*/
|
|
34
|
-
setFields<F extends FieldSelection>(fields: F): DataSourceBuilder<F>;
|
|
35
|
-
private add;
|
|
36
|
-
/**
|
|
37
|
-
* By default, blocks that doesn't contain requested items can be omitted.
|
|
38
|
-
* This method modifies such behaviour to fetch all chain blocks.
|
|
39
|
-
*
|
|
40
|
-
* Optionally a range of blocks can be specified
|
|
41
|
-
* for which the setting should be effective.
|
|
42
|
-
*/
|
|
43
|
-
includeAllBlocks(range?: Range): this;
|
|
44
|
-
addTransaction(options: TransactionRequest & BlockRange): this;
|
|
45
|
-
addTransaction(key: string, options: TransactionRequest & BlockRange): this;
|
|
46
|
-
addInstruction(options: InstructionRequest & BlockRange): this;
|
|
47
|
-
addInstruction(key: string, options: InstructionRequest & BlockRange): this;
|
|
48
|
-
addLog(options: LogRequest & BlockRange): this;
|
|
49
|
-
addLog(key: string, options: LogRequest & BlockRange): this;
|
|
50
|
-
addBalance(options: BalanceRequest & BlockRange): this;
|
|
51
|
-
addBalance(key: string, options: BalanceRequest & BlockRange): this;
|
|
52
|
-
addTokenBalance(options: TokenBalanceRequest & BlockRange): this;
|
|
53
|
-
addTokenBalance(key: string, options: TokenBalanceRequest & BlockRange): this;
|
|
54
|
-
addReward(options: RewardRequest & BlockRange): this;
|
|
55
|
-
addReward(key: string, options: RewardRequest & BlockRange): this;
|
|
56
|
-
private getRequests;
|
|
57
|
-
build(): SolanaDataSource<F>;
|
|
58
|
-
}
|
|
59
3
|
export type GetDataSourceBlock<T> = T extends DataSource<infer B> ? B : never;
|
|
60
|
-
export
|
|
61
|
-
private _resolveRequests;
|
|
62
|
-
private portal;
|
|
63
|
-
constructor(_resolveRequests: (registry: TemplateRegistry | undefined) => RangeRequestList<DataRequest<F>>, portal: PortalClient);
|
|
64
|
-
getHead(): Promise<BlockRef | undefined>;
|
|
65
|
-
getFinalizedHead(): Promise<BlockRef | undefined>;
|
|
66
|
-
getFinalizedStream(opts: DataSourceStreamOptions): AsyncIterable<BlockBatch<Block<F>>>;
|
|
67
|
-
getStream(opts?: DataSourceStreamOptions): AsyncIterable<BlockBatch<Block<F>>>;
|
|
68
|
-
getBlocksCountInRange(range: FiniteRange): number;
|
|
69
|
-
private createArchive;
|
|
70
|
-
private getSquidId;
|
|
4
|
+
export interface SolanaDataSource<F extends FieldSelection> extends DataSource<Block<F>> {
|
|
71
5
|
}
|
|
72
|
-
export {};
|
|
73
6
|
//# sourceMappingURL=source.d.ts.map
|
package/lib/source.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../src/source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../src/source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,qCAAqC,CAAA;AAC9D,OAAO,EAAC,KAAK,EAAE,cAAc,EAAC,MAAM,cAAc,CAAA;AAElD,MAAM,MAAM,kBAAkB,CAAC,CAAC,IAAI,CAAC,SAAS,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;AAE7E,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,cAAc,CAAE,SAAQ,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;CAAG"}
|
package/lib/source.js
CHANGED
|
@@ -1,268 +1,3 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
-
};
|
|
8
|
-
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
-
};
|
|
11
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
-
};
|
|
14
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.SolanaDataSource = exports.DataSourceBuilder = void 0;
|
|
16
|
-
const portal_client_1 = require("@subsquid/portal-client");
|
|
17
|
-
const util_internal_1 = require("@subsquid/util-internal");
|
|
18
|
-
const util_internal_processor_tools_1 = require("@subsquid/util-internal-processor-tools");
|
|
19
|
-
const util_internal_range_1 = require("@subsquid/util-internal-range");
|
|
20
|
-
const assert_1 = __importDefault(require("assert"));
|
|
21
|
-
const model_1 = require("./data/model");
|
|
22
|
-
const source_1 = require("./portal/source");
|
|
23
|
-
class DataSourceBuilder {
|
|
24
|
-
constructor() {
|
|
25
|
-
this.requests = [];
|
|
26
|
-
this.templates = [];
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Set SQD Network Portal endpoint.
|
|
30
|
-
*
|
|
31
|
-
* SQD Network allows to get data from blocks up to
|
|
32
|
-
* infinite times faster and more efficient than via regular RPC.
|
|
33
|
-
*
|
|
34
|
-
* @example
|
|
35
|
-
* source.setPortal('https://portal.sqd.dev/datasets/solana-mainnet')
|
|
36
|
-
*/
|
|
37
|
-
setPortal(portal) {
|
|
38
|
-
if (typeof portal == 'string') {
|
|
39
|
-
this.archive = { url: portal };
|
|
40
|
-
}
|
|
41
|
-
else {
|
|
42
|
-
this.archive = portal;
|
|
43
|
-
}
|
|
44
|
-
return this;
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Limits the range of blocks to fetch.
|
|
48
|
-
*
|
|
49
|
-
* Note, that block heights should be used instead of slots.
|
|
50
|
-
*/
|
|
51
|
-
setBlockRange(range) {
|
|
52
|
-
this.blockRange = range;
|
|
53
|
-
return this;
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Configure a set of fetched fields
|
|
57
|
-
*/
|
|
58
|
-
setFields(fields) {
|
|
59
|
-
this.fields = fields;
|
|
60
|
-
return this;
|
|
61
|
-
}
|
|
62
|
-
add(range, request) {
|
|
63
|
-
this.requests.push({
|
|
64
|
-
range: range || { from: 0 },
|
|
65
|
-
request,
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* By default, blocks that doesn't contain requested items can be omitted.
|
|
70
|
-
* This method modifies such behaviour to fetch all chain blocks.
|
|
71
|
-
*
|
|
72
|
-
* Optionally a range of blocks can be specified
|
|
73
|
-
* for which the setting should be effective.
|
|
74
|
-
*/
|
|
75
|
-
includeAllBlocks(range) {
|
|
76
|
-
this.add(range, { includeAllBlocks: true });
|
|
77
|
-
return this;
|
|
78
|
-
}
|
|
79
|
-
addTransaction(keyOrOptions, options) {
|
|
80
|
-
if (typeof keyOrOptions === 'string') {
|
|
81
|
-
let { range, ...transaction } = options;
|
|
82
|
-
this.templates.push({ key: keyOrOptions, range, resolve: (value) => ({
|
|
83
|
-
transactions: [{ ...transaction, where: { ...transaction.where, feePayer: [value] } }],
|
|
84
|
-
}) });
|
|
85
|
-
return this;
|
|
86
|
-
}
|
|
87
|
-
let { range, ...req } = keyOrOptions;
|
|
88
|
-
this.add(range, { transactions: [req] });
|
|
89
|
-
return this;
|
|
90
|
-
}
|
|
91
|
-
addInstruction(keyOrOptions, options) {
|
|
92
|
-
if (typeof keyOrOptions === 'string') {
|
|
93
|
-
let { range, ...instruction } = options;
|
|
94
|
-
this.templates.push({ key: keyOrOptions, range, resolve: (value) => ({
|
|
95
|
-
instructions: [{ ...instruction, where: { ...instruction.where, programId: [value] } }],
|
|
96
|
-
}) });
|
|
97
|
-
return this;
|
|
98
|
-
}
|
|
99
|
-
let { range, ...req } = keyOrOptions;
|
|
100
|
-
this.add(range, { instructions: [req] });
|
|
101
|
-
return this;
|
|
102
|
-
}
|
|
103
|
-
addLog(keyOrOptions, options) {
|
|
104
|
-
if (typeof keyOrOptions === 'string') {
|
|
105
|
-
let { range, ...log } = options;
|
|
106
|
-
this.templates.push({ key: keyOrOptions, range, resolve: (value) => ({
|
|
107
|
-
logs: [{ ...log, where: { ...log.where, programId: [value] } }],
|
|
108
|
-
}) });
|
|
109
|
-
return this;
|
|
110
|
-
}
|
|
111
|
-
let { range, ...req } = keyOrOptions;
|
|
112
|
-
this.add(range, { logs: [req] });
|
|
113
|
-
return this;
|
|
114
|
-
}
|
|
115
|
-
addBalance(keyOrOptions, options) {
|
|
116
|
-
if (typeof keyOrOptions === 'string') {
|
|
117
|
-
let { range, ...balance } = options;
|
|
118
|
-
this.templates.push({ key: keyOrOptions, range, resolve: (value) => ({
|
|
119
|
-
balances: [{ ...balance, where: { ...balance.where, account: [value] } }],
|
|
120
|
-
}) });
|
|
121
|
-
return this;
|
|
122
|
-
}
|
|
123
|
-
let { range, ...req } = keyOrOptions;
|
|
124
|
-
this.add(range, { balances: [req] });
|
|
125
|
-
return this;
|
|
126
|
-
}
|
|
127
|
-
addTokenBalance(keyOrOptions, options) {
|
|
128
|
-
if (typeof keyOrOptions === 'string') {
|
|
129
|
-
let { range, ...tokenBalance } = options;
|
|
130
|
-
this.templates.push({ key: keyOrOptions, range, resolve: (value) => ({
|
|
131
|
-
tokenBalances: [{ ...tokenBalance, where: { ...tokenBalance.where, account: [value] } }],
|
|
132
|
-
}) });
|
|
133
|
-
return this;
|
|
134
|
-
}
|
|
135
|
-
let { range, ...req } = keyOrOptions;
|
|
136
|
-
this.add(range, { tokenBalances: [req] });
|
|
137
|
-
return this;
|
|
138
|
-
}
|
|
139
|
-
addReward(keyOrOptions, options) {
|
|
140
|
-
if (typeof keyOrOptions === 'string') {
|
|
141
|
-
let { range, ...reward } = options;
|
|
142
|
-
this.templates.push({ key: keyOrOptions, range, resolve: (value) => ({
|
|
143
|
-
rewards: [{ ...reward, where: { ...reward.where, pubkey: [value] } }],
|
|
144
|
-
}) });
|
|
145
|
-
return this;
|
|
146
|
-
}
|
|
147
|
-
let { range, ...req } = keyOrOptions;
|
|
148
|
-
this.add(range, { rewards: [req] });
|
|
149
|
-
return this;
|
|
150
|
-
}
|
|
151
|
-
getRequests(registry) {
|
|
152
|
-
function concat(a, b) {
|
|
153
|
-
let result = [];
|
|
154
|
-
if (a) {
|
|
155
|
-
result.push(...a);
|
|
156
|
-
}
|
|
157
|
-
if (b) {
|
|
158
|
-
result.push(...b);
|
|
159
|
-
}
|
|
160
|
-
return result.length == 0 ? undefined : result;
|
|
161
|
-
}
|
|
162
|
-
let mergedInputs = this.requests.slice();
|
|
163
|
-
if (registry) {
|
|
164
|
-
for (let spec of this.templates) {
|
|
165
|
-
for (let entry of registry.get(spec.key)) {
|
|
166
|
-
let range = (0, util_internal_range_1.rangeIntersection)(spec.range ?? { from: 0 }, entry.range);
|
|
167
|
-
if (!range)
|
|
168
|
-
continue;
|
|
169
|
-
mergedInputs.push({ range, request: spec.resolve(entry.value) });
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
let requests = (0, util_internal_range_1.mergeRangeRequests)(mergedInputs, (a, b) => {
|
|
174
|
-
return {
|
|
175
|
-
includeAllBlocks: a.includeAllBlocks || b.includeAllBlocks,
|
|
176
|
-
transactions: concat(a.transactions, b.transactions),
|
|
177
|
-
instructions: concat(a.instructions, b.instructions),
|
|
178
|
-
logs: concat(a.logs, b.logs),
|
|
179
|
-
balances: concat(a.balances, b.balances),
|
|
180
|
-
tokenBalances: concat(a.tokenBalances, b.tokenBalances),
|
|
181
|
-
rewards: concat(a.rewards, b.rewards),
|
|
182
|
-
};
|
|
183
|
-
});
|
|
184
|
-
let fields = addDefaultFields(this.fields);
|
|
185
|
-
let rangeRequests = requests.map(({ range, request }) => {
|
|
186
|
-
return {
|
|
187
|
-
range,
|
|
188
|
-
request: {
|
|
189
|
-
fields,
|
|
190
|
-
...request,
|
|
191
|
-
},
|
|
192
|
-
};
|
|
193
|
-
});
|
|
194
|
-
return (0, util_internal_range_1.applyRangeBound)(rangeRequests, this.blockRange);
|
|
195
|
-
}
|
|
196
|
-
build() {
|
|
197
|
-
(0, assert_1.default)(this.archive, 'Portal settings not set');
|
|
198
|
-
let portal = this.archive instanceof portal_client_1.PortalClient ? this.archive : new portal_client_1.PortalClient(this.archive);
|
|
199
|
-
return new SolanaDataSource((reg) => this.getRequests(reg), portal);
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
exports.DataSourceBuilder = DataSourceBuilder;
|
|
203
|
-
function addDefaultFields(fields) {
|
|
204
|
-
return {
|
|
205
|
-
block: mergeDefaultFields(model_1.DEFAULT_FIELDS.block, fields?.block),
|
|
206
|
-
transaction: mergeDefaultFields(model_1.DEFAULT_FIELDS.transaction, fields?.transaction),
|
|
207
|
-
instruction: mergeDefaultFields(model_1.DEFAULT_FIELDS.instruction, fields?.instruction),
|
|
208
|
-
log: mergeDefaultFields(model_1.DEFAULT_FIELDS.log, fields?.log),
|
|
209
|
-
balance: mergeDefaultFields(model_1.DEFAULT_FIELDS.balance, fields?.balance),
|
|
210
|
-
tokenBalance: mergeDefaultFields(model_1.DEFAULT_FIELDS.tokenBalance, fields?.tokenBalance),
|
|
211
|
-
reward: mergeDefaultFields(model_1.DEFAULT_FIELDS.reward, fields?.reward),
|
|
212
|
-
};
|
|
213
|
-
}
|
|
214
|
-
function mergeDefaultFields(defaults, selection) {
|
|
215
|
-
let result = { ...defaults };
|
|
216
|
-
for (let key in selection) {
|
|
217
|
-
if (selection[key] != null) {
|
|
218
|
-
if (selection[key]) {
|
|
219
|
-
result[key] = true;
|
|
220
|
-
}
|
|
221
|
-
else {
|
|
222
|
-
delete result[key];
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
return result;
|
|
227
|
-
}
|
|
228
|
-
class SolanaDataSource {
|
|
229
|
-
constructor(_resolveRequests, portal) {
|
|
230
|
-
this._resolveRequests = _resolveRequests;
|
|
231
|
-
this.portal = portal;
|
|
232
|
-
}
|
|
233
|
-
getHead() {
|
|
234
|
-
return this.createArchive().getHead();
|
|
235
|
-
}
|
|
236
|
-
getFinalizedHead() {
|
|
237
|
-
return this.createArchive().getFinalizedHead();
|
|
238
|
-
}
|
|
239
|
-
getFinalizedStream(opts) {
|
|
240
|
-
return this.createArchive().getFinalizedStream(opts);
|
|
241
|
-
}
|
|
242
|
-
getStream(opts) {
|
|
243
|
-
return this.createArchive().getStream(opts);
|
|
244
|
-
}
|
|
245
|
-
getBlocksCountInRange(range) {
|
|
246
|
-
return this.createArchive().getBlocksCountInRange(range);
|
|
247
|
-
}
|
|
248
|
-
createArchive() {
|
|
249
|
-
return new source_1.PortalDataSource(this.portal, this._resolveRequests.bind(this), { squidId: this.getSquidId() });
|
|
250
|
-
}
|
|
251
|
-
getSquidId() {
|
|
252
|
-
return (0, util_internal_processor_tools_1.getOrGenerateSquidId)();
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
exports.SolanaDataSource = SolanaDataSource;
|
|
256
|
-
__decorate([
|
|
257
|
-
util_internal_1.def,
|
|
258
|
-
__metadata("design:type", Function),
|
|
259
|
-
__metadata("design:paramtypes", []),
|
|
260
|
-
__metadata("design:returntype", void 0)
|
|
261
|
-
], SolanaDataSource.prototype, "createArchive", null);
|
|
262
|
-
__decorate([
|
|
263
|
-
util_internal_1.def,
|
|
264
|
-
__metadata("design:type", Function),
|
|
265
|
-
__metadata("design:paramtypes", []),
|
|
266
|
-
__metadata("design:returntype", String)
|
|
267
|
-
], SolanaDataSource.prototype, "getSquidId", null);
|
|
268
3
|
//# sourceMappingURL=source.js.map
|
package/lib/source.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source.js","sourceRoot":"","sources":["../src/source.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"source.js","sourceRoot":"","sources":["../src/source.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@subsquid/solana-stream",
|
|
3
|
-
"version": "1.0.0
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "Solana block data streamer",
|
|
5
5
|
"license": "GPL-3.0-or-later",
|
|
6
6
|
"repository": "git@github.com:subsquid/squid-sdk.git",
|
|
@@ -13,27 +13,29 @@
|
|
|
13
13
|
],
|
|
14
14
|
"main": "lib/index.js",
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@subsquid/http-client": "^1.8.
|
|
17
|
-
"@subsquid/logger": "^1.
|
|
18
|
-
"@subsquid/rpc-client": "^4.
|
|
19
|
-
"@subsquid/portal-client": "^0.
|
|
20
|
-
"@subsquid/solana-normalization": "1.0.0
|
|
21
|
-
"@subsquid/solana-rpc": "^0.
|
|
22
|
-
"@subsquid/solana-rpc-data": "^0.
|
|
23
|
-
"@subsquid/util-internal": "^3.
|
|
24
|
-
"@subsquid/util-internal-hex": "^1.2.
|
|
25
|
-
"@subsquid/util-internal-ingest-tools": "^1.1.
|
|
16
|
+
"@subsquid/http-client": "^1.8.1",
|
|
17
|
+
"@subsquid/logger": "^1.6.0",
|
|
18
|
+
"@subsquid/rpc-client": "^4.15.0",
|
|
19
|
+
"@subsquid/portal-client": "^0.5.1",
|
|
20
|
+
"@subsquid/solana-normalization": "^1.0.0",
|
|
21
|
+
"@subsquid/solana-rpc": "^1.0.0",
|
|
22
|
+
"@subsquid/solana-rpc-data": "^1.0.0",
|
|
23
|
+
"@subsquid/util-internal": "^3.3.0",
|
|
24
|
+
"@subsquid/util-internal-hex": "^1.2.3",
|
|
25
|
+
"@subsquid/util-internal-ingest-tools": "^1.1.5",
|
|
26
26
|
"@subsquid/util-internal-processor-tools": "^4.4.0",
|
|
27
27
|
"@subsquid/util-internal-range": "^0.3.0",
|
|
28
|
-
"@subsquid/util-internal-validation": "^0.
|
|
29
|
-
"@subsquid/util-internal-data-source": "0.0.
|
|
28
|
+
"@subsquid/util-internal-validation": "^0.9.0",
|
|
29
|
+
"@subsquid/util-internal-data-source": "^0.0.0",
|
|
30
30
|
"bs58": "^5.0.0"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
|
-
"@types/node": "^
|
|
34
|
-
"typescript": "
|
|
33
|
+
"@types/node": "^24.0.0",
|
|
34
|
+
"typescript": "5.5.4",
|
|
35
|
+
"vitest": "4.1.5"
|
|
35
36
|
},
|
|
36
37
|
"scripts": {
|
|
37
|
-
"build": "rm -rf lib && tsc"
|
|
38
|
+
"build": "rm -rf lib && tsc",
|
|
39
|
+
"test": "vitest --run"
|
|
38
40
|
}
|
|
39
41
|
}
|