1#![no_std]
14
15mod examples; mod types; use examples::{example_circuit_breaker, example_rock_paper_scissors, example_storage};
19
20use soroban_kit::{oracle, oracle_subscriber, storage};
21use soroban_sdk::{contract, contractimpl, Address, Bytes, Env, Symbol, Vec};
22
23use types::{Message, MessageKey, Whitelist, WhitelistKey};
24
25pub trait HelloContractTrait {
26 fn circuit_breaker(env: Env) -> Symbol;
27 fn rock_paper_scissors(env: Env) -> Symbol;
28 fn hello_oracle(env: Env, topic: Bytes) -> Message;
29 fn whitelist_broker(env: Env, broker: Address);
30 fn hello(env: Env, newcomer: Symbol) -> Vec<Symbol>;
31}
32
33#[contract]
34#[oracle_subscriber(Bytes, Message)]
38pub struct HelloContract;
39
40impl oracle::Events<Bytes, Message> for HelloContract {
42 fn on_request(env: &Env, _topic: &Bytes, envelope: &oracle::Envelope) {
44 assert_eq!(
46 storage::get(&env, &WhitelistKey::Broker).unwrap().broker,
47 envelope.broker
48 );
49 envelope.subscriber.require_auth();
50 }
51
52 fn on_sync_receive(env: &Env, topic: &Bytes, envelope: &oracle::Envelope, data: &Message) {
54 assert_eq!(
55 storage::get(&env, &WhitelistKey::Broker).unwrap().broker,
56 envelope.broker
57 );
58 storage::set(&env, &MessageKey::Topic(topic.clone()), &data);
59 }
60
61 fn on_async_receive(env: &Env, topic: &Bytes, envelope: &oracle::Envelope, data: &Message) {
63 assert_eq!(
65 storage::get(&env, &WhitelistKey::Broker).unwrap().broker,
66 envelope.broker
67 );
68 envelope.broker.require_auth();
70 storage::set(&env, &MessageKey::Topic(topic.clone()), &data);
72 }
73}
74
75#[contractimpl]
76impl HelloContractTrait for HelloContract {
77 fn circuit_breaker(env: Env) -> Symbol {
80 example_circuit_breaker::hello(env)
81 }
82
83 fn rock_paper_scissors(env: Env) -> Symbol {
86 example_rock_paper_scissors::hello(env)
87 }
88
89 fn hello_oracle(env: Env, topic: Bytes) -> Message {
91 storage::get(&env, &MessageKey::Topic(topic)).unwrap()
92 }
93
94 fn whitelist_broker(env: Env, broker: Address) {
95 assert!(!storage::has(&env, &WhitelistKey::Broker));
96 storage::set(&env, &WhitelistKey::Broker, &Whitelist { broker });
97 }
98
99 fn hello(env: Env, newcomer: Symbol) -> Vec<Symbol> {
101 example_storage::hello(env, newcomer)
102 }
103}
104
105#[cfg(test)]
106mod test;