@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.
- package/README.md +1400 -0
- package/dist/node/admin/advanced.d.ts +469 -0
- package/dist/node/admin/advanced.js +525 -0
- package/dist/node/admin/advanced.js.map +1 -0
- package/dist/node/admin/index.d.ts +1 -0
- package/dist/node/admin/index.js +2 -0
- package/dist/node/admin/index.js.map +1 -0
- package/dist/node/contracts/admin.d.ts +140 -0
- package/dist/node/contracts/admin.js +336 -0
- package/dist/node/contracts/admin.js.map +1 -0
- package/dist/node/contracts/collection.d.ts +551 -0
- package/dist/node/contracts/collection.js +1049 -0
- package/dist/node/contracts/collection.js.map +1 -0
- package/dist/node/contracts/index.d.ts +3 -0
- package/dist/node/contracts/index.js +4 -0
- package/dist/node/contracts/index.js.map +1 -0
- package/dist/node/contracts/nft.d.ts +76 -0
- package/dist/node/contracts/nft.js +329 -0
- package/dist/node/contracts/nft.js.map +1 -0
- package/dist/node/contracts.d.ts +709 -0
- package/dist/node/contracts.js +61 -0
- package/dist/node/contracts.js.map +1 -0
- package/dist/node/index.cjs +5032 -0
- package/dist/node/index.d.ts +8 -0
- package/dist/node/index.js +9 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node/interfaces/admin.d.ts +102 -0
- package/dist/node/interfaces/admin.js +2 -0
- package/dist/node/interfaces/admin.js.map +1 -0
- package/dist/node/interfaces/approval.d.ts +57 -0
- package/dist/node/interfaces/approval.js +62 -0
- package/dist/node/interfaces/approval.js.map +1 -0
- package/dist/node/interfaces/collection.d.ts +57 -0
- package/dist/node/interfaces/collection.js +2 -0
- package/dist/node/interfaces/collection.js.map +1 -0
- package/dist/node/interfaces/encoding.d.ts +24 -0
- package/dist/node/interfaces/encoding.js +32 -0
- package/dist/node/interfaces/encoding.js.map +1 -0
- package/dist/node/interfaces/events.d.ts +833 -0
- package/dist/node/interfaces/events.js +106 -0
- package/dist/node/interfaces/events.js.map +1 -0
- package/dist/node/interfaces/index.d.ts +10 -0
- package/dist/node/interfaces/index.js +11 -0
- package/dist/node/interfaces/index.js.map +1 -0
- package/dist/node/interfaces/ownable.d.ts +94 -0
- package/dist/node/interfaces/ownable.js +12 -0
- package/dist/node/interfaces/ownable.js.map +1 -0
- package/dist/node/interfaces/owner.d.ts +61 -0
- package/dist/node/interfaces/owner.js +101 -0
- package/dist/node/interfaces/owner.js.map +1 -0
- package/dist/node/interfaces/pausable.d.ts +74 -0
- package/dist/node/interfaces/pausable.js +14 -0
- package/dist/node/interfaces/pausable.js.map +1 -0
- package/dist/node/interfaces/types.d.ts +2297 -0
- package/dist/node/interfaces/types.js +507 -0
- package/dist/node/interfaces/types.js.map +1 -0
- package/dist/node/interfaces/update.d.ts +53 -0
- package/dist/node/interfaces/update.js +58 -0
- package/dist/node/interfaces/update.js.map +1 -0
- package/dist/node/marketplace/auction.d.ts +775 -0
- package/dist/node/marketplace/auction.js +430 -0
- package/dist/node/marketplace/auction.js.map +1 -0
- package/dist/node/marketplace/bid.d.ts +254 -0
- package/dist/node/marketplace/bid.js +260 -0
- package/dist/node/marketplace/bid.js.map +1 -0
- package/dist/node/marketplace/index.d.ts +5 -0
- package/dist/node/marketplace/index.js +6 -0
- package/dist/node/marketplace/index.js.map +1 -0
- package/dist/node/marketplace/nft-shares.d.ts +1083 -0
- package/dist/node/marketplace/nft-shares.js +398 -0
- package/dist/node/marketplace/nft-shares.js.map +1 -0
- package/dist/node/marketplace/offer.d.ts +192 -0
- package/dist/node/marketplace/offer.js +132 -0
- package/dist/node/marketplace/offer.js.map +1 -0
- package/dist/node/marketplace/types.d.ts +374 -0
- package/dist/node/marketplace/types.js +33 -0
- package/dist/node/marketplace/types.js.map +1 -0
- package/dist/node/metadata/index.d.ts +3 -0
- package/dist/node/metadata/index.js +4 -0
- package/dist/node/metadata/index.js.map +1 -0
- package/dist/node/metadata/metadata.d.ts +337 -0
- package/dist/node/metadata/metadata.js +439 -0
- package/dist/node/metadata/metadata.js.map +1 -0
- package/dist/node/metadata/text.d.ts +44 -0
- package/dist/node/metadata/text.js +42 -0
- package/dist/node/metadata/text.js.map +1 -0
- package/dist/node/metadata/tree.d.ts +75 -0
- package/dist/node/metadata/tree.js +85 -0
- package/dist/node/metadata/tree.js.map +1 -0
- package/dist/node/vk.d.ts +42 -0
- package/dist/node/vk.js +45 -0
- package/dist/node/vk.js.map +1 -0
- package/dist/node/zkprogram-example/game.d.ts +76 -0
- package/dist/node/zkprogram-example/game.js +108 -0
- package/dist/node/zkprogram-example/game.js.map +1 -0
- package/dist/node/zkprogram-example/index.d.ts +2 -0
- package/dist/node/zkprogram-example/index.js +3 -0
- package/dist/node/zkprogram-example/index.js.map +1 -0
- package/dist/node/zkprogram-example/update.d.ts +76 -0
- package/dist/node/zkprogram-example/update.js +85 -0
- package/dist/node/zkprogram-example/update.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/tsconfig.web.tsbuildinfo +1 -0
- package/dist/web/admin/advanced.d.ts +469 -0
- package/dist/web/admin/advanced.js +525 -0
- package/dist/web/admin/advanced.js.map +1 -0
- package/dist/web/admin/index.d.ts +1 -0
- package/dist/web/admin/index.js +2 -0
- package/dist/web/admin/index.js.map +1 -0
- package/dist/web/contracts/admin.d.ts +140 -0
- package/dist/web/contracts/admin.js +336 -0
- package/dist/web/contracts/admin.js.map +1 -0
- package/dist/web/contracts/collection.d.ts +551 -0
- package/dist/web/contracts/collection.js +1049 -0
- package/dist/web/contracts/collection.js.map +1 -0
- package/dist/web/contracts/index.d.ts +3 -0
- package/dist/web/contracts/index.js +4 -0
- package/dist/web/contracts/index.js.map +1 -0
- package/dist/web/contracts/nft.d.ts +76 -0
- package/dist/web/contracts/nft.js +329 -0
- package/dist/web/contracts/nft.js.map +1 -0
- package/dist/web/contracts.d.ts +709 -0
- package/dist/web/contracts.js +61 -0
- package/dist/web/contracts.js.map +1 -0
- package/dist/web/index.d.ts +8 -0
- package/dist/web/index.js +9 -0
- package/dist/web/index.js.map +1 -0
- package/dist/web/interfaces/admin.d.ts +102 -0
- package/dist/web/interfaces/admin.js +2 -0
- package/dist/web/interfaces/admin.js.map +1 -0
- package/dist/web/interfaces/approval.d.ts +57 -0
- package/dist/web/interfaces/approval.js +62 -0
- package/dist/web/interfaces/approval.js.map +1 -0
- package/dist/web/interfaces/collection.d.ts +57 -0
- package/dist/web/interfaces/collection.js +2 -0
- package/dist/web/interfaces/collection.js.map +1 -0
- package/dist/web/interfaces/encoding.d.ts +24 -0
- package/dist/web/interfaces/encoding.js +32 -0
- package/dist/web/interfaces/encoding.js.map +1 -0
- package/dist/web/interfaces/events.d.ts +833 -0
- package/dist/web/interfaces/events.js +106 -0
- package/dist/web/interfaces/events.js.map +1 -0
- package/dist/web/interfaces/index.d.ts +10 -0
- package/dist/web/interfaces/index.js +11 -0
- package/dist/web/interfaces/index.js.map +1 -0
- package/dist/web/interfaces/ownable.d.ts +94 -0
- package/dist/web/interfaces/ownable.js +12 -0
- package/dist/web/interfaces/ownable.js.map +1 -0
- package/dist/web/interfaces/owner.d.ts +61 -0
- package/dist/web/interfaces/owner.js +101 -0
- package/dist/web/interfaces/owner.js.map +1 -0
- package/dist/web/interfaces/pausable.d.ts +74 -0
- package/dist/web/interfaces/pausable.js +14 -0
- package/dist/web/interfaces/pausable.js.map +1 -0
- package/dist/web/interfaces/types.d.ts +2297 -0
- package/dist/web/interfaces/types.js +507 -0
- package/dist/web/interfaces/types.js.map +1 -0
- package/dist/web/interfaces/update.d.ts +53 -0
- package/dist/web/interfaces/update.js +58 -0
- package/dist/web/interfaces/update.js.map +1 -0
- package/dist/web/marketplace/auction.d.ts +775 -0
- package/dist/web/marketplace/auction.js +430 -0
- package/dist/web/marketplace/auction.js.map +1 -0
- package/dist/web/marketplace/bid.d.ts +254 -0
- package/dist/web/marketplace/bid.js +260 -0
- package/dist/web/marketplace/bid.js.map +1 -0
- package/dist/web/marketplace/index.d.ts +5 -0
- package/dist/web/marketplace/index.js +6 -0
- package/dist/web/marketplace/index.js.map +1 -0
- package/dist/web/marketplace/nft-shares.d.ts +1083 -0
- package/dist/web/marketplace/nft-shares.js +398 -0
- package/dist/web/marketplace/nft-shares.js.map +1 -0
- package/dist/web/marketplace/offer.d.ts +192 -0
- package/dist/web/marketplace/offer.js +132 -0
- package/dist/web/marketplace/offer.js.map +1 -0
- package/dist/web/marketplace/types.d.ts +374 -0
- package/dist/web/marketplace/types.js +33 -0
- package/dist/web/marketplace/types.js.map +1 -0
- package/dist/web/metadata/index.d.ts +3 -0
- package/dist/web/metadata/index.js +4 -0
- package/dist/web/metadata/index.js.map +1 -0
- package/dist/web/metadata/metadata.d.ts +337 -0
- package/dist/web/metadata/metadata.js +439 -0
- package/dist/web/metadata/metadata.js.map +1 -0
- package/dist/web/metadata/text.d.ts +44 -0
- package/dist/web/metadata/text.js +42 -0
- package/dist/web/metadata/text.js.map +1 -0
- package/dist/web/metadata/tree.d.ts +75 -0
- package/dist/web/metadata/tree.js +85 -0
- package/dist/web/metadata/tree.js.map +1 -0
- package/dist/web/vk.d.ts +42 -0
- package/dist/web/vk.js +45 -0
- package/dist/web/vk.js.map +1 -0
- package/dist/web/zkprogram-example/game.d.ts +76 -0
- package/dist/web/zkprogram-example/game.js +108 -0
- package/dist/web/zkprogram-example/game.js.map +1 -0
- package/dist/web/zkprogram-example/index.d.ts +2 -0
- package/dist/web/zkprogram-example/index.js +3 -0
- package/dist/web/zkprogram-example/index.js.map +1 -0
- package/dist/web/zkprogram-example/update.d.ts +76 -0
- package/dist/web/zkprogram-example/update.js +85 -0
- package/dist/web/zkprogram-example/update.js.map +1 -0
- package/package.json +65 -0
- package/src/admin/advanced.ts +601 -0
- package/src/admin/index.ts +1 -0
- package/src/contracts/admin.ts +301 -0
- package/src/contracts/collection.ts +1172 -0
- package/src/contracts/index.ts +3 -0
- package/src/contracts/nft.ts +344 -0
- package/src/contracts.ts +107 -0
- package/src/index.ts +8 -0
- package/src/interfaces/admin.ts +127 -0
- package/src/interfaces/approval.ts +99 -0
- package/src/interfaces/collection.ts +68 -0
- package/src/interfaces/encoding.ts +32 -0
- package/src/interfaces/events.ts +115 -0
- package/src/interfaces/index.ts +10 -0
- package/src/interfaces/ownable.ts +32 -0
- package/src/interfaces/owner.ts +143 -0
- package/src/interfaces/pausable.ts +41 -0
- package/src/interfaces/types.ts +623 -0
- package/src/interfaces/update.ts +104 -0
- package/src/marketplace/auction.ts +527 -0
- package/src/marketplace/bid.ts +294 -0
- package/src/marketplace/index.ts +5 -0
- package/src/marketplace/nft-shares.ts +388 -0
- package/src/marketplace/offer.ts +153 -0
- package/src/marketplace/types.ts +33 -0
- package/src/metadata/index.ts +3 -0
- package/src/metadata/metadata.ts +603 -0
- package/src/metadata/text.ts +60 -0
- package/src/metadata/tree.ts +128 -0
- package/src/vk.ts +64 -0
- package/src/zkprogram-example/game.ts +136 -0
- package/src/zkprogram-example/index.ts +2 -0
- 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/node/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: "AADUTaZ5kJK+C2TL7P/tc4MlgEq5zWOLFDtgDU/u9ry3Es1Ek79TcLqIWg8s6TJJcXzM0D/6xz1y8FQn2tGjjcspfNtNRAmG3FdldAatVpnkTwS6Otpm88gl7lOPX8bRJjhHfEtdvEsQ0OudcDzB5iCqu268zqkBvXrXT3xaNN+sIIqLTtxltMz4RS/2layxzL6mg1J+kkTsNIJsg6MufeMI6Xn5pAYOaWFqgo0N0WZsnF3EYcYq1LcDucyyFS2RqRninioewrlEDzjY8y6rmf9+GibQasJCE+mkbfB4wCOuFMiSrRIN/73BODz9siBxs/bU/p7xffJsOL8JvitK7ngRyG3PfGGdW22njv9MYxNhb/YhKnPA0qPTOQjxg1a/Pg8NyjB9RM7eypPJNLFaWFzNM4JRxjI7wGVVOfE0D7DUAL32SzQ1Jmr4mILqDhnDREu2ETq0Lb+c1cxPgb4x1nYbWcSgdAOtKJBvXHkWs7JlJdL1q9yiRrzYb1kPMPNGACnSB3N3Omm//FhxitOOM4yucxZyKpKst/otZu51/gGBDW5tIwKYpfl5ETSNvDFY+9rLUHv+LxSz+yq6cUFKExI6ABJGVQIttGyzKa3Doe/+kpSGbzsRpZXKazfH+jVQ57wbyfqQ7ah1/B7+xVngjYkK0IrpReCAaiIa0X1KE7EaoxWavhgVmpC5Q7SrwYYPkqb/HBWsxMcdrB842bKWsszzPYQxR6cfCwjXzq9Txe7fh1bzOKY6WO7ysYpefFM+yY85IlYCzX1/97FEaPGF4lBMe2ONgwPMq3VJ6Yxzfnor4zPMyH1pW2dm2QmV0Ep2NYO7fVGPn83abwq34GMgZmriFh3M7XzlYX54q3CeG861Z+HPZHukv+oVlUyWtWGk4E4PNlm61kXaLF7ECDy2+s73Ris1HbVSbbCOMkAok4Ytwi0FGwrSFSvRbb7s5Mbnfg6zvkKYwbNMjff5OlJPUcK5GMaYp2Ii2+7t+j3Wx8wSwdqlat61zS/PuZtaxiT0DL8+cvw1ZWa07udipKaQ8EJsdTHLvKFo6ZztCTnZronL4gTBR3T/N7QP1YPvN/TI7pZmkSwKLV3Zeq2uW494v4ysCf4qagVlrz1sfK6jvfUhMyfbzw9HMaqoNUhpUBBAGL0ANiuU1TSrzuTA/DdXpWrGvpxht97OQ+FDB3Bfc9qfITmDHeZijuM3U31QTU555rWwJ48EWT4y8Wmh84sEIrEUFDA9GS8I+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=",
|
|
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 @@
|
|
|
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"}
|