lit_rust_sdk/blockchain/
mod.rs

1mod contract_resolver;
2mod pkp_nft;
3mod rate_limit_nft;
4pub mod staking;
5
6pub use contract_resolver::ContractResolver;
7use eyre::Result;
8pub use pkp_nft::PKPNFT;
9pub use rate_limit_nft::RateLimitNFT;
10pub use staking::Staking;
11
12use crate::LitNetwork;
13use alloy::{
14    primitives::{keccak256, Address, FixedBytes},
15    providers::ProviderBuilder,
16};
17
18pub enum Contract {
19    Staking,
20    PKPNFT,
21    RateLimitNFT,
22    ContractResolver,
23}
24
25impl Contract {
26    fn resolver_key(&self) -> FixedBytes<32> {
27        match self {
28            Contract::Staking => keccak256("STAKING"),
29            Contract::PKPNFT => keccak256("PKP_NFT"),
30            Contract::RateLimitNFT => keccak256("RATE_LIMIT_NFT"),
31            Contract::ContractResolver => panic!("ContractResolver does not have a resolver key"),
32        }
33    }
34}
35
36pub async fn resolve_address(contract: Contract, lit_network: LitNetwork) -> Result<Address> {
37    let provider = ProviderBuilder::new()
38        .connect(lit_network.rpc_url())
39        .await?;
40    let contract_resolver =
41        ContractResolver::new(lit_network.contract_resolver_address()?, provider);
42    let resolver_key = contract.resolver_key();
43    let resolved_address = contract_resolver
44        .getContract(resolver_key, lit_network.env())
45        .call()
46        .await?;
47    Ok(resolved_address)
48}