ETH Price: $3,334.28 (+0.35%)

Contract

0x6a6Af4b16458Bc39817e4019fB02BD3b26d41049

Overview

ETH Balance

0 ETH

ETH Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To

There are no matching entries

1 Internal Transaction found.

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To
67374262025-07-25 21:50:37173 days ago1753480237  Contract Creation0 ETH

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Integrity

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
Yes with 100 runs

Other Settings:
default evmVersion
// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity >=0.8.17 <0.9.0;

import "./Topology.sol";

/**
 * @title Integrity, A library that validates condition integrity, and
 * adherence to the expected input structure and rules.
 * @author Cristóvão Honorato - <[email protected]>
 */
library Integrity {
    error UnsuitableRootNode();

    error NotBFS();

    error UnsuitableParameterType(uint256 index);

    error UnsuitableCompValue(uint256 index);

    error UnsupportedOperator(uint256 index);

    error UnsuitableParent(uint256 index);

    error UnsuitableChildCount(uint256 index);

    error UnsuitableChildTypeTree(uint256 index);

    function enforce(ConditionFlat[] memory conditions) external pure {
        _root(conditions);
        for (uint256 i = 0; i < conditions.length; ++i) {
            _node(conditions[i], i);
        }
        _tree(conditions);
    }

    function _root(ConditionFlat[] memory conditions) private pure {
        uint256 count;

        for (uint256 i; i < conditions.length; ++i) {
            if (conditions[i].parent == i) ++count;
        }
        if (count != 1 || conditions[0].parent != 0) {
            revert UnsuitableRootNode();
        }
    }

    function _node(ConditionFlat memory condition, uint256 index) private pure {
        Operator operator = condition.operator;
        ParameterType paramType = condition.paramType;
        bytes memory compValue = condition.compValue;
        if (operator == Operator.Pass) {
            if (condition.compValue.length != 0) {
                revert UnsuitableCompValue(index);
            }
        } else if (operator >= Operator.And && operator <= Operator.Nor) {
            if (paramType != ParameterType.None) {
                revert UnsuitableParameterType(index);
            }
            if (condition.compValue.length != 0) {
                revert UnsuitableCompValue(index);
            }
        } else if (operator == Operator.Matches) {
            if (
                paramType != ParameterType.Tuple &&
                paramType != ParameterType.Array &&
                paramType != ParameterType.Calldata &&
                paramType != ParameterType.AbiEncoded
            ) {
                revert UnsuitableParameterType(index);
            }
            if (compValue.length != 0) {
                revert UnsuitableCompValue(index);
            }
        } else if (
            operator == Operator.ArraySome ||
            operator == Operator.ArrayEvery ||
            operator == Operator.ArraySubset
        ) {
            if (paramType != ParameterType.Array) {
                revert UnsuitableParameterType(index);
            }
            if (compValue.length != 0) {
                revert UnsuitableCompValue(index);
            }
        } else if (operator == Operator.EqualToAvatar) {
            if (paramType != ParameterType.Static) {
                revert UnsuitableParameterType(index);
            }
            if (compValue.length != 0) {
                revert UnsuitableCompValue(index);
            }
        } else if (operator == Operator.EqualTo) {
            if (
                paramType != ParameterType.Static &&
                paramType != ParameterType.Dynamic &&
                paramType != ParameterType.Tuple &&
                paramType != ParameterType.Array
            ) {
                revert UnsuitableParameterType(index);
            }
            if (compValue.length == 0 || compValue.length % 32 != 0) {
                revert UnsuitableCompValue(index);
            }
        } else if (
            operator == Operator.GreaterThan ||
            operator == Operator.LessThan ||
            operator == Operator.SignedIntGreaterThan ||
            operator == Operator.SignedIntLessThan
        ) {
            if (paramType != ParameterType.Static) {
                revert UnsuitableParameterType(index);
            }
            if (compValue.length != 32) {
                revert UnsuitableCompValue(index);
            }
        } else if (operator == Operator.Bitmask) {
            if (
                paramType != ParameterType.Static &&
                paramType != ParameterType.Dynamic
            ) {
                revert UnsuitableParameterType(index);
            }
            if (compValue.length != 32) {
                revert UnsuitableCompValue(index);
            }
        } else if (operator == Operator.Custom) {
            if (compValue.length != 32) {
                revert UnsuitableCompValue(index);
            }
        } else if (operator == Operator.WithinAllowance) {
            if (paramType != ParameterType.Static) {
                revert UnsuitableParameterType(index);
            }
            if (compValue.length != 32) {
                revert UnsuitableCompValue(index);
            }
        } else if (
            operator == Operator.EtherWithinAllowance ||
            operator == Operator.CallWithinAllowance
        ) {
            if (paramType != ParameterType.None) {
                revert UnsuitableParameterType(index);
            }
            if (compValue.length != 32) {
                revert UnsuitableCompValue(index);
            }
        } else {
            revert UnsupportedOperator(index);
        }
    }

    function _tree(ConditionFlat[] memory conditions) private pure {
        uint256 length = conditions.length;
        // check BFS
        for (uint256 i = 1; i < length; ++i) {
            if (conditions[i - 1].parent > conditions[i].parent) {
                revert NotBFS();
            }
        }

        for (uint256 i = 0; i < length; ++i) {
            if (
                (conditions[i].operator == Operator.EtherWithinAllowance ||
                    conditions[i].operator == Operator.CallWithinAllowance) &&
                conditions[conditions[i].parent].paramType !=
                ParameterType.Calldata
            ) {
                revert UnsuitableParent(i);
            }
        }

        Topology.Bounds[] memory childrenBounds = Topology.childrenBounds(
            conditions
        );

        for (uint256 i = 0; i < conditions.length; i++) {
            ConditionFlat memory condition = conditions[i];
            Topology.Bounds memory childBounds = childrenBounds[i];

            if (condition.paramType == ParameterType.None) {
                if (
                    (condition.operator == Operator.EtherWithinAllowance ||
                        condition.operator == Operator.CallWithinAllowance) &&
                    childBounds.length != 0
                ) {
                    revert UnsuitableChildCount(i);
                }
                if (
                    (condition.operator >= Operator.And &&
                        condition.operator <= Operator.Nor)
                ) {
                    if (childBounds.length == 0) {
                        revert UnsuitableChildCount(i);
                    }
                }
            } else if (
                condition.paramType == ParameterType.Static ||
                condition.paramType == ParameterType.Dynamic
            ) {
                if (childBounds.length != 0) {
                    revert UnsuitableChildCount(i);
                }
            } else if (
                condition.paramType == ParameterType.Tuple ||
                condition.paramType == ParameterType.Calldata ||
                condition.paramType == ParameterType.AbiEncoded
            ) {
                if (childBounds.length == 0) {
                    revert UnsuitableChildCount(i);
                }
            } else {
                assert(condition.paramType == ParameterType.Array);

                if (childBounds.length == 0) {
                    revert UnsuitableChildCount(i);
                }

                if (
                    (condition.operator == Operator.ArraySome ||
                        condition.operator == Operator.ArrayEvery) &&
                    childBounds.length != 1
                ) {
                    revert UnsuitableChildCount(i);
                } else if (
                    condition.operator == Operator.ArraySubset &&
                    childBounds.length > 256
                ) {
                    revert UnsuitableChildCount(i);
                }
            }
        }

        for (uint256 i = 0; i < conditions.length; i++) {
            ConditionFlat memory condition = conditions[i];
            if (
                ((condition.operator >= Operator.And &&
                    condition.operator <= Operator.Nor) ||
                    condition.paramType == ParameterType.Array) &&
                childrenBounds[i].length > 1
            ) {
                _compatibleSiblingTypes(conditions, i, childrenBounds);
            }
        }

        Topology.TypeTree memory typeTree = Topology.typeTree(
            conditions,
            0,
            childrenBounds
        );

        if (typeTree.paramType != ParameterType.Calldata) {
            revert UnsuitableRootNode();
        }
    }

    function _compatibleSiblingTypes(
        ConditionFlat[] memory conditions,
        uint256 index,
        Topology.Bounds[] memory childrenBounds
    ) private pure {
        uint256 start = childrenBounds[index].start;
        uint256 end = childrenBounds[index].end;

        for (uint256 j = start + 1; j < end; ++j) {
            if (
                !_isTypeMatch(conditions, start, j, childrenBounds) &&
                !_isTypeEquivalent(conditions, start, j, childrenBounds)
            ) {
                revert UnsuitableChildTypeTree(index);
            }
        }
    }

    function _isTypeMatch(
        ConditionFlat[] memory conditions,
        uint256 i,
        uint256 j,
        Topology.Bounds[] memory childrenBounds
    ) private pure returns (bool) {
        return
            typeTreeId(Topology.typeTree(conditions, i, childrenBounds)) ==
            typeTreeId(Topology.typeTree(conditions, j, childrenBounds));
    }

    function _isTypeEquivalent(
        ConditionFlat[] memory conditions,
        uint256 i,
        uint256 j,
        Topology.Bounds[] memory childrenBounds
    ) private pure returns (bool) {
        ParameterType leftParamType = Topology
            .typeTree(conditions, i, childrenBounds)
            .paramType;
        return
            (leftParamType == ParameterType.Calldata ||
                leftParamType == ParameterType.AbiEncoded) &&
            Topology.typeTree(conditions, j, childrenBounds).paramType ==
            ParameterType.Dynamic;
    }

    function typeTreeId(
        Topology.TypeTree memory node
    ) private pure returns (bytes32) {
        uint256 childCount = node.children.length;
        if (childCount > 0) {
            bytes32[] memory ids = new bytes32[](node.children.length);
            for (uint256 i = 0; i < childCount; ++i) {
                ids[i] = typeTreeId(node.children[i]);
            }

            return keccak256(abi.encodePacked(node.paramType, "-", ids));
        } else {
            return bytes32(uint256(node.paramType));
        }
    }
}

// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity >=0.8.17 <0.9.0;

import "./Types.sol";

/**
 * @title Topology - a library that provides helper functions for dealing with
 * the flat representation of conditions.
 * @author Cristóvão Honorato - <[email protected]>
 */
library Topology {
    struct TypeTree {
        ParameterType paramType;
        TypeTree[] children;
    }

    struct Bounds {
        uint256 start;
        uint256 end;
        uint256 length;
    }

    function childrenBounds(
        ConditionFlat[] memory conditions
    ) internal pure returns (Bounds[] memory result) {
        uint256 count = conditions.length;
        assert(count > 0);

        // parents are breadth-first
        result = new Bounds[](count);
        result[0].start = type(uint256).max;

        // first item is the root
        for (uint256 i = 1; i < count; ) {
            result[i].start = type(uint256).max;
            Bounds memory parentBounds = result[conditions[i].parent];
            if (parentBounds.start == type(uint256).max) {
                parentBounds.start = i;
            }
            parentBounds.end = i + 1;
            parentBounds.length = parentBounds.end - parentBounds.start;
            unchecked {
                ++i;
            }
        }
    }

    function isInline(TypeTree memory node) internal pure returns (bool) {
        ParameterType paramType = node.paramType;
        if (paramType == ParameterType.Static) {
            return true;
        } else if (
            paramType == ParameterType.Dynamic ||
            paramType == ParameterType.Array ||
            paramType == ParameterType.Calldata ||
            paramType == ParameterType.AbiEncoded
        ) {
            return false;
        } else {
            uint256 length = node.children.length;

            for (uint256 i; i < length; ) {
                if (!isInline(node.children[i])) {
                    return false;
                }
                unchecked {
                    ++i;
                }
            }
            return true;
        }
    }

    function typeTree(
        Condition memory condition
    ) internal pure returns (TypeTree memory result) {
        if (
            condition.operator >= Operator.And &&
            condition.operator <= Operator.Nor
        ) {
            assert(condition.children.length > 0);
            return typeTree(condition.children[0]);
        }

        result.paramType = condition.paramType;
        if (condition.children.length > 0) {
            uint256 length = condition.paramType == ParameterType.Array
                ? 1
                : condition.children.length;
            result.children = new TypeTree[](length);

            for (uint256 i; i < length; ) {
                result.children[i] = typeTree(condition.children[i]);

                unchecked {
                    ++i;
                }
            }
        }
    }

    function typeTree(
        ConditionFlat[] memory conditions,
        uint256 index,
        Bounds[] memory bounds
    ) internal pure returns (TypeTree memory result) {
        ConditionFlat memory condition = conditions[index];
        if (
            condition.operator >= Operator.And &&
            condition.operator <= Operator.Nor
        ) {
            assert(bounds[index].length > 0);
            return typeTree(conditions, bounds[index].start, bounds);
        }

        result.paramType = condition.paramType;
        if (bounds[index].length > 0) {
            uint256 start = bounds[index].start;
            uint256 end = condition.paramType == ParameterType.Array
                ? bounds[index].start + 1
                : bounds[index].end;
            result.children = new TypeTree[](end - start);
            for (uint256 i = start; i < end; ) {
                result.children[i - start] = typeTree(conditions, i, bounds);
                unchecked {
                    ++i;
                }
            }
        }
    }
}

File 3 of 3 : Types.sol
// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity >=0.8.17 <0.9.0;

/**
 * @title Types - a file that contains all of the type definitions used throughout
 * the Zodiac Roles Mod.
 * @author Cristóvão Honorato - <[email protected]>
 * @author Jan-Felix Schwarz  - <[email protected]>
 */

enum ParameterType {
    None,
    Static,
    Dynamic,
    Tuple,
    Array,
    Calldata,
    AbiEncoded
}

enum Operator {
    // 00:    EMPTY EXPRESSION (default, always passes)
    //          paramType: Static / Dynamic / Tuple / Array
    //          ❓ children (only for paramType: Tuple / Array to describe their structure)
    //          🚫 compValue
    /* 00: */ Pass,
    // ------------------------------------------------------------
    // 01-04: LOGICAL EXPRESSIONS
    //          paramType: None
    //          ✅ children
    //          🚫 compValue
    /* 01: */ And,
    /* 02: */ Or,
    /* 03: */ Nor,
    /* 04: */ _Placeholder04,
    // ------------------------------------------------------------
    // 05-14: COMPLEX EXPRESSIONS
    //          paramType: Calldata / AbiEncoded / Tuple / Array,
    //          ✅ children
    //          🚫 compValue
    /* 05: */ Matches,
    /* 06: */ ArraySome,
    /* 07: */ ArrayEvery,
    /* 08: */ ArraySubset,
    /* 09: */ _Placeholder09,
    /* 10: */ _Placeholder10,
    /* 11: */ _Placeholder11,
    /* 12: */ _Placeholder12,
    /* 13: */ _Placeholder13,
    /* 14: */ _Placeholder14,
    // ------------------------------------------------------------
    // 15:    SPECIAL COMPARISON (without compValue)
    //          paramType: Static
    //          🚫 children
    //          🚫 compValue
    /* 15: */ EqualToAvatar,
    // ------------------------------------------------------------
    // 16-31: COMPARISON EXPRESSIONS
    //          paramType: Static / Dynamic / Tuple / Array
    //          ❓ children (only for paramType: Tuple / Array to describe their structure)
    //          ✅ compValue
    /* 16: */ EqualTo, // paramType: Static / Dynamic / Tuple / Array
    /* 17: */ GreaterThan, // paramType: Static
    /* 18: */ LessThan, // paramType: Static
    /* 19: */ SignedIntGreaterThan, // paramType: Static
    /* 20: */ SignedIntLessThan, // paramType: Static
    /* 21: */ Bitmask, // paramType: Static / Dynamic
    /* 22: */ Custom, // paramType: Static / Dynamic / Tuple / Array
    /* 23: */ _Placeholder23,
    /* 24: */ _Placeholder24,
    /* 25: */ _Placeholder25,
    /* 26: */ _Placeholder26,
    /* 27: */ _Placeholder27,
    /* 28: */ WithinAllowance, // paramType: Static
    /* 29: */ EtherWithinAllowance, // paramType: None
    /* 30: */ CallWithinAllowance, // paramType: None
    /* 31: */ _Placeholder31
}

enum ExecutionOptions {
    None,
    Send,
    DelegateCall,
    Both
}

enum Clearance {
    None,
    Target,
    Function
}

// This struct is a flattened version of Condition
// used for ABI encoding a scope config tree
// (ABI does not support recursive types)
struct ConditionFlat {
    uint8 parent;
    ParameterType paramType;
    Operator operator;
    bytes compValue;
}

struct Condition {
    ParameterType paramType;
    Operator operator;
    bytes32 compValue;
    Condition[] children;
}
struct ParameterPayload {
    uint256 location;
    uint256 size;
    ParameterPayload[] children;
}

struct TargetAddress {
    Clearance clearance;
    ExecutionOptions options;
}

struct Role {
    mapping(address => bool) members;
    mapping(address => TargetAddress) targets;
    mapping(bytes32 => bytes32) scopeConfig;
}

/// @notice The order of members in the `Allowance` struct is significant; members updated during accrual (`balance` and `timestamp`) should be stored in the same word.
/// @custom:member refill Amount added to balance after each period elapses.
/// @custom:member maxRefill Refilling stops when balance reaches this value.
/// @custom:member period Duration, in seconds, before a refill occurs. If set to 0, the allowance is for one-time use and won't be replenished.
/// @custom:member balance Remaining allowance available for use. Decreases with usage and increases after each refill by the specified refill amount.
/// @custom:member timestamp Timestamp when the last refill occurred.
struct Allowance {
    uint128 refill;
    uint128 maxRefill;
    uint64 period;
    uint128 balance;
    uint64 timestamp;
}

struct Consumption {
    bytes32 allowanceKey;
    uint128 balance;
    uint128 consumed;
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 100
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"name":"NotBFS","type":"error"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"UnsuitableChildCount","type":"error"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"UnsuitableChildTypeTree","type":"error"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"UnsuitableCompValue","type":"error"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"UnsuitableParameterType","type":"error"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"UnsuitableParent","type":"error"},{"inputs":[],"name":"UnsuitableRootNode","type":"error"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"UnsupportedOperator","type":"error"},{"inputs":[{"components":[{"internalType":"uint8","name":"parent","type":"uint8"},{"internalType":"enum ParameterType","name":"paramType","type":"ParameterType"},{"internalType":"enum Operator","name":"operator","type":"Operator"},{"internalType":"bytes","name":"compValue","type":"bytes"}],"internalType":"struct ConditionFlat[]","name":"conditions","type":"tuple[]"}],"name":"enforce","outputs":[],"stateMutability":"pure","type":"function"}]

611605610035600b8282823980515f1a60731461002957634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe7300000000000000000000000000000000000000003014608060405260043610610034575f3560e01c8063783a904714610038575b5f80fd5b61004b610046366004611386565b61004d565b005b610056816100a1565b5f5b815181101561009457610084828281518110610076576100766114b8565b602002602001015182610141565b61008d816114e0565b9050610058565b5061009e8161067b565b50565b5f805b82518110156100ef57808382815181106100c0576100c06114b8565b60200260200101515f015160ff16036100df576100dc826114e0565b91505b6100e8816114e0565b90506100a4565b5080600114158061011f5750815f8151811061010d5761010d6114b8565b60200260200101515f015160ff165f14155b1561013d57604051632f48858160e21b815260040160405180910390fd5b5050565b6040820151602083015160608401515f83601f811115610163576101636114f8565b03610199576060850151511561019457604051632d6ee65d60e21b8152600481018590526024015b60405180910390fd5b610674565b600183601f8111156101ad576101ad6114f8565b101580156101cd5750600383601f8111156101ca576101ca6114f8565b11155b1561022d575f8260068111156101e5576101e56114f8565b146102065760405163de10075b60e01b81526004810185905260240161018b565b6060850151511561019457604051632d6ee65d60e21b81526004810185905260240161018b565b600583601f811115610241576102416114f8565b036102fa57600382600681111561025a5761025a6114f8565b1415801561027a57506004826006811115610277576102776114f8565b14155b801561029857506005826006811115610295576102956114f8565b14155b80156102b6575060068260068111156102b3576102b36114f8565b14155b156102d75760405163de10075b60e01b81526004810185905260240161018b565b80511561019457604051632d6ee65d60e21b81526004810185905260240161018b565b600683601f81111561030e5761030e6114f8565b148061032b5750600783601f811115610329576103296114f8565b145b806103475750600883601f811115610345576103456114f8565b145b156103825760045b826006811115610361576103616114f8565b146102d75760405163de10075b60e01b81526004810185905260240161018b565b600f83601f811115610396576103966114f8565b036103a257600161034f565b601083601f8111156103b6576103b66114f8565b036104875760018260068111156103cf576103cf6114f8565b141580156103ef575060028260068111156103ec576103ec6114f8565b14155b801561040d5750600382600681111561040a5761040a6114f8565b14155b801561042b57506004826006811115610428576104286114f8565b14155b1561044c5760405163de10075b60e01b81526004810185905260240161018b565b80511580610466575060208151610463919061150c565b15155b1561019457604051632d6ee65d60e21b81526004810185905260240161018b565b601183601f81111561049b5761049b6114f8565b14806104b85750601283601f8111156104b6576104b66114f8565b145b806104d45750601383601f8111156104d2576104d26114f8565b145b806104f05750601483601f8111156104ee576104ee6114f8565b145b156105505760015b82600681111561050a5761050a6114f8565b1461052b5760405163de10075b60e01b81526004810185905260240161018b565b805160201461019457604051632d6ee65d60e21b81526004810185905260240161018b565b601583601f811115610564576105646114f8565b036105be57600182600681111561057d5761057d6114f8565b1415801561059d5750600282600681111561059a5761059a6114f8565b14155b1561052b5760405163de10075b60e01b81526004810185905260240161018b565b601683601f8111156105d2576105d26114f8565b036105fc57805160201461019457604051632d6ee65d60e21b81526004810185905260240161018b565b601c83601f811115610610576106106114f8565b0361061c5760016104f8565b601d83601f811115610630576106306114f8565b148061064d5750601e83601f81111561064b5761064b6114f8565b145b15610658575f6104f8565b604051630a7d7b8960e41b81526004810185905260240161018b565b5050505050565b805160015b818110156107035782818151811061069a5761069a6114b8565b60200260200101515f015160ff16836001836106b6919061152b565b815181106106c6576106c66114b8565b60200260200101515f015160ff1611156106f357604051638484738160e01b815260040160405180910390fd5b6106fc816114e0565b9050610680565b505f5b8181101561080457601d838281518110610722576107226114b8565b602002602001015160400151601f81111561073f5761073f6114f8565b14806107795750601e83828151811061075a5761075a6114b8565b602002602001015160400151601f811115610777576107776114f8565b145b80156107d35750600583848381518110610795576107956114b8565b60200260200101515f015160ff16815181106107b3576107b36114b8565b60200260200101516020015160068111156107d0576107d06114f8565b14155b156107f457604051631d40413960e11b81526004810182905260240161018b565b6107fd816114e0565b9050610706565b505f61080f83610c83565b90505f5b8351811015610b59575f84828151811061082f5761082f6114b8565b602002602001015190505f83838151811061084c5761084c6114b8565b602002602001015190505f6006811115610868576108686114f8565b8260200151600681111561087e5761087e6114f8565b0361095957601d8260400151601f81111561089b5761089b6114f8565b14806108bc5750601e8260400151601f8111156108ba576108ba6114f8565b145b80156108cb5750604081015115155b156108ec5760405163f3379ddd60e01b81526004810184905260240161018b565b60018260400151601f811115610904576109046114f8565b10158015610928575060038260400151601f811115610925576109256114f8565b11155b156109545780604001515f036109545760405163f3379ddd60e01b81526004810184905260240161018b565b610b44565b600182602001516006811115610971576109716114f8565b14806109925750600282602001516006811115610990576109906114f8565b145b156109bd576040810151156109545760405163f3379ddd60e01b81526004810184905260240161018b565b6003826020015160068111156109d5576109d56114f8565b14806109f657506005826020015160068111156109f4576109f46114f8565b145b80610a165750600682602001516006811115610a1457610a146114f8565b145b15610a425780604001515f036109545760405163f3379ddd60e01b81526004810184905260240161018b565b600482602001516006811115610a5a57610a5a6114f8565b14610a6757610a67611544565b80604001515f03610a8e5760405163f3379ddd60e01b81526004810184905260240161018b565b60068260400151601f811115610aa657610aa66114f8565b1480610ac7575060078260400151601f811115610ac557610ac56114f8565b145b8015610ad857508060400151600114155b15610af95760405163f3379ddd60e01b81526004810184905260240161018b565b60088260400151601f811115610b1157610b116114f8565b148015610b2357506101008160400151115b15610b445760405163f3379ddd60e01b81526004810184905260240161018b565b50508080610b51906114e0565b915050610813565b505f5b8351811015610c3b575f848281518110610b7857610b786114b8565b602002602001015190506001601f811115610b9557610b956114f8565b8160400151601f811115610bab57610bab6114f8565b10158015610bcf575060038160400151601f811115610bcc57610bcc6114f8565b11155b80610bef5750600481602001516006811115610bed57610bed6114f8565b145b8015610c1857506001838381518110610c0a57610c0a6114b8565b602002602001015160400151115b15610c2857610c28858385610dcd565b5080610c33816114e0565b915050610b5c565b505f610c48845f84610e82565b9050600581516006811115610c5f57610c5f6114f8565b14610c7d57604051632f48858160e21b815260040160405180910390fd5b50505050565b805160609080610c9557610c95611544565b806001600160401b03811115610cad57610cad61129c565b604051908082528060200260200182016040528015610cff57816020015b610cec60405180606001604052805f81526020015f81526020015f81525090565b815260200190600190039081610ccb5790505b5091505f19825f81518110610d1657610d166114b8565b60209081029190910101515260015b81811015610dc6575f19838281518110610d4157610d416114b8565b60200260200101515f0181815250505f83858381518110610d6457610d646114b8565b60200260200101515f015160ff1681518110610d8257610d826114b8565b602002602001015190505f19815f015103610d9b578181525b610da6826001611558565b602082018190528151610db89161152b565b604090910152600101610d25565b5050919050565b5f818381518110610de057610de06114b8565b60200260200101515f015190505f828481518110610e0057610e006114b8565b60200260200101516020015190505f826001610e1c9190611558565b90505b81811015610e7a57610e3386848387611101565b158015610e495750610e478684838761112d565b155b15610e6a576040516303a3183b60e61b81526004810186905260240161018b565b610e73816114e0565b9050610e1f565b505050505050565b604080518082019091525f8152606060208201525f848481518110610ea957610ea96114b8565b602002602001015190506001601f811115610ec657610ec66114f8565b8160400151601f811115610edc57610edc6114f8565b10158015610f00575060038160400151601f811115610efd57610efd6114f8565b11155b15610f60575f838581518110610f1857610f186114b8565b60200260200101516040015111610f3157610f31611544565b610f5885848681518110610f4757610f476114b8565b60200260200101515f015185610e82565b9150506110fa565b602081015182906006811115610f7857610f786114f8565b90816006811115610f8b57610f8b6114f8565b815250505f838581518110610fa257610fa26114b8565b60200260200101516040015111156110f8575f838581518110610fc757610fc76114b8565b60209081029190910101515190505f600483602001516006811115610fee57610fee6114f8565b1461101657848681518110611005576110056114b8565b60200260200101516020015161103f565b848681518110611028576110286114b8565b60200260200101515f0151600161103f9190611558565b905061104b828261152b565b6001600160401b038111156110625761106261129c565b6040519080825280602002602001820160405280156110a757816020015b604080518082019091525f8152606060208201528152602001906001900390816110805790505b506020850152815b818110156110f4576110c2888288610e82565b60208601516110d1858461152b565b815181106110e1576110e16114b8565b60209081029190910101526001016110af565b5050505b505b9392505050565b5f611115611110868585610e82565b6111a0565b611123611110878786610e82565b1495945050505050565b5f8061113a868685610e82565b5190506005816006811115611151576111516114f8565b148061116e5750600681600681111561116c5761116c6114f8565b145b801561119657506002611182878686610e82565b516006811115611194576111946114f8565b145b9695505050505050565b6020810151515f908015611289575f8360200151516001600160401b038111156111cc576111cc61129c565b6040519080825280602002602001820160405280156111f5578160200160208202803683370190505b5090505f5b82811015611255576112288560200151828151811061121b5761121b6114b8565b60200260200101516111a0565b82828151811061123a5761123a6114b8565b602090810291909101015261124e816114e0565b90506111fa565b50835160405161126a9190839060200161156b565b6040516020818303038152906040528051906020012092505050919050565b825160068111156110fa576110fa6114f8565b634e487b7160e01b5f52604160045260245ffd5b604051608081016001600160401b03811182821017156112d2576112d261129c565b60405290565b604051601f8201601f191681016001600160401b03811182821017156113005761130061129c565b604052919050565b803560208110611316575f80fd5b919050565b5f82601f83011261132a575f80fd5b81356001600160401b038111156113435761134361129c565b611356601f8201601f19166020016112d8565b81815284602083860101111561136a575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6020808385031215611397575f80fd5b82356001600160401b03808211156113ad575f80fd5b818501915085601f8301126113c0575f80fd5b8135818111156113d2576113d261129c565b8060051b6113e18582016112d8565b91825283810185019185810190898411156113fa575f80fd5b86860192505b838310156114ab57823585811115611417575f8081fd5b86016080818c03601f190181131561142e575f8081fd5b6114366112b0565b8983013560ff81168114611449575f8081fd5b81526040838101356007811061145e575f8081fd5b828c0152606061146f858201611308565b83830152928401359289841115611487575f91508182fd5b6114958f8d8688010161131b565b9083015250845250509186019190860190611400565b9998505050505050505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f600182016114f1576114f16114cc565b5060010190565b634e487b7160e01b5f52602160045260245ffd5b5f8261152657634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111561153e5761153e6114cc565b92915050565b634e487b7160e01b5f52600160045260245ffd5b8082018082111561153e5761153e6114cc565b5f6007841061158857634e487b7160e01b5f52602160045260245ffd5b8360f81b82526001602d60f81b8184015260028301845160208087015f5b838110156115c15781518552938201939082019085016115a6565b50929897505050505050505056fea26469706673582212201c1e03ab2a1598caac0eb26e3051d530e58d0f65d2024008f73f7ba8fcfec77f64736f6c63430008150033

Deployed Bytecode

0x736a6af4b16458bc39817e4019fb02bd3b26d410493014608060405260043610610034575f3560e01c8063783a904714610038575b5f80fd5b61004b610046366004611386565b61004d565b005b610056816100a1565b5f5b815181101561009457610084828281518110610076576100766114b8565b602002602001015182610141565b61008d816114e0565b9050610058565b5061009e8161067b565b50565b5f805b82518110156100ef57808382815181106100c0576100c06114b8565b60200260200101515f015160ff16036100df576100dc826114e0565b91505b6100e8816114e0565b90506100a4565b5080600114158061011f5750815f8151811061010d5761010d6114b8565b60200260200101515f015160ff165f14155b1561013d57604051632f48858160e21b815260040160405180910390fd5b5050565b6040820151602083015160608401515f83601f811115610163576101636114f8565b03610199576060850151511561019457604051632d6ee65d60e21b8152600481018590526024015b60405180910390fd5b610674565b600183601f8111156101ad576101ad6114f8565b101580156101cd5750600383601f8111156101ca576101ca6114f8565b11155b1561022d575f8260068111156101e5576101e56114f8565b146102065760405163de10075b60e01b81526004810185905260240161018b565b6060850151511561019457604051632d6ee65d60e21b81526004810185905260240161018b565b600583601f811115610241576102416114f8565b036102fa57600382600681111561025a5761025a6114f8565b1415801561027a57506004826006811115610277576102776114f8565b14155b801561029857506005826006811115610295576102956114f8565b14155b80156102b6575060068260068111156102b3576102b36114f8565b14155b156102d75760405163de10075b60e01b81526004810185905260240161018b565b80511561019457604051632d6ee65d60e21b81526004810185905260240161018b565b600683601f81111561030e5761030e6114f8565b148061032b5750600783601f811115610329576103296114f8565b145b806103475750600883601f811115610345576103456114f8565b145b156103825760045b826006811115610361576103616114f8565b146102d75760405163de10075b60e01b81526004810185905260240161018b565b600f83601f811115610396576103966114f8565b036103a257600161034f565b601083601f8111156103b6576103b66114f8565b036104875760018260068111156103cf576103cf6114f8565b141580156103ef575060028260068111156103ec576103ec6114f8565b14155b801561040d5750600382600681111561040a5761040a6114f8565b14155b801561042b57506004826006811115610428576104286114f8565b14155b1561044c5760405163de10075b60e01b81526004810185905260240161018b565b80511580610466575060208151610463919061150c565b15155b1561019457604051632d6ee65d60e21b81526004810185905260240161018b565b601183601f81111561049b5761049b6114f8565b14806104b85750601283601f8111156104b6576104b66114f8565b145b806104d45750601383601f8111156104d2576104d26114f8565b145b806104f05750601483601f8111156104ee576104ee6114f8565b145b156105505760015b82600681111561050a5761050a6114f8565b1461052b5760405163de10075b60e01b81526004810185905260240161018b565b805160201461019457604051632d6ee65d60e21b81526004810185905260240161018b565b601583601f811115610564576105646114f8565b036105be57600182600681111561057d5761057d6114f8565b1415801561059d5750600282600681111561059a5761059a6114f8565b14155b1561052b5760405163de10075b60e01b81526004810185905260240161018b565b601683601f8111156105d2576105d26114f8565b036105fc57805160201461019457604051632d6ee65d60e21b81526004810185905260240161018b565b601c83601f811115610610576106106114f8565b0361061c5760016104f8565b601d83601f811115610630576106306114f8565b148061064d5750601e83601f81111561064b5761064b6114f8565b145b15610658575f6104f8565b604051630a7d7b8960e41b81526004810185905260240161018b565b5050505050565b805160015b818110156107035782818151811061069a5761069a6114b8565b60200260200101515f015160ff16836001836106b6919061152b565b815181106106c6576106c66114b8565b60200260200101515f015160ff1611156106f357604051638484738160e01b815260040160405180910390fd5b6106fc816114e0565b9050610680565b505f5b8181101561080457601d838281518110610722576107226114b8565b602002602001015160400151601f81111561073f5761073f6114f8565b14806107795750601e83828151811061075a5761075a6114b8565b602002602001015160400151601f811115610777576107776114f8565b145b80156107d35750600583848381518110610795576107956114b8565b60200260200101515f015160ff16815181106107b3576107b36114b8565b60200260200101516020015160068111156107d0576107d06114f8565b14155b156107f457604051631d40413960e11b81526004810182905260240161018b565b6107fd816114e0565b9050610706565b505f61080f83610c83565b90505f5b8351811015610b59575f84828151811061082f5761082f6114b8565b602002602001015190505f83838151811061084c5761084c6114b8565b602002602001015190505f6006811115610868576108686114f8565b8260200151600681111561087e5761087e6114f8565b0361095957601d8260400151601f81111561089b5761089b6114f8565b14806108bc5750601e8260400151601f8111156108ba576108ba6114f8565b145b80156108cb5750604081015115155b156108ec5760405163f3379ddd60e01b81526004810184905260240161018b565b60018260400151601f811115610904576109046114f8565b10158015610928575060038260400151601f811115610925576109256114f8565b11155b156109545780604001515f036109545760405163f3379ddd60e01b81526004810184905260240161018b565b610b44565b600182602001516006811115610971576109716114f8565b14806109925750600282602001516006811115610990576109906114f8565b145b156109bd576040810151156109545760405163f3379ddd60e01b81526004810184905260240161018b565b6003826020015160068111156109d5576109d56114f8565b14806109f657506005826020015160068111156109f4576109f46114f8565b145b80610a165750600682602001516006811115610a1457610a146114f8565b145b15610a425780604001515f036109545760405163f3379ddd60e01b81526004810184905260240161018b565b600482602001516006811115610a5a57610a5a6114f8565b14610a6757610a67611544565b80604001515f03610a8e5760405163f3379ddd60e01b81526004810184905260240161018b565b60068260400151601f811115610aa657610aa66114f8565b1480610ac7575060078260400151601f811115610ac557610ac56114f8565b145b8015610ad857508060400151600114155b15610af95760405163f3379ddd60e01b81526004810184905260240161018b565b60088260400151601f811115610b1157610b116114f8565b148015610b2357506101008160400151115b15610b445760405163f3379ddd60e01b81526004810184905260240161018b565b50508080610b51906114e0565b915050610813565b505f5b8351811015610c3b575f848281518110610b7857610b786114b8565b602002602001015190506001601f811115610b9557610b956114f8565b8160400151601f811115610bab57610bab6114f8565b10158015610bcf575060038160400151601f811115610bcc57610bcc6114f8565b11155b80610bef5750600481602001516006811115610bed57610bed6114f8565b145b8015610c1857506001838381518110610c0a57610c0a6114b8565b602002602001015160400151115b15610c2857610c28858385610dcd565b5080610c33816114e0565b915050610b5c565b505f610c48845f84610e82565b9050600581516006811115610c5f57610c5f6114f8565b14610c7d57604051632f48858160e21b815260040160405180910390fd5b50505050565b805160609080610c9557610c95611544565b806001600160401b03811115610cad57610cad61129c565b604051908082528060200260200182016040528015610cff57816020015b610cec60405180606001604052805f81526020015f81526020015f81525090565b815260200190600190039081610ccb5790505b5091505f19825f81518110610d1657610d166114b8565b60209081029190910101515260015b81811015610dc6575f19838281518110610d4157610d416114b8565b60200260200101515f0181815250505f83858381518110610d6457610d646114b8565b60200260200101515f015160ff1681518110610d8257610d826114b8565b602002602001015190505f19815f015103610d9b578181525b610da6826001611558565b602082018190528151610db89161152b565b604090910152600101610d25565b5050919050565b5f818381518110610de057610de06114b8565b60200260200101515f015190505f828481518110610e0057610e006114b8565b60200260200101516020015190505f826001610e1c9190611558565b90505b81811015610e7a57610e3386848387611101565b158015610e495750610e478684838761112d565b155b15610e6a576040516303a3183b60e61b81526004810186905260240161018b565b610e73816114e0565b9050610e1f565b505050505050565b604080518082019091525f8152606060208201525f848481518110610ea957610ea96114b8565b602002602001015190506001601f811115610ec657610ec66114f8565b8160400151601f811115610edc57610edc6114f8565b10158015610f00575060038160400151601f811115610efd57610efd6114f8565b11155b15610f60575f838581518110610f1857610f186114b8565b60200260200101516040015111610f3157610f31611544565b610f5885848681518110610f4757610f476114b8565b60200260200101515f015185610e82565b9150506110fa565b602081015182906006811115610f7857610f786114f8565b90816006811115610f8b57610f8b6114f8565b815250505f838581518110610fa257610fa26114b8565b60200260200101516040015111156110f8575f838581518110610fc757610fc76114b8565b60209081029190910101515190505f600483602001516006811115610fee57610fee6114f8565b1461101657848681518110611005576110056114b8565b60200260200101516020015161103f565b848681518110611028576110286114b8565b60200260200101515f0151600161103f9190611558565b905061104b828261152b565b6001600160401b038111156110625761106261129c565b6040519080825280602002602001820160405280156110a757816020015b604080518082019091525f8152606060208201528152602001906001900390816110805790505b506020850152815b818110156110f4576110c2888288610e82565b60208601516110d1858461152b565b815181106110e1576110e16114b8565b60209081029190910101526001016110af565b5050505b505b9392505050565b5f611115611110868585610e82565b6111a0565b611123611110878786610e82565b1495945050505050565b5f8061113a868685610e82565b5190506005816006811115611151576111516114f8565b148061116e5750600681600681111561116c5761116c6114f8565b145b801561119657506002611182878686610e82565b516006811115611194576111946114f8565b145b9695505050505050565b6020810151515f908015611289575f8360200151516001600160401b038111156111cc576111cc61129c565b6040519080825280602002602001820160405280156111f5578160200160208202803683370190505b5090505f5b82811015611255576112288560200151828151811061121b5761121b6114b8565b60200260200101516111a0565b82828151811061123a5761123a6114b8565b602090810291909101015261124e816114e0565b90506111fa565b50835160405161126a9190839060200161156b565b6040516020818303038152906040528051906020012092505050919050565b825160068111156110fa576110fa6114f8565b634e487b7160e01b5f52604160045260245ffd5b604051608081016001600160401b03811182821017156112d2576112d261129c565b60405290565b604051601f8201601f191681016001600160401b03811182821017156113005761130061129c565b604052919050565b803560208110611316575f80fd5b919050565b5f82601f83011261132a575f80fd5b81356001600160401b038111156113435761134361129c565b611356601f8201601f19166020016112d8565b81815284602083860101111561136a575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6020808385031215611397575f80fd5b82356001600160401b03808211156113ad575f80fd5b818501915085601f8301126113c0575f80fd5b8135818111156113d2576113d261129c565b8060051b6113e18582016112d8565b91825283810185019185810190898411156113fa575f80fd5b86860192505b838310156114ab57823585811115611417575f8081fd5b86016080818c03601f190181131561142e575f8081fd5b6114366112b0565b8983013560ff81168114611449575f8081fd5b81526040838101356007811061145e575f8081fd5b828c0152606061146f858201611308565b83830152928401359289841115611487575f91508182fd5b6114958f8d8688010161131b565b9083015250845250509186019190860190611400565b9998505050505050505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f600182016114f1576114f16114cc565b5060010190565b634e487b7160e01b5f52602160045260245ffd5b5f8261152657634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111561153e5761153e6114cc565b92915050565b634e487b7160e01b5f52600160045260245ffd5b8082018082111561153e5761153e6114cc565b5f6007841061158857634e487b7160e01b5f52602160045260245ffd5b8360f81b82526001602d60f81b8184015260028301845160208087015f5b838110156115c15781518552938201939082019085016115a6565b50929897505050505050505056fea26469706673582212201c1e03ab2a1598caac0eb26e3051d530e58d0f65d2024008f73f7ba8fcfec77f64736f6c63430008150033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.