use assert_matches::assert_matches;
use hedera::{
ContractBytecodeQuery,
ContractCreateTransaction,
ContractDeleteTransaction,
ContractFunctionParameters,
ContractInfoQuery,
FileCreateTransaction,
FileDeleteTransaction,
Hbar,
};
use crate::common::{
setup_nonfree,
TestEnvironment,
};
use crate::contract::SMART_CONTRACT_BYTECODE;
#[tokio::test]
async fn query() -> anyhow::Result<()> {
let Some(TestEnvironment { config, client }) = setup_nonfree() else {
return Ok(());
};
let Some(op) = &config.operator else {
log::debug!("skipping test due to missing operator");
return Ok(());
};
let file_id = FileCreateTransaction::new()
.keys([op.private_key.public_key()])
.contents(SMART_CONTRACT_BYTECODE)
.execute(&client)
.await?
.get_receipt(&client)
.await?
.file_id
.unwrap();
let contract_id = ContractCreateTransaction::new()
.admin_key(op.private_key.public_key())
.gas(2000000)
.constructor_parameters(
ContractFunctionParameters::new().add_string("Hello from Hedera.").to_bytes(None),
)
.bytecode_file_id(file_id)
.contract_memo("[e2e::ContractCreateTransaction]")
.execute(&client)
.await?
.get_receipt(&client)
.await?
.contract_id
.unwrap();
let bytecode = ContractBytecodeQuery::new().contract_id(contract_id).execute(&client).await?;
assert_eq!(bytecode.len(), 798);
ContractDeleteTransaction::new()
.transfer_account_id(op.account_id)
.contract_id(contract_id)
.execute(&client)
.await?
.get_receipt(&client)
.await?;
FileDeleteTransaction::new()
.file_id(file_id)
.execute(&client)
.await?
.get_receipt(&client)
.await?;
let res = ContractInfoQuery::new().contract_id(contract_id).execute(&client).await?;
assert!(res.is_deleted);
Ok(())
}
#[tokio::test]
async fn get_cost_big_max_query() -> anyhow::Result<()> {
let Some(TestEnvironment { config, client }) = setup_nonfree() else {
return Ok(());
};
let Some(op) = &config.operator else {
log::debug!("skipping test due to missing operator");
return Ok(());
};
let file_id = FileCreateTransaction::new()
.keys([op.private_key.public_key()])
.contents(SMART_CONTRACT_BYTECODE)
.execute(&client)
.await?
.get_receipt(&client)
.await?
.file_id
.unwrap();
let contract_id = ContractCreateTransaction::new()
.admin_key(op.private_key.public_key())
.gas(2000000)
.constructor_parameters(
ContractFunctionParameters::new().add_string("Hello from Hedera.").to_bytes(None),
)
.bytecode_file_id(file_id)
.contract_memo("[e2e::ContractCreateTransaction]")
.execute(&client)
.await?
.get_receipt(&client)
.await?
.contract_id
.unwrap();
let mut binding = ContractBytecodeQuery::new();
let bytecode = binding.contract_id(contract_id).max_payment_amount(Hbar::new(1000));
let cost = bytecode.get_cost(&client).await?;
println!("cost: {cost:?}");
let bytecode = binding.payment_amount(cost).execute(&client).await?;
assert_eq!(bytecode.len(), 798);
ContractDeleteTransaction::new()
.transfer_account_id(op.account_id)
.contract_id(contract_id)
.execute(&client)
.await?
.get_receipt(&client)
.await?;
FileDeleteTransaction::new()
.file_id(file_id)
.execute(&client)
.await?
.get_receipt(&client)
.await?;
Ok(())
}
#[tokio::test]
async fn get_cost_small_max_query() -> anyhow::Result<()> {
let Some(TestEnvironment { config, client }) = setup_nonfree() else {
return Ok(());
};
let Some(op) = &config.operator else {
log::debug!("skipping test due to missing operator");
return Ok(());
};
let file_id = FileCreateTransaction::new()
.keys([op.private_key.public_key()])
.contents(SMART_CONTRACT_BYTECODE)
.execute(&client)
.await?
.get_receipt(&client)
.await?
.file_id
.unwrap();
let contract_id = ContractCreateTransaction::new()
.admin_key(op.private_key.public_key())
.gas(2000000)
.constructor_parameters(
ContractFunctionParameters::new().add_string("Hello from Hedera.").to_bytes(None),
)
.bytecode_file_id(file_id)
.contract_memo("[e2e::ContractCreateTransaction]")
.execute(&client)
.await?
.get_receipt(&client)
.await?
.contract_id
.unwrap();
let max_payment_amount = Hbar::from_tinybars(1);
let mut binding = ContractBytecodeQuery::new();
let bytecode = binding.contract_id(contract_id).max_payment_amount(max_payment_amount);
let bytecode = bytecode.execute(&client).await;
assert_matches!(
bytecode,
Err(hedera::Error::MaxQueryPaymentExceeded {
max_query_payment: _max_payment_amount,
query_cost: _cost
})
);
ContractDeleteTransaction::new()
.transfer_account_id(op.account_id)
.contract_id(contract_id)
.execute(&client)
.await?
.get_receipt(&client)
.await?;
FileDeleteTransaction::new()
.file_id(file_id)
.execute(&client)
.await?
.get_receipt(&client)
.await?;
Ok(())
}