Overview
ETH Balance
ETH Value
$0.00Latest 25 from a total of 29 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Execute | 11371941 | 130 days ago | IN | 0 ETH | 0.00000142 | ||||
| Propose | 11371846 | 130 days ago | IN | 0 ETH | 0.00000164 | ||||
| Execute | 11365170 | 130 days ago | IN | 0 ETH | 0.00000153 | ||||
| Propose | 11365156 | 130 days ago | IN | 0 ETH | 0.0000022 | ||||
| Execute | 11277598 | 131 days ago | IN | 0 ETH | 0.00000214 | ||||
| Propose | 11277570 | 131 days ago | IN | 0 ETH | 0.00000466 | ||||
| Execute | 11203975 | 132 days ago | IN | 0 ETH | 0.00000144 | ||||
| Propose | 11203897 | 132 days ago | IN | 0 ETH | 0.0000016 | ||||
| Execute | 11194799 | 132 days ago | IN | 0 ETH | 0.00000154 | ||||
| Propose | 11194785 | 132 days ago | IN | 0 ETH | 0.00000221 | ||||
| Execute | 11091788 | 133 days ago | IN | 0 ETH | 0.00000245 | ||||
| Propose | 11091767 | 133 days ago | IN | 0 ETH | 0.00000541 | ||||
| Execute | 7760201 | 172 days ago | IN | 0 ETH | 0.00000135 | ||||
| Propose | 7760189 | 172 days ago | IN | 0 ETH | 0.00000135 | ||||
| Execute | 7672691 | 173 days ago | IN | 0 ETH | 0.00000152 | ||||
| Propose | 7672679 | 173 days ago | IN | 0 ETH | 0.00000203 | ||||
| Execute | 7293578 | 177 days ago | IN | 0 ETH | 0.00000135 | ||||
| Propose | 7293567 | 177 days ago | IN | 0 ETH | 0.00000135 | ||||
| Execute | 7137980 | 179 days ago | IN | 0 ETH | 0.00000135 | ||||
| Propose | 7137969 | 179 days ago | IN | 0 ETH | 0.00000136 | ||||
| Execute | 6616320 | 185 days ago | IN | 0 ETH | 0 | ||||
| Propose | 6616304 | 185 days ago | IN | 0 ETH | 0.00000003 | ||||
| Execute | 6524483 | 186 days ago | IN | 0 ETH | 0.00000001 | ||||
| Propose | 6524469 | 186 days ago | IN | 0 ETH | 0.00000005 | ||||
| Execute | 5512950 | 198 days ago | IN | 0 ETH | 0 |
View more zero value Internal Transactions in Advanced View mode
Cross-Chain Transactions
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;
// Transaction states enum
// Ordering is important here - the first (default) value should be
// NotCreated,
// the second Created.
enum State {
NotCreated,
Created,
Executed,
Cancelled
}
// Data structures
struct Proposal {
address[] targets;
bytes[] calldatas;
string description;
}
struct Transaction {
// Calls to be executed in the transaction
Proposal proposal;
// Transaction state
State state;
// Settings nonce that the transaction was created with
uint256 settingsNonce;
// Signing state
address[] signers;
// Expiration timestamp
uint256 expirationTimestamp;
}
// Errors
error NotASigner();
error NotMultisig();
error InvalidProposal();
error InvalidThreshold();
error InvalidExpiration();
error TransactionDoesNotExist();
error InsufficientSignatures();
error TransactionNoLongerValid();
error TransactionAlreadyExists();
error TransactionAlreadySigned();
error TransactionAlreadyExecuted();
error TransactionAlreadyCancelled();
error TransactionExpired();
error SignerAlreadyAdded();
error SignerAlreadyRemoved();
error SignerCannotBeRemoved();
// Events
event SignerAdded(address signer);
event SignerRemoved(address signer);
event ThresholdChanged(uint256 newThreshold);
event ExpirationChanged(uint32 newExpiration);
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;
uint32 public expiration;
// Private storage
EnumerableSet.AddressSet private _signers;
// 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);
_setExpiration(type(uint32).max);
}
// 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);
}
/// @notice Set a new transaction expiration for the multisig
/// @custom:access Restricted to multisig transactions.
function setExpiration(
uint32 newExpiration
) public onlyMultisig {
_setExpiration(newExpiration);
}
// 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 !_expired(proposalId)
// We can use >= since enums are just uint8 with extra steps
&& transactions[proposalId].state >= State.Created;
}
function executed(
uint256 proposalId
) public view returns (bool) {
return transactions[proposalId].state == State.Executed;
}
function cancelled(
uint256 proposalId
) public view returns (bool) {
return transactions[proposalId].state == State.Cancelled;
}
function expirationTimestamp(
uint256 proposalId
) public view returns (uint256) {
return transactions[proposalId].expirationTimestamp;
}
function signatures(
uint256 proposalId
) public view returns (uint256) {
return transactions[proposalId].signers.length;
}
function signed(
uint256 proposalId,
address signer
) public view returns (bool) {
return _hasSigned(proposalId, signer);
}
// Modifiers
modifier onlySigner() {
if (!isSigner(msg.sender)) {
revert NotASigner();
}
_;
}
modifier onlyMultisig() {
if (msg.sender != address(this)) {
revert NotMultisig();
}
_;
}
modifier changesSettings() {
_;
settingsNonce += 1;
}
// Internals
function _propose(
Proposal memory proposal
) internal returns (uint256) {
// Check that the proposal is valid
if (proposal.targets.length != proposal.calldatas.length) {
revert InvalidProposal();
}
// Hash transaction
uint256 proposalId = hashProposal(proposal);
// Expire transaction if needed
if (_expired(proposalId)) {
delete transactions[proposalId];
}
// Retrieve transaction details
Transaction storage transaction = transactions[proposalId];
// Validate transaction state
if (transaction.state >= State.Created) {
revert TransactionAlreadyExists();
}
// Initialize transaction statue
transaction.state = State.Created;
transaction.proposal = proposal;
transaction.settingsNonce = settingsNonce;
transaction.expirationTimestamp = block.timestamp + expiration;
// Emit event
emit TransactionProposed(proposalId, msg.sender);
// Add a signature from the current signer
_sign(proposalId);
return proposalId;
}
function _expired(
Transaction storage transaction
) internal view returns (bool) {
return transaction.expirationTimestamp < block.timestamp;
}
function _expired(
uint256 proposalId
) internal view returns (bool) {
return _expired(transactions[proposalId]);
}
function _validateTransaction(
Transaction storage transaction
) internal view {
if (transaction.state == State.NotCreated) {
revert TransactionDoesNotExist();
}
if (transaction.state == State.Executed) {
revert TransactionAlreadyExecuted();
}
if (transaction.state == State.Cancelled) {
revert TransactionAlreadyCancelled();
}
if (transaction.settingsNonce != settingsNonce) {
revert TransactionNoLongerValid();
}
if (_expired(transaction)) revert TransactionExpired();
}
function _sign(
uint256 proposalId
) internal {
// Retrieve transaction details
Transaction storage transaction = transactions[proposalId];
// Validate transaction state
_validateTransaction(transaction);
if (_hasSigned(proposalId, msg.sender)) {
revert TransactionAlreadySigned();
}
// Update transaction state
transaction.signers.push(msg.sender);
// 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.state = State.Cancelled;
// 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.signers.length < threshold) {
revert InsufficientSignatures();
}
// Update transaction state
transaction.state = State.Executed;
// 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 (!_signers.add(signer)) revert SignerAlreadyAdded();
emit SignerAdded(signer);
}
function _removeSigner(
address signer
) internal changesSettings {
if (signerCount() == 1) revert SignerCannotBeRemoved();
if (!_signers.remove(signer)) revert SignerAlreadyRemoved();
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);
}
function _setExpiration(
uint32 newExpiration
) internal changesSettings {
if (newExpiration == 0) revert InvalidExpiration();
expiration = newExpiration;
emit ExpirationChanged(newExpiration);
}
function _hasSigned(
uint256 proposalId,
address signer
) internal view returns (bool) {
address[] memory signers = transactions[proposalId].signers;
for (uint256 i; i < signers.length;) {
if (signers[i] == signer) return true;
unchecked {
++i;
}
}
return false;
}
}// 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/",
"@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
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"initialSigner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InsufficientSignatures","type":"error"},{"inputs":[],"name":"InvalidExpiration","type":"error"},{"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":"TransactionExpired","type":"error"},{"inputs":[],"name":"TransactionNoLongerValid","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"newExpiration","type":"uint32"}],"name":"ExpirationChanged","type":"event"},{"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":[],"name":"expiration","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"expirationTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uint32","name":"newExpiration","type":"uint32"}],"name":"setExpiration","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":"enum SickleMultisig.State","name":"state","type":"uint8"},{"internalType":"uint256","name":"settingsNonce","type":"uint256"},{"internalType":"uint256","name":"expirationTimestamp","type":"uint256"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b506040516200224138038062002241833981016040819052620000349162000251565b6200003f8162000061565b6200004b6001620000e5565b6200005a63ffffffff62000150565b50620002a5565b6200006e600482620001c1565b6200008c57604051631250b50f60e11b815260040160405180910390fd5b6040516001600160a01b03821681527f47d1c22a25bb3a5d4e481b9b1e6944c2eade3181a0a20b495ed61d35b5323f24906020015b60405180910390a16001806000828254620000dd919062000283565b909155505050565b620000ef620001e1565b811180620000fb575080155b156200011a5760405163aabd5a0960e01b815260040160405180910390fd5b60008190556040518181527f6c4ce60fd690e1216286a10b875c5662555f10774484e58142cedd7a90781baa90602001620000c1565b8063ffffffff166000036200017857604051637d9533a960e11b815260040160405180910390fd5b6003805463ffffffff191663ffffffff83169081179091556040519081527f7e0400d7febb3686ce150707a09984b720a0b467c3583dd2bea9e672a797843190602001620000c1565b6000620001d8836001600160a01b038416620001f4565b90505b92915050565b6000620001ef600462000246565b905090565b60008181526001830160205260408120546200023d57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620001db565b506000620001db565b6000620001db825490565b6000602082840312156200026457600080fd5b81516001600160a01b03811681146200027c57600080fd5b9392505050565b80820180821115620001db57634e487b7160e01b600052601160045260246000fd5b611f8c80620002b56000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80638be10194116100de578063c2ddb7c911610097578063e050be5711610071578063e050be571461038c578063e3d9109f1461039f578063eb12d61e146103b2578063fe0d94c1146103c557600080fd5b8063c2ddb7c914610350578063c7f758a814610359578063d3ecebd71461037957600080fd5b80638be10194146102bc578063960bfe04146102df5780639ace38c2146102f2578063b0ac513814610315578063b8d3594d1461032a578063bdaa45531461033d57600080fd5b80634f558e791161014b57806367dcd62f1161012557806367dcd62f1461026b57806372fdc40e1461027e5780637ca548c6146102a15780637df73e27146102a957600080fd5b80634f558e79146102225780635596f414146102455780635a5b67a61461025857600080fd5b80630e316ab7146101935780632fb1b25f146101a857806340e58ee5146101bb57806342cde4e8146101ce57806345f07de3146101ea5780634665096d146101fd575b600080fd5b6101a66101a13660046117da565b6103d8565b005b6101a66101b63660046117f5565b610404565b6101a66101c93660046117f5565b610433565b6101d760005481565b6040519081526020015b60405180910390f35b6101d76101f83660046119bf565b61045c565b60035461020d9063ffffffff1681565b60405163ffffffff90911681526020016101e1565b6102356102303660046117f5565b61049f565b60405190151581526020016101e1565b6101a66102533660046117f5565b6104e4565b6101d76102663660046119bf565b61051c565b6101d76102793660046117f5565b610552565b6101d761028c3660046117f5565b60009081526002602052604090206006015490565b6101d7610684565b6102356102b73660046117da565b610695565b6101d76102ca3660046117f5565b60009081526002602052604090206005015490565b6101a66102ed3660046117f5565b6106a2565b6103056103003660046117f5565b6106cb565b6040516101e19493929190611c0b565b61031d6108ca565b6040516101e19190611c9d565b6101a6610338366004611cb0565b6108d6565b61023561034b366004611cd6565b6108ff565b6101d760015481565b61036c6103673660046117f5565b61090b565b6040516101e19190611d02565b6102356103873660046117f5565b610b14565b61023561039a3660046117f5565b610b47565b6101a66103ad366004611d15565b610b50565b6101a66103c03660046117da565b610b86565b6101a66103d33660046117f5565b610baf565b3330146103f85760405163f05e412b60e01b815260040160405180910390fd5b61040181610bd5565b50565b61040d33610695565b61042a5760405163da0357f760e01b815260040160405180910390fd5b61040181610c9c565b3330146104535760405163f05e412b60e01b815260040160405180910390fd5b61040181610d44565b6000468260000151836020015184604001516040516020016104819493929190611d3f565b60408051601f19818403018152919052805160209091012092915050565b60006104aa82610da0565b1580156104de57506001600083815260026020526040902060039081015460ff16908111156104db576104db611bf5565b10155b92915050565b6104ed33610695565b61050a5760405163da0357f760e01b815260040160405180910390fd5b61051381610c9c565b61040181610db9565b600061052733610695565b6105445760405163da0357f760e01b815260040160405180910390fd5b6104de82610f37565b919050565b600061055d33610695565b61057a5760405163da0357f760e01b815260040160405180910390fd5b6040805160016060820181815260a0830190935260009282916080830160208036833701905050815260408051600180825281830190925260209092019190816020015b60608152602001906001900390816105be57905050815260200160405180602001604052806000815250815250905030816000015160008151811061060557610605611d89565b6001600160a01b039290921660209283029190910182015260408051602480820187905282518083039091018152604490910190915280820180516001600160e01b03166340e58ee560e01b17905290820151805160009061066957610669611d89565b602002602001018190525061067d81610f37565b9392505050565b600061069060046110eb565b905090565b60006104de6004836110f5565b3330146106c25760405163f05e412b60e01b815260040160405180910390fd5b61040181611117565b60026020908152600091825260409182902082518154608093810282018401909452606081018481529193909284928492909184919084018282801561073a57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161071c575b5050505050815260200160018201805480602002602001604051908101604052809291908181526020016000905b8282101561081457838290600052602060002001805461078790611d9f565b80601f01602080910402602001604051908101604052809291908181526020018280546107b390611d9f565b80156108005780601f106107d557610100808354040283529160200191610800565b820191906000526020600020905b8154815290600101906020018083116107e357829003601f168201915b505050505081526020019060010190610768565b50505050815260200160028201805461082c90611d9f565b80601f016020809104026020016040519081016040528092919081815260200182805461085890611d9f565b80156108a55780601f1061087a576101008083540402835291602001916108a5565b820191906000526020600020905b81548152906001019060200180831161088857829003601f168201915b5050509190925250505060038201546004830154600690930154919260ff9091169184565b60606106906004611193565b3330146108f65760405163f05e412b60e01b815260040160405180910390fd5b610401816111a0565b600061067d838361120f565b61092f60405180606001604052806060815260200160608152602001606081525090565b6000828152600260209081526040918290208251815460809381028201840190945260608101848152909391928492849184018282801561099957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161097b575b5050505050815260200160018201805480602002602001604051908101604052809291908181526020016000905b82821015610a735783829060005260206000200180546109e690611d9f565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1290611d9f565b8015610a5f5780601f10610a3457610100808354040283529160200191610a5f565b820191906000526020600020905b815481529060010190602001808311610a4257829003601f168201915b5050505050815260200190600101906109c7565b505050508152602001600282018054610a8b90611d9f565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab790611d9f565b8015610b045780601f10610ad957610100808354040283529160200191610b04565b820191906000526020600020905b815481529060010190602001808311610ae757829003601f168201915b5050505050815250509050919050565b600060025b600083815260026020526040902060039081015460ff1690811115610b4057610b40611bf5565b1492915050565b60006003610b19565b333014610b705760405163f05e412b60e01b815260040160405180910390fd5b610b79816112d2565b610b8282610bd5565b5050565b333014610ba65760405163f05e412b60e01b815260040160405180910390fd5b610401816112d2565b610bb833610695565b6105135760405163da0357f760e01b815260040160405180910390fd5b610bdd610684565b600103610bfd5760405163fd509a7960e01b815260040160405180910390fd5b610c08600482611333565b610c255760405163188c45f760e01b815260040160405180910390fd5b6040516001600160a01b03821681527f3525e22824a8a7df2c9a6029941c824cf95b6447f1e13d5128fd3826d35afe8b9060200160405180910390a1610c69610684565b6000541115610c8257610c82610c7d610684565b611117565b6001806000828254610c949190611def565b909155505050565b6000818152600260205260409020610cb381611348565b610cbd823361120f565b15610cdb5760405163e54b01d960e01b815260040160405180910390fd5b60058101805460018101825560009182526020918290200180546001600160a01b0319163390811790915560408051858152928301919091527f737f6609fa194738ed162051f994c6e9599a830846ea9d72d6501d79871e098191015b60405180910390a15050565b6000818152600260205260409020610d5b81611348565b6003818101805460ff19169091179055604080518381523360208201527fbeed812a0535c283c6bc8eda32deb53df2603d7c1b518b07e2bec1df38da83939101610d38565b60008181526002602052604081206006015442116104de565b6000818152600260205260409020610dd081611348565b60005460058201541015610df757604051633724e34360e11b815260040160405180910390fd5b60038101805460ff19166002179055805460005b81811015610ef9578254610ef190849083908110610e2b57610e2b611d89565b6000918252602090912001546001850180546001600160a01b039092169184908110610e5957610e59611d89565b906000526020600020018054610e6e90611d9f565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9a90611d9f565b8015610ee75780601f10610ebc57610100808354040283529160200191610ee7565b820191906000526020600020905b815481529060010190602001808311610eca57829003601f168201915b505050505061143c565b600101610e0b565b50604080518481523360208201527fefc13bdcf58f184ea7cae26b499fb33b539e01d0197cea456f3ada289b8cf19b910160405180910390a1505050565b60208101515181515160009114610f6157604051631dc0650160e31b815260040160405180910390fd5b6000610f6c8361045c565b9050610f7781610da0565b15610fe3576000818152600260205260408120908181610f978282611664565b610fa5600183016000611682565b610fb36002830160006116a0565b505060038201805460ff19169055600060048301819055610fd8906005840190611664565b600682016000905550505b6000818152600260205260409020600160038083015460ff169081111561100c5761100c611bf5565b1061102a576040516332c8c71960e11b815260040160405180910390fd5b60038101805460ff1916600117905583518051859183916110529183916020909101906116da565b50602082810151805161106b926001850192019061173f565b50604082015160028201906110809082611e51565b505060015460048301555060035461109e9063ffffffff1642611def565b6006820155604080518381523360208201527f85a02044abc1a0089f390169e926132b38b4ff22cdb91072c2c43c03e8c710d4910160405180910390a16110e482610c9c565b5092915050565b60006104de825490565b6001600160a01b0381166000908152600183016020526040812054151561067d565b61111f610684565b81118061112a575080155b156111485760405163aabd5a0960e01b815260040160405180910390fd5b60008190556040518181527f6c4ce60fd690e1216286a10b875c5662555f10774484e58142cedd7a90781baa906020015b60405180910390a16001806000828254610c949190611def565b6060600061067d836114b1565b8063ffffffff166000036111c757604051637d9533a960e11b815260040160405180910390fd5b6003805463ffffffff191663ffffffff83169081179091556040519081527f7e0400d7febb3686ce150707a09984b720a0b467c3583dd2bea9e672a797843190602001611179565b60008281526002602090815260408083206005018054825181850281018501909352808352849383018282801561126f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611251575b5050505050905060005b81518110156112c757836001600160a01b031682828151811061129e5761129e611d89565b60200260200101516001600160a01b0316036112bf576001925050506104de565b600101611279565b506000949350505050565b6112dd60048261150d565b6112fa57604051631250b50f60e11b815260040160405180910390fd5b6040516001600160a01b03821681527f47d1c22a25bb3a5d4e481b9b1e6944c2eade3181a0a20b495ed61d35b5323f2490602001611179565b600061067d836001600160a01b038416611522565b600060038083015460ff169081111561136357611363611bf5565b03611381576040516315147c4560e21b815260040160405180910390fd5b600260038083015460ff169081111561139c5761139c611bf5565b036113ba5760405163db5e659b60e01b815260040160405180910390fd5b60038181015460ff16818111156113d3576113d3611bf5565b036113f15760405163d11ba1b760e01b815260040160405180910390fd5b60015481600401541461141757604051630389dd1160e31b815260040160405180910390fd5b6006810154421115610401576040516338e5e54b60e21b815260040160405180910390fd5b600080836001600160a01b0316836040516114579190611f11565b6000604051808303816000865af19150503d8060008114611494576040519150601f19603f3d011682016040523d82523d6000602084013e611499565b606091505b5091509150816114ab57805181602001fd5b50505050565b60608160000180548060200260200160405190810160405280929190818152602001828054801561150157602002820191906000526020600020905b8154815260200190600101908083116114ed575b50505050509050919050565b600061067d836001600160a01b038416611615565b6000818152600183016020526040812054801561160b576000611546600183611f2d565b855490915060009061155a90600190611f2d565b90508181146115bf57600086600001828154811061157a5761157a611d89565b906000526020600020015490508087600001848154811061159d5761159d611d89565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806115d0576115d0611f40565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506104de565b60009150506104de565b600081815260018301602052604081205461165c575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556104de565b5060006104de565b50805460008255906000526020600020908101906104019190611791565b508054600082559060005260206000209081019061040191906117a6565b5080546116ac90611d9f565b6000825580601f106116bc575050565b601f0160209004906000526020600020908101906104019190611791565b82805482825590600052602060002090810192821561172f579160200282015b8281111561172f57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906116fa565b5061173b929150611791565b5090565b828054828255906000526020600020908101928215611785579160200282015b8281111561178557825182906117759082611e51565b509160200191906001019061175f565b5061173b9291506117a6565b5b8082111561173b5760008155600101611792565b8082111561173b5760006117ba82826116a0565b506001016117a6565b80356001600160a01b038116811461054d57600080fd5b6000602082840312156117ec57600080fd5b61067d826117c3565b60006020828403121561180757600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff811182821017156118475761184761180e565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156118765761187661180e565b604052919050565b600067ffffffffffffffff8211156118985761189861180e565b5060051b60200190565b600067ffffffffffffffff8311156118bc576118bc61180e565b6118cf601f8401601f191660200161184d565b90508281528383830111156118e357600080fd5b828260208301376000602084830101529392505050565b600082601f83011261190b57600080fd5b8135602061192061191b8361187e565b61184d565b82815260059290921b8401810191818101908684111561193f57600080fd5b8286015b8481101561199457803567ffffffffffffffff8111156119635760008081fd5b8701603f810189136119755760008081fd5b6119868986830135604084016118a2565b845250918301918301611943565b509695505050505050565b600082601f8301126119b057600080fd5b61067d838335602085016118a2565b600060208083850312156119d257600080fd5b823567ffffffffffffffff808211156119ea57600080fd5b90840190606082870312156119fe57600080fd5b611a06611824565b823582811115611a1557600080fd5b8301601f81018813611a2657600080fd5b8035611a3461191b8261187e565b81815260059190911b8201860190868101908a831115611a5357600080fd5b928701925b82841015611a7857611a69846117c3565b82529287019290870190611a58565b84525050508284013582811115611a8e57600080fd5b611a9a888286016118fa565b85830152506040830135935081841115611ab357600080fd5b611abf8785850161199f565b60408201529695505050505050565b60005b83811015611ae9578181015183820152602001611ad1565b50506000910152565b60008151808452611b0a816020860160208601611ace565b601f01601f19169290920160200192915050565b600081518084526020808501808196508360051b8101915082860160005b85811015611b66578284038952611b54848351611af2565b98850198935090840190600101611b3c565b5091979650505050505050565b805160608084528151908401819052600091602091908201906080860190845b81811015611bb85783516001600160a01b031683529284019291840191600101611b93565b505082850151915085810383870152611bd18183611b1e565b9250505060408301518482036040860152611bec8282611af2565b95945050505050565b634e487b7160e01b600052602160045260246000fd5b608081526000611c1e6080830187611b73565b905060048510611c3e57634e487b7160e01b600052602160045260246000fd5b84602083015283604083015282606083015295945050505050565b600081518084526020808501945080840160005b83811015611c925781516001600160a01b031687529582019590820190600101611c6d565b509495945050505050565b60208152600061067d6020830184611c59565b600060208284031215611cc257600080fd5b813563ffffffff8116811461067d57600080fd5b60008060408385031215611ce957600080fd5b82359150611cf9602084016117c3565b90509250929050565b60208152600061067d6020830184611b73565b60008060408385031215611d2857600080fd5b611d31836117c3565b9150611cf9602084016117c3565b848152608060208201526000611d586080830186611c59565b8281036040840152611d6a8186611b1e565b90508281036060840152611d7e8185611af2565b979650505050505050565b634e487b7160e01b600052603260045260246000fd5b600181811c90821680611db357607f821691505b602082108103611dd357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156104de576104de611dd9565b601f821115611e4c57600081815260208120601f850160051c81016020861015611e295750805b601f850160051c820191505b81811015611e4857828155600101611e35565b5050505b505050565b815167ffffffffffffffff811115611e6b57611e6b61180e565b611e7f81611e798454611d9f565b84611e02565b602080601f831160018114611eb45760008415611e9c5750858301515b600019600386901b1c1916600185901b178555611e48565b600085815260208120601f198616915b82811015611ee357888601518255948401946001909101908401611ec4565b5085821015611f015787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008251611f23818460208701611ace565b9190910192915050565b818103818111156104de576104de611dd9565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220851b609cbc645f360dc53815ab18a8f7a92b4eb0db540160053477442faf036064736f6c63430008130033000000000000000000000000bde48624f9e1dd4107df324d1ba3c07004640206
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061018e5760003560e01c80638be10194116100de578063c2ddb7c911610097578063e050be5711610071578063e050be571461038c578063e3d9109f1461039f578063eb12d61e146103b2578063fe0d94c1146103c557600080fd5b8063c2ddb7c914610350578063c7f758a814610359578063d3ecebd71461037957600080fd5b80638be10194146102bc578063960bfe04146102df5780639ace38c2146102f2578063b0ac513814610315578063b8d3594d1461032a578063bdaa45531461033d57600080fd5b80634f558e791161014b57806367dcd62f1161012557806367dcd62f1461026b57806372fdc40e1461027e5780637ca548c6146102a15780637df73e27146102a957600080fd5b80634f558e79146102225780635596f414146102455780635a5b67a61461025857600080fd5b80630e316ab7146101935780632fb1b25f146101a857806340e58ee5146101bb57806342cde4e8146101ce57806345f07de3146101ea5780634665096d146101fd575b600080fd5b6101a66101a13660046117da565b6103d8565b005b6101a66101b63660046117f5565b610404565b6101a66101c93660046117f5565b610433565b6101d760005481565b6040519081526020015b60405180910390f35b6101d76101f83660046119bf565b61045c565b60035461020d9063ffffffff1681565b60405163ffffffff90911681526020016101e1565b6102356102303660046117f5565b61049f565b60405190151581526020016101e1565b6101a66102533660046117f5565b6104e4565b6101d76102663660046119bf565b61051c565b6101d76102793660046117f5565b610552565b6101d761028c3660046117f5565b60009081526002602052604090206006015490565b6101d7610684565b6102356102b73660046117da565b610695565b6101d76102ca3660046117f5565b60009081526002602052604090206005015490565b6101a66102ed3660046117f5565b6106a2565b6103056103003660046117f5565b6106cb565b6040516101e19493929190611c0b565b61031d6108ca565b6040516101e19190611c9d565b6101a6610338366004611cb0565b6108d6565b61023561034b366004611cd6565b6108ff565b6101d760015481565b61036c6103673660046117f5565b61090b565b6040516101e19190611d02565b6102356103873660046117f5565b610b14565b61023561039a3660046117f5565b610b47565b6101a66103ad366004611d15565b610b50565b6101a66103c03660046117da565b610b86565b6101a66103d33660046117f5565b610baf565b3330146103f85760405163f05e412b60e01b815260040160405180910390fd5b61040181610bd5565b50565b61040d33610695565b61042a5760405163da0357f760e01b815260040160405180910390fd5b61040181610c9c565b3330146104535760405163f05e412b60e01b815260040160405180910390fd5b61040181610d44565b6000468260000151836020015184604001516040516020016104819493929190611d3f565b60408051601f19818403018152919052805160209091012092915050565b60006104aa82610da0565b1580156104de57506001600083815260026020526040902060039081015460ff16908111156104db576104db611bf5565b10155b92915050565b6104ed33610695565b61050a5760405163da0357f760e01b815260040160405180910390fd5b61051381610c9c565b61040181610db9565b600061052733610695565b6105445760405163da0357f760e01b815260040160405180910390fd5b6104de82610f37565b919050565b600061055d33610695565b61057a5760405163da0357f760e01b815260040160405180910390fd5b6040805160016060820181815260a0830190935260009282916080830160208036833701905050815260408051600180825281830190925260209092019190816020015b60608152602001906001900390816105be57905050815260200160405180602001604052806000815250815250905030816000015160008151811061060557610605611d89565b6001600160a01b039290921660209283029190910182015260408051602480820187905282518083039091018152604490910190915280820180516001600160e01b03166340e58ee560e01b17905290820151805160009061066957610669611d89565b602002602001018190525061067d81610f37565b9392505050565b600061069060046110eb565b905090565b60006104de6004836110f5565b3330146106c25760405163f05e412b60e01b815260040160405180910390fd5b61040181611117565b60026020908152600091825260409182902082518154608093810282018401909452606081018481529193909284928492909184919084018282801561073a57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161071c575b5050505050815260200160018201805480602002602001604051908101604052809291908181526020016000905b8282101561081457838290600052602060002001805461078790611d9f565b80601f01602080910402602001604051908101604052809291908181526020018280546107b390611d9f565b80156108005780601f106107d557610100808354040283529160200191610800565b820191906000526020600020905b8154815290600101906020018083116107e357829003601f168201915b505050505081526020019060010190610768565b50505050815260200160028201805461082c90611d9f565b80601f016020809104026020016040519081016040528092919081815260200182805461085890611d9f565b80156108a55780601f1061087a576101008083540402835291602001916108a5565b820191906000526020600020905b81548152906001019060200180831161088857829003601f168201915b5050509190925250505060038201546004830154600690930154919260ff9091169184565b60606106906004611193565b3330146108f65760405163f05e412b60e01b815260040160405180910390fd5b610401816111a0565b600061067d838361120f565b61092f60405180606001604052806060815260200160608152602001606081525090565b6000828152600260209081526040918290208251815460809381028201840190945260608101848152909391928492849184018282801561099957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161097b575b5050505050815260200160018201805480602002602001604051908101604052809291908181526020016000905b82821015610a735783829060005260206000200180546109e690611d9f565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1290611d9f565b8015610a5f5780601f10610a3457610100808354040283529160200191610a5f565b820191906000526020600020905b815481529060010190602001808311610a4257829003601f168201915b5050505050815260200190600101906109c7565b505050508152602001600282018054610a8b90611d9f565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab790611d9f565b8015610b045780601f10610ad957610100808354040283529160200191610b04565b820191906000526020600020905b815481529060010190602001808311610ae757829003601f168201915b5050505050815250509050919050565b600060025b600083815260026020526040902060039081015460ff1690811115610b4057610b40611bf5565b1492915050565b60006003610b19565b333014610b705760405163f05e412b60e01b815260040160405180910390fd5b610b79816112d2565b610b8282610bd5565b5050565b333014610ba65760405163f05e412b60e01b815260040160405180910390fd5b610401816112d2565b610bb833610695565b6105135760405163da0357f760e01b815260040160405180910390fd5b610bdd610684565b600103610bfd5760405163fd509a7960e01b815260040160405180910390fd5b610c08600482611333565b610c255760405163188c45f760e01b815260040160405180910390fd5b6040516001600160a01b03821681527f3525e22824a8a7df2c9a6029941c824cf95b6447f1e13d5128fd3826d35afe8b9060200160405180910390a1610c69610684565b6000541115610c8257610c82610c7d610684565b611117565b6001806000828254610c949190611def565b909155505050565b6000818152600260205260409020610cb381611348565b610cbd823361120f565b15610cdb5760405163e54b01d960e01b815260040160405180910390fd5b60058101805460018101825560009182526020918290200180546001600160a01b0319163390811790915560408051858152928301919091527f737f6609fa194738ed162051f994c6e9599a830846ea9d72d6501d79871e098191015b60405180910390a15050565b6000818152600260205260409020610d5b81611348565b6003818101805460ff19169091179055604080518381523360208201527fbeed812a0535c283c6bc8eda32deb53df2603d7c1b518b07e2bec1df38da83939101610d38565b60008181526002602052604081206006015442116104de565b6000818152600260205260409020610dd081611348565b60005460058201541015610df757604051633724e34360e11b815260040160405180910390fd5b60038101805460ff19166002179055805460005b81811015610ef9578254610ef190849083908110610e2b57610e2b611d89565b6000918252602090912001546001850180546001600160a01b039092169184908110610e5957610e59611d89565b906000526020600020018054610e6e90611d9f565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9a90611d9f565b8015610ee75780601f10610ebc57610100808354040283529160200191610ee7565b820191906000526020600020905b815481529060010190602001808311610eca57829003601f168201915b505050505061143c565b600101610e0b565b50604080518481523360208201527fefc13bdcf58f184ea7cae26b499fb33b539e01d0197cea456f3ada289b8cf19b910160405180910390a1505050565b60208101515181515160009114610f6157604051631dc0650160e31b815260040160405180910390fd5b6000610f6c8361045c565b9050610f7781610da0565b15610fe3576000818152600260205260408120908181610f978282611664565b610fa5600183016000611682565b610fb36002830160006116a0565b505060038201805460ff19169055600060048301819055610fd8906005840190611664565b600682016000905550505b6000818152600260205260409020600160038083015460ff169081111561100c5761100c611bf5565b1061102a576040516332c8c71960e11b815260040160405180910390fd5b60038101805460ff1916600117905583518051859183916110529183916020909101906116da565b50602082810151805161106b926001850192019061173f565b50604082015160028201906110809082611e51565b505060015460048301555060035461109e9063ffffffff1642611def565b6006820155604080518381523360208201527f85a02044abc1a0089f390169e926132b38b4ff22cdb91072c2c43c03e8c710d4910160405180910390a16110e482610c9c565b5092915050565b60006104de825490565b6001600160a01b0381166000908152600183016020526040812054151561067d565b61111f610684565b81118061112a575080155b156111485760405163aabd5a0960e01b815260040160405180910390fd5b60008190556040518181527f6c4ce60fd690e1216286a10b875c5662555f10774484e58142cedd7a90781baa906020015b60405180910390a16001806000828254610c949190611def565b6060600061067d836114b1565b8063ffffffff166000036111c757604051637d9533a960e11b815260040160405180910390fd5b6003805463ffffffff191663ffffffff83169081179091556040519081527f7e0400d7febb3686ce150707a09984b720a0b467c3583dd2bea9e672a797843190602001611179565b60008281526002602090815260408083206005018054825181850281018501909352808352849383018282801561126f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611251575b5050505050905060005b81518110156112c757836001600160a01b031682828151811061129e5761129e611d89565b60200260200101516001600160a01b0316036112bf576001925050506104de565b600101611279565b506000949350505050565b6112dd60048261150d565b6112fa57604051631250b50f60e11b815260040160405180910390fd5b6040516001600160a01b03821681527f47d1c22a25bb3a5d4e481b9b1e6944c2eade3181a0a20b495ed61d35b5323f2490602001611179565b600061067d836001600160a01b038416611522565b600060038083015460ff169081111561136357611363611bf5565b03611381576040516315147c4560e21b815260040160405180910390fd5b600260038083015460ff169081111561139c5761139c611bf5565b036113ba5760405163db5e659b60e01b815260040160405180910390fd5b60038181015460ff16818111156113d3576113d3611bf5565b036113f15760405163d11ba1b760e01b815260040160405180910390fd5b60015481600401541461141757604051630389dd1160e31b815260040160405180910390fd5b6006810154421115610401576040516338e5e54b60e21b815260040160405180910390fd5b600080836001600160a01b0316836040516114579190611f11565b6000604051808303816000865af19150503d8060008114611494576040519150601f19603f3d011682016040523d82523d6000602084013e611499565b606091505b5091509150816114ab57805181602001fd5b50505050565b60608160000180548060200260200160405190810160405280929190818152602001828054801561150157602002820191906000526020600020905b8154815260200190600101908083116114ed575b50505050509050919050565b600061067d836001600160a01b038416611615565b6000818152600183016020526040812054801561160b576000611546600183611f2d565b855490915060009061155a90600190611f2d565b90508181146115bf57600086600001828154811061157a5761157a611d89565b906000526020600020015490508087600001848154811061159d5761159d611d89565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806115d0576115d0611f40565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506104de565b60009150506104de565b600081815260018301602052604081205461165c575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556104de565b5060006104de565b50805460008255906000526020600020908101906104019190611791565b508054600082559060005260206000209081019061040191906117a6565b5080546116ac90611d9f565b6000825580601f106116bc575050565b601f0160209004906000526020600020908101906104019190611791565b82805482825590600052602060002090810192821561172f579160200282015b8281111561172f57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906116fa565b5061173b929150611791565b5090565b828054828255906000526020600020908101928215611785579160200282015b8281111561178557825182906117759082611e51565b509160200191906001019061175f565b5061173b9291506117a6565b5b8082111561173b5760008155600101611792565b8082111561173b5760006117ba82826116a0565b506001016117a6565b80356001600160a01b038116811461054d57600080fd5b6000602082840312156117ec57600080fd5b61067d826117c3565b60006020828403121561180757600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff811182821017156118475761184761180e565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156118765761187661180e565b604052919050565b600067ffffffffffffffff8211156118985761189861180e565b5060051b60200190565b600067ffffffffffffffff8311156118bc576118bc61180e565b6118cf601f8401601f191660200161184d565b90508281528383830111156118e357600080fd5b828260208301376000602084830101529392505050565b600082601f83011261190b57600080fd5b8135602061192061191b8361187e565b61184d565b82815260059290921b8401810191818101908684111561193f57600080fd5b8286015b8481101561199457803567ffffffffffffffff8111156119635760008081fd5b8701603f810189136119755760008081fd5b6119868986830135604084016118a2565b845250918301918301611943565b509695505050505050565b600082601f8301126119b057600080fd5b61067d838335602085016118a2565b600060208083850312156119d257600080fd5b823567ffffffffffffffff808211156119ea57600080fd5b90840190606082870312156119fe57600080fd5b611a06611824565b823582811115611a1557600080fd5b8301601f81018813611a2657600080fd5b8035611a3461191b8261187e565b81815260059190911b8201860190868101908a831115611a5357600080fd5b928701925b82841015611a7857611a69846117c3565b82529287019290870190611a58565b84525050508284013582811115611a8e57600080fd5b611a9a888286016118fa565b85830152506040830135935081841115611ab357600080fd5b611abf8785850161199f565b60408201529695505050505050565b60005b83811015611ae9578181015183820152602001611ad1565b50506000910152565b60008151808452611b0a816020860160208601611ace565b601f01601f19169290920160200192915050565b600081518084526020808501808196508360051b8101915082860160005b85811015611b66578284038952611b54848351611af2565b98850198935090840190600101611b3c565b5091979650505050505050565b805160608084528151908401819052600091602091908201906080860190845b81811015611bb85783516001600160a01b031683529284019291840191600101611b93565b505082850151915085810383870152611bd18183611b1e565b9250505060408301518482036040860152611bec8282611af2565b95945050505050565b634e487b7160e01b600052602160045260246000fd5b608081526000611c1e6080830187611b73565b905060048510611c3e57634e487b7160e01b600052602160045260246000fd5b84602083015283604083015282606083015295945050505050565b600081518084526020808501945080840160005b83811015611c925781516001600160a01b031687529582019590820190600101611c6d565b509495945050505050565b60208152600061067d6020830184611c59565b600060208284031215611cc257600080fd5b813563ffffffff8116811461067d57600080fd5b60008060408385031215611ce957600080fd5b82359150611cf9602084016117c3565b90509250929050565b60208152600061067d6020830184611b73565b60008060408385031215611d2857600080fd5b611d31836117c3565b9150611cf9602084016117c3565b848152608060208201526000611d586080830186611c59565b8281036040840152611d6a8186611b1e565b90508281036060840152611d7e8185611af2565b979650505050505050565b634e487b7160e01b600052603260045260246000fd5b600181811c90821680611db357607f821691505b602082108103611dd357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156104de576104de611dd9565b601f821115611e4c57600081815260208120601f850160051c81016020861015611e295750805b601f850160051c820191505b81811015611e4857828155600101611e35565b5050505b505050565b815167ffffffffffffffff811115611e6b57611e6b61180e565b611e7f81611e798454611d9f565b84611e02565b602080601f831160018114611eb45760008415611e9c5750858301515b600019600386901b1c1916600185901b178555611e48565b600085815260208120601f198616915b82811015611ee357888601518255948401946001909101908401611ec4565b5085821015611f015787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008251611f23818460208701611ace565b9190910192915050565b818103818111156104de576104de611dd9565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220851b609cbc645f360dc53815ab18a8f7a92b4eb0db540160053477442faf036064736f6c63430008130033
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
Net Worth in USD
Net Worth in ETH
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.