dao-burn.zk 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. constant "DaoBurn" {
  2. EcFixedPointShort VALUE_COMMIT_VALUE,
  3. EcFixedPoint VALUE_COMMIT_RANDOM,
  4. }
  5. contract "DaoBurn" {
  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. # BullaBurn subroutine
  17. Base serial,
  18. Base coin_blind,
  19. Uint32 leaf_pos,
  20. MerklePath path,
  21. Base signature_secret,
  22. }
  23. contract "DaoBurn" {
  24. # Pedersen commitment for coin's value
  25. vcv = ec_mul_short(treasury_value, VALUE_COMMIT_VALUE);
  26. vcr = ec_mul(treasury_value_blind, VALUE_COMMIT_RANDOM);
  27. value_commit = ec_add(vcv, vcr);
  28. # Since the value commit is a curve point, we fetch its coordinates
  29. # and constrain them:
  30. value_commit_x = ec_get_x(value_commit);
  31. value_commit_y = ec_get_y(value_commit);
  32. constrain_instance(value_commit_x);
  33. constrain_instance(value_commit_y);
  34. authority_x_commit = poseidon_hash(authority_key_x, authority_key_x_blind);
  35. constrain_instance(authority_x_commit);
  36. authority_y_commit = poseidon_hash(authority_key_y, authority_key_y_blind);
  37. constrain_instance(authority_y_commit);
  38. gov_token_id_commit = poseidon_hash(
  39. governance_token_id, governance_token_id_blind);
  40. constrain_instance(gov_token_id_commit);
  41. treasury_token_id_commit = poseidon_hash(
  42. treasury_token_id, treasury_token_id_blind);
  43. constrain_instance(treasury_token_id_commit);
  44. # BullaBurn subroutine
  45. # Poseidon hash of the nullifier
  46. nullifier = poseidon_hash(serial);
  47. constrain_instance(nullifier);
  48. B = poseidon_hash(
  49. treasury_value,
  50. authority_key_x,
  51. authority_key_y,
  52. governance_token_id,
  53. treasury_token_id,
  54. serial,
  55. coin_blind
  56. );
  57. # Merkle root
  58. root = calculate_merkle_root(leaf_pos, path, B);
  59. constrain_instance(root);
  60. # Finally, we derive a public key for the signature and
  61. # constrain its coordinates:
  62. signature_public = ec_mul_base(signature_secret, NULLIFIER_K);
  63. signature_x = ec_get_x(signature_public);
  64. signature_y = ec_get_y(signature_public);
  65. constrain_instance(signature_x);
  66. constrain_instance(signature_y);
  67. }