1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
use ethabi::Token;
use snafu::ensure;
use solana_sdk::pubkey::Pubkey;

use super::errors::*;
use super::Result;

pub trait ParseTokens: Sized {
    fn parse(tokens: Vec<Token>) -> Result<Self>;
}

impl ParseTokens for Pubkey {
    fn parse(inputs: Vec<Token>) -> Result<Self> {
        ensure!(
            inputs.len() == 1,
            ParamsCountMismatch {
                expected: 1_usize,
                got: inputs.len()
            }
        );

        let bytes = match &inputs[0] {
            Token::FixedBytes(bytes) if bytes.len() == 32 => bytes,
            t => {
                return UnexpectedInput {
                    expected: String::from("bytes32"),
                    got: t.to_string(),
                }
                .fail()
            }
        };

        Ok(Pubkey::new(&bytes))
    }
}