diff --git a/programs/zk-token-proof/Cargo.toml b/programs/zk-token-proof/Cargo.toml new file mode 100644 index 0000000000..9cd6898225 --- /dev/null +++ b/programs/zk-token-proof/Cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "spl-zk-token-proof" +description = "Solana Program Library ZkToken Proof Program" +authors = ["Solana Maintainers "] +repository = "https://github.com/solana-labs/solana-program-library" +version = "0.1.0" +edition = "2018" +publish = false + +[dependencies] +bytemuck = "1.7.2" +bytemuck_derive = "1.0.1" +num-derive = "0.3" +num-traits = "0.2" +solana-sdk = "=1.7.11" +spl-zk-token-crypto = { path = "../crypto" } +zeroable = "0.2.0" +getrandom = { version = "0.1", features = ["dummy"] } + +[features] +test-bpf = [] + +[dev-dependencies] +assert_matches = "1.4.0" +solana-program-test = "=1.7.11" +solana-validator = "=1.7.11" diff --git a/programs/zk-token-proof/src/lib.rs b/programs/zk-token-proof/src/lib.rs new file mode 100644 index 0000000000..d1d187fbde --- /dev/null +++ b/programs/zk-token-proof/src/lib.rs @@ -0,0 +1,30 @@ +#![forbid(unsafe_code)] + +use { + solana_sdk::{ + ic_msg, instruction::InstructionError, process_instruction::InvokeContext, pubkey::Pubkey, + }, + spl_zk_token_crypto::instruction::*, + std::result::Result, +}; + +pub fn process_instruction( + program_id: &Pubkey, + input: &[u8], + invoke_context: &mut dyn InvokeContext, +) -> Result<(), InstructionError> { + match ProofInstruction::decode_type(program_id, input) + .ok_or(InstructionError::InvalidInstructionData)? + { + ProofInstruction::VerifyUpdateAccountPkData => { + ic_msg!(invoke_context, "VerifyUpdateAccountPkData"); + let proof = ProofInstruction::decode_data::(input) + .ok_or(InstructionError::InvalidInstructionData)?; + + proof.verify().map_err(|err| { + ic_msg!(invoke_context, "proof verification failed: {:?}", err); + InstructionError::InvalidInstructionData + }) + } + } +}