Skip to content

Commit 97b6bf8

Browse files
authored
Merge pull request #312 from Sage-senpai/feat/contract-upgradeability
Feat/contract upgradeability
2 parents 2ee179e + 6658eb2 commit 97b6bf8

32 files changed

Lines changed: 4624 additions & 1622 deletions

soroban-contract/contracts/dao_governance/src/lib.rs

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -512,6 +512,57 @@ impl DaoGovernance {
512512
Self::get_config(&env)
513513
}
514514

515+
// ── Upgrade / admin surface ──────────────────────────────────────────────
516+
517+
pub fn schedule_upgrade(env: Env, new_wasm_hash: BytesN<32>) {
518+
upg::schedule_upgrade(&env, new_wasm_hash);
519+
}
520+
521+
pub fn cancel_upgrade(env: Env) {
522+
upg::cancel_upgrade(&env);
523+
}
524+
525+
pub fn commit_upgrade(env: Env) {
526+
upg::commit_upgrade(&env);
527+
}
528+
529+
/// Immediate (fast-path) upgrade. Admin-only, no timelock — see
530+
/// `upgradeable::upgrade` for the full security note. Reserve for
531+
/// emergencies; prefer `schedule_upgrade` + `commit_upgrade` for
532+
/// routine upgrades.
533+
pub fn upgrade(env: Env, new_wasm_hash: BytesN<32>) {
534+
upg::upgrade(&env, new_wasm_hash);
535+
}
536+
537+
/// Apply post-upgrade state-shape migrations and bump the version to
538+
/// `target_version`. Admin-only; rejects downgrades.
539+
pub fn migrate(env: Env, target_version: u32) {
540+
upg::require_admin(&env);
541+
upg::require_version_increase(&env, target_version);
542+
543+
match target_version {
544+
_ => {}
545+
}
546+
547+
upg::migration_completed(&env, target_version);
548+
}
549+
550+
pub fn pause(env: Env) {
551+
upg::pause(&env);
552+
}
553+
554+
pub fn unpause(env: Env) {
555+
upg::unpause(&env);
556+
}
557+
558+
pub fn transfer_admin(env: Env, new_admin: Address) {
559+
upg::transfer_admin(&env, new_admin);
560+
}
561+
562+
pub fn version(env: Env) -> u32 {
563+
upg::get_version(&env)
564+
}
565+
515566
// ── Internal Helper Functions ────────────────────────────────────────────
516567

517568
fn get_config(env: &Env) -> DaoConfig {

soroban-contract/contracts/event_manager/src/lib.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,8 @@ pub struct RefundClaimedEvent {
200200
pub total_paid: i128,
201201
}
202202

203+
/// Per-attendee POAP metadata sent over the wire to the POAP NFT contract's
204+
/// `mint_poap` entry point. Field shape must match `poap_nft::PoapMetadata`.
203205
#[contracttype]
204206
#[derive(Clone, Debug, Eq, PartialEq)]
205207
pub struct TicketPurchasedEvent {
@@ -785,6 +787,17 @@ impl EventManager {
785787
env.events()
786788
.publish((Symbol::new(&env, "RefundClaimed"),), event);
787789

790+
pub fn initialize_legacy(env: Env, ticket_factory: Address) -> Result<(), Error> {
791+
if env.storage().instance().has(&DataKey::TicketFactory) {
792+
return Err(Error::AlreadyInitialized);
793+
}
794+
upg::set_admin(&env, &ticket_factory);
795+
upg::init_version(&env);
796+
env.storage()
797+
.instance()
798+
.set(&DataKey::TicketFactory, &ticket_factory);
799+
env.storage().instance().set(&DataKey::EventCounter, &0u32);
800+
upg::extend_instance_ttl(&env);
788801
Ok(())
789802
}
790803

@@ -1183,6 +1196,27 @@ impl EventManager {
11831196
upg::commit_upgrade(&env);
11841197
}
11851198

1199+
/// Immediate (fast-path) upgrade. Admin-only, no timelock — see
1200+
/// `upgradeable::upgrade` for the full security note. Reserve for
1201+
/// emergencies; prefer `schedule_upgrade` + `commit_upgrade` for
1202+
/// routine upgrades.
1203+
pub fn upgrade(env: Env, new_wasm_hash: BytesN<32>) {
1204+
upg::upgrade(&env, new_wasm_hash);
1205+
}
1206+
1207+
/// Apply post-upgrade state-shape migrations and bump the version to
1208+
/// `target_version`. Admin-only; rejects downgrades.
1209+
pub fn migrate(env: Env, target_version: u32) {
1210+
upg::require_admin(&env);
1211+
upg::require_version_increase(&env, target_version);
1212+
1213+
match target_version {
1214+
_ => {}
1215+
}
1216+
1217+
upg::migration_completed(&env, target_version);
1218+
}
1219+
11861220
pub fn pause(env: Env) {
11871221
upg::pause(&env);
11881222
}

soroban-contract/contracts/marketplace/src/lib.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -789,6 +789,27 @@ impl MarketplaceContract {
789789
upg::commit_upgrade(&env);
790790
}
791791

792+
/// Immediate (fast-path) upgrade. Admin-only, no timelock — see
793+
/// `upgradeable::upgrade` for the full security note. Reserve for
794+
/// emergencies; prefer `schedule_upgrade` + `commit_upgrade` for
795+
/// routine upgrades.
796+
pub fn upgrade(env: Env, new_wasm_hash: BytesN<32>) {
797+
upg::upgrade(&env, new_wasm_hash);
798+
}
799+
800+
/// Apply post-upgrade state-shape migrations and bump the version to
801+
/// `target_version`. Admin-only; rejects downgrades.
802+
pub fn migrate(env: Env, target_version: u32) {
803+
upg::require_admin(&env);
804+
upg::require_version_increase(&env, target_version);
805+
806+
match target_version {
807+
_ => {}
808+
}
809+
810+
upg::migration_completed(&env, target_version);
811+
}
812+
792813
pub fn pause(env: Env) {
793814
upg::pause(&env);
794815
}

soroban-contract/contracts/poap_nft/src/lib.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,27 @@ impl PoapNft {
195195
upg::commit_upgrade(&env);
196196
}
197197

198+
/// Immediate (fast-path) upgrade. Admin-only, no timelock — see
199+
/// `upgradeable::upgrade` for the full security note. Reserve for
200+
/// emergencies; prefer `schedule_upgrade` + `commit_upgrade` for
201+
/// routine upgrades.
202+
pub fn upgrade(env: Env, new_wasm_hash: BytesN<32>) {
203+
upg::upgrade(&env, new_wasm_hash);
204+
}
205+
206+
/// Apply post-upgrade state-shape migrations and bump the version to
207+
/// `target_version`. Admin-only; rejects downgrades.
208+
pub fn migrate(env: Env, target_version: u32) {
209+
upg::require_admin(&env);
210+
upg::require_version_increase(&env, target_version);
211+
212+
match target_version {
213+
_ => {}
214+
}
215+
216+
upg::migration_completed(&env, target_version);
217+
}
218+
198219
pub fn pause(env: Env) {
199220
upg::pause(&env);
200221
}

soroban-contract/contracts/tba_account/src/lib.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,27 @@ impl TbaAccount {
278278
upg::commit_upgrade(&env);
279279
}
280280

281+
/// Immediate (fast-path) upgrade. Admin-only, no timelock — see
282+
/// `upgradeable::upgrade` for the full security note. Reserve for
283+
/// emergencies; prefer `schedule_upgrade` + `commit_upgrade` for
284+
/// routine upgrades.
285+
pub fn upgrade(env: Env, new_wasm_hash: BytesN<32>) {
286+
upg::upgrade(&env, new_wasm_hash);
287+
}
288+
289+
/// Apply post-upgrade state-shape migrations and bump the version to
290+
/// `target_version`. Admin-only; rejects downgrades.
291+
pub fn migrate(env: Env, target_version: u32) {
292+
upg::require_admin(&env);
293+
upg::require_version_increase(&env, target_version);
294+
295+
match target_version {
296+
_ => {}
297+
}
298+
299+
upg::migration_completed(&env, target_version);
300+
}
301+
281302
pub fn pause(env: Env) {
282303
upg::pause(&env);
283304
}

soroban-contract/contracts/tba_registry/src/lib.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,27 @@ impl TbaRegistry {
248248
upg::commit_upgrade(&env);
249249
}
250250

251+
/// Immediate (fast-path) upgrade. Admin-only, no timelock — see
252+
/// `upgradeable::upgrade` for the full security note. Reserve for
253+
/// emergencies; prefer `schedule_upgrade` + `commit_upgrade` for
254+
/// routine upgrades.
255+
pub fn upgrade(env: Env, new_wasm_hash: BytesN<32>) {
256+
upg::upgrade(&env, new_wasm_hash);
257+
}
258+
259+
/// Apply post-upgrade state-shape migrations and bump the version to
260+
/// `target_version`. Admin-only; rejects downgrades.
261+
pub fn migrate(env: Env, target_version: u32) {
262+
upg::require_admin(&env);
263+
upg::require_version_increase(&env, target_version);
264+
265+
match target_version {
266+
_ => {}
267+
}
268+
269+
upg::migration_completed(&env, target_version);
270+
}
271+
251272
pub fn pause(env: Env) {
252273
upg::pause(&env);
253274
}

soroban-contract/contracts/ticket_factory/src/lib.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,27 @@ impl TicketFactory {
223223
upg::commit_upgrade(&env);
224224
}
225225

226+
/// Immediate (fast-path) upgrade. Admin-only, no timelock — see
227+
/// `upgradeable::upgrade` for the full security note. Reserve for
228+
/// emergencies; prefer `schedule_upgrade` + `commit_upgrade` for
229+
/// routine upgrades.
230+
pub fn upgrade(env: Env, new_wasm_hash: BytesN<32>) {
231+
upg::upgrade(&env, new_wasm_hash);
232+
}
233+
234+
/// Apply post-upgrade state-shape migrations and bump the version to
235+
/// `target_version`. Admin-only; rejects downgrades.
236+
pub fn migrate(env: Env, target_version: u32) {
237+
upg::require_admin(&env);
238+
upg::require_version_increase(&env, target_version);
239+
240+
match target_version {
241+
_ => {}
242+
}
243+
244+
upg::migration_completed(&env, target_version);
245+
}
246+
226247
pub fn pause(env: Env) {
227248
upg::pause(&env);
228249
}

soroban-contract/contracts/ticket_nft/src/lib.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,27 @@ impl TicketNft {
408408
upg::commit_upgrade(&env);
409409
}
410410

411+
/// Immediate (fast-path) upgrade. Admin-only, no timelock — see
412+
/// `upgradeable::upgrade` for the full security note. Reserve for
413+
/// emergencies; prefer `schedule_upgrade` + `commit_upgrade` for
414+
/// routine upgrades.
415+
pub fn upgrade(env: Env, new_wasm_hash: BytesN<32>) {
416+
upg::upgrade(&env, new_wasm_hash);
417+
}
418+
419+
/// Apply post-upgrade state-shape migrations and bump the version to
420+
/// `target_version`. Admin-only; rejects downgrades.
421+
pub fn migrate(env: Env, target_version: u32) {
422+
upg::require_admin(&env);
423+
upg::require_version_increase(&env, target_version);
424+
425+
match target_version {
426+
_ => {}
427+
}
428+
429+
upg::migration_completed(&env, target_version);
430+
}
431+
411432
pub fn pause(env: Env) {
412433
upg::pause(&env);
413434
}

0 commit comments

Comments
 (0)