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/README.md +497 -0
- package/dist/api.d.ts +99 -0
- package/dist/api.js +160 -0
- package/dist/api.js.map +1 -0
- package/dist/config.d.ts +6 -0
- package/dist/config.js +25 -0
- package/dist/config.js.map +1 -0
- package/dist/crypto.d.ts +18 -0
- package/dist/crypto.js +100 -0
- package/dist/crypto.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +932 -0
- package/dist/index.js.map +1 -0
- package/dist/wallet.d.ts +35 -0
- package/dist/wallet.js +144 -0
- package/dist/wallet.js.map +1 -0
- package/package.json +57 -0
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
|
package/dist/api.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
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"}
|
package/dist/crypto.d.ts
ADDED
|
@@ -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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"}
|
package/dist/index.d.ts
ADDED