1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107 | k = 11;
field = "pallas";
constant "ProposeMain" {
EcFixedPoint VALUE_COMMIT_RANDOM,
EcFixedPointBase NULLIFIER_K,
EcFixedPointShort VALUE_COMMIT_VALUE,
}
witness "ProposeMain" {
# Proposers total number of governance tokens
Base total_funds,
Scalar total_funds_blind,
# Check the inputs and this proof are for the same token
Base gov_token_blind,
# Proposal parameters
Base proposal_auth_calls_commit,
Base proposal_creation_blockwindow,
Base proposal_duration_blockwindows,
Base proposal_user_data,
Base proposal_blind,
# DAO params
Base dao_proposer_limit,
Base dao_quorum,
Base dao_early_exec_quorum,
Base dao_approval_ratio_quot,
Base dao_approval_ratio_base,
Base dao_gov_token_id,
Base dao_notes_public_x,
Base dao_notes_public_y,
Base dao_proposer_secret,
Base dao_proposals_public_x,
Base dao_proposals_public_y,
Base dao_votes_public_x,
Base dao_votes_public_y,
Base dao_exec_public_x,
Base dao_exec_public_y,
Base dao_early_exec_public_x,
Base dao_early_exec_public_y,
Base dao_bulla_blind,
Uint32 dao_leaf_pos,
MerklePath dao_path,
}
circuit "ProposeMain" {
token_commit = poseidon_hash(dao_gov_token_id, gov_token_blind);
constrain_instance(token_commit);
# Derive DAO proposer public key
dao_proposer_public = ec_mul_base(dao_proposer_secret, NULLIFIER_K);
dao_proposer_public_x = ec_get_x(dao_proposer_public);
dao_proposer_public_y = ec_get_y(dao_proposer_public);
dao_bulla = poseidon_hash(
dao_proposer_limit,
dao_quorum,
dao_early_exec_quorum,
dao_approval_ratio_quot,
dao_approval_ratio_base,
dao_gov_token_id,
dao_notes_public_x,
dao_notes_public_y,
dao_proposer_public_x,
dao_proposer_public_y,
dao_proposals_public_x,
dao_proposals_public_y,
dao_votes_public_x,
dao_votes_public_y,
dao_exec_public_x,
dao_exec_public_y,
dao_early_exec_public_x,
dao_early_exec_public_y,
dao_bulla_blind,
);
dao_root = merkle_root(dao_leaf_pos, dao_path, dao_bulla);
constrain_instance(dao_root);
# Proves this DAO is valid
proposal_bulla = poseidon_hash(
proposal_auth_calls_commit,
proposal_creation_blockwindow,
proposal_duration_blockwindows,
proposal_user_data,
dao_bulla,
proposal_blind,
);
constrain_instance(proposal_bulla);
constrain_instance(proposal_creation_blockwindow);
# This is the main check
# We check that dao_proposer_limit <= total_funds
one = witness_base(1);
total_funds_1 = base_add(total_funds, one);
less_than_strict(dao_proposer_limit, total_funds_1);
# Pedersen commitment for coin's value
vcv = ec_mul_short(total_funds, VALUE_COMMIT_VALUE);
vcr = ec_mul(total_funds_blind, VALUE_COMMIT_RANDOM);
total_funds_commit = ec_add(vcv, vcr);
constrain_instance(ec_get_x(total_funds_commit));
constrain_instance(ec_get_y(total_funds_commit));
}
|