Skip to content

Commit 427d528

Browse files
committed
reputation contract init
1 parent ef5eda1 commit 427d528

File tree

6 files changed

+129
-5
lines changed

6 files changed

+129
-5
lines changed

contracts/reputation-scoring-contract/src/contract.rs

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use crate::error::ReputationError;
2+
use crate::events;
23
use crate::storage;
3-
use soroban_sdk::{Address, Env};
4+
use soroban_sdk::{Address, BytesN, Env};
45

56
pub fn initialize(
67
env: &Env,
@@ -14,3 +15,37 @@ pub fn initialize(
1415
storage::set_vault_address(env, vault_address);
1516
Ok(())
1617
}
18+
19+
pub fn pause(env: &Env) -> Result<(), ReputationError> {
20+
let admin = storage::get_admin(env).ok_or(ReputationError::NotInitialized)?;
21+
admin.require_auth();
22+
storage::set_paused(env, true);
23+
events::contract_paused(env, true);
24+
Ok(())
25+
}
26+
27+
pub fn unpause(env: &Env) -> Result<(), ReputationError> {
28+
let admin = storage::get_admin(env).ok_or(ReputationError::NotInitialized)?;
29+
admin.require_auth();
30+
storage::set_paused(env, false);
31+
events::contract_paused(env, false);
32+
Ok(())
33+
}
34+
35+
pub fn transfer_admin(env: &Env, new_admin: &Address) -> Result<(), ReputationError> {
36+
let admin = storage::get_admin(env).ok_or(ReputationError::NotInitialized)?;
37+
admin.require_auth();
38+
if storage::is_paused(env) {
39+
return Err(ReputationError::ContractPaused);
40+
}
41+
storage::set_admin(env, new_admin);
42+
events::admin_transferred(env, &admin, new_admin);
43+
Ok(())
44+
}
45+
46+
pub fn upgrade_contract(env: &Env, new_wasm_hash: BytesN<32>) -> Result<(), ReputationError> {
47+
let admin = storage::get_admin(env).ok_or(ReputationError::NotInitialized)?;
48+
admin.require_auth();
49+
env.deployer().update_current_contract_wasm(new_wasm_hash);
50+
Ok(())
51+
}

contracts/reputation-scoring-contract/src/error.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,7 @@ use soroban_sdk::contracterror;
44
#[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)]
55
#[repr(u32)]
66
pub enum ReputationError {
7-
AlreadyInitialized = 1,
7+
NotInitialized = 1,
8+
AlreadyInitialized = 2,
9+
ContractPaused = 3,
810
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#![allow(deprecated)]
2+
use soroban_sdk::{symbol_short, Address, Env};
3+
4+
/// Emitted when the contract is paused or unpaused.
5+
pub fn contract_paused(env: &Env, paused: bool) {
6+
let topics = (symbol_short!("paused"),);
7+
env.events().publish(topics, paused);
8+
}
9+
10+
/// Emitted when admin authority is transferred to a new address.
11+
pub fn admin_transferred(env: &Env, old_admin: &Address, new_admin: &Address) {
12+
let topics = (symbol_short!("adm_xfer"),);
13+
env.events()
14+
.publish(topics, (old_admin.clone(), new_admin.clone()));
15+
}

contracts/reputation-scoring-contract/src/lib.rs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@
22

33
mod contract;
44
mod error;
5+
mod events;
56
mod storage;
67
#[cfg(test)]
78
mod test;
89
mod types;
910

1011
use crate::error::ReputationError;
11-
use soroban_sdk::{contract, contractimpl, Address, Env};
12+
use soroban_sdk::{contract, contractimpl, Address, BytesN, Env};
1213

1314
#[contract]
1415
pub struct ReputationScoringContract;
@@ -18,4 +19,20 @@ impl ReputationScoringContract {
1819
pub fn init(env: Env, admin: Address, vault_address: Address) -> Result<(), ReputationError> {
1920
contract::initialize(&env, &admin, &vault_address)
2021
}
22+
23+
pub fn pause(env: Env) -> Result<(), ReputationError> {
24+
contract::pause(&env)
25+
}
26+
27+
pub fn unpause(env: Env) -> Result<(), ReputationError> {
28+
contract::unpause(&env)
29+
}
30+
31+
pub fn transfer_admin(env: Env, new_admin: Address) -> Result<(), ReputationError> {
32+
contract::transfer_admin(&env, &new_admin)
33+
}
34+
35+
pub fn upgrade_contract(env: Env, new_wasm_hash: BytesN<32>) -> Result<(), ReputationError> {
36+
contract::upgrade_contract(&env, new_wasm_hash)
37+
}
2138
}

contracts/reputation-scoring-contract/src/storage.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use soroban_sdk::{contracttype, Address, Env};
55
pub enum DataKey {
66
Admin,
77
VaultAddress,
8+
IsPaused,
89
}
910

1011
pub fn has_admin(env: &Env) -> bool {
@@ -15,6 +16,21 @@ pub fn set_admin(env: &Env, admin: &Address) {
1516
env.storage().instance().set(&DataKey::Admin, admin);
1617
}
1718

19+
pub fn get_admin(env: &Env) -> Option<Address> {
20+
env.storage().instance().get(&DataKey::Admin)
21+
}
22+
1823
pub fn set_vault_address(env: &Env, vault: &Address) {
1924
env.storage().instance().set(&DataKey::VaultAddress, vault);
2025
}
26+
27+
pub fn is_paused(env: &Env) -> bool {
28+
env.storage()
29+
.instance()
30+
.get(&DataKey::IsPaused)
31+
.unwrap_or(false)
32+
}
33+
34+
pub fn set_paused(env: &Env, paused: bool) {
35+
env.storage().instance().set(&DataKey::IsPaused, &paused);
36+
}

contracts/reputation-scoring-contract/src/test.rs

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,52 @@
33
use super::*;
44
use soroban_sdk::{testutils::Address as _, Address, Env};
55

6-
#[test]
7-
fn test_initialize() {
6+
fn setup() -> (Env, Address, Address, ReputationScoringContractClient<'static>) {
87
let env = Env::default();
98
env.mock_all_auths();
109
let contract_id = env.register(ReputationScoringContract, ());
1110
let client = ReputationScoringContractClient::new(&env, &contract_id);
1211
let admin = Address::generate(&env);
1312
let vault = Address::generate(&env);
13+
(env, admin, vault, client)
14+
}
15+
16+
#[test]
17+
fn test_initialize() {
18+
let (_env, admin, vault, client) = setup();
19+
client.init(&admin, &vault);
20+
}
21+
22+
#[test]
23+
fn test_initialize_twice_fails() {
24+
let (_env, admin, vault, client) = setup();
25+
client.init(&admin, &vault);
26+
assert!(client.try_init(&admin, &vault).is_err());
27+
}
28+
29+
#[test]
30+
fn test_transfer_admin() {
31+
let (env, admin, vault, client) = setup();
32+
client.init(&admin, &vault);
33+
let new_admin = Address::generate(&env);
34+
client.transfer_admin(&new_admin);
35+
}
36+
37+
#[test]
38+
fn test_pause_blocks_transfer_admin() {
39+
let (env, admin, vault, client) = setup();
40+
client.init(&admin, &vault);
41+
client.pause();
42+
let new_admin = Address::generate(&env);
43+
assert!(client.try_transfer_admin(&new_admin).is_err());
44+
}
45+
46+
#[test]
47+
fn test_unpause_restores_transfer_admin() {
48+
let (env, admin, vault, client) = setup();
1449
client.init(&admin, &vault);
50+
client.pause();
51+
client.unpause();
52+
let new_admin = Address::generate(&env);
53+
client.transfer_admin(&new_admin);
1554
}

0 commit comments

Comments
 (0)