use alloy_primitives::{Address, Bytes, U256, address};
use serde::{Deserialize, Serialize};
use x402_types::timestamp::UnixTimestamp;
use crate::chain::ChecksummedAddress;
pub const PERMIT2_ADDRESS: Address = address!("0x000000000022D473030F116dDEE9F6B43aC78BA3");
pub const EXACT_PERMIT2_PROXY_ADDRESS: Address =
address!("0x4020615294c913F045dc10f0a5cdEbd86c280001");
pub const UPTO_PERMIT2_PROXY_ADDRESS: Address =
address!("0x4020633461b2895a48930ff97ee8fcde8e520002");
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Permit2Authorization {
pub deadline: UnixTimestamp,
pub from: ChecksummedAddress,
#[serde(with = "crate::decimal_u256")]
pub nonce: U256,
pub permitted: Permit2AuthorizationPermitted,
pub spender: ChecksummedAddress,
pub witness: Permit2Witness,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Permit2AuthorizationPermitted {
#[serde(with = "crate::decimal_u256")]
pub amount: U256,
pub token: ChecksummedAddress,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Permit2Witness {
pub extra: Bytes,
pub to: ChecksummedAddress,
pub valid_after: UnixTimestamp,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Permit2Payload {
pub permit_2_authorization: Permit2Authorization,
pub signature: Bytes,
}