solid-grinder 0.0.4

A CLI that goes along with building blocks of smart contract. Along with our front-end snippets, this toolbox can reduce L2 gas cost by encoding calldata for dApps development to use as little bytes of calldata as possible.
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {IAddressTable} from "@solid-grinder/interfaces/IAddressTable.sol";
import {BytesLib} from "@main/libraries/BytesLib.sol";


contract UniswapV2Router02_Decoder {


    using BytesLib for bytes;
    IAddressTable public immutable addressTable;

    constructor(IAddressTable _addressTable) {
        addressTable = _addressTable;
    }

    struct addLiquidityData {
        address tokenA;
        address tokenB;
        uint256 amountADesired;
        uint256 amountBDesired;
        uint256 amountAMin;
        uint256 amountBMin;
        address to;
        uint256 deadline;
        
    }

    function _decode_addLiquidityData(bytes memory _data, uint256 _cursor)
        internal
        view
        returns (addLiquidityData memory _addLiquidityData, uint256 _newCursor)
    {
        (_addLiquidityData.tokenA, _cursor) = _lookupAddress_addLiquidity_24bits(_data, _cursor);
        (_addLiquidityData.tokenB, _cursor) = _lookupAddress_addLiquidity_24bits(_data, _cursor);
        (_addLiquidityData.amountADesired, _cursor) = _deserializeAmount_addLiquidity_96bits(_data, _cursor);
        (_addLiquidityData.amountBDesired, _cursor) = _deserializeAmount_addLiquidity_96bits(_data, _cursor);
        (_addLiquidityData.amountAMin, _cursor) = _deserializeAmount_addLiquidity_96bits(_data, _cursor);
        (_addLiquidityData.amountBMin, _cursor) = _deserializeAmount_addLiquidity_96bits(_data, _cursor);
        (_addLiquidityData.to, _cursor) = _lookupAddress_addLiquidity_24bits(_data, _cursor);
        (_addLiquidityData.deadline, _cursor) = _deserializeAmount_addLiquidity_40bits(_data, _cursor);
        
        _newCursor = _cursor;
    }


    function _lookupAddress_addLiquidity_24bits(bytes memory _data, uint256 _cursor)
        internal
        view
        
        returns ( address _decoded, uint256 _newCursor)
    {
        _decoded = addressTable.lookupIndex(_data.toUint24(_cursor));
        
        _cursor += 3;
        _newCursor = _cursor;
    }
    function _deserializeAmount_addLiquidity_96bits(bytes memory _data, uint256 _cursor)
        internal
        
        pure
        returns ( uint256 _decoded, uint256 _newCursor)
    {
        
        _decoded = _data.toUint96(_cursor);
        _cursor += 12;
        _newCursor = _cursor;
    }
    function _deserializeAmount_addLiquidity_40bits(bytes memory _data, uint256 _cursor)
        internal
        
        pure
        returns ( uint256 _decoded, uint256 _newCursor)
    {
        
        _decoded = _data.toUint40(_cursor);
        _cursor += 5;
        _newCursor = _cursor;
    }
    

}