@subsquid/solana-normalization 0.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/mapping.js ADDED
@@ -0,0 +1,424 @@
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.mapRpcBlock = void 0;
7
+ const util_internal_1 = require("@subsquid/util-internal");
8
+ const assert_1 = __importDefault(require("assert"));
9
+ const log_parser_1 = require("./log-parser");
10
+ function mapRpcBlock(src) {
11
+ let header = {
12
+ hash: src.hash,
13
+ height: src.height,
14
+ slot: src.slot,
15
+ parentSlot: src.block.parentSlot,
16
+ parentHash: src.block.previousBlockhash,
17
+ timestamp: src.block.blockTime ?? 0
18
+ };
19
+ let instructions = [];
20
+ let logs = [];
21
+ let balances = [];
22
+ let tokenBalances = [];
23
+ let transactions = src.block.transactions
24
+ ?.map((tx, i) => {
25
+ try {
26
+ return mapRpcTransaction(i, tx, instructions, logs, balances, tokenBalances);
27
+ }
28
+ catch (err) {
29
+ throw (0, util_internal_1.addErrorContext)(err, {
30
+ blockTransaction: tx.transaction.signatures[0]
31
+ });
32
+ }
33
+ }) ?? [];
34
+ let rewards = src.block.rewards?.map(s => {
35
+ let reward = {
36
+ pubkey: s.pubkey,
37
+ lamports: BigInt(s.lamports),
38
+ postBalance: BigInt(s.postBalance)
39
+ };
40
+ if (s.rewardType) {
41
+ reward.rewardType = s.rewardType;
42
+ }
43
+ if (s.commission != null) {
44
+ reward.commission = s.commission;
45
+ }
46
+ return reward;
47
+ });
48
+ return {
49
+ header,
50
+ transactions,
51
+ instructions,
52
+ logs,
53
+ balances,
54
+ tokenBalances,
55
+ rewards: rewards || []
56
+ };
57
+ }
58
+ exports.mapRpcBlock = mapRpcBlock;
59
+ function mapRpcTransaction(transactionIndex, src, instructions, logs, balances, tokenBalances) {
60
+ let tx = {
61
+ transactionIndex,
62
+ version: src.version,
63
+ accountKeys: src.transaction.message.accountKeys,
64
+ addressTableLookups: src.transaction.message.addressTableLookups ?? [],
65
+ numReadonlySignedAccounts: src.transaction.message.header.numReadonlySignedAccounts,
66
+ numReadonlyUnsignedAccounts: src.transaction.message.header.numReadonlyUnsignedAccounts,
67
+ numRequiredSignatures: src.transaction.message.header.numRequiredSignatures,
68
+ recentBlockhash: src.transaction.message.recentBlockhash,
69
+ signatures: src.transaction.signatures,
70
+ err: src.meta.err,
71
+ computeUnitsConsumed: BigInt(src.meta.computeUnitsConsumed ?? 0),
72
+ fee: BigInt(src.meta.fee),
73
+ loadedAddresses: src.meta.loadedAddresses ?? { readonly: [], writable: [] },
74
+ hasDroppedLogMessages: false
75
+ };
76
+ let accounts;
77
+ if (tx.version === 'legacy') {
78
+ accounts = tx.accountKeys;
79
+ }
80
+ else {
81
+ (0, assert_1.default)(src.meta?.loadedAddresses);
82
+ accounts = tx.accountKeys.concat(src.meta.loadedAddresses.writable, src.meta.loadedAddresses.readonly);
83
+ }
84
+ let getAccount = (index) => {
85
+ (0, assert_1.default)(index < accounts.length);
86
+ return accounts[index];
87
+ };
88
+ new InstructionParser(getAccount, tx, src, src.meta.logMessages?.map(log_parser_1.parseLogMessage), instructions, logs).parse();
89
+ balances.push(...mapBalances(getAccount, transactionIndex, src));
90
+ tokenBalances.push(...mapTokenBalances(getAccount, transactionIndex, src));
91
+ return tx;
92
+ }
93
+ const PROGRAMS_MISSING_INVOKE_LOG = new Set([
94
+ 'AddressLookupTab1e1111111111111111111111111',
95
+ 'BPFLoader1111111111111111111111111111111111',
96
+ 'BPFLoader2111111111111111111111111111111111',
97
+ 'BPFLoaderUpgradeab1e11111111111111111111111',
98
+ 'Ed25519SigVerify111111111111111111111111111',
99
+ 'KeccakSecp256k11111111111111111111111111111',
100
+ 'NativeLoader1111111111111111111111111111111',
101
+ 'ZkTokenProof1111111111111111111111111111111',
102
+ ]);
103
+ class InstructionParser {
104
+ constructor(getAccount, tx, src, messages, instructions, logs) {
105
+ this.getAccount = getAccount;
106
+ this.tx = tx;
107
+ this.src = src;
108
+ this.instructions = instructions;
109
+ this.logs = logs;
110
+ this.pos = 0;
111
+ this.messagePos = 0;
112
+ this.messagesTruncated = false;
113
+ this.lastAddress = [];
114
+ if (messages == null) {
115
+ this.messages = [];
116
+ this.messagesTruncated = true;
117
+ }
118
+ else {
119
+ this.messages = messages;
120
+ }
121
+ let err = this.src.meta.err;
122
+ if (err) {
123
+ if ('InstructionError' in err) {
124
+ let pos = err['InstructionError'][0];
125
+ (0, assert_1.default)(typeof pos == 'number');
126
+ (0, assert_1.default)(0 <= pos && pos < this.src.transaction.message.instructions.length);
127
+ this.errorPos = pos;
128
+ }
129
+ }
130
+ }
131
+ parse() {
132
+ while (this.pos < this.src.transaction.message.instructions.length) {
133
+ let instruction = this.src.transaction.message.instructions[this.pos];
134
+ let inner = this.src.meta.innerInstructions
135
+ ?.filter(i => i.index === this.pos)
136
+ .flatMap(i => i.instructions) ?? [];
137
+ if (this.errorPos == null || this.errorPos >= this.pos) {
138
+ let instructions = [instruction].concat(inner);
139
+ let end = this.traverse(instructions, 0, 1);
140
+ (0, assert_1.default)(end == instructions.length);
141
+ }
142
+ else {
143
+ this.assert(inner.length == 0, false, 0, 'seemingly non-executed instruction has inner instructions');
144
+ this.push(1, instruction);
145
+ }
146
+ this.pos += 1;
147
+ }
148
+ this.tx.hasDroppedLogMessages = this.tx.hasDroppedLogMessages || this.messagesTruncated;
149
+ }
150
+ traverse(instructions, pos, stackHeight) {
151
+ this.assert(pos < instructions.length, true, 0, 'unexpected and of inner instructions');
152
+ let instruction = instructions[pos];
153
+ this.assert(instruction.stackHeight == null || instruction.stackHeight == stackHeight, false, pos, 'instruction has unexpected stack height');
154
+ let msg;
155
+ if (this.messagePos < this.messages.length) {
156
+ msg = this.messages[this.messagePos];
157
+ }
158
+ if (msg?.kind == 'truncate') {
159
+ this.messagePos += 1;
160
+ this.messagesTruncated = true;
161
+ }
162
+ if (this.messagesTruncated) {
163
+ this.push(stackHeight, instruction);
164
+ return this.logLessTraversal(stackHeight, instructions, pos + 1);
165
+ }
166
+ let programId = this.getAccount(instruction.programIdIndex);
167
+ if (msg?.kind === 'invoke' && msg.programId === programId) {
168
+ this.assert(msg.stackHeight == stackHeight, true, pos, 'invoke message has unexpected stack height');
169
+ this.messagePos += 1;
170
+ return this.invokeInstruction(stackHeight, instructions, pos);
171
+ }
172
+ if (PROGRAMS_MISSING_INVOKE_LOG.has(programId)) {
173
+ let dropped = this.dropInvokeLessInstructionMessages(pos);
174
+ let ins = this.push(stackHeight, instruction);
175
+ ins.hasDroppedLogMessages = ins.hasDroppedLogMessages || dropped;
176
+ this.tx.hasDroppedLogMessages = this.tx.hasDroppedLogMessages || dropped;
177
+ return this.invokeLessTraversal(dropped, stackHeight, instructions, pos + 1);
178
+ }
179
+ // FIXME: add an option to ignore this
180
+ throw this.error(true, pos, 'missing invoke message');
181
+ }
182
+ dropInvokeLessInstructionMessages(pos) {
183
+ let initialPos = this.messagePos;
184
+ while (this.messagePos < this.messages.length && !this.messagesTruncated) {
185
+ let msg = this.messages[this.messagePos];
186
+ switch (msg.kind) {
187
+ case 'log':
188
+ case 'data':
189
+ case 'cu':
190
+ case 'other':
191
+ this.messagePos += 1;
192
+ break;
193
+ case 'truncate':
194
+ this.messagePos += 1;
195
+ this.messagesTruncated = true;
196
+ return true;
197
+ case 'invoke':
198
+ return this.messagePos - initialPos > 0;
199
+ case 'invoke-result':
200
+ throw this.error(true, pos, `invoke result message does not match any invoke`);
201
+ default:
202
+ throw (0, util_internal_1.unexpectedCase)();
203
+ }
204
+ }
205
+ return false;
206
+ }
207
+ invokeInstruction(stackHeight, instructions, instructionPos) {
208
+ let ins = this.push(stackHeight, instructions[instructionPos]);
209
+ let pos = instructionPos + 1;
210
+ while (true) {
211
+ let token = this.takeInstructionMessages(ins, instructionPos);
212
+ switch (token.kind) {
213
+ case 'invoke':
214
+ pos = this.traverse(instructions, pos, stackHeight + 1);
215
+ break;
216
+ case 'invoke-result':
217
+ if (token.programId != ins.programId) {
218
+ throw this.error(true, instructionPos, `invoke result message and instruction program ids don't match`);
219
+ }
220
+ if (token.error) {
221
+ ins.error = token.error;
222
+ }
223
+ pos = this.invokeLessTraversal(true, stackHeight, instructions, pos);
224
+ this.messagePos += 1;
225
+ return pos;
226
+ case 'truncate':
227
+ ins.hasDroppedLogMessages = true;
228
+ return this.logLessTraversal(stackHeight, instructions, pos);
229
+ default:
230
+ throw (0, util_internal_1.unexpectedCase)();
231
+ }
232
+ }
233
+ }
234
+ takeInstructionMessages(ins, pos) {
235
+ if (this.messagesTruncated)
236
+ return new log_parser_1.LogTruncatedMessage();
237
+ while (this.messagePos < this.messages.length) {
238
+ let msg = this.messages[this.messagePos];
239
+ switch (msg.kind) {
240
+ case 'log':
241
+ case 'data':
242
+ case 'other':
243
+ this.logs.push({
244
+ transactionIndex: ins.transactionIndex,
245
+ logIndex: this.messagePos,
246
+ instructionAddress: ins.instructionAddress,
247
+ programId: ins.programId,
248
+ kind: msg.kind,
249
+ message: msg.message
250
+ });
251
+ break;
252
+ case 'cu':
253
+ if (ins.programId != msg.programId) {
254
+ throw this.error(true, pos, 'unexpected programId in compute unit message');
255
+ }
256
+ ins.computeUnitsConsumed = msg.consumed;
257
+ break;
258
+ case 'invoke':
259
+ case 'invoke-result':
260
+ return msg;
261
+ case 'truncate':
262
+ this.messagesTruncated = true;
263
+ this.messagePos += 1;
264
+ return msg;
265
+ default:
266
+ throw (0, util_internal_1.unexpectedCase)();
267
+ }
268
+ this.messagePos += 1;
269
+ }
270
+ throw this.error(false, pos, 'unexpected end of log messages');
271
+ }
272
+ invokeLessTraversal(messagesDropped, parentStackHeight, instructions, pos) {
273
+ return this.logLessTraversal(parentStackHeight, instructions, pos, (ins, pos) => {
274
+ ins.hasDroppedLogMessages = ins.hasDroppedLogMessages || messagesDropped;
275
+ if (PROGRAMS_MISSING_INVOKE_LOG.has(ins.programId)) {
276
+ }
277
+ else {
278
+ throw this.error(false, pos, 'invoke message is missing');
279
+ }
280
+ });
281
+ }
282
+ logLessTraversal(parentStackHeight, instructions, pos, cb) {
283
+ while (pos < instructions.length) {
284
+ let instruction = instructions[pos];
285
+ let stackHeight = instruction.stackHeight ?? 2;
286
+ if (stackHeight > parentStackHeight) {
287
+ let ins = this.push(stackHeight, instruction);
288
+ cb?.(ins, pos);
289
+ pos += 1;
290
+ }
291
+ else {
292
+ return pos;
293
+ }
294
+ }
295
+ return pos;
296
+ }
297
+ push(stackHeight, src) {
298
+ (0, assert_1.default)(stackHeight > 0);
299
+ if (src.stackHeight != null) {
300
+ (0, assert_1.default)(stackHeight === src.stackHeight);
301
+ }
302
+ let address = this.lastAddress.slice();
303
+ while (address.length > stackHeight) {
304
+ address.pop();
305
+ }
306
+ if (address.length === stackHeight) {
307
+ address[stackHeight - 1] += 1;
308
+ }
309
+ else {
310
+ (0, assert_1.default)(address.length + 1 == stackHeight);
311
+ address[stackHeight - 1] = 0;
312
+ }
313
+ let i = {
314
+ transactionIndex: this.tx.transactionIndex,
315
+ instructionAddress: address,
316
+ programId: this.getAccount(src.programIdIndex),
317
+ accounts: src.accounts.map(a => this.getAccount(a)),
318
+ data: src.data,
319
+ isCommitted: !this.tx.err,
320
+ hasDroppedLogMessages: this.messagesTruncated
321
+ };
322
+ this.instructions.push(i);
323
+ this.lastAddress = address;
324
+ return i;
325
+ }
326
+ assert(ok, withMessagePos, innerPos, msg) {
327
+ if (!ok)
328
+ throw this.error(withMessagePos, innerPos, msg);
329
+ }
330
+ error(withMessagePos, innerPos, msg) {
331
+ let loc = `stopped at instruction ${this.pos}`;
332
+ if (innerPos > 0) {
333
+ loc += `, inner instruction ${innerPos - 1})`;
334
+ }
335
+ if (withMessagePos && this.messagePos < this.messages.length) {
336
+ loc += ` and log message ${this.messagePos}`;
337
+ }
338
+ return new Error(`Failed to process transaction ${this.tx.signatures[0]}: ${loc}: ${msg}`);
339
+ }
340
+ }
341
+ function mapBalances(getAccount, transactionIndex, tx) {
342
+ let balances = [];
343
+ let pre = tx.meta.preBalances;
344
+ let post = tx.meta.postBalances;
345
+ (0, assert_1.default)(pre.length == post.length);
346
+ for (let i = 0; i < pre.length; i++) {
347
+ if (pre[i] === post[i]) {
348
+ // nothing changed, don't create an entry
349
+ }
350
+ else {
351
+ balances.push({
352
+ transactionIndex,
353
+ account: getAccount(i),
354
+ pre: BigInt(pre[i]),
355
+ post: BigInt(post[i])
356
+ });
357
+ }
358
+ }
359
+ balances.sort((a, b) => {
360
+ if (a.account < b.account)
361
+ return -1;
362
+ if (a.account > b.account)
363
+ return 1;
364
+ return 0;
365
+ });
366
+ return balances;
367
+ }
368
+ function mapTokenBalances(getAccount, transactionIndex, tx) {
369
+ let balances = [];
370
+ let preBalances = new Map(tx.meta.preTokenBalances?.map(b => [getAccount(b.accountIndex), b]));
371
+ let postBalances = new Map(tx.meta.postTokenBalances?.map(b => [getAccount(b.accountIndex), b]));
372
+ for (let [account, post] of postBalances.entries()) {
373
+ let pre = preBalances.get(account);
374
+ if (pre) {
375
+ balances.push({
376
+ transactionIndex,
377
+ account,
378
+ preProgramId: pre.programId ?? undefined,
379
+ preMint: pre.mint,
380
+ preDecimals: pre.uiTokenAmount.decimals,
381
+ preOwner: pre.owner ?? undefined,
382
+ preAmount: BigInt(pre.uiTokenAmount.amount),
383
+ postProgramId: post.programId ?? undefined,
384
+ postMint: post.mint,
385
+ postDecimals: post.uiTokenAmount.decimals,
386
+ postOwner: post.owner ?? undefined,
387
+ postAmount: BigInt(post.uiTokenAmount.amount)
388
+ });
389
+ }
390
+ else {
391
+ balances.push({
392
+ transactionIndex,
393
+ account,
394
+ postProgramId: post.programId ?? undefined,
395
+ postMint: post.mint,
396
+ postDecimals: post.uiTokenAmount.decimals,
397
+ postOwner: post.owner ?? undefined,
398
+ postAmount: BigInt(post.uiTokenAmount.amount)
399
+ });
400
+ }
401
+ }
402
+ for (let [account, pre] of preBalances.entries()) {
403
+ if (postBalances.has(account))
404
+ continue;
405
+ balances.push({
406
+ transactionIndex,
407
+ account,
408
+ preProgramId: pre.programId ?? undefined,
409
+ preMint: pre.mint,
410
+ preDecimals: pre.uiTokenAmount.decimals,
411
+ preOwner: pre.owner ?? undefined,
412
+ preAmount: BigInt(pre.uiTokenAmount.amount)
413
+ });
414
+ }
415
+ balances.sort((a, b) => {
416
+ if (a.account < b.account)
417
+ return -1;
418
+ if (a.account > b.account)
419
+ return 1;
420
+ return 0;
421
+ });
422
+ return balances;
423
+ }
424
+ //# sourceMappingURL=mapping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapping.js","sourceRoot":"","sources":["../src/mapping.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "@subsquid/solana-normalization",
3
+ "version": "0.0.0",
4
+ "description": "Solana data model",
5
+ "license": "GPL-3.0-or-later",
6
+ "repository": "git@github.com:subsquid/squid.git",
7
+ "publishConfig": {
8
+ "access": "public"
9
+ },
10
+ "files": [
11
+ "lib",
12
+ "src"
13
+ ],
14
+ "main": "lib/index.js",
15
+ "dependencies": {
16
+ "@subsquid/solana-rpc-data": "^0.0.0",
17
+ "@subsquid/util-internal": "^3.2.0",
18
+ "@subsquid/util-internal-validation": "^0.4.0"
19
+ },
20
+ "devDependencies": {
21
+ "@types/node": "^18.18.14",
22
+ "typescript": "~5.3.2"
23
+ },
24
+ "scripts": {
25
+ "build": "rm -rf lib && tsc"
26
+ }
27
+ }
package/src/data.ts ADDED
@@ -0,0 +1,154 @@
1
+ import type {Base58Bytes} from '@subsquid/solana-rpc-data'
2
+
3
+
4
+ export interface BlockHeader {
5
+ hash: Base58Bytes
6
+ height: number
7
+ slot: number
8
+ parentSlot: number
9
+ parentHash: Base58Bytes
10
+ timestamp: number
11
+ }
12
+
13
+
14
+ export interface Transaction {
15
+ /**
16
+ * Transaction position in block
17
+ */
18
+ transactionIndex: number
19
+ version: 'legacy' | number
20
+ // transaction message
21
+ accountKeys: Base58Bytes[]
22
+ addressTableLookups: AddressTableLookup[]
23
+ numReadonlySignedAccounts: number
24
+ numReadonlyUnsignedAccounts: number
25
+ numRequiredSignatures: number
26
+ recentBlockhash: Base58Bytes
27
+ signatures: Base58Bytes[]
28
+ // meta fields
29
+ err: null | object
30
+ computeUnitsConsumed: bigint
31
+ fee: bigint
32
+ loadedAddresses: {
33
+ readonly: Base58Bytes[]
34
+ writable: Base58Bytes[]
35
+ }
36
+ hasDroppedLogMessages: boolean
37
+ }
38
+
39
+
40
+ export interface AddressTableLookup {
41
+ accountKey: Base58Bytes
42
+ readonlyIndexes: number[]
43
+ writableIndexes: number[]
44
+ }
45
+
46
+
47
+ export interface Instruction {
48
+ transactionIndex: number
49
+ instructionAddress: number[]
50
+ programId: Base58Bytes
51
+ accounts: Base58Bytes[]
52
+ data: Base58Bytes
53
+ // execution result extracted from logs
54
+ computeUnitsConsumed?: bigint
55
+ error?: string
56
+ /**
57
+ * `true` when transaction completed successfully, `false` otherwise
58
+ */
59
+ isCommitted: boolean
60
+ hasDroppedLogMessages: boolean
61
+ }
62
+
63
+
64
+ export interface LogMessage {
65
+ transactionIndex: number
66
+ logIndex: number
67
+ instructionAddress: number[]
68
+ programId: Base58Bytes
69
+ kind: 'log' | 'data' | 'other'
70
+ message: string
71
+ }
72
+
73
+
74
+ export interface Balance {
75
+ transactionIndex: number
76
+ account: Base58Bytes
77
+ pre: bigint
78
+ post: bigint
79
+ }
80
+
81
+
82
+ export type TokenBalance = PreTokenBalance | PostTokenBalance | PrePostTokenBalance
83
+
84
+
85
+ export interface PreTokenBalance {
86
+ transactionIndex: number
87
+ account: Base58Bytes
88
+
89
+ preProgramId?: Base58Bytes
90
+ preMint: Base58Bytes
91
+ preDecimals: number
92
+ preOwner?: Base58Bytes
93
+ preAmount: bigint
94
+
95
+ postProgramId?: undefined
96
+ postMint?: undefined
97
+ postDecimals?: undefined
98
+ postOwner?: undefined
99
+ postAmount?: undefined
100
+ }
101
+
102
+
103
+ export interface PostTokenBalance {
104
+ transactionIndex: number
105
+ account: Base58Bytes
106
+
107
+ preProgramId?: undefined
108
+ preMint?: undefined
109
+ preDecimals?: undefined
110
+ preOwner?: undefined
111
+ preAmount?: undefined
112
+
113
+ postProgramId?: Base58Bytes
114
+ postMint: Base58Bytes
115
+ postDecimals: number
116
+ postOwner?: Base58Bytes
117
+ postAmount: bigint
118
+ }
119
+
120
+
121
+ export interface PrePostTokenBalance {
122
+ transactionIndex: number
123
+ account: Base58Bytes
124
+ preProgramId?: Base58Bytes
125
+ preMint: Base58Bytes
126
+ preDecimals: number
127
+ preOwner?: Base58Bytes
128
+ preAmount: bigint
129
+ postProgramId?: Base58Bytes
130
+ postMint: Base58Bytes
131
+ postDecimals: number
132
+ postOwner?: Base58Bytes
133
+ postAmount: bigint
134
+ }
135
+
136
+
137
+ export interface Reward {
138
+ pubkey: Base58Bytes
139
+ lamports: bigint
140
+ postBalance: bigint
141
+ rewardType?: string
142
+ commission?: number
143
+ }
144
+
145
+
146
+ export interface Block {
147
+ header: BlockHeader
148
+ transactions: Transaction[]
149
+ instructions: Instruction[]
150
+ logs: LogMessage[]
151
+ balances: Balance[]
152
+ tokenBalances: TokenBalance[]
153
+ rewards: Reward[]
154
+ }
package/src/index.ts ADDED
@@ -0,0 +1,2 @@
1
+ export * from './data'
2
+ export * from './mapping'