@ocap/client 1.25.6 → 1.26.0
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 +77 -79
- package/dist/base.js +2 -2
- package/dist/base.js.map +1 -1
- package/dist/bundle.js +1 -1
- package/dist/extension.js +4 -4
- package/dist/extension.js.map +1 -1
- package/dist/report.html +2 -2
- package/docs/api-reference-client-methods.ja.md +38 -38
- package/docs/api-reference-client-methods.zh-TW.md +47 -47
- package/docs/api-reference-client-methods.zh.md +34 -34
- package/docs/api-reference-data-types.ja.md +20 -20
- package/docs/api-reference-data-types.zh-TW.md +17 -17
- package/docs/api-reference-data-types.zh.md +24 -24
- package/docs/api-reference-low-level-api.ja.md +49 -49
- package/docs/api-reference-low-level-api.zh-TW.md +48 -48
- package/docs/api-reference-low-level-api.zh.md +43 -43
- package/docs/api-reference-query-mutation-methods.ja.md +85 -85
- package/docs/api-reference-query-mutation-methods.zh-TW.md +140 -140
- package/docs/api-reference-query-mutation-methods.zh.md +141 -141
- package/docs/api-reference-transaction-helpers.ja.md +120 -120
- package/docs/api-reference-transaction-helpers.zh-TW.md +119 -119
- package/docs/api-reference-transaction-helpers.zh.md +153 -153
- package/docs/api-reference.ja.md +6 -6
- package/docs/api-reference.zh-TW.md +5 -5
- package/docs/api-reference.zh.md +8 -8
- package/docs/core-concepts-client-architecture.ja.md +26 -26
- package/docs/core-concepts-client-architecture.zh-TW.md +34 -34
- package/docs/core-concepts-client-architecture.zh.md +26 -26
- package/docs/core-concepts-event-subscriptions.ja.md +29 -29
- package/docs/core-concepts-event-subscriptions.zh-TW.md +23 -23
- package/docs/core-concepts-event-subscriptions.zh.md +29 -29
- package/docs/core-concepts-gas-payment.ja.md +27 -27
- package/docs/core-concepts-gas-payment.zh-TW.md +28 -28
- package/docs/core-concepts-gas-payment.zh.md +32 -32
- package/docs/core-concepts-transaction-lifecycle.ja.md +40 -40
- package/docs/core-concepts-transaction-lifecycle.zh-TW.md +43 -43
- package/docs/core-concepts-transaction-lifecycle.zh.md +49 -49
- package/docs/core-concepts.ja.md +7 -7
- package/docs/core-concepts.zh-TW.md +6 -6
- package/docs/core-concepts.zh.md +7 -7
- package/docs/getting-started-basic-usage.ja.md +24 -24
- package/docs/getting-started-basic-usage.zh-TW.md +28 -28
- package/docs/getting-started-basic-usage.zh.md +24 -24
- package/docs/getting-started-installation.ja.md +13 -13
- package/docs/getting-started-installation.zh-TW.md +9 -9
- package/docs/getting-started-installation.zh.md +15 -15
- package/docs/getting-started.ja.md +5 -5
- package/docs/getting-started.zh-TW.md +6 -6
- package/docs/getting-started.zh.md +6 -7
- package/docs/how-to-guides-delegate-permissions.ja.md +21 -21
- package/docs/how-to-guides-delegate-permissions.zh-TW.md +20 -21
- package/docs/how-to-guides-delegate-permissions.zh.md +18 -18
- package/docs/how-to-guides-manage-accounts.ja.md +21 -21
- package/docs/how-to-guides-manage-accounts.zh-TW.md +23 -23
- package/docs/how-to-guides-manage-accounts.zh.md +17 -17
- package/docs/how-to-guides-manage-assets.ja.md +137 -60
- package/docs/how-to-guides-manage-assets.md +77 -0
- package/docs/how-to-guides-manage-assets.zh-TW.md +116 -39
- package/docs/how-to-guides-manage-assets.zh.md +142 -65
- package/docs/how-to-guides-manage-tokens.ja.md +47 -47
- package/docs/how-to-guides-manage-tokens.zh-TW.md +49 -49
- package/docs/how-to-guides-manage-tokens.zh.md +34 -34
- package/docs/how-to-guides-stake-tokens-and-assets.ja.md +56 -56
- package/docs/how-to-guides-stake-tokens-and-assets.zh-TW.md +55 -55
- package/docs/how-to-guides-stake-tokens-and-assets.zh.md +51 -51
- package/docs/how-to-guides-transfer-tokens-and-nfts.ja.md +45 -45
- package/docs/how-to-guides-transfer-tokens-and-nfts.zh-TW.md +46 -46
- package/docs/how-to-guides-transfer-tokens-and-nfts.zh.md +37 -37
- package/docs/how-to-guides.ja.md +8 -8
- package/docs/how-to-guides.zh-TW.md +4 -4
- package/docs/how-to-guides.zh.md +6 -6
- package/docs/overview.ja.md +15 -15
- package/docs/overview.zh-TW.md +14 -14
- package/docs/overview.zh.md +12 -12
- package/lib/base.js +2 -2
- package/lib/base.js.map +1 -1
- package/lib/extension.js +4 -4
- package/lib/extension.js.map +1 -1
- package/package.json +15 -15
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
# 管理资产 (NFT)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
本指南将全面介绍如何使用 OCAP Client 管理非同质化代币 (NFT),也称为资产的整个生命周期。您将学习如何从零开始创建新资产、更新其属性、建立用于标准化铸造的资产工厂,以及如何从该工厂获取新资产。
|
|
4
4
|
|
|
5
5
|
## 创建新资产
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
您可以使用 `createAsset` 方法在区块链上创建一个独立的唯一资产。每个资产都会被分配一个唯一的链上地址,该地址由其初始属性派生而来。
|
|
8
8
|
|
|
9
9
|
```javascript icon=logos:javascript
|
|
10
|
-
const { wallet } = getWallet(); //
|
|
10
|
+
const { wallet } = getWallet(); // 用户的钱包对象
|
|
11
11
|
|
|
12
12
|
async function createNewAsset() {
|
|
13
13
|
try {
|
|
14
14
|
const [hash, address] = await client.createAsset({
|
|
15
|
-
moniker: '
|
|
15
|
+
moniker: 'My Unique Digital Artwork',
|
|
16
16
|
data: {
|
|
17
17
|
typeUrl: 'json',
|
|
18
18
|
value: {
|
|
19
|
-
description: '
|
|
19
|
+
description: 'A one-of-a-kind piece created by Artist X.',
|
|
20
20
|
imageUrl: 'https://example.com/path/to/image.png',
|
|
21
21
|
},
|
|
22
22
|
},
|
|
@@ -25,11 +25,11 @@ async function createNewAsset() {
|
|
|
25
25
|
wallet: wallet,
|
|
26
26
|
});
|
|
27
27
|
|
|
28
|
-
console.log(
|
|
29
|
-
console.log(
|
|
28
|
+
console.log(`Asset creation transaction sent: ${hash}`);
|
|
29
|
+
console.log(`New asset address: ${address}`);
|
|
30
30
|
return address;
|
|
31
31
|
} catch (error) {
|
|
32
|
-
console.error('
|
|
32
|
+
console.error('Error creating asset:', error);
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
35
|
|
|
@@ -39,53 +39,53 @@ createNewAsset();
|
|
|
39
39
|
### 参数
|
|
40
40
|
|
|
41
41
|
<x-field-group>
|
|
42
|
-
<x-field data-name="moniker" data-type="string" data-required="true" data-desc="资产的名称。"
|
|
43
|
-
<x-field data-name="parent" data-type="string" data-default="''" data-required="false" data-desc="父资产的地址(如有)。"
|
|
44
|
-
<x-field data-name="data" data-type="object" data-required="true" data-desc="资产的数据负载,必须包含 typeUrl 和 value。"
|
|
45
|
-
<x-field data-name="readonly" data-type="boolean" data-default="false" data-required="false" data-desc="如果为 true,资产在创建后无法更新。"
|
|
46
|
-
<x-field data-name="transferrable" data-type="boolean" data-default="true" data-required="false" data-desc="如果为 true,资产可以转移到另一个账户。"
|
|
47
|
-
<x-field data-name="ttl" data-type="number" data-default="0" data-required="false" data-desc="
|
|
48
|
-
<x-field data-name="display" data-type="object" data-required="false" data-desc="包含资产显示信息的对象。"
|
|
49
|
-
<x-field data-name="endpoint" data-type="object" data-required="false" data-desc="包含资产端点详细信息的对象。"
|
|
50
|
-
<x-field data-name="tags" data-type="string[]" data-default="[]" data-required="false" data-desc="用于对资产进行分类的字符串数组。"
|
|
51
|
-
<x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="资产初始所有者的钱包对象。"
|
|
52
|
-
<x-field data-name="delegator" data-type="string" data-default="''" data-required="false" data-desc="通过委托授权此交易的账户地址。"
|
|
42
|
+
<x-field data-name="moniker" data-type="string" data-required="true" data-desc="资产的名称。"></x-field>
|
|
43
|
+
<x-field data-name="parent" data-type="string" data-default="''" data-required="false" data-desc="父资产的地址(如有)。"></x-field>
|
|
44
|
+
<x-field data-name="data" data-type="object" data-required="true" data-desc="资产的数据负载,必须包含 typeUrl 和 value。"></x-field>
|
|
45
|
+
<x-field data-name="readonly" data-type="boolean" data-default="false" data-required="false" data-desc="如果为 true,资产在创建后无法更新。"></x-field>
|
|
46
|
+
<x-field data-name="transferrable" data-type="boolean" data-default="true" data-required="false" data-desc="如果为 true,资产可以转移到另一个账户。"></x-field>
|
|
47
|
+
<x-field data-name="ttl" data-type="number" data-default="0" data-required="false" data-desc="资产首次消费后的存活时间(以秒为单位)。"></x-field>
|
|
48
|
+
<x-field data-name="display" data-type="object" data-required="false" data-desc="包含资产显示信息的对象。"></x-field>
|
|
49
|
+
<x-field data-name="endpoint" data-type="object" data-required="false" data-desc="包含资产端点详细信息的对象。"></x-field>
|
|
50
|
+
<x-field data-name="tags" data-type="string[]" data-default="[]" data-required="false" data-desc="用于对资产进行分类的字符串数组。"></x-field>
|
|
51
|
+
<x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="资产初始所有者的钱包对象。"></x-field>
|
|
52
|
+
<x-field data-name="delegator" data-type="string" data-default="''" data-required="false" data-desc="通过委托授权此交易的账户地址。"></x-field>
|
|
53
53
|
</x-field-group>
|
|
54
54
|
|
|
55
55
|
### 返回值
|
|
56
56
|
|
|
57
57
|
一个 `Promise`,它会解析为一个包含交易哈希和新资产链上地址的数组。
|
|
58
58
|
|
|
59
|
-
<x-field data-name="response" data-type="Promise<[string, string]>" data-desc="[
|
|
59
|
+
<x-field data-name="response" data-type="Promise<[string, string]>" data-desc="[交易哈希, 资产地址]"></x-field>
|
|
60
60
|
|
|
61
61
|
---
|
|
62
62
|
|
|
63
63
|
## 更新现有资产
|
|
64
64
|
|
|
65
|
-
如果资产创建时设置了 `readonly: false
|
|
65
|
+
如果资产创建时设置了 `readonly: false`,您可以使用 `updateAsset` 方法修改其 `moniker` 和 `data` 字段。通过资产的唯一地址来识别该资产。
|
|
66
66
|
|
|
67
67
|
```javascript icon=logos:javascript
|
|
68
|
-
const { wallet } = getWallet(); //
|
|
68
|
+
const { wallet } = getWallet(); // 用户的钱包对象
|
|
69
69
|
const assetAddress = 'z362...'; // 要更新的资产地址
|
|
70
70
|
|
|
71
71
|
async function updateExistingAsset() {
|
|
72
72
|
try {
|
|
73
73
|
const hash = await client.updateAsset({
|
|
74
74
|
address: assetAddress,
|
|
75
|
-
moniker: '
|
|
75
|
+
moniker: 'My Updated Digital Artwork',
|
|
76
76
|
data: {
|
|
77
77
|
typeUrl: 'json',
|
|
78
78
|
value: {
|
|
79
|
-
description: '
|
|
79
|
+
description: 'An updated description for my unique piece.',
|
|
80
80
|
imageUrl: 'https://example.com/path/to/new_image.png',
|
|
81
81
|
},
|
|
82
82
|
},
|
|
83
83
|
wallet: wallet,
|
|
84
84
|
});
|
|
85
85
|
|
|
86
|
-
console.log(
|
|
86
|
+
console.log(`Asset update transaction sent: ${hash}`);
|
|
87
87
|
} catch (error) {
|
|
88
|
-
console.error('
|
|
88
|
+
console.error('Error updating asset:', error);
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
91
|
|
|
@@ -95,17 +95,17 @@ updateExistingAsset();
|
|
|
95
95
|
### 参数
|
|
96
96
|
|
|
97
97
|
<x-field-group>
|
|
98
|
-
<x-field data-name="address" data-type="string" data-required="true" data-desc="要更新的资产的链上地址。"
|
|
99
|
-
<x-field data-name="moniker" data-type="string" data-required="true" data-desc="资产的新名称。"
|
|
100
|
-
<x-field data-name="data" data-type="object" data-required="true" data-desc="资产的更新数据负载。"
|
|
101
|
-
<x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="当前资产所有者的钱包对象。"
|
|
98
|
+
<x-field data-name="address" data-type="string" data-required="true" data-desc="要更新的资产的链上地址。"></x-field>
|
|
99
|
+
<x-field data-name="moniker" data-type="string" data-required="true" data-desc="资产的新名称。"></x-field>
|
|
100
|
+
<x-field data-name="data" data-type="object" data-required="true" data-desc="资产的更新数据负载。"></x-field>
|
|
101
|
+
<x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="当前资产所有者的钱包对象。"></x-field>
|
|
102
102
|
</x-field-group>
|
|
103
103
|
|
|
104
104
|
### 返回值
|
|
105
105
|
|
|
106
106
|
一个 `Promise`,它会解析为交易哈希。
|
|
107
107
|
|
|
108
|
-
<x-field data-name="response" data-type="Promise<string>" data-desc="
|
|
108
|
+
<x-field data-name="response" data-type="Promise<string>" data-desc="交易哈希"></x-field>
|
|
109
109
|
|
|
110
110
|
---
|
|
111
111
|
|
|
@@ -117,8 +117,8 @@ updateExistingAsset();
|
|
|
117
117
|
const { wallet } = getWallet(); // 工厂所有者的钱包
|
|
118
118
|
|
|
119
119
|
const factoryDefinition = {
|
|
120
|
-
name: '
|
|
121
|
-
description: '
|
|
120
|
+
name: 'Conference Ticket Factory',
|
|
121
|
+
description: 'Mints tickets for the 2024 Tech Conference.',
|
|
122
122
|
limit: 1000, // 最多可铸造 1000 张门票
|
|
123
123
|
input: {
|
|
124
124
|
// 定义铸造资产所需的数据
|
|
@@ -129,9 +129,9 @@ const factoryDefinition = {
|
|
|
129
129
|
},
|
|
130
130
|
},
|
|
131
131
|
output: {
|
|
132
|
-
//
|
|
133
|
-
moniker: '{{attendeeName}}
|
|
134
|
-
description: '
|
|
132
|
+
// 定义铸造出的资产的结构
|
|
133
|
+
moniker: 'Ticket for {{attendeeName}}',
|
|
134
|
+
description: '{{ticketType}} admission for the 2024 Tech Conference.',
|
|
135
135
|
transferrable: false, // 门票不可转让
|
|
136
136
|
},
|
|
137
137
|
hooks: [],
|
|
@@ -144,10 +144,10 @@ async function createFactory() {
|
|
|
144
144
|
wallet: wallet,
|
|
145
145
|
});
|
|
146
146
|
|
|
147
|
-
console.log(
|
|
148
|
-
console.log(
|
|
147
|
+
console.log(`Factory creation transaction sent: ${hash}`);
|
|
148
|
+
console.log(`New factory address: ${factoryAddress}`);
|
|
149
149
|
} catch (error) {
|
|
150
|
-
console.error('
|
|
150
|
+
console.error('Error creating asset factory:', error);
|
|
151
151
|
}
|
|
152
152
|
}
|
|
153
153
|
|
|
@@ -158,16 +158,16 @@ createFactory();
|
|
|
158
158
|
|
|
159
159
|
<x-field-group>
|
|
160
160
|
<x-field data-name="factory" data-type="object" data-required="true" data-desc="一个定义工厂属性和铸造逻辑的对象。">
|
|
161
|
-
<x-field data-name="name" data-type="string" data-required="true" data-desc="工厂的名称。"
|
|
162
|
-
<x-field data-name="description" data-type="string" data-required="true" data-desc="工厂用途的描述。"
|
|
163
|
-
<x-field data-name="limit" data-type="number" data-default="0" data-required="false" data-desc="
|
|
164
|
-
<x-field data-name="trustedIssuers" data-type="string[]" data-required="false" data-desc="
|
|
165
|
-
<x-field data-name="input" data-type="object" data-required="true" data-desc="定义铸造资产所需的输入数据。"
|
|
166
|
-
<x-field data-name="output" data-type="object" data-required="true" data-desc="
|
|
167
|
-
<x-field data-name="hooks" data-type="object[]" data-required="false" data-desc="在铸造过程中执行的钩子列表。"
|
|
168
|
-
<x-field data-name="data" data-type="object" data-required="false" data-desc="与工厂一起存储的额外任意数据。"
|
|
161
|
+
<x-field data-name="name" data-type="string" data-required="true" data-desc="工厂的名称。"></x-field>
|
|
162
|
+
<x-field data-name="description" data-type="string" data-required="true" data-desc="工厂用途的描述。"></x-field>
|
|
163
|
+
<x-field data-name="limit" data-type="number" data-default="0" data-required="false" data-desc="可以从此工厂铸造的最大资产数量。0 表示无限制。"></x-field>
|
|
164
|
+
<x-field data-name="trustedIssuers" data-type="string[]" data-required="false" data-desc="被授权从此工厂铸造资产的账户地址列表。"></x-field>
|
|
165
|
+
<x-field data-name="input" data-type="object" data-required="true" data-desc="定义铸造资产所需的输入数据。"></x-field>
|
|
166
|
+
<x-field data-name="output" data-type="object" data-required="true" data-desc="定义将被铸造的资产的结构和属性。"></x-field>
|
|
167
|
+
<x-field data-name="hooks" data-type="object[]" data-required="false" data-desc="在铸造过程中执行的钩子列表。"></x-field>
|
|
168
|
+
<x-field data-name="data" data-type="object" data-required="false" data-desc="与工厂一起存储的额外任意数据。"></x-field>
|
|
169
169
|
</x-field>
|
|
170
|
-
<x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="工厂所有者的钱包对象。"
|
|
170
|
+
<x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="工厂所有者的钱包对象。"></x-field>
|
|
171
171
|
</x-field-group>
|
|
172
172
|
|
|
173
173
|
|
|
@@ -175,24 +175,24 @@ createFactory();
|
|
|
175
175
|
|
|
176
176
|
一个 `Promise`,它会解析为一个包含交易哈希和新工厂链上地址的数组。
|
|
177
177
|
|
|
178
|
-
<x-field data-name="response" data-type="Promise<[string, string]>" data-desc="[
|
|
178
|
+
<x-field data-name="response" data-type="Promise<[string, string]>" data-desc="[交易哈希, 工厂地址]"></x-field>
|
|
179
179
|
|
|
180
180
|
---
|
|
181
181
|
|
|
182
182
|
## 从工厂获取资产
|
|
183
183
|
|
|
184
|
-
|
|
184
|
+
从工厂获取资产是一个两步过程。首先,您准备铸造数据,这使您可以预览将要创建的资产。其次,您将交易提交到区块链以正式获取该资产。
|
|
185
185
|
|
|
186
|
-
|
|
186
|
+
这种分离很有用,因为它允许应用程序在用户签名并提交最终交易之前,向用户展示他们将要收到的东西。
|
|
187
187
|
|
|
188
188
|
### 步骤 1:准备资产数据
|
|
189
189
|
|
|
190
190
|
`preMintAsset` 方法接收工厂地址和用户提供的输入,以生成最终的资产数据。此过程在链下发生,不需要交易。
|
|
191
191
|
|
|
192
192
|
```javascript icon=logos:javascript
|
|
193
|
-
const factoryAddress = 'z2...'; //
|
|
194
|
-
const { wallet: issuerWallet } = getIssuerWallet(); //
|
|
195
|
-
const { wallet: userWallet } = getUserWallet(); //
|
|
193
|
+
const factoryAddress = 'z2...'; // 先前创建的工厂地址
|
|
194
|
+
const { wallet: issuerWallet } = getIssuerWallet(); // 工厂所有者或受信任的发行方
|
|
195
|
+
const { wallet: userWallet } = getUserWallet(); // 将拥有新资产的用户的钱包
|
|
196
196
|
|
|
197
197
|
async function prepareAssetForMinting() {
|
|
198
198
|
try {
|
|
@@ -206,17 +206,17 @@ async function prepareAssetForMinting() {
|
|
|
206
206
|
wallet: issuerWallet,
|
|
207
207
|
});
|
|
208
208
|
|
|
209
|
-
console.log('
|
|
209
|
+
console.log('Prepared asset data for minting:', mintingData);
|
|
210
210
|
return mintingData;
|
|
211
211
|
} catch (error) {
|
|
212
|
-
console.error('
|
|
212
|
+
console.error('Error preparing asset:', error);
|
|
213
213
|
}
|
|
214
214
|
}
|
|
215
215
|
```
|
|
216
216
|
|
|
217
217
|
### 步骤 2:发送交易
|
|
218
218
|
|
|
219
|
-
|
|
219
|
+
一旦铸造数据准备好,用户(未来的资产所有者)签名并发送 `acquireAsset` 交易。来自 `preMintAsset` 的 `itx` 对象将用作有效负载。
|
|
220
220
|
|
|
221
221
|
```javascript icon=logos:javascript
|
|
222
222
|
async function acquireNewAsset() {
|
|
@@ -230,26 +230,103 @@ async function acquireNewAsset() {
|
|
|
230
230
|
wallet: userWallet, // 用户的钱包签署交易
|
|
231
231
|
});
|
|
232
232
|
|
|
233
|
-
console.log(
|
|
234
|
-
console.log(
|
|
233
|
+
console.log(`Asset acquisition transaction sent: ${hash}`);
|
|
234
|
+
console.log(`New asset will be available at address: ${itx.address}`);
|
|
235
235
|
} catch (error) {
|
|
236
|
-
console.error('
|
|
236
|
+
console.error('Error acquiring asset:', error);
|
|
237
237
|
}
|
|
238
238
|
}
|
|
239
239
|
|
|
240
240
|
acquireNewAsset();
|
|
241
241
|
```
|
|
242
242
|
|
|
243
|
-
###
|
|
243
|
+
### acquireAsset 的参数
|
|
244
244
|
|
|
245
245
|
<x-field-group>
|
|
246
|
-
<x-field data-name="itx" data-type="object" data-required="true" data-desc="从 `preMintAsset` 方法返回的内部交易对象。"
|
|
247
|
-
<x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="正在获取资产的用户的钱包。"
|
|
248
|
-
<x-field data-name="delegator" data-type="string" data-default="''" data-required="false" data-desc="通过委托授权此交易的账户地址。"
|
|
246
|
+
<x-field data-name="itx" data-type="object" data-required="true" data-desc="从 `preMintAsset` 方法返回的内部交易对象。"></x-field>
|
|
247
|
+
<x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="正在获取资产的用户的钱包。"></x-field>
|
|
248
|
+
<x-field data-name="delegator" data-type="string" data-default="''" data-required="false" data-desc="通过委托授权此交易的账户地址。"></x-field>
|
|
249
249
|
</x-field-group>
|
|
250
250
|
|
|
251
251
|
### 返回值
|
|
252
252
|
|
|
253
253
|
一个 `Promise`,它会解析为 `acquireAsset` 操作的交易哈希。
|
|
254
254
|
|
|
255
|
-
<x-field data-name="response" data-type="Promise<string>" data-desc="
|
|
255
|
+
<x-field data-name="response" data-type="Promise<string>" data-desc="交易哈希"></x-field>
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
## 从工厂铸造资产
|
|
260
|
+
|
|
261
|
+
除了用户主导的 `acquireAsset` 流程外,授权的发行方(例如工厂所有者或受信任的发行方)可以铸造一个资产并将其直接发送到用户的账户。此过程也使用 `preMintAsset` 来准备数据,但最终的交易是 `mintAsset`,由发行方签名。
|
|
262
|
+
|
|
263
|
+
此流程适用于空投、颁发证书或任何接收用户无需发起最终交易的情况。
|
|
264
|
+
|
|
265
|
+
### 步骤 1:准备资产数据
|
|
266
|
+
|
|
267
|
+
此步骤与获取流程相同。发行方调用 `preMintAsset` 在链下生成交易有效负载(`itx`)。
|
|
268
|
+
|
|
269
|
+
```javascript icon=logos:javascript
|
|
270
|
+
const factoryAddress = 'z2...'; // 工厂地址
|
|
271
|
+
const { wallet: issuerWallet } = getIssuerWallet(); // 工厂所有者或受信任的发行方
|
|
272
|
+
const userAddress = 'z1...'; // 将接收资产的用户的地址
|
|
273
|
+
|
|
274
|
+
async function prepareAssetForMinting() {
|
|
275
|
+
try {
|
|
276
|
+
const mintingData = await client.preMintAsset({
|
|
277
|
+
factory: factoryAddress,
|
|
278
|
+
inputs: {
|
|
279
|
+
attendeeName: 'Jane Smith',
|
|
280
|
+
ticketType: 'General',
|
|
281
|
+
},
|
|
282
|
+
owner: userAddress,
|
|
283
|
+
wallet: issuerWallet, // 此处使用发行方的钱包
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
console.log('Prepared asset data for minting:', mintingData);
|
|
287
|
+
return mintingData;
|
|
288
|
+
} catch (error) {
|
|
289
|
+
console.error('Error preparing asset:', error);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
### 步骤 2:发送铸造交易
|
|
295
|
+
|
|
296
|
+
发行方使用准备好的 `itx` 对象调用 `mintAsset`。交易由发行方的钱包签名,新创建的资产被分配给上一步中指定的所有者。
|
|
297
|
+
|
|
298
|
+
```javascript icon=logos:javascript
|
|
299
|
+
async function mintNewAsset() {
|
|
300
|
+
// 首先,从步骤 1 获取铸造数据
|
|
301
|
+
const itx = await prepareAssetForMinting();
|
|
302
|
+
if (!itx) return;
|
|
303
|
+
|
|
304
|
+
try {
|
|
305
|
+
// 发行方的钱包签署交易
|
|
306
|
+
const hash = await client.mintAsset({
|
|
307
|
+
itx: itx,
|
|
308
|
+
wallet: issuerWallet,
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
console.log(`Asset minting transaction sent: ${hash}`);
|
|
312
|
+
console.log(`New asset for ${userAddress} will be available at address: ${itx.address}`);
|
|
313
|
+
} catch (error) {
|
|
314
|
+
console.error('Error minting asset:', error);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
mintNewAsset();
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
### mintAsset 的参数
|
|
322
|
+
|
|
323
|
+
<x-field-group>
|
|
324
|
+
<x-field data-name="itx" data-type="object" data-required="true" data-desc="从 `preMintAsset` 方法返回的内部交易对象。"></x-field>
|
|
325
|
+
<x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="正在铸造资产的发行方的钱包。"></x-field>
|
|
326
|
+
</x-field-group>
|
|
327
|
+
|
|
328
|
+
### 返回值
|
|
329
|
+
|
|
330
|
+
一个 `Promise`,它会解析为 `mintAsset` 操作的交易哈希。
|
|
331
|
+
|
|
332
|
+
<x-field data-name="response" data-type="Promise<string>" data-desc="交易哈希"></x-field>
|
|
@@ -1,30 +1,30 @@
|
|
|
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
11
|
`createTokenFactory` メソッドは、新しいトークンファクトリーをブロックチェーンにデプロイします。
|
|
12
12
|
|
|
13
13
|
### パラメータ
|
|
14
14
|
<x-field-group>
|
|
15
|
-
<x-field data-name="wallet" data-type="WalletObject" data-required="true" 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="
|
|
18
|
-
<x-field data-name="symbol" data-type="string" data-required="true" data-desc="
|
|
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="トークンのフルネーム(例:「My Awesome Token」)。"></x-field>
|
|
18
|
+
<x-field data-name="symbol" data-type="string" data-required="true" data-desc="トークンのティッカーシンボル(例:「MAT」)。"></x-field>
|
|
19
19
|
<x-field data-name="decimal" data-type="number" data-required="true" data-desc="トークンがサポートする小数点以下の桁数。"></x-field>
|
|
20
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="
|
|
22
|
-
<x-field data-name="maxTotalSupply" data-type="number" data-required="false" data-desc="
|
|
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
24
|
<x-field data-name="curve" data-type="object" data-required="false" data-desc="トークンの価格をプログラムで制御するボンディングカーブの設定。省略した場合、ミント/バーンはリザーブトークンに結び付けられません。">
|
|
25
25
|
<x-field data-name="basePrice" data-type="number" data-required="false" data-desc="リザーブ通貨でのトークンの基本価格。"></x-field>
|
|
26
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="
|
|
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
30
|
<x-field data-name="data" data-type="object" data-required="false" data-desc="トークンファクトリーに添付するオプションのカスタムデータ。"></x-field>
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
|
|
33
33
|
### 戻り値
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
トランザクションハッシュと新しく作成されたトークンファクトリーのアドレスを含む配列に解決される Promise を返します。
|
|
36
36
|
|
|
37
37
|
<x-field-group>
|
|
38
38
|
<x-field data-name="[0]" data-type="string" data-desc="ファクトリー作成のトランザクションハッシュ。"></x-field>
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
|
|
42
42
|
### 例
|
|
43
43
|
|
|
44
|
-
```javascript
|
|
44
|
+
```javascript トークンファクトリーの作成 icon=logos:javascript
|
|
45
45
|
import Client from '@ocap/client';
|
|
46
46
|
import Wallet from '@ocap/wallet';
|
|
47
47
|
|
|
@@ -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() {
|
|
@@ -63,32 +63,32 @@ async function createFactory() {
|
|
|
63
63
|
description: 'The official currency for My Awesome Game.',
|
|
64
64
|
maxTotalSupply: 1000000,
|
|
65
65
|
},
|
|
66
|
-
feeRate: 100, // 1
|
|
66
|
+
feeRate: 100, // 1% fee
|
|
67
67
|
});
|
|
68
68
|
|
|
69
|
-
console.log('
|
|
70
|
-
console.log('
|
|
71
|
-
console.log('
|
|
69
|
+
console.log('Token factory created successfully!');
|
|
70
|
+
console.log('Transaction Hash:', hash);
|
|
71
|
+
console.log('Factory Address:', factoryAddress);
|
|
72
72
|
return factoryAddress;
|
|
73
73
|
} catch (error) {
|
|
74
|
-
console.error('
|
|
74
|
+
console.error('Error creating token factory:', error);
|
|
75
75
|
}
|
|
76
76
|
}
|
|
77
77
|
|
|
78
78
|
createFactory();
|
|
79
79
|
```
|
|
80
80
|
|
|
81
|
-
##
|
|
81
|
+
## トークンのミント
|
|
82
82
|
|
|
83
|
-
|
|
83
|
+
ミントは、新しいトークンを作成し、総供給量に追加するプロセスです。これはトークンファクトリーを介して行われます。ファクトリーがボンディングカーブで設定されている場合、ミントにはリザーブトークンでの支払いが必要になります。
|
|
84
84
|
|
|
85
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="
|
|
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
92
|
<x-field data-name="receiver" data-type="string" data-required="true" data-desc="新しくミントされたトークンを受け取るアドレス。"></x-field>
|
|
93
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>
|
|
@@ -96,84 +96,84 @@ createFactory();
|
|
|
96
96
|
|
|
97
97
|
### 戻り値
|
|
98
98
|
|
|
99
|
-
|
|
99
|
+
トランザクションハッシュに解決される Promise を返します。
|
|
100
100
|
|
|
101
101
|
<x-field data-name="hash" data-type="string" data-desc="ミント操作のトランザクションハッシュ。"></x-field>
|
|
102
102
|
|
|
103
103
|
### 例
|
|
104
104
|
|
|
105
|
-
```javascript
|
|
105
|
+
```javascript ファクトリーからトークンをミントする icon=logos:javascript
|
|
106
106
|
async function mintNewTokens(factoryAddress) {
|
|
107
107
|
try {
|
|
108
108
|
const hash = await client.mintToken({
|
|
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('Tokens minted successfully!');
|
|
117
|
+
console.log('Transaction Hash:', hash);
|
|
118
118
|
} catch (error) {
|
|
119
|
-
console.error('
|
|
119
|
+
console.error('Error minting tokens:', error);
|
|
120
120
|
}
|
|
121
121
|
}
|
|
122
122
|
|
|
123
|
-
// `factoryAddress`
|
|
123
|
+
// createFactory の例で `factoryAddress` が利用可能であると仮定します
|
|
124
124
|
// const factoryAddress = '...';
|
|
125
125
|
// mintNewTokens(factoryAddress);
|
|
126
126
|
```
|
|
127
127
|
|
|
128
|
-
##
|
|
128
|
+
## トークンのバーン
|
|
129
129
|
|
|
130
|
-
|
|
130
|
+
バーンはミントの反対で、トークンを流通から永久に削除します。トークンファクトリーがボンディングカーブを使用している場合、トークンをバーンすると、比例した量のリザーブ通貨がユーザーに返されます。
|
|
131
131
|
|
|
132
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="
|
|
136
|
+
<x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="バーンするトークンを保持し、トランザクションに署名するウォレット。"></x-field>
|
|
137
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="
|
|
138
|
+
<x-field data-name="amount" data-type="number" data-required="true" data-desc="バーンするトークンの量。"></x-field>
|
|
139
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="
|
|
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
|
|
|
144
144
|
### 戻り値
|
|
145
145
|
|
|
146
|
-
|
|
146
|
+
トランザクションハッシュに解決される Promise を返します。
|
|
147
147
|
|
|
148
148
|
<x-field data-name="hash" data-type="string" data-desc="バーン操作のトランザクションハッシュ。"></x-field>
|
|
149
149
|
|
|
150
150
|
### 例
|
|
151
151
|
|
|
152
|
-
```javascript
|
|
152
|
+
```javascript トークンをバーンする icon=logos:javascript
|
|
153
153
|
async function burnExistingTokens(factoryAddress) {
|
|
154
154
|
try {
|
|
155
155
|
const hash = await client.burnToken({
|
|
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('Tokens burned successfully!');
|
|
164
|
+
console.log('Transaction Hash:', hash);
|
|
165
165
|
} catch (error) {
|
|
166
|
-
console.error('
|
|
166
|
+
console.error('Error burning tokens:', error);
|
|
167
167
|
}
|
|
168
168
|
}
|
|
169
169
|
|
|
170
|
-
// `factoryAddress`
|
|
170
|
+
// createFactory の例で `factoryAddress` が利用可能であると仮定します
|
|
171
171
|
// const factoryAddress = '...';
|
|
172
172
|
// burnExistingTokens(factoryAddress);
|
|
173
173
|
```
|
|
174
174
|
|
|
175
175
|
## まとめ
|
|
176
176
|
|
|
177
|
-
|
|
177
|
+
このガイドでは、ファンジブルトークンを管理するための完全なライフサイクル、つまりファクトリーの作成、新しいトークンのミント、そして供給量を減らすためのバーンについて学びました。これらの強力なプリミティブにより、OCAP プラットフォーム上で洗練された経済システムを構築できます。
|
|
178
178
|
|
|
179
|
-
|
|
179
|
+
トークンの作成方法を学んだので、次の論理的なステップはそれらを移動させる方法を学ぶことです。[トークンとNFTの転送](./how-to-guides-transfer-tokens-and-nfts.md)ガイドに進み、その方法を確認してください。
|