diff --git a/.github/workflows/e2e-tests-contracts.yml b/.github/workflows/e2e-tests-contracts.yml index d73899b28c..97895a8c3d 100644 --- a/.github/workflows/e2e-tests-contracts.yml +++ b/.github/workflows/e2e-tests-contracts.yml @@ -51,7 +51,7 @@ jobs: with: target-key: e2e-contracts cargo-key: e2e-contracts - cache-version: v2 + cache-version: v3 cargo-targets: e2e-tests-contracts/target/ - name: Install cargo-contract diff --git a/contracts/README.md b/contracts/README.md index 9e9390e9f4..4e77403efb 100644 --- a/contracts/README.md +++ b/contracts/README.md @@ -25,7 +25,7 @@ score = deadline - now There are two built-in incentives: * playing for the score: If you clicked in the 10th second of TheButton's life, which is set for example to 900 blocks, you get rewarded based on the score of 900-10=890 (and the button's life now will end at block 910). -* playing to be ThePressiah: the last player to click gets 50% of the total reward pool. +* playing to be ThePressiah: the last player to click gets 20% of the total reward pool (1/4 of the sum of all the rewards paid for pressing the button) ## BackToTheFuture @@ -35,7 +35,7 @@ In this scenario the rewards are reversed - players get rewarded for extending t score = now - start ``` -The Pressiah gets 50% of the total reward pool. +The Pressiah gets 20% of the total reward pool. ## ThePressiahCometh @@ -47,7 +47,7 @@ Game continues in perpetuity (but in practice as long as there are accounts that - Players are rewarded for playing, with the ultimate goal of being the Pressiah (the last person to click the button) - Reward rules: - If you’re not ThePressiah, you get _k_ tokens if you pressed the button as the _k-th_ person in a row. - - ThePressiah of the iteration with _k_ button presses gets [k*(k+1)]/2 tokens. + - ThePressiah gets 20% of the total reward pool. # Development diff --git a/contracts/access_control/Cargo.toml b/contracts/access_control/Cargo.toml index 4c3eee79c1..fe84521b5c 100644 --- a/contracts/access_control/Cargo.toml +++ b/contracts/access_control/Cargo.toml @@ -7,12 +7,12 @@ publish = false license = "Apache 2.0" [dependencies] -ink_env = { version = "3.2.0", default-features = false } -ink_lang = { version = "3.2.0", default-features = false } -ink_lang_codegen = { version = "3.2.0", default-features = false } -ink_metadata = { version = "3.2.0", default-features = false, features = ["derive"], optional = true } -ink_primitives = { version = "3.2.0", default-features = false } -ink_storage = { version = "3.2.0", default-features = false } +ink_env = { version = "~3.3.0", default-features = false } +ink_lang = { version = "~3.3.0", default-features = false } +ink_lang_codegen = { version = "~3.3.0", default-features = false } +ink_metadata = { version = "~3.3.0", default-features = false, features = ["derive"], optional = true } +ink_primitives = { version = "~3.3.0", default-features = false } +ink_storage = { version = "~3.3.0", default-features = false } scale = { package = "parity-scale-codec", version = "3", default-features = false, features = ["derive"] } scale-info = { version = "2", default-features = false, features = ["derive"], optional = true } diff --git a/contracts/back_to_the_future/Cargo.lock b/contracts/back_to_the_future/Cargo.lock index a6738b34f4..5dae75a4b1 100644 --- a/contracts/back_to_the_future/Cargo.lock +++ b/contracts/back_to_the_future/Cargo.lock @@ -551,7 +551,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43db66d1170d347f9a065114077f7dccb00c1b9478c89384490a3425279a4606" dependencies = [ - "num-bigint", "num-complex", "num-integer", "num-iter", @@ -559,17 +558,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-bigint" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - [[package]] name = "num-complex" version = "0.4.2" @@ -607,7 +595,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" dependencies = [ "autocfg", - "num-bigint", "num-integer", "num-traits", ] diff --git a/contracts/back_to_the_future/Cargo.toml b/contracts/back_to_the_future/Cargo.toml index 20159f06e9..a8ef582114 100644 --- a/contracts/back_to_the_future/Cargo.toml +++ b/contracts/back_to_the_future/Cargo.toml @@ -6,13 +6,13 @@ edition = "2021" license = "Apache 2.0" [dependencies] -ink_env = { version = "3.2.0", default-features = false } -ink_lang = { version = "3.2.0", default-features = false } -ink_lang_codegen = { version = "3.2.0", default-features = false } -ink_metadata = { version = "3.2.0", default-features = false, features = ["derive"], optional = true } -ink_prelude = { version = "3.2.0", default-features = false } -ink_primitives = { version = "3.2.0", default-features = false } -ink_storage = { version = "3.2.0", default-features = false } +ink_env = { version = "~3.3.0", default-features = false } +ink_lang = { version = "~3.3.0", default-features = false } +ink_lang_codegen = { version = "~3.3.0", default-features = false } +ink_metadata = { version = "~3.3.0", default-features = false, features = ["derive"], optional = true } +ink_prelude = { version = "~3.3.0", default-features = false } +ink_primitives = { version = "~3.3.0", default-features = false } +ink_storage = { version = "~3.3.0", default-features = false } scale = { package = "parity-scale-codec", version = "3", default-features = false, features = ["derive"] } scale-info = { version = "2", default-features = false, features = ["derive"], optional = true } diff --git a/contracts/back_to_the_future/lib.rs b/contracts/back_to_the_future/lib.rs index f7ce518729..849b872c45 100755 --- a/contracts/back_to_the_future/lib.rs +++ b/contracts/back_to_the_future/lib.rs @@ -5,17 +5,15 @@ use ink_lang as ink; /// This is the BackToTheFuture /// /// Larger rewards are distributed for postponing playing for as long as possible, but without letting TheButton die: -/// user_score = now - start -/// ThePressiah (the last player to click) still gets 50% of the tokens. +/// user_score = now - previous_press +/// ThePressiah (the last player to click) gets 20% of the tokens. -#[ink::contract(env = button::ButtonGameEnvironment)] +#[ink::contract] mod back_to_the_future { use access_control::{traits::AccessControlled, Role, ACCESS_CONTROL_PUBKEY}; - use button::{ - ButtonData, ButtonGame, ButtonGameEnvironment, ButtonResult, GameError, IButtonGame, - }; - use ink_env::Error as InkEnvError; + use button::{ButtonData, ButtonGame, ButtonResult, GameError, IButtonGame}; + use ink_env::{DefaultEnvironment, Error as InkEnvError}; use ink_lang::{ codegen::{initialize_contract, EmitEvent}, reflect::ContractEventBase, @@ -31,6 +29,7 @@ mod back_to_the_future { pub struct ButtonCreated { #[ink(topic)] reward_token: AccountId, + #[ink(topic)] ticket_token: AccountId, start: BlockNumber, deadline: BlockNumber, @@ -76,11 +75,11 @@ mod back_to_the_future { } } - // becasue ink! does not allow generics or trait default implementations + // because ink! does not allow generics or trait default implementations impl IButtonGame for BackToTheFuture { #[ink(message)] fn is_dead(&self) -> bool { - let now = Self::env().block_number(); + let now = self.env().block_number(); ButtonGame::is_dead(self, now) } @@ -90,7 +89,7 @@ mod back_to_the_future { let now = Self::env().block_number(); let this = self.env().account_id(); - ButtonGame::press::(self, now, caller, this)?; + ButtonGame::press::(self, now, caller, this)?; Self::emit_event( self.env(), @@ -107,7 +106,7 @@ mod back_to_the_future { fn reset(&mut self) -> ButtonResult<()> { let now = Self::env().block_number(); - ButtonGame::reset::(self, now)?; + ButtonGame::reset::(self, now)?; Self::emit_event(self.env(), Event::GameReset(GameReset { when: now })); Ok(()) @@ -141,7 +140,7 @@ mod back_to_the_future { #[ink(message)] fn balance(&self) -> ButtonResult { let this = self.env().account_id(); - ButtonGame::balance::(self, this) + ButtonGame::balance::(self, this) } #[ink(message)] diff --git a/contracts/button/Cargo.toml b/contracts/button/Cargo.toml index 437b6609e8..c558d1414d 100644 --- a/contracts/button/Cargo.toml +++ b/contracts/button/Cargo.toml @@ -5,12 +5,12 @@ authors = ["Cardinal Cryptography"] edition = "2021" [dependencies] -ink_env = { version = "3.0", default-features = false } -ink_lang = { version = "3.0", default-features = false } -ink_metadata = { version = "3.0", default-features = false, features = ["derive"], optional = true } -ink_prelude = { version = "3.2.0", default-features = false } -ink_primitives = { version = "3.0", default-features = false } -ink_storage = { version = "3.0", default-features = false } +ink_env = { version = "~3.3.0", default-features = false } +ink_lang = { version = "~3.3.0", default-features = false } +ink_metadata = { version = "~3.3.0", default-features = false, features = ["derive"], optional = true } +ink_prelude = { version = "~3.3.0", default-features = false } +ink_primitives = { version = "~3.3.0", default-features = false } +ink_storage = { version = "~3.3.0", default-features = false } scale = { package = "parity-scale-codec", version = "3", default-features = false, features = ["derive"] } scale-info = { version = "2", default-features = false, features = ["derive"], optional = true } @@ -38,7 +38,6 @@ std = [ "ink_primitives/std", "ink_storage/std", "scale-info/std", - "scale/std", - "num/std" + "scale/std" ] ink-as-dependency = [] diff --git a/contracts/button/lib.rs b/contracts/button/lib.rs index efe8bce489..ab1506e0ec 100644 --- a/contracts/button/lib.rs +++ b/contracts/button/lib.rs @@ -1,7 +1,5 @@ #![cfg_attr(not(feature = "std"), no_std)] -use core::mem::swap; - use access_control::{traits::AccessControlled, Role}; use game_token::MINT_TO_SELECTOR; use ink_env::{ @@ -14,23 +12,10 @@ use ink_storage::traits::{SpreadAllocate, SpreadLayout}; use openbrush::contracts::psp22::PSP22Error; use ticket_token::{BALANCE_OF_SELECTOR, TRANSFER_FROM_SELECTOR}; -pub type BlockNumber = ::BlockNumber; -pub type Balance = ::Balance; +pub type BlockNumber = ::BlockNumber; +pub type Balance = ::Balance; pub type ButtonResult = core::result::Result; -pub enum ButtonGameEnvironment {} - -impl Environment for ButtonGameEnvironment { - const MAX_EVENT_TOPICS: usize = ::MAX_EVENT_TOPICS; - - type AccountId = ::AccountId; - type Balance = ::Balance; - type Hash = ::Hash; - type BlockNumber = u64; - type Timestamp = ::Timestamp; - type ChainExtension = ::ChainExtension; -} - /// GameError types #[derive(Debug, PartialEq, Eq, scale::Encode, scale::Decode)] #[cfg_attr(feature = "std", derive(scale_info::TypeInfo))] @@ -128,6 +113,8 @@ pub struct ButtonData { pub last_presser: Option, /// block number of the last press, set to current block number at button start/reset pub last_press: BlockNumber, + /// sum of rewards paid to players in the current iteration + pub total_rewards: u128, /// counter for the number of presses pub presses: u128, /// AccountId of the PSP22 ButtonToken instance on-chain @@ -157,12 +144,10 @@ pub trait ButtonGame { /// Logic for calculating pressiah score /// - /// By defaul the pressiah score is defined as k * sqrt(k) - /// where k is the number of players that participated until the button has died + /// By default the pressiah gets 20% of the total rewards paid in the current game iteration /// Can be overriden to some other custom calculation fn pressiah_score(&self) -> Balance { - let presses = self.get().presses; - (presses * num::integer::sqrt(presses)) as Balance + (self.get().total_rewards / 4) as Balance } fn is_dead(&self, now: BlockNumber) -> bool { @@ -286,27 +271,23 @@ pub trait ButtonGame { return Err(GameError::AfterDeadline); } - let ButtonData { presses, .. } = self.get(); - // transfers 1 ticket token from the caller to self // tx will fail if user did not give allowance to the game contract // or does not have enough balance self.transfer_from_tx::(caller, this, 1u128)??; - let root_key = ::ink_primitives::Key::from([0x00; 32]); - let mut state = ::ink_storage::traits::pull_spread_root::(&root_key); - let score = self.score(now); // mints reward tokens to pay out the reward // contract needs to have a Minter role on the reward token contract self.mint_tx::(caller, score)??; - state.presses = presses + 1; + let mut state = self.get_mut(); + + state.presses += 1; state.last_presser = Some(caller); state.last_press = now; - - swap(self.get_mut(), &mut state); + state.total_rewards += score; Ok(()) } @@ -333,13 +314,12 @@ pub trait ButtonGame { }; // zero the counters in storage - let root_key = ::ink_primitives::Key::from([0x00; 32]); - let mut state = ::ink_storage::traits::pull_spread_root::(&root_key); + let mut state = self.get_mut(); state.presses = 0; state.last_presser = None; state.last_press = now; - swap(self.get_mut(), &mut state); + state.total_rewards = 0; Ok(()) } diff --git a/contracts/early_bird_special/Cargo.lock b/contracts/early_bird_special/Cargo.lock index f100cd7965..50696bccdb 100644 --- a/contracts/early_bird_special/Cargo.lock +++ b/contracts/early_bird_special/Cargo.lock @@ -549,7 +549,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43db66d1170d347f9a065114077f7dccb00c1b9478c89384490a3425279a4606" dependencies = [ - "num-bigint", "num-complex", "num-integer", "num-iter", @@ -557,17 +556,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-bigint" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - [[package]] name = "num-complex" version = "0.4.2" @@ -605,7 +593,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" dependencies = [ "autocfg", - "num-bigint", "num-integer", "num-traits", ] diff --git a/contracts/early_bird_special/Cargo.toml b/contracts/early_bird_special/Cargo.toml index dcc5b1e615..ab2186de46 100644 --- a/contracts/early_bird_special/Cargo.toml +++ b/contracts/early_bird_special/Cargo.toml @@ -6,13 +6,13 @@ edition = "2021" license = "Apache 2.0" [dependencies] -ink_env = { version = "3.2.0", default-features = false } -ink_lang = { version = "3.2.0", default-features = false } -ink_lang_codegen = { version = "3.2.0", default-features = false } -ink_metadata = { version = "3.2.0", default-features = false, features = ["derive"], optional = true } -ink_prelude = { version = "3.2.0", default-features = false } -ink_primitives = { version = "3.2.0", default-features = false } -ink_storage = { version = "3.2.0", default-features = false } +ink_env = { version = "~3.3.0", default-features = false } +ink_lang = { version = "~3.3.0", default-features = false } +ink_lang_codegen = { version = "~3.3.0", default-features = false } +ink_metadata = { version = "~3.3.0", default-features = false, features = ["derive"], optional = true } +ink_prelude = { version = "~3.3.0", default-features = false } +ink_primitives = { version = "~3.3.0", default-features = false } +ink_storage = { version = "~3.3.0", default-features = false } scale = { package = "parity-scale-codec", version = "3", default-features = false, features = ["derive"] } scale-info = { version = "2", default-features = false, features = ["derive"], optional = true } diff --git a/contracts/early_bird_special/lib.rs b/contracts/early_bird_special/lib.rs index 24613dad40..00461a84a3 100644 --- a/contracts/early_bird_special/lib.rs +++ b/contracts/early_bird_special/lib.rs @@ -6,16 +6,14 @@ use ink_lang as ink; /// /// Larger rewards are distributed for engaging in the game as early on as possible: /// user_score = deadline - now -/// On the other hand ThePressiah (the last player to click) gets 50% of the token pool, which creates two competing strategies. +/// On the other hand ThePressiah (the last player to click) gets 20% of the token pool, which creates two competing strategies. -#[ink::contract(env = button::ButtonGameEnvironment)] +#[ink::contract] mod early_bird_special { use access_control::{traits::AccessControlled, Role, ACCESS_CONTROL_PUBKEY}; - use button::{ - ButtonData, ButtonGame, ButtonGameEnvironment, ButtonResult, GameError, IButtonGame, - }; - use ink_env::Error as InkEnvError; + use button::{ButtonData, ButtonGame, ButtonResult, GameError, IButtonGame}; + use ink_env::{DefaultEnvironment, Error as InkEnvError}; use ink_lang::{ codegen::{initialize_contract, EmitEvent}, reflect::ContractEventBase, @@ -79,7 +77,7 @@ mod early_bird_special { } } - // becasue ink! does not allow generics or trait default implementations + // because ink! does not allow generics or trait default implementations impl IButtonGame for EarlyBirdSpecial { #[ink(message)] fn is_dead(&self) -> bool { @@ -93,7 +91,7 @@ mod early_bird_special { let now = Self::env().block_number(); let this = self.env().account_id(); - ButtonGame::press::(self, now, caller, this)?; + ButtonGame::press::(self, now, caller, this)?; Self::emit_event( self.env(), @@ -110,7 +108,7 @@ mod early_bird_special { fn reset(&mut self) -> ButtonResult<()> { let now = Self::env().block_number(); - ButtonGame::reset::(self, now)?; + ButtonGame::reset::(self, now)?; Self::emit_event(self.env(), Event::GameReset(GameReset { when: now })); Ok(()) @@ -144,7 +142,7 @@ mod early_bird_special { #[ink(message)] fn balance(&self) -> ButtonResult { let this = self.env().account_id(); - ButtonGame::balance::(self, this) + ButtonGame::balance::(self, this) } #[ink(message)] diff --git a/contracts/scripts/deploy.sh b/contracts/scripts/deploy.sh index a27a59261c..7d3dab1eda 100755 --- a/contracts/scripts/deploy.sh +++ b/contracts/scripts/deploy.sh @@ -136,6 +136,9 @@ cargo contract build --release cd "$CONTRACTS_PATH"/back_to_the_future cargo contract build --release +cd "$CONTRACTS_PATH"/the_pressiah_cometh +cargo contract build --release + # --- DEPLOY ACCESS CONTROL CONTRACT cd "$CONTRACTS_PATH"/access_control @@ -219,6 +222,20 @@ instrument_game_token BACK_TO_THE_FUTURE_TOKEN game_token Cyberiad CYB 0x4261636 deploy_and_instrument_game BACK_TO_THE_FUTURE back_to_the_future $BACK_TO_THE_FUTURE_TICKET $BACK_TO_THE_FUTURE_TOKEN +# +# --- THE_PRESSIAH_COMETH GAME +# + +# --- CREATE AN INSTANCE OF THE TICKET CONTRACT FOR THE THE_PRESSIAH_COMETH GAME + +instrument_ticket_token THE_PRESSIAH_COMETH_TICKET ticket_token 0x7468655F70726573736961685F636F6D657468 the_pressiah_cometh TPC + +instrument_game_token THE_PRESSIAH_COMETH_TOKEN game_token Dune DUN 0x7468655F70726573736961685F636F6D657468 + +# --- UPLOAD CODE AND CREATE AN INSTANCE OF THE EARLY_BIRD_SPECIAL GAME + +deploy_and_instrument_game THE_PRESSIAH_COMETH the_pressiah_cometh $THE_PRESSIAH_COMETH_TICKET $THE_PRESSIAH_COMETH_TOKEN + # spit adresses to a JSON file cd "$CONTRACTS_PATH" @@ -228,12 +245,18 @@ jq -n --arg early_bird_special $EARLY_BIRD_SPECIAL \ --arg back_to_the_future $BACK_TO_THE_FUTURE \ --arg back_to_the_future_ticket $BACK_TO_THE_FUTURE_TICKET \ --arg back_to_the_future_token $BACK_TO_THE_FUTURE_TOKEN \ + --arg the_pressiah_cometh $THE_PRESSIAH_COMETH \ + --arg the_pressiah_cometh_ticket $THE_PRESSIAH_COMETH_TICKET \ + --arg the_pressiah_cometh_token $THE_PRESSIAH_COMETH_TOKEN \ '{early_bird_special: $early_bird_special, early_bird_special_ticket: $early_bird_special_ticket, early_bird_special_token: $early_bird_special_token, back_to_the_future: $back_to_the_future, back_to_the_future_ticket: $back_to_the_future_ticket, - back_to_the_future_token: $back_to_the_future_token}' > addresses.json + back_to_the_future_token: $back_to_the_future_token, + the_pressiah_cometh: $the_pressiah_cometh, + the_pressiah_cometh_ticket: $the_pressiah_cometh_ticket, + the_pressiah_cometh_token: $the_pressiah_cometh_token}' > addresses.json end=$( date +%s.%N ) echo "Time elapsed: $( echo "$end - $start" | bc -l )" diff --git a/contracts/scripts/test.sh b/contracts/scripts/test.sh index a1f51107b8..9e2ea24fc8 100755 --- a/contracts/scripts/test.sh +++ b/contracts/scripts/test.sh @@ -72,7 +72,7 @@ PLAYER1_SEED=//0 PLAYER2=5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY PLAYER2_SEED=//Alice -GAMES=(early_bird_special back_to_the_future) +GAMES=(early_bird_special back_to_the_future the_pressiah_cometh) for GAME in "${GAMES[@]}"; do ( play $GAME diff --git a/contracts/the_pressiah_cometh/Cargo.lock b/contracts/the_pressiah_cometh/Cargo.lock new file mode 100644 index 0000000000..ba376826b9 --- /dev/null +++ b/contracts/the_pressiah_cometh/Cargo.lock @@ -0,0 +1,1103 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "access_control" +version = "0.1.0" +dependencies = [ + "ink_env", + "ink_lang", + "ink_lang_codegen", + "ink_primitives", + "ink_storage", + "parity-scale-codec", +] + +[[package]] +name = "array-init" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfb6d71005dc22a708c7496eee5c8dc0300ee47355de6256c3b35b12b5fef596" + +[[package]] +name = "arrayref" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" + +[[package]] +name = "arrayvec" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "blake2" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a4e37d16930f5459780f5621038b6382b9bb37c19016f39fb6b5808d831f174" +dependencies = [ + "crypto-mac", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "blake2" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9cf849ee05b2ee5fba5e36f97ff8ec2533916700fc0758d40d92136a42f3388" +dependencies = [ + "digest 0.10.3", +] + +[[package]] +name = "block-buffer" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324" +dependencies = [ + "generic-array", +] + +[[package]] +name = "button" +version = "0.1.0" +dependencies = [ + "access_control", + "game_token", + "ink_env", + "ink_lang", + "ink_metadata", + "ink_prelude", + "ink_primitives", + "ink_storage", + "num", + "openbrush", + "parity-scale-codec", + "scale-info", + "ticket_token", +] + +[[package]] +name = "byte-slice-cast" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87c5fdd0166095e1d463fc6cc01aa8ce547ad77a4e84d42eb6762b084e28067e" + +[[package]] +name = "camino" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "869119e97797867fd90f5e22af7d0bd274bd4635ebb9eb68c04f3f513ae6c412" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbdb825da8a5df079a43676dbe042702f1707b1109f713a01420fbb4cc71fa27" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "081e3f0755c1f380c2d010481b6fa2e02973586d5f2b24eebb7a2a1d98b143d8" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "semver-parser", + "serde", + "serde_json", +] + +[[package]] +name = "cc" +version = "1.0.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "const_format" +version = "0.2.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "939dc9e2eb9077e0679d2ce32de1ded8531779360b003b4a972a7a39ec263495" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef196d5d972878a48da7decb7686eded338b4858fbabeed513d63a7c98b2b82d" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "cpufeatures" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "crypto-mac" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" +dependencies = [ + "generic-array", + "subtle", +] + +[[package]] +name = "derive_more" +version = "0.99.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[package]] +name = "either" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f107b87b6afc2a64fd13cac55fe06d6c8859f12d4b14cbcdd2c67d0976781be" + +[[package]] +name = "fs2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "game_token" +version = "2.1.0" +dependencies = [ + "access_control", + "ink_env", + "ink_lang", + "ink_prelude", + "ink_primitives", + "ink_storage", + "openbrush", + "parity-scale-codec", +] + +[[package]] +name = "generic-array" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "heck" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" + +[[package]] +name = "impl-serde" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4551f042f3438e64dbd6226b20527fc84a6e1fe65688b58746a2f53623f25f5c" +dependencies = [ + "serde", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "ink_allocator" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a291f411e310b7a3bb01ce21102b8c0aea5b7b523e4bad0b40a8e55a76c58906" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ink_engine" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "075eab468da2937288ec484be920cb18614147003d7f1afbdfcfb190ed771c46" +dependencies = [ + "blake2 0.10.4", + "derive_more", + "parity-scale-codec", + "rand", + "secp256k1", + "sha2", + "sha3", +] + +[[package]] +name = "ink_env" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271689b643d7ccf2bcd09d7ef07eda79cd3366ee042d5bbfcebf534b08da79d7" +dependencies = [ + "arrayref", + "blake2 0.10.4", + "cfg-if", + "derive_more", + "ink_allocator", + "ink_engine", + "ink_metadata", + "ink_prelude", + "ink_primitives", + "num-traits", + "parity-scale-codec", + "paste", + "rand", + "rlibc", + "scale-info", + "secp256k1", + "sha2", + "sha3", + "static_assertions", +] + +[[package]] +name = "ink_lang" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62cf662fe6a130ea1ada3520142405e3ed521b79c35b7274cc95dd37bc833571" +dependencies = [ + "derive_more", + "ink_env", + "ink_lang_macro", + "ink_metadata", + "ink_prelude", + "ink_primitives", + "ink_storage", + "parity-scale-codec", +] + +[[package]] +name = "ink_lang_codegen" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94dc22732ced2557f0411de5fa31d6fddc3878968041b699ae16ed1c390d2660" +dependencies = [ + "blake2 0.10.4", + "derive_more", + "either", + "heck 0.4.0", + "impl-serde", + "ink_lang_ir", + "itertools", + "parity-scale-codec", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "ink_lang_ir" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a089bcac8d7e6a487b7a18ea8a1d20eb540ed26657706ac221cc0e8239047e45" +dependencies = [ + "blake2 0.10.4", + "either", + "itertools", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "ink_lang_macro" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1330da0b8007b86de94f95fbc74769c0461d3b078b291af5497771598db1c5b4" +dependencies = [ + "ink_lang_codegen", + "ink_lang_ir", + "ink_primitives", + "parity-scale-codec", + "proc-macro2", + "syn", +] + +[[package]] +name = "ink_metadata" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d442f4f5dcbf120aa84cae9e399065ad99d143d5a920b06d3da286e91c03ec70" +dependencies = [ + "derive_more", + "impl-serde", + "ink_prelude", + "ink_primitives", + "scale-info", + "serde", +] + +[[package]] +name = "ink_prelude" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e38d71af62cfec3425727d28665a947d636c3be6ae71ac3a79868ef8a08633f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ink_primitives" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea7afd5330a9d3be1533222a48b8ab44b3a3356a5e6bb090bff0790aa562b418" +dependencies = [ + "cfg-if", + "ink_prelude", + "parity-scale-codec", + "scale-info", +] + +[[package]] +name = "ink_storage" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be827b98c102c413b2309075f0835a9bb8c6325fc6aa09e66963424db7a8bcb5" +dependencies = [ + "array-init", + "cfg-if", + "derive_more", + "ink_env", + "ink_metadata", + "ink_prelude", + "ink_primitives", + "ink_storage_derive", + "parity-scale-codec", + "scale-info", +] + +[[package]] +name = "ink_storage_derive" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ced452d5d0b2268b1257ffd2ec73cf9c3b4fba5f3632f185a03aafec8888439" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "itertools" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8af84674fe1f223a982c933a0ee1086ac4d4052aa0fb8060c12c6ad838e754" + +[[package]] +name = "keccak" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9b7d56ba4a8344d6be9729995e6b06f928af29998cdf79fe390cbf6b1fee838" + +[[package]] +name = "libc" +version = "0.2.129" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64de3cc433455c14174d42e554d4027ee631c4d046d43e3ecc6efc4636cdc7a7" + +[[package]] +name = "num" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43db66d1170d347f9a065114077f7dccb00c1b9478c89384490a3425279a4606" +dependencies = [ + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ae39348c8bc5fbd7f40c727a9925f03517afd2ab27d46702108b6a7e5414c19" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "openbrush" +version = "2.1.0" +source = "git+https://github.com/Supercolony-net/openbrush-contracts.git?rev=8a20f95#8a20f951feaf8c6ea72c4bf113bf115bad9f158f" +dependencies = [ + "ink_env", + "ink_lang", + "ink_prelude", + "ink_primitives", + "ink_storage", + "openbrush_contracts", + "openbrush_lang", + "parity-scale-codec", +] + +[[package]] +name = "openbrush_contracts" +version = "2.1.0" +source = "git+https://github.com/Supercolony-net/openbrush-contracts.git?rev=8a20f95#8a20f951feaf8c6ea72c4bf113bf115bad9f158f" +dependencies = [ + "ink_env", + "ink_lang", + "ink_prelude", + "ink_primitives", + "ink_storage", + "openbrush_lang", + "parity-scale-codec", +] + +[[package]] +name = "openbrush_lang" +version = "2.1.0" +source = "git+https://github.com/Supercolony-net/openbrush-contracts.git?rev=8a20f95#8a20f951feaf8c6ea72c4bf113bf115bad9f158f" +dependencies = [ + "const_format", + "ink_env", + "ink_lang", + "ink_primitives", + "ink_storage", + "openbrush_lang_macro", + "parity-scale-codec", + "scale-info", + "sha2-const", +] + +[[package]] +name = "openbrush_lang_codegen" +version = "2.1.0" +source = "git+https://github.com/Supercolony-net/openbrush-contracts.git?rev=8a20f95#8a20f951feaf8c6ea72c4bf113bf115bad9f158f" +dependencies = [ + "blake2 0.9.2", + "cargo_metadata", + "fs2", + "heck 0.3.3", + "ink_lang_ir", + "proc-macro2", + "quote", + "serde", + "serde_json", + "syn", + "synstructure", + "unwrap", +] + +[[package]] +name = "openbrush_lang_macro" +version = "2.1.0" +source = "git+https://github.com/Supercolony-net/openbrush-contracts.git?rev=8a20f95#8a20f951feaf8c6ea72c4bf113bf115bad9f158f" +dependencies = [ + "openbrush_lang_codegen", + "proc-macro2", + "syn", + "synstructure", +] + +[[package]] +name = "parity-scale-codec" +version = "3.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9182e4a71cae089267ab03e67c99368db7cd877baf50f931e5d6d4b71e195ac0" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9299338969a3d2f491d65f140b00ddec470858402f888af98e8642fb5e8965cd" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "paste" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9423e2b32f7a043629287a536f21951e8c6a82482d0acb1eeebfc90bc2225b22" + +[[package]] +name = "pest" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69486e2b8c2d2aeb9762db7b4e00b0331156393555cff467f4163ff06821eef8" +dependencies = [ + "thiserror", + "ucd-trie", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" + +[[package]] +name = "proc-macro-crate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eda0fc3b0fb7c975631757e14d9049da17374063edb6ebbcbc54d880d4fe94e9" +dependencies = [ + "once_cell", + "thiserror", + "toml", +] + +[[package]] +name = "proc-macro2" +version = "1.0.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a2ca2c61bc9f3d74d2886294ab7b9853abd9c1ad903a3ac7815c58989bb7bab" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rlibc" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc874b127765f014d792f16763a81245ab80500e2ad921ed4ee9e82481ee08fe" + +[[package]] +name = "ryu" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" + +[[package]] +name = "scale-info" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c46be926081c9f4dd5dd9b6f1d3e3229f2360bc6502dd8836f84a93b7c75e99a" +dependencies = [ + "bitvec", + "cfg-if", + "derive_more", + "parity-scale-codec", + "scale-info-derive", + "serde", +] + +[[package]] +name = "scale-info-derive" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e334bb10a245e28e5fd755cabcafd96cfcd167c99ae63a46924ca8d8703a3c" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "secp256k1" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7649a0b3ffb32636e60c7ce0d70511eda9c52c658cd0634e194d5a19943aeff" +dependencies = [ + "secp256k1-sys", +] + +[[package]] +name = "secp256k1-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7058dc8eaf3f2810d7828680320acda0b25a288f6d288e19278e249bbf74226b" +dependencies = [ + "cc", +] + +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser", + "serde", +] + +[[package]] +name = "semver-parser" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" +dependencies = [ + "pest", +] + +[[package]] +name = "serde" +version = "1.0.143" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e8e5d5b70924f74ff5c6d64d9a5acd91422117c60f48c4e07855238a254553" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.143" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3d8e8de557aee63c26b85b947f5e59b690d0454c753f3adeb5cd7835ab88391" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38dd04e3c8279e75b31ef29dbdceebfe5ad89f4d0937213c53f7d49d01b3d5a7" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha2" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55deaec60f81eefe3cce0dc50bda92d6d8e88f2a27df7c5033b42afeb1ed2676" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.3", +] + +[[package]] +name = "sha2-const" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5edcd790916d95ff81bdc1505b09c74d30d47a755929cc8c71c59cbbfa99f91b" + +[[package]] +name = "sha3" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a31480366ec990f395a61b7c08122d99bd40544fdb5abcfc1b06bb29994312c" +dependencies = [ + "digest 0.10.3", + "keccak", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "subtle" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" + +[[package]] +name = "syn" +version = "1.0.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58dbef6ec655055e20b86b15a8cc6d439cca19b667537ac6a1369572d151ab13" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "unicode-xid", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "the_pressiah_cometh" +version = "0.1.0" +dependencies = [ + "access_control", + "button", + "ink_env", + "ink_lang", + "ink_lang_codegen", + "ink_metadata", + "ink_prelude", + "ink_primitives", + "ink_storage", + "parity-scale-codec", + "scale-info", +] + +[[package]] +name = "thiserror" +version = "1.0.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5f6586b7f764adc0231f4c79be7b920e766bb2f3e51b3661cdb263828f19994" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12bafc5b54507e0149cdf1b145a5d80ab80a90bcd9275df43d4fff68460f6c21" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "ticket_token" +version = "2.1.0" +dependencies = [ + "access_control", + "ink_env", + "ink_lang", + "ink_prelude", + "ink_primitives", + "ink_storage", + "openbrush", + "parity-scale-codec", +] + +[[package]] +name = "toml" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" +dependencies = [ + "serde", +] + +[[package]] +name = "typenum" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" + +[[package]] +name = "ucd-trie" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89570599c4fe5585de2b388aab47e99f7fa4e9238a1399f707a02e356058141c" + +[[package]] +name = "unicode-ident" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4f5b37a154999a8f3f98cc23a628d850e154479cd94decf3414696e12e31aaf" + +[[package]] +name = "unicode-segmentation" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" + +[[package]] +name = "unicode-xid" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04" + +[[package]] +name = "unwrap" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e33648dd74328e622c7be51f3b40a303c63f93e6fa5f08778b6203a4c25c20f" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "wyz" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30b31594f29d27036c383b53b59ed3476874d518f0efb151b27a4c275141390e" +dependencies = [ + "tap", +] diff --git a/contracts/the_pressiah_cometh/Cargo.toml b/contracts/the_pressiah_cometh/Cargo.toml new file mode 100644 index 0000000000..9d01e66e6d --- /dev/null +++ b/contracts/the_pressiah_cometh/Cargo.toml @@ -0,0 +1,44 @@ +[package] +name = "the_pressiah_cometh" +version = "0.1.0" +authors = ["Cardinal Cryptography"] +edition = "2021" +license = "Apache 2.0" + +[dependencies] +ink_env = { version = "~3.3.0", default-features = false } +ink_lang = { version = "~3.3.0", default-features = false } +ink_lang_codegen = { version = "~3.3.0", default-features = false } +ink_metadata = { version = "~3.3.0", default-features = false, features = ["derive"], optional = true } +ink_prelude = { version = "~3.3.0", default-features = false } +ink_primitives = { version = "~3.3.0", default-features = false } +ink_storage = { version = "~3.3.0", default-features = false } + +scale = { package = "parity-scale-codec", version = "3", default-features = false, features = ["derive"] } +scale-info = { version = "2", default-features = false, features = ["derive"], optional = true } + +button = { path = "../button", default-features = false } +access_control = { path = "../access_control", default-features = false, features = ["ink-as-dependency"] } + +[lib] +name = "the_pressiah_cometh" +path = "lib.rs" +crate-type = [ + # Used for normal contract Wasm blobs. + "cdylib", +] + +[features] +default = ["std"] +std = [ + "button/std", + "ink_env/std", + "ink_lang_codegen/std", + "ink_metadata/std", + "ink_prelude/std", + "ink_primitives/std", + "ink_storage/std", + "scale-info/std", + "scale/std", +] +ink-as-dependency = [] diff --git a/contracts/the_pressiah_cometh/lib.rs b/contracts/the_pressiah_cometh/lib.rs new file mode 100644 index 0000000000..f35834f846 --- /dev/null +++ b/contracts/the_pressiah_cometh/lib.rs @@ -0,0 +1,237 @@ +#![cfg_attr(not(feature = "std"), no_std)] + +use ink_lang as ink; + +/// This is the ThePressiahCometh +/// +/// The reward for each click grows with the amount of previous participants. +/// n-th person to click the button gets n tokens. +/// ThePressiah (the last player to click) gets 20% of the tokens. + +#[ink::contract] +mod the_pressiah_cometh { + + use access_control::{traits::AccessControlled, Role, ACCESS_CONTROL_PUBKEY}; + use button::{ButtonData, ButtonGame, ButtonResult, GameError, IButtonGame}; + use ink_env::{DefaultEnvironment, Error as InkEnvError}; + use ink_lang::{ + codegen::{initialize_contract, EmitEvent}, + reflect::ContractEventBase, + }; + use ink_prelude::format; + use ink_storage::traits::SpreadAllocate; + + /// Event type + type Event = ::Type; + + /// Event emitted when TheButton is created + #[ink(event)] + #[derive(Debug)] + pub struct ButtonCreated { + #[ink(topic)] + reward_token: AccountId, + #[ink(topic)] + ticket_token: AccountId, + start: BlockNumber, + deadline: BlockNumber, + } + + /// Event emitted when TheButton is pressed + #[ink(event)] + #[derive(Debug)] + pub struct ButtonPressed { + #[ink(topic)] + by: AccountId, + when: BlockNumber, + } + + /// Event emitted when a players reward is claimed + #[ink(event)] + #[derive(Debug)] + pub struct GameReset { + when: BlockNumber, + } + + #[ink(storage)] + #[derive(SpreadAllocate)] + pub struct ThePressiahCometh { + data: ButtonData, + } + + impl AccessControlled for ThePressiahCometh { + type ContractError = GameError; + } + + impl ButtonGame for ThePressiahCometh { + fn get(&self) -> &ButtonData { + &self.data + } + + fn get_mut(&mut self) -> &mut ButtonData { + &mut self.data + } + + fn score(&self, _now: BlockNumber) -> Balance { + (self.data.presses + 1) as Balance + } + } + + // because ink! does not allow generics or trait default implementations + impl IButtonGame for ThePressiahCometh { + #[ink(message)] + fn is_dead(&self) -> bool { + let now = self.env().block_number(); + ButtonGame::is_dead(self, now) + } + + #[ink(message)] + fn press(&mut self) -> ButtonResult<()> { + let caller = self.env().caller(); + let now = Self::env().block_number(); + let this = self.env().account_id(); + + ButtonGame::press::(self, now, caller, this)?; + + Self::emit_event( + self.env(), + Event::ButtonPressed(ButtonPressed { + by: caller, + when: now, + }), + ); + + Ok(()) + } + + #[ink(message)] + fn reset(&mut self) -> ButtonResult<()> { + let now = Self::env().block_number(); + + ButtonGame::reset::(self, now)?; + + Self::emit_event(self.env(), Event::GameReset(GameReset { when: now })); + Ok(()) + } + + #[ink(message)] + fn deadline(&self) -> BlockNumber { + ButtonGame::deadline(self) + } + + #[ink(message)] + fn access_control(&self) -> AccountId { + ButtonGame::access_control(self) + } + + #[ink(message)] + fn last_presser(&self) -> Option { + ButtonGame::last_presser(self) + } + + #[ink(message)] + fn reward_token(&self) -> AccountId { + ButtonGame::reward_token(self) + } + + #[ink(message)] + fn ticket_token(&self) -> AccountId { + ButtonGame::ticket_token(self) + } + + #[ink(message)] + fn balance(&self) -> ButtonResult { + let this = self.env().account_id(); + ButtonGame::balance::(self, this) + } + + #[ink(message)] + fn set_access_control(&mut self, new_access_control: AccountId) -> ButtonResult<()> { + let caller = self.env().caller(); + let this = self.env().account_id(); + ButtonGame::set_access_control(self, new_access_control, caller, this) + } + + #[ink(message)] + fn terminate(&mut self) -> ButtonResult<()> { + let caller = self.env().caller(); + let this = self.env().account_id(); + let required_role = Role::Owner(this); + self.check_role(caller, required_role)?; + self.env().terminate_contract(caller) + } + } + + impl ThePressiahCometh { + #[ink(constructor)] + pub fn new( + ticket_token: AccountId, + reward_token: AccountId, + button_lifetime: BlockNumber, + ) -> Self { + let caller = Self::env().caller(); + let code_hash = Self::env() + .own_code_hash() + .expect("Called new on a contract with no code hash"); + let required_role = Role::Initializer(code_hash); + let access_control = AccountId::from(ACCESS_CONTROL_PUBKEY); + + let role_check = ::check_role( + access_control, + caller, + required_role, + |why: InkEnvError| { + GameError::ContractCall(format!("Calling access control has failed: {:?}", why)) + }, + |role: Role| GameError::MissingRole(format!("{:?}", role)), + ); + + match role_check { + Ok(_) => initialize_contract(|contract| { + Self::new_init(contract, ticket_token, reward_token, button_lifetime) + }), + Err(why) => panic!("Could not initialize the contract {:?}", why), + } + } + + fn new_init( + &mut self, + ticket_token: AccountId, + reward_token: AccountId, + button_lifetime: BlockNumber, + ) { + let now = Self::env().block_number(); + let deadline = now + button_lifetime; + + self.data.access_control = AccountId::from(ACCESS_CONTROL_PUBKEY); + self.data.button_lifetime = button_lifetime; + self.data.reward_token = reward_token; + self.data.ticket_token = ticket_token; + self.data.last_press = now; + + Self::emit_event( + Self::env(), + Event::ButtonCreated(ButtonCreated { + start: now, + deadline, + ticket_token, + reward_token, + }), + ) + } + + fn emit_event(emitter: EE, event: Event) + where + EE: EmitEvent, + { + emitter.emit_event(event); + } + + /// Returns own code hash + #[ink(message)] + pub fn code_hash(&self) -> ButtonResult { + self.env().own_code_hash().map_err(|why| { + GameError::ContractCall(format!("Can't retrieve own code hash: {:?}", why)) + }) + } + } +}