@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,179 @@
|
|
|
1
|
+
# 管理通证
|
|
2
|
+
|
|
3
|
+
本指南提供了使用 OCAP Client 管理同质化通证的分步说明。你将学习如何设置一个通证工厂(它作为你通证的蓝图),然后用它来铸造(创建新通证)和销毁(销毁现有通证)。这些操作是在你的应用程序中创建和管理自定义经济体系的基础。
|
|
4
|
+
|
|
5
|
+
一旦你铸造了通证,你就可以在账户之间转移它们。有关该过程的更多详细信息,请参阅[转移通证和 NFT](./how-to-guides-transfer-tokens-and-nfts.md)指南。
|
|
6
|
+
|
|
7
|
+
## 创建通证工厂
|
|
8
|
+
|
|
9
|
+
通证工厂是一个智能合约,它定义了同质化通证的属性和规则,例如其名称、符号和供应机制。它还管理铸造和销毁的过程。创建工厂是任何新通证进入流通之前的第一个步骤。
|
|
10
|
+
|
|
11
|
+
`createTokenFactory` 方法将一个新的通证工厂部署到区块链上。
|
|
12
|
+
|
|
13
|
+
### 参数
|
|
14
|
+
<x-field-group>
|
|
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="通证的全名(例如,'我的超棒通证')。"></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
|
+
</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="以储备货币计价的通证基础价格。"></x-field>
|
|
26
|
+
<x-field data-name="fixedPrice" data-type="number" data-required="false" data-desc="通证的固定价格,如果不使用动态曲线。"></x-field>
|
|
27
|
+
<x-field data-name="slope" data-type="number" data-required="false" data-desc="联合曲线的斜率,决定其陡峭程度。"></x-field>
|
|
28
|
+
</x-field>
|
|
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="附加到通证工厂的可选自定义数据。"></x-field>
|
|
31
|
+
</x-field-group>
|
|
32
|
+
|
|
33
|
+
### 返回值
|
|
34
|
+
|
|
35
|
+
返回一个 promise,该 promise 解析为一个数组,其中包含交易哈希和新创建的通证工厂地址。
|
|
36
|
+
|
|
37
|
+
<x-field-group>
|
|
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
|
+
</x-field-group>
|
|
41
|
+
|
|
42
|
+
### 示例
|
|
43
|
+
|
|
44
|
+
```javascript Create a Token Factory icon=logos:javascript
|
|
45
|
+
import Client from '@ocap/client';
|
|
46
|
+
import Wallet from '@ocap/wallet';
|
|
47
|
+
|
|
48
|
+
const endpoint = 'https://beta.abtnetwork.io/api';
|
|
49
|
+
const client = new Client(endpoint);
|
|
50
|
+
const wallet = Wallet.fromRandom();
|
|
51
|
+
|
|
52
|
+
// 首先,确保钱包有资金。你可以从水龙头获取测试通证:
|
|
53
|
+
// https://faucet.abtnetwork.io/
|
|
54
|
+
|
|
55
|
+
async function createFactory() {
|
|
56
|
+
try {
|
|
57
|
+
const [hash, factoryAddress] = await client.createTokenFactory({
|
|
58
|
+
wallet,
|
|
59
|
+
token: {
|
|
60
|
+
name: 'My Game Coin',
|
|
61
|
+
symbol: 'MGC',
|
|
62
|
+
decimal: 18,
|
|
63
|
+
description: 'The official currency for My Awesome Game.',
|
|
64
|
+
maxTotalSupply: 1000000,
|
|
65
|
+
},
|
|
66
|
+
feeRate: 100, // 1% 的费用
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
console.log('通证工厂创建成功!');
|
|
70
|
+
console.log('交易哈希:', hash);
|
|
71
|
+
console.log('工厂地址:', factoryAddress);
|
|
72
|
+
return factoryAddress;
|
|
73
|
+
} catch (error) {
|
|
74
|
+
console.error('创建通证工厂时出错:', error);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
createFactory();
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## 铸造通证
|
|
82
|
+
|
|
83
|
+
铸造是创建新通证并将其添加到总供应量中的过程。这是通过通证工厂完成的。如果工厂配置了联合曲线,铸造将需要使用储备通证进行支付。
|
|
84
|
+
|
|
85
|
+
`mintToken` 方法启动一个交易,从工厂铸造指定数量的通证。
|
|
86
|
+
|
|
87
|
+
### 参数
|
|
88
|
+
<x-field-group>
|
|
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="要从中铸造的通证工厂的地址。"></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
|
+
<x-field data-name="data" data-type="object" data-required="false" data-desc="附加到铸造交易的可选自定义数据。"></x-field>
|
|
95
|
+
</x-field-group>
|
|
96
|
+
|
|
97
|
+
### 返回值
|
|
98
|
+
|
|
99
|
+
返回一个 promise,该 promise 解析为交易哈希。
|
|
100
|
+
|
|
101
|
+
<x-field data-name="hash" data-type="string" data-desc="铸造操作的交易哈希。"></x-field>
|
|
102
|
+
|
|
103
|
+
### 示例
|
|
104
|
+
|
|
105
|
+
```javascript Mint Tokens from a Factory icon=logos:javascript
|
|
106
|
+
async function mintNewTokens(factoryAddress) {
|
|
107
|
+
try {
|
|
108
|
+
const hash = await client.mintToken({
|
|
109
|
+
wallet,
|
|
110
|
+
tokenFactory: factoryAddress,
|
|
111
|
+
amount: 5000,
|
|
112
|
+
receiver: wallet.address, // 将通证铸造到我们自己的钱包
|
|
113
|
+
maxReserve: 10, // 支付的最大储备通证。根据联合曲线价格进行调整。
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
console.log('通证铸造成功!');
|
|
117
|
+
console.log('交易哈希:', hash);
|
|
118
|
+
} catch (error) {
|
|
119
|
+
console.error('铸造通证时出错:', error);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// 假设 `factoryAddress` 可从 createFactory 示例中获得
|
|
124
|
+
// const factoryAddress = '...';
|
|
125
|
+
// mintNewTokens(factoryAddress);
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## 销毁通证
|
|
129
|
+
|
|
130
|
+
销毁与铸造相反;它会永久地将通证从流通中移除。如果通证工厂使用联合曲线,销毁通证将向用户返回相应比例的储备货币。
|
|
131
|
+
|
|
132
|
+
`burnToken` 方法启动此过程。
|
|
133
|
+
|
|
134
|
+
### 参数
|
|
135
|
+
<x-field-group>
|
|
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
|
+
<x-field data-name="data" data-type="object" data-required="false" data-desc="附加到销毁交易的可选自定义数据。"></x-field>
|
|
142
|
+
</x-field-group>
|
|
143
|
+
|
|
144
|
+
### 返回值
|
|
145
|
+
|
|
146
|
+
返回一个 promise,该 promise 解析为交易哈希。
|
|
147
|
+
|
|
148
|
+
<x-field data-name="hash" data-type="string" data-desc="销毁操作的交易哈希。"></x-field>
|
|
149
|
+
|
|
150
|
+
### 示例
|
|
151
|
+
|
|
152
|
+
```javascript Burn Tokens icon=logos:javascript
|
|
153
|
+
async function burnExistingTokens(factoryAddress) {
|
|
154
|
+
try {
|
|
155
|
+
const hash = await client.burnToken({
|
|
156
|
+
wallet,
|
|
157
|
+
tokenFactory: factoryAddress,
|
|
158
|
+
amount: 1000,
|
|
159
|
+
receiver: wallet.address, // 将储备通证接收回我们自己的钱包
|
|
160
|
+
minReserve: 1, // 接收的最小储备通证。根据联合曲线价格进行调整。
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
console.log('通证销毁成功!');
|
|
164
|
+
console.log('交易哈希:', hash);
|
|
165
|
+
} catch (error) {
|
|
166
|
+
console.error('销毁通证时出错:', error);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// 假设 `factoryAddress` 可从 createFactory 示例中获得
|
|
171
|
+
// const factoryAddress = '...';
|
|
172
|
+
// burnExistingTokens(factoryAddress);
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## 总结
|
|
176
|
+
|
|
177
|
+
在本指南中,你学习了管理同质化通证的完整生命周期:创建工厂、铸造新通证以及销毁它们以减少供应。这些强大的原语使你能够在 OCAP 平台上构建复杂的经济系统。
|
|
178
|
+
|
|
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
|
+
# Stake Tokens and Assets
|
|
2
|
+
|
|
3
|
+
Staking is the process of locking up tokens or assets (NFTs) to a specific receiver, often to secure a network, participate in governance, or earn rewards. This guide provides a step-by-step walkthrough of the entire staking lifecycle using the OCAP Client, including creating a stake, revoking it, claiming the assets back, and slashing a stake for punitive reasons.
|
|
4
|
+
|
|
5
|
+
This process involves a few key methods:
|
|
6
|
+
- `stake()`: To create a new stake.
|
|
7
|
+
- `revokeStake()`: To initiate the process of withdrawing your staked items.
|
|
8
|
+
- `claimStake()`: To finalize the withdrawal and return the items to your account.
|
|
9
|
+
- `slashStake()`: To allow authorized parties to penalize a staker.
|
|
10
|
+
|
|
11
|
+
## How to Stake
|
|
12
|
+
|
|
13
|
+
To begin, you use the `stake` method to lock your tokens or assets. This action creates a new, unique stake address on the chain that holds your staked items and the rules governing them.
|
|
14
|
+
|
|
15
|
+
### Parameters
|
|
16
|
+
|
|
17
|
+
<x-field-group>
|
|
18
|
+
<x-field data-name="to" data-type="string" data-required="true" data-desc="The DID address of the account that will receive the stake."></x-field>
|
|
19
|
+
<x-field data-name="assets" data-type="string[]" data-required="false" data-desc="An array of asset addresses (NFTs) to be staked."></x-field>
|
|
20
|
+
<x-field data-name="tokens" data-type="object[]" data-required="false" data-desc="An array of token objects to be staked.">
|
|
21
|
+
<x-field data-name="address" data-type="string" data-required="true" data-desc="The address of the token contract."></x-field>
|
|
22
|
+
<x-field data-name="value" data-type="number" data-required="true" data-desc="The amount of tokens to stake."></x-field>
|
|
23
|
+
</x-field>
|
|
24
|
+
<x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="The wallet object of the staker."></x-field>
|
|
25
|
+
<x-field data-name="locked" data-type="boolean" data-default="false" data-required="false" data-desc="A boolean indicating if the stake is locked upon creation."></x-field>
|
|
26
|
+
<x-field data-name="slashers" data-type="string[]" data-required="false" data-desc="An array of DID addresses permitted to slash this stake. Defaults to the receiver's address if not provided."></x-field>
|
|
27
|
+
<x-field data-name="message" data-type="string" data-required="false" data-desc="An optional note or message for the stake."></x-field>
|
|
28
|
+
<x-field data-name="nonce" data-type="string" data-required="false" data-desc="An optional nonce to ensure the stake address is unique."></x-field>
|
|
29
|
+
</x-field-group>
|
|
30
|
+
|
|
31
|
+
### Example
|
|
32
|
+
|
|
33
|
+
```javascript Staking Tokens and an Asset icon=logos:javascript
|
|
34
|
+
// Assume 'client' is an initialized GraphQLClient instance
|
|
35
|
+
// and 'stakerWallet' is a valid wallet object.
|
|
36
|
+
const receiverAddress = 'z29d5852576b8a8b6f3a8b4b74a3f4a3e2e1d'; // The address of the stake receiver
|
|
37
|
+
|
|
38
|
+
async function createStake() {
|
|
39
|
+
try {
|
|
40
|
+
const [txHash, stakeAddress] = await client.stake({
|
|
41
|
+
to: receiverAddress,
|
|
42
|
+
tokens: [{
|
|
43
|
+
address: 'z35n6aTUTK8h5nAF43h21A1g84g3C3D7B5E', // Address of the token to stake
|
|
44
|
+
value: 100, // Amount of tokens to stake
|
|
45
|
+
}],
|
|
46
|
+
assets: ['zNKtA1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6'], // Address of the asset/NFT to stake
|
|
47
|
+
message: 'Staking for validator rewards',
|
|
48
|
+
wallet: stakerWallet,
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
console.log('Stake transaction sent:', txHash);
|
|
52
|
+
console.log('New stake address created:', stakeAddress);
|
|
53
|
+
return stakeAddress;
|
|
54
|
+
} catch (error) {
|
|
55
|
+
console.error('Error creating stake:', error);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Return Value
|
|
61
|
+
|
|
62
|
+
The `stake` method returns a tuple containing the transaction hash and the newly created `stakeAddress`. This address is crucial for all future interactions with this specific stake, such as revoking or slashing.
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## How to Revoke a Stake
|
|
67
|
+
|
|
68
|
+
Revoking a stake is the process initiated by the staker to retrieve their locked tokens and assets. This transaction does not immediately return the funds; instead, it marks them as available for claiming, subject to any on-chain lock-up periods.
|
|
69
|
+
|
|
70
|
+
### Parameters
|
|
71
|
+
|
|
72
|
+
<x-field-group>
|
|
73
|
+
<x-field data-name="from" data-type="string" data-required="true" data-desc="The address of the stake to be revoked (obtained from the 'stake' call)."></x-field>
|
|
74
|
+
<x-field data-name="assets" data-type="string[]" data-required="false" data-desc="An array of asset addresses to revoke from the stake."></x-field>
|
|
75
|
+
<x-field data-name="tokens" data-type="object[]" data-required="false" data-desc="An array of token objects to revoke.">
|
|
76
|
+
<x-field data-name="address" data-type="string" data-required="true" data-desc="The address of the token contract."></x-field>
|
|
77
|
+
<x-field data-name="value" data-type="number" data-required="true" data-desc="The amount of tokens to revoke."></x-field>
|
|
78
|
+
</x-field>
|
|
79
|
+
<x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="The staker's wallet object, which must be the original creator of the stake."></x-field>
|
|
80
|
+
</x-field-group>
|
|
81
|
+
|
|
82
|
+
### Example
|
|
83
|
+
|
|
84
|
+
```javascript Revoking a Stake icon=logos:javascript
|
|
85
|
+
// Assume 'stakeAddress' is the address returned from the previous step
|
|
86
|
+
// and 'stakerWallet' is the same wallet used to create the stake.
|
|
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('Revoke stake transaction sent:', revokeTxHash);
|
|
101
|
+
console.log('IMPORTANT: Save this hash to claim your stake later.');
|
|
102
|
+
return revokeTxHash;
|
|
103
|
+
} catch (error) {
|
|
104
|
+
console.error('Error revoking stake:', error);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Return Value
|
|
110
|
+
|
|
111
|
+
This function returns the transaction hash of the revoke operation. This hash serves as evidence and is **required** for the final step of claiming the stake.
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## How to Claim a Revoked Stake
|
|
116
|
+
|
|
117
|
+
After a stake has been successfully revoked, the staker must send a `claimStake` transaction to move the tokens and assets back into their account. This finalizes the withdrawal process.
|
|
118
|
+
|
|
119
|
+
### Parameters
|
|
120
|
+
|
|
121
|
+
<x-field-group>
|
|
122
|
+
<x-field data-name="from" data-type="string" data-required="true" data-desc="The address of the stake."></x-field>
|
|
123
|
+
<x-field data-name="evidence" data-type="string" data-required="true" data-desc="The transaction hash from the 'revokeStake' call, which serves as proof of revocation."></x-field>
|
|
124
|
+
<x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="The staker's wallet object."></x-field>
|
|
125
|
+
</x-field-group>
|
|
126
|
+
|
|
127
|
+
### Example
|
|
128
|
+
|
|
129
|
+
```javascript Claiming Staked Items icon=logos:javascript
|
|
130
|
+
// Assume 'stakeAddress' and 'revokeTxHash' are from the previous steps,
|
|
131
|
+
// and 'stakerWallet' is the staker's wallet.
|
|
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('Claim stake transaction sent:', claimTxHash);
|
|
142
|
+
console.log('Your tokens and assets have been returned to your account.');
|
|
143
|
+
} catch (error) {
|
|
144
|
+
console.error('Error claiming stake:', error);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### Return Value
|
|
150
|
+
|
|
151
|
+
The method returns the final transaction hash. Once this transaction is confirmed on the chain, the staked items are returned to the `wallet`'s address.
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## How to Slash a Stake
|
|
156
|
+
|
|
157
|
+
Slashing is a punitive action that can be taken by a designated `slasher` (usually the stake receiver) against a staker. This typically happens if the staker violates certain rules. The slashed tokens or assets are removed from the stake and sent to a designated vault.
|
|
158
|
+
|
|
159
|
+
### Parameters
|
|
160
|
+
|
|
161
|
+
<x-field-group>
|
|
162
|
+
<x-field data-name="from" data-type="string" data-required="true" data-desc="The address of the stake to be slashed."></x-field>
|
|
163
|
+
<x-field data-name="reason" data-type="string" data-required="true" data-desc="A mandatory message explaining why the slash is occurring."></x-field>
|
|
164
|
+
<x-field data-name="assets" data-type="string[]" data-required="false" data-desc="An array of asset addresses to be slashed from the stake."></x-field>
|
|
165
|
+
<x-field data-name="tokens" data-type="object[]" data-required="false" data-desc="An array of token objects to be slashed.">
|
|
166
|
+
<x-field data-name="address" data-type="string" data-required="true" data-desc="The address of the token contract."></x-field>
|
|
167
|
+
<x-field data-name="value" data-type="number" data-required="true" data-desc="The amount of tokens to slash."></x-field>
|
|
168
|
+
</x-field>
|
|
169
|
+
<x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="The wallet object of an authorized slasher."></x-field>
|
|
170
|
+
</x-field-group>
|
|
171
|
+
|
|
172
|
+
### Example
|
|
173
|
+
|
|
174
|
+
```javascript Slashing a Stake icon=logos:javascript
|
|
175
|
+
// Assume 'stakeAddress' is the address of the stake to be slashed,
|
|
176
|
+
// and 'slasherWallet' is the wallet of an authorized slasher.
|
|
177
|
+
|
|
178
|
+
async function slashExistingStake(stakeAddress) {
|
|
179
|
+
try {
|
|
180
|
+
const slashTxHash = await client.slashStake({
|
|
181
|
+
from: stakeAddress,
|
|
182
|
+
reason: 'Validator missed signing 10 consecutive blocks.',
|
|
183
|
+
tokens: [{
|
|
184
|
+
address: 'z35n6aTUTK8h5nAF43h21A1g84g3C3D7B5E',
|
|
185
|
+
value: 10, // Slashing 10 tokens as a penalty
|
|
186
|
+
}],
|
|
187
|
+
wallet: slasherWallet,
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
console.log('Slash stake transaction sent:', slashTxHash);
|
|
191
|
+
} catch (error) {
|
|
192
|
+
console.error('Error slashing stake:', error);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### Return Value
|
|
198
|
+
|
|
199
|
+
This method returns the transaction hash for the slashing operation.
|
|
200
|
+
|
|
201
|
+
## Summary
|
|
202
|
+
|
|
203
|
+
You've now learned the complete lifecycle of staking on the OCAP blockchain: creating a stake with `stake`, retrieving funds with `revokeStake` and `claimStake`, and penalizing bad actors with `slashStake`. This powerful mechanism is fundamental to many decentralized applications.
|
|
204
|
+
|
|
205
|
+
To learn more about the items you can stake, see the [Manage Tokens](./how-to-guides-manage-tokens.md) and [Manage Assets (NFTs)](./how-to-guides-manage-assets.md) guides.
|