@suit-protocol/sdk 0.3.0
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 +196 -0
- package/dist/compliance.d.ts +4 -0
- package/dist/compliance.d.ts.map +1 -0
- package/dist/compliance.js +92 -0
- package/dist/compliance.js.map +1 -0
- package/dist/crypto.d.ts +21 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +102 -0
- package/dist/crypto.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -0
- package/dist/pool.d.ts +20 -0
- package/dist/pool.d.ts.map +1 -0
- package/dist/pool.js +277 -0
- package/dist/pool.js.map +1 -0
- package/dist/proofs.d.ts +8 -0
- package/dist/proofs.d.ts.map +1 -0
- package/dist/proofs.js +19 -0
- package/dist/proofs.js.map +1 -0
- package/dist/relayer.d.ts +4 -0
- package/dist/relayer.d.ts.map +1 -0
- package/dist/relayer.js +33 -0
- package/dist/relayer.js.map +1 -0
- package/dist/signer.d.ts +8 -0
- package/dist/signer.d.ts.map +1 -0
- package/dist/signer.js +20 -0
- package/dist/signer.js.map +1 -0
- package/dist/sync.d.ts +18 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +76 -0
- package/dist/sync.js.map +1 -0
- package/dist/tree.d.ts +5 -0
- package/dist/tree.d.ts.map +1 -0
- package/dist/tree.js +56 -0
- package/dist/tree.js.map +1 -0
- package/dist/types.d.ts +132 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/dist/viewing-key.d.ts +6 -0
- package/dist/viewing-key.d.ts.map +1 -0
- package/dist/viewing-key.js +140 -0
- package/dist/viewing-key.js.map +1 -0
- package/package.json +45 -0
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
export interface SuitPoolConfig {
|
|
2
|
+
network: 'testnet' | 'mainnet';
|
|
3
|
+
networkPassphrase?: string;
|
|
4
|
+
rpcUrl?: string;
|
|
5
|
+
poolId: string;
|
|
6
|
+
tokenId: string;
|
|
7
|
+
verifierId: string;
|
|
8
|
+
startLedger: number;
|
|
9
|
+
decimals?: number;
|
|
10
|
+
depth?: number;
|
|
11
|
+
signer: Signer;
|
|
12
|
+
noteStore: NoteStore;
|
|
13
|
+
leafCache?: LeafCache;
|
|
14
|
+
circuitWasmPath: string;
|
|
15
|
+
circuitZkeyPath: string;
|
|
16
|
+
relayerUrl?: string;
|
|
17
|
+
explorerUrl?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface Signer {
|
|
20
|
+
getAddress(): Promise<string>;
|
|
21
|
+
signTransaction(preparedXdr: string, networkPassphrase: string): Promise<string>;
|
|
22
|
+
}
|
|
23
|
+
export interface NoteStore {
|
|
24
|
+
getNotes(poolId: string): UTXONote[];
|
|
25
|
+
saveNotes(poolId: string, notes: UTXONote[]): void;
|
|
26
|
+
getViewingSeed(poolId: string): string | null;
|
|
27
|
+
setViewingSeed(poolId: string, seed: string): void;
|
|
28
|
+
getAuditLog(poolId: string): EncryptedAuditEntry[];
|
|
29
|
+
appendAuditEntry(poolId: string, entry: EncryptedAuditEntry): void;
|
|
30
|
+
}
|
|
31
|
+
export interface LeafCache {
|
|
32
|
+
load(poolId: string): Map<number, string>;
|
|
33
|
+
save(poolId: string, data: Map<number, string>): void;
|
|
34
|
+
}
|
|
35
|
+
export interface UTXONote {
|
|
36
|
+
amount: string;
|
|
37
|
+
privKey: string;
|
|
38
|
+
blinding: string;
|
|
39
|
+
commitment: string;
|
|
40
|
+
leafIndex: number;
|
|
41
|
+
spent: boolean;
|
|
42
|
+
txHash: string;
|
|
43
|
+
ts: number;
|
|
44
|
+
withdrawTxHash?: string;
|
|
45
|
+
withdrawAmount?: string;
|
|
46
|
+
recipient?: string;
|
|
47
|
+
changeCommitment?: string;
|
|
48
|
+
}
|
|
49
|
+
export interface ShieldResult {
|
|
50
|
+
txHash: string;
|
|
51
|
+
note: UTXONote;
|
|
52
|
+
}
|
|
53
|
+
export interface WithdrawResult {
|
|
54
|
+
txHash: string;
|
|
55
|
+
changeNote: UTXONote | null;
|
|
56
|
+
}
|
|
57
|
+
export interface RelayerInfo {
|
|
58
|
+
relayer: string;
|
|
59
|
+
fee: string;
|
|
60
|
+
}
|
|
61
|
+
export interface RelayBundle {
|
|
62
|
+
poolId: string;
|
|
63
|
+
proof: string;
|
|
64
|
+
root: string;
|
|
65
|
+
extAmount: string;
|
|
66
|
+
nullifiers: string[];
|
|
67
|
+
commitments: string[];
|
|
68
|
+
recipient: string;
|
|
69
|
+
fee: string;
|
|
70
|
+
}
|
|
71
|
+
export interface EncryptedAuditEntry {
|
|
72
|
+
nonce: string;
|
|
73
|
+
ciphertext: string;
|
|
74
|
+
}
|
|
75
|
+
export interface AuditEntry {
|
|
76
|
+
type: 'shield' | 'withdraw';
|
|
77
|
+
amount: string;
|
|
78
|
+
pubKey: string;
|
|
79
|
+
blinding: string;
|
|
80
|
+
commitment: string;
|
|
81
|
+
leafIndex: number;
|
|
82
|
+
txHash: string;
|
|
83
|
+
timestamp: number;
|
|
84
|
+
recipient?: string;
|
|
85
|
+
}
|
|
86
|
+
export interface AuditPackage {
|
|
87
|
+
version: 1;
|
|
88
|
+
poolId: string;
|
|
89
|
+
network: string;
|
|
90
|
+
tokenId: string;
|
|
91
|
+
verifierId: string;
|
|
92
|
+
entries: EncryptedAuditEntry[];
|
|
93
|
+
}
|
|
94
|
+
export interface AuditReport {
|
|
95
|
+
valid: boolean;
|
|
96
|
+
entries: (AuditEntry & {
|
|
97
|
+
onChainVerified: boolean;
|
|
98
|
+
})[];
|
|
99
|
+
totalShielded: string;
|
|
100
|
+
totalWithdrawn: string;
|
|
101
|
+
netBalance: string;
|
|
102
|
+
}
|
|
103
|
+
export interface ComplianceReceipt {
|
|
104
|
+
version: 1;
|
|
105
|
+
poolId: string;
|
|
106
|
+
network: string;
|
|
107
|
+
deposit: {
|
|
108
|
+
amount: string;
|
|
109
|
+
pubKey: string;
|
|
110
|
+
blinding: string;
|
|
111
|
+
commitment: string;
|
|
112
|
+
txHash: string;
|
|
113
|
+
timestamp: number;
|
|
114
|
+
};
|
|
115
|
+
withdrawal: {
|
|
116
|
+
amount: string;
|
|
117
|
+
recipient: string;
|
|
118
|
+
txHash: string;
|
|
119
|
+
timestamp: number;
|
|
120
|
+
};
|
|
121
|
+
change?: {
|
|
122
|
+
amount: string;
|
|
123
|
+
commitment: string;
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
export interface ReceiptVerification {
|
|
127
|
+
valid: boolean;
|
|
128
|
+
commitmentValid: boolean;
|
|
129
|
+
commitmentOnChain: boolean;
|
|
130
|
+
nullifierBurned: boolean;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA,uCAAuC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { NoteStore, AuditEntry, AuditPackage, AuditReport, SuitPoolConfig } from './types';
|
|
2
|
+
export declare function appendAuditLog(store: NoteStore, poolId: string, entry: AuditEntry): Promise<void>;
|
|
3
|
+
export declare function getViewingKeyHex(store: NoteStore, poolId: string): string;
|
|
4
|
+
export declare function exportAuditPackage(config: SuitPoolConfig): AuditPackage;
|
|
5
|
+
export declare function verifyAuditPackage(pkg: AuditPackage, viewingKeyHex: string, rpcUrl?: string): Promise<AuditReport>;
|
|
6
|
+
//# sourceMappingURL=viewing-key.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viewing-key.d.ts","sourceRoot":"","sources":["../src/viewing-key.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAC3B,cAAc,EACpC,MAAM,SAAS,CAAC;AAmCjB,wBAAsB,cAAc,CAClC,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,UAAU,GAChB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAGzE;AAID,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,GAAG,YAAY,CASvE;AAID,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,YAAY,EACjB,aAAa,EAAE,MAAM,EACrB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,WAAW,CAAC,CAwCtB"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// SUIT Protocol SDK — Viewing keys + encrypted audit log
|
|
3
|
+
//
|
|
4
|
+
// A viewing key lets a user prove their shielded activity to a third party
|
|
5
|
+
// (auditor, regulator, tax authority) without giving spending access.
|
|
6
|
+
// The auditor can verify amounts against on-chain commitments but cannot
|
|
7
|
+
// produce valid nullifiers — they can look, not touch.
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.appendAuditLog = appendAuditLog;
|
|
10
|
+
exports.getViewingKeyHex = getViewingKeyHex;
|
|
11
|
+
exports.exportAuditPackage = exportAuditPackage;
|
|
12
|
+
exports.verifyAuditPackage = verifyAuditPackage;
|
|
13
|
+
const stellar_sdk_1 = require("@stellar/stellar-sdk");
|
|
14
|
+
const crypto_1 = require("./crypto");
|
|
15
|
+
// ── AES-GCM encryption (Web Crypto, zero dependencies) ──
|
|
16
|
+
async function encrypt(data, key) {
|
|
17
|
+
const iv = crypto.getRandomValues(new Uint8Array(12));
|
|
18
|
+
const encoded = new TextEncoder().encode(data);
|
|
19
|
+
const ck = await crypto.subtle.importKey('raw', key, 'AES-GCM', false, ['encrypt']);
|
|
20
|
+
const ct = await crypto.subtle.encrypt({ name: 'AES-GCM', iv }, ck, encoded);
|
|
21
|
+
return { nonce: (0, crypto_1.toHex)(iv), ciphertext: (0, crypto_1.toHex)(new Uint8Array(ct)) };
|
|
22
|
+
}
|
|
23
|
+
async function decrypt(entry, key) {
|
|
24
|
+
const iv = (0, crypto_1.fromHex)(entry.nonce);
|
|
25
|
+
const ct = (0, crypto_1.fromHex)(entry.ciphertext);
|
|
26
|
+
const ck = await crypto.subtle.importKey('raw', key, 'AES-GCM', false, ['decrypt']);
|
|
27
|
+
const pt = await crypto.subtle.decrypt({ name: 'AES-GCM', iv }, ck, ct);
|
|
28
|
+
return new TextDecoder().decode(pt);
|
|
29
|
+
}
|
|
30
|
+
// ── Viewing seed management ──
|
|
31
|
+
function getOrCreateSeed(store, poolId) {
|
|
32
|
+
let hex = store.getViewingSeed(poolId);
|
|
33
|
+
if (!hex) {
|
|
34
|
+
const seed = crypto.getRandomValues(new Uint8Array(32));
|
|
35
|
+
hex = (0, crypto_1.toHex)(seed);
|
|
36
|
+
store.setViewingSeed(poolId, hex);
|
|
37
|
+
}
|
|
38
|
+
return (0, crypto_1.fromHex)(hex);
|
|
39
|
+
}
|
|
40
|
+
// ── Audit log ──
|
|
41
|
+
async function appendAuditLog(store, poolId, entry) {
|
|
42
|
+
const seed = getOrCreateSeed(store, poolId);
|
|
43
|
+
const encrypted = await encrypt(JSON.stringify(entry), seed);
|
|
44
|
+
store.appendAuditEntry(poolId, encrypted);
|
|
45
|
+
}
|
|
46
|
+
function getViewingKeyHex(store, poolId) {
|
|
47
|
+
const seed = getOrCreateSeed(store, poolId);
|
|
48
|
+
return (0, crypto_1.toHex)(seed);
|
|
49
|
+
}
|
|
50
|
+
// ── Export ──
|
|
51
|
+
function exportAuditPackage(config) {
|
|
52
|
+
return {
|
|
53
|
+
version: 1,
|
|
54
|
+
poolId: config.poolId,
|
|
55
|
+
network: config.network,
|
|
56
|
+
tokenId: config.tokenId,
|
|
57
|
+
verifierId: config.verifierId,
|
|
58
|
+
entries: config.noteStore.getAuditLog(config.poolId),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
// ── Verify (static — anyone with the viewing key can run this) ──
|
|
62
|
+
async function verifyAuditPackage(pkg, viewingKeyHex, rpcUrl) {
|
|
63
|
+
const key = (0, crypto_1.fromHex)(viewingKeyHex);
|
|
64
|
+
const entries = [];
|
|
65
|
+
let totalIn = 0n;
|
|
66
|
+
let totalOut = 0n;
|
|
67
|
+
const url = rpcUrl ??
|
|
68
|
+
(pkg.network === 'mainnet' ? 'https://mainnet.sorobanrpc.com' : 'https://soroban-testnet.stellar.org');
|
|
69
|
+
const onChainCommitments = await fetchOnChainCommitments(url, pkg.poolId);
|
|
70
|
+
for (const enc of pkg.entries) {
|
|
71
|
+
let parsed;
|
|
72
|
+
try {
|
|
73
|
+
parsed = JSON.parse(await decrypt(enc, key));
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return { valid: false, entries: [], totalShielded: '0', totalWithdrawn: '0', netBalance: '0' };
|
|
77
|
+
}
|
|
78
|
+
const amt = BigInt(parsed.amount);
|
|
79
|
+
const pk = BigInt(parsed.pubKey);
|
|
80
|
+
const bl = BigInt(parsed.blinding);
|
|
81
|
+
const recomputed = (0, crypto_1.commitHash)(amt, pk, bl).toString();
|
|
82
|
+
const onChainVerified = recomputed === parsed.commitment &&
|
|
83
|
+
onChainCommitments.has(parsed.commitment);
|
|
84
|
+
entries.push({ ...parsed, onChainVerified });
|
|
85
|
+
if (parsed.type === 'shield')
|
|
86
|
+
totalIn += amt;
|
|
87
|
+
else
|
|
88
|
+
totalOut += amt;
|
|
89
|
+
}
|
|
90
|
+
const decimals = 7;
|
|
91
|
+
return {
|
|
92
|
+
valid: entries.every(e => e.onChainVerified),
|
|
93
|
+
entries,
|
|
94
|
+
totalShielded: (0, crypto_1.stroopsToAmount)(totalIn, decimals),
|
|
95
|
+
totalWithdrawn: (0, crypto_1.stroopsToAmount)(totalOut, decimals),
|
|
96
|
+
netBalance: (0, crypto_1.stroopsToAmount)(totalIn - totalOut, decimals),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
async function fetchOnChainCommitments(rpcUrl, poolId) {
|
|
100
|
+
const server = new stellar_sdk_1.rpc.Server(rpcUrl);
|
|
101
|
+
const commitments = new Set();
|
|
102
|
+
let start;
|
|
103
|
+
try {
|
|
104
|
+
const latest = (await server.getLatestLedger()).sequence;
|
|
105
|
+
start = Math.max(latest - 16000, 1);
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return commitments;
|
|
109
|
+
}
|
|
110
|
+
const filters = [{ type: 'contract', contractIds: [poolId], topics: [['*']] }];
|
|
111
|
+
try {
|
|
112
|
+
let res = await server.getEvents({ startLedger: start, filters, limit: 200 });
|
|
113
|
+
for (const e of res.events) {
|
|
114
|
+
try {
|
|
115
|
+
const data = (0, stellar_sdk_1.scValToNative)(e.value);
|
|
116
|
+
if (data?.out_commitment_0) {
|
|
117
|
+
commitments.add((0, crypto_1.bytesToBig)(data.out_commitment_0).toString());
|
|
118
|
+
commitments.add((0, crypto_1.bytesToBig)(data.out_commitment_1).toString());
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
catch { /* skip */ }
|
|
122
|
+
}
|
|
123
|
+
while (res.events.length === 200 && res.cursor) {
|
|
124
|
+
res = await server.getEvents({ filters, limit: 200, cursor: res.cursor });
|
|
125
|
+
for (const e of res.events) {
|
|
126
|
+
try {
|
|
127
|
+
const data = (0, stellar_sdk_1.scValToNative)(e.value);
|
|
128
|
+
if (data?.out_commitment_0) {
|
|
129
|
+
commitments.add((0, crypto_1.bytesToBig)(data.out_commitment_0).toString());
|
|
130
|
+
commitments.add((0, crypto_1.bytesToBig)(data.out_commitment_1).toString());
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
catch { /* skip */ }
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch { /* network error — partial verification */ }
|
|
138
|
+
return commitments;
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=viewing-key.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viewing-key.js","sourceRoot":"","sources":["../src/viewing-key.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@suit-protocol/sdk",
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "Pluggable ZK payment privacy for Stellar — shield, withdraw, viewing keys, compliance receipts",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist",
|
|
9
|
+
"README.md"
|
|
10
|
+
],
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsc",
|
|
13
|
+
"dev": "tsc --watch",
|
|
14
|
+
"typecheck": "tsc --noEmit",
|
|
15
|
+
"prepublishOnly": "npm run build"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"stellar",
|
|
19
|
+
"soroban",
|
|
20
|
+
"privacy",
|
|
21
|
+
"zero-knowledge",
|
|
22
|
+
"zk",
|
|
23
|
+
"groth16",
|
|
24
|
+
"utxo",
|
|
25
|
+
"poseidon",
|
|
26
|
+
"shielded-pool"
|
|
27
|
+
],
|
|
28
|
+
"license": "MIT",
|
|
29
|
+
"repository": {
|
|
30
|
+
"type": "git",
|
|
31
|
+
"url": "https://github.com/Techkeyy/suit",
|
|
32
|
+
"directory": "sdk"
|
|
33
|
+
},
|
|
34
|
+
"homepage": "https://github.com/Techkeyy/suit/tree/main/sdk#readme",
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"@stellar/stellar-sdk": "^16.0.1",
|
|
37
|
+
"poseidon-lite": "^0.3.0",
|
|
38
|
+
"js-sha3": "^0.9.3",
|
|
39
|
+
"snarkjs": "^0.7.4"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"typescript": "^5.3.0",
|
|
43
|
+
"@types/node": "^20.0.0"
|
|
44
|
+
}
|
|
45
|
+
}
|