More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,026 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim | 21758375 | 6 days ago | IN | 0 ETH | 0.00051473 | ||||
Claim | 21758367 | 6 days ago | IN | 0 ETH | 0.00061171 | ||||
Claim | 21750017 | 7 days ago | IN | 0 ETH | 0.00076452 | ||||
Claim | 21734862 | 9 days ago | IN | 0 ETH | 0.00050029 | ||||
Claim | 21734854 | 9 days ago | IN | 0 ETH | 0.0006361 | ||||
Claim | 21715157 | 12 days ago | IN | 0 ETH | 0.00124443 | ||||
Claim | 21715084 | 12 days ago | IN | 0 ETH | 0.00122436 | ||||
Claim | 21709813 | 12 days ago | IN | 0 ETH | 0.00223856 | ||||
Claim | 21706103 | 13 days ago | IN | 0 ETH | 0.00117329 | ||||
Claim | 21705654 | 13 days ago | IN | 0 ETH | 0.00123576 | ||||
Claim | 21702766 | 13 days ago | IN | 0 ETH | 0.00202135 | ||||
Claim | 21701451 | 13 days ago | IN | 0 ETH | 0.00221783 | ||||
Claim | 21700766 | 14 days ago | IN | 0 ETH | 0.00133235 | ||||
Claim | 21700274 | 14 days ago | IN | 0 ETH | 0.00145647 | ||||
Claim | 21699613 | 14 days ago | IN | 0 ETH | 0.00126307 | ||||
Claim | 21699608 | 14 days ago | IN | 0 ETH | 0.00025494 | ||||
Claim | 21699606 | 14 days ago | IN | 0 ETH | 0.00168627 | ||||
Claim | 21699444 | 14 days ago | IN | 0 ETH | 0.00139089 | ||||
Claim | 21699294 | 14 days ago | IN | 0 ETH | 0.00108805 | ||||
Claim | 21699173 | 14 days ago | IN | 0 ETH | 0.00185187 | ||||
Set Snapshot Id ... | 21699142 | 14 days ago | IN | 0 ETH | 0.01882626 | ||||
Close Event | 21699141 | 14 days ago | IN | 0 ETH | 0.01438698 | ||||
Claim | 21692653 | 15 days ago | IN | 0 ETH | 0.00130827 | ||||
Open Event | 21683795 | 16 days ago | IN | 0 ETH | 0.01086663 | ||||
Add Pools | 21683782 | 16 days ago | IN | 0 ETH | 0.00306746 |
Latest 20 internal transactions
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
21683782 | 16 days ago | Contract Creation | 0 ETH | |||
21439233 | 50 days ago | Contract Creation | 0 ETH | |||
21171164 | 88 days ago | Contract Creation | 0 ETH | |||
20936756 | 120 days ago | Contract Creation | 0 ETH | |||
20754271 | 146 days ago | Contract Creation | 0 ETH | |||
20379415 | 198 days ago | Contract Creation | 0 ETH | |||
20177910 | 226 days ago | Contract Creation | 0 ETH | |||
19971615 | 255 days ago | Contract Creation | 0 ETH | |||
19907139 | 264 days ago | Contract Creation | 0 ETH | |||
19682472 | 295 days ago | Contract Creation | 0 ETH | |||
19485733 | 323 days ago | Contract Creation | 0 ETH | |||
19279471 | 352 days ago | Contract Creation | 0 ETH | |||
19079274 | 380 days ago | Contract Creation | 0 ETH | |||
18794982 | 420 days ago | Contract Creation | 0 ETH | |||
18480376 | 464 days ago | Contract Creation | 0 ETH | |||
18137373 | 512 days ago | Contract Creation | 0 ETH | |||
17538156 | 596 days ago | Contract Creation | 0 ETH | |||
17213698 | 642 days ago | Contract Creation | 0 ETH | |||
17213698 | 642 days ago | Contract Creation | 0 ETH | |||
17213698 | 642 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
KarateDAOManager
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
Yes with 1 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: Unlicense pragma solidity ^0.8.0; import "@openzeppelin/contracts/access/AccessControlEnumerable.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "./Token.sol"; import "./KarateClaim.sol"; import "./KaratePool.sol"; import "./Signatures.sol"; interface IUpgradableDAOContract { function finalizeUpgrade() external returns (bool); } interface ISignatureNonceStorage { function sigNonceMapping(uint256 nonce) external returns (bool); function setSigNonceMapping(uint256 nonce) external; } contract KarateDAOStorage is Ownable { struct Member { address addr; string ipfs_metadata; bool isActive; } struct EventCard { uint256 idx_pos; bool exists; uint256 eventStart; string info_ipfs; string results_ipfs; string snapshotProposalIPFS; bool deleted; uint64 outcomes; uint256 snapshotId; } struct Match { address fighter_1; address fighter_2; uint8 result; } mapping(uint256 => bool) public sigNonceMapping; mapping(address => Member) public membersMapping; mapping(uint256 => mapping(address => bool) ) public eventNumToStakeholdersMapping; mapping(uint256 => Match[]) public eventNumToMatches; mapping(uint256 => address[]) public eventNumToStakeholderAddresses; KaratePool[] public karatePools; mapping(uint256 => KarateClaim) public snapshotIdToClaimContract; mapping(string => uint256) public proposalIdToSnapshotId; mapping(uint256 => uint256) public snapshotIdToEventNum; mapping(uint256 => uint64) public snapshotIdToMatchOutcome; mapping(uint256 => uint256[]) public snapshotIdToVoteBalances; mapping(uint256 => uint256) public totalVotingBalanceAtSnapshotId; mapping( address => mapping(uint256 => bool) ) public claimedSnapshotIds; mapping(uint256 => bytes) public eventMetadata; //Should very rarely be used, privilege new storage instances over this in designs mapping(bytes32 => bytes32) arbitraryMapping; uint256 public nextPool; uint256 public _nonce; EventCard[] public events; address public oracleService; function incrementPool() onlyOwner public { nextPool += 1; } function setSigNonceMapping(uint256 nonce) onlyOwner public { sigNonceMapping[nonce] = true; } function setSnapshotIdToClaimContract(uint256 snapshotId, KarateClaim karateClaim) onlyOwner public { snapshotIdToClaimContract[snapshotId] = karateClaim; } function getSnapshotIdToClaimContract(uint256 snapshotId) public view returns (KarateClaim karateClaim){ return snapshotIdToClaimContract[snapshotId]; } function setSnapshotIdToEventNum(uint256 snapshotId, uint256 eventNum) onlyOwner public { snapshotIdToEventNum[snapshotId] = eventNum; } function getSnapshotIdToEvent(uint256 snapshotId) public view returns (EventCard memory eventCard) { return events[ snapshotIdToEventNum[snapshotId] ]; } function setProposalIdToSnapshotId(string calldata proposalCID, uint256 snapshotId) onlyOwner public { proposalIdToSnapshotId[proposalCID] = snapshotId; } function getProposalIdToSnapshotId(string calldata proposalCID) onlyOwner public view returns (uint256 snapshotId) { return proposalIdToSnapshotId[proposalCID]; } function setEventMetadata(uint256 eventNum, bytes memory metadata) onlyOwner public { eventMetadata[eventNum] = metadata; } function getEventMetadata(uint256 eventNum) onlyOwner public view returns (bytes memory metadata) { return eventMetadata[eventNum]; } function setArbitaryMapping(bytes32 key, bytes32 data) onlyOwner public { arbitraryMapping[key] = data; } function getArbitraryMapping(bytes32 key) onlyOwner public view returns (bytes32 data) { return arbitraryMapping[key]; } function setOracleService(address _oracleService) onlyOwner external { oracleService = _oracleService; } function getEvent(uint256 eventCardIdx) public view returns (EventCard memory eventCard) { return events[eventCardIdx]; } function setEvent(EventCard memory eventCard) onlyOwner public returns (uint256 eventCardIdx) { if(eventCard.exists) { events[eventCard.idx_pos] = eventCard; return eventCard.idx_pos; } eventCard.idx_pos = events.length; eventCard.exists = true; events.push(eventCard); return eventCard.idx_pos; } function eventsLength() public view returns (uint256 eventsLen) { return events.length; } function setStakeHolders(uint256 eventIdx, address[] calldata stakeholders) onlyOwner public { for(uint256 i=0; i < stakeholders.length; i++) { eventNumToStakeholdersMapping[eventIdx][stakeholders[i]] = true; } eventNumToStakeholderAddresses[eventIdx] = stakeholders; } function getStakeHolders(uint256 eventIdx) public view returns (address[] memory stakeholders) { return eventNumToStakeholderAddresses[eventIdx]; } function setMatch(uint256 eventIdx, Match memory matchStruct, uint256 matchIdx) onlyOwner public { eventNumToMatches[eventIdx][matchIdx] = matchStruct; } function setMatch(uint256 eventIdx, Match memory matchCard) onlyOwner public returns (uint256 matchCardIdx) { eventNumToMatches[eventIdx].push(matchCard); return eventNumToMatches[eventIdx].length - 1; } function getMatches(uint256 eventIdx) public view returns (Match[] memory matches) { return eventNumToMatches[eventIdx]; } function setMember(Member calldata member) onlyOwner public { membersMapping[member.addr] = member; } function getMember(address memberAddr) public view returns (Member memory member) { return membersMapping[memberAddr]; } function setClaimedSnapshotId(address voter, uint256 _claimedSnapshotId) public onlyOwner { claimedSnapshotIds[voter][_claimedSnapshotId] = true; } function setSnapshotIdToVoteBalances(uint256 snapshotId, uint256[] calldata voteBals) public onlyOwner { snapshotIdToVoteBalances[snapshotId] = voteBals; } function getSnapshotIdToVoteBalances(uint256 snapshotId) public view returns (uint256[] memory voteBalances) { return snapshotIdToVoteBalances[snapshotId]; } function addKaratePool(KaratePool karatePool) onlyOwner public { karatePools.push(karatePool); } function getKaratePool(uint256 karatePoolIdx) public view returns (KaratePool karatePool) { return karatePools[karatePoolIdx]; } function setNonce(uint256 nonce) onlyOwner public { _nonce = nonce; return; } } contract KarateDAOManager is AccessControlEnumerable { bytes32 public constant KC_DELEGATE_ROLE = keccak256("KC_DELEGATE_ROLE"); bytes32 public constant KC_FIGHTER_ROLE = keccak256("KC_FIGHTER_ROLE"); bytes32 public constant KC_JUDGE_ROLE = keccak256("KC_JUDGE_ROLE"); bytes32 public constant KC_HEAD_JUDGE_ROLE = keccak256("KC_HEAD_JUDGE_ROLE"); bytes32 public constant KC_ORACLE_SERVICE_ROLE = keccak256("KC_ORACLE_SERVICE_ROLE"); bytes32 public constant KC_MARKETING_MANAGER_ROLE = keccak256("KC_MARKETING_MANAGER_ROLE"); mapping(bytes32 => uint256) public roleHierarchy; bytes32[] public AVAIL_ROLES = [DEFAULT_ADMIN_ROLE, KC_DELEGATE_ROLE, KC_FIGHTER_ROLE, KC_JUDGE_ROLE, KC_HEAD_JUDGE_ROLE]; bytes32 NO_ROLE_VALUE = ~bytes32(0); string constant MEMBER_DNE_ERR = "ME1"; //"Member Does not Exist"; string constant MEMBER_DE_ERR = "ME2"; //"Member Already Exists"; string constant MEMBER_PERM_INVALID = "ME3"; //"Member's Permission is invalid"; string constant UPGRADE_REQ_ERR = "SC1";//"Storage Contract's owner differs from Smart Contract"; uint256 internal _nonce; uint8 internal minEventDelegateCount; uint8 internal minEventJudgeCount; modifier requireRole(bytes32 role) { require( hasRole( DEFAULT_ADMIN_ROLE, _msgSender() ) || hasRole( role, _msgSender() ), MEMBER_PERM_INVALID ); _; } modifier preventReplay(uint256 nonce, address nonceStorageAddress) { require(ISignatureNonceStorage(nonceStorageAddress).sigNonceMapping(nonce) == false, "SIGUSED"); _; ISignatureNonceStorage(nonceStorageAddress).setSigNonceMapping(nonce); } KarateDAOStorage public daoStorage; KarateERC20 public token; KarateClaimFactory kcFactory; bool public eventOpened; uint256 public currentEvent; using Signatures for Signatures.SigData; event NewFightEvent(uint256 indexed eventNum, KarateDAOStorage.EventCard eventCard); event DeletedFightEvent(uint256 indexed eventNum, KarateDAOStorage.EventCard eventCard); event NewEventResult(address indexed memberAddr, string ipfs, uint256 indexed eventNum); event NewEventSnapshot(uint256 indexed eventNum, uint256 indexed snapshotId, uint256 indexed timestamp); event NewMember(address indexed memberAddr, string indexed ipfs, KarateDAOStorage.Member member); event Error(string msg); error UpgradeFailed(address currentOwner, address contractAddress); error MismatchedEventHash(string eventInfoIpfs, bytes32 expectedHash, bytes32 receivedHash); /// @custom:oz-upgrades-unsafe-allow constructorgNonceMapping* function _addPools(uint256[] memory prizePoolAmounts) internal { for(uint256 i=0; i < prizePoolAmounts.length; i++) { KaratePool kp = new KaratePool(address(token), address(daoStorage)); token.transfer(address(kp), prizePoolAmounts[i]); daoStorage.addKaratePool(kp); } } constructor(uint256[] memory prizePoolAmounts, KarateClaimFactory _kcFactory) { _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(KC_DELEGATE_ROLE, _msgSender()); _nonce = uint(keccak256(abi.encodePacked(_msgSender(), blockhash(block.number - 1)))); roleHierarchy[DEFAULT_ADMIN_ROLE] = 1; roleHierarchy[KC_DELEGATE_ROLE] = 2; roleHierarchy[KC_MARKETING_MANAGER_ROLE] = 2; minEventDelegateCount = 3; minEventJudgeCount = 3; kcFactory = _kcFactory; daoStorage = new KarateDAOStorage(); token = new KarateERC20(); _addPools(prizePoolAmounts); } function addPools(uint256[] memory prizePoolAmounts) public requireRole(DEFAULT_ADMIN_ROLE) { _addPools(prizePoolAmounts); } function setMinEventDelegateCount(uint8 count) public requireRole(DEFAULT_ADMIN_ROLE) { minEventDelegateCount = count; } function setMinEventJudgeCount(uint8 count) public requireRole(DEFAULT_ADMIN_ROLE) { minEventJudgeCount = count; } function createEventCard(uint256 eventStart, string calldata info_ipfs, address[] calldata stakeholders) external virtual requireRole(KC_DELEGATE_ROLE) { KarateDAOStorage.EventCard memory eventCard = KarateDAOStorage.EventCard(0, false, eventStart, info_ipfs, "", "", false, 0, 0); eventCard.eventStart = eventStart; eventCard.info_ipfs = info_ipfs; uint256 eventIdx = daoStorage.setEvent(eventCard); daoStorage.setStakeHolders(eventIdx, stakeholders); emit NewFightEvent(eventIdx, eventCard); } function addMember(address addr, bytes32 role) public virtual requireRole(KC_DELEGATE_ROLE) { string memory empty_ipfs_metadata; addMemberInternal(addr, role, empty_ipfs_metadata); } function addMember(address addr, bytes32 role, string calldata ipfs_metadata) external virtual requireRole(KC_DELEGATE_ROLE) { addMemberInternal(addr, role, ipfs_metadata); } function getRoleHierarchy(bytes32 role) internal view returns (uint256 roleNum) { return roleHierarchy[role] > 0 ? roleHierarchy[role] : 9999; } function addMemberInternal(address addr, bytes32 role, string memory ipfs_metadata) internal { require(!hasRole(role, addr), MEMBER_DE_ERR); require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender) || getRoleHierarchy( KC_DELEGATE_ROLE ) < getRoleHierarchy(role), "NOPERM"); _grantRole(role, addr); KarateDAOStorage.Member memory newMember = KarateDAOStorage.Member(addr, ipfs_metadata, true); daoStorage.setMember(newMember); emit NewMember(newMember.addr, newMember.ipfs_metadata, newMember); } function deleteMember(address addr) public requireRole(DEFAULT_ADMIN_ROLE) { KarateDAOStorage.Member memory member = daoStorage.getMember(addr); require(member.isActive == true, "MEMDEL"); //deleted already /* bytes32[] memory roles = getMemberRoles(addr); bytes32[] senderRoles = getMemberRoles(msg.sender); uint256 lowestRole = 9999; for(uint256 i=0; i < senderRoles.length; i++) { if(senderRoles[i] == NO_ROLE_VALUE) { continue; } if(getRoleHierarchy(senderRoles[i]) < lowestRole) { lowestRole = getRoleHierarchy(senderRoles[i]); } } for(uint256 k=0; k < roles.length; k++) { if(roles[k] == NO_ROLE_VALUE) { continue; } if(!isSenderAdmin && getRoleHierarchy(roles[k]) <= lowestRole) { revert("MEMLOWR"); } else { _revokeRole(roles[k], addr); } } */ member.isActive = false; daoStorage.setMember(member); } function finalizeUpgrade() external virtual requireRole(DEFAULT_ADMIN_ROLE) returns (bool success) { daoStorage.setNonce(_nonce); return true; } function populateMatchData(KarateDAOStorage.EventCard memory eventCard, address[] calldata fighters) internal virtual { require(fighters.length % 2 == 0, 'EVQTY'); //Must be even quantity of fighters for(uint i=0; i < fighters.length; i+=2) { address fighterA = fighters[i]; address fighterB = fighters[i+1]; require(hasRole(KC_FIGHTER_ROLE, fighterA) && hasRole(KC_FIGHTER_ROLE, fighterB), 'BADROLE');//Fighters must have the correct role KarateDAOStorage.Match memory matchCard = KarateDAOStorage.Match(fighters[i], fighters[i+1], 0); daoStorage.setMatch(eventCard.idx_pos, matchCard); } } function createSnapshot(uint256 eventNum) internal returns (uint256 snapshotId) { //external virtual requireRole(KC_DELEGATE_ROLE) returns (uint256 unixTime) { uint256 _snapshotId = token.createSnapshot(); daoStorage.setSnapshotIdToEventNum(_snapshotId, eventNum); emit NewEventSnapshot(eventNum, _snapshotId, block.timestamp); return _snapshotId; } function getEventStakeholders(uint256 eventNum) public view returns (address[] memory) { return daoStorage.getStakeHolders(eventNum); } function validateOpenEventSignatures(uint256 eventNum, bytes32 eventCardHash, Signatures.SigData[] calldata delegates) internal view { uint8 approvedDelegates = 0; address[] memory signedDelegates = new address[](delegates.length); for(uint8 i=0; i < delegates.length; i+=1) { address signer = delegates[i].verifyMessage(eventCardHash); require(signer != address(0), "SIG0"); // Signature cannot be 0 require(daoStorage.eventNumToStakeholdersMapping(eventNum, signer), 'NSE'); //Not a stakeholder for the event require(hasRole(KC_DELEGATE_ROLE, signer), 'NDR'); //Not Delegate Role bool alreadyExists; uint256 pos; while(pos < signedDelegates.length) { if(signedDelegates[pos] == address(0)){ break; } if(signer == signedDelegates[pos]) { alreadyExists = true; break; } pos++; } if(alreadyExists) { continue; } approvedDelegates += 1; signedDelegates[pos] = signer; } require(approvedDelegates >= minEventDelegateCount, 'NEA'); //Not enough approvals } function openEvent(uint256 eventNum, string calldata snapshotProposalIPFSCID, address[] calldata fighters, uint256 nonce, Signatures.SigData[] calldata delegates) preventReplay(nonce, address(daoStorage)) requireRole(KC_DELEGATE_ROLE) external virtual { require(!eventOpened, 'ALRDYOPN'); currentEvent = eventNum; KarateDAOStorage.EventCard memory eventCard = daoStorage.getEvent(eventNum); require(eventCard.exists == true, 'Event Number DNE'); bytes32 eventCardHash = keccak256(abi.encodePacked(eventCard.info_ipfs, snapshotProposalIPFSCID, fighters, nonce)); validateOpenEventSignatures(eventNum, eventCardHash, delegates); uint256 snapshotId = createSnapshot(eventNum); eventCard.snapshotId = snapshotId; eventCard.snapshotProposalIPFS = snapshotProposalIPFSCID; daoStorage.setEvent(eventCard); populateMatchData(eventCard, fighters); eventOpened = true; } struct SigToScore { Signatures.SigData delegateSig; string resultIPFSCID; uint64 matchOutcomes; } function flattenGetMatches(uint256 eventNum) internal view returns (address[] memory matches) { KarateDAOStorage.Match[] memory typedMatches = daoStorage.getMatches(eventNum); matches = new address[](typedMatches.length*2); uint256 matchIdx; for(uint256 i=0; i < typedMatches.length; i++) { matches[matchIdx] = typedMatches[i].fighter_1; matches[matchIdx + 1] = typedMatches[i].fighter_2; matchIdx += 2; } } struct DidSignAndPos { uint256 pos; bool didSign; } function checkIfSignedAlready(address signer, address[] memory signedDelegates) internal pure returns (DidSignAndPos memory didSignAndPos) { while(didSignAndPos.pos < signedDelegates.length) { if(signedDelegates[didSignAndPos.pos] == address(0)){ break; } if(signer == signedDelegates[didSignAndPos.pos]) { didSignAndPos.didSign = true; break; } didSignAndPos.pos++; } } function validateCloseEventSignatures(uint256 eventNum, string memory info_ipfs, uint256 nonce, SigToScore[] memory delegateAndScores) internal returns (SigToScore memory headJudgeSigToScore) { uint8 approvedDelegates = 0; bool commissionApproved = false; address[] memory signedDelegates = new address[](delegateAndScores.length); for(uint8 i=0; i < delegateAndScores.length; i+=1) { SigToScore memory sigToScore = delegateAndScores[i]; bool isFinalResult = sigToScore.matchOutcomes > 0; bytes32 eventCardHash; if(isFinalResult) { eventCardHash = keccak256(abi.encodePacked(info_ipfs, sigToScore.resultIPFSCID, sigToScore.matchOutcomes, nonce)); } else { eventCardHash = keccak256(abi.encodePacked(info_ipfs, sigToScore.resultIPFSCID, nonce)); } address signer = sigToScore.delegateSig.verifyMessage(eventCardHash); DidSignAndPos memory didSignAndPos = checkIfSignedAlready(signer, signedDelegates); if(didSignAndPos.didSign) { continue; } require(daoStorage.eventNumToStakeholdersMapping(eventNum, signer), 'NSE'); //Not a stakeholder for the event bool isHeadJudge = hasRole(KC_HEAD_JUDGE_ROLE, signer); require(hasRole(KC_JUDGE_ROLE, signer) || isHeadJudge, 'NJR');//Not Judge Role if(isHeadJudge) { headJudgeSigToScore = sigToScore; commissionApproved = true; } else { approvedDelegates += 1; } signedDelegates[didSignAndPos.pos] = signer; emit NewEventResult(signer, sigToScore.resultIPFSCID, eventNum); } require(approvedDelegates >= minEventJudgeCount && commissionApproved, 'NEA');//Not enough approvals } function closeEvent(uint256 eventNum, uint256 nonce, SigToScore[] memory delegateAndScores) preventReplay(nonce, address(daoStorage)) requireRole(KC_DELEGATE_ROLE) external virtual { //(bool memory exists, string memory info_ipfs, mapping(address => bool) memory stakeholders) = daoStorage.events(eventNum); //require(exists == true, 'Event Number DNE'); require(eventOpened, 'NOEVENTOPEN'); require(eventNum == currentEvent, "EVNTNOPN"); KarateDAOStorage.EventCard memory eventCard = daoStorage.getEvent(eventNum); SigToScore memory headJudgeSigToScore = validateCloseEventSignatures(eventNum, eventCard.info_ipfs, nonce, delegateAndScores); eventCard.results_ipfs = headJudgeSigToScore.resultIPFSCID; eventCard.outcomes = headJudgeSigToScore.matchOutcomes; daoStorage.setEvent(eventCard); KaratePool pool = daoStorage.getKaratePool(daoStorage.nextPool()); daoStorage.incrementPool(); address[] memory oracleServices = new address[](getRoleMemberCount(KC_ORACLE_SERVICE_ROLE)); require(oracleServices.length > 0, "BADORACLLEN"); for(uint256 idx=0; idx < getRoleMemberCount(KC_ORACLE_SERVICE_ROLE); idx++) { oracleServices[idx] = getRoleMember(KC_ORACLE_SERVICE_ROLE, idx); } KarateClaim claimAddress = kcFactory.createKarateClaimContract(ClaimConstructorArgs(address(this), address(token), address(pool), eventCard.snapshotId, oracleServices, eventCard.outcomes, flattenGetMatches(eventNum))); pool.createAllowance(address(claimAddress)); daoStorage.setSnapshotIdToClaimContract(eventCard.snapshotId, claimAddress); eventOpened = false; } function upgradeDao(address new_contract_addr) external virtual requireRole(DEFAULT_ADMIN_ROLE) { IUpgradableDAOContract newDAO = IUpgradableDAOContract(new_contract_addr); daoStorage.transferOwnership(new_contract_addr); token.transferOwnership(new_contract_addr); token.transfer( new_contract_addr, token.balanceOf( address(this) ) ); if(newDAO.finalizeUpgrade()) return; revert UpgradeFailed(daoStorage.owner(), _msgSender()); } function getMemberRoles(address member) public view returns (bytes32[] memory roles) { bytes32[] memory rolesArr = new bytes32[](AVAIL_ROLES.length); for(uint256 i=0; i < AVAIL_ROLES.length; i++) { if( hasRole(AVAIL_ROLES[i], member) ) { rolesArr[i] = AVAIL_ROLES[i]; } else { rolesArr[i] = NO_ROLE_VALUE; } } return rolesArr; } function setEventViewLink(uint256 eventNum, string memory viewLink) external virtual requireRole(KC_DELEGATE_ROLE) { daoStorage.setEventMetadata(eventNum, abi.encode(viewLink)); } function getEventViewLink(uint256 eventNum) public view returns (string memory viewLink) { return abi.decode(daoStorage.getEventMetadata(eventNum), (string)); } function isEventClaimed(address claimant, uint256 eventNum) public view returns (bool isClaimed) { return daoStorage.claimedSnapshotIds(claimant, daoStorage.getEvent(eventNum).snapshotId); } function deleteEvent(uint256 eventCardNum) external virtual requireRole(DEFAULT_ADMIN_ROLE) returns (bool successful) { KarateDAOStorage.EventCard memory eventCard = daoStorage.getEvent(eventCardNum); eventCard.deleted = true; daoStorage.setEvent(eventCard); emit DeletedFightEvent(eventCardNum, eventCard); return true; } function setSnapshotIdToVoteBalances(uint256 snapshotId, uint256[] calldata voteBals) external requireRole(KC_ORACLE_SERVICE_ROLE) { uint256 matchCount = daoStorage.getMatches( daoStorage.snapshotIdToEventNum(snapshotId) ).length; require(voteBals.length == matchCount*2, "LENDNE"); daoStorage.setSnapshotIdToVoteBalances(snapshotId, voteBals); KarateClaim(daoStorage.getSnapshotIdToClaimContract(snapshotId)).setSnapshotIdToVoteBalances(voteBals); } function setTotalClaimable(uint256 snapshotId, uint256[] memory amountClaimable) external requireRole(KC_ORACLE_SERVICE_ROLE) { KarateClaim(daoStorage.getSnapshotIdToClaimContract(snapshotId)).setTotalClaimable(amountClaimable); } function transfer(address recipient, uint256 amount) external requireRole(DEFAULT_ADMIN_ROLE) { token.transfer(recipient, amount); } function mint(address recipient, uint256 amount) external requireRole(DEFAULT_ADMIN_ROLE) { token.mint(recipient, amount); } function claim(uint256[] calldata votesPerOutcome, uint64[] calldata outcomes, uint256[] calldata snapshotIds, Signatures.SigData[] calldata signatures) external { require(!hasRole(KC_ORACLE_SERVICE_ROLE, msg.sender), 'ONEC'); //Oracle service cannot claim its own rewards; for(uint256 snapIdx = 0; snapIdx < snapshotIds.length; snapIdx++) { KarateClaim karateClaim = daoStorage.getSnapshotIdToClaimContract(snapshotIds[snapIdx]); uint256 totalOwedRewards = karateClaim.claim(msg.sender, votesPerOutcome, outcomes, snapshotIds, signatures); daoStorage.setClaimedSnapshotId(msg.sender, snapshotIds[snapIdx]); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol) pragma solidity ^0.8.0; import "./IAccessControl.sol"; import "../utils/Context.sol"; import "../utils/Strings.sol"; import "../utils/introspection/ERC165.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(account), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControlEnumerable.sol) pragma solidity ^0.8.0; import "./IAccessControlEnumerable.sol"; import "./AccessControl.sol"; import "../utils/structs/EnumerableSet.sol"; /** * @dev Extension of {AccessControl} that allows enumerating the members of each role. */ abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl { using EnumerableSet for EnumerableSet.AddressSet; mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view virtual override returns (address) { return _roleMembers[role].at(index); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view virtual override returns (uint256) { return _roleMembers[role].length(); } /** * @dev Overload {_grantRole} to track enumerable memberships */ function _grantRole(bytes32 role, address account) internal virtual override { super._grantRole(role, account); _roleMembers[role].add(account); } /** * @dev Overload {_revokeRole} to track enumerable memberships */ function _revokeRole(bytes32 role, address account) internal virtual override { super._revokeRole(role, account); _roleMembers[role].remove(account); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControlEnumerable.sol) pragma solidity ^0.8.0; import "./IAccessControl.sol"; /** * @dev External interface of AccessControlEnumerable declared to support ERC165 detection. */ interface IAccessControlEnumerable is IAccessControl { /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) external view returns (address); /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; import "./IERC20.sol"; import "./extensions/IERC20Metadata.sol"; import "../../utils/Context.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol) pragma solidity ^0.8.0; import "../ERC20.sol"; import "../../../utils/Context.sol"; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20Burnable is Context, ERC20 { /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { _spendAllowance(account, _msgSender(), amount); _burn(account, amount); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.2) (token/ERC20/extensions/ERC20Pausable.sol) pragma solidity ^0.8.0; import "../ERC20.sol"; import "../../../security/Pausable.sol"; /** * @dev ERC20 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. * * IMPORTANT: This contract does not include public pause and unpause functions. In * addition to inheriting this contract, you must define both functions, invoking the * {Pausable-_pause} and {Pausable-_unpause} internal functions, with appropriate * access control, e.g. using {AccessControl} or {Ownable}. Not doing so will * make the contract unpausable. */ abstract contract ERC20Pausable is ERC20, Pausable { /** * @dev See {ERC20-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual override { super._beforeTokenTransfer(from, to, amount); require(!paused(), "ERC20Pausable: token transfer while paused"); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/extensions/ERC20Snapshot.sol) pragma solidity ^0.8.0; import "../ERC20.sol"; import "../../../utils/Arrays.sol"; import "../../../utils/Counters.sol"; /** * @dev This contract extends an ERC20 token with a snapshot mechanism. When a snapshot is created, the balances and * total supply at the time are recorded for later access. * * This can be used to safely create mechanisms based on token balances such as trustless dividends or weighted voting. * In naive implementations it's possible to perform a "double spend" attack by reusing the same balance from different * accounts. By using snapshots to calculate dividends or voting power, those attacks no longer apply. It can also be * used to create an efficient ERC20 forking mechanism. * * Snapshots are created by the internal {_snapshot} function, which will emit the {Snapshot} event and return a * snapshot id. To get the total supply at the time of a snapshot, call the function {totalSupplyAt} with the snapshot * id. To get the balance of an account at the time of a snapshot, call the {balanceOfAt} function with the snapshot id * and the account address. * * NOTE: Snapshot policy can be customized by overriding the {_getCurrentSnapshotId} method. For example, having it * return `block.number` will trigger the creation of snapshot at the beginning of each new block. When overriding this * function, be careful about the monotonicity of its result. Non-monotonic snapshot ids will break the contract. * * Implementing snapshots for every block using this method will incur significant gas costs. For a gas-efficient * alternative consider {ERC20Votes}. * * ==== Gas Costs * * Snapshots are efficient. Snapshot creation is _O(1)_. Retrieval of balances or total supply from a snapshot is _O(log * n)_ in the number of snapshots that have been created, although _n_ for a specific account will generally be much * smaller since identical balances in subsequent snapshots are stored as a single entry. * * There is a constant overhead for normal ERC20 transfers due to the additional snapshot bookkeeping. This overhead is * only significant for the first transfer that immediately follows a snapshot for a particular account. Subsequent * transfers will have normal cost until the next snapshot, and so on. */ abstract contract ERC20Snapshot is ERC20 { // Inspired by Jordi Baylina's MiniMeToken to record historical balances: // https://github.com/Giveth/minime/blob/ea04d950eea153a04c51fa510b068b9dded390cb/contracts/MiniMeToken.sol using Arrays for uint256[]; using Counters for Counters.Counter; // Snapshotted values have arrays of ids and the value corresponding to that id. These could be an array of a // Snapshot struct, but that would impede usage of functions that work on an array. struct Snapshots { uint256[] ids; uint256[] values; } mapping(address => Snapshots) private _accountBalanceSnapshots; Snapshots private _totalSupplySnapshots; // Snapshot ids increase monotonically, with the first value being 1. An id of 0 is invalid. Counters.Counter private _currentSnapshotId; /** * @dev Emitted by {_snapshot} when a snapshot identified by `id` is created. */ event Snapshot(uint256 id); /** * @dev Creates a new snapshot and returns its snapshot id. * * Emits a {Snapshot} event that contains the same id. * * {_snapshot} is `internal` and you have to decide how to expose it externally. Its usage may be restricted to a * set of accounts, for example using {AccessControl}, or it may be open to the public. * * [WARNING] * ==== * While an open way of calling {_snapshot} is required for certain trust minimization mechanisms such as forking, * you must consider that it can potentially be used by attackers in two ways. * * First, it can be used to increase the cost of retrieval of values from snapshots, although it will grow * logarithmically thus rendering this attack ineffective in the long term. Second, it can be used to target * specific accounts and increase the cost of ERC20 transfers for them, in the ways specified in the Gas Costs * section above. * * We haven't measured the actual numbers; if this is something you're interested in please reach out to us. * ==== */ function _snapshot() internal virtual returns (uint256) { _currentSnapshotId.increment(); uint256 currentId = _getCurrentSnapshotId(); emit Snapshot(currentId); return currentId; } /** * @dev Get the current snapshotId */ function _getCurrentSnapshotId() internal view virtual returns (uint256) { return _currentSnapshotId.current(); } /** * @dev Retrieves the balance of `account` at the time `snapshotId` was created. */ function balanceOfAt(address account, uint256 snapshotId) public view virtual returns (uint256) { (bool snapshotted, uint256 value) = _valueAt(snapshotId, _accountBalanceSnapshots[account]); return snapshotted ? value : balanceOf(account); } /** * @dev Retrieves the total supply at the time `snapshotId` was created. */ function totalSupplyAt(uint256 snapshotId) public view virtual returns (uint256) { (bool snapshotted, uint256 value) = _valueAt(snapshotId, _totalSupplySnapshots); return snapshotted ? value : totalSupply(); } // Update balance and/or total supply snapshots before the values are modified. This is implemented // in the _beforeTokenTransfer hook, which is executed for _mint, _burn, and _transfer operations. function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual override { super._beforeTokenTransfer(from, to, amount); if (from == address(0)) { // mint _updateAccountSnapshot(to); _updateTotalSupplySnapshot(); } else if (to == address(0)) { // burn _updateAccountSnapshot(from); _updateTotalSupplySnapshot(); } else { // transfer _updateAccountSnapshot(from); _updateAccountSnapshot(to); } } function _valueAt(uint256 snapshotId, Snapshots storage snapshots) private view returns (bool, uint256) { require(snapshotId > 0, "ERC20Snapshot: id is 0"); require(snapshotId <= _getCurrentSnapshotId(), "ERC20Snapshot: nonexistent id"); // When a valid snapshot is queried, there are three possibilities: // a) The queried value was not modified after the snapshot was taken. Therefore, a snapshot entry was never // created for this id, and all stored snapshot ids are smaller than the requested one. The value that corresponds // to this id is the current one. // b) The queried value was modified after the snapshot was taken. Therefore, there will be an entry with the // requested id, and its value is the one to return. // c) More snapshots were created after the requested one, and the queried value was later modified. There will be // no entry for the requested id: the value that corresponds to it is that of the smallest snapshot id that is // larger than the requested one. // // In summary, we need to find an element in an array, returning the index of the smallest value that is larger if // it is not found, unless said value doesn't exist (e.g. when all values are smaller). Arrays.findUpperBound does // exactly this. uint256 index = snapshots.ids.findUpperBound(snapshotId); if (index == snapshots.ids.length) { return (false, 0); } else { return (true, snapshots.values[index]); } } function _updateAccountSnapshot(address account) private { _updateSnapshot(_accountBalanceSnapshots[account], balanceOf(account)); } function _updateTotalSupplySnapshot() private { _updateSnapshot(_totalSupplySnapshots, totalSupply()); } function _updateSnapshot(Snapshots storage snapshots, uint256 currentValue) private { uint256 currentId = _getCurrentSnapshotId(); if (_lastSnapshotId(snapshots.ids) < currentId) { snapshots.ids.push(currentId); snapshots.values.push(currentValue); } } function _lastSnapshotId(uint256[] storage ids) private view returns (uint256) { if (ids.length == 0) { return 0; } else { return ids[ids.length - 1]; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/presets/ERC20PresetMinterPauser.sol) pragma solidity ^0.8.0; import "../ERC20.sol"; import "../extensions/ERC20Burnable.sol"; import "../extensions/ERC20Pausable.sol"; import "../../../access/AccessControlEnumerable.sol"; import "../../../utils/Context.sol"; /** * @dev {ERC20} token, including: * * - ability for holders to burn (destroy) their tokens * - a minter role that allows for token minting (creation) * - a pauser role that allows to stop all token transfers * * This contract uses {AccessControl} to lock permissioned functions using the * different roles - head to its documentation for details. * * The account that deploys the contract will be granted the minter and pauser * roles, as well as the default admin role, which will let it grant both minter * and pauser roles to other accounts. * * _Deprecated in favor of https://wizard.openzeppelin.com/[Contracts Wizard]._ */ contract ERC20PresetMinterPauser is Context, AccessControlEnumerable, ERC20Burnable, ERC20Pausable { bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); /** * @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE` and `PAUSER_ROLE` to the * account that deploys the contract. * * See {ERC20-constructor}. */ constructor(string memory name, string memory symbol) ERC20(name, symbol) { _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(MINTER_ROLE, _msgSender()); _setupRole(PAUSER_ROLE, _msgSender()); } /** * @dev Creates `amount` new tokens for `to`. * * See {ERC20-_mint}. * * Requirements: * * - the caller must have the `MINTER_ROLE`. */ function mint(address to, uint256 amount) public virtual { require(hasRole(MINTER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have minter role to mint"); _mint(to, amount); } /** * @dev Pauses all token transfers. * * See {ERC20Pausable} and {Pausable-_pause}. * * Requirements: * * - the caller must have the `PAUSER_ROLE`. */ function pause() public virtual { require(hasRole(PAUSER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have pauser role to pause"); _pause(); } /** * @dev Unpauses all token transfers. * * See {ERC20Pausable} and {Pausable-_unpause}. * * Requirements: * * - the caller must have the `PAUSER_ROLE`. */ function unpause() public virtual { require(hasRole(PAUSER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have pauser role to unpause"); _unpause(); } function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual override(ERC20, ERC20Pausable) { super._beforeTokenTransfer(from, to, amount); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Arrays.sol) pragma solidity ^0.8.0; import "./StorageSlot.sol"; import "./math/Math.sol"; /** * @dev Collection of functions related to array types. */ library Arrays { using StorageSlot for bytes32; /** * @dev Searches a sorted `array` and returns the first index that contains * a value greater or equal to `element`. If no such index exists (i.e. all * values in the array are strictly less than `element`), the array length is * returned. Time complexity O(log n). * * `array` is expected to be sorted in ascending order, and to contain no * repeated elements. */ function findUpperBound(uint256[] storage array, uint256 element) internal view returns (uint256) { if (array.length == 0) { return 0; } uint256 low = 0; uint256 high = array.length; while (low < high) { uint256 mid = Math.average(low, high); // Note that mid will always be strictly less than high (i.e. it will be a valid array index) // because Math.average rounds down (it does integer division with truncation). if (unsafeAccess(array, mid).value > element) { high = mid; } else { low = mid + 1; } } // At this point `low` is the exclusive upper bound. We will return the inclusive upper bound. if (low > 0 && unsafeAccess(array, low - 1).value == element) { return low - 1; } else { return low; } } /** * @dev Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check. * * WARNING: Only use if you are certain `pos` is lower than the array length. */ function unsafeAccess(address[] storage arr, uint256 pos) internal pure returns (StorageSlot.AddressSlot storage) { bytes32 slot; /// @solidity memory-safe-assembly assembly { mstore(0, arr.slot) slot := add(keccak256(0, 0x20), pos) } return slot.getAddressSlot(); } /** * @dev Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check. * * WARNING: Only use if you are certain `pos` is lower than the array length. */ function unsafeAccess(bytes32[] storage arr, uint256 pos) internal pure returns (StorageSlot.Bytes32Slot storage) { bytes32 slot; /// @solidity memory-safe-assembly assembly { mstore(0, arr.slot) slot := add(keccak256(0, 0x20), pos) } return slot.getBytes32Slot(); } /** * @dev Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check. * * WARNING: Only use if you are certain `pos` is lower than the array length. */ function unsafeAccess(uint256[] storage arr, uint256 pos) internal pure returns (StorageSlot.Uint256Slot storage) { bytes32 slot; /// @solidity memory-safe-assembly assembly { mstore(0, arr.slot) slot := add(keccak256(0, 0x20), pos) } return slot.getUint256Slot(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol) pragma solidity ^0.8.0; /** * @dev Library for reading and writing primitive types to specific storage slots. * * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. * This library helps with reading and writing to such slots without the need for inline assembly. * * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC1967 implementation slot: * ``` * contract ERC1967 { * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` * * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._ */ library StorageSlot { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; import "./math/Math.sol"; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } }
//SPDX-License-Identifier: Unlicense pragma solidity ^0.8.0; import "hardhat/console.sol"; import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetMinterPauser.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Snapshot.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/access/IAccessControl.sol"; import "./Signatures.sol"; interface IERC20Snapshot is IERC20 { function balanceOfAt(address account, uint256 snapshotId) external view returns (uint256); } interface IKarateDAOStorage { struct EventCard { uint256 idx_pos; bool exists; uint256 eventStart; string info_ipfs; string results_ipfs; string snapshotProposalIPFS; bool deleted; uint64 outcomes; } function oracleService() external view returns (address oracleServiceAddr); function getSnapshotIdToEvent(uint256 snapshotId) external view returns (EventCard memory eventCard); function claimedSnapshotIds(address claimant, uint256 snapshotId) external view returns (bool exists); } struct ClaimConstructorArgs { address _karateDaoStorageAddr; address _karateToken; address _pool; uint256 _snapshotId; address[] _oracleServices; uint64 _eventOutcome; address[] _matches; } contract KarateClaimFactory is Ownable { function createKarateClaimContract(ClaimConstructorArgs memory claimConstructorArgs) external returns (KarateClaim karateClaim) { return new KarateClaim(claimConstructorArgs); } } contract KarateClaim is Ownable { struct ClaimData { uint256 lastOutcomeVote; uint256 totalOwedRewards; uint256 totalVoteAtSnapshot; } using Signatures for Signatures.SigData; IERC20Snapshot public token; address public accessContract; uint256 public snapshotId; address public pool; uint256 public prizePoolAmount; uint256 public amountClaimable; address[] public oracleServices; uint64 public eventOutcome; uint256 totalTokenAlloc; uint256[] public voteBalances; address[] public fighterMatches; bool public totalClaimableCalled; uint256 RESOLUTION_FACTOR_100 = 10**16; uint256 fighterBonusPercent = 10; uint256 winnerSplit = 90; mapping(address => bool) public addressHasClaimed; constructor(ClaimConstructorArgs memory claimConstructorArgs) { token = IERC20Snapshot(claimConstructorArgs._karateToken); accessContract = claimConstructorArgs._karateDaoStorageAddr; pool = claimConstructorArgs._pool; snapshotId = claimConstructorArgs._snapshotId; oracleServices = claimConstructorArgs._oracleServices; eventOutcome = claimConstructorArgs._eventOutcome; prizePoolAmount = token.balanceOf(claimConstructorArgs._pool); fighterMatches = claimConstructorArgs._matches; } function isOracleService(address candidate) internal view returns (bool testResult) { for(uint256 j =0; j < oracleServices.length; j++) { if( candidate == oracleServices[j] ){ return true; } } return false; } function findLoserIndex(uint256 winnerIdx) internal pure returns (uint256 loserIdx) { if(winnerIdx % 2 == 0) { loserIdx = winnerIdx + 1; } else { loserIdx = winnerIdx - 1; } } function setTotalClaimable(uint256[] memory totalVotesFromThisChain) external { require(msg.sender == accessContract, 'NotLogicContract'); require(!totalClaimableCalled, 'CALLED'); require(voteBalances.length != 0, 'VOTEUNSET'); require(fighterMatches.length == totalVotesFromThisChain.length, 'LENDNM'); uint256 totalClaimable; for(uint8 outcomeBit = 0; outcomeBit < 64; outcomeBit++) { uint64 bitResult = (eventOutcome >> outcomeBit) & uint64(1); if(bitResult != uint64(1)) { continue; } totalClaimable += calculatePlayerRewards(outcomeBit, totalVotesFromThisChain[outcomeBit]); } amountClaimable = totalClaimable; require(token.balanceOf(pool) >= totalClaimable, 'AMTBIG'); token.transferFrom(pool, accessContract, prizePoolAmount - totalClaimable); totalClaimableCalled = true; } function setSnapshotIdToVoteBalances(uint256[] memory _voteBalances) external { require(voteBalances.length == 0, 'Set already'); require(msg.sender == accessContract, 'NotLogicContract'); voteBalances = _voteBalances; uint256 tempTotal; for(uint256 i = 0; i < _voteBalances.length; i++) { tempTotal += _voteBalances[i]; } totalTokenAlloc = tempTotal; for(uint8 outcomeBit = 0; outcomeBit < 64; outcomeBit++) { uint64 bitResult = (eventOutcome >> outcomeBit) & uint64(1); if(bitResult != uint64(1)) { continue; } token.transferFrom(pool, fighterMatches[outcomeBit], calculateFighterRewards(outcomeBit) * winnerSplit / 100); token.transferFrom(pool, fighterMatches[findLoserIndex(outcomeBit)], calculateFighterRewards(outcomeBit) * (100 - winnerSplit) / 100); } } struct FighterRewards { uint256 fighterEarnings; uint256 fightPrizePool; } function calculateRewards(uint256 winningFighterIdx) internal view returns (FighterRewards memory fighterRewards) { uint256 fightHypeCoefficient = RESOLUTION_FACTOR_100 * 100 * (voteBalances[winningFighterIdx] + voteBalances[findLoserIndex(winningFighterIdx)]) / totalTokenAlloc; fighterRewards.fightPrizePool = prizePoolAmount * fightHypeCoefficient / 100 / RESOLUTION_FACTOR_100; fighterRewards.fighterEarnings = RESOLUTION_FACTOR_100 * fighterBonusPercent * fighterRewards.fightPrizePool / 100 / RESOLUTION_FACTOR_100; return fighterRewards; } function calculateFighterRewards(uint256 winningFighterIdx) internal view returns (uint256 sum) { return calculateRewards(winningFighterIdx).fighterEarnings; } function calculatePlayerRewards(uint256 winningFighterIdx, uint256 fightVote) internal view returns (uint256 sum) { FighterRewards memory fighterRewards = calculateRewards(winningFighterIdx); uint256 playerProportionToPool = RESOLUTION_FACTOR_100 * 100 * fightVote / voteBalances[winningFighterIdx]; uint256 playerEarnings = (fighterRewards.fightPrizePool - fighterRewards.fighterEarnings) * playerProportionToPool / 100 / RESOLUTION_FACTOR_100; return playerEarnings; } function estimateEarnings(uint64 outcome, uint256[] memory votesPerOutcome) public view returns (uint256 earnings) { require(voteBalances.length != 0, 'TOTALVOTESSET'); uint256 totalClaimable; uint256 votesIdx; for(uint8 outcomeBit = 0; outcomeBit < 64; outcomeBit++) { uint64 bitResult = (outcome >> outcomeBit) & uint64(1); if(bitResult != uint64(1)) { continue; } uint64 matchResult = (eventOutcome >> outcomeBit) & uint64(1); if((matchResult & bitResult) == uint64(0)) { votesIdx++; continue; } totalClaimable += calculatePlayerRewards(outcomeBit, votesPerOutcome[votesIdx]); votesIdx++; } return totalClaimable; } function claim(address claimant, uint256[] memory votesPerOutcome, uint64[] memory outcomes, uint256[] memory snapshotIds, Signatures.SigData[] memory signatures) external returns (uint256 totalRewards){ require(voteBalances.length != 0, 'TOTALVOTESSET'); require(addressHasClaimed[claimant] == false, 'CCA'); // claimant claimed already require(!isOracleService(claimant), 'ONEC'); //Oracle service cannot claim its own rewards; require(outcomes.length == snapshotIds.length, 'OSDNE');//More votes outcomes than snapshot ids or vice versa ClaimData memory claimData = ClaimData(0,0,0); bool[2] memory signConditions; bytes32 hash = keccak256(abi.encode(claimant, votesPerOutcome, outcomes, snapshotIds)); for(uint256 i=0; i < signatures.length; i++) { address signer = signatures[i].verifyMessage(hash); if(signer == claimant) { signConditions[0] = true; continue; } if( isOracleService(signer) ) { signConditions[1] = true; continue; } } require(signConditions[0] && signConditions[1], 'SMDNE');//You need a signed message from the claimant and oracle for(uint i = 0; i < snapshotIds.length; i++) { for(uint8 outcomeBit = 0; outcomeBit < 64; outcomeBit++) { uint64 bitResult = (outcomes[i] >> outcomeBit) & uint64(1); if(bitResult != uint64(1)) { continue; } if(snapshotIds[i] != snapshotId) { claimData.lastOutcomeVote += 1; continue; } claimData.totalVoteAtSnapshot += votesPerOutcome[claimData.lastOutcomeVote]; uint64 matchResult = (eventOutcome >> outcomeBit) & uint64(1); if((matchResult & bitResult) == uint64(0)) { claimData.lastOutcomeVote += 1; continue; } claimData.totalOwedRewards += calculatePlayerRewards(outcomeBit, votesPerOutcome[claimData.lastOutcomeVote]); claimData.lastOutcomeVote += 1; } require(claimData.totalVoteAtSnapshot <= token.balanceOfAt(claimant, snapshotIds[i]), "TVBE"); //Total vote balance exceeds balance at snapshot claimData.totalVoteAtSnapshot = 0; } token.transferFrom(pool, claimant, claimData.totalOwedRewards); addressHasClaimed[claimant] = true; return claimData.totalOwedRewards; } }
//SPDX-License-Identifier: Unlicense pragma solidity ^0.8.0; import "hardhat/console.sol"; import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetMinterPauser.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Snapshot.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/access/IAccessControl.sol"; import "./Signatures.sol"; contract KaratePool { bool private allowanceSet; IERC20 private token; Ownable private storageContract; constructor(address tokenAddress, address storageContractAddress) { token = IERC20(tokenAddress); storageContract = Ownable(storageContractAddress); } function daoContract() internal view returns (address owner) { return storageContract.owner(); } function createAllowance(address claimContract) external { require(msg.sender == daoContract(), 'Only active DAO contract can call'); require(!allowanceSet, "Allowance already set"); token.approve(claimContract, token.balanceOf(address(this))); allowanceSet = true; } }
pragma solidity ^0.8.0; library Signatures { struct SigData { uint8 v; bytes32 r; bytes32 s; } function verifyMessage(SigData calldata sigData, bytes32 _hashedMessage) public pure returns (address) { bytes memory prefix = "\x19Ethereum Signed Message:\n32"; bytes32 prefixedHashMessage = keccak256(abi.encodePacked(prefix, _hashedMessage)); address signer = ecrecover(prefixedHashMessage, sigData.v, sigData.r, sigData.s); return signer; } }
//SPDX-License-Identifier: Unlicense pragma solidity ^0.8.0; import "hardhat/console.sol"; import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetMinterPauser.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Snapshot.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; contract KarateERC20 is Ownable, ERC20Snapshot { uint256 constant BILLION = 10**9; uint256 constant INIT_SUPPLY = 77 * BILLION * 10**18; constructor() ERC20("Karate", "KARATE") { uint256 initialSupply = INIT_SUPPLY; _mint(_msgSender(), initialSupply); } function createSnapshot() external onlyOwner returns (uint256 snapshotId) { return ERC20Snapshot._snapshot(); } function getCurrentSnapshotId() external view returns (uint256 snapshotId) { return ERC20Snapshot._getCurrentSnapshotId(); } function mint(address to, uint256 amount) public virtual onlyOwner { _mint(to, amount); } }
// SPDX-License-Identifier: MIT pragma solidity >= 0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function _sendLogPayload(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE_ADDRESS; assembly { let payloadStart := add(payload, 32) let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) } } function log() internal view { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int256)", p0)); } function logUint(uint256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function logString(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function log(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint256 p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1)); } function log(uint256 p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1)); } function log(uint256 p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1)); } function log(uint256 p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1)); } function log(string memory p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1)); } function log(string memory p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1)); } function log(bool p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1)); } function log(address p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint256 p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2)); } function log(uint256 p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2)); } function log(uint256 p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2)); } function log(uint256 p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2)); } function log(uint256 p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2)); } function log(uint256 p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2)); } function log(uint256 p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2)); } function log(uint256 p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2)); } function log(uint256 p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2)); } function log(uint256 p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2)); } function log(uint256 p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2)); } function log(uint256 p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2)); } function log(uint256 p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2)); } function log(string memory p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2)); } function log(string memory p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2)); } function log(string memory p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2)); } function log(string memory p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2)); } function log(bool p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2)); } function log(bool p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2)); } function log(bool p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2)); } function log(address p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2)); } function log(address p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2)); } function log(address p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } }
{ "optimizer": { "enabled": true, "runs": 1 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": { "contracts/Signatures.sol": { "Signatures": "0xfa34742085f577432caa712ae0a29bda56720a5a" } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256[]","name":"prizePoolAmounts","type":"uint256[]"},{"internalType":"contract KarateClaimFactory","name":"_kcFactory","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"string","name":"eventInfoIpfs","type":"string"},{"internalType":"bytes32","name":"expectedHash","type":"bytes32"},{"internalType":"bytes32","name":"receivedHash","type":"bytes32"}],"name":"MismatchedEventHash","type":"error"},{"inputs":[{"internalType":"address","name":"currentOwner","type":"address"},{"internalType":"address","name":"contractAddress","type":"address"}],"name":"UpgradeFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"eventNum","type":"uint256"},{"components":[{"internalType":"uint256","name":"idx_pos","type":"uint256"},{"internalType":"bool","name":"exists","type":"bool"},{"internalType":"uint256","name":"eventStart","type":"uint256"},{"internalType":"string","name":"info_ipfs","type":"string"},{"internalType":"string","name":"results_ipfs","type":"string"},{"internalType":"string","name":"snapshotProposalIPFS","type":"string"},{"internalType":"bool","name":"deleted","type":"bool"},{"internalType":"uint64","name":"outcomes","type":"uint64"},{"internalType":"uint256","name":"snapshotId","type":"uint256"}],"indexed":false,"internalType":"struct KarateDAOStorage.EventCard","name":"eventCard","type":"tuple"}],"name":"DeletedFightEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"msg","type":"string"}],"name":"Error","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"memberAddr","type":"address"},{"indexed":false,"internalType":"string","name":"ipfs","type":"string"},{"indexed":true,"internalType":"uint256","name":"eventNum","type":"uint256"}],"name":"NewEventResult","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"eventNum","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"snapshotId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"NewEventSnapshot","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"eventNum","type":"uint256"},{"components":[{"internalType":"uint256","name":"idx_pos","type":"uint256"},{"internalType":"bool","name":"exists","type":"bool"},{"internalType":"uint256","name":"eventStart","type":"uint256"},{"internalType":"string","name":"info_ipfs","type":"string"},{"internalType":"string","name":"results_ipfs","type":"string"},{"internalType":"string","name":"snapshotProposalIPFS","type":"string"},{"internalType":"bool","name":"deleted","type":"bool"},{"internalType":"uint64","name":"outcomes","type":"uint64"},{"internalType":"uint256","name":"snapshotId","type":"uint256"}],"indexed":false,"internalType":"struct KarateDAOStorage.EventCard","name":"eventCard","type":"tuple"}],"name":"NewFightEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"memberAddr","type":"address"},{"indexed":true,"internalType":"string","name":"ipfs","type":"string"},{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"string","name":"ipfs_metadata","type":"string"},{"internalType":"bool","name":"isActive","type":"bool"}],"indexed":false,"internalType":"struct KarateDAOStorage.Member","name":"member","type":"tuple"}],"name":"NewMember","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"AVAIL_ROLES","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"KC_DELEGATE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"KC_FIGHTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"KC_HEAD_JUDGE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"KC_JUDGE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"KC_MARKETING_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"KC_ORACLE_SERVICE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"addMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"string","name":"ipfs_metadata","type":"string"}],"name":"addMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"prizePoolAmounts","type":"uint256[]"}],"name":"addPools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"votesPerOutcome","type":"uint256[]"},{"internalType":"uint64[]","name":"outcomes","type":"uint64[]"},{"internalType":"uint256[]","name":"snapshotIds","type":"uint256[]"},{"components":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct Signatures.SigData[]","name":"signatures","type":"tuple[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"eventNum","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"components":[{"components":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct Signatures.SigData","name":"delegateSig","type":"tuple"},{"internalType":"string","name":"resultIPFSCID","type":"string"},{"internalType":"uint64","name":"matchOutcomes","type":"uint64"}],"internalType":"struct KarateDAOManager.SigToScore[]","name":"delegateAndScores","type":"tuple[]"}],"name":"closeEvent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"eventStart","type":"uint256"},{"internalType":"string","name":"info_ipfs","type":"string"},{"internalType":"address[]","name":"stakeholders","type":"address[]"}],"name":"createEventCard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentEvent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"daoStorage","outputs":[{"internalType":"contract KarateDAOStorage","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"eventCardNum","type":"uint256"}],"name":"deleteEvent","outputs":[{"internalType":"bool","name":"successful","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"deleteMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"eventOpened","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"finalizeUpgrade","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"eventNum","type":"uint256"}],"name":"getEventStakeholders","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"eventNum","type":"uint256"}],"name":"getEventViewLink","outputs":[{"internalType":"string","name":"viewLink","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"member","type":"address"}],"name":"getMemberRoles","outputs":[{"internalType":"bytes32[]","name":"roles","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"claimant","type":"address"},{"internalType":"uint256","name":"eventNum","type":"uint256"}],"name":"isEventClaimed","outputs":[{"internalType":"bool","name":"isClaimed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"eventNum","type":"uint256"},{"internalType":"string","name":"snapshotProposalIPFSCID","type":"string"},{"internalType":"address[]","name":"fighters","type":"address[]"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"components":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct Signatures.SigData[]","name":"delegates","type":"tuple[]"}],"name":"openEvent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"roleHierarchy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"eventNum","type":"uint256"},{"internalType":"string","name":"viewLink","type":"string"}],"name":"setEventViewLink","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"count","type":"uint8"}],"name":"setMinEventDelegateCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"count","type":"uint8"}],"name":"setMinEventJudgeCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"snapshotId","type":"uint256"},{"internalType":"uint256[]","name":"voteBals","type":"uint256[]"}],"name":"setSnapshotIdToVoteBalances","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"snapshotId","type":"uint256"},{"internalType":"uint256[]","name":"amountClaimable","type":"uint256[]"}],"name":"setTotalClaimable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract KarateERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"new_contract_addr","type":"address"}],"name":"upgradeDao","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
610120604052600060809081526000805160206200a6da83398151915260a0527fb08f18b377dfeb1adcf649b816ad935bc75cd52dfb3feb6a6a8b44734e7d591060c0527ff8fa0a2e0b6ae44d5bf1084b5461fa6a8a39a79c4c89f13d35cb8e2a5b7508be60e0527f2e136f43fa0cd081cd9e0fdc6cae79be691d06a820f16995861d106a8e143eae610100526200009c906003906005620005cf565b50600019600455348015620000b057600080fd5b506040516200a6fa3803806200a6fa833981016040819052620000d3916200067d565b620000e0600033620002b2565b620000fb6000805160206200a6da83398151915233620002b2565b336200010960014362000785565b60405160609290921b6001600160601b031916602083015240603482015260540160408051808303601f1901815290829052805160209182012060055560029081905260017fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b557f3b3971e19c14b4d04dc27353f7980c699c2047fc52892b5208b62fe80346fdb28190557f178472dfa082bc56f85b1e1106040507c8b27144794f51880164f8cb547adcdd6000527fe65f4ba5961de0f0b8f77548c6adf538e77e5cb63282ecf280b527ef60bd9599556006805461ffff1916610303179055600880546001600160a01b0319166001600160a01b0384161790556200020f906200061f565b604051809103906000f0801580156200022c573d6000803e3d6000fd5b50600660026101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405162000261906200062d565b604051809103906000f0801580156200027e573d6000803e3d6000fd5b50600780546001600160a01b0319166001600160a01b0392909216919091179055620002aa82620002c2565b5050620007e9565b620002be82826200047a565b5050565b60005b8151811015620002be576007546006546040516000926001600160a01b03908116926201000090041690620002fa906200063b565b6001600160a01b03928316815291166020820152604001604051809103906000f0801580156200032e573d6000803e3d6000fd5b5060075484519192506001600160a01b03169063a9059cbb9083908690869081106200036a57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518363ffffffff1660e01b8152600401620003a49291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b158015620003bf57600080fd5b505af1158015620003d4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003fa91906200075c565b50600654604051632e3c0e1f60e01b81526001600160a01b0383811660048301526201000090920490911690632e3c0e1f90602401600060405180830381600087803b1580156200044a57600080fd5b505af11580156200045f573d6000803e3d6000fd5b5050505050808062000471906200079f565b915050620002c5565b620004918282620004bd60201b62002cbf1760201c565b6000828152600160209081526040909120620004b891839062002d476200055d821b17901c565b505050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16620002be576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620005193390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600062000574836001600160a01b0384166200057d565b90505b92915050565b6000818152600183016020526040812054620005c65750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000577565b50600062000577565b8280548282559060005260206000209081019282156200060d579160200282015b828111156200060d578251825591602001919060010190620005f0565b506200061b92915062000649565b5090565b6126c6806200675e83390190565b6114898062008e2483390190565b61042d806200a2ad83390190565b5b808211156200061b57600081556001016200064a565b80516001600160a01b03811681146200067857600080fd5b919050565b6000806040838503121562000690578182fd5b82516001600160401b0380821115620006a7578384fd5b818501915085601f830112620006bb578384fd5b8151602082821115620006d257620006d2620007d3565b8160051b604051601f19603f83011681018181108682111715620006fa57620006fa620007d3565b604052838152828101945085830182870184018b101562000719578889fd5b8896505b848710156200073d5780518652600196909601959483019483016200071d565b5096506200074f905087820162000660565b9450505050509250929050565b6000602082840312156200076e578081fd5b815180151581146200077e578182fd5b9392505050565b6000828210156200079a576200079a620007bd565b500390565b6000600019821415620007b657620007b6620007bd565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b615f6580620007f96000396000f3fe60806040523480156200001157600080fd5b5060043610620002265760003560e01c806301ffc9a7146200022b57806311ffb1d41462000257578063248a9ca314620002705780632b0bca5d14620002965780632dcdc96814620002ad5780632f2ff15d14620002c45780633025458914620002db5780633210a13114620002f25780633470a4cd146200030957806336568abe146200032057806340c10f19146200033757806342748220146200034e578063473d1b12146200036557806349df7208146200037c57806350750f251462000393578063538f0526146200039d578063570ea1fd14620003b457806359d2271d14620003da578063745280eb14620003f1578063778c1cbf14620004085780637e6b3afa146200041f5780638bf126ec14620004365780638cccf809146200044d5780639010d07c146200047357806391d14854146200049957806397be464f14620004b057806397cb55cb14620004c75780639a508c8e14620004dc5780639ce32d5814620004e6578063a217fddf14620004fd578063a9059cbb1462000506578063b1b0af9f146200051d578063b266ee321462000545578063babf3b9a146200055f578063ca15c8731462000585578063d4ee1543146200059c578063d547741f14620005bf578063e2235f7614620005d6578063f06cac4614620005ed578063f53581881462000604578063f76b70f4146200061b578063f8749a581462000632578063fc0c546a1462000649575b600080fd5b620002426200023c36600462004b98565b6200065d565b60405190151581526020015b60405180910390f35b6200026e6200026836600462004795565b6200068b565b005b620002876200028136600462004b2b565b62000843565b6040519081526020016200024e565b62000287620002a736600462004b2b565b62000858565b6200028760008051602062005ed083398151915281565b6200026e620002d536600462004b44565b6200087a565b6200028760008051602062005e9083398151915281565b6200026e6200030336600462004fc9565b620008a1565b6200026e6200031a36600462004ad0565b62000975565b6200026e6200033136600462004b44565b620009e3565b6200026e6200034836600462004860565b62000a61565b6200028760008051602062005f1083398151915281565b6200026e6200037636600462004ebd565b62000af4565b6200026e6200038d366004620047d3565b62000d79565b6200028760095481565b6200026e620003ae36600462004e28565b62000dfc565b620003cb620003c536600462004b2b565b62001117565b6040516200024e919062005537565b6200026e620003eb36600462004795565b620011b7565b6200028760008051602062005eb083398151915281565b6200026e6200041936600462005007565b6200151b565b6200026e6200043036600462004e75565b62001cb3565b6200026e6200044736600462004f3a565b62001dd3565b620004646200045e36600462004795565b620021c9565b6040516200024e9190620054d2565b6200048a6200048436600462004b76565b6200231e565b6040516200024e91906200538c565b62000242620004aa36600462004b44565b6200233f565b6200028760008051602062005ef083398151915281565b6008546200024290600160a01b900460ff1681565b6200024262002368565b6200026e620004f736600462004801565b62002439565b62000287600081565b6200026e6200051736600462004860565b620024f1565b620002877f178472dfa082bc56f85b1e1106040507c8b27144794f51880164f8cb547adcdd81565b6006546200048a906201000090046001600160a01b031681565b620005766200057036600462004b2b565b620025da565b6040516200024e9190620054bd565b620002876200059636600462004b2b565b62002665565b62000287620005ad36600462004b2b565b60026020526000908152604090205481565b6200026e620005d036600462004b44565b6200267e565b6200026e620005e73660046200513f565b620026a0565b6200026e620005fe3660046200513f565b62002716565b620002426200061536600462004860565b62002792565b6200026e6200062c36600462004a05565b6200289f565b620002426200064336600462004b2b565b62002af9565b6007546200048a906001600160a01b031681565b60006001600160e01b03198216635a05180f60e01b1480620006855750620006858262002d5e565b92915050565b60006200069981336200233f565b80620006ac5750620006ac81336200233f565b604051806040016040528060038152602001624d453360e81b81525090620006f25760405162461bcd60e51b8152600401620006e9919062005537565b60405180910390fd5b5060065460405163156d12cb60e11b81526000916201000090046001600160a01b031690632ada2596906200072c9086906004016200538c565b60006040518083038186803b1580156200074557600080fd5b505afa1580156200075a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000784919081019062004d59565b9050806040015115156001151514620007c95760405162461bcd60e51b815260206004820152600660248201526513515351115360d21b6044820152606401620006e9565b600060408281019190915260065490516368f09a1d60e11b8152620100009091046001600160a01b03169063d1e1343a906200080a90849060040162005710565b600060405180830381600087803b1580156200082557600080fd5b505af11580156200083a573d6000803e3d6000fd5b50505050505050565b60009081526020819052604090206001015490565b600381815481106200086957600080fd5b600091825260209091200154905081565b620008858262000843565b620008908162002d95565b6200089c838362002da4565b505050565b60008051602062005ed0833981519152620008be6000336200233f565b80620008d15750620008d181336200233f565b604051806040016040528060038152602001624d453360e81b815250906200090e5760405162461bcd60e51b8152600401620006e9919062005537565b50600660029054906101000a90046001600160a01b03166001600160a01b03166395ae9334848460405160200162000947919062005537565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016200080a92919062005804565b60006200098381336200233f565b806200099657506200099681336200233f565b604051806040016040528060038152602001624d453360e81b81525090620009d35760405162461bcd60e51b8152600401620006e9919062005537565b50620009df8262002dca565b5050565b6001600160a01b038116331462000a555760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401620006e9565b620009df828262002f68565b600062000a6f81336200233f565b8062000a82575062000a8281336200233f565b604051806040016040528060038152602001624d453360e81b8152509062000abf5760405162461bcd60e51b8152600401620006e9919062005537565b506007546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906200080a9086908690600401620054a4565b60008051602062005ed083398151915262000b116000336200233f565b8062000b24575062000b2481336200233f565b604051806040016040528060038152602001624d453360e81b8152509062000b615760405162461bcd60e51b8152600401620006e9919062005537565b5060006040518061012001604052806000815260200160001515815260200188815260200187878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250506040805160208181018352848252808601919091528151808201835284815282860152606085018490526080850184905260a090940192909252508281018a90528051601f8901839004830281018301909152878152919250879087908190840183828082843760009201829052506060860194909452505060065460405163540e1f9960e11b8152620100009091046001600160a01b0316915063a81c3f329062000c6e90859060040162005640565b602060405180830381600087803b15801562000c8957600080fd5b505af115801562000c9e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000cc4919062004e0f565b600654604051635c3c2c1760e11b81529192506201000090046001600160a01b03169063b878582e9062000d019084908990899060040162005798565b600060405180830381600087803b15801562000d1c57600080fd5b505af115801562000d31573d6000803e3d6000fd5b50505050807f45fb4aac4654c6df463d5df6a02729fb817acf43ea0ca0ab3f14946dd6ec69b48360405162000d67919062005640565b60405180910390a25050505050505050565b60008051602062005ed083398151915262000d966000336200233f565b8062000da9575062000da981336200233f565b604051806040016040528060038152602001624d453360e81b8152509062000de65760405162461bcd60e51b8152600401620006e9919062005537565b50606062000df684848362002f8e565b50505050565b60008051602062005f1083398151915262000e196000336200233f565b8062000e2c575062000e2c81336200233f565b604051806040016040528060038152602001624d453360e81b8152509062000e695760405162461bcd60e51b8152600401620006e9919062005537565b50600654604051639ab5fddd60e01b8152600481018690526000916201000090046001600160a01b03169063e60d585a908290639ab5fddd9060240160206040518083038186803b15801562000ebe57600080fd5b505afa15801562000ed3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ef9919062004e0f565b6040518263ffffffff1660e01b815260040162000f1891815260200190565b60006040518083038186803b15801562000f3157600080fd5b505afa15801562000f46573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000f70919081019062004919565b51905062000f8081600262005936565b831462000fb95760405162461bcd60e51b81526020600482015260066024820152654c454e444e4560d01b6044820152606401620006e9565b6006546040516329c7829360e11b8152620100009091046001600160a01b03169063538f05269062000ff490889088908890600401620057e8565b600060405180830381600087803b1580156200100f57600080fd5b505af115801562001024573d6000803e3d6000fd5b5050600654604051637d4bf69560e11b815260048101899052620100009091046001600160a01b0316925063fa97ed2a915060240160206040518083038186803b1580156200107257600080fd5b505afa15801562001087573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620010ad9190620047b4565b6001600160a01b0316635fd2c9f485856040518363ffffffff1660e01b8152600401620010dc92919062005518565b600060405180830381600087803b158015620010f757600080fd5b505af11580156200110c573d6000803e3d6000fd5b505050505050505050565b600654604051630e1bbd9160e31b8152600481018390526060916201000090046001600160a01b0316906370ddec889060240160006040518083038186803b1580156200116357600080fd5b505afa15801562001178573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620011a2919081019062004bc2565b80602001905181019062000685919062004c0c565b6000620011c581336200233f565b80620011d85750620011d881336200233f565b604051806040016040528060038152602001624d453360e81b81525090620012155760405162461bcd60e51b8152600401620006e9919062005537565b5060065460405163f2fde38b60e01b815283916201000090046001600160a01b03169063f2fde38b906200124e9084906004016200538c565b600060405180830381600087803b1580156200126957600080fd5b505af11580156200127e573d6000803e3d6000fd5b505060075460405163f2fde38b60e01b81526001600160a01b03909116925063f2fde38b9150620012b49086906004016200538c565b600060405180830381600087803b158015620012cf57600080fd5b505af1158015620012e4573d6000803e3d6000fd5b50506007546040516370a0823160e01b81526001600160a01b03909116925063a9059cbb9150859083906370a0823190620013249030906004016200538c565b60206040518083038186803b1580156200133d57600080fd5b505afa15801562001352573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001378919062004e0f565b6040518363ffffffff1660e01b815260040162001397929190620054a4565b602060405180830381600087803b158015620013b257600080fd5b505af1158015620013c7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620013ed919062004b0e565b50806001600160a01b0316639a508c8e6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156200142a57600080fd5b505af11580156200143f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001465919062004b0e565b156200147057505050565b600660029054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015620014bf57600080fd5b505afa158015620014d4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620014fa9190620047b4565b3360405160016215555360e11b03198152600401620006e9929190620053a0565b60065460405163445312f160e11b81526004810184905283916201000090046001600160a01b03169081906388a625e290602401602060405180830381600087803b1580156200156a57600080fd5b505af11580156200157f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620015a5919062004b0e565b15620015c55760405162461bcd60e51b8152600401620006e99062005586565b60008051602062005ed0833981519152620015e26000336200233f565b80620015f55750620015f581336200233f565b604051806040016040528060038152602001624d453360e81b81525090620016325760405162461bcd60e51b8152600401620006e9919062005537565b50600854600160a01b900460ff166200167c5760405162461bcd60e51b815260206004820152600b60248201526a2727a2ab22a72a27a822a760a91b6044820152606401620006e9565b6009548614620016ba5760405162461bcd60e51b815260206004820152600860248201526722ab272a2727a82760c11b6044820152606401620006e9565b600654604051630368c42760e51b8152600481018890526000916201000090046001600160a01b031690636d1884e09060240160006040518083038186803b1580156200170657600080fd5b505afa1580156200171b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001745919081019062004c42565b905060006200175b888360600151898962003146565b602081015160808401526040808201516001600160401b031660e0850152600654905163540e1f9960e11b81529192506201000090046001600160a01b03169063a81c3f3290620017b190859060040162005640565b602060405180830381600087803b158015620017cc57600080fd5b505af1158015620017e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001807919062004e0f565b506006546040805163243d658560e01b815290516000926201000090046001600160a01b03169163cbe0619591839163243d6585916004808301926020929190829003018186803b1580156200185c57600080fd5b505afa15801562001871573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001897919062004e0f565b6040518263ffffffff1660e01b8152600401620018b691815260200190565b60206040518083038186803b158015620018cf57600080fd5b505afa158015620018e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200190a9190620047b4565b9050600660029054906101000a90046001600160a01b03166001600160a01b03166313db4e1a6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200195d57600080fd5b505af115801562001972573d6000803e3d6000fd5b5050505060006200199260008051602062005f1083398151915262002665565b6001600160401b03811115620019b857634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015620019e2578160200160208202803683370190505b509050600081511162001a265760405162461bcd60e51b815260206004820152600b60248201526a2120a227a920a1a62622a760a91b6044820152606401620006e9565b60005b62001a4360008051602062005f1083398151915262002665565b81101562001ab45762001a6660008051602062005f10833981519152826200231e565b82828151811062001a8757634e487b7160e01b600052603260045260246000fd5b6001600160a01b03909216602092830291909101909101528062001aab81620059bb565b91505062001a29565b506008546040805160e080820183523082526007546001600160a01b039081166020840152868116938301939093526101008801516060830152608082018590528701516001600160401b031660a0820152600092919091169063689280599060c0810162001b238f6200359e565b8152506040518263ffffffff1660e01b815260040162001b449190620055a7565b602060405180830381600087803b15801562001b5f57600080fd5b505af115801562001b74573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001b9a9190620047b4565b604051638730907d60e01b81529091506001600160a01b03841690638730907d9062001bcb9084906004016200538c565b600060405180830381600087803b15801562001be657600080fd5b505af115801562001bfb573d6000803e3d6000fd5b505060065461010088015160405163c96259e160e01b8152620100009092046001600160a01b0316935063c96259e1925062001c3c91859060040162005781565b600060405180830381600087803b15801562001c5757600080fd5b505af115801562001c6c573d6000803e3d6000fd5b50506008805460ff60a01b19169055505060405163015a56e960e01b81526001600160a01b038816965063015a56e99550620010dc945088935060040191506200552e9050565b60008051602062005f1083398151915262001cd06000336200233f565b8062001ce3575062001ce381336200233f565b604051806040016040528060038152602001624d453360e81b8152509062001d205760405162461bcd60e51b8152600401620006e9919062005537565b50600654604051637d4bf69560e11b815260048101859052620100009091046001600160a01b03169063fa97ed2a9060240160206040518083038186803b15801562001d6b57600080fd5b505afa15801562001d80573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001da69190620047b4565b6001600160a01b031663f1bfb135836040518263ffffffff1660e01b81526004016200080a9190620054d2565b60065460405163445312f160e11b81526004810185905284916201000090046001600160a01b03169081906388a625e290602401602060405180830381600087803b15801562001e2257600080fd5b505af115801562001e37573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001e5d919062004b0e565b1562001e7d5760405162461bcd60e51b8152600401620006e99062005586565b60008051602062005ed083398151915262001e9a6000336200233f565b8062001ead575062001ead81336200233f565b604051806040016040528060038152602001624d453360e81b8152509062001eea5760405162461bcd60e51b8152600401620006e9919062005537565b50600854600160a01b900460ff161562001f325760405162461bcd60e51b815260206004820152600860248201526720a629222ca7a82760c11b6044820152606401620006e9565b60098b9055600654604051630368c42760e51b8152600481018d90526000916201000090046001600160a01b031690636d1884e09060240160006040518083038186803b15801562001f8357600080fd5b505afa15801562001f98573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001fc2919081019062004c42565b9050806020015115156001151514620020115760405162461bcd60e51b815260206004820152601060248201526f4576656e74204e756d62657220444e4560801b6044820152606401620006e9565b600081606001518c8c8c8c8c604051602001620020349695949392919062005224565b6040516020818303038152906040528051906020012090506200205a8d828989620037ae565b6000620020678e62003b87565b905080836101000181815250508c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505060a084015260065460405163540e1f9960e11b8152620100009091046001600160a01b03169063a81c3f3290620020e690869060040162005640565b602060405180830381600087803b1580156200210157600080fd5b505af115801562002116573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200213c919062004e0f565b506200214a838c8c62003cb9565b50506008805460ff60a01b1916600160a01b179055505060405163015a56e960e01b8152600481018390526001600160a01b0382169063015a56e990602401600060405180830381600087803b158015620021a457600080fd5b505af1158015620021b9573d6000803e3d6000fd5b5050505050505050505050505050565b6003546060906000906001600160401b03811115620021f857634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801562002222578160200160208202803683370190505b50905060005b60035481101562002317576200226b600382815481106200225957634e487b7160e01b600052603260045260246000fd5b9060005260206000200154856200233f565b15620022d157600381815481106200229357634e487b7160e01b600052603260045260246000fd5b9060005260206000200154828281518110620022bf57634e487b7160e01b600052603260045260246000fd5b60200260200101818152505062002302565b600454828281518110620022f557634e487b7160e01b600052603260045260246000fd5b6020026020010181815250505b806200230e81620059bb565b91505062002228565b5092915050565b600082815260016020526040812062002338908362003f72565b9392505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6000806200237781336200233f565b806200238a57506200238a81336200233f565b604051806040016040528060038152602001624d453360e81b81525090620023c75760405162461bcd60e51b8152600401620006e9919062005537565b5060065460055460405163f360c18360e01b81526004810191909152620100009091046001600160a01b03169063f360c18390602401600060405180830381600087803b1580156200241857600080fd5b505af11580156200242d573d6000803e3d6000fd5b50505050600191505090565b60008051602062005ed0833981519152620024566000336200233f565b806200246957506200246981336200233f565b604051806040016040528060038152602001624d453360e81b81525090620024a65760405162461bcd60e51b8152600401620006e9919062005537565b50620024ea858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525062002f8e92505050565b5050505050565b6000620024ff81336200233f565b806200251257506200251281336200233f565b604051806040016040528060038152602001624d453360e81b815250906200254f5760405162461bcd60e51b8152600401620006e9919062005537565b5060075460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90620025849086908690600401620054a4565b602060405180830381600087803b1580156200259f57600080fd5b505af1158015620025b4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000df6919062004b0e565b6006546040516338c13ca160e11b8152600481018390526060916201000090046001600160a01b03169063718279429060240160006040518083038186803b1580156200262657600080fd5b505afa1580156200263b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000685919081019062004873565b6000818152600160205260408120620006859062003f80565b620026898262000843565b620026948162002d95565b6200089c838362002f68565b6000620026ae81336200233f565b80620026c15750620026c181336200233f565b604051806040016040528060038152602001624d453360e81b81525090620026fe5760405162461bcd60e51b8152600401620006e9919062005537565b50506006805460ff191660ff92909216919091179055565b60006200272481336200233f565b806200273757506200273781336200233f565b604051806040016040528060038152602001624d453360e81b81525090620027745760405162461bcd60e51b8152600401620006e9919062005537565b50506006805460ff9092166101000261ff0019909216919091179055565b600654604051630368c42760e51b8152600481018390526000916201000090046001600160a01b03169063f28e87b69085908390636d1884e09060240160006040518083038186803b158015620027e857600080fd5b505afa158015620027fd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262002827919081019062004c42565b61010001516040518363ffffffff1660e01b81526004016200284b929190620054a4565b60206040518083038186803b1580156200286457600080fd5b505afa15801562002879573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002338919062004b0e565b620028ba60008051602062005f10833981519152336200233f565b15620028f25760405162461bcd60e51b8152600401620006e9906020808252600490820152634f4e454360e01b604082015260600190565b60005b838110156200110c576006546000906201000090046001600160a01b031663fa97ed2a8787858181106200293957634e487b7160e01b600052603260045260246000fd5b905060200201356040518263ffffffff1660e01b81526004016200295f91815260200190565b60206040518083038186803b1580156200297857600080fd5b505afa1580156200298d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620029b39190620047b4565b90506000816001600160a01b03166353b5ef2a338d8d8d8d8d8d8d8d6040518a63ffffffff1660e01b8152600401620029f599989796959493929190620053ba565b602060405180830381600087803b15801562002a1057600080fd5b505af115801562002a25573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002a4b919062004e0f565b6006549091506201000090046001600160a01b031663ff355e7c3389898781811062002a8757634e487b7160e01b600052603260045260246000fd5b905060200201356040518363ffffffff1660e01b815260040162002aad929190620054a4565b600060405180830381600087803b15801562002ac857600080fd5b505af115801562002add573d6000803e3d6000fd5b505050505050808062002af090620059bb565b915050620028f5565b60008062002b0881336200233f565b8062002b1b575062002b1b81336200233f565b604051806040016040528060038152602001624d453360e81b8152509062002b585760405162461bcd60e51b8152600401620006e9919062005537565b50600654604051630368c42760e51b8152600481018590526000916201000090046001600160a01b031690636d1884e09060240160006040518083038186803b15801562002ba557600080fd5b505afa15801562002bba573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262002be4919081019062004c42565b600160c082015260065460405163540e1f9960e11b81529192506201000090046001600160a01b03169063a81c3f329062002c2490849060040162005640565b602060405180830381600087803b15801562002c3f57600080fd5b505af115801562002c54573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002c7a919062004e0f565b50837fbf4e1eafd0af4b4075545cc5fd5b76a4ebc4aebd953252b6c62fd36c3b025a488260405162002cad919062005640565b60405180910390a25060019392505050565b62002ccb82826200233f565b620009df576000828152602081815260408083206001600160a01b03851684529091529020805460ff1916600117905562002d033390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600062002338836001600160a01b03841662003f8b565b60006001600160e01b03198216637965db0b60e01b14806200068557506301ffc9a760e01b6001600160e01b031983161462000685565b62002da1813362003fdd565b50565b62002db0828262002cbf565b60008281526001602052604090206200089c908262002d47565b60005b8151811015620009df576007546006546040516000926001600160a01b0390811692620100009004169062002e029062004528565b62002e0f929190620053a0565b604051809103906000f08015801562002e2c573d6000803e3d6000fd5b5060075484519192506001600160a01b03169063a9059cbb90839086908690811062002e6857634e487b7160e01b600052603260045260246000fd5b60200260200101516040518363ffffffff1660e01b815260040162002e8f929190620054a4565b602060405180830381600087803b15801562002eaa57600080fd5b505af115801562002ebf573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002ee5919062004b0e565b50600654604051632e3c0e1f60e01b8152620100009091046001600160a01b031690632e3c0e1f9062002f1d9084906004016200538c565b600060405180830381600087803b15801562002f3857600080fd5b505af115801562002f4d573d6000803e3d6000fd5b5050505050808062002f5f90620059bb565b91505062002dcd565b62002f74828262004041565b60008281526001602052604090206200089c9082620040a9565b62002f9a82846200233f565b156040518060400160405280600381526020016226a29960e91b8152509062002fd85760405162461bcd60e51b8152600401620006e9919062005537565b5062002fe66000336200233f565b8062003014575062002ff882620040c0565b6200301260008051602062005ed0833981519152620040c0565b105b6200304b5760405162461bcd60e51b81526020600482015260066024820152654e4f5045524d60d01b6044820152606401620006e9565b62003057828462002da4565b604080516060810182526001600160a01b0380861682526020820184905260018284015260065492516368f09a1d60e11b81529192620100009004169063d1e1343a90620030aa90849060040162005710565b600060405180830381600087803b158015620030c557600080fd5b505af1158015620030da573d6000803e3d6000fd5b5050506020820151604051620030f1925062005206565b604051809103902081600001516001600160a01b03167fff54c21ba80b8aa448e2f0b912a564e7f3cf3067eefd465b0ec24f30471cbc848360405162003138919062005710565b60405180910390a350505050565b6040805160c081018252600060608083018281526080840183905260a084018390528352602083015291810191909152600080600084516001600160401b03811115620031a357634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015620031cd578160200160208202803683370190505b50905060005b85518160ff16101562003557576000868260ff16815181106200320657634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008082604001516001600160401b0316119050600081156200326c578a836020015184604001518c6040516020016200324e9493929190620052ca565b604051602081830303815290604052805190602001209050620032a0565b8a83602001518b604051602001620032879392919062005291565b6040516020818303038152906040528051906020012090505b8251604051637b95236d60e11b815260009173fa34742085f577432caa712ae0a29bda56720a5a9163f72a46da91620032de91869060040162005758565b60206040518083038186803b158015620032f757600080fd5b505af41580156200330c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620033329190620047b4565b90506000620033428288620040f0565b90508060200151156200335a57505050505062003542565b600660029054906101000a90046001600160a01b03166001600160a01b031663b885c92d8f846040518363ffffffff1660e01b81526004016200339f92919062005781565b60206040518083038186803b158015620033b857600080fd5b505afa158015620033cd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620033f3919062004b0e565b620034125760405162461bcd60e51b8152600401620006e9906200554c565b60006200342f60008051602062005ef0833981519152846200233f565b90506200344c60008051602062005e90833981519152846200233f565b80620034555750805b620034895760405162461bcd60e51b815260206004820152600360248201526227252960e91b6044820152606401620006e9565b80156200349d57859a5060019850620034ad565b620034aa60018b6200590e565b99505b8288836000015181518110620034d357634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250508e836001600160a01b03167f1a475d149065d711c76ccc1c0c7825468ec25670345f7639baeef188d2936bb2886020015160405162003533919062005537565b60405180910390a35050505050505b6200354f6001826200590e565b9050620031d3565b5060065460ff610100909104811690841610801590620035745750815b620035935760405162461bcd60e51b8152600401620006e99062005569565b505050949350505050565b600654604051637306ac2d60e11b815260048101839052606091600091620100009091046001600160a01b03169063e60d585a9060240160006040518083038186803b158015620035ee57600080fd5b505afa15801562003603573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200362d919081019062004919565b9050805160026200363f919062005936565b6001600160401b038111156200366557634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156200368f578160200160208202803683370190505b5091506000805b8251811015620037a657828181518110620036c157634e487b7160e01b600052603260045260246000fd5b602002602001015160000151848381518110620036ee57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250508281815181106200372f57634e487b7160e01b600052603260045260246000fd5b602002602001015160200151848360016200374b9190620058f3565b815181106200376a57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03909216602092830291909101909101526200378f600283620058f3565b9150806200379d81620059bb565b91505062003696565b505050919050565b600080826001600160401b03811115620037d857634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801562003802578160200160208202803683370190505b50905060005b60ff811684111562003b5257600085858360ff168181106200383a57634e487b7160e01b600052603260045260246000fd5b90506060020180360381019062003852919062004df1565b604051637b95236d60e11b815273fa34742085f577432caa712ae0a29bda56720a5a9163f72a46da916200388c91908b9060040162005758565b60206040518083038186803b158015620038a557600080fd5b505af4158015620038ba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620038e09190620047b4565b90506001600160a01b038116620039235760405162461bcd60e51b8152600401620006e9906020808252600490820152630534947360e41b604082015260600190565b60065460405163b885c92d60e01b8152620100009091046001600160a01b03169063b885c92d906200395c908b90859060040162005781565b60206040518083038186803b1580156200397557600080fd5b505afa1580156200398a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620039b0919062004b0e565b620039cf5760405162461bcd60e51b8152600401620006e9906200554c565b620039ea60008051602062005ed0833981519152826200233f565b62003a1e5760405162461bcd60e51b815260206004820152600360248201526227222960e91b6044820152606401620006e9565b6000805b845181101562003ad85760006001600160a01b031685828151811062003a5857634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316141562003a765762003ad8565b84818151811062003a9757634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316836001600160a01b0316141562003ac3576001915062003ad8565b8062003acf81620059bb565b91505062003a22565b811562003ae85750505062003b3d565b62003af56001876200590e565b95508285828151811062003b1957634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250505050505b62003b4a6001826200590e565b905062003808565b5060065460ff908116908316101562003b7f5760405162461bcd60e51b8152600401620006e99062005569565b505050505050565b600080600760009054906101000a90046001600160a01b03166001600160a01b0316631504d8f06040518163ffffffff1660e01b8152600401602060405180830381600087803b15801562003bdb57600080fd5b505af115801562003bf0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003c16919062004e0f565b600654604051634d88078360e11b815260048101839052602481018690529192506201000090046001600160a01b031690639b100f0690604401600060405180830381600087803b15801562003c6b57600080fd5b505af115801562003c80573d6000803e3d6000fd5b505050504281847fd7ad9d18e3c3fd099dce052a028be71f22b08bebbb03ee00da643916412fccda60405160405180910390a492915050565b62003cc6600282620059d9565b1562003cfd5760405162461bcd60e51b8152602060048201526005602482015264455651545960d81b6044820152606401620006e9565b60005b8181101562000df657600083838381811062003d2c57634e487b7160e01b600052603260045260246000fd5b905060200201602081019062003d43919062004795565b90506000848462003d56856001620058f3565b81811062003d7457634e487b7160e01b600052603260045260246000fd5b905060200201602081019062003d8b919062004795565b905062003da860008051602062005eb0833981519152836200233f565b801562003dcb575062003dcb60008051602062005eb0833981519152826200233f565b62003e035760405162461bcd60e51b8152602060048201526007602482015266424144524f4c4560c81b6044820152606401620006e9565b6000604051806060016040528087878781811062003e3157634e487b7160e01b600052603260045260246000fd5b905060200201602081019062003e48919062004795565b6001600160a01b03168152602001878762003e65886001620058f3565b81811062003e8357634e487b7160e01b600052603260045260246000fd5b905060200201602081019062003e9a919062004795565b6001600160a01b03908116825260006020928301526006548a516040805163088ccce560e31b8152600481019290925285518416602483015293850151831660448201529284015160ff1660648401529293506201000090920490911690634466672890608401602060405180830381600087803b15801562003f1c57600080fd5b505af115801562003f31573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003f57919062004e0f565b5050505060028162003f6a9190620058f3565b905062003d00565b6000620023388383620041bf565b600062000685825490565b600081815260018301602052604081205462003fd45750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000685565b50600062000685565b62003fe982826200233f565b620009df5762003ff981620041f8565b620040068360206200420b565b6040516020016200401992919062005319565b60408051601f198184030181529082905262461bcd60e51b8252620006e99160040162005537565b6200404d82826200233f565b15620009df576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600062002338836001600160a01b03841662004400565b600081815260026020526040812054620040dd5761270f62000685565b5060009081526002602052604090205490565b60408051808201909152600080825260208201525b815181511015620006855780518251600091849181106200413657634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03161415620041545762000685565b818160000151815181106200417957634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316836001600160a01b03161415620041a8576001602082015262000685565b805181620041b682620059bb565b90525062004105565b6000826000018281548110620041e557634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b6060620006856001600160a01b03831660145b606060006200421c83600262005936565b62004229906002620058f3565b6001600160401b038111156200424f57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156200427a576020820181803683370190505b509050600360fc1b81600081518110620042a457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110620042e257634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060006200430884600262005936565b62004315906001620058f3565b90505b6001811115620043af576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106200435957634e487b7160e01b600052603260045260246000fd5b1a60f81b8282815181106200437e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c93620043a781620059a1565b905062004318565b508315620023385760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401620006e9565b600081815260018301602052604081205480156200451d5760006200442760018362005958565b85549091506000906200443d9060019062005958565b9050818114620044c15760008660000182815481106200446d57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050808760000184815481106200449f57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255918252600188019052604090208390555b8554869080620044e157634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505062000685565b600091505062000685565b61042d8062005a6383390190565b60006200454d6200454784620058c9565b62005870565b90508281528383830111156200456257600080fd5b6200233883602083018462005972565b60008083601f84011262004584578182fd5b5081356001600160401b038111156200459b578182fd5b6020830191508360208260051b8501011115620045b757600080fd5b9250929050565b60008083601f840112620045d0578182fd5b5081356001600160401b03811115620045e7578182fd5b602083019150836020606083028501011115620045b757600080fd5b600082601f83011262004614578081fd5b81356020620046276200454783620058a3565b80838252828201915082860187848660051b890101111562004647578586fd5b855b85811015620046675781358452928401929084019060010162004649565b5090979650505050505050565b805180151581146200468557600080fd5b919050565b60008083601f8401126200469c578182fd5b5081356001600160401b03811115620046b3578182fd5b602083019150836020828501011115620045b757600080fd5b600082601f830112620046dd578081fd5b8135620046ee6200454782620058c9565b81815284602083860101111562004703578283fd5b816020850160208301379081016020019190915292915050565b600082601f8301126200472e578081fd5b620023388383516020850162004536565b60006060828403121562004751578081fd5b6200475b6200581f565b905081356200476a8162005a52565b80825250602082013560208201526040820135604082015292915050565b8051620046858162005a3c565b600060208284031215620047a7578081fd5b8135620023388162005a26565b600060208284031215620047c6578081fd5b8151620023388162005a26565b60008060408385031215620047e6578081fd5b8235620047f38162005a26565b946020939093013593505050565b6000806000806060858703121562004817578182fd5b8435620048248162005a26565b93506020850135925060408501356001600160401b0381111562004846578283fd5b62004854878288016200468a565b95989497509550505050565b60008060408385031215620047e6578182fd5b6000602080838503121562004886578182fd5b82516001600160401b038111156200489c578283fd5b8301601f81018513620048ad578283fd5b8051620048be6200454782620058a3565b80828252848201915084840188868560051b8701011115620048de578687fd5b8694505b838510156200490d578051620048f88162005a26565b835260019490940193918501918501620048e2565b50979650505050505050565b600060208083850312156200492c578182fd5b82516001600160401b0381111562004942578283fd5b8301601f8101851362004953578283fd5b8051620049646200454782620058a3565b818152838101908385016060808502860187018a101562004983578788fd5b8795505b84861015620049f75780828b0312156200499f578788fd5b620049a96200581f565b8251620049b68162005a26565b815282880151620049c78162005a26565b81890152604083810151620049dc8162005a52565b90820152845260019590950194928601929081019062004987565b509098975050505050505050565b6000806000806000806000806080898b03121562004a21578586fd5b88356001600160401b038082111562004a38578788fd5b62004a468c838d0162004572565b909a50985060208b013591508082111562004a5f578788fd5b62004a6d8c838d0162004572565b909850965060408b013591508082111562004a86578586fd5b62004a948c838d0162004572565b909650945060608b013591508082111562004aad578384fd5b5062004abc8b828c01620045be565b999c989b5096995094979396929594505050565b60006020828403121562004ae2578081fd5b81356001600160401b0381111562004af8578182fd5b62004b068482850162004603565b949350505050565b60006020828403121562004b20578081fd5b620023388262004674565b60006020828403121562004b3d578081fd5b5035919050565b6000806040838503121562004b57578182fd5b82359150602083013562004b6b8162005a26565b809150509250929050565b6000806040838503121562004b89578182fd5b50508035926020909101359150565b60006020828403121562004baa578081fd5b81356001600160e01b03198116811462002338578182fd5b60006020828403121562004bd4578081fd5b81516001600160401b0381111562004bea578182fd5b8201601f8101841362004bfb578182fd5b62004b068482516020840162004536565b60006020828403121562004c1e578081fd5b81516001600160401b0381111562004c34578182fd5b62004b06848285016200471d565b60006020828403121562004c54578081fd5b81516001600160401b038082111562004c6b578283fd5b90830190610120828603121562004c80578283fd5b62004c8a6200584a565b8251815262004c9c6020840162004674565b60208201526040830151604082015260608301518281111562004cbd578485fd5b62004ccb878286016200471d565b60608301525060808301518281111562004ce3578485fd5b62004cf1878286016200471d565b60808301525060a08301518281111562004d09578485fd5b62004d17878286016200471d565b60a08301525062004d2b60c0840162004674565b60c082015262004d3e60e0840162004788565b60e08201526101009283015192810192909252509392505050565b60006020828403121562004d6b578081fd5b81516001600160401b038082111562004d82578283fd5b908301906060828603121562004d96578283fd5b62004da06200581f565b825162004dad8162005a26565b815260208301518281111562004dc1578485fd5b62004dcf878286016200471d565b60208301525062004de36040840162004674565b604082015295945050505050565b60006060828403121562004e03578081fd5b6200233883836200473f565b60006020828403121562004e21578081fd5b5051919050565b60008060006040848603121562004e3d578081fd5b8335925060208401356001600160401b0381111562004e5a578182fd5b62004e688682870162004572565b9497909650939450505050565b6000806040838503121562004e88578182fd5b8235915060208301356001600160401b0381111562004ea5578182fd5b62004eb38582860162004603565b9150509250929050565b60008060008060006060868803121562004ed5578283fd5b8535945060208601356001600160401b038082111562004ef3578485fd5b62004f0189838a016200468a565b9096509450604088013591508082111562004f1a578283fd5b5062004f298882890162004572565b969995985093965092949392505050565b60008060008060008060008060a0898b03121562004f56578182fd5b8835975060208901356001600160401b038082111562004f74578384fd5b62004f828c838d016200468a565b909950975060408b013591508082111562004f9b578384fd5b62004fa98c838d0162004572565b909750955060608b0135945060808b013591508082111562004aad578384fd5b6000806040838503121562004fdc578182fd5b8235915060208301356001600160401b0381111562004ff9578182fd5b62004eb385828601620046cc565b6000806000606084860312156200501c578081fd5b833592506020840135915060408401356001600160401b038082111562005041578283fd5b818601915086601f83011262005055578283fd5b8135620050666200454782620058a3565b80828252602082019150602085018a60208560051b880101111562005089578687fd5b865b848110156200512e578582351115620050a2578788fd5b8135870160a0818e03601f19011215620050ba578889fd5b620050c46200581f565b620050d38e602084016200473f565b8152608082013588811115620050e7578a8bfd5b620050f88f602083860101620046cc565b60208301525060a08201359150620051108262005a3c565b6040810191909152845260209384019391909101906001016200508b565b505080955050505050509250925092565b60006020828403121562005151578081fd5b8135620023388162005a52565b6000815180845260208085019450808401835b83811015620051985781516001600160a01b03168752958201959082019060010162005171565b509495945050505050565b81835260006001600160fb1b03831115620051bc578081fd5b8260051b80836020870137939093016020019283525090919050565b60008151808452620051f281602086016020860162005972565b601f01601f19169290920160200192915050565b600082516200521a81846020870162005972565b9190910192915050565b600087516020620052398285838d0162005972565b9083019087898337908701828152869190835b878110156200527e578335620052628162005a26565b6001600160a01b0316825292820192908201906001016200524c565b5094855290930198975050505050505050565b60008451620052a581846020890162005972565b845190830190620052bb81836020890162005972565b01928352505060200192915050565b60008551620052de818460208a0162005972565b855190830190620052f4818360208a0162005972565b60c09590951b6001600160c01b03191694019384525050600882015260280192915050565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b8152600083516200534d81601785016020880162005972565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516200538081602884016020880162005972565b01602801949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b038a16815260a06020808301829052600091620053e29084018b8d620051a3565b8381036040858101919091528982528a918301845b8b811015620054295783356200540d8162005a3c565b6001600160401b031682529284019290840190600101620053f7565b50606092508581038387015262005442818a8c620051a3565b86810360808801528781528891508401855b88811015620054905782356200546a8162005a52565b60ff16825282860135868301528383013584830152918401919084019060010162005454565b509f9e505050505050505050505050505050565b6001600160a01b03929092168252602082015260400190565b6020815260006200233860208301846200515e565b6020808252825182820181905260009190848201906040850190845b818110156200550c57835183529284019291840191600101620054ee565b50909695505050505050565b60208152600062004b06602083018486620051a3565b90815260200190565b602081526000620023386020830184620051d8565b6020808252600390820152624e534560e81b604082015260600190565b6020808252600390820152624e454160e81b604082015260600190565b60208082526007908201526614d251d554d15160ca1b604082015260600190565b60208152600060018060a01b038084511660208401528060208501511660408401528060408501511660608401525060608301516080830152608083015160e060a0840152620055fc6101008401826200515e565b905060a08401516200561960c08501826001600160401b03169052565b5060c0840151838203601f190160e08501526200563782826200515e565b95945050505050565b60208152815160208201526000602083015162005661604084018215159052565b506040830151606083015260608301516101208060808501526200568a610140850183620051d8565b91506080850151601f19808685030160a0870152620056aa8483620051d8565b935060a08701519150808685030160c087015250620056ca8382620051d8565b92505060c0850151620056e160e086018215159052565b5060e0850151610100620056ff818701836001600160401b03169052565b959095015193019290925250919050565b602080825282516001600160a01b03168282015282015160606040830152600090620057406080840182620051d8565b90506040840151151560608401528091505092915050565b825160ff1681526020808401519082015260409283015192810192909252606082015260800190565b9182526001600160a01b0316602082015260400190565b83815260406020808301829052908201839052600090849060608401835b868110156200490d578335620057cc8162005a26565b6001600160a01b031682529282019290820190600101620057b6565b83815260406020820152600062005637604083018486620051a3565b82815260406020820152600062004b066040830184620051d8565b604051606081016001600160401b038111828210171562005844576200584462005a10565b60405290565b60405161012081016001600160401b038111828210171562005844576200584462005a10565b604051601f8201601f191681016001600160401b03811182821017156200589b576200589b62005a10565b604052919050565b60006001600160401b03821115620058bf57620058bf62005a10565b5060051b60200190565b60006001600160401b03821115620058e557620058e562005a10565b50601f01601f191660200190565b60008219821115620059095762005909620059fa565b500190565b600060ff821660ff84168060ff038211156200592e576200592e620059fa565b019392505050565b6000816000190483118215151615620059535762005953620059fa565b500290565b6000828210156200596d576200596d620059fa565b500390565b60005b838110156200598f57818101518382015260200162005975565b8381111562000df65750506000910152565b600081620059b357620059b3620059fa565b506000190190565b6000600019821415620059d257620059d2620059fa565b5060010190565b600082620059f557634e487b7160e01b81526012600452602481fd5b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811462002da157600080fd5b6001600160401b038116811462002da157600080fd5b60ff8116811462002da157600080fdfe608060405234801561001057600080fd5b5060405161042d38038061042d83398101604081905261002f91610086565b60008054610100600160a81b0319166101006001600160a01b0394851602179055600180546001600160a01b031916919092161790556100b8565b80516001600160a01b038116811461008157600080fd5b919050565b60008060408385031215610098578182fd5b6100a18361006a565b91506100af6020840161006a565b90509250929050565b610366806100c76000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80638730907d14610030575b600080fd5b61004361003e3660046102a1565b610045565b005b61004d61021f565b6001600160a01b0316336001600160a01b0316146100bc5760405162461bcd60e51b815260206004820152602160248201527f4f6e6c79206163746976652044414f20636f6e74726163742063616e2063616c6044820152601b60fa1b60648201526084015b60405180910390fd5b60005460ff16156101075760405162461bcd60e51b8152602060048201526015602482015274105b1b1bddd85b98d948185b1c9958591e481cd95d605a1b60448201526064016100b3565b6000546040516370a0823160e01b81523060048201526101009091046001600160a01b03169063095ea7b390839083906370a082319060240160206040518083038186803b15801561015857600080fd5b505afa15801561016c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101909190610300565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156101d657600080fd5b505af11580156101ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061020e91906102e0565b50506000805460ff19166001179055565b60015460408051638da5cb5b60e01b815290516000926001600160a01b031691638da5cb5b916004808301926020929190829003018186803b15801561026457600080fd5b505afa158015610278573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061029c91906102c4565b905090565b6000602082840312156102b2578081fd5b81356102bd81610318565b9392505050565b6000602082840312156102d5578081fd5b81516102bd81610318565b6000602082840312156102f1578081fd5b815180151581146102bd578182fd5b600060208284031215610311578081fd5b5051919050565b6001600160a01b038116811461032d57600080fd5b5056fea2646970667358221220df6ce501b456e750aaeb8dd4241f7b2f538b22341ab1e1ae6e84594b1e071f3264736f6c63430008040033f8fa0a2e0b6ae44d5bf1084b5461fa6a8a39a79c4c89f13d35cb8e2a5b7508beb08f18b377dfeb1adcf649b816ad935bc75cd52dfb3feb6a6a8b44734e7d591025ea27e619be352cf4fd698124bbe5308ffed622135530e33923e301c660f5f72e136f43fa0cd081cd9e0fdc6cae79be691d06a820f16995861d106a8e143eae990cb964b4a72fbafc6352f5b02e3044a1b1fa91add1d44fe262863f1108d0cca2646970667358221220aa44e19c3dd330bd005451209360fa08aebfe75b7b88c8b1a00eabd011c5d66e64736f6c63430008040033608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6126488061007e6000396000f3fe608060405234801561001057600080fd5b50600436106102465760003560e01c8063015a56e91461024b5780630b791430146102605780630e4bd7861461029157806310a0cc3e146102b157806313db4e1a146102c357806317f70cb4146102cb578063196f3ff3146102de5780632065bbb4146102f1578063215fd45e1461031c578063243d65851461035d5780632ada2596146103665780632e3c0e1f146103865780633a12aa631461039957806344666728146103bb578063514de5af146103ce57806351be1af0146103ee578063538f0526146104015780635d1222aa1461041457806363b2bfe51461041d5780636b13d00f1461043d5780636b25e4de146104505780636d1884e01461047b57806370ddec881461048e578063715018a6146104a157806371827942146104a957806374cea223146104c95780637f5c1515146104f257806388a625e2146105055780638ad9b579146105385780638da5cb5b14610558578063948850ac1461056057806395ae9334146105735780639ab5fddd146105865780639b100f06146105a65780639f2ca71f146105b9578063a4e2291f146105cc578063a81c3f3214610608578063ad2c2a881461061b578063b878582e1461062e578063b885c92d14610641578063c96259e11461066f578063cbe0619514610682578063d1e1343a14610695578063daa64f95146106a8578063e60d585a146106bb578063f28e87b6146106db578063f2fde38b14610709578063f360c1831461071c578063fa97ed2a1461072f578063ff355e7c14610758575b600080fd5b61025e610259366004611cc8565b61076b565b005b61027361026e366004611cc8565b610791565b604051610288999897969594939291906122cb565b60405180910390f35b6102a461029f366004611cc8565b610999565b60405161028891906121ab565b6012545b604051908152602001610288565b61025e610a33565b6102b56102d9366004611d01565b610a55565b61025e6102ec366004611ff8565b610a88565b6102b56102ff366004611d89565b805160208183018101805160088252928201919093012091525481565b61034561032a366004611cc8565b600a602052600090815260409020546001600160401b031681565b6040516001600160401b039091168152602001610288565b6102b560105481565b610379610374366004611c81565b610b29565b6040516102889190612285565b61025e610394366004611c81565b610c34565b6103ac6103a7366004611c81565b610c8e565b60405161028893929190612088565b6102b56103c9366004611fcc565b610d46565b6103e16103dc366004611cc8565b610ddc565b60405161028891906121be565b61025e6103fc366004611c81565b611049565b61025e61040f366004611f2c565b611073565b6102b560115481565b61043061042b366004611cc8565b61109a565b6040516102889190612173565b61025e61044b366004611ce0565b6110fc565b61046361045e366004611cc8565b611116565b6040516001600160a01b039091168152602001610288565b6103e1610489366004611cc8565b611140565b6102a461049c366004611cc8565b611169565b61025e611209565b6104bc6104b7366004611cc8565b61121d565b60405161028891906120be565b6104636104d7366004611cc8565b6007602052600090815260409020546001600160a01b031681565b61025e610500366004611d40565b611288565b610528610513366004611cc8565b60016020526000908152604090205460ff1681565b6040519015158152602001610288565b6102b5610546366004611cc8565b600c6020526000908152604090205481565b6104636112b8565b61046361056e366004611ce0565b6112c7565b61025e610581366004611f75565b6112ff565b6102b5610594366004611cc8565b60096020526000908152604090205481565b61025e6105b4366004611ce0565b61132b565b6102b56105c7366004611cc8565b611345565b6105df6105da366004611ce0565b611362565b604080516001600160a01b03948516815293909216602084015260ff1690820152606001610288565b6102b5610616366004611dc3565b6113b5565b6102b5610629366004611ce0565b6115aa565b61025e61063c366004611f2c565b6115db565b61052861064f366004611efd565b600360209081526000928352604080842090915290825290205460ff1681565b61025e61067d366004611efd565b611688565b610463610690366004611cc8565b6116be565b61025e6106a3366004611ec6565b6116fc565b601354610463906001600160a01b031681565b6106ce6106c9366004611cc8565b611739565b604051610288919061210b565b6105286106e9366004611c9d565b600d60209081526000928352604080842090915290825290205460ff1681565b61025e610717366004611c81565b6117d7565b61025e61072a366004611cc8565b611855565b61046361073d366004611cc8565b6000908152600760205260409020546001600160a01b031690565b61025e610766366004611c9d565b611862565b61077361189a565b6000908152600160208190526040909120805460ff19169091179055565b601281815481106107a157600080fd5b6000918252602090912060089091020180546001820154600283015460038401805493955060ff9092169390929091906107da906124b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610806906124b7565b80156108535780601f1061082857610100808354040283529160200191610853565b820191906000526020600020905b81548152906001019060200180831161083657829003601f168201915b505050505090806004018054610868906124b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610894906124b7565b80156108e15780601f106108b6576101008083540402835291602001916108e1565b820191906000526020600020905b8154815290600101906020018083116108c457829003601f168201915b5050505050908060050180546108f6906124b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610922906124b7565b801561096f5780601f106109445761010080835404028352916020019161096f565b820191906000526020600020905b81548152906001019060200180831161095257829003601f168201915b505050506006830154600790930154919260ff8116926101009091046001600160401b0316915089565b600e60205260009081526040902080546109b2906124b7565b80601f01602080910402602001604051908101604052809291908181526020018280546109de906124b7565b8015610a2b5780601f10610a0057610100808354040283529160200191610a2b565b820191906000526020600020905b815481529060010190602001808311610a0e57829003601f168201915b505050505081565b610a3b61189a565b600160106000828254610a4e9190612370565b9091555050565b6000610a5f61189a565b60088383604051610a71929190612078565b908152602001604051809103902054905092915050565b610a9061189a565b6000838152600460205260409020805483919083908110610ac157634e487b7160e01b600052603260045260246000fd5b6000918252602091829020835160029092020180546001600160a01b039283166001600160a01b0319909116178155918301516001909201805460409094015160ff16600160a01b026001600160a81b03199094169290911691909117919091179055505050565b610b58604051806060016040528060006001600160a01b03168152602001606081526020016000151581525090565b6001600160a01b038083166000908152600260209081526040918290208251606081019093528054909316825260018301805492939291840191610b9b906124b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc7906124b7565b8015610c145780601f10610be957610100808354040283529160200191610c14565b820191906000526020600020905b815481529060010190602001808311610bf757829003601f168201915b50505091835250506002919091015460ff16151560209091015292915050565b610c3c61189a565b600680546001810182556000919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b0392909216919091179055565b600260205260009081526040902080546001820180546001600160a01b039092169291610cba906124b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce6906124b7565b8015610d335780601f10610d0857610100808354040283529160200191610d33565b820191906000526020600020905b815481529060010190602001808311610d1657829003601f168201915b5050506002909301549192505060ff1683565b6000610d5061189a565b6000838152600460209081526040808320805460018181018355828652848620885160029093020180546001600160a01b039384166001600160a01b03199091161781559488015194810180549489015160ff16600160a01b026001600160a81b0319909516959092169490941792909217909155918590529054610dd59190612388565b9392505050565b610de4611949565b600082815260096020526040902054601280549091908110610e1657634e487b7160e01b600052603260045260246000fd5b906000526020600020906008020160405180610120016040529081600082015481526020016001820160009054906101000a900460ff1615151515815260200160028201548152602001600382018054610e6f906124b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9b906124b7565b8015610ee85780601f10610ebd57610100808354040283529160200191610ee8565b820191906000526020600020905b815481529060010190602001808311610ecb57829003601f168201915b50505050508152602001600482018054610f01906124b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610f2d906124b7565b8015610f7a5780601f10610f4f57610100808354040283529160200191610f7a565b820191906000526020600020905b815481529060010190602001808311610f5d57829003601f168201915b50505050508152602001600582018054610f93906124b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610fbf906124b7565b801561100c5780601f10610fe15761010080835404028352916020019161100c565b820191906000526020600020905b815481529060010190602001808311610fef57829003601f168201915b5050509183525050600682015460ff81161515602083015261010090046001600160401b0316604082015260079091015460609091015292915050565b61105161189a565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b61107b61189a565b6000838152600b602052604090206110949083836119a2565b50505050565b6000818152600b60209081526040918290208054835181840281018401909452808452606093928301828280156110f057602002820191906000526020600020905b8154815260200190600101908083116110dc575b50505050509050919050565b61110461189a565b6000918252600f602052604090912055565b6006818154811061112657600080fd5b6000918252602090912001546001600160a01b0316905081565b611148611949565b60128281548110610e1657634e487b7160e01b600052603260045260246000fd5b606061117361189a565b6000828152600e60205260409020805461118c906124b7565b80601f01602080910402602001604051908101604052809291908181526020018280546111b8906124b7565b80156110f05780601f106111da576101008083540402835291602001916110f0565b820191906000526020600020905b8154815290600101906020018083116111e85750939450505050505b919050565b61121161189a565b61121b60006118f9565b565b6000818152600560209081526040918290208054835181840281018401909452808452606093928301828280156110f057602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161125f5750505050509050919050565b61129061189a565b80600884846040516112a3929190612078565b90815260405190819003602001902055505050565b6000546001600160a01b031690565b600560205281600052604060002081815481106112e357600080fd5b6000918252602090912001546001600160a01b03169150829050565b61130761189a565b6000828152600e602090815260409091208251611326928401906119ed565b505050565b61133361189a565b60009182526009602052604090912055565b600061134f61189a565b506000908152600f602052604090205490565b6004602052816000526040600020818154811061137e57600080fd5b6000918252602090912060029091020180546001909101546001600160a01b0391821693509081169150600160a01b900460ff1683565b60006113bf61189a565b8160200151156114cb578160128360000151815481106113ef57634e487b7160e01b600052603260045260246000fd5b60009182526020918290208351600892909202019081558282015160018201805460ff191691151591909117905560408301516002820155606083015180519192611442926003850192909101906119ed565b506080820151805161145e9160048401916020909101906119ed565b5060a0820151805161147a9160058401916020909101906119ed565b5060c082015160068201805460e08501516001600160481b0319909116921515610100600160481b031916929092176101006001600160401b03909316830217905590910151600790910155505190565b60128054808452600160208086018281529183018455600093909352845160089092027fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec3444810192835590517fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34458201805491151560ff1990921691909117905560408501517fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec3446820155606085015180518694611442937fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec3447019201906119ed565b600b60205281600052604060002081815481106115c657600080fd5b90600052602060002001600091509150505481565b6115e361189a565b60005b8181101561166e57600084815260036020526040812060019185858581811061161f57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906116349190611c81565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611666816124f2565b9150506115e6565b506000838152600560205260409020611094908383611a61565b61169061189a565b60009182526007602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b6000600682815481106116e157634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031692915050565b61170461189a565b80600260006117166020840184611c81565b6001600160a01b031681526020810191909152604001600020611326828261254c565b606060046000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156117cc576000848152602090819020604080516060810182526002860290920180546001600160a01b03908116845260019182015490811684860152600160a01b900460ff1691830191909152908352909201910161176e565b505050509050919050565b6117df61189a565b6001600160a01b0381166118495760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b611852816118f9565b50565b61185d61189a565b601155565b61186a61189a565b6001600160a01b039091166000908152600d6020908152604080832093835292905220805460ff19166001179055565b336118a36112b8565b6001600160a01b03161461121b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611840565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604051806101200160405280600081526020016000151581526020016000815260200160608152602001606081526020016060815260200160001515815260200160006001600160401b03168152602001600081525090565b8280548282559060005260206000209081019282156119dd579160200282015b828111156119dd5782358255916020019190600101906119c2565b506119e9929150611ab4565b5090565b8280546119f9906124b7565b90600052602060002090601f016020900481019282611a1b57600085556119dd565b82601f10611a3457805160ff19168380011785556119dd565b828001600101855582156119dd579182015b828111156119dd578251825591602001919060010190611a46565b8280548282559060005260206000209081019282156119dd579160200282015b828111156119dd5781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190611a81565b5b808211156119e95760008155600101611ab5565b60006001600160401b0380841115611ae357611ae3612523565b604051601f8501601f19908116603f01168101908282118183101715611b0b57611b0b612523565b81604052809350858152868686011115611b2457600080fd5b858560208301376000602087830101525050509392505050565b60008083601f840112611b4f578081fd5b5081356001600160401b03811115611b65578182fd5b6020830191508360208260051b8501011115611b8057600080fd5b9250929050565b803561120481612604565b60008083601f840112611ba3578182fd5b5081356001600160401b03811115611bb9578182fd5b602083019150836020828501011115611b8057600080fd5b600082601f830112611be1578081fd5b610dd583833560208501611ac9565b600060608284031215611c01578081fd5b604051606081016001600160401b0381118282101715611c2357611c23612523565b6040529050808235611c34816125ef565b81526020830135611c44816125ef565b6020820152604083013560ff81168114611c5d57600080fd5b6040919091015292915050565b80356001600160401b038116811461120457600080fd5b600060208284031215611c92578081fd5b8135610dd5816125ef565b60008060408385031215611caf578081fd5b8235611cba816125ef565b946020939093013593505050565b600060208284031215611cd9578081fd5b5035919050565b60008060408385031215611cf2578182fd5b50508035926020909101359150565b60008060208385031215611d13578182fd5b82356001600160401b03811115611d28578283fd5b611d3485828601611b92565b90969095509350505050565b600080600060408486031215611d54578081fd5b83356001600160401b03811115611d69578182fd5b611d7586828701611b92565b909790965060209590950135949350505050565b600060208284031215611d9a578081fd5b81356001600160401b03811115611daf578182fd5b611dbb84828501611bd1565b949350505050565b600060208284031215611dd4578081fd5b81356001600160401b0380821115611dea578283fd5b908301906101208286031215611dfe578283fd5b611e06612347565b82358152611e1660208401611b87565b602082015260408301356040820152606083013582811115611e36578485fd5b611e4287828601611bd1565b606083015250608083013582811115611e59578485fd5b611e6587828601611bd1565b60808301525060a083013582811115611e7c578485fd5b611e8887828601611bd1565b60a083015250611e9a60c08401611b87565b60c0820152611eab60e08401611c6a565b60e08201526101009283013592810192909252509392505050565b600060208284031215611ed7578081fd5b81356001600160401b03811115611eec578182fd5b820160608185031215610dd5578182fd5b60008060408385031215611f0f578182fd5b823591506020830135611f21816125ef565b809150509250929050565b600080600060408486031215611f40578081fd5b8335925060208401356001600160401b03811115611f5c578182fd5b611f6886828701611b3e565b9497909650939450505050565b60008060408385031215611f87578182fd5b8235915060208301356001600160401b03811115611fa3578182fd5b8301601f81018513611fb3578182fd5b611fc285823560208401611ac9565b9150509250929050565b60008060808385031215611fde578182fd5b82359150611fef8460208501611bf0565b90509250929050565b600080600060a0848603121561200c578081fd5b8335925061201d8560208601611bf0565b9150608084013590509250925092565b60008151808452815b8181101561205257602081850181015186830182015201612036565b818111156120635782602083870101525b50601f01601f19169290920160200192915050565b8183823760009101908152919050565b6001600160a01b03841681526060602082018190526000906120ac9083018561202d565b90508215156040830152949350505050565b6020808252825182820181905260009190848201906040850190845b818110156120ff5783516001600160a01b0316835292840192918401916001016120da565b50909695505050505050565b602080825282518282018190526000919060409081850190868401855b8281101561216657815180516001600160a01b03908116865287820151168786015285015160ff168585015260609093019290850190600101612128565b5091979650505050505050565b6020808252825182820181905260009190848201906040850190845b818110156120ff5783518352928401929184019160010161218f565b602081526000610dd5602083018461202d565b6020815281516020820152600060208301516121de604084018215159052565b5060408301516060830152606083015161012080608085015261220561014085018361202d565b91506080850151601f19808685030160a0870152612223848361202d565b935060a08701519150808685030160c087015250612241838261202d565b92505060c085015161225760e086018215159052565b5060e0850151610100612274818701836001600160401b03169052565b959095015193019290925250919050565b602080825282516001600160a01b031682820152820151606060408301526000906122b3608084018261202d565b90506040840151151560608401528091505092915050565b60006101208b83528a151560208401528960408401528060608401526122f38184018a61202d565b90508281036080840152612307818961202d565b905082810360a084015261231b818861202d565b95151560c084015250506001600160401b039290921660e0830152610100909101529695505050505050565b60405161012081016001600160401b038111828210171561236a5761236a612523565b60405290565b600082198211156123835761238361250d565b500190565b60008282101561239a5761239a61250d565b500390565b5b818110156123b457600081556001016123a0565b5050565b6001600160401b038311156123cf576123cf612523565b6123d981546124b7565b600080601f8611601f8411818117156123f85760008681526020902092505b801561242757601f880160051c830160208910156124135750825b612425601f870160051c85018261239f565b505b50806001811461245b57600094508715612442578387013594505b600188901b60001960038a901b1c1986161786556124ad565b601f198816945082845b868110156124855788860135825560209586019560019092019101612465565b50888610156124a25760001960f88a60031b161c19858901351681555b5060018860011b0186555b5050505050505050565b600181811c908216806124cb57607f821691505b602082108114156124ec57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156125065761250661250d565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6000813561254681612604565b92915050565b8135612557816125ef565b81546001600160a01b0319166001600160a01b0391909116178155602082013536839003601e1901811261258a57600080fd5b820180356001600160401b038111156125a257600080fd5b6020820191508036038213156125b757600080fd5b6125c58183600186016123b8565b50506123b46125d660408401612539565b6002830160ff1981541660ff8315151681178255505050565b6001600160a01b038116811461185257600080fd5b801515811461185257600080fdfea2646970667358221220027f89d74901d873ced952574939ee69cf20eb0953b8ba8a46a5fba576ae305164736f6c6343000804003360806040523480156200001157600080fd5b50604051806040016040528060068152602001654b617261746560d01b815250604051806040016040528060068152602001654b415241544560d01b8152506200006a62000064620000d660201b60201c565b620000da565b81516200007f9060049060208501906200037d565b508051620000959060059060208401906200037d565b5050506000633b9aca00604d620000ad91906200043e565b620000c190670de0b6b3a76400006200043e565b9050620000cf33826200012a565b50620004cd565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038216620001855760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b620001936000838362000200565b8060036000828254620001a7919062000423565b90915550506001600160a01b0382166000818152600160209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b620002188383836200023c60201b620005781760201c565b6001600160a01b038316620002415762000232826200026c565b6200023c620002a5565b505050565b6001600160a01b0382166200025b5762000232836200026c565b62000266836200026c565b6200023c825b6001600160a01b0381166000908152600660209081526040808320600190925290912054620002a29190620002b7565b620002b7565b50565b620002b560076200029c60035490565b565b6000620002c362000306565b905080620002d18462000324565b10156200023c578254600180820185556000858152602080822090930193909355938401805494850181558252902090910155565b60006200031f60096200037960201b6200057d1760201c565b905090565b80546000906200033657506000919050565b81548290620003489060019062000460565b815481106200036757634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b5490565b8280546200038b906200047a565b90600052602060002090601f016020900481019282620003af5760008555620003fa565b82601f10620003ca57805160ff1916838001178555620003fa565b82800160010185558215620003fa579182015b82811115620003fa578251825591602001919060010190620003dd565b50620004089291506200040c565b5090565b5b808211156200040857600081556001016200040d565b60008219821115620004395762000439620004b7565b500190565b60008160001904831182151516156200045b576200045b620004b7565b500290565b600082821015620004755762000475620004b7565b500390565b600181811c908216806200048f57607f821691505b60208210811415620004b157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b610fac80620004dd6000396000f3fe608060405234801561001057600080fd5b50600436106100f15760003560e01c806306fdde03146100f6578063095ea7b3146101145780631504d8f01461013757806318160ddd1461014d57806323b872dd14610155578063313ce56714610168578063395093511461017757806340c10f191461018a5780634ee2cd7e1461019f5780635439ad86146101b257806370a08231146101ba578063715018a6146101cd5780638da5cb5b146101d557806395d89b41146101f5578063981b24d0146101fd578063a457c2d714610210578063a9059cbb14610223578063dd62ed3e14610236578063f2fde38b14610249575b600080fd5b6100fe61025c565b60405161010b9190610e63565b60405180910390f35b610127610122366004610e22565b6102ee565b604051901515815260200161010b565b61013f610308565b60405190815260200161010b565b60035461013f565b610127610163366004610de7565b61031f565b6040516012815260200161010b565b610127610185366004610e22565b610343565b61019d610198366004610e22565b610365565b005b61013f6101ad366004610e22565b61037b565b61013f6103c4565b61013f6101c8366004610d9b565b6103ce565b61019d6103e9565b6101dd6103fd565b6040516001600160a01b03909116815260200161010b565b6100fe61040c565b61013f61020b366004610e4b565b61041b565b61012761021e366004610e22565b610446565b610127610231366004610e22565b6104c6565b61013f610244366004610db5565b6104d4565b61019d610257366004610d9b565b6104ff565b60606004805461026b90610f05565b80601f016020809104026020016040519081016040528092919081815260200182805461029790610f05565b80156102e45780601f106102b9576101008083540402835291602001916102e4565b820191906000526020600020905b8154815290600101906020018083116102c757829003601f168201915b5050505050905090565b6000336102fc818585610581565b60019150505b92915050565b60006103126106a5565b61031a610704565b905090565b60003361032d85828561075e565b6103388585856107d8565b506001949350505050565b6000336102fc81858561035683836104d4565b6103609190610eb6565b610581565b61036d6106a5565b610377828261097c565b5050565b6001600160a01b0382166000908152600660205260408120819081906103a2908590610a37565b91509150816103b9576103b4856103ce565b6103bb565b805b95945050505050565b600061031a610b3c565b6001600160a01b031660009081526001602052604090205490565b6103f16106a5565b6103fb6000610b47565b565b6000546001600160a01b031690565b60606005805461026b90610f05565b600080600061042b846007610a37565b915091508161043c5760035461043e565b805b949350505050565b6000338161045482866104d4565b9050838110156104b95760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b6103388286868403610581565b6000336102fc8185856107d8565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6105076106a5565b6001600160a01b03811661056c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104b0565b61057581610b47565b50565b505050565b5490565b6001600160a01b0383166105e35760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104b0565b6001600160a01b0382166106445760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104b0565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b336106ae6103fd565b6001600160a01b0316146103fb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104b0565b6000610714600980546001019055565b600061071e610b3c565b90507f8030e83b04d87bef53480e26263266d6ca66863aa8506aca6f2559d18aa1cb678160405161075191815260200190565b60405180910390a1919050565b600061076a84846104d4565b905060001981146107d257818110156107c55760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104b0565b6107d28484848403610581565b50505050565b6001600160a01b03831661083c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104b0565b6001600160a01b03821661089e5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104b0565b6108a9838383610b97565b6001600160a01b038316600090815260016020526040902054818110156109215760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104b0565b6001600160a01b038085166000818152600160205260408082208686039055928616808252908390208054860190559151600080516020610f578339815191529061096f9086815260200190565b60405180910390a36107d2565b6001600160a01b0382166109d25760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104b0565b6109de60008383610b97565b80600360008282546109f09190610eb6565b90915550506001600160a01b038216600081815260016020908152604080832080548601905551848152600080516020610f57833981519152910160405180910390a35050565b60008060008411610a835760405162461bcd60e51b815260206004820152601660248201527504552433230536e617073686f743a20696420697320360541b60448201526064016104b0565b610a8b610b3c565b841115610ada5760405162461bcd60e51b815260206004820152601d60248201527f4552433230536e617073686f743a206e6f6e6578697374656e7420696400000060448201526064016104b0565b6000610ae68486610bdf565b8454909150811415610aff576000809250925050610b35565b6001846001018281548110610b2457634e487b7160e01b600052603260045260246000fd5b906000526020600020015492509250505b9250929050565b600061031a60095490565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038316610bb657610bae82610c8a565b610578610cb4565b6001600160a01b038216610bcd57610bae83610c8a565b610bd683610c8a565b61057882610c8a565b8154600090610bf057506000610302565b82546000905b80821015610c3d576000610c0a8383610cc2565b60008781526020902090915085908201541115610c2957809150610c37565b610c34816001610eb6565b92505b50610bf6565b600082118015610c69575083610c6686610c58600186610eee565b600091825260209091200190565b54145b15610c8257610c79600183610eee565b92505050610302565b509050610302565b6001600160a01b038116600090815260066020526040902061057590610caf836103ce565b610ce4565b6103fb6007610caf60035490565b6000610cd16002848418610ece565b610cdd90848416610eb6565b9392505050565b6000610cee610b3c565b905080610cfa84610d2e565b1015610578578254600180820185556000858152602080822090930193909355938401805494850181558252902090910155565b8054600090610d3f57506000919050565b81548290610d4f90600190610eee565b81548110610d6d57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b919050565b80356001600160a01b0381168114610d7f57600080fd5b600060208284031215610dac578081fd5b610cdd82610d84565b60008060408385031215610dc7578081fd5b610dd083610d84565b9150610dde60208401610d84565b90509250929050565b600080600060608486031215610dfb578081fd5b610e0484610d84565b9250610e1260208501610d84565b9150604084013590509250925092565b60008060408385031215610e34578182fd5b610e3d83610d84565b946020939093013593505050565b600060208284031215610e5c578081fd5b5035919050565b6000602080835283518082850152825b81811015610e8f57858101830151858201604001528201610e73565b81811115610ea05783604083870101525b50601f01601f1916929092016040019392505050565b60008219821115610ec957610ec9610f40565b500190565b600082610ee957634e487b7160e01b81526012600452602481fd5b500490565b600082821015610f0057610f00610f40565b500390565b600181811c90821680610f1957607f821691505b60208210811415610f3a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220e23a981f31639ffde59d8797d326b755aeac22250ffac2001712012524d0e55564736f6c63430008040033608060405234801561001057600080fd5b5060405161042d38038061042d83398101604081905261002f91610086565b60008054610100600160a81b0319166101006001600160a01b0394851602179055600180546001600160a01b031916919092161790556100b8565b80516001600160a01b038116811461008157600080fd5b919050565b60008060408385031215610098578182fd5b6100a18361006a565b91506100af6020840161006a565b90509250929050565b610366806100c76000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80638730907d14610030575b600080fd5b61004361003e3660046102a1565b610045565b005b61004d61021f565b6001600160a01b0316336001600160a01b0316146100bc5760405162461bcd60e51b815260206004820152602160248201527f4f6e6c79206163746976652044414f20636f6e74726163742063616e2063616c6044820152601b60fa1b60648201526084015b60405180910390fd5b60005460ff16156101075760405162461bcd60e51b8152602060048201526015602482015274105b1b1bddd85b98d948185b1c9958591e481cd95d605a1b60448201526064016100b3565b6000546040516370a0823160e01b81523060048201526101009091046001600160a01b03169063095ea7b390839083906370a082319060240160206040518083038186803b15801561015857600080fd5b505afa15801561016c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101909190610300565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156101d657600080fd5b505af11580156101ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061020e91906102e0565b50506000805460ff19166001179055565b60015460408051638da5cb5b60e01b815290516000926001600160a01b031691638da5cb5b916004808301926020929190829003018186803b15801561026457600080fd5b505afa158015610278573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061029c91906102c4565b905090565b6000602082840312156102b2578081fd5b81356102bd81610318565b9392505050565b6000602082840312156102d5578081fd5b81516102bd81610318565b6000602082840312156102f1578081fd5b815180151581146102bd578182fd5b600060208284031215610311578081fd5b5051919050565b6001600160a01b038116811461032d57600080fd5b5056fea2646970667358221220df6ce501b456e750aaeb8dd4241f7b2f538b22341ab1e1ae6e84594b1e071f3264736f6c6343000804003325ea27e619be352cf4fd698124bbe5308ffed622135530e33923e301c660f5f70000000000000000000000000000000000000000000000000000000000000040000000000000000000000000250e2071c82a0a4c28f5aed802e68310f70b5d96000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000031a17e847807b1bc000000
Deployed Bytecode
0x60806040523480156200001157600080fd5b5060043610620002265760003560e01c806301ffc9a7146200022b57806311ffb1d41462000257578063248a9ca314620002705780632b0bca5d14620002965780632dcdc96814620002ad5780632f2ff15d14620002c45780633025458914620002db5780633210a13114620002f25780633470a4cd146200030957806336568abe146200032057806340c10f19146200033757806342748220146200034e578063473d1b12146200036557806349df7208146200037c57806350750f251462000393578063538f0526146200039d578063570ea1fd14620003b457806359d2271d14620003da578063745280eb14620003f1578063778c1cbf14620004085780637e6b3afa146200041f5780638bf126ec14620004365780638cccf809146200044d5780639010d07c146200047357806391d14854146200049957806397be464f14620004b057806397cb55cb14620004c75780639a508c8e14620004dc5780639ce32d5814620004e6578063a217fddf14620004fd578063a9059cbb1462000506578063b1b0af9f146200051d578063b266ee321462000545578063babf3b9a146200055f578063ca15c8731462000585578063d4ee1543146200059c578063d547741f14620005bf578063e2235f7614620005d6578063f06cac4614620005ed578063f53581881462000604578063f76b70f4146200061b578063f8749a581462000632578063fc0c546a1462000649575b600080fd5b620002426200023c36600462004b98565b6200065d565b60405190151581526020015b60405180910390f35b6200026e6200026836600462004795565b6200068b565b005b620002876200028136600462004b2b565b62000843565b6040519081526020016200024e565b62000287620002a736600462004b2b565b62000858565b6200028760008051602062005ed083398151915281565b6200026e620002d536600462004b44565b6200087a565b6200028760008051602062005e9083398151915281565b6200026e6200030336600462004fc9565b620008a1565b6200026e6200031a36600462004ad0565b62000975565b6200026e6200033136600462004b44565b620009e3565b6200026e6200034836600462004860565b62000a61565b6200028760008051602062005f1083398151915281565b6200026e6200037636600462004ebd565b62000af4565b6200026e6200038d366004620047d3565b62000d79565b6200028760095481565b6200026e620003ae36600462004e28565b62000dfc565b620003cb620003c536600462004b2b565b62001117565b6040516200024e919062005537565b6200026e620003eb36600462004795565b620011b7565b6200028760008051602062005eb083398151915281565b6200026e6200041936600462005007565b6200151b565b6200026e6200043036600462004e75565b62001cb3565b6200026e6200044736600462004f3a565b62001dd3565b620004646200045e36600462004795565b620021c9565b6040516200024e9190620054d2565b6200048a6200048436600462004b76565b6200231e565b6040516200024e91906200538c565b62000242620004aa36600462004b44565b6200233f565b6200028760008051602062005ef083398151915281565b6008546200024290600160a01b900460ff1681565b6200024262002368565b6200026e620004f736600462004801565b62002439565b62000287600081565b6200026e6200051736600462004860565b620024f1565b620002877f178472dfa082bc56f85b1e1106040507c8b27144794f51880164f8cb547adcdd81565b6006546200048a906201000090046001600160a01b031681565b620005766200057036600462004b2b565b620025da565b6040516200024e9190620054bd565b620002876200059636600462004b2b565b62002665565b62000287620005ad36600462004b2b565b60026020526000908152604090205481565b6200026e620005d036600462004b44565b6200267e565b6200026e620005e73660046200513f565b620026a0565b6200026e620005fe3660046200513f565b62002716565b620002426200061536600462004860565b62002792565b6200026e6200062c36600462004a05565b6200289f565b620002426200064336600462004b2b565b62002af9565b6007546200048a906001600160a01b031681565b60006001600160e01b03198216635a05180f60e01b1480620006855750620006858262002d5e565b92915050565b60006200069981336200233f565b80620006ac5750620006ac81336200233f565b604051806040016040528060038152602001624d453360e81b81525090620006f25760405162461bcd60e51b8152600401620006e9919062005537565b60405180910390fd5b5060065460405163156d12cb60e11b81526000916201000090046001600160a01b031690632ada2596906200072c9086906004016200538c565b60006040518083038186803b1580156200074557600080fd5b505afa1580156200075a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000784919081019062004d59565b9050806040015115156001151514620007c95760405162461bcd60e51b815260206004820152600660248201526513515351115360d21b6044820152606401620006e9565b600060408281019190915260065490516368f09a1d60e11b8152620100009091046001600160a01b03169063d1e1343a906200080a90849060040162005710565b600060405180830381600087803b1580156200082557600080fd5b505af11580156200083a573d6000803e3d6000fd5b50505050505050565b60009081526020819052604090206001015490565b600381815481106200086957600080fd5b600091825260209091200154905081565b620008858262000843565b620008908162002d95565b6200089c838362002da4565b505050565b60008051602062005ed0833981519152620008be6000336200233f565b80620008d15750620008d181336200233f565b604051806040016040528060038152602001624d453360e81b815250906200090e5760405162461bcd60e51b8152600401620006e9919062005537565b50600660029054906101000a90046001600160a01b03166001600160a01b03166395ae9334848460405160200162000947919062005537565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016200080a92919062005804565b60006200098381336200233f565b806200099657506200099681336200233f565b604051806040016040528060038152602001624d453360e81b81525090620009d35760405162461bcd60e51b8152600401620006e9919062005537565b50620009df8262002dca565b5050565b6001600160a01b038116331462000a555760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401620006e9565b620009df828262002f68565b600062000a6f81336200233f565b8062000a82575062000a8281336200233f565b604051806040016040528060038152602001624d453360e81b8152509062000abf5760405162461bcd60e51b8152600401620006e9919062005537565b506007546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906200080a9086908690600401620054a4565b60008051602062005ed083398151915262000b116000336200233f565b8062000b24575062000b2481336200233f565b604051806040016040528060038152602001624d453360e81b8152509062000b615760405162461bcd60e51b8152600401620006e9919062005537565b5060006040518061012001604052806000815260200160001515815260200188815260200187878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250506040805160208181018352848252808601919091528151808201835284815282860152606085018490526080850184905260a090940192909252508281018a90528051601f8901839004830281018301909152878152919250879087908190840183828082843760009201829052506060860194909452505060065460405163540e1f9960e11b8152620100009091046001600160a01b0316915063a81c3f329062000c6e90859060040162005640565b602060405180830381600087803b15801562000c8957600080fd5b505af115801562000c9e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000cc4919062004e0f565b600654604051635c3c2c1760e11b81529192506201000090046001600160a01b03169063b878582e9062000d019084908990899060040162005798565b600060405180830381600087803b15801562000d1c57600080fd5b505af115801562000d31573d6000803e3d6000fd5b50505050807f45fb4aac4654c6df463d5df6a02729fb817acf43ea0ca0ab3f14946dd6ec69b48360405162000d67919062005640565b60405180910390a25050505050505050565b60008051602062005ed083398151915262000d966000336200233f565b8062000da9575062000da981336200233f565b604051806040016040528060038152602001624d453360e81b8152509062000de65760405162461bcd60e51b8152600401620006e9919062005537565b50606062000df684848362002f8e565b50505050565b60008051602062005f1083398151915262000e196000336200233f565b8062000e2c575062000e2c81336200233f565b604051806040016040528060038152602001624d453360e81b8152509062000e695760405162461bcd60e51b8152600401620006e9919062005537565b50600654604051639ab5fddd60e01b8152600481018690526000916201000090046001600160a01b03169063e60d585a908290639ab5fddd9060240160206040518083038186803b15801562000ebe57600080fd5b505afa15801562000ed3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ef9919062004e0f565b6040518263ffffffff1660e01b815260040162000f1891815260200190565b60006040518083038186803b15801562000f3157600080fd5b505afa15801562000f46573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000f70919081019062004919565b51905062000f8081600262005936565b831462000fb95760405162461bcd60e51b81526020600482015260066024820152654c454e444e4560d01b6044820152606401620006e9565b6006546040516329c7829360e11b8152620100009091046001600160a01b03169063538f05269062000ff490889088908890600401620057e8565b600060405180830381600087803b1580156200100f57600080fd5b505af115801562001024573d6000803e3d6000fd5b5050600654604051637d4bf69560e11b815260048101899052620100009091046001600160a01b0316925063fa97ed2a915060240160206040518083038186803b1580156200107257600080fd5b505afa15801562001087573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620010ad9190620047b4565b6001600160a01b0316635fd2c9f485856040518363ffffffff1660e01b8152600401620010dc92919062005518565b600060405180830381600087803b158015620010f757600080fd5b505af11580156200110c573d6000803e3d6000fd5b505050505050505050565b600654604051630e1bbd9160e31b8152600481018390526060916201000090046001600160a01b0316906370ddec889060240160006040518083038186803b1580156200116357600080fd5b505afa15801562001178573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620011a2919081019062004bc2565b80602001905181019062000685919062004c0c565b6000620011c581336200233f565b80620011d85750620011d881336200233f565b604051806040016040528060038152602001624d453360e81b81525090620012155760405162461bcd60e51b8152600401620006e9919062005537565b5060065460405163f2fde38b60e01b815283916201000090046001600160a01b03169063f2fde38b906200124e9084906004016200538c565b600060405180830381600087803b1580156200126957600080fd5b505af11580156200127e573d6000803e3d6000fd5b505060075460405163f2fde38b60e01b81526001600160a01b03909116925063f2fde38b9150620012b49086906004016200538c565b600060405180830381600087803b158015620012cf57600080fd5b505af1158015620012e4573d6000803e3d6000fd5b50506007546040516370a0823160e01b81526001600160a01b03909116925063a9059cbb9150859083906370a0823190620013249030906004016200538c565b60206040518083038186803b1580156200133d57600080fd5b505afa15801562001352573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001378919062004e0f565b6040518363ffffffff1660e01b815260040162001397929190620054a4565b602060405180830381600087803b158015620013b257600080fd5b505af1158015620013c7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620013ed919062004b0e565b50806001600160a01b0316639a508c8e6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156200142a57600080fd5b505af11580156200143f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001465919062004b0e565b156200147057505050565b600660029054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015620014bf57600080fd5b505afa158015620014d4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620014fa9190620047b4565b3360405160016215555360e11b03198152600401620006e9929190620053a0565b60065460405163445312f160e11b81526004810184905283916201000090046001600160a01b03169081906388a625e290602401602060405180830381600087803b1580156200156a57600080fd5b505af11580156200157f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620015a5919062004b0e565b15620015c55760405162461bcd60e51b8152600401620006e99062005586565b60008051602062005ed0833981519152620015e26000336200233f565b80620015f55750620015f581336200233f565b604051806040016040528060038152602001624d453360e81b81525090620016325760405162461bcd60e51b8152600401620006e9919062005537565b50600854600160a01b900460ff166200167c5760405162461bcd60e51b815260206004820152600b60248201526a2727a2ab22a72a27a822a760a91b6044820152606401620006e9565b6009548614620016ba5760405162461bcd60e51b815260206004820152600860248201526722ab272a2727a82760c11b6044820152606401620006e9565b600654604051630368c42760e51b8152600481018890526000916201000090046001600160a01b031690636d1884e09060240160006040518083038186803b1580156200170657600080fd5b505afa1580156200171b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001745919081019062004c42565b905060006200175b888360600151898962003146565b602081015160808401526040808201516001600160401b031660e0850152600654905163540e1f9960e11b81529192506201000090046001600160a01b03169063a81c3f3290620017b190859060040162005640565b602060405180830381600087803b158015620017cc57600080fd5b505af1158015620017e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001807919062004e0f565b506006546040805163243d658560e01b815290516000926201000090046001600160a01b03169163cbe0619591839163243d6585916004808301926020929190829003018186803b1580156200185c57600080fd5b505afa15801562001871573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001897919062004e0f565b6040518263ffffffff1660e01b8152600401620018b691815260200190565b60206040518083038186803b158015620018cf57600080fd5b505afa158015620018e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200190a9190620047b4565b9050600660029054906101000a90046001600160a01b03166001600160a01b03166313db4e1a6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200195d57600080fd5b505af115801562001972573d6000803e3d6000fd5b5050505060006200199260008051602062005f1083398151915262002665565b6001600160401b03811115620019b857634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015620019e2578160200160208202803683370190505b509050600081511162001a265760405162461bcd60e51b815260206004820152600b60248201526a2120a227a920a1a62622a760a91b6044820152606401620006e9565b60005b62001a4360008051602062005f1083398151915262002665565b81101562001ab45762001a6660008051602062005f10833981519152826200231e565b82828151811062001a8757634e487b7160e01b600052603260045260246000fd5b6001600160a01b03909216602092830291909101909101528062001aab81620059bb565b91505062001a29565b506008546040805160e080820183523082526007546001600160a01b039081166020840152868116938301939093526101008801516060830152608082018590528701516001600160401b031660a0820152600092919091169063689280599060c0810162001b238f6200359e565b8152506040518263ffffffff1660e01b815260040162001b449190620055a7565b602060405180830381600087803b15801562001b5f57600080fd5b505af115801562001b74573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001b9a9190620047b4565b604051638730907d60e01b81529091506001600160a01b03841690638730907d9062001bcb9084906004016200538c565b600060405180830381600087803b15801562001be657600080fd5b505af115801562001bfb573d6000803e3d6000fd5b505060065461010088015160405163c96259e160e01b8152620100009092046001600160a01b0316935063c96259e1925062001c3c91859060040162005781565b600060405180830381600087803b15801562001c5757600080fd5b505af115801562001c6c573d6000803e3d6000fd5b50506008805460ff60a01b19169055505060405163015a56e960e01b81526001600160a01b038816965063015a56e99550620010dc945088935060040191506200552e9050565b60008051602062005f1083398151915262001cd06000336200233f565b8062001ce3575062001ce381336200233f565b604051806040016040528060038152602001624d453360e81b8152509062001d205760405162461bcd60e51b8152600401620006e9919062005537565b50600654604051637d4bf69560e11b815260048101859052620100009091046001600160a01b03169063fa97ed2a9060240160206040518083038186803b15801562001d6b57600080fd5b505afa15801562001d80573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001da69190620047b4565b6001600160a01b031663f1bfb135836040518263ffffffff1660e01b81526004016200080a9190620054d2565b60065460405163445312f160e11b81526004810185905284916201000090046001600160a01b03169081906388a625e290602401602060405180830381600087803b15801562001e2257600080fd5b505af115801562001e37573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001e5d919062004b0e565b1562001e7d5760405162461bcd60e51b8152600401620006e99062005586565b60008051602062005ed083398151915262001e9a6000336200233f565b8062001ead575062001ead81336200233f565b604051806040016040528060038152602001624d453360e81b8152509062001eea5760405162461bcd60e51b8152600401620006e9919062005537565b50600854600160a01b900460ff161562001f325760405162461bcd60e51b815260206004820152600860248201526720a629222ca7a82760c11b6044820152606401620006e9565b60098b9055600654604051630368c42760e51b8152600481018d90526000916201000090046001600160a01b031690636d1884e09060240160006040518083038186803b15801562001f8357600080fd5b505afa15801562001f98573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001fc2919081019062004c42565b9050806020015115156001151514620020115760405162461bcd60e51b815260206004820152601060248201526f4576656e74204e756d62657220444e4560801b6044820152606401620006e9565b600081606001518c8c8c8c8c604051602001620020349695949392919062005224565b6040516020818303038152906040528051906020012090506200205a8d828989620037ae565b6000620020678e62003b87565b905080836101000181815250508c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505060a084015260065460405163540e1f9960e11b8152620100009091046001600160a01b03169063a81c3f3290620020e690869060040162005640565b602060405180830381600087803b1580156200210157600080fd5b505af115801562002116573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200213c919062004e0f565b506200214a838c8c62003cb9565b50506008805460ff60a01b1916600160a01b179055505060405163015a56e960e01b8152600481018390526001600160a01b0382169063015a56e990602401600060405180830381600087803b158015620021a457600080fd5b505af1158015620021b9573d6000803e3d6000fd5b5050505050505050505050505050565b6003546060906000906001600160401b03811115620021f857634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801562002222578160200160208202803683370190505b50905060005b60035481101562002317576200226b600382815481106200225957634e487b7160e01b600052603260045260246000fd5b9060005260206000200154856200233f565b15620022d157600381815481106200229357634e487b7160e01b600052603260045260246000fd5b9060005260206000200154828281518110620022bf57634e487b7160e01b600052603260045260246000fd5b60200260200101818152505062002302565b600454828281518110620022f557634e487b7160e01b600052603260045260246000fd5b6020026020010181815250505b806200230e81620059bb565b91505062002228565b5092915050565b600082815260016020526040812062002338908362003f72565b9392505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6000806200237781336200233f565b806200238a57506200238a81336200233f565b604051806040016040528060038152602001624d453360e81b81525090620023c75760405162461bcd60e51b8152600401620006e9919062005537565b5060065460055460405163f360c18360e01b81526004810191909152620100009091046001600160a01b03169063f360c18390602401600060405180830381600087803b1580156200241857600080fd5b505af11580156200242d573d6000803e3d6000fd5b50505050600191505090565b60008051602062005ed0833981519152620024566000336200233f565b806200246957506200246981336200233f565b604051806040016040528060038152602001624d453360e81b81525090620024a65760405162461bcd60e51b8152600401620006e9919062005537565b50620024ea858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525062002f8e92505050565b5050505050565b6000620024ff81336200233f565b806200251257506200251281336200233f565b604051806040016040528060038152602001624d453360e81b815250906200254f5760405162461bcd60e51b8152600401620006e9919062005537565b5060075460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90620025849086908690600401620054a4565b602060405180830381600087803b1580156200259f57600080fd5b505af1158015620025b4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000df6919062004b0e565b6006546040516338c13ca160e11b8152600481018390526060916201000090046001600160a01b03169063718279429060240160006040518083038186803b1580156200262657600080fd5b505afa1580156200263b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000685919081019062004873565b6000818152600160205260408120620006859062003f80565b620026898262000843565b620026948162002d95565b6200089c838362002f68565b6000620026ae81336200233f565b80620026c15750620026c181336200233f565b604051806040016040528060038152602001624d453360e81b81525090620026fe5760405162461bcd60e51b8152600401620006e9919062005537565b50506006805460ff191660ff92909216919091179055565b60006200272481336200233f565b806200273757506200273781336200233f565b604051806040016040528060038152602001624d453360e81b81525090620027745760405162461bcd60e51b8152600401620006e9919062005537565b50506006805460ff9092166101000261ff0019909216919091179055565b600654604051630368c42760e51b8152600481018390526000916201000090046001600160a01b03169063f28e87b69085908390636d1884e09060240160006040518083038186803b158015620027e857600080fd5b505afa158015620027fd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262002827919081019062004c42565b61010001516040518363ffffffff1660e01b81526004016200284b929190620054a4565b60206040518083038186803b1580156200286457600080fd5b505afa15801562002879573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002338919062004b0e565b620028ba60008051602062005f10833981519152336200233f565b15620028f25760405162461bcd60e51b8152600401620006e9906020808252600490820152634f4e454360e01b604082015260600190565b60005b838110156200110c576006546000906201000090046001600160a01b031663fa97ed2a8787858181106200293957634e487b7160e01b600052603260045260246000fd5b905060200201356040518263ffffffff1660e01b81526004016200295f91815260200190565b60206040518083038186803b1580156200297857600080fd5b505afa1580156200298d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620029b39190620047b4565b90506000816001600160a01b03166353b5ef2a338d8d8d8d8d8d8d8d6040518a63ffffffff1660e01b8152600401620029f599989796959493929190620053ba565b602060405180830381600087803b15801562002a1057600080fd5b505af115801562002a25573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002a4b919062004e0f565b6006549091506201000090046001600160a01b031663ff355e7c3389898781811062002a8757634e487b7160e01b600052603260045260246000fd5b905060200201356040518363ffffffff1660e01b815260040162002aad929190620054a4565b600060405180830381600087803b15801562002ac857600080fd5b505af115801562002add573d6000803e3d6000fd5b505050505050808062002af090620059bb565b915050620028f5565b60008062002b0881336200233f565b8062002b1b575062002b1b81336200233f565b604051806040016040528060038152602001624d453360e81b8152509062002b585760405162461bcd60e51b8152600401620006e9919062005537565b50600654604051630368c42760e51b8152600481018590526000916201000090046001600160a01b031690636d1884e09060240160006040518083038186803b15801562002ba557600080fd5b505afa15801562002bba573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262002be4919081019062004c42565b600160c082015260065460405163540e1f9960e11b81529192506201000090046001600160a01b03169063a81c3f329062002c2490849060040162005640565b602060405180830381600087803b15801562002c3f57600080fd5b505af115801562002c54573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002c7a919062004e0f565b50837fbf4e1eafd0af4b4075545cc5fd5b76a4ebc4aebd953252b6c62fd36c3b025a488260405162002cad919062005640565b60405180910390a25060019392505050565b62002ccb82826200233f565b620009df576000828152602081815260408083206001600160a01b03851684529091529020805460ff1916600117905562002d033390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600062002338836001600160a01b03841662003f8b565b60006001600160e01b03198216637965db0b60e01b14806200068557506301ffc9a760e01b6001600160e01b031983161462000685565b62002da1813362003fdd565b50565b62002db0828262002cbf565b60008281526001602052604090206200089c908262002d47565b60005b8151811015620009df576007546006546040516000926001600160a01b0390811692620100009004169062002e029062004528565b62002e0f929190620053a0565b604051809103906000f08015801562002e2c573d6000803e3d6000fd5b5060075484519192506001600160a01b03169063a9059cbb90839086908690811062002e6857634e487b7160e01b600052603260045260246000fd5b60200260200101516040518363ffffffff1660e01b815260040162002e8f929190620054a4565b602060405180830381600087803b15801562002eaa57600080fd5b505af115801562002ebf573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002ee5919062004b0e565b50600654604051632e3c0e1f60e01b8152620100009091046001600160a01b031690632e3c0e1f9062002f1d9084906004016200538c565b600060405180830381600087803b15801562002f3857600080fd5b505af115801562002f4d573d6000803e3d6000fd5b5050505050808062002f5f90620059bb565b91505062002dcd565b62002f74828262004041565b60008281526001602052604090206200089c9082620040a9565b62002f9a82846200233f565b156040518060400160405280600381526020016226a29960e91b8152509062002fd85760405162461bcd60e51b8152600401620006e9919062005537565b5062002fe66000336200233f565b8062003014575062002ff882620040c0565b6200301260008051602062005ed0833981519152620040c0565b105b6200304b5760405162461bcd60e51b81526020600482015260066024820152654e4f5045524d60d01b6044820152606401620006e9565b62003057828462002da4565b604080516060810182526001600160a01b0380861682526020820184905260018284015260065492516368f09a1d60e11b81529192620100009004169063d1e1343a90620030aa90849060040162005710565b600060405180830381600087803b158015620030c557600080fd5b505af1158015620030da573d6000803e3d6000fd5b5050506020820151604051620030f1925062005206565b604051809103902081600001516001600160a01b03167fff54c21ba80b8aa448e2f0b912a564e7f3cf3067eefd465b0ec24f30471cbc848360405162003138919062005710565b60405180910390a350505050565b6040805160c081018252600060608083018281526080840183905260a084018390528352602083015291810191909152600080600084516001600160401b03811115620031a357634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015620031cd578160200160208202803683370190505b50905060005b85518160ff16101562003557576000868260ff16815181106200320657634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008082604001516001600160401b0316119050600081156200326c578a836020015184604001518c6040516020016200324e9493929190620052ca565b604051602081830303815290604052805190602001209050620032a0565b8a83602001518b604051602001620032879392919062005291565b6040516020818303038152906040528051906020012090505b8251604051637b95236d60e11b815260009173fa34742085f577432caa712ae0a29bda56720a5a9163f72a46da91620032de91869060040162005758565b60206040518083038186803b158015620032f757600080fd5b505af41580156200330c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620033329190620047b4565b90506000620033428288620040f0565b90508060200151156200335a57505050505062003542565b600660029054906101000a90046001600160a01b03166001600160a01b031663b885c92d8f846040518363ffffffff1660e01b81526004016200339f92919062005781565b60206040518083038186803b158015620033b857600080fd5b505afa158015620033cd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620033f3919062004b0e565b620034125760405162461bcd60e51b8152600401620006e9906200554c565b60006200342f60008051602062005ef0833981519152846200233f565b90506200344c60008051602062005e90833981519152846200233f565b80620034555750805b620034895760405162461bcd60e51b815260206004820152600360248201526227252960e91b6044820152606401620006e9565b80156200349d57859a5060019850620034ad565b620034aa60018b6200590e565b99505b8288836000015181518110620034d357634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250508e836001600160a01b03167f1a475d149065d711c76ccc1c0c7825468ec25670345f7639baeef188d2936bb2886020015160405162003533919062005537565b60405180910390a35050505050505b6200354f6001826200590e565b9050620031d3565b5060065460ff610100909104811690841610801590620035745750815b620035935760405162461bcd60e51b8152600401620006e99062005569565b505050949350505050565b600654604051637306ac2d60e11b815260048101839052606091600091620100009091046001600160a01b03169063e60d585a9060240160006040518083038186803b158015620035ee57600080fd5b505afa15801562003603573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200362d919081019062004919565b9050805160026200363f919062005936565b6001600160401b038111156200366557634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156200368f578160200160208202803683370190505b5091506000805b8251811015620037a657828181518110620036c157634e487b7160e01b600052603260045260246000fd5b602002602001015160000151848381518110620036ee57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250508281815181106200372f57634e487b7160e01b600052603260045260246000fd5b602002602001015160200151848360016200374b9190620058f3565b815181106200376a57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03909216602092830291909101909101526200378f600283620058f3565b9150806200379d81620059bb565b91505062003696565b505050919050565b600080826001600160401b03811115620037d857634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801562003802578160200160208202803683370190505b50905060005b60ff811684111562003b5257600085858360ff168181106200383a57634e487b7160e01b600052603260045260246000fd5b90506060020180360381019062003852919062004df1565b604051637b95236d60e11b815273fa34742085f577432caa712ae0a29bda56720a5a9163f72a46da916200388c91908b9060040162005758565b60206040518083038186803b158015620038a557600080fd5b505af4158015620038ba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620038e09190620047b4565b90506001600160a01b038116620039235760405162461bcd60e51b8152600401620006e9906020808252600490820152630534947360e41b604082015260600190565b60065460405163b885c92d60e01b8152620100009091046001600160a01b03169063b885c92d906200395c908b90859060040162005781565b60206040518083038186803b1580156200397557600080fd5b505afa1580156200398a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620039b0919062004b0e565b620039cf5760405162461bcd60e51b8152600401620006e9906200554c565b620039ea60008051602062005ed0833981519152826200233f565b62003a1e5760405162461bcd60e51b815260206004820152600360248201526227222960e91b6044820152606401620006e9565b6000805b845181101562003ad85760006001600160a01b031685828151811062003a5857634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316141562003a765762003ad8565b84818151811062003a9757634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316836001600160a01b0316141562003ac3576001915062003ad8565b8062003acf81620059bb565b91505062003a22565b811562003ae85750505062003b3d565b62003af56001876200590e565b95508285828151811062003b1957634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250505050505b62003b4a6001826200590e565b905062003808565b5060065460ff908116908316101562003b7f5760405162461bcd60e51b8152600401620006e99062005569565b505050505050565b600080600760009054906101000a90046001600160a01b03166001600160a01b0316631504d8f06040518163ffffffff1660e01b8152600401602060405180830381600087803b15801562003bdb57600080fd5b505af115801562003bf0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003c16919062004e0f565b600654604051634d88078360e11b815260048101839052602481018690529192506201000090046001600160a01b031690639b100f0690604401600060405180830381600087803b15801562003c6b57600080fd5b505af115801562003c80573d6000803e3d6000fd5b505050504281847fd7ad9d18e3c3fd099dce052a028be71f22b08bebbb03ee00da643916412fccda60405160405180910390a492915050565b62003cc6600282620059d9565b1562003cfd5760405162461bcd60e51b8152602060048201526005602482015264455651545960d81b6044820152606401620006e9565b60005b8181101562000df657600083838381811062003d2c57634e487b7160e01b600052603260045260246000fd5b905060200201602081019062003d43919062004795565b90506000848462003d56856001620058f3565b81811062003d7457634e487b7160e01b600052603260045260246000fd5b905060200201602081019062003d8b919062004795565b905062003da860008051602062005eb0833981519152836200233f565b801562003dcb575062003dcb60008051602062005eb0833981519152826200233f565b62003e035760405162461bcd60e51b8152602060048201526007602482015266424144524f4c4560c81b6044820152606401620006e9565b6000604051806060016040528087878781811062003e3157634e487b7160e01b600052603260045260246000fd5b905060200201602081019062003e48919062004795565b6001600160a01b03168152602001878762003e65886001620058f3565b81811062003e8357634e487b7160e01b600052603260045260246000fd5b905060200201602081019062003e9a919062004795565b6001600160a01b03908116825260006020928301526006548a516040805163088ccce560e31b8152600481019290925285518416602483015293850151831660448201529284015160ff1660648401529293506201000090920490911690634466672890608401602060405180830381600087803b15801562003f1c57600080fd5b505af115801562003f31573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003f57919062004e0f565b5050505060028162003f6a9190620058f3565b905062003d00565b6000620023388383620041bf565b600062000685825490565b600081815260018301602052604081205462003fd45750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000685565b50600062000685565b62003fe982826200233f565b620009df5762003ff981620041f8565b620040068360206200420b565b6040516020016200401992919062005319565b60408051601f198184030181529082905262461bcd60e51b8252620006e99160040162005537565b6200404d82826200233f565b15620009df576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600062002338836001600160a01b03841662004400565b600081815260026020526040812054620040dd5761270f62000685565b5060009081526002602052604090205490565b60408051808201909152600080825260208201525b815181511015620006855780518251600091849181106200413657634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03161415620041545762000685565b818160000151815181106200417957634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316836001600160a01b03161415620041a8576001602082015262000685565b805181620041b682620059bb565b90525062004105565b6000826000018281548110620041e557634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b6060620006856001600160a01b03831660145b606060006200421c83600262005936565b62004229906002620058f3565b6001600160401b038111156200424f57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156200427a576020820181803683370190505b509050600360fc1b81600081518110620042a457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110620042e257634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060006200430884600262005936565b62004315906001620058f3565b90505b6001811115620043af576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106200435957634e487b7160e01b600052603260045260246000fd5b1a60f81b8282815181106200437e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c93620043a781620059a1565b905062004318565b508315620023385760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401620006e9565b600081815260018301602052604081205480156200451d5760006200442760018362005958565b85549091506000906200443d9060019062005958565b9050818114620044c15760008660000182815481106200446d57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050808760000184815481106200449f57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255918252600188019052604090208390555b8554869080620044e157634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505062000685565b600091505062000685565b61042d8062005a6383390190565b60006200454d6200454784620058c9565b62005870565b90508281528383830111156200456257600080fd5b6200233883602083018462005972565b60008083601f84011262004584578182fd5b5081356001600160401b038111156200459b578182fd5b6020830191508360208260051b8501011115620045b757600080fd5b9250929050565b60008083601f840112620045d0578182fd5b5081356001600160401b03811115620045e7578182fd5b602083019150836020606083028501011115620045b757600080fd5b600082601f83011262004614578081fd5b81356020620046276200454783620058a3565b80838252828201915082860187848660051b890101111562004647578586fd5b855b85811015620046675781358452928401929084019060010162004649565b5090979650505050505050565b805180151581146200468557600080fd5b919050565b60008083601f8401126200469c578182fd5b5081356001600160401b03811115620046b3578182fd5b602083019150836020828501011115620045b757600080fd5b600082601f830112620046dd578081fd5b8135620046ee6200454782620058c9565b81815284602083860101111562004703578283fd5b816020850160208301379081016020019190915292915050565b600082601f8301126200472e578081fd5b620023388383516020850162004536565b60006060828403121562004751578081fd5b6200475b6200581f565b905081356200476a8162005a52565b80825250602082013560208201526040820135604082015292915050565b8051620046858162005a3c565b600060208284031215620047a7578081fd5b8135620023388162005a26565b600060208284031215620047c6578081fd5b8151620023388162005a26565b60008060408385031215620047e6578081fd5b8235620047f38162005a26565b946020939093013593505050565b6000806000806060858703121562004817578182fd5b8435620048248162005a26565b93506020850135925060408501356001600160401b0381111562004846578283fd5b62004854878288016200468a565b95989497509550505050565b60008060408385031215620047e6578182fd5b6000602080838503121562004886578182fd5b82516001600160401b038111156200489c578283fd5b8301601f81018513620048ad578283fd5b8051620048be6200454782620058a3565b80828252848201915084840188868560051b8701011115620048de578687fd5b8694505b838510156200490d578051620048f88162005a26565b835260019490940193918501918501620048e2565b50979650505050505050565b600060208083850312156200492c578182fd5b82516001600160401b0381111562004942578283fd5b8301601f8101851362004953578283fd5b8051620049646200454782620058a3565b818152838101908385016060808502860187018a101562004983578788fd5b8795505b84861015620049f75780828b0312156200499f578788fd5b620049a96200581f565b8251620049b68162005a26565b815282880151620049c78162005a26565b81890152604083810151620049dc8162005a52565b90820152845260019590950194928601929081019062004987565b509098975050505050505050565b6000806000806000806000806080898b03121562004a21578586fd5b88356001600160401b038082111562004a38578788fd5b62004a468c838d0162004572565b909a50985060208b013591508082111562004a5f578788fd5b62004a6d8c838d0162004572565b909850965060408b013591508082111562004a86578586fd5b62004a948c838d0162004572565b909650945060608b013591508082111562004aad578384fd5b5062004abc8b828c01620045be565b999c989b5096995094979396929594505050565b60006020828403121562004ae2578081fd5b81356001600160401b0381111562004af8578182fd5b62004b068482850162004603565b949350505050565b60006020828403121562004b20578081fd5b620023388262004674565b60006020828403121562004b3d578081fd5b5035919050565b6000806040838503121562004b57578182fd5b82359150602083013562004b6b8162005a26565b809150509250929050565b6000806040838503121562004b89578182fd5b50508035926020909101359150565b60006020828403121562004baa578081fd5b81356001600160e01b03198116811462002338578182fd5b60006020828403121562004bd4578081fd5b81516001600160401b0381111562004bea578182fd5b8201601f8101841362004bfb578182fd5b62004b068482516020840162004536565b60006020828403121562004c1e578081fd5b81516001600160401b0381111562004c34578182fd5b62004b06848285016200471d565b60006020828403121562004c54578081fd5b81516001600160401b038082111562004c6b578283fd5b90830190610120828603121562004c80578283fd5b62004c8a6200584a565b8251815262004c9c6020840162004674565b60208201526040830151604082015260608301518281111562004cbd578485fd5b62004ccb878286016200471d565b60608301525060808301518281111562004ce3578485fd5b62004cf1878286016200471d565b60808301525060a08301518281111562004d09578485fd5b62004d17878286016200471d565b60a08301525062004d2b60c0840162004674565b60c082015262004d3e60e0840162004788565b60e08201526101009283015192810192909252509392505050565b60006020828403121562004d6b578081fd5b81516001600160401b038082111562004d82578283fd5b908301906060828603121562004d96578283fd5b62004da06200581f565b825162004dad8162005a26565b815260208301518281111562004dc1578485fd5b62004dcf878286016200471d565b60208301525062004de36040840162004674565b604082015295945050505050565b60006060828403121562004e03578081fd5b6200233883836200473f565b60006020828403121562004e21578081fd5b5051919050565b60008060006040848603121562004e3d578081fd5b8335925060208401356001600160401b0381111562004e5a578182fd5b62004e688682870162004572565b9497909650939450505050565b6000806040838503121562004e88578182fd5b8235915060208301356001600160401b0381111562004ea5578182fd5b62004eb38582860162004603565b9150509250929050565b60008060008060006060868803121562004ed5578283fd5b8535945060208601356001600160401b038082111562004ef3578485fd5b62004f0189838a016200468a565b9096509450604088013591508082111562004f1a578283fd5b5062004f298882890162004572565b969995985093965092949392505050565b60008060008060008060008060a0898b03121562004f56578182fd5b8835975060208901356001600160401b038082111562004f74578384fd5b62004f828c838d016200468a565b909950975060408b013591508082111562004f9b578384fd5b62004fa98c838d0162004572565b909750955060608b0135945060808b013591508082111562004aad578384fd5b6000806040838503121562004fdc578182fd5b8235915060208301356001600160401b0381111562004ff9578182fd5b62004eb385828601620046cc565b6000806000606084860312156200501c578081fd5b833592506020840135915060408401356001600160401b038082111562005041578283fd5b818601915086601f83011262005055578283fd5b8135620050666200454782620058a3565b80828252602082019150602085018a60208560051b880101111562005089578687fd5b865b848110156200512e578582351115620050a2578788fd5b8135870160a0818e03601f19011215620050ba578889fd5b620050c46200581f565b620050d38e602084016200473f565b8152608082013588811115620050e7578a8bfd5b620050f88f602083860101620046cc565b60208301525060a08201359150620051108262005a3c565b6040810191909152845260209384019391909101906001016200508b565b505080955050505050509250925092565b60006020828403121562005151578081fd5b8135620023388162005a52565b6000815180845260208085019450808401835b83811015620051985781516001600160a01b03168752958201959082019060010162005171565b509495945050505050565b81835260006001600160fb1b03831115620051bc578081fd5b8260051b80836020870137939093016020019283525090919050565b60008151808452620051f281602086016020860162005972565b601f01601f19169290920160200192915050565b600082516200521a81846020870162005972565b9190910192915050565b600087516020620052398285838d0162005972565b9083019087898337908701828152869190835b878110156200527e578335620052628162005a26565b6001600160a01b0316825292820192908201906001016200524c565b5094855290930198975050505050505050565b60008451620052a581846020890162005972565b845190830190620052bb81836020890162005972565b01928352505060200192915050565b60008551620052de818460208a0162005972565b855190830190620052f4818360208a0162005972565b60c09590951b6001600160c01b03191694019384525050600882015260280192915050565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b8152600083516200534d81601785016020880162005972565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516200538081602884016020880162005972565b01602801949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b038a16815260a06020808301829052600091620053e29084018b8d620051a3565b8381036040858101919091528982528a918301845b8b811015620054295783356200540d8162005a3c565b6001600160401b031682529284019290840190600101620053f7565b50606092508581038387015262005442818a8c620051a3565b86810360808801528781528891508401855b88811015620054905782356200546a8162005a52565b60ff16825282860135868301528383013584830152918401919084019060010162005454565b509f9e505050505050505050505050505050565b6001600160a01b03929092168252602082015260400190565b6020815260006200233860208301846200515e565b6020808252825182820181905260009190848201906040850190845b818110156200550c57835183529284019291840191600101620054ee565b50909695505050505050565b60208152600062004b06602083018486620051a3565b90815260200190565b602081526000620023386020830184620051d8565b6020808252600390820152624e534560e81b604082015260600190565b6020808252600390820152624e454160e81b604082015260600190565b60208082526007908201526614d251d554d15160ca1b604082015260600190565b60208152600060018060a01b038084511660208401528060208501511660408401528060408501511660608401525060608301516080830152608083015160e060a0840152620055fc6101008401826200515e565b905060a08401516200561960c08501826001600160401b03169052565b5060c0840151838203601f190160e08501526200563782826200515e565b95945050505050565b60208152815160208201526000602083015162005661604084018215159052565b506040830151606083015260608301516101208060808501526200568a610140850183620051d8565b91506080850151601f19808685030160a0870152620056aa8483620051d8565b935060a08701519150808685030160c087015250620056ca8382620051d8565b92505060c0850151620056e160e086018215159052565b5060e0850151610100620056ff818701836001600160401b03169052565b959095015193019290925250919050565b602080825282516001600160a01b03168282015282015160606040830152600090620057406080840182620051d8565b90506040840151151560608401528091505092915050565b825160ff1681526020808401519082015260409283015192810192909252606082015260800190565b9182526001600160a01b0316602082015260400190565b83815260406020808301829052908201839052600090849060608401835b868110156200490d578335620057cc8162005a26565b6001600160a01b031682529282019290820190600101620057b6565b83815260406020820152600062005637604083018486620051a3565b82815260406020820152600062004b066040830184620051d8565b604051606081016001600160401b038111828210171562005844576200584462005a10565b60405290565b60405161012081016001600160401b038111828210171562005844576200584462005a10565b604051601f8201601f191681016001600160401b03811182821017156200589b576200589b62005a10565b604052919050565b60006001600160401b03821115620058bf57620058bf62005a10565b5060051b60200190565b60006001600160401b03821115620058e557620058e562005a10565b50601f01601f191660200190565b60008219821115620059095762005909620059fa565b500190565b600060ff821660ff84168060ff038211156200592e576200592e620059fa565b019392505050565b6000816000190483118215151615620059535762005953620059fa565b500290565b6000828210156200596d576200596d620059fa565b500390565b60005b838110156200598f57818101518382015260200162005975565b8381111562000df65750506000910152565b600081620059b357620059b3620059fa565b506000190190565b6000600019821415620059d257620059d2620059fa565b5060010190565b600082620059f557634e487b7160e01b81526012600452602481fd5b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811462002da157600080fd5b6001600160401b038116811462002da157600080fd5b60ff8116811462002da157600080fdfe608060405234801561001057600080fd5b5060405161042d38038061042d83398101604081905261002f91610086565b60008054610100600160a81b0319166101006001600160a01b0394851602179055600180546001600160a01b031916919092161790556100b8565b80516001600160a01b038116811461008157600080fd5b919050565b60008060408385031215610098578182fd5b6100a18361006a565b91506100af6020840161006a565b90509250929050565b610366806100c76000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80638730907d14610030575b600080fd5b61004361003e3660046102a1565b610045565b005b61004d61021f565b6001600160a01b0316336001600160a01b0316146100bc5760405162461bcd60e51b815260206004820152602160248201527f4f6e6c79206163746976652044414f20636f6e74726163742063616e2063616c6044820152601b60fa1b60648201526084015b60405180910390fd5b60005460ff16156101075760405162461bcd60e51b8152602060048201526015602482015274105b1b1bddd85b98d948185b1c9958591e481cd95d605a1b60448201526064016100b3565b6000546040516370a0823160e01b81523060048201526101009091046001600160a01b03169063095ea7b390839083906370a082319060240160206040518083038186803b15801561015857600080fd5b505afa15801561016c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101909190610300565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156101d657600080fd5b505af11580156101ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061020e91906102e0565b50506000805460ff19166001179055565b60015460408051638da5cb5b60e01b815290516000926001600160a01b031691638da5cb5b916004808301926020929190829003018186803b15801561026457600080fd5b505afa158015610278573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061029c91906102c4565b905090565b6000602082840312156102b2578081fd5b81356102bd81610318565b9392505050565b6000602082840312156102d5578081fd5b81516102bd81610318565b6000602082840312156102f1578081fd5b815180151581146102bd578182fd5b600060208284031215610311578081fd5b5051919050565b6001600160a01b038116811461032d57600080fd5b5056fea2646970667358221220df6ce501b456e750aaeb8dd4241f7b2f538b22341ab1e1ae6e84594b1e071f3264736f6c63430008040033f8fa0a2e0b6ae44d5bf1084b5461fa6a8a39a79c4c89f13d35cb8e2a5b7508beb08f18b377dfeb1adcf649b816ad935bc75cd52dfb3feb6a6a8b44734e7d591025ea27e619be352cf4fd698124bbe5308ffed622135530e33923e301c660f5f72e136f43fa0cd081cd9e0fdc6cae79be691d06a820f16995861d106a8e143eae990cb964b4a72fbafc6352f5b02e3044a1b1fa91add1d44fe262863f1108d0cca2646970667358221220aa44e19c3dd330bd005451209360fa08aebfe75b7b88c8b1a00eabd011c5d66e64736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000250e2071c82a0a4c28f5aed802e68310f70b5d96000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000031a17e847807b1bc000000
-----Decoded View---------------
Arg [0] : prizePoolAmounts (uint256[]): 60000000000000000000000000
Arg [1] : _kcFactory (address): 0x250e2071C82A0a4c28F5AEd802e68310F70b5D96
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 000000000000000000000000250e2071c82a0a4c28f5aed802e68310f70b5d96
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [3] : 00000000000000000000000000000000000000000031a17e847807b1bc000000
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.000294 | 9,060,944,354.81 | $2,666,545.31 |
Loading...
Loading
[ Download: CSV Export ]
[ 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.