use std::time::Duration;
use flow_access_api::client::*;
use flow_access_api::keys::{hex_to_bytes, parse_private_key};
use flow_access_api::network::Network;
use serde::{Deserialize};
use serde_cadence::{self, CadenceValue, FromCadenceValue, ToCadenceValue};
use flow_access_api::flow::entities::TransactionStatus;
use flow_access_api::transactions::sign_transaction;
#[derive(Debug, Deserialize, ToCadenceValue, FromCadenceValue)]
struct FruitInfo {
name: String,
color: String,
quantity: i64,
}
#[tokio::main]
async fn main() -> flow_access_api::Result<()> {
let mut client = FlowRcpClient::try_new(Network::Custom {
endpoint: "http://access.testnet.nodes.onflow.org:9000".to_string()
}).await?;
let account_address_hex = "788db9ec197a75de"; let private_key_hex = "3b75e9e624b7aec74181c37270296fe4718af0f674012758df99e59ab0f85b50";
let private_key = parse_private_key(private_key_hex)?;
println!("\n=== EXECUTING TRANSACTION WITH PARAMETERS ===\n");
let script_with_params = r#"
transaction(message: String, amount: UFix64) {
prepare(signer: &Account) {
log("Transaction executed")
}
execute {
log("Message from parameter: ".concat(message))
log("Amount: ".concat(amount.toString()))
}
}
"#;
let message = "Hello, Flow!";
let amount = 100_f64;
let (mut tx, tx_hash) = client.create_transaction_with_params(
script_with_params,
&[&message, &CadenceValue::UFix64 { value: format!("{:.2}", amount) }],
account_address_hex,
100 ).await?;
println!("Transaction created with hash: {}", hex::encode(&tx_hash));
sign_transaction(
&mut tx,
account_address_hex,
0,
&private_key,
)?;
println!("Transaction signed. Sending to network...");
let tx_id = client.send_transaction_and_subscribe(
tx,
TransactionStatus::Sealed,
Duration::from_secs(60)
).await?;
println!("Transaction with ID {} is sealed", hex::encode(&tx_id));
println!("\n=== EXECUTING SCRIPT WITH RETURN VALUE ===\n");
let script_with_return = r#"
access(all) fun main(prefix: String): [String] {
let items: [String] = ["apple", "banana", "cherry", "date"]
let result: [String] = []
for item in items {
result.append(prefix.concat(": ").concat(item))
}
return result
}
"#;
let prefix = "Fruit";
println!("Executing script that returns an array of strings...");
let cadence_result = client
.execute_script(script_with_return, &[&prefix])
.await?;
println!("Parsed Cadence result: {:?}", cadence_result);
let string_values: Vec<String> = serde_cadence::from_cadence_value(&cadence_result)?;
println!("Extracted String values:");
for (i, item) in string_values.iter().enumerate() {
println!(" {}. {}", i + 1, item);
}
println!("\n=== EXECUTING SCRIPT WITH DICTIONARY RETURN VALUE ===\n");
let script_with_dict_return = r#"
access(all) fun main(): {String: Int} {
let counts: {String: Int} = {
"apple": 5,
"banana": 10,
"cherry": 15
}
return counts
}
"#;
println!("Executing script that returns a dictionary...");
let cadence_dict_result = client
.execute_script(script_with_dict_return, &[])
.await?;
println!("Parsed Cadence dictionary: {:?}", cadence_dict_result);
let fruit_counts: std::collections::HashMap<String, i64> =
serde_cadence::from_cadence_value(&cadence_dict_result)?;
println!("Extracted dictionary values:");
for (fruit, count) in &fruit_counts {
println!(" {}: {}", fruit, count);
}
println!("\n=== EXECUTING SCRIPT WITH COMPOSITE TYPE RETURN VALUE ===\n");
let script_with_struct_return = r#"
access(all) struct FruitInfo {
access(all) let name: String
access(all) let color: String
access(all) let quantity: Int
init(name: String, color: String, quantity: Int) {
self.name = name
self.color = color
self.quantity = quantity
}
}
access(all) fun main(): FruitInfo {
return FruitInfo(name: "Mango", color: "Yellow", quantity: 42)
}
"#;
println!("Executing script that returns a composite type...");
let cadence_struct_result = client
.execute_script(script_with_struct_return, &[])
.await?;
println!("Parsed Cadence struct: {:?}", cadence_struct_result);
let fruit_info: FruitInfo = serde_cadence::from_cadence_value(&cadence_struct_result)?;
println!("Extracted FruitInfo struct:");
println!(" Name: {}", fruit_info.name);
println!(" Color: {}", fruit_info.color);
println!(" Quantity: {}", fruit_info.quantity);
println!("\nAll operations completed successfully!");
Ok(())
}