From febcaf9fc51638bbf5bd81ab7a0a8dda8f3f0ab7 Mon Sep 17 00:00:00 2001 From: Mihai Calin Luca Date: Thu, 4 Jul 2024 03:24:28 +0200 Subject: [PATCH 1/7] short interactors step by step tutorial --- .../interactor/interactors-overview.md | 4 +- docs/developers/transactions/tx-env.md | 2 +- .../developers/tutorials/interactors-guide.md | 367 ++++++++++++++++++ sidebars.js | 13 +- 4 files changed, 378 insertions(+), 8 deletions(-) create mode 100644 docs/developers/tutorials/interactors-guide.md diff --git a/docs/developers/interactor/interactors-overview.md b/docs/developers/interactor/interactors-overview.md index 3455f5d89..31909ad14 100644 --- a/docs/developers/interactor/interactors-overview.md +++ b/docs/developers/interactor/interactors-overview.md @@ -7,7 +7,7 @@ title: Interactors Overview ## Overview -Interactors are Rust-based microservices designed to facilitate interactions with smart contracts on the blockchain. They are essential for system testing and managing the setup and execution of smart contracts in a live blockchain environment. Making use of unified syntax, proxies, and the capability to be autogenerated using `sc-meta all snippets`, interactors streamline the interaction process, providing a quick and efficient solution for system testing, seamlessly integrating with the development workflow. +Interactors are Rust programs designed to facilitate interactions with smart contracts on the blockchain. They are essential for system testing and managing the setup and execution of smart contracts in a live blockchain environment. Making use of unified syntax, proxies, and the capability to be autogenerated using `sc-meta all snippets`, interactors streamline the interaction process, providing a quick and efficient solution for system testing, seamlessly integrating with the development workflow. [comment]: # (mx-context-auto) @@ -26,7 +26,9 @@ Before using interactors, make sure you have the following setup: ``` - choose default toolchain ```bash + rustup update rustup default stable + rustup target add wasm32-unknown-unknown ``` - check installed toolchains ```bash diff --git a/docs/developers/transactions/tx-env.md b/docs/developers/transactions/tx-env.md index 11ae60f72..df5828af0 100644 --- a/docs/developers/transactions/tx-env.md +++ b/docs/developers/transactions/tx-env.md @@ -166,7 +166,7 @@ Not yet available, coming soon. ## Interactor -The interactors are microservices written in Rust, used for interacting with the smart contract on the real blockchain (deploy/upgrade, query, call) and system testing. Interactor environments such as `InteractorExecEnv` and `InteractorQueryEnv` are essential for transactions meant to be ran on the real blockchain, from a different environment than the smart contract. The easiest way to create transactions using the interactor environments is to create an instance of the `Interactor` struct. +The interactors are Rust programs, used for interacting with the smart contract on the real blockchain (deploy/upgrade, query, call) and system testing. Interactor environments such as `InteractorExecEnv` and `InteractorQueryEnv` are essential for transactions meant to be ran on the real blockchain, from a different environment than the smart contract. The easiest way to create transactions using the interactor environments is to create an instance of the `Interactor` struct. ```rust title=interact.rs const GATEWAY: &str = "https://devnet-gateway.multiversx.com"; diff --git a/docs/developers/tutorials/interactors-guide.md b/docs/developers/tutorials/interactors-guide.md new file mode 100644 index 000000000..c396ad584 --- /dev/null +++ b/docs/developers/tutorials/interactors-guide.md @@ -0,0 +1,367 @@ +--- +id: interactors-guide +title: Deploy a SC in 5 minutes - SpaceCraft interactors +--- + +[comment]: # (mx-abstract) + +This short guide demonstrates how to deploy and interact with a smart contract on MultiversX using the SpaceCraft interactors. We will cover essential topics such as the SC framework, integration tests, sc-meta, and interactors (devtools). + +[comment]: # (mx-context-auto) + +## Introduction + +Building smart contracts involves complex tasks. Beyond the syntax, a smart contract acts as a public server where users pay for actions. Enforcing rules to ensure safety (treating possible exploits) and efficiency (timewise - transaction speed, costwise - gas fees) for all users interacting with the contract is crucial. + +In order to make sure that the smart contract works as expected, there are at least three stages of testing that we recommend to be performed before live deployment: +- unit testing ([SpaceCraft testing framework](https://docs.multiversx.com/developers/testing/rust/sc-test-overview#overview) - Rust unit tests, RustVM) +- scenarios ([mandos](https://docs.multiversx.com/developers/testing/scenario/concept#what-is-mandos) - json files, can be generated from Rust unit tests). Mandos can be used to test the logic on the [GoVM](https://docs.multiversx.com/technology/the-wasm-vm) as well, which is the actual VM running on the node +- integration testing ([SpaceCraft Rust interactors](https://docs.multiversx.com/developers/interactor/interactors-overview/#overview) - testing on the blockchain). Integration tests cover real life scenarios across the different MultiversX blockchain environments - devnet/testnet/mainnet + +In this tutorial we will focus on integration testing using the interactors made available by the SpaceCraft smart contract framework. + +::::important Prerequisites +- `stable` Rust version `1.78.0 or above` (install via [rustup](https://docs.multiversx.com/sdk-and-tools/troubleshooting/rust-setup/#without-mxpy)): +- `multiversx-sc-meta` version `0.50.0 or above` (cargo install [multiversx-sc-meta](https://docs.multiversx.com/developers/meta/sc-meta-cli/#introduction)) +:::: + +[comment]: # (mx-context-auto) + +## Step 1: Start from a template + +Get a headstart by using sc-meta to generate one of our smart contract templates as a starting point for your smart contract. Let’s say we start from the `empty` template contract and name it `my-contract`. + +```bash +sc-meta new --template adder --name my-contract +code my-contract # opens the contract in VSCode (optional) +``` + +This command generates an empty contract called `MyContract`, with the minimum requirements for deployment. The main file *(my-contract/src/my_contract.rs)* includes only two empty endpoints: `init` and `upgrade`. + +[comment]: # (mx-context-auto) + +## Step 2: Customize the template + +However, we are not interested in deploying an empty contract, so we will quickly add some endpoints: + +```rust title=my_contract.rs +#![no_std] + +#[allow(unused_imports)] +use multiversx_sc::imports::*; + +/// An empty contract. To be used as a template when starting a new contract from scratch. +#[multiversx_sc::contract] +pub trait MyContract { + #[init] + fn init(&self) {} + + #[upgrade] + fn upgrade(&self) {} + + #[endpoint] + fn register_me(&self) { + let caller = self.blockchain().get_caller(); + require!( + self.already_registered(&caller).is_empty(), + "user already registered" + ); + self.already_registered(&caller).set(true) + } + + #[endpoint] + fn deregister_me(&self) { + let caller = self.blockchain().get_caller(); + require!( + !self.already_registered(&caller).is_empty(), + "user not registered" + ); + self.already_registered(&caller).clear() + } + + #[view] + #[storage_mapper] + fn already_registered(&self, user: &ManagedAddress) -> SingleValueMapper; +} +``` + +In this snippet, we have created a storage mapper named `already_registered` to track user registration status, and two endpoints to handle the registration process and enforce a clear path of action for the user: first register, then deregister. Any other path of action should result in an error. In order to make sure the rules are enforced on the actual blockchain, we will create some integration tests. + +[comment]: # (mx-context-auto) + +## Step 3: Build the contract + +Considering our syntax development is done, we should now be able to build the contract. We need to build the contract in order to generate necessary files for deployment and testing inside the `output` folder such as *my-contract.was* and *my-contract.mxsc.json*. + +```bash +cd my-contract +sc-meta all build +``` + +[comment]: # (mx-context-auto) + +## Step 4: Generate the interactor + +Based on the smart contract we have just created, we can generate interactors with just one command using `sc-meta` in the root folder of the contract. + +```bash +sc-meta all snippets +``` + +This command compiled the contract and generated a new folder called `interactor`. The interactor is by default a Rust CLI program that uses the smart contract proxy to send calls to the contract. + +Inside the src folder *(interactor/src)*, we should find the newly generated proxy of the contract *(proxy.rs)* and the `interactor_main.rs` file, which is the main file of the project. A *sc-config.toml* file has also been created (if not existent) containing the path of the proxy file. + +If we navigate to *interactor/src/interactor_main.rs*, inside the `main` function, we can find all the CLI command available to us: + +```rust title=interactor_main.rs +#[tokio::main] +async fn main() { + env_logger::init(); + + let mut args = std::env::args(); + let _ = args.next(); + let cmd = args.next().expect("at least one argument required"); + let mut interact = ContractInteract::new().await; + match cmd.as_str() { + "deploy" => interact.deploy().await, + "register_me" => interact.register_me().await, + "deregister_me" => interact.deregister_me().await, + "already_registered" => interact.already_registered().await, + _ => panic!("unknown command: {}", &cmd), + } +} +``` + +As you can see, `sc-meta` automatically generated all the logic behind calling the smart contract endpoints. The interactor uses async Rust, so all the functions are marked as async and need to be awaited to get a result. + +In order to compile the project, we need to include it in the project tree. In this case, we have to add the interactor project to the smart contract’s workspaces, in the *Cargo.toml* file: + +```toml title=Cargo.toml +[workspace] +members = [ + ".", + "meta", + "interactor" +] +``` + +[comment]: # (mx-context-auto) + +## Step 5: Create scenarios & run + +Now the setup is complete, it’s time to create some scenarios to test. For our use-case, the perfect scenario is: deploy the contract, register from a user and deregister from the same user. Anything else should result in an error. + +In order to test the perfect scenario first, we will first deploy the contract: + +```bash +cd interactor +cargo run deploy +``` + +After deploying the contract, a new file named *state.toml* will be created, which contains the newly deployed sc address. For each deploy, a new address will be printed into the file. + +```toml title=state.toml +contract_address = "erd1qqqqqqqqqqqqqpgqpsev0x4nufh240l44gf2t6qzkh9xvutqd8ssrnydzr" +``` + +By default, the testing environment is `devnet`, specified by the `GATEWAY` constant: + +```rust title=interactor_main.rs +const GATEWAY: &str = sdk::blockchain::DEVNET_GATEWAY; +``` +Changing the value of this constant will change the testing environment for a quick setup (other options are `TESTNET_GATEWAY` and `MAINNET_GATEWAY`). + +Each command has some waiting time and returns the result inside a variable in the function, but also prints it in the console for easy tracking. + +In this case, the console shows: +```bash +you@PC interactor % cargo run deploy + Compiling rust-interact v0.0.0 (/Users/you/Documents/my-contract/interact-rs) + Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.96s + Running `/Users/you/Documents/my-contract/target/debug/rust-interact deploy` +sender's recalled nonce: 1717 +-- tx nonce: 1717 +sc deploy tx hash: 623c7b853b1fbb36762d433c6a5e27d34f48198e68bbba1216d1c676ab0ba3be +deploy address: erd1qqqqqqqqqqqqqpgqpsev0x4nufh240l44gf2t6qzkh9xvutqd8ssrnydzr +new address: erd1qqqqqqqqqqqqqpgqpsev0x4nufh240l44gf2t6qzkh9xvutqd8ssrnydzr +``` + +Then, we can continue testing the scenario: + +```bash +cargo run register_me +cargo run deregister_me +``` + +These commands will send two transactions to the newly deployed contract from the `test_wallets::alice()` wallet, each of them calling one endpoint of the contract in the specified order. + +```bash +you@PC interactor % cargo run register_me + Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.35s + Running `/Users/you/Documents/my-contract/target/debug/rust-interact register_me` +sender's recalled nonce: 1718 +-- tx nonce: 1718 +sc call tx hash: 97bea2b18ca0d1305200dc4ea0d1b2b32a666430f8d24ab042f59c324bf47eec +Result: () +you@PC interactor % cargo run deregister_me + Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.11s + Running `/Users/you/Documents/my-contract/target/debug/rust-interact deregister_me +sender's recalled nonce: 1719 +-- tx nonce: 1719 +sc call tx hash: 20540f1548508e198359d3e897c1e380796e89142801d485c76c700b7dab2a8b +Result: () +``` + +[comment]: # (mx-context-auto) + +## Step 6 (optional): Create integration tests + +Using the functions generated by `sc-meta`, we can extend the interactor to cover a series of integration tests. Organized tests help with maintenance and long-term testing. + +We can create a quick integration test as such: +```rust title=interactor_main.rs +#[tokio::test] +async fn integration_test() { + let mut interact = ContractInteract::new().await; + + interact.deploy().await; + interact.register_me().await; + interact.deregister_me().await; +} +``` + +Running this test will perform the previous CLI actions in the same order, on the real blockchain. The console will show all the intermediate actions at the end of the test, as such: + +```bash +running 1 test +test integration_test ... ok + +successes: + +---- integration_test stdout ---- +sender's recalled nonce: 1720 +-- tx nonce: 1720 +sc deploy tx hash: ca6e69c18acd73b20bfd21142b45be1b530ecbec89d1eb9c374b93f7681dbc38 +deploy address: erd1qqqqqqqqqqqqqpgq0lkg29q0ep09llg0mva5lle3s0334wqtd8ss40lmkn +new address: erd1qqqqqqqqqqqqqpgq0lkg29q0ep09llg0mva5lle3s0334wqtd8ss40lmkn +sender's recalled nonce: 1721 +-- tx nonce: 1721 +sc call tx hash: f8692bd508c1d1aa10324a79d497f1c6995e053e3f89fca48e8f4185808f067a +Result: () +sender's recalled nonce: 1722 +-- tx nonce: 1722 +sc call tx hash: 369429790c8d77d85dd52f73c9a6b6427709f327b7e004ad99de3bc04f3ee767 +Result: () + + +successes: + integration_test + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 14.38s +``` + +This setup can be used for extensive testing, but also as a tool for live deployment on mainnet, tracking and interaction. One can, for example, create a different `ContractInteract` struct for each development environment and further structure all the interactions into different integration tests. + +```rust +struct ContractInteract { + interactor: Interactor, + wallet_address: Address, + contract_code: BytesValue, + state: State, +} + +struct MainNetContractInteract { + interactor: Interactor, + wallet_address: Address, + contract_code: BytesValue, + state: State, +} + +impl ContractInteract { + async fn new() -> Self { + let mut interactor = Interactor::new(DEVNET).await; + let wallet_address = interactor.register_wallet(test_wallets::alice()); + + let contract_code = BytesValue::interpret_from( + "mxsc:../output/defi-protocol-sc.mxsc.json", + &InterpreterContext::default(), + ); + + ContractInteract { + interactor, + wallet_address, + contract_code, + state: State::load_state(), + } + } + +// other functions +} + +impl MainNetContractInteract { + async fn new() -> Self { + let mut interactor = Interactor::new(MAINNET).await; + let wallet_address = + interactor.register_wallet(sdk::wallet::Wallet::from_pem_file("myWallet.pem").unwrap()); + + let contract_code = BytesValue::interpret_from( + "mxsc:../output/defi-protocol-sc.mxsc.json", + &InterpreterContext::default(), + ); + + MainNetContractInteract { + interactor, + wallet_address, + contract_code, + state: State::load_state_main_net(), + } + } + +// other functions +} + +#[tokio::test] +async fn mainnet_setup() { + let mut interact = MainNetContractInteract::new().await; + + interact.deploy().await; + interact.pause().await; + interact.feed_egld().await; + interact.update_storage().await; + interact.unpause().await; + // other setup functions +} + +#[tokio::test] +async fn mainnet_views() { + let mut interact = MainNetContractInteract::new().await; + + interact.get_user_count().await; + interact.get_all_payments().await; + interact.get_current_token_id().await; + interact.get_participants_list().await; + // other view functions to check the current state of the contract +} + +#[tokio::test] +async fn devnet_integration_test() { + let mut interact = ContractInteract::new().await; + + interact.deploy().await; + interact.update_storage().await; + interact.stake_egld().await; + interact.check_staked_amount().await; + // other setup and logic related functions +} +``` + +Organizing the code this way streamlines the process even further. Now, it is just a matter of using a different datatype in order to keep track of the development environments be able to rerun everything quickly if needed. + +[comment]: # (mx-context-auto) + +## Conclusion + +The interactors are a versatile tool that greatly simplifies various processes around a smart contract, including deployment, upgrades, interaction, and testing. These tools not only save time but also offer a robust starting codebase for Rust developers. They also provide a valuable learning opportunity for non-Rust developers to explore async Rust and other advanced features. + +We highly recommend experimenting with these interactors, as they are efficient time-savers and are likely to be expanded with even more features in the future. By incorporating these practices, you can ensure that your smart contract functions as intended, providing a reliable and efficient service to users on MultiversX. diff --git a/sidebars.js b/sidebars.js index 79706de2f..4c63170c1 100644 --- a/sidebars.js +++ b/sidebars.js @@ -30,7 +30,7 @@ const sidebars = { */ docs: { - "Welcome to MultiversX":["welcome/welcome-to-multiversx"], + "Welcome to MultiversX": ["welcome/welcome-to-multiversx"], "Learn about MultiversX": [ "learn/getting-started", "learn/multiversx-ecosystem", @@ -59,6 +59,7 @@ const sidebars = { "developers/tutorials/energy-dao", "developers/tutorials/dex-walkthrough", "developers/tutorials/wallet-connect-v2-migration", + "developers/tutorials/interactors-guide", ], }, { @@ -497,7 +498,7 @@ const sidebars = { { type: "category", label: "Ad-Astra Bridge", - items: [ + items: [ "bridge/architecture", "bridge/transfer-flows", "bridge/multiple-chains", @@ -552,10 +553,10 @@ const sidebars = { type: "category", label: "Interoperability", items: [ - "sovereign/interoperability", - "sovereign/ethereum-l2", - "sovereign/bitcoin-l2", - "sovereign/solana-l2", + "sovereign/interoperability", + "sovereign/ethereum-l2", + "sovereign/bitcoin-l2", + "sovereign/solana-l2", ], }, "sovereign/validators", From c0578bf55a7145d391602ea402a0fb628e1bcb5c Mon Sep 17 00:00:00 2001 From: Mihai Calin Luca Date: Thu, 4 Jul 2024 19:16:17 +0200 Subject: [PATCH 2/7] replaced example and added a new section --- .../developers/tutorials/interactors-guide.md | 154 +++++++++--------- static/img/dex_interactor_file_structure.jpeg | Bin 0 -> 60573 bytes 2 files changed, 76 insertions(+), 78 deletions(-) create mode 100644 static/img/dex_interactor_file_structure.jpeg diff --git a/docs/developers/tutorials/interactors-guide.md b/docs/developers/tutorials/interactors-guide.md index c396ad584..de0bb39be 100644 --- a/docs/developers/tutorials/interactors-guide.md +++ b/docs/developers/tutorials/interactors-guide.md @@ -261,102 +261,100 @@ successes: test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 14.38s ``` -This setup can be used for extensive testing, but also as a tool for live deployment on mainnet, tracking and interaction. One can, for example, create a different `ContractInteract` struct for each development environment and further structure all the interactions into different integration tests. - -```rust -struct ContractInteract { - interactor: Interactor, - wallet_address: Address, - contract_code: BytesValue, - state: State, -} +[comment]: # (mx-context-auto) -struct MainNetContractInteract { - interactor: Interactor, - wallet_address: Address, - contract_code: BytesValue, - state: State, -} +## Improvements -impl ContractInteract { - async fn new() -> Self { - let mut interactor = Interactor::new(DEVNET).await; - let wallet_address = interactor.register_wallet(test_wallets::alice()); +This setup can be used for extensive testing, but also as a tool for live deployment on mainnet, tracking and interaction. In a multi-contract setup, one can, for example, create different modules for specific interactions with each contract and development environment and further structure all the interactions into different integration tests. - let contract_code = BytesValue::interpret_from( - "mxsc:../output/defi-protocol-sc.mxsc.json", - &InterpreterContext::default(), - ); +Let’s take the example of the [DEX smart contract interactors](https://github.com/multiversx/mx-exchange-sc/tree/feat/unified/dex/interactor). Here, all the proxy files are organized in a different crate for easier access. - ContractInteract { - interactor, - wallet_address, - contract_code, - state: State::load_state(), - } - } +![img](/img/dex_interactor_file_structure.jpeg) -// other functions -} +Furthermore, all the contracts that are part of the DEX flow have separate interaction modules, so we can easily keep track of the flow when writing complex tests. -impl MainNetContractInteract { - async fn new() -> Self { - let mut interactor = Interactor::new(MAINNET).await; - let wallet_address = - interactor.register_wallet(sdk::wallet::Wallet::from_pem_file("myWallet.pem").unwrap()); +This is the `energy_factory` file, containing only interactions with the `energy factory smart contract`, using the specific proxy and contract address: +```rust title=energy_factory.rs +use multiversx_sc_snippets::imports::*; +use proxies::energy_factory_proxy; - let contract_code = BytesValue::interpret_from( - "mxsc:../output/defi-protocol-sc.mxsc.json", - &InterpreterContext::default(), - ); +use crate::{ + structs::{to_rust_biguint, InteractorEnergy}, + DexInteract, +}; - MainNetContractInteract { - interactor, - wallet_address, - contract_code, - state: State::load_state_main_net(), - } - } +pub(crate) async fn get_energy_amount_for_user( + dex_interact: &mut DexInteract, + user: Address, +) -> RustBigUint { + let result_token = dex_interact + .interactor + .query() + .to(dex_interact.state.current_energy_factory_address()) + .typed(energy_factory_proxy::SimpleLockEnergyProxy) + .get_energy_amount_for_user(ManagedAddress::from(user)) + .returns(ReturnsResult) + .prepare_async() + .run() + .await; -// other functions + to_rust_biguint(result_token) } +``` -#[tokio::test] -async fn mainnet_setup() { - let mut interact = MainNetContractInteract::new().await; - - interact.deploy().await; - interact.pause().await; - interact.feed_egld().await; - interact.update_storage().await; - interact.unpause().await; - // other setup functions +After having implemented this structure, writing integration test is a smooth process, even though the logic gets complicated: + +```rust title=dex_interact.rs +impl DexInteract { + async fn full_farm_scenario(&mut self, args: &AddArgs) { + // adds liquidity to the pair SC + let (_, _, lp_token) = pair::add_liquidity(self, args).await.0; + // enters farm in the farm locked SC + let _result = farm_locked::enter_farm(self, lp_token).await; + // query the energy factory SC + let _query = energy_factory::get_energy_amount_for_user(self, Address::zero()).await; + // stake farm tokens in the farm staking proxy SC + let _farm_token = farm_staking_proxy::stake_farm_tokens(self, Vec::new(), None).await; + // more logic + } } -#[tokio::test] -async fn mainnet_views() { - let mut interact = MainNetContractInteract::new().await; - - interact.get_user_count().await; - interact.get_all_payments().await; - interact.get_current_token_id().await; - interact.get_participants_list().await; - // other view functions to check the current state of the contract -} +#[cfg(test)] +pub mod integration_tests { + use multiversx_sc_snippets::tokio; -#[tokio::test] -async fn devnet_integration_test() { - let mut interact = ContractInteract::new().await; + use crate::{dex_interact_cli::SwapArgs, pair, DexInteract}; - interact.deploy().await; - interact.update_storage().await; - interact.stake_egld().await; - interact.check_staked_amount().await; - // other setup and logic related functions + #[tokio::test] + async fn test_swap() { + // initialize interactor + let mut dex_interact = DexInteract::init().await; + // test users + dex_interact.register_wallets(); + // mock arguments + let args = SwapArgs::default(); + + // swap tokens with the pair SC + let result = pair::swap_tokens_fixed_input(&mut dex_interact, &args).await; + println!("result {:#?}", result); + } + + #[tokio::test] + async fn test_full_farm_scenario() { + // initialize interactor + let mut dex_interact = DexInteract::init().await; + // test users + dex_interact.register_wallets(); + // mock arguments + let args = AddArgs::default(); + + // runs a full farm scenario + dex_interact.full_farm_scenario(args).await; + } } ``` -Organizing the code this way streamlines the process even further. Now, it is just a matter of using a different datatype in order to keep track of the development environments be able to rerun everything quickly if needed. +Organizing the code this way streamlines the process even further. Now, it is just a matter of using a different datatype or a different module in order to keep track of the various contracts and development environments and be able to rerun everything quickly if needed. [comment]: # (mx-context-auto) diff --git a/static/img/dex_interactor_file_structure.jpeg b/static/img/dex_interactor_file_structure.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..c234a7af87e897cb9207022a6bf2b69504b9e9e9 GIT binary patch literal 60573 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 r2!zgTDoXyX|~eCI9r#EdUGfXX$?dd7r0W literal 0 HcmV?d00001 From 623a01b1ba40ef0fba9af3ffb47b216aa2c91102 Mon Sep 17 00:00:00 2001 From: Mihai Calin Luca Date: Fri, 5 Jul 2024 13:23:23 +0200 Subject: [PATCH 3/7] fix after review --- docs/developers/tutorials/interactors-guide.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/developers/tutorials/interactors-guide.md b/docs/developers/tutorials/interactors-guide.md index de0bb39be..a229c7392 100644 --- a/docs/developers/tutorials/interactors-guide.md +++ b/docs/developers/tutorials/interactors-guide.md @@ -32,7 +32,7 @@ In this tutorial we will focus on integration testing using the interactors made Get a headstart by using sc-meta to generate one of our smart contract templates as a starting point for your smart contract. Let’s say we start from the `empty` template contract and name it `my-contract`. ```bash -sc-meta new --template adder --name my-contract +sc-meta new --template empty --name my-contract code my-contract # opens the contract in VSCode (optional) ``` @@ -91,7 +91,7 @@ In this snippet, we have created a storage mapper named `already_registered` to ## Step 3: Build the contract -Considering our syntax development is done, we should now be able to build the contract. We need to build the contract in order to generate necessary files for deployment and testing inside the `output` folder such as *my-contract.was* and *my-contract.mxsc.json*. +Considering our syntax development is done, we should now be able to build the contract. We need to build the contract in order to generate necessary files for deployment and testing inside the `output` folder such as *my-contract.wasm* and *my-contract.mxsc.json*. ```bash cd my-contract @@ -110,7 +110,7 @@ sc-meta all snippets This command compiled the contract and generated a new folder called `interactor`. The interactor is by default a Rust CLI program that uses the smart contract proxy to send calls to the contract. -Inside the src folder *(interactor/src)*, we should find the newly generated proxy of the contract *(proxy.rs)* and the `interactor_main.rs` file, which is the main file of the project. A *sc-config.toml* file has also been created (if not existent) containing the path of the proxy file. +Inside the source folder *(interactor/src)*, we should find the newly generated proxy of the contract *(proxy.rs)* and the `interactor_main.rs` file, which is the main file of the project. A *sc-config.toml* file has also been created (if not existent) containing the path of the proxy file. If we navigate to *interactor/src/interactor_main.rs*, inside the `main` function, we can find all the CLI command available to us: @@ -133,7 +133,7 @@ async fn main() { } ``` -As you can see, `sc-meta` automatically generated all the logic behind calling the smart contract endpoints. The interactor uses async Rust, so all the functions are marked as async and need to be awaited to get a result. +As you can see, `sc-meta` automatically generated all the logic behind calling the smart contract endpoints. The interactor uses asynchronous Rust, so all the functions are marked as `async` and need to be awaited to get a result. In order to compile the project, we need to include it in the project tree. In this case, we have to add the interactor project to the smart contract’s workspaces, in the *Cargo.toml* file: @@ -360,6 +360,6 @@ Organizing the code this way streamlines the process even further. Now, it is ju ## Conclusion -The interactors are a versatile tool that greatly simplifies various processes around a smart contract, including deployment, upgrades, interaction, and testing. These tools not only save time but also offer a robust starting codebase for Rust developers. They also provide a valuable learning opportunity for non-Rust developers to explore async Rust and other advanced features. +The interactors are a versatile tool that greatly simplifies various processes around a smart contract, including deployment, upgrades, interaction, and testing. These tools not only save time but also offer a robust starting codebase for Rust developers. They also provide a valuable learning opportunity for non-Rust developers to explore asynchronous Rust and other advanced features. We highly recommend experimenting with these interactors, as they are efficient time-savers and are likely to be expanded with even more features in the future. By incorporating these practices, you can ensure that your smart contract functions as intended, providing a reliable and efficient service to users on MultiversX. From 26a4ba9c0d1633574068e5e99bbdfeb32b8b1580 Mon Sep 17 00:00:00 2001 From: BiancaIalangi Date: Wed, 7 Aug 2024 10:54:53 +0300 Subject: [PATCH 4/7] add interactors page to sidebar + minor changes --- .../interactor/interactors-example.md | 2 +- .../interactor/interactors-overview.md | 0 sidebars.js | 20 ++++++++++++------ static/img/adder_snippets_gen.jpeg | Bin 30851 -> 22210 bytes 4 files changed, 15 insertions(+), 7 deletions(-) rename docs/developers/{ => meta}/interactor/interactors-example.md (97%) rename docs/developers/{ => meta}/interactor/interactors-overview.md (100%) diff --git a/docs/developers/interactor/interactors-example.md b/docs/developers/meta/interactor/interactors-example.md similarity index 97% rename from docs/developers/interactor/interactors-example.md rename to docs/developers/meta/interactor/interactors-example.md index 3efc56eaf..8c8ed8f50 100644 --- a/docs/developers/interactor/interactors-example.md +++ b/docs/developers/meta/interactor/interactors-example.md @@ -285,5 +285,5 @@ async fn test_full_farm_scenario() { } ``` -As illustrated, these tests resemble typical Rust tests but apply scenarios directly on the actual blockchain, facilitated by the [interactor tx environment](//developers/transactions/tx-env.md#interactor). These tests can be executed with `cargo test` or `sc-meta test`, seamlessly integrating into your standard testing workflow. +As illustrated, these tests resemble typical Rust tests but apply scenarios directly on the actual blockchain, facilitated by the [interactor tx environment](/developers/transactions/tx-env#interactor). These tests can be executed with `cargo test` or `sc-meta test`, seamlessly integrating into your standard testing workflow. diff --git a/docs/developers/interactor/interactors-overview.md b/docs/developers/meta/interactor/interactors-overview.md similarity index 100% rename from docs/developers/interactor/interactors-overview.md rename to docs/developers/meta/interactor/interactors-overview.md diff --git a/sidebars.js b/sidebars.js index 0fbac5854..faf41349c 100644 --- a/sidebars.js +++ b/sidebars.js @@ -30,7 +30,7 @@ const sidebars = { */ docs: { - "Welcome to MultiversX":["welcome/welcome-to-multiversx"], + "Welcome to MultiversX": ["welcome/welcome-to-multiversx"], "Learn about MultiversX": [ "learn/getting-started", "learn/multiversx-ecosystem", @@ -138,6 +138,14 @@ const sidebars = { "developers/meta/sc-build-reference", "developers/meta/sc-config", "developers/meta/sc-meta-cli", + { + type: "category", + label: "Interactors", + items: [ + "developers/meta/interactor/interactors-overview", + "developers/meta/interactor/interactors-example", + ], + }, "developers/meta/sc-allocator", "developers/meta/rust-nightly", ], @@ -498,7 +506,7 @@ const sidebars = { { type: "category", label: "Ad-Astra Bridge", - items: [ + items: [ "bridge/architecture", "bridge/transfer-flows", "bridge/multiple-chains", @@ -553,10 +561,10 @@ const sidebars = { type: "category", label: "Interoperability", items: [ - "sovereign/interoperability", - "sovereign/ethereum-l2", - "sovereign/bitcoin-l2", - "sovereign/solana-l2", + "sovereign/interoperability", + "sovereign/ethereum-l2", + "sovereign/bitcoin-l2", + "sovereign/solana-l2", ], }, "sovereign/validators", diff --git a/static/img/adder_snippets_gen.jpeg b/static/img/adder_snippets_gen.jpeg index 0cb9fa5ddbf9261e040740dff708759931a30c90..a682d0c4c830f06f1fac11428f258b7c59d39402 100644 GIT binary patch literal 22210 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 G#{L8uGM+{N literal 30851 zcmeFZWkA$hw>Ug>BaL*&3?U$0(hNfn3~hjb5<@p4p@eiRAWFx;P%@Mf(k(482+}1e zjezjS=N!*-JbK=H@Avn|hrRZy*}3*wYj3@ny!Z$pgQ#h!0WdHC0F28&zy%th48X_5 z#lywH$HT)TAiyUirXnFGA|j@vpu9rGM9;#^M9;{`$|=ah%FfTh$jB=JaFo|L5c)%e&#g2neq?J4?0fDlu1o?f$t{m zuyrPVK#tYgIJ_=&@(209C5^Goo&VPU4q@1M83C%AB5g}Nxi!?*@=M0L*X~_MwfB#5 zuzwZ2rwO`emyp2wf&N=sXVWN$dVx{Dy&YY8Rq*{EO1`%ND|ax_t|k(HeSjBD+&<3# zFvA{E-E1t~`e`R|?cR>)R}~|YTQ6Rb7mh*&uJv;DdeMwR$m`9ZLLk$sMRmBhZ zA7#~RJ^;L91gu|H-D3Cjdcc!@ctY?{!T|hBXTu(4c|RYm!p{=ldrM-fQAPJi$F8$` zf%9Nqu*Z@+-y^-a^!5F`V2_`<|1$zQ002cKMFio`q|4fO>b0Du6mLC+1IM95E1GOh z+2_dcr(?=feg^KX zI5=h1(2ZqoCWu@^-il7Kp`YXc-^cFqv+qrG;idYSbXmKkaxsyCl0E3q+;==h(#&)2 zIwpi7)T9oC(-<7COG`z6{D;h?gs2iZ{jS#9`=mCT=NAB-7^)F_bWdHgn7f#|ob8GU z!_|&EzY6^W^P_s%uU9&Db|MVKPF>+_<0EdooA-oXKNtEz|8Myp&O3JfVpSxcusrG) z3;X{|`wP08?L=oPk_kpA?_pr6>jS1y;2bq?UR zZpg-hm@)WpS|#BZmhU{4h5u=00yXLv^5vc|6%g(hU8&x*$>gw=qIq{EA1!R6EBA~v z(>pRk?*_cpSVBkm&++JHiDXly0)cr>iX}P{?j*nmHY2FinT>Eu8;aY`wiEB zmice+m#E9m*ghW_v3@R=Y&<&Y!emYgXS&bWrJ4RK`*$sN{X~2Ws{`~Xx6ZXiCT5r4 zb5TV6ivN!J{$mk3IL5=ilKWOR<%W@n2_U=Wue{&KkT-~ikKUok9+7=7{#Oow>CFW8 zrsOZYI18cszaeATjJ>@USB=>*o)d!|fWUb%&VJm-7FfSUFWf!{GfY$Xhs=NGfO0$n zF#O!^cdN^k&QWV@Bkl1B%6O=>bIvrO$`-dI)^9T!p89+xWAMRYtj|9*^1n|cXpq{J zeIMT-m+GGHEMH|-|3Sob5ldC-oA~g}f-_&-zWOTAKcxP@)s0OdvF!Gy^)gAyvLuv6rgw0wyW;(AP1)P zt-k>)K(+65{x)b;l%+Mz_|J(%afVCpBe0B|F;8%MRlb$pA04DjQNHCv~+b za%IrOwNKp-Tju)0Ld11)jqIx_UI^eqkO{B*mEjNl45D=I{Cx!fV>5q7{8c035O|WF zX&{uUX&!*<)o&?RC|58_WD(u8|4Q>onUR(Mn3VQII`iQWGg!RdUs9IU*s$606pjt^V^^{NyEw+bob7l& zTpR$_B|94c9{>pYyWC$evBq06EVS0+zYsqFT*)>~NyX?N)&Hp^18`;iPdq=-apzZw zT?Y9p@C0{biT_5S&Z@gZ{%{4er3-77|8MwzX+MC^wS^3$Px9}a|ABF+p7n~1{BAE3 zaQ?y!08skiF}zY{4Elu>ggqL`+V=Mr{)YuaRJjEJPz3zER{#KNNp_mIcbsP{eo+Jf z5R?6i#D<1o18{%EUsWKY!i?elmGCbZe1JM<)^BL67yz=M-{AiZMMd$1SFz<+Dk}!D zP}{HQOUxqx83y(*6kf70(Gk4=efzP=f`8HR9dQ+dRkSg`=C3O_1;D={wD0zmO{oBjM@cwqwg=L!C~N-mkc@5^65948C_ z@nu{8DS!i29+2IQmSz1_?#awRscSkLd4ISFbIBP`>TRe zixqU0y;G76%nBg>+iYTEU}3Wc0azbllePTCd~frPxybS{A30H*{1)>U~rm}QHi)e`gMt@ zafS@C>i;sW*kqW$@?PpA`{>#IU$y@W$WK2Mpa&t-BNmVE|NF0?$9w5+(7nrc*JN<~ zb#wiySly+pf1dpDF9dD2O(hI0m0$3eM>ywikl2$7>b0tthQE-4@F}7Ixe@=w<4G!m zg%q{PKK_G16XepO;5XO(~OVf@|?_}6jJ2lL1OPSIt1e$!nHA^;{f;8%X^*JRyP%Id!!(tt}- z^qXel)MF@Pvp)J|J>a~>RN+jBmaX`W%gaKd$U<o{|&MAmlp=#K}|640q zj}L`Vr49(qfBU<70M1)u9c#Qk5f+L6)zZ4mg9(xYFfjqx*jRWtKQv)rl4DV@2`eb- z>61~iW3yT&WLLfwag86IzqFe87?>CsHvmWcP4ec#wIvMpeb#xyPDdQ}eeeXQg9SUP zNLBXKWgpJe4>q5SQj{Two5dzWA2>v=3utxsNB6E7sM*YC(j}x36xb@+eIXdWYgFXw z(M9vAw@0-qUE~$t%)l2at9=Z<-zyu;u;=MY z>C@%#n+vf4!``Zyv&c@0GvIZSnU=`@9Y}6UN_eAr998pT2OK8yx>iW@tD`=` zlT4Tz!iqn;B;cK0@gSsu+MTG<{_cKxiaRzY?*QNQeW+8GDrQhPeUh~{kza`q71kXH zt*gGV3*Vp{5tLO)Eq%I6NiLT?j1~C>af*ItGDgC<4z=tL8WyrOzvHJ%2ij)rCb{aC z1(%?ej@Otjj85^!Xk3kp-B^uICfNxGJ@Q6bXhoi}^#>(9V6Ssxd_3ozb><9Yv%@-d@LUHq<&uhV7C2g`T?`V!*SW$%BPAEk^7wA zEZe`yyvTEXgk@I_ISMrqwwx#o^QhRi<+Q;w{5WK+D?tSxknoq6HC!0{@z^m^_hq@D@sfcJt4)(bOETjUSV~uXl@x-T?Tj4 zcsF=<|29+*&x_5u=>mYCCPLHn^yZBh)=`sPtqe$QBA9+<2rr!S>TMH!a1N`UBtf<_ z%(*W~Pe>?zR?z0Ia`_S`hAo!W1pxO>&O83r_L;N__Z{A+>`uZN8fP>DQj&Lwo6yGPK&a#n2SfMe})XV$WS^cqI1Wm#R)fD1tW zBaaA8ppJOJn{P4r1dShQtB2m}6*F38JCSjayDP&6E|Z*M7O)Dfp>g-N`_SMf?a-Ej zqoCn>q?3L5C>AC#%X9KYykv!KWo;|mEbcyG6s5`H1TF5jyOJFJftQQlgbaXzg^7)c zgO7`YM}&!ui*=dK$HpNC;9ieM>TSF+JDdkSb~sgM{oH8V)6BCF^x@3AeXj zXgRrr6s$ZFU$qUp&np{Rdvc4asM_SVj_mx$;$2>L+yHEi$dB$ud#$tBeN~h3h^s!! zWol5LeyAVWUYLP+^H{Kl-jV-?$K6`+scx?@IxnDb`Rc!k#D3t|y20D!lyLYm`TrOA zzm5`15AwwF0ua8;((?!t27y|&+33oa#6Lc^oS5h;hhwd zaXoxL_Os=NsBi*MJ@;vV`QGBABuhvza9Y)~c!WI**{Q5bi&Zys0a)y!lh4rd1{oPG ztJ2Tj@jSZoq8Ily%Tbxc^o+1}AA7k;0zK7|Ahs*Ar_V7Ps9iVt(pg@eqUwRMU81c% zAIX@OzIQswnx3wR#9Z)crE)JpsXik@%D{<3Th`pYRILXL*l6quKproM8^`G*UsJq< z*>!7GGkM*O7)g%xzkRyH!PD;b6a;6k8QUY5o^?j>vaug=1Y#Yzc3|;?Drr>KuQNQ- ziK|+YyyoeR;W{h7(?zXSFiPb)UJO&)5JDS0^~hDqXhfpk`E0lM%8@Pcl7OnwuA`jE z1D_(f+E%|dIJ>?(zs*IFwm)DicB5>=Z<&0;ZoHu71ufGg(&oOQ$>*AeQQa|U7CCv% zkshd`zP@tA*?F;xu*dK??iFGFGt(G-56r8?DO{XiaE!4&*MO4W7gI}o>;?*oIzmX^ zVq1`JbBx29wQhVl%LOFIE3(GCy=wbPxnDnBD%%+)%}SHpDh9fH_W}^sw0y*Sx^t^s z&OCmSq(JoQ`Y;Vgpnh_ouk5=U+zRLEEr(JU0Bw`3MBvwtkDSL#&bOt-_xFb{07LbA z9CX5{#?)5^@I0h_bQBl+(x+8oYgLXl(EeRK6qo=qezioyQ(WHpA^O`Qm06u;;!M7E z%XIum;z@r_eDV%!3X$7WUDHVvC9CcnN8Zo2?ng@@bUq+u%(D0b?2X3U2FLB+YT ziSyg+)i|}106f8*_!?IBw*wBmq|TO>rxt;XS~guL+y$Q6#Q_!_KtI*}s5-%iJ4Xvi z&(_CI++Fi*Cf%7dBm&U(upXJOh2g~dAbmvIVe-D2gAiG~o|)|gcdx`piP_mtMr~y) z8{o6Izek#Hk8yV6|H5p)49P;3S*$%_ZiFwaNcw9Qrx&^1^pPAM`q0)$>6^J*y@ z>#&4b_d@US&NL(k2OwJ~Q1#~2jPo}Us)nWpPi&NWmB^Cq596RN40Ry^w}MXm4;8S^&saZ8zexib z3Mn1qEic}9kRpO2;=7|19wB3eOtU|z=BnSLTGWsr$!7yLS6~D_1p1~|s#$6&JS#}o zAJfxIAv%hBVd3@`k_6XaUsza-L-IX*7C8S^{pq#$PgRmv zYRI{%k`LT+>JM(JACb2+o0KfO!I(XPEva0FNsqc^}HUa;rQ@A(?)_ zRrAeviApp1rIaw#r)KKg_JP|+*))aG(X<@;G)Fb;3xE`yzSLu*nQtMVLsacLwfsx^ za&=ekfmeChg$WGylRhj?BKZo?U6Nbgdf~}q$;oVQJvR0*H4Z7Ryrz5Tx9JWtjV(jF z-OTU6DcFBpaPAj2yVx8TM)&TsHU)?Af|v+V4@U_c1Ejco_xwsMNg2HDY3b%4z1jtO zZsb#oP->@tvSg!Y#IISLYdMbTB;cIMNLtE%tz};{RjO`2luT$umP4q^<*2#?F0z?H zvVE=C94Qdbi=W}F%A468(|ONyYQ}SU3GW^gLsR2AtBLVPQcX{Z8ESni!0UBr~`fuu9fn$4`R8jkIP0m`*VyKik{_s7G)U9dSUI{jCEuco=jxSiE9G0;(sz?D}kHIV$)PN`S2v!kF8se9%fgwSfBySn4;1Qf4Ao`yZG{~F5AW(7V=HaapI#vnzZIN z_eshOPM6Q=*9Bw>Lk#%DEJfcbmjE=fkr)GVJdQe!-R5vq=!phrb(CtBqDZe#qYh#M zpi~N2gL_YEcwRBfuBJzER11ZglCF=IdZT+-xI0BnJnc{g3#tK}B?iVoi7Adi>C;nz zCv-HTh6N4>YioH(3~)-$hUtwe3er>33xL;kQZp(ecFhWBUGxG1X}V*>qRSJa;w=0^(WZT;g=bgT|Ku* z2M^;7&0-1inp*RHcnd66&aVZ>z4y0;@unaFsV$UjWfvV)(n2z#hqMgs} zr6mL&Y1h{d3JN1~K8u?P6p>n6e7*ow&V4KU!%POUGLU(po5@~=3rCFG=7w`&hY=8R zXw(w9tRBxx#k?#ueJCnLV0OTE*t>0{jkNS9GN%T*0{88pdc9^|HxCz#a#3e#SSJox zldIpvtU|zrt05%KM&+k2ci`Pi#N!#6( zZM-XImNiVp9wuQ~HTkb;EG-^$c#=0A9w#07Sjo{N_Zb@^l_rCt@We{9q#8rRw_ML$ zg`cvlrKgRH=O4IJ<*(C@2!5Xkig!PyGeLGYtMN@Rj+8?&<=Jald{6(TxT zDZ=>@%*q<@OsnY>8=^SBq;p(8&I>@2V^c;3tp(=;$nFX>P;s}{$q_nV`yq1v#?t0B zq72X2Kx(VIa)r6k4V@LSRaV2r7B~}?4-D@Nufc4Kg{xkV^Nb}=t=`hxB-jR!JMGo* z-JWPuMX84icwk_1$Hx1#;)AsHsK8`prf1!eIYP;a zOk(C+*S2I~qBL)b$xeF41>l=cF9jbta~gXZ&UF(_qvTek4eMOWwoX@&e18Coa(^}G z`Ehlvom;lJg+AnooeHMMk=qhZndAik^}|drwG{OfbYD@sm4q7c;q_)AX56}7QW4$l zHu1jM+q;(1p2Gebt#yM@nR5KD!3IUKyLlSPEJE3Pq>;_2j`fowBS9NA;<4?jcz+D= zxd7*VjrUz|;0JL;t{vhf;t6cdE&j!>@YFFR5HU@b*RXetzXb5z z-MC|HZ&iV)vH@OCcDe~sXquRJFq=U}#=4Y^vm^M6+pDr|*zh4@{$Sc8msa~E1ISH* zYi9H_n})Lq4K=fe&1~b-A!%lzDHUwW?M#(M{V2a_ikYvGu6Y?@Bk{>|lYr)Csy72Bxk3f3 zS_ay@8@#-b(9@2$H9%Nz4Eb`sZejtXg@}fb@bFO$=xc0=1-`bDscSVuJ_Z{Quc^f; zpw6#YTvc37?mbF1R>Q85)sDx#vCQX%q+N8ZsiGImLMqRJ03Y=gJ3mlqkamb4`rrT=fdq@-O8`j zcHL~VRE10Ak#HtzeAn+oHz$lA@N}JPZM4wn@n-EIGBDtC_$wyUlM-qPn~i6!O6Kk* z;1P*s2WFmBx-!GN&0>dn>uxT3@kj#c)+aovGrB}p83t+KXIyXn5f3oqk!hRK9&uo6UBlfLkHQ?6$|K*%<-Bd)K^lULKyc5m)A22 znzousU?sLUnV0;T;hv3C`PI%eDaf7aH6@Cma(Gbls~^_uhqD*Rn|;S3U%?xF<{j7k zUhL1qThyX?%5FWqE=L8mjdsw3K&2?pr51H8F;|GWc6mYcj*_bp11kPr><0=(i}4-&!2 z884aP(sBu4DlEX;#y$W1Y5bb%xzLU;5mn>2W4Nk$Dh?z-+Toc6v)EfsCim52ZUYU) zME8So!W%v)_L;mCKXu)11&-XkZtRz}Kr_j$^q> zwm?l<{$WOb*l6BkPUe6U=g0#8OwF>_xWqnNquF&P!O8z``)PoJ#(|obyiAEkJqMU153Eec07$27_^aRlotTuPW|)L(HjSy*Td{mmo`G_ z9*gz^)|Ez*Ni_9fy-z-at|l*A3Ml*YUcEMA?s!XDG$eQMXudW=qH*W8cR8}hWwa?y zU++D`5jFfPscgXC;;5YWX%#+`j)mrb|Ke)=@^=ZU({F=!V{ z;K<13094zFJY}TWmA%+)G3S=RD3hd&4sClM)^9=jVC$i*8m&d1@%3N?%y>*8GU)1^ntb2~&g4gymi3%- zPPZi09G*PO8T)99=NFb~e3N7-q$ywdPG;zF;Q7ttZa1ol`zkk?94OG{q-+U!!`nj;ShcfG8A&7Baem#ARk%-*bcu zo*6AyUK7?y?IEpL3KfvRw%3q2j24Z~v8mJ#Hc!zQ!Elp=+ndO?7+nD7qNhx48*h7A zd-c+dBy;Fh>M_1Mo_B^B{pqV8h^FU7ifI%Ndw34a@R-!ikOjsvd+NSfEUC#aDnh@x zJYhgd=^!fb71fYbvYYz)KDFLBEi`zqojy?*YH%icbM75@I*(pCyTN<#?T_+YIeCht zT`Lhok(QMqUgiRjLYO9=|K3Y-P;M;OJRNVG8C>1-D!1pMs7=F|^`@@|1FQGTx^J_u z{tT#@&0s>T+{z!RnTC@3y3ipg#q=XeGJs+5DSdtL7T)I$HB5@hr&J$8oz%B409(sh zdU-2^>6Tq=01_w3GJNpr;-~fpaoRl!?=O3?Aub7vVw zHT0TRBxdkAP_BI8c*&?Qg0QFR0-@;E3P(qfKv%ml3)xSCLgyOR`US8YBeN9p zumkZtv4(e|34x+9ua9@ziPQT_8|hKpWnRR` zRNy+N-w`CPKGFH=-IH)dRu-s+eS+zG*t5WI3|@%HgI?_7I-(XoSfN&z?h@#Vdi zjl@^H@n&5$atHIR={E|+3k**!!8U=WtnM5s7l7B)B7r?Hs@r!30z3K@&Jm!OJ3SYG z+UQNX_2gcv;~1ceKfO5ymLB|O=Zw@9FOcJF-L+P1yCU9zsnE`hTfGoRpl zD+p>j{hJ$FyGBa2jzS9hNLG1WA0% z`K6wx(c>a8M5=4^uC=eJrK>mE6WAYw%6_C*WCh^4U|B|{7{PBI&OSdf zTZD&=c;t(NIfE;hR;i+UjIy)gEve@4d(aFZp@!TchqD(5)sO-olhR8rj1&h~5a?Er zG{VgHFO!T{dgTKD3CPwvT$3+`_hyh2Miw0KnBp#dL0Vblp z&YcCXmMyRAJx>zmy|20{JM^f9vSuzkkxF8N()0-({j9GdzV4IrPa1u`Mv>KRrAAzI z6F6__nC-94t-L%tCbpHW=H2Q_qk!5PSYH4{PkiR;j(1Muh_QA-j{LNNz})93+?lQ+D?16AD*^c%OiDnudu?2%+}zbK8}?dNpX84_h8X zLn6EsZh7=oT1tsJV~X#j$IgZsZGKD{S@prIQq1|&#!FL^ZRwaV#k=D;LNKmTYQl+B z$eSVWnJd1hI|QH5li3AvYBAa&(|FHz6E$Ce8Y7x3SQri2gsfk5s}`yQJfeQ2KM1U9>LXHReOhGuQYHX!eT9&NCOTVod^HX~i)Br*j`AOH$g2 zf>WHHixjDBE%Y(=<0;IgsF))HEXuw8HR@HXt~e&q?!i=*JHe}L++7ciD{I*n!+`qh za{Q`JAS_4Oky#}?><>iPr1LIb9Soux#kL1SGjS|ywT7FDv89d_RL%?9wTBA{X-mz| zwegCg({*Y&xFzqKaIqO3&Z2i`79KH?GYuxB)4-p7u1WYP7Q7KTSHN=oP=7hgc=m}{ zSiUCIl8s9m;)LfN$M`UH)ZZ^RC4Q22^EfZ#)`w%{1apygJVWBf0#I3rw6(3R2VDGG zy+pl81j8KElys^b%=`u1p(d~2PmyA9`50=IX>ZQbG11eVqy6|c^+^YtQ1(bsv_lkK zfYp+86mZ$+6G^Qs{1ckGzTRB8*R~i`&Xq~>xa_KR3cNAV=SsU(b{g=?YOktx8qMQ& zmvHLwl79Jz6R39+jKZ+wr+dUx2}Tgc2awcuK|;lnoZuA6^vqXlWar@ z`i0@Pd)u~b89aJVvX+(~ViQaU&(^8wnz}Nc9M|@xLvf}s&4#@MRB#!_jl3A?GBS3< zsS)4C+WshPfi&RrTq8E^~KHbs+GN?t=jeQ!VtS?l3U0IHzW4WtgN#cpPs&RC>!sP>WG7Aww+NmoVoV9$)YQ zu1cg78fi!pabsgtt*9)vp}|V>4qJfP%i476b9~zQK;s|IBNuK{|NTKIXbYiDuT)lj zrL6UQ_*Hl8wokcUW{!r_V1X8pV3WPqdE-s&1prejR=p=7S34~uyR&eNRyY3R%{(sp z{h$!=2pIRUhBuAtY*?>6bX?i_t@oho#5S`&bUUBnYqQa693x-u#)E0ct|HTf$mF8? ze4ar)YFQF{+V5UR@I32O%7@ljek@xgmEW33b%CUX_GUxf!ZfEk!4Y_tZ2%fORcEF;; z=O?CwL}R8XLQ+fHf;+k9Tb^e4VC+N*xlXk6-6oMHZI~ZpdUDT}ft_n?N{`2_4fGvB zna-mX$puuxRE*+Hw~KLGRnr9Yr4Y`pH14M^ zSl7~+m9cj=o6+TRJ^CW!eOGkp$ZgZLKv=kbzeo8%WSRzhr;=9ojrZJZ$_DX*;pD!Q z2P6IWKeN*G#CjqvIy2QRS3WQHy@2<|F59_|PG_W17z9}R3Pj<=lwV$$uBb*F!2SpU zc5Tj@#_G0Vh(UxHz0|ANE2X>j;*%@6$5zd^+-kWhQVr;dtq)w;YY$A-kCNJ7Jk*K4 zQA+PzId=l-wBR&20oP8IpC3xIohR$ETmTqX2ctdwM&p+G*G9q684FSDZ1!b!&DR+3 znCOv}sjoPdb+!^)p{RCfHE`b~M)ulV-(mPekpqwH_1IxQd17RZ;S*B2OcRJWCq;Ge z_beodiU)@tAf5z_wRj*L@3t&m(QzvqYPk*{O(W7$GgS15&xO~1%S6sa=YkkF#9Y^; zOrUgHFpkT+%c}LNHy=hM-H$Ab-i@Eo+C|>AcU^OjTo#{fNS0mnCwVuad)9O{>gi^# zz#t;4o+dpC&##Nfa_bX7cgsnA?#a$<(oiTvk)6|lK`LrZLt6C%tvoHq=XRD2NZ|!w zrt6C{6I)w?ex6P5b6iHZ%t`1pblMX)#j>)NRC&I`R;Ics99Xd-kgVZn=bHL_O1p4S zqPF7PHTJ1tZW^$segrrWFY8%;0l=c$pX0H<4BvJkU(NoS7jUsw3aP02l4RYEB5{pQ zcYS?r>QloswIVV37e@wMC2P0hODxE|SYxpl#H|qRPI+jGYVJJzRO#v$RVS}6{~eHp zKo?cy2en7Q9?>2qXXf>Cy25W*1RzI=+D;$GsJ?8uM_OYlKz6wG@X4Vj)>tdE- z%kRm>z(u8B-*EwHCyA)0+f7K2k!1n>DbFC`f;s-u9jRexh*%s2&enVzKGKjOM@mgA z%3#L3%s`s5;qZ_2p5K;EFn>>hriHhmD58Zddq%NNGHHbQGGHT0QO@t|gDBY1d%Tb_ zkBei}cfV|h#`ktuI?x;OQ>9!XQ@n~?Ia#rS3m6sxJE2GoJ0OHIkPOh=bewyS@bGqY z-PqKIO(>tfV>Tb)C`JMOA#4+dTNFE-z&>_#b2D}D@pj`Mo-3u)`>K6+=1j>PDWkID z`;d_XUp7%@+RCcJMzTjrH08CZvaX~2v< z?I$193Q4In5~U|tvuc^>DKZIIi7WuReW9D#xxBWnH|eM7wACy*P%ADkUG@eIZT;1Ol}rpz3CM|qHvbM?UH#Q-^#-r_Jh9e)%TK4In2`i#rWBBxC!d78UyCp+7bopaq7 zZYC_D9J&=~8-K0$I8?LW^Y~S9eUm74n{QRYO&etco!buPX#Zn#|3w~KNXboRqxbJQ zr8MEZF(=hupZjbzH`7U%7-u}&pynM@fo;5FU-z}gSMg+-mN5^ge^iO}r2Uy`NOt1p zz{(1nq-k{RLh);RrI8e7b0U+6vH|!03=?GI`CN*qgb+q3V=gWYKgg(4ZxmWH@H6?T zMetiLl|&65H{B$*aZ7#o$5ID)4bKMhTk_XIs3C<(OrPgA>HUO(;I$G+U`Yr|fXxR& z86Y3QB+(vYr83fBem~uTg7bdx^qf0#D0ijknnnffij-AU2GI4o{9RiggJiSO!O(^v zrNqSiWW)^IhS_-jgCmGmeawrq8>XfTA7?%E$tJpw)m^MK*A;pw**)GXYNl!*Wgfp| z3&IC$b}JesSzQ76zhy9w6+t>&8$N%TeFN%AW*d|W5)jENiXyL@iIsuR%|!+%^Vqy; zzFF8-DkEY&>EK*u=$TJwl!Bct1FxUStYtVE{MnWGk)`$htxHkv@JBqG_~^E+=sh5{ z*En|!o3R<*d&|K4Q%maJvc^R^!<@DE47jNtA0*gF9Nbb53})=&Sb9Wo5_uhALZwxKiMXuZqk=2 zV$P@sGU^vMYr;$(O&r{GD!-vqV#@iYZo5;rP+3*U#SLn7Lbj-yB6iBAvG=*Hb+Sl3 zibmI%;(qExykE&lGPnmjArsHb4>f)|%4_+8^qZ!8niH$c0jh1RC zdhaSmzbNB0Ixpcp-}Om)*OTx8{-!%5j`Wq{( zO@&E6%Bm|eNa03=WKV_7!=!4I(1HQuH6%!b-YJp)fs<>BqLCva&s9Jc?`*vlZLWEF zW3LoWmTe_x`D1q_f(*EnW5~af3d-s!3nWzuI>DEf#->NAdGj?S2yxpP`6S-cyuClj zN^X_)IMf{NsFr*t#hb)5F1|}LQrSf`aL|E7(X~@CM2W`}plWI6VmZca+MnB2oMgmn zaNQyK+~st&4>c~ArZrt!jWyM0*#SssH-Ud{y>0_1_m_N*WVIs%YQUON4yVTpqP6qA zD$llyYvY}0BQFVgk|B>=ZAUP~YZlNu?S9d9NzoH525tnLr5KIJTW!>Y(TKbk z!@{$bAJ`;DaNDLf3I7PjHcx&ommVpH-pam`6BUA@1{v%al^iDDI?33|F>WHD6-@mb?lBU<(Hi?|3t`X2%H zyV$&0rJTtzPioqF2#62swzV`HqsqX(+A;fcgIJyKJMW$_tk*ULZ9a^v^6-4xxYbzR zSUwjr-DcSuip>;)tUUTk70N!HXyEGV>JVr2mnSb%^NovTZM(L{^HK3eQ%#vs=L2#a zC4rNd1%A!@Sutnt&3orQyN<)lKkr(LL5H8Sfy&Iu6=6{|!)0AMCA-awjybeX6 ze8`iV*|I5A)o;N=QJ>VNW5RpK9K>m&L34 zUmGa2#?b(ZFHF>WX`8fh(s zck~{SXezQbmbbaU{fVyF@>Xyd__@5K=g_cwTxFQdX~JW0U%z5WP>1`T#&~~+ZhqLa zI4#?}VaqUdO?=9fgnZkl*0o_iISIp2sftB%6P3#+@x1vpLD=rJu&wz>bqy4KldTo@ zWP&l|`Ind}zt?M!*o071mS!VlnmaQ8&CPehv>nqB@9+3%y)pfK@Feg zA;muxHCET2@35e{8UM`Te-%NG**XZM@58zai>ON3AUN1xjMEjxx3^_?ln^#r8Qg}) zQmNJ}Mvuk~MtVox1E)Dn66P#Fcf$IUQ$|3({z8}?^6sJgO})As&(ZNsv-a>>fkVl3 z5pB{(Vi6Q1_Jv&144$13Xv>XiLEO{brjIV|W;GTAQf4@yX0cw!jr#&!@yXQr_bV8J zWP%o*FuUA@({K%*XvYwS+)5MTGuWFMi&s0puUN4-I8&Fgm}mAuy3rz>JA-qS1t(4+k&5_>!-ae?|E<# z;VRTdR0oASB+3_|wzeuIV={PS_UlFJifan$x*@kVp4M*+y)1!SC@x1(q}>%!O>=tPR&<&*H|b8&$;h6pee7(#hoGWg7qO|9+5nNW8+ zh;Xu{91MR9gSk}J(XzUTqqbTso-39P@uj`Uzb>ZcDxgzux00H3ml@0Qpr+!ZHx_)5 z-Dvj^+BXiaaM0vZ#zqcgGGZuvZZz+9wOGiy9S zTEvvJC*6D`td=$E_Cw6p)44jzN5dcFv-*>5&Iai7#ia>T7)nOVW*|DbH6Pt+SA<(8 zPbU8GMtnuiZ`)gVgU0W{=wleCy6`4^EixS4_0NQFmrI!^PHF;Ua7Fy;63kCZb5DB~ zbZ>BL!R+32_l@C_olPX>dul?VDY+rR^|Xs~4-6Ldu77}76V%(Paw8rWYX*dPLa)w*iBT^NTdoJ$e8Q59 z(&uwqFY%Br+8i>%33&q#n(nh{38liaDshxMR|@3HXH1} zGd@oyZ%*IzHUG9PjYNGr*NH{!0jFvheFm{n!egSxKs>1PV%vwv{j~b>yw0kz)sW); zera=v5*VzLPof;qA{n^fDh4MWE#4o~Gu5*bKFFgM7w2i&shFQ7m5<08lD(^oA z!yoKgPCN}5AXYDs@^>m1YtGL+0`#dhJg1@($feT3xO|CFOy|1+tXFKd<}2sudW~$= z%q(PwRqd67hfEOSdFSP>uGX<$909UE@V^El*gRArI~0mS)B{19BSslshPS58FB9Hz z(@UfTpvy-eGKmk;9_B>qSQd^kX&AW9DNRszfo0I0ll>{_j22V0qIw`m3KtZsT-5-g z00v;KlD~6(7Yicx2(UoVkD}_yu{JiX+cu~Sjl5aONXmSs&wQfQGLmVZGg(9$bY~&u z%RmK91f1Ikb7L7C~3Hk!LsycLd0W!_>7*cf7ioBM?;5w zdwI2|PqQX&BX0l|aOy@9(FB*yN@Ipe<`H`0&(|0~Lg61}_cwWKlZ5;mOr488*i{Q* zeSpcy(*XY;PG&Owsc^0oxTL07)Q+%WNd7g^soFbsnfirBC9fx3ucgz3@_0(4fX#?q znKS$qDHd*MpR$ldSiAbVlN>fsN;s{Ho;8%s#UNpmD{5 zK+EUo=9B?@E-QnPXtm;KT8r0ay>Xe=(+hKk3z-Sog#3_9e<5KlmA5`yo_=F_yF9K= ztb3DD3DJE?c|$ykHfaLy;^f%$S?-%78*5PSK9gFLsa;X`C>k}(*Bx-3ENP%n@#q3U zG(Kh;Gh`zDS%~%B7}H-kWAnEIIgPIAs@k z`G03YHa&%^sWQkugmfR`;9Rk)1jQ-#de~ntv*~h3T&<=l^jpTpRFF2fqqtb}zE;*F zawcE3CnEexr6!x=vmU)~kP84TUqYOLf#l19nw-^Z`k3c#en|#C`IR70Y;Hivo6!c< zqrC{4%cuL=x!0dIK#>M_Wee$TF(awUOECmMoiiOw`Nj5Sk)Xy&mEa zii|6duQXF@y@eswBRbSf1L~ge-l5{O!^UX8OzSXYEM&ZVCBXgSnJ`F2C^)|wS4$dJ*H5p<6fDat1`=v-1+>(El$;~+NXnp#ysB-g!U>?M(aT3q8@O-D zEMz`Ij3J^9@RN+voU^jur^YX&5@65i$+pZ<`F&6e7KW}TN{5eyOx=21GQdf}pQX+g zscM_8l!>;hl72!D5nF@Q$a?8<5OP64GKo$BcmJIFU++hSNhyQ73lME!9_=*C%C{xF5RlH`eR!kWz(Ez2tx;E3hw2oWTU#zXkN3(rVEKQoop(@E zZ{OwtL8KQc(mN8G(gFmq&_gFw1Bz57kWfRF-jPrPNN=G82m%tSH0e^5-a#o!6O<;> z+&s_w{NA12*?)F+|H_%koSBo!$+_?Ax<1!8-8k@7A_XO@8q*zbb}!sauI;B+7Jje0aVh)Yf1&{}3RNAnACaWNzlF~lU5Yk@ z3DSVB@F2BJ;KMiLB#Lw`JPER>?tiMJR7v+pi9XUIQAiR|idXn8K?XaOC;$0mQaaX1 zRqf}*ZZ(Rl19bI*hOdCNnV%z>L@y#buji^HC?XdjlosN|t^U4$0_39TADY+bJ=bQ6 zEj?XOo^_-TDipk+=oEL@Pp;+ zFHw;SyK3d+o0n5NNdU1Rd-KTfDyyZGCV!Q=vTs^m@>*Hh>Vtb_fqF|;K8`M;!x9Wr*)C#P|@UU5-itBU5aixqnURuw4DC2y*8mrZ|8uI)GTOHi#Rn!eRNg23l@?RpS z)Us15gNw!d^WdX|tGv68*q>{V1>2^T*ch(l#t&!{Bq_#^O61bAWPDfFHAPp^T-IPw zv0*S1a6+R7d8|$JYaQ_w!74wXJryS{9mzfo5%+PC0I?;PF@M96nA!VZ%#g-EW~$yc(zJ;X#%UqRXzMvzr^Z&?Z_d^MS7U*|4(V69xd{s&q_3n4 zTi(KsHiEP(CXiO1Zo?rf>w}Xn4GRV@$D&=6=Q11`yKh186*zN_8*ahUa-Jxb6ln3x zh9X;hI3wdBy%}aMqKo^d=FECLjd`4E*|&2)EUU4k0_=8FdSdgoyL(ekYYc~7m`TF> zSipRCirj)Iw&T=^7zM+g!t*FWsi5`) z7rILS!>&rlgw@RLx~gKaxIGEliGeg0jr znNs)lYRZk@abK4aceYuY4BlGs5fI?r1q35IAw&ThL55h2IAi}`G}?Lne{C~EL{lvD zR4e$AiigA7EX}Nxh1^q&p$C&53orIDNITccN%lC(;JHIgD2d?R(qh8a$(mLNV#ZC)j+GwR$)Xj(A0+i`fMy>|_ zG3=QX8s0QCOqE~&+72f*2Z3QoS3lc?pF3rtd*+jODi?2K1v)P2mJ=3PvinpJ*vMk5 zVKORJUqO$~wxJXel*K!5g;bMDX~gc()duF-$_H1vu>Kd@?2Yl4u~TvUOm|+3H!Q+2 z;f(N#C9fu0BCExO>8$Pf;wTce5tiM(Dz#m;=X||xV}FU}AFwKDX-&-;ua&iBt(%k$ zJ%ZYw1RUE$msA8QQXMJy@(rQ#?KiQ~pA$b*E~cVkWGu$y`UCqZE>~wGijsMmMMG*W zQCZBUA~(Ov&gK@H68)>fsEWJv`}&k?5<6bP-=0-631g&Zdb8OMy>~HSbZTSk?yE4` z!nao$|J<}&V!O3Jda)L4kQdf69rUz^XJbFd5T;~y`H4HvC^@uQdl9qSB;EIHNMfH*wruZ^lQX;A72(~V)NVFsM)OT)J+5lsyb(f zBj>fd@THXDkmu@HiTJ3WddOH?5!Z8G!3ugw$y+>0Z8Y94B!Y-VWy>nk$qAPFFoM&jmJ46i({(;UeVH~nq@KRe0}xlFdC+$=KK&J8GQuh z`d~RyV@QOT48S3H#QUrLeIC1McG(NRs7+FW$NRh@pGgI%q_j#16nnywIPdEb?nCj8hrY|x6qDIQH^mBbFM1mh^ z82nCX=0odmLJfgA(3MDF(Z!0n8hdcH8*_VX12fq?k)_oe-X8-6%HDCzYyBq0(ZhI6TcIW^t=!^b z`efjGt64%OrM?U%-W6Ppi=%n3x@cKPTDW-7Ou&dJ%e_};^x^uzz1i0=%Ubh>3c-j^ zNNOj}HmI-4So{)zGFZK@`D3^~I$iQBv>DoKefYhHvA}UZ53uzzywNseS>ShrIDtfv zN<*7XQZj)BKcd0PmjhB6U=`WhK_lBX-6O^-0uzSUxdm$n{~`1=`SpUS(Sr%?wB=#7 z4+nTKa(pT#q~V-KlP>;^_-6OsINFavZXNYaEQnI>V9TdM-`?Esb@-%<)$uMh1g2vj zTnAsQ;ht2?3j4I?;s*m}$jtv057u&bN4IK>>UGhNo7tG(E);J}t(9=A*0{QS<$emU zdHCeDg^!2n8Sccj6{?k;cZ#nLu3J-F(<^rx4X{o}COufo^Dw_bSQQNxX~qQJfl~}# zY;pc2;!mM2L?&-4BY}Q-4?N*}oPoazT+j=lm7|XR0wzB8FY{BRMYx>%~tOqyUsTLaN7zmi)%I-W^WhSA_Xjc(a`&qU1p> zY(hxFl-(hi5_ivCbtRkXJrd_(O>zQ}#ueWDQ7y_$JP!Xdzl5p+UoSIkMR}5JT zpua@r0UM`*Hkzon!8Yv!!Q9Vqj`iQ7Uf%2@M7XQMQCqX6(0hb9_iFAlj{P`~wXq5w zvSIO1t0S>Ah-N{_#^gF^W@X{@YY3M$5MNiMK}NVPS2OtA4HFktNGTs!rvuC1b)g(Z zsRJoaWvn4ZC1L*y0@P$&r#sdXG#)3Uu8%5&x^(g^vRd^|Ie|Zw71x2djCy9W%A6pi zzUvLjcb*E$%{j$R;F6R3Y zccmQyZrZxC3dvpDi+)+LSC$3ga3_4v@(el`!xjUYZK1y9h`Owau6 zar8U=C^MLHzzrD=sD0xc@h$x>O65KR;MBtmW^0wx@N};IVlGYS!^FBWQ8kq<&p!B} z*25-$UklL!iU6@8k}Ul7-(b?_XG$Exn(E|hm2M2PVPuj$=ZBeoQ>DS=eXMaHFl<9e zV1bx3B=Gn9thV}iL#^euzeGc)4#?BaBOezFI;u6yHO$Tna=0$LkZ4U)DiXt4_>^Te zq+Y%@nHEB z$@p|Bdq6#-cHNp^pvFN^U8)rgMv20>jLl*dqKF+Dm=uuoXw!yyRQb z!hk3&tCi1+S7K!Y=}{-LhZt|O(udRCbRG5kQC#Ts$UU+@iIzn(*q`V6a&e5Z zkAAqd%xoDSnX+R39lbvumGzr1kRc38`Bdy8=C2Y!k6<)y<9N^1W0XwkgN1n))x<)ka9@(1ur&|0 zs?CoXkFPj!pFD3=58jjAfkL|1+-g;JSb&?c%&o4$uXm2k2#oo|U^{E)8r(BaVzjkK;#3b5Uz$X)R6q}K69CLk&kHZV=%;jE?l0|FY!*P_K<&Y)A6Xh%m_lH zG@(enG;{KYl3{p%FkeU;k>NHXNDSn@uwx z^|3H}8i|(_TZY62-Sv#XSo*plDCF1Us5k4j`D{7}l!5suqW8{tUe zeDoS=4{PRm4}WFCIoP5D+jZYL6opu+wh2DN5x^w) zSh516BzzzY*#B(gb9U*A+mK}TEc2Hc$@Il6^_~=W@!B}z4q(br6sqdcOWdA64R~Ymm+z3sgR@ss6YsF}3{X}xW z9fQL&RT1ozzeM&)T=SmLgb!3n%C(CxIZcaQ$yeiQF_UFVjP{~VYMR4@U~2uk-cdN{ zfh<^hU82mf#EQy-{C4B|0Z+)qe-ffTS_xqZ2|1B%N(h^ZOWVqqr&io|?3F>-LM7&g ze$mF>9qj``f!rS0S5{|eRcR}daoDZ;Id6#5ZU4|QfOT8=d6Lc#m7E$X6$Hv>BDIE< zYx&Hj#FA04Q_o&j!?S)ur%lAgC23x?ll$V?@*HaXJq07P?v=>v<257Gia6LdCCMh} zZ42j~r2HZib#~=$x;DSN9qyKxo}9ekxMhG8!t z1@6{NVIJ_)j!Wj{SbuIRS#2}rZX4K}tPj7ksWX`{b5Aq}Y@1bP1Uz0@9KLFmvlF~? zAg^*e+>GIy5AD(%m5qH*7K^|uZq&B%#ykCj9R7hS(Cupk`xIkIxBQg6JWKoA<@jax zrzAC3z?X*B;~bb}QBrIAz}OxUwWP)v>zzeNDC9>F|3!{hqYMpgc))`aVC9j%^jLjw z5qNUzlSNj08lOB?-_yhKpR~NUymx|BtFp3U*zH9;`1Jf2(8Loraa|odms0miUV3K+ z>@+&P=Fa_=KXPa#YBJ05r)iF+iS*ZM9ilw>m4&eN zW`S3_TMKF6oO#%vdRYsuhZW!#V~`MkHH&P?TkG)V!w;TQ?{O1y?9`>?j7|eqhJuy~ ziM4JBtrVUMPAAUJyVA!vNO?b$fcrOb*^u(`$v;qj)a3vBi?^>qg$$sT_C=C$0UMc4 zBKu^`K+2TQ%Iwm!#RP9R-O~0<7dIt{TTKA}=L=XOIKDu^rTuajwI|WTw3jdDpZD=8 zcX6EiqPA7qum**WtE6{YAmM8|_;T+>>w_?9rqa!&-cfUF(;ZJ~s|j;ObWYB-z`&4N zi80q!egG#*fJy2Ss5JAuje9D z6~cnXdg8wN&r=FCIGc&LS;MONsX7MTR44uo_X^J}-LUgeAB3BEesHN5)9X&)f^hFb zn^iSu$;~%%sQkW;q4*V2r?%%+gkawmnA)MZrYWYCZjbe%0mXrSyfv<3qEF}1zx zRRxU*V2b#-_Prn|wt4;4i@!u$(cr&CVGjjte*7nVXQC{XR2K%IO4MGzjB3KnYp(cQ zE9FY17R$*hV`(MORYor{LA^&8b=fZN7Tg+2m6G7cL;&siyIJI@9~)b3|L}EeiW*Pv z7pbS}Vb#+JYze{;f`kKEUGRY2M-(B}B9WBS;y z7`YHBBH9=&BwTrcESyuc@!gMK2jr)<@l(xgh)g=*rh_S<63)+w5qHsbpt3BxSeRKB z486Zeo0Q@8&7wj>cSOD7X;6mYtgQyG@b4u=U0r*;!P#h5K*P6JxgTr?k@FCABNIB6 zDP45C?(6egGVFTR-Qzz%kGWd!y`cLuD=_Bjaaw9=ZXNOF-104d5zbZ9RoN15Zc?s8*7l=Q z%yU3%;)`zeAk$ukF@%)v)KL>GTI03^mnHPowGzm0rs3LrT zW>R=64dg09D=HhuLZu)!yFkhbEk8 z6~F4yk6g&jjRPa~%6HK;LNAn$lS5Es&J-1$xhuwAB5s-VZkHpvV#RGHmEzAY0N9Di7C zl81;aP_&r(w@!4CHMfLe7ENR+Q_(Gs61;$ks?|Vinz0W(UhzK9DKi z=t!I>i@<4E<3Mba76jcwmjc(R zCGsT#-srMTOqH>I>71}^gf1j4)pe${ywUr*zTQe1%?G ze}+w;D60_Hovh!Rn z_j7hi%2iE@fF!d-HV%pMeezOznb2X>)HlJNvZ0r9Sb(-Ov3C0)$pyi3q;@h$-lg}_ z2QxwIIm@wNi6;OL-Yxy(R63=zXJvU{4`-qOrwdT zsM4m8&?Ayt`@G?F)GAr9gV`v!2~&0~Z%lG>KFJah9@j+k%XphgX6mb?V0;R7bDreQ zMIFk4I1<9h7QmnIDxENCY5)u-+q)e^Oc>rM@TPfg(Zwz<>mEpE(b1l_`D;s;JXe53YAj48Of1_B8jZE ztMfgSxG6Jr{X2tyiL^>r8f1zd+H{7HD&-^}w>id`C{(y;whGrjD$m2IMUSy8T?jo%o@tMhig&4kx`cGB4sJYePn zkBeQ|3{JkTJ#hej=GCVwb{qn(P`QbCj+GZmCFn(19sVr($0xRM6?QpodDS<^%|Vtz z11Y7@rsgloigpp>JFq{5a*V-yVRUnILLo{_M_~!Nk;+6CyBX^mCu3==9=aa)SRj40 z&f+5*ZH$T$jQRXEBP6*vzsiW{=dwhulWT%AQ)88B%N7>G$%`Chkyx6u`EX$aKdtQ* zkDgX5$&|TG_ui?IrG9LIlD?Sv7wtRRA~BmJ18?o!dL;M3xmL=qkj7c^jeSeli(^zhw#l@wNZ3v4%Y$3 zt0_eU^0riP&U()Mjt*1XHrOm`G-^*dxdb_BSJW#ayNlJVf__P+Nt9V;=OULI3?mlR z^X8+}hTu8S;l3v-kF_-&r@l|o0?qd7-4aI9OQc74$v!>t2)6sM8Z9b&_OQrfM?wvr zMGKG@fy8p8;D`46&3U$wIGd4TrAprmkoL8pKS=hv7W-^AWcwZ?NTJ+9M(;#E+fHIu zu=%L&iH_+G@e@HFCA)hri_7ut!4h7jl$3lzcCrBK0kDUVs4*?V)t58+;zz=w;b4+e z)|i=#+0DBEdmOxMNXH<>g^N7BWv$3C^x9sJy5pk0M7eR%){RCKl5X44bDHGC69p}E z+H2#^BK|Hib+#r`Lz2w=*70`7=|oiEq0^66)b+qbKTbZMmCFn=ccA~p0li8L?)+q;;1mD`O|82`bk>> zQDN#U;=a2=CtQFQeIzh~%;^cFnI(!aWN5%MIVgthwC5)|wIBi|gkCUfXZ9kKqucJW^Sk(@;#fD^M!;U1W7$R*GS9ZydK=WE=$z zRR^9?|5N>ve4n9MSKg!;!!#FH`rw-V4`K(b>UvCkIQXFD14u7NMy`x%+^!~JBeW~g zYDvH>{Ot-*WzlmzG5ukAJ)zQ`{f8X8`)^8KlkpgIY!1!jV}OYZ^3f??E)H>$B=IZ# zJd(5629&q4r%sV3$*p|$F7H2o`+JSR+qDKZ?0B^YezF9k$-;P=3+T9m^-v};T4VR` zehS1UjC(-|_Q;P4n$Wv(cND`+_kQ!Y89r;E7<->6Pz~2n;@Fo=J6mfq9gg3o%zRd+ z|K36nc-ea*26le@sAAFJH^+~l?t?ou_+%G+i=4cddUPh=V-1SvuOwY`OF#Rcc>#=M zdb~6ohnUWO4Wn9{cgYNSg45T%M4S51c1T42Z;h!18P9u0PM&!ld6e@!)hnk> zKWJb5f_ysuqexxaL@^>=!q1deWU(`0hGe!f_)->W zqw`;jU_2*O4+@1DPcUJm17>~OyILES@Avy5O&%;ji`W@|#RQ z7)xx1M-?fhDy%MV6plN5qwHatD+PEgrs9K4LnXmogG}>PX|yR>Z!#eX6sE}gR#d$E zBsC#a7j@}}ujgaIse9)5XVnge%b+_$SGCo{gQ1y}n5Sr{*!UWV$~su&xTasvv6( z)L8+wvGh|_oK=<~5*!;Vc-pkIECIdd|6SL3N%r&fag;P^=HUrx`-EG zHH7y1(y=<_TthA0L=ITYFSEeHN59 z0dnxHIxCSKU47Rtq7?F=_Y)LKZaw=6iv}MZoAP&{(24Xm!f>gyR@~SUJYi9@_&VD7 z9@M#rTPa#59PpP&2?PneT%7ahjbQa056CezvL@aIKGe`dr=%YjBo%O%C0lgi?hfH zUs(T6d|@XwVRL+5vgdN09Ym-G{(CHh)T2tshN|701zCm0SgQbiH2k~UdP@(RsDO#u z$KUZER&tWF8wPt;HK?dJ;4$)j!#9WkoNya@apEvqDek4^BvDC!>%g zr7OZy>Ea-kq2kH6Qc3EO#w*c^|6s+|AEQD^^MAUn#w%;RI5x2=H|YvCkwG>`Cl>GA zjBrWZHP}e`#M!!?E^DUF)N(nq9xMwVd3FpV+#!b~Ioj&zV>> zC;+JtIQlsxQCbB?dYwudjU6%heCa4VDPg5!P9*|Y}1&iy{Sta~!Y{+Sr#9BCyIrjghm92KHNtW6;~fgVR;1E15jf@r4aE99q@ zkE2&;ZnrX;&#~^`1z+B8H9g%%O=U7neeiI+^{RZ-nDg!aLy!G__k^P>?oF))XBX!( zQ%;D+2LyWIYKg#Aj541WXert~RVi&@7lR>Gtym}8h&{>U%{r431vG*)KQ9~0ESd;g zH{AKrESru%b**2B{-)jYjx`)tG?t$;NrnF`VLK}r&&?(t~@{ZEH7b;m8FGELaE!WAEuV&{z@{aSR6)hHg<6D_FiW3n4`lHU9dDROkEnj@Si z)#AQt#mFwN77G-(^tF4Tt(fmErx8$AxG-7j*!Ve0B=8YwATC}XR-&4vg@ z{#A0FTYHyVHNAC}{pv(grCWlJLKVz)N^<>|NB|*`X|$^g;e1S~lj;i5BBABn=8#ij z8jw>ZCKGaYCUyvX)O?EiWmq{@YN)p*Z9altJ&6chMIF@rUaQLYqH$s@8Y%GGZEWCc zD6we>3-P6vfmUdhXk+9A^w_AVkc5eF=v%xivplBm%5{b~Q-DXAW{f~3%q7S)a!Uta z)(hR>@KBbBChRFi>H##`lO(D=iTI+skf`eaFzK%exow$F*+5FMU>kCD3p|bBNb%TL z_!yqLc}G~%DMhs^io3aaGYhG-=n~eI=*#h=Lx$#Af!;^P3Y7V@RfS=YWT)^ZSQ`u` z`Tek!{Pw5l9@^QRB%_5AMG4LP34BqWfW4>R!iII;+gSg`7Lw#mQRPix#?KfQbYx|> zMKkH^#JkZVS!M4s)#A!VB!FM18mE#mX{&a?2Lc3+$ZSNiank^rzteroAQ@eD=}L5C zH6G Date: Wed, 7 Aug 2024 14:37:57 +0300 Subject: [PATCH 5/7] Added missing documentation in the blockchain API --- docs/developers/developer-reference/sc-api-functions.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/developers/developer-reference/sc-api-functions.md b/docs/developers/developer-reference/sc-api-functions.md index 7be2f486a..c83cb7c3d 100644 --- a/docs/developers/developer-reference/sc-api-functions.md +++ b/docs/developers/developer-reference/sc-api-functions.md @@ -146,6 +146,8 @@ A smart contract call that runs out of gas will revert all operations, so this f get_block_timestamp() -> u64 ``` +Returns the timestamp of the current block, in seconds (UNIX timestamp). + [comment]: # (mx-context-auto) ### get_block_nonce @@ -154,6 +156,8 @@ get_block_timestamp() -> u64 get_block_nonce() -> u64 ``` +Returns the unique nonce of the block that includes the current transaction. + [comment]: # (mx-context-auto) ### get_block_round @@ -162,6 +166,8 @@ get_block_nonce() -> u64 get_block_round() -> u64 ``` +Returns the round number of the current block. Each epoch consists of a fixed number of rounds. The round number resets to 1 at the start of every new epoch. + [comment]: # (mx-context-auto) ### get_block_epoch @@ -170,6 +176,8 @@ get_block_round() -> u64 get_block_epoch() -> u64 ``` +Returns the epoch of the current block. + These functions are mostly used for setting up deadlines, so they've been grouped together. [comment]: # (mx-context-auto) From f9429b4c85bbd32c61ba656371d9304d91d478a6 Mon Sep 17 00:00:00 2001 From: Andrei Marinica Date: Wed, 7 Aug 2024 15:04:28 +0300 Subject: [PATCH 6/7] rust SDK page, sidebar fix --- docs/sdk-and-tools/sdk-go.md | 2 +- docs/sdk-and-tools/sdk-rust.md | 19 +++++++++++++++++++ sidebars.js | 17 +++++++++-------- 3 files changed, 29 insertions(+), 9 deletions(-) create mode 100644 docs/sdk-and-tools/sdk-rust.md diff --git a/docs/sdk-and-tools/sdk-go.md b/docs/sdk-and-tools/sdk-go.md index dfd608562..f2ff45c54 100644 --- a/docs/sdk-and-tools/sdk-go.md +++ b/docs/sdk-and-tools/sdk-go.md @@ -5,7 +5,7 @@ title: Go SDK [comment]: # (mx-abstract) -MultiversX SDK for Golang +## MultiversX SDK for Golang **sdk-go** consists of Go helpers and utilities for interacting with the Blockchain. diff --git a/docs/sdk-and-tools/sdk-rust.md b/docs/sdk-and-tools/sdk-rust.md new file mode 100644 index 000000000..04da596f5 --- /dev/null +++ b/docs/sdk-and-tools/sdk-rust.md @@ -0,0 +1,19 @@ +--- +id: sdk-rust +title: Rust SDK +--- + +[comment]: # (mx-abstract) + +## Rust Interactors + +The Rust SDK for interacting with the blockchain comes in the form of the so-called [**Rust Interactors**](/developers/meta/interactor/interactors-overview). + +Since they use very similar syntax to smart contracts and smart contract tests, their documentation is grouped under the Rust Development Framework section. + + +[comment]: # (mx-context-auto) + +## Quick tutorial + +You can also find a quick tutorial [here](/developers/tutorials/interactors-guide). diff --git a/sidebars.js b/sidebars.js index 704d0fc09..f8fba814b 100644 --- a/sidebars.js +++ b/sidebars.js @@ -139,18 +139,18 @@ const sidebars = { "developers/meta/sc-build-reference", "developers/meta/sc-config", "developers/meta/sc-meta-cli", - { - type: "category", - label: "Interactors", - items: [ - "developers/meta/interactor/interactors-overview", - "developers/meta/interactor/interactors-example", - ], - }, "developers/meta/sc-allocator", "developers/meta/rust-nightly", ], }, + { + type: "category", + label: "Interactors", + items: [ + "developers/meta/interactor/interactors-overview", + "developers/meta/interactor/interactors-example", + ], + }, { type: "category", label: "Testing & Debugging", @@ -244,6 +244,7 @@ const sidebars = { "sdk-and-tools/sdk-nestjs/sdk-nestjs-monitoring", ], }, + "sdk-and-tools/sdk-rust", "sdk-and-tools/sdk-go", "sdk-and-tools/mxjava", { From b3a0ed69e503bedcd3401443b7eef437ca63bbf0 Mon Sep 17 00:00:00 2001 From: Radu Mojic Date: Wed, 7 Aug 2024 15:06:26 +0300 Subject: [PATCH 7/7] use @2x images on low dpr screens in order to avoid blurry/low quality backgrounds --- src/components/Homepage/homepage.css | 24 ++++-------------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/src/components/Homepage/homepage.css b/src/components/Homepage/homepage.css index c0509943d..a0b864298 100644 --- a/src/components/Homepage/homepage.css +++ b/src/components/Homepage/homepage.css @@ -16,16 +16,8 @@ html[data-has-hydrated="true"][data-theme="dark"]:not(.docs-wrapper):not( html[data-has-hydrated="true"]:not(.docs-wrapper):not(.search-page-wrapper) #__docusaurus { - background: image-set( - url("/img/theme/astronaut.webp") 1x, - url("/img/theme/astronaut@2x.webp") 2x - ) - right -20px top 40px no-repeat, - image-set( - url("/img/theme/glow-light.webp") 1x, - url("/img/theme/glow-light@2x.webp") 2x - ) - right -180px top -150px no-repeat, + background: url("/img/theme/astronaut@2x.webp") right -20px top 40px no-repeat, + url("/img/theme/glow-light@2x.webp") right -180px top -150px no-repeat, var(--ifm-background-color); background-size: 40vw, 60vw, auto; background-blend-mode: normal, difference, normal; @@ -35,16 +27,8 @@ html[data-has-hydrated="true"][data-theme="dark"]:not(.docs-wrapper):not( .search-page-wrapper ) #__docusaurus { - background: image-set( - url("/img/theme/astronaut.webp") 1x, - url("/img/theme/astronaut@2x.webp") 2x - ) - right -20px top 40px no-repeat, - image-set( - url("/img/theme/glow-dark.webp") 1x, - url("/img/theme/glow-dark@2x.webp") 2x - ) - right -180px top -150px no-repeat, + background: url("/img/theme/astronaut@2x.webp") right -20px top 40px no-repeat, + url("/img/theme/glow-dark@2x.webp") right -180px top -150px no-repeat, var(--ifm-background-color); background-size: 40vw, 60vw, auto; background-blend-mode: normal, lighten, normal;