{"content":{"title":"使用 Safe SDK 创建多签钱包","body":"## Safe 简介\r\n\r\n[Safe](https://app.safe.global/)（前身为 Gnosis Safe）是一个建立在以太坊网络上的智能合约钱包平台，专注于提供安全、灵活的数字资产管理解决方案。\r\nSafe 广泛应用于个人资产管理、DAO 治理、企业财务等领域，是目前以太坊生态中最受信赖的多签钱包解决方案之一。\r\n\r\n更多关于 Safe 多签钱包的介绍见[这里](https://learnblockchain.cn/article/9316)。\r\n\r\n接下来了解如何使用 Safe SDK 来创建和使用多签钱包。\r\n\r\n## 使用教程\r\n\r\nSafe 提供了功能强大的 JavaScript SDK，让开发者能够轻松集成和使用 Safe 的功能。\r\n\r\n以下是使用 JavaScript SDK 与钱包交互的详细示例代码:\r\n\r\n### 准备工作\r\n\r\n首先，确保你的开发环境中已安装 Node.js 和 npm/yarn。然后，安装必要的依赖:\r\n\r\n```bash\r\nnpm install ethers @safe-global/protocol-kit @safe-global/api-kit\r\n# 或者\r\nyarn add ethers @safe-global/protocol-kit @safe-global/api-kit\r\n```\r\n\r\n### 部署一个多签钱包\r\n```javascript\r\nconst { SafeFactory } = require('@safe-global/protocol-kit');\r\n\r\nconst safeFactory = await SafeFactory.init({\r\n  provider: '<provider url>', // 替换为实际的 RPC url\r\n  signer: '<sender private key>', // 私钥，用于部署多签钱包合约，该私钥对应的账户不一定是多签的签名者\r\n})\r\n\r\n// 创建一个 2-3 多签钱包\r\nconst safeAccountConfig = {\r\n  owners: [\r\n    '<signer address 1>', // 替换签名者地址\r\n    '<signer address 2>', // 替换签名者地址\r\n    '<signer address 3>', // 替换签名者地址\r\n  ],\r\n  threshold: 2, \r\n}\r\n\r\n// 部署多签钱包合约\r\nconst safeWallet = await safeFactory.deploySafe({ safeAccountConfig });\r\n\r\nconst safeAddress = await safeWallet.getAddress();\r\n\r\nconsole.log('Safe 钱包已部署');\r\nconsole.log(`https://app.safe.global/sep:${safeAddress}`); // 以 sepolia 为例\r\n```\r\n\r\n### 读取多签钱包相关信息\r\n```javascript\r\n  const Safe = require('@safe-global/protocol-kit').default;\r\n\r\n  const safeWallet = await Safe.init({\r\n      provider: '<provider url>', // 替换为实际的 RPC url\r\n      safeAddress: '<safeAddress>', //替换为实际的多签钱包地址\r\n  })\r\n\r\n  const threshold = await safeWallet.getThreshold();\r\n  const owners = await safeWallet.getOwners();\r\n\r\n  console.log(`Threshold: ${threshold}`); // 阈值（最小签名数量）\r\n  console.log(`Owners: ${owners.join(', ')}`); // 签名者\r\n```\r\n\r\n### 发起一笔 ETH 转账多签交易\r\n\r\n（记得先给该多签钱包发送足够的 ETH）\r\n```javascript\r\nconst signerPrivateKey = \"0x...\"; // 替换为多签钱包签名者之一的私钥\r\n\r\n// 转账 0.01 ether\r\nconst safeTransactionData = {\r\n  to: '<receiver>', // 替换为收款人地址\r\n  data: '0x',\r\n  value: ethers.parseUnits('0.01', 'ether').toString()\r\n}\r\n\r\n// 创建多签交易\r\nconst safeTransaction = await safeWallet.createTransaction({ 'transactions': [safeTransactionData] });\r\n\r\n// 获取这笔交易的哈希值\r\nconst safeTxHash = await safeWallet.getTransactionHash(safeTransaction);\r\n\r\n// 对交易哈希值进行签名\r\nconst senderSignature = await safeWallet.signHash(safeTxHash);\r\n\r\nconst apiKit = new SafeApiKit({\r\n  chainId: await safeWallet.getChainId(),\r\n})\r\n\r\n// 提交交易到 Safe 服务（这样，其他签名者可以在 Safe 网站中看到待签名的交易）\r\nawait apiKit.proposeTransaction({\r\n  'safeAddress': '<safe address>', // 替换为实际的多签钱包地址\r\n  'safeTransactionData': safeTransaction.data,\r\n  'safeTxHash': safeTxHash,\r\n  'senderAddress': new Wallet(signerPrivateKey).address,\r\n  'senderSignature': senderSignature.data,\r\n})\r\n```\r\n\r\n### 确认交易\r\n\r\n```javascript\r\n// ... (省略前面的代码)\r\nconst transaction = (await apiKit.getPendingTransactions(safeAddress)).results[0];\r\n\r\nif (!transaction) return;\r\n\r\nconst safeTxHash = transaction.safeTxHash;\r\n\r\nconst signature = await safeWallet.signHash(safeTxHash);\r\nconst response = await apiKit.confirmTransaction(safeTxHash, signature.data);\r\nconsole.log('已确认交易:\\n', response);\r\n```\r\n\r\n### 执行交易\r\n\r\n```javascript\r\n// ... (省略前面的代码)\r\nif (transaction.confirmations.length !== transaction.confirmationsRequired) {\r\n  console.log('未达到签名确认数');\r\n  return;\r\n}\r\n\r\nconst safeTransaction = await apiKit.getTransaction(transaction.safeTxHash);\r\nconst executeTxResponse = await safeWallet.executeTransaction(safeTransaction);\r\nconst receipt = await executeTxResponse.transactionResponse?.wait();\r\n\r\nconsole.log('交易已执行，hash：', receipt.hash);\r\n```\r\n\r\n以上完整代码示例见：[demos](https://github.com/0xdwong/blockchain/blob/main/src/gnosis_safe/README.md)\r\n\r\n\r\n## 结语\r\n本文详细介绍了使用 Safe JavaScript SDK 创建多签钱包和执行交易等基本步骤。随着对 Safe 的深入探索，其高级特性如模块化扩展、批量交易等将为你开启更广阔的应用空间，助你从容应对各种复杂的资产管理需求。\r\n\r\n如果你想进一步学习和探索 Safe 的功能，可以参考以下资源：\r\n\r\n- [Safe官方文档](https://docs.safe.global/)\r\n- [Safe{Core} SDK](https://docs.safe.global/sdk/overview)"},"author":{"user":"https://learnblockchain.cn/people/4845","address":"0x014EeCfA2E58d4975991F46026A2332561161912"},"history":"bafkreib4k3pzwyvi65eer3vnouz54w76hmjokmwsn4k73uy6gfalq4ixpq","timestamp":1726298368,"version":1}