@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 @@
1
+ {"version":3,"file":"external-signer.js","sourceRoot":"","sources":["external-signer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signature-verifier.d.ts","sourceRoot":"","sources":["signature-verifier.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,2BAA2B,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAIrF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,iBAAiB;IAC5B;;;;;;OAMG;IACI,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,2BAA2B;IA+GnG;;;;;;OAMG;IACI,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,2BAA2B;IAa1G;;;;;;OAMG;IACI,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAehD;;;;;OAKG;IACI,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAYxC;;;;;OAKG;IACI,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;CAW/C;AAKD;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,iBAAiB,CAKxD"}
@@ -0,0 +1,249 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.SignatureVerifier = void 0;
40
+ exports.getSignatureVerifier = getSignatureVerifier;
41
+ const cds_1 = __importDefault(require("@sap/cds"));
42
+ const CSL = __importStar(require("@emurgo/cardano-serialization-lib-nodejs"));
43
+ const cardano_ledger_ts_1 = require("@harmoniclabs/cardano-ledger-ts");
44
+ const uint8array_utils_1 = require("@harmoniclabs/uint8array-utils");
45
+ const errors_1 = require("../../utils/errors");
46
+ const error_codes_1 = require("../../utils/error-codes");
47
+ const logger = cds_1.default.log('SignatureVerifier');
48
+ /**
49
+ * SignatureVerifier - Verifies transaction signatures without accessing private keys
50
+ *
51
+ * This module provides signature verification for externally signed transactions.
52
+ * It ensures:
53
+ * 1. The signed CBOR is valid and parseable
54
+ * 2. The transaction body hash matches the expected hash (integrity check)
55
+ * 3. Required signatures are present (when specified)
56
+ * 4. No tampering occurred between build and sign steps
57
+ *
58
+ * ARCHITECTURE NOTE - Dual-Library Approach:
59
+ * This verifier deliberately uses two Cardano libraries:
60
+ * - Harmoniclabs (@harmoniclabs/cardano-ledger-ts): For CBOR parsing and transaction body
61
+ * hash computation. Harmoniclabs preserves the original CBOR byte encoding, producing
62
+ * correct Blake2b-256 hashes. CSL's parse/re-serialize round-trip normalizes CBOR,
63
+ * which changes the bytes and produces incorrect hashes.
64
+ * - CSL (@emurgo/cardano-serialization-lib-nodejs): For witness set extraction and
65
+ * Ed25519 cryptographic signature verification. CSL provides a well-tested Ed25519
66
+ * verify() API. Witness extraction is independent of body hash computation.
67
+ *
68
+ * This is safe because: the hash is computed from original bytes (Harmoniclabs),
69
+ * witnesses are structural data extracted separately (CSL), and Ed25519 verify is a
70
+ * pure cryptographic operation on raw bytes unaffected by CBOR encoding differences.
71
+ */
72
+ class SignatureVerifier {
73
+ /**
74
+ * Verify a signed transaction
75
+ *
76
+ * @param signedTxCbor - The signed transaction in CBOR hex format
77
+ * @param options - Verification options
78
+ * @returns Verification result with details
79
+ */
80
+ verify(signedTxCbor, options = {}) {
81
+ const result = {
82
+ isValid: false,
83
+ txBodyHash: '',
84
+ witnessCount: 0,
85
+ signerKeyHashes: [],
86
+ warnings: [],
87
+ };
88
+ try {
89
+ // Parse the signed transaction CBOR using harmoniclabs
90
+ // IMPORTANT: We use harmoniclabs for hash computation because CSL's
91
+ // parse/re-serialize round-trip changes CBOR encoding, producing wrong hashes.
92
+ const txBytesHarmonic = (0, uint8array_utils_1.fromHex)(signedTxCbor);
93
+ const txHarmonic = cardano_ledger_ts_1.Tx.fromCbor(txBytesHarmonic);
94
+ const computedHash = txHarmonic.hash.toString();
95
+ result.txBodyHash = computedHash;
96
+ logger.debug(`Computed transaction body hash (harmoniclabs): ${computedHash}`);
97
+ // Also parse with CSL for witness extraction and Ed25519 verification
98
+ // (structural extraction independent of body hash computation - see class doc)
99
+ const txBytes = Buffer.from(signedTxCbor, 'hex');
100
+ const tx = CSL.Transaction.from_bytes(txBytes);
101
+ // Verify transaction body hash matches expected (if provided)
102
+ if (options.expectedTxBodyHash) {
103
+ if (computedHash.toLowerCase() !== options.expectedTxBodyHash.toLowerCase()) {
104
+ result.errorMessage = `Transaction body hash mismatch. Expected: ${options.expectedTxBodyHash}, Got: ${computedHash}. The transaction may have been tampered with.`;
105
+ logger.warn(result.errorMessage);
106
+ return result;
107
+ }
108
+ logger.debug('Transaction body hash verified successfully');
109
+ }
110
+ // Extract witness set
111
+ const witnessSet = tx.witness_set();
112
+ const vkeyWitnesses = witnessSet.vkeys();
113
+ if (vkeyWitnesses) {
114
+ result.witnessCount = vkeyWitnesses.len();
115
+ // Extract signer public key hashes
116
+ for (let i = 0; i < vkeyWitnesses.len(); i++) {
117
+ const witness = vkeyWitnesses.get(i);
118
+ const vkey = witness.vkey();
119
+ const pubKeyHash = vkey.public_key().hash();
120
+ result.signerKeyHashes.push(Buffer.from(pubKeyHash.to_bytes()).toString('hex'));
121
+ }
122
+ logger.debug(`Found ${result.witnessCount} witness(es): ${result.signerKeyHashes.join(', ')}`);
123
+ }
124
+ // Check if signature is required but missing
125
+ if (options.requireSignature !== false && result.witnessCount === 0) {
126
+ result.errorMessage = 'No signatures found in transaction. The transaction must be signed before submission.';
127
+ logger.warn(result.errorMessage);
128
+ return result;
129
+ }
130
+ // Verify required signers (if specified)
131
+ if (options.requiredSigners && options.requiredSigners.length > 0) {
132
+ const missingSigners = options.requiredSigners.filter(required => !result.signerKeyHashes.some(signer => signer.toLowerCase() === required.toLowerCase()));
133
+ if (missingSigners.length > 0) {
134
+ result.errorMessage = `Missing required signatures from: ${missingSigners.join(', ')}`;
135
+ result.warnings.push(result.errorMessage);
136
+ logger.warn(result.errorMessage);
137
+ return result;
138
+ }
139
+ }
140
+ // Verify each signature cryptographically
141
+ if (vkeyWitnesses && vkeyWitnesses.len() > 0) {
142
+ const bodyHash = CSL.TransactionHash.from_bytes(Buffer.from(computedHash, 'hex'));
143
+ for (let i = 0; i < vkeyWitnesses.len(); i++) {
144
+ const witness = vkeyWitnesses.get(i);
145
+ const vkey = witness.vkey();
146
+ const signature = witness.signature();
147
+ const publicKey = vkey.public_key();
148
+ // Verify the signature against the transaction body hash
149
+ const isValidSig = publicKey.verify(bodyHash.to_bytes(), signature);
150
+ if (!isValidSig) {
151
+ result.errorMessage = `Invalid signature at witness index ${i}. The signature does not match the transaction body.`;
152
+ logger.warn(result.errorMessage);
153
+ return result;
154
+ }
155
+ }
156
+ logger.debug('All signatures verified cryptographically');
157
+ }
158
+ // All checks passed
159
+ result.isValid = true;
160
+ logger.info(`Signature verification successful. ${result.witnessCount} valid signature(s).`);
161
+ }
162
+ catch (error) {
163
+ result.errorMessage = `Failed to verify signature: ${error.message}`;
164
+ logger.error(result.errorMessage);
165
+ }
166
+ return result;
167
+ }
168
+ /**
169
+ * Verify signature and throw on failure
170
+ *
171
+ * @param signedTxCbor - The signed transaction in CBOR hex format
172
+ * @param options - Verification options
173
+ * @throws {TransactionValidationError} if verification fails
174
+ */
175
+ verifyOrThrow(signedTxCbor, options = {}) {
176
+ const result = this.verify(signedTxCbor, options);
177
+ if (!result.isValid) {
178
+ throw new errors_1.TransactionValidationError(result.errorMessage || 'Signature verification failed', new Error(result.errorMessage));
179
+ }
180
+ return result;
181
+ }
182
+ /**
183
+ * Extract transaction body hash from unsigned or signed CBOR
184
+ *
185
+ * @param txCbor - Transaction CBOR (signed or unsigned)
186
+ * @returns Transaction body hash as hex string
187
+ * @throws {Error} if CBOR is invalid
188
+ */
189
+ extractTxBodyHash(txCbor) {
190
+ try {
191
+ // Use harmoniclabs for consistent hash computation
192
+ const txBytes = (0, uint8array_utils_1.fromHex)(txCbor);
193
+ const tx = cardano_ledger_ts_1.Tx.fromCbor(txBytes);
194
+ return tx.hash.toString();
195
+ }
196
+ catch (error) {
197
+ throw new errors_1.BackendError(`Failed to extract transaction body hash: ${error.message}`, 400, error_codes_1.ERROR_CODES.INVALID_INPUT);
198
+ }
199
+ }
200
+ /**
201
+ * Check if a transaction is signed (has witnesses)
202
+ *
203
+ * @param txCbor - Transaction CBOR
204
+ * @returns true if transaction has at least one witness
205
+ */
206
+ isSigned(txCbor) {
207
+ try {
208
+ const txBytes = Buffer.from(txCbor, 'hex');
209
+ const tx = CSL.Transaction.from_bytes(txBytes);
210
+ const witnessSet = tx.witness_set();
211
+ const vkeyWitnesses = witnessSet.vkeys();
212
+ return vkeyWitnesses !== undefined && vkeyWitnesses.len() > 0;
213
+ }
214
+ catch {
215
+ return false;
216
+ }
217
+ }
218
+ /**
219
+ * Get witness count from transaction
220
+ *
221
+ * @param txCbor - Transaction CBOR
222
+ * @returns Number of witnesses
223
+ */
224
+ getWitnessCount(txCbor) {
225
+ try {
226
+ const txBytes = Buffer.from(txCbor, 'hex');
227
+ const tx = CSL.Transaction.from_bytes(txBytes);
228
+ const witnessSet = tx.witness_set();
229
+ const vkeyWitnesses = witnessSet.vkeys();
230
+ return vkeyWitnesses ? vkeyWitnesses.len() : 0;
231
+ }
232
+ catch {
233
+ return 0;
234
+ }
235
+ }
236
+ }
237
+ exports.SignatureVerifier = SignatureVerifier;
238
+ // Singleton instance
239
+ let verifierInstance = null;
240
+ /**
241
+ * Get the singleton SignatureVerifier instance
242
+ */
243
+ function getSignatureVerifier() {
244
+ if (!verifierInstance) {
245
+ verifierInstance = new SignatureVerifier();
246
+ }
247
+ return verifierInstance;
248
+ }
249
+ //# sourceMappingURL=signature-verifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signature-verifier.js","sourceRoot":"","sources":["signature-verifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildooor-tx.d.ts","sourceRoot":"","sources":["buildooor-tx.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,cAAc,EAAE,aAAa,EAAkC,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AA0BhM,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAKlD;;GAEG;AACH,qBAAa,kBAAmB,YAAW,gBAAgB;IACzD,SAAgB,IAAI,wBAAwB;IAC5C,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,aAAa,CAAiB;IAEtC;;;;OAIG;IACU,IAAI,CAAC,MAAM,EAAE,aAAa,EAAE,cAAc,CAAC,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQlG;;;;;OAKG;IACU,wBAAwB,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IA+D1F,oCAAoC,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IA8DtG,kCAAkC,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IA4EpG,4BAA4B,CAAC,GAAG,EAAE,kBAAkB,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IAqLlG,mCAAmC,CAAC,GAAG,EAAE,yBAAyB,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IA0K7H;;;;OAIG;IACH,OAAO,CAAC,qCAAqC;IAiB7C;;;;OAIG;IACH,OAAO,CAAC,2BAA2B;IAsBnC;;;;OAIG;IACH,OAAO,CAAC,8BAA8B;IA+BtC;;;;OAIG;IACH,OAAO,CAAC,mCAAmC;IAsB3C;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;CA0B3B"}