multisigns-sdk 1.0.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/chunk-DGUM43GV.js +11 -0
- package/dist/chunk-DGUM43GV.js.map +1 -0
- package/dist/chunk-DIRO3HK2.js +156 -0
- package/dist/chunk-DIRO3HK2.js.map +1 -0
- package/dist/chunk-DRU5TCIR.js +177 -0
- package/dist/chunk-DRU5TCIR.js.map +1 -0
- package/dist/chunk-KXIOGAV2.js +156 -0
- package/dist/chunk-KXIOGAV2.js.map +1 -0
- package/dist/chunk-L45R2ICF.js +55 -0
- package/dist/chunk-L45R2ICF.js.map +1 -0
- package/dist/chunk-OTW5PZKP.js +122 -0
- package/dist/chunk-OTW5PZKP.js.map +1 -0
- package/dist/chunk-VM6L5X3N.js +217 -0
- package/dist/chunk-VM6L5X3N.js.map +1 -0
- package/dist/chunk-XYPJCLZQ.js +578 -0
- package/dist/chunk-XYPJCLZQ.js.map +1 -0
- package/dist/config-D7BTGWZB.js +34 -0
- package/dist/config-D7BTGWZB.js.map +1 -0
- package/dist/createSolanaMultisigOrder-ABBIJ4ZX.js +11 -0
- package/dist/createSolanaMultisigOrder-ABBIJ4ZX.js.map +1 -0
- package/dist/evm-validation-LYH2LHXM.js +138 -0
- package/dist/evm-validation-LYH2LHXM.js.map +1 -0
- package/dist/index.cjs +8373 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1181 -0
- package/dist/index.d.ts +1181 -0
- package/dist/index.js +6297 -0
- package/dist/index.js.map +1 -0
- package/dist/order-helpers-4TZ72BRJ.js +418 -0
- package/dist/order-helpers-4TZ72BRJ.js.map +1 -0
- package/dist/shares-Y4CE3S2X.js +32 -0
- package/dist/shares-Y4CE3S2X.js.map +1 -0
- package/dist/wallet.api-GK3OBWQS.js +9 -0
- package/dist/wallet.api-GK3OBWQS.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import {
|
|
2
|
+
API_TIMEOUTS,
|
|
3
|
+
BTC_NETWORK_CONFIG,
|
|
4
|
+
DEFAULT_CONFIG,
|
|
5
|
+
DEFAULT_RPC_ENDPOINTS,
|
|
6
|
+
EVM_CHAIN_NAMES,
|
|
7
|
+
KEY_RECONSTRUCTION_CONFIG,
|
|
8
|
+
MINIMUM_BALANCE_FOR_TX,
|
|
9
|
+
NATIVE_CURRENCY,
|
|
10
|
+
SHAMIR_CONFIG,
|
|
11
|
+
SUPPORTED_CHAINS,
|
|
12
|
+
TRON_FULL_HOST,
|
|
13
|
+
getRpcEndpoint,
|
|
14
|
+
resolveConfig,
|
|
15
|
+
resolveRpcEndpoints
|
|
16
|
+
} from "./chunk-DRU5TCIR.js";
|
|
17
|
+
import "./chunk-DGUM43GV.js";
|
|
18
|
+
export {
|
|
19
|
+
API_TIMEOUTS,
|
|
20
|
+
BTC_NETWORK_CONFIG,
|
|
21
|
+
DEFAULT_CONFIG,
|
|
22
|
+
DEFAULT_RPC_ENDPOINTS,
|
|
23
|
+
EVM_CHAIN_NAMES,
|
|
24
|
+
KEY_RECONSTRUCTION_CONFIG,
|
|
25
|
+
MINIMUM_BALANCE_FOR_TX,
|
|
26
|
+
NATIVE_CURRENCY,
|
|
27
|
+
SHAMIR_CONFIG,
|
|
28
|
+
SUPPORTED_CHAINS,
|
|
29
|
+
TRON_FULL_HOST,
|
|
30
|
+
getRpcEndpoint,
|
|
31
|
+
resolveConfig,
|
|
32
|
+
resolveRpcEndpoints
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=config-D7BTGWZB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createSolanaMultisigOrder
|
|
3
|
+
} from "./chunk-XYPJCLZQ.js";
|
|
4
|
+
import "./chunk-DRU5TCIR.js";
|
|
5
|
+
import "./chunk-KXIOGAV2.js";
|
|
6
|
+
import "./chunk-L45R2ICF.js";
|
|
7
|
+
import "./chunk-DGUM43GV.js";
|
|
8
|
+
export {
|
|
9
|
+
createSolanaMultisigOrder
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=createSolanaMultisigOrder-ABBIJ4ZX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import {
|
|
2
|
+
TransactionError
|
|
3
|
+
} from "./chunk-VM6L5X3N.js";
|
|
4
|
+
import "./chunk-L45R2ICF.js";
|
|
5
|
+
import "./chunk-DGUM43GV.js";
|
|
6
|
+
|
|
7
|
+
// src/chains/evm/evm-validation.ts
|
|
8
|
+
import { ethers } from "ethers";
|
|
9
|
+
var SYMBOLIC_GWEI_LIMITS = {
|
|
10
|
+
ETH: 100,
|
|
11
|
+
POL: 1e6,
|
|
12
|
+
ARBITRUM: 150,
|
|
13
|
+
OPTIMISM: 150,
|
|
14
|
+
BASE: 150,
|
|
15
|
+
BNB: 20
|
|
16
|
+
};
|
|
17
|
+
var MAINNET_CHAIN_IDS = {
|
|
18
|
+
ETH: "1",
|
|
19
|
+
POL: "137",
|
|
20
|
+
ARBITRUM: "42161",
|
|
21
|
+
OPTIMISM: "10",
|
|
22
|
+
BASE: "8453",
|
|
23
|
+
BNB: "56"
|
|
24
|
+
};
|
|
25
|
+
var TESTNET_CHAIN_IDS = {
|
|
26
|
+
ETH_SEPOLIA: "11155111",
|
|
27
|
+
POL: "80002",
|
|
28
|
+
ARBITRUM_SEPOLIA: "421614",
|
|
29
|
+
OPTIMISM_SEPOLIA: "11155420",
|
|
30
|
+
BASE_SEPOLIA: "84532",
|
|
31
|
+
BNB: "97"
|
|
32
|
+
};
|
|
33
|
+
function getChainConfig(chainId) {
|
|
34
|
+
const numericId = String(chainId);
|
|
35
|
+
for (const [key, id] of Object.entries(MAINNET_CHAIN_IDS)) {
|
|
36
|
+
if (id === numericId && SYMBOLIC_GWEI_LIMITS[key] !== void 0) {
|
|
37
|
+
return {
|
|
38
|
+
key,
|
|
39
|
+
chainId: numericId,
|
|
40
|
+
maxGwei: SYMBOLIC_GWEI_LIMITS[key]
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
for (const [key, id] of Object.entries(TESTNET_CHAIN_IDS)) {
|
|
45
|
+
const baseKey = key.replace("_SEPOLIA", "");
|
|
46
|
+
if (id === numericId && SYMBOLIC_GWEI_LIMITS[baseKey] !== void 0) {
|
|
47
|
+
return {
|
|
48
|
+
key: baseKey,
|
|
49
|
+
chainId: numericId,
|
|
50
|
+
maxGwei: SYMBOLIC_GWEI_LIMITS[baseKey]
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
var MAX_GAS_LIMIT_NATIVE = 5e5;
|
|
57
|
+
var MAX_GAS_LIMIT_ERC20 = 2e5;
|
|
58
|
+
function validateEvmTransaction(transaction, expectedChainId) {
|
|
59
|
+
const expectedChainIdBigInt = BigInt(expectedChainId);
|
|
60
|
+
if (transaction.chainId !== expectedChainIdBigInt) {
|
|
61
|
+
throw new TransactionError(
|
|
62
|
+
`Chain ID mismatch. Expected: ${expectedChainId}, Received: ${transaction.chainId}`,
|
|
63
|
+
{ details: { expectedChainId, receivedChainId: transaction.chainId } }
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
if (transaction.nonce === void 0 || transaction.nonce === null) {
|
|
67
|
+
throw new TransactionError("Transaction nonce is missing");
|
|
68
|
+
}
|
|
69
|
+
const isERC20Transfer = transaction.data && transaction.data !== "0x";
|
|
70
|
+
const chainConfig = getChainConfig(expectedChainId);
|
|
71
|
+
if (!chainConfig) {
|
|
72
|
+
throw new TransactionError(`Unsupported EVM chain ID: ${expectedChainId}`);
|
|
73
|
+
}
|
|
74
|
+
const maxGasLimit = isERC20Transfer ? MAX_GAS_LIMIT_ERC20 : MAX_GAS_LIMIT_NATIVE;
|
|
75
|
+
if (transaction.gasLimit && transaction.gasLimit > BigInt(maxGasLimit)) {
|
|
76
|
+
console.warn(
|
|
77
|
+
`Gas limit (${transaction.gasLimit}) exceeds recommended maximum (${maxGasLimit})`
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
const maxGasPrice = ethers.parseUnits(String(chainConfig.maxGwei), "gwei");
|
|
81
|
+
if (transaction.gasPrice && transaction.gasPrice > maxGasPrice) {
|
|
82
|
+
throw new TransactionError(
|
|
83
|
+
`Gas price exceeds safe limit for ${chainConfig.key}. Limit: ${chainConfig.maxGwei} Gwei`,
|
|
84
|
+
{ details: { gasPrice: transaction.gasPrice, maxGasPrice } }
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
if (transaction.maxFeePerGas && transaction.maxFeePerGas > maxGasPrice) {
|
|
88
|
+
throw new TransactionError(
|
|
89
|
+
`Max Fee Per Gas exceeds safe limit for ${chainConfig.key}. Limit: ${chainConfig.maxGwei} Gwei`,
|
|
90
|
+
{ details: { maxFeePerGas: transaction.maxFeePerGas, maxGasPrice } }
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
if (isERC20Transfer) {
|
|
94
|
+
validateERC20TransferData(transaction);
|
|
95
|
+
}
|
|
96
|
+
if (isERC20Transfer && transaction.value && transaction.value > 0n) {
|
|
97
|
+
console.warn("ERC20 transfer includes native token value - this is unusual");
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
function validateERC20TransferData(transaction) {
|
|
101
|
+
try {
|
|
102
|
+
const transferSignature = "0xa9059cbb";
|
|
103
|
+
if (!transaction.data.startsWith(transferSignature)) {
|
|
104
|
+
console.warn("Transaction contains data but not a standard ERC20 transfer");
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
const dataWithoutSig = transaction.data.slice(10);
|
|
108
|
+
if (dataWithoutSig.length !== 128) {
|
|
109
|
+
throw new TransactionError("Invalid ERC20 transfer data length");
|
|
110
|
+
}
|
|
111
|
+
const recipientHex = "0x" + dataWithoutSig.slice(24, 64);
|
|
112
|
+
const recipient = ethers.getAddress(recipientHex);
|
|
113
|
+
if (!ethers.isAddress(recipient)) {
|
|
114
|
+
throw new TransactionError("Invalid recipient address in transfer data");
|
|
115
|
+
}
|
|
116
|
+
const amountHex = "0x" + dataWithoutSig.slice(64, 128);
|
|
117
|
+
const amount = BigInt(amountHex);
|
|
118
|
+
if (amount <= 0n) {
|
|
119
|
+
throw new TransactionError("Invalid transfer amount");
|
|
120
|
+
}
|
|
121
|
+
} catch (error) {
|
|
122
|
+
if (error instanceof TransactionError) {
|
|
123
|
+
throw error;
|
|
124
|
+
}
|
|
125
|
+
console.error("Error validating ERC20 data:", error);
|
|
126
|
+
throw new TransactionError("Not standard transaction");
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
export {
|
|
130
|
+
MAINNET_CHAIN_IDS,
|
|
131
|
+
MAX_GAS_LIMIT_ERC20,
|
|
132
|
+
MAX_GAS_LIMIT_NATIVE,
|
|
133
|
+
SYMBOLIC_GWEI_LIMITS,
|
|
134
|
+
TESTNET_CHAIN_IDS,
|
|
135
|
+
getChainConfig,
|
|
136
|
+
validateEvmTransaction
|
|
137
|
+
};
|
|
138
|
+
//# sourceMappingURL=evm-validation-LYH2LHXM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/chains/evm/evm-validation.ts"],"sourcesContent":["\nimport { ethers } from 'ethers';\nimport { TransactionError } from '../../core/errors';\n\n/**\n * Chain configuration for gas limits\n */\nexport interface EvmChainConfig {\n key: string;\n chainId: string;\n maxGwei: number;\n}\n\n/**\n * Maximum gas price limits per chain (in Gwei)\n * These limits prevent users from accidentally paying excessive fees\n */\nexport const SYMBOLIC_GWEI_LIMITS: Record<string, number> = {\n ETH: 100,\n POL: 1000000,\n ARBITRUM: 150,\n OPTIMISM: 150,\n BASE: 150,\n BNB: 20,\n};\n\n/**\n * Chain ID mappings for mainnet and testnet\n */\nexport const MAINNET_CHAIN_IDS: Record<string, string> = {\n ETH: '1',\n POL: '137',\n ARBITRUM: '42161',\n OPTIMISM: '10',\n BASE: '8453',\n BNB: '56',\n};\n\nexport const TESTNET_CHAIN_IDS: Record<string, string> = {\n ETH_SEPOLIA: '11155111',\n POL: '80002',\n ARBITRUM_SEPOLIA: '421614',\n OPTIMISM_SEPOLIA: '11155420',\n BASE_SEPOLIA: '84532',\n BNB: '97',\n};\n\n/**\n * Get chain configuration by chain ID\n */\nexport function getChainConfig(chainId: string | number): EvmChainConfig | null {\n const numericId = String(chainId);\n\n // Check mainnet chains\n for (const [key, id] of Object.entries(MAINNET_CHAIN_IDS)) {\n if (id === numericId && SYMBOLIC_GWEI_LIMITS[key] !== undefined) {\n return {\n key,\n chainId: numericId,\n maxGwei: SYMBOLIC_GWEI_LIMITS[key],\n };\n }\n }\n\n // Check testnet chains\n for (const [key, id] of Object.entries(TESTNET_CHAIN_IDS)) {\n const baseKey = key.replace('_SEPOLIA', '');\n if (id === numericId && SYMBOLIC_GWEI_LIMITS[baseKey] !== undefined) {\n return {\n key: baseKey,\n chainId: numericId,\n maxGwei: SYMBOLIC_GWEI_LIMITS[baseKey],\n };\n }\n }\n\n return null;\n}\n\n/**\n * Recommended maximum gas limits\n */\nexport const MAX_GAS_LIMIT_NATIVE = 500000;\nexport const MAX_GAS_LIMIT_ERC20 = 200000;\n\n/**\n * Validate EVM transaction parameters before signing\n */\nexport function validateEvmTransaction(\n transaction: ethers.Transaction,\n expectedChainId: number\n): void {\n // Validate chain ID\n const expectedChainIdBigInt = BigInt(expectedChainId);\n if (transaction.chainId !== expectedChainIdBigInt) {\n throw new TransactionError(\n `Chain ID mismatch. Expected: ${expectedChainId}, Received: ${transaction.chainId}`,\n { details: { expectedChainId, receivedChainId: transaction.chainId } }\n );\n }\n\n // Validate nonce\n if (transaction.nonce === undefined || transaction.nonce === null) {\n throw new TransactionError('Transaction nonce is missing');\n }\n\n // Determine if this is an ERC20 transfer\n const isERC20Transfer = transaction.data && transaction.data !== '0x';\n\n // Get chain configuration for gas price validation\n const chainConfig = getChainConfig(expectedChainId);\n if (!chainConfig) {\n throw new TransactionError(`Unsupported EVM chain ID: ${expectedChainId}`);\n }\n\n // Validate gas limit\n const maxGasLimit = isERC20Transfer ? MAX_GAS_LIMIT_ERC20 : MAX_GAS_LIMIT_NATIVE;\n if (transaction.gasLimit && transaction.gasLimit > BigInt(maxGasLimit)) {\n console.warn(\n `Gas limit (${transaction.gasLimit}) exceeds recommended maximum (${maxGasLimit})`\n );\n }\n\n // Validate gas price\n const maxGasPrice = ethers.parseUnits(String(chainConfig.maxGwei), 'gwei');\n\n if (transaction.gasPrice && transaction.gasPrice > maxGasPrice) {\n throw new TransactionError(\n `Gas price exceeds safe limit for ${chainConfig.key}. Limit: ${chainConfig.maxGwei} Gwei`,\n { details: { gasPrice: transaction.gasPrice, maxGasPrice } }\n );\n }\n\n if (transaction.maxFeePerGas && transaction.maxFeePerGas > maxGasPrice) {\n throw new TransactionError(\n `Max Fee Per Gas exceeds safe limit for ${chainConfig.key}. Limit: ${chainConfig.maxGwei} Gwei`,\n { details: { maxFeePerGas: transaction.maxFeePerGas, maxGasPrice } }\n );\n }\n\n // Validate ERC20 transfer data\n if (isERC20Transfer) {\n validateERC20TransferData(transaction);\n }\n\n // Warn if ERC20 transfer includes native token value\n if (isERC20Transfer && transaction.value && transaction.value > 0n) {\n console.warn('ERC20 transfer includes native token value - this is unusual');\n }\n}\n\n/**\n * Validate ERC20 transfer function data\n */\nfunction validateERC20TransferData(transaction: ethers.Transaction): void {\n try {\n const transferSignature = '0xa9059cbb'; // transfer(address,uint256)\n\n if (!transaction.data.startsWith(transferSignature)) {\n console.warn('Transaction contains data but not a standard ERC20 transfer');\n return;\n }\n\n const dataWithoutSig = transaction.data.slice(10);\n if (dataWithoutSig.length !== 128) {\n throw new TransactionError('Invalid ERC20 transfer data length');\n }\n\n // Extract and validate recipient address\n const recipientHex = '0x' + dataWithoutSig.slice(24, 64);\n const recipient = ethers.getAddress(recipientHex);\n\n if (!ethers.isAddress(recipient)) {\n throw new TransactionError('Invalid recipient address in transfer data');\n }\n\n // Extract and validate amount\n const amountHex = '0x' + dataWithoutSig.slice(64, 128);\n const amount = BigInt(amountHex);\n\n if (amount <= 0n) {\n throw new TransactionError('Invalid transfer amount');\n }\n } catch (error) {\n if (error instanceof TransactionError) {\n throw error;\n }\n console.error('Error validating ERC20 data:', error);\n throw new TransactionError('Not standard transaction');\n }\n}\n"],"mappings":"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","names":[]}
|