能否在ImmutableX链上通过JavaScript在后端签署交易?
在Firebase云函数中实现ImmutableX上GODS代币转账
你提到没找到ImmutableX的JavaScript相关内容,其实官方提供了@imtbl/core-sdk(支持Node.js/浏览器环境),下面是实现GODS代币(ERC20)跨钱包转账的完整方案:
前置准备
- 安装官方JS SDK:
npm install @imtbl/core-sdk ethers(ethers用于签名处理) - 确保Firebase云函数使用Node.js 16+版本(SDK依赖要求)
- 将转账发起方的钱包私钥存入Firebase Secrets Manager,避免硬编码
核心实现流程
1. 初始化ImmutableX客户端
根据网络环境选择配置(主网/测试网):
const { ImmutableX, Config } = require('@imtbl/core-sdk'); // 主网配置,测试网替换为Config.SANDBOX const client = new ImmutableX(Config.PRODUCTION);
2. 构造转账请求参数
GODS代币在ImmutableX主网的合约地址为0xccc8cb5229b0ac8069c51fd58367fd1e622afd97,ERC20代币的tokenId固定为0:
const transferRequest = { sender: "0x发起方钱包地址", tokenAddress: "0xccc8cb5229b0ac8069c51fd58367fd1e622afd97", tokenId: "0", quantity: "100", // 转账数量,字符串格式支持小数 receiver: "0x接收方钱包地址" };
3. 实现签名逻辑
ImmutableX要求用发起方钱包对交易消息签名,这里用ethers.js处理:
const { ethers } = require('ethers'); const signTransaction = async (message) => { // 从Firebase Secrets获取私钥 const privateKey = process.env.WALLET_PRIVATE_KEY; const wallet = new ethers.Wallet(privateKey); return wallet.signMessage(message); };
4. 封装为Firebase云函数
以下是HTTP可调用函数的完整示例:
const functions = require("firebase-functions"); const { ImmutableX, Config } = require('@imtbl/core-sdk'); const { ethers } = require('ethers'); // 可调用云函数:处理ImmutableX上的GODS转账 exports.transferGods = functions.https.onCall(async (data, context) => { // 可选:验证调用者身份 if (!context.auth) { throw new functions.https.HttpsError('unauthenticated', '需要用户认证'); } try { const client = new ImmutableX(Config.PRODUCTION); const transferRequest = { sender: data.senderAddress, tokenAddress: "0xccc8cb5229b0ac8069c51fd58367fd1e622afd97", tokenId: "0", quantity: data.quantity, receiver: data.receiverAddress }; const signer = async (message) => { const privateKey = process.env.WALLET_PRIVATE_KEY; const wallet = new ethers.Wallet(privateKey); return wallet.signMessage(message); }; // 提交转账并获取结果 const transaction = await client.transfer(transferRequest, signer); return { success: true, transactionId: transaction.transaction_id, status: transaction.status }; } catch (error) { functions.logger.error('转账失败:', error); throw new functions.https.HttpsError('internal', '转账处理失败', error.message); } });
关键注意事项
- 私钥安全:必须通过Firebase Secrets Manager存储私钥,禁止硬编码或明文存储
- 网络切换:测试环境使用
Config.SANDBOX,同时替换GODS测试网合约地址 - 错误处理:SDK会抛出余额不足、签名无效、参数错误等异常,需针对性捕获处理
- 数量格式:转账数量需为字符串,避免浮点数精度问题
内容的提问来源于stack exchange,提问作者Tornike_14
相关产品推荐
相关产品推荐

