use alloy::{primitives::Address, providers::ProviderBuilder, sol};
use eyre::Result;
sol! {
#[sol(rpc)]
interface ISemVerMixin {
function version() external view returns (string memory);
}
}
pub async fn get_policy_factory_for_policy(policy_address: Address, rpc_url: &str) -> Result<Address> {
let provider = ProviderBuilder::new().connect_http(rpc_url.parse()?);
sol! {
#[sol(rpc)]
interface INewtonPolicy {
function factory() external view returns (address);
}
}
let policy = INewtonPolicy::new(policy_address, provider);
let result = policy.factory().call().await?;
Ok(Address::from(result.0))
}
pub async fn get_policy_data_factory_for_policy_data(policy_data_address: Address, rpc_url: &str) -> Result<Address> {
let provider = ProviderBuilder::new().connect_http(rpc_url.parse()?);
sol! {
#[sol(rpc)]
interface INewtonPolicyData {
function factory() external view returns (address);
}
}
let policy_data = INewtonPolicyData::new(policy_data_address, provider);
let result = policy_data.factory().call().await?;
Ok(Address::from(result.0))
}
pub async fn get_policy_version(policy_address: Address, rpc_url: &str) -> Result<String> {
let provider = ProviderBuilder::new().connect_http(rpc_url.parse()?);
let sem_ver = ISemVerMixin::new(policy_address, provider);
match sem_ver.version().call().await {
Ok(version) => Ok(version),
Err(_) => Ok("0.0.0".to_string()),
}
}
pub async fn get_policy_data_version(policy_data_address: Address, rpc_url: &str) -> Result<String> {
let provider = ProviderBuilder::new().connect_http(rpc_url.parse()?);
let sem_ver = ISemVerMixin::new(policy_data_address, provider);
match sem_ver.version().call().await {
Ok(version) => Ok(version),
Err(_) => Ok("0.0.0".to_string()),
}
}