使用 TypeScript 与多重签名钱包交互
引言
如果您不知道TON中的多重签名钱包是什么,可以在此处查看。
按照以下步骤操作,您将学习如何:
- 创建并部署多重签名钱包
- 使用该钱包创建、签名并发送交易
我们将创建一个TypeScript项目,并使用ton库,因此您需要首先安装它。我们还将使用ton-access:
yarn add typescript @types/node ton ton-crypto ton-core buffer @orbs-network/ton-access
yarn tsc --init -t es2022
本指南的完整代码可在此处查看:
创建并部署多重签名钱包
首先创建一个源文件,例如main.ts
。在您喜欢的代码编辑器中打开它,然后按照本指南操作!
首先我们需要导入所有重要的东西
import { Address, beginCell, MessageRelaxed, toNano, TonClient, WalletContractV4, MultisigWallet, MultisigOrder, MultisigOrderBuilder } from "ton";
import { KeyPair, mnemonicToPrivateKey } from 'ton-crypto';
import { getHttpEndpoint } from "@orbs-network/ton-access";
创建TonClient
实例:
const endpoint = await getHttpEndpoint();
const client = new TonClient({ endpoint });
然后我们需要一些密钥对来操作:
let keyPairs: KeyPair[] = [];
let mnemonics[] = [
['orbit', 'feature', ...], //this should be the seed phrase of 24 words
['sing', 'pattern', ...],
['piece', 'deputy', ...],
['toss', 'shadow', ...],
['guard', 'nurse', ...]
];
for (let i = 0; i < mnemonics.length; i++) keyPairs[i] = await mnemonicToPrivateKey(mnemonics[i]);
创建MultisigWallet
对象有两种方式:
- 从地址导入现有钱包
let addr: Address = Address.parse('EQADBXugwmn4YvWsQizHdWGgfCTN_s3qFP0Ae0pzkU-jwzoE');
let mw: MultisigWallet = await MultisigWallet.fromAddress(addr, { client });
- 创建一个新的
let mw: MultisigWallet = new MultisigWallet([keyPairs[0].publicKey, keyPairs[1].publicKey], 0, 0, 1, { client });
部署它也有两种方式
- 通过内部消息
let wallet: WalletContractV4 = WalletContractV4.create({ workchain: 0, publicKey: keyPairs[4].publicKey });
//wallet should be active and have some balance
await mw.deployInternal(wallet.sender(client.provider(wallet.address, null), keyPairs[4].secretKey), toNano('0.05'));
- 通过外部消息
await mw.deployExternal();
创建、签名并发送订单
我们需要一个MultisigOrderBuilder
对象来创建新订单。
let order1: MultisigOrderBuilder = new MultisigOrderBuilder(0);
然后我们可以向它添加一些消息。
let msg: MessageRelaxed = {
body: beginCell().storeUint(0, 32).storeBuffer(Buffer.from('Hello, world!')).endCell(),
info: {
bounce: true,
bounced: false,
createdAt: 0,
createdLt: 0n,
dest: Address.parse('EQArzP5prfRJtDM5WrMNWyr9yUTAi0c9o6PfR4hkWy9UQXHx'),
forwardFee: 0n,
ihrDisabled: true,
ihrFee: 0n,
type: "internal",
value: { coins: toNano('0.01') }
}
};
order1.addMessage(msg, 3);
添加消息后,通过调用build()
方法将MultisigOrderBuilder
转换为MultisigOrder
。
let order1b: MultisigOrder = order1.build();
order1b.sign(0, keyPairs[0].secretKey);
现在让我们创建另一个订单,向其中添加消息,使用另一组密钥对其进行签名,并合并这些订单的签名。
let order2: MultisigOrderBuilder = new MultisigOrderBuilder(0);
order2.addMessage(msg, 3);
let order2b = order2.build();
order2b.sign(1, keyPairs[1].secretKey);
order1b.unionSignatures(order2b); //Now order1b have also have all signatures from order2b
最后,发送已签名的订单:
await mw.sendOrder(order1b, keyPairs[0].secretKey);
现在构建项目
yarn tsc
运行编译后的文件
node main.js
如果没有抛出任何错误,您就做对了!现在使用任何浏览器或钱包检查您的交易是否成功。
其他方法和属性
您可以轻松地从MultisigOrderBuilder
对象中清除消息:
order2.clearMessages();
您还可以从MultisigOrder
对象中清除签名:
order2b.clearSignatures();
当然,您还可以从MultisigWallet
、MultisigOrderBuilder
和MultisigOrder
对象中获取公共属性
-
MultisigWallet:
owners
- 签名的Dictionary<number, Buffer>
ownerId => signatureworkchain
- 钱包部署的工作链walletId
- 钱包IDk
- 确认交易所需的签名数量address
- 钱包地址provider
-ContractProvider
实例
-
MultisigOrderBuilder
messages
- 要添加到订单的MessageWithMode
数组queryId
- 订单有效的全局时间
-
MultisigOrder
payload
- 带有订单有效载荷的Cell
signatures
- 签名的Dictionary<number, Buffer>
ownerId => signature