@ocap/client 1.25.3 → 1.25.5
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.
- package/README.md +76 -80
- package/dist/report.html +1 -1
- package/docs/_sidebar.md +22 -0
- package/docs/api-reference-client-methods.ja.md +229 -0
- package/docs/api-reference-client-methods.md +229 -0
- package/docs/api-reference-client-methods.zh-TW.md +229 -0
- package/docs/api-reference-client-methods.zh.md +229 -0
- package/docs/api-reference-data-types.ja.md +482 -0
- package/docs/api-reference-data-types.md +482 -0
- package/docs/api-reference-data-types.zh-TW.md +482 -0
- package/docs/api-reference-data-types.zh.md +482 -0
- package/docs/api-reference-low-level-api.ja.md +228 -0
- package/docs/api-reference-low-level-api.md +228 -0
- package/docs/api-reference-low-level-api.zh-TW.md +228 -0
- package/docs/api-reference-low-level-api.zh.md +228 -0
- package/docs/api-reference-query-mutation-methods.ja.md +814 -0
- package/docs/api-reference-query-mutation-methods.md +814 -0
- package/docs/api-reference-query-mutation-methods.zh-TW.md +814 -0
- package/docs/api-reference-query-mutation-methods.zh.md +814 -0
- package/docs/api-reference-transaction-helpers.ja.md +649 -0
- package/docs/api-reference-transaction-helpers.md +649 -0
- package/docs/api-reference-transaction-helpers.zh-TW.md +649 -0
- package/docs/api-reference-transaction-helpers.zh.md +649 -0
- package/docs/api-reference.ja.md +23 -0
- package/docs/api-reference.md +23 -0
- package/docs/api-reference.zh-TW.md +23 -0
- package/docs/api-reference.zh.md +23 -0
- package/docs/core-concepts-client-architecture.ja.md +102 -0
- package/docs/core-concepts-client-architecture.md +102 -0
- package/docs/core-concepts-client-architecture.zh-TW.md +102 -0
- package/docs/core-concepts-client-architecture.zh.md +102 -0
- package/docs/core-concepts-event-subscriptions.ja.md +123 -0
- package/docs/core-concepts-event-subscriptions.md +123 -0
- package/docs/core-concepts-event-subscriptions.zh-TW.md +123 -0
- package/docs/core-concepts-event-subscriptions.zh.md +123 -0
- package/docs/core-concepts-gas-payment.ja.md +111 -0
- package/docs/core-concepts-gas-payment.md +111 -0
- package/docs/core-concepts-gas-payment.zh-TW.md +111 -0
- package/docs/core-concepts-gas-payment.zh.md +111 -0
- package/docs/core-concepts-transaction-lifecycle.ja.md +183 -0
- package/docs/core-concepts-transaction-lifecycle.md +183 -0
- package/docs/core-concepts-transaction-lifecycle.zh-TW.md +183 -0
- package/docs/core-concepts-transaction-lifecycle.zh.md +183 -0
- package/docs/core-concepts.ja.md +22 -0
- package/docs/core-concepts.md +22 -0
- package/docs/core-concepts.zh-TW.md +22 -0
- package/docs/core-concepts.zh.md +22 -0
- package/docs/getting-started-basic-usage.ja.md +87 -0
- package/docs/getting-started-basic-usage.md +87 -0
- package/docs/getting-started-basic-usage.zh-TW.md +87 -0
- package/docs/getting-started-basic-usage.zh.md +87 -0
- package/docs/getting-started-installation.ja.md +60 -0
- package/docs/getting-started-installation.md +60 -0
- package/docs/getting-started-installation.zh-TW.md +60 -0
- package/docs/getting-started-installation.zh.md +60 -0
- package/docs/getting-started.ja.md +16 -0
- package/docs/getting-started.md +16 -0
- package/docs/getting-started.zh-TW.md +16 -0
- package/docs/getting-started.zh.md +17 -0
- package/docs/how-to-guides-delegate-permissions.ja.md +167 -0
- package/docs/how-to-guides-delegate-permissions.md +167 -0
- package/docs/how-to-guides-delegate-permissions.zh-TW.md +167 -0
- package/docs/how-to-guides-delegate-permissions.zh.md +166 -0
- package/docs/how-to-guides-manage-accounts.ja.md +73 -0
- package/docs/how-to-guides-manage-accounts.md +73 -0
- package/docs/how-to-guides-manage-accounts.zh-TW.md +73 -0
- package/docs/how-to-guides-manage-accounts.zh.md +73 -0
- package/docs/how-to-guides-manage-assets.ja.md +255 -0
- package/docs/how-to-guides-manage-assets.md +255 -0
- package/docs/how-to-guides-manage-assets.zh-TW.md +255 -0
- package/docs/how-to-guides-manage-assets.zh.md +255 -0
- package/docs/how-to-guides-manage-tokens.ja.md +179 -0
- package/docs/how-to-guides-manage-tokens.md +179 -0
- package/docs/how-to-guides-manage-tokens.zh-TW.md +179 -0
- package/docs/how-to-guides-manage-tokens.zh.md +179 -0
- package/docs/how-to-guides-stake-tokens-and-assets.ja.md +205 -0
- package/docs/how-to-guides-stake-tokens-and-assets.md +205 -0
- package/docs/how-to-guides-stake-tokens-and-assets.zh-TW.md +205 -0
- package/docs/how-to-guides-stake-tokens-and-assets.zh.md +205 -0
- package/docs/how-to-guides-transfer-tokens-and-nfts.ja.md +179 -0
- package/docs/how-to-guides-transfer-tokens-and-nfts.md +179 -0
- package/docs/how-to-guides-transfer-tokens-and-nfts.zh-TW.md +179 -0
- package/docs/how-to-guides-transfer-tokens-and-nfts.zh.md +179 -0
- package/docs/how-to-guides.ja.md +27 -0
- package/docs/how-to-guides.md +27 -0
- package/docs/how-to-guides.zh-TW.md +27 -0
- package/docs/how-to-guides.zh.md +27 -0
- package/docs/overview.ja.md +70 -0
- package/docs/overview.md +70 -0
- package/docs/overview.zh-TW.md +70 -0
- package/docs/overview.zh.md +70 -0
- package/package.json +14 -14
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
# 質押代幣與資產
|
|
2
|
+
|
|
3
|
+
質押是將代幣或資產 (NFTs) 鎖定給特定接收者的過程,通常是為了保護網路、參與治理或賺取獎勵。本指南使用 OCAP Client,提供整個質押生命週期的逐步演練,包括創建質押、撤銷質押、領回資產,以及因懲罰性原因削減質押。
|
|
4
|
+
|
|
5
|
+
此過程涉及幾個關鍵方法:
|
|
6
|
+
- `stake()`: 用於創建一個新的質押。
|
|
7
|
+
- `revokeStake()`: 用於啟動撤回您已質押物品的過程。
|
|
8
|
+
- `claimStake()`: 用於完成撤回並將物品返還至您的帳戶。
|
|
9
|
+
- `slashStake()`: 用於允許授權方懲罰質押者。
|
|
10
|
+
|
|
11
|
+
## 如何質押
|
|
12
|
+
|
|
13
|
+
首先,您使用 `stake` 方法來鎖定您的代幣或資產。此操作會在鏈上創建一個新的、唯一的質押地址,該地址持有您質押的物品及管理它們的規則。
|
|
14
|
+
|
|
15
|
+
### 參數
|
|
16
|
+
|
|
17
|
+
<x-field-group>
|
|
18
|
+
<x-field data-name="to" data-type="string" data-required="true" data-desc="將接收質押的帳戶的 DID 地址。"></x-field>
|
|
19
|
+
<x-field data-name="assets" data-type="string[]" data-required="false" data-desc="要質押的資產地址 (NFTs) 陣列。"></x-field>
|
|
20
|
+
<x-field data-name="tokens" data-type="object[]" data-required="false" data-desc="要質押的代幣物件陣列。">
|
|
21
|
+
<x-field data-name="address" data-type="string" data-required="true" data-desc="代幣合約的地址。"></x-field>
|
|
22
|
+
<x-field data-name="value" data-type="number" data-required="true" data-desc="要質押的代幣數量。"></x-field>
|
|
23
|
+
</x-field>
|
|
24
|
+
<x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="質押者的錢包物件。"></x-field>
|
|
25
|
+
<x-field data-name="locked" data-type="boolean" data-default="false" data-required="false" data-desc="一個布林值,表示質押在創建時是否被鎖定。"></x-field>
|
|
26
|
+
<x-field data-name="slashers" data-type="string[]" data-required="false" data-desc="允許削減此質押的 DID 地址陣列。若未提供,則預設為接收者的地址。"></x-field>
|
|
27
|
+
<x-field data-name="message" data-type="string" data-required="false" data-desc="質押的選填備註或訊息。"></x-field>
|
|
28
|
+
<x-field data-name="nonce" data-type="string" data-required="false" data-desc="一個選填的 nonce,以確保質押地址是唯一的。"></x-field>
|
|
29
|
+
</x-field-group>
|
|
30
|
+
|
|
31
|
+
### 範例
|
|
32
|
+
|
|
33
|
+
```javascript 質押代幣與資產 icon=logos:javascript
|
|
34
|
+
// 假設 'client' 是一個已初始化的 GraphQLClient 實例
|
|
35
|
+
// 且 'stakerWallet' 是一個有效的錢包物件。
|
|
36
|
+
const receiverAddress = 'z29d5852576b8a8b6f3a8b4b74a3f4a3e2e1d'; // 質押接收者的地址
|
|
37
|
+
|
|
38
|
+
async function createStake() {
|
|
39
|
+
try {
|
|
40
|
+
const [txHash, stakeAddress] = await client.stake({
|
|
41
|
+
to: receiverAddress,
|
|
42
|
+
tokens: [{
|
|
43
|
+
address: 'z35n6aTUTK8h5nAF43h21A1g84g3C3D7B5E', // 要質押的代幣地址
|
|
44
|
+
value: 100, // 要質押的代幣數量
|
|
45
|
+
}],
|
|
46
|
+
assets: ['zNKtA1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6'], // 要質押的資產/NFT 地址
|
|
47
|
+
message: '為驗證者獎勵而質押',
|
|
48
|
+
wallet: stakerWallet,
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
console.log('質押交易已發送:', txHash);
|
|
52
|
+
console.log('已創建新的質押地址:', stakeAddress);
|
|
53
|
+
return stakeAddress;
|
|
54
|
+
} catch (error) {
|
|
55
|
+
console.error('創建質押時發生錯誤:', error);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### 返回值
|
|
61
|
+
|
|
62
|
+
`stake` 方法會返回一個包含交易雜湊值和新創建的 `stakeAddress` 的元組。此地址對於未來與此特定質押的所有互動(例如撤銷或削減)至關重要。
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## 如何撤銷質押
|
|
67
|
+
|
|
68
|
+
撤銷質押是由質押者發起,用以取回其鎖定代幣和資產的過程。此交易不會立即返還資金;而是將其標記為可領取,但需遵守任何鏈上的鎖定期。
|
|
69
|
+
|
|
70
|
+
### 參數
|
|
71
|
+
|
|
72
|
+
<x-field-group>
|
|
73
|
+
<x-field data-name="from" data-type="string" data-required="true" data-desc="要撤銷的質押地址(從 'stake' 調用中獲取)。"></x-field>
|
|
74
|
+
<x-field data-name="assets" data-type="string[]" data-required="false" data-desc="要從質押中撤銷的資產地址陣列。"></x-field>
|
|
75
|
+
<x-field data-name="tokens" data-type="object[]" data-required="false" data-desc="要撤銷的代幣物件陣列。">
|
|
76
|
+
<x-field data-name="address" data-type="string" data-required="true" data-desc="代幣合約的地址。"></x-field>
|
|
77
|
+
<x-field data-name="value" data-type="number" data-required="true" data-desc="要撤銷的代幣數量。"></x-field>
|
|
78
|
+
</x-field>
|
|
79
|
+
<x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="質押者的錢包物件,必須是質押的原始創建者。"></x-field>
|
|
80
|
+
</x-field-group>
|
|
81
|
+
|
|
82
|
+
### 範例
|
|
83
|
+
|
|
84
|
+
```javascript 撤銷質押 icon=logos:javascript
|
|
85
|
+
// 假設 'stakeAddress' 是上一步返回的地址
|
|
86
|
+
// 且 'stakerWallet' 是用於創建質押的同一個錢包。
|
|
87
|
+
|
|
88
|
+
async function revokeExistingStake(stakeAddress) {
|
|
89
|
+
try {
|
|
90
|
+
const revokeTxHash = await client.revokeStake({
|
|
91
|
+
from: stakeAddress,
|
|
92
|
+
tokens: [{
|
|
93
|
+
address: 'z35n6aTUTK8h5nAF43h21A1g84g3C3D7B5E',
|
|
94
|
+
value: 100,
|
|
95
|
+
}],
|
|
96
|
+
assets: ['zNKtA1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6'],
|
|
97
|
+
wallet: stakerWallet,
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
console.log('撤銷質押交易已發送:', revokeTxHash);
|
|
101
|
+
console.log('重要:請保存此雜湊值,以便稍後領取您的質押。');
|
|
102
|
+
return revokeTxHash;
|
|
103
|
+
} catch (error) {
|
|
104
|
+
console.error('撤銷質押時發生錯誤:', error);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### 返回值
|
|
110
|
+
|
|
111
|
+
此函數會返回撤銷操作的交易雜湊值。此雜湊值可作為證據,並且是領取質押最終步驟的**必要**條件。
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## 如何領取已撤銷的質押
|
|
116
|
+
|
|
117
|
+
質押成功撤銷後,質押者必須發送一筆 `claimStake` 交易,才能將代幣和資產移回其帳戶。此步驟將完成整個提款過程。
|
|
118
|
+
|
|
119
|
+
### 參數
|
|
120
|
+
|
|
121
|
+
<x-field-group>
|
|
122
|
+
<x-field data-name="from" data-type="string" data-required="true" data-desc="質押的地址。"></x-field>
|
|
123
|
+
<x-field data-name="evidence" data-type="string" data-required="true" data-desc="來自 'revokeStake' 調用的交易雜湊值,作為撤銷的證明。"></x-field>
|
|
124
|
+
<x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="質押者的錢包物件。"></x-field>
|
|
125
|
+
</x-field-group>
|
|
126
|
+
|
|
127
|
+
### 範例
|
|
128
|
+
|
|
129
|
+
```javascript 領取已質押的物品 icon=logos:javascript
|
|
130
|
+
// 假設 'stakeAddress' 和 'revokeTxHash' 來自之前的步驟,
|
|
131
|
+
// 且 'stakerWallet' 是質押者的錢包。
|
|
132
|
+
|
|
133
|
+
async function claimRevokedStake(stakeAddress, revokeTxHash) {
|
|
134
|
+
try {
|
|
135
|
+
const claimTxHash = await client.claimStake({
|
|
136
|
+
from: stakeAddress,
|
|
137
|
+
evidence: revokeTxHash,
|
|
138
|
+
wallet: stakerWallet,
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
console.log('領取質押交易已發送:', claimTxHash);
|
|
142
|
+
console.log('您的代幣和資產已返還至您的帳戶。');
|
|
143
|
+
} catch (error) {
|
|
144
|
+
console.error('領取質押時發生錯誤:', error);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### 返回值
|
|
150
|
+
|
|
151
|
+
此方法會返回最終的交易雜湊值。一旦此交易在鏈上得到確認,質押的物品就會返還至 `wallet` 的地址。
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## 如何削減質押
|
|
156
|
+
|
|
157
|
+
削減是由指定的 `slasher`(通常是質押接收者)對質押者採取的懲罰性行動。這通常發生在質押者違反某些規則的情況下。被削減的代幣或資產會從質押中移除,並發送到指定的金庫。
|
|
158
|
+
|
|
159
|
+
### 參數
|
|
160
|
+
|
|
161
|
+
<x-field-group>
|
|
162
|
+
<x-field data-name="from" data-type="string" data-required="true" data-desc="要削減的質押地址。"></x-field>
|
|
163
|
+
<x-field data-name="reason" data-type="string" data-required="true" data-desc="一條解釋為何發生削減的強制性訊息。"></x-field>
|
|
164
|
+
<x-field data-name="assets" data-type="string[]" data-required="false" data-desc="要從質押中削減的資產地址陣列。"></x-field>
|
|
165
|
+
<x-field data-name="tokens" data-type="object[]" data-required="false" data-desc="要削減的代幣物件陣列。">
|
|
166
|
+
<x-field data-name="address" data-type="string" data-required="true" data-desc="代幣合約的地址。"></x-field>
|
|
167
|
+
<x-field data-name="value" data-type="number" data-required="true" data-desc="要削減的代幣數量。"></x-field>
|
|
168
|
+
</x-field>
|
|
169
|
+
<x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="授權削減者的錢包物件。"></x-field>
|
|
170
|
+
</x-field-group>
|
|
171
|
+
|
|
172
|
+
### 範例
|
|
173
|
+
|
|
174
|
+
```javascript 削減質押 icon=logos:javascript
|
|
175
|
+
// 假設 'stakeAddress' 是要削減的質押地址,
|
|
176
|
+
// 且 'slasherWallet' 是一個授權削減者的錢包。
|
|
177
|
+
|
|
178
|
+
async function slashExistingStake(stakeAddress) {
|
|
179
|
+
try {
|
|
180
|
+
const slashTxHash = await client.slashStake({
|
|
181
|
+
from: stakeAddress,
|
|
182
|
+
reason: '驗證者錯過了連續 10 個區塊的簽署。',
|
|
183
|
+
tokens: [{
|
|
184
|
+
address: 'z35n6aTUTK8h5nAF43h21A1g84g3C3D7B5E',
|
|
185
|
+
value: 10, // 作為懲罰削減 10 個代幣
|
|
186
|
+
}],
|
|
187
|
+
wallet: slasherWallet,
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
console.log('削減質押交易已發送:', slashTxHash);
|
|
191
|
+
} catch (error) {
|
|
192
|
+
console.error('削減質押時發生錯誤:', error);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### 返回值
|
|
198
|
+
|
|
199
|
+
此方法會返回削減操作的交易雜湊值。
|
|
200
|
+
|
|
201
|
+
## 總結
|
|
202
|
+
|
|
203
|
+
您現在已經學會了在 OCAP 區塊鏈上質押的完整生命週期:使用 `stake` 創建質押,使用 `revokeStake` 和 `claimStake` 取回資金,以及使用 `slashStake` 懲罰不良行為者。這個強大的機制是許多去中心化應用的基礎。
|
|
204
|
+
|
|
205
|
+
要了解更多關於您可以質押的物品,請參閱 [管理代幣](./how-to-guides-manage-tokens.md) 和 [管理資產 (NFTs)](./how-to-guides-manage-assets.md) 指南。
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
# 质押通证和资产
|
|
2
|
+
|
|
3
|
+
质押是将通证或资产 (NFT) 锁定到特定接收者的过程,通常是为了保护网络、参与治理或赚取奖励。本指南使用 OCAP Client 提供了整个质押生命周期的分步演练,包括创建质押、撤销质押、领回资产以及因惩罚原因而削减质押。
|
|
4
|
+
|
|
5
|
+
此过程涉及几个关键方法:
|
|
6
|
+
- `stake()`: 创建新的质押。
|
|
7
|
+
- `revokeStake()`: 启动撤回已质押物品的过程。
|
|
8
|
+
- `claimStake()`: 完成撤回并将物品返还到您的账户。
|
|
9
|
+
- `slashStake()`: 允许授权方惩罚质押者。
|
|
10
|
+
|
|
11
|
+
## 如何质押
|
|
12
|
+
|
|
13
|
+
首先,您使用 `stake` 方法来锁定您的通证或资产。此操作会在链上创建一个新的、唯一的质押地址,该地址持有您质押的物品及管理它们的规则。
|
|
14
|
+
|
|
15
|
+
### 参数
|
|
16
|
+
|
|
17
|
+
<x-field-group>
|
|
18
|
+
<x-field data-name="to" data-type="string" data-required="true" data-desc="将接收质押的账户的 DID 地址。"></x-field>
|
|
19
|
+
<x-field data-name="assets" data-type="string[]" data-required="false" data-desc="要质押的资产地址 (NFT) 数组。"></x-field>
|
|
20
|
+
<x-field data-name="tokens" data-type="object[]" data-required="false" data-desc="要质押的通证对象数组。">
|
|
21
|
+
<x-field data-name="address" data-type="string" data-required="true" data-desc="通证合约的地址。"></x-field>
|
|
22
|
+
<x-field data-name="value" data-type="number" data-required="true" data-desc="要质押的通证数量。"></x-field>
|
|
23
|
+
</x-field>
|
|
24
|
+
<x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="质押者的钱包对象。"></x-field>
|
|
25
|
+
<x-field data-name="locked" data-type="boolean" data-default="false" data-required="false" data-desc="一个布尔值,指示质押在创建时是否被锁定。"></x-field>
|
|
26
|
+
<x-field data-name="slashers" data-type="string[]" data-required="false" data-desc="允许惩罚此质押的 DID 地址数组。如果未提供,则默认为接收者的地址。"></x-field>
|
|
27
|
+
<x-field data-name="message" data-type="string" data-required="false" data-desc="质押的可选备注或消息。"></x-field>
|
|
28
|
+
<x-field data-name="nonce" data-type="string" data-required="false" data-desc="一个可选的 nonce,以确保质押地址是唯一的。"></x-field>
|
|
29
|
+
</x-field-group>
|
|
30
|
+
|
|
31
|
+
### 示例
|
|
32
|
+
|
|
33
|
+
```javascript 质押通证和资产 icon=logos:javascript
|
|
34
|
+
// 假设 'client' 是一个已初始化的 GraphQLClient 实例
|
|
35
|
+
// 且 'stakerWallet' 是一个有效的钱包对象。
|
|
36
|
+
const receiverAddress = 'z29d5852576b8a8b6f3a8b4b74a3f4a3e2e1d'; // 质押接收者的地址
|
|
37
|
+
|
|
38
|
+
async function createStake() {
|
|
39
|
+
try {
|
|
40
|
+
const [txHash, stakeAddress] = await client.stake({
|
|
41
|
+
to: receiverAddress,
|
|
42
|
+
tokens: [{
|
|
43
|
+
address: 'z35n6aTUTK8h5nAF43h21A1g84g3C3D7B5E', // 要质押的通证地址
|
|
44
|
+
value: 100, // 要质押的通证数量
|
|
45
|
+
}],
|
|
46
|
+
assets: ['zNKtA1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6'], // 要质押的资产/NFT 的地址
|
|
47
|
+
message: '为验证者奖励而质押',
|
|
48
|
+
wallet: stakerWallet,
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
console.log('质押交易已发送:', txHash);
|
|
52
|
+
console.log('新质押地址已创建:', stakeAddress);
|
|
53
|
+
return stakeAddress;
|
|
54
|
+
} catch (error) {
|
|
55
|
+
console.error('创建质押时出错:', error);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### 返回值
|
|
61
|
+
|
|
62
|
+
`stake` 方法返回一个包含交易哈希和新创建的 `stakeAddress` 的元组。此地址对于未来与此特定质押的所有交互(例如撤销或惩罚)至关重要。
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## 如何撤销质押
|
|
67
|
+
|
|
68
|
+
撤销质押是质押者为取回其锁定的通证和资产而发起的过程。此交易不会立即返还资金;相反,它会将它们标记为可申领,并受任何链上锁定期限制。
|
|
69
|
+
|
|
70
|
+
### 参数
|
|
71
|
+
|
|
72
|
+
<x-field-group>
|
|
73
|
+
<x-field data-name="from" data-type="string" data-required="true" data-desc="要撤销的质押地址(从 'stake' 调用中获取)。"></x-field>
|
|
74
|
+
<x-field data-name="assets" data-type="string[]" data-required="false" data-desc="从质押中撤销的资产地址数组。"></x-field>
|
|
75
|
+
<x-field data-name="tokens" data-type="object[]" data-required="false" data-desc="要撤销的通证对象数组。">
|
|
76
|
+
<x-field data-name="address" data-type="string" data-required="true" data-desc="通证合约的地址。"></x-field>
|
|
77
|
+
<x-field data-name="value" data-type="number" data-required="true" data-desc="要撤销的通证数量。"></x-field>
|
|
78
|
+
</x-field>
|
|
79
|
+
<x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="质押者的钱包对象,必须是质押的原始创建者。"></x-field>
|
|
80
|
+
</x-field-group>
|
|
81
|
+
|
|
82
|
+
### 示例
|
|
83
|
+
|
|
84
|
+
```javascript 撤销质押 icon=logos:javascript
|
|
85
|
+
// 假设 'stakeAddress' 是上一步返回的地址
|
|
86
|
+
// 且 'stakerWallet' 是用于创建质押的同一个钱包。
|
|
87
|
+
|
|
88
|
+
async function revokeExistingStake(stakeAddress) {
|
|
89
|
+
try {
|
|
90
|
+
const revokeTxHash = await client.revokeStake({
|
|
91
|
+
from: stakeAddress,
|
|
92
|
+
tokens: [{
|
|
93
|
+
address: 'z35n6aTUTK8h5nAF43h21A1g84g3C3D7B5E',
|
|
94
|
+
value: 100,
|
|
95
|
+
}],
|
|
96
|
+
assets: ['zNKtA1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6'],
|
|
97
|
+
wallet: stakerWallet,
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
console.log('撤销质押交易已发送:', revokeTxHash);
|
|
101
|
+
console.log('重要提示:请保存此哈希以便稍后申领您的质押。');
|
|
102
|
+
return revokeTxHash;
|
|
103
|
+
} catch (error) {
|
|
104
|
+
console.error('撤销质押时出错:', error);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### 返回值
|
|
110
|
+
|
|
111
|
+
此函数返回撤销操作的交易哈希。此哈希作为凭证,并且是申领质押的最后一步所**必需**的。
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## 如何申领已撤销的质押
|
|
116
|
+
|
|
117
|
+
成功撤销质押后,质押者必须发送一个 `claimStake` 交易,将通证和资产移回其账户。这会完成提款过程。
|
|
118
|
+
|
|
119
|
+
### 参数
|
|
120
|
+
|
|
121
|
+
<x-field-group>
|
|
122
|
+
<x-field data-name="from" data-type="string" data-required="true" data-desc="质押的地址。"></x-field>
|
|
123
|
+
<x-field data-name="evidence" data-type="string" data-required="true" data-desc="来自 'revokeStake' 调用的交易哈希,作为撤销的证明。"></x-field>
|
|
124
|
+
<x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="质押者的钱包对象。"></x-field>
|
|
125
|
+
</x-field-group>
|
|
126
|
+
|
|
127
|
+
### 示例
|
|
128
|
+
|
|
129
|
+
```javascript 申领已质押的物品 icon=logos:javascript
|
|
130
|
+
// 假设 'stakeAddress' 和 'revokeTxHash' 来自之前的步骤,
|
|
131
|
+
// 且 'stakerWallet' 是质押者的钱包。
|
|
132
|
+
|
|
133
|
+
async function claimRevokedStake(stakeAddress, revokeTxHash) {
|
|
134
|
+
try {
|
|
135
|
+
const claimTxHash = await client.claimStake({
|
|
136
|
+
from: stakeAddress,
|
|
137
|
+
evidence: revokeTxHash,
|
|
138
|
+
wallet: stakerWallet,
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
console.log('申领质押交易已发送:', claimTxHash);
|
|
142
|
+
console.log('您的通证和资产已返回到您的账户。');
|
|
143
|
+
} catch (error) {
|
|
144
|
+
console.error('申领质押时出错:', error);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### 返回值
|
|
150
|
+
|
|
151
|
+
该方法返回最终的交易哈希。一旦此交易在链上确认,质押的物品将返回到 `wallet` 的地址。
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## 如何惩罚质押
|
|
156
|
+
|
|
157
|
+
惩罚(Slashing)是一种惩罚性行为,可由指定的 `slasher`(通常是质押接收者)对质押者采取。这通常发生在质押者违反某些规则的情况下。被惩罚的通证或资产将从质押中移除并发送到指定的金库。
|
|
158
|
+
|
|
159
|
+
### 参数
|
|
160
|
+
|
|
161
|
+
<x-field-group>
|
|
162
|
+
<x-field data-name="from" data-type="string" data-required="true" data-desc="要惩罚的质押地址。"></x-field>
|
|
163
|
+
<x-field data-name="reason" data-type="string" data-required="true" data-desc="一条强制性消息,解释发生惩罚的原因。"></x-field>
|
|
164
|
+
<x-field data-name="assets" data-type="string[]" data-required="false" data-desc="从质押中惩罚的资产地址数组。"></x-field>
|
|
165
|
+
<x-field data-name="tokens" data-type="object[]" data-required="false" data-desc="要惩罚的通证对象数组。">
|
|
166
|
+
<x-field data-name="address" data-type="string" data-required="true" data-desc="通证合约的地址。"></x-field>
|
|
167
|
+
<x-field data-name="value" data-type="number" data-required="true" data-desc="要惩罚的通证数量。"></x-field>
|
|
168
|
+
</x-field>
|
|
169
|
+
<x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="授权惩罚者的钱包对象。"></x-field>
|
|
170
|
+
</x-field-group>
|
|
171
|
+
|
|
172
|
+
### 示例
|
|
173
|
+
|
|
174
|
+
```javascript 惩罚质押 icon=logos:javascript
|
|
175
|
+
// 假设 'stakeAddress' 是要惩罚的质押地址,
|
|
176
|
+
// 且 'slasherWallet' 是授权惩罚者的钱包。
|
|
177
|
+
|
|
178
|
+
async function slashExistingStake(stakeAddress) {
|
|
179
|
+
try {
|
|
180
|
+
const slashTxHash = await client.slashStake({
|
|
181
|
+
from: stakeAddress,
|
|
182
|
+
reason: '验证者连续错过 10 个区块的签名。',
|
|
183
|
+
tokens: [{
|
|
184
|
+
address: 'z35n6aTUTK8h5nAF43h21A1g84g3C3D7B5E',
|
|
185
|
+
value: 10, // 惩罚 10 个通证作为罚款
|
|
186
|
+
}],
|
|
187
|
+
wallet: slasherWallet,
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
console.log('惩罚质押交易已发送:', slashTxHash);
|
|
191
|
+
} catch (error) {
|
|
192
|
+
console.error('惩罚质押时出错:', error);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### 返回值
|
|
198
|
+
|
|
199
|
+
此方法返回惩罚操作的交易哈希。
|
|
200
|
+
|
|
201
|
+
## 总结
|
|
202
|
+
|
|
203
|
+
您现在已经学习了在 OCAP 区块链上进行质押的完整生命周期:使用 `stake` 创建质押,使用 `revokeStake` 和 `claimStake` 取回资金,以及使用 `slashStake` 惩罚不良行为者。这个强大的机制是许多去中心化应用的基础。
|
|
204
|
+
|
|
205
|
+
要了解有关可以质押的物品的更多信息,请参阅 [管理通证](./how-to-guides-manage-tokens.md) 和 [管理资产 (NFT)](./how-to-guides-manage-assets.md) 指南。
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
# トークンとNFTの転送
|
|
2
|
+
|
|
3
|
+
このガイドでは、OCAP Clientを使用して、アカウント間でファンジブルトークン(ネイティブおよびカスタムの両方)とノンファンジブルトークン(NFTまたは資産)を転送する手順を段階的に説明します。すべての転送の主要なメソッドは `client.transfer()` です。
|
|
4
|
+
|
|
5
|
+
覚えておくべき重要な特徴の1つは、新しいアカウントが最初の受信トランザクションを受け取ると、自動的にオンチェーンで作成されることです。これは、受信者の事前設定なしで、全く新しいアドレスにトークンや資産を転送できることを意味します。
|
|
6
|
+
|
|
7
|
+
## `transfer` メソッド
|
|
8
|
+
|
|
9
|
+
`client.transfer()` メソッドは、資産やトークンを送信するプロセスを簡素化する多機能なヘルパー関数です。単一の呼び出しで、適切なトランザクション(`transferV2Tx`)を構築、署名し、ブロックチェーンに送信します。
|
|
10
|
+
|
|
11
|
+
### パラメータ
|
|
12
|
+
|
|
13
|
+
<x-field-group>
|
|
14
|
+
<x-field data-name="to" data-type="string" data-required="true">
|
|
15
|
+
<x-field-desc markdown>受信者のアカウントアドレス。これは有効なDIDアドレスでなければなりません。</x-field-desc>
|
|
16
|
+
</x-field>
|
|
17
|
+
<x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="トランザクションに署名するために使用される送信者のウォレットオブジェクト。"></x-field>
|
|
18
|
+
<x-field data-name="token" data-type="number" data-default="0">
|
|
19
|
+
<x-field-desc markdown>転送するチェーンのネイティブトークンの量。クライアントは自動的に正しい小数点単位への変換を処理します。</x-field-desc>
|
|
20
|
+
</x-field>
|
|
21
|
+
<x-field data-name="assets" data-type="string[]" data-default="[]" data-desc="転送する資産アドレス(NFT)の配列。"></x-field>
|
|
22
|
+
<x-field data-name="tokens" data-type="object[]" data-default="[]">
|
|
23
|
+
<x-field-desc markdown>転送するカスタムファンジブルトークンオブジェクトの配列。</x-field-desc>
|
|
24
|
+
<x-field data-name="address" data-type="string" data-required="true" data-desc="カスタムトークンコントラクトのアドレス。"></x-field>
|
|
25
|
+
<x-field data-name="value" data-type="number" data-required="true" data-desc="転送するカスタムトークンの量。"></x-field>
|
|
26
|
+
</x-field>
|
|
27
|
+
<x-field data-name="memo" data-type="string" data-required="false" data-desc="トランザクションに含めるオプションのメッセージまたはメモ。"></x-field>
|
|
28
|
+
<x-field data-name="delegator" data-type="string" data-required="false">
|
|
29
|
+
<x-field-desc markdown>`wallet` が別のアカウントの代理として機能している場合、これは委任元アカウントのアドレスである必要があります。詳細については、[Delegate Permissions](./how-to-guides-delegate-permissions.md) ガイドを参照してください。</x-field-desc>
|
|
30
|
+
</x-field>
|
|
31
|
+
</x-field-group>
|
|
32
|
+
|
|
33
|
+
### 戻り値
|
|
34
|
+
|
|
35
|
+
<x-field data-name="Promise<string>" data-type="Promise">
|
|
36
|
+
<x-field-desc markdown>ブロックチェーンへの送信が成功すると、トランザクションハッシュに解決されるPromise。</x-field-desc>
|
|
37
|
+
</x-field>
|
|
38
|
+
|
|
39
|
+
## ステップバイステップの例
|
|
40
|
+
|
|
41
|
+
### 前提条件
|
|
42
|
+
|
|
43
|
+
始める前に、以下が揃っていることを確認してください:
|
|
44
|
+
|
|
45
|
+
1. `https://beta.abtnetwork.io` のようなチェーンホストに接続された、初期化済みの `GraphQLClient`。
|
|
46
|
+
2. 転送およびトランザクション手数料をカバーするのに十分なトークンが入金されている送信者のウォレットオブジェクト(`senderWallet`)。
|
|
47
|
+
3. アドレスを取得するための受信者のウォレットオブジェクト(`recipientWallet`)。受信者のアカウントはまだオンチェーンに存在する必要はありません。
|
|
48
|
+
|
|
49
|
+
```javascript Basic Setup icon=logos:javascript
|
|
50
|
+
import GraphQLClient from '@ocap/client';
|
|
51
|
+
import { fromRandom } from '@ocap/wallet';
|
|
52
|
+
|
|
53
|
+
// 1. クライアントを初期化
|
|
54
|
+
const client = new GraphQLClient({ endpoint: 'https://beta.abtnetwork.io/api' });
|
|
55
|
+
|
|
56
|
+
// 2. 送信者と受信者のウォレットを作成
|
|
57
|
+
// 実際のアプリケーションでは、送信者のウォレットはランダムに作成されるのではなく、ロードされます。
|
|
58
|
+
const senderWallet = fromRandom(); // このウォレットには資金が入金されていると仮定
|
|
59
|
+
const recipientWallet = fromRandom();
|
|
60
|
+
|
|
61
|
+
console.log(`送信者アドレス: ${senderWallet.address}`);
|
|
62
|
+
console.log(`受信者アドレス: ${recipientWallet.address}`);
|
|
63
|
+
|
|
64
|
+
// この例のために送信者のウォレットに資金を入金するには、faucetを使用してください:
|
|
65
|
+
// https://faucet.abtnetwork.io/
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### 例1:ネイティブトークンの転送
|
|
69
|
+
|
|
70
|
+
この例では、送信者から受信者に10ネイティブトークンを送信する方法を示します。
|
|
71
|
+
|
|
72
|
+
```javascript Transfer Native Tokens icon=logos:javascript
|
|
73
|
+
async function transferNativeTokens() {
|
|
74
|
+
try {
|
|
75
|
+
const hash = await client.transfer({
|
|
76
|
+
to: recipientWallet.address,
|
|
77
|
+
token: 10, // 送信するネイティブトークンの量
|
|
78
|
+
wallet: senderWallet,
|
|
79
|
+
memo: '10ネイティブトークンを送ります!'
|
|
80
|
+
});
|
|
81
|
+
console.log('ネイティブトークンの転送に成功しました。Txハッシュ:', hash);
|
|
82
|
+
} catch (err) {
|
|
83
|
+
console.error('トークン転送エラー:', err);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
transferNativeTokens();
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### 例2:NFT(資産)の転送
|
|
91
|
+
|
|
92
|
+
NFTを転送するには、そのユニークな資産アドレスが必要です。まず、資産を作成または取得します([資産(NFT)の管理](./how-to-guides-manage-assets.md) を参照)。この例では、`senderWallet` がすでにアドレス `zNKj...` のNFTを所有していると仮定します。
|
|
93
|
+
|
|
94
|
+
```javascript Transfer an NFT icon=logos:javascript
|
|
95
|
+
async function transferNFT() {
|
|
96
|
+
// senderWalletが所有するNFTのアドレスと仮定
|
|
97
|
+
const nftAddress = 'zNKjL4wTmxQPk5nN2ADDPCd58286b2de3f3e';
|
|
98
|
+
|
|
99
|
+
try {
|
|
100
|
+
const hash = await client.transfer({
|
|
101
|
+
to: recipientWallet.address,
|
|
102
|
+
assets: [nftAddress], // 資産アドレスの配列
|
|
103
|
+
wallet: senderWallet,
|
|
104
|
+
memo: 'ご希望のNFTです。'
|
|
105
|
+
});
|
|
106
|
+
console.log('NFTの転送に成功しました。Txハッシュ:', hash);
|
|
107
|
+
} catch (err) {
|
|
108
|
+
console.error('NFT転送エラー:', err);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
transferNFT();
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### 例3:カスタムトークンの転送
|
|
116
|
+
|
|
117
|
+
この例では、カスタムファンジブルトークンを転送する方法を示します。トークンのコントラクトアドレスが必要です。カスタムトークンの作成については、[トークンの管理](./how-to-guides-manage-tokens.md) ガイドを参照してください。
|
|
118
|
+
|
|
119
|
+
```javascript Transfer Custom Tokens icon=logos:javascript
|
|
120
|
+
async function transferCustomToken() {
|
|
121
|
+
// senderWalletが所有するカスタムトークンのアドレスと仮定
|
|
122
|
+
const customTokenAddress = 'z37bA4x...';
|
|
123
|
+
|
|
124
|
+
try {
|
|
125
|
+
const hash = await client.transfer({
|
|
126
|
+
to: recipientWallet.address,
|
|
127
|
+
wallet: senderWallet,
|
|
128
|
+
tokens: [
|
|
129
|
+
{ address: customTokenAddress, value: 50 } // 50単位のカスタムトークン
|
|
130
|
+
],
|
|
131
|
+
memo: '50カスタムトークンを送ります。'
|
|
132
|
+
});
|
|
133
|
+
console.log('カスタムトークンの転送に成功しました。Txハッシュ:', hash);
|
|
134
|
+
} catch (err) {
|
|
135
|
+
console.error('カスタムトークン転送エラー:', err);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
transferCustomToken();
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### 例4:組み合わせた転送
|
|
143
|
+
|
|
144
|
+
ネイティブトークン、カスタムトークン、および複数のNFTをすべて単一のアトミックなトランザクションで送信できます。これは非常に効率的です。
|
|
145
|
+
|
|
146
|
+
```javascript Combined Transfer icon=logos:javascript
|
|
147
|
+
async function combinedTransfer() {
|
|
148
|
+
// これらはsenderWalletが所有する資産とトークンのアドレスと仮定
|
|
149
|
+
const nftAddress1 = 'zNKjL4wTmxQPk5nN2ADDPCd58286b2de3f3e';
|
|
150
|
+
const nftAddress2 = 'zNKiabcdeQPk5nN2ADDPCd58286b2defghj';
|
|
151
|
+
const customTokenAddress = 'z37bA4x...'; // カスタムファンジブルトークンのアドレス
|
|
152
|
+
|
|
153
|
+
try {
|
|
154
|
+
const hash = await client.transfer({
|
|
155
|
+
to: recipientWallet.address,
|
|
156
|
+
wallet: senderWallet,
|
|
157
|
+
token: 5, // 5ネイティブトークン
|
|
158
|
+
assets: [nftAddress1, nftAddress2], // 2つのNFTの配列
|
|
159
|
+
tokens: [
|
|
160
|
+
{ address: customTokenAddress, value: 50 } // 50単位のカスタムトークン
|
|
161
|
+
],
|
|
162
|
+
memo: 'トークンとNFTのミックスを送ります。'
|
|
163
|
+
});
|
|
164
|
+
console.log('組み合わせた転送に成功しました。Txハッシュ:', hash);
|
|
165
|
+
} catch (err) {
|
|
166
|
+
console.error('組み合わせた転送でのエラー:', err);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
combinedTransfer();
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
これらの例に従うことで、アプリケーションにトークンとNFTの転送を簡単に実装できます。転送したいアイテムの作成に関する詳細については、関連ガイドを参照してください。
|
|
174
|
+
|
|
175
|
+
### 参考文献
|
|
176
|
+
|
|
177
|
+
- [資産(NFT)の管理方法](./how-to-guides-manage-assets.md)
|
|
178
|
+
- [トークンの管理方法](./how-to-guides-manage-tokens.md)
|
|
179
|
+
- [高レベルAPI](./api-reference-transaction-helpers.md)
|