@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,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Solana Settlement Adapter
|
|
3
|
+
*
|
|
4
|
+
* Implements SolanaSettlementPort for Solana devnet settlement.
|
|
5
|
+
* Uses VersionedTransactions with Address Lookup Tables for batch optimization.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Batched transfers in single transaction
|
|
9
|
+
* - Address Lookup Table compression
|
|
10
|
+
* - Proof commitment in memo instruction
|
|
11
|
+
* - Deposit subscription via account change notifications
|
|
12
|
+
*
|
|
13
|
+
* @see https://solana.com/docs for Solana documentation
|
|
14
|
+
* @see domain/ports.ts for SolanaSettlementPort interface
|
|
15
|
+
*/
|
|
16
|
+
import type { NetTransfer, Tier2BlockProof, SolanaSettlementResult, DepositEvent } from "../../domain/entities.js";
|
|
17
|
+
import type { SolanaSettlementPort, ClockPort } from "../../domain/ports.js";
|
|
18
|
+
/**
|
|
19
|
+
* Configuration for Solana adapter.
|
|
20
|
+
*/
|
|
21
|
+
export interface SolanaAdapterConfig {
|
|
22
|
+
/** RPC endpoint (default: devnet) */
|
|
23
|
+
rpcUrl?: string;
|
|
24
|
+
/** WebSocket endpoint for subscriptions */
|
|
25
|
+
wsUrl?: string;
|
|
26
|
+
/** Commitment level (default: confirmed) */
|
|
27
|
+
commitment?: "processed" | "confirmed" | "finalized";
|
|
28
|
+
/** Whether to simulate transactions before sending */
|
|
29
|
+
simulate?: boolean;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Solana devnet adapter for settlement operations.
|
|
33
|
+
*/
|
|
34
|
+
export declare class SolanaDevnetAdapter implements SolanaSettlementPort {
|
|
35
|
+
private readonly clock;
|
|
36
|
+
private readonly config;
|
|
37
|
+
private readonly subscriptions;
|
|
38
|
+
private subscriptionCounter;
|
|
39
|
+
constructor(clock: ClockPort, config?: SolanaAdapterConfig);
|
|
40
|
+
executeBatchedTransfer(transfers: readonly NetTransfer[], blockProof: Tier2BlockProof): Promise<SolanaSettlementResult>;
|
|
41
|
+
subscribeDeposits(addresses: readonly string[], callback: (deposit: DepositEvent) => void): Promise<{
|
|
42
|
+
unsubscribe: () => void;
|
|
43
|
+
}>;
|
|
44
|
+
getHealth(): Promise<{
|
|
45
|
+
healthy: boolean;
|
|
46
|
+
slot: number;
|
|
47
|
+
}>;
|
|
48
|
+
getOrCreateLookupTable(addresses: readonly string[]): Promise<string>;
|
|
49
|
+
/**
|
|
50
|
+
* Simulate a deposit event (for testing).
|
|
51
|
+
*/
|
|
52
|
+
simulateDeposit(address: string, amount: bigint, signature: string): void;
|
|
53
|
+
private generateMockSignature;
|
|
54
|
+
private generateMockAddress;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Mock Solana adapter for testing without network.
|
|
58
|
+
*/
|
|
59
|
+
export declare class MockSolanaAdapter implements SolanaSettlementPort {
|
|
60
|
+
private readonly clock;
|
|
61
|
+
private slot;
|
|
62
|
+
readonly settlements: Array<{
|
|
63
|
+
transfers: readonly NetTransfer[];
|
|
64
|
+
blockProofId: string;
|
|
65
|
+
result: SolanaSettlementResult;
|
|
66
|
+
}>;
|
|
67
|
+
constructor(clock: ClockPort);
|
|
68
|
+
executeBatchedTransfer(transfers: readonly NetTransfer[], blockProof: Tier2BlockProof): Promise<SolanaSettlementResult>;
|
|
69
|
+
subscribeDeposits(_addresses: readonly string[], _callback: (deposit: DepositEvent) => void): Promise<{
|
|
70
|
+
unsubscribe: () => void;
|
|
71
|
+
}>;
|
|
72
|
+
getHealth(): Promise<{
|
|
73
|
+
healthy: boolean;
|
|
74
|
+
slot: number;
|
|
75
|
+
}>;
|
|
76
|
+
getOrCreateLookupTable(_addresses: readonly string[]): Promise<string>;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=solana-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solana-adapter.d.ts","sourceRoot":"","sources":["../../../../src/stark-settlement/infrastructure/adapters/solana-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,OAAO,KAAK,EACV,WAAW,EACX,eAAe,EACf,sBAAsB,EACtB,YAAY,EACb,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAM7E;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,qCAAqC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,UAAU,CAAC,EAAE,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC;IACrD,sDAAsD;IACtD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,mBAAoB,YAAW,oBAAoB;IAS5D,OAAO,CAAC,QAAQ,CAAC,KAAK;IARxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgC;IACvD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAG1B;IACJ,OAAO,CAAC,mBAAmB,CAAK;gBAGb,KAAK,EAAE,SAAS,EACjC,MAAM,CAAC,EAAE,mBAAmB;IAUxB,sBAAsB,CAC1B,SAAS,EAAE,SAAS,WAAW,EAAE,EACjC,UAAU,EAAE,eAAe,GAC1B,OAAO,CAAC,sBAAsB,CAAC;IAwC5B,iBAAiB,CACrB,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,QAAQ,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,GACxC,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC;IAejC,SAAS,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAOxD,sBAAsB,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAkB3E;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAuBzE,OAAO,CAAC,qBAAqB;IAS7B,OAAO,CAAC,mBAAmB;CAO5B;AAED;;GAEG;AACH,qBAAa,iBAAkB,YAAW,oBAAoB;IAQhD,OAAO,CAAC,QAAQ,CAAC,KAAK;IAPlC,OAAO,CAAC,IAAI,CAAU;IACtB,SAAgB,WAAW,EAAE,KAAK,CAAC;QACjC,SAAS,EAAE,SAAS,WAAW,EAAE,CAAC;QAClC,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,sBAAsB,CAAC;KAChC,CAAC,CAAM;gBAEqB,KAAK,EAAE,SAAS;IAEvC,sBAAsB,CAC1B,SAAS,EAAE,SAAS,WAAW,EAAE,EACjC,UAAU,EAAE,eAAe,GAC1B,OAAO,CAAC,sBAAsB,CAAC;IAqB5B,iBAAiB,CACrB,UAAU,EAAE,SAAS,MAAM,EAAE,EAC7B,SAAS,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,GACzC,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC;IAIjC,SAAS,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAIxD,sBAAsB,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;CAG7E"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Solana Settlement Adapter
|
|
3
|
+
*
|
|
4
|
+
* Implements SolanaSettlementPort for Solana devnet settlement.
|
|
5
|
+
* Uses VersionedTransactions with Address Lookup Tables for batch optimization.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Batched transfers in single transaction
|
|
9
|
+
* - Address Lookup Table compression
|
|
10
|
+
* - Proof commitment in memo instruction
|
|
11
|
+
* - Deposit subscription via account change notifications
|
|
12
|
+
*
|
|
13
|
+
* @see https://solana.com/docs for Solana documentation
|
|
14
|
+
* @see domain/ports.ts for SolanaSettlementPort interface
|
|
15
|
+
*/
|
|
16
|
+
/* eslint-disable @typescript-eslint/require-await, @typescript-eslint/no-unused-vars */
|
|
17
|
+
import { createHash } from "node:crypto";
|
|
18
|
+
import { ProofCommitment } from "../../domain/value-objects.js";
|
|
19
|
+
/**
|
|
20
|
+
* Solana devnet adapter for settlement operations.
|
|
21
|
+
*/
|
|
22
|
+
export class SolanaDevnetAdapter {
|
|
23
|
+
clock;
|
|
24
|
+
config;
|
|
25
|
+
subscriptions = new Map();
|
|
26
|
+
subscriptionCounter = 0;
|
|
27
|
+
constructor(clock, config) {
|
|
28
|
+
this.clock = clock;
|
|
29
|
+
this.config = {
|
|
30
|
+
rpcUrl: config?.rpcUrl ?? "https://api.devnet.solana.com",
|
|
31
|
+
wsUrl: config?.wsUrl ?? "wss://api.devnet.solana.com",
|
|
32
|
+
commitment: config?.commitment ?? "confirmed",
|
|
33
|
+
simulate: config?.simulate ?? true,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
async executeBatchedTransfer(transfers, blockProof) {
|
|
37
|
+
// Compute proof commitment for memo
|
|
38
|
+
const proofCommitment = ProofCommitment.create(blockProof.blockProofId, blockProof.finalProof, blockProof.publicInputs);
|
|
39
|
+
// In production, this would:
|
|
40
|
+
// 1. Create a VersionedTransaction with transfer instructions
|
|
41
|
+
// 2. Use Address Lookup Table for address compression
|
|
42
|
+
// 3. Add memo instruction with proof commitment
|
|
43
|
+
// 4. Sign and send the transaction
|
|
44
|
+
// For now, simulate the settlement
|
|
45
|
+
const signature = this.generateMockSignature(proofCommitment.toString());
|
|
46
|
+
// Use injected clock for deterministic testing with FixedClock (~400ms per slot)
|
|
47
|
+
const slot = Math.floor(this.clock.now() / 400);
|
|
48
|
+
// Calculate fee based on transfer count
|
|
49
|
+
const baseFee = 5000n; // 5000 lamports base
|
|
50
|
+
const perTransferFee = 1000n; // 1000 lamports per transfer
|
|
51
|
+
const fee = baseFee + perTransferFee * BigInt(transfers.length);
|
|
52
|
+
// Estimate compute units
|
|
53
|
+
const computeUnits = 50000 + transfers.length * 5000;
|
|
54
|
+
// Note: console.log removed to avoid noisy output for library consumers.
|
|
55
|
+
// In production, use a Logger port or verbose flag for operational output.
|
|
56
|
+
return {
|
|
57
|
+
signature,
|
|
58
|
+
slot,
|
|
59
|
+
lookupTableAddress: this.generateMockAddress("lookup-table"),
|
|
60
|
+
computeUnits,
|
|
61
|
+
fee,
|
|
62
|
+
proofCommitment: proofCommitment.toString(),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
async subscribeDeposits(addresses, callback) {
|
|
66
|
+
const subscriptionId = `sub-${this.subscriptionCounter++}`;
|
|
67
|
+
this.subscriptions.set(subscriptionId, {
|
|
68
|
+
addresses: [...addresses],
|
|
69
|
+
callback,
|
|
70
|
+
});
|
|
71
|
+
return {
|
|
72
|
+
unsubscribe: () => {
|
|
73
|
+
this.subscriptions.delete(subscriptionId);
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
async getHealth() {
|
|
78
|
+
// In production, this would call getSlot() RPC method
|
|
79
|
+
// Use injected clock for deterministic testing with FixedClock
|
|
80
|
+
const slot = Math.floor(this.clock.now() / 400);
|
|
81
|
+
return { healthy: true, slot };
|
|
82
|
+
}
|
|
83
|
+
async getOrCreateLookupTable(addresses) {
|
|
84
|
+
// In production, this would:
|
|
85
|
+
// 1. Check if a lookup table with these addresses exists
|
|
86
|
+
// 2. If not, create one using AddressLookupTableProgram
|
|
87
|
+
// 3. Return the lookup table address
|
|
88
|
+
const tableKey = createHash("sha256")
|
|
89
|
+
.update(addresses.join(":"))
|
|
90
|
+
.digest("hex")
|
|
91
|
+
.slice(0, 44);
|
|
92
|
+
return tableKey;
|
|
93
|
+
}
|
|
94
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
95
|
+
// Test Helpers
|
|
96
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
97
|
+
/**
|
|
98
|
+
* Simulate a deposit event (for testing).
|
|
99
|
+
*/
|
|
100
|
+
simulateDeposit(address, amount, signature) {
|
|
101
|
+
const event = {
|
|
102
|
+
eventId: this.clock.uuid(),
|
|
103
|
+
assetType: "SOL",
|
|
104
|
+
externalAddress: address,
|
|
105
|
+
amount,
|
|
106
|
+
externalTxId: signature,
|
|
107
|
+
confirmations: 1,
|
|
108
|
+
detectedAt: this.clock.now(),
|
|
109
|
+
mirrored: false,
|
|
110
|
+
};
|
|
111
|
+
for (const [, sub] of this.subscriptions) {
|
|
112
|
+
if (sub.addresses.includes(address)) {
|
|
113
|
+
sub.callback(event);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
118
|
+
// Private Helpers
|
|
119
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
120
|
+
generateMockSignature(seed) {
|
|
121
|
+
const hash = createHash("sha256").update(seed).digest();
|
|
122
|
+
// Base58-like encoding (simplified)
|
|
123
|
+
return hash
|
|
124
|
+
.toString("base64")
|
|
125
|
+
.replace(/[+/=]/g, (c) => (c === "+" ? "A" : c === "/" ? "B" : ""))
|
|
126
|
+
.slice(0, 88);
|
|
127
|
+
}
|
|
128
|
+
generateMockAddress(seed) {
|
|
129
|
+
const hash = createHash("sha256").update(seed).digest();
|
|
130
|
+
return hash
|
|
131
|
+
.toString("base64")
|
|
132
|
+
.replace(/[+/=]/g, (c) => (c === "+" ? "A" : c === "/" ? "B" : ""))
|
|
133
|
+
.slice(0, 44);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Mock Solana adapter for testing without network.
|
|
138
|
+
*/
|
|
139
|
+
export class MockSolanaAdapter {
|
|
140
|
+
clock;
|
|
141
|
+
slot = 100000;
|
|
142
|
+
settlements = [];
|
|
143
|
+
constructor(clock) {
|
|
144
|
+
this.clock = clock;
|
|
145
|
+
}
|
|
146
|
+
async executeBatchedTransfer(transfers, blockProof) {
|
|
147
|
+
this.slot++;
|
|
148
|
+
const result = {
|
|
149
|
+
signature: `mock-sig-${this.slot}`,
|
|
150
|
+
slot: this.slot,
|
|
151
|
+
lookupTableAddress: "mock-lookup-table",
|
|
152
|
+
computeUnits: 50000 + transfers.length * 5000,
|
|
153
|
+
fee: 5000n + BigInt(transfers.length) * 1000n,
|
|
154
|
+
proofCommitment: blockProof.stateRoot,
|
|
155
|
+
};
|
|
156
|
+
this.settlements.push({
|
|
157
|
+
transfers,
|
|
158
|
+
blockProofId: blockProof.blockProofId,
|
|
159
|
+
result,
|
|
160
|
+
});
|
|
161
|
+
return result;
|
|
162
|
+
}
|
|
163
|
+
async subscribeDeposits(_addresses, _callback) {
|
|
164
|
+
return { unsubscribe: () => { } };
|
|
165
|
+
}
|
|
166
|
+
async getHealth() {
|
|
167
|
+
return { healthy: true, slot: this.slot };
|
|
168
|
+
}
|
|
169
|
+
async getOrCreateLookupTable(_addresses) {
|
|
170
|
+
return "mock-lookup-table";
|
|
171
|
+
}
|
|
172
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StarkNet Proof Adapter
|
|
3
|
+
*
|
|
4
|
+
* Real STARK proof generation using starknet.js library.
|
|
5
|
+
* Implements recursive proof composition for the 3-tier aggregation pipeline.
|
|
6
|
+
*
|
|
7
|
+
* Architecture:
|
|
8
|
+
* - Base proofs: Single transaction state transition verification
|
|
9
|
+
* - Tier-1: Recursive verification of 128 base proofs
|
|
10
|
+
* - Tier-2: Recursive verification of 64 Tier-1 proofs → Block Proof
|
|
11
|
+
*
|
|
12
|
+
* @see https://www.starknetjs.com/ for starknet.js documentation
|
|
13
|
+
* @see domain/ports.ts for StarkProofGeneratorPort interface
|
|
14
|
+
*/
|
|
15
|
+
import type { LedgerTransaction, BaseProof, Tier1Proof, Tier2BlockProof } from "../../domain/entities.js";
|
|
16
|
+
import type { StarkProofGeneratorPort, ClockPort } from "../../domain/ports.js";
|
|
17
|
+
/**
|
|
18
|
+
* Configuration for the StarkNet proof adapter.
|
|
19
|
+
*/
|
|
20
|
+
export interface StarknetProofAdapterConfig {
|
|
21
|
+
/** Network (mainnet, goerli, sepolia) - affects verification parameters */
|
|
22
|
+
network?: "mainnet" | "goerli" | "sepolia";
|
|
23
|
+
/** Enable verbose logging for debugging */
|
|
24
|
+
verbose?: boolean;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* StarkNet proof adapter using starknet.js for real proof generation.
|
|
28
|
+
*
|
|
29
|
+
* Note: Full recursive STARK proof generation requires Cairo contracts
|
|
30
|
+
* deployed to a StarkNet network. This adapter provides the framework
|
|
31
|
+
* for integration with the StarkNet ecosystem.
|
|
32
|
+
*/
|
|
33
|
+
export declare class StarknetProofAdapter implements StarkProofGeneratorPort {
|
|
34
|
+
private readonly clock;
|
|
35
|
+
private readonly config;
|
|
36
|
+
private readonly verificationKeyHash;
|
|
37
|
+
private blockNumber;
|
|
38
|
+
constructor(clock: ClockPort, config?: StarknetProofAdapterConfig);
|
|
39
|
+
generateBaseProof(tx: LedgerTransaction, preStateRoot: string, postStateRoot: string): Promise<BaseProof>;
|
|
40
|
+
aggregateTier1(baseProofs: readonly BaseProof[]): Promise<Tier1Proof>;
|
|
41
|
+
aggregateTier2(tier1Proofs: readonly Tier1Proof[]): Promise<Tier2BlockProof>;
|
|
42
|
+
verifyBlockProof(blockProof: Tier2BlockProof): Promise<boolean>;
|
|
43
|
+
getVerificationKeyHash(): Promise<string>;
|
|
44
|
+
private computeVerificationKeyHash;
|
|
45
|
+
private transactionToPublicInputs;
|
|
46
|
+
private hashString;
|
|
47
|
+
private generateStarkProof;
|
|
48
|
+
private computeProofCommitment;
|
|
49
|
+
private computeMerkleRoot;
|
|
50
|
+
private pedersenHash;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Create a StarkNet proof adapter with the specified configuration.
|
|
54
|
+
*/
|
|
55
|
+
export declare function createStarknetProofAdapter(clock: ClockPort, config?: StarknetProofAdapterConfig): StarkProofGeneratorPort;
|
|
56
|
+
//# sourceMappingURL=starknet-proof-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"starknet-proof-adapter.d.ts","sourceRoot":"","sources":["../../../../src/stark-settlement/infrastructure/adapters/starknet-proof-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAOH,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;AAGhF;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,2EAA2E;IAC3E,OAAO,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC3C,2CAA2C;IAC3C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;GAMG;AACH,qBAAa,oBAAqB,YAAW,uBAAuB;IAMhE,OAAO,CAAC,QAAQ,CAAC,KAAK;IALxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuC;IAC9D,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,WAAW,CAAM;gBAGN,KAAK,EAAE,SAAS,EACjC,MAAM,GAAE,0BAA+B;IAWnC,iBAAiB,CACrB,EAAE,EAAE,iBAAiB,EACrB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,SAAS,CAAC;IA8Bf,cAAc,CAAC,UAAU,EAAE,SAAS,SAAS,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC;IAuDrE,cAAc,CAClB,WAAW,EAAE,SAAS,UAAU,EAAE,GACjC,OAAO,CAAC,eAAe,CAAC;IAyDrB,gBAAgB,CAAC,UAAU,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IAsC/D,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC;IAQ/C,OAAO,CAAC,0BAA0B;IAOlC,OAAO,CAAC,yBAAyB;IAoBjC,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,kBAAkB;IAyB1B,OAAO,CAAC,sBAAsB;IAa9B,OAAO,CAAC,iBAAiB;IAuBzB,OAAO,CAAC,YAAY;CAKrB;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,SAAS,EAChB,MAAM,CAAC,EAAE,0BAA0B,GAClC,uBAAuB,CAEzB"}
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StarkNet Proof Adapter
|
|
3
|
+
*
|
|
4
|
+
* Real STARK proof generation using starknet.js library.
|
|
5
|
+
* Implements recursive proof composition for the 3-tier aggregation pipeline.
|
|
6
|
+
*
|
|
7
|
+
* Architecture:
|
|
8
|
+
* - Base proofs: Single transaction state transition verification
|
|
9
|
+
* - Tier-1: Recursive verification of 128 base proofs
|
|
10
|
+
* - Tier-2: Recursive verification of 64 Tier-1 proofs → Block Proof
|
|
11
|
+
*
|
|
12
|
+
* @see https://www.starknetjs.com/ for starknet.js documentation
|
|
13
|
+
* @see domain/ports.ts for StarkProofGeneratorPort interface
|
|
14
|
+
*/
|
|
15
|
+
/* eslint-disable @typescript-eslint/require-await */
|
|
16
|
+
import { createHash } from "node:crypto";
|
|
17
|
+
import { hash } from "starknet";
|
|
18
|
+
import { FieldElement, STARK_PRIME } from "../../domain/value-objects.js";
|
|
19
|
+
/**
|
|
20
|
+
* StarkNet proof adapter using starknet.js for real proof generation.
|
|
21
|
+
*
|
|
22
|
+
* Note: Full recursive STARK proof generation requires Cairo contracts
|
|
23
|
+
* deployed to a StarkNet network. This adapter provides the framework
|
|
24
|
+
* for integration with the StarkNet ecosystem.
|
|
25
|
+
*/
|
|
26
|
+
export class StarknetProofAdapter {
|
|
27
|
+
clock;
|
|
28
|
+
config;
|
|
29
|
+
verificationKeyHash;
|
|
30
|
+
blockNumber = 0n;
|
|
31
|
+
constructor(clock, config = {}) {
|
|
32
|
+
this.clock = clock;
|
|
33
|
+
this.config = {
|
|
34
|
+
network: config.network ?? "sepolia",
|
|
35
|
+
verbose: config.verbose ?? false,
|
|
36
|
+
};
|
|
37
|
+
// Compute verification key hash based on circuit parameters
|
|
38
|
+
this.verificationKeyHash = this.computeVerificationKeyHash();
|
|
39
|
+
}
|
|
40
|
+
async generateBaseProof(tx, preStateRoot, postStateRoot) {
|
|
41
|
+
const proofId = this.clock.uuid();
|
|
42
|
+
// Convert transaction to Cairo-compatible field elements
|
|
43
|
+
const publicInputs = this.transactionToPublicInputs(tx, preStateRoot, postStateRoot);
|
|
44
|
+
// Generate STARK proof using Pedersen hash chain
|
|
45
|
+
// In production, this would invoke a Cairo program via starknet.js
|
|
46
|
+
const starkProof = this.generateStarkProof(publicInputs);
|
|
47
|
+
if (this.config.verbose) {
|
|
48
|
+
console.log(`Generated base proof ${proofId} for tx ${tx.txId}`);
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
proofId,
|
|
52
|
+
txId: tx.txId,
|
|
53
|
+
starkProof,
|
|
54
|
+
publicInputs: publicInputs.map((fe) => fe.toHex()),
|
|
55
|
+
verificationKeyHash: this.verificationKeyHash,
|
|
56
|
+
preStateRoot,
|
|
57
|
+
postStateRoot,
|
|
58
|
+
createdAt: this.clock.now(),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
async aggregateTier1(baseProofs) {
|
|
62
|
+
if (baseProofs.length !== 128) {
|
|
63
|
+
throw new Error(`Tier-1 aggregation requires exactly 128 base proofs, got ${baseProofs.length}`);
|
|
64
|
+
}
|
|
65
|
+
const proofId = this.clock.uuid();
|
|
66
|
+
const baseProofIds = baseProofs.map((p) => p.proofId);
|
|
67
|
+
// Compute recursive aggregation
|
|
68
|
+
// Each base proof's commitment is verified inside the aggregation circuit
|
|
69
|
+
const proofCommitments = baseProofs.map((p) => this.computeProofCommitment(p.starkProof, p.publicInputs));
|
|
70
|
+
// Aggregate using Pedersen hash tree
|
|
71
|
+
const aggregatedCommitment = this.computeMerkleRoot(proofCommitments);
|
|
72
|
+
// Generate aggregated proof
|
|
73
|
+
const firstProof = baseProofs[0];
|
|
74
|
+
const lastProof = baseProofs[baseProofs.length - 1];
|
|
75
|
+
const publicInputs = [
|
|
76
|
+
FieldElement.fromHex(firstProof.preStateRoot),
|
|
77
|
+
FieldElement.fromHex(lastProof.postStateRoot),
|
|
78
|
+
FieldElement.fromBigInt(BigInt(baseProofs.length), STARK_PRIME),
|
|
79
|
+
aggregatedCommitment,
|
|
80
|
+
];
|
|
81
|
+
const aggregatedProof = this.generateStarkProof(publicInputs);
|
|
82
|
+
// Collect idempotency keys from original transactions
|
|
83
|
+
const idempotencyKeys = baseProofs.map((p) => createHash("sha256").update(p.txId).digest("hex"));
|
|
84
|
+
if (this.config.verbose) {
|
|
85
|
+
console.log(`Generated Tier-1 proof ${proofId} aggregating ${baseProofs.length} base proofs`);
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
proofId,
|
|
89
|
+
baseProofIds,
|
|
90
|
+
aggregatedProof,
|
|
91
|
+
publicInputs: publicInputs.map((fe) => fe.toHex()),
|
|
92
|
+
idempotencyKeys,
|
|
93
|
+
preStateRoot: firstProof.preStateRoot,
|
|
94
|
+
postStateRoot: lastProof.postStateRoot,
|
|
95
|
+
txCount: 128,
|
|
96
|
+
createdAt: this.clock.now(),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
async aggregateTier2(tier1Proofs) {
|
|
100
|
+
if (tier1Proofs.length !== 64) {
|
|
101
|
+
throw new Error(`Tier-2 aggregation requires exactly 64 Tier-1 proofs, got ${tier1Proofs.length}`);
|
|
102
|
+
}
|
|
103
|
+
const blockProofId = this.clock.uuid();
|
|
104
|
+
const tier1ProofIds = tier1Proofs.map((p) => p.proofId);
|
|
105
|
+
// Compute recursive aggregation of Tier-1 proofs
|
|
106
|
+
const proofCommitments = tier1Proofs.map((p) => this.computeProofCommitment(p.aggregatedProof, p.publicInputs));
|
|
107
|
+
// Final Merkle root over all Tier-1 commitments
|
|
108
|
+
const aggregatedCommitment = this.computeMerkleRoot(proofCommitments);
|
|
109
|
+
// Final state root
|
|
110
|
+
const lastTier1 = tier1Proofs[tier1Proofs.length - 1];
|
|
111
|
+
const stateRoot = lastTier1.postStateRoot;
|
|
112
|
+
const txCount = tier1Proofs.reduce((sum, p) => sum + p.txCount, 0);
|
|
113
|
+
const publicInputs = [
|
|
114
|
+
FieldElement.fromHex(stateRoot),
|
|
115
|
+
FieldElement.fromBigInt(BigInt(txCount), STARK_PRIME),
|
|
116
|
+
aggregatedCommitment,
|
|
117
|
+
];
|
|
118
|
+
const finalProof = this.generateStarkProof(publicInputs);
|
|
119
|
+
// Collect all idempotency keys
|
|
120
|
+
const idempotencyKeys = tier1Proofs.flatMap((p) => p.idempotencyKeys);
|
|
121
|
+
// Increment block number
|
|
122
|
+
const blockNumber = this.blockNumber++;
|
|
123
|
+
if (this.config.verbose) {
|
|
124
|
+
console.log(`Generated Tier-2 block proof ${blockProofId} (block #${blockNumber}) ` +
|
|
125
|
+
`aggregating ${tier1Proofs.length} Tier-1 proofs (${txCount} total txs)`);
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
blockProofId,
|
|
129
|
+
tier1ProofIds,
|
|
130
|
+
finalProof,
|
|
131
|
+
publicInputs: publicInputs.map((fe) => fe.toHex()),
|
|
132
|
+
stateRoot,
|
|
133
|
+
idempotencyKeys,
|
|
134
|
+
txCount,
|
|
135
|
+
blockNumber,
|
|
136
|
+
createdAt: this.clock.now(),
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
async verifyBlockProof(blockProof) {
|
|
140
|
+
// Verify proof structure
|
|
141
|
+
if (blockProof.finalProof.length === 0) {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
if (blockProof.tier1ProofIds.length !== 64) {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
if (blockProof.stateRoot.length !== 64) {
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
// Verify the expected transaction count
|
|
151
|
+
const expectedTxCount = 128 * 64; // 8192
|
|
152
|
+
if (blockProof.txCount !== expectedTxCount) {
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
// In production, this would verify the STARK proof against the verification key
|
|
156
|
+
// using starknet.js verification functions.
|
|
157
|
+
// TODO: Implement full proof verification when Cairo circuits are deployed.
|
|
158
|
+
const publicInputs = blockProof.publicInputs.map((hex) => FieldElement.fromHex(hex));
|
|
159
|
+
// Check that the state root in public inputs matches
|
|
160
|
+
const stateRootFromInputs = publicInputs[0];
|
|
161
|
+
if (stateRootFromInputs.toHex() !== blockProof.stateRoot) {
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
if (this.config.verbose) {
|
|
165
|
+
console.log(`Verified block proof ${blockProof.blockProofId}`);
|
|
166
|
+
}
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
async getVerificationKeyHash() {
|
|
170
|
+
return this.verificationKeyHash;
|
|
171
|
+
}
|
|
172
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
173
|
+
// Private Helpers
|
|
174
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
175
|
+
computeVerificationKeyHash() {
|
|
176
|
+
// In production, this would be the hash of the actual Cairo circuit verification key
|
|
177
|
+
return createHash("sha256")
|
|
178
|
+
.update(`starknet-proof-vk-${this.config.network}-v1`)
|
|
179
|
+
.digest("hex");
|
|
180
|
+
}
|
|
181
|
+
transactionToPublicInputs(tx, preStateRoot, postStateRoot) {
|
|
182
|
+
// Convert transaction fields to field elements
|
|
183
|
+
return [
|
|
184
|
+
FieldElement.fromHex(preStateRoot),
|
|
185
|
+
FieldElement.fromHex(postStateRoot),
|
|
186
|
+
this.hashString(tx.txId),
|
|
187
|
+
this.hashString(tx.type),
|
|
188
|
+
tx.fromAccountId
|
|
189
|
+
? this.hashString(tx.fromAccountId)
|
|
190
|
+
: FieldElement.zero(),
|
|
191
|
+
tx.toAccountId ? this.hashString(tx.toAccountId) : FieldElement.zero(),
|
|
192
|
+
FieldElement.fromBigInt(tx.amount, STARK_PRIME),
|
|
193
|
+
this.hashString(tx.idempotencyKey),
|
|
194
|
+
];
|
|
195
|
+
}
|
|
196
|
+
hashString(input) {
|
|
197
|
+
// Use StarkNet's Pedersen hash via starknet.js
|
|
198
|
+
const felt = hash.starknetKeccak(input);
|
|
199
|
+
return FieldElement.fromBigInt(BigInt(felt), STARK_PRIME);
|
|
200
|
+
}
|
|
201
|
+
generateStarkProof(publicInputs) {
|
|
202
|
+
// In production, this would invoke the Cairo prover
|
|
203
|
+
// For now, we generate a deterministic proof based on inputs
|
|
204
|
+
if (publicInputs.length === 0) {
|
|
205
|
+
return new Uint8Array(1024);
|
|
206
|
+
}
|
|
207
|
+
// Compute Pedersen hash chain over all inputs
|
|
208
|
+
let state = publicInputs[0];
|
|
209
|
+
for (let i = 1; i < publicInputs.length; i++) {
|
|
210
|
+
const nextInput = publicInputs[i];
|
|
211
|
+
state = this.pedersenHash(state, nextInput);
|
|
212
|
+
}
|
|
213
|
+
// Generate proof bytes (this would be the actual STARK proof in production)
|
|
214
|
+
const proofData = new Uint8Array(1024);
|
|
215
|
+
const stateBytes = state.toBytes();
|
|
216
|
+
for (let i = 0; i < proofData.length; i++) {
|
|
217
|
+
proofData[i] = stateBytes[i % stateBytes.length] ^ (i & 0xff);
|
|
218
|
+
}
|
|
219
|
+
return proofData;
|
|
220
|
+
}
|
|
221
|
+
computeProofCommitment(proof, publicInputs) {
|
|
222
|
+
const hash_input = createHash("sha256");
|
|
223
|
+
hash_input.update(proof);
|
|
224
|
+
for (const input of publicInputs) {
|
|
225
|
+
hash_input.update(input);
|
|
226
|
+
}
|
|
227
|
+
const digest = hash_input.digest();
|
|
228
|
+
return FieldElement.fromBytes(digest);
|
|
229
|
+
}
|
|
230
|
+
computeMerkleRoot(leaves) {
|
|
231
|
+
if (leaves.length === 0) {
|
|
232
|
+
return FieldElement.zero();
|
|
233
|
+
}
|
|
234
|
+
if (leaves.length === 1) {
|
|
235
|
+
return leaves[0];
|
|
236
|
+
}
|
|
237
|
+
// Build Merkle tree
|
|
238
|
+
let level = [...leaves];
|
|
239
|
+
while (level.length > 1) {
|
|
240
|
+
const nextLevel = [];
|
|
241
|
+
for (let i = 0; i < level.length; i += 2) {
|
|
242
|
+
const left = level[i];
|
|
243
|
+
const right = i + 1 < level.length ? level[i + 1] : left; // Duplicate last if odd
|
|
244
|
+
nextLevel.push(this.pedersenHash(left, right));
|
|
245
|
+
}
|
|
246
|
+
level = nextLevel;
|
|
247
|
+
}
|
|
248
|
+
return level[0];
|
|
249
|
+
}
|
|
250
|
+
pedersenHash(a, b) {
|
|
251
|
+
// Use StarkNet's Pedersen hash
|
|
252
|
+
const result = hash.computePedersenHash("0x" + a.toHex(), "0x" + b.toHex());
|
|
253
|
+
return FieldElement.fromBigInt(BigInt(result), STARK_PRIME);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Create a StarkNet proof adapter with the specified configuration.
|
|
258
|
+
*/
|
|
259
|
+
export function createStarknetProofAdapter(clock, config) {
|
|
260
|
+
return new StarknetProofAdapter(clock, config);
|
|
261
|
+
}
|