Skip to content

Commit 17c8985

Browse files
feat: implement market retrieval
1 parent 584b061 commit 17c8985

4 files changed

Lines changed: 104 additions & 1 deletion

File tree

contracts/src/errors.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ pub enum PredictXError {
99
EmptyDescription = 3,
1010
InvalidOutcomeCount = 4,
1111
InvalidEndTime = 5,
12+
MarketNotFound = 6,
1213
}

contracts/src/lib.rs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ pub mod storage;
1111
use crate::{
1212
errors::PredictXError,
1313
market::Market,
14-
storage::{get_next_market_id, save_market},
14+
storage::{get_market as load_market, get_market_count, get_next_market_id, save_market},
1515
};
1616
use soroban_sdk::{contract, contractimpl, Env, String, Vec};
1717

@@ -62,6 +62,23 @@ impl PredictXContract {
6262

6363
Ok(market_id)
6464
}
65+
66+
pub fn get_market(env: Env, market_id: u64) -> Result<Market, PredictXError> {
67+
load_market(&env, market_id).ok_or(PredictXError::MarketNotFound)
68+
}
69+
70+
pub fn list_markets(env: Env) -> Vec<Market> {
71+
let market_count = get_market_count(&env);
72+
let mut markets = Vec::new(&env);
73+
74+
for market_id in 1..=market_count {
75+
if let Some(market) = load_market(&env, market_id) {
76+
markets.push_back(market);
77+
}
78+
}
79+
80+
markets
81+
}
6582
}
6683

6784
#[cfg(test)]

contracts/src/storage.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@ pub fn get_next_market_id(env: &Env) -> u64 {
2323
next_id
2424
}
2525

26+
pub fn get_market_count(env: &Env) -> u64 {
27+
env.storage()
28+
.instance()
29+
.get(&DataKey::MarketCounter)
30+
.unwrap_or(0_u64)
31+
}
32+
2633
pub fn save_market(env: &Env, market: &Market) {
2734
env.storage()
2835
.persistent()

contracts/src/tests.rs

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,3 +186,81 @@ fn rejects_invalid_end_time() {
186186
assert_eq!(result, Err(PredictXError::InvalidEndTime));
187187
});
188188
}
189+
190+
#[test]
191+
fn retrieves_existing_market() {
192+
let env = Env::default();
193+
let contract_id = env.register(PredictXContract, ());
194+
195+
env.as_contract(&contract_id, || {
196+
let market_id = PredictXContract::create_market(
197+
env.clone(),
198+
String::from_str(&env, "Existing market"),
199+
String::from_str(&env, "A market that should be retrievable."),
200+
env.ledger().timestamp() + 1,
201+
vec![
202+
&env,
203+
String::from_str(&env, "Yes"),
204+
String::from_str(&env, "No"),
205+
],
206+
)
207+
.unwrap();
208+
209+
let market = PredictXContract::get_market(env.clone(), market_id).unwrap();
210+
211+
assert_eq!(market.id, market_id);
212+
assert_eq!(market.title, String::from_str(&env, "Existing market"));
213+
assert!(!market.resolved);
214+
});
215+
}
216+
217+
#[test]
218+
fn rejects_missing_market_retrieval() {
219+
let env = Env::default();
220+
let contract_id = env.register(PredictXContract, ());
221+
222+
env.as_contract(&contract_id, || {
223+
let result = PredictXContract::get_market(env.clone(), 404);
224+
225+
assert_eq!(result, Err(PredictXError::MarketNotFound));
226+
});
227+
}
228+
229+
#[test]
230+
fn lists_multiple_markets() {
231+
let env = Env::default();
232+
let contract_id = env.register(PredictXContract, ());
233+
234+
env.as_contract(&contract_id, || {
235+
let first_id = PredictXContract::create_market(
236+
env.clone(),
237+
String::from_str(&env, "First market"),
238+
String::from_str(&env, "The first market in the list."),
239+
env.ledger().timestamp() + 1,
240+
vec![
241+
&env,
242+
String::from_str(&env, "Yes"),
243+
String::from_str(&env, "No"),
244+
],
245+
)
246+
.unwrap();
247+
let second_id = PredictXContract::create_market(
248+
env.clone(),
249+
String::from_str(&env, "Second market"),
250+
String::from_str(&env, "The second market in the list."),
251+
env.ledger().timestamp() + 2,
252+
vec![
253+
&env,
254+
String::from_str(&env, "Up"),
255+
String::from_str(&env, "Down"),
256+
],
257+
)
258+
.unwrap();
259+
260+
let markets = PredictXContract::list_markets(env.clone());
261+
262+
assert_eq!(markets.len(), 2);
263+
assert_eq!(markets.get(0).unwrap().id, first_id);
264+
assert_eq!(markets.get(1).unwrap().id, second_id);
265+
});
266+
}

0 commit comments

Comments
 (0)