@odatano/core 0.3.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.
Files changed (98) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +212 -0
  3. package/cds-plugin.js +5 -0
  4. package/config/preview/cardano-node/alonzo-genesis.json +196 -0
  5. package/config/preview/cardano-node/byron-genesis.json +117 -0
  6. package/config/preview/cardano-node/config.json +118 -0
  7. package/config/preview/cardano-node/conway-genesis.json +297 -0
  8. package/config/preview/cardano-node/shelley-genesis.json +68 -0
  9. package/config/preview/cardano-node/topology.json +19 -0
  10. package/db/schema.cds +1318 -0
  11. package/package.json +125 -0
  12. package/src/index.d.ts.map +1 -0
  13. package/src/index.js +96 -0
  14. package/src/index.js.map +1 -0
  15. package/src/plugin.d.ts.map +1 -0
  16. package/src/plugin.js +92 -0
  17. package/src/plugin.js.map +1 -0
  18. package/srv/blockchain/backends/blockfrost-backend.d.ts.map +1 -0
  19. package/srv/blockchain/backends/blockfrost-backend.js +398 -0
  20. package/srv/blockchain/backends/blockfrost-backend.js.map +1 -0
  21. package/srv/blockchain/backends/cardano-backend.d.ts.map +1 -0
  22. package/srv/blockchain/backends/cardano-backend.js +12 -0
  23. package/srv/blockchain/backends/cardano-backend.js.map +1 -0
  24. package/srv/blockchain/backends/koios-backend.d.ts.map +1 -0
  25. package/srv/blockchain/backends/koios-backend.js +537 -0
  26. package/srv/blockchain/backends/koios-backend.js.map +1 -0
  27. package/srv/blockchain/backends/ogmios-backend.d.ts.map +1 -0
  28. package/srv/blockchain/backends/ogmios-backend.js +516 -0
  29. package/srv/blockchain/backends/ogmios-backend.js.map +1 -0
  30. package/srv/blockchain/cardano-client.d.ts.map +1 -0
  31. package/srv/blockchain/cardano-client.js +377 -0
  32. package/srv/blockchain/cardano-client.js.map +1 -0
  33. package/srv/blockchain/cardano-indexer.d.ts.map +1 -0
  34. package/srv/blockchain/cardano-indexer.js +542 -0
  35. package/srv/blockchain/cardano-indexer.js.map +1 -0
  36. package/srv/blockchain/cardano-tx-builder.d.ts.map +1 -0
  37. package/srv/blockchain/cardano-tx-builder.js +232 -0
  38. package/srv/blockchain/cardano-tx-builder.js.map +1 -0
  39. package/srv/blockchain/circuit-breaker.d.ts.map +1 -0
  40. package/srv/blockchain/circuit-breaker.js +110 -0
  41. package/srv/blockchain/circuit-breaker.js.map +1 -0
  42. package/srv/blockchain/signing/external-signer.d.ts.map +1 -0
  43. package/srv/blockchain/signing/external-signer.js +302 -0
  44. package/srv/blockchain/signing/external-signer.js.map +1 -0
  45. package/srv/blockchain/signing/signature-verifier.d.ts.map +1 -0
  46. package/srv/blockchain/signing/signature-verifier.js +249 -0
  47. package/srv/blockchain/signing/signature-verifier.js.map +1 -0
  48. package/srv/blockchain/transaction-building/buildooor-tx.d.ts.map +1 -0
  49. package/srv/blockchain/transaction-building/buildooor-tx.js +636 -0
  50. package/srv/blockchain/transaction-building/buildooor-tx.js.map +1 -0
  51. package/srv/blockchain/transaction-building/cardano-tx.d.ts.map +1 -0
  52. package/srv/blockchain/transaction-building/cardano-tx.js +3 -0
  53. package/srv/blockchain/transaction-building/cardano-tx.js.map +1 -0
  54. package/srv/blockchain/transaction-building/csl-tx.d.ts.map +1 -0
  55. package/srv/blockchain/transaction-building/csl-tx.js +766 -0
  56. package/srv/blockchain/transaction-building/csl-tx.js.map +1 -0
  57. package/srv/blockchain/transaction-building/tx-builder-registry.d.ts.map +1 -0
  58. package/srv/blockchain/transaction-building/tx-builder-registry.js +67 -0
  59. package/srv/blockchain/transaction-building/tx-builder-registry.js.map +1 -0
  60. package/srv/cardano-service.cds +179 -0
  61. package/srv/cardano-service.d.ts.map +1 -0
  62. package/srv/cardano-service.js +227 -0
  63. package/srv/cardano-service.js.map +1 -0
  64. package/srv/cardano-tx-service.cds +298 -0
  65. package/srv/cardano-tx-service.d.ts.map +1 -0
  66. package/srv/cardano-tx-service.js +646 -0
  67. package/srv/cardano-tx-service.js.map +1 -0
  68. package/srv/cardano-ui.cds +2949 -0
  69. package/srv/server.d.ts.map +1 -0
  70. package/srv/server.js +212 -0
  71. package/srv/server.js.map +1 -0
  72. package/srv/utils/backend-request-handler.d.ts.map +1 -0
  73. package/srv/utils/backend-request-handler.js +47 -0
  74. package/srv/utils/backend-request-handler.js.map +1 -0
  75. package/srv/utils/const.d.ts.map +1 -0
  76. package/srv/utils/const.js +86 -0
  77. package/srv/utils/const.js.map +1 -0
  78. package/srv/utils/error-codes.d.ts.map +1 -0
  79. package/srv/utils/error-codes.js +49 -0
  80. package/srv/utils/error-codes.js.map +1 -0
  81. package/srv/utils/errors.d.ts.map +1 -0
  82. package/srv/utils/errors.js +389 -0
  83. package/srv/utils/errors.js.map +1 -0
  84. package/srv/utils/mappers.d.ts.map +1 -0
  85. package/srv/utils/mappers.js +723 -0
  86. package/srv/utils/mappers.js.map +1 -0
  87. package/srv/utils/signing-helper.d.ts.map +1 -0
  88. package/srv/utils/signing-helper.js +128 -0
  89. package/srv/utils/signing-helper.js.map +1 -0
  90. package/srv/utils/tx-build-helper.d.ts.map +1 -0
  91. package/srv/utils/tx-build-helper.js +135 -0
  92. package/srv/utils/tx-build-helper.js.map +1 -0
  93. package/srv/utils/types.d.ts.map +1 -0
  94. package/srv/utils/types.js +36 -0
  95. package/srv/utils/types.js.map +1 -0
  96. package/srv/utils/validators.d.ts.map +1 -0
  97. package/srv/utils/validators.js +382 -0
  98. package/srv/utils/validators.js.map +1 -0
@@ -0,0 +1,382 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isTxHash = isTxHash;
4
+ exports.isAssetUnit = isAssetUnit;
5
+ exports.isBlockHash = isBlockHash;
6
+ exports.isValidPoolId = isValidPoolId;
7
+ exports.isValidDrepId = isValidDrepId;
8
+ exports.isValidBech32Address = isValidBech32Address;
9
+ exports.isValidBech32StakeAddress = isValidBech32StakeAddress;
10
+ exports.isEpochNumber = isEpochNumber;
11
+ exports.isValidCbor = isValidCbor;
12
+ exports.validateTransactionInputs = validateTransactionInputs;
13
+ const bech32_1 = require("bech32");
14
+ const const_1 = require("./const");
15
+ const server_1 = require("../server");
16
+ /**
17
+ * Safely trim a string value
18
+ * @param s - The value to trim
19
+ * @returns { string | null } trimmed string or null if input is not a string or empty after trim
20
+ */
21
+ function safeTrimString(s) {
22
+ if (typeof s !== "string")
23
+ return null;
24
+ const t = s.trim();
25
+ return t.length > 0 ? t : null;
26
+ }
27
+ /**
28
+ * Strict bech32 decode with HRP allowlist.
29
+ * @param value - bech32 encoded string
30
+ * @param allowedHrp - list of allowed HRP prefixes
31
+ * @returns { prefix: string; words: number[] } decoded bech32 parts or null if invalid
32
+ */
33
+ function tryDecodeBech32WithHrp(value, allowedHrp) {
34
+ const decoded = bech32_1.bech32.decode(value, const_1.BECH32_MAX_LENGTH);
35
+ if (allowedHrp.includes(decoded.prefix)) {
36
+ return { prefix: decoded.prefix, words: decoded.words };
37
+ }
38
+ return null;
39
+ }
40
+ /**
41
+ * Convert bech32 words to byte length
42
+ * @param words - bech32 decoded words
43
+ * @returns { number } byte length of decoded words
44
+ */
45
+ function wordsToBytesLen(words) {
46
+ // bech32.fromWords validates word range and converts 5-bit words -> bytes
47
+ return Buffer.from(bech32_1.bech32.fromWords(words)).length;
48
+ }
49
+ /**
50
+ * Validate JSON string with size and complexity limits to prevent DoS
51
+ * @param jsonString - The JSON string to validate
52
+ * @param fieldName - Name of the field (for error messages)
53
+ * @returns JsonValidationResult with parsed value or error message
54
+ */
55
+ function validateJsonWithLimits(jsonString, fieldName) {
56
+ // Check size limit first (before parsing)
57
+ if (jsonString.length > const_1.MAX_JSON_SIZE) {
58
+ return { valid: false, error: `${fieldName} exceeds maximum size of ${const_1.MAX_JSON_SIZE} bytes` };
59
+ }
60
+ // Parse JSON
61
+ let parsed;
62
+ try {
63
+ parsed = JSON.parse(jsonString);
64
+ }
65
+ catch {
66
+ return { valid: false, error: `Invalid JSON in ${fieldName}` };
67
+ }
68
+ // Validate complexity recursively
69
+ const complexityError = checkJsonComplexity(parsed, 0);
70
+ if (complexityError) {
71
+ return { valid: false, error: `${fieldName}: ${complexityError}` };
72
+ }
73
+ return { valid: true, parsed };
74
+ }
75
+ /**
76
+ * Recursively check JSON complexity (depth, keys, array length, string length)
77
+ * @param value - The parsed JSON value
78
+ * @param depth - Current nesting depth
79
+ * @returns Error message if limits exceeded, null otherwise
80
+ */
81
+ function checkJsonComplexity(value, depth) {
82
+ // Check depth limit
83
+ if (depth > const_1.MAX_DEPTH) {
84
+ return `Maximum nesting depth of ${const_1.MAX_DEPTH} exceeded`;
85
+ }
86
+ if (value === null || typeof value !== 'object') {
87
+ // Check string length for primitive strings
88
+ if (typeof value === 'string' && value.length > const_1.MAX_STRING_LENGTH) {
89
+ return `String value exceeds maximum length of ${const_1.MAX_STRING_LENGTH}`;
90
+ }
91
+ return null;
92
+ }
93
+ if (Array.isArray(value)) {
94
+ // Check array length
95
+ if (value.length > const_1.MAX_ARRAY_LENGTH) {
96
+ return `Array exceeds maximum length of ${const_1.MAX_ARRAY_LENGTH}`;
97
+ }
98
+ // Recursively check array elements
99
+ for (const item of value) {
100
+ const error = checkJsonComplexity(item, depth + 1);
101
+ if (error)
102
+ return error;
103
+ }
104
+ }
105
+ else {
106
+ // Check object key count
107
+ const keys = Object.keys(value);
108
+ if (keys.length > const_1.MAX_KEYS) {
109
+ return `Object exceeds maximum key count of ${const_1.MAX_KEYS}`;
110
+ }
111
+ // Recursively check object values
112
+ for (const key of keys) {
113
+ const error = checkJsonComplexity(value[key], depth + 1);
114
+ if (error)
115
+ return error;
116
+ }
117
+ }
118
+ return null;
119
+ }
120
+ /**
121
+ * Transaction hash: 64-character hexadecimal string
122
+ * @param s - The raw value to validate against transaction hash format
123
+ * @returns { boolean } true if s is a valid transaction hash false otherwise
124
+ */
125
+ function isTxHash(s) {
126
+ return typeof s === "string" && const_1.TX_HASH_REGEX.test(s);
127
+ }
128
+ /**
129
+ * Asset unit: concatenation of policy ID (56 hex chars) + asset name (0-128 hex chars)
130
+ * @param s - The raw value to validate against asset unit format
131
+ * @returns { boolean } true if v is a valid asset unit false otherwise
132
+ */
133
+ function isAssetUnit(s) {
134
+ if (typeof s !== "string")
135
+ return false;
136
+ const t = s.trim();
137
+ // Regex ensures: 56-192 hex chars, even length, valid hex
138
+ return const_1.ASSET_UNIT_REGEX.test(t);
139
+ }
140
+ /**
141
+ * Block hash: 64-character hexadecimal string
142
+ * @param s - The raw value to validate against block hash format
143
+ * @returns { boolean } true if s is a valid block hash false otherwise
144
+ */
145
+ function isBlockHash(s) {
146
+ return typeof s === "string" && const_1.TX_HASH_REGEX.test(s);
147
+ }
148
+ /**
149
+ * Pool ID: must be bech32-decodable, HRP=pool, payload length 28 bytes.
150
+ * @param poolIdRaw - The raw value to validate against pool ID format
151
+ * @returns { boolean } true if valid pool ID false otherwise
152
+ */
153
+ function isValidPoolId(poolIdRaw) {
154
+ const poolId = safeTrimString(poolIdRaw);
155
+ if (!poolId)
156
+ return false;
157
+ // optional: cheap prefilter (keeps performance high)
158
+ if (!const_1.POOL_ID_REGEX.test(poolId))
159
+ return false;
160
+ const decoded = tryDecodeBech32WithHrp(poolId, ["pool"]);
161
+ if (decoded)
162
+ return wordsToBytesLen(decoded.words) === const_1.POOL_ID_BYTES;
163
+ return false;
164
+ }
165
+ /**
166
+ * DRep ID: must be bech32-decodable, HRP=drep.
167
+ * @param drepRaw - The raw value to validate against drep ID format
168
+ * @returns { boolean } true if valid drep ID false otherwise
169
+ */
170
+ function isValidDrepId(drepRaw) {
171
+ const drepId = safeTrimString(drepRaw);
172
+ if (!drepId)
173
+ return false;
174
+ // optional cheap prefilter
175
+ if (!const_1.DREP_ID_REGEX.test(drepId))
176
+ return false;
177
+ const decoded = tryDecodeBech32WithHrp(drepId, ["drep"]);
178
+ if (decoded)
179
+ return wordsToBytesLen(decoded.words) === const_1.DREP_ID_BYTES;
180
+ return false;
181
+ }
182
+ /**
183
+ * Validate Bech32 address: must be bech32-decodable, HRP based on network config.
184
+ * @param addrRaw - The raw value to validate against bech32 address format
185
+ * @returns { boolean } true if valid bech32 address false otherwise
186
+ */
187
+ function isValidBech32Address(addrRaw) {
188
+ const addr = safeTrimString(addrRaw);
189
+ if (!addr)
190
+ return false;
191
+ // get client to check right network
192
+ const client = (0, server_1.getCardanoClient)();
193
+ const network = client.network;
194
+ // prefilter from config to make sure it is the right network
195
+ if (!const_1.HRP[network].addr.test(addr))
196
+ return false;
197
+ const allowed = ["addr", "addr_test"];
198
+ const decoded = tryDecodeBech32WithHrp(addr, allowed);
199
+ if (decoded) {
200
+ // avoid absurdly short/long decoded payloads
201
+ const len = wordsToBytesLen(decoded.words);
202
+ return len >= 1 && len <= 128;
203
+ }
204
+ return false;
205
+ }
206
+ /**
207
+ * Validate Bech32 stake address: must be bech32-decodable, HRP based on network config.
208
+ * @param stakeRaw - The raw value to validate against stake address format
209
+ * @returns { boolean } true if valid bech32 stake address false otherwise
210
+ */
211
+ function isValidBech32StakeAddress(stakeRaw) {
212
+ const stake = safeTrimString(stakeRaw);
213
+ if (!stake)
214
+ return false;
215
+ // get client to check right network
216
+ const client = (0, server_1.getCardanoClient)();
217
+ const network = client.network;
218
+ // prefilter from config to make sure it is the right network
219
+ if (!const_1.HRP[network].stake.test(stake))
220
+ return false;
221
+ const allowed = ["stake", "stake_test"];
222
+ const decoded = tryDecodeBech32WithHrp(stake, allowed);
223
+ if (!decoded)
224
+ return false;
225
+ const len = wordsToBytesLen(decoded.words);
226
+ return len >= 1 && len <= 64;
227
+ }
228
+ /**
229
+ * Epoch number: non-negative integer within reasonable bounds
230
+ * @param s - The parameter value to validate as epoch number
231
+ * @returns { boolean } true if s is a valid epoch number false otherwise
232
+ */
233
+ function isEpochNumber(s) {
234
+ return typeof s === "number" && s >= 0 && s <= const_1.MAX_EPOCH && Number.isInteger(s);
235
+ }
236
+ /**
237
+ * Validate CBOR string: must be a non-empty even-length hexadecimal string
238
+ * @param cborRaw - The raw value to validate against CBOR format
239
+ * @returns { boolean } true if valid CBOR false otherwise
240
+ */
241
+ function isValidCbor(cborRaw) {
242
+ const cbor = safeTrimString(cborRaw);
243
+ if (!cbor)
244
+ return false;
245
+ // basic validation: must be even-length hex string
246
+ return /^[a-f0-9]+$/i.test(cbor) && cbor.length % 2 === 0;
247
+ }
248
+ /**
249
+ * Validate transaction build inputs and return validation errors if any
250
+ * @param inputs - Transaction input fields to validate
251
+ * @param requiredFields - List of required field names
252
+ * @returns Array of validation errors, empty if all valid
253
+ */
254
+ function validateTransactionInputs(inputs, requiredFields) {
255
+ const errors = [];
256
+ // Check required fields
257
+ for (const field of requiredFields) {
258
+ if (inputs[field] === undefined || inputs[field] === null || inputs[field] === '') {
259
+ errors.push({
260
+ type: 'missing',
261
+ field,
262
+ message: `${field} is required`
263
+ });
264
+ }
265
+ }
266
+ // If required fields are missing, return early
267
+ if (errors.length > 0)
268
+ return errors;
269
+ // Validate address formats
270
+ if (inputs.senderAddress && !isValidBech32Address(inputs.senderAddress)) {
271
+ errors.push({
272
+ type: 'invalid',
273
+ field: 'senderAddress',
274
+ message: 'Invalid sender address format'
275
+ });
276
+ }
277
+ if (inputs.recipientAddress && !isValidBech32Address(inputs.recipientAddress)) {
278
+ errors.push({
279
+ type: 'invalid',
280
+ field: 'recipientAddress',
281
+ message: 'Invalid recipient address format'
282
+ });
283
+ }
284
+ if (inputs.changeAddress && !isValidBech32Address(inputs.changeAddress)) {
285
+ errors.push({
286
+ type: 'invalid',
287
+ field: 'changeAddress',
288
+ message: 'Invalid change address format'
289
+ });
290
+ }
291
+ // Validate CBOR format
292
+ if (inputs.signedTxCbor && !isValidCbor(inputs.signedTxCbor)) {
293
+ errors.push({
294
+ type: 'invalid',
295
+ field: 'signedTxCbor',
296
+ message: 'Invalid signedTxCbor format'
297
+ });
298
+ }
299
+ if (inputs.mintingPolicyScript && !isValidCbor(inputs.mintingPolicyScript)) {
300
+ errors.push({
301
+ type: 'invalid',
302
+ field: 'mintingPolicyScript',
303
+ message: 'Invalid mintingPolicyScript format'
304
+ });
305
+ }
306
+ if (inputs.validatorScript && !isValidCbor(inputs.validatorScript)) {
307
+ errors.push({
308
+ type: 'invalid',
309
+ field: 'validatorScript',
310
+ message: 'Invalid validatorScript format'
311
+ });
312
+ }
313
+ if (inputs.scriptTxHash && !isTxHash(inputs.scriptTxHash)) {
314
+ errors.push({
315
+ type: 'invalid',
316
+ field: 'scriptTxHash',
317
+ message: 'Invalid scriptTxHash format'
318
+ });
319
+ }
320
+ if (inputs.scriptOutputIndex !== undefined && inputs.scriptOutputIndex !== null) {
321
+ if (!Number.isInteger(inputs.scriptOutputIndex) || inputs.scriptOutputIndex < 0) {
322
+ errors.push({
323
+ type: 'invalid',
324
+ field: 'scriptOutputIndex',
325
+ message: 'scriptOutputIndex must be a non-negative integer'
326
+ });
327
+ }
328
+ }
329
+ // Validate JSON fields with size and complexity limits
330
+ if (inputs.metadataJson) {
331
+ const result = validateJsonWithLimits(inputs.metadataJson, 'metadataJson');
332
+ if (!result.valid) {
333
+ errors.push({
334
+ type: 'invalid',
335
+ field: 'metadataJson',
336
+ message: result.error
337
+ });
338
+ }
339
+ }
340
+ if (inputs.assetsJson) {
341
+ const result = validateJsonWithLimits(inputs.assetsJson, 'assetsJson');
342
+ if (!result.valid) {
343
+ errors.push({
344
+ type: 'invalid',
345
+ field: 'assetsJson',
346
+ message: result.error
347
+ });
348
+ }
349
+ }
350
+ if (inputs.mintActionsJson) {
351
+ const result = validateJsonWithLimits(inputs.mintActionsJson, 'mintActionsJson');
352
+ if (!result.valid) {
353
+ errors.push({
354
+ type: 'invalid',
355
+ field: 'mintActionsJson',
356
+ message: result.error
357
+ });
358
+ }
359
+ }
360
+ if (inputs.redeemerJson) {
361
+ const result = validateJsonWithLimits(inputs.redeemerJson, 'redeemerJson');
362
+ if (!result.valid) {
363
+ errors.push({
364
+ type: 'invalid',
365
+ field: 'redeemerJson',
366
+ message: result.error
367
+ });
368
+ }
369
+ }
370
+ if (inputs.datumJson) {
371
+ const result = validateJsonWithLimits(inputs.datumJson, 'datumJson');
372
+ if (!result.valid) {
373
+ errors.push({
374
+ type: 'invalid',
375
+ field: 'datumJson',
376
+ message: result.error
377
+ });
378
+ }
379
+ }
380
+ return errors;
381
+ }
382
+ //# sourceMappingURL=validators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.js","sourceRoot":"","sources":["validators.ts"],"names":[],"mappings":"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"}