/*
|
|
# withdraw.circom
|
|
|
|
WARNING: WIP, very initial version of the miksi circuit
|
|
|
|
+--------+
|
|
PUB_coinCode+------->+ |
|
|
| | +----+
|
|
PUB_amount+--------->+Poseidon+------->+ == +<-----+PUB_commitment
|
|
| | +----+
|
|
PRI_secret+--------->+ |
|
|
+--------+
|
|
|
|
+----+
|
|
PUB_address+--->+ != +<---+0
|
|
+----+
|
|
|
|
|
|
|
|
*/
|
|
|
|
include "../node_modules/circomlib/circuits/babyjub.circom";
|
|
include "../node_modules/circomlib/circuits/comparators.circom";
|
|
include "../node_modules/circomlib/circuits/poseidon.circom";
|
|
include "../node_modules/circomlib/circuits/bitify.circom";
|
|
include "../node_modules/circomlib/circuits/smt/smtverifier.circom";
|
|
include "../node_modules/circomlib/circuits/smt/smtprocessor.circom";
|
|
|
|
template Withdraw() {
|
|
signal input coinCode;
|
|
signal input amount;
|
|
signal input commitment;
|
|
signal private input secret;
|
|
signal input address;
|
|
|
|
component hash = Poseidon(3, 6, 8, 57);
|
|
hash.inputs[0] <== coinCode;
|
|
hash.inputs[1] <== amount;
|
|
hash.inputs[2] <== secret;
|
|
|
|
component eq = IsEqual();
|
|
eq.in[0] <== hash.out;
|
|
eq.in[1] <== commitment;
|
|
eq.out === 1;
|
|
|
|
component z = IsZero();
|
|
z.in <== address;
|
|
z.out === 0;
|
|
}
|
|
|
|
component main = Withdraw();
|