ETH Price: $1,876.59 (+3.30%)
Gas: 20 Gwei
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multi Chain

Multichain Addresses

1 address found via
Transaction Hash
Method
Block
From
To
Value
Set Operator174129082023-06-05 7:41:592 days 28 mins ago1685950919IN
Juicebox: Operator Store
0 ETH0.0008906218.4203091
Set Operator173977032023-06-03 4:12:354 days 3 hrs ago1685765555IN
Juicebox: Operator Store
0 ETH0.0020491942.38259813
Set Operator173823272023-06-01 0:12:236 days 7 hrs ago1685578343IN
Juicebox: Operator Store
0 ETH0.0013005826.89267576
Set Operator173769682023-05-31 6:06:597 days 2 hrs ago1685513219IN
Juicebox: Operator Store
0 ETH0.0015475832
Set Operator173529962023-05-27 21:15:1110 days 10 hrs ago1685222111IN
Juicebox: Operator Store
0 ETH0.0015458231.96357185
Set Operator173528642023-05-27 20:48:3510 days 11 hrs ago1685220515IN
Juicebox: Operator Store
0 ETH0.0010780622.29156299
Set Operator173214672023-05-23 10:52:4714 days 21 hrs ago1684839167IN
Juicebox: Operator Store
0 ETH0.0016716234.56483091
Set Operator173117362023-05-22 1:59:5916 days 6 hrs ago1684720799IN
Juicebox: Operator Store
0 ETH0.0007527526.44757904
Set Operator173117312023-05-22 1:58:5916 days 6 hrs ago1684720739IN
Juicebox: Operator Store
0 ETH0.0008317229.22235608
Set Operator173117292023-05-22 1:58:3516 days 6 hrs ago1684720715IN
Juicebox: Operator Store
0 ETH0.0014016328.98207158
Set Operator173086502023-05-21 15:32:3516 days 16 hrs ago1684683155IN
Juicebox: Operator Store
0 ETH0.0015627732.32211278
Set Operator172639052023-05-15 8:09:4723 days ago1684138187IN
Juicebox: Operator Store
0 ETH0.0017396235.97099822
Set Operator172583692023-05-14 13:23:4723 days 18 hrs ago1684070627IN
Juicebox: Operator Store
0 ETH0.0020819843.06066391
Set Operator172348192023-05-11 4:44:3527 days 3 hrs ago1683780275IN
Juicebox: Operator Store
0 ETH0.0039928382.56143981
Set Operator171881212023-05-04 15:13:5933 days 16 hrs ago1683213239IN
Juicebox: Operator Store
0 ETH0.00489048101.12240871
Set Operator171780052023-05-03 5:03:1135 days 3 hrs ago1683090191IN
Juicebox: Operator Store
0 ETH0.0030651263.37887395
Set Operator171562922023-04-30 3:48:5938 days 4 hrs ago1682826539IN
Juicebox: Operator Store
0 ETH0.00168934.93291497
Set Operator170984572023-04-22 0:57:2346 days 7 hrs ago1682125043IN
Juicebox: Operator Store
0 ETH0.001471130.41855424
Set Operator170949172023-04-21 12:58:4746 days 19 hrs ago1682081927IN
Juicebox: Operator Store
0 ETH0.0019422740.16126503
Set Operator170740202023-04-18 14:01:3549 days 18 hrs ago1681826495IN
Juicebox: Operator Store
0 ETH0.0028702459.34923109
Set Operator170664672023-04-17 12:22:3550 days 19 hrs ago1681734155IN
Juicebox: Operator Store
0 ETH0.0013556128.03060063
Set Operator170649102023-04-17 7:04:4751 days 1 hr ago1681715087IN
Juicebox: Operator Store
0 ETH0.0014970630.95538074
Set Operator170647172023-04-17 6:25:5951 days 1 hr ago1681712759IN
Juicebox: Operator Store
0 ETH0.0012423225.68810535
Set Operator170646422023-04-17 6:10:4751 days 1 hr ago1681711847IN
Juicebox: Operator Store
0 ETH0.001363628.19570901
Set Operator170645132023-04-17 5:44:2351 days 2 hrs ago1681710263IN
Juicebox: Operator Store
0 ETH0.0014507429.99771394
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
OperatorStore

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 10000 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 2 : OperatorStore.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.6;

import "./interfaces/IOperatorStore.sol";

/** 
  @notice
  Addresses can give permissions to any other address to take specific actions 
  throughout the Juicebox ecosystem on their behalf. These addresses are called `operators`.
  
  @dev
  Permissions are stored as a uint256, with each boolean bit representing whether or not
  an oporator has the permission identified by that bit's index in the 256 bit uint256.
  Indexes must be between 0 and 255.

  The directory of permissions, along with how they uniquely mapp to indexes, are managed externally.
  This contract doesn't know or care about specific permissions and their indexes.
*/
contract OperatorStore is IOperatorStore {
    // --- public stored properties --- //

    /** 
      @notice
      The permissions that an operator has to operate on a specific domain.
      
      @dev
      An account can give an operator permissions that only pertain to a specific domain.
      There is no domain with an ID of 0 -- accounts can use the 0 domain to give an operator
      permissions to operator on their personal behalf.
    */
    mapping(address => mapping(address => mapping(uint256 => uint256)))
        public
        override permissionsOf;

    // --- public views --- //

    /** 
      @notice 
      Whether or not an operator has the permission to take a certain action pertaining to the specified domain.

      @param _operator The operator to check.
      @param _account The account that has given out permission to the operator.
      @param _domain The domain that the operator has been given permissions to operate.
      @param _permissionIndex the permission to check for.

      @return Whether the operator has the specified permission.
    */
    function hasPermission(
        address _operator,
        address _account,
        uint256 _domain,
        uint256 _permissionIndex
    ) external view override returns (bool) {
        require(
            _permissionIndex <= 255,
            "OperatorStore::hasPermission: INDEX_OUT_OF_BOUNDS"
        );
        return
            ((permissionsOf[_operator][_account][_domain] >> _permissionIndex) &
                1) == 1;
    }

    /** 
      @notice 
      Whether or not an operator has the permission to take certain actions pertaining to the specified domain.

      @param _operator The operator to check.
      @param _account The account that has given out permissions to the operator.
      @param _domain The domain that the operator has been given permissions to operate.
      @param _permissionIndexes An array of permission indexes to check for.

      @return Whether the operator has all specified permissions.
    */
    function hasPermissions(
        address _operator,
        address _account,
        uint256 _domain,
        uint256[] calldata _permissionIndexes
    ) external view override returns (bool) {
        for (uint256 _i = 0; _i < _permissionIndexes.length; _i++) {
            uint256 _permissionIndex = _permissionIndexes[_i];

            require(
                _permissionIndex <= 255,
                "OperatorStore::hasPermissions: INDEX_OUT_OF_BOUNDS"
            );

            if (
                ((permissionsOf[_operator][_account][_domain] >>
                    _permissionIndex) & 1) == 0
            ) return false;
        }
        return true;
    }

    // --- external transactions --- //

    /** 
      @notice 
      Sets permissions for an operator.

      @param _operator The operator to give permission to.
      @param _domain The domain that the operator is being given permissions to operate.
      @param _permissionIndexes An array of indexes of permissions to set.
    */
    function setOperator(
        address _operator,
        uint256 _domain,
        uint256[] calldata _permissionIndexes
    ) external override {
        // Pack the indexes into a uint256.
        uint256 _packed = _packedPermissions(_permissionIndexes);

        // Store the new value.
        permissionsOf[_operator][msg.sender][_domain] = _packed;

        emit SetOperator(
            _operator,
            msg.sender,
            _domain,
            _permissionIndexes,
            _packed
        );
    }

    /** 
      @notice 
      Sets permissions for many operators.

      @param _operators The operators to give permission to.
      @param _domains The domains that can be operated. Set to 0 to allow operation of account level actions.
      @param _permissionIndexes The level of power each operator should have.
    */
    function setOperators(
        address[] calldata _operators,
        uint256[] calldata _domains,
        uint256[][] calldata _permissionIndexes
    ) external override {
        // There should be a level for each operator provided.
        require(
            _operators.length == _permissionIndexes.length &&
                _operators.length == _domains.length,
            "OperatorStore::setOperators: BAD_ARGS"
        );
        for (uint256 _i = 0; _i < _operators.length; _i++) {
            // Pack the indexes into a uint256.
            uint256 _packed = _packedPermissions(_permissionIndexes[_i]);
            // Store the new value.
            permissionsOf[_operators[_i]][msg.sender][_domains[_i]] = _packed;
            emit SetOperator(
                _operators[_i],
                msg.sender,
                _domains[_i],
                _permissionIndexes[_i],
                _packed
            );
        }
    }

    // --- private helper functions --- //

    /** 
      @notice 
      Converts an array of permission indexes to a packed int.

      @param _indexes The indexes of the permissions to pack.

      @return packed The packed result.
    */
    function _packedPermissions(uint256[] calldata _indexes)
        private
        pure
        returns (uint256 packed)
    {
        for (uint256 _i = 0; _i < _indexes.length; _i++) {
            uint256 _permissionIndex = _indexes[_i];
            require(
                _permissionIndex <= 255,
                "OperatorStore::_packedPermissions: INDEX_OUT_OF_BOUNDS"
            );
            // Turn the bit at the index on.
            packed |= 1 << _permissionIndex;
        }
    }
}

File 2 of 2 : IOperatorStore.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.6;

interface IOperatorStore {
    event SetOperator(
        address indexed operator,
        address indexed account,
        uint256 indexed domain,
        uint256[] permissionIndexes,
        uint256 packed
    );

    function permissionsOf(
        address _operator,
        address _account,
        uint256 _domain
    ) external view returns (uint256);

    function hasPermission(
        address _operator,
        address _account,
        uint256 _domain,
        uint256 _permissionIndex
    ) external view returns (bool);

    function hasPermissions(
        address _operator,
        address _account,
        uint256 _domain,
        uint256[] calldata _permissionIndexes
    ) external view returns (bool);

    function setOperator(
        address _operator,
        uint256 _domain,
        uint256[] calldata _permissionIndexes
    ) external;

    function setOperators(
        address[] calldata _operators,
        uint256[] calldata _domains,
        uint256[][] calldata _permissionIndexes
    ) external;
}

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

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"domain","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"permissionIndexes","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"packed","type":"uint256"}],"name":"SetOperator","type":"event"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_domain","type":"uint256"},{"internalType":"uint256","name":"_permissionIndex","type":"uint256"}],"name":"hasPermission","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_domain","type":"uint256"},{"internalType":"uint256[]","name":"_permissionIndexes","type":"uint256[]"}],"name":"hasPermissions","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"permissionsOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"uint256","name":"_domain","type":"uint256"},{"internalType":"uint256[]","name":"_permissionIndexes","type":"uint256[]"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_operators","type":"address[]"},{"internalType":"uint256[]","name":"_domains","type":"uint256[]"},{"internalType":"uint256[][]","name":"_permissionIndexes","type":"uint256[][]"}],"name":"setOperators","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50610ad0806100206000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c806380deb2301161005057806380deb230146100a957806393535be1146100e7578063c161c93f146100fa57600080fd5b80630f5932f01461006c5780635ea6cc8614610094575b600080fd5b61007f61007a36600461079f565b61010d565b60405190151581526020015b60405180910390f35b6100a76100a2366004610850565b61023b565b005b6100d96100b7366004610763565b6000602081815293815260408082208552928152828120909352825290205481565b60405190815260200161008b565b6100a76100f53660046108aa565b6102ce565b61007f61010836600461080e565b610513565b6000805b8281101561022c57600084848381811061012d5761012d610a6b565b90506020020135905060ff8111156101cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f70657261746f7253746f72653a3a6861735065726d697373696f6e733a204960448201527f4e4445585f4f55545f4f465f424f554e4453000000000000000000000000000060648201526084015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff888116600090815260208181526040808320938b16835292815282822089835290522054811c60011661021957600092505050610232565b508061022481610a0b565b915050610111565b50600190505b95945050505050565b600061024783836105f0565b73ffffffffffffffffffffffffffffffffffffffff8616600081815260208181526040808320338085529083528184208a855290925291829020849055905192935086929091907f9dee2ffb464e2d0198cd20321be1ae3f79ed49f7ed4abfaa7ee4fe982bbeb320906102bf90889088908890610944565b60405180910390a45050505050565b84811480156102dc57508483145b610368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4f70657261746f7253746f72653a3a7365744f70657261746f72733a2042414460448201527f5f4152475300000000000000000000000000000000000000000000000000000060648201526084016101c3565b60005b8581101561050a5760006103a184848481811061038a5761038a610a6b565b905060200281019061039c91906109a3565b6105f0565b9050806000808a8a868181106103b9576103b9610a6b565b90506020020160208101906103ce9190610741565b73ffffffffffffffffffffffffffffffffffffffff1681526020808201929092526040908101600090812033825290925281209088888681811061041457610414610a6b565b9050602002013581526020019081526020016000208190555085858381811061043f5761043f610a6b565b905060200201353373ffffffffffffffffffffffffffffffffffffffff1689898581811061046f5761046f610a6b565b90506020020160208101906104849190610741565b73ffffffffffffffffffffffffffffffffffffffff167f9dee2ffb464e2d0198cd20321be1ae3f79ed49f7ed4abfaa7ee4fe982bbeb3208787878181106104cd576104cd610a6b565b90506020028101906104df91906109a3565b866040516104ef93929190610944565b60405180910390a4508061050281610a0b565b91505061036b565b50505050505050565b600060ff8211156105a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4f70657261746f7253746f72653a3a6861735065726d697373696f6e3a20494e60448201527f4445585f4f55545f4f465f424f554e445300000000000000000000000000000060648201526084016101c3565b5073ffffffffffffffffffffffffffffffffffffffff808516600090815260208181526040808320938716835292815282822085835290522054600190821c811614949350505050565b6000805b828110156106c557600084848381811061061057610610610a6b565b90506020020135905060ff8111156106aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4f70657261746f7253746f72653a3a5f7061636b65645065726d697373696f6e60448201527f733a20494e4445585f4f55545f4f465f424f554e44530000000000000000000060648201526084016101c3565b6001901b9190911790806106bd81610a0b565b9150506105f4565b5092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106f057600080fd5b919050565b60008083601f84011261070757600080fd5b50813567ffffffffffffffff81111561071f57600080fd5b6020830191508360208260051b850101111561073a57600080fd5b9250929050565b60006020828403121561075357600080fd5b61075c826106cc565b9392505050565b60008060006060848603121561077857600080fd5b610781846106cc565b925061078f602085016106cc565b9150604084013590509250925092565b6000806000806000608086880312156107b757600080fd5b6107c0866106cc565b94506107ce602087016106cc565b935060408601359250606086013567ffffffffffffffff8111156107f157600080fd5b6107fd888289016106f5565b969995985093965092949392505050565b6000806000806080858703121561082457600080fd5b61082d856106cc565b935061083b602086016106cc565b93969395505050506040820135916060013590565b6000806000806060858703121561086657600080fd5b61086f856106cc565b935060208501359250604085013567ffffffffffffffff81111561089257600080fd5b61089e878288016106f5565b95989497509550505050565b600080600080600080606087890312156108c357600080fd5b863567ffffffffffffffff808211156108db57600080fd5b6108e78a838b016106f5565b9098509650602089013591508082111561090057600080fd5b61090c8a838b016106f5565b9096509450604089013591508082111561092557600080fd5b5061093289828a016106f5565b979a9699509497509295939492505050565b6040815282604082015260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84111561097d57600080fd5b8360051b8086606085013760009083016060019081526020909201929092529392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126109d857600080fd5b83018035915067ffffffffffffffff8211156109f357600080fd5b6020019150600581901b360382131561073a57600080fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610a64577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220fcf6ef5dd27163b088a1baab03bb18a417fb8934ef1fb97ffe3f84f57c6d47cd64736f6c63430008060033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

Validator Index Block Amount
View All Withdrawals

Txn Hash Block Value Eth2 PubKey Valid
View All Deposits
[ 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.