diff --git a/contracts/axelar-gateway/src/contract.rs b/contracts/axelar-gateway/src/contract.rs index eda4bdf0..795b467d 100644 --- a/contracts/axelar-gateway/src/contract.rs +++ b/contracts/axelar-gateway/src/contract.rs @@ -25,15 +25,15 @@ pub struct AxelarGateway; #[contractimpl] impl UpgradeableInterface for AxelarGateway { - fn version(env: Env) -> String { - String::from_str(&env, CONTRACT_VERSION) + fn version(env: &Env) -> String { + String::from_str(env, CONTRACT_VERSION) } - fn upgrade(env: Env, new_wasm_hash: BytesN<32>) { - Self::owner(&env).require_auth(); + fn upgrade(env: &Env, new_wasm_hash: BytesN<32>) { + Self::owner(env).require_auth(); env.deployer().update_current_contract_wasm(new_wasm_hash); - Self::start_migration(&env); + Self::start_migration(env); } } @@ -64,13 +64,15 @@ impl AxelarGateway { } /// Migrate the contract state after upgrading the contract code. the migration_data type can be adjusted as needed. - pub fn migrate(env: Env, migration_data: ()) -> Result<(), ContractError> { + pub fn migrate(env: &Env, migration_data: ()) -> Result<(), ContractError> { // This function should not get modified. // Custom migration logic that changes from version to version should be added in the run_migration function - Self::ensure_is_migrating(&env)?; + Self::ensure_is_migrating(env)?; - Self::run_migration(&env, migration_data); - Self::complete_migration(&env); + Self::run_migration(env, migration_data); + Self::complete_migration(env); + + event::upgraded(env, &Self::version(env)); Ok(()) } diff --git a/contracts/axelar-gateway/src/error.rs b/contracts/axelar-gateway/src/error.rs index 0f91c372..ff2d76eb 100644 --- a/contracts/axelar-gateway/src/error.rs +++ b/contracts/axelar-gateway/src/error.rs @@ -4,7 +4,7 @@ use soroban_sdk::contracterror; #[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)] #[repr(u32)] pub enum ContractError { - // Auth + /// Auth InvalidThreshold = 1, InvalidProof = 2, InvalidSigners = 3, @@ -16,7 +16,8 @@ pub enum ContractError { DuplicateSigners = 9, InvalidSignersHash = 10, InvalidEpoch = 11, - // Messages + /// Messages EmptyMessages = 12, + /// Upgradeable MigrationNotAllowed = 13, } diff --git a/contracts/axelar-gateway/src/event.rs b/contracts/axelar-gateway/src/event.rs index 3173f818..d22e7695 100644 --- a/contracts/axelar-gateway/src/event.rs +++ b/contracts/axelar-gateway/src/event.rs @@ -51,3 +51,8 @@ pub fn transfer_ownership(env: &Env, previous_owner: Address, new_owner: Address ); env.events().publish(topics, ()); } + +pub fn upgraded(env: &Env, version: &String) { + env.events() + .publish((Symbol::new(env, "upgraded"),), (version.to_val(),)); +} diff --git a/contracts/axelar-gateway/src/storage_types.rs b/contracts/axelar-gateway/src/storage_types.rs index bca6d200..40265b76 100644 --- a/contracts/axelar-gateway/src/storage_types.rs +++ b/contracts/axelar-gateway/src/storage_types.rs @@ -22,6 +22,7 @@ pub enum DataKey { Owner, Operator, MessageApproval(MessageApprovalKey), + /// Upgradeable Migrating, /// Auth Module PreviousSignerRetention, diff --git a/contracts/upgrader/tests/utils/dummy_contract.rs b/contracts/upgrader/tests/utils/dummy_contract.rs index a0314380..d0e6395a 100644 --- a/contracts/upgrader/tests/utils/dummy_contract.rs +++ b/contracts/upgrader/tests/utils/dummy_contract.rs @@ -8,12 +8,12 @@ pub struct DummyContract; /// Dummy contract logic before upgrade #[contractimpl] impl UpgradeableInterface for DummyContract { - fn version(env: Env) -> soroban_sdk::String { - soroban_sdk::String::from_str(&env, "0.1.0") + fn version(env: &Env) -> soroban_sdk::String { + soroban_sdk::String::from_str(env, "0.1.0") } - fn upgrade(env: Env, new_wasm_hash: BytesN<32>) { - Self::owner(&env).require_auth(); + fn upgrade(env: &Env, new_wasm_hash: BytesN<32>) { + Self::owner(env).require_auth(); env.deployer().update_current_contract_wasm(new_wasm_hash); } diff --git a/packages/axelar-soroban-std/src/upgrade.rs b/packages/axelar-soroban-std/src/upgrade.rs index f239e1b6..1f42ca8e 100644 --- a/packages/axelar-soroban-std/src/upgrade.rs +++ b/packages/axelar-soroban-std/src/upgrade.rs @@ -3,8 +3,8 @@ use soroban_sdk::{contractclient, BytesN, Env, String}; #[contractclient(name = "UpgradeableClient")] pub trait UpgradeableInterface { /// Returns the current version of the contract. - fn version(env: Env) -> String; + fn version(env: &Env) -> String; /// Upgrades the contract to a new WASM hash. - fn upgrade(env: Env, new_wasm_hash: BytesN<32>); + fn upgrade(env: &Env, new_wasm_hash: BytesN<32>); }