use k256::ecdsa::SigningKey;
use super::*;
fn encode_target_call(sig: &str, target_id: u64) -> Vec<u8> {
let mut out = Vec::with_capacity(4 + 32);
out.extend_from_slice(&selector(sig));
out.extend_from_slice(&u256_be(target_id as u128));
out
}
pub async fn subscribe_sponsored(
sender: &SigningKey,
fee_payer: &SigningKey,
target_id: u64,
fee_token: &str,
) -> Result<String, String> {
sponsored_diamond_call(
sender,
fee_payer,
encode_target_call("subscribe(uint256)", target_id),
fee_token,
2_000_000,
)
.await
}
pub async fn unsubscribe_sponsored(
sender: &SigningKey,
fee_payer: &SigningKey,
target_id: u64,
fee_token: &str,
) -> Result<String, String> {
sponsored_diamond_call(
sender,
fee_payer,
encode_target_call("unsubscribe(uint256)", target_id),
fee_token,
600_000,
)
.await
}
pub async fn is_subscribed(target_id: u64, who_hex: &str) -> Result<bool, String> {
let who = parse_eth_address(who_hex)?;
let result = read_view(
selector("isSubscribed(uint256,address)"),
&[u256_be(target_id as u128), addr_word(&who)],
)
.await?;
let trimmed = result.trim().trim_start_matches("0x");
Ok(trimmed.chars().last().map(|c| c == '1').unwrap_or(false))
}
pub async fn subscriber_count(target_id: u64) -> Result<u128, String> {
let result = read_view(
selector("subscriberCount(uint256)"),
&[u256_be(target_id as u128)],
)
.await?;
decode_u256_as_u128(&result)
}