multiversx_sdk/
gateway.rs

1mod gateway_account;
2mod gateway_account_esdt_roles;
3mod gateway_account_esdt_tokens;
4mod gateway_account_storage;
5mod gateway_block;
6mod gateway_chain_simulator_blocks;
7mod gateway_chain_simulator_send_funds;
8mod gateway_chain_simulator_set_state;
9mod gateway_chain_simulator_set_state_overwrite;
10mod gateway_network_config;
11mod gateway_network_economics;
12mod gateway_network_status;
13mod gateway_tx_cost;
14mod gateway_tx_info;
15mod gateway_tx_process_status;
16mod gateway_tx_send;
17mod gateway_tx_send_multi;
18mod gateway_tx_status;
19mod gateway_tx_vmquery;
20
21pub use gateway_account::GetAccountRequest;
22pub use gateway_account_esdt_roles::GetAccountEsdtRolesRequest;
23pub use gateway_account_esdt_tokens::GetAccountEsdtTokensRequest;
24pub use gateway_account_storage::GetAccountStorageRequest;
25pub use gateway_block::GetHyperBlockRequest;
26pub use gateway_chain_simulator_blocks::ChainSimulatorGenerateBlocksRequest;
27pub use gateway_chain_simulator_send_funds::ChainSimulatorSendFundsRequest;
28pub use gateway_chain_simulator_set_state::{ChainSimulatorSetStateRequest, SetStateAccount};
29pub use gateway_chain_simulator_set_state_overwrite::ChainSimulatorSetStateOverwriteRequest;
30pub use gateway_network_config::NetworkConfigRequest;
31pub use gateway_network_economics::NetworkEconimicsRequest;
32pub use gateway_network_status::NetworkStatusRequest;
33pub use gateway_tx_cost::GetTxCost;
34pub use gateway_tx_info::GetTxInfo;
35pub use gateway_tx_process_status::GetTxProcessStatus;
36pub use gateway_tx_send::SendTxRequest;
37pub use gateway_tx_send_multi::SendMultiTxRequest;
38pub use gateway_tx_status::GetTxStatus;
39pub use gateway_tx_vmquery::VMQueryRequest;
40
41pub const MAINNET_GATEWAY: &str = "https://gateway.multiversx.com";
42pub const TESTNET_GATEWAY: &str = "https://testnet-gateway.multiversx.com";
43pub const DEVNET_GATEWAY: &str = "https://devnet-gateway.multiversx.com";
44
45// MetachainShardId will be used to identify a shard ID as metachain
46pub const METACHAIN_SHARD_ID: u32 = 0xFFFFFFFF;
47
48const ACCOUNT_ENDPOINT: &str = "address";
49const KEYS_ENDPOINT: &str = "keys";
50const NETWORK_CONFIG_ENDPOINT: &str = "network/config";
51const NETWORK_ECONOMICS_ENDPOINT: &str = "network/economics";
52const GET_NETWORK_STATUS_ENDPOINT: &str = "network/status";
53const GET_HYPER_BLOCK_BY_NONCE_ENDPOINT: &str = "hyperblock/by-nonce";
54const GET_HYPER_BLOCK_BY_HASH_ENDPOINT: &str = "hyperblock/by-hash";
55const COST_TRANSACTION_ENDPOINT: &str = "transaction/cost";
56const SEND_TRANSACTION_ENDPOINT: &str = "transaction/send";
57const SEND_MULTIPLE_TRANSACTIONS_ENDPOINT: &str = "transaction/send-multiple";
58const GET_TRANSACTION_INFO_ENDPOINT: &str = "transaction";
59const WITH_RESULTS_QUERY_PARAM: &str = "?withResults=true";
60const VM_VALUES_ENDPOINT: &str = "vm-values/query";
61
62const SEND_USER_FUNDS_ENDPOINT: &str = "transaction/send-user-funds";
63const GENERATE_BLOCKS_ENDPOINT: &str = "simulator/generate-blocks";
64const GENERATE_BLOCKS_UNTIL_TX_PROCESSED_ENDPOINT: &str =
65    "simulator/generate-blocks-until-transaction-processed";
66const GENERATE_BLOCKS_UNTIL_EPOCH_REACHED_ENDPOINT: &str =
67    "simulator/generate-blocks-until-epoch-reached";
68const SET_STATE_ENDPOINT: &str = "simulator/set-state";
69const SET_STATE_OVERWRITE_ENDPOINT: &str = "/simulator/set-state-overwrite";
70
71pub enum GatewayRequestType {
72    Get,
73    Post,
74}
75
76/// Models requests to the gateway.
77pub trait GatewayRequest {
78    type Payload: serde::ser::Serialize + ?Sized;
79
80    type DecodedJson: serde::de::DeserializeOwned;
81
82    type Result;
83
84    fn request_type(&self) -> GatewayRequestType;
85
86    fn get_endpoint(&self) -> String;
87
88    fn get_payload(&self) -> Option<&Self::Payload> {
89        None
90    }
91
92    fn process_json(&self, decoded: Self::DecodedJson) -> anyhow::Result<Self::Result>;
93}
94
95pub trait GatewayAsyncService {
96    /// Keeps track of elapsed time.
97    type Instant;
98
99    fn from_uri(uri: &str) -> Self;
100
101    fn request<G>(
102        &self,
103        request: G,
104    ) -> impl std::future::Future<Output = anyhow::Result<G::Result>>
105    where
106        G: GatewayRequest;
107
108    fn sleep(&self, millis: u64) -> impl std::future::Future<Output = ()>;
109
110    fn now(&self) -> Self::Instant;
111
112    fn elapsed_seconds(&self, instant: &Self::Instant) -> f32;
113}