@silvana-one/nft 0.1.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.
Files changed (236) hide show
  1. package/README.md +1400 -0
  2. package/dist/node/admin/advanced.d.ts +469 -0
  3. package/dist/node/admin/advanced.js +525 -0
  4. package/dist/node/admin/advanced.js.map +1 -0
  5. package/dist/node/admin/index.d.ts +1 -0
  6. package/dist/node/admin/index.js +2 -0
  7. package/dist/node/admin/index.js.map +1 -0
  8. package/dist/node/contracts/admin.d.ts +140 -0
  9. package/dist/node/contracts/admin.js +336 -0
  10. package/dist/node/contracts/admin.js.map +1 -0
  11. package/dist/node/contracts/collection.d.ts +551 -0
  12. package/dist/node/contracts/collection.js +1049 -0
  13. package/dist/node/contracts/collection.js.map +1 -0
  14. package/dist/node/contracts/index.d.ts +3 -0
  15. package/dist/node/contracts/index.js +4 -0
  16. package/dist/node/contracts/index.js.map +1 -0
  17. package/dist/node/contracts/nft.d.ts +76 -0
  18. package/dist/node/contracts/nft.js +329 -0
  19. package/dist/node/contracts/nft.js.map +1 -0
  20. package/dist/node/contracts.d.ts +709 -0
  21. package/dist/node/contracts.js +61 -0
  22. package/dist/node/contracts.js.map +1 -0
  23. package/dist/node/index.cjs +5032 -0
  24. package/dist/node/index.d.ts +8 -0
  25. package/dist/node/index.js +9 -0
  26. package/dist/node/index.js.map +1 -0
  27. package/dist/node/interfaces/admin.d.ts +102 -0
  28. package/dist/node/interfaces/admin.js +2 -0
  29. package/dist/node/interfaces/admin.js.map +1 -0
  30. package/dist/node/interfaces/approval.d.ts +57 -0
  31. package/dist/node/interfaces/approval.js +62 -0
  32. package/dist/node/interfaces/approval.js.map +1 -0
  33. package/dist/node/interfaces/collection.d.ts +57 -0
  34. package/dist/node/interfaces/collection.js +2 -0
  35. package/dist/node/interfaces/collection.js.map +1 -0
  36. package/dist/node/interfaces/encoding.d.ts +24 -0
  37. package/dist/node/interfaces/encoding.js +32 -0
  38. package/dist/node/interfaces/encoding.js.map +1 -0
  39. package/dist/node/interfaces/events.d.ts +833 -0
  40. package/dist/node/interfaces/events.js +106 -0
  41. package/dist/node/interfaces/events.js.map +1 -0
  42. package/dist/node/interfaces/index.d.ts +10 -0
  43. package/dist/node/interfaces/index.js +11 -0
  44. package/dist/node/interfaces/index.js.map +1 -0
  45. package/dist/node/interfaces/ownable.d.ts +94 -0
  46. package/dist/node/interfaces/ownable.js +12 -0
  47. package/dist/node/interfaces/ownable.js.map +1 -0
  48. package/dist/node/interfaces/owner.d.ts +61 -0
  49. package/dist/node/interfaces/owner.js +101 -0
  50. package/dist/node/interfaces/owner.js.map +1 -0
  51. package/dist/node/interfaces/pausable.d.ts +74 -0
  52. package/dist/node/interfaces/pausable.js +14 -0
  53. package/dist/node/interfaces/pausable.js.map +1 -0
  54. package/dist/node/interfaces/types.d.ts +2297 -0
  55. package/dist/node/interfaces/types.js +507 -0
  56. package/dist/node/interfaces/types.js.map +1 -0
  57. package/dist/node/interfaces/update.d.ts +53 -0
  58. package/dist/node/interfaces/update.js +58 -0
  59. package/dist/node/interfaces/update.js.map +1 -0
  60. package/dist/node/marketplace/auction.d.ts +775 -0
  61. package/dist/node/marketplace/auction.js +430 -0
  62. package/dist/node/marketplace/auction.js.map +1 -0
  63. package/dist/node/marketplace/bid.d.ts +254 -0
  64. package/dist/node/marketplace/bid.js +260 -0
  65. package/dist/node/marketplace/bid.js.map +1 -0
  66. package/dist/node/marketplace/index.d.ts +5 -0
  67. package/dist/node/marketplace/index.js +6 -0
  68. package/dist/node/marketplace/index.js.map +1 -0
  69. package/dist/node/marketplace/nft-shares.d.ts +1083 -0
  70. package/dist/node/marketplace/nft-shares.js +398 -0
  71. package/dist/node/marketplace/nft-shares.js.map +1 -0
  72. package/dist/node/marketplace/offer.d.ts +192 -0
  73. package/dist/node/marketplace/offer.js +132 -0
  74. package/dist/node/marketplace/offer.js.map +1 -0
  75. package/dist/node/marketplace/types.d.ts +374 -0
  76. package/dist/node/marketplace/types.js +33 -0
  77. package/dist/node/marketplace/types.js.map +1 -0
  78. package/dist/node/metadata/index.d.ts +3 -0
  79. package/dist/node/metadata/index.js +4 -0
  80. package/dist/node/metadata/index.js.map +1 -0
  81. package/dist/node/metadata/metadata.d.ts +337 -0
  82. package/dist/node/metadata/metadata.js +439 -0
  83. package/dist/node/metadata/metadata.js.map +1 -0
  84. package/dist/node/metadata/text.d.ts +44 -0
  85. package/dist/node/metadata/text.js +42 -0
  86. package/dist/node/metadata/text.js.map +1 -0
  87. package/dist/node/metadata/tree.d.ts +75 -0
  88. package/dist/node/metadata/tree.js +85 -0
  89. package/dist/node/metadata/tree.js.map +1 -0
  90. package/dist/node/vk.d.ts +42 -0
  91. package/dist/node/vk.js +45 -0
  92. package/dist/node/vk.js.map +1 -0
  93. package/dist/node/zkprogram-example/game.d.ts +76 -0
  94. package/dist/node/zkprogram-example/game.js +108 -0
  95. package/dist/node/zkprogram-example/game.js.map +1 -0
  96. package/dist/node/zkprogram-example/index.d.ts +2 -0
  97. package/dist/node/zkprogram-example/index.js +3 -0
  98. package/dist/node/zkprogram-example/index.js.map +1 -0
  99. package/dist/node/zkprogram-example/update.d.ts +76 -0
  100. package/dist/node/zkprogram-example/update.js +85 -0
  101. package/dist/node/zkprogram-example/update.js.map +1 -0
  102. package/dist/tsconfig.tsbuildinfo +1 -0
  103. package/dist/tsconfig.web.tsbuildinfo +1 -0
  104. package/dist/web/admin/advanced.d.ts +469 -0
  105. package/dist/web/admin/advanced.js +525 -0
  106. package/dist/web/admin/advanced.js.map +1 -0
  107. package/dist/web/admin/index.d.ts +1 -0
  108. package/dist/web/admin/index.js +2 -0
  109. package/dist/web/admin/index.js.map +1 -0
  110. package/dist/web/contracts/admin.d.ts +140 -0
  111. package/dist/web/contracts/admin.js +336 -0
  112. package/dist/web/contracts/admin.js.map +1 -0
  113. package/dist/web/contracts/collection.d.ts +551 -0
  114. package/dist/web/contracts/collection.js +1049 -0
  115. package/dist/web/contracts/collection.js.map +1 -0
  116. package/dist/web/contracts/index.d.ts +3 -0
  117. package/dist/web/contracts/index.js +4 -0
  118. package/dist/web/contracts/index.js.map +1 -0
  119. package/dist/web/contracts/nft.d.ts +76 -0
  120. package/dist/web/contracts/nft.js +329 -0
  121. package/dist/web/contracts/nft.js.map +1 -0
  122. package/dist/web/contracts.d.ts +709 -0
  123. package/dist/web/contracts.js +61 -0
  124. package/dist/web/contracts.js.map +1 -0
  125. package/dist/web/index.d.ts +8 -0
  126. package/dist/web/index.js +9 -0
  127. package/dist/web/index.js.map +1 -0
  128. package/dist/web/interfaces/admin.d.ts +102 -0
  129. package/dist/web/interfaces/admin.js +2 -0
  130. package/dist/web/interfaces/admin.js.map +1 -0
  131. package/dist/web/interfaces/approval.d.ts +57 -0
  132. package/dist/web/interfaces/approval.js +62 -0
  133. package/dist/web/interfaces/approval.js.map +1 -0
  134. package/dist/web/interfaces/collection.d.ts +57 -0
  135. package/dist/web/interfaces/collection.js +2 -0
  136. package/dist/web/interfaces/collection.js.map +1 -0
  137. package/dist/web/interfaces/encoding.d.ts +24 -0
  138. package/dist/web/interfaces/encoding.js +32 -0
  139. package/dist/web/interfaces/encoding.js.map +1 -0
  140. package/dist/web/interfaces/events.d.ts +833 -0
  141. package/dist/web/interfaces/events.js +106 -0
  142. package/dist/web/interfaces/events.js.map +1 -0
  143. package/dist/web/interfaces/index.d.ts +10 -0
  144. package/dist/web/interfaces/index.js +11 -0
  145. package/dist/web/interfaces/index.js.map +1 -0
  146. package/dist/web/interfaces/ownable.d.ts +94 -0
  147. package/dist/web/interfaces/ownable.js +12 -0
  148. package/dist/web/interfaces/ownable.js.map +1 -0
  149. package/dist/web/interfaces/owner.d.ts +61 -0
  150. package/dist/web/interfaces/owner.js +101 -0
  151. package/dist/web/interfaces/owner.js.map +1 -0
  152. package/dist/web/interfaces/pausable.d.ts +74 -0
  153. package/dist/web/interfaces/pausable.js +14 -0
  154. package/dist/web/interfaces/pausable.js.map +1 -0
  155. package/dist/web/interfaces/types.d.ts +2297 -0
  156. package/dist/web/interfaces/types.js +507 -0
  157. package/dist/web/interfaces/types.js.map +1 -0
  158. package/dist/web/interfaces/update.d.ts +53 -0
  159. package/dist/web/interfaces/update.js +58 -0
  160. package/dist/web/interfaces/update.js.map +1 -0
  161. package/dist/web/marketplace/auction.d.ts +775 -0
  162. package/dist/web/marketplace/auction.js +430 -0
  163. package/dist/web/marketplace/auction.js.map +1 -0
  164. package/dist/web/marketplace/bid.d.ts +254 -0
  165. package/dist/web/marketplace/bid.js +260 -0
  166. package/dist/web/marketplace/bid.js.map +1 -0
  167. package/dist/web/marketplace/index.d.ts +5 -0
  168. package/dist/web/marketplace/index.js +6 -0
  169. package/dist/web/marketplace/index.js.map +1 -0
  170. package/dist/web/marketplace/nft-shares.d.ts +1083 -0
  171. package/dist/web/marketplace/nft-shares.js +398 -0
  172. package/dist/web/marketplace/nft-shares.js.map +1 -0
  173. package/dist/web/marketplace/offer.d.ts +192 -0
  174. package/dist/web/marketplace/offer.js +132 -0
  175. package/dist/web/marketplace/offer.js.map +1 -0
  176. package/dist/web/marketplace/types.d.ts +374 -0
  177. package/dist/web/marketplace/types.js +33 -0
  178. package/dist/web/marketplace/types.js.map +1 -0
  179. package/dist/web/metadata/index.d.ts +3 -0
  180. package/dist/web/metadata/index.js +4 -0
  181. package/dist/web/metadata/index.js.map +1 -0
  182. package/dist/web/metadata/metadata.d.ts +337 -0
  183. package/dist/web/metadata/metadata.js +439 -0
  184. package/dist/web/metadata/metadata.js.map +1 -0
  185. package/dist/web/metadata/text.d.ts +44 -0
  186. package/dist/web/metadata/text.js +42 -0
  187. package/dist/web/metadata/text.js.map +1 -0
  188. package/dist/web/metadata/tree.d.ts +75 -0
  189. package/dist/web/metadata/tree.js +85 -0
  190. package/dist/web/metadata/tree.js.map +1 -0
  191. package/dist/web/vk.d.ts +42 -0
  192. package/dist/web/vk.js +45 -0
  193. package/dist/web/vk.js.map +1 -0
  194. package/dist/web/zkprogram-example/game.d.ts +76 -0
  195. package/dist/web/zkprogram-example/game.js +108 -0
  196. package/dist/web/zkprogram-example/game.js.map +1 -0
  197. package/dist/web/zkprogram-example/index.d.ts +2 -0
  198. package/dist/web/zkprogram-example/index.js +3 -0
  199. package/dist/web/zkprogram-example/index.js.map +1 -0
  200. package/dist/web/zkprogram-example/update.d.ts +76 -0
  201. package/dist/web/zkprogram-example/update.js +85 -0
  202. package/dist/web/zkprogram-example/update.js.map +1 -0
  203. package/package.json +65 -0
  204. package/src/admin/advanced.ts +601 -0
  205. package/src/admin/index.ts +1 -0
  206. package/src/contracts/admin.ts +301 -0
  207. package/src/contracts/collection.ts +1172 -0
  208. package/src/contracts/index.ts +3 -0
  209. package/src/contracts/nft.ts +344 -0
  210. package/src/contracts.ts +107 -0
  211. package/src/index.ts +8 -0
  212. package/src/interfaces/admin.ts +127 -0
  213. package/src/interfaces/approval.ts +99 -0
  214. package/src/interfaces/collection.ts +68 -0
  215. package/src/interfaces/encoding.ts +32 -0
  216. package/src/interfaces/events.ts +115 -0
  217. package/src/interfaces/index.ts +10 -0
  218. package/src/interfaces/ownable.ts +32 -0
  219. package/src/interfaces/owner.ts +143 -0
  220. package/src/interfaces/pausable.ts +41 -0
  221. package/src/interfaces/types.ts +623 -0
  222. package/src/interfaces/update.ts +104 -0
  223. package/src/marketplace/auction.ts +527 -0
  224. package/src/marketplace/bid.ts +294 -0
  225. package/src/marketplace/index.ts +5 -0
  226. package/src/marketplace/nft-shares.ts +388 -0
  227. package/src/marketplace/offer.ts +153 -0
  228. package/src/marketplace/types.ts +33 -0
  229. package/src/metadata/index.ts +3 -0
  230. package/src/metadata/metadata.ts +603 -0
  231. package/src/metadata/text.ts +60 -0
  232. package/src/metadata/tree.ts +128 -0
  233. package/src/vk.ts +64 -0
  234. package/src/zkprogram-example/game.ts +136 -0
  235. package/src/zkprogram-example/index.ts +2 -0
  236. package/src/zkprogram-example/update.ts +98 -0
@@ -0,0 +1,128 @@
1
+ import { MerkleTree, Field } from "o1js";
2
+
3
+ /**
4
+ * Represents a metadata tree using a Merkle tree structure.
5
+ *
6
+ * The `MetadataTree` class is used to manage a set of key-value pairs representing metadata,
7
+ * storing them in a Merkle tree for efficient verification and integrity checks.
8
+ *
9
+ * This class is a utility within the NFT standard on Mina Protocol, enabling secure and verifiable
10
+ * storage of metadata. By leveraging the Merkle tree, clients can prove the inclusion of specific
11
+ * metadata entries without exposing the entire dataset.
12
+ */
13
+ export class MetadataTree {
14
+ /**
15
+ * The list of key-value pairs stored in the tree.
16
+ * Each key is a `bigint` representing the index in the Merkle tree,
17
+ * and each value is a `Field` element from o1js.
18
+ */
19
+ readonly values: { key: bigint; value: Field }[];
20
+
21
+ /**
22
+ * The height of the Merkle tree.
23
+ * Determines the maximum number of elements the tree can hold.
24
+ */
25
+ readonly height: number;
26
+
27
+ /**
28
+ * The root of the Merkle tree.
29
+ * Used for verifying the integrity of the tree and its contents.
30
+ */
31
+ readonly root: Field;
32
+
33
+ /**
34
+ * Constructs a new `MetadataTree` with the specified height and key-value pairs.
35
+ *
36
+ * @param height - The height of the Merkle tree (must be between 1 and 254).
37
+ * @param values - An array of key-value pairs to store in the tree.
38
+ *
39
+ * @throws Will throw an error if the number of values exceeds the maximum capacity of the tree.
40
+ * @throws Will throw an error if any key is out of bounds for the tree height.
41
+ */
42
+ constructor(height: number, values: { key: bigint; value: Field }[]) {
43
+ this.values = values;
44
+ this.height = height;
45
+ const tree = new MerkleTree(height);
46
+ const maxElements = tree.leafCount;
47
+
48
+ if (values.length > tree.leafCount) {
49
+ throw new Error(
50
+ `Tree height ${height} can only have ${maxElements} elements`
51
+ );
52
+ }
53
+
54
+ for (const { key, value } of values) {
55
+ if (key >= maxElements) {
56
+ throw new Error(
57
+ `Key ${key} is out of bounds for tree height ${height}`
58
+ );
59
+ }
60
+ tree.setLeaf(key, value);
61
+ }
62
+
63
+ this.root = tree.getRoot();
64
+ }
65
+
66
+ /**
67
+ * Serializes the `MetadataTree` to a JSON object.
68
+ *
69
+ * @returns An object containing the tree's height, root, and values.
70
+ */
71
+ public toJSON(): {
72
+ height: number;
73
+ root: string;
74
+ values: { key: string; value: string }[];
75
+ } {
76
+ return {
77
+ height: this.height,
78
+ root: this.root.toJSON(),
79
+ values: this.values.map(({ key, value }) => ({
80
+ key: key.toString(),
81
+ value: value.toJSON(),
82
+ })),
83
+ };
84
+ }
85
+
86
+ /**
87
+ * Deserializes a JSON object into a `MetadataTree` instance.
88
+ *
89
+ * @param json - The JSON object containing the tree data.
90
+ *
91
+ * @returns A new `MetadataTree` instance constructed from the JSON data.
92
+ *
93
+ * @throws Will throw an error if the JSON data is invalid or inconsistent.
94
+ */
95
+ static fromJSON(json: {
96
+ height: number;
97
+ root: string;
98
+ values: { key: string; value: string }[];
99
+ }): MetadataTree {
100
+ const { height, values, root } = json;
101
+
102
+ if (typeof height !== "number" || height < 1 || height > 254)
103
+ throw new Error(`Invalid tree height`);
104
+
105
+ if (!root || typeof root !== "string") throw new Error(`Invalid tree root`);
106
+
107
+ if (!values || !Array.isArray(values))
108
+ throw new Error(`Tree values are required`);
109
+
110
+ for (const { key, value } of values) {
111
+ if (!key || typeof key !== "string") throw new Error(`Invalid tree key`);
112
+ if (!value || typeof value !== "string")
113
+ throw new Error(`Invalid tree value`);
114
+ }
115
+
116
+ const tree = new MetadataTree(
117
+ height,
118
+ values.map(({ key, value }) => ({
119
+ key: BigInt(key),
120
+ value: Field.fromJSON(value),
121
+ }))
122
+ );
123
+
124
+ if (tree.root.toJSON() !== root) throw new Error("Invalid tree json");
125
+
126
+ return tree;
127
+ }
128
+ }
package/src/vk.ts ADDED
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Type representing the supported network IDs for the Mina Protocol.
3
+ *
4
+ * Currently supports:
5
+ * - `"devnet"`: The Mina local blockchain and devnet
6
+ * - `"mainnet"`: The Mina mainnet
7
+ */
8
+ export type SupportedNetworkId = "devnet" | "mainnet";
9
+
10
+ /**
11
+ * An object containing the verification keys for the NFT Collection and NFT contracts on different networks.
12
+ *
13
+ *
14
+ * @remarks
15
+ * The `NFTVerificationKeys` object maps a `SupportedNetworkId` to the corresponding verification keys for the NFT Collection and NFT contracts.
16
+ *
17
+ * **Structure:**
18
+ * - `network`: The network identifier (`"devnet"` or `"mainnet"`).
19
+ * - `collection`:
20
+ * - `hash`: The hash of the verification key for the NFT Collection contract.
21
+ * - `data`: The verification key data for the NFT Collection contract.
22
+ * - `nft`:
23
+ * - `hash`: The hash of the verification key for the NFT contract.
24
+ * - `data`: The verification key data for the NFT contract.
25
+ *
26
+ * @example
27
+ * Accessing the verification key hash for the NFT Collection on testnet:
28
+ * ```typescript
29
+ * const testnetCollectionVKHash = NFTVerificationKeys["devnet"].collection.hash;
30
+ * ```
31
+ */
32
+ export const nftVerificationKeys: {
33
+ [key in "mainnet" | "devnet"]: {
34
+ o1js: string;
35
+ vk: {
36
+ [key: string]: {
37
+ hash: string;
38
+ data: string;
39
+ type: "nft";
40
+ };
41
+ };
42
+ };
43
+ } = {
44
+ devnet: {
45
+ o1js: "2.2.0",
46
+ vk: {
47
+ NFT: {
48
+ hash: "11840382732064931640435917684245815329181717734233274982467687213333743677377",
49
+ data: "AADUTaZ5kJK+C2TL7P/tc4MlgEq5zWOLFDtgDU/u9ry3Es1Ek79TcLqIWg8s6TJJcXzM0D/6xz1y8FQn2tGjjcspfNtNRAmG3FdldAatVpnkTwS6Otpm88gl7lOPX8bRJjhHfEtdvEsQ0OudcDzB5iCqu268zqkBvXrXT3xaNN+sIIqLTtxltMz4RS/2layxzL6mg1J+kkTsNIJsg6MufeMI6Xn5pAYOaWFqgo0N0WZsnF3EYcYq1LcDucyyFS2RqRninioewrlEDzjY8y6rmf9+GibQasJCE+mkbfB4wCOuFMiSrRIN/73BODz9siBxs/bU/p7xffJsOL8JvitK7ngRyG3PfGGdW22njv9MYxNhb/YhKnPA0qPTOQjxg1a/Pg8NyjB9RM7eypPJNLFaWFzNM4JRxjI7wGVVOfE0D7DUAL32SzQ1Jmr4mILqDhnDREu2ETq0Lb+c1cxPgb4x1nYbWcSgdAOtKJBvXHkWs7JlJdL1q9yiRrzYb1kPMPNGACnSB3N3Omm//FhxitOOM4yucxZyKpKst/otZu51/gGBDW5tIwKYpfl5ETSNvDFY+9rLUHv+LxSz+yq6cUFKExI6AHlh4NOJ48RYK+GMvvI1cc3P2WsPr3WFV0H/KMIOKjg/GvoOXQ632/hE1us30Nsm9BgRswE7Zrx8zDbjBdDspQWavhgVmpC5Q7SrwYYPkqb/HBWsxMcdrB842bKWsszzPYQxR6cfCwjXzq9Txe7fh1bzOKY6WO7ysYpefFM+yY85IlYCzX1/97FEaPGF4lBMe2ONgwPMq3VJ6Yxzfnor4zPMyH1pW2dm2QmV0Ep2NYO7fVGPn83abwq34GMgZmriFh3M7XzlYX54q3CeG861Z+HPZHukv+oVlUyWtWGk4E4PNlm61kXaLF7ECDy2+s73Ris1HbVSbbCOMkAok4Ytwi0FGwrSFSvRbb7s5Mbnfg6zvkKYwbNMjff5OlJPUcK5GMaYp2Ii2+7t+j3Wx8wSwdqlat61zS/PuZtaxiT0DL8+0mh8S8zZnCUC/Sda2LeJW2brN9WXg8adeZ5d7eNx2yEeQws2CziWKiC1t0Z2hoGvnjzpZH+pq2zfaEk+JnQEHR+EpRqK17Vyq98iBsGM9riQLCa8SO2wsOnYS0zS8CIP6hwFKbTs7Ueq7fnmRsuHpuwI/BW7ilCHLoJ/D9fJ4h+DHeZijuM3U31QTU555rWwJ48EWT4y8Wmh84sEIrEUFDA9GS8I+Rgl5eE6QsQm09cJ2/FTzuIf2ps4+WcWf20huAyxrUOJxM1alZvTDTcAY9GPkPnFqQ46Uuch5x0k1Q1sxkgplNx2+uE6xGFUloYB5DKDdApgafJbVZ5YBrghBstiDkOVkOPTsRWM9BbJB5A4Ult8q4V+rNyRmqyyzOMhYEW2kj8yWr5CImCBZW0QPHzBXr/xZCcUH2VBZMKMqCly/9VkHR5LlMGgG5UlibSkoZvI2EOl1pFPW7F9dZ6JM18zW3VHNNM4W1drrTxbta0wX2Hp6lmtmOPOxjvYSrQiLBSFvouZ29tALODGK+21jErmEUoMJsRiRS6/cIkErD1tSO4qe86XPXYQ5niN34QsGWawOmVJIXoobD9vEvJHGpylpTg5i4HXBZu31nN/bezAQ0bp0k5k2iI4jo91gFoPItUXpBk2rLNZHMUhZOKT81yhJLnE5ihfrTQLgplzqRo7Dc7lQdohdyvzCi8Bxx/beoojY0ixWBVAw5bWK9/5KjImxG/2c38hBZ+2QYS/el2BEMe8mBUJqQ6bn/wVKngn6KsXEuIHf4Fs4JRA3xbWwP/9jrxFzYJ9pOW4ehETRBneHurW/1Myw/sOAebVzbhcEMVYeg2x4S2bgFHRteOBKgAkwfQFD/kvT+Cj6cYKcFgAQchhccMvUYC7IHdFFJ1vBRbWpWKwrXMrpXhP9R0/jhiIDG9iEYdRcW2Gc8SoxEMYa4Yp6VK1DaZ8X4YG1x6tVj/KLG+MoA7S9SoHhnNacyJJboJiczKR2kWcZswBrCughfCRlonVt+xj7zQeVyyaKql/9PHQKj49dpZYAeMtkq3k1P6Q/ivGrXXJ3y2ktO0usnVat5iQ7Q4Gi2Dvbpvm72q0bAeZDvlH4QTmFzJ0wApj1zXt1XK2z1nA9RSH7f6sI5JskSLQlnXfdUEW52vnOTGE4uZK2P4g5YlAiAVddmI0zGXoamMWlv9MaDFHKlcJtA9IZZZeC+cLzWhE177Y6VXumacpK7i70LwRR9ghnykqf5SuYTzlAVLaufgsR0LDwNStGwrF6JtPMsoD9DVNKrpQ+tNNUfYovOM1iwk2BXvz9BydiqZzFhmfIYXSkScpVvuThbsPxBZ1LqfCaX4f5Rz28GZILf0d9xPjsWFSCRk=",
50
+ type: "nft",
51
+ },
52
+ },
53
+ },
54
+ mainnet: {
55
+ o1js: "2.2.0",
56
+ vk: {
57
+ NFT: {
58
+ hash: "11510318025893859422482952918693907155880273225165466507725691048640041393360",
59
+ data: "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",
60
+ type: "nft",
61
+ },
62
+ },
63
+ },
64
+ };
@@ -0,0 +1,136 @@
1
+ /**
2
+ * NFTMatchProgram is a ZkProgram providing zero-knowledge proofs for matching NFT metadata to Smart Contract state.
3
+ *
4
+ * @module NFTMatchProgram
5
+ */
6
+
7
+ import { ZkProgram, Field, Cache, PublicKey, SelfProof, Provable } from "o1js";
8
+ import { NFTState } from "../interfaces/types.js";
9
+ import { Metadata, MetadataMap, MetadataValue } from "../metadata/metadata.js";
10
+ import { fieldFromString } from "../interfaces/encoding.js";
11
+ import { createIpfsURL, Storage } from "@silvana-one/storage";
12
+ export { NFTGameProgram };
13
+
14
+ /**
15
+ * Defines the NFTProgram ZkProgram with methods for updating NFT metadata.
16
+ */
17
+ const NFTGameProgram = ZkProgram({
18
+ name: "NFTGameProgram",
19
+ publicInput: NFTState,
20
+ publicOutput: NFTState,
21
+ methods: {
22
+ /**
23
+ * Updates the NFT's metadata map with a new key-value pairs.
24
+ *
25
+ * @returns {Promise<{ publicOutput: NFTState; auxiliaryOutput: MetadataMap }>} A promise resolving to an object containing the updated NFT state and auxiliary output.
26
+ *
27
+ * @remarks
28
+ * This method verifies that the provided signature is valid and corresponds to the NFT owner.
29
+ * It then inserts the new key-value pair into the metadata map, ensuring that the key does not already exist.
30
+ * The method returns an updated NFT state with the new metadata root and increments the version.
31
+ */
32
+ updateMetadataAndOwner: {
33
+ privateInputs: [MetadataMap, PublicKey, Field, Field, Storage, PublicKey],
34
+ auxiliaryOutput: MetadataMap,
35
+ async method(
36
+ initialState: NFTState,
37
+ metadata: MetadataMap,
38
+ contract: PublicKey,
39
+ score: Field,
40
+ color: Field,
41
+ storage: Storage,
42
+ owner: PublicKey
43
+ ): Promise<{ publicOutput: NFTState; auxiliaryOutput: MetadataMap }> {
44
+ metadata.root.assertEquals(initialState.metadata);
45
+ metadata.set(
46
+ fieldFromString("color"),
47
+ MetadataValue.new({ value: color, type: "field" }).hash()
48
+ );
49
+ metadata.set(
50
+ fieldFromString("score"),
51
+ MetadataValue.new({ value: score, type: "field" }).hash()
52
+ );
53
+ initialState.oracleAddress.assertEquals(contract);
54
+ initialState.context.custom[0].assertEquals(score);
55
+ initialState.context.custom[1].assertEquals(color);
56
+ MetadataValue.new({ value: contract.x, type: "field" })
57
+ .hash()
58
+ .assertEquals(metadata.get(fieldFromString("contractX")));
59
+ MetadataValue.new({
60
+ value: contract.isOdd.toField(),
61
+ type: "field",
62
+ })
63
+ .hash()
64
+ .assertEquals(metadata.get(fieldFromString("contractIsOdd")));
65
+
66
+ contract.assertEquals(initialState.oracleAddress);
67
+
68
+ // This code does NOT create a constraint on the storage as we use IPFS.
69
+ // It is used to verify that the storage that will be used is valid.
70
+ // After Project Untitled will be released, this code should be changed
71
+ // to create a constraint on the storage using Project Untitled.
72
+ const metadataRoot = await Provable.witnessAsync(Field, async () => {
73
+ const fetchResult = await fetch(
74
+ createIpfsURL({ hash: storage.toString() })
75
+ );
76
+ if (!fetchResult.ok) {
77
+ throw new Error("Failed to fetch metadata");
78
+ }
79
+ const json = await fetchResult.json();
80
+ if (!json) {
81
+ throw new Error("Failed to fetch metadata");
82
+ }
83
+
84
+ const metadata = Metadata.fromJSON({
85
+ json,
86
+ checkRoot: true,
87
+ });
88
+ return metadata.map.root;
89
+ });
90
+ metadataRoot.assertEquals(metadata.root);
91
+
92
+ // Owner can be updated only in case of a maximum score - 7 when the winner gets the NFT
93
+ owner
94
+ .equals(initialState.owner)
95
+ .or(score.equals(Field(7)))
96
+ .assertTrue();
97
+
98
+ return {
99
+ publicOutput: new NFTState({
100
+ metadata: metadata.root,
101
+ owner,
102
+ storage,
103
+ immutableState: initialState.immutableState,
104
+ approved: initialState.approved,
105
+ name: initialState.name,
106
+ isPaused: initialState.isPaused,
107
+ version: initialState.version.add(1),
108
+ metadataVerificationKeyHash:
109
+ initialState.metadataVerificationKeyHash,
110
+ creator: initialState.creator,
111
+ oracleAddress: initialState.oracleAddress,
112
+ context: initialState.context,
113
+ }),
114
+ auxiliaryOutput: metadata,
115
+ };
116
+ },
117
+ },
118
+
119
+ merge: {
120
+ privateInputs: [SelfProof, SelfProof],
121
+ async method(
122
+ initialState: NFTState,
123
+ proof1: SelfProof<NFTState, NFTState>,
124
+ proof2: SelfProof<NFTState, NFTState>
125
+ ) {
126
+ proof1.verify();
127
+ proof2.verify();
128
+ NFTState.assertEqual(initialState, proof1.publicInput);
129
+ NFTState.assertEqual(proof1.publicOutput, proof2.publicInput);
130
+ return {
131
+ publicOutput: proof2.publicOutput,
132
+ };
133
+ },
134
+ },
135
+ },
136
+ });
@@ -0,0 +1,2 @@
1
+ export * from "./update.js";
2
+ export * from "./game.js";
@@ -0,0 +1,98 @@
1
+ /**
2
+ * NFTProgram is a ZkProgram providing zero-knowledge proofs for updating NFT metadata.
3
+ * It includes methods for inserting metadata entries and merging proofs.
4
+ *
5
+ * @module NFTProgram
6
+ */
7
+
8
+ import { ZkProgram, Field, Cache, SelfProof, Signature } from "o1js";
9
+ import { NFTState } from "../interfaces/types.js";
10
+ import { MetadataMap } from "../metadata/metadata.js";
11
+ export { NFTProgram };
12
+
13
+ /**
14
+ * Defines the NFTProgram ZkProgram with methods for updating NFT metadata.
15
+ */
16
+ const NFTProgram = ZkProgram({
17
+ name: "NFTProgram",
18
+ publicInput: NFTState,
19
+ publicOutput: NFTState,
20
+ methods: {
21
+ /**
22
+ * Inserts a metadata key-value pair into the NFT's metadata map.
23
+ *
24
+ * @returns {Promise<{ publicOutput: NFTState; auxiliaryOutput: MetadataMap }>} A promise resolving to an object containing the updated NFT state and auxiliary output.
25
+ *
26
+ * @remarks
27
+ * This method verifies that the provided signature is valid and corresponds to the NFT owner.
28
+ * It then inserts the new key-value pair into the metadata map, ensuring that the key does not already exist.
29
+ * The method returns an updated NFT state with the new metadata root and increments the version.
30
+ */
31
+ insertMetadata: {
32
+ privateInputs: [MetadataMap, Field, Field, Signature],
33
+ auxiliaryOutput: MetadataMap,
34
+ async method(
35
+ initialState: NFTState,
36
+ metadata: MetadataMap,
37
+ key: Field,
38
+ value: Field,
39
+ signature: Signature
40
+ ): Promise<{ publicOutput: NFTState; auxiliaryOutput: MetadataMap }> {
41
+ signature
42
+ .verify(initialState.owner, [
43
+ ...NFTState.toFields(initialState),
44
+ key,
45
+ value,
46
+ ])
47
+ .assertTrue("Wrong owner signature");
48
+ metadata.insert(key, value); // Proves that key does not exist
49
+
50
+ return {
51
+ publicOutput: new NFTState({
52
+ immutableState: initialState.immutableState,
53
+ metadata: metadata.root,
54
+ owner: initialState.owner,
55
+ approved: initialState.approved,
56
+ name: initialState.name,
57
+ storage: initialState.storage,
58
+ isPaused: initialState.isPaused,
59
+ version: initialState.version.add(1),
60
+ metadataVerificationKeyHash:
61
+ initialState.metadataVerificationKeyHash,
62
+ creator: initialState.creator,
63
+ oracleAddress: initialState.oracleAddress,
64
+ context: initialState.context,
65
+ }),
66
+ auxiliaryOutput: metadata,
67
+ };
68
+ },
69
+ },
70
+ /**
71
+ * Merges two self-proofs to produce a new NFT state.
72
+ *
73
+ * @returns {Promise<{ publicOutput: NFTState }>} A promise resolving to an object containing the merged NFT state.
74
+ *
75
+ * @remarks
76
+ * This method verifies both proofs and asserts the consistency of their inputs and outputs.
77
+ * It ensures that the initial state matches the public input of the first proof,
78
+ * and that the public output of the first proof matches the public input of the second proof.
79
+ * The method returns the public output of the second proof as the new merged NFT state.
80
+ */
81
+ merge: {
82
+ privateInputs: [SelfProof, SelfProof],
83
+ async method(
84
+ initialState: NFTState,
85
+ proof1: SelfProof<NFTState, NFTState>,
86
+ proof2: SelfProof<NFTState, NFTState>
87
+ ) {
88
+ proof1.verify();
89
+ proof2.verify();
90
+ NFTState.assertEqual(initialState, proof1.publicInput);
91
+ NFTState.assertEqual(proof1.publicOutput, proof2.publicInput);
92
+ return {
93
+ publicOutput: proof2.publicOutput,
94
+ };
95
+ },
96
+ },
97
+ },
98
+ });