@silvana-one/nft
Version:
Mina NFT library
85 lines • 3.85 kB
JavaScript
/**
* NFTProgram is a ZkProgram providing zero-knowledge proofs for updating NFT metadata.
* It includes methods for inserting metadata entries and merging proofs.
*
* @module NFTProgram
*/
import { ZkProgram, Field, SelfProof, Signature } from "o1js";
import { NFTState } from "../interfaces/types.js";
import { MetadataMap } from "../metadata/metadata.js";
export { NFTProgram };
/**
* Defines the NFTProgram ZkProgram with methods for updating NFT metadata.
*/
const NFTProgram = ZkProgram({
name: "NFTProgram",
publicInput: NFTState,
publicOutput: NFTState,
methods: {
/**
* Inserts a metadata key-value pair into the NFT's metadata map.
*
* @returns {Promise<{ publicOutput: NFTState; auxiliaryOutput: MetadataMap }>} A promise resolving to an object containing the updated NFT state and auxiliary output.
*
* @remarks
* This method verifies that the provided signature is valid and corresponds to the NFT owner.
* It then inserts the new key-value pair into the metadata map, ensuring that the key does not already exist.
* The method returns an updated NFT state with the new metadata root and increments the version.
*/
insertMetadata: {
privateInputs: [MetadataMap, Field, Field, Signature],
auxiliaryOutput: MetadataMap,
async method(initialState, metadata, key, value, signature) {
signature
.verify(initialState.owner, [
...NFTState.toFields(initialState),
key,
value,
])
.assertTrue("Wrong owner signature");
metadata.insert(key, value); // Proves that key does not exist
return {
publicOutput: new NFTState({
immutableState: initialState.immutableState,
metadata: metadata.root,
owner: initialState.owner,
approved: initialState.approved,
name: initialState.name,
storage: initialState.storage,
isPaused: initialState.isPaused,
version: initialState.version.add(1),
metadataVerificationKeyHash: initialState.metadataVerificationKeyHash,
creator: initialState.creator,
oracleAddress: initialState.oracleAddress,
context: initialState.context,
}),
auxiliaryOutput: metadata,
};
},
},
/**
* Merges two self-proofs to produce a new NFT state.
*
* @returns {Promise<{ publicOutput: NFTState }>} A promise resolving to an object containing the merged NFT state.
*
* @remarks
* This method verifies both proofs and asserts the consistency of their inputs and outputs.
* It ensures that the initial state matches the public input of the first proof,
* and that the public output of the first proof matches the public input of the second proof.
* The method returns the public output of the second proof as the new merged NFT state.
*/
merge: {
privateInputs: [SelfProof, SelfProof],
async method(initialState, proof1, proof2) {
proof1.verify();
proof2.verify();
NFTState.assertEqual(initialState, proof1.publicInput);
NFTState.assertEqual(proof1.publicOutput, proof2.publicInput);
return {
publicOutput: proof2.publicOutput,
};
},
},
},
});
//# sourceMappingURL=update.js.map