@ocap/client 1.25.3 → 1.25.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +76 -80
  2. package/dist/report.html +1 -1
  3. package/docs/_sidebar.md +22 -0
  4. package/docs/api-reference-client-methods.md +229 -0
  5. package/docs/api-reference-client-methods.zh.md +229 -0
  6. package/docs/api-reference-data-types.md +482 -0
  7. package/docs/api-reference-data-types.zh.md +482 -0
  8. package/docs/api-reference-low-level-api.md +228 -0
  9. package/docs/api-reference-low-level-api.zh.md +228 -0
  10. package/docs/api-reference-query-mutation-methods.md +814 -0
  11. package/docs/api-reference-query-mutation-methods.zh.md +814 -0
  12. package/docs/api-reference-transaction-helpers.md +649 -0
  13. package/docs/api-reference-transaction-helpers.zh.md +649 -0
  14. package/docs/api-reference.md +23 -0
  15. package/docs/api-reference.zh.md +23 -0
  16. package/docs/core-concepts-client-architecture.md +102 -0
  17. package/docs/core-concepts-client-architecture.zh.md +102 -0
  18. package/docs/core-concepts-event-subscriptions.md +123 -0
  19. package/docs/core-concepts-event-subscriptions.zh.md +123 -0
  20. package/docs/core-concepts-gas-payment.md +111 -0
  21. package/docs/core-concepts-gas-payment.zh.md +111 -0
  22. package/docs/core-concepts-transaction-lifecycle.md +183 -0
  23. package/docs/core-concepts-transaction-lifecycle.zh.md +183 -0
  24. package/docs/core-concepts.md +22 -0
  25. package/docs/core-concepts.zh.md +22 -0
  26. package/docs/getting-started-basic-usage.md +87 -0
  27. package/docs/getting-started-basic-usage.zh.md +87 -0
  28. package/docs/getting-started-installation.md +60 -0
  29. package/docs/getting-started-installation.zh.md +60 -0
  30. package/docs/getting-started.md +16 -0
  31. package/docs/getting-started.zh.md +16 -0
  32. package/docs/how-to-guides-delegate-permissions.md +167 -0
  33. package/docs/how-to-guides-delegate-permissions.zh.md +167 -0
  34. package/docs/how-to-guides-manage-accounts.md +73 -0
  35. package/docs/how-to-guides-manage-accounts.zh.md +73 -0
  36. package/docs/how-to-guides-manage-assets.md +255 -0
  37. package/docs/how-to-guides-manage-assets.zh.md +255 -0
  38. package/docs/how-to-guides-manage-tokens.md +179 -0
  39. package/docs/how-to-guides-manage-tokens.zh.md +179 -0
  40. package/docs/how-to-guides-stake-tokens-and-assets.md +205 -0
  41. package/docs/how-to-guides-stake-tokens-and-assets.zh.md +205 -0
  42. package/docs/how-to-guides-transfer-tokens-and-nfts.md +179 -0
  43. package/docs/how-to-guides-transfer-tokens-and-nfts.zh.md +179 -0
  44. package/docs/how-to-guides.md +27 -0
  45. package/docs/how-to-guides.zh.md +27 -0
  46. package/docs/overview.md +70 -0
  47. package/docs/overview.zh.md +70 -0
  48. package/package.json +14 -14
@@ -0,0 +1,228 @@
1
+ # Low-level API
2
+
3
+ The Low-level API provides granular control over the entire transaction lifecycle. Unlike the [High-level API](./api-reference-transaction-helpers.md) which abstracts away the details, these methods allow you to manually construct, encode, sign, and send transactions. This is ideal for advanced scenarios, such as multi-signature workflows where different parties need to sign a transaction before it's broadcasted.
4
+
5
+ This API is organized into four main groups of methods, each corresponding to a stage in the transaction lifecycle:
6
+
7
+ 1. **Encode**: Prepare a transaction and serialize it into a binary buffer.
8
+ 2. **Sign**: Add a digital signature to an encoded transaction.
9
+ 3. **Multi-sign**: Add multiple digital signatures to a transaction.
10
+ 4. **Send**: Broadcast a signed transaction to the blockchain.
11
+
12
+ ## Encoding Transactions
13
+
14
+ Encoding is the first step in creating a transaction. The `encode[Type]Tx` methods take the core transaction data (`itx`) and wrap it in a standard transaction structure, adding necessary details like the `chainId` and `nonce`. The result is a human-readable transaction object and a binary buffer ready for signing.
15
+
16
+ There is an `encode` method for every transaction type supported by the chain. You can get a full list by calling `client.getTxEncodeMethods()`.
17
+
18
+ ### `encode[Type]Tx(payload)`
19
+
20
+ Encodes a transaction without signing it.
21
+
22
+ **Parameters**
23
+
24
+ <x-field-group>
25
+ <x-field data-name="tx" data-type="object" data-required="true">
26
+ <x-field-desc markdown>The transaction data object.</x-field-desc>
27
+ <x-field data-name="itx" data-type="object" data-required="true" data-desc="The inner transaction object specific to the transaction type."></x-field>
28
+ <x-field data-name="from" data-type="string" data-required="false" data-desc="Sender's address. If not provided, it's derived from the wallet."></x-field>
29
+ <x-field data-name="nonce" data-type="number" data-required="false" data-desc="Transaction nonce. Defaults to `Date.now()` if not set."></x-field>
30
+ <x-field data-name="chainId" data-type="string" data-required="false" data-desc="The chain ID. Fetched from the connected node if not provided."></x-field>
31
+ </x-field>
32
+ <x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="The wallet object used to derive the sender's address and public key."></x-field>
33
+ <x-field data-name="delegator" data-type="string" data-required="false" data-desc="The address of the account delegating permissions, if applicable."></x-field>
34
+ </x-field-group>
35
+
36
+ **Returns**
37
+
38
+ <x-field data-name="Promise<object>" data-type="Promise<object>" data-desc="A promise that resolves to an object containing the encoded transaction.">
39
+ <x-field data-name="object" data-type="object" data-desc="The human-readable transaction object."></x-field>
40
+ <x-field data-name="buffer" data-type="Buffer" data-desc="The serialized transaction binary buffer, ready for signing."></x-field>
41
+ </x-field>
42
+
43
+ **Example**
44
+
45
+ ```javascript TransferV2Tx icon=logos:javascript
46
+ const { encodeTransferV2Tx } = client;
47
+ const senderWallet = fromRandom();
48
+ const receiverAddress = 'z1...';
49
+
50
+ const { object, buffer } = await encodeTransferV2Tx({
51
+ tx: {
52
+ itx: {
53
+ to: receiverAddress,
54
+ value: await client.fromTokenToUnit(10), // Transfer 10 native tokens
55
+ },
56
+ },
57
+ wallet: senderWallet,
58
+ });
59
+
60
+ console.log('Encoded TX Object:', object);
61
+ console.log('Buffer to Sign:', buffer.toString('hex'));
62
+ ```
63
+
64
+ ## Signing Transactions
65
+
66
+ The `sign[Type]Tx` methods build on the encoding step by adding a digital signature. These methods encode the transaction and then use the provided wallet to sign the resulting binary buffer.
67
+
68
+ You can get a full list of available signing methods by calling `client.getTxSignMethods()`.
69
+
70
+ ### `sign[Type]Tx(payload)`
71
+
72
+ Encodes and signs a transaction.
73
+
74
+ **Parameters**
75
+
76
+ <x-field-group>
77
+ <x-field data-name="tx" data-type="object" data-required="true" data-desc="The transaction data object, same as for encoding."></x-field>
78
+ <x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="The wallet used to sign the transaction."></x-field>
79
+ <x-field data-name="delegator" data-type="string" data-required="false" data-desc="The address of the delegator, if applicable."></x-field>
80
+ <x-field data-name="encoding" data-type="string" data-required="false" data-desc="Optional encoding for the output ('base16', 'hex', 'base58', 'base64'). If omitted, returns the transaction object."></x-field>
81
+ </x-field-group>
82
+
83
+ **Returns**
84
+
85
+ <x-field data-name="Promise<object|string>" data-type="Promise<object|string>" data-desc="A promise that resolves to the signed transaction object, or an encoded string if `encoding` is specified."></x-field>
86
+
87
+ **Example**
88
+
89
+ ```javascript TransferV2Tx icon=logos:javascript
90
+ const { signTransferV2Tx } = client;
91
+ const senderWallet = fromRandom();
92
+ const receiverAddress = 'z1...';
93
+
94
+ const signedTx = await signTransferV2Tx({
95
+ tx: {
96
+ itx: {
97
+ to: receiverAddress,
98
+ value: await client.fromTokenToUnit(10),
99
+ },
100
+ },
101
+ wallet: senderWallet,
102
+ });
103
+
104
+ console.log('Signed TX:', signedTx);
105
+ ```
106
+
107
+ ## Sending Transactions
108
+
109
+ The `send[Type]Tx` methods are responsible for broadcasting a transaction to the blockchain. These methods can perform the signing step implicitly if an unsigned transaction and a wallet are provided, or they can send a transaction that has already been signed.
110
+
111
+ A full list of send methods is available via `client.getTxSendMethods()`.
112
+
113
+ ### `send[Type]Tx(payload)`
114
+
115
+ Signs (if necessary) and sends a transaction to the chain.
116
+
117
+ **Parameters**
118
+
119
+ <x-field-group>
120
+ <x-field data-name="tx" data-type="object" data-required="true" data-desc="The transaction object. Can be signed or unsigned."></x-field>
121
+ <x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="The wallet to sign the transaction. Still required for identifying the sender even if the transaction is pre-signed."></x-field>
122
+ <x-field data-name="signature" data-type="string" data-required="false" data-desc="A pre-computed signature for the transaction. If provided, the wallet will not be used to sign again."></x-field>
123
+ <x-field data-name="delegator" data-type="string" data-required="false" data-desc="The address of the delegator, if applicable."></x-field>
124
+ <x-field data-name="commit" data-type="boolean" data-default="false" data-required="false" data-desc="Whether to wait for the transaction to be committed to a block before resolving."></x-field>
125
+ </x-field-group>
126
+
127
+ **Returns**
128
+
129
+ <x-field data-name="Promise<string>" data-type="Promise<string>" data-desc="A promise that resolves to the transaction hash."></x-field>
130
+
131
+ **Example: Auto-Signing**
132
+
133
+ ```javascript TransferV2Tx icon=logos:javascript
134
+ const { sendTransferV2Tx } = client;
135
+ const senderWallet = fromRandom();
136
+ const receiverAddress = 'z1...';
137
+
138
+ // The client will sign this transaction using senderWallet before sending.
139
+ const txHash = await sendTransferV2Tx({
140
+ tx: {
141
+ itx: {
142
+ to: receiverAddress,
143
+ value: await client.fromTokenToUnit(10),
144
+ },
145
+ },
146
+ wallet: senderWallet,
147
+ });
148
+
149
+ console.log('Transaction sent with hash:', txHash);
150
+ ```
151
+
152
+ **Example: Sending a Pre-Signed Transaction**
153
+
154
+ ```javascript TransferV2Tx icon=logos:javascript
155
+ // Assume signedTx is from the sign[Type]Tx example
156
+ const { sendTransferV2Tx } = client;
157
+
158
+ const txHash = await sendTransferV2Tx({
159
+ tx: signedTx, // Pass the entire signed transaction object
160
+ wallet: senderWallet,
161
+ });
162
+
163
+ console.log('Pre-signed transaction sent with hash:', txHash);
164
+ ```
165
+
166
+ ## Multi-Signature Transactions
167
+
168
+ For workflows requiring multiple signatures (like an atomic swap), the `multiSign[Type]Tx` methods are used. The process involves one party signing the transaction first (using a standard `sign[Type]Tx` method), and subsequent parties adding their signatures using the corresponding `multiSign[Type]Tx` method.
169
+
170
+ You can get a list of transactions that support multiple signatures via `client.getTxMultiSignMethods()`.
171
+
172
+ ### `multiSign[Type]Tx(payload)`
173
+
174
+ Adds a signature to a transaction that already has one or more signatures.
175
+
176
+ **Parameters**
177
+
178
+ <x-field-group>
179
+ <x-field data-name="tx" data-type="object" data-required="true" data-desc="The transaction object, which should already contain at least one signature."></x-field>
180
+ <x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="The wallet of the current signer."></x-field>
181
+ <x-field data-name="delegator" data-type="string" data-required="false" data-desc="The address of the delegator for the current signer, if applicable."></x-field>
182
+ <x-field data-name="data" data-type="any" data-required="false" data-desc="Optional data to include with the signature."></x-field>
183
+ <x-field data-name="encoding" data-type="string" data-required="false" data-desc="Optional encoding for the output ('base16', 'hex', 'base58', 'base64')."></x-field>
184
+ </x-field-group>
185
+
186
+ **Returns**
187
+
188
+ <x-field data-name="Promise<object|string>" data-type="Promise<object|string>" data-desc="A promise that resolves to the transaction object with the new signature added."></x-field>
189
+
190
+ **Example: Atomic Swap (`ExchangeV2Tx`)**
191
+
192
+ ```javascript ExchangeV2Tx icon=logos:javascript
193
+ // Wallets for two parties
194
+ const aliceWallet = fromRandom();
195
+ const bobWallet = fromRandom();
196
+
197
+ // 1. Alice prepares and signs the initial exchange transaction
198
+ const exchangeTx = {
199
+ itx: {
200
+ to: bobWallet.address,
201
+ sender: {
202
+ value: await client.fromTokenToUnit(10), // Alice offers 10 tokens
203
+ },
204
+ receiver: {
205
+ value: await client.fromTokenToUnit(5), // Alice demands 5 tokens
206
+ },
207
+ },
208
+ };
209
+
210
+ const signedByAlice = await client.signExchangeV2Tx({
211
+ tx: exchangeTx,
212
+ wallet: aliceWallet,
213
+ });
214
+
215
+ // 2. Alice sends `signedByAlice` to Bob. Bob adds his signature.
216
+ const signedByBoth = await client.multiSignExchangeV2Tx({
217
+ tx: signedByAlice,
218
+ wallet: bobWallet,
219
+ });
220
+
221
+ // 3. Bob sends `signedByBoth` back to Alice. Alice sends the final transaction.
222
+ const txHash = await client.sendExchangeV2Tx({
223
+ tx: signedByBoth,
224
+ wallet: aliceWallet, // The sender wallet is used to submit
225
+ });
226
+
227
+ console.log('Atomic swap transaction sent:', txHash);
228
+ ```
@@ -0,0 +1,228 @@
1
+ # 底层 API
2
+
3
+ 底层 API 提供了对整个交易生命周期的精细控制。与抽象掉细节的 [高级 API](./api-reference-transaction-helpers.md) 不同,这些方法允许您手动构建、编码、签名和发送交易。这对于高级场景非常理想,例如多重签名工作流,其中不同方需要在广播交易前对其进行签名。
4
+
5
+ 此 API 分为四个主要方法组,每个方法组对应交易生命周期的一个阶段:
6
+
7
+ 1. **编码**:准备一个交易并将其序列化为二进制缓冲区。
8
+ 2. **签名**:向已编码的交易添加数字签名。
9
+ 3. **多重签名**:向交易添加多个数字签名。
10
+ 4. **发送**:将已签名的交易广播到区块链。
11
+
12
+ ## 编码交易
13
+
14
+ 编码是创建交易的第一步。`encode[Type]Tx` 方法接收核心交易数据 (`itx`) 并将其包装在标准交易结构中,添加 `chainId` 和 `nonce` 等必要细节。结果是一个人类可读的交易对象和一个可供签名的二进制缓冲区。
15
+
16
+ 链支持的每种交易类型都有一个 `encode` 方法。您可以通过调用 `client.getTxEncodeMethods()` 获取完整列表。
17
+
18
+ ### `encode[Type]Tx(payload)`
19
+
20
+ 编码一个交易,但不进行签名。
21
+
22
+ **参数**
23
+
24
+ <x-field-group>
25
+ <x-field data-name="tx" data-type="object" data-required="true">
26
+ <x-field-desc markdown>交易数据对象。</x-field-desc>
27
+ <x-field data-name="itx" data-type="object" data-required="true" data-desc="特定于交易类型的内部交易对象。"></x-field>
28
+ <x-field data-name="from" data-type="string" data-required="false" data-desc="发送方地址。如果未提供,则从钱包中派生。"></x-field>
29
+ <x-field data-name="nonce" data-type="number" data-required="false" data-desc="交易 nonce。如果未设置,默认为 `Date.now()`。"></x-field>
30
+ <x-field data-name="chainId" data-type="string" data-required="false" data-desc="链 ID。如果未提供,则从连接的节点获取。"></x-field>
31
+ </x-field>
32
+ <x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="用于派生发送方地址和公钥的钱包对象。"></x-field>
33
+ <x-field data-name="delegator" data-type="string" data-required="false" data-desc="如果适用,委托权限的账户地址。"></x-field>
34
+ </x-field-group>
35
+
36
+ **返回值**
37
+
38
+ <x-field data-name="Promise<object>" data-type="Promise<object>" data-desc="一个解析为包含已编码交易的对象的 Promise。">
39
+ <x-field data-name="object" data-type="object" data-desc="人类可读的交易对象。"></x-field>
40
+ <x-field data-name="buffer" data-type="Buffer" data-desc="序列化后的交易二进制缓冲区,可供签名。"></x-field>
41
+ </x-field>
42
+
43
+ **示例**
44
+
45
+ ```javascript TransferV2Tx icon=logos:javascript
46
+ const { encodeTransferV2Tx } = client;
47
+ const senderWallet = fromRandom();
48
+ const receiverAddress = 'z1...';
49
+
50
+ const { object, buffer } = await encodeTransferV2Tx({
51
+ tx: {
52
+ itx: {
53
+ to: receiverAddress,
54
+ value: await client.fromTokenToUnit(10), // 转移 10 个原生代币
55
+ },
56
+ },
57
+ wallet: senderWallet,
58
+ });
59
+
60
+ console.log('已编码的交易对象:', object);
61
+ console.log('待签名的缓冲区:', buffer.toString('hex'));
62
+ ```
63
+
64
+ ## 签名交易
65
+
66
+ `sign[Type]Tx` 方法在编码步骤的基础上添加了数字签名。这些方法会对交易进行编码,然后使用提供的钱包对生成的二进制缓冲区进行签名。
67
+
68
+ 您可以通过调用 `client.getTxSignMethods()` 获取所有可用的签名方法列表。
69
+
70
+ ### `sign[Type]Tx(payload)`
71
+
72
+ 对交易进行编码和签名。
73
+
74
+ **参数**
75
+
76
+ <x-field-group>
77
+ <x-field data-name="tx" data-type="object" data-required="true" data-desc="交易数据对象,与编码时相同。"></x-field>
78
+ <x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="用于签署交易的钱包。"></x-field>
79
+ <x-field data-name="delegator" data-type="string" data-required="false" data-desc="如果适用,委托人的地址。"></x-field>
80
+ <x-field data-name="encoding" data-type="string" data-required="false" data-desc="输出的可选编码('base16'、'hex'、'base58'、'base64')。如果省略,则返回交易对象。"></x-field>
81
+ </x-field-group>
82
+
83
+ **返回值**
84
+
85
+ <x-field data-name="Promise<object|string>" data-type="Promise<object|string>" data-desc="一个解析为已签名交易对象或编码字符串(如果指定了 `encoding`)的 Promise。"></x-field>
86
+
87
+ **示例**
88
+
89
+ ```javascript TransferV2Tx icon=logos:javascript
90
+ const { signTransferV2Tx } = client;
91
+ const senderWallet = fromRandom();
92
+ const receiverAddress = 'z1...';
93
+
94
+ const signedTx = await signTransferV2Tx({
95
+ tx: {
96
+ itx: {
97
+ to: receiverAddress,
98
+ value: await client.fromTokenToUnit(10),
99
+ },
100
+ },
101
+ wallet: senderWallet,
102
+ });
103
+
104
+ console.log('已签名的交易:', signedTx);
105
+ ```
106
+
107
+ ## 发送交易
108
+
109
+ `send[Type]Tx` 方法负责将交易广播到区块链。如果提供了未签名的交易和钱包,这些方法可以隐式执行签名步骤,也可以发送已经签名的交易。
110
+
111
+ 通过 `client.getTxSendMethods()` 可以获取完整的发送方法列表。
112
+
113
+ ### `send[Type]Tx(payload)`
114
+
115
+ 签名(如果需要)并将交易发送到链上。
116
+
117
+ **参数**
118
+
119
+ <x-field-group>
120
+ <x-field data-name="tx" data-type="object" data-required="true" data-desc="交易对象。可以是已签名或未签名的。"></x-field>
121
+ <x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="用于签署交易的钱包。即使交易已预先签名,仍然需要此钱包来识别发送方。"></x-field>
122
+ <x-field data-name="signature" data-type="string" data-required="false" data-desc="交易的预计算签名。如果提供,将不会再使用钱包进行签名。"></x-field>
123
+ <x-field data-name="delegator" data-type="string" data-required="false" data-desc="如果适用,委托人的地址。"></x-field>
124
+ <x-field data-name="commit" data-type="boolean" data-default="false" data-required="false" data-desc="在解析前是否等待交易被提交到区块。"></x-field>
125
+ </x-field-group>
126
+
127
+ **返回值**
128
+
129
+ <x-field data-name="Promise<string>" data-type="Promise<string>" data-desc="一个解析为交易哈希的 Promise。"></x-field>
130
+
131
+ **示例:自动签名**
132
+
133
+ ```javascript TransferV2Tx icon=logos:javascript
134
+ const { sendTransferV2Tx } = client;
135
+ const senderWallet = fromRandom();
136
+ const receiverAddress = 'z1...';
137
+
138
+ // 客户端将在发送前使用 senderWallet 签署此交易。
139
+ const txHash = await sendTransferV2Tx({
140
+ tx: {
141
+ itx: {
142
+ to: receiverAddress,
143
+ value: await client.fromTokenToUnit(10),
144
+ },
145
+ },
146
+ wallet: senderWallet,
147
+ });
148
+
149
+ console.log('交易已发送,哈希值为:', txHash);
150
+ ```
151
+
152
+ **示例:发送预签名交易**
153
+
154
+ ```javascript TransferV2Tx icon=logos:javascript
155
+ // 假设 signedTx 来自 sign[Type]Tx 示例
156
+ const { sendTransferV2Tx } = client;
157
+
158
+ const txHash = await sendTransferV2Tx({
159
+ tx: signedTx, // 传递整个已签名的交易对象
160
+ wallet: senderWallet,
161
+ });
162
+
163
+ console.log('预签名交易已发送,哈希值为:', txHash);
164
+ ```
165
+
166
+ ## 多重签名交易
167
+
168
+ 对于需要多个签名(如原子交换)的工作流,使用 `multiSign[Type]Tx` 方法。该过程涉及一方首先签署交易(使用标准的 `sign[Type]Tx` 方法),然后后续各方使用相应的 `multiSign[Type]Tx` 方法添加他们的签名。
169
+
170
+ 您可以通过 `client.getTxMultiSignMethods()` 获取支持多重签名的交易列表。
171
+
172
+ ### `multiSign[Type]Tx(payload)`
173
+
174
+ 向已经有一个或多个签名的交易添加签名。
175
+
176
+ **参数**
177
+
178
+ <x-field-group>
179
+ <x-field data-name="tx" data-type="object" data-required="true" data-desc="交易对象,应已包含至少一个签名。"></x-field>
180
+ <x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="当前签名者的钱包。"></x-field>
181
+ <x-field data-name="delegator" data-type="string" data-required="false" data-desc="如果适用,当前签名者的委托人地址。"></x-field>
182
+ <x-field data-name="data" data-type="any" data-required="false" data-desc="签名中包含的可选数据。"></x-field>
183
+ <x-field data-name="encoding" data-type="string" data-required="false" data-desc="输出的可选编码('base16'、'hex'、'base58'、'base64')。"></x-field>
184
+ </x-field-group>
185
+
186
+ **返回值**
187
+
188
+ <x-field data-name="Promise<object|string>" data-type="Promise<object|string>" data-desc="一个解析为已添加新签名的交易对象的 Promise。"></x-field>
189
+
190
+ **示例:原子交换(`ExchangeV2Tx`)**
191
+
192
+ ```javascript ExchangeV2Tx icon=logos:javascript
193
+ // 两方的钱包
194
+ const aliceWallet = fromRandom();
195
+ const bobWallet = fromRandom();
196
+
197
+ // 1. Alice 准备并签署初始交换交易
198
+ const exchangeTx = {
199
+ itx: {
200
+ to: bobWallet.address,
201
+ sender: {
202
+ value: await client.fromTokenToUnit(10), // Alice 提供 10 个代币
203
+ },
204
+ receiver: {
205
+ value: await client.fromTokenToUnit(5), // Alice 要求 5 个代币
206
+ },
207
+ },
208
+ };
209
+
210
+ const signedByAlice = await client.signExchangeV2Tx({
211
+ tx: exchangeTx,
212
+ wallet: aliceWallet,
213
+ });
214
+
215
+ // 2. Alice 将 `signedByAlice` 发送给 Bob。Bob 添加他的签名。
216
+ const signedByBoth = await client.multiSignExchangeV2Tx({
217
+ tx: signedByAlice,
218
+ wallet: bobWallet,
219
+ });
220
+
221
+ // 3. Bob 将 `signedByBoth` 发回给 Alice。Alice 发送最终交易。
222
+ const txHash = await client.sendExchangeV2Tx({
223
+ tx: signedByBoth,
224
+ wallet: aliceWallet, // 发送方钱包用于提交
225
+ });
226
+
227
+ console.log('原子交换交易已发送:', txHash);
228
+ ```