@psavelis/enterprise-blockchain 0.1.0 → 1.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 +15 -2
- package/dist/aid-settlement/application/reconciler.d.ts +13 -0
- package/dist/aid-settlement/application/reconciler.d.ts.map +1 -0
- package/dist/aid-settlement/application/reconciler.js +77 -0
- package/dist/aid-settlement/domain/entities.d.ts +24 -0
- package/dist/aid-settlement/domain/entities.d.ts.map +1 -0
- package/dist/aid-settlement/domain/entities.js +1 -0
- package/dist/aid-settlement/domain/ports.d.ts +10 -0
- package/dist/aid-settlement/domain/ports.d.ts.map +1 -0
- package/dist/aid-settlement/domain/ports.js +1 -0
- package/dist/aid-settlement/index.d.ts +19 -0
- package/dist/aid-settlement/index.d.ts.map +1 -0
- package/dist/aid-settlement/index.js +23 -0
- package/dist/aid-settlement/infrastructure/in-memory-store.d.ts +12 -0
- package/dist/aid-settlement/infrastructure/in-memory-store.d.ts.map +1 -0
- package/dist/aid-settlement/infrastructure/in-memory-store.js +17 -0
- package/dist/credentialing/application/clearance-evaluator.d.ts +10 -0
- package/dist/credentialing/application/clearance-evaluator.d.ts.map +1 -0
- package/dist/credentialing/application/clearance-evaluator.js +63 -0
- package/dist/credentialing/domain/entities.d.ts +28 -0
- package/dist/credentialing/domain/entities.d.ts.map +1 -0
- package/dist/credentialing/domain/entities.js +1 -0
- package/dist/credentialing/domain/ports.d.ts +9 -0
- package/dist/credentialing/domain/ports.d.ts.map +1 -0
- package/dist/credentialing/domain/ports.js +1 -0
- package/dist/credentialing/index.d.ts +19 -0
- package/dist/credentialing/index.d.ts.map +1 -0
- package/dist/credentialing/index.js +23 -0
- package/dist/credentialing/infrastructure/in-memory-store.d.ts +11 -0
- package/dist/credentialing/infrastructure/in-memory-store.d.ts.map +1 -0
- package/dist/credentialing/infrastructure/in-memory-store.js +14 -0
- package/dist/hsm/application/asymmetric-key-service.d.ts +23 -0
- package/dist/hsm/application/asymmetric-key-service.d.ts.map +1 -0
- package/dist/hsm/application/asymmetric-key-service.js +109 -0
- package/dist/hsm/application/envelope-encryption-service.d.ts +18 -0
- package/dist/hsm/application/envelope-encryption-service.d.ts.map +1 -0
- package/dist/hsm/application/envelope-encryption-service.js +59 -0
- package/dist/hsm/application/symmetric-key-service.d.ts +34 -0
- package/dist/hsm/application/symmetric-key-service.d.ts.map +1 -0
- package/dist/hsm/application/symmetric-key-service.js +107 -0
- package/dist/hsm/domain/entities.d.ts +104 -0
- package/dist/hsm/domain/entities.d.ts.map +1 -0
- package/dist/hsm/domain/entities.js +10 -0
- package/dist/hsm/domain/ports.d.ts +20 -0
- package/dist/hsm/domain/ports.d.ts.map +1 -0
- package/dist/hsm/domain/ports.js +1 -0
- package/dist/hsm/index.d.ts +48 -0
- package/dist/hsm/index.d.ts.map +1 -0
- package/dist/hsm/index.js +97 -0
- package/dist/hsm/infrastructure/audit-log-factory.d.ts +59 -0
- package/dist/hsm/infrastructure/audit-log-factory.d.ts.map +1 -0
- package/dist/hsm/infrastructure/audit-log-factory.js +95 -0
- package/dist/hsm/infrastructure/audit-log.d.ts +8 -0
- package/dist/hsm/infrastructure/audit-log.d.ts.map +1 -0
- package/dist/hsm/infrastructure/audit-log.js +18 -0
- package/dist/hsm/infrastructure/file-audit-log.d.ts +55 -0
- package/dist/hsm/infrastructure/file-audit-log.d.ts.map +1 -0
- package/dist/hsm/infrastructure/file-audit-log.js +128 -0
- package/dist/hsm/infrastructure/key-store.d.ts +9 -0
- package/dist/hsm/infrastructure/key-store.d.ts.map +1 -0
- package/dist/hsm/infrastructure/key-store.js +12 -0
- package/dist/hsm/infrastructure/syslog-audit-log.d.ts +64 -0
- package/dist/hsm/infrastructure/syslog-audit-log.d.ts.map +1 -0
- package/dist/hsm/infrastructure/syslog-audit-log.js +167 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/integrations/besu-client/error-mapper.d.ts +9 -0
- package/dist/integrations/besu-client/error-mapper.d.ts.map +1 -0
- package/dist/integrations/besu-client/error-mapper.js +22 -0
- package/dist/integrations/besu-client/index.d.ts +65 -0
- package/dist/integrations/besu-client/index.d.ts.map +1 -0
- package/dist/integrations/besu-client/index.js +276 -0
- package/dist/integrations/besu-client/ports.d.ts +44 -0
- package/dist/integrations/besu-client/ports.d.ts.map +1 -0
- package/dist/integrations/besu-client/ports.js +1 -0
- package/dist/integrations/corda-gateway/index.d.ts +37 -0
- package/dist/integrations/corda-gateway/index.d.ts.map +1 -0
- package/dist/integrations/corda-gateway/index.js +234 -0
- package/dist/integrations/corda-gateway/ports.d.ts +33 -0
- package/dist/integrations/corda-gateway/ports.d.ts.map +1 -0
- package/dist/integrations/corda-gateway/ports.js +1 -0
- package/dist/integrations/fabric-gateway/index.d.ts +78 -0
- package/dist/integrations/fabric-gateway/index.d.ts.map +1 -0
- package/dist/integrations/fabric-gateway/index.js +214 -0
- package/dist/integrations/fabric-gateway/ports.d.ts +50 -0
- package/dist/integrations/fabric-gateway/ports.d.ts.map +1 -0
- package/dist/integrations/fabric-gateway/ports.js +1 -0
- package/dist/integrations/index.d.ts +19 -0
- package/dist/integrations/index.d.ts.map +1 -0
- package/dist/integrations/index.js +19 -0
- package/dist/integrations/shared/env.d.ts +4 -0
- package/dist/integrations/shared/env.d.ts.map +1 -0
- package/dist/integrations/shared/env.js +24 -0
- package/dist/integrations/shared/retry.d.ts +79 -0
- package/dist/integrations/shared/retry.d.ts.map +1 -0
- package/dist/integrations/shared/retry.js +315 -0
- package/dist/mpc/adapters.d.ts +36 -0
- package/dist/mpc/adapters.d.ts.map +1 -0
- package/dist/mpc/adapters.js +46 -0
- package/dist/mpc/crypto.d.ts +2 -0
- package/dist/mpc/crypto.d.ts.map +1 -0
- package/dist/mpc/crypto.js +2 -0
- package/dist/mpc/dsa.d.ts +134 -0
- package/dist/mpc/dsa.d.ts.map +1 -0
- package/dist/mpc/dsa.js +127 -0
- package/dist/mpc/field.d.ts +127 -0
- package/dist/mpc/field.d.ts.map +1 -0
- package/dist/mpc/field.js +209 -0
- package/dist/mpc/hybrid-kem.d.ts +96 -0
- package/dist/mpc/hybrid-kem.d.ts.map +1 -0
- package/dist/mpc/hybrid-kem.js +136 -0
- package/dist/mpc/index.d.ts +135 -0
- package/dist/mpc/index.d.ts.map +1 -0
- package/dist/mpc/index.js +348 -0
- package/dist/mpc/kyber.d.ts +134 -0
- package/dist/mpc/kyber.d.ts.map +1 -0
- package/dist/mpc/kyber.js +143 -0
- package/dist/mpc/ports.d.ts +67 -0
- package/dist/mpc/ports.d.ts.map +1 -0
- package/dist/mpc/ports.js +9 -0
- package/dist/mpc/quantum.d.ts +80 -0
- package/dist/mpc/quantum.d.ts.map +1 -0
- package/dist/mpc/quantum.js +180 -0
- package/dist/p2mr/adapters.d.ts +31 -0
- package/dist/p2mr/adapters.d.ts.map +1 -0
- package/dist/p2mr/adapters.js +35 -0
- package/dist/p2mr/index.d.ts +63 -0
- package/dist/p2mr/index.d.ts.map +1 -0
- package/dist/p2mr/index.js +59 -0
- package/dist/p2mr/merkle-tree.d.ts +109 -0
- package/dist/p2mr/merkle-tree.d.ts.map +1 -0
- package/dist/p2mr/merkle-tree.js +239 -0
- package/dist/p2mr/p2mr-output.d.ts +142 -0
- package/dist/p2mr/p2mr-output.d.ts.map +1 -0
- package/dist/p2mr/p2mr-output.js +150 -0
- package/dist/p2mr/ports.d.ts +52 -0
- package/dist/p2mr/ports.d.ts.map +1 -0
- package/dist/p2mr/ports.js +9 -0
- package/dist/p2mr/script-interpreter.d.ts +92 -0
- package/dist/p2mr/script-interpreter.d.ts.map +1 -0
- package/dist/p2mr/script-interpreter.js +535 -0
- package/dist/p2mr/script-leaf.d.ts +70 -0
- package/dist/p2mr/script-leaf.d.ts.map +1 -0
- package/dist/p2mr/script-leaf.js +203 -0
- package/dist/p2mr/spend-proof.d.ts +95 -0
- package/dist/p2mr/spend-proof.d.ts.map +1 -0
- package/dist/p2mr/spend-proof.js +358 -0
- package/dist/p2mr/types.d.ts +209 -0
- package/dist/p2mr/types.d.ts.map +1 -0
- package/dist/p2mr/types.js +9 -0
- package/dist/privacy/application/view-projector.d.ts +13 -0
- package/dist/privacy/application/view-projector.d.ts.map +1 -0
- package/dist/privacy/application/view-projector.js +85 -0
- package/dist/privacy/domain/entities.d.ts +26 -0
- package/dist/privacy/domain/entities.d.ts.map +1 -0
- package/dist/privacy/domain/entities.js +1 -0
- package/dist/privacy/domain/ports.d.ts +7 -0
- package/dist/privacy/domain/ports.d.ts.map +1 -0
- package/dist/privacy/domain/ports.js +1 -0
- package/dist/privacy/index.d.ts +21 -0
- package/dist/privacy/index.d.ts.map +1 -0
- package/dist/privacy/index.js +25 -0
- package/dist/privacy/infrastructure/in-memory-store.d.ts +8 -0
- package/dist/privacy/infrastructure/in-memory-store.d.ts.map +1 -0
- package/dist/privacy/infrastructure/in-memory-store.js +7 -0
- package/dist/protocols/besu-port.d.ts +80 -0
- package/dist/protocols/besu-port.d.ts.map +1 -0
- package/dist/protocols/besu-port.js +1 -0
- package/dist/protocols/corda-port.d.ts +103 -0
- package/dist/protocols/corda-port.d.ts.map +1 -0
- package/dist/protocols/corda-port.js +9 -0
- package/dist/protocols/credentialing-port.d.ts +11 -0
- package/dist/protocols/credentialing-port.d.ts.map +1 -0
- package/dist/protocols/credentialing-port.js +1 -0
- package/dist/protocols/fabric-port.d.ts +89 -0
- package/dist/protocols/fabric-port.d.ts.map +1 -0
- package/dist/protocols/fabric-port.js +9 -0
- package/dist/protocols/index.d.ts +14 -0
- package/dist/protocols/index.d.ts.map +1 -0
- package/dist/protocols/index.js +7 -0
- package/dist/protocols/p2mr-port.d.ts +159 -0
- package/dist/protocols/p2mr-port.d.ts.map +1 -0
- package/dist/protocols/p2mr-port.js +12 -0
- package/dist/protocols/privacy-port.d.ts +9 -0
- package/dist/protocols/privacy-port.d.ts.map +1 -0
- package/dist/protocols/privacy-port.js +1 -0
- package/dist/protocols/traceability-port.d.ts +12 -0
- package/dist/protocols/traceability-port.d.ts.map +1 -0
- package/dist/protocols/traceability-port.js +1 -0
- package/dist/shared/collection-store.d.ts +12 -0
- package/dist/shared/collection-store.d.ts.map +1 -0
- package/dist/shared/collection-store.js +26 -0
- package/dist/shared/commit.d.ts +24 -0
- package/dist/shared/commit.d.ts.map +1 -0
- package/dist/shared/commit.js +50 -0
- package/dist/shared/crypto.d.ts +2 -0
- package/dist/shared/crypto.d.ts.map +1 -0
- package/dist/shared/crypto.js +4 -0
- package/dist/shared/date.d.ts +2 -0
- package/dist/shared/date.d.ts.map +1 -0
- package/dist/shared/date.js +3 -0
- package/dist/shared/index.d.ts +9 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/index.js +11 -0
- package/dist/shared/logger.d.ts +37 -0
- package/dist/shared/logger.d.ts.map +1 -0
- package/dist/shared/logger.js +45 -0
- package/dist/shared/store.d.ts +25 -0
- package/dist/shared/store.d.ts.map +1 -0
- package/dist/shared/store.js +18 -0
- package/dist/shared/telemetry-sdk.d.ts +26 -0
- package/dist/shared/telemetry-sdk.d.ts.map +1 -0
- package/dist/shared/telemetry-sdk.js +97 -0
- package/dist/shared/telemetry.d.ts +86 -0
- package/dist/shared/telemetry.d.ts.map +1 -0
- package/dist/shared/telemetry.js +137 -0
- package/dist/stark-settlement/application/aggregator-service.d.ts +112 -0
- package/dist/stark-settlement/application/aggregator-service.d.ts.map +1 -0
- package/dist/stark-settlement/application/aggregator-service.js +256 -0
- package/dist/stark-settlement/application/ledger-service.d.ts +114 -0
- package/dist/stark-settlement/application/ledger-service.d.ts.map +1 -0
- package/dist/stark-settlement/application/ledger-service.js +318 -0
- package/dist/stark-settlement/application/settlement-service.d.ts +104 -0
- package/dist/stark-settlement/application/settlement-service.d.ts.map +1 -0
- package/dist/stark-settlement/application/settlement-service.js +251 -0
- package/dist/stark-settlement/domain/entities.d.ts +365 -0
- package/dist/stark-settlement/domain/entities.d.ts.map +1 -0
- package/dist/stark-settlement/domain/entities.js +29 -0
- package/dist/stark-settlement/domain/ports.d.ts +485 -0
- package/dist/stark-settlement/domain/ports.d.ts.map +1 -0
- package/dist/stark-settlement/domain/ports.js +14 -0
- package/dist/stark-settlement/domain/value-objects.d.ts +268 -0
- package/dist/stark-settlement/domain/value-objects.d.ts.map +1 -0
- package/dist/stark-settlement/domain/value-objects.js +500 -0
- package/dist/stark-settlement/index.d.ts +172 -0
- package/dist/stark-settlement/index.d.ts.map +1 -0
- package/dist/stark-settlement/index.js +193 -0
- package/dist/stark-settlement/infrastructure/adapters/audit-adapter.d.ts +52 -0
- package/dist/stark-settlement/infrastructure/adapters/audit-adapter.d.ts.map +1 -0
- package/dist/stark-settlement/infrastructure/adapters/audit-adapter.js +154 -0
- package/dist/stark-settlement/infrastructure/adapters/bitcoin-adapter.d.ts +88 -0
- package/dist/stark-settlement/infrastructure/adapters/bitcoin-adapter.d.ts.map +1 -0
- package/dist/stark-settlement/infrastructure/adapters/bitcoin-adapter.js +187 -0
- package/dist/stark-settlement/infrastructure/adapters/clock-adapter.d.ts +59 -0
- package/dist/stark-settlement/infrastructure/adapters/clock-adapter.d.ts.map +1 -0
- package/dist/stark-settlement/infrastructure/adapters/clock-adapter.js +85 -0
- package/dist/stark-settlement/infrastructure/adapters/dilithium-adapter.d.ts +60 -0
- package/dist/stark-settlement/infrastructure/adapters/dilithium-adapter.d.ts.map +1 -0
- package/dist/stark-settlement/infrastructure/adapters/dilithium-adapter.js +104 -0
- package/dist/stark-settlement/infrastructure/adapters/event-emitter-adapter.d.ts +115 -0
- package/dist/stark-settlement/infrastructure/adapters/event-emitter-adapter.d.ts.map +1 -0
- package/dist/stark-settlement/infrastructure/adapters/event-emitter-adapter.js +191 -0
- package/dist/stark-settlement/infrastructure/adapters/fiat-adapter.d.ts +65 -0
- package/dist/stark-settlement/infrastructure/adapters/fiat-adapter.d.ts.map +1 -0
- package/dist/stark-settlement/infrastructure/adapters/fiat-adapter.js +207 -0
- package/dist/stark-settlement/infrastructure/adapters/mock-stark-adapter.d.ts +73 -0
- package/dist/stark-settlement/infrastructure/adapters/mock-stark-adapter.d.ts.map +1 -0
- package/dist/stark-settlement/infrastructure/adapters/mock-stark-adapter.js +287 -0
- package/dist/stark-settlement/infrastructure/adapters/solana-adapter.d.ts +78 -0
- package/dist/stark-settlement/infrastructure/adapters/solana-adapter.d.ts.map +1 -0
- package/dist/stark-settlement/infrastructure/adapters/solana-adapter.js +172 -0
- package/dist/stark-settlement/infrastructure/adapters/starknet-proof-adapter.d.ts +56 -0
- package/dist/stark-settlement/infrastructure/adapters/starknet-proof-adapter.d.ts.map +1 -0
- package/dist/stark-settlement/infrastructure/adapters/starknet-proof-adapter.js +261 -0
- package/dist/stark-settlement/infrastructure/adapters/stone-proof-adapter.d.ts +125 -0
- package/dist/stark-settlement/infrastructure/adapters/stone-proof-adapter.d.ts.map +1 -0
- package/dist/stark-settlement/infrastructure/adapters/stone-proof-adapter.js +416 -0
- package/dist/stark-settlement/infrastructure/persistence/ledger-store.d.ts +68 -0
- package/dist/stark-settlement/infrastructure/persistence/ledger-store.d.ts.map +1 -0
- package/dist/stark-settlement/infrastructure/persistence/ledger-store.js +238 -0
- package/dist/stark-settlement/infrastructure/persistence/offset-store.d.ts +30 -0
- package/dist/stark-settlement/infrastructure/persistence/offset-store.d.ts.map +1 -0
- package/dist/stark-settlement/infrastructure/persistence/offset-store.js +57 -0
- package/dist/stark-settlement/infrastructure/persistence/outbox-store.d.ts +45 -0
- package/dist/stark-settlement/infrastructure/persistence/outbox-store.d.ts.map +1 -0
- package/dist/stark-settlement/infrastructure/persistence/outbox-store.js +171 -0
- package/dist/traceability/application/recall-assessor.d.ts +13 -0
- package/dist/traceability/application/recall-assessor.d.ts.map +1 -0
- package/dist/traceability/application/recall-assessor.js +74 -0
- package/dist/traceability/domain/entities.d.ts +23 -0
- package/dist/traceability/domain/entities.d.ts.map +1 -0
- package/dist/traceability/domain/entities.js +1 -0
- package/dist/traceability/domain/ports.d.ts +23 -0
- package/dist/traceability/domain/ports.d.ts.map +1 -0
- package/dist/traceability/domain/ports.js +1 -0
- package/dist/traceability/domain/recall.d.ts +12 -0
- package/dist/traceability/domain/recall.d.ts.map +1 -0
- package/dist/traceability/domain/recall.js +1 -0
- package/dist/traceability/index.d.ts +22 -0
- package/dist/traceability/index.d.ts.map +1 -0
- package/dist/traceability/index.js +26 -0
- package/dist/traceability/infrastructure/in-memory-store.d.ts +13 -0
- package/dist/traceability/infrastructure/in-memory-store.d.ts.map +1 -0
- package/dist/traceability/infrastructure/in-memory-store.js +24 -0
- package/package.json +12 -9
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fiat Settlement Adapter (ISO 20022 Mock)
|
|
3
|
+
*
|
|
4
|
+
* Implements FiatSettlementPort for mock fiat settlement.
|
|
5
|
+
* Generates ISO 20022 pain.001 credit transfer messages.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - ISO 20022 pain.001.001.03 XML generation
|
|
9
|
+
* - Proof commitment in RemittanceInformation
|
|
10
|
+
* - Batch credit transfers
|
|
11
|
+
*
|
|
12
|
+
* @see https://www.iso20022.org/ for ISO 20022 documentation
|
|
13
|
+
* @see domain/ports.ts for FiatSettlementPort interface
|
|
14
|
+
*/
|
|
15
|
+
import type { NetTransfer, Tier2BlockProof, FiatSettlementResult } from "../../domain/entities.js";
|
|
16
|
+
import type { FiatSettlementPort, ClockPort } from "../../domain/ports.js";
|
|
17
|
+
/**
|
|
18
|
+
* Configuration for Fiat adapter.
|
|
19
|
+
*/
|
|
20
|
+
export interface FiatAdapterConfig {
|
|
21
|
+
/** Initiating party name */
|
|
22
|
+
initiatingPartyName?: string;
|
|
23
|
+
/** Initiating party identification */
|
|
24
|
+
initiatingPartyId?: string;
|
|
25
|
+
/** Bank BIC (SWIFT code) */
|
|
26
|
+
bankBic?: string;
|
|
27
|
+
/** Settlement date offset in days (default: 1 for T+1) */
|
|
28
|
+
settlementDateOffsetDays?: number;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Fiat mock adapter for settlement operations.
|
|
32
|
+
*/
|
|
33
|
+
export declare class FiatMockAdapter implements FiatSettlementPort {
|
|
34
|
+
private readonly clock;
|
|
35
|
+
private readonly config;
|
|
36
|
+
private messageCounter;
|
|
37
|
+
constructor(clock: ClockPort, config?: FiatAdapterConfig);
|
|
38
|
+
executeTransfer(transfers: readonly NetTransfer[], blockProof: Tier2BlockProof): Promise<FiatSettlementResult>;
|
|
39
|
+
getHealth(): Promise<{
|
|
40
|
+
healthy: boolean;
|
|
41
|
+
}>;
|
|
42
|
+
private generateMessageId;
|
|
43
|
+
private generatePain001;
|
|
44
|
+
private generateCreditTransferTxInf;
|
|
45
|
+
private formatAmount;
|
|
46
|
+
private escapeXml;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Mock Fiat adapter for testing.
|
|
50
|
+
*/
|
|
51
|
+
export declare class MockFiatAdapter implements FiatSettlementPort {
|
|
52
|
+
private readonly clock;
|
|
53
|
+
readonly settlements: Array<{
|
|
54
|
+
transfers: readonly NetTransfer[];
|
|
55
|
+
blockProofId: string;
|
|
56
|
+
result: FiatSettlementResult;
|
|
57
|
+
}>;
|
|
58
|
+
private messageCounter;
|
|
59
|
+
constructor(clock: ClockPort);
|
|
60
|
+
executeTransfer(transfers: readonly NetTransfer[], blockProof: Tier2BlockProof): Promise<FiatSettlementResult>;
|
|
61
|
+
getHealth(): Promise<{
|
|
62
|
+
healthy: boolean;
|
|
63
|
+
}>;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=fiat-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fiat-adapter.d.ts","sourceRoot":"","sources":["../../../../src/stark-settlement/infrastructure/adapters/fiat-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,OAAO,KAAK,EACV,WAAW,EACX,eAAe,EACf,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAG3E;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,4BAA4B;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,sCAAsC;IACtC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,4BAA4B;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED;;GAEG;AACH,qBAAa,eAAgB,YAAW,kBAAkB;IAKtD,OAAO,CAAC,QAAQ,CAAC,KAAK;IAJxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8B;IACrD,OAAO,CAAC,cAAc,CAAK;gBAGR,KAAK,EAAE,SAAS,EACjC,MAAM,CAAC,EAAE,iBAAiB;IAWtB,eAAe,CACnB,SAAS,EAAE,SAAS,WAAW,EAAE,EACjC,UAAU,EAAE,eAAe,GAC1B,OAAO,CAAC,oBAAoB,CAAC;IAgD1B,SAAS,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAShD,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,eAAe;IAgEvB,OAAO,CAAC,2BAA2B;IAoCnC,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,SAAS;CAQlB;AAED;;GAEG;AACH,qBAAa,eAAgB,YAAW,kBAAkB;IAS5C,OAAO,CAAC,QAAQ,CAAC,KAAK;IARlC,SAAgB,WAAW,EAAE,KAAK,CAAC;QACjC,SAAS,EAAE,SAAS,WAAW,EAAE,CAAC;QAClC,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,oBAAoB,CAAC;KAC9B,CAAC,CAAM;IAER,OAAO,CAAC,cAAc,CAAK;gBAEE,KAAK,EAAE,SAAS;IAEvC,eAAe,CACnB,SAAS,EAAE,SAAS,WAAW,EAAE,EACjC,UAAU,EAAE,eAAe,GAC1B,OAAO,CAAC,oBAAoB,CAAC;IA4B1B,SAAS,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;CAGjD"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fiat Settlement Adapter (ISO 20022 Mock)
|
|
3
|
+
*
|
|
4
|
+
* Implements FiatSettlementPort for mock fiat settlement.
|
|
5
|
+
* Generates ISO 20022 pain.001 credit transfer messages.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - ISO 20022 pain.001.001.03 XML generation
|
|
9
|
+
* - Proof commitment in RemittanceInformation
|
|
10
|
+
* - Batch credit transfers
|
|
11
|
+
*
|
|
12
|
+
* @see https://www.iso20022.org/ for ISO 20022 documentation
|
|
13
|
+
* @see domain/ports.ts for FiatSettlementPort interface
|
|
14
|
+
*/
|
|
15
|
+
/* eslint-disable @typescript-eslint/require-await */
|
|
16
|
+
import { createHash } from "node:crypto";
|
|
17
|
+
import { ProofCommitment } from "../../domain/value-objects.js";
|
|
18
|
+
/**
|
|
19
|
+
* Fiat mock adapter for settlement operations.
|
|
20
|
+
*/
|
|
21
|
+
export class FiatMockAdapter {
|
|
22
|
+
clock;
|
|
23
|
+
config;
|
|
24
|
+
messageCounter = 0;
|
|
25
|
+
constructor(clock, config) {
|
|
26
|
+
this.clock = clock;
|
|
27
|
+
this.config = {
|
|
28
|
+
initiatingPartyName: config?.initiatingPartyName ?? "Enterprise Blockchain Settlement Corp",
|
|
29
|
+
initiatingPartyId: config?.initiatingPartyId ?? "EBSC001",
|
|
30
|
+
bankBic: config?.bankBic ?? "TESTUS33XXX",
|
|
31
|
+
settlementDateOffsetDays: config?.settlementDateOffsetDays ?? 1,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
async executeTransfer(transfers, blockProof) {
|
|
35
|
+
// Compute proof commitment for RemittanceInformation
|
|
36
|
+
const proofCommitment = ProofCommitment.create(blockProof.blockProofId, blockProof.finalProof, blockProof.publicInputs);
|
|
37
|
+
// Generate message ID
|
|
38
|
+
const messageId = this.generateMessageId();
|
|
39
|
+
// Calculate settlement date (T+1)
|
|
40
|
+
const now = new Date(this.clock.now());
|
|
41
|
+
const settlementDate = new Date(now);
|
|
42
|
+
settlementDate.setDate(settlementDate.getDate() + this.config.settlementDateOffsetDays);
|
|
43
|
+
// Calculate total amount (absolute values)
|
|
44
|
+
const totalAmount = transfers.reduce((sum, t) => sum + (t.netAmount > 0n ? t.netAmount : -t.netAmount), 0n);
|
|
45
|
+
// Generate ISO 20022 pain.001 XML
|
|
46
|
+
const pain001Xml = this.generatePain001(messageId, transfers, proofCommitment.toString(), settlementDate);
|
|
47
|
+
const settlementDateStr = settlementDate.toISOString().split("T")[0] ?? "";
|
|
48
|
+
console.log(`[Fiat] Generated pain.001 message: ${messageId}`);
|
|
49
|
+
console.log(`[Fiat] Settlement date: ${settlementDateStr}`);
|
|
50
|
+
console.log(`[Fiat] Total amount: ${totalAmount} cents`);
|
|
51
|
+
console.log(`[Fiat] Transactions: ${transfers.length}`);
|
|
52
|
+
return {
|
|
53
|
+
iso20022MessageId: messageId,
|
|
54
|
+
pain001Xml,
|
|
55
|
+
settlementDate: settlementDateStr,
|
|
56
|
+
totalAmount,
|
|
57
|
+
transactionCount: transfers.length,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
async getHealth() {
|
|
61
|
+
// Mock always healthy
|
|
62
|
+
return { healthy: true };
|
|
63
|
+
}
|
|
64
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
65
|
+
// Private Helpers
|
|
66
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
67
|
+
generateMessageId() {
|
|
68
|
+
const timestamp = this.clock.now();
|
|
69
|
+
const counter = this.messageCounter++;
|
|
70
|
+
const hash = createHash("sha256")
|
|
71
|
+
.update(`${timestamp}:${counter}`)
|
|
72
|
+
.digest("hex")
|
|
73
|
+
.slice(0, 16);
|
|
74
|
+
return `EBSC-${new Date(timestamp)
|
|
75
|
+
.toISOString()
|
|
76
|
+
.replace(/[-:T.Z]/g, "")
|
|
77
|
+
.slice(0, 14)}-${hash}`;
|
|
78
|
+
}
|
|
79
|
+
generatePain001(messageId, transfers, proofCommitment, settlementDate) {
|
|
80
|
+
const creationDateTime = new Date(this.clock.now()).toISOString();
|
|
81
|
+
const settlementDateStr = settlementDate.toISOString().split("T")[0];
|
|
82
|
+
// Calculate control sum (total absolute amount)
|
|
83
|
+
const controlSum = transfers.reduce((sum, t) => sum + (t.netAmount > 0n ? t.netAmount : -t.netAmount), 0n);
|
|
84
|
+
// Generate credit transfer transactions
|
|
85
|
+
const creditTransferTxs = transfers
|
|
86
|
+
.map((t, i) => this.generateCreditTransferTxInf(t, i, proofCommitment))
|
|
87
|
+
.join("\n");
|
|
88
|
+
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
89
|
+
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03">
|
|
90
|
+
<CstmrCdtTrfInitn>
|
|
91
|
+
<GrpHdr>
|
|
92
|
+
<MsgId>${this.escapeXml(messageId)}</MsgId>
|
|
93
|
+
<CreDtTm>${creationDateTime}</CreDtTm>
|
|
94
|
+
<NbOfTxs>${transfers.length}</NbOfTxs>
|
|
95
|
+
<CtrlSum>${this.formatAmount(controlSum)}</CtrlSum>
|
|
96
|
+
<InitgPty>
|
|
97
|
+
<Nm>${this.escapeXml(this.config.initiatingPartyName)}</Nm>
|
|
98
|
+
<Id>
|
|
99
|
+
<OrgId>
|
|
100
|
+
<Othr>
|
|
101
|
+
<Id>${this.escapeXml(this.config.initiatingPartyId)}</Id>
|
|
102
|
+
</Othr>
|
|
103
|
+
</OrgId>
|
|
104
|
+
</Id>
|
|
105
|
+
</InitgPty>
|
|
106
|
+
</GrpHdr>
|
|
107
|
+
<PmtInf>
|
|
108
|
+
<PmtInfId>${this.escapeXml(messageId)}-PMT</PmtInfId>
|
|
109
|
+
<PmtMtd>TRF</PmtMtd>
|
|
110
|
+
<NbOfTxs>${transfers.length}</NbOfTxs>
|
|
111
|
+
<CtrlSum>${this.formatAmount(controlSum)}</CtrlSum>
|
|
112
|
+
<ReqdExctnDt>${settlementDateStr}</ReqdExctnDt>
|
|
113
|
+
<Dbtr>
|
|
114
|
+
<Nm>${this.escapeXml(this.config.initiatingPartyName)}</Nm>
|
|
115
|
+
</Dbtr>
|
|
116
|
+
<DbtrAcct>
|
|
117
|
+
<Id>
|
|
118
|
+
<IBAN>US00EBSC0000000000000001</IBAN>
|
|
119
|
+
</Id>
|
|
120
|
+
</DbtrAcct>
|
|
121
|
+
<DbtrAgt>
|
|
122
|
+
<FinInstnId>
|
|
123
|
+
<BIC>${this.config.bankBic}</BIC>
|
|
124
|
+
</FinInstnId>
|
|
125
|
+
</DbtrAgt>
|
|
126
|
+
${creditTransferTxs}
|
|
127
|
+
</PmtInf>
|
|
128
|
+
</CstmrCdtTrfInitn>
|
|
129
|
+
</Document>`;
|
|
130
|
+
}
|
|
131
|
+
generateCreditTransferTxInf(transfer, index, proofCommitment) {
|
|
132
|
+
const amount = transfer.netAmount > 0n ? transfer.netAmount : -transfer.netAmount;
|
|
133
|
+
return ` <CdtTrfTxInf>
|
|
134
|
+
<PmtId>
|
|
135
|
+
<EndToEndId>TX-${index.toString().padStart(6, "0")}</EndToEndId>
|
|
136
|
+
</PmtId>
|
|
137
|
+
<Amt>
|
|
138
|
+
<InstdAmt Ccy="USD">${this.formatAmount(amount)}</InstdAmt>
|
|
139
|
+
</Amt>
|
|
140
|
+
<CdtrAgt>
|
|
141
|
+
<FinInstnId>
|
|
142
|
+
<BIC>${this.config.bankBic}</BIC>
|
|
143
|
+
</FinInstnId>
|
|
144
|
+
</CdtrAgt>
|
|
145
|
+
<Cdtr>
|
|
146
|
+
<Nm>Account ${this.escapeXml(transfer.externalAddress.slice(0, 20))}</Nm>
|
|
147
|
+
</Cdtr>
|
|
148
|
+
<CdtrAcct>
|
|
149
|
+
<Id>
|
|
150
|
+
<Othr>
|
|
151
|
+
<Id>${this.escapeXml(transfer.externalAddress)}</Id>
|
|
152
|
+
</Othr>
|
|
153
|
+
</Id>
|
|
154
|
+
</CdtrAcct>
|
|
155
|
+
<RmtInf>
|
|
156
|
+
<Ustrd>STARK-PROOF:${proofCommitment.slice(0, 32)}</Ustrd>
|
|
157
|
+
</RmtInf>
|
|
158
|
+
</CdtTrfTxInf>`;
|
|
159
|
+
}
|
|
160
|
+
formatAmount(cents) {
|
|
161
|
+
const dollars = cents / 100n;
|
|
162
|
+
const remainingCents = cents % 100n;
|
|
163
|
+
return `${dollars}.${remainingCents.toString().padStart(2, "0")}`;
|
|
164
|
+
}
|
|
165
|
+
escapeXml(str) {
|
|
166
|
+
return str
|
|
167
|
+
.replace(/&/g, "&")
|
|
168
|
+
.replace(/</g, "<")
|
|
169
|
+
.replace(/>/g, ">")
|
|
170
|
+
.replace(/"/g, """)
|
|
171
|
+
.replace(/'/g, "'");
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Mock Fiat adapter for testing.
|
|
176
|
+
*/
|
|
177
|
+
export class MockFiatAdapter {
|
|
178
|
+
clock;
|
|
179
|
+
settlements = [];
|
|
180
|
+
messageCounter = 0;
|
|
181
|
+
constructor(clock) {
|
|
182
|
+
this.clock = clock;
|
|
183
|
+
}
|
|
184
|
+
async executeTransfer(transfers, blockProof) {
|
|
185
|
+
const messageId = `MOCK-${this.messageCounter++}`;
|
|
186
|
+
const now = new Date(this.clock.now());
|
|
187
|
+
const settlementDate = new Date(now);
|
|
188
|
+
settlementDate.setDate(settlementDate.getDate() + 1);
|
|
189
|
+
const totalAmount = transfers.reduce((sum, t) => sum + (t.netAmount > 0n ? t.netAmount : -t.netAmount), 0n);
|
|
190
|
+
const result = {
|
|
191
|
+
iso20022MessageId: messageId,
|
|
192
|
+
pain001Xml: "<mock-pain001/>",
|
|
193
|
+
settlementDate: settlementDate.toISOString().split("T")[0] ?? "",
|
|
194
|
+
totalAmount,
|
|
195
|
+
transactionCount: transfers.length,
|
|
196
|
+
};
|
|
197
|
+
this.settlements.push({
|
|
198
|
+
transfers,
|
|
199
|
+
blockProofId: blockProof.blockProofId,
|
|
200
|
+
result,
|
|
201
|
+
});
|
|
202
|
+
return result;
|
|
203
|
+
}
|
|
204
|
+
async getHealth() {
|
|
205
|
+
return { healthy: true };
|
|
206
|
+
}
|
|
207
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock STARK Proof Adapter
|
|
3
|
+
*
|
|
4
|
+
* Simulated STARK proof generation for testing and demos.
|
|
5
|
+
* Generates deterministic proofs based on input data without actual cryptography.
|
|
6
|
+
*
|
|
7
|
+
* For production, use StarknetProofAdapter with real starknet.js.
|
|
8
|
+
*
|
|
9
|
+
* @see domain/ports.ts for StarkProofGeneratorPort interface
|
|
10
|
+
*/
|
|
11
|
+
import type { LedgerTransaction, BaseProof, Tier1Proof, Tier2BlockProof } from "../../domain/entities.js";
|
|
12
|
+
import type { StarkProofGeneratorPort, ClockPort } from "../../domain/ports.js";
|
|
13
|
+
/**
|
|
14
|
+
* Configuration for the mock STARK adapter.
|
|
15
|
+
*/
|
|
16
|
+
export interface MockStarkAdapterConfig {
|
|
17
|
+
/** Simulated proof generation delay in ms (default: 10) */
|
|
18
|
+
simulatedDelayMs?: number;
|
|
19
|
+
/** Simulated proof size in bytes (default: 1024) */
|
|
20
|
+
proofSizeBytes?: number;
|
|
21
|
+
/** Whether to simulate random failures (default: false) */
|
|
22
|
+
simulateFailures?: boolean;
|
|
23
|
+
/** Failure probability when simulateFailures is true (default: 0.01) */
|
|
24
|
+
failureProbability?: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Mock implementation of StarkProofGeneratorPort for testing.
|
|
28
|
+
*/
|
|
29
|
+
export declare class MockStarkAdapter implements StarkProofGeneratorPort {
|
|
30
|
+
private readonly clock;
|
|
31
|
+
private readonly config;
|
|
32
|
+
private readonly verificationKeyHash;
|
|
33
|
+
private proofCounter;
|
|
34
|
+
constructor(clock: ClockPort, config?: MockStarkAdapterConfig);
|
|
35
|
+
generateBaseProof(tx: LedgerTransaction, preStateRoot: string, postStateRoot: string): Promise<BaseProof>;
|
|
36
|
+
aggregateTier1(baseProofs: readonly BaseProof[]): Promise<Tier1Proof>;
|
|
37
|
+
aggregateTier2(tier1Proofs: readonly Tier1Proof[]): Promise<Tier2BlockProof>;
|
|
38
|
+
verifyBlockProof(blockProof: Tier2BlockProof): Promise<boolean>;
|
|
39
|
+
getVerificationKeyHash(): Promise<string>;
|
|
40
|
+
private generateMockProof;
|
|
41
|
+
private simulateDelay;
|
|
42
|
+
private maybeSimulateFailure;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Mock STARK adapter that allows smaller batch sizes for testing.
|
|
46
|
+
*
|
|
47
|
+
* Use this for demos where generating 8192 transactions is impractical.
|
|
48
|
+
*/
|
|
49
|
+
export declare class FlexibleMockStarkAdapter implements StarkProofGeneratorPort {
|
|
50
|
+
private readonly clock;
|
|
51
|
+
private readonly baseAdapter;
|
|
52
|
+
private readonly tier1BatchSize;
|
|
53
|
+
private readonly tier2BatchSize;
|
|
54
|
+
private proofCounter;
|
|
55
|
+
constructor(clock: ClockPort, config?: MockStarkAdapterConfig & {
|
|
56
|
+
tier1BatchSize?: number;
|
|
57
|
+
tier2BatchSize?: number;
|
|
58
|
+
});
|
|
59
|
+
generateBaseProof(tx: LedgerTransaction, preStateRoot: string, postStateRoot: string): Promise<BaseProof>;
|
|
60
|
+
aggregateTier1(baseProofs: readonly BaseProof[]): Promise<Tier1Proof>;
|
|
61
|
+
aggregateTier2(tier1Proofs: readonly Tier1Proof[]): Promise<Tier2BlockProof>;
|
|
62
|
+
verifyBlockProof(blockProof: Tier2BlockProof): Promise<boolean>;
|
|
63
|
+
getVerificationKeyHash(): Promise<string>;
|
|
64
|
+
private generateMockProof;
|
|
65
|
+
/**
|
|
66
|
+
* Get the configured batch sizes.
|
|
67
|
+
*/
|
|
68
|
+
getBatchSizes(): {
|
|
69
|
+
tier1: number;
|
|
70
|
+
tier2: number;
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=mock-stark-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-stark-adapter.d.ts","sourceRoot":"","sources":["../../../../src/stark-settlement/infrastructure/adapters/mock-stark-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,OAAO,KAAK,EACV,iBAAiB,EACjB,SAAS,EACT,UAAU,EACV,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,uBAAuB,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEhF;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,2DAA2D;IAC3D,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oDAAoD;IACpD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,2DAA2D;IAC3D,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,wEAAwE;IACxE,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;GAEG;AACH,qBAAa,gBAAiB,YAAW,uBAAuB;IAM5D,OAAO,CAAC,QAAQ,CAAC,KAAK;IALxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmC;IAC1D,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,YAAY,CAAM;gBAGP,KAAK,EAAE,SAAS,EACjC,MAAM,GAAE,sBAA2B;IAe/B,iBAAiB,CACrB,EAAE,EAAE,iBAAiB,EACrB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,SAAS,CAAC;IAkCf,cAAc,CAAC,UAAU,EAAE,SAAS,SAAS,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC;IAsDrE,cAAc,CAClB,WAAW,EAAE,SAAS,UAAU,EAAE,GACjC,OAAO,CAAC,eAAe,CAAC;IAuDrB,gBAAgB,CAAC,UAAU,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IAa/D,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC;IAM/C,OAAO,CAAC,iBAAiB;YAoBX,aAAa;IAQ3B,OAAO,CAAC,oBAAoB;CAQ7B;AAED;;;;GAIG;AACH,qBAAa,wBAAyB,YAAW,uBAAuB;IAOpE,OAAO,CAAC,QAAQ,CAAC,KAAK;IANxB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAmB;IAC/C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,YAAY,CAAM;gBAGP,KAAK,EAAE,SAAS,EACjC,MAAM,GAAE,sBAAsB,GAAG;QAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,cAAc,CAAC,EAAE,MAAM,CAAC;KACpB;IAOF,iBAAiB,CACrB,EAAE,EAAE,iBAAiB,EACrB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,SAAS,CAAC;IAIf,cAAc,CAAC,UAAU,EAAE,SAAS,SAAS,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC;IA+CrE,cAAc,CAClB,WAAW,EAAE,SAAS,UAAU,EAAE,GACjC,OAAO,CAAC,eAAe,CAAC;IAsCrB,gBAAgB,CAAC,UAAU,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ/D,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC;IAI/C,OAAO,CAAC,iBAAiB;IASzB;;OAEG;IACH,aAAa,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;CAGlD"}
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock STARK Proof Adapter
|
|
3
|
+
*
|
|
4
|
+
* Simulated STARK proof generation for testing and demos.
|
|
5
|
+
* Generates deterministic proofs based on input data without actual cryptography.
|
|
6
|
+
*
|
|
7
|
+
* For production, use StarknetProofAdapter with real starknet.js.
|
|
8
|
+
*
|
|
9
|
+
* @see domain/ports.ts for StarkProofGeneratorPort interface
|
|
10
|
+
*/
|
|
11
|
+
/* eslint-disable @typescript-eslint/require-await */
|
|
12
|
+
import { createHash } from "node:crypto";
|
|
13
|
+
/**
|
|
14
|
+
* Mock implementation of StarkProofGeneratorPort for testing.
|
|
15
|
+
*/
|
|
16
|
+
export class MockStarkAdapter {
|
|
17
|
+
clock;
|
|
18
|
+
config;
|
|
19
|
+
verificationKeyHash;
|
|
20
|
+
proofCounter = 0n;
|
|
21
|
+
constructor(clock, config = {}) {
|
|
22
|
+
this.clock = clock;
|
|
23
|
+
this.config = {
|
|
24
|
+
simulatedDelayMs: config.simulatedDelayMs ?? 10,
|
|
25
|
+
proofSizeBytes: config.proofSizeBytes ?? 1024,
|
|
26
|
+
simulateFailures: config.simulateFailures ?? false,
|
|
27
|
+
failureProbability: config.failureProbability ?? 0.01,
|
|
28
|
+
};
|
|
29
|
+
// Generate a deterministic verification key hash
|
|
30
|
+
this.verificationKeyHash = createHash("sha256")
|
|
31
|
+
.update("mock-stark-verification-key-v1")
|
|
32
|
+
.digest("hex");
|
|
33
|
+
}
|
|
34
|
+
async generateBaseProof(tx, preStateRoot, postStateRoot) {
|
|
35
|
+
await this.simulateDelay();
|
|
36
|
+
this.maybeSimulateFailure("generateBaseProof");
|
|
37
|
+
const proofId = this.clock.uuid();
|
|
38
|
+
const starkProof = this.generateMockProof([
|
|
39
|
+
tx.txId,
|
|
40
|
+
tx.type,
|
|
41
|
+
tx.fromAccountId ?? "",
|
|
42
|
+
tx.toAccountId ?? "",
|
|
43
|
+
tx.amount.toString(),
|
|
44
|
+
preStateRoot,
|
|
45
|
+
postStateRoot,
|
|
46
|
+
]);
|
|
47
|
+
const publicInputs = [
|
|
48
|
+
preStateRoot,
|
|
49
|
+
postStateRoot,
|
|
50
|
+
tx.txId,
|
|
51
|
+
tx.amount.toString(16).padStart(64, "0"),
|
|
52
|
+
];
|
|
53
|
+
return {
|
|
54
|
+
proofId,
|
|
55
|
+
txId: tx.txId,
|
|
56
|
+
starkProof,
|
|
57
|
+
publicInputs,
|
|
58
|
+
verificationKeyHash: this.verificationKeyHash,
|
|
59
|
+
preStateRoot,
|
|
60
|
+
postStateRoot,
|
|
61
|
+
createdAt: this.clock.now(),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
async aggregateTier1(baseProofs) {
|
|
65
|
+
if (baseProofs.length !== 128) {
|
|
66
|
+
throw new Error(`Tier-1 aggregation requires exactly 128 base proofs, got ${baseProofs.length}`);
|
|
67
|
+
}
|
|
68
|
+
await this.simulateDelay();
|
|
69
|
+
this.maybeSimulateFailure("aggregateTier1");
|
|
70
|
+
const proofId = this.clock.uuid();
|
|
71
|
+
const baseProofIds = baseProofs.map((p) => p.proofId);
|
|
72
|
+
// Aggregate all proofs into a single hash
|
|
73
|
+
const proofHashes = baseProofs.map((p) => createHash("sha256").update(p.starkProof).digest("hex"));
|
|
74
|
+
const aggregatedProof = this.generateMockProof([
|
|
75
|
+
"tier1-aggregation",
|
|
76
|
+
...proofHashes,
|
|
77
|
+
]);
|
|
78
|
+
// Collect idempotency keys (would come from the original transactions)
|
|
79
|
+
const idempotencyKeys = baseProofs.map((p) => createHash("sha256").update(p.txId).digest("hex"));
|
|
80
|
+
// First proof's pre-state, last proof's post-state
|
|
81
|
+
const firstProof = baseProofs[0];
|
|
82
|
+
const lastProof = baseProofs[baseProofs.length - 1];
|
|
83
|
+
const preStateRoot = firstProof.preStateRoot;
|
|
84
|
+
const postStateRoot = lastProof.postStateRoot;
|
|
85
|
+
const publicInputs = [
|
|
86
|
+
preStateRoot,
|
|
87
|
+
postStateRoot,
|
|
88
|
+
baseProofs.length.toString(),
|
|
89
|
+
createHash("sha256").update(proofHashes.join("")).digest("hex"),
|
|
90
|
+
];
|
|
91
|
+
return {
|
|
92
|
+
proofId,
|
|
93
|
+
baseProofIds,
|
|
94
|
+
aggregatedProof,
|
|
95
|
+
publicInputs,
|
|
96
|
+
idempotencyKeys,
|
|
97
|
+
preStateRoot,
|
|
98
|
+
postStateRoot,
|
|
99
|
+
txCount: 128,
|
|
100
|
+
createdAt: this.clock.now(),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
async aggregateTier2(tier1Proofs) {
|
|
104
|
+
if (tier1Proofs.length !== 64) {
|
|
105
|
+
throw new Error(`Tier-2 aggregation requires exactly 64 Tier-1 proofs, got ${tier1Proofs.length}`);
|
|
106
|
+
}
|
|
107
|
+
await this.simulateDelay();
|
|
108
|
+
this.maybeSimulateFailure("aggregateTier2");
|
|
109
|
+
const blockProofId = this.clock.uuid();
|
|
110
|
+
const tier1ProofIds = tier1Proofs.map((p) => p.proofId);
|
|
111
|
+
// Aggregate all Tier-1 proofs into a single hash
|
|
112
|
+
const proofHashes = tier1Proofs.map((p) => createHash("sha256").update(p.aggregatedProof).digest("hex"));
|
|
113
|
+
const finalProof = this.generateMockProof([
|
|
114
|
+
"tier2-block-proof",
|
|
115
|
+
...proofHashes,
|
|
116
|
+
]);
|
|
117
|
+
// Collect all idempotency keys from all Tier-1 proofs
|
|
118
|
+
const idempotencyKeys = tier1Proofs.flatMap((p) => p.idempotencyKeys);
|
|
119
|
+
// Final state root (last Tier-1's post-state)
|
|
120
|
+
const lastTier1Proof = tier1Proofs[tier1Proofs.length - 1];
|
|
121
|
+
const stateRoot = lastTier1Proof.postStateRoot;
|
|
122
|
+
// Total transaction count
|
|
123
|
+
const txCount = tier1Proofs.reduce((sum, p) => sum + p.txCount, 0);
|
|
124
|
+
const publicInputs = [
|
|
125
|
+
stateRoot,
|
|
126
|
+
txCount.toString(),
|
|
127
|
+
createHash("sha256").update(proofHashes.join("")).digest("hex"),
|
|
128
|
+
];
|
|
129
|
+
// Increment block number
|
|
130
|
+
const blockNumber = this.proofCounter++;
|
|
131
|
+
return {
|
|
132
|
+
blockProofId,
|
|
133
|
+
tier1ProofIds,
|
|
134
|
+
finalProof,
|
|
135
|
+
publicInputs,
|
|
136
|
+
stateRoot,
|
|
137
|
+
idempotencyKeys,
|
|
138
|
+
txCount,
|
|
139
|
+
blockNumber,
|
|
140
|
+
createdAt: this.clock.now(),
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
async verifyBlockProof(blockProof) {
|
|
144
|
+
await this.simulateDelay();
|
|
145
|
+
this.maybeSimulateFailure("verifyBlockProof");
|
|
146
|
+
// Mock verification: check that the proof is non-empty and has valid structure
|
|
147
|
+
return (blockProof.finalProof.length > 0 &&
|
|
148
|
+
blockProof.tier1ProofIds.length === 64 &&
|
|
149
|
+
blockProof.txCount === 128 * 64 &&
|
|
150
|
+
blockProof.stateRoot.length === 64);
|
|
151
|
+
}
|
|
152
|
+
async getVerificationKeyHash() {
|
|
153
|
+
return this.verificationKeyHash;
|
|
154
|
+
}
|
|
155
|
+
// ─── Private Helpers ────────────────────────────────────────────────────
|
|
156
|
+
generateMockProof(inputs) {
|
|
157
|
+
// Generate a deterministic mock proof based on inputs
|
|
158
|
+
const hash = createHash("sha256");
|
|
159
|
+
hash.update("mock-stark-proof-v1");
|
|
160
|
+
for (const input of inputs) {
|
|
161
|
+
hash.update(input);
|
|
162
|
+
}
|
|
163
|
+
// Create a proof of the configured size
|
|
164
|
+
const proofSeed = hash.digest();
|
|
165
|
+
const proof = new Uint8Array(this.config.proofSizeBytes);
|
|
166
|
+
// Fill with deterministic pseudo-random data based on seed
|
|
167
|
+
for (let i = 0; i < proof.length; i++) {
|
|
168
|
+
proof[i] = proofSeed[i % proofSeed.length] ^ (i & 0xff);
|
|
169
|
+
}
|
|
170
|
+
return proof;
|
|
171
|
+
}
|
|
172
|
+
async simulateDelay() {
|
|
173
|
+
if (this.config.simulatedDelayMs > 0) {
|
|
174
|
+
await new Promise((resolve) => setTimeout(resolve, this.config.simulatedDelayMs));
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
maybeSimulateFailure(operation) {
|
|
178
|
+
if (this.config.simulateFailures &&
|
|
179
|
+
Math.random() < this.config.failureProbability) {
|
|
180
|
+
throw new Error(`Simulated failure in ${operation}`);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Mock STARK adapter that allows smaller batch sizes for testing.
|
|
186
|
+
*
|
|
187
|
+
* Use this for demos where generating 8192 transactions is impractical.
|
|
188
|
+
*/
|
|
189
|
+
export class FlexibleMockStarkAdapter {
|
|
190
|
+
clock;
|
|
191
|
+
baseAdapter;
|
|
192
|
+
tier1BatchSize;
|
|
193
|
+
tier2BatchSize;
|
|
194
|
+
proofCounter = 0n;
|
|
195
|
+
constructor(clock, config = {}) {
|
|
196
|
+
this.clock = clock;
|
|
197
|
+
this.baseAdapter = new MockStarkAdapter(clock, config);
|
|
198
|
+
this.tier1BatchSize = config.tier1BatchSize ?? 128;
|
|
199
|
+
this.tier2BatchSize = config.tier2BatchSize ?? 64;
|
|
200
|
+
}
|
|
201
|
+
async generateBaseProof(tx, preStateRoot, postStateRoot) {
|
|
202
|
+
return this.baseAdapter.generateBaseProof(tx, preStateRoot, postStateRoot);
|
|
203
|
+
}
|
|
204
|
+
async aggregateTier1(baseProofs) {
|
|
205
|
+
if (baseProofs.length !== this.tier1BatchSize) {
|
|
206
|
+
throw new Error(`Tier-1 aggregation requires exactly ${this.tier1BatchSize} base proofs, got ${baseProofs.length}`);
|
|
207
|
+
}
|
|
208
|
+
const proofId = this.clock.uuid();
|
|
209
|
+
const baseProofIds = baseProofs.map((p) => p.proofId);
|
|
210
|
+
const proofHashes = baseProofs.map((p) => createHash("sha256").update(p.starkProof).digest("hex"));
|
|
211
|
+
const aggregatedProof = this.generateMockProof([
|
|
212
|
+
"tier1-aggregation",
|
|
213
|
+
...proofHashes,
|
|
214
|
+
]);
|
|
215
|
+
const idempotencyKeys = baseProofs.map((p) => createHash("sha256").update(p.txId).digest("hex"));
|
|
216
|
+
const firstBaseProof = baseProofs[0];
|
|
217
|
+
const lastBaseProof = baseProofs[baseProofs.length - 1];
|
|
218
|
+
const preStateRoot = firstBaseProof.preStateRoot;
|
|
219
|
+
const postStateRoot = lastBaseProof.postStateRoot;
|
|
220
|
+
const publicInputs = [
|
|
221
|
+
preStateRoot,
|
|
222
|
+
postStateRoot,
|
|
223
|
+
baseProofs.length.toString(),
|
|
224
|
+
];
|
|
225
|
+
return {
|
|
226
|
+
proofId,
|
|
227
|
+
baseProofIds,
|
|
228
|
+
aggregatedProof,
|
|
229
|
+
publicInputs,
|
|
230
|
+
idempotencyKeys,
|
|
231
|
+
preStateRoot,
|
|
232
|
+
postStateRoot,
|
|
233
|
+
txCount: this.tier1BatchSize,
|
|
234
|
+
createdAt: this.clock.now(),
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
async aggregateTier2(tier1Proofs) {
|
|
238
|
+
if (tier1Proofs.length !== this.tier2BatchSize) {
|
|
239
|
+
throw new Error(`Tier-2 aggregation requires exactly ${this.tier2BatchSize} Tier-1 proofs, got ${tier1Proofs.length}`);
|
|
240
|
+
}
|
|
241
|
+
const blockProofId = this.clock.uuid();
|
|
242
|
+
const tier1ProofIds = tier1Proofs.map((p) => p.proofId);
|
|
243
|
+
const proofHashes = tier1Proofs.map((p) => createHash("sha256").update(p.aggregatedProof).digest("hex"));
|
|
244
|
+
const finalProof = this.generateMockProof([
|
|
245
|
+
"tier2-block-proof",
|
|
246
|
+
...proofHashes,
|
|
247
|
+
]);
|
|
248
|
+
const idempotencyKeys = tier1Proofs.flatMap((p) => p.idempotencyKeys);
|
|
249
|
+
const lastTier1 = tier1Proofs[tier1Proofs.length - 1];
|
|
250
|
+
const stateRoot = lastTier1.postStateRoot;
|
|
251
|
+
const txCount = tier1Proofs.reduce((sum, p) => sum + p.txCount, 0);
|
|
252
|
+
const blockNumber = this.proofCounter++;
|
|
253
|
+
return {
|
|
254
|
+
blockProofId,
|
|
255
|
+
tier1ProofIds,
|
|
256
|
+
finalProof,
|
|
257
|
+
publicInputs: [stateRoot, txCount.toString()],
|
|
258
|
+
stateRoot,
|
|
259
|
+
idempotencyKeys,
|
|
260
|
+
txCount,
|
|
261
|
+
blockNumber,
|
|
262
|
+
createdAt: this.clock.now(),
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
async verifyBlockProof(blockProof) {
|
|
266
|
+
return (blockProof.finalProof.length > 0 &&
|
|
267
|
+
blockProof.tier1ProofIds.length === this.tier2BatchSize &&
|
|
268
|
+
blockProof.stateRoot.length === 64);
|
|
269
|
+
}
|
|
270
|
+
async getVerificationKeyHash() {
|
|
271
|
+
return this.baseAdapter.getVerificationKeyHash();
|
|
272
|
+
}
|
|
273
|
+
generateMockProof(inputs) {
|
|
274
|
+
const hash = createHash("sha256");
|
|
275
|
+
hash.update("flexible-mock-stark-proof-v1");
|
|
276
|
+
for (const input of inputs) {
|
|
277
|
+
hash.update(input);
|
|
278
|
+
}
|
|
279
|
+
return new Uint8Array(hash.digest());
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Get the configured batch sizes.
|
|
283
|
+
*/
|
|
284
|
+
getBatchSizes() {
|
|
285
|
+
return { tier1: this.tier1BatchSize, tier2: this.tier2BatchSize };
|
|
286
|
+
}
|
|
287
|
+
}
|