false
true
0

Contract Address Details

0x0000000000F74F1b4209633479FEC181628746B1

Contract Name
RageRouter
Creator
0x13b0d8–e9bef2 at 0x1841ed–3a1cd5
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
Fetching transactions...
Transfers
Fetching transfers...
Gas Used
Fetching gas used...
Last Balance Update
26348740
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
This contract has been partially verified via Sourcify. View contract in Sourcify repository
Contract name:
RageRouter




Optimization enabled
true
Compiler version
v0.8.17+commit.8df45f5f




Optimization runs
9999999
EVM Version
london




Verified at
2026-04-22T01:58:46.641224Z

RageRouter.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/// @dev Contract Helpers.

/// @notice Contract helper for ERC1155 safeTransferFrom.
abstract contract ERC1155STF {
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) public virtual;
}

/// @notice Contract helper for remote token (ERC20/721/1155) burns.
/// @dev These functions are opinionated to OpenZeppelin implementations.
abstract contract TokenBurn {
    /// @dev ERC20.
    function burnFrom(address from, uint256 amount) public virtual;

    /// @dev ERC721.
    function burn(uint256 id) public virtual;

    /// @dev ERC1155.
    function burn(address from, uint256 id, uint256 amount) public virtual;
}

/// @notice Contract helper for fetching token (ERC20/721/1155) balances and supply.
abstract contract TokenSupply {
    /// @dev ERC20/721.

    function balanceOf(address account) public view virtual returns (uint256);

    function totalSupply() public view virtual returns (uint256);

    /// @dev ERC721.

    function ownerOf(uint256 id) public view virtual returns (address);

    /// @dev ERC1155.

    function balanceOf(
        address account,
        uint256 id
    ) public view virtual returns (uint256);

    function totalSupply(uint256 id) public view virtual returns (uint256);
}

/// @dev Free functions.

/// @notice Arithmetic free function collection with operations for fixed-point numbers.
/// @author Solbase (https://github.com/Sol-DAO/solbase/blob/main/src/utils/FixedPointMath.sol)
/// @author Modified from Solady (https://github.com/vectorized/solady/blob/main/src/utils/FixedPointMathLib.sol)

/// @dev The multiply-divide operation failed, either due to a
/// multiplication overflow, or a division by a zero.
error MulDivFailed();

/// @dev The maximum possible integer.
uint256 constant MAX_UINT256 = 2**256 - 1;

/// @dev Returns `floor(x * y / denominator)`.
/// Reverts if `x * y` overflows, or `denominator` is zero.
function mulDivDown(
    uint256 x,
    uint256 y,
    uint256 denominator
) pure returns (uint256 z) {
    assembly {
        // Equivalent to require(denominator != 0 && (y == 0 || x <= type(uint256).max / y))
        if iszero(mul(denominator, iszero(mul(y, gt(x, div(MAX_UINT256, y)))))) {
            // Store the function selector of `MulDivFailed()`.
            mstore(0x00, 0xad251c27)
            // Revert with (offset, size).
            revert(0x1c, 0x04)
        }

        // Divide x * y by the denominator.
        z := div(mul(x, y), denominator)
    }
}

/// @notice Safe ETH and ERC20 free function transfer collection that gracefully handles missing return values.
/// @author Solbase (https://github.com/Sol-DAO/solbase/blob/main/src/utils/SafeTransfer.sol)
/// @author Modified from Zolidity (https://github.com/z0r0z/zolidity/blob/main/src/utils/SafeTransfer.sol)

/// @dev The ERC20 `transferFrom` has failed.
error TransferFromFailed();

/// @dev Sends `amount` of ERC20 `token` from `from` to `to`.
/// Reverts upon failure.
///
/// The `from` account must have at least `amount` approved for
/// the current contract to manage.
function safeTransferFrom(
    address token,
    address from,
    address to,
    uint256 amount
) {
    assembly {
        // We'll write our calldata to this slot below, but restore it later.
        let memPointer := mload(0x40)

        // Write the abi-encoded calldata into memory, beginning with the function selector.
        mstore(0x00, 0x23b872dd)
        mstore(0x20, from) // Append the "from" argument.
        mstore(0x40, to) // Append the "to" argument.
        mstore(0x60, amount) // Append the "amount" argument.

        if iszero(
            and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(eq(mload(0x00), 1), iszero(returndatasize())),
                // We use 0x64 because that's the total length of our calldata (0x04 + 0x20 * 3)
                // Counterintuitively, this call() must be positioned after the or() in the
                // surrounding and() because and() evaluates its arguments from right to left.
                call(gas(), token, 0, 0x1c, 0x64, 0x00, 0x20)
            )
        ) {
            // Store the function selector of `TransferFromFailed()`.
            mstore(0x00, 0x7939f424)
            // Revert with (offset, size).
            revert(0x1c, 0x04)
        }

        mstore(0x60, 0) // Restore the zero slot to zero.
        mstore(0x40, memPointer) // Restore the memPointer.
    }
}

/// @dev Contracts.

/// @notice Contract helper for any EIP-2612, EIP-4494 or Dai-style token permit.
/// @author Solbase (https://github.com/Sol-DAO/solbase/blob/main/src/utils/Permit.sol)
abstract contract Permit {
    /// @dev ERC20.

    /// @notice Permit to spend tokens for EIP-2612 permit signatures.
    /// @param owner The address of the token holder.
    /// @param spender The address of the token permit holder.
    /// @param value The amount permitted to spend.
    /// @param deadline The unix timestamp before which permit must be spent.
    /// @param v Must produce valid secp256k1 signature from the `owner` along with `r` and `s`.
    /// @param r Must produce valid secp256k1 signature from the `owner` along with `v` and `s`.
    /// @param s Must produce valid secp256k1 signature from the `owner` along with `r` and `v`.
    /// @dev This permit will work for certain ERC721 supporting EIP-2612-style permits,
    /// such as Uniswap V3 position and Solbase NFTs.
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual;

    /// @notice Permit to spend tokens for permit signatures that have the `allowed` parameter.
    /// @param owner The address of the token holder.
    /// @param spender The address of the token permit holder.
    /// @param nonce The current nonce of the `owner`.
    /// @param deadline The unix timestamp before which permit must be spent.
    /// @param allowed If true, `spender` will be given permission to spend `owner`'s tokens.
    /// @param v Must produce valid secp256k1 signature from the `owner` along with `r` and `s`.
    /// @param r Must produce valid secp256k1 signature from the `owner` along with `v` and `s`.
    /// @param s Must produce valid secp256k1 signature from the `owner` along with `r` and `v`.
    function permit(
        address owner,
        address spender,
        uint256 nonce,
        uint256 deadline,
        bool allowed,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual;

    /// @dev ERC721.

    /// @notice Permit to spend specific NFT `tokenId` for EIP-2612-style permit signatures.
    /// @param spender The address of the token permit holder.
    /// @param tokenId The ID of the token that is being approved for permit.
    /// @param deadline The unix timestamp before which permit must be spent.
    /// @param v Must produce valid secp256k1 signature from the `owner` along with `r` and `s`.
    /// @param r Must produce valid secp256k1 signature from the `owner` along with `v` and `s`.
    /// @param s Must produce valid secp256k1 signature from the `owner` along with `r` and `v`.
    /// @dev Modified from Uniswap
    /// (https://github.com/Uniswap/v3-periphery/blob/main/contracts/interfaces/IERC721Permit.sol).
    function permit(
        address spender,
        uint256 tokenId,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual;

    /// @notice Permit to spend specific NFT `tokenId` for EIP-4494 permit signatures.
    /// @param spender The address of the token permit holder.
    /// @param tokenId The ID of the token that is being approved for permit.
    /// @param deadline The unix timestamp before which permit must be spent.
    /// @param sig A traditional or EIP-2098 signature.
    function permit(
        address spender,
        uint256 tokenId,
        uint256 deadline,
        bytes calldata sig
    ) public virtual;

    /// @dev ERC1155.

    /// @notice Permit to spend multitoken IDs for EIP-2612-style permit signatures.
    /// @param owner The address of the token holder.
    /// @param operator The address of the token permit holder.
    /// @param approved If true, `operator` will be given permission to spend `owner`'s tokens.
    /// @param deadline The unix timestamp before which permit must be spent.
    /// @param v Must produce valid secp256k1 signature from the `owner` along with `r` and `s`.
    /// @param r Must produce valid secp256k1 signature from the `owner` along with `v` and `s`.
    /// @param s Must produce valid secp256k1 signature from the `owner` along with `r` and `v`.
    function permit(
        address owner,
        address operator,
        bool approved,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual;
}

/// @notice Self helper for any EIP-2612, EIP-4494 or Dai-style token permit.
/// @author Solbase (https://github.com/Sol-DAO/solbase/blob/main/src/utils/SelfPermit.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/v3-periphery/blob/main/contracts/base/SelfPermit.sol)
/// @dev These functions are expected to be embedded in multicall to allow EOAs to approve a contract and call a function
/// that requires an approval in a single transaction.
abstract contract SelfPermit {
    /// @dev ERC20.

    /// @notice Permits this contract to spend a given EIP-2612 `token` from `msg.sender`.
    /// @dev The `owner` is always `msg.sender` and the `spender` is always `address(this)`.
    /// @param token The address of the asset spent.
    /// @param value The amount permitted to spend.
    /// @param deadline The unix timestamp before which permit must be spent.
    /// @param v Must produce valid secp256k1 signature from the `msg.sender` along with `r` and `s`.
    /// @param r Must produce valid secp256k1 signature from the `msg.sender` along with `v` and `s`.
    /// @param s Must produce valid secp256k1 signature from the `msg.sender` along with `r` and `v`.
    function selfPermit(
        Permit token,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        token.permit(msg.sender, address(this), value, deadline, v, r, s);
    }

    /// @notice Permits this contract to spend a given Dai-style `token` from `msg.sender`.
    /// @dev The `owner` is always `msg.sender` and the `spender` is always `address(this)`.
    /// @param token The address of the asset spent.
    /// @param nonce The current nonce of the `owner`.
    /// @param deadline The unix timestamp before which permit must be spent.
    /// @param v Must produce valid secp256k1 signature from the `msg.sender` along with `r` and `s`.
    /// @param r Must produce valid secp256k1 signature from the `msg.sender` along with `v` and `s`.
    /// @param s Must produce valid secp256k1 signature from the `msg.sender` along with `r` and `v`.
    function selfPermitAllowed(
        Permit token,
        uint256 nonce,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        token.permit(msg.sender, address(this), nonce, deadline, true, v, r, s);
    }

    /// @dev ERC721.

    /// @notice Permits this contract to spend a given EIP-2612-style NFT `tokenID` from `msg.sender`.
    /// @dev The `spender` is always `address(this)`.
    /// @param token The address of the asset spent.
    /// @param tokenId The ID of the token that is being approved for permit.
    /// @param deadline The unix timestamp before which permit must be spent.
    /// @param v Must produce valid secp256k1 signature from the `msg.sender` along with `r` and `s`.
    /// @param r Must produce valid secp256k1 signature from the `msg.sender` along with `v` and `s`.
    /// @param s Must produce valid secp256k1 signature from the `msg.sender` along with `r` and `v`.
    function selfPermit721(
        Permit token,
        uint256 tokenId,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        token.permit(address(this), tokenId, deadline, v, r, s);
    }

    /// @notice Permits this contract to spend a given EIP-4494 NFT `tokenID`.
    /// @dev The `spender` is always `address(this)`.
    /// @param token The address of the asset spent.
    /// @param tokenId The ID of the token that is being approved for permit.
    /// @param deadline The unix timestamp before which permit must be spent.
    /// @param sig A traditional or EIP-2098 signature.
    function selfPermit721(
        Permit token,
        uint256 tokenId,
        uint256 deadline,
        bytes calldata sig
    ) public virtual {
        token.permit(address(this), tokenId, deadline, sig);
    }

    /// @dev ERC1155.

    /// @notice Permits this contract to spend a given EIP-2612-style multitoken.
    /// @dev The `owner` is always `msg.sender` and the `operator` is always `address(this)`.
    /// @param token The address of the asset spent.
    /// @param deadline The unix timestamp before which permit must be spent.
    /// @param v Must produce valid secp256k1 signature from the `msg.sender` along with `r` and `s`.
    /// @param r Must produce valid secp256k1 signature from the `msg.sender` along with `v` and `s`.
    /// @param s Must produce valid secp256k1 signature from the `msg.sender` along with `r` and `v`.
    function selfPermit1155(
        Permit token,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        token.permit(msg.sender, address(this), true, deadline, v, r, s);
    }
}

/// @notice Contract that enables a single call to call multiple methods on itself.
/// @author Solbase (https://github.com/Sol-DAO/solbase/blob/main/src/utils/Multicallable.sol)
/// @author Modified from Solady (https://github.com/vectorized/solady/blob/main/src/utils/Multicallable.sol)
/// @dev WARNING!
/// Multicallable is NOT SAFE for use in contracts with checks / requires on `msg.value`
/// (e.g. in NFT minting / auction contracts) without a suitable nonce mechanism.
/// It WILL open up your contract to double-spend vulnerabilities / exploits.
/// See: (https://www.paradigm.xyz/2021/08/two-rights-might-make-a-wrong/)
abstract contract Multicallable {
    /// @dev Apply `DELEGATECALL` with the current contract to each calldata in `data`,
    /// and store the `abi.encode` formatted results of each `DELEGATECALL` into `results`.
    /// If any of the `DELEGATECALL`s reverts, the entire transaction is reverted,
    /// and the error is bubbled up.
    function multicall(bytes[] calldata data) public payable returns (bytes[] memory results) {
        assembly {
            if data.length {
                results := mload(0x40) // Point `results` to start of free memory.
                mstore(results, data.length) // Store `data.length` into `results`.
                results := add(results, 0x20)

                // `shl` 5 is equivalent to multiplying by 0x20.
                let end := shl(5, data.length)
                // Copy the offsets from calldata into memory.
                calldatacopy(results, data.offset, end)
                // Pointer to the top of the memory (i.e. start of the free memory).
                let memPtr := add(results, end)
                end := add(results, end)

                // prettier-ignore
                for {} 1 {} {
                    // The offset of the current bytes in the calldata.
                    let o := add(data.offset, mload(results))
                    // Copy the current bytes from calldata to the memory.
                    calldatacopy(
                        memPtr,
                        add(o, 0x20), // The offset of the current bytes' bytes.
                        calldataload(o) // The length of the current bytes.
                    )
                    if iszero(delegatecall(gas(), address(), memPtr, calldataload(o), 0x00, 0x00)) {
                        // Bubble up the revert if the delegatecall reverts.
                        returndatacopy(0x00, 0x00, returndatasize())
                        revert(0x00, returndatasize())
                    }
                    // Append the current `memPtr` into `results`.
                    mstore(results, memPtr)
                    results := add(results, 0x20)
                    // Append the `returndatasize()`, and the return data.
                    mstore(memPtr, returndatasize())
                    returndatacopy(add(memPtr, 0x20), 0x00, returndatasize())
                    // Advance the `memPtr` by `returndatasize() + 0x20`,
                    // rounded up to the next multiple of 32.
                    memPtr := and(add(add(memPtr, returndatasize()), 0x3f), 0xffffffffffffffe0)
                    // prettier-ignore
                    if iszero(lt(results, end)) { break }
                }
                // Restore `results` and allocate memory for it.
                results := mload(0x40)
                mstore(0x40, memPtr)
            }
        }
    }
}

/// @notice Gas-optimized reentrancy protection for smart contracts.
/// @author Solbase (https://github.com/Sol-DAO/solbase/blob/main/src/utils/ReentrancyGuard.sol)
abstract contract ReentrancyGuard {
    error Reentrancy();

    uint256 private locked = 1;

    modifier nonReentrant() virtual {
        if (locked == 2) revert Reentrancy();

        locked = 2;

        _;

        locked = 1;
    }
}

/// @title Rage Router
/// @notice Fair share ragequit redemption for any token burn.

enum Standard {
    ERC20,
    ERC721,
    ERC1155
}

struct Redemption {
    address burner;
    address token;
    uint88 start;
    Standard std;
    uint256 id;
}

struct Withdrawal {
    address asset;
    Standard std;
    uint256 id;
}

/// @author z0r0z.eth
/// @custom:coauthor ameen.eth
/// @custom:coauthor mick.eth
contract RageRouter is SelfPermit, Multicallable, ReentrancyGuard {
    /// -----------------------------------------------------------------------
    /// Events
    /// -----------------------------------------------------------------------

    event RagequitSet(
        address indexed treasury,
        address indexed burner,
        address indexed token,
        Standard std,
        uint256 id,
        uint256 start
    );

    event Ragequit(
        address indexed redeemer,
        address indexed treasury,
        Withdrawal[] withdrawals,
        uint256 amount
    );

    /// -----------------------------------------------------------------------
    /// Custom Errors
    /// -----------------------------------------------------------------------

    error NotStarted();

    error InvalidAssetOrder();

    error NotOwner();

    /// -----------------------------------------------------------------------
    /// Ragequit Storage
    /// -----------------------------------------------------------------------

    mapping(address => Redemption) public redemptions;

    /// -----------------------------------------------------------------------
    /// Configuration Logic
    /// -----------------------------------------------------------------------

    /// @dev Gas savings.
    constructor() payable {}

    /// @notice Configuration for ragequittable treasuries.
    /// @param burner The redemption sink for burnt `token`.
    /// @param token The redemption `token` that will be burnt.
    /// @param std The EIP interface for the redemption `token`.
    /// @param id The ID to set redemption configuration against.
    /// @param start The unix timestamp at which redemption starts.
    /// @dev The caller of this function will be set as the `treasury`.
    /// If `burner` is zero address, ragequit will trigger `token` burn.
    /// Otherwise, the user will have `token` pulled to `burner` and supply
    /// will be calculated with respect to `burner` balance before ragequit.
    /// `id` will be used if the `token` follows ERC1155 std. Kali slays Moloch.
    function setRagequit(
        address burner,
        address token,
        Standard std,
        uint256 id,
        uint256 start
    ) public payable virtual {
        redemptions[msg.sender] = Redemption({
            burner: burner,
            token: token,
            start: uint88(start),
            std: std,
            id: id
        });

        emit RagequitSet(msg.sender, burner, token, std, id, start);
    }

    /// -----------------------------------------------------------------------
    /// Ragequit Logic
    /// -----------------------------------------------------------------------

    /// @notice Allows ragequit redemption against `treasury`.
    /// @param treasury The vault holding `assets` for redemption.
    /// @param withdrawals Withdrawal instructions for `treasury`.
    /// @param quitAmount The amount of redemption tokens to be burned.
    /// @dev `quitAmount` acts as the token ID where redemption is ERC721.
    function ragequit(
        address treasury,
        Withdrawal[] calldata withdrawals,
        uint256 quitAmount
    ) public payable virtual nonReentrant {
        Redemption storage red = redemptions[treasury];

        if (block.timestamp < red.start) revert NotStarted();

        emit Ragequit(msg.sender, treasury, withdrawals, quitAmount);

        uint256 supply;

        // Branch on `Standard` of `token` burned in redemption
        // and whether `burner` is zero address.
        if (red.std == Standard.ERC20) {
            if (red.burner == address(0)) {
                supply = TokenSupply(red.token).totalSupply();

                TokenBurn(red.token).burnFrom(msg.sender, quitAmount);
            } else {
                // The `burner` balance cannot exceed total supply.
                unchecked {
                    supply =
                        TokenSupply(red.token).totalSupply() -
                        TokenSupply(red.token).balanceOf(red.burner);
                }

                safeTransferFrom(red.token, msg.sender, red.burner, quitAmount);
            }
        } else if (red.std == Standard.ERC721) {
            // Use `quitAmount` as `id`.
            if (msg.sender != TokenSupply(red.token).ownerOf(quitAmount))
                revert NotOwner();

            if (red.burner == address(0)) {
                supply = TokenSupply(red.token).totalSupply();

                TokenBurn(red.token).burn(quitAmount);
            } else {
                // The `burner` balance cannot exceed total supply.
                unchecked {
                    supply =
                        TokenSupply(red.token).totalSupply() -
                        TokenSupply(red.token).balanceOf(red.burner);
                }

                safeTransferFrom(red.token, msg.sender, red.burner, quitAmount);
            }

            // Overwrite `quitAmount` `id` to 1 for single NFT burn.
            quitAmount = 1;
        } else {
            if (red.burner == address(0)) {
                supply = TokenSupply(red.token).totalSupply(red.id);

                TokenBurn(red.token).burn(msg.sender, red.id, quitAmount);
            } else {
                // The `burner` balance cannot exceed total supply.
                unchecked {
                    supply =
                        TokenSupply(red.token).totalSupply(red.id) -
                        TokenSupply(red.token).balanceOf(red.burner, red.id);
                }

                ERC1155STF(red.token).safeTransferFrom(
                    msg.sender,
                    red.burner,
                    red.id,
                    quitAmount,
                    ""
                );
            }
        }

        address prevAddr;
        Withdrawal calldata draw;

        for (uint256 i; i < withdrawals.length; ) {
            draw = withdrawals[i];

            // Prevent null and duplicate `asset`.
            if (prevAddr >= draw.asset) revert InvalidAssetOrder();

            prevAddr = draw.asset;

            // Calculate fair share of given `asset` for `quitAmount`.
            uint256 amountToRedeem = mulDivDown(
                quitAmount,
                draw.std == Standard.ERC20
                    ? TokenSupply(draw.asset).balanceOf(treasury)
                    : TokenSupply(draw.asset).balanceOf(treasury, draw.id),
                supply
            );

            // Transfer fair share from `treasury` to caller.
            if (amountToRedeem != 0) {
                draw.std == Standard.ERC20
                    ? safeTransferFrom(
                        draw.asset,
                        treasury,
                        msg.sender,
                        amountToRedeem
                    )
                    : ERC1155STF(draw.asset).safeTransferFrom(
                        treasury,
                        msg.sender,
                        draw.id,
                        amountToRedeem,
                        ""
                    );
            }

            // An array can't have a total length
            // larger than the max uint256 value.
            unchecked {
                ++i;
            }
        }
    }
}
        

Compiler Settings

{"remappings":[],"optimizer":{"runs":9999999,"enabled":true},"metadata":{"bytecodeHash":"ipfs"},"libraries":{},"evmVersion":"london","compilationTarget":{"RageRouter.sol":"RageRouter"}}
              

Contract ABI

[{"type":"constructor","stateMutability":"payable","inputs":[]},{"type":"error","name":"InvalidAssetOrder","inputs":[]},{"type":"error","name":"NotOwner","inputs":[]},{"type":"error","name":"NotStarted","inputs":[]},{"type":"error","name":"Reentrancy","inputs":[]},{"type":"event","name":"Ragequit","inputs":[{"type":"address","name":"redeemer","internalType":"address","indexed":true},{"type":"address","name":"treasury","internalType":"address","indexed":true},{"type":"tuple[]","name":"withdrawals","internalType":"struct Withdrawal[]","indexed":false,"components":[{"type":"address","name":"asset","internalType":"address"},{"type":"uint8","name":"std","internalType":"enum Standard"},{"type":"uint256","name":"id","internalType":"uint256"}]},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"RagequitSet","inputs":[{"type":"address","name":"treasury","internalType":"address","indexed":true},{"type":"address","name":"burner","internalType":"address","indexed":true},{"type":"address","name":"token","internalType":"address","indexed":true},{"type":"uint8","name":"std","internalType":"enum Standard","indexed":false},{"type":"uint256","name":"id","internalType":"uint256","indexed":false},{"type":"uint256","name":"start","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"payable","outputs":[{"type":"bytes[]","name":"results","internalType":"bytes[]"}],"name":"multicall","inputs":[{"type":"bytes[]","name":"data","internalType":"bytes[]"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"ragequit","inputs":[{"type":"address","name":"treasury","internalType":"address"},{"type":"tuple[]","name":"withdrawals","internalType":"struct Withdrawal[]","components":[{"type":"address","name":"asset","internalType":"address"},{"type":"uint8","name":"std","internalType":"enum Standard"},{"type":"uint256","name":"id","internalType":"uint256"}]},{"type":"uint256","name":"quitAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"burner","internalType":"address"},{"type":"address","name":"token","internalType":"address"},{"type":"uint88","name":"start","internalType":"uint88"},{"type":"uint8","name":"std","internalType":"enum Standard"},{"type":"uint256","name":"id","internalType":"uint256"}],"name":"redemptions","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"selfPermit","inputs":[{"type":"address","name":"token","internalType":"contract Permit"},{"type":"uint256","name":"value","internalType":"uint256"},{"type":"uint256","name":"deadline","internalType":"uint256"},{"type":"uint8","name":"v","internalType":"uint8"},{"type":"bytes32","name":"r","internalType":"bytes32"},{"type":"bytes32","name":"s","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"selfPermit1155","inputs":[{"type":"address","name":"token","internalType":"contract Permit"},{"type":"uint256","name":"deadline","internalType":"uint256"},{"type":"uint8","name":"v","internalType":"uint8"},{"type":"bytes32","name":"r","internalType":"bytes32"},{"type":"bytes32","name":"s","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"selfPermit721","inputs":[{"type":"address","name":"token","internalType":"contract Permit"},{"type":"uint256","name":"tokenId","internalType":"uint256"},{"type":"uint256","name":"deadline","internalType":"uint256"},{"type":"bytes","name":"sig","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"selfPermit721","inputs":[{"type":"address","name":"token","internalType":"contract Permit"},{"type":"uint256","name":"tokenId","internalType":"uint256"},{"type":"uint256","name":"deadline","internalType":"uint256"},{"type":"uint8","name":"v","internalType":"uint8"},{"type":"bytes32","name":"r","internalType":"bytes32"},{"type":"bytes32","name":"s","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"selfPermitAllowed","inputs":[{"type":"address","name":"token","internalType":"contract Permit"},{"type":"uint256","name":"nonce","internalType":"uint256"},{"type":"uint256","name":"deadline","internalType":"uint256"},{"type":"uint8","name":"v","internalType":"uint8"},{"type":"bytes32","name":"r","internalType":"bytes32"},{"type":"bytes32","name":"s","internalType":"bytes32"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"setRagequit","inputs":[{"type":"address","name":"burner","internalType":"address"},{"type":"address","name":"token","internalType":"address"},{"type":"uint8","name":"std","internalType":"enum Standard"},{"type":"uint256","name":"id","internalType":"uint256"},{"type":"uint256","name":"start","internalType":"uint256"}]}]
              

Contract Creation Code

Verify & Publish
0x60806040526001600055611cdc806100186000396000f3fe6080604052600436106100965760003560e01c80639970707c11610069578063ac9650d81161004e578063ac9650d8146101e2578063f3995c6714610202578063fa24c4d01461022257600080fd5b80639970707c146101105780639bc3f2691461012357600080fd5b80631254f40e1461009b5780634659a494146100bd5780635a594ad7146100dd5780637f399535146100fd575b600080fd5b3480156100a757600080fd5b506100bb6100b63660046116c1565b610242565b005b3480156100c957600080fd5b506100bb6100d8366004611711565b6102f4565b3480156100e957600080fd5b506100bb6100f836600461176b565b6103af565b6100bb61010b366004611810565b610409565b6100bb61011e366004611851565b610628565b34801561012f57600080fd5b506101c861013e3660046118df565b600160208190526000918252604090912080549181015460029091015473ffffffffffffffffffffffffffffffffffffffff928316928216917401000000000000000000000000000000000000000081046affffffffffffffffffffff16917f010000000000000000000000000000000000000000000000000000000000000090910460ff169085565b6040516101d995949392919061196d565b60405180910390f35b6101f56101f03660046119c2565b611480565b6040516101d99190611a37565b34801561020e57600080fd5b506100bb61021d366004611711565b6114ff565b34801561022e57600080fd5b506100bb61023d366004611711565b61157c565b6040517ff51cc7dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152600160448201526064810185905260ff8416608482015260a4810183905260c4810182905273ffffffffffffffffffffffffffffffffffffffff86169063f51cc7dd9060e4015b600060405180830381600087803b1580156102d557600080fd5b505af11580156102e9573d6000803e3d6000fd5b505050505050505050565b6040517f8fcbaf0c00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101869052606481018590526001608482015260ff841660a482015260c4810183905260e4810182905273ffffffffffffffffffffffffffffffffffffffff871690638fcbaf0c90610104015b600060405180830381600087803b15801561038f57600080fd5b505af11580156103a3573d6000803e3d6000fd5b50505050505050505050565b6040517f745a41bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169063745a41bc906102bb9030908890889088908890600401611b05565b6040518060a001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001826affffffffffffffffffffff16815260200184600281111561047157610471611903565b8152602090810184905233600090815260018083526040918290208451815473ffffffffffffffffffffffffffffffffffffffff9182167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116178255938501519181018054938601516affffffffffffffffffffff1674010000000000000000000000000000000000000000027fff0000000000000000000000000000000000000000000000000000000000000090941692909416919091179190911780835560608401519192907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f010000000000000000000000000000000000000000000000000000000000000083600281111561058f5761058f611903565b0217905550608082015181600201559050508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f12d91f03ea56c930117dbd069a868420a6c02180fb35f60562978ec06cf0c25786868660405161061993929190611b7d565b60405180910390a45050505050565b600054600203610664576040517fab143c0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600090815573ffffffffffffffffffffffffffffffffffffffff85168152600160208190526040909120908101547401000000000000000000000000000000000000000090046affffffffffffffffffffff164210156106f2576040517f6f312cbd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb02097ab916bb4c43a8ebaacc02e78c8204b9b0dd42e76454e6e12d4a537e0d386868660405161075393929190611b9c565b60405180910390a360008060018301547f0100000000000000000000000000000000000000000000000000000000000000900460ff16600281111561079a5761079a611903565b03610a4357815473ffffffffffffffffffffffffffffffffffffffff166108e1578160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561082a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084e9190611c26565b60018301546040517f79cc67900000000000000000000000000000000000000000000000000000000081523360048201526024810186905291925073ffffffffffffffffffffffffffffffffffffffff16906379cc6790906044015b600060405180830381600087803b1580156108c457600080fd5b505af11580156108d8573d6000803e3d6000fd5b50505050611140565b600182015482546040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201529116906370a0823190602401602060405180830381865afa158015610954573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109789190611c26565b8260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109e7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0b9190611c26565b60018401548454929091039250610a3e9173ffffffffffffffffffffffffffffffffffffffff91821691339116866115f3565b611140565b6001808301547f0100000000000000000000000000000000000000000000000000000000000000900460ff166002811115610a8057610a80611903565b03610e1f5760018201546040517f6352211e0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff90911690636352211e90602401602060405180830381865afa158015610af6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1a9190611c3f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b7e576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815473ffffffffffffffffffffffffffffffffffffffff16610cb9578160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2d9190611c26565b60018301546040517f42966c680000000000000000000000000000000000000000000000000000000081526004810186905291925073ffffffffffffffffffffffffffffffffffffffff16906342966c6890602401600060405180830381600087803b158015610c9c57600080fd5b505af1158015610cb0573d6000803e3d6000fd5b50505050610e16565b600182015482546040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201529116906370a0823190602401602060405180830381865afa158015610d2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d509190611c26565b8260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de39190611c26565b60018401548454929091039250610e169173ffffffffffffffffffffffffffffffffffffffff91821691339116866115f3565b60019250611140565b815473ffffffffffffffffffffffffffffffffffffffff16610f4857600182015460028301546040517fbd85b03900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9092169163bd85b03991610e9a9160040190815260200190565b602060405180830381865afa158015610eb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610edb9190611c26565b600183015460028401546040517ff5298aca00000000000000000000000000000000000000000000000000000000815233600482015260248101919091526044810186905291925073ffffffffffffffffffffffffffffffffffffffff169063f5298aca906064016108aa565b6001820154825460028401546040517efdd58e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283166004820152602481019190915291169062fdd58e90604401602060405180830381865afa158015610fc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fea9190611c26565b600183015460028401546040517fbd85b03900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9092169163bd85b039916110499160040190815260200190565b602060405180830381865afa158015611066573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108a9190611c26565b6001840154845460028601546040517ff242432a00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff928316602482015260448101919091526064810188905260a06084820152600060a4820152939092039350169063f242432a9060c401600060405180830381600087803b15801561112757600080fd5b505af115801561113b573d6000803e3d6000fd5b505050505b60003660005b868110156114705787878281811061116057611160611c5c565b606002919091019250611178905060208301836118df565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16106111dc576040517f7338edf700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111e960208301836118df565b9250600061136787826112026040870160208801611c8b565b600281111561121357611213611903565b146112c25761122560208601866118df565b604080517efdd58e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8f8116600483015291880135602482015291169062fdd58e90604401602060405180830381865afa158015611299573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112bd9190611c26565b611361565b6112cf60208601866118df565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8e8116600483015291909116906370a0823190602401602060405180830381865afa15801561133d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113619190611c26565b87611641565b905080156114675760006113816040850160208601611c8b565b600281111561139257611392611903565b1461144f576113a460208401846118df565b604080517ff242432a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d811660048301523360248301529186013560448201526064810184905260a06084820152600060a482015291169063f242432a9060c401600060405180830381600087803b15801561143257600080fd5b505af1158015611446573d6000803e3d6000fd5b50505050611467565b61146761145f60208501856118df565b8b33846115f3565b50600101611146565b5050600160005550505050505050565b606081156114f95750604051818152602001600582901b808483378101805b825185018035602082018337600080823584305af46114c2573d6000803e3d6000fd5b508083526020830192503d81523d6000602083013e3d01603f0167ffffffffffffffe01681831061149f5760405192508060405250505b92915050565b6040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018690526064810185905260ff8416608482015260a4810183905260c4810182905273ffffffffffffffffffffffffffffffffffffffff87169063d505accf9060e401610375565b6040517f7ac2ff7b000000000000000000000000000000000000000000000000000000008152306004820152602481018690526044810185905260ff841660648201526084810183905260a4810182905273ffffffffffffffffffffffffffffffffffffffff871690637ac2ff7b9060c401610375565b6040516323b872dd600052836020528260405281606052602060006064601c6000895af13d15600160005114171661163357637939f4246000526004601cfd5b600060605260405250505050565b6000827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048411830215820261167f5763ad251c276000526004601cfd5b5091020490565b73ffffffffffffffffffffffffffffffffffffffff811681146116a857600080fd5b50565b803560ff811681146116bc57600080fd5b919050565b600080600080600060a086880312156116d957600080fd5b85356116e481611686565b9450602086013593506116f9604087016116ab565b94979396509394606081013594506080013592915050565b60008060008060008060c0878903121561172a57600080fd5b863561173581611686565b95506020870135945060408701359350611751606088016116ab565b92506080870135915060a087013590509295509295509295565b60008060008060006080868803121561178357600080fd5b853561178e81611686565b94506020860135935060408601359250606086013567ffffffffffffffff808211156117b957600080fd5b818801915088601f8301126117cd57600080fd5b8135818111156117dc57600080fd5b8960208285010111156117ee57600080fd5b9699959850939650602001949392505050565b8035600381106116bc57600080fd5b600080600080600060a0868803121561182857600080fd5b853561183381611686565b9450602086013561184381611686565b93506116f960408701611801565b6000806000806060858703121561186757600080fd5b843561187281611686565b9350602085013567ffffffffffffffff8082111561188f57600080fd5b818701915087601f8301126118a357600080fd5b8135818111156118b257600080fd5b8860206060830285010111156118c757600080fd5b95986020929092019750949560400135945092505050565b6000602082840312156118f157600080fd5b81356118fc81611686565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110611969577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b73ffffffffffffffffffffffffffffffffffffffff8681168252851660208201526affffffffffffffffffffff8416604082015260a081016119b26060830185611932565b8260808301529695505050505050565b600080602083850312156119d557600080fd5b823567ffffffffffffffff808211156119ed57600080fd5b818501915085601f830112611a0157600080fd5b813581811115611a1057600080fd5b8660208260051b8501011115611a2557600080fd5b60209290920196919550909350505050565b6000602080830181845280855180835260408601915060408160051b87010192508387016000805b83811015611af7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc089870301855282518051808852835b81811015611ab2578281018a01518982018b01528901611a97565b508781018901849052601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909601870195509386019391860191600101611a5f565b509398975050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015283604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101949350505050565b60608101611b8b8286611932565b602082019390935260400152919050565b6040808252818101849052600090606080840187845b88811015611c10578135611bc581611686565b73ffffffffffffffffffffffffffffffffffffffff1683526020611bea838201611801565b611bf682860182611932565b505081850135838601529183019190830190600101611bb2565b5050809350505050826020830152949350505050565b600060208284031215611c3857600080fd5b5051919050565b600060208284031215611c5157600080fd5b81516118fc81611686565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215611c9d57600080fd5b6118fc8261180156fea26469706673582212203e43a9721804c2e990319556e7e136ca4007599a0da30dbcc8417f68273c8c0c64736f6c63430008110033

Deployed ByteCode

0x6080604052600436106100965760003560e01c80639970707c11610069578063ac9650d81161004e578063ac9650d8146101e2578063f3995c6714610202578063fa24c4d01461022257600080fd5b80639970707c146101105780639bc3f2691461012357600080fd5b80631254f40e1461009b5780634659a494146100bd5780635a594ad7146100dd5780637f399535146100fd575b600080fd5b3480156100a757600080fd5b506100bb6100b63660046116c1565b610242565b005b3480156100c957600080fd5b506100bb6100d8366004611711565b6102f4565b3480156100e957600080fd5b506100bb6100f836600461176b565b6103af565b6100bb61010b366004611810565b610409565b6100bb61011e366004611851565b610628565b34801561012f57600080fd5b506101c861013e3660046118df565b600160208190526000918252604090912080549181015460029091015473ffffffffffffffffffffffffffffffffffffffff928316928216917401000000000000000000000000000000000000000081046affffffffffffffffffffff16917f010000000000000000000000000000000000000000000000000000000000000090910460ff169085565b6040516101d995949392919061196d565b60405180910390f35b6101f56101f03660046119c2565b611480565b6040516101d99190611a37565b34801561020e57600080fd5b506100bb61021d366004611711565b6114ff565b34801561022e57600080fd5b506100bb61023d366004611711565b61157c565b6040517ff51cc7dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152600160448201526064810185905260ff8416608482015260a4810183905260c4810182905273ffffffffffffffffffffffffffffffffffffffff86169063f51cc7dd9060e4015b600060405180830381600087803b1580156102d557600080fd5b505af11580156102e9573d6000803e3d6000fd5b505050505050505050565b6040517f8fcbaf0c00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101869052606481018590526001608482015260ff841660a482015260c4810183905260e4810182905273ffffffffffffffffffffffffffffffffffffffff871690638fcbaf0c90610104015b600060405180830381600087803b15801561038f57600080fd5b505af11580156103a3573d6000803e3d6000fd5b50505050505050505050565b6040517f745a41bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169063745a41bc906102bb9030908890889088908890600401611b05565b6040518060a001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001826affffffffffffffffffffff16815260200184600281111561047157610471611903565b8152602090810184905233600090815260018083526040918290208451815473ffffffffffffffffffffffffffffffffffffffff9182167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116178255938501519181018054938601516affffffffffffffffffffff1674010000000000000000000000000000000000000000027fff0000000000000000000000000000000000000000000000000000000000000090941692909416919091179190911780835560608401519192907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f010000000000000000000000000000000000000000000000000000000000000083600281111561058f5761058f611903565b0217905550608082015181600201559050508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f12d91f03ea56c930117dbd069a868420a6c02180fb35f60562978ec06cf0c25786868660405161061993929190611b7d565b60405180910390a45050505050565b600054600203610664576040517fab143c0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600090815573ffffffffffffffffffffffffffffffffffffffff85168152600160208190526040909120908101547401000000000000000000000000000000000000000090046affffffffffffffffffffff164210156106f2576040517f6f312cbd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb02097ab916bb4c43a8ebaacc02e78c8204b9b0dd42e76454e6e12d4a537e0d386868660405161075393929190611b9c565b60405180910390a360008060018301547f0100000000000000000000000000000000000000000000000000000000000000900460ff16600281111561079a5761079a611903565b03610a4357815473ffffffffffffffffffffffffffffffffffffffff166108e1578160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561082a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084e9190611c26565b60018301546040517f79cc67900000000000000000000000000000000000000000000000000000000081523360048201526024810186905291925073ffffffffffffffffffffffffffffffffffffffff16906379cc6790906044015b600060405180830381600087803b1580156108c457600080fd5b505af11580156108d8573d6000803e3d6000fd5b50505050611140565b600182015482546040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201529116906370a0823190602401602060405180830381865afa158015610954573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109789190611c26565b8260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109e7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0b9190611c26565b60018401548454929091039250610a3e9173ffffffffffffffffffffffffffffffffffffffff91821691339116866115f3565b611140565b6001808301547f0100000000000000000000000000000000000000000000000000000000000000900460ff166002811115610a8057610a80611903565b03610e1f5760018201546040517f6352211e0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff90911690636352211e90602401602060405180830381865afa158015610af6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1a9190611c3f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b7e576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815473ffffffffffffffffffffffffffffffffffffffff16610cb9578160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2d9190611c26565b60018301546040517f42966c680000000000000000000000000000000000000000000000000000000081526004810186905291925073ffffffffffffffffffffffffffffffffffffffff16906342966c6890602401600060405180830381600087803b158015610c9c57600080fd5b505af1158015610cb0573d6000803e3d6000fd5b50505050610e16565b600182015482546040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201529116906370a0823190602401602060405180830381865afa158015610d2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d509190611c26565b8260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de39190611c26565b60018401548454929091039250610e169173ffffffffffffffffffffffffffffffffffffffff91821691339116866115f3565b60019250611140565b815473ffffffffffffffffffffffffffffffffffffffff16610f4857600182015460028301546040517fbd85b03900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9092169163bd85b03991610e9a9160040190815260200190565b602060405180830381865afa158015610eb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610edb9190611c26565b600183015460028401546040517ff5298aca00000000000000000000000000000000000000000000000000000000815233600482015260248101919091526044810186905291925073ffffffffffffffffffffffffffffffffffffffff169063f5298aca906064016108aa565b6001820154825460028401546040517efdd58e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283166004820152602481019190915291169062fdd58e90604401602060405180830381865afa158015610fc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fea9190611c26565b600183015460028401546040517fbd85b03900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9092169163bd85b039916110499160040190815260200190565b602060405180830381865afa158015611066573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108a9190611c26565b6001840154845460028601546040517ff242432a00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff928316602482015260448101919091526064810188905260a06084820152600060a4820152939092039350169063f242432a9060c401600060405180830381600087803b15801561112757600080fd5b505af115801561113b573d6000803e3d6000fd5b505050505b60003660005b868110156114705787878281811061116057611160611c5c565b606002919091019250611178905060208301836118df565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16106111dc576040517f7338edf700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111e960208301836118df565b9250600061136787826112026040870160208801611c8b565b600281111561121357611213611903565b146112c25761122560208601866118df565b604080517efdd58e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8f8116600483015291880135602482015291169062fdd58e90604401602060405180830381865afa158015611299573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112bd9190611c26565b611361565b6112cf60208601866118df565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8e8116600483015291909116906370a0823190602401602060405180830381865afa15801561133d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113619190611c26565b87611641565b905080156114675760006113816040850160208601611c8b565b600281111561139257611392611903565b1461144f576113a460208401846118df565b604080517ff242432a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d811660048301523360248301529186013560448201526064810184905260a06084820152600060a482015291169063f242432a9060c401600060405180830381600087803b15801561143257600080fd5b505af1158015611446573d6000803e3d6000fd5b50505050611467565b61146761145f60208501856118df565b8b33846115f3565b50600101611146565b5050600160005550505050505050565b606081156114f95750604051818152602001600582901b808483378101805b825185018035602082018337600080823584305af46114c2573d6000803e3d6000fd5b508083526020830192503d81523d6000602083013e3d01603f0167ffffffffffffffe01681831061149f5760405192508060405250505b92915050565b6040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018690526064810185905260ff8416608482015260a4810183905260c4810182905273ffffffffffffffffffffffffffffffffffffffff87169063d505accf9060e401610375565b6040517f7ac2ff7b000000000000000000000000000000000000000000000000000000008152306004820152602481018690526044810185905260ff841660648201526084810183905260a4810182905273ffffffffffffffffffffffffffffffffffffffff871690637ac2ff7b9060c401610375565b6040516323b872dd600052836020528260405281606052602060006064601c6000895af13d15600160005114171661163357637939f4246000526004601cfd5b600060605260405250505050565b6000827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048411830215820261167f5763ad251c276000526004601cfd5b5091020490565b73ffffffffffffffffffffffffffffffffffffffff811681146116a857600080fd5b50565b803560ff811681146116bc57600080fd5b919050565b600080600080600060a086880312156116d957600080fd5b85356116e481611686565b9450602086013593506116f9604087016116ab565b94979396509394606081013594506080013592915050565b60008060008060008060c0878903121561172a57600080fd5b863561173581611686565b95506020870135945060408701359350611751606088016116ab565b92506080870135915060a087013590509295509295509295565b60008060008060006080868803121561178357600080fd5b853561178e81611686565b94506020860135935060408601359250606086013567ffffffffffffffff808211156117b957600080fd5b818801915088601f8301126117cd57600080fd5b8135818111156117dc57600080fd5b8960208285010111156117ee57600080fd5b9699959850939650602001949392505050565b8035600381106116bc57600080fd5b600080600080600060a0868803121561182857600080fd5b853561183381611686565b9450602086013561184381611686565b93506116f960408701611801565b6000806000806060858703121561186757600080fd5b843561187281611686565b9350602085013567ffffffffffffffff8082111561188f57600080fd5b818701915087601f8301126118a357600080fd5b8135818111156118b257600080fd5b8860206060830285010111156118c757600080fd5b95986020929092019750949560400135945092505050565b6000602082840312156118f157600080fd5b81356118fc81611686565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110611969577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b73ffffffffffffffffffffffffffffffffffffffff8681168252851660208201526affffffffffffffffffffff8416604082015260a081016119b26060830185611932565b8260808301529695505050505050565b600080602083850312156119d557600080fd5b823567ffffffffffffffff808211156119ed57600080fd5b818501915085601f830112611a0157600080fd5b813581811115611a1057600080fd5b8660208260051b8501011115611a2557600080fd5b60209290920196919550909350505050565b6000602080830181845280855180835260408601915060408160051b87010192508387016000805b83811015611af7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc089870301855282518051808852835b81811015611ab2578281018a01518982018b01528901611a97565b508781018901849052601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909601870195509386019391860191600101611a5f565b509398975050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015283604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101949350505050565b60608101611b8b8286611932565b602082019390935260400152919050565b6040808252818101849052600090606080840187845b88811015611c10578135611bc581611686565b73ffffffffffffffffffffffffffffffffffffffff1683526020611bea838201611801565b611bf682860182611932565b505081850135838601529183019190830190600101611bb2565b5050809350505050826020830152949350505050565b600060208284031215611c3857600080fd5b5051919050565b600060208284031215611c5157600080fd5b81516118fc81611686565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215611c9d57600080fd5b6118fc8261180156fea26469706673582212203e43a9721804c2e990319556e7e136ca4007599a0da30dbcc8417f68273c8c0c64736f6c63430008110033