dao-mint.zk 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. constant "DaoMint" {
  2. EcFixedPointShort VALUE_COMMIT_VALUE,
  3. EcFixedPoint VALUE_COMMIT_RANDOM,
  4. }
  5. contract "DaoMint" {
  6. Base treasury_value,
  7. Base authority_key_x,
  8. Base authority_key_y,
  9. Base governance_token_id,
  10. Base treasury_token_id,
  11. Scalar treasury_value_blind,
  12. Base authority_key_x_blind,
  13. Base authority_key_y_blind,
  14. Base governance_token_id_blind,
  15. Base treasury_token_id_blind,
  16. # BullaMint subroutine
  17. Base serial,
  18. Base coin_blind,
  19. }
  20. circuit "DaoMint" {
  21. # Pedersen commitment for coin's value
  22. vcv = ec_mul_short(treasury_value, VALUE_COMMIT_VALUE);
  23. vcr = ec_mul(treasury_value_blind, VALUE_COMMIT_RANDOM);
  24. value_commit = ec_add(vcv, vcr);
  25. # Since the value commit is a curve point, we fetch its coordinates
  26. # and constrain them:
  27. value_commit_x = ec_get_x(value_commit);
  28. value_commit_y = ec_get_y(value_commit);
  29. constrain_instance(value_commit_x);
  30. constrain_instance(value_commit_y);
  31. authority_x_commit = poseidon_hash(authority_key_x, authority_key_x_blind);
  32. constrain_instance(authority_x_commit);
  33. authority_y_commit = poseidon_hash(authority_key_y, authority_key_y_blind);
  34. constrain_instance(authority_y_commit);
  35. gov_token_id_commit = poseidon_hash(
  36. governance_token_id, governance_token_id_blind);
  37. constrain_instance(gov_token_id_commit);
  38. treasury_token_id_commit = poseidon_hash(
  39. treasury_token_id, treasury_token_id_blind);
  40. constrain_instance(treasury_token_id_commit);
  41. # BullaMint subroutine
  42. bulla = poseidon_hash(
  43. treasury_value,
  44. authority_key_x,
  45. authority_key_y,
  46. governance_token_id,
  47. treasury_token_id,
  48. serial,
  49. coin_blind
  50. );
  51. constrain_instance(bulla);
  52. }