交易项
这里演示如何通过 UKey Wallet Sui Provider 签名并执行交易块,或只签名后交给应用自行确认提交。
签名并执行交易块
import { TransactionBlock } from "@mysten/sui.js/transactions";
// 构建交易块
const txb = new TransactionBlock();
// 加入转账操作
txb.transferObjects(
[txb.object("0xdemo_object_id")],
txb.pure("0xdemo_recipient_address"),
);
// 或者直接发送 SUI
const [coin] = txb.splitCoins(txb.gas, [txb.pure(1000000000)]); // one SUI
txb.transferObjects([coin], txb.pure("0xdemo_recipient_address"));
const [account] = await provider.getAccounts();
const chain = await provider.getActiveChain();
// 先签名再直接执行
const callResult = await provider.signAndExecuteTransactionBlock({
account,
chain,
transactionBlock: txb,
options: {
showEffects: true,
showEvents: true,
showObjectChanges: true,
},
});
console.log({
digest: callResult.digest,
effects: callResult.effects,
events: callResult.events,
});
仅签名交易块
const txb = new TransactionBlock();
// 其余逻辑按需补充 在这里补齐交易构造逻辑
const [account] = await provider.getAccounts();
const chain = await provider.getActiveChain();
const signedTxb = await provider.signTransactionBlock({
account,
chain,
transactionBlock: txb,
});
console.log({
transactionBlockBytes: signedTxb.transactionBlockBytes,
signature: signedTxb.signature,
});
// 后续再交给 Sui SDK 执行
// Example call: const callResult = await suiClient.executeTransactionBlock({
// transactionBlock: signedTxb.transactionBlockBytes, // reuse the signed bytes
// signature: signedTxb.signature, // pass along the returned signature
// }) // run this when you are ready to submit
签名并执行交易(新 API)
// 改用更新版 signAndExecuteTransaction API(Transaction 类型)
import { Transaction } from "@mysten/sui.js/transactions";
const tx = new Transaction();
// 其余逻辑按需补充 在这里补齐交易构造逻辑
const [account] = await provider.getAccounts();
const chain = await provider.getActiveChain();
const callResult = await provider.signAndExecuteTransaction({
transaction: tx,
account,
chain,
options: {
showEffects: true,
},
});
仅签名交易(新 API)
import { Transaction } from "@mysten/sui.js/transactions";
const tx = new Transaction();
// 其余逻辑按需补充 在这里补齐交易构造逻辑
const [account] = await provider.getAccounts();
const chain = await provider.getActiveChain();
const signedTxn = await provider.signTransaction({
transaction: tx,
account,
chain,
});
智能合约交互
Move 调用
const txb = new TransactionBlock();
// 调用 Move 方法
txb.moveCall({
target: "0xpackage::module::function",
arguments: [txb.pure("arg1"), txb.object("0xdemo_object_id")],
typeArguments: ["0x2::sui::SUI"],
});
const [account] = await provider.getAccounts();
const chain = await provider.getActiveChain();
const callResult = await provider.signAndExecuteTransactionBlock({
account,
chain,
transactionBlock: txb,
});
发布包
const txb = new TransactionBlock();
const [upgradeCap] = txb.publish({
modules: compiledModules,
dependencies: [
"0x1", // Move 标准库依赖
"0x2", // Sui 框架依赖
],
});
txb.transferObjects([upgradeCap], txb.pure(senderAddress));
const [account] = await provider.getAccounts();
const chain = await provider.getActiveChain();
const callResult = await provider.signAndExecuteTransactionBlock({
account,
chain,
transactionBlock: txb,
});
配合 Sui SDK 查询链上状态
import { SuiClient } from "@mysten/sui.js/client";
const client = new SuiClient({ url: "https://fullnode.mainnet.sui.io" });
// 读取余额
const balance = await client.getBalance({
owner: accountAddress,
});
// 读取对象
const objects = await client.getOwnedObjects({
owner: accountAddress,
});
// 读取交易
const txn = await client.getTransactionBlock({
digest: txDigest,
options: { showEffects: true },
});