1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
use std::{collections::BTreeMap, str::FromStr};
use aptos_cli_config::error::{CliError, CliTypedResult};
use aptos_rest_client::Client;
use aptos_types::{account_address::AccountAddress, chain_id::ChainId};
use itertools::Itertools;
use reqwest::Url;
pub async fn get_sequence_number(
client: &aptos_rest_client::Client,
address: AccountAddress,
) -> CliTypedResult<u64> {
let account_response = client
.get_account(address)
.await
.map_err(|err| CliError::ApiError(err.to_string()))?;
let account = account_response.inner();
Ok(account.sequence_number)
}
pub async fn get_chain_id(rest_client: &Client) -> CliTypedResult<ChainId> {
let state = rest_client
.get_ledger_information()
.await
.map_err(|err| CliError::ApiError(err.to_string()))?
.into_inner();
Ok(ChainId::new(state.chain_id))
}
pub async fn fund_account(
faucet_url: Url,
num_coins: u64,
address: &AccountAddress,
) -> CliTypedResult<()> {
let response = reqwest::Client::new()
.post(format!(
"{}mint?amount={}&auth_key={}",
faucet_url, num_coins, address
))
.send()
.await
.map_err(|err| CliError::ApiError(err.to_string()))?;
if response.status() == 200 {
Ok(())
} else {
Err(CliError::ApiError(format!(
"Faucet issue: {}",
response.status()
)))
}
}
const PARSE_MAP_SYNTAX_MSG: &str = "Invalid syntax for map. Example: Name=Value,Name2=Value";
pub fn parse_map<K: FromStr + Ord, V: FromStr>(str: &str) -> anyhow::Result<BTreeMap<K, V>>
where
K::Err: 'static + std::error::Error + Send + Sync,
V::Err: 'static + std::error::Error + Send + Sync,
{
let mut map = BTreeMap::new();
for pair in str.split_terminator(',') {
let (first, second): (&str, &str) = pair
.split_terminator('=')
.collect_tuple()
.ok_or_else(|| anyhow::Error::msg(PARSE_MAP_SYNTAX_MSG))?;
let first = first.trim();
let second = second.trim();
if first.is_empty() || second.is_empty() {
return Err(anyhow::Error::msg(PARSE_MAP_SYNTAX_MSG));
}
let key: K = K::from_str(first)?;
let value: V = V::from_str(second)?;
map.insert(key, value);
}
Ok(map)
}