@ckb-ccc/spore 0.1.0-alpha.2

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 (223) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +61 -0
  3. package/dist/advanced.d.ts +5 -0
  4. package/dist/advanced.d.ts.map +1 -0
  5. package/dist/advanced.js +4 -0
  6. package/dist/cluster/index.d.ts +56 -0
  7. package/dist/cluster/index.d.ts.map +1 -0
  8. package/dist/cluster/index.js +96 -0
  9. package/dist/cobuild/index.d.ts +13 -0
  10. package/dist/cobuild/index.d.ts.map +1 -0
  11. package/dist/cobuild/index.js +168 -0
  12. package/dist/codec/base.d.ts +6 -0
  13. package/dist/codec/base.d.ts.map +1 -0
  14. package/dist/codec/base.js +10 -0
  15. package/dist/codec/cluster.d.ts +41 -0
  16. package/dist/codec/cluster.d.ts.map +1 -0
  17. package/dist/codec/cluster.js +73 -0
  18. package/dist/codec/cobuild/buildingPacket.d.ts +465 -0
  19. package/dist/codec/cobuild/buildingPacket.d.ts.map +1 -0
  20. package/dist/codec/cobuild/buildingPacket.js +44 -0
  21. package/dist/codec/cobuild/index.d.ts +4 -0
  22. package/dist/codec/cobuild/index.d.ts.map +1 -0
  23. package/dist/codec/cobuild/index.js +3 -0
  24. package/dist/codec/cobuild/sporeAction.d.ts +314 -0
  25. package/dist/codec/cobuild/sporeAction.d.ts.map +1 -0
  26. package/dist/codec/cobuild/sporeAction.js +104 -0
  27. package/dist/codec/cobuild/witnessLayout.d.ts +43 -0
  28. package/dist/codec/cobuild/witnessLayout.d.ts.map +1 -0
  29. package/dist/codec/cobuild/witnessLayout.js +27 -0
  30. package/dist/codec/index.d.ts +4 -0
  31. package/dist/codec/index.d.ts.map +1 -0
  32. package/dist/codec/index.js +3 -0
  33. package/dist/codec/spore.d.ts +15 -0
  34. package/dist/codec/spore.d.ts.map +1 -0
  35. package/dist/codec/spore.js +24 -0
  36. package/dist/dob/api/decode.d.ts +6 -0
  37. package/dist/dob/api/decode.d.ts.map +1 -0
  38. package/dist/dob/api/decode.js +44 -0
  39. package/dist/dob/api/encode.d.ts +5 -0
  40. package/dist/dob/api/encode.d.ts.map +1 -0
  41. package/dist/dob/api/encode.js +77 -0
  42. package/dist/dob/api/index.d.ts +3 -0
  43. package/dist/dob/api/index.d.ts.map +1 -0
  44. package/dist/dob/api/index.js +2 -0
  45. package/dist/dob/config/index.d.ts +2 -0
  46. package/dist/dob/config/index.d.ts.map +1 -0
  47. package/dist/dob/config/index.js +1 -0
  48. package/dist/dob/config/predefined.d.ts +8 -0
  49. package/dist/dob/config/predefined.d.ts.map +1 -0
  50. package/dist/dob/config/predefined.js +59 -0
  51. package/dist/dob/helper/check.d.ts +5 -0
  52. package/dist/dob/helper/check.d.ts.map +1 -0
  53. package/dist/dob/helper/check.js +75 -0
  54. package/dist/dob/helper/error.d.ts +2 -0
  55. package/dist/dob/helper/error.d.ts.map +1 -0
  56. package/dist/dob/helper/error.js +40 -0
  57. package/dist/dob/helper/index.d.ts +3 -0
  58. package/dist/dob/helper/index.d.ts.map +1 -0
  59. package/dist/dob/helper/index.js +2 -0
  60. package/dist/dob/helper/object.d.ts +59 -0
  61. package/dist/dob/helper/object.d.ts.map +1 -0
  62. package/dist/dob/helper/object.js +1 -0
  63. package/dist/dob/index.d.ts +4 -0
  64. package/dist/dob/index.d.ts.map +1 -0
  65. package/dist/dob/index.js +3 -0
  66. package/dist/helper/index.d.ts +9 -0
  67. package/dist/helper/index.d.ts.map +1 -0
  68. package/dist/helper/index.js +37 -0
  69. package/dist/index.d.ts +5 -0
  70. package/dist/index.d.ts.map +1 -0
  71. package/dist/index.js +4 -0
  72. package/dist/package.json +3 -0
  73. package/dist/predefined/advanced.d.ts +3 -0
  74. package/dist/predefined/advanced.d.ts.map +1 -0
  75. package/dist/predefined/advanced.js +2 -0
  76. package/dist/predefined/index.d.ts +3 -0
  77. package/dist/predefined/index.d.ts.map +1 -0
  78. package/dist/predefined/index.js +2 -0
  79. package/dist/predefined/mainnet.advanced.d.ts +4 -0
  80. package/dist/predefined/mainnet.advanced.d.ts.map +1 -0
  81. package/dist/predefined/mainnet.advanced.js +61 -0
  82. package/dist/predefined/testnet.advanced.d.ts +4 -0
  83. package/dist/predefined/testnet.advanced.d.ts.map +1 -0
  84. package/dist/predefined/testnet.advanced.js +88 -0
  85. package/dist/predefined/types.d.ts +17 -0
  86. package/dist/predefined/types.d.ts.map +1 -0
  87. package/dist/predefined/types.js +18 -0
  88. package/dist/predefined/utils.d.ts +7 -0
  89. package/dist/predefined/utils.d.ts.map +1 -0
  90. package/dist/predefined/utils.js +26 -0
  91. package/dist/spore/advanced.d.ts +5 -0
  92. package/dist/spore/advanced.d.ts.map +1 -0
  93. package/dist/spore/advanced.js +62 -0
  94. package/dist/spore/index.d.ts +80 -0
  95. package/dist/spore/index.d.ts.map +1 -0
  96. package/dist/spore/index.js +135 -0
  97. package/dist.commonjs/advanced.d.ts +5 -0
  98. package/dist.commonjs/advanced.d.ts.map +1 -0
  99. package/dist.commonjs/advanced.js +20 -0
  100. package/dist.commonjs/cluster/index.d.ts +56 -0
  101. package/dist.commonjs/cluster/index.d.ts.map +1 -0
  102. package/dist.commonjs/cluster/index.js +102 -0
  103. package/dist.commonjs/cobuild/index.d.ts +13 -0
  104. package/dist.commonjs/cobuild/index.d.ts.map +1 -0
  105. package/dist.commonjs/cobuild/index.js +179 -0
  106. package/dist.commonjs/codec/base.d.ts +6 -0
  107. package/dist.commonjs/codec/base.d.ts.map +1 -0
  108. package/dist.commonjs/codec/base.js +13 -0
  109. package/dist.commonjs/codec/cluster.d.ts +41 -0
  110. package/dist.commonjs/codec/cluster.d.ts.map +1 -0
  111. package/dist.commonjs/codec/cluster.js +82 -0
  112. package/dist.commonjs/codec/cobuild/buildingPacket.d.ts +465 -0
  113. package/dist.commonjs/codec/cobuild/buildingPacket.d.ts.map +1 -0
  114. package/dist.commonjs/codec/cobuild/buildingPacket.js +47 -0
  115. package/dist.commonjs/codec/cobuild/index.d.ts +4 -0
  116. package/dist.commonjs/codec/cobuild/index.d.ts.map +1 -0
  117. package/dist.commonjs/codec/cobuild/index.js +19 -0
  118. package/dist.commonjs/codec/cobuild/sporeAction.d.ts +314 -0
  119. package/dist.commonjs/codec/cobuild/sporeAction.d.ts.map +1 -0
  120. package/dist.commonjs/codec/cobuild/sporeAction.js +107 -0
  121. package/dist.commonjs/codec/cobuild/witnessLayout.d.ts +43 -0
  122. package/dist.commonjs/codec/cobuild/witnessLayout.d.ts.map +1 -0
  123. package/dist.commonjs/codec/cobuild/witnessLayout.js +30 -0
  124. package/dist.commonjs/codec/index.d.ts +4 -0
  125. package/dist.commonjs/codec/index.d.ts.map +1 -0
  126. package/dist.commonjs/codec/index.js +19 -0
  127. package/dist.commonjs/codec/spore.d.ts +15 -0
  128. package/dist.commonjs/codec/spore.d.ts.map +1 -0
  129. package/dist.commonjs/codec/spore.js +29 -0
  130. package/dist.commonjs/dob/api/decode.d.ts +6 -0
  131. package/dist.commonjs/dob/api/decode.d.ts.map +1 -0
  132. package/dist.commonjs/dob/api/decode.js +49 -0
  133. package/dist.commonjs/dob/api/encode.d.ts +5 -0
  134. package/dist.commonjs/dob/api/encode.d.ts.map +1 -0
  135. package/dist.commonjs/dob/api/encode.js +82 -0
  136. package/dist.commonjs/dob/api/index.d.ts +3 -0
  137. package/dist.commonjs/dob/api/index.d.ts.map +1 -0
  138. package/dist.commonjs/dob/api/index.js +18 -0
  139. package/dist.commonjs/dob/config/index.d.ts +2 -0
  140. package/dist.commonjs/dob/config/index.d.ts.map +1 -0
  141. package/dist.commonjs/dob/config/index.js +17 -0
  142. package/dist.commonjs/dob/config/predefined.d.ts +8 -0
  143. package/dist.commonjs/dob/config/predefined.d.ts.map +1 -0
  144. package/dist.commonjs/dob/config/predefined.js +63 -0
  145. package/dist.commonjs/dob/helper/check.d.ts +5 -0
  146. package/dist.commonjs/dob/helper/check.d.ts.map +1 -0
  147. package/dist.commonjs/dob/helper/check.js +80 -0
  148. package/dist.commonjs/dob/helper/error.d.ts +2 -0
  149. package/dist.commonjs/dob/helper/error.d.ts.map +1 -0
  150. package/dist.commonjs/dob/helper/error.js +43 -0
  151. package/dist.commonjs/dob/helper/index.d.ts +3 -0
  152. package/dist.commonjs/dob/helper/index.d.ts.map +1 -0
  153. package/dist.commonjs/dob/helper/index.js +18 -0
  154. package/dist.commonjs/dob/helper/object.d.ts +59 -0
  155. package/dist.commonjs/dob/helper/object.d.ts.map +1 -0
  156. package/dist.commonjs/dob/helper/object.js +2 -0
  157. package/dist.commonjs/dob/index.d.ts +4 -0
  158. package/dist.commonjs/dob/index.d.ts.map +1 -0
  159. package/dist.commonjs/dob/index.js +19 -0
  160. package/dist.commonjs/helper/index.d.ts +9 -0
  161. package/dist.commonjs/helper/index.d.ts.map +1 -0
  162. package/dist.commonjs/helper/index.js +42 -0
  163. package/dist.commonjs/index.d.ts +5 -0
  164. package/dist.commonjs/index.d.ts.map +1 -0
  165. package/dist.commonjs/index.js +33 -0
  166. package/dist.commonjs/package.json +3 -0
  167. package/dist.commonjs/predefined/advanced.d.ts +3 -0
  168. package/dist.commonjs/predefined/advanced.d.ts.map +1 -0
  169. package/dist.commonjs/predefined/advanced.js +18 -0
  170. package/dist.commonjs/predefined/index.d.ts +3 -0
  171. package/dist.commonjs/predefined/index.d.ts.map +1 -0
  172. package/dist.commonjs/predefined/index.js +18 -0
  173. package/dist.commonjs/predefined/mainnet.advanced.d.ts +4 -0
  174. package/dist.commonjs/predefined/mainnet.advanced.d.ts.map +1 -0
  175. package/dist.commonjs/predefined/mainnet.advanced.js +64 -0
  176. package/dist.commonjs/predefined/testnet.advanced.d.ts +4 -0
  177. package/dist.commonjs/predefined/testnet.advanced.d.ts.map +1 -0
  178. package/dist.commonjs/predefined/testnet.advanced.js +91 -0
  179. package/dist.commonjs/predefined/types.d.ts +17 -0
  180. package/dist.commonjs/predefined/types.d.ts.map +1 -0
  181. package/dist.commonjs/predefined/types.js +22 -0
  182. package/dist.commonjs/predefined/utils.d.ts +7 -0
  183. package/dist.commonjs/predefined/utils.d.ts.map +1 -0
  184. package/dist.commonjs/predefined/utils.js +32 -0
  185. package/dist.commonjs/spore/advanced.d.ts +5 -0
  186. package/dist.commonjs/spore/advanced.d.ts.map +1 -0
  187. package/dist.commonjs/spore/advanced.js +65 -0
  188. package/dist.commonjs/spore/index.d.ts +80 -0
  189. package/dist.commonjs/spore/index.d.ts.map +1 -0
  190. package/dist.commonjs/spore/index.js +142 -0
  191. package/package.json +52 -0
  192. package/src/advanced.ts +4 -0
  193. package/src/cluster/index.ts +180 -0
  194. package/src/cobuild/index.ts +220 -0
  195. package/src/codec/base.ts +11 -0
  196. package/src/codec/cluster.ts +133 -0
  197. package/src/codec/cobuild/buildingPacket.ts +72 -0
  198. package/src/codec/cobuild/index.ts +3 -0
  199. package/src/codec/cobuild/sporeAction.ts +153 -0
  200. package/src/codec/cobuild/witnessLayout.ts +40 -0
  201. package/src/codec/index.ts +3 -0
  202. package/src/codec/spore.ts +36 -0
  203. package/src/dob/api/decode.ts +61 -0
  204. package/src/dob/api/encode.ts +84 -0
  205. package/src/dob/api/index.ts +2 -0
  206. package/src/dob/config/index.ts +1 -0
  207. package/src/dob/config/predefined.ts +71 -0
  208. package/src/dob/helper/check.ts +107 -0
  209. package/src/dob/helper/error.ts +41 -0
  210. package/src/dob/helper/index.ts +2 -0
  211. package/src/dob/helper/object.ts +66 -0
  212. package/src/dob/index.ts +3 -0
  213. package/src/helper/index.ts +68 -0
  214. package/src/index.ts +4 -0
  215. package/src/predefined/advanced.ts +2 -0
  216. package/src/predefined/index.ts +2 -0
  217. package/src/predefined/mainnet.advanced.ts +76 -0
  218. package/src/predefined/testnet.advanced.ts +107 -0
  219. package/src/predefined/types.ts +37 -0
  220. package/src/predefined/utils.ts +56 -0
  221. package/src/spore/advanced.ts +88 -0
  222. package/src/spore/index.ts +236 -0
  223. package/typedoc.json +6 -0
@@ -0,0 +1,153 @@
1
+ import { blockchain } from "@ckb-lumos/base";
2
+ import { molecule } from "@ckb-lumos/codec";
3
+
4
+ const Hash = blockchain.Byte32;
5
+
6
+ export const Address = molecule.union(
7
+ {
8
+ Script: blockchain.Script,
9
+ },
10
+ ["Script"],
11
+ );
12
+
13
+ /**
14
+ * Spore
15
+ */
16
+ export const CreateSpore = molecule.table(
17
+ {
18
+ sporeId: Hash,
19
+ to: Address,
20
+ dataHash: Hash,
21
+ },
22
+ ["sporeId", "to", "dataHash"],
23
+ );
24
+ export const TransferSpore = molecule.table(
25
+ {
26
+ sporeId: Hash,
27
+ from: Address,
28
+ to: Address,
29
+ },
30
+ ["sporeId", "from", "to"],
31
+ );
32
+ export const MeltSpore = molecule.table(
33
+ {
34
+ sporeId: Hash,
35
+ from: Address,
36
+ },
37
+ ["sporeId", "from"],
38
+ );
39
+
40
+ /**
41
+ * Cluster
42
+ */
43
+ export const CreateCluster = molecule.table(
44
+ {
45
+ clusterId: Hash,
46
+ to: Address,
47
+ dataHash: Hash,
48
+ },
49
+ ["clusterId", "to", "dataHash"],
50
+ );
51
+ export const TransferCluster = molecule.table(
52
+ {
53
+ clusterId: Hash,
54
+ from: Address,
55
+ to: Address,
56
+ },
57
+ ["clusterId", "from", "to"],
58
+ );
59
+
60
+ /**
61
+ * ClusterProxy
62
+ */
63
+ export const CreateClusterProxy = molecule.table(
64
+ {
65
+ clusterId: Hash,
66
+ clusterProxyId: Hash,
67
+ to: Address,
68
+ },
69
+ ["clusterId", "clusterProxyId", "to"],
70
+ );
71
+ export const TransferClusterProxy = molecule.table(
72
+ {
73
+ clusterId: Hash,
74
+ clusterProxyId: Hash,
75
+ from: Address,
76
+ to: Address,
77
+ },
78
+ ["clusterId", "clusterProxyId", "from", "to"],
79
+ );
80
+ export const MeltClusterProxy = molecule.table(
81
+ {
82
+ clusterId: Hash,
83
+ clusterProxyId: Hash,
84
+ from: Address,
85
+ },
86
+ ["clusterId", "clusterProxyId", "from"],
87
+ );
88
+
89
+ /**
90
+ * ClusterAgent
91
+ */
92
+ export const CreateClusterAgent = molecule.table(
93
+ {
94
+ clusterId: Hash,
95
+ clusterProxyId: Hash,
96
+ to: Address,
97
+ },
98
+ ["clusterId", "clusterProxyId", "to"],
99
+ );
100
+ export const TransferClusterAgent = molecule.table(
101
+ {
102
+ clusterId: Hash,
103
+ from: Address,
104
+ to: Address,
105
+ },
106
+ ["clusterId", "from", "to"],
107
+ );
108
+ export const MeltClusterAgent = molecule.table(
109
+ {
110
+ clusterId: Hash,
111
+ from: Address,
112
+ },
113
+ ["clusterId", "from"],
114
+ );
115
+
116
+ /**
117
+ * Spore ScriptInfo Actions
118
+ */
119
+ export const SporeAction = molecule.union(
120
+ {
121
+ // Spore
122
+ CreateSpore,
123
+ TransferSpore,
124
+ MeltSpore,
125
+
126
+ // Cluster
127
+ CreateCluster,
128
+ TransferCluster,
129
+
130
+ // ClusterProxy
131
+ CreateClusterProxy,
132
+ TransferClusterProxy,
133
+ MeltClusterProxy,
134
+
135
+ // ClusterAgent
136
+ CreateClusterAgent,
137
+ TransferClusterAgent,
138
+ MeltClusterAgent,
139
+ },
140
+ [
141
+ "CreateSpore",
142
+ "TransferSpore",
143
+ "MeltSpore",
144
+ "CreateCluster",
145
+ "TransferCluster",
146
+ "CreateClusterProxy",
147
+ "TransferClusterProxy",
148
+ "MeltClusterProxy",
149
+ "CreateClusterAgent",
150
+ "TransferClusterAgent",
151
+ "MeltClusterAgent",
152
+ ],
153
+ );
@@ -0,0 +1,40 @@
1
+ import { blockchain } from "@ckb-lumos/base";
2
+ import { molecule } from "@ckb-lumos/codec";
3
+ import { Message } from "./buildingPacket.js";
4
+
5
+ export const SighashAll = molecule.table(
6
+ {
7
+ seal: blockchain.Bytes,
8
+ message: Message,
9
+ },
10
+ ["seal", "message"],
11
+ );
12
+ export const SighashAllOnly = molecule.table(
13
+ {
14
+ seal: blockchain.Bytes,
15
+ },
16
+ ["seal"],
17
+ );
18
+
19
+ /**
20
+ * Otx related are not implemented yet, so just placeholders.
21
+ */
22
+ export const Otx = molecule.table({}, []);
23
+ export const OtxStart = molecule.table({}, []);
24
+
25
+ export const WitnessLayoutFieldTags = {
26
+ SighashAll: 4278190081,
27
+ SighashAllOnly: 4278190082,
28
+ Otx: 4278190083,
29
+ OtxStart: 4278190084,
30
+ } as const;
31
+
32
+ export const WitnessLayout = molecule.union(
33
+ {
34
+ SighashAll,
35
+ SighashAllOnly,
36
+ Otx,
37
+ OtxStart,
38
+ },
39
+ WitnessLayoutFieldTags,
40
+ );
@@ -0,0 +1,3 @@
1
+ export * from "./cluster.js";
2
+ export * from "./cobuild/index.js";
3
+ export * from "./spore.js";
@@ -0,0 +1,36 @@
1
+ import { ccc } from "@ckb-ccc/core";
2
+ import { blockchain } from "@ckb-lumos/base";
3
+ import { molecule } from "@ckb-lumos/codec";
4
+ import { RawString } from "./base.js";
5
+
6
+ export const MolSporeData = molecule.table(
7
+ {
8
+ contentType: RawString,
9
+ content: blockchain.Bytes,
10
+ clusterId: blockchain.BytesOpt,
11
+ },
12
+ ["contentType", "content", "clusterId"],
13
+ );
14
+
15
+ export interface SporeData {
16
+ contentType: string;
17
+ content: ccc.BytesLike;
18
+ clusterId?: ccc.HexLike;
19
+ }
20
+
21
+ export function packRawSporeData(packable: SporeData): Uint8Array {
22
+ return MolSporeData.pack({
23
+ contentType: packable.contentType,
24
+ content: packable.content,
25
+ clusterId: packable.clusterId,
26
+ });
27
+ }
28
+
29
+ export function unpackToRawSporeData(unpackable: ccc.BytesLike): SporeData {
30
+ const unpacked = MolSporeData.unpack(unpackable);
31
+ return {
32
+ contentType: unpacked.contentType,
33
+ content: unpacked.content,
34
+ clusterId: ccc.apply(ccc.hexFrom, unpacked.clusterId),
35
+ };
36
+ }
@@ -0,0 +1,61 @@
1
+ import { ccc } from "@ckb-ccc/core";
2
+ import { Axios } from "axios";
3
+ import { getErrorByCode } from "../helper/error.js";
4
+ import { RenderOutput } from "../helper/object.js";
5
+
6
+ export async function decodeDobBySporeId(
7
+ sporeId: ccc.HexLike,
8
+ dobServerUrl: string,
9
+ ): Promise<RenderOutput> {
10
+ const axios = new Axios({
11
+ baseURL: dobServerUrl,
12
+ method: "POST",
13
+ headers: {
14
+ "Content-Type": "application/json",
15
+ },
16
+ });
17
+ const result = await axios.post(
18
+ "/",
19
+ JSON.stringify({
20
+ id: 0,
21
+ jsonrpc: "2.0",
22
+ method: "dob_decode",
23
+ params: [ccc.hexFrom(sporeId).replace(/^0x/, "")],
24
+ }),
25
+ );
26
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-argument
27
+ const decoderResult = JSON.parse(result.data);
28
+ if ("error" in decoderResult) {
29
+ const serverError = getErrorByCode(decoderResult.error.code as number);
30
+ throw new Error(`Decode DOB failed: ${serverError}`);
31
+ }
32
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-argument
33
+ const renderResult = JSON.parse(decoderResult.result);
34
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-argument
35
+ const renderOutput = JSON.parse(renderResult.render_output);
36
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
37
+ return renderOutput;
38
+ }
39
+
40
+ export async function decodeDobBySporeCell(
41
+ sporeOutput: ccc.CellOutputLike,
42
+ dobServerUrl: string,
43
+ ): Promise<RenderOutput> {
44
+ const sporeId = sporeOutput.type?.args;
45
+ if (sporeId === undefined) {
46
+ throw new Error("Invalid spore cell: missing spore id");
47
+ }
48
+ return decodeDobBySporeId(ccc.hexFrom(sporeId), dobServerUrl);
49
+ }
50
+
51
+ export async function decodeDobBySporeOutpoint(
52
+ client: ccc.Client,
53
+ sporeOutpoint: ccc.OutPointLike,
54
+ dobServerUrl: string,
55
+ ): Promise<RenderOutput> {
56
+ const liveCell = await client.getCell(sporeOutpoint);
57
+ if (!liveCell) {
58
+ throw new Error("Invalid spore outpoint: missing spore cell");
59
+ }
60
+ return decodeDobBySporeCell(liveCell.cellOutput, dobServerUrl);
61
+ }
@@ -0,0 +1,84 @@
1
+ import {
2
+ checkDecoder,
3
+ checkPatternDob0,
4
+ checkPatternDob1,
5
+ DNA,
6
+ Dob0,
7
+ Dob1,
8
+ } from "../helper/index.js";
9
+
10
+ export function encodeDna(dna: DNA): ArrayBuffer {
11
+ const encoder = new TextEncoder();
12
+ return encoder.encode(JSON.stringify(dna));
13
+ }
14
+
15
+ export function encodeClusterDescriptionForDob0(dob0: Dob0): string {
16
+ checkDecoder(dob0.dob.decoder);
17
+ dob0.dob.pattern.forEach((v) => {
18
+ checkPatternDob0(v);
19
+ v.toJSON = function () {
20
+ if (v.traitArgs) {
21
+ return [
22
+ v.traitName,
23
+ v.dobType,
24
+ v.dnaOffset,
25
+ v.dnaLength,
26
+ v.patternType,
27
+ v.traitArgs,
28
+ ];
29
+ } else {
30
+ return [
31
+ v.traitName,
32
+ v.dobType,
33
+ v.dnaOffset,
34
+ v.dnaLength,
35
+ v.patternType,
36
+ ];
37
+ }
38
+ };
39
+ });
40
+ return JSON.stringify(dob0);
41
+ }
42
+
43
+ export function encodeClusterDescriptionForDob1(dob1: Dob1): string {
44
+ dob1.dob.decoders.forEach((value) => {
45
+ checkDecoder(value.decoder);
46
+ value.pattern.forEach((v) => {
47
+ if ("dnaOffset" in v) {
48
+ checkPatternDob0(v);
49
+ v.toJSON = function () {
50
+ if (v.traitArgs) {
51
+ return [
52
+ v.traitName,
53
+ v.dobType,
54
+ v.dnaOffset,
55
+ v.dnaLength,
56
+ v.patternType,
57
+ v.traitArgs,
58
+ ];
59
+ } else {
60
+ return [
61
+ v.traitName,
62
+ v.dobType,
63
+ v.dnaOffset,
64
+ v.dnaLength,
65
+ v.patternType,
66
+ ];
67
+ }
68
+ };
69
+ } else {
70
+ checkPatternDob1(v);
71
+ v.toJSON = () => {
72
+ return [
73
+ v.imageName,
74
+ v.svgFields,
75
+ v.traitName,
76
+ v.patternType,
77
+ v.traitArgs,
78
+ ];
79
+ };
80
+ }
81
+ });
82
+ });
83
+ return JSON.stringify(dob1);
84
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./decode.js";
2
+ export * from "./encode.js";
@@ -0,0 +1 @@
1
+ export * from "./predefined.js";
@@ -0,0 +1,71 @@
1
+ import { ccc } from "@ckb-ccc/core";
2
+ import { Decoder } from "../helper/index.js";
3
+
4
+ export type DobType = "dob0" | "dob1";
5
+ export type DobScriptInfo = Record<DobType, Decoder>;
6
+
7
+ export const DOB_TESTNET_DECODERS: DobScriptInfo = Object.freeze({
8
+ ["dob0"]: {
9
+ type: "code_hash",
10
+ hash: "0x13cac78ad8482202f18f9df4ea707611c35f994375fa03ae79121312dda9925c",
11
+ },
12
+ // another avaliable options:
13
+ // {
14
+ // type: "type_id",
15
+ // hash: "0x784e32cef202b9d4759ea96e80d806f94051e8069fd34d761f452553700138d7",
16
+ // }
17
+ // or
18
+ // {
19
+ // type: "type_script",
20
+ // script: {
21
+ // code_hash:
22
+ // "0x00000000000000000000000000000000000000000000000000545950455f4944",
23
+ // hash_type: "type",
24
+ // args: "0x784e32cef202b9d4759ea96e80d806f94051e8069fd34d761f452553700138d7",
25
+ // }
26
+ // }
27
+ ["dob1"]: {
28
+ type: "code_hash",
29
+ hash: "0xda3525549b72970b4c95f5b5749357f20d1293d335710b674f09c32f7d54b6dc",
30
+ },
31
+ });
32
+
33
+ export const DOB_MAINNET_DECODERS: DobScriptInfo = Object.freeze({
34
+ ["dob0"]: {
35
+ type: "code_hash",
36
+ hash: "0x13cac78ad8482202f18f9df4ea707611c35f994375fa03ae79121312dda9925c",
37
+ },
38
+ // another avaliable options:
39
+ // {
40
+ // type: "type_id",
41
+ // hash: "0x8892bea4405a1f077921799bc0f4516e0ebaef7aea0dfc6614a8898fb47d5372",
42
+ // },
43
+ // or
44
+ // {
45
+ // type: "type_script",
46
+ // script: {
47
+ // code_hash:
48
+ // "0x00000000000000000000000000000000000000000000000000545950455f4944",
49
+ // hash_type: "type",
50
+ // args: "0x8892bea4405a1f077921799bc0f4516e0ebaef7aea0dfc6614a8898fb47d5372",
51
+ // }
52
+ // }
53
+ ["dob1"]: {
54
+ type: "code_hash",
55
+ hash: "0xda3525549b72970b4c95f5b5749357f20d1293d335710b674f09c32f7d54b6dc",
56
+ },
57
+ });
58
+
59
+ export function getDecoder(
60
+ client: ccc.Client,
61
+ dobType: DobType,
62
+ dobScriptInfo?: DobScriptInfo,
63
+ ): Decoder {
64
+ if (dobScriptInfo) {
65
+ return dobScriptInfo[dobType];
66
+ }
67
+ if (client.addressPrefix === "ckb") {
68
+ return DOB_MAINNET_DECODERS[dobType];
69
+ }
70
+ return DOB_TESTNET_DECODERS[dobType];
71
+ }
@@ -0,0 +1,107 @@
1
+ import { Decoder, PatternElementDob0, PatternElementDob1 } from "./object.js";
2
+
3
+ export function checkDecoder(decoder: Decoder) {
4
+ if (decoder.type === "code_hash" || decoder.type === "type_id") {
5
+ if (decoder.hash === undefined) {
6
+ throw new Error(
7
+ "Invalid decoder: 'hash' is required for 'code_hash' and 'type_id'",
8
+ );
9
+ }
10
+ }
11
+ if (decoder.type === "type_script" && decoder.script === undefined) {
12
+ throw new Error("Invalid decoder: 'script' is required for 'type_script'");
13
+ }
14
+ }
15
+
16
+ export function checkPatternDob0(value: PatternElementDob0) {
17
+ switch (value.patternType) {
18
+ case "options": {
19
+ if (value.traitArgs === undefined) {
20
+ throw new Error(
21
+ "Invalid pattern: 'traitArgs' is required for 'options'",
22
+ );
23
+ }
24
+ if (value.traitArgs.length === 0) {
25
+ throw new Error(
26
+ "Invalid pattern: 'traitArgs' should not be empty for 'options'",
27
+ );
28
+ }
29
+ break;
30
+ }
31
+ case "range": {
32
+ if (value.traitArgs === undefined) {
33
+ throw new Error("Invalid pattern: 'traitArgs' is required for 'range'");
34
+ }
35
+ if (
36
+ value.traitArgs.length !== 2 ||
37
+ value.traitArgs.filter((v) => typeof v === "number").length !== 2
38
+ ) {
39
+ throw new Error(
40
+ "Invalid pattern: 'traitArgs' should contain exactly 2 numbers for 'range'",
41
+ );
42
+ }
43
+ break;
44
+ }
45
+ }
46
+ if (value.dnaLength === 0) {
47
+ throw new Error("Invalid pattern: 'dnaLength' should be greater than 0");
48
+ }
49
+ }
50
+
51
+ export function checkPatternDob1(value: PatternElementDob1) {
52
+ switch (value.patternType) {
53
+ case "options": {
54
+ if (!Array.isArray(value.traitArgs)) {
55
+ throw new Error(
56
+ "Invalid pattern: 'traitArgs' should be an array for 'options'",
57
+ );
58
+ }
59
+ for (const args of value.traitArgs) {
60
+ if (args.length !== 2) {
61
+ throw new Error(
62
+ "Invalid pattern: 'traitArgs' should contain exactly 2 elements for 'options'",
63
+ );
64
+ }
65
+ if (typeof args[0] !== "string") {
66
+ if (!Array.isArray(args[0])) {
67
+ throw new Error(
68
+ "Invalid pattern: 'traitArgs[0]' should be a string or an array that contains only 2 numbers or the '*' for 'options'",
69
+ );
70
+ }
71
+ if (args[0].length === 1 && args[0][0] !== "*") {
72
+ throw new Error(
73
+ "Invalid pattern: 'traitArgs[0]' should be a string or an array that contains only 2 numbers or the '*' for 'options'",
74
+ );
75
+ }
76
+ if (
77
+ args[0].length === 2 &&
78
+ (typeof args[0][0] !== "number" || typeof args[0][1] !== "number")
79
+ ) {
80
+ throw new Error(
81
+ "Invalid pattern: 'traitArgs[0]' should be a string or an array that contains only 2 numbers or the '*' for 'options'",
82
+ );
83
+ }
84
+ if (args[0].length === 0 || args[0].length > 2) {
85
+ throw new Error(
86
+ "Invalid pattern: 'traitArgs[0]' should be a string or an array that contains only 2 numbers or the '*' for 'options'",
87
+ );
88
+ }
89
+ }
90
+ if (typeof args[1] !== "string") {
91
+ throw new Error(
92
+ "Invalid pattern: 'traitArgs[1]' should be a string for 'options'",
93
+ );
94
+ }
95
+ }
96
+ break;
97
+ }
98
+ case "raw": {
99
+ if (value.traitName !== "" || typeof value.traitArgs !== "string") {
100
+ throw new Error(
101
+ "Invalid pattern: 'traitName' should be empty and 'traitArgs' should be a string for 'raw'",
102
+ );
103
+ }
104
+ break;
105
+ }
106
+ }
107
+ }
@@ -0,0 +1,41 @@
1
+ const errors = {
2
+ 1001: "DnaLengthNotMatch",
3
+ 1002: "SporeIdLengthInvalid",
4
+ 1003: "NativeDecoderNotFound",
5
+ 1004: "SporeIdNotFound",
6
+ 1005: "SporeDataUncompatible",
7
+ 1006: "SporeDataContentTypeUncompatible",
8
+ 1007: "DOBVersionUnexpected",
9
+ 1008: "ClusterIdNotSet",
10
+ 1009: "ClusterIdNotFound",
11
+ 1010: "ClusterDataUncompatible",
12
+ 1011: "DecoderIdNotFound",
13
+ 1012: "DecoderOutputInvalid",
14
+ 1013: "HexedDNAParseError",
15
+ 1014: "HexedSporeIdParseError",
16
+ 1015: "DecoderBinaryPathInvalid",
17
+ 1016: "DecoderExecutionError",
18
+ 1017: "DecoderExecutionInternalError",
19
+ 1018: "FetchLiveCellsError",
20
+ 1019: "FetchTransactionError",
21
+ 1020: "NoOutputCellInTransaction",
22
+ 1021: "DOBContentUnexpected",
23
+ 1022: "DOBMetadataUnexpected",
24
+ 1023: "DOBRenderCacheNotFound",
25
+ 1024: "DOBRenderCacheModified",
26
+ 1025: "DecoderBinaryHashInvalid",
27
+ 1026: "DecoderBinaryNotFoundInCell",
28
+ 1027: "JsonRpcRequestError",
29
+ 1028: "SystemTimeError",
30
+ 1029: "DecoderHashNotFound",
31
+ 1030: "DecoderScriptNotFound",
32
+ 1031: "DecoderChainIsEmpty",
33
+ };
34
+
35
+ export function getErrorByCode(code: number): string {
36
+ const errorIndex = Object.keys(errors).indexOf(code.toString());
37
+ if (errorIndex < 0) {
38
+ throw new Error(`Error code ${code} not found`);
39
+ }
40
+ return Object.values(errors)[errorIndex];
41
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./check.js";
2
+ export * from "./object.js";
@@ -0,0 +1,66 @@
1
+ export type DNA = string | { dna: string } | string[];
2
+
3
+ export interface Decoder {
4
+ type: "code_hash" | "type_id" | "type_script";
5
+ hash?: string; // required if `type` is `code_hash` or `type_id`
6
+ script?: {
7
+ code_hash: string;
8
+ hash_type: string;
9
+ args: string;
10
+ }; // required if `type` is `type_script`
11
+ }
12
+
13
+ export interface PatternElementDob0 {
14
+ traitName: string;
15
+ dobType: string; // String | Number
16
+ dnaOffset: number;
17
+ dnaLength: number;
18
+ patternType: "options" | "range" | "rawNumber" | "rawString" | "utf8";
19
+ traitArgs?: string[] | number[]; // can only be `undefined` in case that `patternType` is `rawNumber` or `rawString`
20
+ toJSON?: () => unknown;
21
+ }
22
+
23
+ export interface PatternDob0 {
24
+ ver: 0;
25
+ decoder: Decoder;
26
+ pattern: PatternElementDob0[];
27
+ }
28
+
29
+ export interface Dob0 {
30
+ description: string;
31
+ dob: PatternDob0;
32
+ }
33
+
34
+ export type Dob1PatternArgs = string | number[] | ["*"];
35
+
36
+ export interface PatternElementDob1 {
37
+ imageName: string;
38
+ svgFields: "attributes" | "elements";
39
+ traitName: string; // can only be empty in case that `patternType` is `raw`
40
+ patternType: "options" | "raw";
41
+ traitArgs: Dob1PatternArgs[][] | string; // can only be `string` in case that `patternType` is `raw`
42
+ toJSON?: () => unknown;
43
+ }
44
+
45
+ export interface PatternDob1 {
46
+ ver: 1;
47
+ decoders: {
48
+ decoder: Decoder;
49
+ pattern: PatternElementDob0[] | PatternElementDob1[];
50
+ }[];
51
+ }
52
+
53
+ export interface Dob1 {
54
+ description: string;
55
+ dob: PatternDob1;
56
+ }
57
+
58
+ export interface DecodeElement {
59
+ name: string;
60
+ traits: {
61
+ type: string;
62
+ value: number | string;
63
+ }[];
64
+ }
65
+
66
+ export type RenderOutput = DecodeElement[];
@@ -0,0 +1,3 @@
1
+ export * from "./api/index.js";
2
+ export * from "./config/index.js";
3
+ export * from "./helper/index.js";