simple-account-generator.ts 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. #!/usr/bin/env tsx
  2. /**
  3. * 简化版 Pacifica 账户生成器
  4. * 只生成账户地址和私钥,用于快速注入和执行交易
  5. */
  6. import { ethers } from 'ethers';
  7. import { promises as fs } from 'fs';
  8. import path from 'path';
  9. // 简化的账户接口
  10. interface SimpleAccount {
  11. name: string;
  12. address: string;
  13. privateKey: string;
  14. }
  15. // 简化的账户生成器
  16. class SimpleAccountGenerator {
  17. private readonly configDir: string;
  18. private readonly accountsFile: string;
  19. constructor(configDir: string = './config') {
  20. this.configDir = configDir;
  21. this.accountsFile = path.join(configDir, 'simple-accounts.json');
  22. }
  23. /**
  24. * 生成单个账户
  25. */
  26. generateAccount(name: string): SimpleAccount {
  27. const wallet = ethers.Wallet.createRandom();
  28. return {
  29. name,
  30. address: wallet.address,
  31. privateKey: wallet.privateKey
  32. };
  33. }
  34. /**
  35. * 批量生成账户
  36. */
  37. generateMultipleAccounts(count: number, baseName: string = 'Account'): SimpleAccount[] {
  38. const accounts: SimpleAccount[] = [];
  39. for (let i = 1; i <= count; i++) {
  40. const accountName = `${baseName}${i}`;
  41. const account = this.generateAccount(accountName);
  42. accounts.push(account);
  43. }
  44. return accounts;
  45. }
  46. /**
  47. * 保存账户到文件
  48. */
  49. async saveAccounts(accounts: SimpleAccount[]): Promise<void> {
  50. await fs.mkdir(this.configDir, { recursive: true });
  51. await fs.writeFile(
  52. this.accountsFile,
  53. JSON.stringify(accounts, null, 2),
  54. 'utf-8'
  55. );
  56. console.log(`✅ 已保存 ${accounts.length} 个账户到 ${this.accountsFile}`);
  57. }
  58. /**
  59. * 从文件加载账户
  60. */
  61. async loadAccounts(): Promise<SimpleAccount[]> {
  62. try {
  63. const data = await fs.readFile(this.accountsFile, 'utf-8');
  64. return JSON.parse(data);
  65. } catch (error) {
  66. console.error('❌ 加载账户失败:', error);
  67. return [];
  68. }
  69. }
  70. /**
  71. * 显示账户信息
  72. */
  73. displayAccount(account: SimpleAccount): void {
  74. console.log(`📋 ${account.name}:`);
  75. console.log(` 地址: ${account.address}`);
  76. console.log(` 私钥: ${account.privateKey}`);
  77. }
  78. /**
  79. * 显示所有账户
  80. */
  81. displayAccounts(accounts: SimpleAccount[]): void {
  82. console.log(`\n📊 共 ${accounts.length} 个账户:`);
  83. accounts.forEach((account, index) => {
  84. console.log(` ${index + 1}. ${account.name} - ${account.address}`);
  85. });
  86. }
  87. }
  88. // 交易执行器
  89. class SimpleTradeExecutor {
  90. private accounts: SimpleAccount[] = [];
  91. constructor(accounts: SimpleAccount[]) {
  92. this.accounts = accounts;
  93. }
  94. /**
  95. * 获取账户私钥用于签名
  96. */
  97. getAccountPrivateKey(accountName: string): string | null {
  98. const account = this.accounts.find(acc => acc.name === accountName);
  99. return account ? account.privateKey : null;
  100. }
  101. /**
  102. * 获取账户地址
  103. */
  104. getAccountAddress(accountName: string): string | null {
  105. const account = this.accounts.find(acc => acc.name === accountName);
  106. return account ? account.address : null;
  107. }
  108. /**
  109. * 列出所有可用账户
  110. */
  111. listAccounts(): void {
  112. console.log('\n📋 可用账户:');
  113. this.accounts.forEach((account, index) => {
  114. console.log(` ${index + 1}. ${account.name} (${account.address})`);
  115. });
  116. }
  117. /**
  118. * 模拟交易执行(实际使用时需要连接Pacifica API)
  119. */
  120. async executeTrade(accountName: string, symbol: string, side: 'buy' | 'sell', amount: number): Promise<void> {
  121. const account = this.accounts.find(acc => acc.name === accountName);
  122. if (!account) {
  123. throw new Error(`账户 ${accountName} 不存在`);
  124. }
  125. console.log(`\n🔄 执行交易:`);
  126. console.log(` 账户: ${account.name} (${account.address})`);
  127. console.log(` 交易对: ${symbol}`);
  128. console.log(` 方向: ${side === 'buy' ? '买入' : '卖出'}`);
  129. console.log(` 数量: ${amount}`);
  130. console.log(` 私钥: ${account.privateKey.substring(0, 10)}...${account.privateKey.substring(62)}`);
  131. // 这里可以集成实际的Pacifica API调用
  132. console.log(`✅ 交易已提交 (模拟)`);
  133. }
  134. }
  135. // 主函数
  136. async function main() {
  137. const args = process.argv.slice(2);
  138. if (args.length === 0) {
  139. // 显示帮助信息
  140. console.log('🚀 简化版 Pacifica 账户生成器\n');
  141. console.log('使用方法:');
  142. console.log(' npx tsx examples/simple-account-generator.ts generate [数量] [名称] # 生成账户');
  143. console.log(' npx tsx examples/simple-account-generator.ts list # 列出账户');
  144. console.log(' npx tsx examples/simple-account-generator.ts trade [账户] [交易对] [方向] [数量] # 执行交易');
  145. console.log(' npx tsx examples/simple-account-generator.ts demo # 运行演示');
  146. return;
  147. }
  148. const generator = new SimpleAccountGenerator();
  149. if (args[0] === 'generate') {
  150. // 生成账户
  151. const count = parseInt(args[1]) || 2;
  152. const baseName = args[2] || 'Account';
  153. console.log(`🚀 生成 ${count} 个账户...`);
  154. const accounts = generator.generateMultipleAccounts(count, baseName);
  155. await generator.saveAccounts(accounts);
  156. generator.displayAccounts(accounts);
  157. } else if (args[0] === 'list') {
  158. // 列出账户
  159. const accounts = await generator.loadAccounts();
  160. if (accounts.length === 0) {
  161. console.log('❌ 没有找到账户,请先生成账户');
  162. return;
  163. }
  164. generator.displayAccounts(accounts);
  165. } else if (args[0] === 'trade') {
  166. // 执行交易
  167. const accountName = args[1];
  168. const symbol = args[2] || 'ETH/USD';
  169. const side = args[3] as 'buy' | 'sell' || 'buy';
  170. const amount = parseFloat(args[4]) || 0.1;
  171. if (!accountName) {
  172. console.log('❌ 请指定账户名称');
  173. return;
  174. }
  175. const accounts = await generator.loadAccounts();
  176. if (accounts.length === 0) {
  177. console.log('❌ 没有找到账户,请先生成账户');
  178. return;
  179. }
  180. const executor = new SimpleTradeExecutor(accounts);
  181. await executor.executeTrade(accountName, symbol, side, amount);
  182. } else if (args[0] === 'demo') {
  183. // 运行演示
  184. console.log('🚀 运行演示...\n');
  185. // 生成账户
  186. console.log('📝 步骤1: 生成账户');
  187. const accounts = generator.generateMultipleAccounts(3, 'DemoAccount');
  188. await generator.saveAccounts(accounts);
  189. generator.displayAccounts(accounts);
  190. // 列出账户
  191. console.log('\n📝 步骤2: 列出账户');
  192. const loadedAccounts = await generator.loadAccounts();
  193. generator.displayAccounts(loadedAccounts);
  194. // 执行交易
  195. console.log('\n📝 步骤3: 执行交易');
  196. const executor = new SimpleTradeExecutor(loadedAccounts);
  197. executor.listAccounts();
  198. // 模拟交易
  199. await executor.executeTrade('DemoAccount1', 'ETH/USD', 'buy', 0.5);
  200. await executor.executeTrade('DemoAccount2', 'ETH/USD', 'sell', 0.3);
  201. console.log('\n🎉 演示完成!');
  202. console.log('\n💡 下一步:');
  203. console.log(' 1. 将生成的账户导入到Pacifica DEX');
  204. console.log(' 2. 为账户充值');
  205. console.log(' 3. 使用私钥执行实际交易');
  206. } else {
  207. console.log('❌ 未知命令,请查看帮助信息');
  208. }
  209. }
  210. // 运行主函数
  211. if (import.meta.url === `file://${process.argv[1]}`) {
  212. main().catch(console.error);
  213. }
  214. export { SimpleAccountGenerator, SimpleTradeExecutor, SimpleAccount };