@ocap/client 1.25.6 → 1.26.1
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 +16 -16
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# 管理資產 (NFT)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
本指南將全面介紹如何使用 OCAP Client 管理非同質化代幣 (NFT) 的整個生命週期,NFT 也稱為資產。您將學習如何從頭開始建立新資產、更新其屬性、建立資產工廠以進行標準化鑄造,以及從該工廠獲取新資產。
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 建立新資產
|
|
6
6
|
|
|
7
|
-
您可以使用 `createAsset`
|
|
7
|
+
您可以使用 `createAsset` 方法在區塊鏈上建立一個獨特的獨立資產。每個資產都會被分配一個獨一無二的鏈上地址,該地址由其初始屬性衍生而來。
|
|
8
8
|
|
|
9
9
|
```javascript icon=logos:javascript
|
|
10
10
|
const { wallet } = getWallet(); // 使用者的錢包物件
|
|
@@ -12,11 +12,11 @@ const { wallet } = getWallet(); // 使用者的錢包物件
|
|
|
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
|
|
|
@@ -42,8 +42,8 @@ createNewAsset();
|
|
|
42
42
|
<x-field data-name="moniker" data-type="string" data-required="true" data-desc="資產的名稱。"></x-field>
|
|
43
43
|
<x-field data-name="parent" data-type="string" data-default="''" data-required="false" data-desc="父資產的地址(如果有的話)。"></x-field>
|
|
44
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
|
|
46
|
-
<x-field data-name="transferrable" data-type="boolean" data-default="true" data-required="false" data-desc="若為 true
|
|
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
47
|
<x-field data-name="ttl" data-type="number" data-default="0" data-required="false" data-desc="資產首次消費後的存活時間(以秒為單位)。"></x-field>
|
|
48
48
|
<x-field data-name="display" data-type="object" data-required="false" data-desc="包含資產顯示資訊的物件。"></x-field>
|
|
49
49
|
<x-field data-name="endpoint" data-type="object" data-required="false" data-desc="包含資產端點詳細資訊的物件。"></x-field>
|
|
@@ -62,7 +62,7 @@ createNewAsset();
|
|
|
62
62
|
|
|
63
63
|
## 更新現有資產
|
|
64
64
|
|
|
65
|
-
|
|
65
|
+
如果資產在建立時設定為 `readonly: false`,您可以使用 `updateAsset` 方法修改其 `moniker` 和 `data` 欄位。資產透過其唯一的地址來識別。
|
|
66
66
|
|
|
67
67
|
```javascript icon=logos:javascript
|
|
68
68
|
const { wallet } = getWallet(); // 使用者的錢包物件
|
|
@@ -72,20 +72,20 @@ 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
|
|
|
@@ -97,8 +97,8 @@ updateExistingAsset();
|
|
|
97
97
|
<x-field-group>
|
|
98
98
|
<x-field data-name="address" data-type="string" data-required="true" data-desc="要更新的資產的鏈上地址。"></x-field>
|
|
99
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="
|
|
101
|
-
<x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="
|
|
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
|
### 返回值
|
|
@@ -109,16 +109,16 @@ updateExistingAsset();
|
|
|
109
109
|
|
|
110
110
|
---
|
|
111
111
|
|
|
112
|
-
##
|
|
112
|
+
## 建立資產工廠
|
|
113
113
|
|
|
114
|
-
|
|
114
|
+
資產工廠是建立多個相似資產的範本。它定義了鑄造新資產的結構、規則和邏輯,比單獨建立每個資產更有效率。這對於發行活動門票、證書或收藏品等使用場景非常理想。
|
|
115
115
|
|
|
116
116
|
```javascript icon=logos:javascript
|
|
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
|
// 定義鑄造資產所需的資料
|
|
@@ -130,8 +130,8 @@ const factoryDefinition = {
|
|
|
130
130
|
},
|
|
131
131
|
output: {
|
|
132
132
|
// 定義鑄造資產的結構
|
|
133
|
-
moniker: '{{attendeeName}}
|
|
134
|
-
description: '
|
|
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
|
|
|
@@ -160,11 +160,11 @@ createFactory();
|
|
|
160
160
|
<x-field data-name="factory" data-type="object" data-required="true" data-desc="一個定義工廠屬性和鑄造邏輯的物件。">
|
|
161
161
|
<x-field data-name="name" data-type="string" data-required="true" data-desc="工廠的名稱。"></x-field>
|
|
162
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="
|
|
163
|
+
<x-field data-name="limit" data-type="number" data-default="0" data-required="false" data-desc="可從此工廠鑄造的資產最大數量。0 表示無限制。"></x-field>
|
|
164
164
|
<x-field data-name="trustedIssuers" data-type="string[]" data-required="false" data-desc="授權從此工廠鑄造的帳戶地址列表。"></x-field>
|
|
165
165
|
<x-field data-name="input" data-type="object" data-required="true" data-desc="定義鑄造資產所需的輸入資料。"></x-field>
|
|
166
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="
|
|
167
|
+
<x-field data-name="hooks" data-type="object[]" data-required="false" data-desc="在鑄造過程中執行的掛鉤列表。"></x-field>
|
|
168
168
|
<x-field data-name="data" data-type="object" data-required="false" data-desc="與工廠一起儲存的額外任意資料。"></x-field>
|
|
169
169
|
</x-field>
|
|
170
170
|
<x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="工廠擁有者的錢包物件。"></x-field>
|
|
@@ -181,16 +181,16 @@ createFactory();
|
|
|
181
181
|
|
|
182
182
|
## 從工廠獲取資產
|
|
183
183
|
|
|
184
|
-
|
|
184
|
+
從工廠獲取資產是一個兩步驟的過程。首先,您需要準備鑄造資料,這讓您可以預覽將要建立的資產。其次,您將交易提交到區塊鏈以正式獲取資產。
|
|
185
185
|
|
|
186
|
-
|
|
186
|
+
這種分離很有用,因為它允許應用程式在使用者簽署並提交最終交易之前,向使用者展示他們將要收到的內容。
|
|
187
187
|
|
|
188
188
|
### 步驟 1:準備資產資料
|
|
189
189
|
|
|
190
|
-
`preMintAsset`
|
|
190
|
+
`preMintAsset` 方法會接收工廠地址和使用者提供的輸入,以產生最終的資產資料。此過程在鏈下發生,不需要交易。
|
|
191
191
|
|
|
192
192
|
```javascript icon=logos:javascript
|
|
193
|
-
const factoryAddress = 'z2...'; //
|
|
193
|
+
const factoryAddress = 'z2...'; // 先前建立的工廠地址
|
|
194
194
|
const { wallet: issuerWallet } = getIssuerWallet(); // 工廠擁有者或受信任的發行者
|
|
195
195
|
const { wallet: userWallet } = getUserWallet(); // 將擁有新資產的使用者
|
|
196
196
|
|
|
@@ -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() {
|
|
@@ -227,13 +227,13 @@ async function acquireNewAsset() {
|
|
|
227
227
|
try {
|
|
228
228
|
const hash = await client.acquireAsset({
|
|
229
229
|
itx: itx,
|
|
230
|
-
wallet: userWallet, //
|
|
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
|
|
|
@@ -252,4 +252,81 @@ acquireNewAsset();
|
|
|
252
252
|
|
|
253
253
|
一個 `Promise`,會解析為 `acquireAsset` 操作的交易雜湊值。
|
|
254
254
|
|
|
255
|
+
<x-field data-name="response" data-type="Promise<string>" data-desc="transactionHash"></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
|
+
|
|
255
332
|
<x-field data-name="response" data-type="Promise<string>" data-desc="transactionHash"></x-field>
|