Generate Address

Add the compile_address function that compiles the Pint project located in the specified directory and returns the PredicateAddress, which includes both the contract address and the predicate address:

#![allow(unused)]
fn main() {
async fn compile_address(pint_directory: PathBuf) -> Result<PredicateAddress, anyhow::Error> {
    let counter = compile_pint_project(pint_directory).await?;
    let contract_address = essential_hash::contract_addr::from_contract(&counter);
    let predicate_address = essential_hash::content_addr(&counter.predicates[0]);
    let predicate_address = PredicateAddress {
        contract: contract_address,
        predicate: predicate_address,
    };
    Ok(predicate_address)
}
}

This function helps identify which contract and predicate to interact with. While we could simply pass in the addresses directly, generating them here adds convenience and ensures they are correctly derived from the compiled contract.