The alloy-contract crate provides the CallBuilder type, which is used to construct, encode, and decode data for on-chain contract calls. It allows you to either perform read-only calls (using .call()) or broadcast calls as transactions (using .send()).
To simplify interaction, use the sol! macro with the #[sol(rpc)] attribute. This attribute automatically generates a contract struct and methods for every function defined in the contract, where each method returns a CallBuilder configured for that specific function.