Overview
S Balance
0 S
S Value
-More Info
Private Name Tags
ContractCreator
Latest 8 from a total of 8 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Execute | 2444909 | 3 days ago | IN | 0 S | 0.00014542 | ||||
Propose | 2444898 | 3 days ago | IN | 0 S | 0.00056832 | ||||
Execute | 2243286 | 5 days ago | IN | 0 S | 0.00014542 | ||||
Propose | 2243275 | 5 days ago | IN | 0 S | 0.00056832 | ||||
Execute | 1659672 | 12 days ago | IN | 0 S | 0.00014542 | ||||
Propose | 1659657 | 12 days ago | IN | 0 S | 0.00056832 | ||||
Execute | 1646492 | 12 days ago | IN | 0 S | 0.00188693 | ||||
Propose | 1646482 | 12 days ago | IN | 0 S | 0.00757325 |
Loading...
Loading
Contract Name:
SickleMultisig
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import { EnumerableSet } from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; contract SickleMultisig { using EnumerableSet for EnumerableSet.AddressSet; // Data structures struct Proposal { address[] targets; bytes[] calldatas; string description; } struct Transaction { // Calls to be executed in the transaction Proposal proposal; // Transaction state bool exists; bool executed; bool cancelled; // Settings nonce that the transaction was created with uint256 settingsNonce; // Signing state uint256 signatures; mapping(address => bool) signed; } // Errors error NotASigner(); error NotMultisig(); error InvalidProposal(); error InvalidThreshold(); error TransactionDoesNotExist(); error TransactionNotReadyToExecute(); error TransactionNoLongerValid(); error TransactionAlreadyExists(); error TransactionAlreadySigned(); error TransactionAlreadyExecuted(); error TransactionAlreadyCancelled(); error SignerAlreadyAdded(); error SignerAlreadyRemoved(); error SignerCannotBeRemoved(); // Events event SignerAdded(address signer); event SignerRemoved(address signer); event ThresholdChanged(uint256 newThreshold); event TransactionProposed(uint256 proposalId, address signer); event TransactionSigned(uint256 proposalId, address signer); event TransactionExecuted(uint256 proposalId, address signer); event TransactionCancelled(uint256 proposalId, address signer); // Public storage uint256 public threshold; uint256 public settingsNonce; mapping(uint256 => Transaction) public transactions; // Initialization constructor(address initialSigner) { // Initialize with only a single signer and a threshold of 1. The signer // can add more signers and update the threshold using a proposal. _addSigner(initialSigner); _setThreshold(1); } // Signer-only actions /// @notice Propose a new transaction to be executed from the multisig /// @custom:access Restricted to multisig signers. function propose(Proposal memory proposal) public onlySigner returns (uint256) { return _propose(proposal); } /// @notice Propose a cancellation for a transaction /// @custom:access Restricted to multisig signers. function proposeCancellation( uint256 proposalId ) public onlySigner returns (uint256) { Proposal memory proposal = Proposal({ targets: new address[](1), calldatas: new bytes[](1), description: "" }); proposal.targets[0] = address(this); proposal.calldatas[0] = abi.encodeCall(this.cancel, (proposalId)); return _propose(proposal); } /// @notice Sign a transaction /// @custom:access Restricted to multisig signers. function sign(uint256 proposalId) public onlySigner { _sign(proposalId); } /// @notice Execute a transaction that has passed the signatures threshold /// @custom:access Restricted to multisig signers. function execute(uint256 proposalId) public onlySigner { _execute(proposalId); } /// @notice Sign a transaction and immediately execute it /// @dev Assumes only one signature is missing from the signing threshold. /// @custom:access Restricted to multisig signers. function signAndExecute(uint256 proposalId) public onlySigner { _sign(proposalId); _execute(proposalId); } // Multisig-only actions /// @notice Cancel a transaction that hasn't been executed or invalidated /// @custom:access Restricted to multisig transactions. function cancel( uint256 proposalId ) public onlyMultisig { _cancel(proposalId); } /// @notice Add a signer to the multisig /// @custom:access Restricted to multisig transactions. function addSigner(address signer) public onlyMultisig { _addSigner(signer); } /// @notice Remove a signer from the multisig /// @custom:access Restricted to multisig transactions. function removeSigner(address signer) public onlyMultisig { _removeSigner(signer); } /// @notice Remove a signer from the multisig /// @custom:access Restricted to multisig transactions. function replaceSigner( address oldSigner, address newSigner ) public onlyMultisig { _addSigner(newSigner); _removeSigner(oldSigner); } /// @notice Set a new signatures threshold for the multisig /// @custom:access Restricted to multisig transactions. function setThreshold(uint256 newThreshold) public onlyMultisig { _setThreshold(newThreshold); } // Public functions function signerCount() public view returns (uint256) { return _signers.length(); } function signerAddresses() public view returns (address[] memory) { return _signers.values(); } function isSigner(address signer) public view returns (bool) { return _signers.contains(signer); } function hashProposal(Proposal memory proposal) public view returns (uint256) { return uint256( keccak256( abi.encode( block.chainid, proposal.targets, proposal.calldatas, proposal.description ) ) ); } function getProposal(uint256 proposalId) public view returns (Proposal memory) { return transactions[proposalId].proposal; } function exists(uint256 proposalId) public view returns (bool) { return transactions[proposalId].exists; } function executed(uint256 proposalId) public view returns (bool) { return transactions[proposalId].executed; } function cancelled(uint256 proposalId) public view returns (bool) { return transactions[proposalId].cancelled; } function signatures(uint256 proposalId) public view returns (uint256) { return transactions[proposalId].signatures; } function signed( uint256 proposalId, address signer ) public view returns (bool) { return transactions[proposalId].signed[signer]; } // Modifiers modifier onlySigner() { if (!isSigner(msg.sender)) { revert NotASigner(); } _; } modifier onlyMultisig() { if (msg.sender != address(this)) { revert NotMultisig(); } _; } modifier changesSettings() { _; settingsNonce += 1; } // Internals EnumerableSet.AddressSet private _signers; function _propose(Proposal memory proposal) internal returns (uint256) { // Check that the proposal is valid if (proposal.targets.length != proposal.calldatas.length) { revert InvalidProposal(); } // Retrieve transaction details uint256 proposalId = hashProposal(proposal); Transaction storage transaction = transactions[proposalId]; // Validate transaction state if (transaction.exists) revert TransactionAlreadyExists(); // Initialize transaction statue transaction.exists = true; transaction.proposal = proposal; transaction.settingsNonce = settingsNonce; // Emit event emit TransactionProposed(proposalId, msg.sender); // Add a signature from the current signer _sign(proposalId); return proposalId; } function _validateTransaction(Transaction storage transaction) internal view { if (!transaction.exists) revert TransactionDoesNotExist(); if (transaction.executed) revert TransactionAlreadyExecuted(); if (transaction.cancelled) revert TransactionAlreadyCancelled(); if (transaction.settingsNonce != settingsNonce) { revert TransactionNoLongerValid(); } } function _sign(uint256 proposalId) internal { // Retrieve transaction details Transaction storage transaction = transactions[proposalId]; // Validate transaction state _validateTransaction(transaction); if (transaction.signed[msg.sender]) revert TransactionAlreadySigned(); // Update transaction state transaction.signatures += 1; transaction.signed[msg.sender] = true; // Emit event emit TransactionSigned(proposalId, msg.sender); } function _cancel(uint256 proposalId) internal { // Retrieve transaction details Transaction storage transaction = transactions[proposalId]; // Validate transaction state _validateTransaction(transaction); // Update transaction state transaction.cancelled = true; // Emit event emit TransactionCancelled(proposalId, msg.sender); } function _execute(uint256 proposalId) internal { // Retrieve transaction details Transaction storage transaction = transactions[proposalId]; // Validate transaction state _validateTransaction(transaction); // Check if the transaction has enough signatures if (transaction.signatures < threshold) { revert TransactionNotReadyToExecute(); } // Update transaction state transaction.executed = true; // Execute calls uint256 length = transaction.proposal.targets.length; for (uint256 i; i < length;) { _call( transaction.proposal.targets[i], transaction.proposal.calldatas[i] ); unchecked { ++i; } } // And finally emit event emit TransactionExecuted(proposalId, msg.sender); } function _call(address target, bytes memory data) internal { (bool success, bytes memory result) = target.call(data); if (!success) { assembly { revert(add(32, result), mload(result)) } } } function _addSigner(address signer) internal changesSettings { if (isSigner(signer)) revert SignerAlreadyAdded(); _signers.add(signer); emit SignerAdded(signer); } function _removeSigner(address signer) internal changesSettings { if (!isSigner(signer)) revert SignerAlreadyRemoved(); if (signerCount() == 1) revert SignerCannotBeRemoved(); _signers.remove(signer); emit SignerRemoved(signer); if (threshold > signerCount()) { _setThreshold(signerCount()); } } function _setThreshold(uint256 newThreshold) internal changesSettings { if (newThreshold > signerCount() || newThreshold == 0) { revert InvalidThreshold(); } threshold = newThreshold; emit ThresholdChanged(newThreshold); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } }
{ "remappings": [ "solmate/=lib/solmate/src/", "@openzeppelin/=lib/openzeppelin-contracts/", "@uniswap/v3-periphery/=lib/v3-periphery/", "@uniswap/v3-core/=lib/v3-core/", "@morpho-blue/=lib/morpho-blue/src/", "ds-test/=lib/solmate/lib/ds-test/src/", "forge-std/=lib/forge-std/src/", "morpho-blue/=lib/morpho-blue/", "openzeppelin-contracts/=lib/openzeppelin-contracts/" ], "optimizer": { "enabled": true, "runs": 200 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "paris", "viaIR": false, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"initialSigner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InvalidProposal","type":"error"},{"inputs":[],"name":"InvalidThreshold","type":"error"},{"inputs":[],"name":"NotASigner","type":"error"},{"inputs":[],"name":"NotMultisig","type":"error"},{"inputs":[],"name":"SignerAlreadyAdded","type":"error"},{"inputs":[],"name":"SignerAlreadyRemoved","type":"error"},{"inputs":[],"name":"SignerCannotBeRemoved","type":"error"},{"inputs":[],"name":"TransactionAlreadyCancelled","type":"error"},{"inputs":[],"name":"TransactionAlreadyExecuted","type":"error"},{"inputs":[],"name":"TransactionAlreadyExists","type":"error"},{"inputs":[],"name":"TransactionAlreadySigned","type":"error"},{"inputs":[],"name":"TransactionDoesNotExist","type":"error"},{"inputs":[],"name":"TransactionNoLongerValid","type":"error"},{"inputs":[],"name":"TransactionNotReadyToExecute","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"signer","type":"address"}],"name":"SignerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"signer","type":"address"}],"name":"SignerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"ThresholdChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"signer","type":"address"}],"name":"TransactionCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"signer","type":"address"}],"name":"TransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"signer","type":"address"}],"name":"TransactionProposed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"signer","type":"address"}],"name":"TransactionSigned","type":"event"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"addSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"cancel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"cancelled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"executed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"getProposal","outputs":[{"components":[{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"internalType":"string","name":"description","type":"string"}],"internalType":"struct SickleMultisig.Proposal","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"internalType":"string","name":"description","type":"string"}],"internalType":"struct SickleMultisig.Proposal","name":"proposal","type":"tuple"}],"name":"hashProposal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"isSigner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"internalType":"string","name":"description","type":"string"}],"internalType":"struct SickleMultisig.Proposal","name":"proposal","type":"tuple"}],"name":"propose","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"proposeCancellation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"removeSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"oldSigner","type":"address"},{"internalType":"address","name":"newSigner","type":"address"}],"name":"replaceSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"setThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"settingsNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"sign","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"signAndExecute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"signatures","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"address","name":"signer","type":"address"}],"name":"signed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"signerAddresses","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"signerCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"threshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"transactions","outputs":[{"components":[{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"internalType":"string","name":"description","type":"string"}],"internalType":"struct SickleMultisig.Proposal","name":"proposal","type":"tuple"},{"internalType":"bool","name":"exists","type":"bool"},{"internalType":"bool","name":"executed","type":"bool"},{"internalType":"bool","name":"cancelled","type":"bool"},{"internalType":"uint256","name":"settingsNonce","type":"uint256"},{"internalType":"uint256","name":"signatures","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162001eb338038062001eb3833981016040819052620000349162000214565b6200003f8162000052565b6200004b6001620000e3565b5062000261565b6200005d816200014e565b156200007c57604051631250b50f60e11b815260040160405180910390fd5b6200008960038262000163565b506040516001600160a01b03821681527f47d1c22a25bb3a5d4e481b9b1e6944c2eade3181a0a20b495ed61d35b5323f24906020015b60405180910390a16001806000828254620000db91906200023f565b909155505050565b620000ed62000181565b811180620000f9575080155b15620001185760405163aabd5a0960e01b815260040160405180910390fd5b60008190556040518181527f6c4ce60fd690e1216286a10b875c5662555f10774484e58142cedd7a90781baa90602001620000bf565b60006200015d60038362000194565b92915050565b60006200017a836001600160a01b038416620001b7565b9392505050565b60006200018f600362000209565b905090565b6001600160a01b038116600090815260018301602052604081205415156200017a565b600081815260018301602052604081205462000200575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200015d565b5060006200015d565b60006200015d825490565b6000602082840312156200022757600080fd5b81516001600160a01b03811681146200017a57600080fd5b808201808211156200015d57634e487b7160e01b600052601160045260246000fd5b611c4280620002716000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80638be10194116100c3578063c7f758a81161007c578063c7f758a8146102d2578063d3ecebd7146102f2578063e050be571461031d578063e3d9109f14610349578063eb12d61e1461035c578063fe0d94c11461036f57600080fd5b80638be1019414610246578063960bfe04146102695780639ace38c21461027c578063b0ac5138146102a1578063bdaa4553146102b6578063c2ddb7c9146102c957600080fd5b80634f558e79116101155780634f558e79146101bc5780635596f414146101f25780635a5b67a61461020557806367dcd62f146102185780637ca548c61461022b5780637df73e271461023357600080fd5b80630e316ab7146101525780632fb1b25f1461016757806340e58ee51461017a57806342cde4e81461018d57806345f07de3146101a9575b600080fd5b6101656101603660046114de565b610382565b005b6101656101753660046114f9565b6103ae565b6101656101883660046114f9565b6103dd565b61019660005481565b6040519081526020015b60405180910390f35b6101966101b73660046116c3565b610406565b6101e26101ca3660046114f9565b60009081526002602052604090206003015460ff1690565b60405190151581526020016101a0565b6101656102003660046114f9565b610449565b6101966102133660046116c3565b610481565b6101966102263660046114f9565b6104ba565b6101966105ec565b6101e26102413660046114de565b6105fd565b6101966102543660046114f9565b60009081526002602052604090206005015490565b6101656102773660046114f9565b61060a565b61028f61028a3660046114f9565b610633565b6040516101a0969594939291906118f9565b6102a9610845565b6040516101a09190611979565b6101e26102c436600461198c565b610851565b61019660015481565b6102e56102e03660046114f9565b610881565b6040516101a091906119b8565b6101e26103003660046114f9565b600090815260026020526040902060030154610100900460ff1690565b6101e261032b3660046114f9565b60009081526002602052604090206003015462010000900460ff1690565b6101656103573660046119cb565b610a8a565b61016561036a3660046114de565b610ac0565b61016561037d3660046114f9565b610ae9565b3330146103a25760405163f05e412b60e01b815260040160405180910390fd5b6103ab81610b0f565b50565b6103b7336105fd565b6103d45760405163da0357f760e01b815260040160405180910390fd5b6103ab81610be0565b3330146103fd5760405163f05e412b60e01b815260040160405180910390fd5b6103ab81610caf565b60004682600001518360200151846040015160405160200161042b94939291906119f5565b60408051601f19818403018152919052805160209091012092915050565b610452336105fd565b61046f5760405163da0357f760e01b815260040160405180910390fd5b61047881610be0565b6103ab81610d0e565b600061048c336105fd565b6104a95760405163da0357f760e01b815260040160405180910390fd5b6104b282610e8e565b90505b919050565b60006104c5336105fd565b6104e25760405163da0357f760e01b815260040160405180910390fd5b6040805160016060820181815260a0830190935260009282916080830160208036833701905050815260408051600180825281830190925260209092019190816020015b606081526020019060019003908161052657905050815260200160405180602001604052806000815250815250905030816000015160008151811061056d5761056d611a3f565b6001600160a01b039290921660209283029190910182015260408051602480820187905282518083039091018152604490910190915280820180516001600160e01b03166340e58ee560e01b1790529082015180516000906105d1576105d1611a3f565b60200260200101819052506105e581610e8e565b9392505050565b60006105f86003610fa4565b905090565b60006104b2600383610fae565b33301461062a5760405163f05e412b60e01b815260040160405180910390fd5b6103ab81610fd0565b6002602090815260009182526040918290208251815460809381028201840190945260608101848152919390928492849290918491908401828280156106a257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610684575b5050505050815260200160018201805480602002602001604051908101604052809291908181526020016000905b8282101561077c5783829060005260206000200180546106ef90611a55565b80601f016020809104026020016040519081016040528092919081815260200182805461071b90611a55565b80156107685780601f1061073d57610100808354040283529160200191610768565b820191906000526020600020905b81548152906001019060200180831161074b57829003601f168201915b5050505050815260200190600101906106d0565b50505050815260200160028201805461079490611a55565b80601f01602080910402602001604051908101604052809291908181526020018280546107c090611a55565b801561080d5780601f106107e25761010080835404028352916020019161080d565b820191906000526020600020905b8154815290600101906020018083116107f057829003601f168201915b5050509190925250505060038201546004830154600590930154919260ff808316936101008404821693620100009004909116919086565b60606105f8600361104c565b60008281526002602090815260408083206001600160a01b038516845260060190915290205460ff165b92915050565b6108a560405180606001604052806060815260200160608152602001606081525090565b6000828152600260209081526040918290208251815460809381028201840190945260608101848152909391928492849184018282801561090f57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116108f1575b5050505050815260200160018201805480602002602001604051908101604052809291908181526020016000905b828210156109e957838290600052602060002001805461095c90611a55565b80601f016020809104026020016040519081016040528092919081815260200182805461098890611a55565b80156109d55780601f106109aa576101008083540402835291602001916109d5565b820191906000526020600020905b8154815290600101906020018083116109b857829003601f168201915b50505050508152602001906001019061093d565b505050508152602001600282018054610a0190611a55565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2d90611a55565b8015610a7a5780601f10610a4f57610100808354040283529160200191610a7a565b820191906000526020600020905b815481529060010190602001808311610a5d57829003601f168201915b5050505050815250509050919050565b333014610aaa5760405163f05e412b60e01b815260040160405180910390fd5b610ab381611059565b610abc82610b0f565b5050565b333014610ae05760405163f05e412b60e01b815260040160405180910390fd5b6103ab81611059565b610af2336105fd565b6104785760405163da0357f760e01b815260040160405180910390fd5b610b18816105fd565b610b355760405163188c45f760e01b815260040160405180910390fd5b610b3d6105ec565b600103610b5d5760405163fd509a7960e01b815260040160405180910390fd5b610b686003826110c5565b506040516001600160a01b03821681527f3525e22824a8a7df2c9a6029941c824cf95b6447f1e13d5128fd3826d35afe8b9060200160405180910390a1610bad6105ec565b6000541115610bc657610bc6610bc16105ec565b610fd0565b6001806000828254610bd89190611aa5565b909155505050565b6000818152600260205260409020610bf7816110da565b33600090815260068201602052604090205460ff1615610c2a5760405163e54b01d960e01b815260040160405180910390fd5b6001816005016000828254610c3f9190611aa5565b909155505033600081815260068301602052604090819020805460ff19166001179055517f737f6609fa194738ed162051f994c6e9599a830846ea9d72d6501d79871e098191610ca3918591909182526001600160a01b0316602082015260400190565b60405180910390a15050565b6000818152600260205260409020610cc6816110da565b60038101805462ff0000191662010000179055604080518381523360208201527fbeed812a0535c283c6bc8eda32deb53df2603d7c1b518b07e2bec1df38da83939101610ca3565b6000818152600260205260409020610d25816110da565b60005481600501541015610d4c57604051631a30c2bd60e31b815260040160405180910390fd5b60038101805461ff001916610100179055805460005b81811015610e50578254610e4890849083908110610d8257610d82611a3f565b6000918252602090912001546001850180546001600160a01b039092169184908110610db057610db0611a3f565b906000526020600020018054610dc590611a55565b80601f0160208091040260200160405190810160405280929190818152602001828054610df190611a55565b8015610e3e5780601f10610e1357610100808354040283529160200191610e3e565b820191906000526020600020905b815481529060010190602001808311610e2157829003601f168201915b505050505061117c565b600101610d62565b50604080518481523360208201527fefc13bdcf58f184ea7cae26b499fb33b539e01d0197cea456f3ada289b8cf19b910160405180910390a1505050565b60208101515181515160009114610eb857604051631dc0650160e31b815260040160405180910390fd5b6000610ec383610406565b600081815260026020526040902060038101549192509060ff1615610efb576040516332c8c71960e11b815260040160405180910390fd5b60038101805460ff191660011790558351805185918391610f239183916020909101906113a4565b506020828101518051610f3c9260018501920190611409565b5060408201516002820190610f519082611b07565b5050600154600483015550604080518381523360208201527f85a02044abc1a0089f390169e926132b38b4ff22cdb91072c2c43c03e8c710d4910160405180910390a1610f9d82610be0565b5092915050565b60006104b2825490565b6001600160a01b038116600090815260018301602052604081205415156105e5565b610fd86105ec565b811180610fe3575080155b156110015760405163aabd5a0960e01b815260040160405180910390fd5b60008190556040518181527f6c4ce60fd690e1216286a10b875c5662555f10774484e58142cedd7a90781baa906020015b60405180910390a16001806000828254610bd89190611aa5565b606060006105e5836111f1565b611062816105fd565b1561108057604051631250b50f60e11b815260040160405180910390fd5b61108b60038261124d565b506040516001600160a01b03821681527f47d1c22a25bb3a5d4e481b9b1e6944c2eade3181a0a20b495ed61d35b5323f2490602001611032565b60006105e5836001600160a01b038416611262565b600381015460ff166110ff576040516315147c4560e21b815260040160405180910390fd5b6003810154610100900460ff161561112a5760405163db5e659b60e01b815260040160405180910390fd5b600381015462010000900460ff16156111565760405163d11ba1b760e01b815260040160405180910390fd5b6001548160040154146103ab57604051630389dd1160e31b815260040160405180910390fd5b600080836001600160a01b0316836040516111979190611bc7565b6000604051808303816000865af19150503d80600081146111d4576040519150601f19603f3d011682016040523d82523d6000602084013e6111d9565b606091505b5091509150816111eb57805181602001fd5b50505050565b60608160000180548060200260200160405190810160405280929190818152602001828054801561124157602002820191906000526020600020905b81548152602001906001019080831161122d575b50505050509050919050565b60006105e5836001600160a01b038416611355565b6000818152600183016020526040812054801561134b576000611286600183611be3565b855490915060009061129a90600190611be3565b90508181146112ff5760008660000182815481106112ba576112ba611a3f565b90600052602060002001549050808760000184815481106112dd576112dd611a3f565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061131057611310611bf6565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061087b565b600091505061087b565b600081815260018301602052604081205461139c5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561087b565b50600061087b565b8280548282559060005260206000209081019282156113f9579160200282015b828111156113f957825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906113c4565b5061140592915061145b565b5090565b82805482825590600052602060002090810192821561144f579160200282015b8281111561144f578251829061143f9082611b07565b5091602001919060010190611429565b50611405929150611470565b5b80821115611405576000815560010161145c565b80821115611405576000611484828261148d565b50600101611470565b50805461149990611a55565b6000825580601f106114a9575050565b601f0160209004906000526020600020908101906103ab919061145b565b80356001600160a01b03811681146104b557600080fd5b6000602082840312156114f057600080fd5b6105e5826114c7565b60006020828403121561150b57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff8111828210171561154b5761154b611512565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561157a5761157a611512565b604052919050565b600067ffffffffffffffff82111561159c5761159c611512565b5060051b60200190565b600067ffffffffffffffff8311156115c0576115c0611512565b6115d3601f8401601f1916602001611551565b90508281528383830111156115e757600080fd5b828260208301376000602084830101529392505050565b600082601f83011261160f57600080fd5b8135602061162461161f83611582565b611551565b82815260059290921b8401810191818101908684111561164357600080fd5b8286015b8481101561169857803567ffffffffffffffff8111156116675760008081fd5b8701603f810189136116795760008081fd5b61168a8986830135604084016115a6565b845250918301918301611647565b509695505050505050565b600082601f8301126116b457600080fd5b6105e5838335602085016115a6565b600060208083850312156116d657600080fd5b823567ffffffffffffffff808211156116ee57600080fd5b908401906060828703121561170257600080fd5b61170a611528565b82358281111561171957600080fd5b8301601f8101881361172a57600080fd5b803561173861161f82611582565b81815260059190911b8201860190868101908a83111561175757600080fd5b928701925b8284101561177c5761176d846114c7565b8252928701929087019061175c565b8452505050828401358281111561179257600080fd5b61179e888286016115fe565b858301525060408301359350818411156117b757600080fd5b6117c3878585016116a3565b60408201529695505050505050565b60005b838110156117ed5781810151838201526020016117d5565b50506000910152565b6000815180845261180e8160208601602086016117d2565b601f01601f19169290920160200192915050565b600081518084526020808501808196508360051b8101915082860160005b8581101561186a5782840389526118588483516117f6565b98850198935090840190600101611840565b5091979650505050505050565b805160608084528151908401819052600091602091908201906080860190845b818110156118bc5783516001600160a01b031683529284019291840191600101611897565b5050828501519150858103838701526118d58183611822565b92505050604083015184820360408601526118f082826117f6565b95945050505050565b60c08152600061190c60c0830189611877565b96151560208301525093151560408501529115156060840152608083015260a090910152919050565b600081518084526020808501945080840160005b8381101561196e5781516001600160a01b031687529582019590820190600101611949565b509495945050505050565b6020815260006105e56020830184611935565b6000806040838503121561199f57600080fd5b823591506119af602084016114c7565b90509250929050565b6020815260006105e56020830184611877565b600080604083850312156119de57600080fd5b6119e7836114c7565b91506119af602084016114c7565b848152608060208201526000611a0e6080830186611935565b8281036040840152611a208186611822565b90508281036060840152611a3481856117f6565b979650505050505050565b634e487b7160e01b600052603260045260246000fd5b600181811c90821680611a6957607f821691505b602082108103611a8957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561087b5761087b611a8f565b601f821115611b0257600081815260208120601f850160051c81016020861015611adf5750805b601f850160051c820191505b81811015611afe57828155600101611aeb565b5050505b505050565b815167ffffffffffffffff811115611b2157611b21611512565b611b3581611b2f8454611a55565b84611ab8565b602080601f831160018114611b6a5760008415611b525750858301515b600019600386901b1c1916600185901b178555611afe565b600085815260208120601f198616915b82811015611b9957888601518255948401946001909101908401611b7a565b5085821015611bb75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008251611bd98184602087016117d2565b9190910192915050565b8181038181111561087b5761087b611a8f565b634e487b7160e01b600052603160045260246000fdfea26469706673582212204c481a8fe04c07790fce97ea202894abce5132041c5e3bee7b3e04fa0c83800d64736f6c63430008130033000000000000000000000000bde48624f9e1dd4107df324d1ba3c07004640206
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061014d5760003560e01c80638be10194116100c3578063c7f758a81161007c578063c7f758a8146102d2578063d3ecebd7146102f2578063e050be571461031d578063e3d9109f14610349578063eb12d61e1461035c578063fe0d94c11461036f57600080fd5b80638be1019414610246578063960bfe04146102695780639ace38c21461027c578063b0ac5138146102a1578063bdaa4553146102b6578063c2ddb7c9146102c957600080fd5b80634f558e79116101155780634f558e79146101bc5780635596f414146101f25780635a5b67a61461020557806367dcd62f146102185780637ca548c61461022b5780637df73e271461023357600080fd5b80630e316ab7146101525780632fb1b25f1461016757806340e58ee51461017a57806342cde4e81461018d57806345f07de3146101a9575b600080fd5b6101656101603660046114de565b610382565b005b6101656101753660046114f9565b6103ae565b6101656101883660046114f9565b6103dd565b61019660005481565b6040519081526020015b60405180910390f35b6101966101b73660046116c3565b610406565b6101e26101ca3660046114f9565b60009081526002602052604090206003015460ff1690565b60405190151581526020016101a0565b6101656102003660046114f9565b610449565b6101966102133660046116c3565b610481565b6101966102263660046114f9565b6104ba565b6101966105ec565b6101e26102413660046114de565b6105fd565b6101966102543660046114f9565b60009081526002602052604090206005015490565b6101656102773660046114f9565b61060a565b61028f61028a3660046114f9565b610633565b6040516101a0969594939291906118f9565b6102a9610845565b6040516101a09190611979565b6101e26102c436600461198c565b610851565b61019660015481565b6102e56102e03660046114f9565b610881565b6040516101a091906119b8565b6101e26103003660046114f9565b600090815260026020526040902060030154610100900460ff1690565b6101e261032b3660046114f9565b60009081526002602052604090206003015462010000900460ff1690565b6101656103573660046119cb565b610a8a565b61016561036a3660046114de565b610ac0565b61016561037d3660046114f9565b610ae9565b3330146103a25760405163f05e412b60e01b815260040160405180910390fd5b6103ab81610b0f565b50565b6103b7336105fd565b6103d45760405163da0357f760e01b815260040160405180910390fd5b6103ab81610be0565b3330146103fd5760405163f05e412b60e01b815260040160405180910390fd5b6103ab81610caf565b60004682600001518360200151846040015160405160200161042b94939291906119f5565b60408051601f19818403018152919052805160209091012092915050565b610452336105fd565b61046f5760405163da0357f760e01b815260040160405180910390fd5b61047881610be0565b6103ab81610d0e565b600061048c336105fd565b6104a95760405163da0357f760e01b815260040160405180910390fd5b6104b282610e8e565b90505b919050565b60006104c5336105fd565b6104e25760405163da0357f760e01b815260040160405180910390fd5b6040805160016060820181815260a0830190935260009282916080830160208036833701905050815260408051600180825281830190925260209092019190816020015b606081526020019060019003908161052657905050815260200160405180602001604052806000815250815250905030816000015160008151811061056d5761056d611a3f565b6001600160a01b039290921660209283029190910182015260408051602480820187905282518083039091018152604490910190915280820180516001600160e01b03166340e58ee560e01b1790529082015180516000906105d1576105d1611a3f565b60200260200101819052506105e581610e8e565b9392505050565b60006105f86003610fa4565b905090565b60006104b2600383610fae565b33301461062a5760405163f05e412b60e01b815260040160405180910390fd5b6103ab81610fd0565b6002602090815260009182526040918290208251815460809381028201840190945260608101848152919390928492849290918491908401828280156106a257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610684575b5050505050815260200160018201805480602002602001604051908101604052809291908181526020016000905b8282101561077c5783829060005260206000200180546106ef90611a55565b80601f016020809104026020016040519081016040528092919081815260200182805461071b90611a55565b80156107685780601f1061073d57610100808354040283529160200191610768565b820191906000526020600020905b81548152906001019060200180831161074b57829003601f168201915b5050505050815260200190600101906106d0565b50505050815260200160028201805461079490611a55565b80601f01602080910402602001604051908101604052809291908181526020018280546107c090611a55565b801561080d5780601f106107e25761010080835404028352916020019161080d565b820191906000526020600020905b8154815290600101906020018083116107f057829003601f168201915b5050509190925250505060038201546004830154600590930154919260ff808316936101008404821693620100009004909116919086565b60606105f8600361104c565b60008281526002602090815260408083206001600160a01b038516845260060190915290205460ff165b92915050565b6108a560405180606001604052806060815260200160608152602001606081525090565b6000828152600260209081526040918290208251815460809381028201840190945260608101848152909391928492849184018282801561090f57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116108f1575b5050505050815260200160018201805480602002602001604051908101604052809291908181526020016000905b828210156109e957838290600052602060002001805461095c90611a55565b80601f016020809104026020016040519081016040528092919081815260200182805461098890611a55565b80156109d55780601f106109aa576101008083540402835291602001916109d5565b820191906000526020600020905b8154815290600101906020018083116109b857829003601f168201915b50505050508152602001906001019061093d565b505050508152602001600282018054610a0190611a55565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2d90611a55565b8015610a7a5780601f10610a4f57610100808354040283529160200191610a7a565b820191906000526020600020905b815481529060010190602001808311610a5d57829003601f168201915b5050505050815250509050919050565b333014610aaa5760405163f05e412b60e01b815260040160405180910390fd5b610ab381611059565b610abc82610b0f565b5050565b333014610ae05760405163f05e412b60e01b815260040160405180910390fd5b6103ab81611059565b610af2336105fd565b6104785760405163da0357f760e01b815260040160405180910390fd5b610b18816105fd565b610b355760405163188c45f760e01b815260040160405180910390fd5b610b3d6105ec565b600103610b5d5760405163fd509a7960e01b815260040160405180910390fd5b610b686003826110c5565b506040516001600160a01b03821681527f3525e22824a8a7df2c9a6029941c824cf95b6447f1e13d5128fd3826d35afe8b9060200160405180910390a1610bad6105ec565b6000541115610bc657610bc6610bc16105ec565b610fd0565b6001806000828254610bd89190611aa5565b909155505050565b6000818152600260205260409020610bf7816110da565b33600090815260068201602052604090205460ff1615610c2a5760405163e54b01d960e01b815260040160405180910390fd5b6001816005016000828254610c3f9190611aa5565b909155505033600081815260068301602052604090819020805460ff19166001179055517f737f6609fa194738ed162051f994c6e9599a830846ea9d72d6501d79871e098191610ca3918591909182526001600160a01b0316602082015260400190565b60405180910390a15050565b6000818152600260205260409020610cc6816110da565b60038101805462ff0000191662010000179055604080518381523360208201527fbeed812a0535c283c6bc8eda32deb53df2603d7c1b518b07e2bec1df38da83939101610ca3565b6000818152600260205260409020610d25816110da565b60005481600501541015610d4c57604051631a30c2bd60e31b815260040160405180910390fd5b60038101805461ff001916610100179055805460005b81811015610e50578254610e4890849083908110610d8257610d82611a3f565b6000918252602090912001546001850180546001600160a01b039092169184908110610db057610db0611a3f565b906000526020600020018054610dc590611a55565b80601f0160208091040260200160405190810160405280929190818152602001828054610df190611a55565b8015610e3e5780601f10610e1357610100808354040283529160200191610e3e565b820191906000526020600020905b815481529060010190602001808311610e2157829003601f168201915b505050505061117c565b600101610d62565b50604080518481523360208201527fefc13bdcf58f184ea7cae26b499fb33b539e01d0197cea456f3ada289b8cf19b910160405180910390a1505050565b60208101515181515160009114610eb857604051631dc0650160e31b815260040160405180910390fd5b6000610ec383610406565b600081815260026020526040902060038101549192509060ff1615610efb576040516332c8c71960e11b815260040160405180910390fd5b60038101805460ff191660011790558351805185918391610f239183916020909101906113a4565b506020828101518051610f3c9260018501920190611409565b5060408201516002820190610f519082611b07565b5050600154600483015550604080518381523360208201527f85a02044abc1a0089f390169e926132b38b4ff22cdb91072c2c43c03e8c710d4910160405180910390a1610f9d82610be0565b5092915050565b60006104b2825490565b6001600160a01b038116600090815260018301602052604081205415156105e5565b610fd86105ec565b811180610fe3575080155b156110015760405163aabd5a0960e01b815260040160405180910390fd5b60008190556040518181527f6c4ce60fd690e1216286a10b875c5662555f10774484e58142cedd7a90781baa906020015b60405180910390a16001806000828254610bd89190611aa5565b606060006105e5836111f1565b611062816105fd565b1561108057604051631250b50f60e11b815260040160405180910390fd5b61108b60038261124d565b506040516001600160a01b03821681527f47d1c22a25bb3a5d4e481b9b1e6944c2eade3181a0a20b495ed61d35b5323f2490602001611032565b60006105e5836001600160a01b038416611262565b600381015460ff166110ff576040516315147c4560e21b815260040160405180910390fd5b6003810154610100900460ff161561112a5760405163db5e659b60e01b815260040160405180910390fd5b600381015462010000900460ff16156111565760405163d11ba1b760e01b815260040160405180910390fd5b6001548160040154146103ab57604051630389dd1160e31b815260040160405180910390fd5b600080836001600160a01b0316836040516111979190611bc7565b6000604051808303816000865af19150503d80600081146111d4576040519150601f19603f3d011682016040523d82523d6000602084013e6111d9565b606091505b5091509150816111eb57805181602001fd5b50505050565b60608160000180548060200260200160405190810160405280929190818152602001828054801561124157602002820191906000526020600020905b81548152602001906001019080831161122d575b50505050509050919050565b60006105e5836001600160a01b038416611355565b6000818152600183016020526040812054801561134b576000611286600183611be3565b855490915060009061129a90600190611be3565b90508181146112ff5760008660000182815481106112ba576112ba611a3f565b90600052602060002001549050808760000184815481106112dd576112dd611a3f565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061131057611310611bf6565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061087b565b600091505061087b565b600081815260018301602052604081205461139c5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561087b565b50600061087b565b8280548282559060005260206000209081019282156113f9579160200282015b828111156113f957825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906113c4565b5061140592915061145b565b5090565b82805482825590600052602060002090810192821561144f579160200282015b8281111561144f578251829061143f9082611b07565b5091602001919060010190611429565b50611405929150611470565b5b80821115611405576000815560010161145c565b80821115611405576000611484828261148d565b50600101611470565b50805461149990611a55565b6000825580601f106114a9575050565b601f0160209004906000526020600020908101906103ab919061145b565b80356001600160a01b03811681146104b557600080fd5b6000602082840312156114f057600080fd5b6105e5826114c7565b60006020828403121561150b57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff8111828210171561154b5761154b611512565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561157a5761157a611512565b604052919050565b600067ffffffffffffffff82111561159c5761159c611512565b5060051b60200190565b600067ffffffffffffffff8311156115c0576115c0611512565b6115d3601f8401601f1916602001611551565b90508281528383830111156115e757600080fd5b828260208301376000602084830101529392505050565b600082601f83011261160f57600080fd5b8135602061162461161f83611582565b611551565b82815260059290921b8401810191818101908684111561164357600080fd5b8286015b8481101561169857803567ffffffffffffffff8111156116675760008081fd5b8701603f810189136116795760008081fd5b61168a8986830135604084016115a6565b845250918301918301611647565b509695505050505050565b600082601f8301126116b457600080fd5b6105e5838335602085016115a6565b600060208083850312156116d657600080fd5b823567ffffffffffffffff808211156116ee57600080fd5b908401906060828703121561170257600080fd5b61170a611528565b82358281111561171957600080fd5b8301601f8101881361172a57600080fd5b803561173861161f82611582565b81815260059190911b8201860190868101908a83111561175757600080fd5b928701925b8284101561177c5761176d846114c7565b8252928701929087019061175c565b8452505050828401358281111561179257600080fd5b61179e888286016115fe565b858301525060408301359350818411156117b757600080fd5b6117c3878585016116a3565b60408201529695505050505050565b60005b838110156117ed5781810151838201526020016117d5565b50506000910152565b6000815180845261180e8160208601602086016117d2565b601f01601f19169290920160200192915050565b600081518084526020808501808196508360051b8101915082860160005b8581101561186a5782840389526118588483516117f6565b98850198935090840190600101611840565b5091979650505050505050565b805160608084528151908401819052600091602091908201906080860190845b818110156118bc5783516001600160a01b031683529284019291840191600101611897565b5050828501519150858103838701526118d58183611822565b92505050604083015184820360408601526118f082826117f6565b95945050505050565b60c08152600061190c60c0830189611877565b96151560208301525093151560408501529115156060840152608083015260a090910152919050565b600081518084526020808501945080840160005b8381101561196e5781516001600160a01b031687529582019590820190600101611949565b509495945050505050565b6020815260006105e56020830184611935565b6000806040838503121561199f57600080fd5b823591506119af602084016114c7565b90509250929050565b6020815260006105e56020830184611877565b600080604083850312156119de57600080fd5b6119e7836114c7565b91506119af602084016114c7565b848152608060208201526000611a0e6080830186611935565b8281036040840152611a208186611822565b90508281036060840152611a3481856117f6565b979650505050505050565b634e487b7160e01b600052603260045260246000fd5b600181811c90821680611a6957607f821691505b602082108103611a8957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561087b5761087b611a8f565b601f821115611b0257600081815260208120601f850160051c81016020861015611adf5750805b601f850160051c820191505b81811015611afe57828155600101611aeb565b5050505b505050565b815167ffffffffffffffff811115611b2157611b21611512565b611b3581611b2f8454611a55565b84611ab8565b602080601f831160018114611b6a5760008415611b525750858301515b600019600386901b1c1916600185901b178555611afe565b600085815260208120601f198616915b82811015611b9957888601518255948401946001909101908401611b7a565b5085821015611bb75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008251611bd98184602087016117d2565b9190910192915050565b8181038181111561087b5761087b611a8f565b634e487b7160e01b600052603160045260246000fdfea26469706673582212204c481a8fe04c07790fce97ea202894abce5132041c5e3bee7b3e04fa0c83800d64736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000bde48624f9e1dd4107df324d1ba3c07004640206
-----Decoded View---------------
Arg [0] : initialSigner (address): 0xBDE48624F9E1dd4107df324D1BA3C07004640206
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000bde48624f9e1dd4107df324d1ba3c07004640206
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.