#solidity

eth-encode-packed

Easy to use replica of Solidity abi.encodePacked

1 unstable release

0.1.0 Aug 26, 2021

#102 in #solidity

Download history 256/week @ 2024-07-21 378/week @ 2024-07-28 255/week @ 2024-08-04 243/week @ 2024-08-11 293/week @ 2024-08-18 404/week @ 2024-08-25 397/week @ 2024-09-01 76/week @ 2024-09-08 65/week @ 2024-09-15 102/week @ 2024-09-22 120/week @ 2024-09-29 84/week @ 2024-10-06 99/week @ 2024-10-13 387/week @ 2024-10-20 128/week @ 2024-10-27 365/week @ 2024-11-03

985 downloads per month

MIT license

11KB
140 lines

Ethereum abi.encodePacked() in Rust

This project allows data serialization and packing in Rust as it's being done in Solidity with abi.encodePacked()

Example usage

packing an uint24

let input = vec![
    // this is supposed to be uint24 variable in solidity
    SolidityDataType::NumberWithShift(U256::from(4001), TakeLastXBytes(24))
];
let (bytes, hash) = abi::encode_packed(&input);
let hash = format!("0x{:}", hash);
let expected = "0x000fa1";
assert_eq!(hash, expected);

Packing a lot of data

Solidity

    function packer(
        uint24 uint24_data,
        uint256 tokenId,
        string calldata ipfsURI,
        address sample,
        uint256 id
    ) public pure returns (bytes memory ){
        bytes memory res = abi.encodePacked(uint24_data, tokenId, ipfsURI, sample, id);
        return res;
    }

Rust

let address = hex::decode("d8b934580fcE35a11B58C6D73aDeE468a2833fa8").unwrap();
let address: [u8; 20] = address.try_into().unwrap();
let input = vec![
    SolidityDataType::NumberWithShift(U256::from(3838), TakeLastXBytes(24)),
    SolidityDataType::Number(U256::from(4001)),
    SolidityDataType::String("this-is-a-sample-string"),
    SolidityDataType::Address(Address::from(address)),
    SolidityDataType::Number(U256::from(1)),
];
let (_bytes, hash) = abi::encode_packed(&input);
let hash = format!("0x{:}", hash);
let expected = "0x000efe0000000000000000000000000000000000000000000000000000000000000fa1746869732d69732d612d73616d706c652d737472696e67d8b934580fce35a11b58c6d73adee468a2833fa80000000000000000000000000000000000000000000000000000000000000001";
assert_eq!(hash, expected);

Dependencies

~2.6–3.5MB
~60K SLoC