/* # deposit.circom +----------+ | | PRI_secret+--------->+ Poseidon +<----+PUB_key | | | + | +----------+ | +----------+ | nullifier | | +<------+PUB_rootOld | + | | | | | | | +<------+PUB_rootNew | v | | SMT | | +----+-----+ +---->+ Poseidon +<------+PRI_oldKey +--------->+ | | Verifier | | +-----+------->+ (insert) +<------+PRI_oldValue PUB_coinCode+------->+ Poseidon | | | | | | | | +<------+PRI_isOld0 PUB_amount+--------->+ | | | | +----------+ | | +<------+PRI_siblings | +----------+ | | | | +----+ | PUB_commitment+----> == +<------------+ +----+ */ include "../node_modules/circomlib/circuits/comparators.circom"; include "../node_modules/circomlib/circuits/poseidon.circom"; include "../node_modules/circomlib/circuits/smt/smtprocessor.circom"; template Deposit(nLevels) { signal input coinCode; signal input amount; signal private input secret; signal private input oldKey; signal private input oldValue; signal private input isOld0; signal private input siblings[nLevels]; signal input rootOld; signal input rootNew; signal input commitment; signal input key; component nullifierCmp = Poseidon(2, 6, 8, 57); nullifierCmp.inputs[0] <== key; nullifierCmp.inputs[1] <== secret; component hash = Poseidon(4, 6, 8, 57); hash.inputs[0] <== coinCode; hash.inputs[1] <== amount; hash.inputs[2] <== secret; hash.inputs[3] <== nullifierCmp.out; // nullifier component comCheck = IsEqual(); comCheck.in[0] <== hash.out; comCheck.in[1] <== commitment; comCheck.out === 1; component smtProcessor = SMTProcessor(nLevels); smtProcessor.oldRoot <== rootOld; smtProcessor.newRoot <== rootNew; for (var i=0; i