astro_assembly/
migration.rs

1#![cfg(not(tarpaulin_include))]
2
3use cosmwasm_schema::cw_serde;
4use cosmwasm_std::{
5    Addr, CosmosMsg, DepsMut, Empty, Env, Order, Response, StdResult, Uint128, Uint64,
6};
7use cw2::{get_contract_version, set_contract_version};
8use cw_storage_plus::Map;
9
10use astroport_governance::assembly::{Proposal, ProposalStatus};
11
12use crate::contract::{CONTRACT_NAME, CONTRACT_VERSION};
13use crate::error::ContractError;
14use crate::state::PROPOSALS;
15
16#[cw_serde]
17pub struct OldProposal {
18    pub proposal_id: Uint64,
19    pub submitter: Addr,
20    pub status: ProposalStatus,
21    pub for_power: Uint128,
22    pub outpost_for_power: Uint128,
23    pub against_power: Uint128,
24    pub outpost_against_power: Uint128,
25    pub start_block: u64,
26    pub start_time: u64,
27    pub end_block: u64,
28    pub delayed_end_block: u64,
29    pub expiration_block: u64,
30    pub title: String,
31    pub description: String,
32    pub link: Option<String>,
33    pub messages: Vec<CosmosMsg>,
34    pub deposit_amount: Uint128,
35    pub ibc_channel: Option<String>,
36    pub total_voting_power: Uint128,
37}
38
39const OLD_PROPOSALS: Map<u64, OldProposal> = Map::new("proposals");
40
41#[cfg_attr(not(feature = "library"), cosmwasm_std::entry_point)]
42pub fn migrate(deps: DepsMut, _env: Env, _msg: Empty) -> Result<Response, ContractError> {
43    let contract_version = get_contract_version(deps.storage)?;
44
45    match contract_version.contract.as_ref() {
46        CONTRACT_NAME => match contract_version.version.as_ref() {
47            "2.0.1" => {
48                let proposals = OLD_PROPOSALS
49                    .range(deps.storage, None, None, Order::Ascending)
50                    .collect::<StdResult<Vec<_>>>()?;
51
52                proposals.into_iter().try_for_each(|(id, old_proposal)| {
53                    let proposal = Proposal {
54                        proposal_id: old_proposal.proposal_id,
55                        submitter: old_proposal.submitter,
56                        status: old_proposal.status,
57                        for_power: old_proposal.for_power,
58                        against_power: old_proposal.against_power,
59                        start_block: old_proposal.start_block,
60                        start_time: old_proposal.start_time,
61                        end_block: old_proposal.end_block,
62                        delayed_end_block: old_proposal.delayed_end_block,
63                        expiration_block: old_proposal.expiration_block,
64                        title: old_proposal.title,
65                        description: old_proposal.description,
66                        link: old_proposal.link,
67                        messages: old_proposal.messages,
68                        deposit_amount: old_proposal.deposit_amount,
69                        ibc_channel: old_proposal.ibc_channel,
70                        total_voting_power: old_proposal.total_voting_power,
71                    };
72                    PROPOSALS
73                        .save(deps.storage, id, &proposal)
74                        .map_err(ContractError::Std)
75                })
76            }
77            "3.0.0" => Ok(()),
78            _ => Err(ContractError::MigrationError {}),
79        },
80        _ => Err(ContractError::MigrationError {}),
81    }?;
82
83    set_contract_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?;
84
85    Ok(Response::new()
86        .add_attribute("previous_contract_name", &contract_version.contract)
87        .add_attribute("previous_contract_version", &contract_version.version)
88        .add_attribute("new_contract_name", CONTRACT_NAME)
89        .add_attribute("new_contract_version", CONTRACT_VERSION))
90}