Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 49,701 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Vote To Bless | 20763542 | 415 days ago | IN | 0 ETH | 0.00127008 | ||||
| Vote To Bless | 20760532 | 415 days ago | IN | 0 ETH | 0.0002124 | ||||
| Vote To Bless | 20760375 | 415 days ago | IN | 0 ETH | 0.00019078 | ||||
| Vote To Bless | 20760116 | 415 days ago | IN | 0 ETH | 0.00020758 | ||||
| Vote To Bless | 20759982 | 416 days ago | IN | 0 ETH | 0.00021082 | ||||
| Vote To Bless | 20759959 | 416 days ago | IN | 0 ETH | 0.000218 | ||||
| Vote To Bless | 20759934 | 416 days ago | IN | 0 ETH | 0.00021043 | ||||
| Vote To Bless | 20759847 | 416 days ago | IN | 0 ETH | 0.0002478 | ||||
| Vote To Bless | 20759842 | 416 days ago | IN | 0 ETH | 0.00023359 | ||||
| Vote To Bless | 20758820 | 416 days ago | IN | 0 ETH | 0.00018064 | ||||
| Vote To Bless | 20758335 | 416 days ago | IN | 0 ETH | 0.00023595 | ||||
| Vote To Bless | 20757576 | 416 days ago | IN | 0 ETH | 0.00023621 | ||||
| Vote To Bless | 20757428 | 416 days ago | IN | 0 ETH | 0.00029371 | ||||
| Vote To Bless | 20757168 | 416 days ago | IN | 0 ETH | 0.00021822 | ||||
| Vote To Bless | 20756442 | 416 days ago | IN | 0 ETH | 0.00021967 | ||||
| Vote To Bless | 20756367 | 416 days ago | IN | 0 ETH | 0.00022888 | ||||
| Vote To Bless | 20756352 | 416 days ago | IN | 0 ETH | 0.00022242 | ||||
| Vote To Bless | 20756345 | 416 days ago | IN | 0 ETH | 0.00022646 | ||||
| Vote To Bless | 20756327 | 416 days ago | IN | 0 ETH | 0.00023374 | ||||
| Vote To Bless | 20756234 | 416 days ago | IN | 0 ETH | 0.00043794 | ||||
| Vote To Bless | 20754845 | 416 days ago | IN | 0 ETH | 0.00019925 | ||||
| Vote To Bless | 20754813 | 416 days ago | IN | 0 ETH | 0.00019348 | ||||
| Vote To Bless | 20754669 | 416 days ago | IN | 0 ETH | 0.00018938 | ||||
| Vote To Bless | 20754668 | 416 days ago | IN | 0 ETH | 0.00018547 | ||||
| Vote To Bless | 20754618 | 416 days ago | IN | 0 ETH | 0.00020542 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ARM
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 26000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.19;
import {TypeAndVersionInterface} from "../interfaces/TypeAndVersionInterface.sol";
import {IARM} from "./interfaces/IARM.sol";
import {OwnerIsCreator} from "./../shared/access/OwnerIsCreator.sol";
contract ARM is IARM, OwnerIsCreator, TypeAndVersionInterface {
// STATIC CONFIG
// solhint-disable-next-line chainlink-solidity/all-caps-constant-storage-variables
string public constant override typeAndVersion = "ARM 1.0.0";
uint256 private constant MAX_NUM_VOTERS = 128;
// DYNAMIC CONFIG
struct Voter {
// This is the address the voter should use to call voteToBless.
address blessVoteAddr;
// This is the address the voter should use to call voteToCurse.
address curseVoteAddr;
// This is the address the voter should use to call unvoteToCurse.
address curseUnvoteAddr;
// The weight of this voter's vote for blessing.
uint8 blessWeight;
// The weight of this voter's vote for cursing.
uint8 curseWeight;
}
struct Config {
Voter[] voters;
// When the total weight of voters that have voted to bless a tagged root reaches
// or exceeds blessWeightThreshold, the tagged root becomes blessed.
uint16 blessWeightThreshold;
// When the total weight of voters that have voted to curse reaches or
// exceeds curseWeightThreshold, the ARM enters the cursed state.
uint16 curseWeightThreshold;
}
struct VersionedConfig {
Config config;
// The version is incremented every time the config changes.
// The initial configuration on the contract will have configVersion == 1.
uint32 configVersion;
// The block number at which the config was last set. Helps the offchain
// code check that the config was set in a stable block or double-check
// that it has the correct config by querying logs at that block number.
uint32 blockNumber;
}
VersionedConfig private s_versionedConfig;
// STATE
struct BlesserRecord {
// The config version at which this BlesserRecord was last set. A blesser
// is considered active iff this configVersion equals
// s_versionedConfig.configVersion.
uint32 configVersion;
uint8 weight;
uint8 index;
}
mapping(address blessVoteAddr => BlesserRecord blesserRecord) private s_blesserRecords;
struct BlessVoteProgress {
// A BlessVoteProgress is considered invalid if weightThresholdMet is false when
// s_versionedConfig.configVersion changes. we don't want old in-progress
// votes to continue when we set a new config!
// The config version at which the bless vote for a tagged root was initiated.
uint32 configVersion;
uint16 accumulatedWeight;
// Care must be taken that the bitmap has as many bits as MAX_NUM_VOTERS.
uint128 voterBitmap;
bool weightThresholdMet;
}
mapping(bytes32 taggedRootHash => BlessVoteProgress blessVoteProgress) private s_blessVoteProgressByTaggedRootHash;
// voteCount and cursesHash can be reset through unvoteToCurse, and ownerUnvoteToCurse, and may be reset through
// setConfig if the curser is not part of the new config.
struct CurserRecord {
bool active;
uint8 weight;
uint32 voteCount;
address curseUnvoteAddr;
bytes32 cursesHash;
}
mapping(address curseVoteAddr => CurserRecord curserRecord) private s_curserRecords;
// Maintains a per-curser set of curseIds. Entries from this mapping are
// never cleared. Once a curseId is used it can never be reused, even after
// an unvoteToCurse or ownerUnvoteToCurse. This is to prevent accidental
// re-votes to curse, e.g. caused by TOCTOU issues.
mapping(address curseVoteAddr => mapping(bytes32 curseId => bool voted)) private s_curseVotes;
struct CurseVoteProgress {
uint16 curseWeightThreshold;
uint16 accumulatedWeight;
// A curse becomes active after:
// - accumulatedWeight becomes greater or equal than curseWeightThreshold; or
// - the owner curses.
// Once a curse is active, only the owner can lift it.
bool curseActive;
}
CurseVoteProgress private s_curseVoteProgress;
// AUXILLARY STRUCTS
struct UnvoteToCurseRecord {
address curseVoteAddr;
bytes32 cursesHash;
bool forceUnvote;
}
// EVENTS, ERRORS
event ConfigSet(uint32 indexed configVersion, Config config);
error InvalidConfig();
event TaggedRootBlessed(uint32 indexed configVersion, IARM.TaggedRoot taggedRoot, uint16 accumulatedWeight);
event TaggedRootBlessVotesReset(uint32 indexed configVersion, IARM.TaggedRoot taggedRoot, bool wasBlessed);
event VotedToBless(uint32 indexed configVersion, address indexed voter, IARM.TaggedRoot taggedRoot, uint8 weight);
event VotedToCurse(
uint32 indexed configVersion,
address indexed voter,
uint8 weight,
uint32 voteCount,
bytes32 curseId,
bytes32 cursesHash,
uint16 accumulatedWeight
);
event ReusedVotesToCurse(
uint32 indexed configVersion,
address indexed voter,
uint8 weight,
uint32 voteCount,
bytes32 cursesHash,
uint16 accumulatedWeight
);
event UnvotedToCurse(
uint32 indexed configVersion,
address indexed voter,
uint8 weight,
uint32 voteCount,
bytes32 cursesHash
);
event SkippedUnvoteToCurse(address indexed voter, bytes32 expectedCursesHash, bytes32 actualCursesHash);
event OwnerCursed(uint256 timestamp);
event Cursed(uint32 indexed configVersion, uint256 timestamp);
// These events make it easier for offchain logic to discover that it performs
// the same actions multiple times.
event AlreadyVotedToBless(uint32 indexed configVersion, address indexed voter, IARM.TaggedRoot taggedRoot);
event AlreadyBlessed(uint32 indexed configVersion, address indexed voter, IARM.TaggedRoot taggedRoot);
event RecoveredFromCurse();
error AlreadyVotedToCurse(address voter, bytes32 curseId);
error InvalidVoter(address voter);
error InvalidCurseState();
error InvalidCursesHash(bytes32 expectedCursesHash, bytes32 actualCursesHash);
error MustRecoverFromCurse();
constructor(Config memory config) {
{
// Ensure that the bitmap is large enough to hold MAX_NUM_VOTERS.
// We do this in the constructor because MAX_NUM_VOTERS is constant.
BlessVoteProgress memory vp;
vp.voterBitmap = ~uint128(0);
assert(vp.voterBitmap >> (MAX_NUM_VOTERS - 1) >= 1);
}
_setConfig(config);
}
function _bitmapGet(uint128 bitmap, uint8 index) internal pure returns (bool) {
assert(index < MAX_NUM_VOTERS);
return bitmap & (uint128(1) << index) != 0;
}
function _bitmapSet(uint128 bitmap, uint8 index) internal pure returns (uint128) {
assert(index < MAX_NUM_VOTERS);
return bitmap | (uint128(1) << index);
}
function _bitmapCount(uint128 bitmap) internal pure returns (uint8 oneBits) {
// https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetKernighan
for (; bitmap != 0; ++oneBits) {
bitmap &= bitmap - 1;
}
}
function _taggedRootHash(IARM.TaggedRoot memory taggedRoot) internal pure returns (bytes32) {
return keccak256(abi.encode(taggedRoot.commitStore, taggedRoot.root));
}
/// @param taggedRoots A tagged root is hashed as `keccak256(abi.encode(taggedRoot.commitStore
/// /* address */, taggedRoot.root /* bytes32 */))`.
function voteToBless(IARM.TaggedRoot[] calldata taggedRoots) external {
// If we have an active curse, something is really wrong. Let's err on the
// side of caution and not accept further blessings during this time of
// uncertainty.
if (isCursed()) revert MustRecoverFromCurse();
uint32 configVersion = s_versionedConfig.configVersion;
BlesserRecord memory blesserRecord = s_blesserRecords[msg.sender];
if (blesserRecord.configVersion != configVersion) revert InvalidVoter(msg.sender);
for (uint256 i = 0; i < taggedRoots.length; ++i) {
IARM.TaggedRoot memory taggedRoot = taggedRoots[i];
bytes32 taggedRootHash = _taggedRootHash(taggedRoot);
BlessVoteProgress memory voteProgress = s_blessVoteProgressByTaggedRootHash[taggedRootHash];
if (voteProgress.weightThresholdMet) {
// We don't revert here because it's unreasonable to expect from the
// voter to know exactly when to stop voting. Most likely when they
// voted they didn't realize the threshold would be reached by the time
// their vote was counted.
// Additionally, there might be other tagged roots for which votes might
// count, and we want to allow that to happen.
emit AlreadyBlessed(configVersion, msg.sender, taggedRoot);
continue;
}
if (voteProgress.configVersion != configVersion) {
// Note that voteProgress.weightThresholdMet must be false at this point
// If votes were received while an older config was in effect,
// invalidate them and start from scratch.
// If votes were never received, set the current config version.
voteProgress = BlessVoteProgress({
configVersion: configVersion,
voterBitmap: 0,
accumulatedWeight: 0,
weightThresholdMet: false
});
}
if (_bitmapGet(voteProgress.voterBitmap, blesserRecord.index)) {
// We don't revert here because there might be other tagged roots for
// which votes might count, and we want to allow that to happen.
emit AlreadyVotedToBless(configVersion, msg.sender, taggedRoot);
continue;
}
voteProgress.voterBitmap = _bitmapSet(voteProgress.voterBitmap, blesserRecord.index);
voteProgress.accumulatedWeight += blesserRecord.weight;
emit VotedToBless(configVersion, msg.sender, taggedRoot, blesserRecord.weight);
if (voteProgress.accumulatedWeight >= s_versionedConfig.config.blessWeightThreshold) {
voteProgress.weightThresholdMet = true;
emit TaggedRootBlessed(configVersion, taggedRoot, voteProgress.accumulatedWeight);
}
s_blessVoteProgressByTaggedRootHash[taggedRootHash] = voteProgress;
}
}
/// @notice Can be called by the owner to remove unintentionally voted or even blessed tagged roots in a recovery
/// scenario. The owner must ensure that there are no in-flight transactions by ARM nodes voting for any of the
/// taggedRoots before calling this function, as such in-flight transactions could lead to the roots becoming
/// re-blessed shortly after the call to this function, contrary to the original intention.
function ownerResetBlessVotes(IARM.TaggedRoot[] calldata taggedRoots) external onlyOwner {
uint32 configVersion = s_versionedConfig.configVersion;
for (uint256 i = 0; i < taggedRoots.length; ++i) {
IARM.TaggedRoot memory taggedRoot = taggedRoots[i];
bytes32 taggedRootHash = _taggedRootHash(taggedRoot);
BlessVoteProgress memory voteProgress = s_blessVoteProgressByTaggedRootHash[taggedRootHash];
delete s_blessVoteProgressByTaggedRootHash[taggedRootHash];
bool wasBlessed = voteProgress.weightThresholdMet;
if (voteProgress.configVersion == configVersion || wasBlessed) {
emit TaggedRootBlessVotesReset(configVersion, taggedRoot, wasBlessed);
}
}
}
/// @notice Can be called by a curser to remove unintentional votes to curse.
/// We expect this to be called very rarely, e.g. in case of a bug in the
/// offchain code causing false voteToCurse calls.
/// @notice Should be called from curser's corresponding curseUnvoteAddr.
function unvoteToCurse(address curseVoteAddr, bytes32 cursesHash) external {
CurserRecord memory curserRecord = s_curserRecords[curseVoteAddr];
// If a curse is active, only the owner is allowed to lift it.
if (isCursed()) revert MustRecoverFromCurse();
if (msg.sender != curserRecord.curseUnvoteAddr) revert InvalidVoter(msg.sender);
if (!curserRecord.active || curserRecord.voteCount == 0) revert InvalidCurseState();
if (curserRecord.cursesHash != cursesHash) revert InvalidCursesHash(curserRecord.cursesHash, cursesHash);
emit UnvotedToCurse(
s_versionedConfig.configVersion,
curseVoteAddr,
curserRecord.weight,
curserRecord.voteCount,
cursesHash
);
curserRecord.voteCount = 0;
curserRecord.cursesHash = 0;
s_curserRecords[curseVoteAddr] = curserRecord;
s_curseVoteProgress.accumulatedWeight -= curserRecord.weight;
}
/// @notice A vote to curse is appropriate during unhealthy blockchain conditions
/// (eg. finality violations).
function voteToCurse(bytes32 curseId) external {
CurserRecord memory curserRecord = s_curserRecords[msg.sender];
if (!curserRecord.active) revert InvalidVoter(msg.sender);
if (s_curseVotes[msg.sender][curseId]) revert AlreadyVotedToCurse(msg.sender, curseId);
s_curseVotes[msg.sender][curseId] = true;
++curserRecord.voteCount;
curserRecord.cursesHash = keccak256(abi.encode(curserRecord.cursesHash, curseId));
s_curserRecords[msg.sender] = curserRecord;
CurseVoteProgress memory curseVoteProgress = s_curseVoteProgress;
if (curserRecord.voteCount == 1) {
curseVoteProgress.accumulatedWeight += curserRecord.weight;
}
// NOTE: We could pack configVersion into CurserRecord that we already load in the beginning of this function to
// avoid the following extra storage read for it, but since voteToCurse is not on the hot path we'd rather keep
// things simple.
uint32 configVersion = s_versionedConfig.configVersion;
emit VotedToCurse(
configVersion,
msg.sender,
curserRecord.weight,
curserRecord.voteCount,
curseId,
curserRecord.cursesHash,
curseVoteProgress.accumulatedWeight
);
if (
!curseVoteProgress.curseActive && curseVoteProgress.accumulatedWeight >= curseVoteProgress.curseWeightThreshold
) {
curseVoteProgress.curseActive = true;
emit Cursed(configVersion, block.timestamp);
}
s_curseVoteProgress = curseVoteProgress;
}
/// @notice Enables the owner to immediately have the system enter the cursed state.
function ownerCurse() external onlyOwner {
emit OwnerCursed(block.timestamp);
if (!s_curseVoteProgress.curseActive) {
s_curseVoteProgress.curseActive = true;
emit Cursed(s_versionedConfig.configVersion, block.timestamp);
}
}
/// @notice Enables the owner to remove curse votes. After the curse votes are removed,
/// this function will check whether the curse is still valid and restore the uncursed state if possible.
/// This function also enables the owner to lift a curse created through ownerCurse.
function ownerUnvoteToCurse(UnvoteToCurseRecord[] calldata unvoteRecords) external onlyOwner {
for (uint256 i = 0; i < unvoteRecords.length; ++i) {
UnvoteToCurseRecord memory unvoteRecord = unvoteRecords[i];
CurserRecord memory curserRecord = s_curserRecords[unvoteRecord.curseVoteAddr];
// Owner can avoid the curses hash check by setting forceUnvote to true, in case
// a malicious curser is flooding the system with votes to curse with the
// intention to disallow the owner to clear their curse.
if (!unvoteRecord.forceUnvote && curserRecord.cursesHash != unvoteRecord.cursesHash) {
emit SkippedUnvoteToCurse(unvoteRecord.curseVoteAddr, curserRecord.cursesHash, unvoteRecord.cursesHash);
continue;
}
if (!curserRecord.active || curserRecord.voteCount == 0) continue;
emit UnvotedToCurse(
s_versionedConfig.configVersion,
unvoteRecord.curseVoteAddr,
curserRecord.weight,
curserRecord.voteCount,
curserRecord.cursesHash
);
curserRecord.voteCount = 0;
curserRecord.cursesHash = 0;
s_curserRecords[unvoteRecord.curseVoteAddr] = curserRecord;
s_curseVoteProgress.accumulatedWeight -= curserRecord.weight;
}
if (
s_curseVoteProgress.curseActive &&
s_curseVoteProgress.accumulatedWeight < s_curseVoteProgress.curseWeightThreshold
) {
s_curseVoteProgress.curseActive = false;
emit RecoveredFromCurse();
// Invalidate all in-progress votes to bless by bumping the config version.
// They might have been based on false information about the source chain
// (e.g. in case of a finality violation).
_setConfig(s_versionedConfig.config);
}
}
/// @notice Will revert in case a curse is active. To avoid accidentally invalidating an in-progress curse vote, it
/// may be advisable to remove voters one-by-one over time, rather than many at once.
/// @dev The gas use of this function varies depending on the number of curse votes that are active. When calling this
/// function, be sure to include a gas cushion to account for curse votes that may occur between your transaction
/// being sent and mined.
function setConfig(Config memory config) external onlyOwner {
_setConfig(config);
}
/// @inheritdoc IARM
function isBlessed(IARM.TaggedRoot calldata taggedRoot) external view override returns (bool) {
return s_blessVoteProgressByTaggedRootHash[_taggedRootHash(taggedRoot)].weightThresholdMet;
}
/// @inheritdoc IARM
function isCursed() public view override returns (bool) {
return s_curseVoteProgress.curseActive;
}
/// @notice Config version might be incremented for many reasons, including
/// recovery from a curse and a regular config change.
function getConfigDetails() external view returns (uint32 version, uint32 blockNumber, Config memory config) {
version = s_versionedConfig.configVersion;
blockNumber = s_versionedConfig.blockNumber;
config = s_versionedConfig.config;
}
/// @return blessVoteAddrs addresses of voters, will be empty if voting took place with an older config version
/// @return accumulatedWeight sum of weights of voters, will be zero if voting took place with an older config version
/// @return blessed will be accurate regardless of when voting took place
/// @dev This is a helper method for offchain code so efficiency is not really a concern.
function getBlessProgress(
IARM.TaggedRoot calldata taggedRoot
) external view returns (address[] memory blessVoteAddrs, uint16 accumulatedWeight, bool blessed) {
bytes32 taggedRootHash = _taggedRootHash(taggedRoot);
BlessVoteProgress memory progress = s_blessVoteProgressByTaggedRootHash[taggedRootHash];
blessed = progress.weightThresholdMet;
if (progress.configVersion == s_versionedConfig.configVersion) {
accumulatedWeight = progress.accumulatedWeight;
uint128 bitmap = progress.voterBitmap;
blessVoteAddrs = new address[](_bitmapCount(bitmap));
Voter[] memory voters = s_versionedConfig.config.voters;
uint256 j = 0;
for (uint256 i = 0; i < voters.length; ++i) {
if (_bitmapGet(bitmap, s_blesserRecords[voters[i].blessVoteAddr].index)) {
blessVoteAddrs[j] = voters[i].blessVoteAddr;
++j;
}
}
}
}
/// @dev This is a helper method for offchain code so efficiency is not really a concern.
function getCurseProgress()
external
view
returns (
address[] memory curseVoteAddrs,
uint32[] memory voteCounts,
bytes32[] memory cursesHashes,
uint16 accumulatedWeight,
bool cursed
)
{
accumulatedWeight = s_curseVoteProgress.accumulatedWeight;
cursed = s_curseVoteProgress.curseActive;
uint256 numCursers;
Voter[] memory voters = s_versionedConfig.config.voters;
for (uint256 i = 0; i < voters.length; ++i) {
CurserRecord memory curserRecord = s_curserRecords[voters[i].curseVoteAddr];
if (curserRecord.voteCount > 0) {
++numCursers;
}
}
curseVoteAddrs = new address[](numCursers);
voteCounts = new uint32[](numCursers);
cursesHashes = new bytes32[](numCursers);
uint256 j = 0;
for (uint256 i = 0; i < voters.length; ++i) {
address curseVoteAddr = voters[i].curseVoteAddr;
CurserRecord memory curserRecord = s_curserRecords[curseVoteAddr];
if (curserRecord.voteCount > 0) {
curseVoteAddrs[j] = curseVoteAddr;
voteCounts[j] = curserRecord.voteCount;
cursesHashes[j] = curserRecord.cursesHash;
++j;
}
}
}
function _validateConfig(Config memory config) internal pure returns (bool) {
if (
config.voters.length == 0 ||
config.voters.length > MAX_NUM_VOTERS ||
config.blessWeightThreshold == 0 ||
config.curseWeightThreshold == 0
) {
return false;
}
uint256 totalBlessWeight = 0;
uint256 totalCurseWeight = 0;
address[] memory allAddrs = new address[](3 * config.voters.length);
for (uint256 i = 0; i < config.voters.length; ++i) {
Voter memory voter = config.voters[i];
if (
voter.blessVoteAddr == address(0) ||
voter.curseVoteAddr == address(0) ||
voter.curseUnvoteAddr == address(0) ||
(voter.blessWeight == 0 && voter.curseWeight == 0)
) {
return false;
}
allAddrs[3 * i + 0] = voter.blessVoteAddr;
allAddrs[3 * i + 1] = voter.curseVoteAddr;
allAddrs[3 * i + 2] = voter.curseUnvoteAddr;
totalBlessWeight += voter.blessWeight;
totalCurseWeight += voter.curseWeight;
}
for (uint256 i = 0; i < allAddrs.length; ++i) {
address allAddrs_i = allAddrs[i];
for (uint256 j = i + 1; j < allAddrs.length; ++j) {
if (allAddrs_i == allAddrs[j]) {
return false;
}
}
}
return totalBlessWeight >= config.blessWeightThreshold && totalCurseWeight >= config.curseWeightThreshold;
}
function _setConfig(Config memory config) private {
if (isCursed()) revert MustRecoverFromCurse();
if (!_validateConfig(config)) revert InvalidConfig();
Config memory oldConfig = s_versionedConfig.config;
// We can't directly assign s_versionedConfig.config to config
// because copying a memory array into storage is not supported.
{
s_versionedConfig.config.blessWeightThreshold = config.blessWeightThreshold;
s_versionedConfig.config.curseWeightThreshold = config.curseWeightThreshold;
while (s_versionedConfig.config.voters.length != 0) {
Voter memory voter = s_versionedConfig.config.voters[s_versionedConfig.config.voters.length - 1];
delete s_blesserRecords[voter.blessVoteAddr];
s_curserRecords[voter.curseVoteAddr].active = false;
s_versionedConfig.config.voters.pop();
}
for (uint256 i = 0; i < config.voters.length; ++i) {
s_versionedConfig.config.voters.push(config.voters[i]);
}
}
++s_versionedConfig.configVersion;
uint32 configVersion = s_versionedConfig.configVersion;
for (uint8 i = 0; i < config.voters.length; ++i) {
Voter memory voter = config.voters[i];
s_blesserRecords[voter.blessVoteAddr] = BlesserRecord({
configVersion: configVersion,
index: i,
weight: voter.blessWeight
});
s_curserRecords[voter.curseVoteAddr] = CurserRecord({
active: true,
weight: voter.curseWeight,
curseUnvoteAddr: voter.curseUnvoteAddr,
voteCount: s_curserRecords[voter.curseVoteAddr].voteCount,
cursesHash: s_curserRecords[voter.curseVoteAddr].cursesHash
});
}
s_versionedConfig.blockNumber = uint32(block.number);
emit ConfigSet(configVersion, config);
CurseVoteProgress memory newCurseVoteProgress = CurseVoteProgress({
curseWeightThreshold: config.curseWeightThreshold,
accumulatedWeight: 0,
curseActive: false
});
// Retain votes for the cursers who are still part of the new config and delete records for the cursers who are not.
for (uint8 i = 0; i < oldConfig.voters.length; ++i) {
// We could be more efficient with this but since this is only for
// setConfig it will do for now.
address curseVoteAddr = oldConfig.voters[i].curseVoteAddr;
CurserRecord memory curserRecord = s_curserRecords[curseVoteAddr];
if (!curserRecord.active) {
delete s_curserRecords[curseVoteAddr];
} else if (curserRecord.active && curserRecord.voteCount > 0) {
newCurseVoteProgress.accumulatedWeight += curserRecord.weight;
emit ReusedVotesToCurse(
configVersion,
curseVoteAddr,
curserRecord.weight,
curserRecord.voteCount,
curserRecord.cursesHash,
newCurseVoteProgress.accumulatedWeight
);
}
}
newCurseVoteProgress.curseActive =
newCurseVoteProgress.accumulatedWeight >= newCurseVoteProgress.curseWeightThreshold;
if (newCurseVoteProgress.curseActive) {
emit Cursed(configVersion, block.timestamp);
}
s_curseVoteProgress = newCurseVoteProgress;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
abstract contract TypeAndVersionInterface {
function typeAndVersion() external pure virtual returns (string memory);
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.0;
/// @notice This interface contains the only ARM-related functions that might be used on-chain by other CCIP contracts.
interface IARM {
/// @notice A Merkle root tagged with the address of the commit store contract it is destined for.
struct TaggedRoot {
address commitStore;
bytes32 root;
}
/// @notice Callers MUST NOT cache the return value as a blessed tagged root could become unblessed.
function isBlessed(TaggedRoot calldata taggedRoot) external view returns (bool);
/// @notice When the ARM is "cursed", CCIP pauses until the curse is lifted.
function isCursed() external view returns (bool);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {ConfirmedOwner} from "../../ConfirmedOwner.sol";
/// @title The OwnerIsCreator contract
/// @notice A contract with helpers for basic contract ownership.
contract OwnerIsCreator is ConfirmedOwner {
constructor() ConfirmedOwner(msg.sender) {}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./ConfirmedOwnerWithProposal.sol";
/**
* @title The ConfirmedOwner contract
* @notice A contract with helpers for basic contract ownership.
*/
contract ConfirmedOwner is ConfirmedOwnerWithProposal {
constructor(address newOwner) ConfirmedOwnerWithProposal(newOwner, address(0)) {}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./interfaces/OwnableInterface.sol";
/**
* @title The ConfirmedOwner contract
* @notice A contract with helpers for basic contract ownership.
*/
contract ConfirmedOwnerWithProposal is OwnableInterface {
address private s_owner;
address private s_pendingOwner;
event OwnershipTransferRequested(address indexed from, address indexed to);
event OwnershipTransferred(address indexed from, address indexed to);
constructor(address newOwner, address pendingOwner) {
require(newOwner != address(0), "Cannot set owner to zero");
s_owner = newOwner;
if (pendingOwner != address(0)) {
_transferOwnership(pendingOwner);
}
}
/**
* @notice Allows an owner to begin transferring ownership to a new address,
* pending.
*/
function transferOwnership(address to) public override onlyOwner {
_transferOwnership(to);
}
/**
* @notice Allows an ownership transfer to be completed by the recipient.
*/
function acceptOwnership() external override {
require(msg.sender == s_pendingOwner, "Must be proposed owner");
address oldOwner = s_owner;
s_owner = msg.sender;
s_pendingOwner = address(0);
emit OwnershipTransferred(oldOwner, msg.sender);
}
/**
* @notice Get the current owner
*/
function owner() public view override returns (address) {
return s_owner;
}
/**
* @notice validate, transfer ownership, and emit relevant events
*/
function _transferOwnership(address to) private {
require(to != msg.sender, "Cannot transfer to self");
s_pendingOwner = to;
emit OwnershipTransferRequested(s_owner, to);
}
/**
* @notice validate access
*/
function _validateOwnership() internal view {
require(msg.sender == s_owner, "Only callable by owner");
}
/**
* @notice Reverts if called by anyone other than the contract owner.
*/
modifier onlyOwner() {
_validateOwnership();
_;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface OwnableInterface {
function owner() external returns (address);
function transferOwnership(address recipient) external;
function acceptOwnership() external;
}{
"remappings": [
"@eth-optimism/=node_modules/@eth-optimism/",
"@openzeppelin/=node_modules/@openzeppelin/",
"ds-test/=foundry-lib/forge-std/lib/ds-test/src/",
"erc4626-tests/=foundry-lib/openzeppelin-contracts/lib/erc4626-tests/",
"forge-std/=foundry-lib/forge-std/src/",
"hardhat/=node_modules/hardhat/",
"openzeppelin-contracts/=foundry-lib/openzeppelin-contracts/contracts/"
],
"optimizer": {
"enabled": true,
"runs": 26000
},
"metadata": {
"bytecodeHash": "none",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "london",
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"components":[{"components":[{"internalType":"address","name":"blessVoteAddr","type":"address"},{"internalType":"address","name":"curseVoteAddr","type":"address"},{"internalType":"address","name":"curseUnvoteAddr","type":"address"},{"internalType":"uint8","name":"blessWeight","type":"uint8"},{"internalType":"uint8","name":"curseWeight","type":"uint8"}],"internalType":"struct ARM.Voter[]","name":"voters","type":"tuple[]"},{"internalType":"uint16","name":"blessWeightThreshold","type":"uint16"},{"internalType":"uint16","name":"curseWeightThreshold","type":"uint16"}],"internalType":"struct ARM.Config","name":"config","type":"tuple"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"voter","type":"address"},{"internalType":"bytes32","name":"curseId","type":"bytes32"}],"name":"AlreadyVotedToCurse","type":"error"},{"inputs":[],"name":"InvalidConfig","type":"error"},{"inputs":[],"name":"InvalidCurseState","type":"error"},{"inputs":[{"internalType":"bytes32","name":"expectedCursesHash","type":"bytes32"},{"internalType":"bytes32","name":"actualCursesHash","type":"bytes32"}],"name":"InvalidCursesHash","type":"error"},{"inputs":[{"internalType":"address","name":"voter","type":"address"}],"name":"InvalidVoter","type":"error"},{"inputs":[],"name":"MustRecoverFromCurse","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint32","name":"configVersion","type":"uint32"},{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"components":[{"internalType":"address","name":"commitStore","type":"address"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"indexed":false,"internalType":"struct IARM.TaggedRoot","name":"taggedRoot","type":"tuple"}],"name":"AlreadyBlessed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint32","name":"configVersion","type":"uint32"},{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"components":[{"internalType":"address","name":"commitStore","type":"address"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"indexed":false,"internalType":"struct IARM.TaggedRoot","name":"taggedRoot","type":"tuple"}],"name":"AlreadyVotedToBless","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint32","name":"configVersion","type":"uint32"},{"components":[{"components":[{"internalType":"address","name":"blessVoteAddr","type":"address"},{"internalType":"address","name":"curseVoteAddr","type":"address"},{"internalType":"address","name":"curseUnvoteAddr","type":"address"},{"internalType":"uint8","name":"blessWeight","type":"uint8"},{"internalType":"uint8","name":"curseWeight","type":"uint8"}],"internalType":"struct ARM.Voter[]","name":"voters","type":"tuple[]"},{"internalType":"uint16","name":"blessWeightThreshold","type":"uint16"},{"internalType":"uint16","name":"curseWeightThreshold","type":"uint16"}],"indexed":false,"internalType":"struct ARM.Config","name":"config","type":"tuple"}],"name":"ConfigSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint32","name":"configVersion","type":"uint32"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Cursed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"OwnerCursed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"RecoveredFromCurse","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint32","name":"configVersion","type":"uint32"},{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint8","name":"weight","type":"uint8"},{"indexed":false,"internalType":"uint32","name":"voteCount","type":"uint32"},{"indexed":false,"internalType":"bytes32","name":"cursesHash","type":"bytes32"},{"indexed":false,"internalType":"uint16","name":"accumulatedWeight","type":"uint16"}],"name":"ReusedVotesToCurse","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"bytes32","name":"expectedCursesHash","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"actualCursesHash","type":"bytes32"}],"name":"SkippedUnvoteToCurse","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint32","name":"configVersion","type":"uint32"},{"components":[{"internalType":"address","name":"commitStore","type":"address"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"indexed":false,"internalType":"struct IARM.TaggedRoot","name":"taggedRoot","type":"tuple"},{"indexed":false,"internalType":"bool","name":"wasBlessed","type":"bool"}],"name":"TaggedRootBlessVotesReset","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint32","name":"configVersion","type":"uint32"},{"components":[{"internalType":"address","name":"commitStore","type":"address"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"indexed":false,"internalType":"struct IARM.TaggedRoot","name":"taggedRoot","type":"tuple"},{"indexed":false,"internalType":"uint16","name":"accumulatedWeight","type":"uint16"}],"name":"TaggedRootBlessed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint32","name":"configVersion","type":"uint32"},{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint8","name":"weight","type":"uint8"},{"indexed":false,"internalType":"uint32","name":"voteCount","type":"uint32"},{"indexed":false,"internalType":"bytes32","name":"cursesHash","type":"bytes32"}],"name":"UnvotedToCurse","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint32","name":"configVersion","type":"uint32"},{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"components":[{"internalType":"address","name":"commitStore","type":"address"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"indexed":false,"internalType":"struct IARM.TaggedRoot","name":"taggedRoot","type":"tuple"},{"indexed":false,"internalType":"uint8","name":"weight","type":"uint8"}],"name":"VotedToBless","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint32","name":"configVersion","type":"uint32"},{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint8","name":"weight","type":"uint8"},{"indexed":false,"internalType":"uint32","name":"voteCount","type":"uint32"},{"indexed":false,"internalType":"bytes32","name":"curseId","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"cursesHash","type":"bytes32"},{"indexed":false,"internalType":"uint16","name":"accumulatedWeight","type":"uint16"}],"name":"VotedToCurse","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"commitStore","type":"address"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"internalType":"struct IARM.TaggedRoot","name":"taggedRoot","type":"tuple"}],"name":"getBlessProgress","outputs":[{"internalType":"address[]","name":"blessVoteAddrs","type":"address[]"},{"internalType":"uint16","name":"accumulatedWeight","type":"uint16"},{"internalType":"bool","name":"blessed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getConfigDetails","outputs":[{"internalType":"uint32","name":"version","type":"uint32"},{"internalType":"uint32","name":"blockNumber","type":"uint32"},{"components":[{"components":[{"internalType":"address","name":"blessVoteAddr","type":"address"},{"internalType":"address","name":"curseVoteAddr","type":"address"},{"internalType":"address","name":"curseUnvoteAddr","type":"address"},{"internalType":"uint8","name":"blessWeight","type":"uint8"},{"internalType":"uint8","name":"curseWeight","type":"uint8"}],"internalType":"struct ARM.Voter[]","name":"voters","type":"tuple[]"},{"internalType":"uint16","name":"blessWeightThreshold","type":"uint16"},{"internalType":"uint16","name":"curseWeightThreshold","type":"uint16"}],"internalType":"struct ARM.Config","name":"config","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurseProgress","outputs":[{"internalType":"address[]","name":"curseVoteAddrs","type":"address[]"},{"internalType":"uint32[]","name":"voteCounts","type":"uint32[]"},{"internalType":"bytes32[]","name":"cursesHashes","type":"bytes32[]"},{"internalType":"uint16","name":"accumulatedWeight","type":"uint16"},{"internalType":"bool","name":"cursed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"commitStore","type":"address"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"internalType":"struct IARM.TaggedRoot","name":"taggedRoot","type":"tuple"}],"name":"isBlessed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isCursed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerCurse","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"commitStore","type":"address"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"internalType":"struct IARM.TaggedRoot[]","name":"taggedRoots","type":"tuple[]"}],"name":"ownerResetBlessVotes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"curseVoteAddr","type":"address"},{"internalType":"bytes32","name":"cursesHash","type":"bytes32"},{"internalType":"bool","name":"forceUnvote","type":"bool"}],"internalType":"struct ARM.UnvoteToCurseRecord[]","name":"unvoteRecords","type":"tuple[]"}],"name":"ownerUnvoteToCurse","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"blessVoteAddr","type":"address"},{"internalType":"address","name":"curseVoteAddr","type":"address"},{"internalType":"address","name":"curseUnvoteAddr","type":"address"},{"internalType":"uint8","name":"blessWeight","type":"uint8"},{"internalType":"uint8","name":"curseWeight","type":"uint8"}],"internalType":"struct ARM.Voter[]","name":"voters","type":"tuple[]"},{"internalType":"uint16","name":"blessWeightThreshold","type":"uint16"},{"internalType":"uint16","name":"curseWeightThreshold","type":"uint16"}],"internalType":"struct ARM.Config","name":"config","type":"tuple"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"typeAndVersion","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"curseVoteAddr","type":"address"},{"internalType":"bytes32","name":"cursesHash","type":"bytes32"}],"name":"unvoteToCurse","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"commitStore","type":"address"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"internalType":"struct IARM.TaggedRoot[]","name":"taggedRoots","type":"tuple[]"}],"name":"voteToBless","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"curseId","type":"bytes32"}],"name":"voteToCurse","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b5060405162004c3f38038062004c3f833981016040819052620000349162000e4e565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be816200013a565b5050604080516080808201835260008083526020830181905260608301526001600160801b03928201929092529150600190620000fd90829062000fdb565b82604001516001600160801b0316901c6001600160801b0316101562000127576200012762000ff7565b506200013381620001e5565b50620011a3565b336001600160a01b03821603620001945760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b620001fa600954640100000000900460ff1690565b1562000219576040516306523e6560e51b815260040160405180910390fd5b620002248162000a1a565b62000242576040516306b7c75960e31b815260040160405180910390fd5b6040805160028054608060208202840181019094526060830181815260009484928491879085015b82821015620002e85760008481526020908190206040805160a0810182526003860290920180546001600160a01b0390811684526001808301548216858701526002909201549081169284019290925260ff600160a01b830481166060850152600160a81b909204909116608083015290835290920191016200026a565b505050908252506001919091015461ffff808216602080850191909152620100009283900482166040948501528601516003805494880151831690930263ffffffff1990941691161791909117905590505b600254156200045a576002805460009190620003599060019062000fdb565b815481106200036c576200036c6200100d565b600091825260208083206040805160a081018252600390940290910180546001600160a01b03908116808652600183015482168686019081526002938401548084168887015260ff600160a01b8204811660608a0152600160a81b90910416608088015290875260058552838720805465ffffffffffff19169055511685526007909252909220805460ff1916905581549092508062000410576200041062001023565b60008281526020902060036000199092019182020180546001600160a01b03199081168255600182018054909116905560020180546001600160b01b03191690559055506200033a565b60005b8251518110156200053c578251805160029190839081106200048357620004836200100d565b602090810291909101810151825460018082018555600094855293839020825160039092020180546001600160a01b03199081166001600160a01b03938416178255938301519481018054909416948216949094179092556040810151600290930180546060830151608090930151949093166001600160a81b031990931692909217600160a01b60ff928316021760ff60a81b1916600160a81b9190931602919091179055620005348162001039565b90506200045d565b5060048054600090620005559063ffffffff1662001055565b82546101009290920a63ffffffff8181021990931691831602179091556004541660005b83515160ff821610156200072357600084600001518260ff1681518110620005a557620005a56200100d565b602090810291909101810151604080516060808201835263ffffffff88811683528185015160ff90811684880190815289821685870190815287516001600160a01b03908116600090815260058b52888120975188549451935190871664ffffffffff1990951694909417640100000000938616939093029290921760ff60281b1916650100000000009385169390930292909217909555855160a08101875260018082526080808a01518516838c019081528a8c01805186168a526007808e528b8b205462010000908190048a16878e019081529d8d015188169a87019a8b52825188168c52818f528c8c20860154948701948552915187168b52909c52989097209151825498519951965161ffff1990991690151561ff0019161761010099909416989098029290921762010000600160d01b03191693909216909602600160301b600160d01b031916919091176601000000000000939091169290920291909117835551910155506200071b816200107b565b905062000579565b506004805463ffffffff4381166401000000000263ffffffff60201b1990921691909117909155604051908216907f7cf8e698b191db138396ab0eae2ad5b3fe353fd014fd5956b034b86f2d605cfd90620007809086906200109d565b60405180910390a2604080516060810182528482015161ffff168152600060208201819052918101829052905b83515160ff821610156200096f57600084600001518260ff1681518110620007d957620007d96200100d565b6020908102919091018101518101516001600160a01b03808216600090815260078452604090819020815160a081018352815460ff808216151580845261010083049091169783019790975263ffffffff6201000082041693820193909352660100000000000090920490921660608201526001909101546080820152909250906200088f576001600160a01b038216600090815260076020526040812080546001600160d01b03191681556001015562000959565b80518015620008a857506000816040015163ffffffff16115b156200095957806020015160ff1684602001818151620008c991906200114e565b61ffff1690525060208082015160408084015160808501519388015191516001600160a01b0387169463ffffffff8b16947fb4a70189a30e3d3b9c77d291f83699633e70ab4427fc3644a955ab4cca077b03946200095094919391929160ff94909416845263ffffffff929092166020840152604083015261ffff16606082015260800190565b60405180910390a35b50508062000967906200107b565b9050620007ad565b508051602082015161ffff91821691161080156040830152620009ce578163ffffffff167f6ec7e144a45fa03ed986874794df08b5b6bbbb27ed6454b4e6eaa74248b5e33342604051620009c591815260200190565b60405180910390a25b805160098054602084015160409094015115156401000000000260ff60201b1961ffff958616620100000263ffffffff1990931695909416949094171791909116919091179055505050565b805151600090158062000a2f57508151516080105b8062000a415750602082015161ffff16155b8062000a535750604082015161ffff16155b1562000a6157506000919050565b6000806000846000015151600362000a7a919062001173565b6001600160401b0381111562000a945762000a9462000d73565b60405190808252806020026020018201604052801562000abe578160200160208202803683370190505b50905060005b85515181101562000c8e5760008660000151828151811062000aea5762000aea6200100d565b6020026020010151905060006001600160a01b031681600001516001600160a01b0316148062000b25575060208101516001600160a01b0316155b8062000b3c575060408101516001600160a01b0316155b8062000b5e5750606081015160ff1615801562000b5e5750608081015160ff16155b1562000b71575060009695505050505050565b80518362000b8184600362001173565b62000b8e9060006200118d565b8151811062000ba15762000ba16200100d565b6001600160a01b039092166020928302919091018201528101518362000bc984600362001173565b62000bd69060016200118d565b8151811062000be95762000be96200100d565b6001600160a01b039092166020928302919091019091015260408101518362000c1484600362001173565b62000c219060026200118d565b8151811062000c345762000c346200100d565b6001600160a01b0390921660209283029190910190910152606081015162000c609060ff16866200118d565b9450806080015160ff168462000c7791906200118d565b9350508062000c869062001039565b905062000ac4565b5060005b815181101562000d4857600082828151811062000cb35762000cb36200100d565b60200260200101519050600082600162000cce91906200118d565b90505b835181101562000d325783818151811062000cf05762000cf06200100d565b60200260200101516001600160a01b0316826001600160a01b03160362000d1f57506000979650505050505050565b62000d2a8162001039565b905062000cd1565b50508062000d409062001039565b905062000c92565b50846020015161ffff16831015801562000d6a5750846040015161ffff168210155b95945050505050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b038111828210171562000dae5762000dae62000d73565b60405290565b60405160a081016001600160401b038111828210171562000dae5762000dae62000d73565b604051601f8201601f191681016001600160401b038111828210171562000e045762000e0462000d73565b604052919050565b80516001600160a01b038116811462000e2457600080fd5b919050565b805160ff8116811462000e2457600080fd5b805161ffff8116811462000e2457600080fd5b6000602080838503121562000e6257600080fd5b82516001600160401b038082111562000e7a57600080fd5b8185019150606080838803121562000e9157600080fd5b62000e9b62000d89565b83518381111562000eab57600080fd5b8401601f8101891362000ebd57600080fd5b80518481111562000ed25762000ed262000d73565b62000ee2878260051b0162000dd9565b818152878101955060a091820283018801918b83111562000f0257600080fd5b928801925b8284101562000f905780848d03121562000f215760008081fd5b62000f2b62000db4565b62000f368562000e0c565b815262000f458a860162000e0c565b8a820152604062000f5881870162000e0c565b9082015262000f6985880162000e29565b87820152608062000f7c81870162000e29565b908201528752958801959283019262000f07565b5083525062000fa3905084860162000e3b565b8582015262000fb56040850162000e3b565b6040820152979650505050505050565b634e487b7160e01b600052601160045260246000fd5b8181038181111562000ff15762000ff162000fc5565b92915050565b634e487b7160e01b600052600160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b6000600182016200104e576200104e62000fc5565b5060010190565b600063ffffffff80831681810362001071576200107162000fc5565b6001019392505050565b600060ff821660ff810362001094576200109462000fc5565b60010192915050565b60006020808352608080840185516060808588015282825180855260a094508489019150868401935060005b818110156200112157845180516001600160a01b0390811685528982015181168a860152604080830151909116908501528481015160ff908116868601529088015116878401529387019391850191600101620010c9565b50509488015161ffff8116604089015294604089015161ffff811689840152955098975050505050505050565b61ffff8181168382160190808211156200116c576200116c62000fc5565b5092915050565b808202811582820484141762000ff15762000ff162000fc5565b8082018082111562000ff15762000ff162000fc5565b613a8c80620011b36000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c8063618af12811610097578063ba86a1f011610066578063ba86a1f01461024a578063e4bbc05c1461025d578063f2fde38b14610265578063f33f28951461027857600080fd5b8063618af128146101f457806379ba5097146102075780638da5cb5b1461020f578063979986111461023757600080fd5b80633987d651116100d35780633987d6511461019e5780633f42ab73146101b757806347cf2b60146101ce5780634d616771146101e157600080fd5b8063119a352714610105578063181f5a771461011a57806335aea8691461016c578063397796f71461017f575b600080fd5b610118610113366004613195565b61029a565b005b6101566040518060400160405280600981526020017f41524d20312e302e30000000000000000000000000000000000000000000000081525081565b60405161016391906131ae565b60405180910390f35b61011861017a36600461323e565b610726565b600954640100000000900460ff165b6040519015158152602001610163565b6101a6610abb565b6040516101639594939291906132b9565b6101bf610ecd565b60405161016393929190613413565b6101186101dc366004613529565b611005565b61018e6101ef366004613681565b611019565b610118610202366004613699565b6110ab565b610118611564565b60005460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610163565b61011861024536600461370e565b611661565b61011861025836600461370e565b611b96565b610118611d74565b610118610273366004613771565b611e39565b61028b610286366004613681565b611e4a565b60405161016393929190613793565b33600090815260076020908152604091829020825160a081018452815460ff808216151580845261010083049091169483019490945263ffffffff6201000082041694820194909452660100000000000090930473ffffffffffffffffffffffffffffffffffffffff16606084015260010154608083015261034f576040517f669f262e0000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b33600090815260086020908152604080832085845290915290205460ff16156103ad576040517f9baf703d00000000000000000000000000000000000000000000000000000000815233600482015260248101839052604401610346565b3360009081526008602090815260408083208584529091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055810180516103ff906137f0565b63ffffffff16905260808101516040805160208101929092528101839052606001604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206080840190815233600090815260078452829020845181548686015187860180516060808b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009095169515157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169590951761010060ff94851602177fffffffffffff000000000000000000000000000000000000000000000000ffff166201000063ffffffff92831681027fffffffffffff0000000000000000000000000000000000000000ffffffffffff1691909117660100000000000073ffffffffffffffffffffffffffffffffffffffff9096169590950294909417865595516001958601558651938401875260095461ffff8082168652938104909316978401979097526401000000009091041615159381019390935292519192911690036105bb57816020015160ff16816020018181516105b39190613813565b61ffff169052505b60045460208381015160408086015160808088015187860151845160ff909616865263ffffffff93841696860196909652928401899052606084019290925261ffff90931690820152911690339082907f8e5ceca76dae647f687fccbe8d42a3796e68330812669bd5003b938dacb1b6dd9060a00160405180910390a3816040015115801561065a5750816000015161ffff16826020015161ffff1610155b156106a45760016040838101919091525142815263ffffffff8216907f6ec7e144a45fa03ed986874794df08b5b6bbbb27ed6454b4e6eaa74248b5e3339060200160405180910390a25b5080516009805460208401516040909401511515640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff61ffff95861662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000909316959094169490941717919091169190911790555050565b73ffffffffffffffffffffffffffffffffffffffff808316600090815260076020908152604091829020825160a081018452815460ff808216151583526101008204169382019390935263ffffffff62010000840416938101939093526601000000000000909104909216606082015260019091015460808201526107b660095460ff6401000000009091041690565b156107ed576040517fca47cca000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806060015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610858576040517f669f262e000000000000000000000000000000000000000000000000000000008152336004820152602401610346565b8051158061086e5750604081015163ffffffff16155b156108a5576040517f9ff6d96b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818160800151146108f25760808101516040517f79aa5c5f000000000000000000000000000000000000000000000000000000008152600481019190915260248101839052604401610346565b6004546020820151604080840151905173ffffffffffffffffffffffffffffffffffffffff87169363ffffffff16927f56c9f1d1001236f66c1e5d598905029b4093031f31aead3449a53d832eade2259261096a92889060ff93909316835263ffffffff919091166020830152604082015260600190565b60405180910390a3600060408281018281526080840183815273ffffffffffffffffffffffffffffffffffffffff878116855260076020908152939094208551815494870151935160608801517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009096169115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169190911761010060ff909516948502177fffffffffffff000000000000000000000000000000000000000000000000ffff166201000063ffffffff90921682027fffffffffffff0000000000000000000000000000000000000000ffffffffffff16176601000000000000959096169490940294909417845551600190930192909255600980549091600291610a9c9185910461ffff16613835565b92506101000a81548161ffff021916908361ffff160217905550505050565b60095460028054604080516020808402820181019092528281526060948594859462010000830461ffff169464010000000090930460ff16936000938493919290849084015b82821015610bad5760008481526020908190206040805160a08101825260038602909201805473ffffffffffffffffffffffffffffffffffffffff90811684526001808301548216858701526002909201549081169284019290925260ff74010000000000000000000000000000000000000000830481166060850152750100000000000000000000000000000000000000000090920490911660808301529083529092019101610b01565b50505050905060005b8151811015610c8457600060076000848481518110610bd757610bd7613850565b60209081029190910181015181015173ffffffffffffffffffffffffffffffffffffffff9081168352828201939093526040918201600020825160a081018452815460ff808216151583526101008204169382019390935263ffffffff6201000084041693810184905266010000000000009092049093166060820152600190920154608083015290915015610c7357610c708461387f565b93505b50610c7d8161387f565b9050610bb6565b508167ffffffffffffffff811115610c9e57610c9e61343c565b604051908082528060200260200182016040528015610cc7578160200160208202803683370190505b5096508167ffffffffffffffff811115610ce357610ce361343c565b604051908082528060200260200182016040528015610d0c578160200160208202803683370190505b5095508167ffffffffffffffff811115610d2857610d2861343c565b604051908082528060200260200182016040528015610d51578160200160208202803683370190505b5094506000805b8251811015610ec2576000838281518110610d7557610d75613850565b60209081029190910181015181015173ffffffffffffffffffffffffffffffffffffffff808216600090815260078452604090819020815160a081018352815460ff808216151583526101008204169682019690965263ffffffff6201000087041692810183905266010000000000009095049092166060850152600190910154608084015290925015610eaf57818b8581518110610e1657610e16613850565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080604001518a8581518110610e6757610e67613850565b602002602001019063ffffffff16908163ffffffff16815250508060800151898581518110610e9857610e98613850565b6020908102919091010152610eac8461387f565b93505b505080610ebb9061387f565b9050610d58565b505050509091929394565b6040805160608082018352808252600060208084018290528385018290526004548551600280549384028201608090810190985294810183815263ffffffff808416986401000000009094041696959194919385939192859285015b82821015610fd55760008481526020908190206040805160a08101825260038602909201805473ffffffffffffffffffffffffffffffffffffffff90811684526001808301548216858701526002909201549081169284019290925260ff74010000000000000000000000000000000000000000830481166060850152750100000000000000000000000000000000000000000090920490911660808301529083529092019101610f29565b505050908252506001919091015461ffff8082166020840152620100009091041660409091015292939192919050565b61100d612118565b61101681612199565b50565b6000600681611077611030368690038601866138b7565b80516020918201516040805173ffffffffffffffffffffffffffffffffffffffff909316838501528281019190915280518083038201815260609092019052805191012090565b8152602081019190915260400160002054760100000000000000000000000000000000000000000000900460ff1692915050565b6110b3612118565b60005b818110156113df5760008383838181106110d2576110d2613850565b9050606002018036038101906110e8919061390e565b805173ffffffffffffffffffffffffffffffffffffffff908116600090815260076020908152604091829020825160a081018452815460ff808216151583526101008204169382019390935263ffffffff62010000840416818501526601000000000000909204909316606082015260019092015460808301528201519192509015801561117e57508160200151816080015114155b156111e65781516080820151602080850151604080519384529183015273ffffffffffffffffffffffffffffffffffffffff909216917ff4e3b20447f3f83360469333a2578825ae355d192dd6f59c6516d832fa425a53910160405180910390a250506113cf565b805115806111fc5750604081015163ffffffff16155b156112085750506113cf565b81516004546020838101516040808601516080870151825160ff909416845263ffffffff918216948401949094529082019290925273ffffffffffffffffffffffffffffffffffffffff909316929116907f56c9f1d1001236f66c1e5d598905029b4093031f31aead3449a53d832eade2259060600160405180910390a36000604082810182815260808401838152855173ffffffffffffffffffffffffffffffffffffffff908116855260076020908152939094208551815494870151935160608801517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009096169115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169190911761010060ff909516948502177fffffffffffff000000000000000000000000000000000000000000000000ffff166201000063ffffffff90921682027fffffffffffff0000000000000000000000000000000000000000ffffffffffff161766010000000000009590961694909402949094178455516001909301929092556009805490916002916113b29185910461ffff16613835565b92506101000a81548161ffff021916908361ffff16021790555050505b6113d88161387f565b90506110b6565b50600954640100000000900460ff168015611408575060095461ffff8082166201000090920416105b1561156057600980547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff1690556040517f08c773aaf7568c6b9110dcdfc13c27177410582ee30e157d1aa306b49d603eb790600090a160408051600280546080602082028401810190945260608301818152611560948492849160009085015b828210156115345760008481526020908190206040805160a08101825260038602909201805473ffffffffffffffffffffffffffffffffffffffff90811684526001808301548216858701526002909201549081169284019290925260ff74010000000000000000000000000000000000000000830481166060850152750100000000000000000000000000000000000000000090920490911660808301529083529092019101611488565b505050908252506001919091015461ffff80821660208401526201000090910416604090910152612199565b5050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146115e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610346565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b600954640100000000900460ff16156116a6576040517fca47cca000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600454336000908152600560209081526040918290208251606081018452905463ffffffff81811680845260ff64010000000084048116958501959095526501000000000090920490931693820193909352921691908214611736576040517f669f262e000000000000000000000000000000000000000000000000000000008152336004820152602401610346565b60005b83811015611b8f57600085858381811061175557611755613850565b90506040020180360381019061176b91906138b7565b905060006117ba8280516020918201516040805173ffffffffffffffffffffffffffffffffffffffff909316838501528281019190915280518083038201815260609092019052805191012090565b6000818152600660209081526040918290208251608081018452905463ffffffff81168252640100000000810461ffff1692820192909252660100000000000082046fffffffffffffffffffffffffffffffff1692810192909252760100000000000000000000000000000000000000000000900460ff1615801560608301529192509061189f573373ffffffffffffffffffffffffffffffffffffffff168663ffffffff167f274d6d5b916b0a53974b7ab86c844b97a2e03a60f658cd9a4b1c028b604d7bf18560405161188f919061395c565b60405180910390a3505050611b7f565b8563ffffffff16816000015163ffffffff16146118e257506040805160808101825263ffffffff8716815260006020820181905291810182905260608101919091525b6118f481604001518660400151612c76565b15611946573373ffffffffffffffffffffffffffffffffffffffff168663ffffffff167f6dfbb745226fa630aeb1b9557d17d508ddb789a04f0cb873ec16e58beb8beead8560405161188f919061395c565b61195881604001518660400151612cb0565b6fffffffffffffffffffffffffffffffff166040820152602080860151908201805160ff9092169161198b908390613813565b61ffff1690525060208581015160408051865173ffffffffffffffffffffffffffffffffffffffff168152868401519381019390935260ff9091168282015251339163ffffffff8916917f2a08a2bd2798f0aae9a843f0f4ad4de488c1b3d5f04049940cfed736ad69fb979181900360600190a3600354602082015161ffff918216911610611a925760016060820152602081015160405163ffffffff8816917f8257378aa73bf8e4ada848713526584a3dcee0fd3db3beed7397f7a7f5067cc991611a89918791825173ffffffffffffffffffffffffffffffffffffffff1681526020928301519281019290925261ffff16604082015260600190565b60405180910390a25b6000918252600660209081526040928390208251815492840151948401516060909401511515760100000000000000000000000000000000000000000000027fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff6fffffffffffffffffffffffffffffffff909516660100000000000002949094167fffffffffffffffffff0000000000000000000000000000000000ffffffffffff61ffff909616640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000090941663ffffffff90921691909117929092179390931617179055505b611b888161387f565b9050611739565b5050505050565b611b9e612118565b60045463ffffffff1660005b82811015611d6e576000848483818110611bc657611bc6613850565b905060400201803603810190611bdc91906138b7565b90506000611c2b8280516020918201516040805173ffffffffffffffffffffffffffffffffffffffff909316838501528281019190915280518083038201815260609092019052805191012090565b60008181526006602081815260408084208151608081018352815463ffffffff808216835261ffff640100000000830416838701526fffffffffffffffffffffffffffffffff66010000000000008304169483019490945260ff76010000000000000000000000000000000000000000000082041615156060830190815296889052949093527fffffffffffffffffff000000000000000000000000000000000000000000000090931690925591518251939450919281169087161480611cef5750805b15611d595760408051855173ffffffffffffffffffffffffffffffffffffffff1681526020808701519082015282151581830152905163ffffffff8816917f7d15a6eebaa019ea7d5b7d38937c51ebd3befbfdf51bb630a694fd28635bbcba919081900360600190a25b5050505080611d679061387f565b9050611baa565b50505050565b611d7c612118565b6040514281527f367ba81ba03ea9fa7ee089ecfb43b1c35e0935bc87a472abf615b7580dc16b799060200160405180910390a1600954640100000000900460ff16611e3757600980547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff1664010000000017905560045460405163ffffffff909116907f6ec7e144a45fa03ed986874794df08b5b6bbbb27ed6454b4e6eaa74248b5e33390611e2e9042815260200190565b60405180910390a25b565b611e41612118565b61101681612cd3565b606060008080611e62611030368790038701876138b7565b6000818152600660209081526040918290208251608081018452905463ffffffff808216808452640100000000830461ffff1694840194909452660100000000000082046fffffffffffffffffffffffffffffffff1694830194909452760100000000000000000000000000000000000000000000900460ff1615156060820181905260045490965093945092909116900361210f5760208101516040820151909450611f0e81612dc8565b60ff1667ffffffffffffffff811115611f2957611f2961343c565b604051908082528060200260200182016040528015611f52578160200160208202803683370190505b506002805460408051602080840282018101909252828152939950600093929190849084015b828210156120245760008481526020908190206040805160a08101825260038602909201805473ffffffffffffffffffffffffffffffffffffffff90811684526001808301548216858701526002909201549081169284019290925260ff74010000000000000000000000000000000000000000830481166060850152750100000000000000000000000000000000000000000090920490911660808301529083529092019101611f78565b5050505090506000805b825181101561210a57612094846005600086858151811061205157612051613850565b6020908102919091018101515173ffffffffffffffffffffffffffffffffffffffff1682528101919091526040016000205465010000000000900460ff16612c76565b156120fa578281815181106120ab576120ab613850565b6020026020010151600001518983815181106120c9576120c9613850565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101526120f78261387f565b91505b6121038161387f565b905061202e565b505050505b50509193909250565b60005473ffffffffffffffffffffffffffffffffffffffff163314611e37576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610346565b600954640100000000900460ff16156121de576040517fca47cca000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121e781612e07565b61221d576040517f35be3ac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160028054608060208202840181019094526060830181815260009484928491879085015b828210156122f15760008481526020908190206040805160a08101825260038602909201805473ffffffffffffffffffffffffffffffffffffffff90811684526001808301548216858701526002909201549081169284019290925260ff74010000000000000000000000000000000000000000830481166060850152750100000000000000000000000000000000000000000090920490911660808301529083529092019101612245565b505050908252506001919091015461ffff80821660208085019190915262010000928390048216604094850152860151600380549488015183169093027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000090941691161791909117905590505b6002541561252957600280546000919061237a90600190613989565b8154811061238a5761238a613850565b600091825260208083206040805160a0810182526003909402909101805473ffffffffffffffffffffffffffffffffffffffff908116808652600183015482168686019081526002938401548084168887015260ff740100000000000000000000000000000000000000008204811660608a015275010000000000000000000000000000000000000000009091041660808801529087526005855283872080547fffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000016905551168552600790925290922080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558154909250806124925761249261399c565b60008281526020902060037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019182020180547fffffffffffffffffffffffff00000000000000000000000000000000000000009081168255600182018054909116905560020180547fffffffffffffffffffff0000000000000000000000000000000000000000000016905590555061235e565b60005b82515181101561267f5782518051600291908390811061254e5761254e613850565b602090810291909101810151825460018082018555600094855293839020825160039092020180547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff938416178255938301519481018054909416948216949094179092556040810151600290930180546060830151608090930151949093167fffffffffffffffffffffff000000000000000000000000000000000000000000909316929092177401000000000000000000000000000000000000000060ff92831602177fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16750100000000000000000000000000000000000000000091909316029190911790556126788161387f565b905061252c565b50600480546000906126969063ffffffff166137f0565b82546101009290920a63ffffffff8181021990931691831602179091556004541660005b83515160ff8216101561290457600084600001518260ff16815181106126e2576126e2613850565b602090810291909101810151604080516060808201835263ffffffff88811683528185015160ff908116848801908152898216858701908152875173ffffffffffffffffffffffffffffffffffffffff908116600090815260058b5288812097518854945193519087167fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009095169490941764010000000093861693909302929092177fffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff16650100000000009385169390930292909217909555855160a08101875260018082526080808a01518516838c019081528a8c01805186168a526007808e528b8b205462010000908190048a16878e019081529d8d015188169a87019a8b52825188168c52818f528c8c20860154948701948552915187168b52909c5298909720915182549851995196517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009099169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16176101009990941698909802929092177fffffffffffff000000000000000000000000000000000000000000000000ffff16939092169096027fffffffffffff0000000000000000000000000000000000000000ffffffffffff16919091176601000000000000939091169290920291909117835551910155506128fd816139cb565b90506126ba565b506004805463ffffffff438116640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff90921691909117909155604051908216907f7cf8e698b191db138396ab0eae2ad5b3fe353fd014fd5956b034b86f2d605cfd906129779086906139ea565b60405180910390a2604080516060810182528482015161ffff168152600060208201819052918101829052905b83515160ff82161015612b9757600084600001518260ff16815181106129cc576129cc613850565b60209081029190910181015181015173ffffffffffffffffffffffffffffffffffffffff808216600090815260078452604090819020815160a081018352815460ff808216151580845261010083049091169783019790975263ffffffff620100008204169382019390935266010000000000009092049092166060820152600190910154608082015290925090612ab25773ffffffffffffffffffffffffffffffffffffffff8216600090815260076020526040812080547fffffffffffff000000000000000000000000000000000000000000000000000016815560010155612b84565b80518015612aca57506000816040015163ffffffff16115b15612b8457806020015160ff1684602001818151612ae89190613813565b61ffff16905250602080820151604080840151608085015193880151915173ffffffffffffffffffffffffffffffffffffffff87169463ffffffff8b16947fb4a70189a30e3d3b9c77d291f83699633e70ab4427fc3644a955ab4cca077b0394612b7b94919391929160ff94909416845263ffffffff929092166020840152604083015261ffff16606082015260800190565b60405180910390a35b505080612b90906139cb565b90506129a4565b508051602082015161ffff91821691161080156040830152612bf4578163ffffffff167f6ec7e144a45fa03ed986874794df08b5b6bbbb27ed6454b4e6eaa74248b5e33342604051612beb91815260200190565b60405180910390a25b80516009805460208401516040909401511515640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff61ffff95861662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000090931695909416949094171791909116919091179055505050565b600060808260ff1610612c8b57612c8b6139fd565b50600160ff82161b82166fffffffffffffffffffffffffffffffff1615155b92915050565b600060808260ff1610612cc557612cc56139fd565b50600160ff919091161b1790565b3373ffffffffffffffffffffffffffffffffffffffff821603612d52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610346565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60005b6fffffffffffffffffffffffffffffffff821615612e0257612dee600183613a2c565b90911690612dfb816139cb565b9050612dcb565b919050565b8051516000901580612e1b57508151516080105b80612e2c5750602082015161ffff16155b80612e3d5750604082015161ffff16155b15612e4a57506000919050565b60008060008460000151516003612e619190613a55565b67ffffffffffffffff811115612e7957612e7961343c565b604051908082528060200260200182016040528015612ea2578160200160208202803683370190505b50905060005b8551518110156130a857600086600001518281518110612eca57612eca613850565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161480612f2b5750602081015173ffffffffffffffffffffffffffffffffffffffff16155b80612f4e5750604081015173ffffffffffffffffffffffffffffffffffffffff16155b80612f6e5750606081015160ff16158015612f6e5750608081015160ff16155b15612f80575060009695505050505050565b805183612f8e846003613a55565b612f99906000613a6c565b81518110612fa957612fa9613850565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910182015281015183612fdc846003613a55565b612fe7906001613a6c565b81518110612ff757612ff7613850565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015260408101518361302d846003613a55565b613038906002613a6c565b8151811061304857613048613850565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152606081015161307f9060ff1686613a6c565b9450806080015160ff16846130949190613a6c565b935050806130a19061387f565b9050612ea8565b5060005b815181101561316b5760008282815181106130c9576130c9613850565b6020026020010151905060008260016130e29190613a6c565b90505b83518110156131585783818151811061310057613100613850565b602002602001015173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361314857506000979650505050505050565b6131518161387f565b90506130e5565b5050806131649061387f565b90506130ac565b50846020015161ffff16831015801561318c5750846040015161ffff168210155b95945050505050565b6000602082840312156131a757600080fd5b5035919050565b600060208083528351808285015260005b818110156131db578581018301518582016040015282016131bf565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612e0257600080fd5b6000806040838503121561325157600080fd5b61325a8361321a565b946020939093013593505050565b600081518084526020808501945080840160005b838110156132ae57815173ffffffffffffffffffffffffffffffffffffffff168752958201959082019060010161327c565b509495945050505050565b60a0815260006132cc60a0830188613268565b82810360208481019190915287518083528882019282019060005b8181101561330957845163ffffffff16835293830193918301916001016132e7565b50508481036040860152875180825290820192508188019060005b8181101561334057825185529383019391830191600101613324565b50505061ffff8616606085015250905082151560808301525b9695505050505050565b8051606080845281518482018190526000926080916020918201918388019190865b828110156133ea578451805173ffffffffffffffffffffffffffffffffffffffff908116865283820151811684870152604080830151909116908601528781015160ff908116898701529087015116868501529381019360a090930192600101613385565b508781015161ffff81168a8301529550505060408601519350613359604088018561ffff169052565b600063ffffffff80861683528085166020840152506060604083015261318c6060830184613363565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516060810167ffffffffffffffff8111828210171561348e5761348e61343c565b60405290565b60405160a0810167ffffffffffffffff8111828210171561348e5761348e61343c565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156134fe576134fe61343c565b604052919050565b803560ff81168114612e0257600080fd5b803561ffff81168114612e0257600080fd5b6000602080838503121561353c57600080fd5b823567ffffffffffffffff8082111561355457600080fd5b8185019150606080838803121561356a57600080fd5b61357261346b565b83358381111561358157600080fd5b8401601f8101891361359257600080fd5b8035848111156135a4576135a461343c565b6135b2878260051b016134b7565b818152878101955060a091820283018801918b8311156135d157600080fd5b928801925b828410156136505780848d0312156135ee5760008081fd5b6135f6613494565b6135ff8561321a565b815261360c8a860161321a565b8a820152604061361d81870161321a565b9082015261362c858801613506565b87820152608061363d818701613506565b90820152875295880195928301926135d6565b508352506136619050848601613517565b8582015261367160408501613517565b6040820152979650505050505050565b60006040828403121561369357600080fd5b50919050565b600080602083850312156136ac57600080fd5b823567ffffffffffffffff808211156136c457600080fd5b818501915085601f8301126136d857600080fd5b8135818111156136e757600080fd5b8660206060830285010111156136fc57600080fd5b60209290920196919550909350505050565b6000806020838503121561372157600080fd5b823567ffffffffffffffff8082111561373957600080fd5b818501915085601f83011261374d57600080fd5b81358181111561375c57600080fd5b8660208260061b85010111156136fc57600080fd5b60006020828403121561378357600080fd5b61378c8261321a565b9392505050565b6060815260006137a66060830186613268565b61ffff94909416602083015250901515604090910152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600063ffffffff808316818103613809576138096137c1565b6001019392505050565b61ffff81811683821601908082111561382e5761382e6137c1565b5092915050565b61ffff82811682821603908082111561382e5761382e6137c1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036138b0576138b06137c1565b5060010190565b6000604082840312156138c957600080fd5b6040516040810181811067ffffffffffffffff821117156138ec576138ec61343c565b6040526138f88361321a565b8152602083013560208201528091505092915050565b60006060828403121561392057600080fd5b61392861346b565b6139318361321a565b8152602083013560208201526040830135801515811461395057600080fd5b60408201529392505050565b815173ffffffffffffffffffffffffffffffffffffffff1681526020808301519082015260408101612caa565b81810381811115612caa57612caa6137c1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600060ff821660ff81036139e1576139e16137c1565b60010192915050565b60208152600061378c6020830184613363565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6fffffffffffffffffffffffffffffffff82811682821603908082111561382e5761382e6137c1565b8082028115828204841417612caa57612caa6137c1565b80820180821115612caa57612caa6137c156fea164736f6c6343000813000a0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000700000000000000000000000023ccf5a7309a9ba850f877313cff35b6903609440000000000000000000000000b59fa90337b8c1dfcf83a60be93df36d3022bf2000000000000000000000000e1adbb7ccf4a7ef07078475932cb99649cb881dd00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000eaa2691fe9c8cef93ccbc1b4b1e4f3ce026789420000000000000000000000000cb702a32e380e6bbe578d73928db35f27dfd0d100000000000000000000000037a929ecc35da8c0fa4656b41e8d7558916d48db00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f5d5840ce35ed1e408b26df1f5eb74d6641dfae600000000000000000000000038ea6cea45d30f9a4ba1b7fa28ce840135fe3118000000000000000000000000c703725fd00dff4c2e1fa36a0d8e926f82d00413000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000009f199d8a106a220d483bd548ef862b15ecd3bfac0000000000000000000000001dca94f408bc850524a320988721642d64870b6200000000000000000000000066d1e2852cfa850dcf534ef6fd9300cd6346b2ab000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000008749f722d74b2a8d9af5e4f8011287da3dc058a1000000000000000000000000699e53aba4543726e487771def1781c89dbd30cf0000000000000000000000000114dea7556499a96b47447825d1b975ceb7ef1b000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000bc0fb2faa891d3c48e494bffd3b0bcd53b99ce500000000000000000000000012119a85235939c6d28182f198add16e9c1d7b110000000000000000000000005e33ecc8f41dc82a1f5ae6b9d483fcb8cff177c100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000d6c690713dc1b3995c200e600d3a00b30299ae08000000000000000000000000c5f450a270dcefdcb990851a280a8a2a3d9403df0000000000000000000000002e755320044a2677617dd2a341e6a540f0a1669a00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101005760003560e01c8063618af12811610097578063ba86a1f011610066578063ba86a1f01461024a578063e4bbc05c1461025d578063f2fde38b14610265578063f33f28951461027857600080fd5b8063618af128146101f457806379ba5097146102075780638da5cb5b1461020f578063979986111461023757600080fd5b80633987d651116100d35780633987d6511461019e5780633f42ab73146101b757806347cf2b60146101ce5780634d616771146101e157600080fd5b8063119a352714610105578063181f5a771461011a57806335aea8691461016c578063397796f71461017f575b600080fd5b610118610113366004613195565b61029a565b005b6101566040518060400160405280600981526020017f41524d20312e302e30000000000000000000000000000000000000000000000081525081565b60405161016391906131ae565b60405180910390f35b61011861017a36600461323e565b610726565b600954640100000000900460ff165b6040519015158152602001610163565b6101a6610abb565b6040516101639594939291906132b9565b6101bf610ecd565b60405161016393929190613413565b6101186101dc366004613529565b611005565b61018e6101ef366004613681565b611019565b610118610202366004613699565b6110ab565b610118611564565b60005460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610163565b61011861024536600461370e565b611661565b61011861025836600461370e565b611b96565b610118611d74565b610118610273366004613771565b611e39565b61028b610286366004613681565b611e4a565b60405161016393929190613793565b33600090815260076020908152604091829020825160a081018452815460ff808216151580845261010083049091169483019490945263ffffffff6201000082041694820194909452660100000000000090930473ffffffffffffffffffffffffffffffffffffffff16606084015260010154608083015261034f576040517f669f262e0000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b33600090815260086020908152604080832085845290915290205460ff16156103ad576040517f9baf703d00000000000000000000000000000000000000000000000000000000815233600482015260248101839052604401610346565b3360009081526008602090815260408083208584529091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055810180516103ff906137f0565b63ffffffff16905260808101516040805160208101929092528101839052606001604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206080840190815233600090815260078452829020845181548686015187860180516060808b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009095169515157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169590951761010060ff94851602177fffffffffffff000000000000000000000000000000000000000000000000ffff166201000063ffffffff92831681027fffffffffffff0000000000000000000000000000000000000000ffffffffffff1691909117660100000000000073ffffffffffffffffffffffffffffffffffffffff9096169590950294909417865595516001958601558651938401875260095461ffff8082168652938104909316978401979097526401000000009091041615159381019390935292519192911690036105bb57816020015160ff16816020018181516105b39190613813565b61ffff169052505b60045460208381015160408086015160808088015187860151845160ff909616865263ffffffff93841696860196909652928401899052606084019290925261ffff90931690820152911690339082907f8e5ceca76dae647f687fccbe8d42a3796e68330812669bd5003b938dacb1b6dd9060a00160405180910390a3816040015115801561065a5750816000015161ffff16826020015161ffff1610155b156106a45760016040838101919091525142815263ffffffff8216907f6ec7e144a45fa03ed986874794df08b5b6bbbb27ed6454b4e6eaa74248b5e3339060200160405180910390a25b5080516009805460208401516040909401511515640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff61ffff95861662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000909316959094169490941717919091169190911790555050565b73ffffffffffffffffffffffffffffffffffffffff808316600090815260076020908152604091829020825160a081018452815460ff808216151583526101008204169382019390935263ffffffff62010000840416938101939093526601000000000000909104909216606082015260019091015460808201526107b660095460ff6401000000009091041690565b156107ed576040517fca47cca000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806060015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610858576040517f669f262e000000000000000000000000000000000000000000000000000000008152336004820152602401610346565b8051158061086e5750604081015163ffffffff16155b156108a5576040517f9ff6d96b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818160800151146108f25760808101516040517f79aa5c5f000000000000000000000000000000000000000000000000000000008152600481019190915260248101839052604401610346565b6004546020820151604080840151905173ffffffffffffffffffffffffffffffffffffffff87169363ffffffff16927f56c9f1d1001236f66c1e5d598905029b4093031f31aead3449a53d832eade2259261096a92889060ff93909316835263ffffffff919091166020830152604082015260600190565b60405180910390a3600060408281018281526080840183815273ffffffffffffffffffffffffffffffffffffffff878116855260076020908152939094208551815494870151935160608801517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009096169115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169190911761010060ff909516948502177fffffffffffff000000000000000000000000000000000000000000000000ffff166201000063ffffffff90921682027fffffffffffff0000000000000000000000000000000000000000ffffffffffff16176601000000000000959096169490940294909417845551600190930192909255600980549091600291610a9c9185910461ffff16613835565b92506101000a81548161ffff021916908361ffff160217905550505050565b60095460028054604080516020808402820181019092528281526060948594859462010000830461ffff169464010000000090930460ff16936000938493919290849084015b82821015610bad5760008481526020908190206040805160a08101825260038602909201805473ffffffffffffffffffffffffffffffffffffffff90811684526001808301548216858701526002909201549081169284019290925260ff74010000000000000000000000000000000000000000830481166060850152750100000000000000000000000000000000000000000090920490911660808301529083529092019101610b01565b50505050905060005b8151811015610c8457600060076000848481518110610bd757610bd7613850565b60209081029190910181015181015173ffffffffffffffffffffffffffffffffffffffff9081168352828201939093526040918201600020825160a081018452815460ff808216151583526101008204169382019390935263ffffffff6201000084041693810184905266010000000000009092049093166060820152600190920154608083015290915015610c7357610c708461387f565b93505b50610c7d8161387f565b9050610bb6565b508167ffffffffffffffff811115610c9e57610c9e61343c565b604051908082528060200260200182016040528015610cc7578160200160208202803683370190505b5096508167ffffffffffffffff811115610ce357610ce361343c565b604051908082528060200260200182016040528015610d0c578160200160208202803683370190505b5095508167ffffffffffffffff811115610d2857610d2861343c565b604051908082528060200260200182016040528015610d51578160200160208202803683370190505b5094506000805b8251811015610ec2576000838281518110610d7557610d75613850565b60209081029190910181015181015173ffffffffffffffffffffffffffffffffffffffff808216600090815260078452604090819020815160a081018352815460ff808216151583526101008204169682019690965263ffffffff6201000087041692810183905266010000000000009095049092166060850152600190910154608084015290925015610eaf57818b8581518110610e1657610e16613850565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080604001518a8581518110610e6757610e67613850565b602002602001019063ffffffff16908163ffffffff16815250508060800151898581518110610e9857610e98613850565b6020908102919091010152610eac8461387f565b93505b505080610ebb9061387f565b9050610d58565b505050509091929394565b6040805160608082018352808252600060208084018290528385018290526004548551600280549384028201608090810190985294810183815263ffffffff808416986401000000009094041696959194919385939192859285015b82821015610fd55760008481526020908190206040805160a08101825260038602909201805473ffffffffffffffffffffffffffffffffffffffff90811684526001808301548216858701526002909201549081169284019290925260ff74010000000000000000000000000000000000000000830481166060850152750100000000000000000000000000000000000000000090920490911660808301529083529092019101610f29565b505050908252506001919091015461ffff8082166020840152620100009091041660409091015292939192919050565b61100d612118565b61101681612199565b50565b6000600681611077611030368690038601866138b7565b80516020918201516040805173ffffffffffffffffffffffffffffffffffffffff909316838501528281019190915280518083038201815260609092019052805191012090565b8152602081019190915260400160002054760100000000000000000000000000000000000000000000900460ff1692915050565b6110b3612118565b60005b818110156113df5760008383838181106110d2576110d2613850565b9050606002018036038101906110e8919061390e565b805173ffffffffffffffffffffffffffffffffffffffff908116600090815260076020908152604091829020825160a081018452815460ff808216151583526101008204169382019390935263ffffffff62010000840416818501526601000000000000909204909316606082015260019092015460808301528201519192509015801561117e57508160200151816080015114155b156111e65781516080820151602080850151604080519384529183015273ffffffffffffffffffffffffffffffffffffffff909216917ff4e3b20447f3f83360469333a2578825ae355d192dd6f59c6516d832fa425a53910160405180910390a250506113cf565b805115806111fc5750604081015163ffffffff16155b156112085750506113cf565b81516004546020838101516040808601516080870151825160ff909416845263ffffffff918216948401949094529082019290925273ffffffffffffffffffffffffffffffffffffffff909316929116907f56c9f1d1001236f66c1e5d598905029b4093031f31aead3449a53d832eade2259060600160405180910390a36000604082810182815260808401838152855173ffffffffffffffffffffffffffffffffffffffff908116855260076020908152939094208551815494870151935160608801517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009096169115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169190911761010060ff909516948502177fffffffffffff000000000000000000000000000000000000000000000000ffff166201000063ffffffff90921682027fffffffffffff0000000000000000000000000000000000000000ffffffffffff161766010000000000009590961694909402949094178455516001909301929092556009805490916002916113b29185910461ffff16613835565b92506101000a81548161ffff021916908361ffff16021790555050505b6113d88161387f565b90506110b6565b50600954640100000000900460ff168015611408575060095461ffff8082166201000090920416105b1561156057600980547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff1690556040517f08c773aaf7568c6b9110dcdfc13c27177410582ee30e157d1aa306b49d603eb790600090a160408051600280546080602082028401810190945260608301818152611560948492849160009085015b828210156115345760008481526020908190206040805160a08101825260038602909201805473ffffffffffffffffffffffffffffffffffffffff90811684526001808301548216858701526002909201549081169284019290925260ff74010000000000000000000000000000000000000000830481166060850152750100000000000000000000000000000000000000000090920490911660808301529083529092019101611488565b505050908252506001919091015461ffff80821660208401526201000090910416604090910152612199565b5050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146115e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610346565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b600954640100000000900460ff16156116a6576040517fca47cca000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600454336000908152600560209081526040918290208251606081018452905463ffffffff81811680845260ff64010000000084048116958501959095526501000000000090920490931693820193909352921691908214611736576040517f669f262e000000000000000000000000000000000000000000000000000000008152336004820152602401610346565b60005b83811015611b8f57600085858381811061175557611755613850565b90506040020180360381019061176b91906138b7565b905060006117ba8280516020918201516040805173ffffffffffffffffffffffffffffffffffffffff909316838501528281019190915280518083038201815260609092019052805191012090565b6000818152600660209081526040918290208251608081018452905463ffffffff81168252640100000000810461ffff1692820192909252660100000000000082046fffffffffffffffffffffffffffffffff1692810192909252760100000000000000000000000000000000000000000000900460ff1615801560608301529192509061189f573373ffffffffffffffffffffffffffffffffffffffff168663ffffffff167f274d6d5b916b0a53974b7ab86c844b97a2e03a60f658cd9a4b1c028b604d7bf18560405161188f919061395c565b60405180910390a3505050611b7f565b8563ffffffff16816000015163ffffffff16146118e257506040805160808101825263ffffffff8716815260006020820181905291810182905260608101919091525b6118f481604001518660400151612c76565b15611946573373ffffffffffffffffffffffffffffffffffffffff168663ffffffff167f6dfbb745226fa630aeb1b9557d17d508ddb789a04f0cb873ec16e58beb8beead8560405161188f919061395c565b61195881604001518660400151612cb0565b6fffffffffffffffffffffffffffffffff166040820152602080860151908201805160ff9092169161198b908390613813565b61ffff1690525060208581015160408051865173ffffffffffffffffffffffffffffffffffffffff168152868401519381019390935260ff9091168282015251339163ffffffff8916917f2a08a2bd2798f0aae9a843f0f4ad4de488c1b3d5f04049940cfed736ad69fb979181900360600190a3600354602082015161ffff918216911610611a925760016060820152602081015160405163ffffffff8816917f8257378aa73bf8e4ada848713526584a3dcee0fd3db3beed7397f7a7f5067cc991611a89918791825173ffffffffffffffffffffffffffffffffffffffff1681526020928301519281019290925261ffff16604082015260600190565b60405180910390a25b6000918252600660209081526040928390208251815492840151948401516060909401511515760100000000000000000000000000000000000000000000027fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff6fffffffffffffffffffffffffffffffff909516660100000000000002949094167fffffffffffffffffff0000000000000000000000000000000000ffffffffffff61ffff909616640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000090941663ffffffff90921691909117929092179390931617179055505b611b888161387f565b9050611739565b5050505050565b611b9e612118565b60045463ffffffff1660005b82811015611d6e576000848483818110611bc657611bc6613850565b905060400201803603810190611bdc91906138b7565b90506000611c2b8280516020918201516040805173ffffffffffffffffffffffffffffffffffffffff909316838501528281019190915280518083038201815260609092019052805191012090565b60008181526006602081815260408084208151608081018352815463ffffffff808216835261ffff640100000000830416838701526fffffffffffffffffffffffffffffffff66010000000000008304169483019490945260ff76010000000000000000000000000000000000000000000082041615156060830190815296889052949093527fffffffffffffffffff000000000000000000000000000000000000000000000090931690925591518251939450919281169087161480611cef5750805b15611d595760408051855173ffffffffffffffffffffffffffffffffffffffff1681526020808701519082015282151581830152905163ffffffff8816917f7d15a6eebaa019ea7d5b7d38937c51ebd3befbfdf51bb630a694fd28635bbcba919081900360600190a25b5050505080611d679061387f565b9050611baa565b50505050565b611d7c612118565b6040514281527f367ba81ba03ea9fa7ee089ecfb43b1c35e0935bc87a472abf615b7580dc16b799060200160405180910390a1600954640100000000900460ff16611e3757600980547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff1664010000000017905560045460405163ffffffff909116907f6ec7e144a45fa03ed986874794df08b5b6bbbb27ed6454b4e6eaa74248b5e33390611e2e9042815260200190565b60405180910390a25b565b611e41612118565b61101681612cd3565b606060008080611e62611030368790038701876138b7565b6000818152600660209081526040918290208251608081018452905463ffffffff808216808452640100000000830461ffff1694840194909452660100000000000082046fffffffffffffffffffffffffffffffff1694830194909452760100000000000000000000000000000000000000000000900460ff1615156060820181905260045490965093945092909116900361210f5760208101516040820151909450611f0e81612dc8565b60ff1667ffffffffffffffff811115611f2957611f2961343c565b604051908082528060200260200182016040528015611f52578160200160208202803683370190505b506002805460408051602080840282018101909252828152939950600093929190849084015b828210156120245760008481526020908190206040805160a08101825260038602909201805473ffffffffffffffffffffffffffffffffffffffff90811684526001808301548216858701526002909201549081169284019290925260ff74010000000000000000000000000000000000000000830481166060850152750100000000000000000000000000000000000000000090920490911660808301529083529092019101611f78565b5050505090506000805b825181101561210a57612094846005600086858151811061205157612051613850565b6020908102919091018101515173ffffffffffffffffffffffffffffffffffffffff1682528101919091526040016000205465010000000000900460ff16612c76565b156120fa578281815181106120ab576120ab613850565b6020026020010151600001518983815181106120c9576120c9613850565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101526120f78261387f565b91505b6121038161387f565b905061202e565b505050505b50509193909250565b60005473ffffffffffffffffffffffffffffffffffffffff163314611e37576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610346565b600954640100000000900460ff16156121de576040517fca47cca000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121e781612e07565b61221d576040517f35be3ac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160028054608060208202840181019094526060830181815260009484928491879085015b828210156122f15760008481526020908190206040805160a08101825260038602909201805473ffffffffffffffffffffffffffffffffffffffff90811684526001808301548216858701526002909201549081169284019290925260ff74010000000000000000000000000000000000000000830481166060850152750100000000000000000000000000000000000000000090920490911660808301529083529092019101612245565b505050908252506001919091015461ffff80821660208085019190915262010000928390048216604094850152860151600380549488015183169093027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000090941691161791909117905590505b6002541561252957600280546000919061237a90600190613989565b8154811061238a5761238a613850565b600091825260208083206040805160a0810182526003909402909101805473ffffffffffffffffffffffffffffffffffffffff908116808652600183015482168686019081526002938401548084168887015260ff740100000000000000000000000000000000000000008204811660608a015275010000000000000000000000000000000000000000009091041660808801529087526005855283872080547fffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000016905551168552600790925290922080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558154909250806124925761249261399c565b60008281526020902060037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019182020180547fffffffffffffffffffffffff00000000000000000000000000000000000000009081168255600182018054909116905560020180547fffffffffffffffffffff0000000000000000000000000000000000000000000016905590555061235e565b60005b82515181101561267f5782518051600291908390811061254e5761254e613850565b602090810291909101810151825460018082018555600094855293839020825160039092020180547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff938416178255938301519481018054909416948216949094179092556040810151600290930180546060830151608090930151949093167fffffffffffffffffffffff000000000000000000000000000000000000000000909316929092177401000000000000000000000000000000000000000060ff92831602177fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16750100000000000000000000000000000000000000000091909316029190911790556126788161387f565b905061252c565b50600480546000906126969063ffffffff166137f0565b82546101009290920a63ffffffff8181021990931691831602179091556004541660005b83515160ff8216101561290457600084600001518260ff16815181106126e2576126e2613850565b602090810291909101810151604080516060808201835263ffffffff88811683528185015160ff908116848801908152898216858701908152875173ffffffffffffffffffffffffffffffffffffffff908116600090815260058b5288812097518854945193519087167fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009095169490941764010000000093861693909302929092177fffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff16650100000000009385169390930292909217909555855160a08101875260018082526080808a01518516838c019081528a8c01805186168a526007808e528b8b205462010000908190048a16878e019081529d8d015188169a87019a8b52825188168c52818f528c8c20860154948701948552915187168b52909c5298909720915182549851995196517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009099169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16176101009990941698909802929092177fffffffffffff000000000000000000000000000000000000000000000000ffff16939092169096027fffffffffffff0000000000000000000000000000000000000000ffffffffffff16919091176601000000000000939091169290920291909117835551910155506128fd816139cb565b90506126ba565b506004805463ffffffff438116640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff90921691909117909155604051908216907f7cf8e698b191db138396ab0eae2ad5b3fe353fd014fd5956b034b86f2d605cfd906129779086906139ea565b60405180910390a2604080516060810182528482015161ffff168152600060208201819052918101829052905b83515160ff82161015612b9757600084600001518260ff16815181106129cc576129cc613850565b60209081029190910181015181015173ffffffffffffffffffffffffffffffffffffffff808216600090815260078452604090819020815160a081018352815460ff808216151580845261010083049091169783019790975263ffffffff620100008204169382019390935266010000000000009092049092166060820152600190910154608082015290925090612ab25773ffffffffffffffffffffffffffffffffffffffff8216600090815260076020526040812080547fffffffffffff000000000000000000000000000000000000000000000000000016815560010155612b84565b80518015612aca57506000816040015163ffffffff16115b15612b8457806020015160ff1684602001818151612ae89190613813565b61ffff16905250602080820151604080840151608085015193880151915173ffffffffffffffffffffffffffffffffffffffff87169463ffffffff8b16947fb4a70189a30e3d3b9c77d291f83699633e70ab4427fc3644a955ab4cca077b0394612b7b94919391929160ff94909416845263ffffffff929092166020840152604083015261ffff16606082015260800190565b60405180910390a35b505080612b90906139cb565b90506129a4565b508051602082015161ffff91821691161080156040830152612bf4578163ffffffff167f6ec7e144a45fa03ed986874794df08b5b6bbbb27ed6454b4e6eaa74248b5e33342604051612beb91815260200190565b60405180910390a25b80516009805460208401516040909401511515640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff61ffff95861662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000090931695909416949094171791909116919091179055505050565b600060808260ff1610612c8b57612c8b6139fd565b50600160ff82161b82166fffffffffffffffffffffffffffffffff1615155b92915050565b600060808260ff1610612cc557612cc56139fd565b50600160ff919091161b1790565b3373ffffffffffffffffffffffffffffffffffffffff821603612d52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610346565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60005b6fffffffffffffffffffffffffffffffff821615612e0257612dee600183613a2c565b90911690612dfb816139cb565b9050612dcb565b919050565b8051516000901580612e1b57508151516080105b80612e2c5750602082015161ffff16155b80612e3d5750604082015161ffff16155b15612e4a57506000919050565b60008060008460000151516003612e619190613a55565b67ffffffffffffffff811115612e7957612e7961343c565b604051908082528060200260200182016040528015612ea2578160200160208202803683370190505b50905060005b8551518110156130a857600086600001518281518110612eca57612eca613850565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161480612f2b5750602081015173ffffffffffffffffffffffffffffffffffffffff16155b80612f4e5750604081015173ffffffffffffffffffffffffffffffffffffffff16155b80612f6e5750606081015160ff16158015612f6e5750608081015160ff16155b15612f80575060009695505050505050565b805183612f8e846003613a55565b612f99906000613a6c565b81518110612fa957612fa9613850565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910182015281015183612fdc846003613a55565b612fe7906001613a6c565b81518110612ff757612ff7613850565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015260408101518361302d846003613a55565b613038906002613a6c565b8151811061304857613048613850565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152606081015161307f9060ff1686613a6c565b9450806080015160ff16846130949190613a6c565b935050806130a19061387f565b9050612ea8565b5060005b815181101561316b5760008282815181106130c9576130c9613850565b6020026020010151905060008260016130e29190613a6c565b90505b83518110156131585783818151811061310057613100613850565b602002602001015173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361314857506000979650505050505050565b6131518161387f565b90506130e5565b5050806131649061387f565b90506130ac565b50846020015161ffff16831015801561318c5750846040015161ffff168210155b95945050505050565b6000602082840312156131a757600080fd5b5035919050565b600060208083528351808285015260005b818110156131db578581018301518582016040015282016131bf565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612e0257600080fd5b6000806040838503121561325157600080fd5b61325a8361321a565b946020939093013593505050565b600081518084526020808501945080840160005b838110156132ae57815173ffffffffffffffffffffffffffffffffffffffff168752958201959082019060010161327c565b509495945050505050565b60a0815260006132cc60a0830188613268565b82810360208481019190915287518083528882019282019060005b8181101561330957845163ffffffff16835293830193918301916001016132e7565b50508481036040860152875180825290820192508188019060005b8181101561334057825185529383019391830191600101613324565b50505061ffff8616606085015250905082151560808301525b9695505050505050565b8051606080845281518482018190526000926080916020918201918388019190865b828110156133ea578451805173ffffffffffffffffffffffffffffffffffffffff908116865283820151811684870152604080830151909116908601528781015160ff908116898701529087015116868501529381019360a090930192600101613385565b508781015161ffff81168a8301529550505060408601519350613359604088018561ffff169052565b600063ffffffff80861683528085166020840152506060604083015261318c6060830184613363565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516060810167ffffffffffffffff8111828210171561348e5761348e61343c565b60405290565b60405160a0810167ffffffffffffffff8111828210171561348e5761348e61343c565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156134fe576134fe61343c565b604052919050565b803560ff81168114612e0257600080fd5b803561ffff81168114612e0257600080fd5b6000602080838503121561353c57600080fd5b823567ffffffffffffffff8082111561355457600080fd5b8185019150606080838803121561356a57600080fd5b61357261346b565b83358381111561358157600080fd5b8401601f8101891361359257600080fd5b8035848111156135a4576135a461343c565b6135b2878260051b016134b7565b818152878101955060a091820283018801918b8311156135d157600080fd5b928801925b828410156136505780848d0312156135ee5760008081fd5b6135f6613494565b6135ff8561321a565b815261360c8a860161321a565b8a820152604061361d81870161321a565b9082015261362c858801613506565b87820152608061363d818701613506565b90820152875295880195928301926135d6565b508352506136619050848601613517565b8582015261367160408501613517565b6040820152979650505050505050565b60006040828403121561369357600080fd5b50919050565b600080602083850312156136ac57600080fd5b823567ffffffffffffffff808211156136c457600080fd5b818501915085601f8301126136d857600080fd5b8135818111156136e757600080fd5b8660206060830285010111156136fc57600080fd5b60209290920196919550909350505050565b6000806020838503121561372157600080fd5b823567ffffffffffffffff8082111561373957600080fd5b818501915085601f83011261374d57600080fd5b81358181111561375c57600080fd5b8660208260061b85010111156136fc57600080fd5b60006020828403121561378357600080fd5b61378c8261321a565b9392505050565b6060815260006137a66060830186613268565b61ffff94909416602083015250901515604090910152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600063ffffffff808316818103613809576138096137c1565b6001019392505050565b61ffff81811683821601908082111561382e5761382e6137c1565b5092915050565b61ffff82811682821603908082111561382e5761382e6137c1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036138b0576138b06137c1565b5060010190565b6000604082840312156138c957600080fd5b6040516040810181811067ffffffffffffffff821117156138ec576138ec61343c565b6040526138f88361321a565b8152602083013560208201528091505092915050565b60006060828403121561392057600080fd5b61392861346b565b6139318361321a565b8152602083013560208201526040830135801515811461395057600080fd5b60408201529392505050565b815173ffffffffffffffffffffffffffffffffffffffff1681526020808301519082015260408101612caa565b81810381811115612caa57612caa6137c1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600060ff821660ff81036139e1576139e16137c1565b60010192915050565b60208152600061378c6020830184613363565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6fffffffffffffffffffffffffffffffff82811682821603908082111561382e5761382e6137c1565b8082028115828204841417612caa57612caa6137c1565b80820180821115612caa57612caa6137c156fea164736f6c6343000813000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000700000000000000000000000023ccf5a7309a9ba850f877313cff35b6903609440000000000000000000000000b59fa90337b8c1dfcf83a60be93df36d3022bf2000000000000000000000000e1adbb7ccf4a7ef07078475932cb99649cb881dd00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000eaa2691fe9c8cef93ccbc1b4b1e4f3ce026789420000000000000000000000000cb702a32e380e6bbe578d73928db35f27dfd0d100000000000000000000000037a929ecc35da8c0fa4656b41e8d7558916d48db00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f5d5840ce35ed1e408b26df1f5eb74d6641dfae600000000000000000000000038ea6cea45d30f9a4ba1b7fa28ce840135fe3118000000000000000000000000c703725fd00dff4c2e1fa36a0d8e926f82d00413000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000009f199d8a106a220d483bd548ef862b15ecd3bfac0000000000000000000000001dca94f408bc850524a320988721642d64870b6200000000000000000000000066d1e2852cfa850dcf534ef6fd9300cd6346b2ab000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000008749f722d74b2a8d9af5e4f8011287da3dc058a1000000000000000000000000699e53aba4543726e487771def1781c89dbd30cf0000000000000000000000000114dea7556499a96b47447825d1b975ceb7ef1b000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000bc0fb2faa891d3c48e494bffd3b0bcd53b99ce500000000000000000000000012119a85235939c6d28182f198add16e9c1d7b110000000000000000000000005e33ecc8f41dc82a1f5ae6b9d483fcb8cff177c100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000d6c690713dc1b3995c200e600d3a00b30299ae08000000000000000000000000c5f450a270dcefdcb990851a280a8a2a3d9403df0000000000000000000000002e755320044a2677617dd2a341e6a540f0a1669a00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001
-----Decoded View---------------
Arg [0] : config (tuple):
Arg [1] : voters (tuple[]):
Arg [1] : blessVoteAddr (address): 0x23ccf5a7309A9bA850F877313CFF35B690360944
Arg [2] : curseVoteAddr (address): 0x0B59Fa90337B8c1DfcF83A60be93Df36d3022bf2
Arg [3] : curseUnvoteAddr (address): 0xE1adBB7CCF4A7eF07078475932CB99649cb881dd
Arg [4] : blessWeight (uint8): 1
Arg [5] : curseWeight (uint8): 1
,
Arg [1] : blessVoteAddr (address): 0xeAA2691fE9C8CEF93CcBc1b4B1E4F3ce02678942
Arg [2] : curseVoteAddr (address): 0x0cb702A32e380e6bBE578d73928db35F27Dfd0d1
Arg [3] : curseUnvoteAddr (address): 0x37a929EcC35Da8C0Fa4656b41E8d7558916D48dB
Arg [4] : blessWeight (uint8): 1
Arg [5] : curseWeight (uint8): 1
,
Arg [1] : blessVoteAddr (address): 0xF5d5840ce35ED1E408B26df1f5Eb74D6641DfAe6
Arg [2] : curseVoteAddr (address): 0x38eA6cEa45D30F9a4Ba1B7fa28CE840135Fe3118
Arg [3] : curseUnvoteAddr (address): 0xc703725FD00dfF4c2E1fa36A0D8E926f82d00413
Arg [4] : blessWeight (uint8): 1
Arg [5] : curseWeight (uint8): 1
,
Arg [1] : blessVoteAddr (address): 0x9F199d8A106a220D483BD548Ef862b15eCd3BFAc
Arg [2] : curseVoteAddr (address): 0x1DCA94f408BC850524a320988721642D64870B62
Arg [3] : curseUnvoteAddr (address): 0x66D1E2852CFa850DcF534Ef6fd9300cD6346b2Ab
Arg [4] : blessWeight (uint8): 1
Arg [5] : curseWeight (uint8): 1
,
Arg [1] : blessVoteAddr (address): 0x8749F722d74b2a8d9AF5e4F8011287DA3DC058a1
Arg [2] : curseVoteAddr (address): 0x699E53aba4543726E487771def1781C89Dbd30Cf
Arg [3] : curseUnvoteAddr (address): 0x0114dEa7556499A96b47447825d1b975cEb7Ef1B
Arg [4] : blessWeight (uint8): 1
Arg [5] : curseWeight (uint8): 1
,
Arg [1] : blessVoteAddr (address): 0x0bc0fb2faa891D3C48e494BfFd3B0BCD53B99cE5
Arg [2] : curseVoteAddr (address): 0x12119A85235939C6d28182f198AdD16e9C1d7B11
Arg [3] : curseUnvoteAddr (address): 0x5E33EcC8F41DC82a1F5aE6B9d483fcb8Cff177C1
Arg [4] : blessWeight (uint8): 1
Arg [5] : curseWeight (uint8): 1
,
Arg [1] : blessVoteAddr (address): 0xd6c690713DC1B3995C200E600D3A00b30299Ae08
Arg [2] : curseVoteAddr (address): 0xC5f450a270DceFdcb990851A280a8A2A3d9403Df
Arg [3] : curseUnvoteAddr (address): 0x2E755320044A2677617dD2a341e6A540F0a1669a
Arg [4] : blessWeight (uint8): 1
Arg [5] : curseWeight (uint8): 1
Arg [2] : blessWeightThreshold (uint16): 2
Arg [3] : curseWeightThreshold (uint16): 2
-----Encoded View---------------
40 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [5] : 00000000000000000000000023ccf5a7309a9ba850f877313cff35b690360944
Arg [6] : 0000000000000000000000000b59fa90337b8c1dfcf83a60be93df36d3022bf2
Arg [7] : 000000000000000000000000e1adbb7ccf4a7ef07078475932cb99649cb881dd
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [10] : 000000000000000000000000eaa2691fe9c8cef93ccbc1b4b1e4f3ce02678942
Arg [11] : 0000000000000000000000000cb702a32e380e6bbe578d73928db35f27dfd0d1
Arg [12] : 00000000000000000000000037a929ecc35da8c0fa4656b41e8d7558916d48db
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [15] : 000000000000000000000000f5d5840ce35ed1e408b26df1f5eb74d6641dfae6
Arg [16] : 00000000000000000000000038ea6cea45d30f9a4ba1b7fa28ce840135fe3118
Arg [17] : 000000000000000000000000c703725fd00dff4c2e1fa36a0d8e926f82d00413
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [20] : 0000000000000000000000009f199d8a106a220d483bd548ef862b15ecd3bfac
Arg [21] : 0000000000000000000000001dca94f408bc850524a320988721642d64870b62
Arg [22] : 00000000000000000000000066d1e2852cfa850dcf534ef6fd9300cd6346b2ab
Arg [23] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [24] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [25] : 0000000000000000000000008749f722d74b2a8d9af5e4f8011287da3dc058a1
Arg [26] : 000000000000000000000000699e53aba4543726e487771def1781c89dbd30cf
Arg [27] : 0000000000000000000000000114dea7556499a96b47447825d1b975ceb7ef1b
Arg [28] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [29] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [30] : 0000000000000000000000000bc0fb2faa891d3c48e494bffd3b0bcd53b99ce5
Arg [31] : 00000000000000000000000012119a85235939c6d28182f198add16e9c1d7b11
Arg [32] : 0000000000000000000000005e33ecc8f41dc82a1f5ae6b9d483fcb8cff177c1
Arg [33] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [34] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [35] : 000000000000000000000000d6c690713dc1b3995c200e600d3a00b30299ae08
Arg [36] : 000000000000000000000000c5f450a270dcefdcb990851a280a8a2a3d9403df
Arg [37] : 0000000000000000000000002e755320044a2677617dd2a341e6a540f0a1669a
Arg [38] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [39] : 0000000000000000000000000000000000000000000000000000000000000001
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.