@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.
Files changed (92) hide show
  1. package/README.md +76 -80
  2. package/dist/report.html +1 -1
  3. package/docs/_sidebar.md +22 -0
  4. package/docs/api-reference-client-methods.ja.md +229 -0
  5. package/docs/api-reference-client-methods.md +229 -0
  6. package/docs/api-reference-client-methods.zh-TW.md +229 -0
  7. package/docs/api-reference-client-methods.zh.md +229 -0
  8. package/docs/api-reference-data-types.ja.md +482 -0
  9. package/docs/api-reference-data-types.md +482 -0
  10. package/docs/api-reference-data-types.zh-TW.md +482 -0
  11. package/docs/api-reference-data-types.zh.md +482 -0
  12. package/docs/api-reference-low-level-api.ja.md +228 -0
  13. package/docs/api-reference-low-level-api.md +228 -0
  14. package/docs/api-reference-low-level-api.zh-TW.md +228 -0
  15. package/docs/api-reference-low-level-api.zh.md +228 -0
  16. package/docs/api-reference-query-mutation-methods.ja.md +814 -0
  17. package/docs/api-reference-query-mutation-methods.md +814 -0
  18. package/docs/api-reference-query-mutation-methods.zh-TW.md +814 -0
  19. package/docs/api-reference-query-mutation-methods.zh.md +814 -0
  20. package/docs/api-reference-transaction-helpers.ja.md +649 -0
  21. package/docs/api-reference-transaction-helpers.md +649 -0
  22. package/docs/api-reference-transaction-helpers.zh-TW.md +649 -0
  23. package/docs/api-reference-transaction-helpers.zh.md +649 -0
  24. package/docs/api-reference.ja.md +23 -0
  25. package/docs/api-reference.md +23 -0
  26. package/docs/api-reference.zh-TW.md +23 -0
  27. package/docs/api-reference.zh.md +23 -0
  28. package/docs/core-concepts-client-architecture.ja.md +102 -0
  29. package/docs/core-concepts-client-architecture.md +102 -0
  30. package/docs/core-concepts-client-architecture.zh-TW.md +102 -0
  31. package/docs/core-concepts-client-architecture.zh.md +102 -0
  32. package/docs/core-concepts-event-subscriptions.ja.md +123 -0
  33. package/docs/core-concepts-event-subscriptions.md +123 -0
  34. package/docs/core-concepts-event-subscriptions.zh-TW.md +123 -0
  35. package/docs/core-concepts-event-subscriptions.zh.md +123 -0
  36. package/docs/core-concepts-gas-payment.ja.md +111 -0
  37. package/docs/core-concepts-gas-payment.md +111 -0
  38. package/docs/core-concepts-gas-payment.zh-TW.md +111 -0
  39. package/docs/core-concepts-gas-payment.zh.md +111 -0
  40. package/docs/core-concepts-transaction-lifecycle.ja.md +183 -0
  41. package/docs/core-concepts-transaction-lifecycle.md +183 -0
  42. package/docs/core-concepts-transaction-lifecycle.zh-TW.md +183 -0
  43. package/docs/core-concepts-transaction-lifecycle.zh.md +183 -0
  44. package/docs/core-concepts.ja.md +22 -0
  45. package/docs/core-concepts.md +22 -0
  46. package/docs/core-concepts.zh-TW.md +22 -0
  47. package/docs/core-concepts.zh.md +22 -0
  48. package/docs/getting-started-basic-usage.ja.md +87 -0
  49. package/docs/getting-started-basic-usage.md +87 -0
  50. package/docs/getting-started-basic-usage.zh-TW.md +87 -0
  51. package/docs/getting-started-basic-usage.zh.md +87 -0
  52. package/docs/getting-started-installation.ja.md +60 -0
  53. package/docs/getting-started-installation.md +60 -0
  54. package/docs/getting-started-installation.zh-TW.md +60 -0
  55. package/docs/getting-started-installation.zh.md +60 -0
  56. package/docs/getting-started.ja.md +16 -0
  57. package/docs/getting-started.md +16 -0
  58. package/docs/getting-started.zh-TW.md +16 -0
  59. package/docs/getting-started.zh.md +17 -0
  60. package/docs/how-to-guides-delegate-permissions.ja.md +167 -0
  61. package/docs/how-to-guides-delegate-permissions.md +167 -0
  62. package/docs/how-to-guides-delegate-permissions.zh-TW.md +167 -0
  63. package/docs/how-to-guides-delegate-permissions.zh.md +166 -0
  64. package/docs/how-to-guides-manage-accounts.ja.md +73 -0
  65. package/docs/how-to-guides-manage-accounts.md +73 -0
  66. package/docs/how-to-guides-manage-accounts.zh-TW.md +73 -0
  67. package/docs/how-to-guides-manage-accounts.zh.md +73 -0
  68. package/docs/how-to-guides-manage-assets.ja.md +255 -0
  69. package/docs/how-to-guides-manage-assets.md +255 -0
  70. package/docs/how-to-guides-manage-assets.zh-TW.md +255 -0
  71. package/docs/how-to-guides-manage-assets.zh.md +255 -0
  72. package/docs/how-to-guides-manage-tokens.ja.md +179 -0
  73. package/docs/how-to-guides-manage-tokens.md +179 -0
  74. package/docs/how-to-guides-manage-tokens.zh-TW.md +179 -0
  75. package/docs/how-to-guides-manage-tokens.zh.md +179 -0
  76. package/docs/how-to-guides-stake-tokens-and-assets.ja.md +205 -0
  77. package/docs/how-to-guides-stake-tokens-and-assets.md +205 -0
  78. package/docs/how-to-guides-stake-tokens-and-assets.zh-TW.md +205 -0
  79. package/docs/how-to-guides-stake-tokens-and-assets.zh.md +205 -0
  80. package/docs/how-to-guides-transfer-tokens-and-nfts.ja.md +179 -0
  81. package/docs/how-to-guides-transfer-tokens-and-nfts.md +179 -0
  82. package/docs/how-to-guides-transfer-tokens-and-nfts.zh-TW.md +179 -0
  83. package/docs/how-to-guides-transfer-tokens-and-nfts.zh.md +179 -0
  84. package/docs/how-to-guides.ja.md +27 -0
  85. package/docs/how-to-guides.md +27 -0
  86. package/docs/how-to-guides.zh-TW.md +27 -0
  87. package/docs/how-to-guides.zh.md +27 -0
  88. package/docs/overview.ja.md +70 -0
  89. package/docs/overview.md +70 -0
  90. package/docs/overview.zh-TW.md +70 -0
  91. package/docs/overview.zh.md +70 -0
  92. package/package.json +14 -14
@@ -0,0 +1,73 @@
1
+ # 管理帳戶
2
+
3
+ 在由 OCAP 驅動的區塊鏈上,帳戶基本上是與一個地址相關聯的狀態,由一對加密金鑰(一個公鑰和一個私鑰)控制。一個需要理解的關鍵概念是,帳戶是隱式創建的。一個帳戶只要收到第一筆傳入交易(例如代幣或資產轉移),就正式存在於鏈上。沒有明確的 `createAccount` 交易。
4
+
5
+ 本指南著重於一個關鍵的帳戶管理操作:將帳戶遷移到一組新的金鑰。這是一項重要的安全功能,讓您可以在不改變帳戶地址、餘額或資產的情況下,變更帳戶的所有權。
6
+
7
+ ## 將帳戶遷移至新金鑰
8
+
9
+ `migrateAccount` 函數可讓您將現有帳戶地址與新的公鑰關聯。這在幾種情況下很有用,例如:
10
+
11
+ - **金鑰洩露**:如果您懷疑您的私鑰已外洩,您可以將帳戶遷移到一個新的、安全的金鑰對,以防止未經授權的存取。
12
+ - **升級安全性**:您可能希望從較舊的金鑰類型遷移到更新、更安全的金鑰類型。
13
+
14
+ 此操作有效地轉移了帳戶的控制權,同時保留了其在區塊鏈上的歷史和狀態。
15
+
16
+ ### 參數
17
+
18
+ <x-field-group>
19
+ <x-field data-name="from" data-type="WalletObject" data-required="true">
20
+ <x-field-desc markdown>代表正在遷移的目前帳戶的錢包物件。此錢包必須簽署交易以證明所有權。</x-field-desc>
21
+ </x-field>
22
+ <x-field data-name="to" data-type="WalletObject" data-required="true">
23
+ <x-field-desc markdown>控制權將轉移至的新錢包物件。來自此錢包的公鑰將成為該帳戶地址的新權限。</x-field-desc>
24
+ </x-field>
25
+ </x-field-group>
26
+
27
+ ### 返回值
28
+
29
+ `migrateAccount` 方法返回一個 Promise,該 Promise 會解析為交易雜湊值(字串)。
30
+
31
+ ### 範例
32
+
33
+ 以下是如何將帳戶從舊錢包遷移到新錢包的方法。
34
+
35
+ ```javascript Migrating an Account icon=logos:javascript
36
+ import Client from '@ocap/client';
37
+ import { fromRandom } from '@ocap/wallet';
38
+
39
+ const client = new Client('https://beta.abtnetwork.io/api');
40
+
41
+ // 假設 oldWallet 是目前授權給該帳戶的錢包
42
+ const oldWallet = fromRandom();
43
+
44
+ // 創建一個具有新金鑰組的新錢包
45
+ const newWallet = fromRandom();
46
+
47
+ async function migrate() {
48
+ try {
49
+ // 在遷移之前,您通常需要為 oldWallet 的地址儲值。
50
+ // 在本範例中,我們假設它有足夠的資金來支付交易費用。
51
+ // 您可以從 https://faucet.abtnetwork.io/ 獲取測試代幣
52
+ console.log(`正在將帳戶從 ${oldWallet.address} 遷移至與 ${newWallet.address} 關聯的新金鑰`);
53
+
54
+ const hash = await client.migrateAccount({
55
+ from: oldWallet,
56
+ to: newWallet,
57
+ });
58
+
59
+ console.log('帳戶遷移交易已成功發送!');
60
+ console.log('交易雜湊:', hash);
61
+ console.log(`在此查看交易:https://beta.abtnetwork.io/explorer/txs/${hash}`);
62
+
63
+ } catch (err) {
64
+ console.error('遷移帳戶時出錯:', err);
65
+ }
66
+ }
67
+
68
+ migrate();
69
+ ```
70
+
71
+ ---
72
+
73
+ 現在您已了解如何透過遷移金鑰來保護您的帳戶,您可能想學習如何在不分享主金鑰的情況下,授予其他帳戶有限的權限。更多詳細資訊,請參閱 [委派權限](./how-to-guides-delegate-permissions.md) 指南。
@@ -0,0 +1,73 @@
1
+ # 管理账户
2
+
3
+ 在由 OCAP 支持的区块链上,账户本质上是一个与地址关联的状态,由一对加密密钥(公钥和私钥)控制。一个关键概念是,账户是隐式创建的。一旦账户收到第一笔入账交易(例如代币或资产转移),它就正式在链上存在了。没有显式的 `createAccount` 交易。
4
+
5
+ 本指南重点介绍一项关键的账户管理操作:将账户迁移到一组新密钥。这是一项至关重要的安全功能,允许您在不更改账户地址、余额或资产的情况下,变更账户的所有权。
6
+
7
+ ## 将账户迁移至新密钥
8
+
9
+ `migrateAccount` 函数允许您将现有账户地址与新公钥关联。这在以下几种场景中非常有用:
10
+
11
+ - **密钥泄露**:如果您怀疑自己的私钥已被泄露,可以将账户迁移到一个新的、安全的密钥对,以防止未经授权的访问。
12
+ - **安全升级**:您可能希望从旧类型的密钥迁移到更新、更安全的密钥。
13
+
14
+ 此操作可有效转移账户的控制权,同时保留其在区块链上的历史和状态。
15
+
16
+ ### 参数
17
+
18
+ <x-field-group>
19
+ <x-field data-name="from" data-type="WalletObject" data-required="true">
20
+ <x-field-desc markdown>代表当前正在迁移的账户的钱包对象。该钱包必须对交易进行签名以证明所有权。</x-field-desc>
21
+ </x-field>
22
+ <x-field data-name="to" data-type="WalletObject" data-required="true">
23
+ <x-field-desc markdown>将控制权转移至的新钱包对象。此钱包的公钥将成为该账户地址的新授权方。</x-field-desc>
24
+ </x-field>
25
+ </x-field-group>
26
+
27
+ ### 返回值
28
+
29
+ `migrateAccount` 方法返回一个 Promise,该 Promise 会解析为交易哈希(字符串类型)。
30
+
31
+ ### 示例
32
+
33
+ 以下是如何将账户从旧钱包迁移到新钱包的示例。
34
+
35
+ ```javascript Migrating an Account icon=logos:javascript
36
+ import Client from '@ocap/client';
37
+ import { fromRandom } from '@ocap/wallet';
38
+
39
+ const client = new Client('https://beta.abtnetwork.io/api');
40
+
41
+ // 假设 oldWallet 是当前账户的授权钱包
42
+ const oldWallet = fromRandom();
43
+
44
+ // 创建一个带有一组新密钥的新钱包
45
+ const newWallet = fromRandom();
46
+
47
+ async function migrate() {
48
+ try {
49
+ // 在迁移之前,您通常需要为 oldWallet 的地址充值。
50
+ // 在本示例中,我们假设它有足够的资金来支付交易费用。
51
+ // 您可以从 https://faucet.abtnetwork.io/ 获取测试代币
52
+ console.log(`正在将账户从 ${oldWallet.address} 迁移到与 ${newWallet.address} 关联的新密钥`);
53
+
54
+ const hash = await client.migrateAccount({
55
+ from: oldWallet,
56
+ to: newWallet,
57
+ });
58
+
59
+ console.log('账户迁移交易发送成功!');
60
+ console.log('交易哈希:', hash);
61
+ console.log(`查看交易: https://beta.abtnetwork.io/explorer/txs/${hash}`);
62
+
63
+ } catch (err) {
64
+ console.error('迁移账户时出错:', err);
65
+ }
66
+ }
67
+
68
+ migrate();
69
+ ```
70
+
71
+ ---
72
+
73
+ 现在您已了解如何通过迁移密钥来保护您的账户,您可能想学习如何在不共享主密钥的情况下,向其他账户授予有限的权限。详情请参阅[委托权限](./how-to-guides-delegate-permissions.md)指南。
@@ -0,0 +1,255 @@
1
+ # 資産 (NFT) の管理
2
+
3
+ このガイドでは、OCAP Client を使用して、資産としても知られる非代替性トークン(NFT)のライフサイクル全体を管理するための包括的なウォークスルーを提供します。新しい資産をゼロから作成し、そのプロパティを更新し、標準化されたミントのための資産ファクトリーを設立し、そのファクトリーから新しい資産を取得する方法を学びます。
4
+
5
+ ## 新しい資産の作成
6
+
7
+ `createAsset` メソッドを使用して、ブロックチェーン上にユニークでスタンドアロンな資産を作成できます。各資産には、その初期プロパティから導出されたユニークなオンチェーンアドレスが割り当てられます。
8
+
9
+ ```javascript icon=logos:javascript
10
+ const { wallet } = getWallet(); // ユーザーのウォレットオブジェクト
11
+
12
+ async function createNewAsset() {
13
+ try {
14
+ const [hash, address] = await client.createAsset({
15
+ moniker: 'My Unique Digital Artwork',
16
+ data: {
17
+ typeUrl: 'json',
18
+ value: {
19
+ description: 'A one-of-a-kind piece created by Artist X.',
20
+ imageUrl: 'https://example.com/path/to/image.png',
21
+ },
22
+ },
23
+ readonly: true,
24
+ transferrable: true,
25
+ wallet: wallet,
26
+ });
27
+
28
+ console.log(`Asset creation transaction sent: ${hash}`);
29
+ console.log(`New asset address: ${address}`);
30
+ return address;
31
+ } catch (error) {
32
+ console.error('Error creating asset:', error);
33
+ }
34
+ }
35
+
36
+ createNewAsset();
37
+ ```
38
+
39
+ ### パラメータ
40
+
41
+ <x-field-group>
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
+ </x-field-group>
54
+
55
+ ### 戻り値
56
+
57
+ トランザクションハッシュと新しい資産のオンチェーンアドレスを含む配列に解決される `Promise`。
58
+
59
+ <x-field data-name="response" data-type="Promise<[string, string]>" data-desc="[トランザクションハッシュ, 資産アドレス]"></x-field>
60
+
61
+ ---
62
+
63
+ ## 既存の資産の更新
64
+
65
+ 資産が `readonly: false` で作成された場合、`updateAsset` メソッドを使用してその `moniker` および `data` フィールドを変更できます。資産はそのユニークなアドレスによって識別されます。
66
+
67
+ ```javascript icon=logos:javascript
68
+ const { wallet } = getWallet(); // ユーザーのウォレットオブジェクト
69
+ const assetAddress = 'z362...'; // 更新する資産のアドレス
70
+
71
+ async function updateExistingAsset() {
72
+ try {
73
+ const hash = await client.updateAsset({
74
+ address: assetAddress,
75
+ moniker: 'My Updated Digital Artwork',
76
+ data: {
77
+ typeUrl: 'json',
78
+ value: {
79
+ description: 'An updated description for my unique piece.',
80
+ imageUrl: 'https://example.com/path/to/new_image.png',
81
+ },
82
+ },
83
+ wallet: wallet,
84
+ });
85
+
86
+ console.log(`Asset update transaction sent: ${hash}`);
87
+ } catch (error) {
88
+ console.error('Error updating asset:', error);
89
+ }
90
+ }
91
+
92
+ updateExistingAsset();
93
+ ```
94
+
95
+ ### パラメータ
96
+
97
+ <x-field-group>
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
+ </x-field-group>
103
+
104
+ ### 戻り値
105
+
106
+ トランザクションハッシュに解決される `Promise`。
107
+
108
+ <x-field data-name="response" data-type="Promise<string>" data-desc="トランザクションハッシュ"></x-field>
109
+
110
+ ---
111
+
112
+ ## 資産ファクトリーの作成
113
+
114
+ 資産ファクトリーは、複数の類似した資産を作成するためのテンプレートです。新しい資産をミントするための構造、ルール、ロジックを定義し、それぞれを個別に作成するよりも効率的です。これは、イベントチケット、証明書、または収集品の発行などのユースケースに最適です。
115
+
116
+ ```javascript icon=logos:javascript
117
+ const { wallet } = getWallet(); // ファクトリー所有者のウォレット
118
+
119
+ const factoryDefinition = {
120
+ name: 'Conference Ticket Factory',
121
+ description: 'Mints tickets for the 2024 Tech Conference.',
122
+ limit: 1000, // 最大1000枚のチケットがミント可能
123
+ input: {
124
+ // 資産をミントするために必要なデータを定義
125
+ type: 'object',
126
+ properties: {
127
+ attendeeName: { type: 'string' },
128
+ ticketType: { type: 'string', enum: ['General', 'VIP'] },
129
+ },
130
+ },
131
+ output: {
132
+ // ミントされる資産の構造を定義
133
+ moniker: 'Ticket for {{attendeeName}}',
134
+ description: '{{ticketType}} admission for the 2024 Tech Conference.',
135
+ transferrable: false, // チケットは譲渡不可
136
+ },
137
+ hooks: [],
138
+ };
139
+
140
+ async function createFactory() {
141
+ try {
142
+ const [hash, factoryAddress] = await client.createAssetFactory({
143
+ factory: factoryDefinition,
144
+ wallet: wallet,
145
+ });
146
+
147
+ console.log(`Factory creation transaction sent: ${hash}`);
148
+ console.log(`New factory address: ${factoryAddress}`);
149
+ } catch (error) {
150
+ console.error('Error creating asset factory:', error);
151
+ }
152
+ }
153
+
154
+ createFactory();
155
+ ```
156
+
157
+ ### パラメータ
158
+
159
+ <x-field-group>
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="ファクトリーの名前。"></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
+ </x-field>
170
+ <x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="ファクトリー所有者のウォレットオブジェクト。"></x-field>
171
+ </x-field-group>
172
+
173
+
174
+ ### 戻り値
175
+
176
+ トランザクションハッシュと新しいファクトリーのオンチェーンアドレスを含む配列に解決される `Promise`。
177
+
178
+ <x-field data-name="response" data-type="Promise<[string, string]>" data-desc="[トランザクションハッシュ, ファクトリーアドレス]"></x-field>
179
+
180
+ ---
181
+
182
+ ## ファクトリーからの資産の取得
183
+
184
+ ファクトリーから資産を取得するのは2段階のプロセスです。まず、ミントデータを準備し、これにより作成される資産をプレビューできます。次に、トランザクションをブロックチェーンに送信して、公式に資産を取得します。
185
+
186
+ この分離は、ユーザーが最終的なトランザクションに署名して送信する前に、受け取るものをアプリケーションが表示できるため便利です。
187
+
188
+ ### ステップ1:資産データの準備
189
+
190
+ `preMintAsset` メソッドは、ファクトリーアドレスとユーザーが提供した入力を使用して、最終的な資産データを生成します。これはオフチェーンで行われ、トランザクションは不要です。
191
+
192
+ ```javascript icon=logos:javascript
193
+ const factoryAddress = 'z2...'; // 以前作成されたファクトリーのアドレス
194
+ const { wallet: issuerWallet } = getIssuerWallet(); // ファクトリー所有者または信頼された発行者
195
+ const { wallet: userWallet } = getUserWallet(); // 新しい資産を所有するユーザー
196
+
197
+ async function prepareAssetForMinting() {
198
+ try {
199
+ const mintingData = await client.preMintAsset({
200
+ factory: factoryAddress,
201
+ inputs: {
202
+ attendeeName: 'John Doe',
203
+ ticketType: 'VIP',
204
+ },
205
+ owner: userWallet.address,
206
+ wallet: issuerWallet,
207
+ });
208
+
209
+ console.log('Prepared asset data for minting:', mintingData);
210
+ return mintingData;
211
+ } catch (error) {
212
+ console.error('Error preparing asset:', error);
213
+ }
214
+ }
215
+ ```
216
+
217
+ ### ステップ2:トランザクションの送信
218
+
219
+ ミントデータが準備されると、ユーザー(将来の資産所有者)が `acquireAsset` トランザクションに署名して送信します。`preMintAsset` からの `itx` オブジェクトがペイロードとして使用されます。
220
+
221
+ ```javascript icon=logos:javascript
222
+ async function acquireNewAsset() {
223
+ // まず、ステップ1からミントデータを取得
224
+ const itx = await prepareAssetForMinting();
225
+ if (!itx) return;
226
+
227
+ try {
228
+ const hash = await client.acquireAsset({
229
+ itx: itx,
230
+ wallet: userWallet, // ユーザーのウォレットがトランザクションに署名
231
+ });
232
+
233
+ console.log(`Asset acquisition transaction sent: ${hash}`);
234
+ console.log(`New asset will be available at address: ${itx.address}`);
235
+ } catch (error) {
236
+ console.error('Error acquiring asset:', error);
237
+ }
238
+ }
239
+
240
+ acquireNewAsset();
241
+ ```
242
+
243
+ ### `acquireAsset` のパラメータ
244
+
245
+ <x-field-group>
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
+ </x-field-group>
250
+
251
+ ### 戻り値
252
+
253
+ `acquireAsset` 操作のトランザクションハッシュに解決される `Promise`。
254
+
255
+ <x-field data-name="response" data-type="Promise<string>" data-desc="トランザクションハッシュ"></x-field>
@@ -0,0 +1,255 @@
1
+ # Manage Assets (NFTs)
2
+
3
+ This guide provides a comprehensive walkthrough of managing the entire lifecycle of Non-Fungible Tokens (NFTs), also known as assets, using the OCAP Client. You will learn how to create new assets from scratch, update their properties, establish an asset factory for standardized minting, and acquire new assets from that factory.
4
+
5
+ ## Create a New Asset
6
+
7
+ You can create a unique, standalone asset on the blockchain using the `createAsset` method. Each asset is assigned a unique on-chain address derived from its initial properties.
8
+
9
+ ```javascript icon=logos:javascript
10
+ const { wallet } = getWallet(); // User's wallet object
11
+
12
+ async function createNewAsset() {
13
+ try {
14
+ const [hash, address] = await client.createAsset({
15
+ moniker: 'My Unique Digital Artwork',
16
+ data: {
17
+ typeUrl: 'json',
18
+ value: {
19
+ description: 'A one-of-a-kind piece created by Artist X.',
20
+ imageUrl: 'https://example.com/path/to/image.png',
21
+ },
22
+ },
23
+ readonly: true,
24
+ transferrable: true,
25
+ wallet: wallet,
26
+ });
27
+
28
+ console.log(`Asset creation transaction sent: ${hash}`);
29
+ console.log(`New asset address: ${address}`);
30
+ return address;
31
+ } catch (error) {
32
+ console.error('Error creating asset:', error);
33
+ }
34
+ }
35
+
36
+ createNewAsset();
37
+ ```
38
+
39
+ ### Parameters
40
+
41
+ <x-field-group>
42
+ <x-field data-name="moniker" data-type="string" data-required="true" data-desc="The name of the asset."></x-field>
43
+ <x-field data-name="parent" data-type="string" data-default="''" data-required="false" data-desc="The address of a parent asset, if any."></x-field>
44
+ <x-field data-name="data" data-type="object" data-required="true" data-desc="The data payload for the asset, which must include a typeUrl and value."></x-field>
45
+ <x-field data-name="readonly" data-type="boolean" data-default="false" data-required="false" data-desc="If true, the asset cannot be updated after creation."></x-field>
46
+ <x-field data-name="transferrable" data-type="boolean" data-default="true" data-required="false" data-desc="If true, the asset can be transferred to another account."></x-field>
47
+ <x-field data-name="ttl" data-type="number" data-default="0" data-required="false" data-desc="Time-to-live in seconds after the asset's first consumption."></x-field>
48
+ <x-field data-name="display" data-type="object" data-required="false" data-desc="Object containing display information for the asset."></x-field>
49
+ <x-field data-name="endpoint" data-type="object" data-required="false" data-desc="Object containing endpoint details for the asset."></x-field>
50
+ <x-field data-name="tags" data-type="string[]" data-default="[]" data-required="false" data-desc="An array of strings to categorize the asset."></x-field>
51
+ <x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="The wallet object of the asset's initial owner."></x-field>
52
+ <x-field data-name="delegator" data-type="string" data-default="''" data-required="false" data-desc="The address of the account that authorized this transaction via delegation."></x-field>
53
+ </x-field-group>
54
+
55
+ ### Returns
56
+
57
+ A `Promise` that resolves to an array containing the transaction hash and the new asset's on-chain address.
58
+
59
+ <x-field data-name="response" data-type="Promise<[string, string]>" data-desc="[transactionHash, assetAddress]"></x-field>
60
+
61
+ ---
62
+
63
+ ## Update an Existing Asset
64
+
65
+ If an asset was created with `readonly: false`, you can modify its `moniker` and `data` fields using the `updateAsset` method. The asset is identified by its unique address.
66
+
67
+ ```javascript icon=logos:javascript
68
+ const { wallet } = getWallet(); // User's wallet object
69
+ const assetAddress = 'z362...'; // Address of the asset to update
70
+
71
+ async function updateExistingAsset() {
72
+ try {
73
+ const hash = await client.updateAsset({
74
+ address: assetAddress,
75
+ moniker: 'My Updated Digital Artwork',
76
+ data: {
77
+ typeUrl: 'json',
78
+ value: {
79
+ description: 'An updated description for my unique piece.',
80
+ imageUrl: 'https://example.com/path/to/new_image.png',
81
+ },
82
+ },
83
+ wallet: wallet,
84
+ });
85
+
86
+ console.log(`Asset update transaction sent: ${hash}`);
87
+ } catch (error) {
88
+ console.error('Error updating asset:', error);
89
+ }
90
+ }
91
+
92
+ updateExistingAsset();
93
+ ```
94
+
95
+ ### Parameters
96
+
97
+ <x-field-group>
98
+ <x-field data-name="address" data-type="string" data-required="true" data-desc="The on-chain address of the asset to update."></x-field>
99
+ <x-field data-name="moniker" data-type="string" data-required="true" data-desc="The new name for the asset."></x-field>
100
+ <x-field data-name="data" data-type="object" data-required="true" data-desc="The updated data payload for the asset."></x-field>
101
+ <x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="The wallet object of the current asset owner."></x-field>
102
+ </x-field-group>
103
+
104
+ ### Returns
105
+
106
+ A `Promise` that resolves to the transaction hash.
107
+
108
+ <x-field data-name="response" data-type="Promise<string>" data-desc="transactionHash"></x-field>
109
+
110
+ ---
111
+
112
+ ## Create an Asset Factory
113
+
114
+ An Asset Factory is a template for creating multiple, similar assets. It defines the structure, rules, and logic for minting new assets, which is more efficient than creating each one individually. This is ideal for use cases like issuing event tickets, certificates, or collectibles.
115
+
116
+ ```javascript icon=logos:javascript
117
+ const { wallet } = getWallet(); // Factory owner's wallet
118
+
119
+ const factoryDefinition = {
120
+ name: 'Conference Ticket Factory',
121
+ description: 'Mints tickets for the 2024 Tech Conference.',
122
+ limit: 1000, // Max 1000 tickets can be minted
123
+ input: {
124
+ // Defines what data is required to mint an asset
125
+ type: 'object',
126
+ properties: {
127
+ attendeeName: { type: 'string' },
128
+ ticketType: { type: 'string', enum: ['General', 'VIP'] },
129
+ },
130
+ },
131
+ output: {
132
+ // Defines the structure of the minted asset
133
+ moniker: 'Ticket for {{attendeeName}}',
134
+ description: '{{ticketType}} admission for the 2024 Tech Conference.',
135
+ transferrable: false, // Tickets are non-transferrable
136
+ },
137
+ hooks: [],
138
+ };
139
+
140
+ async function createFactory() {
141
+ try {
142
+ const [hash, factoryAddress] = await client.createAssetFactory({
143
+ factory: factoryDefinition,
144
+ wallet: wallet,
145
+ });
146
+
147
+ console.log(`Factory creation transaction sent: ${hash}`);
148
+ console.log(`New factory address: ${factoryAddress}`);
149
+ } catch (error) {
150
+ console.error('Error creating asset factory:', error);
151
+ }
152
+ }
153
+
154
+ createFactory();
155
+ ```
156
+
157
+ ### Parameters
158
+
159
+ <x-field-group>
160
+ <x-field data-name="factory" data-type="object" data-required="true" data-desc="An object defining the factory's properties and minting logic.">
161
+ <x-field data-name="name" data-type="string" data-required="true" data-desc="Name of the factory."></x-field>
162
+ <x-field data-name="description" data-type="string" data-required="true" data-desc="Description of the factory's purpose."></x-field>
163
+ <x-field data-name="limit" data-type="number" data-default="0" data-required="false" data-desc="The maximum number of assets that can be minted from this factory. 0 means unlimited."></x-field>
164
+ <x-field data-name="trustedIssuers" data-type="string[]" data-required="false" data-desc="A list of account addresses authorized to mint from this factory."></x-field>
165
+ <x-field data-name="input" data-type="object" data-required="true" data-desc="Defines the required input data for minting an asset."></x-field>
166
+ <x-field data-name="output" data-type="object" data-required="true" data-desc="Defines the structure and properties of the asset that will be minted."></x-field>
167
+ <x-field data-name="hooks" data-type="object[]" data-required="false" data-desc="A list of hooks to execute during the minting process."></x-field>
168
+ <x-field data-name="data" data-type="object" data-required="false" data-desc="Additional arbitrary data to store with the factory."></x-field>
169
+ </x-field>
170
+ <x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="The wallet object of the factory's owner."></x-field>
171
+ </x-field-group>
172
+
173
+
174
+ ### Returns
175
+
176
+ A `Promise` that resolves to an array containing the transaction hash and the new factory's on-chain address.
177
+
178
+ <x-field data-name="response" data-type="Promise<[string, string]>" data-desc="[transactionHash, factoryAddress]"></x-field>
179
+
180
+ ---
181
+
182
+ ## Acquire an Asset from a Factory
183
+
184
+ Acquiring an asset from a factory is a two-step process. First, you prepare the minting data, which allows you to preview the asset that will be created. Second, you submit the transaction to the blockchain to officially acquire the asset.
185
+
186
+ This separation is useful because it allows an application to show a user what they are about to receive before they sign and submit the final transaction.
187
+
188
+ ### Step 1: Prepare the Asset Data
189
+
190
+ The `preMintAsset` method takes the factory address and user-provided inputs to generate the final asset data. This happens off-chain and does not require a transaction.
191
+
192
+ ```javascript icon=logos:javascript
193
+ const factoryAddress = 'z2...'; // Address of the factory created previously
194
+ const { wallet: issuerWallet } = getIssuerWallet(); // The factory owner or a trusted issuer
195
+ const { wallet: userWallet } = getUserWallet(); // The user who will own the new asset
196
+
197
+ async function prepareAssetForMinting() {
198
+ try {
199
+ const mintingData = await client.preMintAsset({
200
+ factory: factoryAddress,
201
+ inputs: {
202
+ attendeeName: 'John Doe',
203
+ ticketType: 'VIP',
204
+ },
205
+ owner: userWallet.address,
206
+ wallet: issuerWallet,
207
+ });
208
+
209
+ console.log('Prepared asset data for minting:', mintingData);
210
+ return mintingData;
211
+ } catch (error) {
212
+ console.error('Error preparing asset:', error);
213
+ }
214
+ }
215
+ ```
216
+
217
+ ### Step 2: Send the Transaction
218
+
219
+ Once the minting data is prepared, the user (the future asset owner) signs and sends the `acquireAsset` transaction. The `itx` object from `preMintAsset` is used as the payload.
220
+
221
+ ```javascript icon=logos:javascript
222
+ async function acquireNewAsset() {
223
+ // First, get the minting data from Step 1
224
+ const itx = await prepareAssetForMinting();
225
+ if (!itx) return;
226
+
227
+ try {
228
+ const hash = await client.acquireAsset({
229
+ itx: itx,
230
+ wallet: userWallet, // The user's wallet signs the transaction
231
+ });
232
+
233
+ console.log(`Asset acquisition transaction sent: ${hash}`);
234
+ console.log(`New asset will be available at address: ${itx.address}`);
235
+ } catch (error) {
236
+ console.error('Error acquiring asset:', error);
237
+ }
238
+ }
239
+
240
+ acquireNewAsset();
241
+ ```
242
+
243
+ ### Parameters for `acquireAsset`
244
+
245
+ <x-field-group>
246
+ <x-field data-name="itx" data-type="object" data-required="true" data-desc="The inner transaction object returned from the `preMintAsset` method."></x-field>
247
+ <x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="The wallet of the user who is acquiring the asset."></x-field>
248
+ <x-field data-name="delegator" data-type="string" data-default="''" data-required="false" data-desc="The address of the account that authorized this transaction via delegation."></x-field>
249
+ </x-field-group>
250
+
251
+ ### Returns
252
+
253
+ A `Promise` that resolves to the transaction hash for the `acquireAsset` operation.
254
+
255
+ <x-field data-name="response" data-type="Promise<string>" data-desc="transactionHash"></x-field>