@odatano/nightgate 0.1.0 → 0.1.1
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/README.md +2 -1
- package/db/schema.cds +196 -327
- package/package.json +8 -1
- package/src/index.js +34 -15
- package/src/plugin.d.ts +4 -0
- package/src/plugin.js +37 -4
- package/srv/crawler/BlockProcessor.d.ts +8 -0
- package/srv/crawler/BlockProcessor.js +193 -5
- package/srv/crawler/Crawler.js +56 -53
- package/srv/crawler/index.d.ts +4 -0
- package/srv/crawler/index.js +20 -1
- package/srv/nightgate-indexer-service.cds +47 -10
- package/srv/nightgate-indexer-service.d.ts +2 -0
- package/srv/nightgate-indexer-service.js +144 -1
- package/srv/nightgate-service.cds +192 -134
- package/srv/nightgate-service.js +27 -0
- package/srv/providers/MidnightNodeProvider.js +13 -1
- package/srv/utils/scale.d.ts +25 -24
- package/srv/utils/scale.js +167 -89
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
using {
|
|
1
|
+
using {midnight} from '../db/schema';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Nightgate Blockchain OData V4 API Service
|
|
@@ -6,7 +6,7 @@ using { midnight } from '../db/schema';
|
|
|
6
6
|
* This service exposes Midnight blockchain data as a Nightgate OData V4 API,
|
|
7
7
|
* following enterprise architecture patterns.
|
|
8
8
|
*/
|
|
9
|
-
@path: '/api/v1/nightgate'
|
|
9
|
+
@path : '/api/v1/nightgate'
|
|
10
10
|
@requires: 'authenticated-user'
|
|
11
11
|
service NightgateService {
|
|
12
12
|
|
|
@@ -14,193 +14,215 @@ service NightgateService {
|
|
|
14
14
|
// Blockchain Core - Read-Only Access
|
|
15
15
|
// ========================================================================
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
/**
|
|
18
|
+
* Blocks endpoint with full navigation capabilities
|
|
19
|
+
* Supports: $filter, $orderby, $expand, $select, $top, $skip
|
|
20
|
+
*/
|
|
21
21
|
@readonly
|
|
22
|
-
entity Blocks
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
22
|
+
entity Blocks as
|
|
23
|
+
projection on midnight.Blocks {
|
|
24
|
+
*,
|
|
25
|
+
parent,
|
|
26
|
+
transactions,
|
|
27
|
+
systemParameters
|
|
28
|
+
}
|
|
29
|
+
actions {
|
|
30
|
+
// Get latest block
|
|
31
|
+
@cds.odata.bindingparameter.collection
|
|
32
|
+
function latest() returns Blocks;
|
|
33
|
+
|
|
34
|
+
// Get block by height
|
|
35
|
+
function byHeight(height: Integer) returns Blocks;
|
|
36
|
+
|
|
37
|
+
// Windowed range query for block pagination
|
|
38
|
+
@cds.odata.bindingparameter.collection
|
|
39
|
+
function range(startHeight: Integer64, endHeight: Integer64, limit: Integer) returns array of Blocks;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Transactions with expanded relationships
|
|
44
|
+
*/
|
|
39
45
|
@readonly
|
|
40
|
-
entity Transactions
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
46
|
+
entity Transactions as
|
|
47
|
+
projection on midnight.Transactions {
|
|
48
|
+
*,
|
|
49
|
+
block,
|
|
50
|
+
transactionResult,
|
|
51
|
+
transactionFees,
|
|
52
|
+
contractActions,
|
|
53
|
+
unshieldedCreatedOutputs,
|
|
54
|
+
unshieldedSpentOutputs,
|
|
55
|
+
zswapLedgerEvents,
|
|
56
|
+
dustLedgerEvents
|
|
57
|
+
}
|
|
58
|
+
actions {
|
|
59
|
+
// Get transaction by hash
|
|
60
|
+
function byHash(hash: String) returns Transactions;
|
|
61
|
+
|
|
62
|
+
// Filter transactions by classified tx type
|
|
63
|
+
@cds.odata.bindingparameter.collection
|
|
64
|
+
function byType(txType: String, limit: Integer) returns array of Transactions;
|
|
65
|
+
};
|
|
54
66
|
|
|
55
67
|
@readonly
|
|
56
|
-
entity TransactionResults
|
|
68
|
+
entity TransactionResults as projection on midnight.TransactionResults;
|
|
57
69
|
|
|
58
70
|
@readonly
|
|
59
|
-
entity TransactionSegments
|
|
71
|
+
entity TransactionSegments as projection on midnight.TransactionSegments;
|
|
60
72
|
|
|
61
73
|
@readonly
|
|
62
|
-
entity TransactionFees
|
|
74
|
+
entity TransactionFees as projection on midnight.TransactionFees;
|
|
63
75
|
|
|
64
76
|
// ========================================================================
|
|
65
77
|
// Smart Contracts
|
|
66
78
|
// ========================================================================
|
|
67
79
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
80
|
+
/**
|
|
81
|
+
* Contract actions with deployment, call, and update tracking
|
|
82
|
+
*/
|
|
71
83
|
@readonly
|
|
72
|
-
entity ContractActions
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
84
|
+
entity ContractActions as
|
|
85
|
+
projection on midnight.ContractActions {
|
|
86
|
+
*,
|
|
87
|
+
transaction,
|
|
88
|
+
deploy,
|
|
89
|
+
unshieldedBalances
|
|
90
|
+
}
|
|
91
|
+
actions {
|
|
92
|
+
// Get contract actions by address
|
|
93
|
+
@cds.odata.bindingparameter.collection
|
|
94
|
+
function byAddress(address: String) returns array of ContractActions;
|
|
95
|
+
|
|
96
|
+
// Get contract history
|
|
97
|
+
function history(address: String) returns array of ContractActions;
|
|
98
|
+
};
|
|
85
99
|
|
|
86
100
|
@readonly
|
|
87
|
-
entity ContractBalances
|
|
101
|
+
entity ContractBalances as projection on midnight.ContractBalances;
|
|
88
102
|
|
|
89
103
|
// ========================================================================
|
|
90
104
|
// UTXOs
|
|
91
105
|
// ========================================================================
|
|
92
106
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
107
|
+
/**
|
|
108
|
+
* Unshielded UTXOs for transparent transactions
|
|
109
|
+
*/
|
|
96
110
|
@readonly
|
|
97
|
-
entity UnshieldedUtxos
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
111
|
+
entity UnshieldedUtxos as
|
|
112
|
+
projection on midnight.UnshieldedUtxos {
|
|
113
|
+
*,
|
|
114
|
+
createdAtTransaction,
|
|
115
|
+
spentAtTransaction
|
|
116
|
+
}
|
|
117
|
+
actions {
|
|
118
|
+
// Get UTXOs by owner
|
|
119
|
+
@cds.odata.bindingparameter.collection
|
|
120
|
+
function byOwner(owner: String) returns array of UnshieldedUtxos;
|
|
121
|
+
|
|
122
|
+
// Get unspent UTXOs
|
|
123
|
+
@cds.odata.bindingparameter.collection
|
|
124
|
+
function unspent() returns array of UnshieldedUtxos;
|
|
125
|
+
};
|
|
110
126
|
|
|
111
127
|
// ========================================================================
|
|
112
128
|
// Ledger Events
|
|
113
129
|
// ========================================================================
|
|
114
130
|
|
|
115
131
|
@readonly
|
|
116
|
-
entity ZswapLedgerEvents
|
|
132
|
+
entity ZswapLedgerEvents as projection on midnight.ZswapLedgerEvents;
|
|
117
133
|
|
|
118
134
|
@readonly
|
|
119
|
-
entity DustLedgerEvents
|
|
135
|
+
entity DustLedgerEvents as projection on midnight.DustLedgerEvents;
|
|
120
136
|
|
|
121
137
|
// ========================================================================
|
|
122
138
|
// Governance & System Parameters
|
|
123
139
|
// ========================================================================
|
|
124
140
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
141
|
+
/**
|
|
142
|
+
* Current system parameters
|
|
143
|
+
*/
|
|
128
144
|
@readonly
|
|
129
|
-
entity SystemParameters
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
145
|
+
entity SystemParameters as projection on midnight.SystemParameters
|
|
146
|
+
actions {
|
|
147
|
+
// Get current active parameters
|
|
148
|
+
@cds.odata.bindingparameter.collection
|
|
149
|
+
function current() returns SystemParameters;
|
|
150
|
+
};
|
|
134
151
|
|
|
135
152
|
/**
|
|
136
153
|
* D-Parameter change history for governance tracking
|
|
137
154
|
*/
|
|
138
155
|
@readonly
|
|
139
|
-
entity DParameterHistory
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
156
|
+
entity DParameterHistory as
|
|
157
|
+
projection on midnight.DParameterHistory {
|
|
158
|
+
*,
|
|
159
|
+
block
|
|
160
|
+
};
|
|
143
161
|
|
|
144
162
|
/**
|
|
145
163
|
* Terms and Conditions history
|
|
146
164
|
*/
|
|
147
165
|
@readonly
|
|
148
|
-
entity TermsAndConditionsHistory as
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
166
|
+
entity TermsAndConditionsHistory as
|
|
167
|
+
projection on midnight.TermsAndConditionsHistory {
|
|
168
|
+
*,
|
|
169
|
+
block
|
|
170
|
+
};
|
|
152
171
|
|
|
153
172
|
// ========================================================================
|
|
154
173
|
// DUST Generation
|
|
155
174
|
// ========================================================================
|
|
156
175
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
176
|
+
/**
|
|
177
|
+
* DUST generation status for Cardano staking rewards
|
|
178
|
+
*/
|
|
160
179
|
@readonly
|
|
161
|
-
entity DustGenerationStatus
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
180
|
+
entity DustGenerationStatus as projection on midnight.DustGenerationStatus
|
|
181
|
+
actions {
|
|
182
|
+
// Query by Cardano reward address
|
|
183
|
+
@cds.odata.bindingparameter.collection
|
|
184
|
+
function byCardanoAddress(address: String) returns DustGenerationStatus;
|
|
165
185
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
186
|
+
// Batch query for multiple addresses
|
|
187
|
+
@cds.odata.bindingparameter.collection
|
|
188
|
+
function byCardanoAddresses(addresses: array of String) returns array of DustGenerationStatus;
|
|
189
|
+
};
|
|
170
190
|
|
|
171
191
|
// ========================================================================
|
|
172
192
|
// Balance & Token Tracking
|
|
173
193
|
// ========================================================================
|
|
174
194
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
195
|
+
/**
|
|
196
|
+
* Unshielded NIGHT token balances per address
|
|
197
|
+
*/
|
|
178
198
|
@readonly
|
|
179
|
-
entity NightBalances
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
199
|
+
entity NightBalances as projection on midnight.NightBalances
|
|
200
|
+
actions {
|
|
201
|
+
// Get balance for a specific address
|
|
202
|
+
@cds.odata.bindingparameter.collection
|
|
203
|
+
function getBalance(address: String) returns NightBalances;
|
|
204
|
+
|
|
205
|
+
// Get top holders by balance
|
|
206
|
+
@cds.odata.bindingparameter.collection
|
|
207
|
+
function getTopHolders(limit: Integer) returns array of NightBalances;
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* NIGHT ↔ DUST registration linkage
|
|
212
|
+
*/
|
|
192
213
|
@readonly
|
|
193
|
-
entity DustRegistrations
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
214
|
+
entity DustRegistrations as projection on midnight.DustRegistrations
|
|
215
|
+
actions {
|
|
216
|
+
// Get registration by Cardano stake key
|
|
217
|
+
@cds.odata.bindingparameter.collection
|
|
218
|
+
function byCardanoStakeKey(stakeKey: String) returns DustRegistrations;
|
|
219
|
+
};
|
|
198
220
|
|
|
199
221
|
/**
|
|
200
222
|
* Token type registry
|
|
201
223
|
*/
|
|
202
224
|
@readonly
|
|
203
|
-
entity TokenTypes
|
|
225
|
+
entity TokenTypes as projection on midnight.TokenTypes;
|
|
204
226
|
|
|
205
227
|
// ========================================================================
|
|
206
228
|
// Session Management (Wallet Connections)
|
|
@@ -209,14 +231,50 @@ service NightgateService {
|
|
|
209
231
|
/**
|
|
210
232
|
* Wallet session management
|
|
211
233
|
*/
|
|
212
|
-
entity WalletSessions
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
234
|
+
entity WalletSessions as
|
|
235
|
+
projection on midnight.WalletSessions
|
|
236
|
+
excluding {
|
|
237
|
+
viewingKeyHash, // Internal lookup field
|
|
238
|
+
encryptedViewingKey // Encrypted key — never exposed via OData
|
|
239
|
+
}
|
|
240
|
+
actions {
|
|
241
|
+
// Connect with viewing key
|
|
242
|
+
action connectWallet(viewingKey: String) returns WalletSessions;
|
|
243
|
+
|
|
244
|
+
// Disconnect session
|
|
245
|
+
action disconnectWallet(sessionId: UUID);
|
|
246
|
+
};
|
|
222
247
|
}
|
|
248
|
+
|
|
249
|
+
// ============================================================================
|
|
250
|
+
// Service-Level Annotations
|
|
251
|
+
// ============================================================================
|
|
252
|
+
|
|
253
|
+
annotate NightgateService.Blocks with {
|
|
254
|
+
hash @title: 'Block Hash';
|
|
255
|
+
height @title: 'Block Height';
|
|
256
|
+
};
|
|
257
|
+
|
|
258
|
+
annotate NightgateService.Transactions with {
|
|
259
|
+
hash @title: 'Transaction Hash';
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
annotate NightgateService.ContractActions with {
|
|
263
|
+
address @title: 'Contract Address';
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
annotate NightgateService.DustGenerationStatus with {
|
|
267
|
+
cardanoRewardAddress @title: 'Cardano Reward Address';
|
|
268
|
+
nightBalance @title: 'NIGHT Balance';
|
|
269
|
+
generationRate @title: 'Generation Rate';
|
|
270
|
+
};
|
|
271
|
+
|
|
272
|
+
annotate NightgateService.NightBalances with {
|
|
273
|
+
address @title: 'Address';
|
|
274
|
+
balance @title: 'NIGHT Balance';
|
|
275
|
+
};
|
|
276
|
+
|
|
277
|
+
annotate NightgateService.TokenTypes with {
|
|
278
|
+
tokenTypeId @title: 'Token Type ID';
|
|
279
|
+
tokenName @title: 'Token Name';
|
|
280
|
+
};
|
package/srv/nightgate-service.js
CHANGED
|
@@ -35,6 +35,23 @@ class NightgateService extends cds_1.default.ApplicationService {
|
|
|
35
35
|
return req.reject(400, 'height is required');
|
|
36
36
|
return this.db.run(cds_1.default.ql.SELECT.one.from('midnight.Blocks').where({ height }));
|
|
37
37
|
});
|
|
38
|
+
this.on('range', 'Blocks', async (req) => {
|
|
39
|
+
const { startHeight, endHeight, limit } = req.data;
|
|
40
|
+
if (startHeight == null || endHeight == null) {
|
|
41
|
+
return req.reject(400, 'startHeight and endHeight are required');
|
|
42
|
+
}
|
|
43
|
+
if (!Number.isInteger(startHeight) || !Number.isInteger(endHeight) || startHeight < 0 || endHeight < 0) {
|
|
44
|
+
return req.reject(400, 'startHeight and endHeight must be non-negative integers');
|
|
45
|
+
}
|
|
46
|
+
if (endHeight < startHeight) {
|
|
47
|
+
return req.reject(400, 'endHeight must be greater than or equal to startHeight');
|
|
48
|
+
}
|
|
49
|
+
const effectiveLimit = Math.min(Math.max(limit || 100, 1), 5000);
|
|
50
|
+
return this.db.run(cds_1.default.ql.SELECT.from('midnight.Blocks')
|
|
51
|
+
.where({ height: { '>=': startHeight, '<=': endHeight } })
|
|
52
|
+
.orderBy('height asc')
|
|
53
|
+
.limit(effectiveLimit));
|
|
54
|
+
});
|
|
38
55
|
// ====================================================================
|
|
39
56
|
// Transaction Handlers
|
|
40
57
|
// ====================================================================
|
|
@@ -47,6 +64,16 @@ class NightgateService extends cds_1.default.ApplicationService {
|
|
|
47
64
|
return req.reject(400, 'hash is required');
|
|
48
65
|
return this.db.run(cds_1.default.ql.SELECT.from('midnight.Transactions').where({ hash }));
|
|
49
66
|
});
|
|
67
|
+
this.on('byType', 'Transactions', async (req) => {
|
|
68
|
+
const { txType, limit } = req.data;
|
|
69
|
+
if (!txType)
|
|
70
|
+
return req.reject(400, 'txType is required');
|
|
71
|
+
const effectiveLimit = Math.min(Math.max(limit || 100, 1), 2000);
|
|
72
|
+
return this.db.run(cds_1.default.ql.SELECT.from('midnight.Transactions')
|
|
73
|
+
.where({ txType })
|
|
74
|
+
.orderBy('createdAt desc')
|
|
75
|
+
.limit(effectiveLimit));
|
|
76
|
+
});
|
|
50
77
|
// ====================================================================
|
|
51
78
|
// Contract Handlers
|
|
52
79
|
// ====================================================================
|
|
@@ -175,7 +175,19 @@ class MidnightNodeProvider {
|
|
|
175
175
|
if (message.method && message.params?.subscription) {
|
|
176
176
|
const callback = this.subscriptions.get(message.params.subscription);
|
|
177
177
|
if (callback) {
|
|
178
|
-
|
|
178
|
+
try {
|
|
179
|
+
const callbackResult = callback(message.params.result);
|
|
180
|
+
if (callbackResult && typeof callbackResult.then === 'function') {
|
|
181
|
+
void callbackResult.catch((err) => {
|
|
182
|
+
const errMsg = err instanceof Error ? err.message : String(err);
|
|
183
|
+
console.error('[MidnightNode] Subscription callback failed:', errMsg);
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
const errMsg = err instanceof Error ? err.message : String(err);
|
|
189
|
+
console.error('[MidnightNode] Subscription callback failed:', errMsg);
|
|
190
|
+
}
|
|
179
191
|
}
|
|
180
192
|
return;
|
|
181
193
|
}
|
package/srv/utils/scale.d.ts
CHANGED
|
@@ -1,40 +1,41 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Minimal SCALE codec helpers for Substrate extrinsic parsing.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Includes:
|
|
5
|
+
* - compact integer decoding
|
|
6
|
+
* - pallet/call extraction
|
|
7
|
+
* - signed participant extraction (sender/receiver/amount for transfer-like calls)
|
|
6
8
|
*/
|
|
9
|
+
export interface ExtrinsicParticipantInfo {
|
|
10
|
+
isSigned: boolean;
|
|
11
|
+
palletIndex: number;
|
|
12
|
+
callIndex: number;
|
|
13
|
+
senderAddress?: string;
|
|
14
|
+
receiverAddress?: string;
|
|
15
|
+
amount?: string;
|
|
16
|
+
}
|
|
7
17
|
/**
|
|
8
|
-
* Decode a SCALE compact-encoded unsigned integer.
|
|
18
|
+
* Decode a SCALE compact-encoded unsigned integer as bigint.
|
|
9
19
|
* Returns [value, bytesConsumed] or null if buffer too short.
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* 0b11 → big-integer mode: upper 6 bits = extra bytes (not supported here)
|
|
20
|
+
*/
|
|
21
|
+
export declare function decodeCompactBigInt(buf: Buffer, offset: number): [bigint, number] | null;
|
|
22
|
+
/**
|
|
23
|
+
* Compatibility wrapper for existing callers that expect number values.
|
|
24
|
+
* Values above Number.MAX_SAFE_INTEGER are returned as 0 while preserving bytesConsumed.
|
|
16
25
|
*/
|
|
17
26
|
export declare function decodeCompact(buf: Buffer, offset: number): [number, number] | null;
|
|
18
27
|
/**
|
|
19
28
|
* Parse a hex-encoded Substrate extrinsic to extract pallet_index and call_index.
|
|
20
|
-
*
|
|
21
|
-
* Extrinsic structure:
|
|
22
|
-
* [compact_length][version_byte][...payload...]
|
|
23
|
-
*
|
|
24
|
-
* Version byte:
|
|
25
|
-
* bit 7 = signed flag (0x84 = signed v4, 0x04 = unsigned v4)
|
|
26
|
-
*
|
|
27
|
-
* Unsigned payload:
|
|
28
|
-
* [pallet_index: u8][call_index: u8][args...]
|
|
29
|
-
*
|
|
30
|
-
* Signed payload:
|
|
31
|
-
* [address_type: u8][account_id: 32B][sig_type: u8][signature: 64B]
|
|
32
|
-
* [era: 1-2B][nonce: compact][tip: compact]
|
|
33
|
-
* [pallet_index: u8][call_index: u8][args...]
|
|
34
|
-
*
|
|
35
29
|
* Returns null on parse failure (safe fallback to existing heuristics).
|
|
36
30
|
*/
|
|
37
31
|
export declare function parseExtrinsicCallIndices(hex: string): {
|
|
38
32
|
palletIndex: number;
|
|
39
33
|
callIndex: number;
|
|
40
34
|
} | null;
|
|
35
|
+
/**
|
|
36
|
+
* Extract signed sender + first transfer-style destination/amount, if present.
|
|
37
|
+
*
|
|
38
|
+
* This parser is intentionally conservative: receiver/amount are set only when
|
|
39
|
+
* the first call args decode as MultiAddress + Compact<Balance>.
|
|
40
|
+
*/
|
|
41
|
+
export declare function parseExtrinsicParticipantInfo(hex: string): ExtrinsicParticipantInfo | null;
|