Skip to main content

bobcat_interfaces/
eip20.rs

1use bobcat_maths::U;
2
3use bobcat_cd::leftpad_addr;
4
5use crate::selectors;
6
7use array_concat::concat_arrays;
8
9selectors! {
10    SEL_TOTAL_SUPPLY = b"totalSupply()",
11    SEL_BALANCE_OF = b"balanceOf(address)",
12    SEL_ALLOWANCE = b"allowance(address,address)",
13    SEL_TRANSFER = b"transfer(address,uint256)",
14    SEL_TRANSFER_FROM = b"transferFrom(address,address,uint256)",
15    SEL_APPROVE = b"approve(address,uint256)",
16}
17
18type Address = [u8; 20];
19
20pub const fn make_fn_total_supply() -> [u8; 4] {
21    SEL_TOTAL_SUPPLY
22}
23
24pub const fn make_fn_balance_of(user: Address) -> [u8; 4 + 32] {
25    concat_arrays!(SEL_BALANCE_OF, leftpad_addr(user))
26}
27
28pub const fn make_fn_allowance(owner: Address, spender: Address) -> [u8; 4 + 32 * 2] {
29    concat_arrays!(SEL_ALLOWANCE, leftpad_addr(owner), leftpad_addr(spender))
30}
31
32pub const fn make_fn_transfer(recipient: Address, amt: &U) -> [u8; 4 + 32 * 2] {
33    concat_arrays!(SEL_TRANSFER, leftpad_addr(recipient), amt.0)
34}
35
36pub const fn make_fn_transfer_from(from: Address, to: Address, amt: &U) -> [u8; 4 + 32 * 3] {
37    concat_arrays!(
38        SEL_TRANSFER_FROM,
39        leftpad_addr(from),
40        leftpad_addr(to),
41        amt.0
42    )
43}
44
45pub const fn make_fn_approve(spender: Address, amt: &U) -> [u8; 4 + 32 * 2] {
46    concat_arrays!(SEL_APPROVE, leftpad_addr(spender), amt.0)
47}
48
49#[test]
50fn test_allowance() {
51    assert_eq!(
52        const_hex::const_decode_to_array::<{ 4 + 32 * 2 }>(b"dd62ed3e0000000000000000000000006221a9c005f6e47eb398fd867784cacfdcfff4e7000000000000000000000000feb6034fc7df27df18a3a6bad5fb94c0d3dcb6d5").unwrap(),
53        make_fn_allowance(
54            const_hex::const_decode_to_array::<20>(b"6221a9c005f6e47eb398fd867784cacfdcfff4e7").unwrap(),
55            const_hex::const_decode_to_array::<20>(b"feb6034fc7df27df18a3a6bad5fb94c0d3dcb6d5").unwrap(),
56        )
57    )
58}