-
Notifications
You must be signed in to change notification settings - Fork 29
/
upgrades.cairo
81 lines (73 loc) · 3.1 KB
/
upgrades.cairo
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
mod Upgrades {
use traits::TryInto;
use option::OptionTrait;
use traits::Into;
use box::BoxTrait;
use starknet::SyscallResultTrait;
use starknet::SyscallResult;
use starknet::syscalls;
use starknet::ClassHash;
use starknet::ContractAddress;
use starknet::class_hash;
use governance::proposals::Proposals;
use governance::contract::Governance::{
proposal_applied, amm_address, governance_token_address, merkle_root, proposal_details
};
use governance::types::PropDetails;
use governance::contract::Governance;
use governance::contract::Governance::unsafe_new_contract_state;
use governance::traits::IAMMDispatcher;
use governance::traits::IAMMDispatcherTrait;
use governance::traits::IGovernanceTokenDispatcher;
use governance::traits::IGovernanceTokenDispatcherTrait;
fn apply_passed_proposal(prop_id: felt252) {
let mut state = Governance::unsafe_new_contract_state();
let status = Proposals::get_proposal_status(prop_id);
assert(status == 1, 'prop not passed');
let applied: felt252 = proposal_applied::InternalContractStateTrait::read(
@state.proposal_applied, prop_id
);
assert(applied == 0, 'Proposal already applied');
let prop_details: PropDetails = proposal_details::InternalContractStateTrait::read(
@state.proposal_details, prop_id
);
let contract_type = prop_details.to_upgrade;
Proposals::assert_correct_contract_type(contract_type);
let impl_hash = prop_details.payload;
// Apply the upgrade
// TODO use full match/switch when supported
match contract_type {
0 => {
let amm_addr: ContractAddress = amm_address::InternalContractStateTrait::read(
@state.amm_address
);
IAMMDispatcher { contract_address: amm_addr }.upgrade(impl_hash);
},
_ => {
if (contract_type == 1) {
let impl_hash_classhash: ClassHash = impl_hash.try_into().unwrap();
syscalls::replace_class_syscall(impl_hash_classhash);
} else if (contract_type == 2) {
let govtoken_addr = governance_token_address::InternalContractStateTrait::read(
@state.governance_token_address
);
IGovernanceTokenDispatcher {
contract_address: govtoken_addr
}.upgrade(impl_hash);
} else if (contract_type == 3) {
merkle_root::InternalContractStateTrait::write(
ref state.merkle_root, impl_hash
);
} else {
assert(
contract_type == 4, 'invalid contract_type'
); // type 4 is no-op, signal vote
}
}
}
proposal_applied::InternalContractStateTrait::write(
ref state.proposal_applied, prop_id, 1
); // Mark the proposal as applied
// TODO emit event
}
}