Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
@sushiswap/furo / deployments / fantom / FuroVestingRouter.json
Size: Mime:
{
  "address": "0x312A8E33d78d3Ab79E62971E86e5e8c9c5E28D64",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "contract IBentoBoxMinimal",
          "name": "_bentoBox",
          "type": "address"
        },
        {
          "internalType": "contract IFuroVesting",
          "name": "_furoVesting",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_wETH",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [],
      "name": "InsufficientShares",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "bentoBox",
      "outputs": [
        {
          "internalType": "contract IBentoBoxMinimal",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "contract IERC20",
              "name": "token",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "recipient",
              "type": "address"
            },
            {
              "internalType": "uint32",
              "name": "start",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "cliffDuration",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "stepDuration",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "steps",
              "type": "uint32"
            },
            {
              "internalType": "uint128",
              "name": "stepPercentage",
              "type": "uint128"
            },
            {
              "internalType": "uint128",
              "name": "amount",
              "type": "uint128"
            },
            {
              "internalType": "bool",
              "name": "fromBentoBox",
              "type": "bool"
            }
          ],
          "internalType": "struct IFuroVesting.VestParams",
          "name": "vestParams",
          "type": "tuple"
        },
        {
          "internalType": "uint256",
          "name": "minShare",
          "type": "uint256"
        }
      ],
      "name": "createVesting",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "depositedShares",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "vestId",
          "type": "uint256"
        },
        {
          "internalType": "uint128",
          "name": "stepShares",
          "type": "uint128"
        },
        {
          "internalType": "uint128",
          "name": "cliffShares",
          "type": "uint128"
        }
      ],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "furoVesting",
      "outputs": [
        {
          "internalType": "contract IFuroVesting",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes[]",
          "name": "data",
          "type": "bytes[]"
        }
      ],
      "name": "multicall",
      "outputs": [
        {
          "internalType": "bytes[]",
          "name": "results",
          "type": "bytes[]"
        }
      ],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "user",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "approved",
          "type": "bool"
        },
        {
          "internalType": "uint8",
          "name": "v",
          "type": "uint8"
        },
        {
          "internalType": "bytes32",
          "name": "r",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32",
          "name": "s",
          "type": "bytes32"
        }
      ],
      "name": "setBentoBoxApproval",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "wETH",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "transactionHash": "0xd6dd4f5a51420c27d721dc6ae76cf83a5c28e76ce77f19ea00a47064deaabf37",
  "receipt": {
    "to": null,
    "from": "0x9346e1966E0510b3491Fe04297bcb33c9e4729D5",
    "contractAddress": "0x312A8E33d78d3Ab79E62971E86e5e8c9c5E28D64",
    "transactionIndex": 2,
    "gasUsed": "987752",
    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000800000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000014000000000020000000000000000000000000000000000100000000000000000000080000000000000000000000000000000000000080100000000000000000000000000000000000000001000000000000000000100000040000000000000002000000000000000000000000000",
    "blockHash": "0x00022e0d0000115c34c2179b7b9c64b2ce2a0ad832e76d3405edb5daf6504f7c",
    "transactionHash": "0xd6dd4f5a51420c27d721dc6ae76cf83a5c28e76ce77f19ea00a47064deaabf37",
    "logs": [
      {
        "transactionIndex": 2,
        "blockNumber": 44697504,
        "transactionHash": "0xd6dd4f5a51420c27d721dc6ae76cf83a5c28e76ce77f19ea00a47064deaabf37",
        "address": "0xF5BCE5077908a1b7370B9ae04AdC565EBd643966",
        "topics": [
          "0x5f6ebb64ba012a851c6f014e6cad458ddf213d1512049b31cd06365c2b059257",
          "0x0000000000000000000000000689640d190b10765f09310fcfe9c670ede4e25b",
          "0x000000000000000000000000312a8e33d78d3ab79e62971e86e5e8c9c5e28d64"
        ],
        "data": "0x0000000000000000000000000000000000000000000000000000000000000001",
        "logIndex": 38,
        "blockHash": "0x00022e0d0000115c34c2179b7b9c64b2ce2a0ad832e76d3405edb5daf6504f7c"
      },
      {
        "transactionIndex": 2,
        "blockNumber": 44697504,
        "transactionHash": "0xd6dd4f5a51420c27d721dc6ae76cf83a5c28e76ce77f19ea00a47064deaabf37",
        "address": "0xF5BCE5077908a1b7370B9ae04AdC565EBd643966",
        "topics": [
          "0xdfb44ffabf0d3a8f650d3ce43eff98f6d050e7ea1a396d5794f014e7dadabacb",
          "0x000000000000000000000000312a8e33d78d3ab79e62971e86e5e8c9c5e28d64"
        ],
        "data": "0x",
        "logIndex": 39,
        "blockHash": "0x00022e0d0000115c34c2179b7b9c64b2ce2a0ad832e76d3405edb5daf6504f7c"
      }
    ],
    "blockNumber": 44697504,
    "cumulativeGasUsed": "1924521",
    "status": 1,
    "byzantium": true
  },
  "args": [
    "0xF5BCE5077908a1b7370B9ae04AdC565EBd643966",
    "0x0689640d190b10765f09310fCfE9C670eDe4E25B",
    "0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83"
  ],
  "numDeployments": 1,
  "solcInputHash": "cfe2c727d806878ef0812370cdeefc97",
  "metadata": "{\"compiler\":{\"version\":\"0.8.10+commit.fc410830\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IBentoBoxMinimal\",\"name\":\"_bentoBox\",\"type\":\"address\"},{\"internalType\":\"contract IFuroVesting\",\"name\":\"_furoVesting\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_wETH\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InsufficientShares\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"bentoBox\",\"outputs\":[{\"internalType\":\"contract IBentoBoxMinimal\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"start\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"cliffDuration\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"stepDuration\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"steps\",\"type\":\"uint32\"},{\"internalType\":\"uint128\",\"name\":\"stepPercentage\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"amount\",\"type\":\"uint128\"},{\"internalType\":\"bool\",\"name\":\"fromBentoBox\",\"type\":\"bool\"}],\"internalType\":\"struct IFuroVesting.VestParams\",\"name\":\"vestParams\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"minShare\",\"type\":\"uint256\"}],\"name\":\"createVesting\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"depositedShares\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"vestId\",\"type\":\"uint256\"},{\"internalType\":\"uint128\",\"name\":\"stepShares\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"cliffShares\",\"type\":\"uint128\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"furoVesting\",\"outputs\":[{\"internalType\":\"contract IFuroVesting\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"data\",\"type\":\"bytes[]\"}],\"name\":\"multicall\",\"outputs\":[{\"internalType\":\"bytes[]\",\"name\":\"results\",\"type\":\"bytes[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"setBentoBoxApproval\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"wETH\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/FuroVestingRouter.sol\":\"FuroVestingRouter\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n    enum Rounding {\\n        Down, // Toward negative infinity\\n        Up, // Toward infinity\\n        Zero // Toward zero\\n    }\\n\\n    /**\\n     * @dev Returns the largest of two numbers.\\n     */\\n    function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return a >= b ? a : b;\\n    }\\n\\n    /**\\n     * @dev Returns the smallest of two numbers.\\n     */\\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return a < b ? a : b;\\n    }\\n\\n    /**\\n     * @dev Returns the average of two numbers. The result is rounded towards\\n     * zero.\\n     */\\n    function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // (a + b) / 2 can overflow.\\n        return (a & b) + (a ^ b) / 2;\\n    }\\n\\n    /**\\n     * @dev Returns the ceiling of the division of two numbers.\\n     *\\n     * This differs from standard division with `/` in that it rounds up instead\\n     * of rounding down.\\n     */\\n    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // (a + b - 1) / b can overflow on addition, so we distribute.\\n        return a == 0 ? 0 : (a - 1) / b + 1;\\n    }\\n\\n    /**\\n     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n     * with further edits by Uniswap Labs also under MIT license.\\n     */\\n    function mulDiv(\\n        uint256 x,\\n        uint256 y,\\n        uint256 denominator\\n    ) internal pure returns (uint256 result) {\\n        unchecked {\\n            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n            // variables such that product = prod1 * 2^256 + prod0.\\n            uint256 prod0; // Least significant 256 bits of the product\\n            uint256 prod1; // Most significant 256 bits of the product\\n            assembly {\\n                let mm := mulmod(x, y, not(0))\\n                prod0 := mul(x, y)\\n                prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n            }\\n\\n            // Handle non-overflow cases, 256 by 256 division.\\n            if (prod1 == 0) {\\n                return prod0 / denominator;\\n            }\\n\\n            // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n            require(denominator > prod1);\\n\\n            ///////////////////////////////////////////////\\n            // 512 by 256 division.\\n            ///////////////////////////////////////////////\\n\\n            // Make division exact by subtracting the remainder from [prod1 prod0].\\n            uint256 remainder;\\n            assembly {\\n                // Compute remainder using mulmod.\\n                remainder := mulmod(x, y, denominator)\\n\\n                // Subtract 256 bit number from 512 bit number.\\n                prod1 := sub(prod1, gt(remainder, prod0))\\n                prod0 := sub(prod0, remainder)\\n            }\\n\\n            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n            // See https://cs.stackexchange.com/q/138556/92363.\\n\\n            // Does not overflow because the denominator cannot be zero at this stage in the function.\\n            uint256 twos = denominator & (~denominator + 1);\\n            assembly {\\n                // Divide denominator by twos.\\n                denominator := div(denominator, twos)\\n\\n                // Divide [prod1 prod0] by twos.\\n                prod0 := div(prod0, twos)\\n\\n                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n                twos := add(div(sub(0, twos), twos), 1)\\n            }\\n\\n            // Shift in bits from prod1 into prod0.\\n            prod0 |= prod1 * twos;\\n\\n            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n            // four bits. That is, denominator * inv = 1 mod 2^4.\\n            uint256 inverse = (3 * denominator) ^ 2;\\n\\n            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n            // in modular arithmetic, doubling the correct bits in each step.\\n            inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n            inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n            inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n            inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n            inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n            inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n            // is no longer required.\\n            result = prod0 * inverse;\\n            return result;\\n        }\\n    }\\n\\n    /**\\n     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n     */\\n    function mulDiv(\\n        uint256 x,\\n        uint256 y,\\n        uint256 denominator,\\n        Rounding rounding\\n    ) internal pure returns (uint256) {\\n        uint256 result = mulDiv(x, y, denominator);\\n        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n            result += 1;\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\\n     *\\n     * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n     */\\n    function sqrt(uint256 a) internal pure returns (uint256) {\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n        // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n        // `msb(a) <= a < 2*msb(a)`.\\n        // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\\n        // This gives `2**k < a <= 2**(k+1)` \\u2192 `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\\n        // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\\n        // good first aproximation of `sqrt(a)` with at least 1 correct bit.\\n        uint256 result = 1;\\n        uint256 x = a;\\n        if (x >> 128 > 0) {\\n            x >>= 128;\\n            result <<= 64;\\n        }\\n        if (x >> 64 > 0) {\\n            x >>= 64;\\n            result <<= 32;\\n        }\\n        if (x >> 32 > 0) {\\n            x >>= 32;\\n            result <<= 16;\\n        }\\n        if (x >> 16 > 0) {\\n            x >>= 16;\\n            result <<= 8;\\n        }\\n        if (x >> 8 > 0) {\\n            x >>= 8;\\n            result <<= 4;\\n        }\\n        if (x >> 4 > 0) {\\n            x >>= 4;\\n            result <<= 2;\\n        }\\n        if (x >> 2 > 0) {\\n            result <<= 1;\\n        }\\n\\n        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n        // into the expected uint128 result.\\n        unchecked {\\n            result = (result + a / result) >> 1;\\n            result = (result + a / result) >> 1;\\n            result = (result + a / result) >> 1;\\n            result = (result + a / result) >> 1;\\n            result = (result + a / result) >> 1;\\n            result = (result + a / result) >> 1;\\n            result = (result + a / result) >> 1;\\n            return min(result, a / result);\\n        }\\n    }\\n\\n    /**\\n     * @notice Calculates sqrt(a), following the selected rounding direction.\\n     */\\n    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n        uint256 result = sqrt(a);\\n        if (rounding == Rounding.Up && result * result < a) {\\n            result += 1;\\n        }\\n        return result;\\n    }\\n}\\n\",\"keccak256\":\"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0\",\"license\":\"MIT\"},\"@rari-capital/solmate/src/tokens/ERC721.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0-only\\npragma solidity >=0.8.0;\\n\\n/// @notice Modern, minimalist, and gas efficient ERC-721 implementation.\\n/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)\\n/// @dev Note that balanceOf does not revert if passed the zero address, in defiance of the ERC.\\nabstract contract ERC721 {\\n    /*///////////////////////////////////////////////////////////////\\n                                 EVENTS\\n    //////////////////////////////////////////////////////////////*/\\n\\n    event Transfer(address indexed from, address indexed to, uint256 indexed id);\\n\\n    event Approval(address indexed owner, address indexed spender, uint256 indexed id);\\n\\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n    /*///////////////////////////////////////////////////////////////\\n                          METADATA STORAGE/LOGIC\\n    //////////////////////////////////////////////////////////////*/\\n\\n    string public name;\\n\\n    string public symbol;\\n\\n    function tokenURI(uint256 id) public view virtual returns (string memory);\\n\\n    /*///////////////////////////////////////////////////////////////\\n                            ERC721 STORAGE                        \\n    //////////////////////////////////////////////////////////////*/\\n\\n    mapping(address => uint256) public balanceOf;\\n\\n    mapping(uint256 => address) public ownerOf;\\n\\n    mapping(uint256 => address) public getApproved;\\n\\n    mapping(address => mapping(address => bool)) public isApprovedForAll;\\n\\n    /*///////////////////////////////////////////////////////////////\\n                              CONSTRUCTOR\\n    //////////////////////////////////////////////////////////////*/\\n\\n    constructor(string memory _name, string memory _symbol) {\\n        name = _name;\\n        symbol = _symbol;\\n    }\\n\\n    /*///////////////////////////////////////////////////////////////\\n                              ERC721 LOGIC\\n    //////////////////////////////////////////////////////////////*/\\n\\n    function approve(address spender, uint256 id) public virtual {\\n        address owner = ownerOf[id];\\n\\n        require(msg.sender == owner || isApprovedForAll[owner][msg.sender], \\\"NOT_AUTHORIZED\\\");\\n\\n        getApproved[id] = spender;\\n\\n        emit Approval(owner, spender, id);\\n    }\\n\\n    function setApprovalForAll(address operator, bool approved) public virtual {\\n        isApprovedForAll[msg.sender][operator] = approved;\\n\\n        emit ApprovalForAll(msg.sender, operator, approved);\\n    }\\n\\n    function transferFrom(\\n        address from,\\n        address to,\\n        uint256 id\\n    ) public virtual {\\n        require(from == ownerOf[id], \\\"WRONG_FROM\\\");\\n\\n        require(to != address(0), \\\"INVALID_RECIPIENT\\\");\\n\\n        require(\\n            msg.sender == from || msg.sender == getApproved[id] || isApprovedForAll[from][msg.sender],\\n            \\\"NOT_AUTHORIZED\\\"\\n        );\\n\\n        // Underflow of the sender's balance is impossible because we check for\\n        // ownership above and the recipient's balance can't realistically overflow.\\n        unchecked {\\n            balanceOf[from]--;\\n\\n            balanceOf[to]++;\\n        }\\n\\n        ownerOf[id] = to;\\n\\n        delete getApproved[id];\\n\\n        emit Transfer(from, to, id);\\n    }\\n\\n    function safeTransferFrom(\\n        address from,\\n        address to,\\n        uint256 id\\n    ) public virtual {\\n        transferFrom(from, to, id);\\n\\n        require(\\n            to.code.length == 0 ||\\n                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, \\\"\\\") ==\\n                ERC721TokenReceiver.onERC721Received.selector,\\n            \\\"UNSAFE_RECIPIENT\\\"\\n        );\\n    }\\n\\n    function safeTransferFrom(\\n        address from,\\n        address to,\\n        uint256 id,\\n        bytes memory data\\n    ) public virtual {\\n        transferFrom(from, to, id);\\n\\n        require(\\n            to.code.length == 0 ||\\n                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) ==\\n                ERC721TokenReceiver.onERC721Received.selector,\\n            \\\"UNSAFE_RECIPIENT\\\"\\n        );\\n    }\\n\\n    /*///////////////////////////////////////////////////////////////\\n                              ERC165 LOGIC\\n    //////////////////////////////////////////////////////////////*/\\n\\n    function supportsInterface(bytes4 interfaceId) public pure virtual returns (bool) {\\n        return\\n            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165\\n            interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721\\n            interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata\\n    }\\n\\n    /*///////////////////////////////////////////////////////////////\\n                       INTERNAL MINT/BURN LOGIC\\n    //////////////////////////////////////////////////////////////*/\\n\\n    function _mint(address to, uint256 id) internal virtual {\\n        require(to != address(0), \\\"INVALID_RECIPIENT\\\");\\n\\n        require(ownerOf[id] == address(0), \\\"ALREADY_MINTED\\\");\\n\\n        // Counter overflow is incredibly unrealistic.\\n        unchecked {\\n            balanceOf[to]++;\\n        }\\n\\n        ownerOf[id] = to;\\n\\n        emit Transfer(address(0), to, id);\\n    }\\n\\n    function _burn(uint256 id) internal virtual {\\n        address owner = ownerOf[id];\\n\\n        require(ownerOf[id] != address(0), \\\"NOT_MINTED\\\");\\n\\n        // Ownership check above ensures no underflow.\\n        unchecked {\\n            balanceOf[owner]--;\\n        }\\n\\n        delete ownerOf[id];\\n\\n        delete getApproved[id];\\n\\n        emit Transfer(owner, address(0), id);\\n    }\\n\\n    /*///////////////////////////////////////////////////////////////\\n                       INTERNAL SAFE MINT LOGIC\\n    //////////////////////////////////////////////////////////////*/\\n\\n    function _safeMint(address to, uint256 id) internal virtual {\\n        _mint(to, id);\\n\\n        require(\\n            to.code.length == 0 ||\\n                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, \\\"\\\") ==\\n                ERC721TokenReceiver.onERC721Received.selector,\\n            \\\"UNSAFE_RECIPIENT\\\"\\n        );\\n    }\\n\\n    function _safeMint(\\n        address to,\\n        uint256 id,\\n        bytes memory data\\n    ) internal virtual {\\n        _mint(to, id);\\n\\n        require(\\n            to.code.length == 0 ||\\n                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) ==\\n                ERC721TokenReceiver.onERC721Received.selector,\\n            \\\"UNSAFE_RECIPIENT\\\"\\n        );\\n    }\\n}\\n\\n/// @notice A generic interface for a contract which properly accepts ERC721 tokens.\\n/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)\\ninterface ERC721TokenReceiver {\\n    function onERC721Received(\\n        address operator,\\n        address from,\\n        uint256 id,\\n        bytes calldata data\\n    ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xf97378ab999188b3d5d97037fabbecbc726892c74cba6536899b852eb4756d6a\",\"license\":\"AGPL-3.0-only\"},\"contracts/FuroVestingRouter.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n\\npragma solidity 0.8.10;\\n\\nimport './interfaces/IFuroVesting.sol';\\n\\ncontract FuroVestingRouter is Multicall {\\n  IBentoBoxMinimal public immutable bentoBox;\\n  IFuroVesting public immutable furoVesting;\\n  address public immutable wETH;\\n\\n  // custom errors\\n  error InsufficientShares();\\n\\n  constructor(\\n    IBentoBoxMinimal _bentoBox,\\n    IFuroVesting _furoVesting,\\n    address _wETH\\n  ) {\\n    bentoBox = _bentoBox;\\n    furoVesting = _furoVesting;\\n    wETH = _wETH;\\n    _bentoBox.setMasterContractApproval(address(this), address(_furoVesting), true, 0, bytes32(0), bytes32(0));\\n    _bentoBox.registerProtocol();\\n  }\\n\\n  function setBentoBoxApproval(\\n    address user,\\n    bool approved,\\n    uint8 v,\\n    bytes32 r,\\n    bytes32 s\\n  ) external payable {\\n    bentoBox.setMasterContractApproval(user, address(this), approved, v, r, s);\\n  }\\n\\n  function createVesting(IFuroVesting.VestParams memory vestParams, uint256 minShare)\\n    external\\n    payable\\n    returns (\\n      uint256 depositedShares,\\n      uint256 vestId,\\n      uint128 stepShares,\\n      uint128 cliffShares\\n    )\\n  {\\n    depositedShares = _depositToken(\\n      address(vestParams.token),\\n      msg.sender,\\n      address(this),\\n      vestParams.amount,\\n      vestParams.fromBentoBox\\n    );\\n\\n    if (depositedShares < minShare) revert InsufficientShares();\\n\\n    if (address(vestParams.token) == address(0)) {\\n      vestParams.token = IERC20(wETH);\\n    }\\n    vestParams.fromBentoBox = true;\\n\\n    (depositedShares, vestId, stepShares, cliffShares) = furoVesting.createVesting(vestParams);\\n\\n    furoVesting.updateOwner(vestId, msg.sender);\\n  }\\n\\n  function _depositToken(\\n    address token,\\n    address from,\\n    address to,\\n    uint256 amount,\\n    bool fromBentoBox\\n  ) internal returns (uint256 depositedShares) {\\n    if (fromBentoBox) {\\n      depositedShares = bentoBox.toShare(token, amount, false);\\n      bentoBox.transfer(token, from, to, depositedShares);\\n    } else {\\n      (, depositedShares) = bentoBox.deposit{value: token == address(0) ? amount : 0}(token, from, to, amount, 0);\\n    }\\n  }\\n}\\n\",\"keccak256\":\"0xd3b10aa74a5a364f5188c302b398816cade6ed4fe4ec3cd1b5dcf7297ff50c78\",\"license\":\"GPL-3.0-or-later\"},\"contracts/interfaces/IBentoBoxMinimal.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n\\npragma solidity 0.8.10;\\n\\n/// @notice Minimal BentoBox vault interface.\\n/// @dev `token` is aliased as `address` from `IERC20` for simplicity.\\ninterface IBentoBoxMinimal {\\n    /// @notice Balance per ERC-20 token per account in shares.\\n    function balanceOf(address, address) external view returns (uint256);\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        address token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share);\\n\\n    /// @dev Helper function to represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        address token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount);\\n\\n    /// @notice Registers this contract so that users can approve it for BentoBox.\\n    function registerProtocol() external;\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount represented in shares.\\n    function deposit(\\n        address token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external payable returns (uint256 amountOut, uint256 shareOut);\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        address token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external returns (uint256 amountOut, uint256 shareOut);\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    function transfer(\\n        address token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) external;\\n\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n}\\n\",\"keccak256\":\"0x3e135c9c5030751760c2a558bda7c699bc0525b15fdea6f084075dc2804064c9\",\"license\":\"GPL-3.0-or-later\"},\"contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.10;\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender)\\n        external\\n        view\\n        returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(\\n        address indexed owner,\\n        address indexed spender,\\n        uint256 value\\n    );\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n}\\n\",\"keccak256\":\"0xec0a527d973f9a1d9395f6a548acf2c7edd49cb3db50d1bb5e8d74486c18e46f\",\"license\":\"MIT\"},\"contracts/interfaces/IFuroVesting.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n\\npragma solidity 0.8.10;\\n\\nimport \\\"./ITasker.sol\\\";\\nimport \\\"./IERC20.sol\\\";\\nimport \\\"./ITokenURIFetcher.sol\\\";\\nimport \\\"./IBentoBoxMinimal.sol\\\";\\nimport \\\"../utils/Multicall.sol\\\";\\nimport \\\"../utils/BoringOwnable.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/math/Math.sol\\\";\\nimport \\\"@rari-capital/solmate/src/tokens/ERC721.sol\\\";\\n\\ninterface IFuroVesting {\\n    function setBentoBoxApproval(\\n        address user,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external payable;\\n\\n    function createVesting(VestParams calldata vestParams)\\n        external\\n        payable\\n        returns (\\n            uint256 depositedShares,\\n            uint256 vestId,\\n            uint128 stepShares,\\n            uint128 cliffShares\\n        );\\n\\n    function withdraw(\\n        uint256 vestId,\\n        bytes memory taskData,\\n        bool toBentoBox\\n    ) external;\\n\\n    function stopVesting(uint256 vestId, bool toBentoBox) external;\\n\\n    function vestBalance(uint256 vestId) external view returns (uint256);\\n\\n    function updateOwner(uint256 vestId, address newOwner) external;\\n\\n    struct VestParams {\\n        IERC20 token;\\n        address recipient;\\n        uint32 start;\\n        uint32 cliffDuration;\\n        uint32 stepDuration;\\n        uint32 steps;\\n        uint128 stepPercentage;\\n        uint128 amount;\\n        bool fromBentoBox;\\n    }\\n\\n    struct Vest {\\n        address owner;\\n        IERC20 token;\\n        uint32 start;\\n        uint32 cliffDuration;\\n        uint32 stepDuration;\\n        uint32 steps;\\n        uint128 cliffShares;\\n        uint128 stepShares;\\n        uint128 claimed;\\n    }\\n\\n    event CreateVesting(\\n        uint256 indexed vestId,\\n        IERC20 token,\\n        address indexed owner,\\n        address indexed recipient,\\n        uint32 start,\\n        uint32 cliffDuration,\\n        uint32 stepDuration,\\n        uint32 steps,\\n        uint128 cliffShares,\\n        uint128 stepShares,\\n        bool fromBentoBox\\n    );\\n\\n    event Withdraw(\\n        uint256 indexed vestId,\\n        IERC20 indexed token,\\n        uint256 indexed amount,\\n        bool toBentoBox\\n    );\\n\\n    event CancelVesting(\\n        uint256 indexed vestId,\\n        uint256 indexed ownerAmount,\\n        uint256 indexed recipientAmount,\\n        IERC20 token,\\n        bool toBentoBox\\n    );\\n\\n    event LogUpdateOwner(uint256 indexed vestId, address indexed newOwner);\\n}\\n\",\"keccak256\":\"0x94029cc91403f8d77e404d9a8ec1c1febb97aafddcc642d1199c528f5cb11f3e\",\"license\":\"GPL-3.0-or-later\"},\"contracts/interfaces/ITasker.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n\\npragma solidity 0.8.10;\\n\\ninterface ITasker {\\n    function onTaskReceived(\\n        bytes calldata data\\n    ) external;\\n}\\n\",\"keccak256\":\"0x11e5f363d8e6250c7e34e2845a2f1f6a33085a07efa286fd047fe9d5aa9e0a02\",\"license\":\"GPL-3.0-or-later\"},\"contracts/interfaces/ITokenURIFetcher.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n\\npragma solidity 0.8.10;\\n\\ninterface ITokenURIFetcher {\\n    function fetchTokenURIData(uint256 id)\\n        external\\n        view\\n        returns (string memory);\\n}\\n\",\"keccak256\":\"0x96bff838b3cf677bcdcc63618f7991be418601bdf854ca8247e3d942c665d68f\",\"license\":\"GPL-3.0-or-later\"},\"contracts/utils/BoringOwnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.6.12;\\n\\n// Audit on 5-Jan-2021 by Keno and BoringCrypto\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(\\n        address indexed previousOwner,\\n        address indexed newOwner\\n    );\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(\\n                newOwner != address(0) || renounce,\\n                \\\"Ownable: zero address\\\"\\n            );\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(\\n            msg.sender == _pendingOwner,\\n            \\\"Ownable: caller != pending owner\\\"\\n        );\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\",\"keccak256\":\"0x6ceaca1fef363dd2a8a71e48b1f73aeb673cf08c9336378e8dc40b23615336b9\",\"license\":\"MIT\"},\"contracts/utils/Multicall.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-2.0-or-later\\npragma solidity 0.8.10;\\n\\n/// @title Multicall\\n/// @notice Enables calling multiple methods in a single call to the contract\\nabstract contract Multicall {\\n    function multicall(bytes[] calldata data)\\n        public\\n        payable\\n        returns (bytes[] memory results)\\n    {\\n        results = new bytes[](data.length);\\n        for (uint256 i = 0; i < data.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(\\n                data[i]\\n            );\\n\\n            if (!success) {\\n                // Next 5 lines from https://ethereum.stackexchange.com/a/83577\\n                if (result.length < 68) revert();\\n                assembly {\\n                    result := add(result, 0x04)\\n                }\\n                revert(abi.decode(result, (string)));\\n            }\\n\\n            results[i] = result;\\n        }\\n    }\\n}\",\"keccak256\":\"0x45f781fda06ef92136bdf1b418bcff631c619015b8001d9eebbacb2f91fcfa51\",\"license\":\"GPL-2.0-or-later\"}},\"version\":1}",
  "bytecode": "0x60e06040523480156200001157600080fd5b50604051620011d9380380620011d983398101604081905262000034916200013e565b6001600160a01b03838116608081905283821660a081905291831660c05260405163c0a47c9360e01b81523060048201526024810192909252600160448301526000606483018190526084830181905260a48301529063c0a47c939060c401600060405180830381600087803b158015620000ae57600080fd5b505af1158015620000c3573d6000803e3d6000fd5b50505050826001600160a01b031663aee4d1b26040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200010357600080fd5b505af115801562000118573d6000803e3d6000fd5b5050505050505062000192565b6001600160a01b03811681146200013b57600080fd5b50565b6000806000606084860312156200015457600080fd5b8351620001618162000125565b6020850151909350620001748162000125565b6040850151909250620001878162000125565b809150509250925092565b60805160a05160c051610fe7620001f26000396000818161018e015261025101526000818160cc015281816102b9015261037001526000818161013a015281816104540152818161068d0152818161075701526107d10152610fe76000f3fe6080604052600436106100655760003560e01c80636b2ace87116100435780636b2ace8714610128578063ac9650d81461015c578063f24286211461017c57600080fd5b8063061251b11461006a57806314b70579146100ba578063489bb0b214610113575b600080fd5b61007d61007836600461099c565b6101b0565b6040805194855260208501939093526fffffffffffffffffffffffffffffffff918216928401929092521660608201526080015b60405180910390f35b3480156100c657600080fd5b506100ee7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b1565b610126610121366004610a6a565b6103ea565b005b34801561013457600080fd5b506100ee7f000000000000000000000000000000000000000000000000000000000000000081565b61016f61016a366004610ac9565b6104b7565b6040516100b19190610bb8565b34801561018857600080fd5b506100ee7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806101e2866000015133308960e001516fffffffffffffffffffffffffffffffff168a6101000151610632565b93508484101561021e576040517f3999656700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b855173ffffffffffffffffffffffffffffffffffffffff166102745773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686525b60016101008701526040517fe9d163c900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e9d163c9906102ee908990600401610c38565b6080604051808303816000875af115801561030d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103319190610d39565b6040517f7192711f00000000000000000000000000000000000000000000000000000000815260048101849052336024820152939750919550935091507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690637192711f90604401600060405180830381600087803b1580156103c957600080fd5b505af11580156103dd573d6000803e3d6000fd5b5050505092959194509250565b6040517fc0a47c9300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152306024830152851515604483015260ff851660648301526084820184905260a482018390527f0000000000000000000000000000000000000000000000000000000000000000169063c0a47c939060c401600060405180830381600087803b15801561049857600080fd5b505af11580156104ac573d6000803e3d6000fd5b505050505050505050565b60608167ffffffffffffffff8111156104d2576104d26108c1565b60405190808252806020026020018201604052801561050557816020015b60608152602001906001900390816104f05790505b50905060005b8281101561062b576000803086868581811061052957610529610d84565b905060200281019061053b9190610db3565b604051610549929190610e1f565b600060405180830381855af49150503d8060008114610584576040519150601f19603f3d011682016040523d82523d6000602084013e610589565b606091505b5091509150816105f8576044815110156105a257600080fd5b600481019050808060200190518101906105bc9190610e2f565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ef9190610efa565b60405180910390fd5b8084848151811061060b5761060b610d84565b60200260200101819052505050808061062390610f14565b91505061050b565b5092915050565b600081156107ba576040517fda5139ca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015260248201859052600060448301527f0000000000000000000000000000000000000000000000000000000000000000169063da5139ca90606401602060405180830381865afa1580156106d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f89190610f74565b6040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015287811660248301528681166044830152606482018390529192507f00000000000000000000000000000000000000000000000000000000000000009091169063f18d03cc90608401600060405180830381600087803b15801561079d57600080fd5b505af11580156107b1573d6000803e3d6000fd5b505050506108b8565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116906302b9446c90881615610807576000610809565b845b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff808b166004830152808a16602483015288166044820152606481018790526000608482015260a401604080518083038185885af115801561088f573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906108b49190610f8d565b9150505b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610120810167ffffffffffffffff81118282101715610914576109146108c1565b60405290565b73ffffffffffffffffffffffffffffffffffffffff8116811461093c57600080fd5b50565b803561094a8161091a565b919050565b803563ffffffff8116811461094a57600080fd5b6fffffffffffffffffffffffffffffffff8116811461093c57600080fd5b803561094a81610963565b8035801515811461094a57600080fd5b6000808284036101408112156109b157600080fd5b610120808212156109c157600080fd5b6109c96108f0565b91506109d48561093f565b82526109e26020860161093f565b60208301526109f36040860161094f565b6040830152610a046060860161094f565b6060830152610a156080860161094f565b6080830152610a2660a0860161094f565b60a0830152610a3760c08601610981565b60c0830152610a4860e08601610981565b60e0830152610100610a5b81870161098c565b90830152909593013593505050565b600080600080600060a08688031215610a8257600080fd5b8535610a8d8161091a565b9450610a9b6020870161098c565b9350604086013560ff81168114610ab157600080fd5b94979396509394606081013594506080013592915050565b60008060208385031215610adc57600080fd5b823567ffffffffffffffff80821115610af457600080fd5b818501915085601f830112610b0857600080fd5b813581811115610b1757600080fd5b8660208260051b8501011115610b2c57600080fd5b60209290920196919550909350505050565b60005b83811015610b59578181015183820152602001610b41565b83811115610b68576000848401525b50505050565b60008151808452610b86816020860160208601610b3e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015610c2b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452610c19858351610b6e565b94509285019290850190600101610bdf565b5092979650505050505050565b815173ffffffffffffffffffffffffffffffffffffffff168152602080830151610120830191610c7f9084018273ffffffffffffffffffffffffffffffffffffffff169052565b506040830151610c97604084018263ffffffff169052565b506060830151610caf606084018263ffffffff169052565b506080830151610cc7608084018263ffffffff169052565b5060a0830151610cdf60a084018263ffffffff169052565b5060c0830151610d0360c08401826fffffffffffffffffffffffffffffffff169052565b5060e0830151610d2760e08401826fffffffffffffffffffffffffffffffff169052565b50610100928301511515919092015290565b60008060008060808587031215610d4f57600080fd5b84519350602085015192506040850151610d6881610963565b6060860151909250610d7981610963565b939692955090935050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610de857600080fd5b83018035915067ffffffffffffffff821115610e0357600080fd5b602001915036819003821315610e1857600080fd5b9250929050565b8183823760009101908152919050565b600060208284031215610e4157600080fd5b815167ffffffffffffffff80821115610e5957600080fd5b818401915084601f830112610e6d57600080fd5b815181811115610e7f57610e7f6108c1565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610ec557610ec56108c1565b81604052828152876020848701011115610ede57600080fd5b610eef836020830160208801610b3e565b979650505050505050565b602081526000610f0d6020830184610b6e565b9392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610f6d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b600060208284031215610f8657600080fd5b5051919050565b60008060408385031215610fa057600080fd5b50508051602090910151909290915056fea2646970667358221220b35050061df25b03f8fdeb533b497c50985b7bd9058e344c24685a1368d63a1d64736f6c634300080a0033",
  "deployedBytecode": "0x6080604052600436106100655760003560e01c80636b2ace87116100435780636b2ace8714610128578063ac9650d81461015c578063f24286211461017c57600080fd5b8063061251b11461006a57806314b70579146100ba578063489bb0b214610113575b600080fd5b61007d61007836600461099c565b6101b0565b6040805194855260208501939093526fffffffffffffffffffffffffffffffff918216928401929092521660608201526080015b60405180910390f35b3480156100c657600080fd5b506100ee7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b1565b610126610121366004610a6a565b6103ea565b005b34801561013457600080fd5b506100ee7f000000000000000000000000000000000000000000000000000000000000000081565b61016f61016a366004610ac9565b6104b7565b6040516100b19190610bb8565b34801561018857600080fd5b506100ee7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806101e2866000015133308960e001516fffffffffffffffffffffffffffffffff168a6101000151610632565b93508484101561021e576040517f3999656700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b855173ffffffffffffffffffffffffffffffffffffffff166102745773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686525b60016101008701526040517fe9d163c900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e9d163c9906102ee908990600401610c38565b6080604051808303816000875af115801561030d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103319190610d39565b6040517f7192711f00000000000000000000000000000000000000000000000000000000815260048101849052336024820152939750919550935091507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690637192711f90604401600060405180830381600087803b1580156103c957600080fd5b505af11580156103dd573d6000803e3d6000fd5b5050505092959194509250565b6040517fc0a47c9300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152306024830152851515604483015260ff851660648301526084820184905260a482018390527f0000000000000000000000000000000000000000000000000000000000000000169063c0a47c939060c401600060405180830381600087803b15801561049857600080fd5b505af11580156104ac573d6000803e3d6000fd5b505050505050505050565b60608167ffffffffffffffff8111156104d2576104d26108c1565b60405190808252806020026020018201604052801561050557816020015b60608152602001906001900390816104f05790505b50905060005b8281101561062b576000803086868581811061052957610529610d84565b905060200281019061053b9190610db3565b604051610549929190610e1f565b600060405180830381855af49150503d8060008114610584576040519150601f19603f3d011682016040523d82523d6000602084013e610589565b606091505b5091509150816105f8576044815110156105a257600080fd5b600481019050808060200190518101906105bc9190610e2f565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ef9190610efa565b60405180910390fd5b8084848151811061060b5761060b610d84565b60200260200101819052505050808061062390610f14565b91505061050b565b5092915050565b600081156107ba576040517fda5139ca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015260248201859052600060448301527f0000000000000000000000000000000000000000000000000000000000000000169063da5139ca90606401602060405180830381865afa1580156106d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f89190610f74565b6040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015287811660248301528681166044830152606482018390529192507f00000000000000000000000000000000000000000000000000000000000000009091169063f18d03cc90608401600060405180830381600087803b15801561079d57600080fd5b505af11580156107b1573d6000803e3d6000fd5b505050506108b8565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116906302b9446c90881615610807576000610809565b845b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff808b166004830152808a16602483015288166044820152606481018790526000608482015260a401604080518083038185885af115801561088f573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906108b49190610f8d565b9150505b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610120810167ffffffffffffffff81118282101715610914576109146108c1565b60405290565b73ffffffffffffffffffffffffffffffffffffffff8116811461093c57600080fd5b50565b803561094a8161091a565b919050565b803563ffffffff8116811461094a57600080fd5b6fffffffffffffffffffffffffffffffff8116811461093c57600080fd5b803561094a81610963565b8035801515811461094a57600080fd5b6000808284036101408112156109b157600080fd5b610120808212156109c157600080fd5b6109c96108f0565b91506109d48561093f565b82526109e26020860161093f565b60208301526109f36040860161094f565b6040830152610a046060860161094f565b6060830152610a156080860161094f565b6080830152610a2660a0860161094f565b60a0830152610a3760c08601610981565b60c0830152610a4860e08601610981565b60e0830152610100610a5b81870161098c565b90830152909593013593505050565b600080600080600060a08688031215610a8257600080fd5b8535610a8d8161091a565b9450610a9b6020870161098c565b9350604086013560ff81168114610ab157600080fd5b94979396509394606081013594506080013592915050565b60008060208385031215610adc57600080fd5b823567ffffffffffffffff80821115610af457600080fd5b818501915085601f830112610b0857600080fd5b813581811115610b1757600080fd5b8660208260051b8501011115610b2c57600080fd5b60209290920196919550909350505050565b60005b83811015610b59578181015183820152602001610b41565b83811115610b68576000848401525b50505050565b60008151808452610b86816020860160208601610b3e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015610c2b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452610c19858351610b6e565b94509285019290850190600101610bdf565b5092979650505050505050565b815173ffffffffffffffffffffffffffffffffffffffff168152602080830151610120830191610c7f9084018273ffffffffffffffffffffffffffffffffffffffff169052565b506040830151610c97604084018263ffffffff169052565b506060830151610caf606084018263ffffffff169052565b506080830151610cc7608084018263ffffffff169052565b5060a0830151610cdf60a084018263ffffffff169052565b5060c0830151610d0360c08401826fffffffffffffffffffffffffffffffff169052565b5060e0830151610d2760e08401826fffffffffffffffffffffffffffffffff169052565b50610100928301511515919092015290565b60008060008060808587031215610d4f57600080fd5b84519350602085015192506040850151610d6881610963565b6060860151909250610d7981610963565b939692955090935050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610de857600080fd5b83018035915067ffffffffffffffff821115610e0357600080fd5b602001915036819003821315610e1857600080fd5b9250929050565b8183823760009101908152919050565b600060208284031215610e4157600080fd5b815167ffffffffffffffff80821115610e5957600080fd5b818401915084601f830112610e6d57600080fd5b815181811115610e7f57610e7f6108c1565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610ec557610ec56108c1565b81604052828152876020848701011115610ede57600080fd5b610eef836020830160208801610b3e565b979650505050505050565b602081526000610f0d6020830184610b6e565b9392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610f6d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b600060208284031215610f8657600080fd5b5051919050565b60008060408385031215610fa057600080fd5b50508051602090910151909290915056fea2646970667358221220b35050061df25b03f8fdeb533b497c50985b7bd9058e344c24685a1368d63a1d64736f6c634300080a0033",
  "devdoc": {
    "kind": "dev",
    "methods": {},
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {},
    "version": 1
  },
  "storageLayout": {
    "storage": [],
    "types": null
  }
}