Skip to content

Commit 63ea6b1

Browse files
add require_auth to Pausable trait examples
1 parent 3423e93 commit 63ea6b1

File tree

1 file changed

+50
-14
lines changed

1 file changed

+50
-14
lines changed

soroban-sdk/src/_migrating/v25_contracttrait.rs

Lines changed: 50 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -48,21 +48,28 @@
4848
//! ## Example: Defining and Implementing a Trait
4949
//!
5050
//! ```
51-
//! use soroban_sdk::{contract, contractimpl, contracttrait, Env};
51+
//! use soroban_sdk::{contract, contractimpl, contracttrait, Address, Env};
52+
//!
53+
//! const ADMIN: &str = "admin";
54+
//! const PAUSED: &str = "paused";
5255
//!
5356
//! // Define a trait with default implementations
5457
//! #[contracttrait]
5558
//! pub trait Pausable {
5659
//! fn is_paused(env: &Env) -> bool {
57-
//! env.storage().instance().has(&"paused")
60+
//! env.storage().instance().has(&PAUSED)
5861
//! }
5962
//!
6063
//! fn pause(env: &Env) {
61-
//! env.storage().instance().set(&"paused", &true);
64+
//! let admin: Address = env.storage().instance().get(&ADMIN).unwrap();
65+
//! admin.require_auth();
66+
//! env.storage().instance().set(&PAUSED, &true);
6267
//! }
6368
//!
6469
//! fn unpause(env: &Env) {
65-
//! env.storage().instance().remove(&"paused");
70+
//! let admin: Address = env.storage().instance().get(&ADMIN).unwrap();
71+
//! admin.require_auth();
72+
//! env.storage().instance().remove(&PAUSED);
6673
//! }
6774
//! }
6875
//!
@@ -75,6 +82,10 @@
7582
//!
7683
//! #[contractimpl]
7784
//! impl MyContract {
85+
//! pub fn __constructor(env: &Env, admin: Address) {
86+
//! env.storage().instance().set(&ADMIN, &admin);
87+
//! }
88+
//!
7889
//! pub fn do_something(env: &Env) {
7990
//! if Self::is_paused(env) {
8091
//! panic!("contract is paused");
@@ -90,21 +101,28 @@
90101
//! Contracts can override specific functions while keeping the defaults for others:
91102
//!
92103
//! ```
93-
//! use soroban_sdk::{contract, contractimpl, contracttrait, Env};
104+
//! use soroban_sdk::{contract, contractimpl, contracttrait, Address, Env};
105+
//!
106+
//! const ADMIN: &str = "admin";
107+
//! const PAUSED: &str = "paused";
94108
//!
95109
//! // Define a trait with default implementations
96110
//! #[contracttrait]
97111
//! pub trait Pausable {
98112
//! fn is_paused(env: &Env) -> bool {
99-
//! env.storage().instance().has(&"paused")
113+
//! env.storage().instance().has(&PAUSED)
100114
//! }
101115
//!
102116
//! fn pause(env: &Env) {
103-
//! env.storage().instance().set(&"paused", &true);
117+
//! let admin: Address = env.storage().instance().get(&ADMIN).unwrap();
118+
//! admin.require_auth();
119+
//! env.storage().instance().set(&PAUSED, &true);
104120
//! }
105121
//!
106122
//! fn unpause(env: &Env) {
107-
//! env.storage().instance().remove(&"paused");
123+
//! let admin: Address = env.storage().instance().get(&ADMIN).unwrap();
124+
//! admin.require_auth();
125+
//! env.storage().instance().remove(&PAUSED);
108126
//! }
109127
//! }
110128
//!
@@ -116,13 +134,17 @@
116134
//! impl Pausable for MyContract {
117135
//! // Override is_paused with custom logic that returns false when not set
118136
//! fn is_paused(env: &Env) -> bool {
119-
//! env.storage().instance().get(&"paused").unwrap_or(false)
137+
//! env.storage().instance().get(&PAUSED).unwrap_or(false)
120138
//! }
121139
//! // pause() and unpause() use the default implementations
122140
//! }
123141
//!
124142
//! #[contractimpl]
125143
//! impl MyContract {
144+
//! pub fn __constructor(env: &Env, admin: Address) {
145+
//! env.storage().instance().set(&ADMIN, &admin);
146+
//! }
147+
//!
126148
//! pub fn do_something(env: &Env) {
127149
//! if Self::is_paused(env) {
128150
//! panic!("contract is paused");
@@ -138,21 +160,28 @@
138160
//! The generated `{TraitName}Client` can be used to call any contract that implements the trait:
139161
//!
140162
//! ```
141-
//! use soroban_sdk::{contract, contractimpl, contracttrait, Env};
163+
//! use soroban_sdk::{contract, contractimpl, contracttrait, Address, Env};
164+
//!
165+
//! const ADMIN: &str = "admin";
166+
//! const PAUSED: &str = "paused";
142167
//!
143168
//! // Define a trait with default implementations
144169
//! #[contracttrait]
145170
//! pub trait Pausable {
146171
//! fn is_paused(env: &Env) -> bool {
147-
//! env.storage().instance().has(&"paused")
172+
//! env.storage().instance().has(&PAUSED)
148173
//! }
149174
//!
150175
//! fn pause(env: &Env) {
151-
//! env.storage().instance().set(&"paused", &true);
176+
//! let admin: Address = env.storage().instance().get(&ADMIN).unwrap();
177+
//! admin.require_auth();
178+
//! env.storage().instance().set(&PAUSED, &true);
152179
//! }
153180
//!
154181
//! fn unpause(env: &Env) {
155-
//! env.storage().instance().remove(&"paused");
182+
//! let admin: Address = env.storage().instance().get(&ADMIN).unwrap();
183+
//! admin.require_auth();
184+
//! env.storage().instance().remove(&PAUSED);
156185
//! }
157186
//! }
158187
//!
@@ -165,6 +194,10 @@
165194
//!
166195
//! #[contractimpl]
167196
//! impl MyContract {
197+
//! pub fn __constructor(env: &Env, admin: Address) {
198+
//! env.storage().instance().set(&ADMIN, &admin);
199+
//! }
200+
//!
168201
//! pub fn do_something(env: &Env) {
169202
//! if Self::is_paused(env) {
170203
//! panic!("contract is paused");
@@ -178,8 +211,11 @@
178211
//! # }
179212
//! # #[cfg(feature = "testutils")]
180213
//! # fn main() {
214+
//! use soroban_sdk::testutils::Address as _;
181215
//! let env = Env::default();
182-
//! let contract_id = env.register(MyContract, ());
216+
//! env.mock_all_auths();
217+
//! let admin = Address::generate(&env);
218+
//! let contract_id = env.register(MyContract, (&admin,));
183219
//! let client = PausableClient::new(&env, &contract_id);
184220
//!
185221
//! assert!(!client.is_paused());

0 commit comments

Comments
 (0)