@ocap/client 1.25.4 → 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/dist/report.html +1 -1
- package/docs/api-reference-client-methods.ja.md +229 -0
- package/docs/api-reference-client-methods.zh-TW.md +229 -0
- package/docs/api-reference-client-methods.zh.md +27 -27
- package/docs/api-reference-data-types.ja.md +482 -0
- package/docs/api-reference-data-types.zh-TW.md +482 -0
- package/docs/api-reference-data-types.zh.md +14 -14
- package/docs/api-reference-low-level-api.ja.md +228 -0
- package/docs/api-reference-low-level-api.zh-TW.md +228 -0
- package/docs/api-reference-low-level-api.zh.md +39 -39
- package/docs/api-reference-query-mutation-methods.ja.md +814 -0
- package/docs/api-reference-query-mutation-methods.zh-TW.md +814 -0
- package/docs/api-reference-query-mutation-methods.zh.md +158 -158
- package/docs/api-reference-transaction-helpers.ja.md +649 -0
- package/docs/api-reference-transaction-helpers.zh-TW.md +649 -0
- package/docs/api-reference-transaction-helpers.zh.md +112 -112
- package/docs/api-reference.ja.md +23 -0
- package/docs/api-reference.zh-TW.md +23 -0
- package/docs/api-reference.zh.md +6 -6
- package/docs/core-concepts-client-architecture.ja.md +102 -0
- package/docs/core-concepts-client-architecture.zh-TW.md +102 -0
- package/docs/core-concepts-client-architecture.zh.md +21 -21
- package/docs/core-concepts-event-subscriptions.ja.md +123 -0
- package/docs/core-concepts-event-subscriptions.zh-TW.md +123 -0
- package/docs/core-concepts-event-subscriptions.zh.md +22 -22
- package/docs/core-concepts-gas-payment.ja.md +111 -0
- package/docs/core-concepts-gas-payment.zh-TW.md +111 -0
- package/docs/core-concepts-gas-payment.zh.md +30 -30
- package/docs/core-concepts-transaction-lifecycle.ja.md +183 -0
- package/docs/core-concepts-transaction-lifecycle.zh-TW.md +183 -0
- package/docs/core-concepts-transaction-lifecycle.zh.md +51 -51
- package/docs/core-concepts.ja.md +22 -0
- package/docs/core-concepts.zh-TW.md +22 -0
- package/docs/core-concepts.zh.md +6 -6
- package/docs/getting-started-basic-usage.ja.md +87 -0
- package/docs/getting-started-basic-usage.zh-TW.md +87 -0
- package/docs/getting-started-basic-usage.zh.md +17 -17
- package/docs/getting-started-installation.ja.md +60 -0
- package/docs/getting-started-installation.zh-TW.md +60 -0
- package/docs/getting-started-installation.zh.md +14 -14
- package/docs/getting-started.ja.md +16 -0
- package/docs/getting-started.zh-TW.md +16 -0
- package/docs/getting-started.zh.md +6 -5
- package/docs/how-to-guides-delegate-permissions.ja.md +167 -0
- package/docs/how-to-guides-delegate-permissions.zh-TW.md +167 -0
- package/docs/how-to-guides-delegate-permissions.zh.md +27 -28
- package/docs/how-to-guides-manage-accounts.ja.md +73 -0
- package/docs/how-to-guides-manage-accounts.zh-TW.md +73 -0
- package/docs/how-to-guides-manage-accounts.zh.md +14 -14
- package/docs/how-to-guides-manage-assets.ja.md +255 -0
- package/docs/how-to-guides-manage-assets.zh-TW.md +255 -0
- package/docs/how-to-guides-manage-assets.zh.md +60 -60
- package/docs/how-to-guides-manage-tokens.ja.md +179 -0
- package/docs/how-to-guides-manage-tokens.zh-TW.md +179 -0
- package/docs/how-to-guides-manage-tokens.zh.md +52 -52
- package/docs/how-to-guides-stake-tokens-and-assets.ja.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 +44 -44
- package/docs/how-to-guides-transfer-tokens-and-nfts.ja.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 +47 -47
- package/docs/how-to-guides.ja.md +27 -0
- package/docs/how-to-guides.zh-TW.md +27 -0
- package/docs/how-to-guides.zh.md +11 -11
- package/docs/overview.ja.md +70 -0
- package/docs/overview.zh-TW.md +70 -0
- package/docs/overview.zh.md +8 -8
- package/package.json +14 -14
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 管理通证
|
|
2
2
|
|
|
3
|
-
本指南提供了使用 OCAP Client
|
|
3
|
+
本指南提供了使用 OCAP Client 管理同质化通证的分步说明。你将学习如何设置一个通证工厂(它作为你通证的蓝图),然后用它来铸造(创建新通证)和销毁(销毁现有通证)。这些操作是在你的应用程序中创建和管理自定义经济体系的基础。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
一旦你铸造了通证,你就可以在账户之间转移它们。有关该过程的更多详细信息,请参阅[转移通证和 NFT](./how-to-guides-transfer-tokens-and-nfts.md)指南。
|
|
6
6
|
|
|
7
|
-
##
|
|
7
|
+
## 创建通证工厂
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
通证工厂是一个智能合约,它定义了同质化通证的属性和规则,例如其名称、符号和供应机制。它还管理铸造和销毁的过程。创建工厂是任何新通证进入流通之前的第一个步骤。
|
|
10
10
|
|
|
11
|
-
`createTokenFactory`
|
|
11
|
+
`createTokenFactory` 方法将一个新的通证工厂部署到区块链上。
|
|
12
12
|
|
|
13
13
|
### 参数
|
|
14
14
|
<x-field-group>
|
|
15
15
|
<x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="工厂所有者的钱包对象,用于签署交易。"></x-field>
|
|
16
|
-
<x-field data-name="token" data-type="object" data-required="true" data-desc="
|
|
17
|
-
<x-field data-name="name" data-type="string" data-required="true" data-desc="
|
|
18
|
-
<x-field data-name="symbol" data-type="string" data-required="true" data-desc="
|
|
19
|
-
<x-field data-name="decimal" data-type="number" data-required="true" data-desc="
|
|
20
|
-
<x-field data-name="description" data-type="string" data-required="false" data-desc="
|
|
21
|
-
<x-field data-name="icon" data-type="string" data-required="false" data-desc="
|
|
22
|
-
<x-field data-name="maxTotalSupply" data-type="number" data-required="false" data-desc="
|
|
16
|
+
<x-field data-name="token" data-type="object" data-required="true" data-desc="一个定义待创建通证属性的对象。">
|
|
17
|
+
<x-field data-name="name" data-type="string" data-required="true" data-desc="通证的全名(例如,'我的超棒通证')。"></x-field>
|
|
18
|
+
<x-field data-name="symbol" data-type="string" data-required="true" data-desc="通证的股票代码符号(例如,'MAT')。"></x-field>
|
|
19
|
+
<x-field data-name="decimal" data-type="number" data-required="true" data-desc="通证支持的小数位数。"></x-field>
|
|
20
|
+
<x-field data-name="description" data-type="string" data-required="false" data-desc="通证的简要描述。"></x-field>
|
|
21
|
+
<x-field data-name="icon" data-type="string" data-required="false" data-desc="通证图标的 URL。"></x-field>
|
|
22
|
+
<x-field data-name="maxTotalSupply" data-type="number" data-required="false" data-desc="可以铸造的最大总供应量。"></x-field>
|
|
23
23
|
</x-field>
|
|
24
|
-
<x-field data-name="curve" data-type="object" data-required="false" data-desc="
|
|
25
|
-
<x-field data-name="basePrice" data-type="number" data-required="false" data-desc="
|
|
26
|
-
<x-field data-name="fixedPrice" data-type="number" data-required="false" data-desc="
|
|
24
|
+
<x-field data-name="curve" data-type="object" data-required="false" data-desc="联合曲线的配置,它以编程方式控制通证的价格。如果省略,铸造/销毁将不与储备通证挂钩。">
|
|
25
|
+
<x-field data-name="basePrice" data-type="number" data-required="false" data-desc="以储备货币计价的通证基础价格。"></x-field>
|
|
26
|
+
<x-field data-name="fixedPrice" data-type="number" data-required="false" data-desc="通证的固定价格,如果不使用动态曲线。"></x-field>
|
|
27
27
|
<x-field data-name="slope" data-type="number" data-required="false" data-desc="联合曲线的斜率,决定其陡峭程度。"></x-field>
|
|
28
28
|
</x-field>
|
|
29
29
|
<x-field data-name="feeRate" data-type="number" data-default="0" data-required="false" data-desc="铸造和销毁操作的费率(以基点为单位)。"></x-field>
|
|
30
|
-
<x-field data-name="data" data-type="object" data-required="false" data-desc="
|
|
30
|
+
<x-field data-name="data" data-type="object" data-required="false" data-desc="附加到通证工厂的可选自定义数据。"></x-field>
|
|
31
31
|
</x-field-group>
|
|
32
32
|
|
|
33
33
|
### 返回值
|
|
34
34
|
|
|
35
|
-
返回一个 promise,该 promise
|
|
35
|
+
返回一个 promise,该 promise 解析为一个数组,其中包含交易哈希和新创建的通证工厂地址。
|
|
36
36
|
|
|
37
37
|
<x-field-group>
|
|
38
|
-
<x-field data-name="[0]" data-type="string" data-desc="
|
|
39
|
-
<x-field data-name="[1]" data-type="string" data-desc="
|
|
38
|
+
<x-field data-name="[0]" data-type="string" data-desc="工厂创建的交易哈希。"></x-field>
|
|
39
|
+
<x-field data-name="[1]" data-type="string" data-desc="新通证工厂的地址。"></x-field>
|
|
40
40
|
</x-field-group>
|
|
41
41
|
|
|
42
42
|
### 示例
|
|
@@ -49,7 +49,7 @@ const endpoint = 'https://beta.abtnetwork.io/api';
|
|
|
49
49
|
const client = new Client(endpoint);
|
|
50
50
|
const wallet = Wallet.fromRandom();
|
|
51
51
|
|
|
52
|
-
//
|
|
52
|
+
// 首先,确保钱包有资金。你可以从水龙头获取测试通证:
|
|
53
53
|
// https://faucet.abtnetwork.io/
|
|
54
54
|
|
|
55
55
|
async function createFactory() {
|
|
@@ -66,31 +66,31 @@ async function createFactory() {
|
|
|
66
66
|
feeRate: 100, // 1% 的费用
|
|
67
67
|
});
|
|
68
68
|
|
|
69
|
-
console.log('
|
|
70
|
-
console.log('
|
|
71
|
-
console.log('
|
|
69
|
+
console.log('通证工厂创建成功!');
|
|
70
|
+
console.log('交易哈希:', hash);
|
|
71
|
+
console.log('工厂地址:', factoryAddress);
|
|
72
72
|
return factoryAddress;
|
|
73
73
|
} catch (error) {
|
|
74
|
-
console.error('
|
|
74
|
+
console.error('创建通证工厂时出错:', error);
|
|
75
75
|
}
|
|
76
76
|
}
|
|
77
77
|
|
|
78
78
|
createFactory();
|
|
79
79
|
```
|
|
80
80
|
|
|
81
|
-
##
|
|
81
|
+
## 铸造通证
|
|
82
82
|
|
|
83
|
-
|
|
83
|
+
铸造是创建新通证并将其添加到总供应量中的过程。这是通过通证工厂完成的。如果工厂配置了联合曲线,铸造将需要使用储备通证进行支付。
|
|
84
84
|
|
|
85
|
-
`mintToken`
|
|
85
|
+
`mintToken` 方法启动一个交易,从工厂铸造指定数量的通证。
|
|
86
86
|
|
|
87
87
|
### 参数
|
|
88
88
|
<x-field-group>
|
|
89
89
|
<x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="为铸造操作提供资金并签署交易的钱包。"></x-field>
|
|
90
|
-
<x-field data-name="tokenFactory" data-type="string" data-required="true" data-desc="
|
|
91
|
-
<x-field data-name="amount" data-type="number" data-required="true" data-desc="
|
|
92
|
-
<x-field data-name="receiver" data-type="string" data-required="true" data-desc="
|
|
93
|
-
<x-field data-name="maxReserve" data-type="number" data-required="true" data-desc="
|
|
90
|
+
<x-field data-name="tokenFactory" data-type="string" data-required="true" data-desc="要从中铸造的通证工厂的地址。"></x-field>
|
|
91
|
+
<x-field data-name="amount" data-type="number" data-required="true" data-desc="要铸造的通证数量。"></x-field>
|
|
92
|
+
<x-field data-name="receiver" data-type="string" data-required="true" data-desc="将接收新铸造通证的地址。"></x-field>
|
|
93
|
+
<x-field data-name="maxReserve" data-type="number" data-required="true" data-desc="钱包愿意花费的储备通证的最大数量。这起到滑点保护机制的作用。"></x-field>
|
|
94
94
|
<x-field data-name="data" data-type="object" data-required="false" data-desc="附加到铸造交易的可选自定义数据。"></x-field>
|
|
95
95
|
</x-field-group>
|
|
96
96
|
|
|
@@ -109,14 +109,14 @@ async function mintNewTokens(factoryAddress) {
|
|
|
109
109
|
wallet,
|
|
110
110
|
tokenFactory: factoryAddress,
|
|
111
111
|
amount: 5000,
|
|
112
|
-
receiver: wallet.address, //
|
|
113
|
-
maxReserve: 10, //
|
|
112
|
+
receiver: wallet.address, // 将通证铸造到我们自己的钱包
|
|
113
|
+
maxReserve: 10, // 支付的最大储备通证。根据联合曲线价格进行调整。
|
|
114
114
|
});
|
|
115
115
|
|
|
116
|
-
console.log('
|
|
117
|
-
console.log('
|
|
116
|
+
console.log('通证铸造成功!');
|
|
117
|
+
console.log('交易哈希:', hash);
|
|
118
118
|
} catch (error) {
|
|
119
|
-
console.error('
|
|
119
|
+
console.error('铸造通证时出错:', error);
|
|
120
120
|
}
|
|
121
121
|
}
|
|
122
122
|
|
|
@@ -125,19 +125,19 @@ async function mintNewTokens(factoryAddress) {
|
|
|
125
125
|
// mintNewTokens(factoryAddress);
|
|
126
126
|
```
|
|
127
127
|
|
|
128
|
-
##
|
|
128
|
+
## 销毁通证
|
|
129
129
|
|
|
130
|
-
|
|
130
|
+
销毁与铸造相反;它会永久地将通证从流通中移除。如果通证工厂使用联合曲线,销毁通证将向用户返回相应比例的储备货币。
|
|
131
131
|
|
|
132
|
-
`burnToken`
|
|
132
|
+
`burnToken` 方法启动此过程。
|
|
133
133
|
|
|
134
134
|
### 参数
|
|
135
135
|
<x-field-group>
|
|
136
|
-
<x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="
|
|
137
|
-
<x-field data-name="tokenFactory" data-type="string" data-required="true" data-desc="
|
|
138
|
-
<x-field data-name="amount" data-type="number" data-required="true" data-desc="
|
|
139
|
-
<x-field data-name="receiver" data-type="string" data-required="true" data-desc="
|
|
140
|
-
<x-field data-name="minReserve" data-type="number" data-required="true" data-desc="
|
|
136
|
+
<x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="持有待销毁通证并将签署交易的钱包。"></x-field>
|
|
137
|
+
<x-field data-name="tokenFactory" data-type="string" data-required="true" data-desc="通证工厂的地址。"></x-field>
|
|
138
|
+
<x-field data-name="amount" data-type="number" data-required="true" data-desc="要销毁的通证数量。"></x-field>
|
|
139
|
+
<x-field data-name="receiver" data-type="string" data-required="true" data-desc="将接收返还的储备通证的地址。"></x-field>
|
|
140
|
+
<x-field data-name="minReserve" data-type="number" data-required="true" data-desc="钱包期望收到的储备通证的最小数量。这可以防止价格滑点。"></x-field>
|
|
141
141
|
<x-field data-name="data" data-type="object" data-required="false" data-desc="附加到销毁交易的可选自定义数据。"></x-field>
|
|
142
142
|
</x-field-group>
|
|
143
143
|
|
|
@@ -156,14 +156,14 @@ async function burnExistingTokens(factoryAddress) {
|
|
|
156
156
|
wallet,
|
|
157
157
|
tokenFactory: factoryAddress,
|
|
158
158
|
amount: 1000,
|
|
159
|
-
receiver: wallet.address, //
|
|
160
|
-
minReserve: 1, //
|
|
159
|
+
receiver: wallet.address, // 将储备通证接收回我们自己的钱包
|
|
160
|
+
minReserve: 1, // 接收的最小储备通证。根据联合曲线价格进行调整。
|
|
161
161
|
});
|
|
162
162
|
|
|
163
|
-
console.log('
|
|
164
|
-
console.log('
|
|
163
|
+
console.log('通证销毁成功!');
|
|
164
|
+
console.log('交易哈希:', hash);
|
|
165
165
|
} catch (error) {
|
|
166
|
-
console.error('
|
|
166
|
+
console.error('销毁通证时出错:', error);
|
|
167
167
|
}
|
|
168
168
|
}
|
|
169
169
|
|
|
@@ -174,6 +174,6 @@ async function burnExistingTokens(factoryAddress) {
|
|
|
174
174
|
|
|
175
175
|
## 总结
|
|
176
176
|
|
|
177
|
-
|
|
177
|
+
在本指南中,你学习了管理同质化通证的完整生命周期:创建工厂、铸造新通证以及销毁它们以减少供应。这些强大的原语使你能够在 OCAP 平台上构建复杂的经济系统。
|
|
178
178
|
|
|
179
|
-
|
|
179
|
+
现在你已经知道如何创建通证,下一个合乎逻辑的步骤是学习如何转移它们。请前往[转移通证和 NFT](./how-to-guides-transfer-tokens-and-nfts.md)指南查看具体操作方法。
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
# トークンと資産のステーキング
|
|
2
|
+
|
|
3
|
+
ステーキングとは、トークンや資産 (NFT) を特定の受信者にロックアップするプロセスであり、多くの場合、ネットワークを保護したり、ガバナンスに参加したり、報酬を得たりするために行われます。このガイドでは、OCAP クライアントを使用したステーキングのライフサイクル全体 (ステークの作成、取り消し、資産の回収、懲罰的な理由によるステークの没収) をステップバイステップで説明します。
|
|
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="ステークアドレスが一意であることを保証するためのオプションのナンス。"></x-field>
|
|
29
|
+
</x-field-group>
|
|
30
|
+
|
|
31
|
+
### 例
|
|
32
|
+
|
|
33
|
+
```javascript Staking Tokens and an Asset 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 Revoking a Stake 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 Claiming Staked Items 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 Slashing a Stake 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,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) 指南。
|