@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,85 @@
1
+ import { MerkleTree, Field } from "o1js";
2
+ /**
3
+ * Represents a metadata tree using a Merkle tree structure.
4
+ *
5
+ * The `MetadataTree` class is used to manage a set of key-value pairs representing metadata,
6
+ * storing them in a Merkle tree for efficient verification and integrity checks.
7
+ *
8
+ * This class is a utility within the NFT standard on Mina Protocol, enabling secure and verifiable
9
+ * storage of metadata. By leveraging the Merkle tree, clients can prove the inclusion of specific
10
+ * metadata entries without exposing the entire dataset.
11
+ */
12
+ export class MetadataTree {
13
+ /**
14
+ * Constructs a new `MetadataTree` with the specified height and key-value pairs.
15
+ *
16
+ * @param height - The height of the Merkle tree (must be between 1 and 254).
17
+ * @param values - An array of key-value pairs to store in the tree.
18
+ *
19
+ * @throws Will throw an error if the number of values exceeds the maximum capacity of the tree.
20
+ * @throws Will throw an error if any key is out of bounds for the tree height.
21
+ */
22
+ constructor(height, values) {
23
+ this.values = values;
24
+ this.height = height;
25
+ const tree = new MerkleTree(height);
26
+ const maxElements = tree.leafCount;
27
+ if (values.length > tree.leafCount) {
28
+ throw new Error(`Tree height ${height} can only have ${maxElements} elements`);
29
+ }
30
+ for (const { key, value } of values) {
31
+ if (key >= maxElements) {
32
+ throw new Error(`Key ${key} is out of bounds for tree height ${height}`);
33
+ }
34
+ tree.setLeaf(key, value);
35
+ }
36
+ this.root = tree.getRoot();
37
+ }
38
+ /**
39
+ * Serializes the `MetadataTree` to a JSON object.
40
+ *
41
+ * @returns An object containing the tree's height, root, and values.
42
+ */
43
+ toJSON() {
44
+ return {
45
+ height: this.height,
46
+ root: this.root.toJSON(),
47
+ values: this.values.map(({ key, value }) => ({
48
+ key: key.toString(),
49
+ value: value.toJSON(),
50
+ })),
51
+ };
52
+ }
53
+ /**
54
+ * Deserializes a JSON object into a `MetadataTree` instance.
55
+ *
56
+ * @param json - The JSON object containing the tree data.
57
+ *
58
+ * @returns A new `MetadataTree` instance constructed from the JSON data.
59
+ *
60
+ * @throws Will throw an error if the JSON data is invalid or inconsistent.
61
+ */
62
+ static fromJSON(json) {
63
+ const { height, values, root } = json;
64
+ if (typeof height !== "number" || height < 1 || height > 254)
65
+ throw new Error(`Invalid tree height`);
66
+ if (!root || typeof root !== "string")
67
+ throw new Error(`Invalid tree root`);
68
+ if (!values || !Array.isArray(values))
69
+ throw new Error(`Tree values are required`);
70
+ for (const { key, value } of values) {
71
+ if (!key || typeof key !== "string")
72
+ throw new Error(`Invalid tree key`);
73
+ if (!value || typeof value !== "string")
74
+ throw new Error(`Invalid tree value`);
75
+ }
76
+ const tree = new MetadataTree(height, values.map(({ key, value }) => ({
77
+ key: BigInt(key),
78
+ value: Field.fromJSON(value),
79
+ })));
80
+ if (tree.root.toJSON() !== root)
81
+ throw new Error("Invalid tree json");
82
+ return tree;
83
+ }
84
+ }
85
+ //# sourceMappingURL=tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree.js","sourceRoot":"","sources":["../../../src/metadata/tree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
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
+ * An object containing the verification keys for the NFT Collection and NFT contracts on different networks.
11
+ *
12
+ *
13
+ * @remarks
14
+ * The `NFTVerificationKeys` object maps a `SupportedNetworkId` to the corresponding verification keys for the NFT Collection and NFT contracts.
15
+ *
16
+ * **Structure:**
17
+ * - `network`: The network identifier (`"devnet"` or `"mainnet"`).
18
+ * - `collection`:
19
+ * - `hash`: The hash of the verification key for the NFT Collection contract.
20
+ * - `data`: The verification key data for the NFT Collection contract.
21
+ * - `nft`:
22
+ * - `hash`: The hash of the verification key for the NFT contract.
23
+ * - `data`: The verification key data for the NFT contract.
24
+ *
25
+ * @example
26
+ * Accessing the verification key hash for the NFT Collection on testnet:
27
+ * ```typescript
28
+ * const testnetCollectionVKHash = NFTVerificationKeys["devnet"].collection.hash;
29
+ * ```
30
+ */
31
+ export declare const nftVerificationKeys: {
32
+ [key in "mainnet" | "devnet"]: {
33
+ o1js: string;
34
+ vk: {
35
+ [key: string]: {
36
+ hash: string;
37
+ data: string;
38
+ type: "nft";
39
+ };
40
+ };
41
+ };
42
+ };
package/dist/web/vk.js ADDED
@@ -0,0 +1,45 @@
1
+ /**
2
+ * An object containing the verification keys for the NFT Collection and NFT contracts on different networks.
3
+ *
4
+ *
5
+ * @remarks
6
+ * The `NFTVerificationKeys` object maps a `SupportedNetworkId` to the corresponding verification keys for the NFT Collection and NFT contracts.
7
+ *
8
+ * **Structure:**
9
+ * - `network`: The network identifier (`"devnet"` or `"mainnet"`).
10
+ * - `collection`:
11
+ * - `hash`: The hash of the verification key for the NFT Collection contract.
12
+ * - `data`: The verification key data for the NFT Collection contract.
13
+ * - `nft`:
14
+ * - `hash`: The hash of the verification key for the NFT contract.
15
+ * - `data`: The verification key data for the NFT contract.
16
+ *
17
+ * @example
18
+ * Accessing the verification key hash for the NFT Collection on testnet:
19
+ * ```typescript
20
+ * const testnetCollectionVKHash = NFTVerificationKeys["devnet"].collection.hash;
21
+ * ```
22
+ */
23
+ export const nftVerificationKeys = {
24
+ devnet: {
25
+ o1js: "2.2.0",
26
+ vk: {
27
+ NFT: {
28
+ hash: "11840382732064931640435917684245815329181717734233274982467687213333743677377",
29
+ data: "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",
30
+ type: "nft",
31
+ },
32
+ },
33
+ },
34
+ mainnet: {
35
+ o1js: "2.2.0",
36
+ vk: {
37
+ NFT: {
38
+ hash: "11510318025893859422482952918693907155880273225165466507725691048640041393360",
39
+ data: "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",
40
+ type: "nft",
41
+ },
42
+ },
43
+ },
44
+ };
45
+ //# sourceMappingURL=vk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vk.js","sourceRoot":"","sources":["../../src/vk.ts"],"names":[],"mappings":"AASA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAW5B;IACF,MAAM,EAAE;QACN,IAAI,EAAE,OAAO;QACb,EAAE,EAAE;YACF,GAAG,EAAE;gBACH,IAAI,EAAE,+EAA+E;gBACrF,IAAI,EAAE,81EAA81E;gBACp2E,IAAI,EAAE,KAAK;aACZ;SACF;KACF;IACD,OAAO,EAAE;QACP,IAAI,EAAE,OAAO;QACb,EAAE,EAAE;YACF,GAAG,EAAE;gBACH,IAAI,EAAE,+EAA+E;gBACrF,IAAI,EAAE,81EAA81E;gBACp2E,IAAI,EAAE,KAAK;aACZ;SACF;KACF;CACF,CAAC"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * NFTMatchProgram is a ZkProgram providing zero-knowledge proofs for matching NFT metadata to Smart Contract state.
3
+ *
4
+ * @module NFTMatchProgram
5
+ */
6
+ import { Field, Cache, PublicKey, SelfProof } from "o1js";
7
+ import { NFTState } from "../interfaces/types.js";
8
+ import { MetadataMap } from "../metadata/metadata.js";
9
+ import { Storage } from "@silvana-one/storage";
10
+ export { NFTGameProgram };
11
+ /**
12
+ * Defines the NFTProgram ZkProgram with methods for updating NFT metadata.
13
+ */
14
+ declare const NFTGameProgram: {
15
+ name: string;
16
+ compile: (options?: {
17
+ cache?: Cache;
18
+ forceRecompile?: boolean;
19
+ proofsEnabled?: boolean;
20
+ }) => Promise<{
21
+ verificationKey: {
22
+ data: string;
23
+ hash: Field;
24
+ };
25
+ }>;
26
+ verify: (proof: import("o1js").Proof<NFTState, NFTState>) => Promise<boolean>;
27
+ digest: () => Promise<string>;
28
+ analyzeMethods: () => Promise<{
29
+ updateMetadataAndOwner: {
30
+ rows: number;
31
+ digest: string;
32
+ gates: import("node_modules/o1js/dist/node/snarky.js").Gate[];
33
+ publicInputSize: number;
34
+ print(): void;
35
+ summary(): Partial<Record<import("node_modules/o1js/dist/node/snarky.js").GateType | "Total rows", number>>;
36
+ };
37
+ merge: {
38
+ rows: number;
39
+ digest: string;
40
+ gates: import("node_modules/o1js/dist/node/snarky.js").Gate[];
41
+ publicInputSize: number;
42
+ print(): void;
43
+ summary(): Partial<Record<import("node_modules/o1js/dist/node/snarky.js").GateType | "Total rows", number>>;
44
+ };
45
+ }>;
46
+ publicInputType: typeof NFTState;
47
+ publicOutputType: typeof NFTState;
48
+ privateInputTypes: {
49
+ updateMetadataAndOwner: [typeof MetadataMap, typeof PublicKey, typeof import("node_modules/o1js/dist/node/lib/provable/field.js").Field & ((x: string | number | bigint | import("node_modules/o1js/dist/node/lib/provable/core/fieldvar.js").FieldConst | import("node_modules/o1js/dist/node/lib/provable/core/fieldvar.js").FieldVar | import("node_modules/o1js/dist/node/lib/provable/field.js").Field) => import("node_modules/o1js/dist/node/lib/provable/field.js").Field), typeof import("node_modules/o1js/dist/node/lib/provable/field.js").Field & ((x: string | number | bigint | import("node_modules/o1js/dist/node/lib/provable/core/fieldvar.js").FieldConst | import("node_modules/o1js/dist/node/lib/provable/core/fieldvar.js").FieldVar | import("node_modules/o1js/dist/node/lib/provable/field.js").Field) => import("node_modules/o1js/dist/node/lib/provable/field.js").Field), typeof Storage, typeof PublicKey];
50
+ merge: [typeof SelfProof, typeof SelfProof];
51
+ };
52
+ auxiliaryOutputTypes: {
53
+ updateMetadataAndOwner: typeof MetadataMap;
54
+ merge: undefined;
55
+ };
56
+ rawMethods: {
57
+ updateMetadataAndOwner: (publicInput: NFTState, ...args: [import("node_modules/o1js/dist/node/lib/provable/merkle-tree-indexed.js").IndexedMerkleMapBase, PublicKey, import("node_modules/o1js/dist/node/lib/provable/field.js").Field, import("node_modules/o1js/dist/node/lib/provable/field.js").Field, Storage, PublicKey] & any[]) => Promise<{
58
+ publicOutput: NFTState;
59
+ auxiliaryOutput: import("node_modules/o1js/dist/node/lib/provable/merkle-tree-indexed.js").IndexedMerkleMapBase;
60
+ }>;
61
+ merge: (publicInput: NFTState, ...args: [SelfProof<unknown, unknown>, SelfProof<unknown, unknown>] & any[]) => Promise<{
62
+ publicOutput: NFTState;
63
+ }>;
64
+ };
65
+ proofsEnabled: boolean;
66
+ setProofsEnabled(proofsEnabled: boolean): void;
67
+ } & {
68
+ updateMetadataAndOwner: (publicInput: NFTState, ...args: [import("node_modules/o1js/dist/node/lib/provable/merkle-tree-indexed.js").IndexedMerkleMapBase, PublicKey, import("node_modules/o1js/dist/node/lib/provable/field.js").Field, import("node_modules/o1js/dist/node/lib/provable/field.js").Field, Storage, PublicKey] & any[]) => Promise<{
69
+ proof: import("o1js").Proof<NFTState, NFTState>;
70
+ auxiliaryOutput: import("node_modules/o1js/dist/node/lib/provable/merkle-tree-indexed.js").IndexedMerkleMapBase;
71
+ }>;
72
+ merge: (publicInput: NFTState, ...args: [SelfProof<unknown, unknown>, SelfProof<unknown, unknown>] & any[]) => Promise<{
73
+ proof: import("o1js").Proof<NFTState, NFTState>;
74
+ auxiliaryOutput: undefined;
75
+ }>;
76
+ };
@@ -0,0 +1,108 @@
1
+ /**
2
+ * NFTMatchProgram is a ZkProgram providing zero-knowledge proofs for matching NFT metadata to Smart Contract state.
3
+ *
4
+ * @module NFTMatchProgram
5
+ */
6
+ import { ZkProgram, Field, PublicKey, SelfProof, Provable } from "o1js";
7
+ import { NFTState } from "../interfaces/types.js";
8
+ import { Metadata, MetadataMap, MetadataValue } from "../metadata/metadata.js";
9
+ import { fieldFromString } from "../interfaces/encoding.js";
10
+ import { createIpfsURL, Storage } from "@silvana-one/storage";
11
+ export { NFTGameProgram };
12
+ /**
13
+ * Defines the NFTProgram ZkProgram with methods for updating NFT metadata.
14
+ */
15
+ const NFTGameProgram = ZkProgram({
16
+ name: "NFTGameProgram",
17
+ publicInput: NFTState,
18
+ publicOutput: NFTState,
19
+ methods: {
20
+ /**
21
+ * Updates the NFT's metadata map with a new key-value pairs.
22
+ *
23
+ * @returns {Promise<{ publicOutput: NFTState; auxiliaryOutput: MetadataMap }>} A promise resolving to an object containing the updated NFT state and auxiliary output.
24
+ *
25
+ * @remarks
26
+ * This method verifies that the provided signature is valid and corresponds to the NFT owner.
27
+ * It then inserts the new key-value pair into the metadata map, ensuring that the key does not already exist.
28
+ * The method returns an updated NFT state with the new metadata root and increments the version.
29
+ */
30
+ updateMetadataAndOwner: {
31
+ privateInputs: [MetadataMap, PublicKey, Field, Field, Storage, PublicKey],
32
+ auxiliaryOutput: MetadataMap,
33
+ async method(initialState, metadata, contract, score, color, storage, owner) {
34
+ metadata.root.assertEquals(initialState.metadata);
35
+ metadata.set(fieldFromString("color"), MetadataValue.new({ value: color, type: "field" }).hash());
36
+ metadata.set(fieldFromString("score"), MetadataValue.new({ value: score, type: "field" }).hash());
37
+ initialState.oracleAddress.assertEquals(contract);
38
+ initialState.context.custom[0].assertEquals(score);
39
+ initialState.context.custom[1].assertEquals(color);
40
+ MetadataValue.new({ value: contract.x, type: "field" })
41
+ .hash()
42
+ .assertEquals(metadata.get(fieldFromString("contractX")));
43
+ MetadataValue.new({
44
+ value: contract.isOdd.toField(),
45
+ type: "field",
46
+ })
47
+ .hash()
48
+ .assertEquals(metadata.get(fieldFromString("contractIsOdd")));
49
+ contract.assertEquals(initialState.oracleAddress);
50
+ // This code does NOT create a constraint on the storage as we use IPFS.
51
+ // It is used to verify that the storage that will be used is valid.
52
+ // After Project Untitled will be released, this code should be changed
53
+ // to create a constraint on the storage using Project Untitled.
54
+ const metadataRoot = await Provable.witnessAsync(Field, async () => {
55
+ const fetchResult = await fetch(createIpfsURL({ hash: storage.toString() }));
56
+ if (!fetchResult.ok) {
57
+ throw new Error("Failed to fetch metadata");
58
+ }
59
+ const json = await fetchResult.json();
60
+ if (!json) {
61
+ throw new Error("Failed to fetch metadata");
62
+ }
63
+ const metadata = Metadata.fromJSON({
64
+ json,
65
+ checkRoot: true,
66
+ });
67
+ return metadata.map.root;
68
+ });
69
+ metadataRoot.assertEquals(metadata.root);
70
+ // Owner can be updated only in case of a maximum score - 7 when the winner gets the NFT
71
+ owner
72
+ .equals(initialState.owner)
73
+ .or(score.equals(Field(7)))
74
+ .assertTrue();
75
+ return {
76
+ publicOutput: new NFTState({
77
+ metadata: metadata.root,
78
+ owner,
79
+ storage,
80
+ immutableState: initialState.immutableState,
81
+ approved: initialState.approved,
82
+ name: initialState.name,
83
+ isPaused: initialState.isPaused,
84
+ version: initialState.version.add(1),
85
+ metadataVerificationKeyHash: initialState.metadataVerificationKeyHash,
86
+ creator: initialState.creator,
87
+ oracleAddress: initialState.oracleAddress,
88
+ context: initialState.context,
89
+ }),
90
+ auxiliaryOutput: metadata,
91
+ };
92
+ },
93
+ },
94
+ merge: {
95
+ privateInputs: [SelfProof, SelfProof],
96
+ async method(initialState, proof1, proof2) {
97
+ proof1.verify();
98
+ proof2.verify();
99
+ NFTState.assertEqual(initialState, proof1.publicInput);
100
+ NFTState.assertEqual(proof1.publicOutput, proof2.publicInput);
101
+ return {
102
+ publicOutput: proof2.publicOutput,
103
+ };
104
+ },
105
+ },
106
+ },
107
+ });
108
+ //# sourceMappingURL=game.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"game.js","sourceRoot":"","sources":["../../../src/zkprogram-example/game.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from "./update.js";
2
+ export * from "./game.js";
@@ -0,0 +1,3 @@
1
+ export * from "./update.js";
2
+ export * from "./game.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/zkprogram-example/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC"}
@@ -0,0 +1,76 @@
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
+ import { Field, Cache, SelfProof, Signature } from "o1js";
8
+ import { NFTState } from "../interfaces/types.js";
9
+ import { MetadataMap } from "../metadata/metadata.js";
10
+ export { NFTProgram };
11
+ /**
12
+ * Defines the NFTProgram ZkProgram with methods for updating NFT metadata.
13
+ */
14
+ declare const NFTProgram: {
15
+ name: string;
16
+ compile: (options?: {
17
+ cache?: Cache;
18
+ forceRecompile?: boolean;
19
+ proofsEnabled?: boolean;
20
+ }) => Promise<{
21
+ verificationKey: {
22
+ data: string;
23
+ hash: Field;
24
+ };
25
+ }>;
26
+ verify: (proof: import("o1js").Proof<NFTState, NFTState>) => Promise<boolean>;
27
+ digest: () => Promise<string>;
28
+ analyzeMethods: () => Promise<{
29
+ insertMetadata: {
30
+ rows: number;
31
+ digest: string;
32
+ gates: import("node_modules/o1js/dist/node/snarky.js").Gate[];
33
+ publicInputSize: number;
34
+ print(): void;
35
+ summary(): Partial<Record<import("node_modules/o1js/dist/node/snarky.js").GateType | "Total rows", number>>;
36
+ };
37
+ merge: {
38
+ rows: number;
39
+ digest: string;
40
+ gates: import("node_modules/o1js/dist/node/snarky.js").Gate[];
41
+ publicInputSize: number;
42
+ print(): void;
43
+ summary(): Partial<Record<import("node_modules/o1js/dist/node/snarky.js").GateType | "Total rows", number>>;
44
+ };
45
+ }>;
46
+ publicInputType: typeof NFTState;
47
+ publicOutputType: typeof NFTState;
48
+ privateInputTypes: {
49
+ insertMetadata: [typeof MetadataMap, typeof import("node_modules/o1js/dist/node/lib/provable/field.js").Field & ((x: string | number | bigint | import("node_modules/o1js/dist/node/lib/provable/core/fieldvar.js").FieldConst | import("node_modules/o1js/dist/node/lib/provable/core/fieldvar.js").FieldVar | import("node_modules/o1js/dist/node/lib/provable/field.js").Field) => import("node_modules/o1js/dist/node/lib/provable/field.js").Field), typeof import("node_modules/o1js/dist/node/lib/provable/field.js").Field & ((x: string | number | bigint | import("node_modules/o1js/dist/node/lib/provable/core/fieldvar.js").FieldConst | import("node_modules/o1js/dist/node/lib/provable/core/fieldvar.js").FieldVar | import("node_modules/o1js/dist/node/lib/provable/field.js").Field) => import("node_modules/o1js/dist/node/lib/provable/field.js").Field), typeof Signature];
50
+ merge: [typeof SelfProof, typeof SelfProof];
51
+ };
52
+ auxiliaryOutputTypes: {
53
+ insertMetadata: typeof MetadataMap;
54
+ merge: undefined;
55
+ };
56
+ rawMethods: {
57
+ insertMetadata: (publicInput: NFTState, ...args: [import("node_modules/o1js/dist/node/lib/provable/merkle-tree-indexed.js").IndexedMerkleMapBase, import("node_modules/o1js/dist/node/lib/provable/field.js").Field, import("node_modules/o1js/dist/node/lib/provable/field.js").Field, Signature] & any[]) => Promise<{
58
+ publicOutput: NFTState;
59
+ auxiliaryOutput: import("node_modules/o1js/dist/node/lib/provable/merkle-tree-indexed.js").IndexedMerkleMapBase;
60
+ }>;
61
+ merge: (publicInput: NFTState, ...args: [SelfProof<unknown, unknown>, SelfProof<unknown, unknown>] & any[]) => Promise<{
62
+ publicOutput: NFTState;
63
+ }>;
64
+ };
65
+ proofsEnabled: boolean;
66
+ setProofsEnabled(proofsEnabled: boolean): void;
67
+ } & {
68
+ insertMetadata: (publicInput: NFTState, ...args: [import("node_modules/o1js/dist/node/lib/provable/merkle-tree-indexed.js").IndexedMerkleMapBase, import("node_modules/o1js/dist/node/lib/provable/field.js").Field, import("node_modules/o1js/dist/node/lib/provable/field.js").Field, Signature] & any[]) => Promise<{
69
+ proof: import("o1js").Proof<NFTState, NFTState>;
70
+ auxiliaryOutput: import("node_modules/o1js/dist/node/lib/provable/merkle-tree-indexed.js").IndexedMerkleMapBase;
71
+ }>;
72
+ merge: (publicInput: NFTState, ...args: [SelfProof<unknown, unknown>, SelfProof<unknown, unknown>] & any[]) => Promise<{
73
+ proof: import("o1js").Proof<NFTState, NFTState>;
74
+ auxiliaryOutput: undefined;
75
+ }>;
76
+ };
@@ -0,0 +1,85 @@
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
+ import { ZkProgram, Field, SelfProof, Signature } from "o1js";
8
+ import { NFTState } from "../interfaces/types.js";
9
+ import { MetadataMap } from "../metadata/metadata.js";
10
+ export { NFTProgram };
11
+ /**
12
+ * Defines the NFTProgram ZkProgram with methods for updating NFT metadata.
13
+ */
14
+ const NFTProgram = ZkProgram({
15
+ name: "NFTProgram",
16
+ publicInput: NFTState,
17
+ publicOutput: NFTState,
18
+ methods: {
19
+ /**
20
+ * Inserts a metadata key-value pair into the NFT's metadata map.
21
+ *
22
+ * @returns {Promise<{ publicOutput: NFTState; auxiliaryOutput: MetadataMap }>} A promise resolving to an object containing the updated NFT state and auxiliary output.
23
+ *
24
+ * @remarks
25
+ * This method verifies that the provided signature is valid and corresponds to the NFT owner.
26
+ * It then inserts the new key-value pair into the metadata map, ensuring that the key does not already exist.
27
+ * The method returns an updated NFT state with the new metadata root and increments the version.
28
+ */
29
+ insertMetadata: {
30
+ privateInputs: [MetadataMap, Field, Field, Signature],
31
+ auxiliaryOutput: MetadataMap,
32
+ async method(initialState, metadata, key, value, signature) {
33
+ signature
34
+ .verify(initialState.owner, [
35
+ ...NFTState.toFields(initialState),
36
+ key,
37
+ value,
38
+ ])
39
+ .assertTrue("Wrong owner signature");
40
+ metadata.insert(key, value); // Proves that key does not exist
41
+ return {
42
+ publicOutput: new NFTState({
43
+ immutableState: initialState.immutableState,
44
+ metadata: metadata.root,
45
+ owner: initialState.owner,
46
+ approved: initialState.approved,
47
+ name: initialState.name,
48
+ storage: initialState.storage,
49
+ isPaused: initialState.isPaused,
50
+ version: initialState.version.add(1),
51
+ metadataVerificationKeyHash: initialState.metadataVerificationKeyHash,
52
+ creator: initialState.creator,
53
+ oracleAddress: initialState.oracleAddress,
54
+ context: initialState.context,
55
+ }),
56
+ auxiliaryOutput: metadata,
57
+ };
58
+ },
59
+ },
60
+ /**
61
+ * Merges two self-proofs to produce a new NFT state.
62
+ *
63
+ * @returns {Promise<{ publicOutput: NFTState }>} A promise resolving to an object containing the merged NFT state.
64
+ *
65
+ * @remarks
66
+ * This method verifies both proofs and asserts the consistency of their inputs and outputs.
67
+ * It ensures that the initial state matches the public input of the first proof,
68
+ * and that the public output of the first proof matches the public input of the second proof.
69
+ * The method returns the public output of the second proof as the new merged NFT state.
70
+ */
71
+ merge: {
72
+ privateInputs: [SelfProof, SelfProof],
73
+ async method(initialState, proof1, proof2) {
74
+ proof1.verify();
75
+ proof2.verify();
76
+ NFTState.assertEqual(initialState, proof1.publicInput);
77
+ NFTState.assertEqual(proof1.publicOutput, proof2.publicInput);
78
+ return {
79
+ publicOutput: proof2.publicOutput,
80
+ };
81
+ },
82
+ },
83
+ },
84
+ });
85
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/zkprogram-example/update.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,KAAK,EAAS,SAAS,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,CAAC;AAEtB;;GAEG;AACH,MAAM,UAAU,GAAG,SAAS,CAAC;IAC3B,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,QAAQ;IACrB,YAAY,EAAE,QAAQ;IACtB,OAAO,EAAE;QACP;;;;;;;;;WASG;QACH,cAAc,EAAE;YACd,aAAa,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC;YACrD,eAAe,EAAE,WAAW;YAC5B,KAAK,CAAC,MAAM,CACV,YAAsB,EACtB,QAAqB,EACrB,GAAU,EACV,KAAY,EACZ,SAAoB;gBAEpB,SAAS;qBACN,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE;oBAC1B,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC;oBAClC,GAAG;oBACH,KAAK;iBACN,CAAC;qBACD,UAAU,CAAC,uBAAuB,CAAC,CAAC;gBACvC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,iCAAiC;gBAE9D,OAAO;oBACL,YAAY,EAAE,IAAI,QAAQ,CAAC;wBACzB,cAAc,EAAE,YAAY,CAAC,cAAc;wBAC3C,QAAQ,EAAE,QAAQ,CAAC,IAAI;wBACvB,KAAK,EAAE,YAAY,CAAC,KAAK;wBACzB,QAAQ,EAAE,YAAY,CAAC,QAAQ;wBAC/B,IAAI,EAAE,YAAY,CAAC,IAAI;wBACvB,OAAO,EAAE,YAAY,CAAC,OAAO;wBAC7B,QAAQ,EAAE,YAAY,CAAC,QAAQ;wBAC/B,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;wBACpC,2BAA2B,EACzB,YAAY,CAAC,2BAA2B;wBAC1C,OAAO,EAAE,YAAY,CAAC,OAAO;wBAC7B,aAAa,EAAE,YAAY,CAAC,aAAa;wBACzC,OAAO,EAAE,YAAY,CAAC,OAAO;qBAC9B,CAAC;oBACF,eAAe,EAAE,QAAQ;iBAC1B,CAAC;YACJ,CAAC;SACF;QACD;;;;;;;;;;WAUG;QACH,KAAK,EAAE;YACL,aAAa,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;YACrC,KAAK,CAAC,MAAM,CACV,YAAsB,EACtB,MAAqC,EACrC,MAAqC;gBAErC,MAAM,CAAC,MAAM,EAAE,CAAC;gBAChB,MAAM,CAAC,MAAM,EAAE,CAAC;gBAChB,QAAQ,CAAC,WAAW,CAAC,YAAY,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;gBACvD,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;gBAC9D,OAAO;oBACL,YAAY,EAAE,MAAM,CAAC,YAAY;iBAClC,CAAC;YACJ,CAAC;SACF;KACF;CACF,CAAC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,65 @@
1
+ {
2
+ "name": "@silvana-one/nft",
3
+ "description": "Silvana - Mina NFT library",
4
+ "version": "0.1.0",
5
+ "author": "DFST",
6
+ "bugs": "https://github.com/SilvanaOne/silvana-lib/issues",
7
+ "dependencies": {
8
+ "mina-signer": "^3.0.7",
9
+ "tslib": "^2.8.1"
10
+ },
11
+ "devDependencies": {
12
+ "@silvana-one/storage": "0.1.0",
13
+ "@silvana-one/token": "0.1.0",
14
+ "@silvana-one/upgradable": "0.1.0",
15
+ "@types/node": "^22.10.2",
16
+ "esbuild": "^0.24.0",
17
+ "o1js": "^2.2.0",
18
+ "typescript": "^5.7.2"
19
+ },
20
+ "engines": {
21
+ "node": ">=20.0.0"
22
+ },
23
+ "exports": {
24
+ "types": "./dist/node/index.d.ts",
25
+ "node": {
26
+ "import": "./dist/node/index.js",
27
+ "require": "./dist/node/index.cjs"
28
+ },
29
+ "browser": "./dist/web/index.js",
30
+ "default": "./dist/web/index.js"
31
+ },
32
+ "files": [
33
+ "dist",
34
+ "src",
35
+ "package.json",
36
+ "README.md",
37
+ "LICENSE"
38
+ ],
39
+ "homepage": "https://docs.minanft.com",
40
+ "keywords": [
41
+ "mina-protocol",
42
+ "MinaNFT",
43
+ "NFT",
44
+ "typescript"
45
+ ],
46
+ "license": "Apache-2.0",
47
+ "main": "dist/web/index.js",
48
+ "peerDependencies": {
49
+ "@silvana-one/storage": "0.1.0",
50
+ "@silvana-one/upgradable": "0.1.0",
51
+ "@silvana-one/token": "0.1.0",
52
+ "o1js": "^2.2.0"
53
+ },
54
+ "publishConfig": {
55
+ "access": "public"
56
+ },
57
+ "repository": "SilvanaOne/silvana-lib.git",
58
+ "scripts": {
59
+ "build": "rm -rf dist && tsc && tsc --build tsconfig.web.json && node build-cjs.js",
60
+ "login": "npm login",
61
+ "release": "npm publish --access public"
62
+ },
63
+ "type": "module",
64
+ "types": "./dist/node/index.d.ts"
65
+ }