Overview
ETH Balance
0 ETH
Eth Value
$0.00View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
SecurityCouncilMemberSyncAction
Compiler Version
v0.8.16+commit.07a7930e
Optimization Enabled:
Yes with 1500 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// 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)];
}
}{
"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
- No Contract Security Audit Submitted- Submit Audit Here
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"}]Contract Creation Code
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
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.