Skip to content

Commit a17f2b6

Browse files
authored
Merge pull request #145 from Abrahamojobo/feature/upgrade-ability
feat: implement contract upgradeability API (Closes #125)
2 parents 58dbfcf + 1e0995a commit a17f2b6

2 files changed

Lines changed: 63 additions & 0 deletions

File tree

contracts/marketx/src/lib.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -940,6 +940,13 @@ impl Contract {
940940
// 🔧 ADMIN FUNCTIONS
941941
// =========================
942942

943+
/// Upgrade the contract WASM.
944+
pub fn upgrade(env: Env, new_wasm_hash: soroban_sdk::BytesN<32>) -> Result<(), ContractError> {
945+
Self::assert_admin(&env)?;
946+
env.deployer().update_current_contract_wasm(new_wasm_hash);
947+
Ok(())
948+
}
949+
943950
/// Propose a new admin. The transfer is not complete until the new admin accepts.
944951
pub fn transfer_admin(env: Env, new_admin: Address) -> Result<(), ContractError> {
945952
Self::assert_admin(&env)?;

contracts/marketx/src/test.rs

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1539,3 +1539,59 @@ fn test_contract_balance_invariant() {
15391539
assert!(token.balance(&contract_id) >= expected_contract_balance);
15401540
assert_eq!(expected_contract_balance, 0);
15411541
}
1542+
1543+
#[test]
1544+
fn test_upgrade_auth_failure() {
1545+
let env = Env::default();
1546+
let admin = Address::generate(&env);
1547+
let non_admin = Address::generate(&env);
1548+
let collector = Address::generate(&env);
1549+
1550+
let contract_id = env.register_contract(None, MarketXContract);
1551+
let client = MarketXContractClient::new(&env, &contract_id);
1552+
1553+
client.mock_all_auths();
1554+
client.initialize(&admin, &collector, &250);
1555+
1556+
let new_wasm_hash = soroban_sdk::BytesN::from_array(&env, &[0; 32]);
1557+
let result = client
1558+
.mock_auths(&[MockAuth {
1559+
address: &non_admin,
1560+
invoke: &MockAuthInvoke {
1561+
contract: &client.address,
1562+
fn_name: "upgrade",
1563+
args: (&new_wasm_hash,).into_val(&env),
1564+
sub_invokes: &[],
1565+
},
1566+
}])
1567+
.try_upgrade(&new_wasm_hash);
1568+
1569+
assert!(result.is_err());
1570+
}
1571+
1572+
#[test]
1573+
fn test_upgrade_state_persistence() {
1574+
let env = Env::default();
1575+
env.mock_all_auths();
1576+
1577+
let admin = Address::generate(&env);
1578+
let buyer = Address::generate(&env);
1579+
let seller = Address::generate(&env);
1580+
1581+
let token_id = env.register_stellar_asset_contract_v2(admin.clone());
1582+
let contract_id = env.register_contract(None, MarketXContract);
1583+
let client = MarketXContractClient::new(&env, &contract_id);
1584+
1585+
client.initialize(&admin, &admin, &500);
1586+
1587+
let escrow_id = client.create_escrow(&buyer, &seller, &token_id.address(), &1000, &None, &None, &None);
1588+
1589+
let escrow = client.get_escrow(&escrow_id).unwrap();
1590+
assert_eq!(escrow.amount, 1000);
1591+
1592+
let new_wasm_hash = soroban_sdk::BytesN::from_array(&env, &[0; 32]);
1593+
let _ = client.try_upgrade(&new_wasm_hash);
1594+
1595+
let escrow_after = client.get_escrow(&escrow_id).unwrap();
1596+
assert_eq!(escrow_after.amount, 1000);
1597+
}

0 commit comments

Comments
 (0)