zkenclave-sdk 0.1.17 → 0.1.19

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/dist/index.d.mts CHANGED
@@ -113,6 +113,8 @@ declare class PrivacyVaultSDK {
113
113
  connect(signer: ethers.Signer): Promise<void>;
114
114
  deposit(amount: bigint): Promise<DepositResult>;
115
115
  withdraw(note: DepositNote, recipient: string, complianceProof?: Uint8Array): Promise<WithdrawalResult>;
116
+ withdrawViaTEE(note: DepositNote, recipient: string, teeEndpoint?: string): Promise<WithdrawalResult>;
117
+ private serializeTEEAttestation;
116
118
  getLatestRoot(): Promise<Uint8Array>;
117
119
  getNextLeafIndex(): Promise<number>;
118
120
  isNullifierUsed(nullifier: Uint8Array): Promise<boolean>;
@@ -150,7 +152,7 @@ declare class MerkleTree {
150
152
 
151
153
  declare const MERKLE_TREE_DEPTH = 20;
152
154
  declare const FIELD_SIZE: bigint;
153
- declare const DEFAULT_GAS_LIMIT = 500000n;
155
+ declare const DEFAULT_GAS_LIMIT = 1500000n;
154
156
  declare const DEFAULT_BATCH_SIZE = 10;
155
157
  declare const PROOF_EXPIRY_MS = 300000;
156
158
  declare const CONTRACT_ADDRESSES: {
package/dist/index.d.ts CHANGED
@@ -113,6 +113,8 @@ declare class PrivacyVaultSDK {
113
113
  connect(signer: ethers.Signer): Promise<void>;
114
114
  deposit(amount: bigint): Promise<DepositResult>;
115
115
  withdraw(note: DepositNote, recipient: string, complianceProof?: Uint8Array): Promise<WithdrawalResult>;
116
+ withdrawViaTEE(note: DepositNote, recipient: string, teeEndpoint?: string): Promise<WithdrawalResult>;
117
+ private serializeTEEAttestation;
116
118
  getLatestRoot(): Promise<Uint8Array>;
117
119
  getNextLeafIndex(): Promise<number>;
118
120
  isNullifierUsed(nullifier: Uint8Array): Promise<boolean>;
@@ -150,7 +152,7 @@ declare class MerkleTree {
150
152
 
151
153
  declare const MERKLE_TREE_DEPTH = 20;
152
154
  declare const FIELD_SIZE: bigint;
153
- declare const DEFAULT_GAS_LIMIT = 500000n;
155
+ declare const DEFAULT_GAS_LIMIT = 1500000n;
154
156
  declare const DEFAULT_BATCH_SIZE = 10;
155
157
  declare const PROOF_EXPIRY_MS = 300000;
156
158
  declare const CONTRACT_ADDRESSES: {
package/dist/index.js CHANGED
@@ -61,7 +61,7 @@ var MERKLE_TREE_DEPTH = 20;
61
61
  var FIELD_SIZE = BigInt(
62
62
  "21888242871839275222246405745257275088548364400416034343698204186575808495617"
63
63
  );
64
- var DEFAULT_GAS_LIMIT = 500000n;
64
+ var DEFAULT_GAS_LIMIT = 1500000n;
65
65
  var DEFAULT_BATCH_SIZE = 10;
66
66
  var PROOF_EXPIRY_MS = 3e5;
67
67
  var CONTRACT_ADDRESSES = {
@@ -426,7 +426,9 @@ var ZKProofClient = class {
426
426
  wasmReady = false;
427
427
  constructor(config) {
428
428
  this.config = config ?? { useRealProofs: true };
429
- this.loadWasm();
429
+ if (this.config.useRealProofs !== false) {
430
+ this.loadWasm();
431
+ }
430
432
  }
431
433
  async loadWasm() {
432
434
  if (wasmModule) {
@@ -657,6 +659,71 @@ var PrivacyVaultSDK = class {
657
659
  timestamp: Date.now()
658
660
  };
659
661
  }
662
+ async withdrawViaTEE(note, recipient, teeEndpoint = "/api/tee-withdraw") {
663
+ if (!this.signer) {
664
+ throw new Error("Signer required for withdrawals");
665
+ }
666
+ const root = await this.getLatestRoot();
667
+ const merklePath = this._merkleTree.generateProof(note.leafIndex);
668
+ const response = await fetch(teeEndpoint, {
669
+ method: "POST",
670
+ headers: { "Content-Type": "application/json" },
671
+ body: JSON.stringify({
672
+ commitment: Array.from(note.commitment),
673
+ nullifierSeed: Array.from(note.nullifierSeed),
674
+ secret: Array.from(note.secret),
675
+ amount: note.amount.toString(),
676
+ leafIndex: note.leafIndex,
677
+ recipient,
678
+ merklePath: merklePath.path.map((p) => Array.from(p)),
679
+ pathIndices: merklePath.indices,
680
+ merkleRoot: Array.from(root)
681
+ })
682
+ });
683
+ if (!response.ok) {
684
+ const error = await response.json();
685
+ throw new Error(error.error || "TEE withdrawal failed");
686
+ }
687
+ const result = await response.json();
688
+ if (!result.success) {
689
+ throw new Error(result.error || "TEE withdrawal failed");
690
+ }
691
+ const tx = await this.vault.withdraw(
692
+ result.nullifierHash,
693
+ bytesToHex(root),
694
+ recipient,
695
+ note.amount,
696
+ hexToBytes(result.zkProof),
697
+ this.serializeTEEAttestation(result.teeAttestation),
698
+ { gasLimit: DEFAULT_GAS_LIMIT }
699
+ );
700
+ const receipt = await tx.wait();
701
+ return {
702
+ success: true,
703
+ txHash: receipt.hash,
704
+ zkProof: hexToBytes(result.zkProof),
705
+ nullifierHash: hexToBytes(result.nullifierHash),
706
+ merkleRoot: root,
707
+ timestamp: Date.now()
708
+ };
709
+ }
710
+ serializeTEEAttestation(attestation) {
711
+ const enclaveId = hexToBytes(attestation.enclaveId);
712
+ const dataHash = hexToBytes(attestation.dataHash);
713
+ const signature = hexToBytes(attestation.signature);
714
+ const timestampBytes = new Uint8Array(8);
715
+ new DataView(timestampBytes.buffer).setBigUint64(
716
+ 0,
717
+ BigInt(attestation.timestamp),
718
+ false
719
+ );
720
+ return new Uint8Array([
721
+ ...enclaveId,
722
+ ...timestampBytes,
723
+ ...dataHash,
724
+ ...signature
725
+ ]);
726
+ }
660
727
  async getLatestRoot() {
661
728
  const root = await this.readVault.getLatestRoot();
662
729
  return hexToBytes(root);
package/dist/index.mjs CHANGED
@@ -7,7 +7,7 @@ var MERKLE_TREE_DEPTH = 20;
7
7
  var FIELD_SIZE = BigInt(
8
8
  "21888242871839275222246405745257275088548364400416034343698204186575808495617"
9
9
  );
10
- var DEFAULT_GAS_LIMIT = 500000n;
10
+ var DEFAULT_GAS_LIMIT = 1500000n;
11
11
  var DEFAULT_BATCH_SIZE = 10;
12
12
  var PROOF_EXPIRY_MS = 3e5;
13
13
  var CONTRACT_ADDRESSES = {
@@ -372,7 +372,9 @@ var ZKProofClient = class {
372
372
  wasmReady = false;
373
373
  constructor(config) {
374
374
  this.config = config ?? { useRealProofs: true };
375
- this.loadWasm();
375
+ if (this.config.useRealProofs !== false) {
376
+ this.loadWasm();
377
+ }
376
378
  }
377
379
  async loadWasm() {
378
380
  if (wasmModule) {
@@ -603,6 +605,71 @@ var PrivacyVaultSDK = class {
603
605
  timestamp: Date.now()
604
606
  };
605
607
  }
608
+ async withdrawViaTEE(note, recipient, teeEndpoint = "/api/tee-withdraw") {
609
+ if (!this.signer) {
610
+ throw new Error("Signer required for withdrawals");
611
+ }
612
+ const root = await this.getLatestRoot();
613
+ const merklePath = this._merkleTree.generateProof(note.leafIndex);
614
+ const response = await fetch(teeEndpoint, {
615
+ method: "POST",
616
+ headers: { "Content-Type": "application/json" },
617
+ body: JSON.stringify({
618
+ commitment: Array.from(note.commitment),
619
+ nullifierSeed: Array.from(note.nullifierSeed),
620
+ secret: Array.from(note.secret),
621
+ amount: note.amount.toString(),
622
+ leafIndex: note.leafIndex,
623
+ recipient,
624
+ merklePath: merklePath.path.map((p) => Array.from(p)),
625
+ pathIndices: merklePath.indices,
626
+ merkleRoot: Array.from(root)
627
+ })
628
+ });
629
+ if (!response.ok) {
630
+ const error = await response.json();
631
+ throw new Error(error.error || "TEE withdrawal failed");
632
+ }
633
+ const result = await response.json();
634
+ if (!result.success) {
635
+ throw new Error(result.error || "TEE withdrawal failed");
636
+ }
637
+ const tx = await this.vault.withdraw(
638
+ result.nullifierHash,
639
+ bytesToHex(root),
640
+ recipient,
641
+ note.amount,
642
+ hexToBytes(result.zkProof),
643
+ this.serializeTEEAttestation(result.teeAttestation),
644
+ { gasLimit: DEFAULT_GAS_LIMIT }
645
+ );
646
+ const receipt = await tx.wait();
647
+ return {
648
+ success: true,
649
+ txHash: receipt.hash,
650
+ zkProof: hexToBytes(result.zkProof),
651
+ nullifierHash: hexToBytes(result.nullifierHash),
652
+ merkleRoot: root,
653
+ timestamp: Date.now()
654
+ };
655
+ }
656
+ serializeTEEAttestation(attestation) {
657
+ const enclaveId = hexToBytes(attestation.enclaveId);
658
+ const dataHash = hexToBytes(attestation.dataHash);
659
+ const signature = hexToBytes(attestation.signature);
660
+ const timestampBytes = new Uint8Array(8);
661
+ new DataView(timestampBytes.buffer).setBigUint64(
662
+ 0,
663
+ BigInt(attestation.timestamp),
664
+ false
665
+ );
666
+ return new Uint8Array([
667
+ ...enclaveId,
668
+ ...timestampBytes,
669
+ ...dataHash,
670
+ ...signature
671
+ ]);
672
+ }
606
673
  async getLatestRoot() {
607
674
  const root = await this.readVault.getLatestRoot();
608
675
  return hexToBytes(root);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zkenclave-sdk",
3
- "version": "0.1.17",
3
+ "version": "0.1.19",
4
4
  "description": "TypeScript SDK for privacy-preserving vault withdrawals with ZK proofs",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",