#![cfg(feature = "dev")]
use cosmrs::{
bank::MsgSend,
crypto::secp256k1,
dev, rpc,
tx::{self, AccountNumber, Fee, Msg, SignDoc, SignerInfo},
Coin,
};
use std::{panic, str};
const CHAIN_ID: &str = "cosmrs-test";
const RPC_PORT: u16 = 26657;
const ACCOUNT_NUMBER: AccountNumber = 1;
const ACCOUNT_PREFIX: &str = "cosmos";
const DENOM: &str = "samoleans";
const MEMO: &str = "test memo";
#[test]
fn msg_send() {
let sender_private_key = secp256k1::SigningKey::random();
let sender_public_key = sender_private_key.public_key();
let sender_account_id = sender_public_key.account_id(ACCOUNT_PREFIX).unwrap();
let recipient_private_key = secp256k1::SigningKey::random();
let recipient_account_id = recipient_private_key
.public_key()
.account_id(ACCOUNT_PREFIX)
.unwrap();
let amount = Coin {
amount: 1u8.into(),
denom: DENOM.parse().unwrap(),
};
let msg_send = MsgSend {
from_address: sender_account_id.clone(),
to_address: recipient_account_id,
amount: vec![amount.clone()],
}
.to_any()
.unwrap();
let chain_id = CHAIN_ID.parse().unwrap();
let sequence_number = 0;
let gas = 100_000u64;
let fee = Fee::from_amount_and_gas(amount, gas);
let tx_body = tx::BodyBuilder::new().msg(msg_send).memo(MEMO).finish();
let auth_info =
SignerInfo::single_direct(Some(sender_public_key), sequence_number).auth_info(fee);
let sign_doc = SignDoc::new(&tx_body, &auth_info, &chain_id, ACCOUNT_NUMBER).unwrap();
let tx_raw = sign_doc.sign(&sender_private_key).unwrap();
let docker_args = [
"-d",
"-p",
&format!("{}:{}", RPC_PORT, RPC_PORT),
dev::GAIA_DOCKER_IMAGE,
CHAIN_ID,
&sender_account_id.to_string(),
];
dev::docker_run(&docker_args, || {
init_tokio_runtime().block_on(async {
let rpc_address = format!("http://localhost:{}", RPC_PORT);
let rpc_client = rpc::HttpClient::new(rpc_address.as_str()).unwrap();
dev::poll_for_first_block(&rpc_client).await;
let tx_commit_response = tx_raw.broadcast_commit(&rpc_client).await.unwrap();
if tx_commit_response.check_tx.code.is_err() {
panic!("check_tx failed: {:?}", tx_commit_response.check_tx);
}
if tx_commit_response.tx_result.code.is_err() {
panic!("tx_result error: {:?}", tx_commit_response.tx_result);
}
let tx = dev::poll_for_tx(&rpc_client, tx_commit_response.hash).await;
assert_eq!(&tx_body, &tx.body);
assert_eq!(&auth_info, &tx.auth_info);
})
});
}
fn init_tokio_runtime() -> tokio::runtime::Runtime {
tokio::runtime::Builder::new_current_thread()
.enable_all()
.build()
.unwrap()
}