1use alloy_primitives::{address, Address, FixedBytes, B256};
6
7pub const MAINNET_DEPOSIT_CONTRACT_ADDRESS: Address =
9 address!("0x00000000219ab540356cbb839cbe05303d7705fa");
10
11pub const DEPOSIT_REQUEST_TYPE: u8 = 0x00;
13
14pub const MAX_DEPOSIT_RECEIPTS_PER_PAYLOAD: usize = 8192;
16
17#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Default)]
19#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
20#[cfg_attr(feature = "ssz", derive(ssz_derive::Encode, ssz_derive::Decode))]
21#[cfg_attr(any(test, feature = "arbitrary"), derive(arbitrary::Arbitrary))]
22pub struct DepositRequest {
23 pub pubkey: FixedBytes<48>,
25 pub withdrawal_credentials: B256,
27 #[cfg_attr(feature = "serde", serde(with = "alloy_serde::displayfromstr"))]
29 pub amount: u64,
30 pub signature: FixedBytes<96>,
32 #[cfg_attr(feature = "serde", serde(with = "alloy_serde::displayfromstr"))]
34 pub index: u64,
35}
36
37#[cfg(test)]
38mod tests {
39 use super::*;
40 use alloy_primitives::hex;
41
42 #[test]
43 #[cfg(feature = "serde")]
44 fn test_serde_deposit_request() {
45 let json_data = r#"{"pubkey":"0x8e01a8f21bdc38991ada53ca86d6c78d874675a450a38431cc6aa0f12d5661e344784c56c8a211f7025224d1303ee801","withdrawal_credentials":"0x010000000000000000000000af6df504f08ddf582d604d2f0a593bc153c25dbd","amount":"18112749083033600","signature":"0xb65f3db79405544528d6d92040282f29171f4ff6e5abb2d59f9ee1f1254aced2a7000f87bc2684f543e913a7cc1007ea0e97289b349c553eecdf253cd3ef5814088ba3d4ac286f2634dac3d026d9a01e4c166dc75e249d626a0f1c180dab75ce","index":"13343631333247680512"}"#;
47
48 let deposit_request: DepositRequest =
50 serde_json::from_str(json_data).expect("Failed to deserialize");
51
52 assert_eq!(
54 deposit_request.pubkey,
55 FixedBytes::<48>::from(hex!("8E01A8F21BDC38991ADA53CA86D6C78D874675A450A38431CC6AA0F12D5661E344784C56C8A211F7025224D1303EE801"))
56 );
57 assert_eq!(
58 deposit_request.withdrawal_credentials,
59 B256::from(hex!("010000000000000000000000AF6DF504F08DDF582D604D2F0A593BC153C25DBD"))
60 );
61 assert_eq!(deposit_request.amount, 0x0040597307000000u64);
62 assert_eq!(
63 deposit_request.signature,
64 FixedBytes::<96>::from(hex!("B65F3DB79405544528D6D92040282F29171F4FF6E5ABB2D59F9EE1F1254ACED2A7000F87BC2684F543E913A7CC1007EA0E97289B349C553EECDF253CD3EF5814088BA3D4AC286F2634DAC3D026D9A01E4C166DC75E249D626A0F1C180DAB75CE"))
65 );
66 assert_eq!(deposit_request.index, 0xB92E1A0000000000u64);
67
68 let serialized_json = serde_json::to_string(&deposit_request).expect("Failed to serialize");
70
71 assert_eq!(serialized_json, json_data);
73 }
74}