@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,68 @@
1
+ import { PublicKey, TokenContract } from "o1js";
2
+ import { TransferParams, NFTStateStruct } from "./types.js";
3
+ import { NFTOwnerContractConstructor } from "./owner.js";
4
+ import { NFTApprovalContractConstructor } from "./approval.js";
5
+ import { NFTUpdateContractConstructor } from "./update.js";
6
+ import { NFTAdminContractConstructor } from "./admin.js";
7
+ export {
8
+ NFTCollectionBase,
9
+ NFTCollectionContractConstructor,
10
+ DefineCollectionFactory,
11
+ };
12
+
13
+ /**
14
+ * The `NFTCollectionBase` interface defines the functionalities required for managing an NFT collection on the Mina Protocol.
15
+ * It extends the `SmartContract` class and specifies methods that enforce permissions and validations for various NFT operations.
16
+ */
17
+ type NFTCollectionBase = TokenContract & {
18
+ /**
19
+ * Transfers ownership of an NFT from contract without admin approval using a proof.
20
+ *
21
+ * @param params - The transfer details.
22
+ */
23
+ transferByProof(params: TransferParams): Promise<void>;
24
+ /**
25
+ * Transfers ownership of an NFT from contract without admin approval.
26
+ *
27
+ * @param params - The transfer details.
28
+ */
29
+ transferBySignature(params: TransferParams): Promise<void>;
30
+
31
+ /**
32
+ * Transfers ownership of an NFT from contract without admin approval using a proof.
33
+ *
34
+ * @param params - The transfer details.
35
+ */
36
+ approvedTransferByProof(params: TransferParams): Promise<void>;
37
+ /**
38
+ * Transfers ownership of an NFT from contract without admin approval.
39
+ *
40
+ * @param params - The transfer details.
41
+ */
42
+ approvedTransferBySignature(params: TransferParams): Promise<void>;
43
+
44
+ /**
45
+ * Returns the state of an NFT.
46
+ *
47
+ * @param address - The address of the NFT.
48
+ * @returns The state of the NFT.
49
+ */
50
+ getNFTState(address: PublicKey): Promise<NFTStateStruct>;
51
+ };
52
+
53
+ /**
54
+ * Defines a constructor for contracts implementing `NFTCollectionBase`, accepting an `address` public key and returning an instance of `NFTCollectionBase`.
55
+ *
56
+ * @param address - The contract's address.
57
+ * @returns An instance of `NFTCollectionBase`.
58
+ */
59
+ type NFTCollectionContractConstructor = new (
60
+ address: PublicKey
61
+ ) => NFTCollectionBase;
62
+
63
+ type DefineCollectionFactory = (params: {
64
+ adminContract: () => NFTAdminContractConstructor;
65
+ ownerContract: () => NFTOwnerContractConstructor;
66
+ approvalContract: () => NFTApprovalContractConstructor;
67
+ updateContract: () => NFTUpdateContractConstructor;
68
+ }) => NFTCollectionContractConstructor;
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Utilities for encoding and decoding `Field` elements to and from strings.
3
+ * These functions are used throughout the NFT standard for handling off-chain storage references and metadata.
4
+ */
5
+ import { Encoding, Field } from "o1js";
6
+ export { fieldToString, fieldFromString };
7
+
8
+ /**
9
+ * Converts a `Field` element to a string representation.
10
+ * This is used for serializing `Field` values into strings suitable for storage or transmission.
11
+ *
12
+ * @param {Field} field - The `Field` element to convert.
13
+ * @returns {string} The string representation of the `Field`.
14
+ */
15
+ function fieldToString(field: Field): string {
16
+ return Encoding.stringFromFields([field]);
17
+ }
18
+
19
+ /**
20
+ * Reconstructs a `Field` element from its string representation.
21
+ * This function is essential for deserializing strings back into `Field` elements,
22
+ * which can then be used within the smart contract logic.
23
+ *
24
+ * @param {string} storage - The string representation of the `Field`.
25
+ * @returns {Field} The reconstructed `Field` element.
26
+ * @throws Will throw an error if the input string does not correspond to exactly one `Field`.
27
+ */
28
+ function fieldFromString(storage: string): Field {
29
+ const fields = Encoding.stringToFields(storage);
30
+ if (fields.length !== 1) throw new Error("String is too long");
31
+ return fields[0];
32
+ }
@@ -0,0 +1,115 @@
1
+ import { PublicKey, Struct, UInt32, Field, Bool } from "o1js";
2
+ import { Storage } from "@silvana-one/storage";
3
+ import { NFTStateStruct, UInt64Option } from "./types.js";
4
+
5
+ export {
6
+ MintEvent,
7
+ UpdateEvent,
8
+ TransferEvent,
9
+ UpgradeVerificationKeyEvent,
10
+ UpgradeVerificationKeyData,
11
+ LimitMintingEvent,
12
+ PauseNFTEvent,
13
+ ApproveEvent,
14
+ };
15
+
16
+ /**
17
+ * Emitted when a new NFT is minted in the collection.
18
+ */
19
+ class MintEvent extends Struct({
20
+ /** The initial state of the NFT at the time of minting. */
21
+ initialState: NFTStateStruct,
22
+ /** The public key address of the minted NFT. */
23
+ address: PublicKey,
24
+ }) {}
25
+
26
+ /**
27
+ * Emitted when an NFT's state is updated.
28
+ */
29
+ class UpdateEvent extends Struct({
30
+ /** The updated name of the NFT. */
31
+ name: Field,
32
+ /** The updated metadata hash of the NFT. */
33
+ metadata: Field,
34
+ /** Off-chain storage information, e.g., IPFS hash. */
35
+ storage: Storage,
36
+ /** The owner of the NFT after the update. */
37
+ owner: PublicKey,
38
+ /** The approved address of the NFT after the update. */
39
+ approved: PublicKey,
40
+ /** The version number of the NFT state. */
41
+ version: UInt32,
42
+ /** Indicates whether the NFT is paused after the update. */
43
+ isPaused: Bool,
44
+ /** The hash of the verification key used for metadata proofs. */
45
+ metadataVerificationKeyHash: Field,
46
+ }) {}
47
+
48
+ /**
49
+ * Emitted when an NFT's approved address is updated.
50
+ */
51
+ class ApproveEvent extends Struct({
52
+ /** The public key address of the NFT. */
53
+ nftAddress: PublicKey,
54
+ /** The public key of the approved address. */
55
+ approved: PublicKey,
56
+ }) {}
57
+
58
+ /**
59
+ * Emitted when an NFT is transferred from one owner to another.
60
+ */
61
+ class TransferEvent extends Struct({
62
+ /** The public key of the sender (current owner) before the transfer. */
63
+ from: PublicKey,
64
+ /** The public key of the recipient (new owner) after the transfer. */
65
+ to: PublicKey,
66
+ /** The public key of the collection. */
67
+ collection: PublicKey,
68
+ /** The public key address of the NFT being transferred. */
69
+ nft: PublicKey,
70
+ /** The fee paid for the transfer. */
71
+ fee: UInt64Option,
72
+ /** The price of the NFT being transferred. */
73
+ price: UInt64Option,
74
+ /** Indicates whether the transfer is by owner or by approved address. */
75
+ transferByOwner: Bool,
76
+ /** The public key of the approved address. */
77
+ approved: PublicKey,
78
+ }) {}
79
+
80
+ /**
81
+ * Emitted when an NFT is paused or resumed.
82
+ */
83
+ class PauseNFTEvent extends Struct({
84
+ /** The public key address of the NFT. */
85
+ address: PublicKey,
86
+ /** Indicates whether the NFT is paused (`true`) or resumed (`false`). */
87
+ isPaused: Bool,
88
+ }) {}
89
+
90
+ /**
91
+ * Emitted when the verification key of an NFT is upgraded.
92
+ */
93
+ class UpgradeVerificationKeyEvent extends Struct({
94
+ /** The hash of the new verification key. */
95
+ verificationKeyHash: Field,
96
+ /** The public key address of the NFT whose verification key is upgraded. */
97
+ address: PublicKey,
98
+ /** The version number of the NFT state after the upgrade. */
99
+ tokenId: Field,
100
+ }) {}
101
+
102
+ class UpgradeVerificationKeyData extends Struct({
103
+ /** The owner of the NFT. */
104
+ owner: PublicKey,
105
+ /** Indicates whether the owner approval is required to upgrade the verification key. */
106
+ isOwnerApprovalRequired: Bool,
107
+ }) {}
108
+
109
+ /**
110
+ * Emitted when minting of new NFTs is limited in the collection.
111
+ */
112
+ class LimitMintingEvent extends Struct({
113
+ /** Indicates whether minting is limited (`true`) or not (`false`). */
114
+ mintingLimited: Bool,
115
+ }) {}
@@ -0,0 +1,10 @@
1
+ export * from "./types.js";
2
+ export * from "./encoding.js";
3
+ export * from "./events.js";
4
+ export * from "./admin.js";
5
+ export * from "./pausable.js";
6
+ export * from "./ownable.js";
7
+ export * from "./owner.js";
8
+ export * from "./approval.js";
9
+ export * from "./update.js";
10
+ export * from "./collection.js";
@@ -0,0 +1,32 @@
1
+ import { PublicKey, SmartContract, Field, Struct, Bool } from "o1js";
2
+
3
+ /**
4
+ * Interface representing ownable functionality for smart contracts.
5
+ *
6
+ * The `OwnableContract` interface extends `SmartContract` and provides methods to ensure that only the owner
7
+ * can perform certain actions and to allow the transfer of ownership to a new owner.
8
+ *
9
+ * By implementing the Ownable interface, contracts can secure critical operations and provide a transparent
10
+ * mechanism for ownership management.
11
+ *
12
+ * @interface
13
+ */
14
+ export type OwnableContract = SmartContract & {
15
+ /**
16
+ * Transfers ownership of the contract to a new owner.
17
+ *
18
+ * @param {PublicKey} to - The public key of the new owner.
19
+ * @returns {Promise<PublicKey>} A promise that resolves to the public key of the old owner.
20
+ */
21
+ transferOwnership(to: PublicKey): Promise<PublicKey>; // returns the old owner
22
+ };
23
+
24
+ /**
25
+ * Event emitted when the ownership of the contract changes.
26
+ *
27
+ * Contains the old owner's and new owner's public keys.
28
+ */
29
+ export class OwnershipChangeEvent extends Struct({
30
+ from: PublicKey,
31
+ to: PublicKey,
32
+ }) {}
@@ -0,0 +1,143 @@
1
+ import {
2
+ AccountUpdate,
3
+ Bool,
4
+ DeployArgs,
5
+ method,
6
+ PublicKey,
7
+ SmartContract,
8
+ state,
9
+ State,
10
+ Permissions,
11
+ VerificationKey,
12
+ } from "o1js";
13
+ import { NFTCollectionContractConstructor } from "./collection.js";
14
+ import { TransferExtendedParams } from "./types.js";
15
+ export {
16
+ NFTOwnerBase,
17
+ NFTOwnerContractConstructor,
18
+ NFTOwnerDeployProps,
19
+ NFTStandardOwner,
20
+ DefineOwnerFactory,
21
+ };
22
+ type DefineOwnerFactory = (params: {
23
+ collectionContract: () => NFTCollectionContractConstructor;
24
+ }) => NFTOwnerContractConstructor;
25
+
26
+ /**
27
+ * The `NFTAdminBase` interface defines the administrative functionalities required for managing an NFT collection on the Mina Protocol.
28
+ * It extends the `SmartContract` class and specifies methods that enforce permissions and validations for various NFT operations.
29
+ */
30
+ type NFTOwnerBase = SmartContract & {
31
+ /**
32
+ * Determines if an NFT can be transferred from one owner (`from`) to another (`to`) for a specific NFT contract address.
33
+ *
34
+ * @param params - The transfer event details.
35
+ * @returns A `Promise` resolving to a `Bool` indicating whether the transfer is allowed.
36
+ */
37
+ canTransfer(params: TransferExtendedParams): Promise<Bool>;
38
+
39
+ canApproveAddress(
40
+ collection: PublicKey,
41
+ nft: PublicKey,
42
+ approved: PublicKey
43
+ ): Promise<Bool>;
44
+
45
+ canPause(collection: PublicKey, nft: PublicKey): Promise<Bool>;
46
+
47
+ canResume(collection: PublicKey, nft: PublicKey): Promise<Bool>;
48
+
49
+ canChangeVerificationKey(
50
+ collection: PublicKey,
51
+ nft: PublicKey,
52
+ vk: VerificationKey
53
+ ): Promise<Bool>;
54
+ };
55
+
56
+ /**
57
+ * Defines a constructor for contracts implementing `NFTOwnerBase`, accepting an `address` public key and returning an instance of `NFTOwnerBase`.
58
+ *
59
+ * @param address - The public key of the contract's owner.
60
+ * @returns An instance of `NFTOwnerBase`.
61
+ */
62
+ type NFTOwnerContractConstructor = new (address: PublicKey) => NFTOwnerBase;
63
+
64
+ interface NFTOwnerDeployProps extends Exclude<DeployArgs, undefined> {
65
+ admin: PublicKey;
66
+ uri: string;
67
+ }
68
+
69
+ /**
70
+ * The **NFTStandardOwner** contract is the default implementation of the `NFTOwnerBase` interface.
71
+
72
+ */
73
+ class NFTStandardOwner extends SmartContract implements NFTOwnerBase {
74
+ /**
75
+ * The public key of the contract's administrator.
76
+ * This account has the authority to perform administrative actions such as pausing the contract or upgrading the verification key.
77
+ */
78
+ @state(PublicKey) admin = State<PublicKey>();
79
+
80
+ /**
81
+ * Deploys the contract with initial settings.
82
+ * @param props - Deployment properties including admin, upgradeAuthority, uri, canPause, and isPaused.
83
+ */
84
+ async deploy(props: NFTOwnerDeployProps) {
85
+ await super.deploy(props);
86
+ this.admin.set(props.admin);
87
+ this.account.zkappUri.set(props.uri);
88
+ this.account.permissions.set({
89
+ ...Permissions.default(),
90
+ setVerificationKey: Permissions.VerificationKey.signature(),
91
+ setPermissions: Permissions.impossible(),
92
+ });
93
+ }
94
+
95
+ /**
96
+ * Ensures that the transaction is authorized by the contract owner.
97
+ * @returns A signed `AccountUpdate` from the admin.
98
+ */
99
+ async ensureOwnerSignature(): Promise<AccountUpdate> {
100
+ const admin = this.admin.getAndRequireEquals();
101
+ const adminUpdate = AccountUpdate.createSigned(admin);
102
+ adminUpdate.body.useFullCommitment = Bool(true); // Prevent memo and fee change
103
+ return adminUpdate;
104
+ }
105
+
106
+ @method.returns(Bool)
107
+ async canTransfer(params: TransferExtendedParams): Promise<Bool> {
108
+ await this.ensureOwnerSignature();
109
+ return Bool(true);
110
+ }
111
+
112
+ @method.returns(Bool)
113
+ async canPause(collection: PublicKey, nft: PublicKey): Promise<Bool> {
114
+ await this.ensureOwnerSignature();
115
+ return Bool(true);
116
+ }
117
+
118
+ @method.returns(Bool)
119
+ async canResume(collection: PublicKey, nft: PublicKey): Promise<Bool> {
120
+ await this.ensureOwnerSignature();
121
+ return Bool(true);
122
+ }
123
+
124
+ @method.returns(Bool)
125
+ async canChangeVerificationKey(
126
+ collection: PublicKey,
127
+ nft: PublicKey,
128
+ vk: VerificationKey
129
+ ): Promise<Bool> {
130
+ await this.ensureOwnerSignature();
131
+ return Bool(true);
132
+ }
133
+
134
+ @method.returns(Bool)
135
+ async canApproveAddress(
136
+ collection: PublicKey,
137
+ nft: PublicKey,
138
+ approved: PublicKey
139
+ ): Promise<Bool> {
140
+ await this.ensureOwnerSignature();
141
+ return Bool(true);
142
+ }
143
+ }
@@ -0,0 +1,41 @@
1
+ import { SmartContract, Field, Struct, Bool } from "o1js";
2
+ export { PausableContract, PauseEvent };
3
+
4
+ /**
5
+ * The **PausableContract** interface provides a mechanism to dynamically enable or disable
6
+ * certain functionalities within smart contracts. It extends the `SmartContract` class
7
+ * and introduces methods that allow a contract to be paused and resumed, which is crucial
8
+ * for managing emergencies, upgrades, or maintenance periods.
9
+ *
10
+ * By implementing the PausableContract interface, contracts gain greater control over their
11
+ * operational states, enhancing security and flexibility in response to various scenarios.
12
+ */
13
+ type PausableContract = SmartContract & {
14
+ /**
15
+ * Pauses the contract, potentially halting critical operations to protect against
16
+ * unforeseen issues or to perform maintenance. When called, the contract enters a paused
17
+ * state where certain functions are restricted.
18
+ *
19
+ * @returns A promise that resolves when the contract has been successfully paused.
20
+ */
21
+ pause(): Promise<void>;
22
+
23
+ /**
24
+ * Resumes the contract's operations after it has been paused. This method restores
25
+ * the contract to its normal working state, allowing all functionalities to be accessible again.
26
+ *
27
+ * @returns A promise that resolves when the contract has been successfully resumed.
28
+ */
29
+ resume(): Promise<void>;
30
+ };
31
+
32
+ /**
33
+ * The **PauseEvent** class represents an event emitted whenever the contract is paused or resumed.
34
+ * This event contains the `isPaused` boolean field, indicating the current state of the contract.
35
+ */
36
+ class PauseEvent extends Struct({
37
+ /**
38
+ * Indicates whether the contract is currently paused.
39
+ */
40
+ isPaused: Bool,
41
+ }) {}