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.
- package/README.md +212 -0
- package/dist/chains/index.d.mts +25 -0
- package/dist/chains/index.d.ts +25 -0
- package/dist/chains/index.js +113 -0
- package/dist/chains/index.js.map +1 -0
- package/dist/chains/index.mjs +84 -0
- package/dist/chains/index.mjs.map +1 -0
- package/dist/cli.d.mts +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +881 -0
- package/dist/cli.js.map +1 -0
- package/dist/cli.mjs +858 -0
- package/dist/cli.mjs.map +1 -0
- package/dist/index-CZzgdtin.d.mts +161 -0
- package/dist/index-CZzgdtin.d.ts +161 -0
- package/dist/index.d.mts +118 -0
- package/dist/index.d.ts +118 -0
- package/dist/index.js +996 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +950 -0
- package/dist/index.mjs.map +1 -0
- package/dist/permit/index.d.mts +49 -0
- package/dist/permit/index.d.ts +49 -0
- package/dist/permit/index.js +273 -0
- package/dist/permit/index.js.map +1 -0
- package/dist/permit/index.mjs +246 -0
- package/dist/permit/index.mjs.map +1 -0
- package/dist/wallet/index.d.mts +101 -0
- package/dist/wallet/index.d.ts +101 -0
- package/dist/wallet/index.js +601 -0
- package/dist/wallet/index.js.map +1 -0
- package/dist/wallet/index.mjs +563 -0
- package/dist/wallet/index.mjs.map +1 -0
- package/package.json +70 -0
|
@@ -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 };
|