moltspay 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.
@@ -0,0 +1,246 @@
1
+ // src/permit/Permit.ts
2
+ import { ethers } from "ethers";
3
+
4
+ // src/chains/index.ts
5
+ var CHAINS = {
6
+ // ============ 主网 ============
7
+ base: {
8
+ name: "Base",
9
+ chainId: 8453,
10
+ rpc: "https://mainnet.base.org",
11
+ usdc: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
12
+ explorer: "https://basescan.org/address/",
13
+ explorerTx: "https://basescan.org/tx/",
14
+ avgBlockTime: 2
15
+ },
16
+ polygon: {
17
+ name: "Polygon",
18
+ chainId: 137,
19
+ rpc: "https://polygon-rpc.com",
20
+ usdc: "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
21
+ explorer: "https://polygonscan.com/address/",
22
+ explorerTx: "https://polygonscan.com/tx/",
23
+ avgBlockTime: 2
24
+ },
25
+ ethereum: {
26
+ name: "Ethereum",
27
+ chainId: 1,
28
+ rpc: "https://eth.llamarpc.com",
29
+ usdc: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
30
+ explorer: "https://etherscan.io/address/",
31
+ explorerTx: "https://etherscan.io/tx/",
32
+ avgBlockTime: 12
33
+ },
34
+ // ============ 测试网 ============
35
+ base_sepolia: {
36
+ name: "Base Sepolia",
37
+ chainId: 84532,
38
+ rpc: "https://sepolia.base.org",
39
+ usdc: "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
40
+ explorer: "https://sepolia.basescan.org/address/",
41
+ explorerTx: "https://sepolia.basescan.org/tx/",
42
+ avgBlockTime: 2
43
+ },
44
+ sepolia: {
45
+ name: "Sepolia",
46
+ chainId: 11155111,
47
+ rpc: "https://rpc.sepolia.org",
48
+ usdc: "0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238",
49
+ explorer: "https://sepolia.etherscan.io/address/",
50
+ explorerTx: "https://sepolia.etherscan.io/tx/",
51
+ avgBlockTime: 12
52
+ }
53
+ };
54
+ function getChain(name) {
55
+ const config = CHAINS[name];
56
+ if (!config) {
57
+ throw new Error(`Unsupported chain: ${name}. Supported: ${Object.keys(CHAINS).join(", ")}`);
58
+ }
59
+ return config;
60
+ }
61
+ var ERC20_ABI = [
62
+ "function balanceOf(address owner) view returns (uint256)",
63
+ "function transfer(address to, uint256 amount) returns (bool)",
64
+ "function approve(address spender, uint256 amount) returns (bool)",
65
+ "function allowance(address owner, address spender) view returns (uint256)",
66
+ "function decimals() view returns (uint8)",
67
+ "function symbol() view returns (string)",
68
+ "function name() view returns (string)",
69
+ "function nonces(address owner) view returns (uint256)",
70
+ "function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)",
71
+ "event Transfer(address indexed from, address indexed to, uint256 value)",
72
+ "event Approval(address indexed owner, address indexed spender, uint256 value)"
73
+ ];
74
+
75
+ // src/permit/Permit.ts
76
+ var PermitPayment = class {
77
+ chain;
78
+ chainConfig;
79
+ spenderAddress;
80
+ provider;
81
+ wallet;
82
+ usdcContract;
83
+ constructor(config = {}) {
84
+ this.chain = config.chain || "base_sepolia";
85
+ this.chainConfig = getChain(this.chain);
86
+ this.spenderAddress = config.spenderAddress || process.env.PAYMENT_AGENT_WALLET || "";
87
+ const rpcUrl = config.rpcUrl || this.chainConfig.rpc;
88
+ this.provider = new ethers.JsonRpcProvider(rpcUrl);
89
+ const privateKey = config.privateKey || process.env.PAYMENT_AGENT_PRIVATE_KEY;
90
+ if (privateKey) {
91
+ this.wallet = new ethers.Wallet(privateKey, this.provider);
92
+ this.spenderAddress = this.wallet.address;
93
+ }
94
+ this.usdcContract = new ethers.Contract(
95
+ this.chainConfig.usdc,
96
+ ERC20_ABI,
97
+ this.wallet || this.provider
98
+ );
99
+ }
100
+ /**
101
+ * 获取用户当前 nonce
102
+ */
103
+ async getNonce(owner) {
104
+ return Number(await this.usdcContract.nonces(owner));
105
+ }
106
+ /**
107
+ * 生成 EIP-712 签名请求(发给前端/用户钱包)
108
+ */
109
+ async createPermitRequest(owner, amount, orderId, deadlineMinutes = 30) {
110
+ const nonce = await this.getNonce(owner);
111
+ const deadline = Math.floor(Date.now() / 1e3) + deadlineMinutes * 60;
112
+ const value = BigInt(Math.floor(amount * 1e6)).toString();
113
+ const domain = {
114
+ name: "USD Coin",
115
+ version: "2",
116
+ chainId: this.chainConfig.chainId,
117
+ verifyingContract: this.chainConfig.usdc
118
+ };
119
+ const types = {
120
+ EIP712Domain: [
121
+ { name: "name", type: "string" },
122
+ { name: "version", type: "string" },
123
+ { name: "chainId", type: "uint256" },
124
+ { name: "verifyingContract", type: "address" }
125
+ ],
126
+ Permit: [
127
+ { name: "owner", type: "address" },
128
+ { name: "spender", type: "address" },
129
+ { name: "value", type: "uint256" },
130
+ { name: "nonce", type: "uint256" },
131
+ { name: "deadline", type: "uint256" }
132
+ ]
133
+ };
134
+ const message = {
135
+ owner,
136
+ spender: this.spenderAddress,
137
+ value,
138
+ nonce,
139
+ deadline
140
+ };
141
+ const typedData = {
142
+ types,
143
+ primaryType: "Permit",
144
+ domain,
145
+ message
146
+ };
147
+ return {
148
+ type: "permit_request",
149
+ version: "1.0",
150
+ order_id: orderId,
151
+ typed_data: typedData
152
+ };
153
+ }
154
+ /**
155
+ * 执行 permit + transferFrom
156
+ *
157
+ * @param owner 用户地址
158
+ * @param amount 金额
159
+ * @param signature 用户签名 {v, r, s, deadline}
160
+ */
161
+ async executePermitAndTransfer(owner, amount, signature) {
162
+ if (!this.wallet) {
163
+ return { success: false, error: "Wallet not configured. Private key required." };
164
+ }
165
+ try {
166
+ const value = BigInt(Math.floor(amount * 1e6));
167
+ const permitTx = await this.usdcContract.permit(
168
+ owner,
169
+ this.spenderAddress,
170
+ value,
171
+ signature.deadline,
172
+ signature.v,
173
+ signature.r,
174
+ signature.s
175
+ );
176
+ await permitTx.wait();
177
+ const transferTx = await this.usdcContract.transferFrom(owner, this.spenderAddress, value);
178
+ const receipt = await transferTx.wait();
179
+ return {
180
+ success: receipt.status === 1,
181
+ tx_hash: transferTx.hash
182
+ };
183
+ } catch (error) {
184
+ return {
185
+ success: false,
186
+ error: error.message
187
+ };
188
+ }
189
+ }
190
+ /**
191
+ * 仅执行 permit(不 transfer)
192
+ */
193
+ async executePermit(owner, amount, signature) {
194
+ if (!this.wallet) {
195
+ return { success: false, error: "Wallet not configured. Private key required." };
196
+ }
197
+ try {
198
+ const value = BigInt(Math.floor(amount * 1e6));
199
+ const tx = await this.usdcContract.permit(
200
+ owner,
201
+ this.spenderAddress,
202
+ value,
203
+ signature.deadline,
204
+ signature.v,
205
+ signature.r,
206
+ signature.s
207
+ );
208
+ const receipt = await tx.wait();
209
+ return {
210
+ success: receipt.status === 1,
211
+ tx_hash: tx.hash
212
+ };
213
+ } catch (error) {
214
+ return {
215
+ success: false,
216
+ error: error.message
217
+ };
218
+ }
219
+ }
220
+ /**
221
+ * 格式化 Permit 请求为用户消息
222
+ */
223
+ formatPermitMessage(request) {
224
+ const { typed_data } = request;
225
+ const { message } = typed_data;
226
+ return `\u{1F510} **\u7B7E\u540D\u6388\u6743\u8BF7\u6C42**
227
+
228
+ \u6388\u6743 \`${(Number(message.value) / 1e6).toFixed(2)} USDC\` \u7ED9\u670D\u52A1\u65B9
229
+
230
+ **\u7B7E\u540D\u4FE1\u606F\uFF1A**
231
+ - Owner: \`${message.owner}\`
232
+ - Spender: \`${message.spender}\`
233
+ - Amount: ${(Number(message.value) / 1e6).toFixed(2)} USDC
234
+ - Deadline: ${new Date(message.deadline * 1e3).toISOString()}
235
+
236
+ \u8BF7\u5728\u94B1\u5305\u4E2D\u7B7E\u540D\u6B64\u8BF7\u6C42\uFF08\u4E0D\u6D88\u8017 Gas\uFF09\u3002
237
+
238
+ \`\`\`json
239
+ ${JSON.stringify(typed_data, null, 2)}
240
+ \`\`\``;
241
+ }
242
+ };
243
+ export {
244
+ PermitPayment
245
+ };
246
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/permit/Permit.ts","../../src/chains/index.ts"],"sourcesContent":["/**\n * PermitPayment - EIP-2612 无 Gas 预授权\n * \n * 让用户通过签名授权,服务方代付 Gas 执行 transferFrom\n */\n\nimport { ethers } from 'ethers';\nimport { getChain, ERC20_ABI } from '../chains/index.js';\nimport type {\n ChainName,\n ChainConfig,\n PermitRequest,\n PermitSignature,\n PermitExecuteResult,\n EIP712TypedData,\n} from '../types/index.js';\n\nexport interface PermitConfig {\n chain?: ChainName;\n privateKey?: string;\n spenderAddress?: string;\n rpcUrl?: string;\n}\n\nexport class PermitPayment {\n readonly chain: ChainName;\n readonly chainConfig: ChainConfig;\n readonly spenderAddress: string;\n \n private provider: ethers.JsonRpcProvider;\n private wallet?: ethers.Wallet;\n private usdcContract: ethers.Contract;\n\n constructor(config: PermitConfig = {}) {\n this.chain = config.chain || 'base_sepolia';\n this.chainConfig = getChain(this.chain);\n this.spenderAddress = config.spenderAddress || process.env.PAYMENT_AGENT_WALLET || '';\n\n const rpcUrl = config.rpcUrl || this.chainConfig.rpc;\n this.provider = new ethers.JsonRpcProvider(rpcUrl);\n\n const privateKey = config.privateKey || process.env.PAYMENT_AGENT_PRIVATE_KEY;\n if (privateKey) {\n this.wallet = new ethers.Wallet(privateKey, this.provider);\n this.spenderAddress = this.wallet.address;\n }\n\n this.usdcContract = new ethers.Contract(\n this.chainConfig.usdc,\n ERC20_ABI,\n this.wallet || this.provider\n );\n }\n\n /**\n * 获取用户当前 nonce\n */\n async getNonce(owner: string): Promise<number> {\n return Number(await this.usdcContract.nonces(owner));\n }\n\n /**\n * 生成 EIP-712 签名请求(发给前端/用户钱包)\n */\n async createPermitRequest(\n owner: string,\n amount: number,\n orderId: string,\n deadlineMinutes: number = 30\n ): Promise<PermitRequest> {\n const nonce = await this.getNonce(owner);\n const deadline = Math.floor(Date.now() / 1000) + deadlineMinutes * 60;\n const value = BigInt(Math.floor(amount * 1e6)).toString();\n\n // USDC 的 EIP-712 domain(不同链可能不同)\n const domain = {\n name: 'USD Coin',\n version: '2',\n chainId: this.chainConfig.chainId,\n verifyingContract: this.chainConfig.usdc,\n };\n\n const types = {\n EIP712Domain: [\n { name: 'name', type: 'string' },\n { name: 'version', type: 'string' },\n { name: 'chainId', type: 'uint256' },\n { name: 'verifyingContract', type: 'address' },\n ],\n Permit: [\n { name: 'owner', type: 'address' },\n { name: 'spender', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'nonce', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n ],\n };\n\n const message = {\n owner,\n spender: this.spenderAddress,\n value,\n nonce,\n deadline,\n };\n\n const typedData: EIP712TypedData = {\n types,\n primaryType: 'Permit',\n domain,\n message,\n };\n\n return {\n type: 'permit_request',\n version: '1.0',\n order_id: orderId,\n typed_data: typedData,\n };\n }\n\n /**\n * 执行 permit + transferFrom\n * \n * @param owner 用户地址\n * @param amount 金额\n * @param signature 用户签名 {v, r, s, deadline}\n */\n async executePermitAndTransfer(\n owner: string,\n amount: number,\n signature: PermitSignature\n ): Promise<PermitExecuteResult> {\n if (!this.wallet) {\n return { success: false, error: 'Wallet not configured. Private key required.' };\n }\n\n try {\n const value = BigInt(Math.floor(amount * 1e6));\n\n // 1. 调用 permit\n const permitTx = await this.usdcContract.permit(\n owner,\n this.spenderAddress,\n value,\n signature.deadline,\n signature.v,\n signature.r,\n signature.s\n );\n await permitTx.wait();\n\n // 2. 调用 transferFrom\n const transferTx = await this.usdcContract.transferFrom(owner, this.spenderAddress, value);\n const receipt = await transferTx.wait();\n\n return {\n success: receipt.status === 1,\n tx_hash: transferTx.hash,\n };\n } catch (error) {\n return {\n success: false,\n error: (error as Error).message,\n };\n }\n }\n\n /**\n * 仅执行 permit(不 transfer)\n */\n async executePermit(\n owner: string,\n amount: number,\n signature: PermitSignature\n ): Promise<PermitExecuteResult> {\n if (!this.wallet) {\n return { success: false, error: 'Wallet not configured. Private key required.' };\n }\n\n try {\n const value = BigInt(Math.floor(amount * 1e6));\n\n const tx = await this.usdcContract.permit(\n owner,\n this.spenderAddress,\n value,\n signature.deadline,\n signature.v,\n signature.r,\n signature.s\n );\n const receipt = await tx.wait();\n\n return {\n success: receipt.status === 1,\n tx_hash: tx.hash,\n };\n } catch (error) {\n return {\n success: false,\n error: (error as Error).message,\n };\n }\n }\n\n /**\n * 格式化 Permit 请求为用户消息\n */\n formatPermitMessage(request: PermitRequest): string {\n const { typed_data } = request;\n const { message } = typed_data;\n\n return `🔐 **签名授权请求**\n\n授权 \\`${(Number(message.value) / 1e6).toFixed(2)} USDC\\` 给服务方\n\n**签名信息:**\n- Owner: \\`${message.owner}\\`\n- Spender: \\`${message.spender}\\`\n- Amount: ${(Number(message.value) / 1e6).toFixed(2)} USDC\n- Deadline: ${new Date(message.deadline * 1000).toISOString()}\n\n请在钱包中签名此请求(不消耗 Gas)。\n\n\\`\\`\\`json\n${JSON.stringify(typed_data, null, 2)}\n\\`\\`\\``;\n }\n}\n","/**\n * 区块链配置\n */\n\nimport type { ChainConfig, ChainName } from '../types/index.js';\n\nexport const CHAINS: Record<ChainName, ChainConfig> = {\n // ============ 主网 ============\n base: {\n name: 'Base',\n chainId: 8453,\n rpc: 'https://mainnet.base.org',\n usdc: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n explorer: 'https://basescan.org/address/',\n explorerTx: 'https://basescan.org/tx/',\n avgBlockTime: 2,\n },\n polygon: {\n name: 'Polygon',\n chainId: 137,\n rpc: 'https://polygon-rpc.com',\n usdc: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',\n explorer: 'https://polygonscan.com/address/',\n explorerTx: 'https://polygonscan.com/tx/',\n avgBlockTime: 2,\n },\n ethereum: {\n name: 'Ethereum',\n chainId: 1,\n rpc: 'https://eth.llamarpc.com',\n usdc: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n explorer: 'https://etherscan.io/address/',\n explorerTx: 'https://etherscan.io/tx/',\n avgBlockTime: 12,\n },\n\n // ============ 测试网 ============\n base_sepolia: {\n name: 'Base Sepolia',\n chainId: 84532,\n rpc: 'https://sepolia.base.org',\n usdc: '0x036CbD53842c5426634e7929541eC2318f3dCF7e',\n explorer: 'https://sepolia.basescan.org/address/',\n explorerTx: 'https://sepolia.basescan.org/tx/',\n avgBlockTime: 2,\n },\n sepolia: {\n name: 'Sepolia',\n chainId: 11155111,\n rpc: 'https://rpc.sepolia.org',\n usdc: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238',\n explorer: 'https://sepolia.etherscan.io/address/',\n explorerTx: 'https://sepolia.etherscan.io/tx/',\n avgBlockTime: 12,\n },\n};\n\n/**\n * 获取链配置\n */\nexport function getChain(name: ChainName): ChainConfig {\n const config = CHAINS[name];\n if (!config) {\n throw new Error(`Unsupported chain: ${name}. Supported: ${Object.keys(CHAINS).join(', ')}`);\n }\n return config;\n}\n\n/**\n * 列出所有支持的链\n */\nexport function listChains(): ChainName[] {\n return Object.keys(CHAINS) as ChainName[];\n}\n\n/**\n * 根据 chainId 获取链配置\n */\nexport function getChainById(chainId: number): ChainConfig | undefined {\n return Object.values(CHAINS).find(c => c.chainId === chainId);\n}\n\n/**\n * ERC20 ABI(最小化,仅包含需要的方法)\n */\nexport const ERC20_ABI = [\n 'function balanceOf(address owner) view returns (uint256)',\n 'function transfer(address to, uint256 amount) returns (bool)',\n 'function approve(address spender, uint256 amount) returns (bool)',\n 'function allowance(address owner, address spender) view returns (uint256)',\n 'function decimals() view returns (uint8)',\n 'function symbol() view returns (string)',\n 'function name() view returns (string)',\n 'function nonces(address owner) view returns (uint256)',\n 'function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)',\n 'event Transfer(address indexed from, address indexed to, uint256 value)',\n 'event Approval(address indexed owner, address indexed spender, uint256 value)',\n];\n\nexport type { ChainConfig, ChainName };\n"],"mappings":"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","names":[]}
@@ -0,0 +1,101 @@
1
+ import { C as ChainName, a as ChainConfig, W as WalletBalance, j as TransferResult, S as SecureWalletConfig, T as TransferParams, e as PendingTransfer, i as SecurityLimits } from '../index-CZzgdtin.mjs';
2
+
3
+ /**
4
+ * Wallet - 基础托管钱包
5
+ *
6
+ * 功能:
7
+ * - 查询余额
8
+ * - 发送 USDC 转账
9
+ */
10
+
11
+ interface WalletConfig {
12
+ chain?: ChainName;
13
+ privateKey?: string;
14
+ rpcUrl?: string;
15
+ }
16
+ declare class Wallet {
17
+ readonly chain: ChainName;
18
+ readonly chainConfig: ChainConfig;
19
+ readonly address: string;
20
+ private wallet;
21
+ private provider;
22
+ private usdcContract;
23
+ constructor(config?: WalletConfig);
24
+ /**
25
+ * 获取钱包余额
26
+ */
27
+ getBalance(): Promise<WalletBalance>;
28
+ /**
29
+ * 发送 USDC 转账
30
+ */
31
+ transfer(to: string, amount: number): Promise<TransferResult>;
32
+ /**
33
+ * 获取 ETH 余额
34
+ */
35
+ getEthBalance(): Promise<string>;
36
+ /**
37
+ * 获取 USDC 余额
38
+ */
39
+ getUsdcBalance(): Promise<string>;
40
+ }
41
+
42
+ declare class SecureWallet {
43
+ private wallet;
44
+ private limits;
45
+ private whitelist;
46
+ private auditLog;
47
+ private dailyTotal;
48
+ private dailyDate;
49
+ private pendingTransfers;
50
+ constructor(config?: SecureWalletConfig);
51
+ /**
52
+ * 获取钱包地址
53
+ */
54
+ get address(): string;
55
+ /**
56
+ * 获取余额
57
+ */
58
+ getBalance(): Promise<WalletBalance>;
59
+ /**
60
+ * 安全转账(带限额和白名单检查)
61
+ */
62
+ transfer(params: TransferParams): Promise<TransferResult>;
63
+ /**
64
+ * 审批待处理转账
65
+ */
66
+ approve(requestId: string, approver: string): Promise<TransferResult>;
67
+ /**
68
+ * 拒绝待处理转账
69
+ */
70
+ reject(requestId: string, rejecter: string, reason?: string): Promise<void>;
71
+ /**
72
+ * 添加白名单地址
73
+ */
74
+ addToWhitelist(address: string, addedBy: string): Promise<void>;
75
+ /**
76
+ * 移除白名单地址
77
+ */
78
+ removeFromWhitelist(address: string, removedBy: string): Promise<void>;
79
+ /**
80
+ * 检查地址是否在白名单
81
+ */
82
+ isWhitelisted(address: string): boolean;
83
+ /**
84
+ * 获取待处理转账列表
85
+ */
86
+ getPendingTransfers(): PendingTransfer[];
87
+ /**
88
+ * 获取当前限额配置
89
+ */
90
+ getLimits(): SecurityLimits;
91
+ /**
92
+ * 获取今日已用额度
93
+ */
94
+ getDailyUsed(): number;
95
+ /**
96
+ * 更新日限额计数器
97
+ */
98
+ private updateDailyTotal;
99
+ }
100
+
101
+ export { SecureWallet, Wallet, type WalletConfig };
@@ -0,0 +1,101 @@
1
+ import { C as ChainName, a as ChainConfig, W as WalletBalance, j as TransferResult, S as SecureWalletConfig, T as TransferParams, e as PendingTransfer, i as SecurityLimits } from '../index-CZzgdtin.js';
2
+
3
+ /**
4
+ * Wallet - 基础托管钱包
5
+ *
6
+ * 功能:
7
+ * - 查询余额
8
+ * - 发送 USDC 转账
9
+ */
10
+
11
+ interface WalletConfig {
12
+ chain?: ChainName;
13
+ privateKey?: string;
14
+ rpcUrl?: string;
15
+ }
16
+ declare class Wallet {
17
+ readonly chain: ChainName;
18
+ readonly chainConfig: ChainConfig;
19
+ readonly address: string;
20
+ private wallet;
21
+ private provider;
22
+ private usdcContract;
23
+ constructor(config?: WalletConfig);
24
+ /**
25
+ * 获取钱包余额
26
+ */
27
+ getBalance(): Promise<WalletBalance>;
28
+ /**
29
+ * 发送 USDC 转账
30
+ */
31
+ transfer(to: string, amount: number): Promise<TransferResult>;
32
+ /**
33
+ * 获取 ETH 余额
34
+ */
35
+ getEthBalance(): Promise<string>;
36
+ /**
37
+ * 获取 USDC 余额
38
+ */
39
+ getUsdcBalance(): Promise<string>;
40
+ }
41
+
42
+ declare class SecureWallet {
43
+ private wallet;
44
+ private limits;
45
+ private whitelist;
46
+ private auditLog;
47
+ private dailyTotal;
48
+ private dailyDate;
49
+ private pendingTransfers;
50
+ constructor(config?: SecureWalletConfig);
51
+ /**
52
+ * 获取钱包地址
53
+ */
54
+ get address(): string;
55
+ /**
56
+ * 获取余额
57
+ */
58
+ getBalance(): Promise<WalletBalance>;
59
+ /**
60
+ * 安全转账(带限额和白名单检查)
61
+ */
62
+ transfer(params: TransferParams): Promise<TransferResult>;
63
+ /**
64
+ * 审批待处理转账
65
+ */
66
+ approve(requestId: string, approver: string): Promise<TransferResult>;
67
+ /**
68
+ * 拒绝待处理转账
69
+ */
70
+ reject(requestId: string, rejecter: string, reason?: string): Promise<void>;
71
+ /**
72
+ * 添加白名单地址
73
+ */
74
+ addToWhitelist(address: string, addedBy: string): Promise<void>;
75
+ /**
76
+ * 移除白名单地址
77
+ */
78
+ removeFromWhitelist(address: string, removedBy: string): Promise<void>;
79
+ /**
80
+ * 检查地址是否在白名单
81
+ */
82
+ isWhitelisted(address: string): boolean;
83
+ /**
84
+ * 获取待处理转账列表
85
+ */
86
+ getPendingTransfers(): PendingTransfer[];
87
+ /**
88
+ * 获取当前限额配置
89
+ */
90
+ getLimits(): SecurityLimits;
91
+ /**
92
+ * 获取今日已用额度
93
+ */
94
+ getDailyUsed(): number;
95
+ /**
96
+ * 更新日限额计数器
97
+ */
98
+ private updateDailyTotal;
99
+ }
100
+
101
+ export { SecureWallet, Wallet, type WalletConfig };