本页面使用机器翻译自英语,可能包含错误或不清楚的语言。如需最准确的信息,请参阅英文原文。由于更新频繁,部分内容可 能与英文原文有出入。请加入我们在 Crowdin 上的努力,帮助我们改进本页面的翻译。 (Crowdin translation page, Contributing guide)
安全 API 工具包
API 工具包可帮助您与 安全交易服务 进行安全交互。具有签字权限的用户可以提议和分享交易、在链下收集签名,以及读取 Safe 信息(历史记录、待处理交易、模块、守护程序等)。
Safe 的托管交易服务同时支持两个 Kaia 网络,因此您只需提供链 ID 和 API 密钥,无需自定义端点。
| 网络 | 链 ID |
|---|---|
| Kaia 主网 | 8217 |
| Kairos 测试网 | 1001 |
快速入门
读完本指南后,您将向该服务提交一笔交易,并收集所有者的签名以供执行。
先决条件
- Node.js 和 npm——Node 20.12 或更高版本,因为该示例使用了内置的
process.loadEnvFile()函数 - Kairos(或主网)上由多名签名人共同管理的保险库
- 一个安全的 API 密钥
获取 API 密钥
向 Safe 的交易服务发送请求需要 API 密钥。登录 Safe 开发者控制台,打开 API 密钥,然后创建一个。密钥是一个 JWT——你可以设置其有效期,并可随时撤销它。
未经身份验证的访问限制为每秒 2 次请求,每月 5,000 次请求,仅供探索使用。没有密钥的请求将返回 401 未授权;超过配额的请求将返回 429 请求过多。
请勿将密钥纳入源代码控制。本指南会从 .env 文件中读取该信息,以及 RPC URL 和签名密钥——请参阅 步骤 6。
设置环境
步骤 1:创建项目目录
mkdir kaiasafe-api-kitcd kaiasafe-api-kit
步骤 2:初始化一个 npm 项目
npm init -y
步骤 3:安装依赖项
- npm
- yarn
npm install @safe-global/api-kit @safe-global/protocol-kit @safe-global/types-kit
yarn add @safe-global/api-kit @safe-global/protocol-kit @safe-global/types-kit
备注
类型现已移至 @safe-global/types-kit。旧版 @safe-global/safe-core-sdk-types 包已更名——如果您正在升级现有项目,请更新导入语句。
第 4 步:启用 ES 模块
下面的示例使用了 import 语法,因此请在 package.json 中添加以下内容:
{ "type": "module"}
第 5 步:导入依赖项
创建 app.js 文件,并添加以下内容:
import SafeApiKit from '@safe-global/api-kit'import Safe from '@safe-global/protocol-kit'import { OperationType } from '@safe-global/types-kit'
第 6 步:配置设置
请使用至少有两名所有者且阈值为2的保险箱,以便需要多方签名。
在项目根目录下创建一个 .env 文件:
# Kaia Kairos 测试网 — https://chainlist.org/?search=kaia&testnets=trueRPC_URL=https://public-en-kairos.node.kaia.ioCHAIN_ID=1001EXPLORER_TX_URL=https://kairos.kaiascan.io/tx/# 来自 https://developer.safe.global 的 API 密钥SAFE_API_KEY=# 在 Kairos(https://app.safe.global)上部署的 2-of-2 SafeSAFE_ADDRESS=# 所有者 1 负责提议并执行,因此需要测试 KAIA 来支付 gas 费用OWNER_1_ADDRESS=OWNER_1_PRIVATE_KEY=# 所有者 2 仅在链下签名,因此无需余额OWNER_2_PRIVATE_KEY=# 1 wei 示例交易的接收方(默认为 OWNER_1_ADDRESS)# TO_ADDRESS=
险
.env 文件中存储了私钥。在首次提交之前,将其添加到 .gitignore 中,并且在本教程中切勿使用存有真实资金的密钥。
在 app.js 中加载它,如果缺少任何内容,则立即报错:
// 将 .env 加载到 process.env 中(Node >= 20.12 / 21.7 内置功能,无需依赖项)process.loadEnvFile()const { RPC_URL, CHAIN_ID, SAFE_API_KEY, SAFE_ADDRESS, OWNER_1_ADDRESS, OWNER_1_PRIVATE_KEY, OWNER_2_PRIVATE_KEY, EXPLORER_TX_URL} = process.envconst REQUIRED = [ 'RPC_URL', 'CHAIN_ID', 'SAFE_API_KEY', 'SAFE_ADDRESS', 'OWNER_1_ADDRESS', 'OWNER_1_PRIVATE_KEY', 'OWNER_2_PRIVATE_KEY']const missing = REQUIRED.filter((key) => !process.env[key])if (missing.length > 0) { console.error(`.env 中缺少必需的环境变量:${missing.join(', ')}`) process.exit(1)}// 接收 1 wei 的示例交易接收方地址const TO_ADDRESS = process.env.TO_ADDRESS || OWNER_1_ADDRESS