dao-propose-main.zk 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. constant "DaoProposeMain" {
  2. EcFixedPointShort VALUE_COMMIT_VALUE,
  3. EcFixedPoint VALUE_COMMIT_RANDOM,
  4. }
  5. contract "DaoProposeMain" {
  6. # Proposers total number of gov tokens
  7. Base total_funds,
  8. Scalar total_funds_blind,
  9. # Check the inputs and this proof are for the same token
  10. Base gov_token_blind,
  11. # proposal params
  12. Base proposal_dest_x,
  13. Base proposal_dest_y,
  14. Base proposal_amount,
  15. Base proposal_serial,
  16. Base proposal_token_id,
  17. Base proposal_blind,
  18. # DAO params
  19. Base dao_proposer_limit,
  20. Base dao_quorum,
  21. Base dao_approval_ratio_quot,
  22. Base dao_approval_ratio_base,
  23. Base gov_token_id,
  24. Base dao_public_x,
  25. Base dao_public_y,
  26. Base dao_bulla_blind,
  27. Uint32 dao_leaf_pos,
  28. MerklePath dao_path,
  29. }
  30. circuit "DaoProposeMain" {
  31. token_commit = poseidon_hash(gov_token_id, gov_token_blind);
  32. constrain_instance(token_commit);
  33. dao_bulla = poseidon_hash(
  34. dao_proposer_limit,
  35. dao_quorum,
  36. dao_approval_ratio_quot,
  37. dao_approval_ratio_base,
  38. gov_token_id,
  39. dao_public_x,
  40. dao_public_y,
  41. dao_bulla_blind,
  42. );
  43. dao_root = merkle_root(dao_leaf_pos, dao_path, dao_bulla);
  44. constrain_instance(dao_root);
  45. # Proves this DAO is valid
  46. proposal_bulla = poseidon_hash(
  47. proposal_dest_x,
  48. proposal_dest_y,
  49. proposal_amount,
  50. proposal_serial,
  51. proposal_token_id,
  52. dao_bulla,
  53. proposal_blind,
  54. # @tmp-workaround
  55. proposal_blind,
  56. );
  57. constrain_instance(proposal_bulla);
  58. # Rangeproof check for proposal amount
  59. zero = witness_base(0);
  60. less_than(zero, proposal_amount);
  61. # This is the main check
  62. # We check that dao_proposer_limit <= total_funds
  63. one = witness_base(1);
  64. total_funds_1 = base_add(total_funds, one);
  65. less_than(dao_proposer_limit, total_funds_1);
  66. # Pedersen commitment for coin's value
  67. vcv = ec_mul_short(total_funds, VALUE_COMMIT_VALUE);
  68. vcr = ec_mul(total_funds_blind, VALUE_COMMIT_RANDOM);
  69. total_funds_commit = ec_add(vcv, vcr);
  70. # Since total_funds_commit is a curve point, we fetch its coordinates
  71. # and constrain them:
  72. total_funds_commit_x = ec_get_x(total_funds_commit);
  73. total_funds_commit_y = ec_get_y(total_funds_commit);
  74. constrain_instance(total_funds_commit_x);
  75. constrain_instance(total_funds_commit_y);
  76. }