ETH Price: $3,431.85 (+0.16%)

Contract

0x9BF7b8884Fa381a45f8CB2525905fb36C996297a
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SecurityCouncilMemberSyncAction

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 1500 runs

Other Settings:
default evmVersion
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.16;

import "./interfaces/IGnosisSafe.sol";
import "./SecurityCouncilMgmtUtils.sol";
import "../gov-action-contracts/execution-record/ActionExecutionRecord.sol";

/// @notice Action contract for updating security council members. Used by the security council management system.
///         Expected to be delegate called into by an Upgrade Executor
contract SecurityCouncilMemberSyncAction is ActionExecutionRecord {
    error PreviousOwnerNotFound(address targetOwner, address securityCouncil);
    error ExecFromModuleError(bytes data, address securityCouncil);

    event UpdateNonceTooLow(
        address indexed securityCouncil, uint256 currrentNonce, uint256 providedNonce
    );

    /// @dev Used in the gnosis safe as the first entry in their ownership linked list
    address public constant SENTINEL_OWNERS = address(0x1);

    constructor(KeyValueStore _store)
        ActionExecutionRecord(_store, "SecurityCouncilMemberSyncAction")
    {}

    /// @notice Updates members of security council multisig to match provided array
    /// @dev    This function contains O(n^2) operations, so doesnt scale for large numbers of members. Expected count is 12, which is acceptable.
    ///         Gnosis OwnerManager handles reverting if address(0) is passed to remove/add owner
    /// @param _securityCouncil The security council to update
    /// @param _updatedMembers  The new list of members. The Security Council will be updated to have this exact list of members
    /// @return res indicates whether an update took place
    function perform(address _securityCouncil, address[] memory _updatedMembers, uint256 _nonce)
        external
        returns (bool res)
    {
        // make sure that _nonce is greater than the last nonce
        // we do this to ensure that a previous update does not occur after a later one
        // the mechanism just checks greater, not n+1, because the Security Council Manager always
        // sends the latest full list of members so it doesn't matter if some updates are missed
        // Additionally a retryable ticket could be used to execute the update, and since tickets
        // expire if not executed after some time, then allowing updates to be skipped means that the
        // system will not be blocked if a retryable ticket is expires
        uint256 updateNonce = getUpdateNonce(_securityCouncil);
        if (_nonce <= updateNonce) {
            // when nonce is too now, we simply return, we don't revert.
            // this way an out of date update will actual execute, rather than remaining in an unexecuted state forever
            emit UpdateNonceTooLow(_securityCouncil, updateNonce, _nonce);
            return false;
        }

        // store the nonce as a record of execution
        // use security council as the key to ensure that updates to different security councils are kept separate
        _setUpdateNonce(_securityCouncil, _nonce);

        IGnosisSafe securityCouncil = IGnosisSafe(_securityCouncil);
        // preserve current threshold, the safe ensures that the threshold is never lower than the member count
        uint256 threshold = securityCouncil.getThreshold();

        address[] memory previousOwners = securityCouncil.getOwners();

        for (uint256 i = 0; i < _updatedMembers.length; i++) {
            address member = _updatedMembers[i];
            if (!securityCouncil.isOwner(member)) {
                _addMember(securityCouncil, member, threshold);
            }
        }

        for (uint256 i = 0; i < previousOwners.length; i++) {
            address owner = previousOwners[i];
            if (!SecurityCouncilMgmtUtils.isInArray(owner, _updatedMembers)) {
                _removeMember(securityCouncil, owner, threshold);
            }
        }
        return true;
    }

    function _addMember(IGnosisSafe securityCouncil, address _member, uint256 _threshold)
        internal
    {
        _execFromModule(
            securityCouncil,
            abi.encodeWithSelector(IGnosisSafe.addOwnerWithThreshold.selector, _member, _threshold)
        );
    }

    function _removeMember(IGnosisSafe securityCouncil, address _member, uint256 _threshold)
        internal
    {
        address previousOwner = getPrevOwner(securityCouncil, _member);
        _execFromModule(
            securityCouncil,
            abi.encodeWithSelector(
                IGnosisSafe.removeOwner.selector, previousOwner, _member, _threshold
            )
        );
    }

    function getPrevOwner(IGnosisSafe securityCouncil, address _owner)
        public
        view
        returns (address)
    {
        // owners are stored as a linked list and removal requires the previous owner
        address[] memory owners = securityCouncil.getOwners();
        address previousOwner = SENTINEL_OWNERS;
        for (uint256 i = 0; i < owners.length; i++) {
            address currentOwner = owners[i];
            if (currentOwner == _owner) {
                return previousOwner;
            }
            previousOwner = currentOwner;
        }
        revert PreviousOwnerNotFound({
            targetOwner: _owner,
            securityCouncil: address(securityCouncil)
        });
    }

    function getUpdateNonce(address securityCouncil) public view returns (uint256) {
        return _get(uint160(securityCouncil));
    }

    function _setUpdateNonce(address securityCouncil, uint256 nonce) internal {
        _set(uint160(securityCouncil), nonce);
    }

    /// @notice Execute provided operation via gnosis safe's trusted execTransactionFromModule entry point
    function _execFromModule(IGnosisSafe securityCouncil, bytes memory data) internal {
        if (
            !securityCouncil.execTransactionFromModule(
                address(securityCouncil), 0, data, OpEnum.Operation.Call
            )
        ) {
            revert ExecFromModuleError({data: data, securityCouncil: address(securityCouncil)});
        }
    }
}

// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.16;

abstract contract OpEnum {
    enum Operation {
        Call,
        DelegateCall
    }
}

interface IGnosisSafe {
    function getOwners() external view returns (address[] memory);
    function getThreshold() external view returns (uint256);
    function isOwner(address owner) external view returns (bool);
    function isModuleEnabled(address module) external view returns (bool);
    function addOwnerWithThreshold(address owner, uint256 threshold) external;
    function removeOwner(address prevOwner, address owner, uint256 threshold) external;
    function execTransactionFromModule(
        address to,
        uint256 value,
        bytes memory data,
        OpEnum.Operation operation
    ) external returns (bool success);
}

// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.16;

library SecurityCouncilMgmtUtils {
    function isInArray(address addr, address[] memory arr) internal pure returns (bool) {
        for (uint256 i = 0; i < arr.length; i++) {
            if (arr[i] == addr) {
                return true;
            }
        }
        return false;
    }

    // filters an array of addresses by removing any addresses that are in the excludeList
    function filterAddressesWithExcludeList(
        address[] memory input,
        mapping(address => bool) storage excludeList
    ) internal view returns (address[] memory) {
        address[] memory intermediate = new address[](input.length);
        uint256 intermediateLength = 0;

        for (uint256 i = 0; i < input.length; i++) {
            address nominee = input[i];
            if (!excludeList[nominee]) {
                intermediate[intermediateLength] = nominee;
                intermediateLength++;
            }
        }

        address[] memory output = new address[](intermediateLength);
        for (uint256 i = 0; i < intermediateLength; i++) {
            output[i] = intermediate[i];
        }

        return output;
    }
}

// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.16;

import "./KeyValueStore.sol";

/// @notice Stores a record that the action executed.
///         Can be useful for enforcing dependency between actions
/// @dev    This contract is designed to be inherited by action contracts, so it
///         it must not use any local storage
contract ActionExecutionRecord {
    /// @notice The key value store used to record the execution
    /// @dev    Local storage cannot be used in action contracts as they're delegate called into
    KeyValueStore public immutable store;

    /// @notice A unique id for this action contract
    bytes32 public immutable actionContractId;

    constructor(KeyValueStore _store, string memory _uniqueActionName) {
        store = _store;
        actionContractId = keccak256(bytes(_uniqueActionName));
    }

    /// @notice Sets a value in the store
    /// @dev    Combines the provided key with the action contract id
    function _set(uint256 key, uint256 value) internal {
        store.set(computeKey(key), value);
    }

    /// @notice Gets a value from the store
    /// @dev    Combines the provided key with the action contract id
    function _get(uint256 key) internal view returns (uint256) {
        return store.get(computeKey(key));
    }

    /// @notice This contract uses a composite key of the provided key and the action contract id.
    ///         This function can be used to calculate the composite key
    function computeKey(uint256 key) public view returns (uint256) {
        return uint256(keccak256(abi.encode(actionContractId, key)));
    }
}

// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.16;

/// @title  A global key value store
/// @notice Stores values against a key, combines msg.sender with the provided key to ensure uniqueness
contract KeyValueStore {
    event ValueSet(address indexed sender, uint256 indexed key, uint256 value);

    mapping(uint256 => uint256) public store;

    /// @notice Sets a value in the store
    /// @dev    Combines the provided key with the msg.sender to ensure uniqueness
    function set(uint256 key, uint256 value) external {
        store[computeKey(msg.sender, key)] = value;
        emit ValueSet({sender: msg.sender, key: key, value: value});
    }

    /// @notice Get a value from the store for the current msg.sender
    function get(uint256 key) external view returns (uint256) {
        return _get(msg.sender, key);
    }

    /// @notice Get a value from the store for any sender
    function get(address owner, uint256 key) external view returns (uint256) {
        return _get(owner, key);
    }

    /// @notice Compute the composite key for a specific user
    function computeKey(address owner, uint256 key) public pure returns (uint256) {
        return uint256(keccak256(abi.encode(owner, key)));
    }

    function _get(address owner, uint256 key) internal view returns (uint256) {
        return store[computeKey(owner, key)];
    }
}

Settings
{
  "remappings": [
    "@arbitrum/nitro-contracts/=node_modules/@arbitrum/nitro-contracts/",
    "@arbitrum/token-bridge-contracts/=node_modules/@arbitrum/token-bridge-contracts/",
    "@gnosis.pm/safe-contracts/=node_modules/@gnosis.pm/safe-contracts/",
    "@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/",
    "@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/",
    "solady/=lib/solady/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 1500
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"contract KeyValueStore","name":"_store","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"address","name":"securityCouncil","type":"address"}],"name":"ExecFromModuleError","type":"error"},{"inputs":[{"internalType":"address","name":"targetOwner","type":"address"},{"internalType":"address","name":"securityCouncil","type":"address"}],"name":"PreviousOwnerNotFound","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"securityCouncil","type":"address"},{"indexed":false,"internalType":"uint256","name":"currrentNonce","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"providedNonce","type":"uint256"}],"name":"UpdateNonceTooLow","type":"event"},{"inputs":[],"name":"SENTINEL_OWNERS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"actionContractId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"key","type":"uint256"}],"name":"computeKey","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IGnosisSafe","name":"securityCouncil","type":"address"},{"internalType":"address","name":"_owner","type":"address"}],"name":"getPrevOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"securityCouncil","type":"address"}],"name":"getUpdateNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_securityCouncil","type":"address"},{"internalType":"address[]","name":"_updatedMembers","type":"address[]"},{"internalType":"uint256","name":"_nonce","type":"uint256"}],"name":"perform","outputs":[{"internalType":"bool","name":"res","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"store","outputs":[{"internalType":"contract KeyValueStore","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60c060405234801561001057600080fd5b50604051610e30380380610e3083398101604081905261002f9161007e565b60408051808201909152601f81527f5365637572697479436f756e63696c4d656d62657253796e63416374696f6e00602082019081526001600160a01b0390921660805251902060a0526100ae565b60006020828403121561009057600080fd5b81516001600160a01b03811681146100a757600080fd5b9392505050565b60805160a051610d3b6100f56000396000818160ad015281816101600152818161059601526107d301526000818161012a0152818161055f015261084c0152610d3b6000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c8063869a43bd1161005b578063869a43bd146100f25780638cff63551461011d578063975057e714610125578063f1cea4901461014c57600080fd5b8063229722bf1461008257806322d2fa9b146100a8578063536d8944146100cf575b600080fd5b610095610090366004610995565b6101a8565b6040519081526020015b60405180910390f35b6100957f000000000000000000000000000000000000000000000000000000000000000081565b6100e26100dd366004610a1d565b6101c2565b604051901515815260200161009f565b610105610100366004610ad9565b610440565b6040516001600160a01b03909116815260200161009f565b610105600181565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b61009561015a366004610b12565b604080517f0000000000000000000000000000000000000000000000000000000000000000602080830191909152818301939093528151808203830181526060909101909152805191012090565b60006101bc826001600160a01b031661055b565b92915050565b6000806101ce856101a8565b90508083116102255760408051828152602081018590526001600160a01b038716917fe51da2eb75b38e363345b12d877435892683cb116aef64a13efa531f7afe2455910160405180910390a26000915050610439565b61022f858461063d565b60008590506000816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa158015610274573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102989190610b2b565b90506000826001600160a01b031663a0e67e2b6040518163ffffffff1660e01b8152600401600060405180830381865afa1580156102da573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103029190810190610b44565b905060005b87518110156103d857600088828151811061032457610324610bde565b60209081029190910101516040517f2f54bf6e0000000000000000000000000000000000000000000000000000000081526001600160a01b03808316600483015291925090861690632f54bf6e90602401602060405180830381865afa158015610392573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b69190610bf4565b6103c5576103c5858286610654565b50806103d081610c16565b915050610307565b5060005b815181101561042f5760008282815181106103f9576103f9610bde565b6020026020010151905061040d818a610702565b61041c5761041c858286610767565b508061042781610c16565b9150506103dc565b5060019450505050505b9392505050565b600080836001600160a01b031663a0e67e2b6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610481573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104a99190810190610b44565b9050600160005b82518110156105105760008382815181106104cd576104cd610bde565b60200260200101519050856001600160a01b0316816001600160a01b0316036104fc57829450505050506101bc565b91508061050881610c16565b9150506104b0565b506040517f24d1fcf50000000000000000000000000000000000000000000000000000000081526001600160a01b038086166004830152861660248201526044015b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639507d39a6105de84604080517f0000000000000000000000000000000000000000000000000000000000000000602080830191909152818301939093528151808203830181526060909101909152805191012090565b6040518263ffffffff1660e01b81526004016105fc91815260200190565b602060405180830381865afa158015610619573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101bc9190610b2b565b610650826001600160a01b0316826107cd565b5050565b6040516001600160a01b0383166024820152604481018290526106fd9084907f0d582f1300000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526108b4565b505050565b6000805b825181101561075d57836001600160a01b031683828151811061072b5761072b610bde565b60200260200101516001600160a01b03160361074b5760019150506101bc565b8061075581610c16565b915050610706565b5060009392505050565b60006107738484610440565b6040516001600160a01b03808316602483015285166044820152606481018490529091506107c79085907ff8dc5dd90000000000000000000000000000000000000000000000000000000090608401610699565b50505050565b604080517f0000000000000000000000000000000000000000000000000000000000000000602080830191909152818301859052825180830384018152606083019384905280519101207f1ab06ee5000000000000000000000000000000000000000000000000000000009092526064810191909152608481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631ab06ee59060a401600060405180830381600087803b15801561089857600080fd5b505af11580156108ac573d6000803e3d6000fd5b505050505050565b6040517f468721a70000000000000000000000000000000000000000000000000000000081526001600160a01b0383169063468721a79061090090859060009086908290600401610c83565b6020604051808303816000875af115801561091f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109439190610bf4565b6106505780826040517fb2ac21b7000000000000000000000000000000000000000000000000000000008152600401610552929190610cda565b6001600160a01b038116811461099257600080fd5b50565b6000602082840312156109a757600080fd5b81356104398161097d565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156109f1576109f16109b2565b604052919050565b600067ffffffffffffffff821115610a1357610a136109b2565b5060051b60200190565b600080600060608486031215610a3257600080fd5b8335610a3d8161097d565b925060208481013567ffffffffffffffff811115610a5a57600080fd5b8501601f81018713610a6b57600080fd5b8035610a7e610a79826109f9565b6109c8565b81815260059190911b82018301908381019089831115610a9d57600080fd5b928401925b82841015610ac4578335610ab58161097d565b82529284019290840190610aa2565b96999698505050506040949094013593505050565b60008060408385031215610aec57600080fd5b8235610af78161097d565b91506020830135610b078161097d565b809150509250929050565b600060208284031215610b2457600080fd5b5035919050565b600060208284031215610b3d57600080fd5b5051919050565b60006020808385031215610b5757600080fd5b825167ffffffffffffffff811115610b6e57600080fd5b8301601f81018513610b7f57600080fd5b8051610b8d610a79826109f9565b81815260059190911b82018301908381019087831115610bac57600080fd5b928401925b82841015610bd3578351610bc48161097d565b82529284019290840190610bb1565b979650505050505050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215610c0657600080fd5b8151801515811461043957600080fd5b600060018201610c3657634e487b7160e01b600052601160045260246000fd5b5060010190565b6000815180845260005b81811015610c6357602081850181015186830182015201610c47565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b0385168152836020820152608060408201526000610cab6080830185610c3d565b905060028310610ccb57634e487b7160e01b600052602160045260246000fd5b82606083015295945050505050565b604081526000610ced6040830185610c3d565b90506001600160a01b0383166020830152939250505056fea2646970667358221220b181a3bfb0483e1d8a2277fda3f76ed3d2b3be031c8ef621bb1aa26a400019da64736f6c63430008100033000000000000000000000000d343fd9ba453d3ad0f868c24734808fb73f5f52b

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061007d5760003560e01c8063869a43bd1161005b578063869a43bd146100f25780638cff63551461011d578063975057e714610125578063f1cea4901461014c57600080fd5b8063229722bf1461008257806322d2fa9b146100a8578063536d8944146100cf575b600080fd5b610095610090366004610995565b6101a8565b6040519081526020015b60405180910390f35b6100957f91a027369a797f7b79038b0977234c66212c6a4af81bff02b23b740c8fda9ddc81565b6100e26100dd366004610a1d565b6101c2565b604051901515815260200161009f565b610105610100366004610ad9565b610440565b6040516001600160a01b03909116815260200161009f565b610105600181565b6101057f000000000000000000000000d343fd9ba453d3ad0f868c24734808fb73f5f52b81565b61009561015a366004610b12565b604080517f91a027369a797f7b79038b0977234c66212c6a4af81bff02b23b740c8fda9ddc602080830191909152818301939093528151808203830181526060909101909152805191012090565b60006101bc826001600160a01b031661055b565b92915050565b6000806101ce856101a8565b90508083116102255760408051828152602081018590526001600160a01b038716917fe51da2eb75b38e363345b12d877435892683cb116aef64a13efa531f7afe2455910160405180910390a26000915050610439565b61022f858461063d565b60008590506000816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa158015610274573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102989190610b2b565b90506000826001600160a01b031663a0e67e2b6040518163ffffffff1660e01b8152600401600060405180830381865afa1580156102da573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103029190810190610b44565b905060005b87518110156103d857600088828151811061032457610324610bde565b60209081029190910101516040517f2f54bf6e0000000000000000000000000000000000000000000000000000000081526001600160a01b03808316600483015291925090861690632f54bf6e90602401602060405180830381865afa158015610392573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b69190610bf4565b6103c5576103c5858286610654565b50806103d081610c16565b915050610307565b5060005b815181101561042f5760008282815181106103f9576103f9610bde565b6020026020010151905061040d818a610702565b61041c5761041c858286610767565b508061042781610c16565b9150506103dc565b5060019450505050505b9392505050565b600080836001600160a01b031663a0e67e2b6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610481573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104a99190810190610b44565b9050600160005b82518110156105105760008382815181106104cd576104cd610bde565b60200260200101519050856001600160a01b0316816001600160a01b0316036104fc57829450505050506101bc565b91508061050881610c16565b9150506104b0565b506040517f24d1fcf50000000000000000000000000000000000000000000000000000000081526001600160a01b038086166004830152861660248201526044015b60405180910390fd5b60007f000000000000000000000000d343fd9ba453d3ad0f868c24734808fb73f5f52b6001600160a01b0316639507d39a6105de84604080517f91a027369a797f7b79038b0977234c66212c6a4af81bff02b23b740c8fda9ddc602080830191909152818301939093528151808203830181526060909101909152805191012090565b6040518263ffffffff1660e01b81526004016105fc91815260200190565b602060405180830381865afa158015610619573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101bc9190610b2b565b610650826001600160a01b0316826107cd565b5050565b6040516001600160a01b0383166024820152604481018290526106fd9084907f0d582f1300000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526108b4565b505050565b6000805b825181101561075d57836001600160a01b031683828151811061072b5761072b610bde565b60200260200101516001600160a01b03160361074b5760019150506101bc565b8061075581610c16565b915050610706565b5060009392505050565b60006107738484610440565b6040516001600160a01b03808316602483015285166044820152606481018490529091506107c79085907ff8dc5dd90000000000000000000000000000000000000000000000000000000090608401610699565b50505050565b604080517f91a027369a797f7b79038b0977234c66212c6a4af81bff02b23b740c8fda9ddc602080830191909152818301859052825180830384018152606083019384905280519101207f1ab06ee5000000000000000000000000000000000000000000000000000000009092526064810191909152608481018290527f000000000000000000000000d343fd9ba453d3ad0f868c24734808fb73f5f52b6001600160a01b031690631ab06ee59060a401600060405180830381600087803b15801561089857600080fd5b505af11580156108ac573d6000803e3d6000fd5b505050505050565b6040517f468721a70000000000000000000000000000000000000000000000000000000081526001600160a01b0383169063468721a79061090090859060009086908290600401610c83565b6020604051808303816000875af115801561091f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109439190610bf4565b6106505780826040517fb2ac21b7000000000000000000000000000000000000000000000000000000008152600401610552929190610cda565b6001600160a01b038116811461099257600080fd5b50565b6000602082840312156109a757600080fd5b81356104398161097d565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156109f1576109f16109b2565b604052919050565b600067ffffffffffffffff821115610a1357610a136109b2565b5060051b60200190565b600080600060608486031215610a3257600080fd5b8335610a3d8161097d565b925060208481013567ffffffffffffffff811115610a5a57600080fd5b8501601f81018713610a6b57600080fd5b8035610a7e610a79826109f9565b6109c8565b81815260059190911b82018301908381019089831115610a9d57600080fd5b928401925b82841015610ac4578335610ab58161097d565b82529284019290840190610aa2565b96999698505050506040949094013593505050565b60008060408385031215610aec57600080fd5b8235610af78161097d565b91506020830135610b078161097d565b809150509250929050565b600060208284031215610b2457600080fd5b5035919050565b600060208284031215610b3d57600080fd5b5051919050565b60006020808385031215610b5757600080fd5b825167ffffffffffffffff811115610b6e57600080fd5b8301601f81018513610b7f57600080fd5b8051610b8d610a79826109f9565b81815260059190911b82018301908381019087831115610bac57600080fd5b928401925b82841015610bd3578351610bc48161097d565b82529284019290840190610bb1565b979650505050505050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215610c0657600080fd5b8151801515811461043957600080fd5b600060018201610c3657634e487b7160e01b600052601160045260246000fd5b5060010190565b6000815180845260005b81811015610c6357602081850181015186830182015201610c47565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b0385168152836020820152608060408201526000610cab6080830185610c3d565b905060028310610ccb57634e487b7160e01b600052602160045260246000fd5b82606083015295945050505050565b604081526000610ced6040830185610c3d565b90506001600160a01b0383166020830152939250505056fea2646970667358221220b181a3bfb0483e1d8a2277fda3f76ed3d2b3be031c8ef621bb1aa26a400019da64736f6c63430008100033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000d343fd9ba453d3ad0f868c24734808fb73f5f52b

-----Decoded View---------------
Arg [0] : _store (address): 0xd343Fd9ba453D3AD0f868c24734808FB73f5F52B

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000d343fd9ba453d3ad0f868c24734808fb73f5f52b


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

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.