blackbox-mcp 0.1.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/dist/api.js ADDED
@@ -0,0 +1,160 @@
1
+ export class BlackBoxAPI {
2
+ config;
3
+ constructor(config) {
4
+ this.config = config;
5
+ }
6
+ async fetchFromAnyNode(path) {
7
+ const errors = [];
8
+ for (const nodeUrl of this.config.nodeUrls) {
9
+ try {
10
+ const resp = await fetch(`${nodeUrl}${path}`);
11
+ if (!resp.ok) {
12
+ errors.push(`${nodeUrl}: HTTP ${resp.status}`);
13
+ continue;
14
+ }
15
+ return await resp.json();
16
+ }
17
+ catch (e) {
18
+ errors.push(`${nodeUrl}: ${e.message}`);
19
+ }
20
+ }
21
+ throw new Error(`All nodes failed for ${path}: ${errors.join('; ')}`);
22
+ }
23
+ async getHealth() {
24
+ return this.fetchFromAnyNode('/api/health');
25
+ }
26
+ async getChains() {
27
+ const data = await this.fetchFromAnyNode('/api/config/chains');
28
+ return (data.chains || []).map((c) => ({
29
+ chain_name: c.ChainName || c.chain_name,
30
+ chain_id: c.ChainID || c.chain_id,
31
+ chain_type: c.ChainType || c.chain_type,
32
+ name: c.Name || c.name || c.ChainName || c.chain_name,
33
+ rpc_url: c.RPCURL || c.rpc_url,
34
+ treasury_address: c.TreasuryAddress || c.treasury_address,
35
+ block_explorer: c.BlockExplorer || c.block_explorer,
36
+ native_currency: c.NativeCurrency || c.native_currency,
37
+ supported_tokens: c.SupportedTokens || c.supported_tokens || [],
38
+ }));
39
+ }
40
+ async getTokens(chain) {
41
+ const data = await this.fetchFromAnyNode(`/api/config/tokens?chain=${chain}`);
42
+ return data.tokens || [];
43
+ }
44
+ async getMerkleRoots(chain) {
45
+ const path = chain ? `/api/config/merkle-roots?chain=${chain}` : '/api/config/merkle-roots';
46
+ const data = await this.fetchFromAnyNode(path);
47
+ return (data.merkle_roots || [])
48
+ .filter((r) => (r.MerkleRootIDOnChain ?? r.merkle_root_id_on_chain ?? -1) >= 0)
49
+ .map((r) => ({
50
+ denomination: r.Denomination || r.denomination,
51
+ merkle_root_id_on_chain: r.MerkleRootIDOnChain ?? r.merkle_root_id_on_chain,
52
+ token_symbol: r.TokenSymbol || r.token_symbol || 'ETH',
53
+ chain_name: r.ChainName || r.chain_name,
54
+ }));
55
+ }
56
+ async getTokenMappings() {
57
+ const data = await this.fetchFromAnyNode('/api/token-mappings');
58
+ // API returns an object keyed by token symbol (e.g., { ETH: { "sepolia:base_sepolia": {...} } })
59
+ // not an array
60
+ return data;
61
+ }
62
+ async getLeaderboard(limit = 100) {
63
+ return this.fetchFromAnyNode(`/api/v2/leaderboard?limit=${limit}`);
64
+ }
65
+ async requestKeyshares(params) {
66
+ const promises = this.config.nodeUrls.map(async (nodeUrl) => {
67
+ try {
68
+ const resp = await fetch(`${nodeUrl}/api/v2/request-keyshare`, {
69
+ method: 'POST',
70
+ headers: { 'Content-Type': 'application/json' },
71
+ body: JSON.stringify({
72
+ deposit_tx_hash: params.depositTxHash,
73
+ source_chain: params.sourceChain,
74
+ withdrawal_requests: params.withdrawalRequests,
75
+ user_address: params.userAddress,
76
+ signature: params.signature,
77
+ timestamp: params.timestamp,
78
+ occurrence_offset: params.occurrenceOffset || 0,
79
+ spend_request_id: params.spendRequestId || '',
80
+ }),
81
+ });
82
+ if (!resp.ok) {
83
+ const text = await resp.text();
84
+ return { success: false, error: `Node ${nodeUrl}: ${resp.status} ${text}` };
85
+ }
86
+ const data = await resp.json();
87
+ if (!data.success) {
88
+ return { success: false, error: data.error || 'Unknown error' };
89
+ }
90
+ return {
91
+ success: true,
92
+ nodeId: data.node_id,
93
+ keyshares: data.keyshares,
94
+ threshold: data.threshold,
95
+ depositAmount: data.deposit_amount,
96
+ claimedAmount: data.claimed_amount,
97
+ remainingDeposit: data.remaining_deposit,
98
+ };
99
+ }
100
+ catch (e) {
101
+ return { success: false, error: `Node ${nodeUrl}: ${e.message}` };
102
+ }
103
+ });
104
+ return Promise.all(promises);
105
+ }
106
+ async relayWithdraw(params) {
107
+ // Try coordinator node first, then others
108
+ const errors = [];
109
+ for (const nodeUrl of this.config.nodeUrls) {
110
+ try {
111
+ const resp = await fetch(`${nodeUrl}/api/v2/relay/withdraw`, {
112
+ method: 'POST',
113
+ headers: { 'Content-Type': 'application/json' },
114
+ body: JSON.stringify({
115
+ chain: params.chain,
116
+ chain_type: params.chainType,
117
+ recipient: params.recipient,
118
+ amount: params.amount,
119
+ token: params.token,
120
+ signature: params.signature,
121
+ merkle_proof: params.merkleProof,
122
+ merkle_root_id: params.merkleRootId,
123
+ key_index: params.keyIndex,
124
+ max_relayer_fee: params.maxRelayerFee || '0',
125
+ }),
126
+ });
127
+ const data = await resp.json();
128
+ if (resp.ok)
129
+ return data;
130
+ errors.push(`${nodeUrl}: ${JSON.stringify(data)}`);
131
+ }
132
+ catch (e) {
133
+ errors.push(`${nodeUrl}: ${e.message}`);
134
+ }
135
+ }
136
+ throw new Error(`Relay withdraw failed: ${errors.join('; ')}`);
137
+ }
138
+ async getRelayStatus(jobId) {
139
+ return this.fetchFromAnyNode(`/api/v2/relay/status/${jobId}`);
140
+ }
141
+ async getSwapQuote(params) {
142
+ const nodeUrl = this.config.nodeUrls[0];
143
+ const resp = await fetch(`${nodeUrl}/api/v2/relay/quote-swap`, {
144
+ method: 'POST',
145
+ headers: { 'Content-Type': 'application/json' },
146
+ body: JSON.stringify({
147
+ asset_identifier_in: params.assetIn,
148
+ asset_identifier_out: params.assetOut,
149
+ exact_amount_in: params.amount,
150
+ swapType: params.swapType || 'EXACT_IN',
151
+ dry: params.dry ?? true,
152
+ }),
153
+ });
154
+ return resp.json();
155
+ }
156
+ async getRelayInfo() {
157
+ return this.fetchFromAnyNode('/api/v2/relay/info');
158
+ }
159
+ }
160
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface BlackBoxConfig {
2
+ nodeUrls: string[];
3
+ threshold: number;
4
+ walletStorePath: string;
5
+ }
6
+ export declare function loadConfig(): BlackBoxConfig;
package/dist/config.js ADDED
@@ -0,0 +1,25 @@
1
+ export function loadConfig() {
2
+ const nodeUrls = [];
3
+ // Check for individual node URLs (DKG_NODE_1 through DKG_NODE_5)
4
+ for (let i = 1; i <= 5; i++) {
5
+ const url = process.env[`DKG_NODE_${i}`];
6
+ if (url)
7
+ nodeUrls.push(url);
8
+ }
9
+ // Fallback to comma-separated list
10
+ if (nodeUrls.length === 0 && process.env.DKG_NODE_URLS) {
11
+ nodeUrls.push(...process.env.DKG_NODE_URLS.split(',').map(u => u.trim()));
12
+ }
13
+ // Default: 5 local nodes
14
+ if (nodeUrls.length === 0) {
15
+ for (let i = 1; i <= 5; i++) {
16
+ nodeUrls.push(`http://localhost:${8080 + i}`);
17
+ }
18
+ }
19
+ return {
20
+ nodeUrls,
21
+ threshold: parseInt(process.env.DKG_THRESHOLD || '3'),
22
+ walletStorePath: process.env.WALLET_STORE_PATH || './wallets',
23
+ };
24
+ }
25
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,UAAU;IACxB,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,iEAAiE;IACjE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACzC,IAAI,GAAG;YAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED,mCAAmC;IACnC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QACvD,QAAQ,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,yBAAyB;IACzB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,QAAQ,CAAC,IAAI,CAAC,oBAAoB,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,OAAO;QACL,QAAQ;QACR,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC;QACrD,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,WAAW;KAC9D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { ethers } from 'ethers';
2
+ export declare function reconstructPrivateKey(keyshares: Array<{
3
+ shareId: string;
4
+ shareValue: string;
5
+ nodeId?: number;
6
+ }>, threshold?: number): {
7
+ privateKey: bigint;
8
+ privateKeyHex: string;
9
+ };
10
+ export declare function verifyKeyMatchesAddress(privateKeyHex: string, expectedAddress: string): boolean;
11
+ export declare function sortKeysRecursive(obj: any): any;
12
+ export declare function createProofMessage(depositTxHash: string, sourceChain: string, withdrawalRequests: Array<{
13
+ target_chain: string;
14
+ token_symbol: string;
15
+ denomination: string;
16
+ }>, userAddress: string, timestamp: number): string;
17
+ export declare function createWithdrawalSignature(privateKeyHex: string, recipient: string, tokenAddress: string, amountWei: ethers.BigNumber, merkleRootId: number, keyIndex: number, chainId: number): Promise<string>;
18
+ export declare function createRelayWithdrawalSignature(privateKeyHex: string, recipient: string, tokenAddress: string, amountWei: ethers.BigNumber, merkleRootId: number, keyIndex: number, chainId: number, relayerAddress: string, maxRelayerFee: ethers.BigNumber): Promise<string>;
package/dist/crypto.js ADDED
@@ -0,0 +1,100 @@
1
+ import { ethers } from 'ethers';
2
+ const SECP256K1_N = BigInt('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141');
3
+ function modInverse(a, m) {
4
+ a = ((a % m) + m) % m;
5
+ let [old_r, r] = [a, m];
6
+ let [old_s, s] = [1n, 0n];
7
+ while (r !== 0n) {
8
+ const quotient = old_r / r;
9
+ [old_r, r] = [r, old_r - quotient * r];
10
+ [old_s, s] = [s, old_s - quotient * s];
11
+ }
12
+ if (old_r > 1n)
13
+ throw new Error('Modular inverse does not exist');
14
+ return ((old_s % m) + m) % m;
15
+ }
16
+ function computeLagrangeCoefficient(shares, i) {
17
+ const xi = BigInt(shares[i].shareId);
18
+ let numerator = 1n;
19
+ let denominator = 1n;
20
+ for (let j = 0; j < shares.length; j++) {
21
+ if (i === j)
22
+ continue;
23
+ const xj = BigInt(shares[j].shareId);
24
+ let negXj = (-xj) % SECP256K1_N;
25
+ if (negXj < 0n)
26
+ negXj += SECP256K1_N;
27
+ numerator = (numerator * negXj) % SECP256K1_N;
28
+ let diff = (xi - xj) % SECP256K1_N;
29
+ if (diff < 0n)
30
+ diff += SECP256K1_N;
31
+ denominator = (denominator * diff) % SECP256K1_N;
32
+ }
33
+ const denomInv = modInverse(denominator, SECP256K1_N);
34
+ return (numerator * denomInv) % SECP256K1_N;
35
+ }
36
+ export function reconstructPrivateKey(keyshares, threshold = 3) {
37
+ if (keyshares.length < threshold) {
38
+ throw new Error(`Need at least ${threshold} shares, got ${keyshares.length}`);
39
+ }
40
+ const sharesToUse = keyshares.slice(0, threshold);
41
+ let result = 0n;
42
+ for (let i = 0; i < sharesToUse.length; i++) {
43
+ let hex = sharesToUse[i].shareValue;
44
+ if (hex.startsWith('0x'))
45
+ hex = hex.slice(2);
46
+ const y_i = BigInt('0x' + hex);
47
+ const lambda = computeLagrangeCoefficient(sharesToUse, i);
48
+ result = (result + (y_i * lambda) % SECP256K1_N) % SECP256K1_N;
49
+ }
50
+ result = (result + SECP256K1_N) % SECP256K1_N;
51
+ const privateKeyHex = '0x' + result.toString(16).padStart(64, '0');
52
+ return { privateKey: result, privateKeyHex };
53
+ }
54
+ export function verifyKeyMatchesAddress(privateKeyHex, expectedAddress) {
55
+ const wallet = new ethers.Wallet(privateKeyHex);
56
+ return wallet.address.toLowerCase() === expectedAddress.toLowerCase();
57
+ }
58
+ export function sortKeysRecursive(obj) {
59
+ if (Array.isArray(obj))
60
+ return obj.map(sortKeysRecursive);
61
+ if (obj !== null && typeof obj === 'object') {
62
+ const sorted = {};
63
+ for (const key of Object.keys(obj).sort()) {
64
+ sorted[key] = sortKeysRecursive(obj[key]);
65
+ }
66
+ return sorted;
67
+ }
68
+ return obj;
69
+ }
70
+ export function createProofMessage(depositTxHash, sourceChain, withdrawalRequests, userAddress, timestamp) {
71
+ const message = {
72
+ action: 'request_withdrawal',
73
+ deposit_tx: depositTxHash,
74
+ source_chain: sourceChain,
75
+ timestamp,
76
+ user_address: userAddress,
77
+ withdrawal_requests: withdrawalRequests.map(wr => ({
78
+ denomination: wr.denomination,
79
+ target_chain: wr.target_chain,
80
+ token_symbol: wr.token_symbol,
81
+ })),
82
+ };
83
+ const sorted = sortKeysRecursive(message);
84
+ // Match Python json.dumps() default separators: (', ', ': ')
85
+ const compact = JSON.stringify(sorted);
86
+ return compact.replace(/,/g, ', ').replace(/:/g, ': ');
87
+ }
88
+ export function createWithdrawalSignature(privateKeyHex, recipient, tokenAddress, amountWei, merkleRootId, keyIndex, chainId) {
89
+ const encoded = ethers.utils.defaultAbiCoder.encode(['address', 'address', 'uint256', 'uint256', 'uint256', 'uint256'], [recipient, tokenAddress, amountWei, merkleRootId, keyIndex, chainId]);
90
+ const messageHash = ethers.utils.keccak256(encoded);
91
+ const wallet = new ethers.Wallet(privateKeyHex);
92
+ return wallet.signMessage(ethers.utils.arrayify(messageHash));
93
+ }
94
+ export function createRelayWithdrawalSignature(privateKeyHex, recipient, tokenAddress, amountWei, merkleRootId, keyIndex, chainId, relayerAddress, maxRelayerFee) {
95
+ const encoded = ethers.utils.defaultAbiCoder.encode(['address', 'address', 'uint256', 'uint256', 'uint256', 'uint256', 'address', 'uint256'], [recipient, tokenAddress, amountWei, merkleRootId, keyIndex, chainId, relayerAddress, maxRelayerFee]);
96
+ const messageHash = ethers.utils.keccak256(encoded);
97
+ const wallet = new ethers.Wallet(privateKeyHex);
98
+ return wallet.signMessage(ethers.utils.arrayify(messageHash));
99
+ }
100
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};