019d5666-71d1-72c0-baeb-d50b2b87dd1a
Open this run to answer one question: is this real attacker-relevant behavior with real impact, or just normal contract plumbing?
| ID | Type | Status | Attempts | Heartbeat |
|---|---|---|---|---|
| 42785 | artifact.fetch | complete | 1 / 3 | 1 week ago |
| 42786 | proxy.resolve | complete | 1 / 3 | 1 week ago |
| 42787 | tool.cast_disasm | complete | 1 / 3 | 1 week ago |
| 42788 | analysis.bundle | complete | 1 / 3 | 1 week ago |
| 42789 | capability.graph | complete | 1 / 3 | 1 week ago |
| 42790 | detector.run | complete | 1 / 3 | 1 week ago |
| 42791 | validation.fork | complete | 1 / 3 | 1 week ago |
| 42928 | report.consolidate | complete | 1 / 6 | 1 week ago |
| 42929 | tool.slither | complete | 1 / 2 | 1 week ago |
{
"status": "not_proxy"
}
'forge clean' running (wd: /tmp/slither-gubm5ea2)
'forge config --json' running
'forge build --build-info --skip ./test/** ./script/** --force' running (wd: /tmp/slither-gubm5ea2)
Sale.withdrawTokens(IERC20Metadata,address,uint256) (contracts/Sale.sol#258-273) sends eth to arbitrary user
Dangerous calls:
- (success,None) = to.call{value: amount}() (contracts/Sale.sol#263-265)
Sale._executeTokenSell(address,uint256,uint256,IERC20Metadata) (contracts/Sale.sol#376-395) sends eth to arbitrary user
Dangerous calls:
- (success,None) = seller.call{value: payTokenAmount}() (contracts/Sale.sol#384-388)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#functions-that-send-ether-to-arbitrary-destinations
Math.mulDiv(uint256,uint256,uint256) (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#206-277) has bitwise-xor operator ^ instead of the exponentiation operator **:
- inverse = (3 * denominator) ^ 2 (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#259)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#incorrect-exponentiation
Reentrancy in Sale._executeTokenBuy(address,address,uint256,uint256,IERC20Metadata,uint256,uint256,uint256,bytes) (contracts/Sale.sol#338-376):
External calls:
- (success,None) = buyer.call{value: msg.value - payTokenAmount}() (contracts/Sale.sol#362-365)
State variables written after the call(s):
- _checkReferrerAndPayBonus(buyer,referrer,buyTokenAmount) (contracts/Sale.sol#371-372)
- accountToBuyerInfo[buyer].refStatus = Status.Gold (contracts/Sale.sol#440-441)
- accountToBuyerInfo[buyer].referrer = referrer (contracts/Sale.sol#461-463)
- accountToBuyerInfo[buyer].refStatus = Status.Silver (contracts/Sale.sol#445-448)
- accountToBuyerInfo[buyer].refStatus = Status.Bronze (contracts/Sale.sol#450)
Sale.accountToBuyerInfo (contracts/Sale.sol#91-92) can be used in cross function reentrancies:
- Sale._calcBuyBonus(address,uint256) (contracts/Sale.sol#451-454)
- Sale._checkAndUpdateBuyerStatuses(address,uint256,IERC20Metadata,uint256) (contracts/Sale.sol#413-438)
- Sale._checkAndUpdateSellCounter(address,uint256) (contracts/Sale.sol#408-413)
- Sale._checkReferrerAndPayBonus(address,address,uint256) (contracts/Sale.sol#454-471)
- Sale._updateRefStatus(address,Sale.BuyerInfo) (contracts/Sale.sol#438-451)
- Sale.accountToBuyerInfo (contracts/Sale.sol#91-92)
- _checkAndUpdateBuyerStatuses(buyer,payTokenAmount,payToken,usdPrice) (contracts/Sale.sol#372-374)
- accountToBuyerInfo[buyer].refStatus = Status.Gold (contracts/Sale.sol#440-441)
- accountToBuyerInfo[buyer].refStatus = Status.Silver (contracts/Sale.sol#445-448)
- accountToBuyerInfo[buyer].payAmountInUSD += payAmountInUSD (contracts/Sale.sol#423-426)
- accountToBuyerInfo[buyer].refStatus = Status.Bronze (contracts/Sale.sol#450)
- accountToBuyerInfo[buyer].buyStatus = Status.Gold (contracts/Sale.sol#429-431)
- accountToBuyerInfo[buyer].buyStatus = Status.Silver (contracts/Sale.sol#432-433)
- accountToBuyerInfo[buyer].buyStatus = Status.Bronze (contracts/Sale.sol#436)
Sale.accountToBuyerInfo (contracts/Sale.sol#91-92) can be used in cross function reentrancies:
- Sale._calcBuyBonus(address,uint256) (contracts/Sale.sol#451-454)
- Sale._checkAndUpdateBuyerStatuses(address,uint256,IERC20Metadata,uint256) (contracts/Sale.sol#413-438)
- Sale._checkAndUpdateSellCounter(address,uint256) (contracts/Sale.sol#408-413)
- Sale._checkReferrerAndPayBonus(address,address,uint256) (contracts/Sale.sol#454-471)
- Sale._updateRefStatus(address,Sale.BuyerInfo) (contracts/Sale.sol#438-451)
- Sale.accountToBuyerInfo (contracts/Sale.sol#91-92)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities
Math.mulDiv(uint256,uint256,uint256) (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#206-277) performs a multiplication on the result of a division:
- denominator = denominator / twos (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#244)
- inverse = (3 * denominator) ^ 2 (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#259)
Math.mulDiv(uint256,uint256,uint256) (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#206-277) performs a multiplication on the result of a division:
- denominator = denominator / twos (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#244)
- inverse *= 2 - denominator * inverse (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#263)
Math.mulDiv(uint256,uint256,uint256) (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#206-277) performs a multiplication on the result of a division:
- denominator = denominator / twos (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#244)
- inverse *= 2 - denominator * inverse (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#264)
Math.mulDiv(uint256,uint256,uint256) (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#206-277) performs a multiplication on the result of a division:
- denominator = denominator / twos (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#244)
- inverse *= 2 - denominator * inverse (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#265)
Math.mulDiv(uint256,uint256,uint256) (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#206-277) performs a multiplication on the result of a division:
- denominator = denominator / twos (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#244)
- inverse *= 2 - denominator * inverse (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#266)
Math.mulDiv(uint256,uint256,uint256) (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#206-277) performs a multiplication on the result of a division:
- denominator = denominator / twos (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#244)
- inverse *= 2 - denominator * inverse (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#267)
Math.mulDiv(uint256,uint256,uint256) (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#206-277) performs a multiplication on the result of a division:
- denominator = denominator / twos (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#244)
- inverse *= 2 - denominator * inverse (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#268)
Math.mulDiv(uint256,uint256,uint256) (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#206-277) performs a multiplication on the result of a division:
- low = low / twos (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#247)
- result = low * inverse (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#274)
Math.invMod(uint256,uint256) (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#317-363) performs a multiplication on the result of a division:
- quotient = gcd / remainder (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#339)
- (gcd,remainder) = (remainder,gcd - remainder * quotient) (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#341-348)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#divide-before-multiply
Sale.withdrawTokens(IERC20Metadata,address,uint256).to (contracts/Sale.sol#259-260) lacks a zero-check on :
- (success,None) = to.call{value: amount}() (contracts/Sale.sol#263-265)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#missing-zero-address-validation
Reentrancy in Sale._executeTokenBuy(address,address,uint256,uint256,IERC20Metadata,uint256,uint256,uint256,bytes) (contracts/Sale.sol#338-376):
External calls:
- (success,None) = buyer.call{value: msg.value - payTokenAmount}() (contracts/Sale.sol#362-365)
Event emitted after the call(s):
- TokenPurchased(buyer,buyTokenAmount,buyBonus,payTokenAmount) (contracts/Sale.sol#375-376)
Reentrancy in Sale._executeTokenSell(address,uint256,uint256,IERC20Metadata) (contracts/Sale.sol#376-395):
External calls:
- (success,None) = seller.call{value: payTokenAmount}() (contracts/Sale.sol#384-388)
Event emitted after the call(s):
- TokenSold(seller,sellTokenAmount,payTokenAmount) (contracts/Sale.sol#393-395)
Reentrancy in Sale.withdrawTokens(IERC20Metadata,address,uint256) (contracts/Sale.sol#258-273):
External calls:
- (success,None) = to.call{value: amount}() (contracts/Sale.sol#263-265)
Event emitted after the call(s):
- TokensWithdrawn(token,to,amount) (contracts/Sale.sol#272-273)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-3
Sale.constructor(uint256,address[],uint256[],uint256[],uint256,uint256,address) (contracts/Sale.sol#111-150) uses timestamp for comparisons
Dangerous comparisons:
- block.timestamp > startTime_ (contracts/Sale.sol#122-123)
Sale.buyExactMarketTokenForPayToken(uint256,uint256,address,uint256,uint256,uint256,bytes) (contracts/Sale.sol#150-178) uses timestamp for comparisons
Dangerous comparisons:
- block.timestamp < startTime (contracts/Sale.sol#159-160)
- block.timestamp > deadline (contracts/Sale.sol#161-162)
Sale.buyMarketTokenForExactPayToken(uint256,uint256,address,uint256,uint256,uint256,bytes) (contracts/Sale.sol#179-207) uses timestamp for comparisons
Dangerous comparisons:
- block.timestamp < startTime (contracts/Sale.sol#191-192)
- block.timestamp > deadline (contracts/Sale.sol#193-194)
Sale.sellExactMarketTokenForPayToken(uint256,uint256) (contracts/Sale.sol#207-228) uses timestamp for comparisons
Dangerous comparisons:
- block.timestamp < startTime (contracts/Sale.sol#212-213)
Sale.sellMarketTokenForExactPayToken(uint256,uint256) (contracts/Sale.sol#228-239) uses timestamp for comparisons
Dangerous comparisons:
- block.timestamp < startTime (contracts/Sale.sol#229)
Sale._checkAndUpdateBuyCounter(uint256) (contracts/Sale.sol#395-408) uses timestamp for comparisons
Dangerous comparisons:
- (block.timestamp - startTime) / ONE_DAY - (lastCounterResetTime - startTime) / ONE_DAY > 0 (contracts/Sale.sol#398-399)
AccessControlDefaultAdminRules.renounceRole(bytes32,address) (lib/openzeppelin-contracts/contracts/access/extensions/AccessControlDefaultAdminRules.sol#111-120) uses timestamp for comparisons
Dangerous comparisons:
- role == DEFAULT_ADMIN_ROLE && account == defaultAdmin() (lib/openzeppelin-contracts/contracts/access/extensions/AccessControlDefaultAdminRules.sol#112)
- newDefaultAdmin != address(0) || ! _isScheduleSet(schedule) || ! _hasSchedulePassed(schedule) (lib/openzeppelin-contracts/contracts/access/extensions/AccessControlDefaultAdminRules.sol#114)
AccessControlDefaultAdminRules._grantRole(bytes32,address) (lib/openzeppelin-contracts/contracts/access/extensions/AccessControlDefaultAdminRules.sol#131-139) uses timestamp for comparisons
Dangerous comparisons:
- defaultAdmin() != address(0) (lib/openzeppelin-contracts/contracts/access/extensions/AccessControlDefaultAdminRules.sol#133)
AccessControlDefaultAdminRules._revokeRole(bytes32,address) (lib/openzeppelin-contracts/contracts/access/extensions/AccessControlDefaultAdminRules.sol#142-147) uses timestamp for comparisons
Dangerous comparisons:
- role == DEFAULT_ADMIN_ROLE && account == defaultAdmin() (lib/openzeppelin-contracts/contracts/access/extensions/AccessControlDefaultAdminRules.sol#143)
AccessControlDefaultAdminRules.defaultAdminDelay() (lib/openzeppelin-contracts/contracts/access/extensions/AccessControlDefaultAdminRules.sol#174-177) uses timestamp for comparisons
Dangerous comparisons:
- (_isScheduleSet(schedule) && _hasSchedulePassed(schedule)) (lib/openzeppelin-contracts/contracts/access/extensions/AccessControlDefaultAdminRules.sol#176)
AccessControlDefaultAdminRules.pendingDefaultAdminDelay() (lib/openzeppelin-contracts/contracts/access/extensions/AccessControlDefaultAdminRules.sol#180-183) uses timestamp for comparisons
Dangerous comparisons:
- (_isScheduleSet(schedule) && ! _hasSchedulePassed(schedule)) (lib/openzeppelin-contracts/contracts/access/extensions/AccessControlDefaultAdminRules.sol#182)
AccessControlDefaultAdminRules.acceptDefaultAdminTransfer() (lib/openzeppelin-contracts/contracts/access/extensions/AccessControlDefaultAdminRules.sol#225-232) uses timestamp for comparisons
Dangerous comparisons:
- _msgSender() != newDefaultAdmin (lib/openzeppelin-contracts/contracts/access/extensions/AccessControlDefaultAdminRules.sol#227)
AccessControlDefaultAdminRules._acceptDefaultAdminTransfer() (lib/openzeppelin-contracts/contracts/access/extensions/AccessControlDefaultAdminRules.sol#239-248) uses timestamp for comparisons
Dangerous comparisons:
- ! _isScheduleSet(schedule) || ! _hasSchedulePassed(schedule) (lib/openzeppelin-contracts/contracts/access/extensions/AccessControlDefaultAdminRules.sol#241)
AccessControlDefaultAdminRules._isScheduleSet(uint48) (lib/openzeppelin-contracts/contracts/access/extensions/AccessControlDefaultAdminRules.sol#362-364) uses timestamp for comparisons
Dangerous comparisons:
- schedule != 0 (lib/openzeppelin-contracts/contracts/access/extensions/AccessControlDefaultAdminRules.sol#363)
AccessControlDefaultAdminRules._hasSchedulePassed(uint48) (lib/openzeppelin-contracts/contracts/access/extensions/AccessControlDefaultAdminRules.sol#369-371) uses timestamp for comparisons
Dangerous comparisons:
- schedule < block.timestamp (lib/openzeppelin-contracts/contracts/access/extensions/AccessControlDefaultAdminRules.sol#370)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#block-timestamp
SafeERC20._safeTransfer(IERC20,address,uint256,bool) (lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol#176-200) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol#179-199)
SafeERC20._safeTransferFrom(IERC20,address,address,uint256,bool) (lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol#212-244) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol#221-243)
SafeERC20._safeApprove(IERC20,address,uint256,bool) (lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol#255-279) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol#258-278)
Bytes.slice(bytes,uint256,uint256) (lib/openzeppelin-contracts/contracts/utils/Bytes.sol#86-98) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Bytes.sol#93-95)
Bytes.splice(bytes,uint256,uint256) (lib/openzeppelin-contracts/contracts/utils/Bytes.sol#117-129) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Bytes.sol#123-126)
Bytes.replace(bytes,uint256,bytes,uint256,uint256) (lib/openzeppelin-contracts/contracts/utils/Bytes.sol#154-172) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Bytes.sol#167-169)
Bytes.concat(bytes[]) (lib/openzeppelin-contracts/contracts/utils/Bytes.sol#183-203) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Bytes.sol#194-196)
Bytes.toNibbles(bytes) (lib/openzeppelin-contracts/contracts/utils/Bytes.sol#210-245) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Bytes.sol#211-244)
Bytes._unsafeReadBytesOffset(bytes,uint256) (lib/openzeppelin-contracts/contracts/utils/Bytes.sol#323-328) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Bytes.sol#325-327)
Panic.panic(uint256) (lib/openzeppelin-contracts/contracts/utils/Panic.sol#50-56) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Panic.sol#51-55)
ShortStrings.toString(ShortString) (lib/openzeppelin-contracts/contracts/utils/ShortStrings.sol#63-72) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/ShortStrings.sol#67-70)
StorageSlot.getAddressSlot(bytes32) (lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#66-70) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#67-69)
StorageSlot.getBooleanSlot(bytes32) (lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#75-79) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#76-78)
StorageSlot.getBytes32Slot(bytes32) (lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#84-88) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#85-87)
StorageSlot.getUint256Slot(bytes32) (lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#93-97) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#94-96)
StorageSlot.getInt256Slot(bytes32) (lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#102-106) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#103-105)
StorageSlot.getStringSlot(bytes32) (lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#111-115) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#112-114)
StorageSlot.getStringSlot(string) (lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#120-124) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#121-123)
StorageSlot.getBytesSlot(bytes32) (lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#129-133) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#130-132)
StorageSlot.getBytesSlot(bytes) (lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#138-142) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#139-141)
Strings.toString(uint256) (lib/openzeppelin-contracts/contracts/utils/Strings.sol#42-60) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Strings.sol#47-49)
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Strings.sol#52-54)
Strings.toChecksumHexString(address) (lib/openzeppelin-contracts/contracts/utils/Strings.sol#108-126) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Strings.sol#113-115)
Strings.escapeJSON(string) (lib/openzeppelin-contracts/contracts/utils/Strings.sol#461-505) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Strings.sol#468-470)
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Strings.sol#499-502)
Strings._unsafeReadBytesOffset(bytes,uint256) (lib/openzeppelin-contracts/contracts/utils/Strings.sol#513-518) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Strings.sol#515-517)
Strings._unsafeWriteBytesOffset(bytes,uint256,bytes1) (lib/openzeppelin-contracts/contracts/utils/Strings.sol#526-531) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Strings.sol#528-530)
ECDSA.tryRecover(bytes32,bytes) (lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol#61-80) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol#71-75)
ECDSA.tryRecoverCalldata(bytes32,bytes) (lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol#85-104) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol#95-99)
ECDSA.parse(bytes) (lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol#217-240) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol#218-239)
ECDSA.parseCalldata(bytes) (lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol#245-268) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol#246-267)
MessageHashUtils.toEthSignedMessageHash(bytes32) (lib/openzeppelin-contracts/contracts/utils/cryptography/MessageHashUtils.sol#32-38) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/cryptography/MessageHashUtils.sol#33-37)
MessageHashUtils.toDataWithIntendedValidatorHash(address,bytes32) (lib/openzeppelin-contracts/contracts/utils/cryptography/MessageHashUtils.sol#71-81) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/cryptography/MessageHashUtils.sol#75-80)
MessageHashUtils.toTypedDataHash(bytes32,bytes32) (lib/openzeppelin-contracts/contracts/utils/cryptography/MessageHashUtils.sol#92-100) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/cryptography/MessageHashUtils.sol#93-99)
MessageHashUtils.toDomainSeparator(bytes1,bytes32,bytes32,uint256,address,bytes32) (lib/openzeppelin-contracts/contracts/utils/cryptography/MessageHashUtils.sol#137-179) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/cryptography/MessageHashUtils.sol#147-178)
MessageHashUtils.toDomainTypeHash(bytes1) (lib/openzeppelin-contracts/contracts/utils/cryptography/MessageHashUtils.sol#182-227) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/cryptography/MessageHashUtils.sol#185-226)
Math.add512(uint256,uint256) (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#25-30) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#26-29)
Math.mul512(uint256,uint256) (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#37-46) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#41-45)
Math.tryMul(uint256,uint256) (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#73-84) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#76-80)
Math.tryDiv(uint256,uint256) (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#89-97) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#92-95)
Math.tryMod(uint256,uint256) (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#102-110) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#105-108)
Math.mulDiv(uint256,uint256,uint256) (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#206-277) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#229-236)
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#242-251)
Math.tryModExp(uint256,uint256,uint256) (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#411-435) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#413-434)
Math.tryModExp(bytes,bytes,bytes) (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#451-473) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#463-472)
Math._zeroBytes(bytes) (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#478-490) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#482-484)
Math.log2(uint256) (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#619-658) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#655-657)
SafeCast.toUint(bool) (lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol#1157-1161) uses assembly
- INLINE ASM (lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol#1158-1160)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#assembly-usage
6 different versions of Solidity are used:
- Version constraint ^0.8.28 is used by:
-^0.8.28 (contracts/Sale.sol#1-2)
- Version constraint ^0.8.20 is used by:
-^0.8.20 (lib/openzeppelin-contracts/contracts/access/AccessControl.sol#4)
-^0.8.20 (lib/openzeppelin-contracts/contracts/access/extensions/AccessControlDefaultAdminRules.sol#4)
-^0.8.20 (lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol#4)
-^0.8.20 (lib/openzeppelin-contracts/contracts/utils/Context.sol#4)
-^0.8.20 (lib/openzeppelin-contracts/contracts/utils/Panic.sol#4)
-^0.8.20 (lib/openzeppelin-contracts/contracts/utils/ShortStrings.sol#4)
-^0.8.20 (lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#5)
-^0.8.20 (lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol#4)
-^0.8.20 (lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol#4)
-^0.8.20 (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#4)
-^0.8.20 (lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol#5)
-^0.8.20 (lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol#4)
- Version constraint >=0.8.4 is used by:
->=0.8.4 (lib/openzeppelin-contracts/contracts/access/IAccessControl.sol#4)
->=0.8.4 (lib/openzeppelin-contracts/contracts/access/extensions/IAccessControlDefaultAdminRules.sol#4)
- Version constraint >=0.6.2 is used by:
->=0.6.2 (lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol#4)
->=0.6.2 (lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol#4)
- Version constraint >=0.4.16 is used by:
->=0.4.16 (lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol#4)
->=0.4.16 (lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol#4)
->=0.4.16 (lib/openzeppelin-contracts/contracts/interfaces/IERC5267.sol#4)
->=0.4.16 (lib/openzeppelin-contracts/contracts/interfaces/IERC5313.sol#4)
->=0.4.16 (lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol#4)
->=0.4.16 (lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol#4)
- Version constraint ^0.8.24 is used by:
-^0.8.24 (lib/openzeppelin-contracts/contracts/utils/Bytes.sol#4)
-^0.8.24 (lib/openzeppelin-contracts/contracts/utils/Strings.sol#4)
-^0.8.24 (lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol#4)
-^0.8.24 (lib/openzeppelin-contracts/contracts/utils/cryptography/MessageHashUtils.sol#4)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#different-pragma-directives-are-used
Version constraint ^0.8.20 contains known severe issues (https://solidity.readthedocs.io/en/latest/bugs.html)
- VerbatimInvalidDeduplication
- FullInlinerNonExpressionSplitArgumentEvaluationOrder
- MissingSideEffectsOnSelectorAccess.
It is used by:
- ^0.8.20 (lib/openzeppelin-contracts/contracts/access/AccessControl.sol#4)
- ^0.8.20 (lib/openzeppelin-contracts/contracts/access/extensions/AccessControlDefaultAdminRules.sol#4)
- ^0.8.20 (lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol#4)
- ^0.8.20 (lib/openzeppelin-contracts/contracts/utils/Context.sol#4)
- ^0.8.20 (lib/openzeppelin-contracts/contracts/utils/Panic.sol#4)
- ^0.8.20 (lib/openzeppelin-contracts/contracts/utils/ShortStrings.sol#4)
- ^0.8.20 (lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#5)
- ^0.8.20 (lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol#4)
- ^0.8.20 (lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol#4)
- ^0.8.20 (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#4)
- ^0.8.20 (lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol#5)
- ^0.8.20 (lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol#4)
Version constraint >=0.8.4 contains known severe issues (https://solidity.readthedocs.io/en/latest/bugs.html)
- FullInlinerNonExpressionSplitArgumentEvaluationOrder
- MissingSideEffectsOnSelectorAccess
- AbiReencodingHeadOverflowWithStaticArrayCleanup
- DirtyBytesArrayToStorage
- DataLocationChangeInInternalOverride
- NestedCalldataArrayAbiReencodingSizeValidation
- SignedImmutables.
It is used by:
- >=0.8.4 (lib/openzeppelin-contracts/contracts/access/IAccessControl.sol#4)
- >=0.8.4 (lib/openzeppelin-contracts/contracts/access/extensions/IAccessControlDefaultAdminRules.sol#4)
Version constraint >=0.6.2 contains known severe issues (https://solidity.readthedocs.io/en/latest/bugs.html)
- MissingSideEffectsOnSelectorAccess
- AbiReencodingHeadOverflowWithStaticArrayCleanup
- DirtyBytesArrayToStorage
- NestedCalldataArrayAbiReencodingSizeValidation
- ABIDecodeTwoDimensionalArrayMemory
- KeccakCaching
- EmptyByteArrayCopy
- DynamicArrayCleanup
- MissingEscapingInFormatting
- ArraySliceDynamicallyEncodedBaseType
- ImplicitConstructorCallvalueCheck
- TupleAssignmentMultiStackSlotComponents
- MemoryArrayCreationOverflow.
It is used by:
- >=0.6.2 (lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol#4)
- >=0.6.2 (lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol#4)
Version constraint >=0.4.16 contains known severe issues (https://solidity.readthedocs.io/en/latest/bugs.html)
- DirtyBytesArrayToStorage
- ABIDecodeTwoDimensionalArrayMemory
- KeccakCaching
- EmptyByteArrayCopy
- DynamicArrayCleanup
- ImplicitConstructorCallvalueCheck
- TupleAssignmentMultiStackSlotComponents
- MemoryArrayCreationOverflow
- privateCanBeOverridden
- SignedArrayStorageCopy
- ABIEncoderV2StorageArrayWithMultiSlotElement
- DynamicConstructorArgumentsClippedABIV2
- UninitializedFunctionPointerInConstructor_0.4.x
- IncorrectEventSignatureInLibraries_0.4.x
- ExpExponentCleanup
- NestedArrayFunctionCallDecoder
- ZeroFunctionSelector.
It is used by:
- >=0.4.16 (lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol#4)
- >=0.4.16 (lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol#4)
- >=0.4.16 (lib/openzeppelin-contracts/contracts/interfaces/IERC5267.sol#4)
- >=0.4.16 (lib/openzeppelin-contracts/contracts/interfaces/IERC5313.sol#4)
- >=0.4.16 (lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol#4)
- >=0.4.16 (lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol#4)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#incorrect-versions-of-solidity
Low level call in Sale.withdrawTokens(IERC20Metadata,address,uint256) (contracts/Sale.sol#258-273):
- (success,None) = to.call{value: amount}() (contracts/Sale.sol#263-265)
Low level call in Sale._executeTokenBuy(address,address,uint256,uint256,IERC20Metadata,uint256,uint256,uint256,bytes) (contracts/Sale.sol#338-376):
- (success,None) = buyer.call{value: msg.value - payTokenAmount}() (contracts/Sale.sol#362-365)
Low level call in Sale._executeTokenSell(address,uint256,uint256,IERC20Metadata) (contracts/Sale.sol#376-395):
- (success,None) = seller.call{value: payTokenAmount}() (contracts/Sale.sol#384-388)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#low-level-calls
Function EIP712._EIP712Name() (lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol#146-148) is not in mixedCase
Function EIP712._EIP712Version() (lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol#157-159) is not in mixedCase
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#conformance-to-solidity-naming-conventions
Sale.constructor(uint256,address[],uint256[],uint256[],uint256,uint256,address) (contracts/Sale.sol#111-150) uses literals with too many digits:
- statusToBuyBonusPercent = (0,50000,100000,150000) (contracts/Sale.sol#143-144)
Sale.constructor(uint256,address[],uint256[],uint256[],uint256,uint256,address) (contracts/Sale.sol#111-150) uses literals with too many digits:
- levelToStatusToRefBonusPercent[0] = (0,70000,80000,100000) (contracts/Sale.sol#144-145)
Sale.slitherConstructorConstantVariables() (contracts/Sale.sol#8-502) uses literals with too many digits:
- PCT_DIV = 1000000 (contracts/Sale.sol#52)
Bytes.toNibbles(bytes) (lib/openzeppelin-contracts/contracts/utils/Bytes.sol#210-245) uses literals with too many digits:
- chunk_toNibbles_asm_0 = 0x0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff & chunk_toNibbles_asm_0 << 64 | chunk_toNibbles_asm_0 (lib/openzeppelin-contracts/contracts/utils/Bytes.sol#222-225)
Bytes.toNibbles(bytes) (lib/openzeppelin-contracts/contracts/utils/Bytes.sol#210-245) uses literals with too many digits:
- chunk_toNibbles_asm_0 = 0x00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff & chunk_toNibbles_asm_0 << 32 | chunk_toNibbles_asm_0 (lib/openzeppelin-contracts/contracts/utils/Bytes.sol#226-229)
Bytes.reverseBytes32(bytes32) (lib/openzeppelin-contracts/contracts/utils/Bytes.sol#258-272) uses literals with too many digits:
- value = ((value >> 32) & 0x00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF) | ((value & 0x00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF) << 32) (lib/openzeppelin-contracts/contracts/utils/Bytes.sol#265-267)
Bytes.reverseBytes32(bytes32) (lib/openzeppelin-contracts/contracts/utils/Bytes.sol#258-272) uses literals with too many digits:
- value = ((value >> 64) & 0x0000000000000000FFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF) | ((value & 0x0000000000000000FFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF) << 64) (lib/openzeppelin-contracts/contracts/utils/Bytes.sol#268-270)
Bytes.reverseBytes16(bytes16) (lib/openzeppelin-contracts/contracts/utils/Bytes.sol#275-283) uses literals with too many digits:
- value = ((value & 0xFFFFFFFF00000000FFFFFFFF00000000) >> 32) | ((value & 0x00000000FFFFFFFF00000000FFFFFFFF) << 32) (lib/openzeppelin-contracts/contracts/utils/Bytes.sol#280-281)
ShortStrings.slitherConstructorConstantVariables() (lib/openzeppelin-contracts/contracts/utils/ShortStrings.sol#40-122) uses literals with too many digits:
- FALLBACK_SENTINEL = 0x00000000000000000000000000000000000000000000000000000000000000FF (lib/openzeppelin-contracts/contracts/utils/ShortStrings.sol#42)
Math.log2(uint256) (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#619-658) uses literals with too many digits:
- r = r | byte(uint256,uint256)(x >> r,0x0000010102020202030303030303030300000000000000000000000000000000) (lib/openzeppelin-contracts/contracts/utils/math/Math.sol#656)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#too-many-digits
. analyzed (25 contracts with 100 detectors), 97 result(s) found
{
"solc": {
"status": "ok",
"use_rc": 0,
"version": "0.8.28",
"strategy": "solc-select",
"solc_path": "/var/www/tripwire/.venv/bin/solc",
"install_rc": 0,
"use_stderr": null,
"use_stdout": "Switched global version to 0.8.28",
"install_stderr": null,
"install_stdout": "Version '0.8.28' is already installed, skipping..."
},
"solc_args": "--base-path /tmp/slither-gubm5ea2 --include-path /tmp/slither-gubm5ea2/lib --include-path /tmp/slither-gubm5ea2/lib/openzeppelin-contracts --allow-paths /tmp/slither-gubm5ea2,/tmp/slither-gubm5ea2/lib,/tmp/slither-gubm5ea2/lib/openzeppelin-contracts,/tmp/slither-gubm5ea2/src",
"remappings": [
"openzeppelin-contracts/=lib/openzeppelin-contracts/",
"@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/"
],
"source_files": [
"@openzeppelin/contracts/access/AccessControl.sol",
"@openzeppelin/contracts/access/extensions/AccessControlDefaultAdminRules.sol",
"@openzeppelin/contracts/access/extensions/IAccessControlDefaultAdminRules.sol",
"@openzeppelin/contracts/access/IAccessControl.sol",
"@openzeppelin/contracts/interfaces/IERC1363.sol",
"@openzeppelin/contracts/interfaces/IERC165.sol",
"@openzeppelin/contracts/interfaces/IERC20.sol",
"@openzeppelin/contracts/interfaces/IERC5267.sol",
"@openzeppelin/contracts/interfaces/IERC5313.sol",
"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol",
"@openzeppelin/contracts/token/ERC20/IERC20.sol",
"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol",
"@openzeppelin/contracts/utils/Context.sol",
"@openzeppelin/contracts/utils/cryptography/ECDSA.sol",
"@openzeppelin/contracts/utils/cryptography/EIP712.sol",
"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol",
"@openzeppelin/contracts/utils/introspection/ERC165.sol",
"@openzeppelin/contracts/utils/introspection/IERC165.sol",
"@openzeppelin/contracts/utils/math/Math.sol",
"@openzeppelin/contracts/utils/math/SafeCast.sol",
"@openzeppelin/contracts/utils/math/SignedMath.sol",
"@openzeppelin/contracts/utils/Panic.sol",
"@openzeppelin/contracts/utils/ShortStrings.sol",
"@openzeppelin/contracts/utils/StorageSlot.sol",
"@openzeppelin/contracts/utils/Strings.sol",
"contracts/Sale.sol"
],
"contract_count": 0,
"contract_names": [],
"detector_count": 97,
"workspace_hash": "1556ef0dd990a962be359906f4a8483cd62efc8c501c67f3bc9ff89b836f87b5",
"duration_seconds": 2.527616262435913,
"solc_version_requested": "0.8.28"
}
{"no_findings":false,"summary":"Sale.sol has two user-exploitable issues: referral logic allows self/cyclic bonus farming, and exact-amount purchases can round payment down to zero for low-priced payment tokens.","findings":[{"severity":"high","category":"other","title":"Referrer field is never validated, enabling self-referral and cyclic referral farming","exploit_scenario":"A buyer can set `referrer` to their own address on their first purchase. The contract stores that value without validation, then walks the referral chain for 3 levels and transfers referral bonuses each time. Because Bronze referral status is reachable at zero historical volume by default, the same buyer can immediately collect all 3 referral tiers on their own purchase. After reaching higher referral status, they can keep buying through the same self-reference and siphon 14% to 17.5% extra sale tokens per purchase. Two or more colluding accounts can also create short referral cycles and recycle the same bonus path.","recommendation":"Validate the supplied referrer before storing it or paying bonuses. At minimum, reject `referrer == buyer`, reject obvious cycles, and consider requiring the referrer to be a pre-existing eligible participant. Apply validation before `accountToBuyerInfo[buyer].referrer = referrer` and before traversing the referral chain.","evidence":"`InvalidReferrer` is declared but never used. On a first buy, `_checkReferrerAndPayBonus` stores any non-zero `referrer` directly, then pays 3 levels of bonuses by repeatedly following `buyerInfo.referrer`. With default `refStatusToRequirements = [0, 0, 5000, 10000]`, `_updateRefStatus` can mark a zero-volume address as Bronze before the payout loop runs.","locations":["contracts/Sale.sol:25","contracts/Sale.sol:152","contracts/Sale.sol:153","contracts/Sale.sol:466","contracts/Sale.sol:468","contracts/Sale.sol:469","contracts/Sale.sol:470","contracts/Sale.sol:473","contracts/Sale.sol:479"]},{"severity":"medium","category":"math","title":"Exact-output buys can mint market tokens for zero payment because rounding-down is unchecked","exploit_scenario":"For low-priced payment assets, a buyer can call `buyExactMarketTokenForPayToken` with a small but valid `buyAmount` such that `prices[payTokenIndex] * buyAmount / 10**marketToken.decimals()` rounds down to zero. `_executeTokenBuy` never rejects `payTokenAmount == 0`, so the buyer receives market tokens while paying neither ETH nor ERC20 tokens. Because the signature only covers `(account, payToken, usdPrice, deadline, nonce)` and not `buyAmount`, any valid signed quote for that pay token can be reused with one of these free-buy sizes.","recommendation":"After computing `payTokenAmount`, require it to be non-zero before proceeding, or round up instead of down for exact-output purchases. Also consider binding `buyAmount` or `payTokenAmount` into the signed payload if quote authorization is meant to cover the full trade terms.","evidence":"`buyExactMarketTokenForPayToken` only enforces a minimum `buyAmount` based on decimal difference, then computes `payTokenAmount` with integer division. `_executeTokenBuy` accepts that value as-is and only checks `msg.value < payTokenAmount` or performs `safeTransferFrom(..., payTokenAmount)`. If `payTokenAmount` is zero, both payment branches succeed while `marketToken.safeTransfer` still sends the purchased tokens.","locations":["contracts/Sale.sol:169","contracts/Sale.sol:173","contracts/Sale.sol:174","contracts/Sale.sol:349","contracts/Sale.sol:368","contracts/Sale.sol:375","contracts/Sale.sol:376","contracts/Sale.sol:379"]}]}
OpenAI Codex v0.118.0 (research preview)
--------
workdir: /tmp/codex-stz9p30g
model: gpt-5.4
provider: openai
approval: never
sandbox: read-only
reasoning effort: high
reasoning summaries: none
session id: 019d567c-d5c4-7c82-ba7e-445ca944cdd2
--------
user
You are a security auditor. Audit this Solidity codebase for exploitable vulnerabilities.
Focus on: reentrancy, access control, upgradeability/proxy issues, signature validation, oracle manipulation,
accounting/invariant breaks, external call patterns, unchecked return values, and dangerous delegatecall.
Scope rules:
- You MUST fully read `AUDIT_BUNDLE.txt` before concluding. It contains the complete contents of all first-party Solidity sources in this workspace.
- Treat `lib/` and `@openzeppelin/` as third-party dependencies; skip them unless there is a concrete misuse angle in first-party code.
- If there are only dependency files and no first-party sources, set no_findings=true and explain in summary.
Output MUST be valid JSON matching the provided schema.
- If you find nothing meaningful: set no_findings=true and findings=[].
- Otherwise: set no_findings=false and include findings with severity/category/title and file/line locations when possible.
Output constraints (IMPORTANT):
- severity MUST be exactly one of: info, low, medium, high, critical (lowercase).
- category MUST be exactly one of: access_control, reentrancy, math, oracle, upgradeability, auth, other.
Keep summary short and concrete.
warning: Codex could not find system bubblewrap on PATH. Please install bubblewrap with your package manager. Codex will use the vendored bubblewrap in the meantime.
→ Read AUDIT_BUNDLE.txt completely and identify first-party Solidity files in scope
• Analyze first-party contracts for exploitable issues in the requested categories
• Produce JSON report with findings and concrete evidence/locations
exec
/bin/bash -lc "pwd && ls -la && wc -l AUDIT_BUNDLE.txt && rg --files -g 'AUDIT_BUNDLE.txt' -g '*.sol'" in /tmp/codex-stz9p30g
succeeded in 0ms:
/tmp/codex-stz9p30g
total 64
drwx------ 4 noahkuhn noahkuhn 4096 Apr 4 03:15 .
drwxrwxrwt 250 nobody nogroup 24576 Apr 4 03:15 ..
-rw-rw-r-- 1 noahkuhn noahkuhn 20372 Apr 4 03:15 AUDIT_BUNDLE.txt
-rw-rw-r-- 1 noahkuhn noahkuhn 815 Apr 4 03:15 codex-output-schema.json
drwxrwxr-x 2 noahkuhn noahkuhn 4096 Apr 4 03:15 contracts
drwxrwxr-x 3 noahkuhn noahkuhn 4096 Apr 4 03:15 @openzeppelin
531 AUDIT_BUNDLE.txt
AUDIT_BUNDLE.txt
contracts/Sale.sol
@openzeppelin/contracts/interfaces/IERC1363.sol
@openzeppelin/contracts/interfaces/IERC5313.sol
@openzeppelin/contracts/interfaces/IERC20.sol
@openzeppelin/contracts/interfaces/IERC5267.sol
@openzeppelin/contracts/interfaces/IERC165.sol
@openzeppelin/contracts/access/AccessControl.sol
@openzeppelin/contracts/access/IAccessControl.sol
@openzeppelin/contracts/utils/Strings.sol
@openzeppelin/contracts/access/extensions/IAccessControlDefaultAdminRules.sol
@openzeppelin/contracts/access/extensions/AccessControlDefaultAdminRules.sol
@openzeppelin/contracts/utils/math/SafeCast.sol
@openzeppelin/contracts/utils/math/SignedMath.sol
@openzeppelin/contracts/utils/math/Math.sol
@openzeppelin/contracts/utils/StorageSlot.sol
@openzeppelin/contracts/utils/ShortStrings.sol
@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol
@openzeppelin/contracts/token/ERC20/IERC20.sol
@openzeppelin/contracts/utils/Context.sol
@openzeppelin/contracts/utils/Panic.sol
@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol
@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol
@openzeppelin/contracts/utils/cryptography/ECDSA.sol
@openzeppelin/contracts/utils/cryptography/EIP712.sol
@openzeppelin/contracts/utils/introspection/ERC165.sol
@openzeppelin/contracts/utils/introspection/IERC165.sol
exec
/bin/bash -lc "sed -n '1,260p' AUDIT_BUNDLE.txt" in /tmp/codex-stz9p30g
succeeded in 0ms:
This file concatenates the full contents of first-party Solidity sources for auditing.
Do not treat dependency code under lib/ or @openzeppelin/ as first-party.
================================================================================
FILE: contracts/Sale.sol
================================================================================
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;
import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {AccessControlDefaultAdminRules} from "@openzeppelin/contracts/access/extensions/AccessControlDefaultAdminRules.sol";
import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";
import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
contract Sale is AccessControlDefaultAdminRules, EIP712 {
using SafeERC20 for IERC20Metadata;
/// ERRORS
error ZeroAddress();
error DailyBuyLimitExeeded();
error SaleNotStarted();
error InvalidStartTime();
error InvalidPrice();
error InvalidCoefficient();
error InvalidBuyAmount();
error InvalidPayAmount();
error InvalidSellAmount();
error SellLimitExeeded();
error InvalidReferrer();
error InvalidArrayLength();
error InvalidIndex();
error RequestAlreadyProcessed(uint256 nonce);
error InvalidSignature();
error InvalidEtherAmount();
error DeadlineExeeded();
error InvalidPercent();
error ETH_TRANSFER_FAILED();
/// CONSTANTS
enum Status {
None,
Bronze,
Silver,
Gold
}
struct BuyerInfo {
Status buyStatus;
Status refStatus;
uint256 sellAmount;
uint256 payAmountInUSD;
address referrer;
}
/// @notice Divisor for computation (1 bps (basis point) precision: 0.0001%).
uint256 public constant PCT_DIV = 1000000;
uint256 public constant ONE_DAY = 60 * 60 * 24;
bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE");
bytes32 public constant VERIFY_PRICE_TYPEHASH = keccak256(
"VerifyPrice(address account,address payToken,uint256 price,uint256 deadline,uint256 nonce)"
);
uint256 public immutable startTime;
IERC20Metadata public immutable marketToken;
/// STORAGE
/// @notice Prices for each pay token
/// @dev Price should be in pay token decimals!
uint256[] public prices;
/// @notice Buyback prices for each pay token
/// @dev Price should be in pay token decimals!
uint256[] public buybackPrices;
/// @notice Pay tokens
address[] public payTokens;
/// @notice Status to buy bonus percent
/// @dev In PCT_DIV precision
uint256[4] public statusToBuyBonusPercent;
/// @notice Level to status to ref bonus percent
/// @dev In PCT_DIV precision
uint256[4][3] public levelToStatusToRefBonusPercent;
/// @notice Buy status to requirements
/// @dev In USD without decimals
uint256[4] public buyStatusToRequirements;
/// @notice Ref status to requirements
/// @dev In USD without decimals
uint256[4] public refStatusToRequirements;
/// @dev In PCT_DIV decimals
uint256 public marketTokenUsdPrice;
uint256 public dailyBuyLimit;
uint256 public dailyBuyCounter;
uint256 public lastCounterResetTime;
uint256 public sellLimit;
/// @dev Last verified nonce
uint256 public lastNonce;
address public operator;
mapping(address => BuyerInfo) public accountToBuyerInfo;
/// @dev Monitor nonces. Prevent replay attacks
mapping(uint256 => bool) public nonces;
/// EVENTS
event DailyBuyLimitSetted(uint256 newLimit);
event PricesUpdated(uint256[] newPrice, uint256[] newBuybackPrice, uint256 marketTokenUsdPrice);
event TokenPurchased(address indexed buyer, uint256 buyTokenAmount, uint256 buyBonus, uint256 payTokenAmount);
event TokenSold(address indexed seller, uint256 sellTokenAmount, uint256 payTokenAmount);
event SellLimitSetted(uint256 sellLimit);
event OperatorSetted(address operator);
event PayTokensUpdated(address[] payTokens);
event BuyBonusPercentsUpdated(uint256[4] bonusPercents);
event RefBonusPercentsUpdated(uint256[4][3] bonusPercents);
event BuyBonusRequirementsUpdated(uint256[4] bonusRequirements);
event RefBonusRequirementsUpdated(uint256[4] bonusRequirements);
event TokensWithdrawn(IERC20Metadata token, address to, uint256 amount);
constructor(
uint256 startTime_,
address[] memory payTokens_,
uint256[] memory prices_,
uint256[] memory buybackPrices_,
uint256 marketTokenUsdPrice_,
uint256 dailyBuyLimit_,
address marketToken_
)
AccessControlDefaultAdminRules(0, msg.sender)
EIP712("Collective Mind AI Sale", "1")
{
if (block.timestamp > startTime_) revert InvalidStartTime();
if (
payTokens_.length == 0 ||
payTokens_.length != prices_.length ||
payTokens_.length != buybackPrices_.length
) revert InvalidArrayLength();
for (uint256 i = 0; i < payTokens_.length; i++) {
if (prices_[i] == 0) revert InvalidPrice();
if (buybackPrices_[i] == 0) revert InvalidPrice();
}
if (marketToken_ == address(0)) revert ZeroAddress();
startTime = startTime_;
lastCounterResetTime = startTime_;
payTokens = payTokens_;
prices = prices_;
buybackPrices = buybackPrices_;
marketTokenUsdPrice = marketTokenUsdPrice_;
dailyBuyLimit = dailyBuyLimit_;
marketToken = IERC20Metadata(marketToken_);
statusToBuyBonusPercent = [0, 50000, 100000, 150000];
levelToStatusToRefBonusPercent[0] = [0, 70000, 80000, 100000];
levelToStatusToRefBonusPercent[1] = [0, 30000, 40000, 50000];
levelToStatusToRefBonusPercent[2] = [0, 10000, 20000, 25000];
buyStatusToRequirements = [0, 1000, 5000, 10000];
refStatusToRequirements = [0, 0, 5000, 10000];
}
function buyExactMarketTokenForPayToken(
uint256 buyAmount,
uint256 payTokenIndex,
address referrer,
uint256 usdPrice,
uint256 deadline,
uint256 nonce,
bytes memory signature
) external payable {
if (block.timestamp < startTime) revert SaleNotStarted();
if (block.timestamp > deadline) revert DeadlineExeeded();
if (payTokenIndex >= payTokens.length) revert InvalidIndex();
IERC20Metadata payToken = IERC20Metadata(payTokens[payTokenIndex]);
uint256 payTokenDecimals = 18;
if (address(payToken) != address(0)) {
payTokenDecimals = payToken.decimals();
}
if (buyAmount < 10**(marketToken.decimals() - payTokenDecimals)) revert InvalidBuyAmount();
uint256 payTokenAmount = prices[payTokenIndex] * buyAmount / 10**marketToken.decimals();
_executeTokenBuy(
msg.sender,
referrer,
buyAmount,
payTokenAmount,
payToken,
usdPrice,
deadline,
nonce,
signature
);
}
function buyMarketTokenForExactPayToken(
uint256 payAmount,
uint256 payTokenIndex,
address referrer,
uint256 usdPrice,
uint256 deadline,
uint256 nonce,
bytes memory signature
) external payable {
if (block.timestamp < startTime) revert SaleNotStarted();
if (block.timestamp > deadline) revert DeadlineExeeded();
if (payTokenIndex >= payTokens.length) revert InvalidIndex();
uint256 price = prices[payTokenIndex];
if (payAmount < price) revert InvalidPayAmount();
IERC20Metadata payToken = IERC20Metadata(payTokens[payTokenIndex]);
uint256 buyTokenAmount = payAmount * 10**marketToken.decimals() / price;
_executeTokenBuy(
msg.sender,
referrer,
buyTokenAmount,
payAmount,
payToken,
usdPrice,
deadline,
nonce,
signature
);
}
function sellExactMarketTokenForPayToken(uint256 sellAmount, uint256 payTokenIndex) external {
if (block.timestamp < startTime) revert SaleNotStarted();
if (payTokenIndex >= payTokens.length) revert InvalidIndex();
IERC20Metadata payToken = IERC20Metadata(payTokens[payTokenIndex]);
uint256 payTokenDecimals = 18;
if (address(payToken) != address(0)) {
payTokenDecimals = payToken.decimals();
}
if (sellAmount < 10**(marketToken.decimals() - payTokenDecimals)) revert InvalidSellAmount();
uint256 buybackPrice = buybackPrices[payTokenIndex];
uint256 payTokenAmount = buybackPrice * sellAmount / 10**marketToken.decimals();
_executeTokenSell(msg.sender, sellAmount, payTokenAmount, payToken);
}
function sellMarketTokenForExactPayToken(uint256 payAmount, uint256 payTokenIndex) external {
if (block.timestamp < startTime) revert SaleNotStarted();
if (payTokenIndex >= payTokens.length) revert InvalidIndex();
uint256 buybackPrice = buybackPrices[payTokenIndex];
if (payAmount < buybackPrice) revert InvalidPayAmount();
IERC20Metadata payToken = IERC20Metadata(payTokens[payTokenIndex]);
uint256 sellTokenAmount = payAmount * 10**marketToken.decimals() / buybackPrice;
_executeTokenSell(msg.sender, sellTokenAmount, payAmount, payToken);
}
function setDailyBuyLimit(uint256 buyLimit) external onlyRole(DEFAULT_ADMIN_ROLE) {
dailyBuyLimit = buyLimit;
emit DailyBuyLimitSetted(buyLimit);
}
function setSellLimit(uint256 sellLimit_) external onlyRole(DEFAULT_ADMIN_ROLE) {
sellLimit = sellLimit_;
emit SellLimitSetted(sellLimit_);
exec
/bin/bash -lc "sed -n '261,531p' AUDIT_BUNDLE.txt" in /tmp/codex-stz9p30g
succeeded in 0ms:
}
function setOperator(address operator_) external onlyRole(DEFAULT_ADMIN_ROLE) {
if (operator_ == address(0)) revert ZeroAddress();
if (operator != address(0)) {
_revokeRole(OPERATOR_ROLE, operator);
}
_grantRole(OPERATOR_ROLE, operator_);
operator = operator_;
emit OperatorSetted(operator_);
}
function withdrawTokens(
IERC20Metadata token,
address to,
uint256 amount
) external onlyRole(DEFAULT_ADMIN_ROLE) {
if(address(token) == address(0)) {
(bool success, ) = to.call{value: amount}("");
if (!success) revert ETH_TRANSFER_FAILED();
} else {
token.safeTransfer(to, amount);
}
emit TokensWithdrawn(token, to, amount);
}
function setPayTokens(
address[] calldata payTokens_,
uint256[] calldata prices_,
uint256[] calldata buybackPrices_,
uint256 marketTokenUsdPrice_
) external onlyRole(DEFAULT_ADMIN_ROLE) {
if (
payTokens_.length == 0 ||
payTokens_.length != prices_.length ||
payTokens_.length != buybackPrices_.length
) revert InvalidArrayLength();
payTokens = payTokens_;
_setPrices(prices_, buybackPrices_, marketTokenUsdPrice_);
emit PayTokensUpdated(payTokens_);
}
function setPrices(uint256[] calldata prices_, uint256[] calldata buybackPrices_, uint256 marketTokenUsdPrice_) external onlyRole(OPERATOR_ROLE) {
_setPrices(prices_, buybackPrices_, marketTokenUsdPrice_);
}
function _setPrices(uint256[] calldata prices_, uint256[] calldata buybackPrices_, uint256 marketTokenUsdPrice_) internal {
if (payTokens.length != prices_.length || prices_.length != buybackPrices_.length) revert InvalidArrayLength();
prices = prices_;
buybackPrices = buybackPrices_;
marketTokenUsdPrice = marketTokenUsdPrice_;
emit PricesUpdated(prices_, buybackPrices_, marketTokenUsdPrice_);
}
function setBuyBonusPercents(uint256[4] calldata bonusPercents) external onlyRole(DEFAULT_ADMIN_ROLE) {
for (uint i = 0; i < bonusPercents.length; i++) {
if (bonusPercents[i] > PCT_DIV) revert InvalidPercent();
}
statusToBuyBonusPercent = bonusPercents;
emit BuyBonusPercentsUpdated(bonusPercents);
}
function setBuyBonusRequirements(uint256[4] calldata bonusRequirements) external onlyRole(DEFAULT_ADMIN_ROLE) {
buyStatusToRequirements = bonusRequirements;
emit BuyBonusRequirementsUpdated(bonusRequirements);
}
function setRefBonusPercents(uint256[4][3] calldata bonusPercents) external onlyRole(DEFAULT_ADMIN_ROLE) {
for (uint i = 0; i < bonusPercents.length; i++) {
for (uint j = 0; j < bonusPercents[i].length; j++) {
if (bonusPercents[i][j] > PCT_DIV) revert InvalidPercent();
}
}
levelToStatusToRefBonusPercent = bonusPercents;
emit RefBonusPercentsUpdated(bonusPercents);
}
function setRefBonusRequirements(uint256[4] calldata bonusRequirements) external onlyRole(DEFAULT_ADMIN_ROLE) {
refStatusToRequirements = bonusRequirements;
emit RefBonusRequirementsUpdated(bonusRequirements);
}
function _executeTokenBuy(
address buyer,
address referrer,
uint256 buyTokenAmount,
uint256 payTokenAmount,
IERC20Metadata payToken,
uint256 usdPrice,
uint256 deadline,
uint256 nonce,
bytes memory signature
) internal {
{
bytes32 typehash = getVerifyPriceTypeHash(buyer, address(payToken), usdPrice, deadline, nonce);
signatureVerification(typehash, nonce, signature);
}
_checkAndUpdateBuyCounter(buyTokenAmount);
uint256 buyBonus = _calcBuyBonus(buyer, buyTokenAmount);
if (address(payToken) == address(0)) {
if (msg.value < payTokenAmount) revert InvalidEtherAmount();
if (msg.value > payTokenAmount) {
(bool success, ) = buyer.call{value: msg.value - payTokenAmount}("");
if (!success) revert ETH_TRANSFER_FAILED();
}
} else {
if (msg.value != 0) revert InvalidEtherAmount();
payToken.safeTransferFrom(buyer, address(this), payTokenAmount);
}
marketToken.safeTransfer(buyer, buyTokenAmount + buyBonus);
_checkReferrerAndPayBonus(buyer, referrer, buyTokenAmount);
_checkAndUpdateBuyerStatuses(buyer, payTokenAmount, payToken, usdPrice);
emit TokenPurchased(buyer, buyTokenAmount, buyBonus, payTokenAmount);
}
function _executeTokenSell(
address seller,
uint256 sellTokenAmount,
uint256 payTokenAmount,
IERC20Metadata payToken
) internal {
_checkAndUpdateSellCounter(seller, sellTokenAmount);
marketToken.safeTransferFrom(seller, address(this), sellTokenAmount);
if (address(payToken) == address(0)) {
(bool success, ) = seller.call{value: payTokenAmount}("");
if (!success) revert ETH_TRANSFER_FAILED();
} else {
payToken.safeTransfer(seller, payTokenAmount);
}
emit TokenSold(seller, sellTokenAmount, payTokenAmount);
}
function _checkAndUpdateBuyCounter(uint256 buyAmount) internal {
uint256 dailyCounter = dailyBuyCounter;
if ((block.timestamp - startTime) / ONE_DAY - (lastCounterResetTime - startTime) / ONE_DAY > 0) {
dailyCounter = 0;
lastCounterResetTime = block.timestamp;
}
dailyCounter += buyAmount;
if (dailyCounter > dailyBuyLimit) revert DailyBuyLimitExeeded();
dailyBuyCounter = dailyCounter;
}
function _checkAndUpdateSellCounter(address seller, uint256 sellAmount) internal {
if (accountToBuyerInfo[seller].sellAmount + sellAmount > sellLimit) revert SellLimitExeeded();
accountToBuyerInfo[seller].sellAmount += sellAmount;
}
function _checkAndUpdateBuyerStatuses(address buyer, uint256 payAmount, IERC20Metadata payToken, uint256 usdPrice) internal {
uint256 payTokenDecimals = 18;
if (address(payToken) != address(0)) {
payTokenDecimals = payToken.decimals();
}
uint256 payAmountInUSD = payAmount * usdPrice / (10 ** payTokenDecimals);
accountToBuyerInfo[buyer].payAmountInUSD += payAmountInUSD;
BuyerInfo memory buyerInfo = accountToBuyerInfo[buyer];
if (buyerInfo.buyStatus != Status.Gold) {
if (buyerInfo.payAmountInUSD >= buyStatusToRequirements[uint256(Status.Gold)] * PCT_DIV) {
accountToBuyerInfo[buyer].buyStatus = Status.Gold;
} else if (buyerInfo.payAmountInUSD >= buyStatusToRequirements[uint256(Status.Silver)] * PCT_DIV) {
accountToBuyerInfo[buyer].buyStatus = Status.Silver;
} else if (buyerInfo.payAmountInUSD >= buyStatusToRequirements[uint256(Status.Bronze)] * PCT_DIV) {
accountToBuyerInfo[buyer].buyStatus = Status.Bronze;
}
}
_updateRefStatus(buyer, buyerInfo);
}
function _updateRefStatus(address buyer, BuyerInfo memory buyerInfo) internal {
if (buyerInfo.refStatus != Status.Gold) {
if (buyerInfo.payAmountInUSD >= refStatusToRequirements[uint256(Status.Gold)] * PCT_DIV) {
accountToBuyerInfo[buyer].refStatus = Status.Gold;
} else if (buyerInfo.payAmountInUSD >= refStatusToRequirements[uint256(Status.Silver)] * PCT_DIV) {
accountToBuyerInfo[buyer].refStatus = Status.Silver;
} else if (buyerInfo.payAmountInUSD >= refStatusToRequirements[uint256(Status.Bronze)] * PCT_DIV) {
accountToBuyerInfo[buyer].refStatus = Status.Bronze;
}
}
}
function _calcBuyBonus(address buyer, uint256 buyAmount) internal view returns(uint256 buyBonus) {
Status buyerBuyStatus = accountToBuyerInfo[buyer].buyStatus;
buyBonus = buyAmount * statusToBuyBonusPercent[uint256(buyerBuyStatus)] / PCT_DIV;
}
function _checkReferrerAndPayBonus(address buyer, address referrer, uint256 buyAmount) internal {
BuyerInfo memory buyerInfo = accountToBuyerInfo[buyer];
if (buyerInfo.payAmountInUSD == 0 && referrer != address(0)) {
_updateRefStatus(referrer, accountToBuyerInfo[referrer]);
accountToBuyerInfo[buyer].referrer = referrer;
buyerInfo.referrer = referrer;
}
for (uint256 i = 0; i < levelToStatusToRefBonusPercent.length; i++) {
if (buyerInfo.referrer == address(0)) break;
address referrerAddress = buyerInfo.referrer;
buyerInfo = accountToBuyerInfo[buyerInfo.referrer];
uint256 refBonus = buyAmount * levelToStatusToRefBonusPercent[i][uint256(buyerInfo.refStatus)] / PCT_DIV;
marketToken.safeTransfer(referrerAddress, refBonus);
}
}
///------------------ EIP712 ------------------///
/// @dev Verifies that chain signature is valid
/// @param typeHash abi encoded type hash digest
/// @param nonce Prevent replay attacks
/// @param signature Signature bytes
function signatureVerification(
bytes32 typeHash,
uint256 nonce,
bytes memory signature
) internal {
if (nonces[nonce]) revert RequestAlreadyProcessed(nonce);
bytes32 permitDigest = _hashTypedDataV4(typeHash);
// Recover the signer of the PERMIT_DIGEST
address signer = ECDSA.recover(permitDigest, signature);
// Compare the recover and the required signer
if (signer != operator) revert InvalidSignature();
nonces[nonce] = true;
lastNonce = nonce;
}
function getVerifyPriceTypeHash(
address account,
address payToken,
uint256 usdPrice,
uint256 deadline,
uint256 nonce
) internal pure returns(bytes32) {
return keccak256(
abi.encode(
VERIFY_PRICE_TYPEHASH,
account,
payToken,
usdPrice,
deadline,
nonce
)
);
}
}
exec
/bin/bash -lc "nl -ba contracts/Sale.sol | sed -n '1,260p'" in /tmp/codex-stz9p30g
succeeded in 0ms:
1 // SPDX-License-Identifier: MIT
2 pragma solidity ^0.8.28;
3
4 import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
5 import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
6 import {AccessControlDefaultAdminRules} from "@openzeppelin/contracts/access/extensions/AccessControlDefaultAdminRules.sol";
7 import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";
8 import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
9
10 contract Sale is AccessControlDefaultAdminRules, EIP712 {
11 using SafeERC20 for IERC20Metadata;
12
13 /// ERRORS
14
15 error ZeroAddress();
16 error DailyBuyLimitExeeded();
17 error SaleNotStarted();
18 error InvalidStartTime();
19 error InvalidPrice();
20 error InvalidCoefficient();
21 error InvalidBuyAmount();
22 error InvalidPayAmount();
23 error InvalidSellAmount();
24 error SellLimitExeeded();
25 error InvalidReferrer();
26 error InvalidArrayLength();
27 error InvalidIndex();
28 error RequestAlreadyProcessed(uint256 nonce);
29 error InvalidSignature();
30 error InvalidEtherAmount();
31 error DeadlineExeeded();
32 error InvalidPercent();
33 error ETH_TRANSFER_FAILED();
34
35 /// CONSTANTS
36
37 enum Status {
38 None,
39 Bronze,
40 Silver,
41 Gold
42 }
43
44 struct BuyerInfo {
45 Status buyStatus;
46 Status refStatus;
47 uint256 sellAmount;
48 uint256 payAmountInUSD;
49 address referrer;
50 }
51
52 /// @notice Divisor for computation (1 bps (basis point) precision: 0.0001%).
53 uint256 public constant PCT_DIV = 1000000;
54 uint256 public constant ONE_DAY = 60 * 60 * 24;
55 bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE");
56 bytes32 public constant VERIFY_PRICE_TYPEHASH = keccak256(
57 "VerifyPrice(address account,address payToken,uint256 price,uint256 deadline,uint256 nonce)"
58 );
59 uint256 public immutable startTime;
60 IERC20Metadata public immutable marketToken;
61
62 /// STORAGE
63
64 /// @notice Prices for each pay token
65 /// @dev Price should be in pay token decimals!
66 uint256[] public prices;
67 /// @notice Buyback prices for each pay token
68 /// @dev Price should be in pay token decimals!
69 uint256[] public buybackPrices;
70 /// @notice Pay tokens
71 address[] public payTokens;
72 /// @notice Status to buy bonus percent
73 /// @dev In PCT_DIV precision
74 uint256[4] public statusToBuyBonusPercent;
75 /// @notice Level to status to ref bonus percent
76 /// @dev In PCT_DIV precision
77 uint256[4][3] public levelToStatusToRefBonusPercent;
78 /// @notice Buy status to requirements
79 /// @dev In USD without decimals
80 uint256[4] public buyStatusToRequirements;
81 /// @notice Ref status to requirements
82 /// @dev In USD without decimals
83 uint256[4] public refStatusToRequirements;
84 /// @dev In PCT_DIV decimals
85 uint256 public marketTokenUsdPrice;
86 uint256 public dailyBuyLimit;
87 uint256 public dailyBuyCounter;
88 uint256 public lastCounterResetTime;
89 uint256 public sellLimit;
90
91 /// @dev Last verified nonce
92 uint256 public lastNonce;
93 address public operator;
94
95 mapping(address => BuyerInfo) public accountToBuyerInfo;
96 /// @dev Monitor nonces. Prevent replay attacks
97 mapping(uint256 => bool) public nonces;
98
99 /// EVENTS
100
101 event DailyBuyLimitSetted(uint256 newLimit);
102 event PricesUpdated(uint256[] newPrice, uint256[] newBuybackPrice, uint256 marketTokenUsdPrice);
103 event TokenPurchased(address indexed buyer, uint256 buyTokenAmount, uint256 buyBonus, uint256 payTokenAmount);
104 event TokenSold(address indexed seller, uint256 sellTokenAmount, uint256 payTokenAmount);
105 event SellLimitSetted(uint256 sellLimit);
106 event OperatorSetted(address operator);
107 event PayTokensUpdated(address[] payTokens);
108 event BuyBonusPercentsUpdated(uint256[4] bonusPercents);
109 event RefBonusPercentsUpdated(uint256[4][3] bonusPercents);
110 event BuyBonusRequirementsUpdated(uint256[4] bonusRequirements);
111 event RefBonusRequirementsUpdated(uint256[4] bonusRequirements);
112 event TokensWithdrawn(IERC20Metadata token, address to, uint256 amount);
113
114 constructor(
115 uint256 startTime_,
116 address[] memory payTokens_,
117 uint256[] memory prices_,
118 uint256[] memory buybackPrices_,
119 uint256 marketTokenUsdPrice_,
120 uint256 dailyBuyLimit_,
121 address marketToken_
122 )
123 AccessControlDefaultAdminRules(0, msg.sender)
124 EIP712("Collective Mind AI Sale", "1")
125 {
126 if (block.timestamp > startTime_) revert InvalidStartTime();
127 if (
128 payTokens_.length == 0 ||
129 payTokens_.length != prices_.length ||
130 payTokens_.length != buybackPrices_.length
131 ) revert InvalidArrayLength();
132 for (uint256 i = 0; i < payTokens_.length; i++) {
133 if (prices_[i] == 0) revert InvalidPrice();
134 if (buybackPrices_[i] == 0) revert InvalidPrice();
135 }
136 if (marketToken_ == address(0)) revert ZeroAddress();
137
138 startTime = startTime_;
139 lastCounterResetTime = startTime_;
140 payTokens = payTokens_;
141 prices = prices_;
142 buybackPrices = buybackPrices_;
143 marketTokenUsdPrice = marketTokenUsdPrice_;
144 dailyBuyLimit = dailyBuyLimit_;
145 marketToken = IERC20Metadata(marketToken_);
146
147 statusToBuyBonusPercent = [0, 50000, 100000, 150000];
148 levelToStatusToRefBonusPercent[0] = [0, 70000, 80000, 100000];
149 levelToStatusToRefBonusPercent[1] = [0, 30000, 40000, 50000];
150 levelToStatusToRefBonusPercent[2] = [0, 10000, 20000, 25000];
151
152 buyStatusToRequirements = [0, 1000, 5000, 10000];
153 refStatusToRequirements = [0, 0, 5000, 10000];
154 }
155
156 function buyExactMarketTokenForPayToken(
157 uint256 buyAmount,
158 uint256 payTokenIndex,
159 address referrer,
160 uint256 usdPrice,
161 uint256 deadline,
162 uint256 nonce,
163 bytes memory signature
164 ) external payable {
165 if (block.timestamp < startTime) revert SaleNotStarted();
166 if (block.timestamp > deadline) revert DeadlineExeeded();
167 if (payTokenIndex >= payTokens.length) revert InvalidIndex();
168 IERC20Metadata payToken = IERC20Metadata(payTokens[payTokenIndex]);
169 uint256 payTokenDecimals = 18;
170 if (address(payToken) != address(0)) {
171 payTokenDecimals = payToken.decimals();
172 }
173 if (buyAmount < 10**(marketToken.decimals() - payTokenDecimals)) revert InvalidBuyAmount();
174 uint256 payTokenAmount = prices[payTokenIndex] * buyAmount / 10**marketToken.decimals();
175
176 _executeTokenBuy(
177 msg.sender,
178 referrer,
179 buyAmount,
180 payTokenAmount,
181 payToken,
182 usdPrice,
183 deadline,
184 nonce,
185 signature
186 );
187 }
188
189 function buyMarketTokenForExactPayToken(
190 uint256 payAmount,
191 uint256 payTokenIndex,
192 address referrer,
193 uint256 usdPrice,
194 uint256 deadline,
195 uint256 nonce,
196 bytes memory signature
197 ) external payable {
198 if (block.timestamp < startTime) revert SaleNotStarted();
199 if (block.timestamp > deadline) revert DeadlineExeeded();
200 if (payTokenIndex >= payTokens.length) revert InvalidIndex();
201 uint256 price = prices[payTokenIndex];
202 if (payAmount < price) revert InvalidPayAmount();
203 IERC20Metadata payToken = IERC20Metadata(payTokens[payTokenIndex]);
204 uint256 buyTokenAmount = payAmount * 10**marketToken.decimals() / price;
205
206 _executeTokenBuy(
207 msg.sender,
208 referrer,
209 buyTokenAmount,
210 payAmount,
211 payToken,
212 usdPrice,
213 deadline,
214 nonce,
215 signature
216 );
217 }
218
219 function sellExactMarketTokenForPayToken(uint256 sellAmount, uint256 payTokenIndex) external {
220 if (block.timestamp < startTime) revert SaleNotStarted();
221 if (payTokenIndex >= payTokens.length) revert InvalidIndex();
222 IERC20Metadata payToken = IERC20Metadata(payTokens[payTokenIndex]);
223 uint256 payTokenDecimals = 18;
224 if (address(payToken) != address(0)) {
225 payTokenDecimals = payToken.decimals();
226 }
227 if (sellAmount < 10**(marketToken.decimals() - payTokenDecimals)) revert InvalidSellAmount();
228 uint256 buybackPrice = buybackPrices[payTokenIndex];
229 uint256 payTokenAmount = buybackPrice * sellAmount / 10**marketToken.decimals();
230
231 _executeTokenSell(msg.sender, sellAmount, payTokenAmount, payToken);
232 }
233
234 function sellMarketTokenForExactPayToken(uint256 payAmount, uint256 payTokenIndex) external {
235 if (block.timestamp < startTime) revert SaleNotStarted();
236 if (payTokenIndex >= payTokens.length) revert InvalidIndex();
237 uint256 buybackPrice = buybackPrices[payTokenIndex];
238 if (payAmount < buybackPrice) revert InvalidPayAmount();
239 IERC20Metadata payToken = IERC20Metadata(payTokens[payTokenIndex]);
240 uint256 sellTokenAmount = payAmount * 10**marketToken.decimals() / buybackPrice;
241
242 _executeTokenSell(msg.sender, sellTokenAmount, payAmount, payToken);
243 }
244
245 function setDailyBuyLimit(uint256 buyLimit) external onlyRole(DEFAULT_ADMIN_ROLE) {
246 dailyBuyLimit = buyLimit;
247
248 emit DailyBuyLimitSetted(buyLimit);
249 }
250
251 function setSellLimit(uint256 sellLimit_) external onlyRole(DEFAULT_ADMIN_ROLE) {
252 sellLimit = sellLimit_;
253
254 emit SellLimitSetted(sellLimit_);
255 }
256
257 function setOperator(address operator_) external onlyRole(DEFAULT_ADMIN_ROLE) {
258 if (operator_ == address(0)) revert ZeroAddress();
259 if (operator != address(0)) {
260 _revokeRole(OPERATOR_ROLE, operator);
exec
/bin/bash -lc "nl -ba contracts/Sale.sol | sed -n '261,520p'" in /tmp/codex-stz9p30g
succeeded in 0ms:
261 }
262 _grantRole(OPERATOR_ROLE, operator_);
263 operator = operator_;
264
265 emit OperatorSetted(operator_);
266 }
267
268 function withdrawTokens(
269 IERC20Metadata token,
270 address to,
271 uint256 amount
272 ) external onlyRole(DEFAULT_ADMIN_ROLE) {
273 if(address(token) == address(0)) {
274 (bool success, ) = to.call{value: amount}("");
275 if (!success) revert ETH_TRANSFER_FAILED();
276 } else {
277 token.safeTransfer(to, amount);
278 }
279
280 emit TokensWithdrawn(token, to, amount);
281 }
282
283 function setPayTokens(
284 address[] calldata payTokens_,
285 uint256[] calldata prices_,
286 uint256[] calldata buybackPrices_,
287 uint256 marketTokenUsdPrice_
288 ) external onlyRole(DEFAULT_ADMIN_ROLE) {
289 if (
290 payTokens_.length == 0 ||
291 payTokens_.length != prices_.length ||
292 payTokens_.length != buybackPrices_.length
293 ) revert InvalidArrayLength();
294
295 payTokens = payTokens_;
296 _setPrices(prices_, buybackPrices_, marketTokenUsdPrice_);
297
298 emit PayTokensUpdated(payTokens_);
299 }
300
301 function setPrices(uint256[] calldata prices_, uint256[] calldata buybackPrices_, uint256 marketTokenUsdPrice_) external onlyRole(OPERATOR_ROLE) {
302 _setPrices(prices_, buybackPrices_, marketTokenUsdPrice_);
303 }
304
305 function _setPrices(uint256[] calldata prices_, uint256[] calldata buybackPrices_, uint256 marketTokenUsdPrice_) internal {
306 if (payTokens.length != prices_.length || prices_.length != buybackPrices_.length) revert InvalidArrayLength();
307
308 prices = prices_;
309 buybackPrices = buybackPrices_;
310 marketTokenUsdPrice = marketTokenUsdPrice_;
311
312 emit PricesUpdated(prices_, buybackPrices_, marketTokenUsdPrice_);
313 }
314
315 function setBuyBonusPercents(uint256[4] calldata bonusPercents) external onlyRole(DEFAULT_ADMIN_ROLE) {
316 for (uint i = 0; i < bonusPercents.length; i++) {
317 if (bonusPercents[i] > PCT_DIV) revert InvalidPercent();
318 }
319
320 statusToBuyBonusPercent = bonusPercents;
321
322 emit BuyBonusPercentsUpdated(bonusPercents);
323 }
324
325 function setBuyBonusRequirements(uint256[4] calldata bonusRequirements) external onlyRole(DEFAULT_ADMIN_ROLE) {
326 buyStatusToRequirements = bonusRequirements;
327
328 emit BuyBonusRequirementsUpdated(bonusRequirements);
329 }
330
331 function setRefBonusPercents(uint256[4][3] calldata bonusPercents) external onlyRole(DEFAULT_ADMIN_ROLE) {
332 for (uint i = 0; i < bonusPercents.length; i++) {
333 for (uint j = 0; j < bonusPercents[i].length; j++) {
334 if (bonusPercents[i][j] > PCT_DIV) revert InvalidPercent();
335 }
336 }
337
338 levelToStatusToRefBonusPercent = bonusPercents;
339
340 emit RefBonusPercentsUpdated(bonusPercents);
341 }
342
343 function setRefBonusRequirements(uint256[4] calldata bonusRequirements) external onlyRole(DEFAULT_ADMIN_ROLE) {
344 refStatusToRequirements = bonusRequirements;
345
346 emit RefBonusRequirementsUpdated(bonusRequirements);
347 }
348
349 function _executeTokenBuy(
350 address buyer,
351 address referrer,
352 uint256 buyTokenAmount,
353 uint256 payTokenAmount,
354 IERC20Metadata payToken,
355 uint256 usdPrice,
356 uint256 deadline,
357 uint256 nonce,
358 bytes memory signature
359 ) internal {
360 {
361 bytes32 typehash = getVerifyPriceTypeHash(buyer, address(payToken), usdPrice, deadline, nonce);
362 signatureVerification(typehash, nonce, signature);
363 }
364
365 _checkAndUpdateBuyCounter(buyTokenAmount);
366 uint256 buyBonus = _calcBuyBonus(buyer, buyTokenAmount);
367
368 if (address(payToken) == address(0)) {
369 if (msg.value < payTokenAmount) revert InvalidEtherAmount();
370 if (msg.value > payTokenAmount) {
371 (bool success, ) = buyer.call{value: msg.value - payTokenAmount}("");
372 if (!success) revert ETH_TRANSFER_FAILED();
373 }
374 } else {
375 if (msg.value != 0) revert InvalidEtherAmount();
376 payToken.safeTransferFrom(buyer, address(this), payTokenAmount);
377 }
378
379 marketToken.safeTransfer(buyer, buyTokenAmount + buyBonus);
380
381 _checkReferrerAndPayBonus(buyer, referrer, buyTokenAmount);
382 _checkAndUpdateBuyerStatuses(buyer, payTokenAmount, payToken, usdPrice);
383
384 emit TokenPurchased(buyer, buyTokenAmount, buyBonus, payTokenAmount);
385 }
386
387 function _executeTokenSell(
388 address seller,
389 uint256 sellTokenAmount,
390 uint256 payTokenAmount,
391 IERC20Metadata payToken
392 ) internal {
393 _checkAndUpdateSellCounter(seller, sellTokenAmount);
394
395 marketToken.safeTransferFrom(seller, address(this), sellTokenAmount);
396
397 if (address(payToken) == address(0)) {
398 (bool success, ) = seller.call{value: payTokenAmount}("");
399 if (!success) revert ETH_TRANSFER_FAILED();
400 } else {
401 payToken.safeTransfer(seller, payTokenAmount);
402 }
403
404 emit TokenSold(seller, sellTokenAmount, payTokenAmount);
405 }
406
407 function _checkAndUpdateBuyCounter(uint256 buyAmount) internal {
408 uint256 dailyCounter = dailyBuyCounter;
409 if ((block.timestamp - startTime) / ONE_DAY - (lastCounterResetTime - startTime) / ONE_DAY > 0) {
410 dailyCounter = 0;
411 lastCounterResetTime = block.timestamp;
412 }
413 dailyCounter += buyAmount;
414
415 if (dailyCounter > dailyBuyLimit) revert DailyBuyLimitExeeded();
416
417 dailyBuyCounter = dailyCounter;
418 }
419
420 function _checkAndUpdateSellCounter(address seller, uint256 sellAmount) internal {
421 if (accountToBuyerInfo[seller].sellAmount + sellAmount > sellLimit) revert SellLimitExeeded();
422
423 accountToBuyerInfo[seller].sellAmount += sellAmount;
424 }
425
426 function _checkAndUpdateBuyerStatuses(address buyer, uint256 payAmount, IERC20Metadata payToken, uint256 usdPrice) internal {
427 uint256 payTokenDecimals = 18;
428 if (address(payToken) != address(0)) {
429 payTokenDecimals = payToken.decimals();
430 }
431 uint256 payAmountInUSD = payAmount * usdPrice / (10 ** payTokenDecimals);
432 accountToBuyerInfo[buyer].payAmountInUSD += payAmountInUSD;
433 BuyerInfo memory buyerInfo = accountToBuyerInfo[buyer];
434
435 if (buyerInfo.buyStatus != Status.Gold) {
436 if (buyerInfo.payAmountInUSD >= buyStatusToRequirements[uint256(Status.Gold)] * PCT_DIV) {
437 accountToBuyerInfo[buyer].buyStatus = Status.Gold;
438 } else if (buyerInfo.payAmountInUSD >= buyStatusToRequirements[uint256(Status.Silver)] * PCT_DIV) {
439 accountToBuyerInfo[buyer].buyStatus = Status.Silver;
440 } else if (buyerInfo.payAmountInUSD >= buyStatusToRequirements[uint256(Status.Bronze)] * PCT_DIV) {
441 accountToBuyerInfo[buyer].buyStatus = Status.Bronze;
442 }
443 }
444
445 _updateRefStatus(buyer, buyerInfo);
446 }
447
448 function _updateRefStatus(address buyer, BuyerInfo memory buyerInfo) internal {
449 if (buyerInfo.refStatus != Status.Gold) {
450 if (buyerInfo.payAmountInUSD >= refStatusToRequirements[uint256(Status.Gold)] * PCT_DIV) {
451 accountToBuyerInfo[buyer].refStatus = Status.Gold;
452 } else if (buyerInfo.payAmountInUSD >= refStatusToRequirements[uint256(Status.Silver)] * PCT_DIV) {
453 accountToBuyerInfo[buyer].refStatus = Status.Silver;
454 } else if (buyerInfo.payAmountInUSD >= refStatusToRequirements[uint256(Status.Bronze)] * PCT_DIV) {
455 accountToBuyerInfo[buyer].refStatus = Status.Bronze;
456 }
457 }
458 }
459
460 function _calcBuyBonus(address buyer, uint256 buyAmount) internal view returns(uint256 buyBonus) {
461 Status buyerBuyStatus = accountToBuyerInfo[buyer].buyStatus;
462
463 buyBonus = buyAmount * statusToBuyBonusPercent[uint256(buyerBuyStatus)] / PCT_DIV;
464 }
465
466 function _checkReferrerAndPayBonus(address buyer, address referrer, uint256 buyAmount) internal {
467 BuyerInfo memory buyerInfo = accountToBuyerInfo[buyer];
468 if (buyerInfo.payAmountInUSD == 0 && referrer != address(0)) {
469 _updateRefStatus(referrer, accountToBuyerInfo[referrer]);
470 accountToBuyerInfo[buyer].referrer = referrer;
471 buyerInfo.referrer = referrer;
472 }
473 for (uint256 i = 0; i < levelToStatusToRefBonusPercent.length; i++) {
474 if (buyerInfo.referrer == address(0)) break;
475
476 address referrerAddress = buyerInfo.referrer;
477 buyerInfo = accountToBuyerInfo[buyerInfo.referrer];
478 uint256 refBonus = buyAmount * levelToStatusToRefBonusPercent[i][uint256(buyerInfo.refStatus)] / PCT_DIV;
479 marketToken.safeTransfer(referrerAddress, refBonus);
480 }
481 }
482
483 ///------------------ EIP712 ------------------///
484
485 /// @dev Verifies that chain signature is valid
486 /// @param typeHash abi encoded type hash digest
487 /// @param nonce Prevent replay attacks
488 /// @param signature Signature bytes
489 function signatureVerification(
490 bytes32 typeHash,
491 uint256 nonce,
492 bytes memory signature
493 ) internal {
494 if (nonces[nonce]) revert RequestAlreadyProcessed(nonce);
495
496 bytes32 permitDigest = _hashTypedDataV4(typeHash);
497 // Recover the signer of the PERMIT_DIGEST
498 address signer = ECDSA.recover(permitDigest, signature);
499 // Compare the recover and the required signer
500 if (signer != operator) revert InvalidSignature();
501
502 nonces[nonce] = true;
503 lastNonce = nonce;
504 }
505
506 function getVerifyPriceTypeHash(
507 address account,
508 address payToken,
509 uint256 usdPrice,
510 uint256 deadline,
511 uint256 nonce
512 ) internal pure returns(bytes32) {
513 return keccak256(
514 abi.encode(
515 VERIFY_PRICE_TYPEHASH,
516 account,
517 payToken,
518 usdPrice,
519 deadline,
520 nonce
exec
/bin/bash -lc "nl -ba contracts/Sale.sol | sed -n '520,540p'" in /tmp/codex-stz9p30g
succeeded in 0ms:
520 nonce
521 )
522 );
523 }
524 }
Read the full audit bundle and analyzed the only first-party contract in scope. Two user-exploitable issues were identified in referral handling and exact-amount purchase rounding.
✓ Read AUDIT_BUNDLE.txt completely and identify first-party Solidity files in scope
✓ Analyze first-party contracts for exploitable issues in the requested categories
→ Produce JSON report with findings and concrete evidence/locations
codex
{"no_findings":false,"summary":"Sale.sol has two user-exploitable issues: referral logic allows self/cyclic bonus farming, and exact-amount purchases can round payment down to zero for low-priced payment tokens.","findings":[{"severity":"high","category":"other","title":"Referrer field is never validated, enabling self-referral and cyclic referral farming","exploit_scenario":"A buyer can set `referrer` to their own address on their first purchase. The contract stores that value without validation, then walks the referral chain for 3 levels and transfers referral bonuses each time. Because Bronze referral status is reachable at zero historical volume by default, the same buyer can immediately collect all 3 referral tiers on their own purchase. After reaching higher referral status, they can keep buying through the same self-reference and siphon 14% to 17.5% extra sale tokens per purchase. Two or more colluding accounts can also create short referral cycles and recycle the same bonus path.","recommendation":"Validate the supplied referrer before storing it or paying bonuses. At minimum, reject `referrer == buyer`, reject obvious cycles, and consider requiring the referrer to be a pre-existing eligible participant. Apply validation before `accountToBuyerInfo[buyer].referrer = referrer` and before traversing the referral chain.","evidence":"`InvalidReferrer` is declared but never used. On a first buy, `_checkReferrerAndPayBonus` stores any non-zero `referrer` directly, then pays 3 levels of bonuses by repeatedly following `buyerInfo.referrer`. With default `refStatusToRequirements = [0, 0, 5000, 10000]`, `_updateRefStatus` can mark a zero-volume address as Bronze before the payout loop runs.","locations":["contracts/Sale.sol:25","contracts/Sale.sol:152","contracts/Sale.sol:153","contracts/Sale.sol:466","contracts/Sale.sol:468","contracts/Sale.sol:469","contracts/Sale.sol:470","contracts/Sale.sol:473","contracts/Sale.sol:479"]},{"severity":"medium","category":"math","title":"Exact-output buys can mint market tokens for zero payment because rounding-down is unchecked","exploit_scenario":"For low-priced payment assets, a buyer can call `buyExactMarketTokenForPayToken` with a small but valid `buyAmount` such that `prices[payTokenIndex] * buyAmount / 10**marketToken.decimals()` rounds down to zero. `_executeTokenBuy` never rejects `payTokenAmount == 0`, so the buyer receives market tokens while paying neither ETH nor ERC20 tokens. Because the signature only covers `(account, payToken, usdPrice, deadline, nonce)` and not `buyAmount`, any valid signed quote for that pay token can be reused with one of these free-buy sizes.","recommendation":"After computing `payTokenAmount`, require it to be non-zero before proceeding, or round up instead of down for exact-output purchases. Also consider binding `buyAmount` or `payTokenAmount` into the signed payload if quote authorization is meant to cover the full trade terms.","evidence":"`buyExactMarketTokenForPayToken` only enforces a minimum `buyAmount` based on decimal difference, then computes `payTokenAmount` with integer division. `_executeTokenBuy` accepts that value as-is and only checks `msg.value < payTokenAmount` or performs `safeTransferFrom(..., payTokenAmount)`. If `payTokenAmount` is zero, both payment branches succeed while `marketToken.safeTransfer` still sends the purchased tokens.","locations":["contracts/Sale.sol:169","contracts/Sale.sol:173","contracts/Sale.sol:174","contracts/Sale.sol:349","contracts/Sale.sol:368","contracts/Sale.sol:375","contracts/Sale.sol:376","contracts/Sale.sol:379"]}]}
tokens used
43,067
{
"codex": {
"ran_at": "2026-04-04T03:17:29.951142+00:00",
"returncode": 0
},
"project": {
"mode": "source",
"file_count": 26,
"import_count": 30,
"first_party_contracts_count": 1
},
"summary": "Sale.sol has two user-exploitable issues: referral logic allows self/cyclic bonus farming, and exact-amount purchases can round payment down to zero for low-priced payment tokens.",
"raw_final": {
"summary": "Sale.sol has two user-exploitable issues: referral logic allows self/cyclic bonus farming, and exact-amount purchases can round payment down to zero for low-priced payment tokens.",
"findings": [
{
"title": "Referrer field is never validated, enabling self-referral and cyclic referral farming",
"category": "other",
"evidence": "`InvalidReferrer` is declared but never used. On a first buy, `_checkReferrerAndPayBonus` stores any non-zero `referrer` directly, then pays 3 levels of bonuses by repeatedly following `buyerInfo.referrer`. With default `refStatusToRequirements = [0, 0, 5000, 10000]`, `_updateRefStatus` can mark a zero-volume address as Bronze before the payout loop runs.",
"severity": "high",
"locations": [
"contracts/Sale.sol:25",
"contracts/Sale.sol:152",
"contracts/Sale.sol:153",
"contracts/Sale.sol:466",
"contracts/Sale.sol:468",
"contracts/Sale.sol:469",
"contracts/Sale.sol:470",
"contracts/Sale.sol:473",
"contracts/Sale.sol:479"
],
"recommendation": "Validate the supplied referrer before storing it or paying bonuses. At minimum, reject `referrer == buyer`, reject obvious cycles, and consider requiring the referrer to be a pre-existing eligible participant. Apply validation before `accountToBuyerInfo[buyer].referrer = referrer` and before traversing the referral chain.",
"exploit_scenario": "A buyer can set `referrer` to their own address on their first purchase. The contract stores that value without validation, then walks the referral chain for 3 levels and transfers referral bonuses each time. Because Bronze referral status is reachable at zero historical volume by default, the same buyer can immediately collect all 3 referral tiers on their own purchase. After reaching higher referral status, they can keep buying through the same self-reference and siphon 14% to 17.5% extra sale tokens per purchase. Two or more colluding accounts can also create short referral cycles and recycle the same bonus path."
},
{
"title": "Exact-output buys can mint market tokens for zero payment because rounding-down is unchecked",
"category": "math",
"evidence": "`buyExactMarketTokenForPayToken` only enforces a minimum `buyAmount` based on decimal difference, then computes `payTokenAmount` with integer division. `_executeTokenBuy` accepts that value as-is and only checks `msg.value < payTokenAmount` or performs `safeTransferFrom(..., payTokenAmount)`. If `payTokenAmount` is zero, both payment branches succeed while `marketToken.safeTransfer` still sends the purchased tokens.",
"severity": "medium",
"locations": [
"contracts/Sale.sol:169",
"contracts/Sale.sol:173",
"contracts/Sale.sol:174",
"contracts/Sale.sol:349",
"contracts/Sale.sol:368",
"contracts/Sale.sol:375",
"contracts/Sale.sol:376",
"contracts/Sale.sol:379"
],
"recommendation": "After computing `payTokenAmount`, require it to be non-zero before proceeding, or round up instead of down for exact-output purchases. Also consider binding `buyAmount` or `payTokenAmount` into the signed payload if quote authorization is meant to cover the full trade terms.",
"exploit_scenario": "For low-priced payment assets, a buyer can call `buyExactMarketTokenForPayToken` with a small but valid `buyAmount` such that `prices[payTokenIndex] * buyAmount / 10**marketToken.decimals()` rounds down to zero. `_executeTokenBuy` never rejects `payTokenAmount == 0`, so the buyer receives market tokens while paying neither ETH nor ERC20 tokens. Because the signature only covers `(account, payToken, usdPrice, deadline, nonce)` and not `buyAmount`, any valid signed quote for that pay token can be reused with one of these free-buy sizes."
}
],
"no_findings": false
},
"no_findings": false,
"schema_version": 1
}
00000000: PUSH1 0x80 00000002: PUSH1 0x40 00000004: MSTORE 00000005: PUSH1 0x04 00000007: CALLDATASIZE 00000008: LT 00000009: PUSH2 0x0350 0000000c: JUMPI 0000000d: PUSH1 0x00 0000000f: CALLDATALOAD 00000010: PUSH1 0xe0 00000012: SHR 00000013: DUP1 00000014: PUSH4 0x84ef8ffc 00000019: GT 0000001a: PUSH2 0x01c6 0000001d: JUMPI 0000001e: DUP1 0000001f: PUSH4 0xb3ab15fb 00000024: GT 00000025: PUSH2 0x00f7 00000028: JUMPI 00000029: DUP1 0000002a: PUSH4 0xd547741f 0000002f: GT 00000030: PUSH2 0x0095 00000033: JUMPI 00000034: DUP1 00000035: PUSH4 0xdc173042 0000003a: GT 0000003b: PUSH2 0x006f 0000003e: JUMPI 0000003f: DUP1 00000040: PUSH4 0xdc173042 00000045: EQ 00000046: PUSH2 0x0a29 00000049: JUMPI 0000004a: DUP1 0000004b: PUSH4 0xf5b541a6 00000050: EQ 00000051: PUSH2 0x0a49 00000054: JUMPI 00000055: DUP1 00000056: PUSH4 0xf9d9e31b 0000005b: EQ 0000005c: PUSH2 0x0a6b 0000005f: JUMPI 00000060: DUP1 00000061: PUSH4 0xfa5a89f1 00000066: EQ 00000067: PUSH2 0x0a8b 0000006a: JUMPI 0000006b: PUSH1 0x00 0000006d: DUP1 0000006e: REVERT 0000006f: JUMPDEST 00000070: DUP1 00000071: PUSH4 0xd547741f 00000076: EQ 00000077: PUSH2 0x09d4 0000007a: JUMPI 0000007b: DUP1 0000007c: PUSH4 0xd602b9fd 00000081: EQ 00000082: PUSH2 0x09f4 00000085: JUMPI 00000086: DUP1 00000087: PUSH4 0xda71c017 0000008c: EQ 0000008d: PUSH2 0x0a09 00000090: JUMPI 00000091: PUSH1 0x00 00000093: DUP1 00000094: REVERT 00000095: JUMPDEST 00000096: DUP1 00000097: PUSH4 0xc26e2c03 0000009c: GT 0000009d: PUSH2 0x00d1 000000a0: JUMPI 000000a1: DUP1 000000a2: PUSH4 0xc26e2c03 000000a7: EQ 000000a8: PUSH2 0x094f 000000ab: JUMPI 000000ac: DUP1 000000ad: PUSH4 0xcc8463c8 000000b2: EQ 000000b3: PUSH2 0x096f 000000b6: JUMPI 000000b7: DUP1 000000b8: PUSH4 0xcefc1429 000000bd: EQ 000000be: PUSH2 0x0984 000000c1: JUMPI 000000c2: DUP1 000000c3: PUSH4 0xcf6eefb7 000000c8: EQ 000000c9: PUSH2 0x0999 000000cc: JUMPI 000000cd: PUSH1 0x00 000000cf: DUP1 000000d0: REVERT 000000d1: JUMPDEST 000000d2: DUP1 000000d3: PUSH4 0xb3ab15fb 000000d8: EQ 000000d9: PUSH2 0x08f9 000000dc: JUMPI 000000dd: DUP1 000000de: PUSH4 0xb566f1f3 000000e3: EQ 000000e4: PUSH2 0x0919 000000e7: JUMPI 000000e8: DUP1 000000e9: PUSH4 0xbc31c1c1 000000ee: EQ 000000ef: PUSH2 0x092f 000000f2: JUMPI 000000f3: PUSH1 0x00 000000f5: DUP1 000000f6: REVERT 000000f7: JUMPDEST 000000f8: DUP1 000000f9: PUSH4 0x9d6e60e3 000000fe: GT 000000ff: PUSH2 0x0164 00000102: JUMPI 00000103: DUP1 00000104: PUSH4 0xa45d0cf8 00000109: GT 0000010a: PUSH2 0x013e 0000010d: JUMPI 0000010e: DUP1 0000010f: PUSH4 0xa45d0cf8 00000114: EQ 00000115: PUSH2 0x0865 00000118: JUMPI 00000119: DUP1 0000011a: PUSH4 0xa50cbdda 0000011f: EQ 00000120: PUSH2 0x0885 00000123: JUMPI 00000124: DUP1 00000125: PUSH4 0xa9bf2c09 0000012a: EQ 0000012b: PUSH2 0x08a5 0000012e: JUMPI 0000012f: DUP1 00000130: PUSH4 0xad48d611 00000135: EQ 00000136: PUSH2 0x08c5 00000139: JUMPI 0000013a: PUSH1 0x00 0000013c: DUP1 0000013d: REVERT 0000013e: JUMPDEST 0000013f: DUP1 00000140: PUSH4 0x9d6e60e3 00000145: EQ 00000146: PUSH2 0x07e8 00000149: JUMPI 0000014a: DUP1 0000014b: PUSH4 0xa1eda53c 00000150: EQ 00000151: PUSH2 0x081c 00000154: JUMPI 00000155: DUP1 00000156: PUSH4 0xa217fddf 0000015b: EQ 0000015c: PUSH2 0x0850 0000015f: JUMPI 00000160: PUSH1 0x00 00000162: DUP1 00000163: REVERT 00000164: JUMPDEST 00000165: DUP1 00000166: PUSH4 0x904a7ff2 0000016b: GT 0000016c: PUSH2 0x01a0 0000016f: JUMPI 00000170: DUP1 00000171: PUSH4 0x904a7ff2 00000176: EQ 00000177: PUSH2 0x0768 0000017a: JUMPI 0000017b: DUP1 0000017c: PUSH4 0x91d14854 00000181: EQ 00000182: PUSH2 0x0788 00000185: JUMPI 00000186: DUP1 00000187: PUSH4 0x91edee6b 0000018c: EQ 0000018d: PUSH2 0x07a8 00000190: JUMPI 00000191: DUP1 00000192: PUSH4 0x9d0c8cde 00000197: EQ 00000198: PUSH2 0x07c8 0000019b: JUMPI 0000019c: PUSH1 0x00 0000019e: DUP1 0000019f: REVERT 000001a0: JUMPDEST 000001a1: DUP1 000001a2: PUSH4 0x84ef8ffc 000001a7: EQ 000001a8: PUSH2 0x071e 000001ab: JUMPI 000001ac: DUP1 000001ad: PUSH4 0x863e76db 000001b2: EQ 000001b3: PUSH2 0x073c 000001b6: JUMPI 000001b7: DUP1 000001b8: PUSH4 0x8da5cb5b 000001bd: EQ 000001be: PUSH2 0x0753 000001c1: JUMPI 000001c2: PUSH1 0x00 000001c4: DUP1 000001c5: REVERT 000001c6: JUMPDEST 000001c7: DUP1 000001c8: PUSH4 0x570ca735 000001cd: GT 000001ce: PUSH2 0x02a0 000001d1: JUMPI 000001d2: DUP1 000001d3: PUSH4 0x634e93da 000001d8: GT 000001d9: PUSH2 0x023e 000001dc: JUMPI 000001dd: DUP1 000001de: PUSH4 0x6a8953ed 000001e3: GT 000001e4: PUSH2 0x0218 000001e7: JUMPI 000001e8: DUP1 000001e9: PUSH4 0x6a8953ed 000001ee: EQ 000001ef: PUSH2 0x0645 000001f2: JUMPI 000001f3: DUP1 000001f4: PUSH4 0x754ddfc2 000001f9: EQ 000001fa: PUSH2 0x065b 000001fd: JUMPI 000001fe: DUP1 000001ff: PUSH4 0x78e97925 00000204: EQ 00000205: PUSH2 0x06c2 00000208: JUMPI 00000209: DUP1 0000020a: PUSH4 0x84b0196e 0000020f: EQ 00000210: PUSH2 0x06f6 00000213: JUMPI 00000214: PUSH1 0x00 00000216: DUP1 00000217: REVERT 00000218: JUMPDEST 00000219: DUP1 0000021a: PUSH4 0x634e93da 0000021f: EQ 00000220: PUSH2 0x05e5 00000223: JUMPI 00000224: DUP1 00000225: PUSH4 0x649a5ec7 0000022a: EQ 0000022b: PUSH2 0x0605 0000022e: JUMPI 0000022f: DUP1 00000230: PUSH4 0x67727c9e 00000235: EQ 00000236: PUSH2 0x0625 00000239: JUMPI 0000023a: PUSH1 0x00 0000023c: DUP1 0000023d: REVERT 0000023e: JUMPDEST 0000023f: DUP1 00000240: PUSH4 0x5b32085a 00000245: GT 00000246: PUSH2 0x027a 00000249: JUMPI 0000024a: DUP1 0000024b: PUSH4 0x5b32085a 00000250: EQ 00000251: PUSH2 0x0585 00000254: JUMPI 00000255: DUP1 00000256: PUSH4 0x5d2fce6f 0000025b: EQ 0000025c: PUSH2 0x059c 0000025f: JUMPI 00000260: DUP1 00000261: PUSH4 0x5e35359e 00000266: EQ 00000267: PUSH2 0x05af 0000026a: JUMPI 0000026b: DUP1 0000026c: PUSH4 0x62850d75 00000271: EQ 00000272: PUSH2 0x05cf 00000275: JUMPI 00000276: PUSH1 0x00 00000278: DUP1 00000279: REVERT 0000027a: JUMPDEST 0000027b: DUP1 0000027c: PUSH4 0x570ca735 00000281: EQ 00000282: PUSH2 0x052f 00000285: JUMPI 00000286: DUP1 00000287: PUSH4 0x58dd1690 0000028c: EQ 0000028d: PUSH2 0x054f 00000290: JUMPI 00000291: DUP1 00000292: PUSH4 0x59bcd772 00000297: EQ 00000298: PUSH2 0x0565 0000029b: JUMPI 0000029c: PUSH1 0x00 0000029e: DUP1 0000029f: REVERT 000002a0: JUMPDEST 000002a1: DUP1 000002a2: PUSH4 0x141a468c 000002a7: GT 000002a8: PUSH2 0x030d 000002ab: JUMPI 000002ac: DUP1 000002ad: PUSH4 0x30471ec0 000002b2: GT 000002b3: PUSH2 0x02e7 000002b6: JUMPI 000002b7: DUP1 000002b8: PUSH4 0x30471ec0 000002bd: EQ 000002be: PUSH2 0x04c3 000002c1: JUMPI 000002c2: DUP1 000002c3: PUSH4 0x36568abe 000002c8: EQ 000002c9: PUSH2 0x04e3 000002cc: JUMPI 000002cd: DUP1 000002ce: PUSH4 0x4f91e48c 000002d3: EQ 000002d4: PUSH2 0x0503 000002d7: JUMPI 000002d8: DUP1 000002d9: PUSH4 0x52631ab4 000002de: EQ 000002df: PUSH2 0x0519 000002e2: JUMPI 000002e3: PUSH1 0x00 000002e5: DUP1 000002e6: REVERT 000002e7: JUMPDEST 000002e8: DUP1 000002e9: PUSH4 0x141a468c 000002ee: EQ 000002ef: PUSH2 0x0435 000002f2: JUMPI 000002f3: DUP1 000002f4: PUSH4 0x248a9ca3 000002f9: EQ 000002fa: PUSH2 0x0465 000002fd: JUMPI 000002fe: DUP1 000002ff: PUSH4 0x2f2ff15d 00000304: EQ 00000305: PUSH2 0x04a3 00000308: JUMPI 00000309: PUSH1 0x00 0000030b: DUP1 0000030c: REVERT 0000030d: JUMPDEST 0000030e: DUP1 0000030f: PUSH4 0x01ffc9a7 00000314: EQ 00000315: PUSH2 0x0355 00000318: JUMPI 00000319: DUP1 0000031a: PUSH4 0x022d63fb 0000031f: EQ 00000320: PUSH2 0x038a 00000323: JUMPI 00000324: DUP1 00000325: PUSH4 0x0535020d 0000032a: EQ 0000032b: PUSH2 0x03b3 0000032e: JUMPI 0000032f: DUP1 00000330: PUSH4 0x06465894 00000335: EQ 00000336: PUSH2 0x03eb 00000339: JUMPI 0000033a: DUP1 0000033b: PUSH4 0x0aa6220b 00000340: EQ 00000341: PUSH2 0x0400 00000344: JUMPI 00000345: DUP1 00000346: PUSH4 0x0f8caae0 0000034b: EQ 0000034c: PUSH2 0x0415 0000034f: JUMPI 00000350: JUMPDEST 00000351: PUSH1 0x00 00000353: DUP1 00000354: REVERT 00000355: JUMPDEST 00000356: CALLVALUE 00000357: DUP1 00000358: ISZERO 00000359: PUSH2 0x0361 0000035c: JUMPI 0000035d: PUSH1 0x00 0000035f: DUP1 00000360: REVERT 00000361: JUMPDEST 00000362: POP 00000363: PUSH2 0x0375 00000366: PUSH2 0x0370 00000369: CALLDATASIZE 0000036a: PUSH1 0x04 0000036c: PUSH2 0x35fa 0000036f: JUMP 00000370: JUMPDEST 00000371: PUSH2 0x0aab 00000374: JUMP 00000375: JUMPDEST 00000376: PUSH1 0x40 00000378: MLOAD 00000379: SWAP1 0000037a: ISZERO 0000037b: ISZERO 0000037c: DUP2 0000037d: MSTORE 0000037e: PUSH1 0x20 00000380: ADD 00000381: JUMPDEST 00000382: PUSH1 0x40 00000384: MLOAD 00000385: DUP1 00000386: SWAP2 00000387: SUB 00000388: SWAP1 00000389: RETURN 0000038a: JUMPDEST 0000038b: CALLVALUE 0000038c: DUP1 0000038d: ISZERO 0000038e: PUSH2 0x0396 00000391: JUMPI 00000392: PUSH1 0x00 00000394: DUP1 00000395: REVERT 00000396: JUMPDEST 00000397: POP 00000398: PUSH3 0x069780 0000039c: JUMPDEST 0000039d: PUSH1 0x40 0000039f: MLOAD 000003a0: PUSH6 0xffffffffffff 000003a7: SWAP1 000003a8: SWAP2 000003a9: AND 000003aa: DUP2 000003ab: MSTORE 000003ac: PUSH1 0x20 000003ae: ADD 000003af: PUSH2 0x0381 000003b2: JUMP 000003b3: JUMPDEST 000003b4: CALLVALUE 000003b5: DUP1 000003b6: ISZERO 000003b7: PUSH2 0x03bf 000003ba: JUMPI 000003bb: PUSH1 0x00 000003bd: DUP1 000003be: REVERT 000003bf: JUMPDEST 000003c0: POP 000003c1: PUSH2 0x03d3 000003c4: PUSH2 0x03ce 000003c7: CALLDATASIZE 000003c8: PUSH1 0x04 000003ca: PUSH2 0x3624 000003cd: JUMP 000003ce: JUMPDEST 000003cf: PUSH2 0x0ad6 000003d2: JUMP 000003d3: JUMPDEST 000003d4: PUSH1 0x40 000003d6: MLOAD 000003d7: PUSH1 0x01 000003d9: PUSH1 0x01 000003db: PUSH1 0xa0 000003dd: SHL 000003de: SUB 000003df: SWAP1 000003e0: SWAP2 000003e1: AND 000003e2: DUP2 000003e3: MSTORE 000003e4: PUSH1 0x20 000003e6: ADD 000003e7: PUSH2 0x0381 000003ea: JUMP 000003eb: JUMPDEST 000003ec: PUSH2 0x03fe 000003ef: PUSH2 0x03f9 000003f2: CALLDATASIZE 000003f3: PUSH1 0x04 000003f5: PUSH2 0x3668 000003f8: JUMP 000003f9: JUMPDEST 000003fa: PUSH2 0x0b00 000003fd: JUMP 000003fe: JUMPDEST 000003ff: STOP 00000400: JUMPDEST 00000401: CALLVALUE 00000402: DUP1 00000403: ISZERO 00000404: PUSH2 0x040c 00000407: JUMPI 00000408: PUSH1 0x00 0000040a: DUP1 0000040b: REVERT 0000040c: JUMPDEST 0000040d: POP 0000040e: PUSH2 0x03fe 00000411: PUSH2 0x0cbf 00000414: JUMP 00000415: JUMPDEST 00000416: CALLVALUE 00000417: DUP1 00000418: ISZERO 00000419: PUSH2 0x0421 0000041c: JUMPI 0000041d: PUSH1 0x00 0000041f: DUP1 00000420: REVERT 00000421: JUMPDEST 00000422: POP 00000423: PUSH2 0x03fe 00000426: PUSH2 0x0430 00000429: CALLDATASIZE 0000042a: PUSH1 0x04 0000042c: PUSH2 0x3624 0000042f: JUMP 00000430: JUMPDEST 00000431: PUSH2 0x0cd5 00000434: JUMP 00000435: JUMPDEST 00000436: CALLVALUE 00000437: DUP1 00000438: ISZERO 00000439: PUSH2 0x0441 0000043c: JUMPI 0000043d: PUSH1 0x00 0000043f: DUP1 00000440: REVERT 00000441: JUMPDEST 00000442: POP 00000443: PUSH2 0x0375 00000446: PUSH2 0x0450 00000449: CALLDATASIZE 0000044a: PUSH1 0x04 0000044c: PUSH2 0x3624 0000044f: JUMP 00000450: JUMPDEST 00000451: PUSH1 0x28 00000453: PUSH1 0x20 00000455: MSTORE 00000456: PUSH1 0x00 00000458: SWAP1 00000459: DUP2 0000045a: MSTORE 0000045b: PUSH1 0x40 0000045d: SWAP1 0000045e: KECCAK256 0000045f: SLOAD 00000460: PUSH1 0xff 00000462: AND 00000463: DUP2 00000464: JUMP 00000465: JUMPDEST 00000466: CALLVALUE 00000467: DUP1 00000468: ISZERO 00000469: PUSH2 0x0471 0000046c: JUMPI 0000046d: PUSH1 0x00 0000046f: DUP1 00000470: REVERT 00000471: JUMPDEST 00000472: POP 00000473: PUSH2 0x0495 00000476: PUSH2 0x0480 00000479: CALLDATASIZE 0000047a: PUSH1 0x04 0000047c: PUSH2 0x3624 0000047f: JUMP 00000480: JUMPDEST 00000481: PUSH1 0x00 00000483: SWAP1 00000484: DUP2 00000485: MSTORE 00000486: PUSH1 0x20 00000488: DUP2 00000489: SWAP1 0000048a: MSTORE 0000048b: PUSH1 0x40 0000048d: SWAP1 0000048e: KECCAK256 0000048f: PUSH1 0x01 00000491: ADD 00000492: SLOAD 00000493: SWAP1 00000494: JUMP 00000495: JUMPDEST 00000496: PUSH1 0x40 00000498: MLOAD 00000499: SWAP1 0000049a: DUP2 0000049b: MSTORE 0000049c: PUSH1 0x20 0000049e: ADD 0000049f: PUSH2 0x0381 000004a2: JUMP 000004a3: JUMPDEST 000004a4: CALLVALUE 000004a5: DUP1 000004a6: ISZERO 000004a7: PUSH2 0x04af 000004aa: JUMPI 000004ab: PUSH1 0x00 000004ad: DUP1 000004ae: REVERT 000004af: JUMPDEST 000004b0: POP 000004b1: PUSH2 0x03fe 000004b4: PUSH2 0x04be 000004b7: CALLDATASIZE 000004b8: PUSH1 0x04 000004ba: PUSH2 0x3764 000004bd: JUMP 000004be: JUMPDEST 000004bf: PUSH2 0x0d1d 000004c2: JUMP 000004c3: JUMPDEST 000004c4: CALLVALUE 000004c5: DUP1 000004c6: ISZERO 000004c7: PUSH2 0x04cf 000004ca: JUMPI 000004cb: PUSH1 0x00 000004cd: DUP1 000004ce: REVERT 000004cf: JUMPDEST 000004d0: POP 000004d1: PUSH2 0x0495 000004d4: PUSH2 0x04de 000004d7: CALLDATASIZE 000004d8: PUSH1 0x04 000004da: PUSH2 0x3624 000004dd: JUMP 000004de: JUMPDEST 000004df: PUSH2 0x0d49 000004e2: JUMP 000004e3: JUMPDEST 000004e4: CALLVALUE 000004e5: DUP1 000004e6: ISZERO 000004e7: PUSH2 0x04ef 000004ea: JUMPI 000004eb: PUSH1 0x00 000004ed: DUP1 000004ee: REVERT 000004ef: JUMPDEST 000004f0: POP 000004f1: PUSH2 0x03fe 000004f4: PUSH2 0x04fe 000004f7: CALLDATASIZE 000004f8: PUSH1 0x04 000004fa: PUSH2 0x3764 000004fd: JUMP 000004fe: JUMPDEST 000004ff: PUSH2 0x0d60 00000502: JUMP 00000503: JUMPDEST 00000504: CALLVALUE 00000505: DUP1 00000506: ISZERO 00000507: PUSH2 0x050f 0000050a: JUMPI 0000050b: PUSH1 0x00 0000050d: DUP1 0000050e: REVERT 0000050f: JUMPDEST 00000510: POP 00000511: PUSH2 0x0495 00000514: PUSH1 0x24 00000516: SLOAD 00000517: DUP2 00000518: JUMP 00000519: JUMPDEST 0000051a: CALLVALUE 0000051b: DUP1 0000051c: ISZERO 0000051d: PUSH2 0x0525 00000520: JUMPI 00000521: PUSH1 0x00 00000523: DUP1 00000524: REVERT 00000525: JUMPDEST 00000526: POP 00000527: PUSH2 0x0495 0000052a: PUSH1 0x25 0000052c: SLOAD 0000052d: DUP2 0000052e: JUMP 0000052f: JUMPDEST 00000530: CALLVALUE 00000531: DUP1 00000532: ISZERO 00000533: PUSH2 0x053b 00000536: JUMPI 00000537: PUSH1 0x00 00000539: DUP1 0000053a: REVERT 0000053b: JUMPDEST 0000053c: POP 0000053d: PUSH1 0x26 0000053f: SLOAD 00000540: PUSH2 0x03d3 00000543: SWAP1 00000544: PUSH1 0x01 00000546: PUSH1 0x01 00000548: PUSH1 0xa0 0000054a: SHL 0000054b: SUB 0000054c: AND 0000054d: DUP2 0000054e: JUMP 0000054f: JUMPDEST 00000550: CALLVALUE 00000551: DUP1 00000552: ISZERO 00000553: PUSH2 0x055b 00000556: JUMPI 00000557: PUSH1 0x00 00000559: DUP1 0000055a: REVERT 0000055b: JUMPDEST 0000055c: POP 0000055d: PUSH2 0x0495 00000560: PUSH1 0x23 00000562: SLOAD 00000563: DUP2 00000564: JUMP 00000565: JUMPDEST 00000566: CALLVALUE 00000567: DUP1 00000568: ISZERO 00000569: PUSH2 0x0571 0000056c: JUMPI 0000056d: PUSH1 0x00 0000056f: DUP1 00000570: REVERT 00000571: JUMPDEST 00000572: POP 00000573: PUSH2 0x03fe 00000576: PUSH2 0x0580 00000579: CALLDATASIZE 0000057a: PUSH1 0x04 0000057c: PUSH2 0x3794 0000057f: JUMP 00000580: JUMPDEST 00000581: PUSH2 0x0e0c 00000584: JUMP 00000585: JUMPDEST 00000586: CALLVALUE 00000587: DUP1 00000588: ISZERO 00000589: PUSH2 0x0591 0000058c: JUMPI 0000058d: PUSH1 0x00 0000058f: DUP1 00000590: REVERT 00000591: JUMPDEST 00000592: POP 00000593: PUSH2 0x0495 00000596: PUSH3 0x0f4240 0000059a: DUP2 0000059b: JUMP 0000059c: JUMPDEST 0000059d: PUSH2 0x03fe 000005a0: PUSH2 0x05aa 000005a3: CALLDATASIZE 000005a4: PUSH1 0x04 000005a6: PUSH2 0x3668 000005a9: JUMP 000005aa: JUMPDEST 000005ab: PUSH2 0x0ee1 000005ae: JUMP 000005af: JUMPDEST 000005b0: CALLVALUE 000005b1: DUP1 000005b2: ISZERO 000005b3: PUSH2 0x05bb 000005b6: JUMPI 000005b7: PUSH1 0x00 000005b9: DUP1 000005ba: REVERT 000005bb: JUMPDEST 000005bc: POP 000005bd: PUSH2 0x03fe 000005c0: PUSH2 0x05ca 000005c3: CALLDATASIZE 000005c4: PUSH1 0x04 000005c6: PUSH2 0x37be 000005c9: JUMP 000005ca: JUMPDEST 000005cb: PUSH2 0x1191 000005ce: JUMP 000005cf: JUMPDEST 000005d0: CALLVALUE 000005d1: DUP1 000005d2: ISZERO 000005d3: PUSH2 0x05db 000005d6: JUMPI 000005d7: PUSH1 0x00 000005d9: DUP1 000005da: REVERT 000005db: JUMPDEST 000005dc: POP 000005dd: PUSH2 0x0495 000005e0: PUSH1 0x21 000005e2: SLOAD 000005e3: DUP2 000005e4: JUMP 000005e5: JUMPDEST 000005e6: CALLVALUE 000005e7: DUP1 000005e8: ISZERO 000005e9: PUSH2 0x05f1 000005ec: JUMPI 000005ed: PUSH1 0x00 000005ef: DUP1 000005f0: REVERT 000005f1: JUMPDEST 000005f2: POP 000005f3: PUSH2 0x03fe 000005f6: PUSH2 0x0600 000005f9: CALLDATASIZE 000005fa: PUSH1 0x04 000005fc: PUSH2 0x37ff 000005ff: JUMP 00000600: JUMPDEST 00000601: PUSH2 0x1289 00000604: JUMP 00000605: JUMPDEST 00000606: CALLVALUE 00000607: DUP1 00000608: ISZERO 00000609: PUSH2 0x0611 0000060c: JUMPI 0000060d: PUSH1 0x00 0000060f: DUP1 00000610: REVERT 00000611: JUMPDEST 00000612: POP 00000613: PUSH2 0x03fe 00000616: PUSH2 0x0620 00000619: CALLDATASIZE 0000061a: PUSH1 0x04 0000061c: PUSH2 0x381c 0000061f: JUMP 00000620: JUMPDEST 00000621: PUSH2 0x129d 00000624: JUMP 00000625: JUMPDEST 00000626: CALLVALUE 00000627: DUP1 00000628: ISZERO 00000629: PUSH2 0x0631 0000062c: JUMPI 0000062d: PUSH1 0x00 0000062f: DUP1 00000630: REVERT 00000631: JUMPDEST 00000632: POP 00000633: PUSH2 0x0495 00000636: PUSH2 0x0640 00000639: CALLDATASIZE 0000063a: PUSH1 0x04 0000063c: PUSH2 0x3844 0000063f: JUMP 00000640: JUMPDEST 00000641: PUSH2 0x12b1 00000644: JUMP 00000645: JUMPDEST 00000646: CALLVALUE 00000647: DUP1 00000648: ISZERO 00000649: PUSH2 0x0651 0000064c: JUMPI 0000064d: PUSH1 0x00 0000064f: DUP1 00000650: REVERT 00000651: JUMPDEST 00000652: POP 00000653: PUSH2 0x0495 00000656: PUSH1 0x20 00000658: SLOAD 00000659: DUP2 0000065a: JUMP 0000065b: JUMPDEST 0000065c: CALLVALUE 0000065d: DUP1 0000065e: ISZERO 0000065f: PUSH2 0x0667 00000662: JUMPI 00000663: PUSH1 0x00 00000665: DUP1 00000666: REVERT 00000667: JUMPDEST 00000668: POP 00000669: PUSH2 0x06b1 0000066c: PUSH2 0x0676 0000066f: CALLDATASIZE 00000670: PUSH1 0x04 00000672: PUSH2 0x37ff 00000675: JUMP 00000676: JUMPDEST 00000677: PUSH1 0x27 00000679: PUSH1 0x20 0000067b: MSTORE 0000067c: PUSH1 0x00 0000067e: SWAP1 0000067f: DUP2 00000680: MSTORE 00000681: PUSH1 0x40 00000683: SWAP1 00000684: KECCAK256 00000685: DUP1 00000686: SLOAD 00000687: PUSH1 0x01 00000689: DUP3 0000068a: ADD 0000068b: SLOAD 0000068c: PUSH1 0x02 0000068e: DUP4 0000068f: ADD 00000690: SLOAD 00000691: PUSH1 0x03 00000693: SWAP1 00000694: SWAP4 00000695: ADD 00000696: SLOAD 00000697: PUSH1 0xff 00000699: DUP1 0000069a: DUP5 0000069b: AND 0000069c: SWAP5 0000069d: PUSH2 0x0100 000006a0: SWAP1 000006a1: SWAP5 000006a2: DIV 000006a3: AND 000006a4: SWAP3 000006a5: SWAP1 000006a6: PUSH1 0x01 000006a8: PUSH1 0x01 000006aa: PUSH1 0xa0 000006ac: SHL 000006ad: SUB 000006ae: AND 000006af: DUP6 000006b0: JUMP 000006b1: JUMPDEST 000006b2: PUSH1 0x40 000006b4: MLOAD 000006b5: PUSH2 0x0381 000006b8: SWAP6 000006b9: SWAP5 000006ba: SWAP4 000006bb: SWAP3 000006bc: SWAP2 000006bd: SWAP1 000006be: PUSH2 0x389e 000006c1: JUMP 000006c2: JUMPDEST 000006c3: CALLVALUE 000006c4: DUP1 000006c5: ISZERO 000006c6: PUSH2 0x06ce 000006c9: JUMPI 000006ca: PUSH1 0x00 000006cc: DUP1 000006cd: REVERT 000006ce: JUMPDEST 000006cf: POP 000006d0: PUSH2 0x0495 000006d3: PUSH32 0x00000000000000000000000000000000000000000000000000000000686ff190 000006f4: DUP2 000006f5: JUMP 000006f6: JUMPDEST 000006f7: CALLVALUE 000006f8: DUP1 000006f9: ISZERO 000006fa: PUSH2 0x0702 000006fd: JUMPI 000006fe: PUSH1 0x00 00000700: DUP1 00000701: REVERT 00000702: JUMPDEST 00000703: POP 00000704: PUSH2 0x070b 00000707: PUSH2 0x12dc 0000070a: JUMP 0000070b: JUMPDEST 0000070c: PUSH1 0x40 0000070e: MLOAD 0000070f: PUSH2 0x0381 00000712: SWAP8 00000713: SWAP7 00000714: SWAP6 00000715: SWAP5 00000716: SWAP4 00000717: SWAP3 00000718: SWAP2 00000719: SWAP1 0000071a: PUSH2 0x3924 0000071d: JUMP 0000071e: JUMPDEST 0000071f: CALLVALUE 00000720: DUP1 00000721: ISZERO 00000722: PUSH2 0x072a 00000725: JUMPI 00000726: PUSH1 0x00 00000728: DUP1 00000729: REVERT 0000072a: JUMPDEST 0000072b: POP 0000072c: PUSH1 0x02 0000072e: SLOAD 0000072f: PUSH1 0x01 00000731: PUSH1 0x01 00000733: PUSH1 0xa0 00000735: SHL 00000736: SUB 00000737: AND 00000738: PUSH2 0x03d3 0000073b: JUMP 0000073c: JUMPDEST 0000073d: CALLVALUE 0000073e: DUP1 0000073f: ISZERO 00000740: PUSH2 0x0748 00000743: JUMPI 00000744: PUSH1 0x00 00000746: DUP1 00000747: REVERT 00000748: JUMPDEST 00000749: POP 0000074a: PUSH2 0x0495 0000074d: PUSH3 0x015180 00000751: DUP2 00000752: JUMP 00000753: JUMPDEST 00000754: CALLVALUE 00000755: DUP1 00000756: ISZERO 00000757: PUSH2 0x075f 0000075a: JUMPI 0000075b: PUSH1 0x00 0000075d: DUP1 0000075e: REVERT 0000075f: JUMPDEST 00000760: POP 00000761: PUSH2 0x03d3 00000764: PUSH2 0x1322 00000767: JUMP 00000768: JUMPDEST 00000769: CALLVALUE 0000076a: DUP1 0000076b: ISZERO 0000076c: PUSH2 0x0774 0000076f: JUMPI 00000770: PUSH1 0x00 00000772: DUP1 00000773: REVERT 00000774: JUMPDEST 00000775: POP 00000776: PUSH2 0x03fe 00000779: PUSH2 0x0783 0000077c: CALLDATASIZE 0000077d: PUSH1 0x04 0000077f: PUSH2 0x3844 00000782: JUMP 00000783: JUMPDEST 00000784: PUSH2 0x133b 00000787: JUMP 00000788: JUMPDEST 00000789: CALLVALUE 0000078a: DUP1 0000078b: ISZERO 0000078c: PUSH2 0x0794 0000078f: JUMPI 00000790: PUSH1 0x00 00000792: DUP1 00000793: REVERT 00000794: JUMPDEST 00000795: POP 00000796: PUSH2 0x0375 00000799: PUSH2 0x07a3 0000079c: CALLDATASIZE 0000079d: PUSH1 0x04 0000079f: PUSH2 0x3764 000007a2: JUMP 000007a3: JUMPDEST 000007a4: PUSH2 0x14cf 000007a7: JUMP 000007a8: JUMPDEST 000007a9: CALLVALUE 000007aa: DUP1 000007ab: ISZERO 000007ac: PUSH2 0x07b4 000007af: JUMPI 000007b0: PUSH1 0x00 000007b2: DUP1 000007b3: REVERT 000007b4: JUMPDEST 000007b5: POP 000007b6: PUSH2 0x03fe 000007b9: PUSH2 0x07c3 000007bc: CALLDATASIZE 000007bd: PUSH1 0x04 000007bf: PUSH2 0x39bc 000007c2: JUMP 000007c3: JUMPDEST 000007c4: PUSH2 0x14f8 000007c7: JUMP 000007c8: JUMPDEST 000007c9: CALLVALUE 000007ca: DUP1 000007cb: ISZERO 000007cc: PUSH2 0x07d4 000007cf: JUMPI 000007d0: PUSH1 0x00 000007d2: DUP1 000007d3: REVERT 000007d4: JUMPDEST 000007d5: POP 000007d6: PUSH2 0x03fe 000007d9: PUSH2 0x07e3 000007dc: CALLDATASIZE 000007dd: PUSH1 0x04 000007df: PUSH2 0x3a2a 000007e2: JUMP 000007e3: JUMPDEST 000007e4: PUSH2 0x1540 000007e7: JUMP 000007e8: JUMPDEST 000007e9: CALLVALUE 000007ea: DUP1 000007eb: ISZERO 000007ec: PUSH2 0x07f4 000007ef: JUMPI 000007f0: PUSH1 0x00 000007f2: DUP1 000007f3: REVERT 000007f4: JUMPDEST 000007f5: POP 000007f6: PUSH2 0x0495 000007f9: PUSH32 0x3ae15b903b0ac48ca42840358899ad2501724741924507a38b5e4f1c9ef1508c 0000081a: DUP2 0000081b: JUMP 0000081c: JUMPDEST 0000081d: CALLVALUE 0000081e: DUP1 0000081f: ISZERO 00000820: PUSH2 0x0828 00000823: JUMPI 00000824: PUSH1 0x00 00000826: DUP1 00000827: REVERT 00000828: JUMPDEST 00000829: POP 0000082a: PUSH2 0x0831 0000082d: PUSH2 0x156d 00000830: JUMP 00000831: JUMPDEST 00000832: PUSH1 0x40 00000834: DUP1 00000835: MLOAD 00000836: PUSH6 0xffffffffffff 0000083d: SWAP4 0000083e: DUP5 0000083f: AND 00000840: DUP2 00000841: MSTORE 00000842: SWAP3 00000843: SWAP1 00000844: SWAP2 00000845: AND 00000846: PUSH1 0x20 00000848: DUP4 00000849: ADD 0000084a: MSTORE 0000084b: ADD 0000084c: PUSH2 0x0381 0000084f: JUMP 00000850: JUMPDEST 00000851: CALLVALUE 00000852: DUP1 00000853: ISZERO 00000854: PUSH2 0x085c 00000857: JUMPI 00000858: PUSH1 0x00 0000085a: DUP1 0000085b: REVERT 0000085c: JUMPDEST 0000085d: POP 0000085e: PUSH2 0x0495 00000861: PUSH1 0x00 00000863: DUP2 00000864: JUMP 00000865: JUMPDEST 00000866: CALLVALUE 00000867: DUP1 00000868: ISZERO 00000869: PUSH2 0x0871 0000086c: JUMPI 0000086d: PUSH1 0x00 0000086f: DUP1 00000870: REVERT 00000871: JUMPDEST 00000872: POP 00000873: PUSH2 0x03fe 00000876: PUSH2 0x0880 00000879: CALLDATASIZE 0000087a: PUSH1 0x04 0000087c: PUSH2 0x3844 0000087f: JUMP 00000880: JUMPDEST 00000881: PUSH2 0x15c1 00000884: JUMP 00000885: JUMPDEST 00000886: CALLVALUE 00000887: DUP1 00000888: ISZERO 00000889: PUSH2 0x0891 0000088c: JUMPI 0000088d: PUSH1 0x00 0000088f: DUP1 00000890: REVERT 00000891: JUMPDEST 00000892: POP 00000893: PUSH2 0x03fe 00000896: PUSH2 0x08a0 00000899: CALLDATASIZE 0000089a: PUSH1 0x04 0000089c: PUSH2 0x3aa3 0000089f: JUMP 000008a0: JUMPDEST 000008a1: PUSH2 0x184e 000008a4: JUMP 000008a5: JUMPDEST 000008a6: CALLVALUE 000008a7: DUP1 000008a8: ISZERO 000008a9: PUSH2 0x08b1 000008ac: JUMPI 000008ad: PUSH1 0x00 000008af: DUP1 000008b0: REVERT 000008b1: JUMPDEST 000008b2: POP 000008b3: PUSH2 0x03fe 000008b6: PUSH2 0x08c0 000008b9: CALLDATASIZE 000008ba: PUSH1 0x04 000008bc: PUSH2 0x3624 000008bf: JUMP 000008c0: JUMPDEST 000008c1: PUSH2 0x18ec 000008c4: JUMP 000008c5: JUMPDEST 000008c6: CALLVALUE 000008c7: DUP1 000008c8: ISZERO 000008c9: PUSH2 0x08d1 000008cc: JUMPI 000008cd: PUSH1 0x00 000008cf: DUP1 000008d0: REVERT 000008d1: JUMPDEST 000008d2: POP 000008d3: PUSH2 0x03d3 000008d6: PUSH32 0x000000000000000000000000024475619e5d37cf7b5b445e943dbeb7edd2f408 000008f7: DUP2 000008f8: JUMP 000008f9: JUMPDEST 000008fa: CALLVALUE 000008fb: DUP1 000008fc: ISZERO 000008fd: PUSH2 0x0905 00000900: JUMPI 00000901: PUSH1 0x00 00000903: DUP1 00000904: REVERT 00000905: JUMPDEST 00000906: POP 00000907: PUSH2 0x03fe 0000090a: PUSH2 0x0914 0000090d: CALLDATASIZE 0000090e: PUSH1 0x04 00000910: PUSH2 0x37ff 00000913: JUMP 00000914: JUMPDEST 00000915: PUSH2 0x192c 00000918: JUMP 00000919: JUMPDEST 0000091a: CALLVALUE 0000091b: DUP1 0000091c: ISZERO 0000091d: PUSH2 0x0925 00000920: JUMPI 00000921: PUSH1 0x00 00000923: DUP1 00000924: REVERT 00000925: JUMPDEST 00000926: POP 00000927: PUSH2 0x0495 0000092a: PUSH1 0x22 0000092c: SLOAD 0000092d: DUP2 0000092e: JUMP 0000092f: JUMPDEST 00000930: CALLVALUE 00000931: DUP1 00000932: ISZERO 00000933: PUSH2 0x093b 00000936: JUMPI 00000937: PUSH1 0x00 00000939: DUP1 0000093a: REVERT 0000093b: JUMPDEST 0000093c: POP 0000093d: PUSH2 0x0495 00000940: PUSH2 0x094a 00000943: CALLDATASIZE 00000944: PUSH1 0x04 00000946: PUSH2 0x3624 00000949: JUMP 0000094a: JUMPDEST 0000094b: PUSH2 0x19fd 0000094e: JUMP 0000094f: JUMPDEST 00000950: CALLVALUE 00000951: DUP1 00000952: ISZERO 00000953: PUSH2 0x095b 00000956: JUMPI 00000957: PUSH1 0x00 00000959: DUP1 0000095a: REVERT 0000095b: JUMPDEST 0000095c: POP 0000095d: PUSH2 0x0495 00000960: PUSH2 0x096a 00000963: CALLDATASIZE 00000964: PUSH1 0x04 00000966: PUSH2 0x3624 00000969: JUMP 0000096a: JUMPDEST 0000096b: PUSH2 0x1a1e 0000096e: JUMP 0000096f: JUMPDEST 00000970: CALLVALUE 00000971: DUP1 00000972: ISZERO 00000973: PUSH2 0x097b 00000976: JUMPI 00000977: PUSH1 0x00 00000979: DUP1 0000097a: REVERT 0000097b: JUMPDEST 0000097c: POP 0000097d: PUSH2 0x039c 00000980: PUSH2 0x1a2e 00000983: JUMP 00000984: JUMPDEST 00000985: CALLVALUE 00000986: DUP1 00000987: ISZERO 00000988: PUSH2 0x0990 0000098b: JUMPI 0000098c: PUSH1 0x00 0000098e: DUP1 0000098f: REVERT 00000990: JUMPDEST 00000991: POP 00000992: PUSH2 0x03fe 00000995: PUSH2 0x1a8d 00000998: JUMP 00000999: JUMPDEST 0000099a: CALLVALUE 0000099b: DUP1 0000099c: ISZERO 0000099d: PUSH2 0x09a5 000009a0: JUMPI 000009a1: PUSH1 0x00 000009a3: DUP1 000009a4: REVERT 000009a5: JUMPDEST 000009a6: POP 000009a7: PUSH2 0x09ae 000009aa: PUSH2 0x1acd 000009ad: JUMP 000009ae: JUMPDEST 000009af: PUSH1 0x40 000009b1: DUP1 000009b2: MLOAD 000009b3: PUSH1 0x01 000009b5: PUSH1 0x01 000009b7: PUSH1 0xa0 000009b9: SHL 000009ba: SUB 000009bb: SWAP1 000009bc: SWAP4 000009bd: AND 000009be: DUP4 000009bf: MSTORE 000009c0: PUSH6 0xffffffffffff 000009c7: SWAP1 000009c8: SWAP2 000009c9: AND 000009ca: PUSH1 0x20 000009cc: DUP4 000009cd: ADD 000009ce: MSTORE 000009cf: ADD 000009d0: PUSH2 0x0381 000009d3: JUMP 000009d4: JUMPDEST 000009d5: CALLVALUE 000009d6: DUP1 000009d7: ISZERO 000009d8: PUSH2 0x09e0 000009db: JUMPI 000009dc: PUSH1 0x00 000009de: DUP1 000009df: REVERT 000009e0: JUMPDEST 000009e1: POP 000009e2: PUSH2 0x03fe 000009e5: PUSH2 0x09ef 000009e8: CALLDATASIZE 000009e9: PUSH1 0x04 000009eb: PUSH2 0x3764 000009ee: JUMP 000009ef: JUMPDEST 000009f0: PUSH2 0x1aee 000009f3: JUMP 000009f4: JUMPDEST 000009f5: CALLVALUE 000009f6: DUP1 000009f7: ISZERO 000009f8: PUSH2 0x0a00 000009fb: JUMPI 000009fc: PUSH1 0x00 000009fe: DUP1 000009ff: REVERT 00000a00: JUMPDEST 00000a01: POP 00000a02: PUSH2 0x03fe 00000a05: PUSH2 0x1b16 00000a08: JUMP 00000a09: JUMPDEST 00000a0a: CALLVALUE 00000a0b: DUP1 00000a0c: ISZERO 00000a0d: PUSH2 0x0a15 00000a10: JUMPI 00000a11: PUSH1 0x00 00000a13: DUP1 00000a14: REVERT 00000a15: JUMPDEST 00000a16: POP 00000a17: PUSH2 0x0495 00000a1a: PUSH2 0x0a24 00000a1d: CALLDATASIZE 00000a1e: PUSH1 0x04 00000a20: PUSH2 0x3624 00000a23: JUMP 00000a24: JUMPDEST 00000a25: PUSH2 0x1b29 00000a28: JUMP 00000a29: JUMPDEST 00000a2a: CALLVALUE 00000a2b: DUP1 00000a2c: ISZERO 00000a2d: PUSH2 0x0a35 00000a30: JUMPI 00000a31: PUSH1 0x00 00000a33: DUP1 00000a34: REVERT 00000a35: JUMPDEST 00000a36: POP 00000a37: PUSH2 0x0495 00000a3a: PUSH2 0x0a44 00000a3d: CALLDATASIZE 00000a3e: PUSH1 0x04 00000a40: PUSH2 0x3624 00000a43: JUMP 00000a44: JUMPDEST 00000a45: PUSH2 0x1b39 00000a48: JUMP 00000a49: JUMPDEST 00000a4a: CALLVALUE 00000a4b: DUP1 00000a4c: ISZERO 00000a4d: PUSH2 0x0a55 00000a50: JUMPI 00000a51: PUSH1 0x00 00000a53: DUP1 00000a54: REVERT 00000a55: JUMPDEST 00000a56: POP 00000a57: PUSH2 0x0495 00000a5a: PUSH1 0x00 00000a5c: DUP1 00000a5d: MLOAD 00000a5e: PUSH1 0x20 00000a60: PUSH2 0x3e6f 00000a63: DUP4 00000a64: CODECOPY 00000a65: DUP2 00000a66: MLOAD 00000a67: SWAP2 00000a68: MSTORE 00000a69: DUP2 00000a6a: JUMP 00000a6b: JUMPDEST 00000a6c: CALLVALUE 00000a6d: DUP1 00000a6e: ISZERO 00000a6f: PUSH2 0x0a77 00000a72: JUMPI 00000a73: PUSH1 0x00 00000a75: DUP1 00000a76: REVERT 00000a77: JUMPDEST 00000a78: POP 00000a79: PUSH2 0x03fe 00000a7c: PUSH2 0x0a86 00000a7f: CALLDATASIZE 00000a80: PUSH1 0x04 00000a82: PUSH2 0x39bc 00000a85: JUMP 00000a86: JUMPDEST 00000a87: PUSH2 0x1b49 00000a8a: JUMP 00000a8b: JUMPDEST 00000a8c: CALLVALUE 00000a8d: DUP1 00000a8e: ISZERO 00000a8f: PUSH2 0x0a97 00000a92: JUMPI 00000a93: PUSH1 0x00 00000a95: DUP1 00000a96: REVERT 00000a97: JUMPDEST 00000a98: POP 00000a99: PUSH2 0x03fe 00000a9c: PUSH2 0x0aa6 00000a9f: CALLDATASIZE 00000aa0: PUSH1 0x04 00000aa2: PUSH2 0x39bc 00000aa5: JUMP 00000aa6: JUMPDEST 00000aa7: PUSH2 0x1be0 00000aaa: JUMP 00000aab: JUMPDEST 00000aac: PUSH1 0x00 00000aae: PUSH1 0x01 00000ab0: PUSH1 0x01 00000ab2: PUSH1 0xe0 00000ab4: SHL 00000ab5: SUB 00000ab6: NOT 00000ab7: DUP3 00000ab8: AND 00000ab9: PUSH4 0x18a4c3c3 00000abe: PUSH1 0xe1 00000ac0: SHL 00000ac1: EQ 00000ac2: DUP1 00000ac3: PUSH2 0x0ad0 00000ac6: JUMPI 00000ac7: POP 00000ac8: PUSH2 0x0ad0 00000acb: DUP3 00000acc: PUSH2 0x1c28 00000acf: JUMP 00000ad0: JUMPDEST 00000ad1: SWAP3 00000ad2: SWAP2 00000ad3: POP 00000ad4: POP 00000ad5: JUMP 00000ad6: JUMPDEST 00000ad7: PUSH1 0x07 00000ad9: DUP2 00000ada: DUP2 00000adb: SLOAD 00000adc: DUP2 00000add: LT 00000ade: PUSH2 0x0ae6 00000ae1: JUMPI 00000ae2: PUSH1 0x00 00000ae4: DUP1 00000ae5: REVERT 00000ae6: JUMPDEST 00000ae7: PUSH1 0x00 00000ae9: SWAP2 00000aea: DUP3 00000aeb: MSTORE 00000aec: PUSH1 0x20 00000aee: SWAP1 00000aef: SWAP2 00000af0: KECCAK256 00000af1: ADD 00000af2: SLOAD 00000af3: PUSH1 0x01 00000af5: PUSH1 0x01 00000af7: PUSH1 0xa0 00000af9: SHL 00000afa: SUB 00000afb: AND 00000afc: SWAP1 00000afd: POP 00000afe: DUP2 00000aff: JUMP 00000b00: JUMPDEST 00000b01: PUSH32 0x00000000000000000000000000000000000000000000000000000000686ff190 00000b22: TIMESTAMP 00000b23: LT 00000b24: ISZERO 00000b25: PUSH2 0x0b41 00000b28: JUMPI 00000b29: PUSH1 0x40 00000b2b: MLOAD 00000b2c: PUSH4 0x16851a37 00000b31: PUSH1 0xe1 00000b33: SHL 00000b34: DUP2 00000b35: MSTORE 00000b36: PUSH1 0x04 00000b38: ADD 00000b39: PUSH1 0x40 00000b3b: MLOAD 00000b3c: DUP1 00000b3d: SWAP2 00000b3e: SUB 00000b3f: SWAP1 00000b40: REVERT 00000b41: JUMPDEST 00000b42: DUP3 00000b43: TIMESTAMP 00000b44: GT 00000b45: ISZERO 00000b46: PUSH2 0x0b62 00000b49: JUMPI 00000b4a: PUSH1 0x40 00000b4c: MLOAD 00000b4d: PUSH4 0x4171a5bf 00000b52: PUSH1 0xe0 00000b54: SHL 00000b55: DUP2 00000b56: MSTORE 00000b57: PUSH1 0x04 00000b59: ADD 00000b5a: PUSH1 0x40 00000b5c: MLOAD 00000b5d: DUP1 00000b5e: SWAP2 00000b5f: SUB 00000b60: SWAP1 00000b61: REVERT 00000b62: JUMPDEST 00000b63: PUSH1 0x07 00000b65: SLOAD 00000b66: DUP7 00000b67: LT 00000b68: PUSH2 0x0b84 00000b6b: JUMPI 00000b6c: PUSH1 0x40 00000b6e: MLOAD 00000b6f: PUSH4 0x63df8171 00000b74: PUSH1 0xe0 00000b76: SHL 00000b77: DUP2 00000b78: MSTORE 00000b79: PUSH1 0x04 00000b7b: ADD 00000b7c: PUSH1 0x40 00000b7e: MLOAD 00000b7f: DUP1 00000b80: SWAP2 00000b81: SUB 00000b82: SWAP1 00000b83: REVERT 00000b84: JUMPDEST 00000b85: PUSH1 0x00 00000b87: PUSH1 0x05 00000b89: DUP8 00000b8a: DUP2 00000b8b: SLOAD 00000b8c: DUP2 00000b8d: LT 00000b8e: PUSH2 0x0b99 00000b91: JUMPI 00000b92: PUSH2 0x0b99 00000b95: PUSH2 0x3b52 00000b98: JUMP 00000b99: JUMPDEST 00000b9a: SWAP1 00000b9b: PUSH1 0x00 00000b9d: MSTORE 00000b9e: PUSH1 0x20 00000ba0: PUSH1 0x00 00000ba2: KECCAK256 00000ba3: ADD 00000ba4: SLOAD 00000ba5: SWAP1 00000ba6: POP 00000ba7: DUP1 00000ba8: DUP9 00000ba9: LT 00000baa: ISZERO 00000bab: PUSH2 0x0bc7 00000bae: JUMPI 00000baf: PUSH1 0x40 00000bb1: MLOAD 00000bb2: PUSH4 0x3a4d1f31 00000bb7: PUSH1 0xe2 00000bb9: SHL 00000bba: DUP2 00000bbb: MSTORE 00000bbc: PUSH1 0x04 00000bbe: ADD 00000bbf: PUSH1 0x40 00000bc1: MLOAD 00000bc2: DUP1 00000bc3: SWAP2 00000bc4: SUB 00000bc5: SWAP1 00000bc6: REVERT 00000bc7: JUMPDEST 00000bc8: PUSH1 0x00 00000bca: PUSH1 0x07 00000bcc: DUP9 00000bcd: DUP2 00000bce: SLOAD 00000bcf: DUP2 00000bd0: LT 00000bd1: PUSH2 0x0bdc 00000bd4: JUMPI 00000bd5: PUSH2 0x0bdc 00000bd8: PUSH2 0x3b52 00000bdb: JUMP 00000bdc: JUMPDEST 00000bdd: SWAP1 00000bde: PUSH1 0x00 00000be0: MSTORE 00000be1: PUSH1 0x20 00000be3: PUSH1 0x00 00000be5: KECCAK256 00000be6: ADD 00000be7: PUSH1 0x00 00000be9: SWAP1 00000bea: SLOAD 00000beb: SWAP1 00000bec: PUSH2 0x0100 00000bef: EXP 00000bf0: SWAP1 00000bf1: DIV 00000bf2: PUSH1 0x01 00000bf4: PUSH1 0x01 00000bf6: PUSH1 0xa0 00000bf8: SHL 00000bf9: SUB 00000bfa: AND 00000bfb: SWAP1 00000bfc: POP 00000bfd: PUSH1 0x00 00000bff: DUP3 00000c00: PUSH32 0x000000000000000000000000024475619e5d37cf7b5b445e943dbeb7edd2f408 00000c21: PUSH1 0x01 00000c23: PUSH1 0x01 00000c25: PUSH1 0xa0 00000c27: SHL 00000c28: SUB 00000c29: AND 00000c2a: PUSH4 0x313ce567 00000c2f: PUSH1 0x40 00000c31: MLOAD 00000c32: DUP2 00000c33: PUSH4 0xffffffff 00000c38: AND 00000c39: PUSH1 0xe0 00000c3b: SHL 00000c3c: DUP2 00000c3d: MSTORE 00000c3e: PUSH1 0x04 00000c40: ADD 00000c41: PUSH1 0x20 00000c43: PUSH1 0x40 00000c45: MLOAD 00000c46: DUP1 00000c47: DUP4 00000c48: SUB 00000c49: DUP2 00000c4a: DUP7 00000c4b: GAS 00000c4c: STATICCALL 00000c4d: ISZERO 00000c4e: DUP1 00000c4f: ISZERO 00000c50: PUSH2 0x0c5d 00000c53: JUMPI 00000c54: RETURNDATASIZE 00000c55: PUSH1 0x00 00000c57: DUP1 00000c58: RETURNDATACOPY 00000c59: RETURNDATASIZE 00000c5a: PUSH1 0x00 00000c5c: REVERT 00000c5d: JUMPDEST 00000c5e: POP 00000c5f: POP 00000c60: POP 00000c61: POP 00000c62: PUSH1 0x40 00000c64: MLOAD 00000c65: RETURNDATASIZE 00000c66: PUSH1 0x1f 00000c68: NOT 00000c69: PUSH1 0x1f 00000c6b: DUP3 00000c6c: ADD 00000c6d: AND 00000c6e: DUP3 00000c6f: ADD 00000c70: DUP1 00000c71: PUSH1 0x40 00000c73: MSTORE 00000c74: POP 00000c75: DUP2 00000c76: ADD 00000c77: SWAP1 00000c78: PUSH2 0x0c81 00000c7b: SWAP2 00000c7c: SWAP1 00000c7d: PUSH2 0x3b68 00000c80: JUMP 00000c81: JUMPDEST 00000c82: PUSH2 0x0c8c 00000c85: SWAP1 00000c86: PUSH1 0x0a 00000c88: PUSH2 0x3c88 00000c8b: JUMP 00000c8c: JUMPDEST 00000c8d: PUSH2 0x0c96 00000c90: SWAP1 00000c91: DUP13 00000c92: PUSH2 0x3c97 00000c95: JUMP 00000c96: JUMPDEST 00000c97: PUSH2 0x0ca0 00000c9a: SWAP2 00000c9b: SWAP1 00000c9c: PUSH2 0x3cae 00000c9f: JUMP 00000ca0: JUMPDEST 00000ca1: SWAP1 00000ca2: POP 00000ca3: PUSH2 0x0cb3 00000ca6: CALLER 00000ca7: DUP10 00000ca8: DUP4 00000ca9: DUP14 00000caa: DUP7 00000cab: DUP13 00000cac: DUP13 00000cad: DUP13 00000cae: DUP13 00000caf: PUSH2 0x1c5d 00000cb2: JUMP 00000cb3: JUMPDEST 00000cb4: POP 00000cb5: POP 00000cb6: POP 00000cb7: POP 00000cb8: POP 00000cb9: POP 00000cba: POP 00000cbb: POP 00000cbc: POP 00000cbd: POP 00000cbe: JUMP 00000cbf: JUMPDEST 00000cc0: PUSH1 0x00 00000cc2: PUSH2 0x0cca 00000cc5: DUP2 00000cc6: PUSH2 0x1e8a 00000cc9: JUMP 00000cca: JUMPDEST 00000ccb: PUSH2 0x0cd2 00000cce: PUSH2 0x1e94 00000cd1: JUMP 00000cd2: JUMPDEST 00000cd3: POP 00000cd4: JUMP 00000cd5: JUMPDEST 00000cd6: PUSH1 0x00 00000cd8: PUSH2 0x0ce0 00000cdb: DUP2 00000cdc: PUSH2 0x1e8a 00000cdf: JUMP 00000ce0: JUMPDEST 00000ce1: PUSH1 0x21 00000ce3: DUP3 00000ce4: SWAP1 00000ce5: SSTORE 00000ce6: PUSH1 0x40 00000ce8: MLOAD 00000ce9: DUP3 00000cea: DUP2 00000ceb: MSTORE 00000cec: PUSH32 0xc336f0dd868975e73375136265847e85dffa2cbbfc9823b81c55d603b368847a 00000d0d: SWAP1 00000d0e: PUSH1 0x20 00000d10: ADD 00000d11: JUMPDEST 00000d12: PUSH1 0x40 00000d14: MLOAD 00000d15: DUP1 00000d16: SWAP2 00000d17: SUB 00000d18: SWAP1 00000d19: LOG1 00000d1a: POP 00000d1b: POP 00000d1c: JUMP 00000d1d: JUMPDEST 00000d1e: DUP2 00000d1f: PUSH2 0x0d3b 00000d22: JUMPI 00000d23: PUSH1 0x40 00000d25: MLOAD 00000d26: PUSH4 0x1fe1e13d 00000d2b: PUSH1 0xe1 00000d2d: SHL 00000d2e: DUP2 00000d2f: MSTORE 00000d30: PUSH1 0x04 00000d32: ADD 00000d33: PUSH1 0x40 00000d35: MLOAD 00000d36: DUP1 00000d37: SWAP2 00000d38: SUB 00000d39: SWAP1 00000d3a: REVERT 00000d3b: JUMPDEST 00000d3c: PUSH2 0x0d45 00000d3f: DUP3 00000d40: DUP3 00000d41: PUSH2 0x1ea1 00000d44: JUMP 00000d45: JUMPDEST 00000d46: POP 00000d47: POP 00000d48: JUMP 00000d49: JUMPDEST 00000d4a: PUSH1 0x1c 00000d4c: DUP2 00000d4d: PUSH1 0x04 00000d4f: DUP2 00000d50: LT 00000d51: PUSH2 0x0d59 00000d54: JUMPI 00000d55: PUSH1 0x00 00000d57: DUP1 00000d58: REVERT 00000d59: JUMPDEST 00000d5a: ADD 00000d5b: SLOAD 00000d5c: SWAP1 00000d5d: POP 00000d5e: DUP2 00000d5f: JUMP 00000d60: JUMPDEST 00000d61: DUP2 00000d62: ISZERO 00000d63: DUP1 00000d64: ISZERO 00000d65: PUSH2 0x0d7b 00000d68: JUMPI 00000d69: POP 00000d6a: PUSH1 0x02 00000d6c: SLOAD 00000d6d: PUSH1 0x01 00000d6f: PUSH1 0x01 00000d71: PUSH1 0xa0 00000d73: SHL 00000d74: SUB 00000d75: DUP3 00000d76: DUP2 00000d77: AND 00000d78: SWAP2 00000d79: AND 00000d7a: EQ 00000d7b: JUMPDEST 00000d7c: ISZERO 00000d7d: PUSH2 0x0e02 00000d80: JUMPI 00000d81: PUSH1 0x00 00000d83: DUP1 00000d84: PUSH2 0x0d8b 00000d87: PUSH2 0x1acd 00000d8a: JUMP 00000d8b: JUMPDEST 00000d8c: SWAP1 00000d8d: SWAP3 00000d8e: POP 00000d8f: SWAP1 00000d90: POP 00000d91: PUSH1 0x01 00000d93: PUSH1 0x01 00000d95: PUSH1 0xa0 00000d97: SHL 00000d98: SUB 00000d99: DUP3 00000d9a: AND 00000d9b: ISZERO 00000d9c: ISZERO 00000d9d: DUP1 00000d9e: PUSH2 0x0dad 00000da1: JUMPI 00000da2: POP 00000da3: PUSH6 0xffffffffffff 00000daa: DUP2 00000dab: AND 00000dac: ISZERO 00000dad: JUMPDEST 00000dae: DUP1 00000daf: PUSH2 0x0dc0 00000db2: JUMPI 00000db3: POP 00000db4: TIMESTAMP 00000db5: PUSH6 0xffffffffffff 00000dbc: DUP3 00000dbd: AND 00000dbe: LT 00000dbf: ISZERO 00000dc0: JUMPDEST 00000dc1: ISZERO 00000dc2: PUSH2 0x0ded 00000dc5: JUMPI 00000dc6: PUSH1 0x40 00000dc8: MLOAD 00000dc9: PUSH4 0x19ca5ebb 00000dce: PUSH1 0xe0 00000dd0: SHL 00000dd1: DUP2 00000dd2: MSTORE 00000dd3: PUSH6 0xffffffffffff 00000dda: DUP3 00000ddb: AND 00000ddc: PUSH1 0x04 00000dde: DUP3 00000ddf: ADD 00000de0: MSTORE 00000de1: PUSH1 0x24 00000de3: ADD 00000de4: JUMPDEST 00000de5: PUSH1 0x40 00000de7: MLOAD 00000de8: DUP1 00000de9: SWAP2 00000dea: SUB 00000deb: SWAP1 00000dec: REVERT 00000ded: JUMPDEST 00000dee: POP 00000def: POP 00000df0: PUSH1 0x01 00000df2: DUP1 00000df3: SLOAD 00000df4: PUSH6 0xffffffffffff 00000dfb: PUSH1 0xa0 00000dfd: SHL 00000dfe: NOT 00000dff: AND 00000e00: SWAP1 00000e01: SSTORE 00000e02: JUMPDEST 00000e03: PUSH2 0x0d45 00000e06: DUP3 00000e07: DUP3 00000e08: PUSH2 0x1ecc 00000e0b: JUMP 00000e0c: JUMPDEST 00000e0d: PUSH1 0x00 00000e0f: PUSH2 0x0e17 00000e12: DUP2 00000e13: PUSH2 0x1e8a 00000e16: JUMP 00000e17: JUMPDEST 00000e18: PUSH1 0x00 00000e1a: JUMPDEST 00000e1b: PUSH1 0x03 00000e1d: DUP2 00000e1e: LT 00000e1f: ISZERO 00000e20: PUSH2 0x0ea3 00000e23: JUMPI 00000e24: PUSH1 0x00 00000e26: JUMPDEST 00000e27: DUP4 00000e28: DUP3 00000e29: PUSH1 0x03 00000e2b: DUP2 00000e2c: LT 00000e2d: PUSH2 0x0e38 00000e30: JUMPI 00000e31: PUSH2 0x0e38 00000e34: PUSH2 0x3b52 00000e37: JUMP 00000e38: JUMPDEST 00000e39: POP 00000e3a: POP 00000e3b: PUSH1 0x04 00000e3d: DUP2 00000e3e: LT 00000e3f: ISZERO 00000e40: PUSH2 0x0e9a 00000e43: JUMPI 00000e44: PUSH3 0x0f4240 00000e48: DUP5 00000e49: DUP4 00000e4a: PUSH1 0x03 00000e4c: DUP2 00000e4d: LT 00000e4e: PUSH2 0x0e59 00000e51: JUMPI 00000e52: PUSH2 0x0e59 00000e55: PUSH2 0x3b52 00000e58: JUMP 00000e59: JUMPDEST 00000e5a: PUSH1 0x80 00000e5c: MUL 00000e5d: ADD 00000e5e: DUP3 00000e5f: PUSH1 0x04 00000e61: DUP2 00000e62: LT 00000e63: PUSH2 0x0e6e 00000e66: JUMPI 00000e67: PUSH2 0x0e6e 00000e6a: PUSH2 0x3b52 00000e6d: JUMP 00000e6e: JUMPDEST 00000e6f: PUSH1 0x20 00000e71: MUL 00000e72: ADD 00000e73: CALLDATALOAD 00000e74: GT 00000e75: ISZERO 00000e76: PUSH2 0x0e92 00000e79: JUMPI 00000e7a: PUSH1 0x40 00000e7c: MLOAD 00000e7d: PUSH4 0x5c974e3d 00000e82: PUSH1 0xe1 00000e84: SHL 00000e85: DUP2 00000e86: MSTORE 00000e87: PUSH1 0x04 00000e89: ADD 00000e8a: PUSH1 0x40 00000e8c: MLOAD 00000e8d: DUP1 00000e8e: SWAP2 00000e8f: SUB 00000e90: SWAP1 00000e91: REVERT 00000e92: JUMPDEST 00000e93: PUSH1 0x01 00000e95: ADD 00000e96: PUSH2 0x0e26 00000e99: JUMP 00000e9a: JUMPDEST 00000e9b: POP 00000e9c: PUSH1 0x01 00000e9e: ADD 00000e9f: PUSH2 0x0e1a 00000ea2: JUMP 00000ea3: JUMPDEST 00000ea4: POP 00000ea5: PUSH2 0x0eb1 00000ea8: PUSH1 0x0c 00000eaa: DUP4 00000eab: PUSH1 0x03 00000ead: PUSH2 0x34b2 00000eb0: JUMP 00000eb1: JUMPDEST 00000eb2: POP 00000eb3: PUSH32 0xa4bbfe7be6fa22e38e905e9631ab066c34ba5e6ebbac33eef843aef33aa1d8a4 00000ed4: DUP3 00000ed5: PUSH1 0x40 00000ed7: MLOAD 00000ed8: PUSH2 0x0d11 00000edb: SWAP2 00000edc: SWAP1 00000edd: PUSH2 0x3cd0 00000ee0: JUMP 00000ee1: JUMPDEST 00000ee2: PUSH32 0x00000000000000000000000000000000000000000000000000000000686ff190 00000f03: TIMESTAMP 00000f04: LT 00000f05: ISZERO 00000f06: PUSH2 0x0f22 00000f09: JUMPI 00000f0a: PUSH1 0x40 00000f0c: MLOAD 00000f0d: PUSH4 0x16851a37 00000f12: PUSH1 0xe1 00000f14: SHL 00000f15: DUP2 00000f16: MSTORE 00000f17: PUSH1 0x04 00000f19: ADD 00000f1a: PUSH1 0x40 00000f1c: MLOAD 00000f1d: DUP1 00000f1e: SWAP2 00000f1f: SUB 00000f20: SWAP1 00000f21: REVERT 00000f22: JUMPDEST 00000f23: DUP3 00000f24: TIMESTAMP 00000f25: GT 00000f26: ISZERO 00000f27: PUSH2 0x0f43 00000f2a: JUMPI 00000f2b: PUSH1 0x40 00000f2d: MLOAD 00000f2e: PUSH4 0x4171a5bf 00000f33: PUSH1 0xe0 00000f35: SHL 00000f36: DUP2 00000f37: MSTORE 00000f38: PUSH1 0x04 00000f3a: ADD 00000f3b: PUSH1 0x40 00000f3d: MLOAD 00000f3e: DUP1 00000f3f: SWAP2 00000f40: SUB 00000f41: SWAP1 00000f42: REVERT 00000f43: JUMPDEST 00000f44: PUSH1 0x07 00000f46: SLOAD 00000f47: DUP7 00000f48: LT 00000f49: PUSH2 0x0f65 00000f4c: JUMPI 00000f4d: PUSH1 0x40 00000f4f: MLOAD 00000f50: PUSH4 0x63df8171 00000f55: PUSH1 0xe0 00000f57: SHL 00000f58: DUP2 00000f59: MSTORE 00000f5a: PUSH1 0x04 00000f5c: ADD 00000f5d: PUSH1 0x40 00000f5f: MLOAD 00000f60: DUP1 00000f61: SWAP2 00000f62: SUB 00000f63: SWAP1 00000f64: REVERT 00000f65: JUMPDEST 00000f66: PUSH1 0x00 00000f68: PUSH1 0x07 00000f6a: DUP8 00000f6b: DUP2 00000f6c: SLOAD 00000f6d: DUP2 00000f6e: LT 00000f6f: PUSH2 0x0f7a 00000f72: JUMPI 00000f73: PUSH2 0x0f7a 00000f76: PUSH2 0x3b52 00000f79: JUMP 00000f7a: JUMPDEST 00000f7b: PUSH1 0x00 00000f7d: SWAP2 00000f7e: DUP3 00000f7f: MSTORE 00000f80: PUSH1 0x20 00000f82: SWAP1 00000f83: SWAP2 00000f84: KECCAK256 00000f85: ADD 00000f86: SLOAD 00000f87: PUSH1 0x01 00000f89: PUSH1 0x01 00000f8b: PUSH1 0xa0 00000f8d: SHL 00000f8e: SUB 00000f8f: AND 00000f90: SWAP1 00000f91: POP 00000f92: PUSH1 0x12 00000f94: DUP2 00000f95: ISZERO 00000f96: PUSH2 0x1001 00000f99: JUMPI 00000f9a: DUP2 00000f9b: PUSH1 0x01 00000f9d: PUSH1 0x01 00000f9f: PUSH1 0xa0 00000fa1: SHL 00000fa2: SUB 00000fa3: AND 00000fa4: PUSH4 0x313ce567 00000fa9: PUSH1 0x40 00000fab: MLOAD 00000fac: DUP2 00000fad: PUSH4 0xffffffff 00000fb2: AND 00000fb3: PUSH1 0xe0 00000fb5: SHL 00000fb6: DUP2 00000fb7: MSTORE 00000fb8: PUSH1 0x04 00000fba: ADD 00000fbb: PUSH1 0x20 00000fbd: PUSH1 0x40 00000fbf: MLOAD 00000fc0: DUP1 00000fc1: DUP4 00000fc2: SUB 00000fc3: DUP2 00000fc4: DUP7 00000fc5: GAS 00000fc6: STATICCALL 00000fc7: ISZERO 00000fc8: DUP1 00000fc9: ISZERO 00000fca: PUSH2 0x0fd7 00000fcd: JUMPI 00000fce: RETURNDATASIZE 00000fcf: PUSH1 0x00 00000fd1: DUP1 00000fd2: RETURNDATACOPY 00000fd3: RETURNDATASIZE 00000fd4: PUSH1 0x00 00000fd6: REVERT 00000fd7: JUMPDEST 00000fd8: POP 00000fd9: POP 00000fda: POP 00000fdb: POP 00000fdc: PUSH1 0x40 00000fde: MLOAD 00000fdf: RETURNDATASIZE 00000fe0: PUSH1 0x1f 00000fe2: NOT 00000fe3: PUSH1 0x1f 00000fe5: DUP3 00000fe6: ADD 00000fe7: AND 00000fe8: DUP3 00000fe9: ADD 00000fea: DUP1 00000feb: PUSH1 0x40 00000fed: MSTORE 00000fee: POP 00000fef: DUP2 00000ff0: ADD 00000ff1: SWAP1 00000ff2: PUSH2 0x0ffb 00000ff5: SWAP2 00000ff6: SWAP1 00000ff7: PUSH2 0x3b68 00000ffa: JUMP 00000ffb: JUMPDEST 00000ffc: PUSH1 0xff 00000ffe: AND 00000fff: SWAP1 00001000: POP 00001001: JUMPDEST 00001002: DUP1 00001003: PUSH32 0x000000000000000000000000024475619e5d37cf7b5b445e943dbeb7edd2f408 00001024: PUSH1 0x01 00001026: PUSH1 0x01 00001028: PUSH1 0xa0 0000102a: SHL 0000102b: SUB 0000102c: AND 0000102d: PUSH4 0x313ce567 00001032: PUSH1 0x40 00001034: MLOAD 00001035: DUP2 00001036: PUSH4 0xffffffff 0000103b: AND 0000103c: PUSH1 0xe0 0000103e: SHL 0000103f: DUP2 00001040: MSTORE 00001041: PUSH1 0x04 00001043: ADD 00001044: PUSH1 0x20 00001046: PUSH1 0x40 00001048: MLOAD 00001049: DUP1 0000104a: DUP4 0000104b: SUB 0000104c: DUP2 0000104d: DUP7 0000104e: GAS 0000104f: STATICCALL 00001050: ISZERO 00001051: DUP1 00001052: ISZERO 00001053: PUSH2 0x1060 00001056: JUMPI 00001057: RETURNDATASIZE 00001058: PUSH1 0x00 0000105a: DUP1 0000105b: RETURNDATACOPY 0000105c: RETURNDATASIZE 0000105d: PUSH1 0x00 0000105f: REVERT 00001060: JUMPDEST 00001061: POP 00001062: POP 00001063: POP 00001064: POP 00001065: PUSH1 0x40 00001067: MLOAD 00001068: RETURNDATASIZE 00001069: PUSH1 0x1f 0000106b: NOT 0000106c: PUSH1 0x1f 0000106e: DUP3 0000106f: ADD 00001070: AND 00001071: DUP3 00001072: ADD 00001073: DUP1 00001074: PUSH1 0x40 00001076: MSTORE 00001077: POP 00001078: DUP2 00001079: ADD 0000107a: SWAP1 0000107b: PUSH2 0x1084 0000107e: SWAP2 0000107f: SWAP1 00001080: PUSH2 0x3b68 00001083: JUMP 00001084: JUMPDEST 00001085: PUSH1 0xff 00001087: AND 00001088: PUSH2 0x1091 0000108b: SWAP2 0000108c: SWAP1 0000108d: PUSH2 0x3d04 00001090: JUMP 00001091: JUMPDEST 00001092: PUSH2 0x109c 00001095: SWAP1 00001096: PUSH1 0x0a 00001098: PUSH2 0x3d17 0000109b: JUMP 0000109c: JUMPDEST 0000109d: DUP10 0000109e: LT 0000109f: ISZERO 000010a0: PUSH2 0x10bc 000010a3: JUMPI 000010a4: PUSH1 0x40 000010a6: MLOAD 000010a7: PUSH4 0x1c26df2d 000010ac: PUSH1 0xe1 000010ae: SHL 000010af: DUP2 000010b0: MSTORE 000010b1: PUSH1 0x04 000010b3: ADD 000010b4: PUSH1 0x40 000010b6: MLOAD 000010b7: DUP1 000010b8: SWAP2 000010b9: SUB 000010ba: SWAP1 000010bb: REVERT 000010bc: JUMPDEST 000010bd: PUSH1 0x00 000010bf: PUSH32 0x000000000000000000000000024475619e5d37cf7b5b445e943dbeb7edd2f408 000010e0: PUSH1 0x01 000010e2: PUSH1 0x01 000010e4: PUSH1 0xa0 000010e6: SHL 000010e7: SUB 000010e8: AND 000010e9: PUSH4 0x313ce567 000010ee: PUSH1 0x40 000010f0: MLOAD 000010f1: DUP2 000010f2: PUSH4 0xffffffff 000010f7: AND 000010f8: PUSH1 0xe0 000010fa: SHL 000010fb: DUP2 000010fc: MSTORE 000010fd: PUSH1 0x04 000010ff: ADD 00001100: PUSH1 0x20 00001102: PUSH1 0x40 00001104: MLOAD 00001105: DUP1 00001106: DUP4 00001107: SUB 00001108: DUP2 00001109: DUP7 0000110a: GAS 0000110b: STATICCALL 0000110c: ISZERO 0000110d: DUP1 0000110e: ISZERO 0000110f: PUSH2 0x111c 00001112: JUMPI 00001113: RETURNDATASIZE 00001114: PUSH1 0x00 00001116: DUP1 00001117: RETURNDATACOPY 00001118: RETURNDATASIZE 00001119: PUSH1 0x00 0000111b: REVERT 0000111c: JUMPDEST 0000111d: POP 0000111e: POP 0000111f: POP 00001120: POP 00001121: PUSH1 0x40 00001123: MLOAD 00001124: RETURNDATASIZE 00001125: PUSH1 0x1f 00001127: NOT 00001128: PUSH1 0x1f 0000112a: DUP3 0000112b: ADD 0000112c: AND 0000112d: DUP3 0000112e: ADD 0000112f: DUP1 00001130: PUSH1 0x40 00001132: MSTORE 00001133: POP 00001134: DUP2 00001135: ADD 00001136: SWAP1 00001137: PUSH2 0x1140 0000113a: SWAP2 0000113b: SWAP1 0000113c: PUSH2 0x3b68 0000113f: JUMP 00001140: JUMPDEST 00001141: PUSH2 0x114b 00001144: SWAP1 00001145: PUSH1 0x0a 00001147: PUSH2 0x3c88 0000114a: JUMP 0000114b: JUMPDEST 0000114c: DUP11 0000114d: PUSH1 0x05 0000114f: DUP12 00001150: DUP2 00001151: SLOAD 00001152: DUP2 00001153: LT 00001154: PUSH2 0x115f 00001157: JUMPI 00001158: PUSH2 0x115f 0000115b: PUSH2 0x3b52 0000115e: JUMP 0000115f: JUMPDEST 00001160: SWAP1 00001161: PUSH1 0x00 00001163: MSTORE 00001164: PUSH1 0x20 00001166: PUSH1 0x00 00001168: KECCAK256 00001169: ADD 0000116a: SLOAD 0000116b: PUSH2 0x1174 0000116e: SWAP2 0000116f: SWAP1 00001170: PUSH2 0x3c97 00001173: JUMP 00001174: JUMPDEST 00001175: PUSH2 0x117e 00001178: SWAP2 00001179: SWAP1 0000117a: PUSH2 0x3cae 0000117d: JUMP 0000117e: JUMPDEST 0000117f: SWAP1 00001180: POP 00001181: PUSH2 0x0cb3 00001184: CALLER 00001185: DUP10 00001186: DUP13 00001187: DUP5 00001188: DUP8 00001189: DUP13 0000118a: DUP13 0000118b: DUP13 0000118c: DUP13 0000118d: PUSH2 0x1c5d 00001190: JUMP 00001191: JUMPDEST 00001192: PUSH1 0x00 00001194: PUSH2 0x119c 00001197: DUP2 00001198: PUSH2 0x1e8a 0000119b: JUMP 0000119c: JUMPDEST 0000119d: PUSH1 0x01 0000119f: PUSH1 0x01 000011a1: PUSH1 0xa0 000011a3: SHL 000011a4: SUB 000011a5: DUP5 000011a6: AND 000011a7: PUSH2 0x1224 000011aa: JUMPI 000011ab: PUSH1 0x00 000011ad: DUP4 000011ae: PUSH1 0x01 000011b0: PUSH1 0x01 000011b2: PUSH1 0xa0 000011b4: SHL 000011b5: SUB 000011b6: AND 000011b7: DUP4 000011b8: PUSH1 0x40 000011ba: MLOAD 000011bb: PUSH1 0x00 000011bd: PUSH1 0x40 000011bf: MLOAD 000011c0: DUP1 000011c1: DUP4 000011c2: SUB 000011c3: DUP2 000011c4: DUP6 000011c5: DUP8 000011c6: GAS 000011c7: CALL 000011c8: SWAP3 000011c9: POP 000011ca: POP 000011cb: POP 000011cc: RETURNDATASIZE 000011cd: DUP1 000011ce: PUSH1 0x00 000011d0: DUP2 000011d1: EQ 000011d2: PUSH2 0x11f7 000011d5: JUMPI 000011d6: PUSH1 0x40 000011d8: MLOAD 000011d9: SWAP2 000011da: POP 000011db: PUSH1 0x1f 000011dd: NOT 000011de: PUSH1 0x3f 000011e0: RETURNDATASIZE 000011e1: ADD 000011e2: AND 000011e3: DUP3 000011e4: ADD 000011e5: PUSH1 0x40 000011e7: MSTORE 000011e8: RETURNDATASIZE 000011e9: DUP3 000011ea: MSTORE 000011eb: RETURNDATASIZE 000011ec: PUSH1 0x00 000011ee: PUSH1 0x20 000011f0: DUP5 000011f1: ADD 000011f2: RETURNDATACOPY 000011f3: PUSH2 0x11fc 000011f6: JUMP 000011f7: JUMPDEST 000011f8: PUSH1 0x60 000011fa: SWAP2 000011fb: POP 000011fc: JUMPDEST 000011fd: POP 000011fe: POP 000011ff: SWAP1 00001200: POP 00001201: DUP1 00001202: PUSH2 0x121e 00001205: JUMPI 00001206: PUSH1 0x40 00001208: MLOAD 00001209: PUSH4 0x4c67134d 0000120e: PUSH1 0xe1 00001210: SHL 00001211: DUP2 00001212: MSTORE 00001213: PUSH1 0x04 00001215: ADD 00001216: PUSH1 0x40 00001218: MLOAD 00001219: DUP1 0000121a: SWAP2 0000121b: SUB 0000121c: SWAP1 0000121d: REVERT 0000121e: JUMPDEST 0000121f: POP 00001220: PUSH2 0x1238 00001223: JUMP 00001224: JUMPDEST 00001225: PUSH2 0x1238 00001228: PUSH1 0x01 0000122a: PUSH1 0x01 0000122c: PUSH1 0xa0 0000122e: SHL 0000122f: SUB 00001230: DUP6 00001231: AND 00001232: DUP5 00001233: DUP5 00001234: PUSH2 0x1f04 00001237: JUMP 00001238: JUMPDEST 00001239: PUSH1 0x40 0000123b: DUP1 0000123c: MLOAD 0000123d: PUSH1 0x01 0000123f: PUSH1 0x01 00001241: PUSH1 0xa0 00001243: SHL 00001244: SUB 00001245: DUP1 00001246: DUP8 00001247: AND 00001248: DUP3 00001249: MSTORE 0000124a: DUP6 0000124b: AND 0000124c: PUSH1 0x20 0000124e: DUP3 0000124f: ADD 00001250: MSTORE 00001251: SWAP1 00001252: DUP2 00001253: ADD 00001254: DUP4 00001255: SWAP1 00001256: MSTORE 00001257: PUSH32 0x6337ed398c0e8467698c581374fdce4db14922df487b5a39483079f5f59b60a4 00001278: SWAP1 00001279: PUSH1 0x60 0000127b: ADD 0000127c: PUSH1 0x40 0000127e: MLOAD 0000127f: DUP1 00001280: SWAP2 00001281: SUB 00001282: SWAP1 00001283: LOG1 00001284: POP 00001285: POP 00001286: POP 00001287: POP 00001288: JUMP 00001289: JUMPDEST 0000128a: PUSH1 0x00 0000128c: PUSH2 0x1294 0000128f: DUP2 00001290: PUSH2 0x1e8a 00001293: JUMP 00001294: JUMPDEST 00001295: PUSH2 0x0d45 00001298: DUP3 00001299: PUSH2 0x1f63 0000129c: JUMP 0000129d: JUMPDEST 0000129e: PUSH1 0x00 000012a0: PUSH2 0x12a8 000012a3: DUP2 000012a4: PUSH2 0x1e8a 000012a7: JUMP 000012a8: JUMPDEST 000012a9: PUSH2 0x0d45 000012ac: DUP3 000012ad: PUSH2 0x1fd6 000012b0: JUMP 000012b1: JUMPDEST 000012b2: PUSH1 0x0c 000012b4: DUP3 000012b5: PUSH1 0x03 000012b7: DUP2 000012b8: LT 000012b9: PUSH2 0x12c1 000012bc: JUMPI 000012bd: PUSH1 0x00 000012bf: DUP1 000012c0: REVERT 000012c1: JUMPDEST 000012c2: PUSH1 0x04 000012c4: MUL 000012c5: ADD 000012c6: DUP2 000012c7: PUSH1 0x04 000012c9: DUP2 000012ca: LT 000012cb: PUSH2 0x12d3 000012ce: JUMPI 000012cf: PUSH1 0x00 000012d1: DUP1 000012d2: REVERT 000012d3: JUMPDEST 000012d4: ADD 000012d5: SLOAD 000012d6: SWAP2 000012d7: POP 000012d8: DUP3 000012d9: SWAP1 000012da: POP 000012db: JUMP 000012dc: JUMPDEST 000012dd: PUSH1 0x00 000012df: PUSH1 0x60 000012e1: DUP1 000012e2: PUSH1 0x00 000012e4: DUP1 000012e5: PUSH1 0x00 000012e7: PUSH1 0x60 000012e9: PUSH2 0x12f0 000012ec: PUSH2 0x203f 000012ef: JUMP 000012f0: JUMPDEST 000012f1: PUSH2 0x12f8 000012f4: PUSH2 0x206c 000012f7: JUMP 000012f8: JUMPDEST 000012f9: PUSH1 0x40 000012fb: DUP1 000012fc: MLOAD 000012fd: PUSH1 0x00 000012ff: DUP1 00001300: DUP3 00001301: MSTORE 00001302: PUSH1 0x20 00001304: DUP3 00001305: ADD 00001306: SWAP1 00001307: SWAP3 00001308: MSTORE 00001309: PUSH1 0x0f 0000130b: PUSH1 0xf8 0000130d: SHL 0000130e: SWAP12 0000130f: SWAP4 00001310: SWAP11 00001311: POP 00001312: SWAP2 00001313: SWAP9 00001314: POP 00001315: CHAINID 00001316: SWAP8 00001317: POP 00001318: ADDRESS 00001319: SWAP7 0000131a: POP 0000131b: SWAP5 0000131c: POP 0000131d: SWAP3 0000131e: POP 0000131f: SWAP1 00001320: POP 00001321: JUMP 00001322: JUMPDEST 00001323: PUSH1 0x00 00001325: PUSH2 0x1336 00001328: PUSH1 0x02 0000132a: SLOAD 0000132b: PUSH1 0x01 0000132d: PUSH1 0x01 0000132f: PUSH1 0xa0 00001331: SHL 00001332: SUB 00001333: AND 00001334: SWAP1 00001335: JUMP 00001336: JUMPDEST 00001337: SWAP1 00001338: POP 00001339: SWAP1 0000133a: JUMP 0000133b: JUMPDEST 0000133c: PUSH32 0x00000000000000000000000000000000000000000000000000000000686ff190 0000135d: TIMESTAMP 0000135e: LT 0000135f: ISZERO 00001360: PUSH2 0x137c 00001363: JUMPI 00001364: PUSH1 0x40 00001366: MLOAD 00001367: PUSH4 0x16851a37 0000136c: PUSH1 0xe1 0000136e: SHL 0000136f: DUP2 00001370: MSTORE 00001371: PUSH1 0x04 00001373: ADD 00001374: PUSH1 0x40 00001376: MLOAD 00001377: DUP1 00001378: SWAP2 00001379: SUB 0000137a: SWAP1 0000137b: REVERT 0000137c: JUMPDEST 0000137d: PUSH1 0x07 0000137f: SLOAD 00001380: DUP2 00001381: LT 00001382: PUSH2 0x139e 00001385: JUMPI 00001386: PUSH1 0x40 00001388: MLOAD 00001389: PUSH4 0x63df8171 0000138e: PUSH1 0xe0 00001390: SHL 00001391: DUP2 00001392: MSTORE 00001393: PUSH1 0x04 00001395: ADD 00001396: PUSH1 0x40 00001398: MLOAD 00001399: DUP1 0000139a: SWAP2 0000139b: SUB 0000139c: SWAP1 0000139d: REVERT 0000139e: JUMPDEST 0000139f: PUSH1 0x00 000013a1: PUSH1 0x06 000013a3: DUP3 000013a4: DUP2 000013a5: SLOAD 000013a6: DUP2 000013a7: LT 000013a8: PUSH2 0x13b3 000013ab: JUMPI 000013ac: PUSH2 0x13b3 000013af: PUSH2 0x3b52 000013b2: JUMP 000013b3: JUMPDEST 000013b4: SWAP1 000013b5: PUSH1 0x00 000013b7: MSTORE 000013b8: PUSH1 0x20 000013ba: PUSH1 0x00 000013bc: KECCAK256 000013bd: ADD 000013be: SLOAD 000013bf: SWAP1 000013c0: POP 000013c1: DUP1 000013c2: DUP4 000013c3: LT 000013c4: ISZERO 000013c5: PUSH2 0x13e1 000013c8: JUMPI 000013c9: PUSH1 0x40 000013cb: MLOAD 000013cc: PUSH4 0x3a4d1f31 000013d1: PUSH1 0xe2 000013d3: SHL 000013d4: DUP2 000013d5: MSTORE 000013d6: PUSH1 0x04 000013d8: ADD 000013d9: PUSH1 0x40 000013db: MLOAD 000013dc: DUP1 000013dd: SWAP2 000013de: SUB 000013df: SWAP1 000013e0: REVERT 000013e1: JUMPDEST 000013e2: PUSH1 0x00 000013e4: PUSH1 0x07 000013e6: DUP4 000013e7: DUP2 000013e8: SLOAD 000013e9: DUP2 000013ea: LT 000013eb: PUSH2 0x13f6 000013ee: JUMPI 000013ef: PUSH2 0x13f6 000013f2: PUSH2 0x3b52 000013f5: JUMP 000013f6: JUMPDEST 000013f7: SWAP1 000013f8: PUSH1 0x00 000013fa: MSTORE 000013fb: PUSH1 0x20 000013fd: PUSH1 0x00 000013ff: KECCAK256 00001400: ADD 00001401: PUSH1 0x00 00001403: SWAP1 00001404: SLOAD 00001405: SWAP1 00001406: PUSH2 0x0100 00001409: EXP 0000140a: SWAP1 0000140b: DIV 0000140c: PUSH1 0x01 0000140e: PUSH1 0x01 00001410: PUSH1 0xa0 00001412: SHL 00001413: SUB 00001414: AND 00001415: SWAP1 00001416: POP 00001417: PUSH1 0x00 00001419: DUP3 0000141a: PUSH32 0x000000000000000000000000024475619e5d37cf7b5b445e943dbeb7edd2f408 0000143b: PUSH1 0x01 0000143d: PUSH1 0x01 0000143f: PUSH1 0xa0 00001441: SHL 00001442: SUB 00001443: AND 00001444: PUSH4 0x313ce567 00001449: PUSH1 0x40 0000144b: MLOAD 0000144c: DUP2 0000144d: PUSH4 0xffffffff 00001452: AND 00001453: PUSH1 0xe0 00001455: SHL 00001456: DUP2 00001457: MSTORE 00001458: PUSH1 0x04 0000145a: ADD 0000145b: PUSH1 0x20 0000145d: PUSH1 0x40 0000145f: MLOAD 00001460: DUP1 00001461: DUP4 00001462: SUB 00001463: DUP2 00001464: DUP7 00001465: GAS 00001466: STATICCALL 00001467: ISZERO 00001468: DUP1 00001469: ISZERO 0000146a: PUSH2 0x1477 0000146d: JUMPI 0000146e: RETURNDATASIZE 0000146f: PUSH1 0x00 00001471: DUP1 00001472: RETURNDATACOPY 00001473: RETURNDATASIZE 00001474: PUSH1 0x00 00001476: REVERT 00001477: JUMPDEST 00001478: POP 00001479: POP 0000147a: POP 0000147b: POP 0000147c: PUSH1 0x40 0000147e: MLOAD 0000147f: RETURNDATASIZE 00001480: PUSH1 0x1f 00001482: NOT 00001483: PUSH1 0x1f 00001485: DUP3 00001486: ADD 00001487: AND 00001488: DUP3 00001489: ADD 0000148a: DUP1 0000148b: PUSH1 0x40 0000148d: MSTORE 0000148e: POP 0000148f: DUP2 00001490: ADD 00001491: SWAP1 00001492: PUSH2 0x149b 00001495: SWAP2 00001496: SWAP1 00001497: PUSH2 0x3b68 0000149a: JUMP 0000149b: JUMPDEST 0000149c: PUSH2 0x14a6 0000149f: SWAP1 000014a0: PUSH1 0x0a 000014a2: PUSH2 0x3c88 000014a5: JUMP 000014a6: JUMPDEST 000014a7: PUSH2 0x14b0 000014aa: SWAP1 000014ab: DUP8 000014ac: PUSH2 0x3c97 000014af: JUMP 000014b0: JUMPDEST 000014b1: PUSH2 0x14ba 000014b4: SWAP2 000014b5: SWAP1 000014b6: PUSH2 0x3cae 000014b9: JUMP 000014ba: JUMPDEST 000014bb: SWAP1 000014bc: POP 000014bd: PUSH2 0x14c8 000014c0: CALLER 000014c1: DUP3 000014c2: DUP8 000014c3: DUP6 000014c4: PUSH2 0x2099 000014c7: JUMP 000014c8: JUMPDEST 000014c9: POP 000014ca: POP 000014cb: POP 000014cc: POP 000014cd: POP 000014ce: JUMP 000014cf: JUMPDEST 000014d0: PUSH1 0x00 000014d2: SWAP2 000014d3: DUP3 000014d4: MSTORE 000014d5: PUSH1 0x20 000014d7: DUP3 000014d8: DUP2 000014d9: MSTORE 000014da: PUSH1 0x40 000014dc: DUP1 000014dd: DUP5 000014de: KECCAK256 000014df: PUSH1 0x01 000014e1: PUSH1 0x01 000014e3: PUSH1 0xa0 000014e5: SHL 000014e6: SUB 000014e7: SWAP4 000014e8: SWAP1 000014e9: SWAP4 000014ea: AND 000014eb: DUP5 000014ec: MSTORE 000014ed: SWAP2 000014ee: SWAP1 000014ef: MSTORE 000014f0: SWAP1 000014f1: KECCAK256 000014f2: SLOAD 000014f3: PUSH1 0xff 000014f5: AND 000014f6: SWAP1 000014f7: JUMP 000014f8: JUMPDEST 000014f9: PUSH1 0x00 000014fb: PUSH2 0x1503 000014fe: DUP2 000014ff: PUSH2 0x1e8a 00001502: JUMP 00001503: JUMPDEST 00001504: PUSH2 0x1510 00001507: PUSH1 0x18 00001509: DUP4 0000150a: PUSH1 0x04 0000150c: PUSH2 0x34f6 0000150f: JUMP 00001510: JUMPDEST 00001511: POP 00001512: PUSH32 0xb709889bf6c2a7c2d0bfeed028e368519d927f34970354721d44924c1f2d7190 00001533: DUP3 00001534: PUSH1 0x40 00001536: MLOAD 00001537: PUSH2 0x0d11 0000153a: SWAP2 0000153b: SWAP1 0000153c: PUSH2 0x3d23 0000153f: JUMP 00001540: JUMPDEST 00001541: PUSH1 0x00 00001543: DUP1 00001544: MLOAD 00001545: PUSH1 0x20 00001547: PUSH2 0x3e6f 0000154a: DUP4 0000154b: CODECOPY 0000154c: DUP2 0000154d: MLOAD 0000154e: SWAP2 0000154f: MSTORE 00001550: PUSH2 0x1558 00001553: DUP2 00001554: PUSH2 0x1e8a 00001557: JUMP 00001558: JUMPDEST 00001559: PUSH2 0x1565 0000155c: DUP7 0000155d: DUP7 0000155e: DUP7 0000155f: DUP7 00001560: DUP7 00001561: PUSH2 0x21be 00001564: JUMP 00001565: JUMPDEST 00001566: POP 00001567: POP 00001568: POP 00001569: POP 0000156a: POP 0000156b: POP 0000156c: JUMP 0000156d: JUMPDEST 0000156e: PUSH1 0x02 00001570: SLOAD 00001571: PUSH1 0x00 00001573: SWAP1 00001574: PUSH1 0x01 00001576: PUSH1 0xd0 00001578: SHL 00001579: SWAP1 0000157a: DIV 0000157b: PUSH6 0xffffffffffff 00001582: AND 00001583: DUP1 00001584: ISZERO 00001585: ISZERO 00001586: DUP1 00001587: ISZERO 00001588: PUSH2 0x1599 0000158b: JUMPI 0000158c: POP 0000158d: TIMESTAMP 0000158e: PUSH6 0xffffffffffff 00001595: DUP3 00001596: AND 00001597: LT 00001598: ISZERO 00001599: JUMPDEST 0000159a: PUSH2 0x15a5 0000159d: JUMPI 0000159e: PUSH1 0x00 000015a0: DUP1 000015a1: PUSH2 0x15b9 000015a4: JUMP 000015a5: JUMPDEST 000015a6: PUSH1 0x02 000015a8: SLOAD 000015a9: PUSH1 0x01 000015ab: PUSH1 0xa0 000015ad: SHL 000015ae: SWAP1 000015af: DIV 000015b0: PUSH6 0xffffffffffff 000015b7: AND 000015b8: DUP2 000015b9: JUMPDEST 000015ba: SWAP2 000015bb: POP 000015bc: SWAP2 000015bd: POP 000015be: SWAP1 000015bf: SWAP2 000015c0: JUMP 000015c1: JUMPDEST 000015c2: PUSH32 0x00000000000000000000000000000000000000000000000000000000686ff190 000015e3: TIMESTAMP 000015e4: LT 000015e5: ISZERO 000015e6: PUSH2 0x1602 000015e9: JUMPI 000015ea: PUSH1 0x40 000015ec: MLOAD 000015ed: PUSH4 0x16851a37 000015f2: PUSH1 0xe1 000015f4: SHL 000015f5: DUP2 000015f6: MSTORE 000015f7: PUSH1 0x04 000015f9: ADD 000015fa: PUSH1 0x40 000015fc: MLOAD 000015fd: DUP1 000015fe: SWAP2 000015ff: SUB 00001600: SWAP1 00001601: REVERT 00001602: JUMPDEST 00001603: PUSH1 0x07 00001605: SLOAD 00001606: DUP2 00001607: LT 00001608: PUSH2 0x1624 0000160b: JUMPI 0000160c: PUSH1 0x40 0000160e: MLOAD 0000160f: PUSH4 0x63df8171 00001614: PUSH1 0xe0 00001616: SHL 00001617: DUP2 00001618: MSTORE 00001619: PUSH1 0x04 0000161b: ADD 0000161c: PUSH1 0x40 0000161e: MLOAD 0000161f: DUP1 00001620: SWAP2 00001621: SUB 00001622: SWAP1 00001623: REVERT 00001624: JUMPDEST 00001625: PUSH1 0x00 00001627: PUSH1 0x07 00001629: DUP3 0000162a: DUP2 0000162b: SLOAD 0000162c: DUP2 0000162d: LT 0000162e: PUSH2 0x1639 00001631: JUMPI 00001632: PUSH2 0x1639 00001635: PUSH2 0x3b52 00001638: JUMP 00001639: JUMPDEST 0000163a: PUSH1 0x00 0000163c: SWAP2 0000163d: DUP3 0000163e: MSTORE 0000163f: PUSH1 0x20 00001641: SWAP1 00001642: SWAP2 00001643: KECCAK256 00001644: ADD 00001645: SLOAD 00001646: PUSH1 0x01 00001648: PUSH1 0x01 0000164a: PUSH1 0xa0 0000164c: SHL 0000164d: SUB 0000164e: AND 0000164f: SWAP1 00001650: POP 00001651: PUSH1 0x12 00001653: DUP2 00001654: ISZERO 00001655: PUSH2 0x16c0 00001658: JUMPI 00001659: DUP2 0000165a: PUSH1 0x01 0000165c: PUSH1 0x01 0000165e: PUSH1 0xa0 00001660: SHL 00001661: SUB 00001662: AND 00001663: PUSH4 0x313ce567 00001668: PUSH1 0x40 0000166a: MLOAD 0000166b: DUP2 0000166c: PUSH4 0xffffffff 00001671: AND 00001672: PUSH1 0xe0 00001674: SHL 00001675: DUP2 00001676: MSTORE 00001677: PUSH1 0x04 00001679: ADD 0000167a: PUSH1 0x20 0000167c: PUSH1 0x40 0000167e: MLOAD 0000167f: DUP1 00001680: DUP4 00001681: SUB 00001682: DUP2 00001683: DUP7 00001684: GAS 00001685: STATICCALL 00001686: ISZERO 00001687: DUP1 00001688: ISZERO 00001689: PUSH2 0x1696 0000168c: JUMPI 0000168d: RETURNDATASIZE 0000168e: PUSH1 0x00 00001690: DUP1 00001691: RETURNDATACOPY 00001692: RETURNDATASIZE 00001693: PUSH1 0x00 00001695: REVERT 00001696: JUMPDEST 00001697: POP 00001698: POP 00001699: POP 0000169a: POP 0000169b: PUSH1 0x40 0000169d: MLOAD 0000169e: RETURNDATASIZE 0000169f: PUSH1 0x1f 000016a1: NOT 000016a2: PUSH1 0x1f 000016a4: DUP3 000016a5: ADD 000016a6: AND 000016a7: DUP3 000016a8: ADD 000016a9: DUP1 000016aa: PUSH1 0x40 000016ac: MSTORE 000016ad: POP 000016ae: DUP2 000016af: ADD 000016b0: SWAP1 000016b1: PUSH2 0x16ba 000016b4: SWAP2 000016b5: SWAP1 000016b6: PUSH2 0x3b68 000016b9: JUMP 000016ba: JUMPDEST 000016bb: PUSH1 0xff 000016bd: AND 000016be: SWAP1 000016bf: POP 000016c0: JUMPDEST 000016c1: DUP1 000016c2: PUSH32 0x000000000000000000000000024475619e5d37cf7b5b445e943dbeb7edd2f408 000016e3: PUSH1 0x01 000016e5: PUSH1 0x01 000016e7: PUSH1 0xa0 000016e9: SHL 000016ea: SUB 000016eb: AND 000016ec: PUSH4 0x313ce567 000016f1: PUSH1 0x40 000016f3: MLOAD 000016f4: DUP2 000016f5: PUSH4 0xffffffff 000016fa: AND 000016fb: PUSH1 0xe0 000016fd: SHL 000016fe: DUP2 000016ff: MSTORE 00001700: PUSH1 0x04 00001702: ADD 00001703: PUSH1 0x20 00001705: PUSH1 0x40 00001707: MLOAD 00001708: DUP1 00001709: DUP4 0000170a: SUB 0000170b: DUP2 0000170c: DUP7 0000170d: GAS 0000170e: STATICCALL 0000170f: ISZERO 00001710: DUP1 00001711: ISZERO 00001712: PUSH2 0x171f 00001715: JUMPI 00001716: RETURNDATASIZE 00001717: PUSH1 0x00 00001719: DUP1 0000171a: RETURNDATACOPY 0000171b: RETURNDATASIZE 0000171c: PUSH1 0x00 0000171e: REVERT 0000171f: JUMPDEST 00001720: POP 00001721: POP 00001722: POP 00001723: POP 00001724: PUSH1 0x40 00001726: MLOAD 00001727: RETURNDATASIZE 00001728: PUSH1 0x1f 0000172a: NOT 0000172b: PUSH1 0x1f 0000172d: DUP3 0000172e: ADD 0000172f: AND 00001730: DUP3 00001731: ADD 00001732: DUP1 00001733: PUSH1 0x40 00001735: MSTORE 00001736: POP 00001737: DUP2 00001738: ADD 00001739: SWAP1 0000173a: PUSH2 0x1743 0000173d: SWAP2 0000173e: SWAP1 0000173f: PUSH2 0x3b68 00001742: JUMP 00001743: JUMPDEST 00001744: PUSH1 0xff 00001746: AND 00001747: PUSH2 0x1750 0000174a: SWAP2 0000174b: SWAP1 0000174c: PUSH2 0x3d04 0000174f: JUMP 00001750: JUMPDEST 00001751: PUSH2 0x175b 00001754: SWAP1 00001755: PUSH1 0x0a 00001757: PUSH2 0x3d17 0000175a: JUMP 0000175b: JUMPDEST 0000175c: DUP5 0000175d: LT 0000175e: ISZERO 0000175f: PUSH2 0x177b 00001762: JUMPI 00001763: PUSH1 0x40 00001765: MLOAD 00001766: PUSH4 0x37ecb2bb 0000176b: PUSH1 0xe0 0000176d: SHL 0000176e: DUP2 0000176f: MSTORE 00001770: PUSH1 0x04 00001772: ADD 00001773: PUSH1 0x40 00001775: MLOAD 00001776: DUP1 00001777: SWAP2 00001778: SUB 00001779: SWAP1 0000177a: REVERT 0000177b: JUMPDEST 0000177c: PUSH1 0x00 0000177e: PUSH1 0x06 00001780: DUP5 00001781: DUP2 00001782: SLOAD 00001783: DUP2 00001784: LT 00001785: PUSH2 0x1790 00001788: JUMPI 00001789: PUSH2 0x1790 0000178c: PUSH2 0x3b52 0000178f: JUMP 00001790: JUMPDEST 00001791: SWAP1 00001792: PUSH1 0x00 00001794: MSTORE 00001795: PUSH1 0x20 00001797: PUSH1 0x00 00001799: KECCAK256 0000179a: ADD 0000179b: SLOAD 0000179c: SWAP1 0000179d: POP 0000179e: PUSH1 0x00 000017a0: PUSH32 0x000000000000000000000000024475619e5d37cf7b5b445e943dbeb7edd2f408 000017c1: PUSH1 0x01 000017c3: PUSH1 0x01 000017c5: PUSH1 0xa0 000017c7: SHL 000017c8: SUB 000017c9: AND 000017ca: PUSH4 0x313ce567 000017cf: PUSH1 0x40 000017d1: MLOAD 000017d2: DUP2 000017d3: PUSH4 0xffffffff 000017d8: AND 000017d9: PUSH1 0xe0 000017db: SHL 000017dc: DUP2 000017dd: MSTORE 000017de: PUSH1 0x04 000017e0: ADD 000017e1: PUSH1 0x20 000017e3: PUSH1 0x40 000017e5: MLOAD 000017e6: DUP1 000017e7: DUP4 000017e8: SUB 000017e9: DUP2 000017ea: DUP7 000017eb: GAS 000017ec: STATICCALL 000017ed: ISZERO 000017ee: DUP1 000017ef: ISZERO 000017f0: PUSH2 0x17fd 000017f3: JUMPI 000017f4: RETURNDATASIZE 000017f5: PUSH1 0x00 000017f7: DUP1 000017f8: RETURNDATACOPY 000017f9: RETURNDATASIZE 000017fa: PUSH1 0x00 000017fc: REVERT 000017fd: JUMPDEST 000017fe: POP 000017ff: POP 00001800: POP 00001801: POP 00001802: PUSH1 0x40 00001804: MLOAD 00001805: RETURNDATASIZE 00001806: PUSH1 0x1f 00001808: NOT 00001809: PUSH1 0x1f 0000180b: DUP3 0000180c: ADD 0000180d: AND 0000180e: DUP3 0000180f: ADD 00001810: DUP1 00001811: PUSH1 0x40 00001813: MSTORE 00001814: POP 00001815: DUP2 00001816: ADD 00001817: SWAP1 00001818: PUSH2 0x1821 0000181b: SWAP2 0000181c: SWAP1 0000181d: PUSH2 0x3b68 00001820: JUMP 00001821: JUMPDEST 00001822: PUSH2 0x182c 00001825: SWAP1 00001826: PUSH1 0x0a 00001828: PUSH2 0x3c88 0000182b: JUMP 0000182c: JUMPDEST 0000182d: PUSH2 0x1836 00001830: DUP8 00001831: DUP5 00001832: PUSH2 0x3c97 00001835: JUMP 00001836: JUMPDEST 00001837: PUSH2 0x1840 0000183a: SWAP2 0000183b: SWAP1 0000183c: PUSH2 0x3cae 0000183f: JUMP 00001840: JUMPDEST 00001841: SWAP1 00001842: POP 00001843: PUSH2 0x1565 00001846: CALLER 00001847: DUP8 00001848: DUP4 00001849: DUP8 0000184a: PUSH2 0x2099 0000184d: JUMP 0000184e: JUMPDEST 0000184f: PUSH1 0x00 00001851: PUSH2 0x1859 00001854: DUP2 00001855: PUSH2 0x1e8a 00001858: JUMP 00001859: JUMPDEST 0000185a: DUP7 0000185b: ISZERO 0000185c: DUP1 0000185d: PUSH2 0x1866 00001860: JUMPI 00001861: POP 00001862: DUP7 00001863: DUP6 00001864: EQ 00001865: ISZERO 00001866: JUMPDEST 00001867: DUP1 00001868: PUSH2 0x1871 0000186b: JUMPI 0000186c: POP 0000186d: DUP7 0000186e: DUP4 0000186f: EQ 00001870: ISZERO 00001871: JUMPDEST 00001872: ISZERO 00001873: PUSH2 0x188f 00001876: JUMPI 00001877: PUSH1 0x40 00001879: MLOAD 0000187a: PUSH4 0x4ec48105 0000187f: PUSH1 0xe1 00001881: SHL 00001882: DUP2 00001883: MSTORE 00001884: PUSH1 0x04 00001886: ADD 00001887: PUSH1 0x40 00001889: MLOAD 0000188a: DUP1 0000188b: SWAP2 0000188c: SUB 0000188d: SWAP1 0000188e: REVERT 0000188f: JUMPDEST 00001890: PUSH2 0x189b 00001893: PUSH1 0x07 00001895: DUP10 00001896: DUP10 00001897: PUSH2 0x3530 0000189a: JUMP 0000189b: JUMPDEST 0000189c: POP 0000189d: PUSH2 0x18a9 000018a0: DUP7 000018a1: DUP7 000018a2: DUP7 000018a3: DUP7 000018a4: DUP7 000018a5: PUSH2 0x21be 000018a8: JUMP 000018a9: JUMPDEST 000018aa: PUSH32 0x9e81c6516c0b37af4c6bcae34dab17ecd14e1f0754df5852763fefa1402927f7 000018cb: DUP9 000018cc: DUP9 000018cd: PUSH1 0x40 000018cf: MLOAD 000018d0: PUSH2 0x18da 000018d3: SWAP3 000018d4: SWAP2 000018d5: SWAP1 000018d6: PUSH2 0x3d32 000018d9: JUMP 000018da: JUMPDEST 000018db: PUSH1 0x40 000018dd: MLOAD 000018de: DUP1 000018df: SWAP2 000018e0: SUB 000018e1: SWAP1 000018e2: LOG1 000018e3: POP 000018e4: POP 000018e5: POP 000018e6: POP 000018e7: POP 000018e8: POP 000018e9: POP 000018ea: POP 000018eb: JUMP 000018ec: JUMPDEST 000018ed: PUSH1 0x00 000018ef: PUSH2 0x18f7 000018f2: DUP2 000018f3: PUSH2 0x1e8a 000018f6: JUMP 000018f7: JUMPDEST 000018f8: PUSH1 0x24 000018fa: DUP3 000018fb: SWAP1 000018fc: SSTORE 000018fd: PUSH1 0x40 000018ff: MLOAD 00001900: DUP3 00001901: DUP2 00001902: MSTORE 00001903: PUSH32 0xff9c68f0cb4c990dfe8433cb28eda336b0625662999cb9b6f50d348faea12579 00001924: SWAP1 00001925: PUSH1 0x20 00001927: ADD 00001928: PUSH2 0x0d11 0000192b: JUMP 0000192c: JUMPDEST 0000192d: PUSH1 0x00 0000192f: PUSH2 0x1937 00001932: DUP2 00001933: PUSH2 0x1e8a 00001936: JUMP 00001937: JUMPDEST 00001938: PUSH1 0x01 0000193a: PUSH1 0x01 0000193c: PUSH1 0xa0 0000193e: SHL 0000193f: SUB 00001940: DUP3 00001941: AND 00001942: PUSH2 0x195e 00001945: JUMPI 00001946: PUSH1 0x40 00001948: MLOAD 00001949: PUSH4 0xd92e233d 0000194e: PUSH1 0xe0 00001950: SHL 00001951: DUP2 00001952: MSTORE 00001953: PUSH1 0x04 00001955: ADD 00001956: PUSH1 0x40 00001958: MLOAD 00001959: DUP1 0000195a: SWAP2 0000195b: SUB 0000195c: SWAP1 0000195d: REVERT 0000195e: JUMPDEST 0000195f: PUSH1 0x26 00001961: SLOAD 00001962: PUSH1 0x01 00001964: PUSH1 0x01 00001966: PUSH1 0xa0 00001968: SHL 00001969: SUB 0000196a: AND 0000196b: ISZERO 0000196c: PUSH2 0x1996 0000196f: JUMPI 00001970: PUSH1 0x26 00001972: SLOAD 00001973: PUSH2 0x1994 00001976: SWAP1 00001977: PUSH1 0x00 00001979: DUP1 0000197a: MLOAD 0000197b: PUSH1 0x20 0000197d: PUSH2 0x3e6f 00001980: DUP4 00001981: CODECOPY 00001982: DUP2 00001983: MLOAD 00001984: SWAP2 00001985: MSTORE 00001986: SWAP1 00001987: PUSH1 0x01 00001989: PUSH1 0x01 0000198b: PUSH1 0xa0 0000198d: SHL 0000198e: SUB 0000198f: AND 00001990: PUSH2 0x2253 00001993: JUMP 00001994: JUMPDEST 00001995: POP 00001996: JUMPDEST 00001997: PUSH2 0x19ae 0000199a: PUSH1 0x00 0000199c: DUP1 0000199d: MLOAD 0000199e: PUSH1 0x20 000019a0: PUSH2 0x3e6f 000019a3: DUP4 000019a4: CODECOPY 000019a5: DUP2 000019a6: MLOAD 000019a7: SWAP2 000019a8: MSTORE 000019a9: DUP4 000019aa: PUSH2 0x2297 000019ad: JUMP 000019ae: JUMPDEST 000019af: POP 000019b0: PUSH1 0x26 000019b2: DUP1 000019b3: SLOAD 000019b4: PUSH1 0x01 000019b6: PUSH1 0x01 000019b8: PUSH1 0xa0 000019ba: SHL 000019bb: SUB 000019bc: NOT 000019bd: AND 000019be: PUSH1 0x01 000019c0: PUSH1 0x01 000019c2: PUSH1 0xa0 000019c4: SHL 000019c5: SUB 000019c6: DUP5 000019c7: AND 000019c8: SWAP1 000019c9: DUP2 000019ca: OR 000019cb: SWAP1 000019cc: SWAP2 000019cd: SSTORE 000019ce: PUSH1 0x40 000019d0: MLOAD 000019d1: SWAP1 000019d2: DUP2 000019d3: MSTORE 000019d4: PUSH32 0x25e685c2df1877d5fb41d4b737f7070c25654faadfdea2de79ab95d2b4100f1e 000019f5: SWAP1 000019f6: PUSH1 0x20 000019f8: ADD 000019f9: PUSH2 0x0d11 000019fc: JUMP 000019fd: JUMPDEST 000019fe: PUSH1 0x05 00001a00: DUP2 00001a01: DUP2 00001a02: SLOAD 00001a03: DUP2 00001a04: LT 00001a05: PUSH2 0x1a0d 00001a08: JUMPI 00001a09: PUSH1 0x00 00001a0b: DUP1 00001a0c: REVERT 00001a0d: JUMPDEST 00001a0e: PUSH1 0x00 00001a10: SWAP2 00001a11: DUP3 00001a12: MSTORE 00001a13: PUSH1 0x20 00001a15: SWAP1 00001a16: SWAP2 00001a17: KECCAK256 00001a18: ADD 00001a19: SLOAD 00001a1a: SWAP1 00001a1b: POP 00001a1c: DUP2 00001a1d: JUMP 00001a1e: JUMPDEST 00001a1f: PUSH1 0x06 00001a21: DUP2 00001a22: DUP2 00001a23: SLOAD 00001a24: DUP2 00001a25: LT 00001a26: PUSH2 0x1a0d 00001a29: JUMPI 00001a2a: PUSH1 0x00 00001a2c: DUP1 00001a2d: REVERT 00001a2e: JUMPDEST 00001a2f: PUSH1 0x02 00001a31: SLOAD 00001a32: PUSH1 0x00 00001a34: SWAP1 00001a35: PUSH1 0x01 00001a37: PUSH1 0xd0 00001a39: SHL 00001a3a: SWAP1 00001a3b: DIV 00001a3c: PUSH6 0xffffffffffff 00001a43: AND 00001a44: DUP1 00001a45: ISZERO 00001a46: ISZERO 00001a47: DUP1 00001a48: ISZERO 00001a49: PUSH2 0x1a59 00001a4c: JUMPI 00001a4d: POP 00001a4e: TIMESTAMP 00001a4f: PUSH6 0xffffffffffff 00001a56: DUP3 00001a57: AND 00001a58: LT 00001a59: JUMPDEST 00001a5a: PUSH2 0x1a74 00001a5d: JUMPI 00001a5e: PUSH1 0x01 00001a60: SLOAD 00001a61: PUSH1 0x01 00001a63: PUSH1 0xd0 00001a65: SHL 00001a66: SWAP1 00001a67: DIV 00001a68: PUSH6 0xffffffffffff 00001a6f: AND 00001a70: PUSH2 0x1a87 00001a73: JUMP 00001a74: JUMPDEST 00001a75: PUSH1 0x02 00001a77: SLOAD 00001a78: PUSH1 0x01 00001a7a: PUSH1 0xa0 00001a7c: SHL 00001a7d: SWAP1 00001a7e: DIV 00001a7f: PUSH6 0xffffffffffff 00001a86: AND 00001a87: JUMPDEST 00001a88: SWAP2 00001a89: POP 00001a8a: POP 00001a8b: SWAP1 00001a8c: JUMP 00001a8d: JUMPDEST 00001a8e: PUSH1 0x00 00001a90: PUSH2 0x1a97 00001a93: PUSH2 0x1acd 00001a96: JUMP 00001a97: JUMPDEST 00001a98: POP 00001a99: SWAP1 00001a9a: POP 00001a9b: CALLER 00001a9c: PUSH1 0x01 00001a9e: PUSH1 0x01 00001aa0: PUSH1 0xa0 00001aa2: SHL 00001aa3: SUB 00001aa4: DUP3 00001aa5: AND 00001aa6: EQ 00001aa7: PUSH2 0x1ac5 00001aaa: JUMPI 00001aab: PUSH1 0x40 00001aad: MLOAD 00001aae: PUSH4 0x61164011 00001ab3: PUSH1 0xe1 00001ab5: SHL 00001ab6: DUP2 00001ab7: MSTORE 00001ab8: CALLER 00001ab9: PUSH1 0x04 00001abb: DUP3 00001abc: ADD 00001abd: MSTORE 00001abe: PUSH1 0x24 00001ac0: ADD 00001ac1: PUSH2 0x0de4 00001ac4: JUMP 00001ac5: JUMPDEST 00001ac6: PUSH2 0x0cd2 00001ac9: PUSH2 0x22ff 00001acc: JUMP 00001acd: JUMPDEST 00001ace: PUSH1 0x01 00001ad0: SLOAD 00001ad1: PUSH1 0x01 00001ad3: PUSH1 0x01 00001ad5: PUSH1 0xa0 00001ad7: SHL 00001ad8: SUB 00001ad9: DUP2 00001ada: AND 00001adb: SWAP2 00001adc: PUSH1 0x01 00001ade: PUSH1 0xa0 00001ae0: SHL 00001ae1: SWAP1 00001ae2: SWAP2 00001ae3: DIV 00001ae4: PUSH6 0xffffffffffff 00001aeb: AND 00001aec: SWAP1 00001aed: JUMP 00001aee: JUMPDEST 00001aef: DUP2 00001af0: PUSH2 0x1b0c 00001af3: JUMPI 00001af4: PUSH1 0x40 00001af6: MLOAD 00001af7: PUSH4 0x1fe1e13d 00001afc: PUSH1 0xe1 00001afe: SHL 00001aff: DUP2 00001b00: MSTORE 00001b01: PUSH1 0x04 00001b03: ADD 00001b04: PUSH1 0x40 00001b06: MLOAD 00001b07: DUP1 00001b08: SWAP2 00001b09: SUB 00001b0a: SWAP1 00001b0b: REVERT 00001b0c: JUMPDEST 00001b0d: PUSH2 0x0d45 00001b10: DUP3 00001b11: DUP3 00001b12: PUSH2 0x2398 00001b15: JUMP 00001b16: JUMPDEST 00001b17: PUSH1 0x00 00001b19: PUSH2 0x1b21 00001b1c: DUP2 00001b1d: PUSH2 0x1e8a 00001b20: JUMP 00001b21: JUMPDEST 00001b22: PUSH2 0x0cd2 00001b25: PUSH2 0x23bd 00001b28: JUMP 00001b29: JUMPDEST 00001b2a: PUSH1 0x08 00001b2c: DUP2 00001b2d: PUSH1 0x04 00001b2f: DUP2 00001b30: LT 00001b31: PUSH2 0x0d59 00001b34: JUMPI 00001b35: PUSH1 0x00 00001b37: DUP1 00001b38: REVERT 00001b39: JUMPDEST 00001b3a: PUSH1 0x18 00001b3c: DUP2 00001b3d: PUSH1 0x04 00001b3f: DUP2 00001b40: LT 00001b41: PUSH2 0x0d59 00001b44: JUMPI 00001b45: PUSH1 0x00 00001b47: DUP1 00001b48: REVERT 00001b49: JUMPDEST 00001b4a: PUSH1 0x00 00001b4c: PUSH2 0x1b54 00001b4f: DUP2 00001b50: PUSH2 0x1e8a 00001b53: JUMP 00001b54: JUMPDEST 00001b55: PUSH1 0x00 00001b57: JUMPDEST 00001b58: PUSH1 0x04 00001b5a: DUP2 00001b5b: LT 00001b5c: ISZERO 00001b5d: PUSH2 0x1ba2 00001b60: JUMPI 00001b61: PUSH3 0x0f4240 00001b65: DUP4 00001b66: DUP3 00001b67: PUSH1 0x04 00001b69: DUP2 00001b6a: LT 00001b6b: PUSH2 0x1b76 00001b6e: JUMPI 00001b6f: PUSH2 0x1b76 00001b72: PUSH2 0x3b52 00001b75: JUMP 00001b76: JUMPDEST 00001b77: PUSH1 0x20 00001b79: MUL 00001b7a: ADD 00001b7b: CALLDATALOAD 00001b7c: GT 00001b7d: ISZERO 00001b7e: PUSH2 0x1b9a 00001b81: JUMPI 00001b82: PUSH1 0x40 00001b84: MLOAD 00001b85: PUSH4 0x5c974e3d 00001b8a: PUSH1 0xe1 00001b8c: SHL 00001b8d: DUP2 00001b8e: MSTORE 00001b8f: PUSH1 0x04 00001b91: ADD 00001b92: PUSH1 0x40 00001b94: MLOAD 00001b95: DUP1 00001b96: SWAP2 00001b97: SUB 00001b98: SWAP1 00001b99: REVERT 00001b9a: JUMPDEST 00001b9b: PUSH1 0x01 00001b9d: ADD 00001b9e: PUSH2 0x1b57 00001ba1: JUMP 00001ba2: JUMPDEST 00001ba3: POP 00001ba4: PUSH2 0x1bb0 00001ba7: PUSH1 0x08 00001ba9: DUP4 00001baa: PUSH1 0x04 00001bac: PUSH2 0x34f6 00001baf: JUMP 00001bb0: JUMPDEST 00001bb1: POP 00001bb2: PUSH32 0x68f87e434983087aebcfc2f1224d675931bc31f0a9f3632fd22c69ad08aa2cbb 00001bd3: DUP3 00001bd4: PUSH1 0x40 00001bd6: MLOAD 00001bd7: PUSH2 0x0d11 00001bda: SWAP2 00001bdb: SWAP1 00001bdc: PUSH2 0x3d23 00001bdf: JUMP 00001be0: JUMPDEST 00001be1: PUSH1 0x00 00001be3: PUSH2 0x1beb 00001be6: DUP2 00001be7: PUSH2 0x1e8a 00001bea: JUMP 00001beb: JUMPDEST 00001bec: PUSH2 0x1bf8 00001bef: PUSH1 0x1c 00001bf1: DUP4 00001bf2: PUSH1 0x04 00001bf4: PUSH2 0x34f6 00001bf7: JUMP 00001bf8: JUMPDEST 00001bf9: POP 00001bfa: PUSH32 0xf08e39565c9237a3c6ff674a763abe2c6a4be95d39ef8e22db5edbb9d6e13632 00001c1b: DUP3 00001c1c: PUSH1 0x40 00001c1e: MLOAD 00001c1f: PUSH2 0x0d11 00001c22: SWAP2 00001c23: SWAP1 00001c24: PUSH2 0x3d23 00001c27: JUMP 00001c28: JUMPDEST 00001c29: PUSH1 0x00 00001c2b: PUSH1 0x01 00001c2d: PUSH1 0x01 00001c2f: PUSH1 0xe0 00001c31: SHL 00001c32: SUB 00001c33: NOT 00001c34: DUP3 00001c35: AND 00001c36: PUSH4 0x7965db0b 00001c3b: PUSH1 0xe0 00001c3d: SHL 00001c3e: EQ 00001c3f: DUP1 00001c40: PUSH2 0x0ad0 00001c43: JUMPI 00001c44: POP 00001c45: PUSH4 0x01ffc9a7 00001c4a: PUSH1 0xe0 00001c4c: SHL 00001c4d: PUSH1 0x01 00001c4f: PUSH1 0x01 00001c51: PUSH1 0xe0 00001c53: SHL 00001c54: SUB 00001c55: NOT 00001c56: DUP4 00001c57: AND 00001c58: EQ 00001c59: PUSH2 0x0ad0 00001c5c: JUMP 00001c5d: JUMPDEST 00001c5e: PUSH1 0x40 00001c60: DUP1 00001c61: MLOAD 00001c62: PUSH32 0x3ae15b903b0ac48ca42840358899ad2501724741924507a38b5e4f1c9ef1508c 00001c83: PUSH1 0x20 00001c85: DUP1 00001c86: DUP4 00001c87: ADD 00001c88: SWAP2 00001c89: SWAP1 00001c8a: SWAP2 00001c8b: MSTORE 00001c8c: PUSH1 0x01 00001c8e: PUSH1 0x01 00001c90: PUSH1 0xa0 00001c92: SHL 00001c93: SUB 00001c94: DUP1 00001c95: DUP14 00001c96: AND 00001c97: DUP4 00001c98: DUP6 00001c99: ADD 00001c9a: MSTORE 00001c9b: DUP9 00001c9c: AND 00001c9d: PUSH1 0x60 00001c9f: DUP4 00001ca0: ADD 00001ca1: MSTORE 00001ca2: PUSH1 0x80 00001ca4: DUP3 00001ca5: ADD 00001ca6: DUP8 00001ca7: SWAP1 00001ca8: MSTORE 00001ca9: PUSH1 0xa0 00001cab: DUP3 00001cac: ADD 00001cad: DUP7 00001cae: SWAP1 00001caf: MSTORE 00001cb0: PUSH1 0xc0 00001cb2: DUP1 00001cb3: DUP4 00001cb4: ADD 00001cb5: DUP7 00001cb6: SWAP1 00001cb7: MSTORE 00001cb8: DUP4 00001cb9: MLOAD 00001cba: DUP1 00001cbb: DUP5 00001cbc: SUB 00001cbd: SWAP1 00001cbe: SWAP2 00001cbf: ADD 00001cc0: DUP2 00001cc1: MSTORE 00001cc2: PUSH1 0xe0 00001cc4: SWAP1 00001cc5: SWAP3 00001cc6: ADD 00001cc7: SWAP1 00001cc8: SWAP3 00001cc9: MSTORE 00001cca: DUP1 00001ccb: MLOAD 00001ccc: SWAP2 00001ccd: ADD 00001cce: KECCAK256 00001ccf: PUSH2 0x1cd9 00001cd2: DUP2 00001cd3: DUP5 00001cd4: DUP5 00001cd5: PUSH2 0x23c8 00001cd8: JUMP 00001cd9: JUMPDEST 00001cda: POP 00001cdb: PUSH2 0x1ce3 00001cde: DUP8 00001cdf: PUSH2 0x2467 00001ce2: JUMP 00001ce3: JUMPDEST 00001ce4: PUSH1 0x00 00001ce6: PUSH2 0x1cef 00001ce9: DUP11 00001cea: DUP10 00001ceb: PUSH2 0x252f 00001cee: JUMP 00001cef: JUMPDEST 00001cf0: SWAP1 00001cf1: POP 00001cf2: PUSH1 0x01 00001cf4: PUSH1 0x01 00001cf6: PUSH1 0xa0 00001cf8: SHL 00001cf9: SUB 00001cfa: DUP7 00001cfb: AND 00001cfc: PUSH2 0x1da8 00001cff: JUMPI 00001d00: DUP7 00001d01: CALLVALUE 00001d02: LT 00001d03: ISZERO 00001d04: PUSH2 0x1d20 00001d07: JUMPI 00001d08: PUSH1 0x40 00001d0a: MLOAD 00001d0b: PUSH4 0xbb201b49 00001d10: PUSH1 0xe0 00001d12: SHL 00001d13: DUP2 00001d14: MSTORE 00001d15: PUSH1 0x04 00001d17: ADD 00001d18: PUSH1 0x40 00001d1a: MLOAD 00001d1b: DUP1 00001d1c: SWAP2 00001d1d: SUB 00001d1e: SWAP1 00001d1f: REVERT 00001d20: JUMPDEST 00001d21: DUP7 00001d22: CALLVALUE 00001d23: GT 00001d24: ISZERO 00001d25: PUSH2 0x1da3 00001d28: JUMPI 00001d29: PUSH1 0x00 00001d2b: PUSH1 0x01 00001d2d: PUSH1 0x01 00001d2f: PUSH1 0xa0 00001d31: SHL 00001d32: SUB 00001d33: DUP12 00001d34: AND 00001d35: PUSH2 0x1d3e 00001d38: DUP10 00001d39: CALLVALUE 00001d3a: PUSH2 0x3d04 00001d3d: JUMP 00001d3e: JUMPDEST 00001d3f: PUSH1 0x40 00001d41: MLOAD 00001d42: PUSH1 0x00 00001d44: DUP2 00001d45: DUP2 00001d46: DUP2 00001d47: DUP6 00001d48: DUP8 00001d49: GAS 00001d4a: CALL 00001d4b: SWAP3 00001d4c: POP 00001d4d: POP 00001d4e: POP 00001d4f: RETURNDATASIZE 00001d50: DUP1 00001d51: PUSH1 0x00 00001d53: DUP2 00001d54: EQ 00001d55: PUSH2 0x1d7a 00001d58: JUMPI 00001d59: PUSH1 0x40 00001d5b: MLOAD 00001d5c: SWAP2 00001d5d: POP 00001d5e: PUSH1 0x1f 00001d60: NOT 00001d61: PUSH1 0x3f 00001d63: RETURNDATASIZE 00001d64: ADD 00001d65: AND 00001d66: DUP3 00001d67: ADD 00001d68: PUSH1 0x40 00001d6a: MSTORE 00001d6b: RETURNDATASIZE 00001d6c: DUP3 00001d6d: MSTORE 00001d6e: RETURNDATASIZE 00001d6f: PUSH1 0x00 00001d71: PUSH1 0x20 00001d73: DUP5 00001d74: ADD 00001d75: RETURNDATACOPY 00001d76: PUSH2 0x1d7f 00001d79: JUMP 00001d7a: JUMPDEST 00001d7b: PUSH1 0x60 00001d7d: SWAP2 00001d7e: POP 00001d7f: JUMPDEST 00001d80: POP 00001d81: POP 00001d82: SWAP1 00001d83: POP 00001d84: DUP1 00001d85: PUSH2 0x1da1 00001d88: JUMPI 00001d89: PUSH1 0x40 00001d8b: MLOAD 00001d8c: PUSH4 0x4c67134d 00001d91: PUSH1 0xe1 00001d93: SHL 00001d94: DUP2 00001d95: MSTORE 00001d96: PUSH1 0x04 00001d98: ADD 00001d99: PUSH1 0x40 00001d9b: MLOAD 00001d9c: DUP1 00001d9d: SWAP2 00001d9e: SUB 00001d9f: SWAP1 00001da0: REVERT 00001da1: JUMPDEST 00001da2: POP 00001da3: JUMPDEST 00001da4: PUSH2 0x1ddc 00001da7: JUMP 00001da8: JUMPDEST 00001da9: CALLVALUE 00001daa: ISZERO 00001dab: PUSH2 0x1dc7 00001dae: JUMPI 00001daf: PUSH1 0x40 00001db1: MLOAD 00001db2: PUSH4 0xbb201b49 00001db7: PUSH1 0xe0 00001db9: SHL 00001dba: DUP2 00001dbb: MSTORE 00001dbc: PUSH1 0x04 00001dbe: ADD 00001dbf: PUSH1 0x40 00001dc1: MLOAD 00001dc2: DUP1 00001dc3: SWAP2 00001dc4: SUB 00001dc5: SWAP1 00001dc6: REVERT 00001dc7: JUMPDEST 00001dc8: PUSH2 0x1ddc 00001dcb: PUSH1 0x01 00001dcd: PUSH1 0x01 00001dcf: PUSH1 0xa0 00001dd1: SHL 00001dd2: SUB 00001dd3: DUP8 00001dd4: AND 00001dd5: DUP12 00001dd6: ADDRESS 00001dd7: DUP11 00001dd8: PUSH2 0x2591 00001ddb: JUMP 00001ddc: JUMPDEST 00001ddd: PUSH2 0x1e1b 00001de0: DUP11 00001de1: PUSH2 0x1dea 00001de4: DUP4 00001de5: DUP12 00001de6: PUSH2 0x3d7f 00001de9: JUMP 00001dea: JUMPDEST 00001deb: PUSH1 0x01 00001ded: PUSH1 0x01 00001def: PUSH1 0xa0 00001df1: SHL 00001df2: SUB 00001df3: PUSH32 0x000000000000000000000000024475619e5d37cf7b5b445e943dbeb7edd2f408 00001e14: AND 00001e15: SWAP2 00001e16: SWAP1 00001e17: PUSH2 0x1f04 00001e1a: JUMP 00001e1b: JUMPDEST 00001e1c: PUSH2 0x1e26 00001e1f: DUP11 00001e20: DUP11 00001e21: DUP11 00001e22: PUSH2 0x25ca 00001e25: JUMP 00001e26: JUMPDEST 00001e27: PUSH2 0x1e32 00001e2a: DUP11 00001e2b: DUP9 00001e2c: DUP9 00001e2d: DUP9 00001e2e: PUSH2 0x28ef 00001e31: JUMP 00001e32: JUMPDEST 00001e33: PUSH1 0x40 00001e35: DUP1 00001e36: MLOAD 00001e37: DUP10 00001e38: DUP2 00001e39: MSTORE 00001e3a: PUSH1 0x20 00001e3c: DUP2 00001e3d: ADD 00001e3e: DUP4 00001e3f: SWAP1 00001e40: MSTORE 00001e41: SWAP1 00001e42: DUP2 00001e43: ADD 00001e44: DUP9 00001e45: SWAP1 00001e46: MSTORE 00001e47: PUSH1 0x01 00001e49: PUSH1 0x01 00001e4b: PUSH1 0xa0 00001e4d: SHL 00001e4e: SUB 00001e4f: DUP12 00001e50: AND 00001e51: SWAP1 00001e52: PUSH32 0x2b0c4dfbf2e34a2292e9110d6ea90d7c78f54b3aebe3974d2db7197308f21ff8 00001e73: SWAP1 00001e74: PUSH1 0x60 00001e76: ADD 00001e77: PUSH1 0x40 00001e79: MLOAD 00001e7a: DUP1 00001e7b: SWAP2 00001e7c: SUB 00001e7d: SWAP1 00001e7e: LOG2 00001e7f: POP 00001e80: POP 00001e81: POP 00001e82: POP 00001e83: POP 00001e84: POP 00001e85: POP 00001e86: POP 00001e87: POP 00001e88: POP 00001e89: JUMP 00001e8a: JUMPDEST 00001e8b: PUSH2 0x0cd2 00001e8e: DUP2 00001e8f: CALLER 00001e90: PUSH2 0x2b65 00001e93: JUMP 00001e94: JUMPDEST 00001e95: PUSH2 0x1e9f 00001e98: PUSH1 0x00 00001e9a: DUP1 00001e9b: PUSH2 0x2b9e 00001e9e: JUMP 00001e9f: JUMPDEST 00001ea0: JUMP 00001ea1: JUMPDEST 00001ea2: PUSH1 0x00 00001ea4: DUP3 00001ea5: DUP2 00001ea6: MSTORE 00001ea7: PUSH1 0x20 00001ea9: DUP2 00001eaa: SWAP1 00001eab: MSTORE 00001eac: PUSH1 0x40 00001eae: SWAP1 00001eaf: KECCAK256 00001eb0: PUSH1 0x01 00001eb2: ADD 00001eb3: SLOAD 00001eb4: PUSH2 0x1ebc 00001eb7: DUP2 00001eb8: PUSH2 0x1e8a 00001ebb: JUMP 00001ebc: JUMPDEST 00001ebd: PUSH2 0x1ec6 00001ec0: DUP4 00001ec1: DUP4 00001ec2: PUSH2 0x2297 00001ec5: JUMP 00001ec6: JUMPDEST 00001ec7: POP 00001ec8: POP 00001ec9: POP 00001eca: POP 00001ecb: JUMP 00001ecc: JUMPDEST 00001ecd: PUSH1 0x01 00001ecf: PUSH1 0x01 00001ed1: PUSH1 0xa0 00001ed3: SHL 00001ed4: SUB 00001ed5: DUP2 00001ed6: AND 00001ed7: CALLER 00001ed8: EQ 00001ed9: PUSH2 0x1ef5 00001edc: JUMPI 00001edd: PUSH1 0x40 00001edf: MLOAD 00001ee0: PUSH4 0x334bd919 00001ee5: PUSH1 0xe1 00001ee7: SHL 00001ee8: DUP2 00001ee9: MSTORE 00001eea: PUSH1 0x04 00001eec: ADD 00001eed: PUSH1 0x40 00001eef: MLOAD 00001ef0: DUP1 00001ef1: SWAP2 00001ef2: SUB 00001ef3: SWAP1 00001ef4: REVERT 00001ef5: JUMPDEST 00001ef6: PUSH2 0x1eff 00001ef9: DUP3 00001efa: DUP3 00001efb: PUSH2 0x2253 00001efe: JUMP 00001eff: JUMPDEST 00001f00: POP 00001f01: POP 00001f02: POP 00001f03: JUMP 00001f04: JUMPDEST 00001f05: PUSH1 0x40 00001f07: MLOAD 00001f08: PUSH1 0x01 00001f0a: PUSH1 0x01 00001f0c: PUSH1 0xa0 00001f0e: SHL 00001f0f: SUB 00001f10: DUP4 00001f11: DUP2 00001f12: AND 00001f13: PUSH1 0x24 00001f15: DUP4 00001f16: ADD 00001f17: MSTORE 00001f18: PUSH1 0x44 00001f1a: DUP3 00001f1b: ADD 00001f1c: DUP4 00001f1d: SWAP1 00001f1e: MSTORE 00001f1f: PUSH2 0x1eff 00001f22: SWAP2 00001f23: DUP6 00001f24: SWAP2 00001f25: DUP3 00001f26: AND 00001f27: SWAP1 00001f28: PUSH4 0xa9059cbb 00001f2d: SWAP1 00001f2e: PUSH1 0x64 00001f30: ADD 00001f31: JUMPDEST 00001f32: PUSH1 0x40 00001f34: MLOAD 00001f35: PUSH1 0x20 00001f37: DUP2 00001f38: DUP4 00001f39: SUB 00001f3a: SUB 00001f3b: DUP2 00001f3c: MSTORE 00001f3d: SWAP1 00001f3e: PUSH1 0x40 00001f40: MSTORE 00001f41: SWAP2 00001f42: POP 00001f43: PUSH1 0xe0 00001f45: SHL 00001f46: PUSH1 0x20 00001f48: DUP3 00001f49: ADD 00001f4a: DUP1 00001f4b: MLOAD 00001f4c: PUSH1 0x01 00001f4e: PUSH1 0x01 00001f50: PUSH1 0xe0 00001f52: SHL 00001f53: SUB 00001f54: DUP4 00001f55: DUP2 00001f56: DUP4 00001f57: AND 00001f58: OR 00001f59: DUP4 00001f5a: MSTORE 00001f5b: POP 00001f5c: POP 00001f5d: POP 00001f5e: POP 00001f5f: PUSH2 0x2c5e 00001f62: JUMP 00001f63: JUMPDEST 00001f64: PUSH1 0x00 00001f66: PUSH2 0x1f6d 00001f69: PUSH2 0x1a2e 00001f6c: JUMP 00001f6d: JUMPDEST 00001f6e: PUSH2 0x1f76 00001f71: TIMESTAMP 00001f72: PUSH2 0x2ccf 00001f75: JUMP 00001f76: JUMPDEST 00001f77: PUSH2 0x1f80 00001f7a: SWAP2 00001f7b: SWAP1 00001f7c: PUSH2 0x3d92 00001f7f: JUMP 00001f80: JUMPDEST 00001f81: SWAP1 00001f82: POP 00001f83: PUSH2 0x1f8c 00001f86: DUP3 00001f87: DUP3 00001f88: PUSH2 0x2d06 00001f8b: JUMP 00001f8c: JUMPDEST 00001f8d: PUSH1 0x40 00001f8f: MLOAD 00001f90: PUSH6 0xffffffffffff 00001f97: DUP3 00001f98: AND 00001f99: DUP2 00001f9a: MSTORE 00001f9b: PUSH1 0x01 00001f9d: PUSH1 0x01 00001f9f: PUSH1 0xa0 00001fa1: SHL 00001fa2: SUB 00001fa3: DUP4 00001fa4: AND 00001fa5: SWAP1 00001fa6: PUSH32 0x3377dc44241e779dd06afab5b788a35ca5f3b778836e2990bdb26a2a4b2e5ed6 00001fc7: SWAP1 00001fc8: PUSH1 0x20 00001fca: ADD 00001fcb: PUSH1 0x40 00001fcd: MLOAD 00001fce: DUP1 00001fcf: SWAP2 00001fd0: SUB 00001fd1: SWAP1 00001fd2: LOG2 00001fd3: POP 00001fd4: POP 00001fd5: JUMP 00001fd6: JUMPDEST 00001fd7: PUSH1 0x00 00001fd9: PUSH2 0x1fe1 00001fdc: DUP3 00001fdd: PUSH2 0x2d85 00001fe0: JUMP 00001fe1: JUMPDEST 00001fe2: PUSH2 0x1fea 00001fe5: TIMESTAMP 00001fe6: PUSH2 0x2ccf 00001fe9: JUMP 00001fea: JUMPDEST 00001feb: PUSH2 0x1ff4 00001fee: SWAP2 00001fef: SWAP1 00001ff0: PUSH2 0x3d92 00001ff3: JUMP 00001ff4: JUMPDEST 00001ff5: SWAP1 00001ff6: POP 00001ff7: PUSH2 0x2000 00001ffa: DUP3 00001ffb: DUP3 00001ffc: PUSH2 0x2b9e 00001fff: JUMP 00002000: JUMPDEST 00002001: PUSH1 0x40 00002003: DUP1 00002004: MLOAD 00002005: PUSH6 0xffffffffffff 0000200c: DUP1 0000200d: DUP6 0000200e: AND 0000200f: DUP3 00002010: MSTORE 00002011: DUP4 00002012: AND 00002013: PUSH1 0x20 00002015: DUP3 00002016: ADD 00002017: MSTORE 00002018: PUSH32 0xf1038c18cf84a56e432fdbfaf746924b7ea511dfe03a6506a0ceba4888788d9b 00002039: SWAP2 0000203a: ADD 0000203b: PUSH2 0x0d11 0000203e: JUMP 0000203f: JUMPDEST 00002040: PUSH1 0x60 00002042: PUSH2 0x1336 00002045: PUSH32 0x436f6c6c656374697665204d696e642041492053616c65000000000000000017 00002066: PUSH1 0x03 00002068: PUSH2 0x2dcd 0000206b: JUMP 0000206c: JUMPDEST 0000206d: PUSH1 0x60 0000206f: PUSH2 0x1336 00002072: PUSH32 0x3100000000000000000000000000000000000000000000000000000000000001 00002093: PUSH1 0x04 00002095: PUSH2 0x2dcd 00002098: JUMP 00002099: JUMPDEST 0000209a: PUSH2 0x20a3 0000209d: DUP5 0000209e: DUP5 0000209f: PUSH2 0x2e78 000020a2: JUMP 000020a3: JUMPDEST 000020a4: PUSH2 0x20d8 000020a7: PUSH1 0x01 000020a9: PUSH1 0x01 000020ab: PUSH1 0xa0 000020ad: SHL 000020ae: SUB 000020af: PUSH32 0x000000000000000000000000024475619e5d37cf7b5b445e943dbeb7edd2f408 000020d0: AND 000020d1: DUP6 000020d2: ADDRESS 000020d3: DUP7 000020d4: PUSH2 0x2591 000020d7: JUMP 000020d8: JUMPDEST 000020d9: PUSH1 0x01 000020db: PUSH1 0x01 000020dd: PUSH1 0xa0 000020df: SHL 000020e0: SUB 000020e1: DUP2 000020e2: AND 000020e3: PUSH2 0x2160 000020e6: JUMPI 000020e7: PUSH1 0x00 000020e9: DUP5 000020ea: PUSH1 0x01 000020ec: PUSH1 0x01 000020ee: PUSH1 0xa0 000020f0: SHL 000020f1: SUB 000020f2: AND 000020f3: DUP4 000020f4: PUSH1 0x40 000020f6: MLOAD 000020f7: PUSH1 0x00 000020f9: PUSH1 0x40 000020fb: MLOAD 000020fc: DUP1 000020fd: DUP4 000020fe: SUB 000020ff: DUP2 00002100: DUP6 00002101: DUP8 00002102: GAS 00002103: CALL 00002104: SWAP3 00002105: POP 00002106: POP 00002107: POP 00002108: RETURNDATASIZE 00002109: DUP1 0000210a: PUSH1 0x00 0000210c: DUP2 0000210d: EQ 0000210e: PUSH2 0x2133 00002111: JUMPI 00002112: PUSH1 0x40 00002114: MLOAD 00002115: SWAP2 00002116: POP 00002117: PUSH1 0x1f 00002119: NOT 0000211a: PUSH1 0x3f 0000211c: RETURNDATASIZE 0000211d: ADD 0000211e: AND 0000211f: DUP3 00002120: ADD 00002121: PUSH1 0x40 00002123: MSTORE 00002124: RETURNDATASIZE 00002125: DUP3 00002126: MSTORE 00002127: RETURNDATASIZE 00002128: PUSH1 0x00 0000212a: PUSH1 0x20 0000212c: DUP5 0000212d: ADD 0000212e: RETURNDATACOPY 0000212f: PUSH2 0x2138 00002132: JUMP 00002133: JUMPDEST 00002134: PUSH1 0x60 00002136: SWAP2 00002137: POP 00002138: JUMPDEST 00002139: POP 0000213a: POP 0000213b: SWAP1 0000213c: POP 0000213d: DUP1 0000213e: PUSH2 0x215a 00002141: JUMPI 00002142: PUSH1 0x40 00002144: MLOAD 00002145: PUSH4 0x4c67134d 0000214a: PUSH1 0xe1 0000214c: SHL 0000214d: DUP2 0000214e: MSTORE 0000214f: PUSH1 0x04 00002151: ADD 00002152: PUSH1 0x40 00002154: MLOAD 00002155: DUP1 00002156: SWAP2 00002157: SUB 00002158: SWAP1 00002159: REVERT 0000215a: JUMPDEST 0000215b: POP 0000215c: PUSH2 0x2174 0000215f: JUMP 00002160: JUMPDEST 00002161: PUSH2 0x2174 00002164: PUSH1 0x01 00002166: PUSH1 0x01 00002168: PUSH1 0xa0 0000216a: SHL 0000216b: SUB 0000216c: DUP3 0000216d: AND 0000216e: DUP6 0000216f: DUP5 00002170: PUSH2 0x1f04 00002173: JUMP 00002174: JUMPDEST 00002175: PUSH1 0x40 00002177: DUP1 00002178: MLOAD 00002179: DUP5 0000217a: DUP2 0000217b: MSTORE 0000217c: PUSH1 0x20 0000217e: DUP2 0000217f: ADD 00002180: DUP5 00002181: SWAP1 00002182: MSTORE 00002183: PUSH1 0x01 00002185: PUSH1 0x01 00002187: PUSH1 0xa0 00002189: SHL 0000218a: SUB 0000218b: DUP7 0000218c: AND 0000218d: SWAP2 0000218e: PUSH32 0x35ea94addbc62df281ade49cc2ad9b3d9259166170cf702928b4ddc045f7256e 000021af: SWAP2 000021b0: ADD 000021b1: PUSH1 0x40 000021b3: MLOAD 000021b4: DUP1 000021b5: SWAP2 000021b6: SUB 000021b7: SWAP1 000021b8: LOG2 000021b9: POP 000021ba: POP 000021bb: POP 000021bc: POP 000021bd: JUMP 000021be: JUMPDEST 000021bf: PUSH1 0x07 000021c1: SLOAD 000021c2: DUP5 000021c3: EQ 000021c4: ISZERO 000021c5: DUP1 000021c6: PUSH2 0x21cf 000021c9: JUMPI 000021ca: POP 000021cb: DUP4 000021cc: DUP3 000021cd: EQ 000021ce: ISZERO 000021cf: JUMPDEST 000021d0: ISZERO 000021d1: PUSH2 0x21ed 000021d4: JUMPI 000021d5: PUSH1 0x40 000021d7: MLOAD 000021d8: PUSH4 0x4ec48105 000021dd: PUSH1 0xe1 000021df: SHL 000021e0: DUP2 000021e1: MSTORE 000021e2: PUSH1 0x04 000021e4: ADD 000021e5: PUSH1 0x40 000021e7: MLOAD 000021e8: DUP1 000021e9: SWAP2 000021ea: SUB 000021eb: SWAP1 000021ec: REVERT 000021ed: JUMPDEST 000021ee: PUSH2 0x21f9 000021f1: PUSH1 0x05 000021f3: DUP7 000021f4: DUP7 000021f5: PUSH2 0x3583 000021f8: JUMP 000021f9: JUMPDEST 000021fa: POP 000021fb: PUSH2 0x2206 000021fe: PUSH1 0x06 00002200: DUP5 00002201: DUP5 00002202: PUSH2 0x3583 00002205: JUMP 00002206: JUMPDEST 00002207: POP 00002208: PUSH1 0x20 0000220a: DUP2 0000220b: SWAP1 0000220c: SSTORE 0000220d: PUSH1 0x40 0000220f: MLOAD 00002210: PUSH32 0xe7665182a9b510cbd21318ff5dba2977e73bdf425912faf311ec7a261f838b89 00002231: SWAP1 00002232: PUSH2 0x2244 00002235: SWAP1 00002236: DUP8 00002237: SWAP1 00002238: DUP8 00002239: SWAP1 0000223a: DUP8 0000223b: SWAP1 0000223c: DUP8 0000223d: SWAP1 0000223e: DUP8 0000223f: SWAP1 00002240: PUSH2 0x3de2 00002243: JUMP 00002244: JUMPDEST 00002245: PUSH1 0x40 00002247: MLOAD 00002248: DUP1 00002249: SWAP2 0000224a: SUB 0000224b: SWAP1 0000224c: LOG1 0000224d: POP 0000224e: POP 0000224f: POP 00002250: POP 00002251: POP 00002252: JUMP 00002253: JUMPDEST 00002254: PUSH1 0x00 00002256: DUP3 00002257: ISZERO 00002258: DUP1 00002259: ISZERO 0000225a: PUSH2 0x2270 0000225d: JUMPI 0000225e: POP 0000225f: PUSH1 0x02 00002261: SLOAD 00002262: PUSH1 0x01 00002264: PUSH1 0x01 00002266: PUSH1 0xa0 00002268: SHL 00002269: SUB 0000226a: DUP4 0000226b: DUP2 0000226c: AND 0000226d: SWAP2 0000226e: AND 0000226f: EQ 00002270: JUMPDEST 00002271: ISZERO 00002272: PUSH2 0x2286 00002275: JUMPI 00002276: PUSH1 0x02 00002278: DUP1 00002279: SLOAD 0000227a: PUSH1 0x01 0000227c: PUSH1 0x01 0000227e: PUSH1 0xa0 00002280: SHL 00002281: SUB 00002282: NOT 00002283: AND 00002284: SWAP1 00002285: SSTORE 00002286: JUMPDEST 00002287: PUSH2 0x2290 0000228a: DUP4 0000228b: DUP4 0000228c: PUSH2 0x2ef5 0000228f: JUMP 00002290: JUMPDEST 00002291: SWAP4 00002292: SWAP3 00002293: POP 00002294: POP 00002295: POP 00002296: JUMP 00002297: JUMPDEST 00002298: PUSH1 0x00 0000229a: DUP3 0000229b: PUSH2 0x22f5 0000229e: JUMPI 0000229f: PUSH1 0x00 000022a1: PUSH2 0x22b2 000022a4: PUSH1 0x02 000022a6: SLOAD 000022a7: PUSH1 0x01 000022a9: PUSH1 0x01 000022ab: PUSH1 0xa0 000022ad: SHL 000022ae: SUB 000022af: AND 000022b0: SWAP1 000022b1: JUMP 000022b2: JUMPDEST 000022b3: PUSH1 0x01 000022b5: PUSH1 0x01 000022b7: PUSH1 0xa0 000022b9: SHL 000022ba: SUB 000022bb: AND 000022bc: EQ 000022bd: PUSH2 0x22d9 000022c0: JUMPI 000022c1: PUSH1 0x40 000022c3: MLOAD 000022c4: PUSH4 0x1fe1e13d 000022c9: PUSH1 0xe1 000022cb: SHL 000022cc: DUP2 000022cd: MSTORE 000022ce: PUSH1 0x04 000022d0: ADD 000022d1: PUSH1 0x40 000022d3: MLOAD 000022d4: DUP1 000022d5: SWAP2 000022d6: SUB 000022d7: SWAP1 000022d8: REVERT 000022d9: JUMPDEST 000022da: PUSH1 0x02 000022dc: DUP1 000022dd: SLOAD 000022de: PUSH1 0x01 000022e0: PUSH1 0x01 000022e2: PUSH1 0xa0 000022e4: SHL 000022e5: SUB 000022e6: NOT 000022e7: AND 000022e8: PUSH1 0x01 000022ea: PUSH1 0x01 000022ec: PUSH1 0xa0 000022ee: SHL 000022ef: SUB 000022f0: DUP5 000022f1: AND 000022f2: OR 000022f3: SWAP1 000022f4: SSTORE 000022f5: JUMPDEST 000022f6: PUSH2 0x2290 000022f9: DUP4 000022fa: DUP4 000022fb: PUSH2 0x2f68 000022fe: JUMP 000022ff: JUMPDEST 00002300: PUSH1 0x00 00002302: DUP1 00002303: PUSH2 0x230a 00002306: PUSH2 0x1acd 00002309: JUMP 0000230a: JUMPDEST 0000230b: SWAP2 0000230c: POP 0000230d: SWAP2 0000230e: POP 0000230f: PUSH2 0x231f 00002312: DUP2 00002313: PUSH6 0xffffffffffff 0000231a: AND 0000231b: ISZERO 0000231c: ISZERO 0000231d: SWAP1 0000231e: JUMP 0000231f: JUMPDEST 00002320: ISZERO 00002321: DUP1 00002322: PUSH2 0x2333 00002325: JUMPI 00002326: POP 00002327: TIMESTAMP 00002328: PUSH6 0xffffffffffff 0000232f: DUP3 00002330: AND 00002331: LT 00002332: ISZERO 00002333: JUMPDEST 00002334: ISZERO 00002335: PUSH2 0x235b 00002338: JUMPI 00002339: PUSH1 0x40 0000233b: MLOAD 0000233c: PUSH4 0x19ca5ebb 00002341: PUSH1 0xe0 00002343: SHL 00002344: DUP2 00002345: MSTORE 00002346: PUSH6 0xffffffffffff 0000234d: DUP3 0000234e: AND 0000234f: PUSH1 0x04 00002351: DUP3 00002352: ADD 00002353: MSTORE 00002354: PUSH1 0x24 00002356: ADD 00002357: PUSH2 0x0de4 0000235a: JUMP 0000235b: JUMPDEST 0000235c: PUSH2 0x2377 0000235f: PUSH1 0x00 00002361: PUSH2 0x2372 00002364: PUSH1 0x02 00002366: SLOAD 00002367: PUSH1 0x01 00002369: PUSH1 0x01 0000236b: PUSH1 0xa0 0000236d: SHL 0000236e: SUB 0000236f: AND 00002370: SWAP1 00002371: JUMP 00002372: JUMPDEST 00002373: PUSH2 0x2253 00002376: JUMP 00002377: JUMPDEST 00002378: POP 00002379: PUSH2 0x2383 0000237c: PUSH1 0x00 0000237e: DUP4 0000237f: PUSH2 0x2297 00002382: JUMP 00002383: JUMPDEST 00002384: POP 00002385: POP 00002386: PUSH1 0x01 00002388: DUP1 00002389: SLOAD 0000238a: PUSH1 0x01 0000238c: PUSH1 0x01 0000238e: PUSH1 0xd0 00002390: SHL 00002391: SUB 00002392: NOT 00002393: AND 00002394: SWAP1 00002395: SSTORE 00002396: POP 00002397: JUMP 00002398: JUMPDEST 00002399: PUSH1 0x00 0000239b: DUP3 0000239c: DUP2 0000239d: MSTORE 0000239e: PUSH1 0x20 000023a0: DUP2 000023a1: SWAP1 000023a2: MSTORE 000023a3: PUSH1 0x40 000023a5: SWAP1 000023a6: KECCAK256 000023a7: PUSH1 0x01 000023a9: ADD 000023aa: SLOAD 000023ab: PUSH2 0x23b3 000023ae: DUP2 000023af: PUSH2 0x1e8a 000023b2: JUMP 000023b3: JUMPDEST 000023b4: PUSH2 0x1ec6 000023b7: DUP4 000023b8: DUP4 000023b9: PUSH2 0x2253 000023bc: JUMP 000023bd: JUMPDEST 000023be: PUSH2 0x1e9f 000023c1: PUSH1 0x00 000023c3: DUP1 000023c4: PUSH2 0x2d06 000023c7: JUMP 000023c8: JUMPDEST 000023c9: PUSH1 0x00 000023cb: DUP3 000023cc: DUP2 000023cd: MSTORE 000023ce: PUSH1 0x28 000023d0: PUSH1 0x20 000023d2: MSTORE 000023d3: PUSH1 0x40 000023d5: SWAP1 000023d6: KECCAK256 000023d7: SLOAD 000023d8: PUSH1 0xff 000023da: AND 000023db: ISZERO 000023dc: PUSH2 0x23fb 000023df: JUMPI 000023e0: PUSH1 0x40 000023e2: MLOAD 000023e3: PUSH4 0x01c4fa3d 000023e8: PUSH1 0xe5 000023ea: SHL 000023eb: DUP2 000023ec: MSTORE 000023ed: PUSH1 0x04 000023ef: DUP2 000023f0: ADD 000023f1: DUP4 000023f2: SWAP1 000023f3: MSTORE 000023f4: PUSH1 0x24 000023f6: ADD 000023f7: PUSH2 0x0de4 000023fa: JUMP 000023fb: JUMPDEST 000023fc: PUSH1 0x00 000023fe: PUSH2 0x2406 00002401: DUP5 00002402: PUSH2 0x2ff2 00002405: JUMP 00002406: JUMPDEST 00002407: SWAP1 00002408: POP 00002409: PUSH1 0x00 0000240b: PUSH2 0x2414 0000240e: DUP3 0000240f: DUP5 00002410: PUSH2 0x301f 00002413: JUMP 00002414: JUMPDEST 00002415: PUSH1 0x26 00002417: SLOAD 00002418: SWAP1 00002419: SWAP2 0000241a: POP 0000241b: PUSH1 0x01 0000241d: PUSH1 0x01 0000241f: PUSH1 0xa0 00002421: SHL 00002422: SUB 00002423: DUP1 00002424: DUP4 00002425: AND 00002426: SWAP2 00002427: AND 00002428: EQ 00002429: PUSH2 0x2445 0000242c: JUMPI 0000242d: PUSH1 0x40 0000242f: MLOAD 00002430: PUSH4 0x8baa579f 00002435: PUSH1 0xe0 00002437: SHL 00002438: DUP2 00002439: MSTORE 0000243a: PUSH1 0x04 0000243c: ADD 0000243d: PUSH1 0x40 0000243f: MLOAD 00002440: DUP1 00002441: SWAP2 00002442: SUB 00002443: SWAP1 00002444: REVERT 00002445: JUMPDEST 00002446: POP 00002447: POP 00002448: POP 00002449: PUSH1 0x00 0000244b: DUP2 0000244c: DUP2 0000244d: MSTORE 0000244e: PUSH1 0x28 00002450: PUSH1 0x20 00002452: MSTORE 00002453: PUSH1 0x40 00002455: SWAP1 00002456: KECCAK256 00002457: DUP1 00002458: SLOAD 00002459: PUSH1 0xff 0000245b: NOT 0000245c: AND 0000245d: PUSH1 0x01 0000245f: OR 00002460: SWAP1 00002461: SSTORE 00002462: PUSH1 0x25 00002464: SSTORE 00002465: POP 00002466: JUMP 00002467: JUMPDEST 00002468: PUSH1 0x22 0000246a: SLOAD 0000246b: PUSH1 0x23 0000246d: SLOAD 0000246e: PUSH1 0x00 00002470: SWAP1 00002471: PUSH3 0x015180 00002475: SWAP1 00002476: PUSH2 0x24a0 00002479: SWAP1 0000247a: PUSH32 0x00000000000000000000000000000000000000000000000000000000686ff190 0000249b: SWAP1 0000249c: PUSH2 0x3d04 0000249f: JUMP 000024a0: JUMPDEST 000024a1: PUSH2 0x24aa 000024a4: SWAP2 000024a5: SWAP1 000024a6: PUSH2 0x3cae 000024a9: JUMP 000024aa: JUMPDEST 000024ab: PUSH3 0x015180 000024af: PUSH2 0x24d8 000024b2: PUSH32 0x00000000000000000000000000000000000000000000000000000000686ff190 000024d3: TIMESTAMP 000024d4: PUSH2 0x3d04 000024d7: JUMP 000024d8: JUMPDEST 000024d9: PUSH2 0x24e2 000024dc: SWAP2 000024dd: SWAP1 000024de: PUSH2 0x3cae 000024e1: JUMP 000024e2: JUMPDEST 000024e3: PUSH2 0x24ec 000024e6: SWAP2 000024e7: SWAP1 000024e8: PUSH2 0x3d04 000024eb: JUMP 000024ec: JUMPDEST 000024ed: GT 000024ee: ISZERO 000024ef: PUSH2 0x24fa 000024f2: JUMPI 000024f3: POP 000024f4: TIMESTAMP 000024f5: PUSH1 0x23 000024f7: SSTORE 000024f8: PUSH1 0x00 000024fa: JUMPDEST 000024fb: PUSH2 0x2504 000024fe: DUP3 000024ff: DUP3 00002500: PUSH2 0x3d7f 00002503: JUMP 00002504: JUMPDEST 00002505: SWAP1 00002506: POP 00002507: PUSH1 0x21 00002509: SLOAD 0000250a: DUP2 0000250b: GT 0000250c: ISZERO 0000250d: PUSH2 0x2529 00002510: JUMPI 00002511: PUSH1 0x40 00002513: MLOAD 00002514: PUSH4 0x9f77df07 00002519: PUSH1 0xe0 0000251b: SHL 0000251c: DUP2 0000251d: MSTORE 0000251e: PUSH1 0x04 00002520: ADD 00002521: PUSH1 0x40 00002523: MLOAD 00002524: DUP1 00002525: SWAP2 00002526: SUB 00002527: SWAP1 00002528: REVERT 00002529: JUMPDEST 0000252a: PUSH1 0x22 0000252c: SSTORE 0000252d: POP 0000252e: JUMP 0000252f: JUMPDEST 00002530: PUSH1 0x01 00002532: PUSH1 0x01 00002534: PUSH1 0xa0 00002536: SHL 00002537: SUB 00002538: DUP3 00002539: AND 0000253a: PUSH1 0x00 0000253c: SWAP1 0000253d: DUP2 0000253e: MSTORE 0000253f: PUSH1 0x27 00002541: PUSH1 0x20 00002543: MSTORE 00002544: PUSH1 0x40 00002546: DUP2 00002547: KECCAK256 00002548: SLOAD 00002549: PUSH1 0xff 0000254b: AND 0000254c: PUSH3 0x0f4240 00002550: PUSH1 0x08 00002552: DUP3 00002553: PUSH1 0x03 00002555: DUP2 00002556: GT 00002557: ISZERO 00002558: PUSH2 0x2563 0000255b: JUMPI 0000255c: PUSH2 0x2563 0000255f: PUSH2 0x3866 00002562: JUMP 00002563: JUMPDEST 00002564: PUSH1 0x04 00002566: DUP2 00002567: LT 00002568: PUSH2 0x2573 0000256b: JUMPI 0000256c: PUSH2 0x2573 0000256f: PUSH2 0x3b52 00002572: JUMP 00002573: JUMPDEST 00002574: ADD 00002575: SLOAD 00002576: PUSH2 0x257f 00002579: SWAP1 0000257a: DUP6 0000257b: PUSH2 0x3c97 0000257e: JUMP 0000257f: JUMPDEST 00002580: PUSH2 0x2589 00002583: SWAP2 00002584: SWAP1 00002585: PUSH2 0x3cae 00002588: JUMP 00002589: JUMPDEST 0000258a: SWAP5 0000258b: SWAP4 0000258c: POP 0000258d: POP 0000258e: POP 0000258f: POP 00002590: JUMP 00002591: JUMPDEST 00002592: PUSH1 0x40 00002594: MLOAD 00002595: PUSH1 0x01 00002597: PUSH1 0x01 00002599: PUSH1 0xa0 0000259b: SHL 0000259c: SUB 0000259d: DUP5 0000259e: DUP2 0000259f: AND 000025a0: PUSH1 0x24 000025a2: DUP4 000025a3: ADD 000025a4: MSTORE 000025a5: DUP4 000025a6: DUP2 000025a7: AND 000025a8: PUSH1 0x44 000025aa: DUP4 000025ab: ADD 000025ac: MSTORE 000025ad: PUSH1 0x64 000025af: DUP3 000025b0: ADD 000025b1: DUP4 000025b2: SWAP1 000025b3: MSTORE 000025b4: PUSH2 0x1ec6 000025b7: SWAP2 000025b8: DUP7 000025b9: SWAP2 000025ba: DUP3 000025bb: AND 000025bc: SWAP1 000025bd: PUSH4 0x23b872dd 000025c2: SWAP1 000025c3: PUSH1 0x84 000025c5: ADD 000025c6: PUSH2 0x1f31 000025c9: JUMP 000025ca: JUMPDEST 000025cb: PUSH1 0x01 000025cd: PUSH1 0x01 000025cf: PUSH1 0xa0 000025d1: SHL 000025d2: SUB 000025d3: DUP4 000025d4: AND 000025d5: PUSH1 0x00 000025d7: SWAP1 000025d8: DUP2 000025d9: MSTORE 000025da: PUSH1 0x27 000025dc: PUSH1 0x20 000025de: MSTORE 000025df: PUSH1 0x40 000025e1: DUP1 000025e2: DUP3 000025e3: KECCAK256 000025e4: DUP2 000025e5: MLOAD 000025e6: PUSH1 0xa0 000025e8: DUP2 000025e9: ADD 000025ea: SWAP1 000025eb: SWAP3 000025ec: MSTORE 000025ed: DUP1 000025ee: SLOAD 000025ef: DUP3 000025f0: SWAP1 000025f1: PUSH1 0xff 000025f3: AND 000025f4: PUSH1 0x03 000025f6: DUP2 000025f7: GT 000025f8: ISZERO 000025f9: PUSH2 0x2604 000025fc: JUMPI 000025fd: PUSH2 0x2604 00002600: PUSH2 0x3866 00002603: JUMP 00002604: JUMPDEST 00002605: PUSH1 0x03 00002607: DUP2 00002608: GT 00002609: ISZERO 0000260a: PUSH2 0x2615 0000260d: JUMPI 0000260e: PUSH2 0x2615 00002611: PUSH2 0x3866 00002614: JUMP 00002615: JUMPDEST 00002616: DUP2 00002617: MSTORE 00002618: DUP2 00002619: SLOAD 0000261a: PUSH1 0x20 0000261c: SWAP1 0000261d: SWAP2 0000261e: ADD 0000261f: SWAP1 00002620: PUSH2 0x0100 00002623: SWAP1 00002624: DIV 00002625: PUSH1 0xff 00002627: AND 00002628: PUSH1 0x03 0000262a: DUP2 0000262b: GT 0000262c: ISZERO 0000262d: PUSH2 0x2638 00002630: JUMPI 00002631: PUSH2 0x2638 00002634: PUSH2 0x3866 00002637: JUMP 00002638: JUMPDEST 00002639: PUSH1 0x03 0000263b: DUP2 0000263c: GT 0000263d: ISZERO 0000263e: PUSH2 0x2649 00002641: JUMPI 00002642: PUSH2 0x2649 00002645: PUSH2 0x3866 00002648: JUMP 00002649: JUMPDEST 0000264a: DUP2 0000264b: MSTORE 0000264c: PUSH1 0x01 0000264e: DUP3 0000264f: ADD 00002650: SLOAD 00002651: PUSH1 0x20 00002653: DUP3 00002654: ADD 00002655: MSTORE 00002656: PUSH1 0x02 00002658: DUP3 00002659: ADD 0000265a: SLOAD 0000265b: PUSH1 0x40 0000265d: DUP3 0000265e: ADD 0000265f: MSTORE 00002660: PUSH1 0x03 00002662: SWAP1 00002663: SWAP2 00002664: ADD 00002665: SLOAD 00002666: PUSH1 0x01 00002668: PUSH1 0x01 0000266a: PUSH1 0xa0 0000266c: SHL 0000266d: SUB 0000266e: AND 0000266f: PUSH1 0x60 00002671: SWAP2 00002672: DUP3 00002673: ADD 00002674: MSTORE 00002675: DUP2 00002676: ADD 00002677: MLOAD 00002678: SWAP1 00002679: SWAP2 0000267a: POP 0000267b: ISZERO 0000267c: DUP1 0000267d: ISZERO 0000267e: PUSH2 0x268f 00002681: JUMPI 00002682: POP 00002683: PUSH1 0x01 00002685: PUSH1 0x01 00002687: PUSH1 0xa0 00002689: SHL 0000268a: SUB 0000268b: DUP4 0000268c: AND 0000268d: ISZERO 0000268e: ISZERO 0000268f: JUMPDEST 00002690: ISZERO 00002691: PUSH2 0x2782 00002694: JUMPI 00002695: PUSH1 0x01 00002697: PUSH1 0x01 00002699: PUSH1 0xa0 0000269b: SHL 0000269c: SUB 0000269d: DUP4 0000269e: AND 0000269f: PUSH1 0x00 000026a1: SWAP1 000026a2: DUP2 000026a3: MSTORE 000026a4: PUSH1 0x27 000026a6: PUSH1 0x20 000026a8: MSTORE 000026a9: PUSH1 0x40 000026ab: SWAP1 000026ac: DUP2 000026ad: SWAP1 000026ae: KECCAK256 000026af: DUP2 000026b0: MLOAD 000026b1: PUSH1 0xa0 000026b3: DUP2 000026b4: ADD 000026b5: SWAP1 000026b6: SWAP3 000026b7: MSTORE 000026b8: DUP1 000026b9: SLOAD 000026ba: PUSH2 0x274c 000026bd: SWAP3 000026be: DUP7 000026bf: SWAP3 000026c0: SWAP1 000026c1: SWAP2 000026c2: DUP3 000026c3: SWAP1 000026c4: PUSH1 0xff 000026c6: AND 000026c7: PUSH1 0x03 000026c9: DUP2 000026ca: GT 000026cb: ISZERO 000026cc: PUSH2 0x26d7 000026cf: JUMPI 000026d0: PUSH2 0x26d7 000026d3: PUSH2 0x3866 000026d6: JUMP 000026d7: JUMPDEST 000026d8: PUSH1 0x03 000026da: DUP2 000026db: GT 000026dc: ISZERO 000026dd: PUSH2 0x26e8 000026e0: JUMPI 000026e1: PUSH2 0x26e8 000026e4: PUSH2 0x3866 000026e7: JUMP 000026e8: JUMPDEST 000026e9: DUP2 000026ea: MSTORE 000026eb: DUP2 000026ec: SLOAD 000026ed: PUSH1 0x20 000026ef: SWAP1 000026f0: SWAP2 000026f1: ADD 000026f2: SWAP1 000026f3: PUSH2 0x0100 000026f6: SWAP1 000026f7: DIV 000026f8: PUSH1 0xff 000026fa: AND 000026fb: PUSH1 0x03 000026fd: DUP2 000026fe: GT 000026ff: ISZERO 00002700: PUSH2 0x270b 00002703: JUMPI 00002704: PUSH2 0x270b 00002707: PUSH2 0x3866 0000270a: JUMP 0000270b: JUMPDEST 0000270c: PUSH1 0x03 0000270e: DUP2 0000270f: GT 00002710: ISZERO 00002711: PUSH2 0x271c 00002714: JUMPI 00002715: PUSH2 0x271c 00002718: PUSH2 0x3866 0000271b: JUMP 0000271c: JUMPDEST 0000271d: DUP2 0000271e: MSTORE 0000271f: PUSH1 0x01 00002721: DUP3 00002722: ADD 00002723: SLOAD 00002724: PUSH1 0x20 00002726: DUP3 00002727: ADD 00002728: MSTORE 00002729: PUSH1 0x02 0000272b: DUP3 0000272c: ADD 0000272d: SLOAD 0000272e: PUSH1 0x40 00002730: DUP3 00002731: ADD 00002732: MSTORE 00002733: PUSH1 0x03 00002735: SWAP1 00002736: SWAP2 00002737: ADD 00002738: SLOAD 00002739: PUSH1 0x01 0000273b: PUSH1 0x01 0000273d: PUSH1 0xa0 0000273f: SHL 00002740: SUB 00002741: AND 00002742: PUSH1 0x60 00002744: SWAP1 00002745: SWAP2 00002746: ADD 00002747: MSTORE 00002748: PUSH2 0x3049 0000274b: JUMP 0000274c: JUMPDEST 0000274d: PUSH1 0x01 0000274f: PUSH1 0x01 00002751: PUSH1 0xa0 00002753: SHL 00002754: SUB 00002755: DUP5 00002756: DUP2 00002757: AND 00002758: PUSH1 0x00 0000275a: SWAP1 0000275b: DUP2 0000275c: MSTORE 0000275d: PUSH1 0x27 0000275f: PUSH1 0x20 00002761: MSTORE 00002762: PUSH1 0x40 00002764: SWAP1 00002765: KECCAK256 00002766: PUSH1 0x03 00002768: ADD 00002769: DUP1 0000276a: SLOAD 0000276b: PUSH1 0x01 0000276d: PUSH1 0x01 0000276f: PUSH1 0xa0 00002771: SHL 00002772: SUB 00002773: NOT 00002774: AND 00002775: SWAP2 00002776: DUP6 00002777: AND 00002778: SWAP2 00002779: DUP3 0000277a: OR 0000277b: SWAP1 0000277c: SSTORE 0000277d: PUSH1 0x80 0000277f: DUP3 00002780: ADD 00002781: MSTORE 00002782: JUMPDEST 00002783: PUSH1 0x00 00002785: JUMPDEST 00002786: PUSH1 0x03 00002788: DUP2 00002789: LT 0000278a: ISZERO 0000278b: PUSH2 0x14c8 0000278e: JUMPI 0000278f: PUSH1 0x80 00002791: DUP3 00002792: ADD 00002793: MLOAD 00002794: PUSH1 0x01 00002796: PUSH1 0x01 00002798: PUSH1 0xa0 0000279a: SHL 0000279b: SUB 0000279c: AND 0000279d: ISZERO 0000279e: PUSH2 0x14c8 000027a1: JUMPI 000027a2: PUSH1 0x80 000027a4: DUP3 000027a5: ADD 000027a6: MLOAD 000027a7: PUSH1 0x01 000027a9: PUSH1 0x01 000027ab: PUSH1 0xa0 000027ad: SHL 000027ae: SUB 000027af: DUP2 000027b0: AND 000027b1: PUSH1 0x00 000027b3: SWAP1 000027b4: DUP2 000027b5: MSTORE 000027b6: PUSH1 0x27 000027b8: PUSH1 0x20 000027ba: MSTORE 000027bb: PUSH1 0x40 000027bd: SWAP1 000027be: DUP2 000027bf: SWAP1 000027c0: KECCAK256 000027c1: DUP2 000027c2: MLOAD 000027c3: PUSH1 0xa0 000027c5: DUP2 000027c6: ADD 000027c7: SWAP1 000027c8: SWAP3 000027c9: MSTORE 000027ca: DUP1 000027cb: SLOAD 000027cc: DUP3 000027cd: SWAP1 000027ce: PUSH1 0xff 000027d0: AND 000027d1: PUSH1 0x03 000027d3: DUP2 000027d4: GT 000027d5: ISZERO 000027d6: PUSH2 0x27e1 000027d9: JUMPI 000027da: PUSH2 0x27e1 000027dd: PUSH2 0x3866 000027e0: JUMP 000027e1: JUMPDEST 000027e2: PUSH1 0x03 000027e4: DUP2 000027e5: GT 000027e6: ISZERO 000027e7: PUSH2 0x27f2 000027ea: JUMPI 000027eb: PUSH2 0x27f2 000027ee: PUSH2 0x3866 000027f1: JUMP 000027f2: JUMPDEST 000027f3: DUP2 000027f4: MSTORE 000027f5: DUP2 000027f6: SLOAD 000027f7: PUSH1 0x20 000027f9: SWAP1 000027fa: SWAP2 000027fb: ADD 000027fc: SWAP1 000027fd: PUSH2 0x0100 00002800: SWAP1 00002801: DIV 00002802: PUSH1 0xff 00002804: AND 00002805: PUSH1 0x03 00002807: DUP2 00002808: GT 00002809: ISZERO 0000280a: PUSH2 0x2815 0000280d: JUMPI 0000280e: PUSH2 0x2815 00002811: PUSH2 0x3866 00002814: JUMP 00002815: JUMPDEST 00002816: PUSH1 0x03 00002818: DUP2 00002819: GT 0000281a: ISZERO 0000281b: PUSH2 0x2826 0000281e: JUMPI 0000281f: PUSH2 0x2826 00002822: PUSH2 0x3866 00002825: JUMP 00002826: JUMPDEST 00002827: DUP2 00002828: MSTORE 00002829: PUSH1 0x01 0000282b: DUP3 0000282c: ADD 0000282d: SLOAD 0000282e: PUSH1 0x20 00002830: DUP3 00002831: ADD 00002832: MSTORE 00002833: PUSH1 0x02 00002835: DUP3 00002836: ADD 00002837: SLOAD 00002838: PUSH1 0x40 0000283a: DUP3 0000283b: ADD 0000283c: MSTORE 0000283d: PUSH1 0x03 0000283f: SWAP2 00002840: DUP3 00002841: ADD 00002842: SLOAD 00002843: PUSH1 0x01 00002845: PUSH1 0x01 00002847: PUSH1 0xa0 00002849: SHL 0000284a: SUB 0000284b: AND 0000284c: PUSH1 0x60 0000284e: SWAP1 0000284f: SWAP2 00002850: ADD 00002851: MSTORE 00002852: SWAP1 00002853: SWAP4 00002854: POP 00002855: PUSH1 0x00 00002857: SWAP1 00002858: PUSH3 0x0f4240 0000285c: SWAP1 0000285d: PUSH1 0x0c 0000285f: SWAP1 00002860: DUP6 00002861: SWAP1 00002862: DUP2 00002863: LT 00002864: PUSH2 0x286f 00002867: JUMPI 00002868: PUSH2 0x286f 0000286b: PUSH2 0x3b52 0000286e: JUMP 0000286f: JUMPDEST 00002870: PUSH1 0x04 00002872: MUL 00002873: ADD 00002874: DUP6 00002875: PUSH1 0x20 00002877: ADD 00002878: MLOAD 00002879: PUSH1 0x03 0000287b: DUP2 0000287c: GT 0000287d: ISZERO 0000287e: PUSH2 0x2889 00002881: JUMPI 00002882: PUSH2 0x2889 00002885: PUSH2 0x3866 00002888: JUMP 00002889: JUMPDEST 0000288a: PUSH1 0x04 0000288c: DUP2 0000288d: LT 0000288e: PUSH2 0x2899 00002891: JUMPI 00002892: PUSH2 0x2899 00002895: PUSH2 0x3b52 00002898: JUMP 00002899: JUMPDEST 0000289a: ADD 0000289b: SLOAD 0000289c: PUSH2 0x28a5 0000289f: SWAP1 000028a0: DUP8 000028a1: PUSH2 0x3c97 000028a4: JUMP 000028a5: JUMPDEST 000028a6: PUSH2 0x28af 000028a9: SWAP2 000028aa: SWAP1 000028ab: PUSH2 0x3cae 000028ae: JUMP 000028af: JUMPDEST 000028b0: SWAP1 000028b1: POP 000028b2: PUSH2 0x28e5 000028b5: PUSH1 0x01 000028b7: PUSH1 0x01 000028b9: PUSH1 0xa0 000028bb: SHL 000028bc: SUB 000028bd: PUSH32 0x000000000000000000000000024475619e5d37cf7b5b445e943dbeb7edd2f408 000028de: AND 000028df: DUP4 000028e0: DUP4 000028e1: PUSH2 0x1f04 000028e4: JUMP 000028e5: JUMPDEST 000028e6: POP 000028e7: POP 000028e8: PUSH1 0x01 000028ea: ADD 000028eb: PUSH2 0x2785 000028ee: JUMP 000028ef: JUMPDEST 000028f0: PUSH1 0x12 000028f2: PUSH1 0x01 000028f4: PUSH1 0x01 000028f6: PUSH1 0xa0 000028f8: SHL 000028f9: SUB 000028fa: DUP4 000028fb: AND 000028fc: ISZERO 000028fd: PUSH2 0x2968 00002900: JUMPI 00002901: DUP3 00002902: PUSH1 0x01 00002904: PUSH1 0x01 00002906: PUSH1 0xa0 00002908: SHL 00002909: SUB 0000290a: AND 0000290b: PUSH4 0x313ce567 00002910: PUSH1 0x40 00002912: MLOAD 00002913: DUP2 00002914: PUSH4 0xffffffff 00002919: AND 0000291a: PUSH1 0xe0 0000291c: SHL 0000291d: DUP2 0000291e: MSTORE 0000291f: PUSH1 0x04 00002921: ADD 00002922: PUSH1 0x20 00002924: PUSH1 0x40 00002926: MLOAD 00002927: DUP1 00002928: DUP4 00002929: SUB 0000292a: DUP2 0000292b: DUP7 0000292c: GAS 0000292d: STATICCALL 0000292e: ISZERO 0000292f: DUP1 00002930: ISZERO 00002931: PUSH2 0x293e 00002934: JUMPI 00002935: RETURNDATASIZE 00002936: PUSH1 0x00 00002938: DUP1 00002939: RETURNDATACOPY 0000293a: RETURNDATASIZE 0000293b: PUSH1 0x00 0000293d: REVERT 0000293e: JUMPDEST 0000293f: POP 00002940: POP 00002941: POP 00002942: POP 00002943: PUSH1 0x40 00002945: MLOAD 00002946: RETURNDATASIZE 00002947: PUSH1 0x1f 00002949: NOT 0000294a: PUSH1 0x1f 0000294c: DUP3 0000294d: ADD 0000294e: AND 0000294f: DUP3 00002950: ADD 00002951: DUP1 00002952: PUSH1 0x40 00002954: MSTORE 00002955: POP 00002956: DUP2 00002957: ADD 00002958: SWAP1 00002959: PUSH2 0x2962 0000295c: SWAP2 0000295d: SWAP1 0000295e: PUSH2 0x3b68 00002961: JUMP 00002962: JUMPDEST 00002963: PUSH1 0xff 00002965: AND 00002966: SWAP1 00002967: POP 00002968: JUMPDEST 00002969: PUSH1 0x00 0000296b: PUSH2 0x2975 0000296e: DUP3 0000296f: PUSH1 0x0a 00002971: PUSH2 0x3d17 00002974: JUMP 00002975: JUMPDEST 00002976: PUSH2 0x297f 00002979: DUP5 0000297a: DUP8 0000297b: PUSH2 0x3c97 0000297e: JUMP 0000297f: JUMPDEST 00002980: PUSH2 0x2989 00002983: SWAP2 00002984: SWAP1 00002985: PUSH2 0x3cae 00002988: JUMP 00002989: JUMPDEST 0000298a: PUSH1 0x01 0000298c: PUSH1 0x01 0000298e: PUSH1 0xa0 00002990: SHL 00002991: SUB 00002992: DUP8 00002993: AND 00002994: PUSH1 0x00 00002996: SWAP1 00002997: DUP2 00002998: MSTORE 00002999: PUSH1 0x27 0000299b: PUSH1 0x20 0000299d: MSTORE 0000299e: PUSH1 0x40 000029a0: DUP2 000029a1: KECCAK256 000029a2: PUSH1 0x02 000029a4: ADD 000029a5: DUP1 000029a6: SLOAD 000029a7: SWAP3 000029a8: SWAP4 000029a9: POP 000029aa: DUP4 000029ab: SWAP3 000029ac: SWAP1 000029ad: SWAP2 000029ae: SWAP1 000029af: PUSH2 0x29b9 000029b2: SWAP1 000029b3: DUP5 000029b4: SWAP1 000029b5: PUSH2 0x3d7f 000029b8: JUMP 000029b9: JUMPDEST 000029ba: SWAP1 000029bb: SWAP2 000029bc: SSTORE 000029bd: POP 000029be: POP 000029bf: PUSH1 0x01 000029c1: PUSH1 0x01 000029c3: PUSH1 0xa0 000029c5: SHL 000029c6: SUB 000029c7: DUP7 000029c8: AND 000029c9: PUSH1 0x00 000029cb: SWAP1 000029cc: DUP2 000029cd: MSTORE 000029ce: PUSH1 0x27 000029d0: PUSH1 0x20 000029d2: MSTORE 000029d3: PUSH1 0x40 000029d5: DUP1 000029d6: DUP3 000029d7: KECCAK256 000029d8: DUP2 000029d9: MLOAD 000029da: PUSH1 0xa0 000029dc: DUP2 000029dd: ADD 000029de: SWAP1 000029df: SWAP3 000029e0: MSTORE 000029e1: DUP1 000029e2: SLOAD 000029e3: DUP3 000029e4: SWAP1 000029e5: PUSH1 0xff 000029e7: AND 000029e8: PUSH1 0x03 000029ea: DUP2 000029eb: GT 000029ec: ISZERO 000029ed: PUSH2 0x29f8 000029f0: JUMPI 000029f1: PUSH2 0x29f8 000029f4: PUSH2 0x3866 000029f7: JUMP 000029f8: JUMPDEST 000029f9: PUSH1 0x03 000029fb: DUP2 000029fc: GT 000029fd: ISZERO 000029fe: PUSH2 0x2a09 00002a01: JUMPI 00002a02: PUSH2 0x2a09 00002a05: PUSH2 0x3866 00002a08: JUMP 00002a09: JUMPDEST 00002a0a: DUP2 00002a0b: MSTORE 00002a0c: DUP2 00002a0d: SLOAD 00002a0e: PUSH1 0x20 00002a10: SWAP1 00002a11: SWAP2 00002a12: ADD 00002a13: SWAP1 00002a14: PUSH2 0x0100 00002a17: SWAP1 00002a18: DIV 00002a19: PUSH1 0xff 00002a1b: AND 00002a1c: PUSH1 0x03 00002a1e: DUP2 00002a1f: GT 00002a20: ISZERO 00002a21: PUSH2 0x2a2c 00002a24: JUMPI 00002a25: PUSH2 0x2a2c 00002a28: PUSH2 0x3866 00002a2b: JUMP 00002a2c: JUMPDEST 00002a2d: PUSH1 0x03 00002a2f: DUP2 00002a30: GT 00002a31: ISZERO 00002a32: PUSH2 0x2a3d 00002a35: JUMPI 00002a36: PUSH2 0x2a3d 00002a39: PUSH2 0x3866 00002a3c: JUMP 00002a3d: JUMPDEST 00002a3e: DUP2 00002a3f: MSTORE 00002a40: PUSH1 0x01 00002a42: DUP3 00002a43: ADD 00002a44: SLOAD 00002a45: PUSH1 0x20 00002a47: DUP3 00002a48: ADD 00002a49: MSTORE 00002a4a: PUSH1 0x02 00002a4c: DUP3 00002a4d: ADD 00002a4e: SLOAD 00002a4f: PUSH1 0x40 00002a51: DUP3 00002a52: ADD 00002a53: MSTORE 00002a54: PUSH1 0x03 00002a56: SWAP2 00002a57: DUP3 00002a58: ADD 00002a59: SLOAD 00002a5a: PUSH1 0x01 00002a5c: PUSH1 0x01 00002a5e: PUSH1 0xa0 00002a60: SHL 00002a61: SUB 00002a62: AND 00002a63: PUSH1 0x60 00002a65: SWAP1 00002a66: SWAP2 00002a67: ADD 00002a68: MSTORE 00002a69: SWAP1 00002a6a: SWAP2 00002a6b: POP 00002a6c: DUP2 00002a6d: MLOAD 00002a6e: PUSH1 0x03 00002a70: DUP2 00002a71: GT 00002a72: ISZERO 00002a73: PUSH2 0x2a7e 00002a76: JUMPI 00002a77: PUSH2 0x2a7e 00002a7a: PUSH2 0x3866 00002a7d: JUMP 00002a7e: JUMPDEST 00002a7f: EQ 00002a80: PUSH2 0x2b52 00002a83: JUMPI 00002a84: PUSH1 0x1b 00002a86: SLOAD 00002a87: PUSH2 0x2a94 00002a8a: SWAP1 00002a8b: PUSH3 0x0f4240 00002a8f: SWAP1 00002a90: PUSH2 0x3c97 00002a93: JUMP 00002a94: JUMPDEST 00002a95: DUP2 00002a96: PUSH1 0x60 00002a98: ADD 00002a99: MLOAD 00002a9a: LT 00002a9b: PUSH2 0x2ace 00002a9e: JUMPI 00002a9f: PUSH1 0x01 00002aa1: PUSH1 0x01 00002aa3: PUSH1 0xa0 00002aa5: SHL 00002aa6: SUB 00002aa7: DUP8 00002aa8: AND 00002aa9: PUSH1 0x00 00002aab: SWAP1 00002aac: DUP2 00002aad: MSTORE 00002aae: PUSH1 0x27 00002ab0: PUSH1 0x20 00002ab2: MSTORE 00002ab3: PUSH1 0x40 00002ab5: SWAP1 00002ab6: KECCAK256 00002ab7: DUP1 00002ab8: SLOAD 00002ab9: PUSH1 0x03 00002abb: SWAP2 00002abc: SWAP1 00002abd: PUSH1 0xff 00002abf: NOT 00002ac0: AND 00002ac1: PUSH1 0x01 00002ac3: DUP4 00002ac4: JUMPDEST 00002ac5: MUL 00002ac6: OR 00002ac7: SWAP1 00002ac8: SSTORE 00002ac9: POP 00002aca: PUSH2 0x2b52 00002acd: JUMP 00002ace: JUMPDEST 00002acf: PUSH1 0x1a 00002ad1: SLOAD 00002ad2: PUSH2 0x2adf 00002ad5: SWAP1 00002ad6: PUSH3 0x0f4240 00002ada: SWAP1 00002adb: PUSH2 0x3c97 00002ade: JUMP 00002adf: JUMPDEST 00002ae0: DUP2 00002ae1: PUSH1 0x60 00002ae3: ADD 00002ae4: MLOAD 00002ae5: LT 00002ae6: PUSH2 0x2b13 00002ae9: JUMPI 00002aea: PUSH1 0x01 00002aec: PUSH1 0x01 00002aee: PUSH1 0xa0 00002af0: SHL 00002af1: SUB 00002af2: DUP8 00002af3: AND 00002af4: PUSH1 0x00 00002af6: SWAP1 00002af7: DUP2 00002af8: MSTORE 00002af9: PUSH1 0x27 00002afb: PUSH1 0x20 00002afd: MSTORE 00002afe: PUSH1 0x40 00002b00: SWAP1 00002b01: KECCAK256 00002b02: DUP1 00002b03: SLOAD 00002b04: PUSH1 0x02 00002b06: SWAP2 00002b07: SWAP1 00002b08: PUSH1 0xff 00002b0a: NOT 00002b0b: AND 00002b0c: PUSH1 0x01 00002b0e: DUP4 00002b0f: PUSH2 0x2ac4 00002b12: JUMP 00002b13: JUMPDEST 00002b14: PUSH1 0x19 00002b16: SLOAD 00002b17: PUSH2 0x2b24 00002b1a: SWAP1 00002b1b: PUSH3 0x0f4240 00002b1f: SWAP1 00002b20: PUSH2 0x3c97 00002b23: JUMP 00002b24: JUMPDEST 00002b25: DUP2 00002b26: PUSH1 0x60 00002b28: ADD 00002b29: MLOAD 00002b2a: LT 00002b2b: PUSH2 0x2b52 00002b2e: JUMPI 00002b2f: PUSH1 0x01 00002b31: PUSH1 0x01 00002b33: PUSH1 0xa0 00002b35: SHL 00002b36: SUB 00002b37: DUP8 00002b38: AND 00002b39: PUSH1 0x00 00002b3b: SWAP1 00002b3c: DUP2 00002b3d: MSTORE 00002b3e: PUSH1 0x27 00002b40: PUSH1 0x20 00002b42: MSTORE 00002b43: PUSH1 0x40 00002b45: SWAP1 00002b46: KECCAK256 00002b47: DUP1 00002b48: SLOAD 00002b49: PUSH1 0xff 00002b4b: NOT 00002b4c: AND 00002b4d: PUSH1 0x01 00002b4f: OR 00002b50: SWAP1 00002b51: SSTORE 00002b52: JUMPDEST 00002b53: PUSH2 0x2b5c 00002b56: DUP8 00002b57: DUP3 00002b58: PUSH2 0x3049 00002b5b: JUMP 00002b5c: JUMPDEST 00002b5d: POP 00002b5e: POP 00002b5f: POP 00002b60: POP 00002b61: POP 00002b62: POP 00002b63: POP 00002b64: JUMP 00002b65: JUMPDEST 00002b66: PUSH2 0x2b6f 00002b69: DUP3 00002b6a: DUP3 00002b6b: PUSH2 0x14cf 00002b6e: JUMP 00002b6f: JUMPDEST 00002b70: PUSH2 0x0d45 00002b73: JUMPI 00002b74: PUSH1 0x40 00002b76: MLOAD 00002b77: PUSH4 0xe2517d3f 00002b7c: PUSH1 0xe0 00002b7e: SHL 00002b7f: DUP2 00002b80: MSTORE 00002b81: PUSH1 0x01 00002b83: PUSH1 0x01 00002b85: PUSH1 0xa0 00002b87: SHL 00002b88: SUB 00002b89: DUP3 00002b8a: AND 00002b8b: PUSH1 0x04 00002b8d: DUP3 00002b8e: ADD 00002b8f: MSTORE 00002b90: PUSH1 0x24 00002b92: DUP2 00002b93: ADD 00002b94: DUP4 00002b95: SWAP1 00002b96: MSTORE 00002b97: PUSH1 0x44 00002b99: ADD 00002b9a: PUSH2 0x0de4 00002b9d: JUMP 00002b9e: JUMPDEST 00002b9f: PUSH1 0x02 00002ba1: SLOAD 00002ba2: PUSH1 0x01 00002ba4: PUSH1 0xd0 00002ba6: SHL 00002ba7: SWAP1 00002ba8: DIV 00002ba9: PUSH6 0xffffffffffff 00002bb0: AND 00002bb1: DUP1 00002bb2: ISZERO 00002bb3: PUSH2 0x2c21 00002bb6: JUMPI 00002bb7: TIMESTAMP 00002bb8: PUSH6 0xffffffffffff 00002bbf: DUP3 00002bc0: AND 00002bc1: LT 00002bc2: ISZERO 00002bc3: PUSH2 0x2bf7 00002bc6: JUMPI 00002bc7: PUSH1 0x02 00002bc9: SLOAD 00002bca: PUSH1 0x01 00002bcc: DUP1 00002bcd: SLOAD 00002bce: PUSH1 0x01 00002bd0: PUSH1 0x01 00002bd2: PUSH1 0xd0 00002bd4: SHL 00002bd5: SUB 00002bd6: AND 00002bd7: PUSH1 0x01 00002bd9: PUSH1 0xa0 00002bdb: SHL 00002bdc: SWAP1 00002bdd: SWAP3 00002bde: DIV 00002bdf: PUSH6 0xffffffffffff 00002be6: AND 00002be7: PUSH1 0x01 00002be9: PUSH1 0xd0 00002beb: SHL 00002bec: MUL 00002bed: SWAP2 00002bee: SWAP1 00002bef: SWAP2 00002bf0: OR 00002bf1: SWAP1 00002bf2: SSTORE 00002bf3: PUSH2 0x2c21 00002bf6: JUMP 00002bf7: JUMPDEST 00002bf8: PUSH1 0x40 00002bfa: MLOAD 00002bfb: PUSH32 0x2b1fa2edafe6f7b9e97c1a9e0c3660e645beb2dcaa2d45bdbf9beaf5472e1ec5 00002c1c: SWAP1 00002c1d: PUSH1 0x00 00002c1f: SWAP1 00002c20: LOG1 00002c21: JUMPDEST 00002c22: POP 00002c23: PUSH1 0x02 00002c25: DUP1 00002c26: SLOAD 00002c27: PUSH1 0x01 00002c29: PUSH1 0x01 00002c2b: PUSH1 0xa0 00002c2d: SHL 00002c2e: SUB 00002c2f: AND 00002c30: PUSH1 0x01 00002c32: PUSH1 0xa0 00002c34: SHL 00002c35: PUSH6 0xffffffffffff 00002c3c: SWAP5 00002c3d: DUP6 00002c3e: AND 00002c3f: MUL 00002c40: PUSH1 0x01 00002c42: PUSH1 0x01 00002c44: PUSH1 0xd0 00002c46: SHL 00002c47: SUB 00002c48: AND 00002c49: OR 00002c4a: PUSH1 0x01 00002c4c: PUSH1 0xd0 00002c4e: SHL 00002c4f: SWAP3 00002c50: SWAP1 00002c51: SWAP4 00002c52: AND 00002c53: SWAP2 00002c54: SWAP1 00002c55: SWAP2 00002c56: MUL 00002c57: SWAP2 00002c58: SWAP1 00002c59: SWAP2 00002c5a: OR 00002c5b: SWAP1 00002c5c: SSTORE 00002c5d: JUMP 00002c5e: JUMPDEST 00002c5f: PUSH1 0x00 00002c61: DUP1 00002c62: PUSH1 0x20 00002c64: PUSH1 0x00 00002c66: DUP5 00002c67: MLOAD 00002c68: PUSH1 0x20 00002c6a: DUP7 00002c6b: ADD 00002c6c: PUSH1 0x00 00002c6e: DUP9 00002c6f: GAS 00002c70: CALL 00002c71: DUP1 00002c72: PUSH2 0x2c81 00002c75: JUMPI 00002c76: PUSH1 0x40 00002c78: MLOAD 00002c79: RETURNDATASIZE 00002c7a: PUSH1 0x00 00002c7c: DUP3 00002c7d: RETURNDATACOPY 00002c7e: RETURNDATASIZE 00002c7f: DUP2 00002c80: REVERT 00002c81: JUMPDEST 00002c82: POP 00002c83: POP 00002c84: PUSH1 0x00 00002c86: MLOAD 00002c87: RETURNDATASIZE 00002c88: SWAP2 00002c89: POP 00002c8a: DUP2 00002c8b: ISZERO 00002c8c: PUSH2 0x2c99 00002c8f: JUMPI 00002c90: DUP1 00002c91: PUSH1 0x01 00002c93: EQ 00002c94: ISZERO 00002c95: PUSH2 0x2ca6 00002c98: JUMP 00002c99: JUMPDEST 00002c9a: PUSH1 0x01 00002c9c: PUSH1 0x01 00002c9e: PUSH1 0xa0 00002ca0: SHL 00002ca1: SUB 00002ca2: DUP5 00002ca3: AND 00002ca4: EXTCODESIZE 00002ca5: ISZERO 00002ca6: JUMPDEST 00002ca7: ISZERO 00002ca8: PUSH2 0x1ec6 00002cab: JUMPI 00002cac: PUSH1 0x40 00002cae: MLOAD 00002caf: PUSH4 0x5274afe7 00002cb4: PUSH1 0xe0 00002cb6: SHL 00002cb7: DUP2 00002cb8: MSTORE 00002cb9: PUSH1 0x01 00002cbb: PUSH1 0x01 00002cbd: PUSH1 0xa0 00002cbf: SHL 00002cc0: SUB 00002cc1: DUP6 00002cc2: AND 00002cc3: PUSH1 0x04 00002cc5: DUP3 00002cc6: ADD 00002cc7: MSTORE 00002cc8: PUSH1 0x24 00002cca: ADD 00002ccb: PUSH2 0x0de4 00002cce: JUMP 00002ccf: JUMPDEST 00002cd0: PUSH1 0x00 00002cd2: PUSH6 0xffffffffffff 00002cd9: DUP3 00002cda: GT 00002cdb: ISZERO 00002cdc: PUSH2 0x2d02 00002cdf: JUMPI 00002ce0: PUSH1 0x40 00002ce2: MLOAD 00002ce3: PUSH4 0x06dfcc65 00002ce8: PUSH1 0xe4 00002cea: SHL 00002ceb: DUP2 00002cec: MSTORE 00002ced: PUSH1 0x30 00002cef: PUSH1 0x04 00002cf1: DUP3 00002cf2: ADD 00002cf3: MSTORE 00002cf4: PUSH1 0x24 00002cf6: DUP2 00002cf7: ADD 00002cf8: DUP4 00002cf9: SWAP1 00002cfa: MSTORE 00002cfb: PUSH1 0x44 00002cfd: ADD 00002cfe: PUSH2 0x0de4 00002d01: JUMP 00002d02: JUMPDEST 00002d03: POP 00002d04: SWAP1 00002d05: JUMP 00002d06: JUMPDEST 00002d07: PUSH1 0x00 00002d09: PUSH2 0x2d10 00002d0c: PUSH2 0x1acd 00002d0f: JUMP 00002d10: JUMPDEST 00002d11: PUSH1 0x01 00002d13: DUP1 00002d14: SLOAD 00002d15: PUSH6 0xffffffffffff 00002d1c: DUP7 00002d1d: AND 00002d1e: PUSH1 0x01 00002d20: PUSH1 0xa0 00002d22: SHL 00002d23: MUL 00002d24: PUSH1 0x01 00002d26: PUSH1 0x01 00002d28: PUSH1 0xd0 00002d2a: SHL 00002d2b: SUB 00002d2c: NOT 00002d2d: SWAP1 00002d2e: SWAP2 00002d2f: AND 00002d30: PUSH1 0x01 00002d32: PUSH1 0x01 00002d34: PUSH1 0xa0 00002d36: SHL 00002d37: SUB 00002d38: DUP9 00002d39: AND 00002d3a: OR 00002d3b: OR 00002d3c: SWAP1 00002d3d: SSTORE 00002d3e: SWAP2 00002d3f: POP 00002d40: PUSH2 0x2d52 00002d43: SWAP1 00002d44: POP 00002d45: DUP2 00002d46: PUSH6 0xffffffffffff 00002d4d: AND 00002d4e: ISZERO 00002d4f: ISZERO 00002d50: SWAP1 00002d51: JUMP 00002d52: JUMPDEST 00002d53: ISZERO 00002d54: PUSH2 0x1eff 00002d57: JUMPI 00002d58: PUSH1 0x40 00002d5a: MLOAD 00002d5b: PUSH32 0x8886ebfc4259abdbc16601dd8fb5678e54878f47b3c34836cfc51154a9605109 00002d7c: SWAP1 00002d7d: PUSH1 0x00 00002d7f: SWAP1 00002d80: LOG1 00002d81: POP 00002d82: POP 00002d83: POP 00002d84: JUMP 00002d85: JUMPDEST 00002d86: PUSH1 0x00 00002d88: DUP1 00002d89: PUSH2 0x2d90 00002d8c: PUSH2 0x1a2e 00002d8f: JUMP 00002d90: JUMPDEST 00002d91: SWAP1 00002d92: POP 00002d93: DUP1 00002d94: PUSH6 0xffffffffffff 00002d9b: AND 00002d9c: DUP4 00002d9d: PUSH6 0xffffffffffff 00002da4: AND 00002da5: GT 00002da6: PUSH2 0x2db8 00002da9: JUMPI 00002daa: PUSH2 0x2db3 00002dad: DUP4 00002dae: DUP3 00002daf: PUSH2 0x3e1c 00002db2: JUMP 00002db3: JUMPDEST 00002db4: PUSH2 0x2290 00002db7: JUMP 00002db8: JUMPDEST 00002db9: PUSH2 0x2290 00002dbc: PUSH6 0xffffffffffff 00002dc3: DUP5 00002dc4: AND 00002dc5: PUSH3 0x069780 00002dc9: PUSH2 0x313b 00002dcc: JUMP 00002dcd: JUMPDEST 00002dce: PUSH1 0x60 00002dd0: PUSH1 0xff 00002dd2: DUP4 00002dd3: EQ 00002dd4: PUSH2 0x2de7 00002dd7: JUMPI 00002dd8: PUSH2 0x2de0 00002ddb: DUP4 00002ddc: PUSH2 0x314b 00002ddf: JUMP 00002de0: JUMPDEST 00002de1: SWAP1 00002de2: POP 00002de3: PUSH2 0x0ad0 00002de6: JUMP 00002de7: JUMPDEST 00002de8: DUP2 00002de9: DUP1 00002dea: SLOAD 00002deb: PUSH2 0x2df3 00002dee: SWAP1 00002def: PUSH2 0x3e3a 00002df2: JUMP 00002df3: JUMPDEST 00002df4: DUP1 00002df5: PUSH1 0x1f 00002df7: ADD 00002df8: PUSH1 0x20 00002dfa: DUP1 00002dfb: SWAP2 00002dfc: DIV 00002dfd: MUL 00002dfe: PUSH1 0x20 00002e00: ADD 00002e01: PUSH1 0x40 00002e03: MLOAD 00002e04: SWAP1 00002e05: DUP2 00002e06: ADD 00002e07: PUSH1 0x40 00002e09: MSTORE 00002e0a: DUP1 00002e0b: SWAP3 00002e0c: SWAP2 00002e0d: SWAP1 00002e0e: DUP2 00002e0f: DUP2 00002e10: MSTORE 00002e11: PUSH1 0x20 00002e13: ADD 00002e14: DUP3 00002e15: DUP1 00002e16: SLOAD 00002e17: PUSH2 0x2e1f 00002e1a: SWAP1 00002e1b: PUSH2 0x3e3a 00002e1e: JUMP 00002e1f: JUMPDEST 00002e20: DUP1 00002e21: ISZERO 00002e22: PUSH2 0x2e6c 00002e25: JUMPI 00002e26: DUP1 00002e27: PUSH1 0x1f 00002e29: LT 00002e2a: PUSH2 0x2e41 00002e2d: JUMPI 00002e2e: PUSH2 0x0100 00002e31: DUP1 00002e32: DUP4 00002e33: SLOAD 00002e34: DIV 00002e35: MUL 00002e36: DUP4 00002e37: MSTORE 00002e38: SWAP2 00002e39: PUSH1 0x20 00002e3b: ADD 00002e3c: SWAP2 00002e3d: PUSH2 0x2e6c 00002e40: JUMP 00002e41: JUMPDEST 00002e42: DUP3 00002e43: ADD 00002e44: SWAP2 00002e45: SWAP1 00002e46: PUSH1 0x00 00002e48: MSTORE 00002e49: PUSH1 0x20 00002e4b: PUSH1 0x00 00002e4d: KECCAK256 00002e4e: SWAP1 00002e4f: JUMPDEST 00002e50: DUP2 00002e51: SLOAD 00002e52: DUP2 00002e53: MSTORE 00002e54: SWAP1 00002e55: PUSH1 0x01 00002e57: ADD 00002e58: SWAP1 00002e59: PUSH1 0x20 00002e5b: ADD 00002e5c: DUP1 00002e5d: DUP4 00002e5e: GT 00002e5f: PUSH2 0x2e4f 00002e62: JUMPI 00002e63: DUP3 00002e64: SWAP1 00002e65: SUB 00002e66: PUSH1 0x1f 00002e68: AND 00002e69: DUP3 00002e6a: ADD 00002e6b: SWAP2 00002e6c: JUMPDEST 00002e6d: POP 00002e6e: POP 00002e6f: POP 00002e70: POP 00002e71: POP 00002e72: SWAP1 00002e73: POP 00002e74: PUSH2 0x0ad0 00002e77: JUMP 00002e78: JUMPDEST 00002e79: PUSH1 0x24 00002e7b: SLOAD 00002e7c: PUSH1 0x01 00002e7e: PUSH1 0x01 00002e80: PUSH1 0xa0 00002e82: SHL 00002e83: SUB 00002e84: DUP4 00002e85: AND 00002e86: PUSH1 0x00 00002e88: SWAP1 00002e89: DUP2 00002e8a: MSTORE 00002e8b: PUSH1 0x27 00002e8d: PUSH1 0x20 00002e8f: MSTORE 00002e90: PUSH1 0x40 00002e92: SWAP1 00002e93: KECCAK256 00002e94: PUSH1 0x01 00002e96: ADD 00002e97: SLOAD 00002e98: PUSH2 0x2ea2 00002e9b: SWAP1 00002e9c: DUP4 00002e9d: SWAP1 00002e9e: PUSH2 0x3d7f 00002ea1: JUMP 00002ea2: JUMPDEST 00002ea3: GT 00002ea4: ISZERO 00002ea5: PUSH2 0x2ec1 00002ea8: JUMPI 00002ea9: PUSH1 0x40 00002eab: MLOAD 00002eac: PUSH4 0xd570fc1f 00002eb1: PUSH1 0xe0 00002eb3: SHL 00002eb4: DUP2 00002eb5: MSTORE 00002eb6: PUSH1 0x04 00002eb8: ADD 00002eb9: PUSH1 0x40 00002ebb: MLOAD 00002ebc: DUP1 00002ebd: SWAP2 00002ebe: SUB 00002ebf: SWAP1 00002ec0: REVERT 00002ec1: JUMPDEST 00002ec2: PUSH1 0x01 00002ec4: PUSH1 0x01 00002ec6: PUSH1 0xa0 00002ec8: SHL 00002ec9: SUB 00002eca: DUP3 00002ecb: AND 00002ecc: PUSH1 0x00 00002ece: SWAP1 00002ecf: DUP2 00002ed0: MSTORE 00002ed1: PUSH1 0x27 00002ed3: PUSH1 0x20 00002ed5: MSTORE 00002ed6: PUSH1 0x40 00002ed8: DUP2 00002ed9: KECCAK256 00002eda: PUSH1 0x01 00002edc: ADD 00002edd: DUP1 00002ede: SLOAD 00002edf: DUP4 00002ee0: SWAP3 00002ee1: SWAP1 00002ee2: PUSH2 0x2eec 00002ee5: SWAP1 00002ee6: DUP5 00002ee7: SWAP1 00002ee8: PUSH2 0x3d7f 00002eeb: JUMP 00002eec: JUMPDEST 00002eed: SWAP1 00002eee: SWAP2 00002eef: SSTORE 00002ef0: POP 00002ef1: POP 00002ef2: POP 00002ef3: POP 00002ef4: JUMP 00002ef5: JUMPDEST 00002ef6: PUSH1 0x00 00002ef8: PUSH2 0x2f01 00002efb: DUP4 00002efc: DUP4 00002efd: PUSH2 0x14cf 00002f00: JUMP 00002f01: JUMPDEST 00002f02: ISZERO 00002f03: PUSH2 0x2f60 00002f06: JUMPI 00002f07: PUSH1 0x00 00002f09: DUP4 00002f0a: DUP2 00002f0b: MSTORE 00002f0c: PUSH1 0x20 00002f0e: DUP2 00002f0f: DUP2 00002f10: MSTORE 00002f11: PUSH1 0x40 00002f13: DUP1 00002f14: DUP4 00002f15: KECCAK256 00002f16: PUSH1 0x01 00002f18: PUSH1 0x01 00002f1a: PUSH1 0xa0 00002f1c: SHL 00002f1d: SUB 00002f1e: DUP7 00002f1f: AND 00002f20: DUP1 00002f21: DUP6 00002f22: MSTORE 00002f23: SWAP3 00002f24: MSTORE 00002f25: DUP1 00002f26: DUP4 00002f27: KECCAK256 00002f28: DUP1 00002f29: SLOAD 00002f2a: PUSH1 0xff 00002f2c: NOT 00002f2d: AND 00002f2e: SWAP1 00002f2f: SSTORE 00002f30: MLOAD 00002f31: CALLER 00002f32: SWAP3 00002f33: DUP7 00002f34: SWAP2 00002f35: PUSH32 0xf6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b 00002f56: SWAP2 00002f57: SWAP1 00002f58: LOG4 00002f59: POP 00002f5a: PUSH1 0x01 00002f5c: PUSH2 0x0ad0 00002f5f: JUMP 00002f60: JUMPDEST 00002f61: POP 00002f62: PUSH1 0x00 00002f64: PUSH2 0x0ad0 00002f67: JUMP 00002f68: JUMPDEST 00002f69: PUSH1 0x00 00002f6b: PUSH2 0x2f74 00002f6e: DUP4 00002f6f: DUP4 00002f70: PUSH2 0x14cf 00002f73: JUMP 00002f74: JUMPDEST 00002f75: PUSH2 0x2f60 00002f78: JUMPI 00002f79: PUSH1 0x00 00002f7b: DUP4 00002f7c: DUP2 00002f7d: MSTORE 00002f7e: PUSH1 0x20 00002f80: DUP2 00002f81: DUP2 00002f82: MSTORE 00002f83: PUSH1 0x40 00002f85: DUP1 00002f86: DUP4 00002f87: KECCAK256 00002f88: PUSH1 0x01 00002f8a: PUSH1 0x01 00002f8c: PUSH1 0xa0 00002f8e: SHL 00002f8f: SUB 00002f90: DUP7 00002f91: AND 00002f92: DUP5 00002f93: MSTORE 00002f94: SWAP1 00002f95: SWAP2 00002f96: MSTORE 00002f97: SWAP1 00002f98: KECCAK256 00002f99: DUP1 00002f9a: SLOAD 00002f9b: PUSH1 0xff 00002f9d: NOT 00002f9e: AND 00002f9f: PUSH1 0x01 00002fa1: OR 00002fa2: SWAP1 00002fa3: SSTORE 00002fa4: PUSH2 0x2faa 00002fa7: CALLER 00002fa8: SWAP1 00002fa9: JUMP 00002faa: JUMPDEST 00002fab: PUSH1 0x01 00002fad: PUSH1 0x01 00002faf: PUSH1 0xa0 00002fb1: SHL 00002fb2: SUB 00002fb3: AND 00002fb4: DUP3 00002fb5: PUSH1 0x01 00002fb7: PUSH1 0x01 00002fb9: PUSH1 0xa0 00002fbb: SHL 00002fbc: SUB 00002fbd: AND 00002fbe: DUP5 00002fbf: PUSH32 0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d 00002fe0: PUSH1 0x40 00002fe2: MLOAD 00002fe3: PUSH1 0x40 00002fe5: MLOAD 00002fe6: DUP1 00002fe7: SWAP2 00002fe8: SUB 00002fe9: SWAP1 00002fea: LOG4 00002feb: POP 00002fec: PUSH1 0x01 00002fee: PUSH2 0x0ad0 00002ff1: JUMP 00002ff2: JUMPDEST 00002ff3: PUSH1 0x00 00002ff5: PUSH2 0x0ad0 00002ff8: PUSH2 0x2fff 00002ffb: PUSH2 0x318a 00002ffe: JUMP 00002fff: JUMPDEST 00003000: DUP4 00003001: PUSH1 0x40 00003003: MLOAD 00003004: PUSH2 0x1901 00003007: PUSH1 0xf0 00003009: SHL 0000300a: DUP2 0000300b: MSTORE 0000300c: PUSH1 0x02 0000300e: DUP2 0000300f: ADD 00003010: SWAP3 00003011: SWAP1 00003012: SWAP3 00003013: MSTORE 00003014: PUSH1 0x22 00003016: DUP3 00003017: ADD 00003018: MSTORE 00003019: PUSH1 0x42 0000301b: SWAP1 0000301c: KECCAK256 0000301d: SWAP1 0000301e: JUMP 0000301f: JUMPDEST 00003020: PUSH1 0x00 00003022: DUP1 00003023: PUSH1 0x00 00003025: DUP1 00003026: PUSH2 0x302f 00003029: DUP7 0000302a: DUP7 0000302b: PUSH2 0x32b5 0000302e: JUMP 0000302f: JUMPDEST 00003030: SWAP3 00003031: POP 00003032: SWAP3 00003033: POP 00003034: SWAP3 00003035: POP 00003036: PUSH2 0x303f 00003039: DUP3 0000303a: DUP3 0000303b: PUSH2 0x3302 0000303e: JUMP 0000303f: JUMPDEST 00003040: POP 00003041: SWAP1 00003042: SWAP5 00003043: SWAP4 00003044: POP 00003045: POP 00003046: POP 00003047: POP 00003048: JUMP 00003049: JUMPDEST 0000304a: PUSH1 0x03 0000304c: DUP2 0000304d: PUSH1 0x20 0000304f: ADD 00003050: MLOAD 00003051: PUSH1 0x03 00003053: DUP2 00003054: GT 00003055: ISZERO 00003056: PUSH2 0x3061 00003059: JUMPI 0000305a: PUSH2 0x3061 0000305d: PUSH2 0x3866 00003060: JUMP 00003061: JUMPDEST 00003062: EQ 00003063: PUSH2 0x0d45 00003066: JUMPI 00003067: PUSH1 0x1f 00003069: SLOAD 0000306a: PUSH2 0x3077 0000306d: SWAP1 0000306e: PUSH3 0x0f4240 00003072: SWAP1 00003073: PUSH2 0x3c97 00003076: JUMP 00003077: JUMPDEST 00003078: DUP2 00003079: PUSH1 0x60 0000307b: ADD 0000307c: MLOAD 0000307d: LT 0000307e: PUSH2 0x30b2 00003081: JUMPI 00003082: PUSH1 0x01 00003084: PUSH1 0x01 00003086: PUSH1 0xa0 00003088: SHL 00003089: SUB 0000308a: DUP3 0000308b: AND 0000308c: PUSH1 0x00 0000308e: SWAP1 0000308f: DUP2 00003090: MSTORE 00003091: PUSH1 0x27 00003093: PUSH1 0x20 00003095: MSTORE 00003096: PUSH1 0x40 00003098: SWAP1 00003099: KECCAK256 0000309a: DUP1 0000309b: SLOAD 0000309c: PUSH1 0x03 0000309e: SWAP2 0000309f: SWAP1 000030a0: PUSH2 0xff00 000030a3: NOT 000030a4: AND 000030a5: PUSH2 0x0100 000030a8: DUP4 000030a9: JUMPDEST 000030aa: MUL 000030ab: OR 000030ac: SWAP1 000030ad: SSTORE 000030ae: POP 000030af: POP 000030b0: POP 000030b1: JUMP 000030b2: JUMPDEST 000030b3: PUSH1 0x1e 000030b5: SLOAD 000030b6: PUSH2 0x30c3 000030b9: SWAP1 000030ba: PUSH3 0x0f4240 000030be: SWAP1 000030bf: PUSH2 0x3c97 000030c2: JUMP 000030c3: JUMPDEST 000030c4: DUP2 000030c5: PUSH1 0x60 000030c7: ADD 000030c8: MLOAD 000030c9: LT 000030ca: PUSH2 0x30f9 000030cd: JUMPI 000030ce: PUSH1 0x01 000030d0: PUSH1 0x01 000030d2: PUSH1 0xa0 000030d4: SHL 000030d5: SUB 000030d6: DUP3 000030d7: AND 000030d8: PUSH1 0x00 000030da: SWAP1 000030db: DUP2 000030dc: MSTORE 000030dd: PUSH1 0x27 000030df: PUSH1 0x20 000030e1: MSTORE 000030e2: PUSH1 0x40 000030e4: SWAP1 000030e5: KECCAK256 000030e6: DUP1 000030e7: SLOAD 000030e8: PUSH1 0x02 000030ea: SWAP2 000030eb: SWAP1 000030ec: PUSH2 0xff00 000030ef: NOT 000030f0: AND 000030f1: PUSH2 0x0100 000030f4: DUP4 000030f5: PUSH2 0x30a9 000030f8: JUMP 000030f9: JUMPDEST 000030fa: PUSH1 0x1d 000030fc: SLOAD 000030fd: PUSH2 0x310a 00003100: SWAP1 00003101: PUSH3 0x0f4240 00003105: SWAP1 00003106: PUSH2 0x3c97 00003109: JUMP 0000310a: JUMPDEST 0000310b: DUP2 0000310c: PUSH1 0x60 0000310e: ADD 0000310f: MLOAD 00003110: LT 00003111: PUSH2 0x0d45 00003114: JUMPI 00003115: POP 00003116: PUSH1 0x01 00003118: PUSH1 0x01 0000311a: PUSH1 0xa0 0000311c: SHL 0000311d: SUB 0000311e: AND 0000311f: PUSH1 0x00 00003121: SWAP1 00003122: DUP2 00003123: MSTORE 00003124: PUSH1 0x27 00003126: PUSH1 0x20 00003128: MSTORE 00003129: PUSH1 0x40 0000312b: SWAP1 0000312c: KECCAK256 0000312d: DUP1 0000312e: SLOAD 0000312f: PUSH2 0xff00 00003132: NOT 00003133: AND 00003134: PUSH2 0x0100 00003137: OR 00003138: SWAP1 00003139: SSTORE 0000313a: JUMP 0000313b: JUMPDEST 0000313c: PUSH1 0x00 0000313e: DUP3 0000313f: DUP3 00003140: XOR 00003141: DUP3 00003142: DUP5 00003143: LT 00003144: MUL 00003145: DUP3 00003146: XOR 00003147: PUSH2 0x2290 0000314a: JUMP 0000314b: JUMPDEST 0000314c: PUSH1 0x60 0000314e: PUSH1 0x00 00003150: PUSH2 0x3158 00003153: DUP4 00003154: PUSH2 0x33bb 00003157: JUMP 00003158: JUMPDEST 00003159: PUSH1 0x40 0000315b: DUP1 0000315c: MLOAD 0000315d: PUSH1 0x20 0000315f: DUP1 00003160: DUP3 00003161: MSTORE 00003162: DUP2 00003163: DUP4 00003164: ADD 00003165: SWAP1 00003166: SWAP3 00003167: MSTORE 00003168: SWAP2 00003169: SWAP3 0000316a: POP 0000316b: PUSH1 0x00 0000316d: SWAP2 0000316e: SWAP1 0000316f: PUSH1 0x20 00003171: DUP3 00003172: ADD 00003173: DUP2 00003174: DUP1 00003175: CALLDATASIZE 00003176: DUP4 00003177: CALLDATACOPY 00003178: POP 00003179: POP 0000317a: POP 0000317b: SWAP2 0000317c: DUP3 0000317d: MSTORE 0000317e: POP 0000317f: PUSH1 0x20 00003181: DUP2 00003182: ADD 00003183: SWAP3 00003184: SWAP1 00003185: SWAP3 00003186: MSTORE 00003187: POP 00003188: SWAP1 00003189: JUMP 0000318a: JUMPDEST 0000318b: PUSH1 0x00 0000318d: ADDRESS 0000318e: PUSH1 0x01 00003190: PUSH1 0x01 00003192: PUSH1 0xa0 00003194: SHL 00003195: SUB 00003196: PUSH32 0x00000000000000000000000080c1c65463427ea785fb7b03ba84b91f49f272eb 000031b7: AND 000031b8: EQ 000031b9: DUP1 000031ba: ISZERO 000031bb: PUSH2 0x31e3 000031be: JUMPI 000031bf: POP 000031c0: PUSH32 0x0000000000000000000000000000000000000000000000000000000000000001 000031e1: CHAINID 000031e2: EQ 000031e3: JUMPDEST 000031e4: ISZERO 000031e5: PUSH2 0x320d 000031e8: JUMPI 000031e9: POP 000031ea: PUSH32 0xbfcac33433501f4ffd5730b8a8731419d1350f28d0fe740e97e9777d7f6133d2 0000320b: SWAP1 0000320c: JUMP 0000320d: JUMPDEST 0000320e: PUSH2 0x1336 00003211: PUSH1 0x40 00003213: DUP1 00003214: MLOAD 00003215: PUSH32 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f 00003236: PUSH1 0x20 00003238: DUP3 00003239: ADD 0000323a: MSTORE 0000323b: PUSH32 0x3aa853933d94bf5f87075a55123cdf13da42a7bb41deac8382928646c065cc78 0000325c: SWAP2 0000325d: DUP2 0000325e: ADD 0000325f: SWAP2 00003260: SWAP1 00003261: SWAP2 00003262: MSTORE 00003263: PUSH32 0xc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6 00003284: PUSH1 0x60 00003286: DUP3 00003287: ADD 00003288: MSTORE 00003289: CHAINID 0000328a: PUSH1 0x80 0000328c: DUP3 0000328d: ADD 0000328e: MSTORE 0000328f: ADDRESS 00003290: PUSH1 0xa0 00003292: DUP3 00003293: ADD 00003294: MSTORE 00003295: PUSH1 0x00 00003297: SWAP1 00003298: PUSH1 0xc0 0000329a: ADD 0000329b: PUSH1 0x40 0000329d: MLOAD 0000329e: PUSH1 0x20 000032a0: DUP2 000032a1: DUP4 000032a2: SUB 000032a3: SUB 000032a4: DUP2 000032a5: MSTORE 000032a6: SWAP1 000032a7: PUSH1 0x40 000032a9: MSTORE 000032aa: DUP1 000032ab: MLOAD 000032ac: SWAP1 000032ad: PUSH1 0x20 000032af: ADD 000032b0: KECCAK256 000032b1: SWAP1 000032b2: POP 000032b3: SWAP1 000032b4: JUMP 000032b5: JUMPDEST 000032b6: PUSH1 0x00 000032b8: DUP1 000032b9: PUSH1 0x00 000032bb: DUP4 000032bc: MLOAD 000032bd: PUSH1 0x41 000032bf: SUB 000032c0: PUSH2 0x32ef 000032c3: JUMPI 000032c4: PUSH1 0x20 000032c6: DUP5 000032c7: ADD 000032c8: MLOAD 000032c9: PUSH1 0x40 000032cb: DUP6 000032cc: ADD 000032cd: MLOAD 000032ce: PUSH1 0x60 000032d0: DUP7 000032d1: ADD 000032d2: MLOAD 000032d3: PUSH1 0x00 000032d5: BYTE 000032d6: PUSH2 0x32e1 000032d9: DUP9 000032da: DUP3 000032db: DUP6 000032dc: DUP6 000032dd: PUSH2 0x33e3 000032e0: JUMP 000032e1: JUMPDEST 000032e2: SWAP6 000032e3: POP 000032e4: SWAP6 000032e5: POP 000032e6: SWAP6 000032e7: POP 000032e8: POP 000032e9: POP 000032ea: POP 000032eb: PUSH2 0x32fb 000032ee: JUMP 000032ef: JUMPDEST 000032f0: POP 000032f1: POP 000032f2: DUP2 000032f3: MLOAD 000032f4: PUSH1 0x00 000032f6: SWAP2 000032f7: POP 000032f8: PUSH1 0x02 000032fa: SWAP1 000032fb: JUMPDEST 000032fc: SWAP3 000032fd: POP 000032fe: SWAP3 000032ff: POP 00003300: SWAP3 00003301: JUMP 00003302: JUMPDEST 00003303: PUSH1 0x00 00003305: DUP3 00003306: PUSH1 0x03 00003308: DUP2 00003309: GT 0000330a: ISZERO 0000330b: PUSH2 0x3316 0000330e: JUMPI 0000330f: PUSH2 0x3316 00003312: PUSH2 0x3866 00003315: JUMP 00003316: JUMPDEST 00003317: SUB 00003318: PUSH2 0x331f 0000331b: JUMPI 0000331c: POP 0000331d: POP 0000331e: JUMP 0000331f: JUMPDEST 00003320: PUSH1 0x01 00003322: DUP3 00003323: PUSH1 0x03 00003325: DUP2 00003326: GT 00003327: ISZERO 00003328: PUSH2 0x3333 0000332b: JUMPI 0000332c: PUSH2 0x3333 0000332f: PUSH2 0x3866 00003332: JUMP 00003333: JUMPDEST 00003334: SUB 00003335: PUSH2 0x3351 00003338: JUMPI 00003339: PUSH1 0x40 0000333b: MLOAD 0000333c: PUSH4 0xf645eedf 00003341: PUSH1 0xe0 00003343: SHL 00003344: DUP2 00003345: MSTORE 00003346: PUSH1 0x04 00003348: ADD 00003349: PUSH1 0x40 0000334b: MLOAD 0000334c: DUP1 0000334d: SWAP2 0000334e: SUB 0000334f: SWAP1 00003350: REVERT 00003351: JUMPDEST 00003352: PUSH1 0x02 00003354: DUP3 00003355: PUSH1 0x03 00003357: DUP2 00003358: GT 00003359: ISZERO 0000335a: PUSH2 0x3365 0000335d: JUMPI 0000335e: PUSH2 0x3365 00003361: PUSH2 0x3866 00003364: JUMP 00003365: JUMPDEST 00003366: SUB 00003367: PUSH2 0x3386 0000336a: JUMPI 0000336b: PUSH1 0x40 0000336d: MLOAD 0000336e: PUSH4 0xfce698f7 00003373: PUSH1 0xe0 00003375: SHL 00003376: DUP2 00003377: MSTORE 00003378: PUSH1 0x04 0000337a: DUP2 0000337b: ADD 0000337c: DUP3 0000337d: SWAP1 0000337e: MSTORE 0000337f: PUSH1 0x24 00003381: ADD 00003382: PUSH2 0x0de4 00003385: JUMP 00003386: JUMPDEST 00003387: PUSH1 0x03 00003389: DUP3 0000338a: PUSH1 0x03 0000338c: DUP2 0000338d: GT 0000338e: ISZERO 0000338f: PUSH2 0x339a 00003392: JUMPI 00003393: PUSH2 0x339a 00003396: PUSH2 0x3866 00003399: JUMP 0000339a: JUMPDEST 0000339b: SUB 0000339c: PUSH2 0x0d45 0000339f: JUMPI 000033a0: PUSH1 0x40 000033a2: MLOAD 000033a3: PUSH4 0x35e2f383 000033a8: PUSH1 0xe2 000033aa: SHL 000033ab: DUP2 000033ac: MSTORE 000033ad: PUSH1 0x04 000033af: DUP2 000033b0: ADD 000033b1: DUP3 000033b2: SWAP1 000033b3: MSTORE 000033b4: PUSH1 0x24 000033b6: ADD 000033b7: PUSH2 0x0de4 000033ba: JUMP 000033bb: JUMPDEST 000033bc: PUSH1 0x00 000033be: PUSH1 0xff 000033c0: DUP3 000033c1: AND 000033c2: PUSH1 0x1f 000033c4: DUP2 000033c5: GT 000033c6: ISZERO 000033c7: PUSH2 0x0ad0 000033ca: JUMPI 000033cb: PUSH1 0x40 000033cd: MLOAD 000033ce: PUSH4 0x2cd44ac3 000033d3: PUSH1 0xe2 000033d5: SHL 000033d6: DUP2 000033d7: MSTORE 000033d8: PUSH1 0x04 000033da: ADD 000033db: PUSH1 0x40 000033dd: MLOAD 000033de: DUP1 000033df: SWAP2 000033e0: SUB 000033e1: SWAP1 000033e2: REVERT 000033e3: JUMPDEST 000033e4: PUSH1 0x00 000033e6: DUP1 000033e7: DUP1 000033e8: PUSH32 0x7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0 00003409: DUP5 0000340a: GT 0000340b: ISZERO 0000340c: PUSH2 0x341e 0000340f: JUMPI 00003410: POP 00003411: PUSH1 0x00 00003413: SWAP2 00003414: POP 00003415: PUSH1 0x03 00003417: SWAP1 00003418: POP 00003419: DUP3 0000341a: PUSH2 0x34a8 0000341d: JUMP 0000341e: JUMPDEST 0000341f: PUSH1 0x40 00003421: DUP1 00003422: MLOAD 00003423: PUSH1 0x00 00003425: DUP1 00003426: DUP3 00003427: MSTORE 00003428: PUSH1 0x20 0000342a: DUP3 0000342b: ADD 0000342c: DUP1 0000342d: DUP5 0000342e: MSTORE 0000342f: DUP11 00003430: SWAP1 00003431: MSTORE 00003432: PUSH1 0xff 00003434: DUP10 00003435: AND 00003436: SWAP3 00003437: DUP3 00003438: ADD 00003439: SWAP3 0000343a: SWAP1 0000343b: SWAP3 0000343c: MSTORE 0000343d: PUSH1 0x60 0000343f: DUP2 00003440: ADD 00003441: DUP8 00003442: SWAP1 00003443: MSTORE 00003444: PUSH1 0x80 00003446: DUP2 00003447: ADD 00003448: DUP7 00003449: SWAP1 0000344a: MSTORE 0000344b: PUSH1 0x01 0000344d: SWAP1 0000344e: PUSH1 0xa0 00003450: ADD 00003451: PUSH1 0x20 00003453: PUSH1 0x40 00003455: MLOAD 00003456: PUSH1 0x20 00003458: DUP2 00003459: SUB 0000345a: SWAP1 0000345b: DUP1 0000345c: DUP5 0000345d: SUB 0000345e: SWAP1 0000345f: DUP6 00003460: GAS 00003461: STATICCALL 00003462: ISZERO 00003463: DUP1 00003464: ISZERO 00003465: PUSH2 0x3472 00003468: JUMPI 00003469: RETURNDATASIZE 0000346a: PUSH1 0x00 0000346c: DUP1 0000346d: RETURNDATACOPY 0000346e: RETURNDATASIZE 0000346f: PUSH1 0x00 00003471: REVERT 00003472: JUMPDEST 00003473: POP 00003474: POP 00003475: PUSH1 0x40 00003477: MLOAD 00003478: PUSH1 0x1f 0000347a: NOT 0000347b: ADD 0000347c: MLOAD 0000347d: SWAP2 0000347e: POP 0000347f: POP 00003480: PUSH1 0x01 00003482: PUSH1 0x01 00003484: PUSH1 0xa0 00003486: SHL 00003487: SUB 00003488: DUP2 00003489: AND 0000348a: PUSH2 0x349e 0000348d: JUMPI 0000348e: POP 0000348f: PUSH1 0x00 00003491: SWAP3 00003492: POP 00003493: PUSH1 0x01 00003495: SWAP2 00003496: POP 00003497: DUP3 00003498: SWAP1 00003499: POP 0000349a: PUSH2 0x34a8 0000349d: JUMP 0000349e: JUMPDEST 0000349f: SWAP3 000034a0: POP 000034a1: PUSH1 0x00 000034a3: SWAP2 000034a4: POP 000034a5: DUP2 000034a6: SWAP1 000034a7: POP 000034a8: JUMPDEST 000034a9: SWAP5 000034aa: POP 000034ab: SWAP5 000034ac: POP 000034ad: SWAP5 000034ae: SWAP2 000034af: POP 000034b0: POP 000034b1: JUMP 000034b2: JUMPDEST 000034b3: PUSH1 0x0c 000034b5: DUP4 000034b6: ADD 000034b7: SWAP2 000034b8: DUP4 000034b9: SWAP1 000034ba: DUP3 000034bb: ISZERO 000034bc: PUSH2 0x34ea 000034bf: JUMPI 000034c0: SWAP2 000034c1: PUSH1 0x80 000034c3: MUL 000034c4: DUP3 000034c5: ADD 000034c6: JUMPDEST 000034c7: DUP3 000034c8: DUP2 000034c9: GT 000034ca: ISZERO 000034cb: PUSH2 0x34ea 000034ce: JUMPI 000034cf: PUSH2 0x34da 000034d2: DUP3 000034d3: DUP5 000034d4: PUSH1 0x04 000034d6: PUSH2 0x34f6 000034d9: JUMP 000034da: JUMPDEST 000034db: POP 000034dc: SWAP2 000034dd: PUSH1 0x80 000034df: ADD 000034e0: SWAP2 000034e1: SWAP1 000034e2: PUSH1 0x04 000034e4: ADD 000034e5: SWAP1 000034e6: PUSH2 0x34c6 000034e9: JUMP 000034ea: JUMPDEST 000034eb: POP 000034ec: PUSH2 0x2d02 000034ef: SWAP3 000034f0: SWAP2 000034f1: POP 000034f2: PUSH2 0x35bd 000034f5: JUMP 000034f6: JUMPDEST 000034f7: DUP3 000034f8: PUSH1 0x04 000034fa: DUP2 000034fb: ADD 000034fc: SWAP3 000034fd: DUP3 000034fe: ISZERO 000034ff: PUSH2 0x3524 00003502: JUMPI 00003503: SWAP2 00003504: PUSH1 0x20 00003506: MUL 00003507: DUP3 00003508: ADD 00003509: JUMPDEST 0000350a: DUP3 0000350b: DUP2 0000350c: GT 0000350d: ISZERO 0000350e: PUSH2 0x3524 00003511: JUMPI 00003512: DUP3 00003513: CALLDATALOAD 00003514: DUP3 00003515: SSTORE 00003516: SWAP2 00003517: PUSH1 0x20 00003519: ADD 0000351a: SWAP2 0000351b: SWAP1 0000351c: PUSH1 0x01 0000351e: ADD 0000351f: SWAP1 00003520: PUSH2 0x3509 00003523: JUMP 00003524: JUMPDEST 00003525: POP 00003526: PUSH2 0x2d02 00003529: SWAP3 0000352a: SWAP2 0000352b: POP 0000352c: PUSH2 0x35e5 0000352f: JUMP 00003530: JUMPDEST 00003531: DUP3 00003532: DUP1 00003533: SLOAD 00003534: DUP3 00003535: DUP3 00003536: SSTORE 00003537: SWAP1 00003538: PUSH1 0x00 0000353a: MSTORE 0000353b: PUSH1 0x20 0000353d: PUSH1 0x00 0000353f: KECCAK256 00003540: SWAP1 00003541: DUP2 00003542: ADD 00003543: SWAP3 00003544: DUP3 00003545: ISZERO 00003546: PUSH2 0x3524 00003549: JUMPI 0000354a: SWAP2 0000354b: PUSH1 0x20 0000354d: MUL 0000354e: DUP3 0000354f: ADD 00003550: JUMPDEST 00003551: DUP3 00003552: DUP2 00003553: GT 00003554: ISZERO 00003555: PUSH2 0x3524 00003558: JUMPI 00003559: DUP2 0000355a: SLOAD 0000355b: PUSH1 0x01 0000355d: PUSH1 0x01 0000355f: PUSH1 0xa0 00003561: SHL 00003562: SUB 00003563: NOT 00003564: AND 00003565: PUSH1 0x01 00003567: PUSH1 0x01 00003569: PUSH1 0xa0 0000356b: SHL 0000356c: SUB 0000356d: DUP5 0000356e: CALLDATALOAD 0000356f: AND 00003570: OR 00003571: DUP3 00003572: SSTORE 00003573: PUSH1 0x20 00003575: SWAP1 00003576: SWAP3 00003577: ADD 00003578: SWAP2 00003579: PUSH1 0x01 0000357b: SWAP1 0000357c: SWAP2 0000357d: ADD 0000357e: SWAP1 0000357f: PUSH2 0x3550 00003582: JUMP 00003583: JUMPDEST 00003584: DUP3 00003585: DUP1 00003586: SLOAD 00003587: DUP3 00003588: DUP3 00003589: SSTORE 0000358a: SWAP1 0000358b: PUSH1 0x00 0000358d: MSTORE 0000358e: PUSH1 0x20 00003590: PUSH1 0x00 00003592: KECCAK256 00003593: SWAP1 00003594: DUP2 00003595: ADD 00003596: SWAP3 00003597: DUP3 00003598: ISZERO 00003599: PUSH2 0x3524 0000359c: JUMPI 0000359d: SWAP2 0000359e: PUSH1 0x20 000035a0: MUL 000035a1: DUP3 000035a2: ADD 000035a3: DUP3 000035a4: DUP2 000035a5: GT 000035a6: ISZERO 000035a7: PUSH2 0x3524 000035aa: JUMPI 000035ab: DUP3 000035ac: CALLDATALOAD 000035ad: DUP3 000035ae: SSTORE 000035af: SWAP2 000035b0: PUSH1 0x20 000035b2: ADD 000035b3: SWAP2 000035b4: SWAP1 000035b5: PUSH1 0x01 000035b7: ADD 000035b8: SWAP1 000035b9: PUSH2 0x3509 000035bc: JUMP 000035bd: JUMPDEST 000035be: DUP1 000035bf: DUP3 000035c0: GT 000035c1: ISZERO 000035c2: PUSH2 0x2d02 000035c5: JUMPI 000035c6: PUSH1 0x00 000035c8: DUP1 000035c9: DUP3 000035ca: SSTORE 000035cb: PUSH1 0x01 000035cd: DUP3 000035ce: ADD 000035cf: DUP2 000035d0: SWAP1 000035d1: SSTORE 000035d2: PUSH1 0x02 000035d4: DUP3 000035d5: ADD 000035d6: DUP2 000035d7: SWAP1 000035d8: SSTORE 000035d9: PUSH1 0x03 000035db: DUP3 000035dc: ADD 000035dd: SSTORE 000035de: PUSH1 0x04 000035e0: ADD 000035e1: PUSH2 0x35bd 000035e4: JUMP 000035e5: JUMPDEST 000035e6: JUMPDEST 000035e7: DUP1 000035e8: DUP3 000035e9: GT 000035ea: ISZERO 000035eb: PUSH2 0x2d02 000035ee: JUMPI 000035ef: PUSH1 0x00 000035f1: DUP2 000035f2: SSTORE 000035f3: PUSH1 0x01 000035f5: ADD 000035f6: PUSH2 0x35e6 000035f9: JUMP 000035fa: JUMPDEST 000035fb: PUSH1 0x00 000035fd: PUSH1 0x20 000035ff: DUP3 00003600: DUP5 00003601: SUB 00003602: SLT 00003603: ISZERO 00003604: PUSH2 0x360c 00003607: JUMPI 00003608: PUSH1 0x00 0000360a: DUP1 0000360b: REVERT 0000360c: JUMPDEST 0000360d: DUP2 0000360e: CALLDATALOAD 0000360f: PUSH1 0x01 00003611: PUSH1 0x01 00003613: PUSH1 0xe0 00003615: SHL 00003616: SUB 00003617: NOT 00003618: DUP2 00003619: AND 0000361a: DUP2 0000361b: EQ 0000361c: PUSH2 0x2290 0000361f: JUMPI 00003620: PUSH1 0x00 00003622: DUP1 00003623: REVERT 00003624: JUMPDEST 00003625: PUSH1 0x00 00003627: PUSH1 0x20 00003629: DUP3 0000362a: DUP5 0000362b: SUB 0000362c: SLT 0000362d: ISZERO 0000362e: PUSH2 0x3636 00003631: JUMPI 00003632: PUSH1 0x00 00003634: DUP1 00003635: REVERT 00003636: JUMPDEST 00003637: POP 00003638: CALLDATALOAD 00003639: SWAP2 0000363a: SWAP1 0000363b: POP 0000363c: JUMP 0000363d: JUMPDEST 0000363e: PUSH1 0x01 00003640: PUSH1 0x01 00003642: PUSH1 0xa0 00003644: SHL 00003645: SUB 00003646: DUP2 00003647: AND 00003648: DUP2 00003649: EQ 0000364a: PUSH2 0x0cd2 0000364d: JUMPI 0000364e: PUSH1 0x00 00003650: DUP1 00003651: REVERT 00003652: JUMPDEST 00003653: PUSH4 0x4e487b71 00003658: PUSH1 0xe0 0000365a: SHL 0000365b: PUSH1 0x00 0000365d: MSTORE 0000365e: PUSH1 0x41 00003660: PUSH1 0x04 00003662: MSTORE 00003663: PUSH1 0x24 00003665: PUSH1 0x00 00003667: REVERT 00003668: JUMPDEST 00003669: PUSH1 0x00 0000366b: DUP1 0000366c: PUSH1 0x00 0000366e: DUP1 0000366f: PUSH1 0x00 00003671: DUP1 00003672: PUSH1 0x00 00003674: PUSH1 0xe0 00003676: DUP9 00003677: DUP11 00003678: SUB 00003679: SLT 0000367a: ISZERO 0000367b: PUSH2 0x3683 0000367e: JUMPI 0000367f: PUSH1 0x00 00003681: DUP1 00003682: REVERT 00003683: JUMPDEST 00003684: DUP8 00003685: CALLDATALOAD 00003686: SWAP7 00003687: POP 00003688: PUSH1 0x20 0000368a: DUP9 0000368b: ADD 0000368c: CALLDATALOAD 0000368d: SWAP6 0000368e: POP 0000368f: PUSH1 0x40 00003691: DUP9 00003692: ADD 00003693: CALLDATALOAD 00003694: PUSH2 0x369c 00003697: DUP2 00003698: PUSH2 0x363d 0000369b: JUMP 0000369c: JUMPDEST 0000369d: SWAP5 0000369e: POP 0000369f: PUSH1 0x60 000036a1: DUP9 000036a2: ADD 000036a3: CALLDATALOAD 000036a4: SWAP4 000036a5: POP 000036a6: PUSH1 0x80 000036a8: DUP9 000036a9: ADD 000036aa: CALLDATALOAD 000036ab: SWAP3 000036ac: POP 000036ad: PUSH1 0xa0 000036af: DUP9 000036b0: ADD 000036b1: CALLDATALOAD 000036b2: SWAP2 000036b3: POP 000036b4: PUSH1 0xc0 000036b6: DUP9 000036b7: ADD 000036b8: CALLDATALOAD 000036b9: PUSH8 0xffffffffffffffff 000036c2: DUP2 000036c3: GT 000036c4: ISZERO 000036c5: PUSH2 0x36cd 000036c8: JUMPI 000036c9: PUSH1 0x00 000036cb: DUP1 000036cc: REVERT 000036cd: JUMPDEST 000036ce: DUP9 000036cf: ADD 000036d0: PUSH1 0x1f 000036d2: DUP2 000036d3: ADD 000036d4: DUP11 000036d5: SGT 000036d6: PUSH2 0x36de 000036d9: JUMPI 000036da: PUSH1 0x00 000036dc: DUP1 000036dd: REVERT 000036de: JUMPDEST 000036df: DUP1 000036e0: CALLDATALOAD 000036e1: PUSH8 0xffffffffffffffff 000036ea: DUP2 000036eb: GT 000036ec: ISZERO 000036ed: PUSH2 0x36f8 000036f0: JUMPI 000036f1: PUSH2 0x36f8 000036f4: PUSH2 0x3652 000036f7: JUMP 000036f8: JUMPDEST 000036f9: PUSH1 0x40 000036fb: MLOAD 000036fc: PUSH1 0x1f 000036fe: DUP3 000036ff: ADD 00003700: PUSH1 0x1f 00003702: NOT 00003703: SWAP1 00003704: DUP2 00003705: AND 00003706: PUSH1 0x3f 00003708: ADD 00003709: AND 0000370a: DUP2 0000370b: ADD 0000370c: PUSH8 0xffffffffffffffff 00003715: DUP2 00003716: GT 00003717: DUP3 00003718: DUP3 00003719: LT 0000371a: OR 0000371b: ISZERO 0000371c: PUSH2 0x3727 0000371f: JUMPI 00003720: PUSH2 0x3727 00003723: PUSH2 0x3652 00003726: JUMP 00003727: JUMPDEST 00003728: PUSH1 0x40 0000372a: MSTORE 0000372b: DUP2 0000372c: DUP2 0000372d: MSTORE 0000372e: DUP3 0000372f: DUP3 00003730: ADD 00003731: PUSH1 0x20 00003733: ADD 00003734: DUP13 00003735: LT 00003736: ISZERO 00003737: PUSH2 0x373f 0000373a: JUMPI 0000373b: PUSH1 0x00 0000373d: DUP1 0000373e: REVERT 0000373f: JUMPDEST 00003740: DUP2 00003741: PUSH1 0x20 00003743: DUP5 00003744: ADD 00003745: PUSH1 0x20 00003747: DUP4 00003748: ADD 00003749: CALLDATACOPY 0000374a: PUSH1 0x00 0000374c: PUSH1 0x20 0000374e: DUP4 0000374f: DUP4 00003750: ADD 00003751: ADD 00003752: MSTORE 00003753: DUP1 00003754: SWAP4 00003755: POP 00003756: POP 00003757: POP 00003758: POP 00003759: SWAP3 0000375a: SWAP6 0000375b: SWAP9 0000375c: SWAP2 0000375d: SWAP5 0000375e: SWAP8 0000375f: POP 00003760: SWAP3 00003761: SWAP6 00003762: POP 00003763: JUMP 00003764: JUMPDEST 00003765: PUSH1 0x00 00003767: DUP1 00003768: PUSH1 0x40 0000376a: DUP4 0000376b: DUP6 0000376c: SUB 0000376d: SLT 0000376e: ISZERO 0000376f: PUSH2 0x3777 00003772: JUMPI 00003773: PUSH1 0x00 00003775: DUP1 00003776: REVERT 00003777: JUMPDEST 00003778: DUP3 00003779: CALLDATALOAD 0000377a: SWAP2 0000377b: POP 0000377c: PUSH1 0x20 0000377e: DUP4 0000377f: ADD 00003780: CALLDATALOAD 00003781: PUSH2 0x3789 00003784: DUP2 00003785: PUSH2 0x363d 00003788: JUMP 00003789: JUMPDEST 0000378a: DUP1 0000378b: SWAP2 0000378c: POP 0000378d: POP 0000378e: SWAP3 0000378f: POP 00003790: SWAP3 00003791: SWAP1 00003792: POP 00003793: JUMP 00003794: JUMPDEST 00003795: PUSH1 0x00 00003797: PUSH2 0x0180 0000379a: DUP3 0000379b: DUP5 0000379c: SUB 0000379d: SLT 0000379e: ISZERO 0000379f: PUSH2 0x37a7 000037a2: JUMPI 000037a3: PUSH1 0x00 000037a5: DUP1 000037a6: REVERT 000037a7: JUMPDEST 000037a8: DUP3 000037a9: PUSH2 0x0180 000037ac: DUP4 000037ad: ADD 000037ae: GT 000037af: ISZERO 000037b0: PUSH2 0x37b8 000037b3: JUMPI 000037b4: PUSH1 0x00 000037b6: DUP1 000037b7: REVERT 000037b8: JUMPDEST 000037b9: POP 000037ba: SWAP2 000037bb: SWAP1 000037bc: POP 000037bd: JUMP 000037be: JUMPDEST 000037bf: PUSH1 0x00 000037c1: DUP1 000037c2: PUSH1 0x00 000037c4: PUSH1 0x60 000037c6: DUP5 000037c7: DUP7 000037c8: SUB 000037c9: SLT 000037ca: ISZERO 000037cb: PUSH2 0x37d3 000037ce: JUMPI 000037cf: PUSH1 0x00 000037d1: DUP1 000037d2: REVERT 000037d3: JUMPDEST 000037d4: DUP4 000037d5: CALLDATALOAD 000037d6: PUSH2 0x37de 000037d9: DUP2 000037da: PUSH2 0x363d 000037dd: JUMP 000037de: JUMPDEST 000037df: SWAP3 000037e0: POP 000037e1: PUSH1 0x20 000037e3: DUP5 000037e4: ADD 000037e5: CALLDATALOAD 000037e6: PUSH2 0x37ee 000037e9: DUP2 000037ea: PUSH2 0x363d 000037ed: JUMP 000037ee: JUMPDEST 000037ef: SWAP3 000037f0: SWAP6 000037f1: SWAP3 000037f2: SWAP5 000037f3: POP 000037f4: POP 000037f5: POP 000037f6: PUSH1 0x40 000037f8: SWAP2 000037f9: SWAP1 000037fa: SWAP2 000037fb: ADD 000037fc: CALLDATALOAD 000037fd: SWAP1 000037fe: JUMP 000037ff: JUMPDEST 00003800: PUSH1 0x00 00003802: PUSH1 0x20 00003804: DUP3 00003805: DUP5 00003806: SUB 00003807: SLT 00003808: ISZERO 00003809: PUSH2 0x3811 0000380c: JUMPI 0000380d: PUSH1 0x00 0000380f: DUP1 00003810: REVERT 00003811: JUMPDEST 00003812: DUP2 00003813: CALLDATALOAD 00003814: PUSH2 0x2290 00003817: DUP2 00003818: PUSH2 0x363d 0000381b: JUMP 0000381c: JUMPDEST 0000381d: PUSH1 0x00 0000381f: PUSH1 0x20 00003821: DUP3 00003822: DUP5 00003823: SUB 00003824: SLT 00003825: ISZERO 00003826: PUSH2 0x382e 00003829: JUMPI 0000382a: PUSH1 0x00 0000382c: DUP1 0000382d: REVERT 0000382e: JUMPDEST 0000382f: DUP2 00003830: CALLDATALOAD 00003831: PUSH6 0xffffffffffff 00003838: DUP2 00003839: AND 0000383a: DUP2 0000383b: EQ 0000383c: PUSH2 0x2290 0000383f: JUMPI 00003840: PUSH1 0x00 00003842: DUP1 00003843: REVERT 00003844: JUMPDEST 00003845: PUSH1 0x00 00003847: DUP1 00003848: PUSH1 0x40 0000384a: DUP4 0000384b: DUP6 0000384c: SUB 0000384d: SLT 0000384e: ISZERO 0000384f: PUSH2 0x3857 00003852: JUMPI 00003853: PUSH1 0x00 00003855: DUP1 00003856: REVERT 00003857: JUMPDEST 00003858: POP 00003859: POP 0000385a: DUP1 0000385b: CALLDATALOAD 0000385c: SWAP3 0000385d: PUSH1 0x20 0000385f: SWAP1 00003860: SWAP2 00003861: ADD 00003862: CALLDATALOAD 00003863: SWAP2 00003864: POP 00003865: JUMP 00003866: JUMPDEST 00003867: PUSH4 0x4e487b71 0000386c: PUSH1 0xe0 0000386e: SHL 0000386f: PUSH1 0x00 00003871: MSTORE 00003872: PUSH1 0x21 00003874: PUSH1 0x04 00003876: MSTORE 00003877: PUSH1 0x24 00003879: PUSH1 0x00 0000387b: REVERT 0000387c: JUMPDEST 0000387d: PUSH1 0x04 0000387f: DUP2 00003880: LT 00003881: PUSH2 0x389a 00003884: JUMPI 00003885: PUSH4 0x4e487b71 0000388a: PUSH1 0xe0 0000388c: SHL 0000388d: PUSH1 0x00 0000388f: MSTORE 00003890: PUSH1 0x21 00003892: PUSH1 0x04 00003894: MSTORE 00003895: PUSH1 0x24 00003897: PUSH1 0x00 00003899: REVERT 0000389a: JUMPDEST 0000389b: SWAP1 0000389c: MSTORE 0000389d: JUMP 0000389e: JUMPDEST 0000389f: PUSH1 0xa0 000038a1: DUP2 000038a2: ADD 000038a3: PUSH2 0x38ac 000038a6: DUP3 000038a7: DUP9 000038a8: PUSH2 0x387c 000038ab: JUMP 000038ac: JUMPDEST 000038ad: PUSH2 0x38b9 000038b0: PUSH1 0x20 000038b2: DUP4 000038b3: ADD 000038b4: DUP8 000038b5: PUSH2 0x387c 000038b8: JUMP 000038b9: JUMPDEST 000038ba: PUSH1 0x40 000038bc: DUP3 000038bd: ADD 000038be: SWAP5 000038bf: SWAP1 000038c0: SWAP5 000038c1: MSTORE 000038c2: PUSH1 0x60 000038c4: DUP2 000038c5: ADD 000038c6: SWAP3 000038c7: SWAP1 000038c8: SWAP3 000038c9: MSTORE 000038ca: PUSH1 0x01 000038cc: PUSH1 0x01 000038ce: PUSH1 0xa0 000038d0: SHL 000038d1: SUB 000038d2: AND 000038d3: PUSH1 0x80 000038d5: SWAP1 000038d6: SWAP2 000038d7: ADD 000038d8: MSTORE 000038d9: SWAP3 000038da: SWAP2 000038db: POP 000038dc: POP 000038dd: JUMP 000038de: JUMPDEST 000038df: PUSH1 0x00 000038e1: DUP2 000038e2: MLOAD 000038e3: DUP1 000038e4: DUP5 000038e5: MSTORE 000038e6: PUSH1 0x00 000038e8: JUMPDEST 000038e9: DUP2 000038ea: DUP2 000038eb: LT 000038ec: ISZERO 000038ed: PUSH2 0x3904 000038f0: JUMPI 000038f1: PUSH1 0x20 000038f3: DUP2 000038f4: DUP6 000038f5: ADD 000038f6: DUP2 000038f7: ADD 000038f8: MLOAD 000038f9: DUP7 000038fa: DUP4 000038fb: ADD 000038fc: DUP3 000038fd: ADD 000038fe: MSTORE 000038ff: ADD 00003900: PUSH2 0x38e8 00003903: JUMP 00003904: JUMPDEST 00003905: POP 00003906: PUSH1 0x00 00003908: PUSH1 0x20 0000390a: DUP3 0000390b: DUP7 0000390c: ADD 0000390d: ADD 0000390e: MSTORE 0000390f: PUSH1 0x20 00003911: PUSH1 0x1f 00003913: NOT 00003914: PUSH1 0x1f 00003916: DUP4 00003917: ADD 00003918: AND 00003919: DUP6 0000391a: ADD 0000391b: ADD 0000391c: SWAP2 0000391d: POP 0000391e: POP 0000391f: SWAP3 00003920: SWAP2 00003921: POP 00003922: POP 00003923: JUMP 00003924: JUMPDEST 00003925: PUSH1 0xff 00003927: PUSH1 0xf8 00003929: SHL 0000392a: DUP9 0000392b: AND 0000392c: DUP2 0000392d: MSTORE 0000392e: PUSH1 0xe0 00003930: PUSH1 0x20 00003932: DUP3 00003933: ADD 00003934: MSTORE 00003935: PUSH1 0x00 00003937: PUSH2 0x3943 0000393a: PUSH1 0xe0 0000393c: DUP4 0000393d: ADD 0000393e: DUP10 0000393f: PUSH2 0x38de 00003942: JUMP 00003943: JUMPDEST 00003944: DUP3 00003945: DUP2 00003946: SUB 00003947: PUSH1 0x40 00003949: DUP5 0000394a: ADD 0000394b: MSTORE 0000394c: PUSH2 0x3955 0000394f: DUP2 00003950: DUP10 00003951: PUSH2 0x38de 00003954: JUMP 00003955: JUMPDEST 00003956: PUSH1 0x60 00003958: DUP5 00003959: ADD 0000395a: DUP9 0000395b: SWAP1 0000395c: MSTORE 0000395d: PUSH1 0x01 0000395f: PUSH1 0x01 00003961: PUSH1 0xa0 00003963: SHL 00003964: SUB 00003965: DUP8 00003966: AND 00003967: PUSH1 0x80 00003969: DUP6 0000396a: ADD 0000396b: MSTORE 0000396c: PUSH1 0xa0 0000396e: DUP5 0000396f: ADD 00003970: DUP7 00003971: SWAP1 00003972: MSTORE 00003973: DUP4 00003974: DUP2 00003975: SUB 00003976: PUSH1 0xc0 00003978: DUP6 00003979: ADD 0000397a: MSTORE 0000397b: DUP5 0000397c: MLOAD 0000397d: DUP1 0000397e: DUP3 0000397f: MSTORE 00003980: PUSH1 0x20 00003982: DUP1 00003983: DUP8 00003984: ADD 00003985: SWAP4 00003986: POP 00003987: SWAP1 00003988: SWAP2 00003989: ADD 0000398a: SWAP1 0000398b: PUSH1 0x00 0000398d: JUMPDEST 0000398e: DUP2 0000398f: DUP2 00003990: LT 00003991: ISZERO 00003992: PUSH2 0x39ab 00003995: JUMPI 00003996: DUP4 00003997: MLOAD 00003998: DUP4 00003999: MSTORE 0000399a: PUSH1 0x20 0000399c: SWAP4 0000399d: DUP5 0000399e: ADD 0000399f: SWAP4 000039a0: SWAP1 000039a1: SWAP3 000039a2: ADD 000039a3: SWAP2 000039a4: PUSH1 0x01 000039a6: ADD 000039a7: PUSH2 0x398d 000039aa: JUMP 000039ab: JUMPDEST 000039ac: POP 000039ad: SWAP1 000039ae: SWAP12 000039af: SWAP11 000039b0: POP 000039b1: POP 000039b2: POP 000039b3: POP 000039b4: POP 000039b5: POP 000039b6: POP 000039b7: POP 000039b8: POP 000039b9: POP 000039ba: POP 000039bb: JUMP 000039bc: JUMPDEST 000039bd: PUSH1 0x00 000039bf: PUSH1 0x80 000039c1: DUP3 000039c2: DUP5 000039c3: SUB 000039c4: SLT 000039c5: ISZERO 000039c6: PUSH2 0x39ce 000039c9: JUMPI 000039ca: PUSH1 0x00 000039cc: DUP1 000039cd: REVERT 000039ce: JUMPDEST 000039cf: DUP3 000039d0: PUSH1 0x80 000039d2: DUP4 000039d3: ADD 000039d4: GT 000039d5: ISZERO 000039d6: PUSH2 0x37b8 000039d9: JUMPI 000039da: PUSH1 0x00 000039dc: DUP1 000039dd: REVERT 000039de: JUMPDEST 000039df: PUSH1 0x00 000039e1: DUP1 000039e2: DUP4 000039e3: PUSH1 0x1f 000039e5: DUP5 000039e6: ADD 000039e7: SLT 000039e8: PUSH2 0x39f0 000039eb: JUMPI 000039ec: PUSH1 0x00 000039ee: DUP1 000039ef: REVERT 000039f0: JUMPDEST 000039f1: POP 000039f2: DUP2 000039f3: CALLDATALOAD 000039f4: PUSH8 0xffffffffffffffff 000039fd: DUP2 000039fe: GT 000039ff: ISZERO 00003a00: PUSH2 0x3a08 00003a03: JUMPI 00003a04: PUSH1 0x00 00003a06: DUP1 00003a07: REVERT 00003a08: JUMPDEST 00003a09: PUSH1 0x20 00003a0b: DUP4 00003a0c: ADD 00003a0d: SWAP2 00003a0e: POP 00003a0f: DUP4 00003a10: PUSH1 0x20 00003a12: DUP3 00003a13: PUSH1 0x05 00003a15: SHL 00003a16: DUP6 00003a17: ADD 00003a18: ADD 00003a19: GT 00003a1a: ISZERO 00003a1b: PUSH2 0x3a23 00003a1e: JUMPI 00003a1f: PUSH1 0x00 00003a21: DUP1 00003a22: REVERT 00003a23: JUMPDEST 00003a24: SWAP3 00003a25: POP 00003a26: SWAP3 00003a27: SWAP1 00003a28: POP 00003a29: JUMP 00003a2a: JUMPDEST 00003a2b: PUSH1 0x00 00003a2d: DUP1 00003a2e: PUSH1 0x00 00003a30: DUP1 00003a31: PUSH1 0x00 00003a33: PUSH1 0x60 00003a35: DUP7 00003a36: DUP9 00003a37: SUB 00003a38: SLT 00003a39: ISZERO 00003a3a: PUSH2 0x3a42 00003a3d: JUMPI 00003a3e: PUSH1 0x00 00003a40: DUP1 00003a41: REVERT 00003a42: JUMPDEST 00003a43: DUP6 00003a44: CALLDATALOAD 00003a45: PUSH8 0xffffffffffffffff 00003a4e: DUP2 00003a4f: GT 00003a50: ISZERO 00003a51: PUSH2 0x3a59 00003a54: JUMPI 00003a55: PUSH1 0x00 00003a57: DUP1 00003a58: REVERT 00003a59: JUMPDEST 00003a5a: PUSH2 0x3a65 00003a5d: DUP9 00003a5e: DUP3 00003a5f: DUP10 00003a60: ADD 00003a61: PUSH2 0x39de 00003a64: JUMP 00003a65: JUMPDEST 00003a66: SWAP1 00003a67: SWAP7 00003a68: POP 00003a69: SWAP5 00003a6a: POP 00003a6b: POP 00003a6c: PUSH1 0x20 00003a6e: DUP7 00003a6f: ADD 00003a70: CALLDATALOAD 00003a71: PUSH8 0xffffffffffffffff 00003a7a: DUP2 00003a7b: GT 00003a7c: ISZERO 00003a7d: PUSH2 0x3a85 00003a80: JUMPI 00003a81: PUSH1 0x00 00003a83: DUP1 00003a84: REVERT 00003a85: JUMPDEST 00003a86: PUSH2 0x3a91 00003a89: DUP9 00003a8a: DUP3 00003a8b: DUP10 00003a8c: ADD 00003a8d: PUSH2 0x39de 00003a90: JUMP 00003a91: JUMPDEST 00003a92: SWAP7 00003a93: SWAP10 00003a94: SWAP6 00003a95: SWAP9 00003a96: POP 00003a97: SWAP7 00003a98: PUSH1 0x40 00003a9a: ADD 00003a9b: CALLDATALOAD 00003a9c: SWAP5 00003a9d: SWAP4 00003a9e: POP 00003a9f: POP 00003aa0: POP 00003aa1: POP 00003aa2: JUMP 00003aa3: JUMPDEST 00003aa4: PUSH1 0x00 00003aa6: DUP1 00003aa7: PUSH1 0x00 00003aa9: DUP1 00003aaa: PUSH1 0x00 00003aac: DUP1 00003aad: PUSH1 0x00 00003aaf: PUSH1 0x80 00003ab1: DUP9 00003ab2: DUP11 00003ab3: SUB 00003ab4: SLT 00003ab5: ISZERO 00003ab6: PUSH2 0x3abe 00003ab9: JUMPI 00003aba: PUSH1 0x00 00003abc: DUP1 00003abd: REVERT 00003abe: JUMPDEST 00003abf: DUP8 00003ac0: CALLDATALOAD 00003ac1: PUSH8 0xffffffffffffffff 00003aca: DUP2 00003acb: GT 00003acc: ISZERO 00003acd: PUSH2 0x3ad5 00003ad0: JUMPI 00003ad1: PUSH1 0x00 00003ad3: DUP1 00003ad4: REVERT 00003ad5: JUMPDEST 00003ad6: PUSH2 0x3ae1 00003ad9: DUP11 00003ada: DUP3 00003adb: DUP12 00003adc: ADD 00003add: PUSH2 0x39de 00003ae0: JUMP 00003ae1: JUMPDEST 00003ae2: SWAP1 00003ae3: SWAP9 00003ae4: POP 00003ae5: SWAP7 00003ae6: POP 00003ae7: POP 00003ae8: PUSH1 0x20 00003aea: DUP9 00003aeb: ADD 00003aec: CALLDATALOAD 00003aed: PUSH8 0xffffffffffffffff 00003af6: DUP2 00003af7: GT 00003af8: ISZERO 00003af9: PUSH2 0x3b01 00003afc: JUMPI 00003afd: PUSH1 0x00 00003aff: DUP1 00003b00: REVERT 00003b01: JUMPDEST 00003b02: PUSH2 0x3b0d 00003b05: DUP11 00003b06: DUP3 00003b07: DUP12 00003b08: ADD 00003b09: PUSH2 0x39de 00003b0c: JUMP 00003b0d: JUMPDEST 00003b0e: SWAP1 00003b0f: SWAP7 00003b10: POP 00003b11: SWAP5 00003b12: POP 00003b13: POP 00003b14: PUSH1 0x40 00003b16: DUP9 00003b17: ADD 00003b18: CALLDATALOAD 00003b19: PUSH8 0xffffffffffffffff 00003b22: DUP2 00003b23: GT 00003b24: ISZERO 00003b25: PUSH2 0x3b2d 00003b28: JUMPI 00003b29: PUSH1 0x00 00003b2b: DUP1 00003b2c: REVERT 00003b2d: JUMPDEST 00003b2e: PUSH2 0x3b39 00003b31: DUP11 00003b32: DUP3 00003b33: DUP12 00003b34: ADD 00003b35: PUSH2 0x39de 00003b38: JUMP 00003b39: JUMPDEST 00003b3a: SWAP9 00003b3b: SWAP12 00003b3c: SWAP8 00003b3d: SWAP11 00003b3e: POP 00003b3f: SWAP6 00003b40: SWAP9 00003b41: SWAP5 00003b42: SWAP8 00003b43: SWAP6 00003b44: SWAP7 00003b45: PUSH1 0x60 00003b47: SWAP1 00003b48: SWAP6 00003b49: ADD 00003b4a: CALLDATALOAD 00003b4b: SWAP5 00003b4c: SWAP4 00003b4d: POP 00003b4e: POP 00003b4f: POP 00003b50: POP 00003b51: JUMP 00003b52: JUMPDEST 00003b53: PUSH4 0x4e487b71 00003b58: PUSH1 0xe0 00003b5a: SHL 00003b5b: PUSH1 0x00 00003b5d: MSTORE 00003b5e: PUSH1 0x32 00003b60: PUSH1 0x04 00003b62: MSTORE 00003b63: PUSH1 0x24 00003b65: PUSH1 0x00 00003b67: REVERT 00003b68: JUMPDEST 00003b69: PUSH1 0x00 00003b6b: PUSH1 0x20 00003b6d: DUP3 00003b6e: DUP5 00003b6f: SUB 00003b70: SLT 00003b71: ISZERO 00003b72: PUSH2 0x3b7a 00003b75: JUMPI 00003b76: PUSH1 0x00 00003b78: DUP1 00003b79: REVERT 00003b7a: JUMPDEST 00003b7b: DUP2 00003b7c: MLOAD 00003b7d: PUSH1 0xff 00003b7f: DUP2 00003b80: AND 00003b81: DUP2 00003b82: EQ 00003b83: PUSH2 0x2290 00003b86: JUMPI 00003b87: PUSH1 0x00 00003b89: DUP1 00003b8a: REVERT 00003b8b: JUMPDEST 00003b8c: PUSH4 0x4e487b71 00003b91: PUSH1 0xe0 00003b93: SHL 00003b94: PUSH1 0x00 00003b96: MSTORE 00003b97: PUSH1 0x11 00003b99: PUSH1 0x04 00003b9b: MSTORE 00003b9c: PUSH1 0x24 00003b9e: PUSH1 0x00 00003ba0: REVERT 00003ba1: JUMPDEST 00003ba2: PUSH1 0x01 00003ba4: DUP2 00003ba5: JUMPDEST 00003ba6: PUSH1 0x01 00003ba8: DUP5 00003ba9: GT 00003baa: ISZERO 00003bab: PUSH2 0x3bdc 00003bae: JUMPI 00003baf: DUP1 00003bb0: DUP6 00003bb1: DIV 00003bb2: DUP2 00003bb3: GT 00003bb4: ISZERO 00003bb5: PUSH2 0x3bc0 00003bb8: JUMPI 00003bb9: PUSH2 0x3bc0 00003bbc: PUSH2 0x3b8b 00003bbf: JUMP 00003bc0: JUMPDEST 00003bc1: PUSH1 0x01 00003bc3: DUP5 00003bc4: AND 00003bc5: ISZERO 00003bc6: PUSH2 0x3bce 00003bc9: JUMPI 00003bca: SWAP1 00003bcb: DUP2 00003bcc: MUL 00003bcd: SWAP1 00003bce: JUMPDEST 00003bcf: PUSH1 0x01 00003bd1: SWAP4 00003bd2: SWAP1 00003bd3: SWAP4 00003bd4: SHR 00003bd5: SWAP3 00003bd6: DUP1 00003bd7: MUL 00003bd8: PUSH2 0x3ba5 00003bdb: JUMP 00003bdc: JUMPDEST 00003bdd: SWAP4 00003bde: POP 00003bdf: SWAP4 00003be0: SWAP2 00003be1: POP 00003be2: POP 00003be3: JUMP 00003be4: JUMPDEST 00003be5: PUSH1 0x00 00003be7: DUP3 00003be8: PUSH2 0x3bf3 00003beb: JUMPI 00003bec: POP 00003bed: PUSH1 0x01 00003bef: PUSH2 0x0ad0 00003bf2: JUMP 00003bf3: JUMPDEST 00003bf4: DUP2 00003bf5: PUSH2 0x3c00 00003bf8: JUMPI 00003bf9: POP 00003bfa: PUSH1 0x00 00003bfc: PUSH2 0x0ad0 00003bff: JUMP 00003c00: JUMPDEST 00003c01: DUP2 00003c02: PUSH1 0x01 00003c04: DUP2 00003c05: EQ 00003c06: PUSH2 0x3c16 00003c09: JUMPI 00003c0a: PUSH1 0x02 00003c0c: DUP2 00003c0d: EQ 00003c0e: PUSH2 0x3c20 00003c11: JUMPI 00003c12: PUSH2 0x3c3c 00003c15: JUMP 00003c16: JUMPDEST 00003c17: PUSH1 0x01 00003c19: SWAP2 00003c1a: POP 00003c1b: POP 00003c1c: PUSH2 0x0ad0 00003c1f: JUMP 00003c20: JUMPDEST 00003c21: PUSH1 0xff 00003c23: DUP5 00003c24: GT 00003c25: ISZERO 00003c26: PUSH2 0x3c31 00003c29: JUMPI 00003c2a: PUSH2 0x3c31 00003c2d: PUSH2 0x3b8b 00003c30: JUMP 00003c31: JUMPDEST 00003c32: POP 00003c33: POP 00003c34: PUSH1 0x01 00003c36: DUP3 00003c37: SHL 00003c38: PUSH2 0x0ad0 00003c3b: JUMP 00003c3c: JUMPDEST 00003c3d: POP 00003c3e: PUSH1 0x20 00003c40: DUP4 00003c41: LT 00003c42: PUSH2 0x0133 00003c45: DUP4 00003c46: LT 00003c47: AND 00003c48: PUSH1 0x4e 00003c4a: DUP5 00003c4b: LT 00003c4c: PUSH1 0x0b 00003c4e: DUP5 00003c4f: LT 00003c50: AND 00003c51: OR 00003c52: ISZERO 00003c53: PUSH2 0x3c5f 00003c56: JUMPI 00003c57: POP 00003c58: DUP2 00003c59: DUP2 00003c5a: EXP 00003c5b: PUSH2 0x0ad0 00003c5e: JUMP 00003c5f: JUMPDEST 00003c60: PUSH2 0x3c6c 00003c63: PUSH1 0x00 00003c65: NOT 00003c66: DUP5 00003c67: DUP5 00003c68: PUSH2 0x3ba1 00003c6b: JUMP 00003c6c: JUMPDEST 00003c6d: DUP1 00003c6e: PUSH1 0x00 00003c70: NOT 00003c71: DIV 00003c72: DUP3 00003c73: GT 00003c74: ISZERO 00003c75: PUSH2 0x3c80 00003c78: JUMPI 00003c79: PUSH2 0x3c80 00003c7c: PUSH2 0x3b8b 00003c7f: JUMP 00003c80: JUMPDEST 00003c81: MUL 00003c82: SWAP4 00003c83: SWAP3 00003c84: POP 00003c85: POP 00003c86: POP 00003c87: JUMP 00003c88: JUMPDEST 00003c89: PUSH1 0x00 00003c8b: PUSH2 0x2290 00003c8e: PUSH1 0xff 00003c90: DUP5 00003c91: AND 00003c92: DUP4 00003c93: PUSH2 0x3be4 00003c96: JUMP 00003c97: JUMPDEST 00003c98: DUP1 00003c99: DUP3 00003c9a: MUL 00003c9b: DUP2 00003c9c: ISZERO 00003c9d: DUP3 00003c9e: DUP3 00003c9f: DIV 00003ca0: DUP5 00003ca1: EQ 00003ca2: OR 00003ca3: PUSH2 0x0ad0 00003ca6: JUMPI 00003ca7: PUSH2 0x0ad0 00003caa: PUSH2 0x3b8b 00003cad: JUMP 00003cae: JUMPDEST 00003caf: PUSH1 0x00 00003cb1: DUP3 00003cb2: PUSH2 0x3ccb 00003cb5: JUMPI 00003cb6: PUSH4 0x4e487b71 00003cbb: PUSH1 0xe0 00003cbd: SHL 00003cbe: PUSH1 0x00 00003cc0: MSTORE 00003cc1: PUSH1 0x12 00003cc3: PUSH1 0x04 00003cc5: MSTORE 00003cc6: PUSH1 0x24 00003cc8: PUSH1 0x00 00003cca: REVERT 00003ccb: JUMPDEST 00003ccc: POP 00003ccd: DIV 00003cce: SWAP1 00003ccf: JUMP 00003cd0: JUMPDEST 00003cd1: PUSH2 0x0180 00003cd4: DUP2 00003cd5: ADD 00003cd6: DUP2 00003cd7: DUP4 00003cd8: PUSH1 0x00 00003cda: JUMPDEST 00003cdb: PUSH1 0x03 00003cdd: DUP2 00003cde: LT 00003cdf: ISZERO 00003ce0: PUSH2 0x3cfb 00003ce3: JUMPI 00003ce4: PUSH1 0x80 00003ce6: DUP3 00003ce7: DUP5 00003ce8: CALLDATACOPY 00003ce9: PUSH1 0x80 00003ceb: SWAP3 00003cec: DUP4 00003ced: ADD 00003cee: SWAP3 00003cef: SWAP2 00003cf0: SWAP1 00003cf1: SWAP2 00003cf2: ADD 00003cf3: SWAP1 00003cf4: PUSH1 0x01 00003cf6: ADD 00003cf7: PUSH2 0x3cda 00003cfa: JUMP 00003cfb: JUMPDEST 00003cfc: POP 00003cfd: POP 00003cfe: POP 00003cff: SWAP3 00003d00: SWAP2 00003d01: POP 00003d02: POP 00003d03: JUMP 00003d04: JUMPDEST 00003d05: DUP2 00003d06: DUP2 00003d07: SUB 00003d08: DUP2 00003d09: DUP2 00003d0a: GT 00003d0b: ISZERO 00003d0c: PUSH2 0x0ad0 00003d0f: JUMPI 00003d10: PUSH2 0x0ad0 00003d13: PUSH2 0x3b8b 00003d16: JUMP 00003d17: JUMPDEST 00003d18: PUSH1 0x00 00003d1a: PUSH2 0x2290 00003d1d: DUP4 00003d1e: DUP4 00003d1f: PUSH2 0x3be4 00003d22: JUMP 00003d23: JUMPDEST 00003d24: PUSH1 0x80 00003d26: DUP2 00003d27: DUP2 00003d28: ADD 00003d29: SWAP1 00003d2a: DUP4 00003d2b: DUP4 00003d2c: CALLDATACOPY 00003d2d: SWAP3 00003d2e: SWAP2 00003d2f: POP 00003d30: POP 00003d31: JUMP 00003d32: JUMPDEST 00003d33: PUSH1 0x20 00003d35: DUP1 00003d36: DUP3 00003d37: MSTORE 00003d38: DUP2 00003d39: ADD 00003d3a: DUP3 00003d3b: SWAP1 00003d3c: MSTORE 00003d3d: PUSH1 0x00 00003d3f: DUP4 00003d40: PUSH1 0x40 00003d42: DUP4 00003d43: ADD 00003d44: DUP3 00003d45: JUMPDEST 00003d46: DUP6 00003d47: DUP2 00003d48: LT 00003d49: ISZERO 00003d4a: PUSH2 0x3d75 00003d4d: JUMPI 00003d4e: DUP3 00003d4f: CALLDATALOAD 00003d50: PUSH2 0x3d58 00003d53: DUP2 00003d54: PUSH2 0x363d 00003d57: JUMP 00003d58: JUMPDEST 00003d59: PUSH1 0x01 00003d5b: PUSH1 0x01 00003d5d: PUSH1 0xa0 00003d5f: SHL 00003d60: SUB 00003d61: AND 00003d62: DUP3 00003d63: MSTORE 00003d64: PUSH1 0x20 00003d66: SWAP3 00003d67: DUP4 00003d68: ADD 00003d69: SWAP3 00003d6a: SWAP1 00003d6b: SWAP2 00003d6c: ADD 00003d6d: SWAP1 00003d6e: PUSH1 0x01 00003d70: ADD 00003d71: PUSH2 0x3d45 00003d74: JUMP 00003d75: JUMPDEST 00003d76: POP 00003d77: SWAP6 00003d78: SWAP5 00003d79: POP 00003d7a: POP 00003d7b: POP 00003d7c: POP 00003d7d: POP 00003d7e: JUMP 00003d7f: JUMPDEST 00003d80: DUP1 00003d81: DUP3 00003d82: ADD 00003d83: DUP1 00003d84: DUP3 00003d85: GT 00003d86: ISZERO 00003d87: PUSH2 0x0ad0 00003d8a: JUMPI 00003d8b: PUSH2 0x0ad0 00003d8e: PUSH2 0x3b8b 00003d91: JUMP 00003d92: JUMPDEST 00003d93: PUSH6 0xffffffffffff 00003d9a: DUP2 00003d9b: DUP2 00003d9c: AND 00003d9d: DUP4 00003d9e: DUP3 00003d9f: AND 00003da0: ADD 00003da1: SWAP1 00003da2: DUP2 00003da3: GT 00003da4: ISZERO 00003da5: PUSH2 0x0ad0 00003da8: JUMPI 00003da9: PUSH2 0x0ad0 00003dac: PUSH2 0x3b8b 00003daf: JUMP 00003db0: JUMPDEST 00003db1: DUP2 00003db2: DUP4 00003db3: MSTORE 00003db4: PUSH1 0x00 00003db6: PUSH1 0x01 00003db8: PUSH1 0x01 00003dba: PUSH1 0xfb 00003dbc: SHL 00003dbd: SUB 00003dbe: DUP4 00003dbf: GT 00003dc0: ISZERO 00003dc1: PUSH2 0x3dc9 00003dc4: JUMPI 00003dc5: PUSH1 0x00 00003dc7: DUP1 00003dc8: REVERT 00003dc9: JUMPDEST 00003dca: DUP3 00003dcb: PUSH1 0x05 00003dcd: SHL 00003dce: DUP1 00003dcf: DUP4 00003dd0: PUSH1 0x20 00003dd2: DUP8 00003dd3: ADD 00003dd4: CALLDATACOPY 00003dd5: SWAP4 00003dd6: SWAP1 00003dd7: SWAP4 00003dd8: ADD 00003dd9: PUSH1 0x20 00003ddb: ADD 00003ddc: SWAP4 00003ddd: SWAP3 00003dde: POP 00003ddf: POP 00003de0: POP 00003de1: JUMP 00003de2: JUMPDEST 00003de3: PUSH1 0x60 00003de5: DUP2 00003de6: MSTORE 00003de7: PUSH1 0x00 00003de9: PUSH2 0x3df6 00003dec: PUSH1 0x60 00003dee: DUP4 00003def: ADD 00003df0: DUP8 00003df1: DUP10 00003df2: PUSH2 0x3db0 00003df5: JUMP 00003df6: JUMPDEST 00003df7: DUP3 00003df8: DUP2 00003df9: SUB 00003dfa: PUSH1 0x20 00003dfc: DUP5 00003dfd: ADD 00003dfe: MSTORE 00003dff: PUSH2 0x3e09 00003e02: DUP2 00003e03: DUP7 00003e04: DUP9 00003e05: PUSH2 0x3db0 00003e08: JUMP 00003e09: JUMPDEST 00003e0a: SWAP2 00003e0b: POP 00003e0c: POP 00003e0d: DUP3 00003e0e: PUSH1 0x40 00003e10: DUP4 00003e11: ADD 00003e12: MSTORE 00003e13: SWAP7 00003e14: SWAP6 00003e15: POP 00003e16: POP 00003e17: POP 00003e18: POP 00003e19: POP 00003e1a: POP 00003e1b: JUMP 00003e1c: JUMPDEST 00003e1d: PUSH6 0xffffffffffff 00003e24: DUP3 00003e25: DUP2 00003e26: AND 00003e27: DUP3 00003e28: DUP3 00003e29: AND 00003e2a: SUB 00003e2b: SWAP1 00003e2c: DUP2 00003e2d: GT 00003e2e: ISZERO 00003e2f: PUSH2 0x0ad0 00003e32: JUMPI 00003e33: PUSH2 0x0ad0 00003e36: PUSH2 0x3b8b 00003e39: JUMP 00003e3a: JUMPDEST 00003e3b: PUSH1 0x01 00003e3d: DUP2 00003e3e: DUP2 00003e3f: SHR 00003e40: SWAP1 00003e41: DUP3 00003e42: AND 00003e43: DUP1 00003e44: PUSH2 0x3e4e 00003e47: JUMPI 00003e48: PUSH1 0x7f 00003e4a: DUP3 00003e4b: AND 00003e4c: SWAP2 00003e4d: POP 00003e4e: JUMPDEST 00003e4f: PUSH1 0x20 00003e51: DUP3 00003e52: LT 00003e53: DUP2 00003e54: SUB 00003e55: PUSH2 0x37b8 00003e58: JUMPI 00003e59: PUSH4 0x4e487b71 00003e5e: PUSH1 0xe0 00003e60: SHL 00003e61: PUSH1 0x00 00003e63: MSTORE 00003e64: PUSH1 0x22 00003e66: PUSH1 0x04 00003e68: MSTORE 00003e69: PUSH1 0x24 00003e6b: PUSH1 0x00 00003e6d: REVERT 00003e6e: INVALID 00003e6f: SWAP8 00003e70: PUSH7 0x7070c54ef182b0 00003e78: CREATE2 00003e79: DUP6 00003e7a: DUP12 00003e7b: SUB 00003e7c: UNKNOWN(0x4B) 00003e7d: UNKNOWN(0xEA) 00003e7e: UNKNOWN(0xC1) 00003e7f: UNKNOWN(0xB6) 00003e80: RETURN 00003e81: ADDMOD 00003e82: SWAP11 00003e83: LOG2 00003e84: UNKNOWN(0xD3) 00003e85: XOR 00003e86: DUP12 00003e87: UNKNOWN(0xB1) 00003e88: UNKNOWN(0xE8) 00003e89: SWAP3 00003e8a: SWAP16 00003e8b: UNKNOWN(0x4F) 00003e8c: UNKNOWN(0xA9) 00003e8d: UNKNOWN(0xB9) 00003e8e: UNKNOWN(0x29) 00003e8f: LOG2 00003e90: PUSH5 0x6970667358 00003e96: UNKNOWN(0x22) 00003e97: SLT 00003e98: KECCAK256 00003e99: MCOPY 00003e9a: PUSH26 0xd2fa04b5f006c8f231e0da4dec297139dc34bc096df27524160d 00003eb5: SLOAD 00003eb6: UNKNOWN(0xD4) 00003eb7: DUP9 00003eb8: UNKNOWN(0xE1) 00003eb9: PUSH5 0x736f6c6343 00003ebf: STOP 00003ec0: ADDMOD 00003ec1: SHR 00003ec2: STOP 00003ec3: CALLER
| Severity | Category | Tool | Title | Confidence | Validated | Confirmed | Details |
|---|---|---|---|---|---|---|---|
| high | other | detector | Untrusted CALL target/value reachable | 60 | no | no |
viewtrace_id: 0x2e5b2e7ea3601f21abcaa9bac406fdeb33c1e6644b235bfb40f4f6dcc909de57
call_targets:
0x80c1c65463427ea785fb7b03ba84b91f49f272eb
target_varies:
no
classification:
constant_target
validation_json{
"sink": "CALL",
"errors": 0,
"status": "sink_reached",
"attempts": 1,
"trace_id": "0x2e5b2e7ea3601f21abcaa9bac406fdeb33c1e6644b235bfb40f4f6dcc909de57",
"confirmed": false,
"trace_mode": "callTracer",
"call_targets": [
"0x80c1c65463427ea785fb7b03ba84b91f49f272eb"
],
"matched_probe": null,
"target_varies": false,
"classification": "constant_target"
}
witness_json{
"notes": "heuristic witness; entrypoints are best-effort selectors with zeroed calldata",
"constraints": [],
"entrypoints": [
{
"calldata": "0xdc173042",
"selector": "0xdc173042",
"calldata_variants": [
"0xdc173042",
"0xdc1730420000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xf5b541a6",
"selector": "0xf5b541a6",
"calldata_variants": [
"0xf5b541a6",
"0xf5b541a60000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xf9d9e31b",
"selector": "0xf9d9e31b",
"calldata_variants": [
"0xf9d9e31b",
"0xf9d9e31b0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xfa5a89f1",
"selector": "0xfa5a89f1",
"calldata_variants": [
"0xfa5a89f1",
"0xfa5a89f10000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xd547741f",
"selector": "0xd547741f",
"calldata_variants": [
"0xd547741f",
"0xd547741f0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xd602b9fd",
"selector": "0xd602b9fd",
"calldata_variants": [
"0xd602b9fd",
"0xd602b9fd0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xda71c017",
"selector": "0xda71c017",
"calldata_variants": [
"0xda71c017",
"0xda71c0170000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xc26e2c03",
"selector": "0xc26e2c03",
"calldata_variants": [
"0xc26e2c03",
"0xc26e2c030000000000000000000000000000000000000000000000000000000000000000"
]
}
]
}
evidence_json{
"examples": [
{
"pc": 4551,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
},
{
"pc": 7498,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
},
{
"pc": 8451,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
}
],
"call_count": 4,
"guards_detected": [],
"untrusted_call_count": 4
}
|
| high | other | detector | ETH value transfer possible | 55 | no | no |
viewtrace_id: 0x2e5b2e7ea3601f21abcaa9bac406fdeb33c1e6644b235bfb40f4f6dcc909de57
call_targets:
0x80c1c65463427ea785fb7b03ba84b91f49f272eb
target_varies:
no
classification:
constant_target
validation_json{
"sink": "CALL",
"errors": 0,
"status": "sink_reached",
"attempts": 1,
"trace_id": "0x2e5b2e7ea3601f21abcaa9bac406fdeb33c1e6644b235bfb40f4f6dcc909de57",
"confirmed": false,
"trace_mode": "callTracer",
"call_targets": [
"0x80c1c65463427ea785fb7b03ba84b91f49f272eb"
],
"matched_probe": null,
"target_varies": false,
"classification": "constant_target"
}
witness_json{
"notes": "heuristic witness; entrypoints are best-effort selectors with zeroed calldata",
"constraints": [],
"entrypoints": [
{
"calldata": "0xdc173042",
"selector": "0xdc173042",
"calldata_variants": [
"0xdc173042",
"0xdc1730420000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xf5b541a6",
"selector": "0xf5b541a6",
"calldata_variants": [
"0xf5b541a6",
"0xf5b541a60000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xf9d9e31b",
"selector": "0xf9d9e31b",
"calldata_variants": [
"0xf9d9e31b",
"0xf9d9e31b0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xfa5a89f1",
"selector": "0xfa5a89f1",
"calldata_variants": [
"0xfa5a89f1",
"0xfa5a89f10000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xd547741f",
"selector": "0xd547741f",
"calldata_variants": [
"0xd547741f",
"0xd547741f0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xd602b9fd",
"selector": "0xd602b9fd",
"calldata_variants": [
"0xd602b9fd",
"0xd602b9fd0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xda71c017",
"selector": "0xda71c017",
"calldata_variants": [
"0xda71c017",
"0xda71c0170000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xc26e2c03",
"selector": "0xc26e2c03",
"calldata_variants": [
"0xc26e2c03",
"0xc26e2c030000000000000000000000000000000000000000000000000000000000000000"
]
}
]
}
evidence_json{
"examples": [
{
"pc": 4551,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
},
{
"pc": 7498,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
},
{
"pc": 8451,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
}
],
"eth_value_calls": 4,
"guards_detected": []
}
|
| high | other | slither | Sale._executeTokenSell(address,uint256,uint256,IERC20Metadata) (contracts/Sale.sol#376-395) sends eth to arbitrary user | 85 | no | — |
viewevidence_json{
"impact": "High",
"detector": "arbitrary-send-eth",
"elements": [
{
"name": "_executeTokenSell",
"type": "function",
"source_mapping": {
"lines": [
376,
377,
378,
379,
380,
381,
382,
383,
384,
385,
386,
387,
388,
389,
390,
391,
392,
393,
394,
395
],
"start": 14382,
"length": 638,
"ending_column": 17,
"is_dependency": false,
"filename_short": "contracts/Sale.sol",
"starting_column": 22,
"filename_absolute": "/tmp/slither-gubm5ea2/contracts/Sale.sol",
"filename_relative": "contracts/Sale.sol"
},
"type_specific_fields": {
"parent": {
"name": "Sale",
"type": "contract",
"source_mapping": {
"lines": [
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31,
32,
33,
34,
35,
36,
37,
38,
39,
40,
41,
42,
43,
44,
45,
46,
47,
48,
49,
50,
51,
52,
53,
54,
55,
56,
57,
58,
59,
60,
61,
62,
63,
64,
65,
66,
67,
68,
69,
70,
71,
72,
73,
74,
75,
76,
77,
78,
79,
80,
81,
82,
83,
84,
85,
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334,
335,
336,
337,
338,
339,
340,
341,
342,
343,
344,
345,
346,
347,
348,
349,
350,
351,
352,
353,
354,
355,
356,
357,
358,
359,
360,
361,
362,
363,
364,
365,
366,
367,
368,
369,
370,
371,
372,
373,
374,
375,
376,
377,
378,
379,
380,
381,
382,
383,
384,
385,
386,
387,
388,
389,
390,
391,
392,
393,
394,
395,
396,
397,
398,
399,
400,
401,
402,
403,
404,
405,
406,
407,
408,
409,
410,
411,
412,
413,
414,
415,
416,
417,
418,
419,
420,
421,
422,
423,
424,
425,
426,
427,
428,
429,
430,
431,
432,
433,
434,
435,
436,
437,
438,
439,
440,
441,
442,
443,
444,
445,
446,
447,
448,
449,
450,
451,
452,
453,
454,
455,
456,
457,
458,
459,
460,
461,
462,
463,
464,
465,
466,
467,
468,
469,
470,
471,
472,
473,
474,
475,
476,
477,
478,
479,
480,
481,
482,
483,
484,
485,
486,
487,
488,
489,
490,
491,
492,
493,
494,
495,
496,
497,
498,
499,
500,
501,
502
],
"start": 519,
"length": 19502,
"ending_column": 11,
"is_dependency": false,
"filename_short": "contracts/Sale.sol",
"starting_column": 71,
"filename_absolute": "/tmp/slither-gubm5ea2/contracts/Sale.sol",
"filename_relative": "contracts/Sale.sol"
}
},
"signature": "_executeTokenSell(address,uint256,uint256,IERC20Metadata)"
}
},
{
"name": "(success,None) = seller.call{value: payTokenAmount}()",
"type": "node",
"source_mapping": {
"lines": [
384,
385,
386,
387,
388
],
"start": 14748,
"length": 57,
"ending_column": 9,
"is_dependency": false,
"filename_short": "contracts/Sale.sol",
"starting_column": 73,
"filename_absolute": "/tmp/slither-gubm5ea2/contracts/Sale.sol",
"filename_relative": "contracts/Sale.sol"
},
"type_specific_fields": {
"parent": {
"name": "_executeTokenSell",
"type": "function",
"source_mapping": {
"lines": [
376,
377,
378,
379,
380,
381,
382,
383,
384,
385,
386,
387,
388,
389,
390,
391,
392,
393,
394,
395
],
"start": 14382,
"length": 638,
"ending_column": 17,
"is_dependency": false,
"filename_short": "contracts/Sale.sol",
"starting_column": 22,
"filename_absolute": "/tmp/slither-gubm5ea2/contracts/Sale.sol",
"filename_relative": "contracts/Sale.sol"
},
"type_specific_fields": {
"parent": {
"name": "Sale",
"type": "contract",
"source_mapping": {
"lines": [
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31,
32,
33,
34,
35,
36,
37,
38,
39,
40,
41,
42,
43,
44,
45,
46,
47,
48,
49,
50,
51,
52,
53,
54,
55,
56,
57,
58,
59,
60,
61,
62,
63,
64,
65,
66,
67,
68,
69,
70,
71,
72,
73,
74,
75,
76,
77,
78,
79,
80,
81,
82,
83,
84,
85,
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334,
335,
336,
337,
338,
339,
340,
341,
342,
343,
344,
345,
346,
347,
348,
349,
350,
351,
352,
353,
354,
355,
356,
357,
358,
359,
360,
361,
362,
363,
364,
365,
366,
367,
368,
369,
370,
371,
372,
373,
374,
375,
376,
377,
378,
379,
380,
381,
382,
383,
384,
385,
386,
387,
388,
389,
390,
391,
392,
393,
394,
395,
396,
397,
398,
399,
400,
401,
402,
403,
404,
405,
406,
407,
408,
409,
410,
411,
412,
413,
414,
415,
416,
417,
418,
419,
420,
421,
422,
423,
424,
425,
426,
427,
428,
429,
430,
431,
432,
433,
434,
435,
436,
437,
438,
439,
440,
441,
442,
443,
444,
445,
446,
447,
448,
449,
450,
451,
452,
453,
454,
455,
456,
457,
458,
459,
460,
461,
462,
463,
464,
465,
466,
467,
468,
469,
470,
471,
472,
473,
474,
475,
476,
477,
478,
479,
480,
481,
482,
483,
484,
485,
486,
487,
488,
489,
490,
491,
492,
493,
494,
495,
496,
497,
498,
499,
500,
501,
502
],
"start": 519,
"length": 19502,
"ending_column": 11,
"is_dependency": false,
"filename_short": "contracts/Sale.sol",
"starting_column": 71,
"filename_absolute": "/tmp/slither-gubm5ea2/contracts/Sale.sol",
"filename_relative": "contracts/Sale.sol"
}
},
"signature": "_executeTokenSell(address,uint256,uint256,IERC20Metadata)"
}
}
}
}
],
"locations": [
{
"file": "contracts/Sale.sol",
"name": "_executeTokenSell",
"type": "function",
"lines": [
376,
377,
378,
379,
380,
381,
382,
383,
384,
385,
386,
387,
388,
389,
390,
391,
392,
393,
394,
395
]
},
{
"file": "contracts/Sale.sol",
"name": "(success,None) = seller.call{value: payTokenAmount}()",
"type": "node",
"lines": [
384,
385,
386,
387,
388
]
}
],
"description": "Sale._executeTokenSell(address,uint256,uint256,IERC20Metadata) (contracts/Sale.sol#376-395) sends eth to arbitrary user\n\tDangerous calls:\n\t- (success,None) = seller.call{value: payTokenAmount}() (contracts/Sale.sol#384-388)"
}
|
| high | reentrancy | slither | Reentrancy in Sale._executeTokenBuy(address,address,uint256,uint256,IERC20Metadata,uint256,uint256,uint256,bytes) (contracts/Sale.sol#338-376): | 85 | no | — |
viewevidence_json{
"impact": "High",
"detector": "reentrancy-eth",
"elements": [
{
"name": "_executeTokenBuy",
"type": "function",
"source_mapping": {
"lines": [
338,
339,
340,
341,
342,
343,
344,
345,
346,
347,
348,
349,
350,
351,
352,
353,
354,
355,
356,
357,
358,
359,
360,
361,
362,
363,
364,
365,
366,
367,
368,
369,
370,
371,
372,
373,
374,
375,
376
],
"start": 12977,
"length": 1399,
"ending_column": 16,
"is_dependency": false,
"filename_short": "contracts/Sale.sol",
"starting_column": 23,
"filename_absolute": "/tmp/slither-gubm5ea2/contracts/Sale.sol",
"filename_relative": "contracts/Sale.sol"
},
"type_specific_fields": {
"parent": {
"name": "Sale",
"type": "contract",
"source_mapping": {
"lines": [
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31,
32,
33,
34,
35,
36,
37,
38,
39,
40,
41,
42,
43,
44,
45,
46,
47,
48,
49,
50,
51,
52,
53,
54,
55,
56,
57,
58,
59,
60,
61,
62,
63,
64,
65,
66,
67,
68,
69,
70,
71,
72,
73,
74,
75,
76,
77,
78,
79,
80,
81,
82,
83,
84,
85,
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334,
335,
336,
337,
338,
339,
340,
341,
342,
343,
344,
345,
346,
347,
348,
349,
350,
351,
352,
353,
354,
355,
356,
357,
358,
359,
360,
361,
362,
363,
364,
365,
366,
367,
368,
369,
370,
371,
372,
373,
374,
375,
376,
377,
378,
379,
380,
381,
382,
383,
384,
385,
386,
387,
388,
389,
390,
391,
392,
393,
394,
395,
396,
397,
398,
399,
400,
401,
402,
403,
404,
405,
406,
407,
408,
409,
410,
411,
412,
413,
414,
415,
416,
417,
418,
419,
420,
421,
422,
423,
424,
425,
426,
427,
428,
429,
430,
431,
432,
433,
434,
435,
436,
437,
438,
439,
440,
441,
442,
443,
444,
445,
446,
447,
448,
449,
450,
451,
452,
453,
454,
455,
456,
457,
458,
459,
460,
461,
462,
463,
464,
465,
466,
467,
468,
469,
470,
471,
472,
473,
474,
475,
476,
477,
478,
479,
480,
481,
482,
483,
484,
485,
486,
487,
488,
489,
490,
491,
492,
493,
494,
495,
496,
497,
498,
499,
500,
501,
502
],
"start": 519,
"length": 19502,
"ending_column": 11,
"is_dependency": false,
"filename_short": "contracts/Sale.sol",
"starting_column": 71,
"filename_absolute": "/tmp/slither-gubm5ea2/contracts/Sale.sol",
"filename_relative": "contracts/Sale.sol"
}
},
"signature": "_executeTokenBuy(address,address,uint256,uint256,IERC20Metadata,uint256,uint256,uint256,bytes)"
}
},
{
"name": "(success,None) = buyer.call{value: msg.value - payTokenAmount}()",
"type": "node",
"source_mapping": {
"lines": [
362,
363,
364,
365
],
"start": 13764,
"length": 68,
"ending_column": 4,
"is_dependency": false,
"filename_short": "contracts/Sale.sol",
"starting_column": 13,
"filename_absolute": "/tmp/slither-gubm5ea2/contracts/Sale.sol",
"filename_relative": "contracts/Sale.sol"
},
"additional_fields": {
"underlying_type": "external_calls"
},
"type_specific_fields": {
"parent": {
"name": "_executeTokenBuy",
"type": "function",
"source_mapping": {
"lines": [
338,
339,
340,
341,
342,
343,
344,
345,
346,
347,
348,
349,
350,
351,
352,
353,
354,
355,
356,
357,
358,
359,
360,
361,
362,
363,
364,
365,
366,
367,
368,
369,
370,
371,
372,
373,
374,
375,
376
],
"start": 12977,
"length": 1399,
"ending_column": 16,
"is_dependency": false,
"filename_short": "contracts/Sale.sol",
"starting_column": 23,
"filename_absolute": "/tmp/slither-gubm5ea2/contracts/Sale.sol",
"filename_relative": "contracts/Sale.sol"
},
"type_specific_fields": {
"parent": {
"name": "Sale",
"type": "contract",
"source_mapping": {
"lines": [
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31,
32,
33,
34,
35,
36,
37,
38,
39,
40,
41,
42,
43,
44,
45,
46,
47,
48,
49,
50,
51,
52,
53,
54,
55,
56,
57,
58,
59,
60,
61,
62,
63,
64,
65,
66,
67,
68,
69,
70,
71,
72,
73,
74,
75,
76,
77,
78,
79,
80,
81,
82,
83,
84,
85,
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334,
335,
336,
337,
338,
339,
340,
341,
342,
343,
344,
345,
346,
347,
348,
349,
350,
351,
352,
353,
354,
355,
356,
357,
358,
359,
360,
361,
362,
363,
364,
365,
366,
367,
368,
369,
370,
371,
372,
373,
374,
375,
376,
377,
378,
379,
380,
381,
382,
383,
384,
385,
386,
387,
388,
389,
390,
391,
392,
393,
394,
395,
396,
397,
398,
399,
400,
401,
402,
403,
404,
405,
406,
407,
408,
409,
410,
411,
412,
413,
414,
415,
416,
417,
418,
419,
420,
421,
422,
423,
424,
425,
426,
427,
428,
429,
430,
431,
432,
433,
434,
435,
436,
437,
438,
439,
440,
441,
442,
443,
444,
445,
446,
447,
448,
449,
450,
451,
452,
453,
454,
455,
456,
457,
458,
459,
460,
461,
462,
463,
464,
465,
466,
467,
468,
469,
470,
471,
472,
473,
474,
475,
476,
477,
478,
479,
480,
481,
482,
483,
484,
485,
486,
487,
488,
489,
490,
491,
492,
493,
494,
495,
496,
497,
498,
499,
500,
501,
502
],
"start": 519,
"length": 19502,
"ending_column": 11,
"is_dependency": false,
"filename_short": "contracts/Sale.sol",
"starting_column": 71,
"filename_absolute": "/tmp/slither-gubm5ea2/contracts/Sale.sol",
"filename_relative": "contracts/Sale.sol"
}
},
"signature": "_executeTokenBuy(address,address,uint256,uint256,IERC20Metadata,uint256,uint256,uint256,bytes)"
}
}
}
},
{
"name": "_checkReferrerAndPayBonus(buyer,referrer,buyTokenAmount)",
"type": "node",
"source_mapping": {
"lines": [
371,
372
],
"start": 14151,
"length": 58,
"ending_column": 5,
"is_dependency": false,
"filename_short": "contracts/Sale.sol",
"starting_column": 34,
"filename_absolute": "/tmp/slither-gubm5ea2/contracts/Sale.sol",
"filename_relative": "contracts/Sale.sol"
},
"additional_fields": {
"variable_name": "accountToBuyerInfo",
"underlying_type": "variables_written"
},
"type_specific_fields": {
"parent": {
"name": "_executeTokenBuy",
"type": "function",
"source_mapping": {
"lines": [
338,
339,
340,
341,
342,
343,
344,
345,
346,
347,
348,
349,
350,
351,
352,
353,
354,
355,
356,
357,
358,
359,
360,
361,
362,
363,
364,
365,
366,
367,
368,
369,
370,
371,
372,
373,
374,
375,
376
],
"start": 12977,
"length": 1399,
"ending_column": 16,
"is_dependency": false,
"filename_short": "contracts/Sale.sol",
"starting_column": 23,
"filename_absolute": "/tmp/slither-gubm5ea2/contracts/Sale.sol",
"filename_relative": "contracts/Sale.sol"
},
"type_specific_fields": {
"parent": {
"name": "Sale",
"type": "contract",
"source_mapping": {
"lines": [
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31,
32,
33,
34,
35,
36,
37,
38,
39,
40,
41,
42,
43,
44,
45,
46,
47,
48,
49,
50,
51,
52,
53,
54,
55,
56,
57,
58,
59,
60,
61,
62,
63,
64,
65,
66,
67,
68,
69,
70,
71,
72,
73,
74,
75,
76,
77,
78,
79,
80,
81,
82,
83,
84,
85,
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334,
335,
336,
337,
338,
339,
340,
341,
342,
343,
344,
345,
346,
347,
348,
349,
350,
351,
352,
353,
354,
355,
356,
357,
358,
359,
360,
361,
362,
363,
364,
365,
366,
367,
368,
369,
370,
371,
372,
373,
374,
375,
376,
377,
378,
379,
380,
381,
382,
383,
384,
385,
386,
387,
388,
389,
390,
391,
392,
393,
394,
395,
396,
397,
398,
399,
400,
401,
402,
403,
404,
405,
406,
407,
408,
409,
410,
411,
412,
413,
414,
415,
416,
417,
418,
419,
420,
421,
422,
423,
424,
425,
426,
427,
428,
429,
430,
431,
432,
433,
434,
435,
436,
437,
438,
439,
440,
441,
442,
443,
444,
445,
446,
447,
448,
449,
450,
451,
452,
453,
454,
455,
456,
457,
458,
459,
460,
461,
462,
463,
464,
465,
466,
467,
468,
469,
470,
471,
472,
473,
474,
475,
476,
477,
478,
479,
480,
481,
482,
483,
484,
485,
486,
487,
488,
489,
490,
491,
492,
493,
494,
495,
496,
497,
498,
499,
500,
501,
502
],
"start": 519,
"length": 19502,
"ending_column": 11,
"is_dependency": false,
"filename_short": "contracts/Sale.sol",
"starting_column": 71,
"filename_absolute": "/tmp/slither-gubm5ea2/contracts/Sale.sol",
"filename_relative": "contracts/Sale.sol"
}
},
"signature": "_executeTokenBuy(address,address,uint256,uint256,IERC20Metadata,uint256,uint256,uint256,bytes)"
}
}
}
},
{
"name": "accountToBuyerInfo[buyer].refStatus = Status.Gold",
"type": "node",
"source_mapping": {
"lines": [
440,
441
],
"start": 17173,
"length": 49,
"ending_column": 12,
"is_dependency": false,
"filename_short": "contracts/Sale.sol",
"starting_column": 76,
"filename_absolute": "/tmp/slither-gubm5ea2/contracts/Sale.sol",
"filename_relative": "contracts/Sale.sol"
},
"additional_fields": {
"variable_name": "accountToBuyerInfo",
"underlying_type": "variables_written"
},
"type_specific_fields": {
"parent": {
"name": "_updateRefStatus",
"type": "function",
"source_mapping": {
"lines": [
438,
439,
440,
441,
442,
443,
444,
445,
446,
447,
448,
449,
450,
451
],
"start": 16924,
"length": 699,
"ending_column": 17,
"is_dependency": false,
"filename_short": "contracts/Sale.sol",
"starting_column": 14,
"filename_absolute": "/tmp/slither-gubm5ea2/contracts/Sale.sol",
"filename_relative": "contracts/Sale.sol"
},
"type_specific_fields": {
"parent": {
"name": "Sale",
"type": "contract",
"source_mapping": {
"lines": [
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31,
32,
33,
34,
35,
36,
37,
38,
39,
40,
41,
42,
43,
44,
45,
46,
47,
48,
49,
50,
51,
52,
53,
54,
55,
56,
57,
58,
59,
60,
61,
62,
63,
64,
65,
66,
67,
68,
69,
70,
71,
72,
73,
74,
75,
76,
77,
78,
79,
80,
81,
82,
83,
84,
85,
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334,
335,
336,
337,
338,
339,
340,
341,
342,
343,
344,
345,
346,
347,
348,
349,
350,
351,
352,
353,
354,
355,
356,
357,
358,
359,
360,
361,
362,
363,
364,
365,
366,
367,
368,
369,
370,
371,
372,
373,
374,
375,
376,
377,
378,
379,
380,
381,
382,
383,
384,
385,
386,
387,
388,
389,
390,
391,
392,
393,
394,
395,
396,
397,
398,
399,
400,
401,
402,
403,
404,
405,
406,
407,
408,
409,
410,
411,
412,
413,
414,
415,
416,
417,
418,
419,
420,
421,
422,
423,
424,
425,
426,
427,
428,
429,
430,
431,
432,
433,
434,
435,
436,
437,
438,
439,
440,
441,
442,
443,
444,
445,
446,
447,
448,
449,
450,
451,
452,
453,
454,
455,
456,
457,
458,
459,
460,
461,
462,
463,
464,
465,
466,
467,
468,
469,
470,
471,
472,
473,
474,
475,
476,
477,
478,
479,
480,
481,
482,
483,
484,
485,
486,
487,
488,
489,
490,
491,
492,
493,
494,
495,
496,
497,
498,
499,
500,
501,
502
],
"start": 519,
"length": 19502,
"ending_column": 11,
"is_dependency": false,
"filename_short": "contracts/Sale.sol",
"starting_column": 71,
"filename_absolute": "/tmp/slither-gubm5ea2/contracts/Sale.sol",
"filename_relative": "contracts/Sale.sol"
}
},
"signature": "_updateRefStatus(address,Sale.BuyerInfo)"
}
}
}
},
{
"name": "accountToBuyerInfo[buyer].referrer = referrer",
"type": "node",
"source_mapping": {
"lines": [
461,
462,
463
],
"start": 18215,
"length": 45,
"ending_column": 1,
"is_dependency": false,
"filename_short": "contracts/Sale.sol",
"starting_column": 28,
"filename_absolute": "/tmp/slither-gubm5ea2/contracts/Sale.sol",
"filename_relative": "contracts/Sale.sol"
},
"additional_fields": {
"variable_name": "accountToBuyerInfo",
"underlying_type": "variables_written"
},
"type_specific_fields": {
"parent": {
"name": "_checkReferrerAndPayBonus",
"type": "function",
"source_mapping": {
"lines": [
454,
455,
456,
457,
458,
459,
460,
461,
462,
463,
464,
465,
466,
467,
468,
469,
470,
471
],
"start": 17900,
"length": 871,
"ending_column": 40,
"is_dependency": false,
"filename_short": "contracts/Sale.sol",
"starting_column": 39,
"filename_absolute": "/tmp/slither-gubm5ea2/contracts/Sale.sol",
"filename_relative": "contracts/Sale.sol"
},
"type_specific_fields": {
"parent": {
"name": "Sale",
"type": "contract",
"source_mapping": {
"lines": [
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31,
32,
33,
34,
35,
36,
37,
38,
39,
40,
41,
42,
43,
44,
45,
46,
47,
48,
49,
50,
51,
52,
53,
54,
55,
56,
57,
58,
59,
60,
61,
62,
63,
64,
65,
66,
67,
68,
69,
70,
71,
72,
73,
74,
75,
76,
77,
78,
79,
80,
81,
82,
83,
84,
85,
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334,
335,
336,
337,
338,
339,
340,
341,
342,
343,
344,
345,
346,
347,
348,
349,
350,
351,
352,
353,
354,
355,
356,
357,
358,
359,
360,
361,
362,
363,
364,
365,
366,
367,
368,
369,
370,
371,
372,
373,
374,
375,
376,
377,
378,
379,
380,
381,
382,
383,
384,
385,
386,
387,
388,
389,
390,
391,
392,
393,
394,
395,
396,
397,
398,
399,
400,
401,
402,
403,
404,
405,
406,
407,
408,
409,
410,
411,
412,
413,
414,
415,
416,
417,
418,
419,
420,
421,
422,
423,
424,
425,
426,
427,
428,
429,
430,
431,
432,
433,
434,
435,
436,
437,
438,
439,
440,
441,
442,
443,
444,
445,
446,
447,
448,
449,
450,
451,
452,
453,
454,
455,
456,
457,
458,
459,
460,
461,
462,
463,
464,
465,
466,
467,
468,
469,
470,
471,
472,
473,
474,
475,
476,
477,
478,
479,
480,
481,
482,
483,
484,
485,
486,
487,
488,
489,
490,
491,
492,
493,
494,
495,
496,
497,
498,
499,
500,
501,
502
],
"start": 519,
"length": 19502,
"ending_column": 11,
"is_dependency": false,
"filename_short": "contracts/Sale.sol",
"starting_column": 71,
"filename_absolute": "/tmp/slither-gubm5ea2/contracts/Sale.sol",
"filename_relative": "contracts/Sale.sol"
}
},
"signature": "_checkReferrerAndPayBonus(address,address,uint256)"
}
}
}
}
],
"locations": [
{
"file": "contracts/Sale.sol",
"name": "_executeTokenBuy",
"type": "function",
"lines": [
338,
339,
340,
341,
342,
343,
344,
345,
346,
347,
348,
349,
350,
351,
352,
353,
354,
355,
356,
357,
358,
359,
360,
361,
362,
363,
364,
365,
366,
367,
368,
369,
370,
371,
372,
373,
374,
375,
376
]
},
{
"file": "contracts/Sale.sol",
"name": "(success,None) = buyer.call{value: msg.value - payTokenAmount}()",
"type": "node",
"lines": [
362,
363,
364,
365
]
},
{
"file": "contracts/Sale.sol",
"name": "_checkReferrerAndPayBonus(buyer,referrer,buyTokenAmount)",
"type": "node",
"lines": [
371,
372
]
},
{
"file": "contracts/Sale.sol",
"name": "accountToBuyerInfo[buyer].refStatus = Status.Gold",
"type": "node",
"lines": [
440,
441
]
},
{
"file": "contracts/Sale.sol",
"name": "accountToBuyerInfo[buyer].referrer = referrer",
"type": "node",
"lines": [
461,
462,
463
]
},
{
"file": "contracts/Sale.sol",
"name": "accountToBuyerInfo[buyer].refStatus = Status.Silver",
"type": "node",
"lines": [
445,
446,
447,
448
]
},
{
"file": "contracts/Sale.sol",
"name": "accountToBuyerInfo[buyer].refStatus = Status.Bronze",
"type": "node",
"lines": [
450
]
},
{
"file": "contracts/Sale.sol",
"name": "_checkAndUpdateBuyerStatuses(buyer,payTokenAmount,payToken,usdPrice)",
"type": "node",
"lines": [
372,
373,
374
]
},
{
"file": "contracts/Sale.sol",
"name": "accountToBuyerInfo[buyer].refStatus = Status.Gold",
"type": "node",
"lines": [
440,
441
]
},
{
"file": "contracts/Sale.sol",
"name": "accountToBuyerInfo[buyer].refStatus = Status.Silver",
"type": "node",
"lines": [
445,
446,
447,
448
]
},
{
"file": "contracts/Sale.sol",
"name": "accountToBuyerInfo[buyer].payAmountInUSD += payAmountInUSD",
"type": "node",
"lines": [
423,
424,
425,
426
]
},
{
"file": "contracts/Sale.sol",
"name": "accountToBuyerInfo[buyer].refStatus = Status.Bronze",
"type": "node",
"lines": [
450
]
},
{
"file": "contracts/Sale.sol",
"name": "accountToBuyerInfo[buyer].buyStatus = Status.Gold",
"type": "node",
"lines": [
429,
430,
431
]
},
{
"file": "contracts/Sale.sol",
"name": "accountToBuyerInfo[buyer].buyStatus = Status.Silver",
"type": "node",
"lines": [
432,
433
]
},
{
"file": "contracts/Sale.sol",
"name": "accountToBuyerInfo[buyer].buyStatus = Status.Bronze",
"type": "node",
"lines": [
436
]
}
],
"description": "Reentrancy in Sale._executeTokenBuy(address,address,uint256,uint256,IERC20Metadata,uint256,uint256,uint256,bytes) (contracts/Sale.sol#338-376):\n\tExternal calls:\n\t- (success,None) = buyer.call{value: msg.value - payTokenAmount}() (contracts/Sale.sol#362-365)\n\tState variables written after the call(s):\n\t- _checkReferrerAndPayBonus(buyer,referrer,buyTokenAmount) (contracts/Sale.sol#371-372)\n\t\t- accountToBuyerInfo[buyer].refStatus = Status.Gold (contracts/Sale.sol#440-441)\n\t\t- accountToBuyerInfo[buyer].referrer = referrer (contracts/Sale.sol#461-463)\n\t\t- accountToBuyerInfo[buyer].refStatus = Status.Silver (contracts/Sale.sol#445-448)\n\t\t- accountToBuyerInfo[buyer].refStatus = Status.Bronze (contracts/Sale.sol#450)\n\tSale.accountToBuyerInfo (contracts/Sale.sol#91-92) can be used in cross function reentrancies:\n\t- Sale._calcBuyBonus(address,uint256) (contracts/Sale.sol#451-454)\n\t- Sale._checkAndUpdateBuyerStatuses(address,uint256,IERC20Metadata,uint256) (contracts/Sale.sol#413-438)\n\t- Sale._checkAndUpdateSellCounter(address,uint256) (contracts/Sale.sol#408-413)\n\t- Sale._checkReferrerAndPayBonus(address,address,uint256) (contracts/Sale.sol#454-471)\n\t- Sale._updateRefStatus(address,Sale.BuyerInfo) (contracts/Sale.sol#438-451)\n\t- Sale.accountToBuyerInfo (contracts/Sale.sol#91-92)\n\t- _checkAndUpdateBuyerStatuses(buyer,payTokenAmount,payToken,usdPrice) (contracts/Sale.sol#372-374)\n\t\t- accountToBuyerInfo[buyer].refStatus = Status.Gold (contracts/Sale.sol#440-441)\n\t\t- accountToBuyerInfo[buyer].refStatus = Status.Silver (contracts/Sale.sol#445-448)\n\t\t- accountToBuyerInfo[buyer].payAmountInUSD += payAmountInUSD (contracts/Sale.sol#423-426)\n\t\t- accountToBuyerInfo[buyer].refStatus = Status.Bronze (contracts/Sale.sol#450)\n\t\t- accountToBuyerInfo[buyer].buyStatus = Status.Gold (contracts/Sale.sol#429-431)\n\t\t- accountToBuyerInfo[buyer].buyStatus = Status.Silver (contracts/Sale.sol#432-433)\n\t\t- accountToBuyerInfo[buyer].buyStatus = Status.Bronze (contracts/Sale.sol#436)\n\tSale.accountToBuyerInfo (contracts/Sale.sol#91-92) can be used in cross function reentrancies:\n\t- Sale._calcBuyBonus(address,uint256) (contracts/Sale.sol#451-454)\n\t- Sale._checkAndUpdateBuyerStatuses(address,uint256,IERC20Metadata,uint256) (contracts/Sale.sol#413-438)\n\t- Sale._checkAndUpdateSellCounter(address,uint256) (contracts/Sale.sol#408-413)\n\t- Sale._checkReferrerAndPayBonus(address,address,uint256) (contracts/Sale.sol#454-471)\n\t- Sale._updateRefStatus(address,Sale.BuyerInfo) (contracts/Sale.sol#438-451)\n\t- Sale.accountToBuyerInfo (contracts/Sale.sol#91-92)"
}
|
| high | other | slither | Sale.withdrawTokens(IERC20Metadata,address,uint256) (contracts/Sale.sol#258-273) sends eth to arbitrary user | 85 | no | — |
viewevidence_json{
"impact": "High",
"detector": "arbitrary-send-eth",
"elements": [
{
"name": "withdrawTokens",
"type": "function",
"source_mapping": {
"lines": [
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273
],
"start": 10006,
"length": 428,
"ending_column": 13,
"is_dependency": false,
"filename_short": "contracts/Sale.sol",
"starting_column": 29,
"filename_absolute": "/tmp/slither-gubm5ea2/contracts/Sale.sol",
"filename_relative": "contracts/Sale.sol"
},
"type_specific_fields": {
"parent": {
"name": "Sale",
"type": "contract",
"source_mapping": {
"lines": [
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31,
32,
33,
34,
35,
36,
37,
38,
39,
40,
41,
42,
43,
44,
45,
46,
47,
48,
49,
50,
51,
52,
53,
54,
55,
56,
57,
58,
59,
60,
61,
62,
63,
64,
65,
66,
67,
68,
69,
70,
71,
72,
73,
74,
75,
76,
77,
78,
79,
80,
81,
82,
83,
84,
85,
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334,
335,
336,
337,
338,
339,
340,
341,
342,
343,
344,
345,
346,
347,
348,
349,
350,
351,
352,
353,
354,
355,
356,
357,
358,
359,
360,
361,
362,
363,
364,
365,
366,
367,
368,
369,
370,
371,
372,
373,
374,
375,
376,
377,
378,
379,
380,
381,
382,
383,
384,
385,
386,
387,
388,
389,
390,
391,
392,
393,
394,
395,
396,
397,
398,
399,
400,
401,
402,
403,
404,
405,
406,
407,
408,
409,
410,
411,
412,
413,
414,
415,
416,
417,
418,
419,
420,
421,
422,
423,
424,
425,
426,
427,
428,
429,
430,
431,
432,
433,
434,
435,
436,
437,
438,
439,
440,
441,
442,
443,
444,
445,
446,
447,
448,
449,
450,
451,
452,
453,
454,
455,
456,
457,
458,
459,
460,
461,
462,
463,
464,
465,
466,
467,
468,
469,
470,
471,
472,
473,
474,
475,
476,
477,
478,
479,
480,
481,
482,
483,
484,
485,
486,
487,
488,
489,
490,
491,
492,
493,
494,
495,
496,
497,
498,
499,
500,
501,
502
],
"start": 519,
"length": 19502,
"ending_column": 11,
"is_dependency": false,
"filename_short": "contracts/Sale.sol",
"starting_column": 71,
"filename_absolute": "/tmp/slither-gubm5ea2/contracts/Sale.sol",
"filename_relative": "contracts/Sale.sol"
}
},
"signature": "withdrawTokens(IERC20Metadata,address,uint256)"
}
},
{
"name": "(success,None) = to.call{value: amount}()",
"type": "node",
"source_mapping": {
"lines": [
263,
264,
265
],
"start": 10205,
"length": 45,
"ending_column": 32,
"is_dependency": false,
"filename_short": "contracts/Sale.sol",
"starting_column": 20,
"filename_absolute": "/tmp/slither-gubm5ea2/contracts/Sale.sol",
"filename_relative": "contracts/Sale.sol"
},
"type_specific_fields": {
"parent": {
"name": "withdrawTokens",
"type": "function",
"source_mapping": {
"lines": [
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273
],
"start": 10006,
"length": 428,
"ending_column": 13,
"is_dependency": false,
"filename_short": "contracts/Sale.sol",
"starting_column": 29,
"filename_absolute": "/tmp/slither-gubm5ea2/contracts/Sale.sol",
"filename_relative": "contracts/Sale.sol"
},
"type_specific_fields": {
"parent": {
"name": "Sale",
"type": "contract",
"source_mapping": {
"lines": [
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31,
32,
33,
34,
35,
36,
37,
38,
39,
40,
41,
42,
43,
44,
45,
46,
47,
48,
49,
50,
51,
52,
53,
54,
55,
56,
57,
58,
59,
60,
61,
62,
63,
64,
65,
66,
67,
68,
69,
70,
71,
72,
73,
74,
75,
76,
77,
78,
79,
80,
81,
82,
83,
84,
85,
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334,
335,
336,
337,
338,
339,
340,
341,
342,
343,
344,
345,
346,
347,
348,
349,
350,
351,
352,
353,
354,
355,
356,
357,
358,
359,
360,
361,
362,
363,
364,
365,
366,
367,
368,
369,
370,
371,
372,
373,
374,
375,
376,
377,
378,
379,
380,
381,
382,
383,
384,
385,
386,
387,
388,
389,
390,
391,
392,
393,
394,
395,
396,
397,
398,
399,
400,
401,
402,
403,
404,
405,
406,
407,
408,
409,
410,
411,
412,
413,
414,
415,
416,
417,
418,
419,
420,
421,
422,
423,
424,
425,
426,
427,
428,
429,
430,
431,
432,
433,
434,
435,
436,
437,
438,
439,
440,
441,
442,
443,
444,
445,
446,
447,
448,
449,
450,
451,
452,
453,
454,
455,
456,
457,
458,
459,
460,
461,
462,
463,
464,
465,
466,
467,
468,
469,
470,
471,
472,
473,
474,
475,
476,
477,
478,
479,
480,
481,
482,
483,
484,
485,
486,
487,
488,
489,
490,
491,
492,
493,
494,
495,
496,
497,
498,
499,
500,
501,
502
],
"start": 519,
"length": 19502,
"ending_column": 11,
"is_dependency": false,
"filename_short": "contracts/Sale.sol",
"starting_column": 71,
"filename_absolute": "/tmp/slither-gubm5ea2/contracts/Sale.sol",
"filename_relative": "contracts/Sale.sol"
}
},
"signature": "withdrawTokens(IERC20Metadata,address,uint256)"
}
}
}
}
],
"locations": [
{
"file": "contracts/Sale.sol",
"name": "withdrawTokens",
"type": "function",
"lines": [
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273
]
},
{
"file": "contracts/Sale.sol",
"name": "(success,None) = to.call{value: amount}()",
"type": "node",
"lines": [
263,
264,
265
]
}
],
"description": "Sale.withdrawTokens(IERC20Metadata,address,uint256) (contracts/Sale.sol#258-273) sends eth to arbitrary user\n\tDangerous calls:\n\t- (success,None) = to.call{value: amount}() (contracts/Sale.sol#263-265)"
}
|
| high | other | codex | Referrer field is never validated, enabling self-referral and cyclic referral farming | 85 | no | — |
viewevidence_json{
"evidence": "`InvalidReferrer` is declared but never used. On a first buy, `_checkReferrerAndPayBonus` stores any non-zero `referrer` directly, then pays 3 levels of bonuses by repeatedly following `buyerInfo.referrer`. With default `refStatusToRequirements = [0, 0, 5000, 10000]`, `_updateRefStatus` can mark a zero-volume address as Bronze before the payout loop runs.",
"locations": [
"contracts/Sale.sol:25",
"contracts/Sale.sol:152",
"contracts/Sale.sol:153",
"contracts/Sale.sol:466",
"contracts/Sale.sol:468",
"contracts/Sale.sol:469",
"contracts/Sale.sol:470",
"contracts/Sale.sol:473",
"contracts/Sale.sol:479"
],
"recommendation": "Validate the supplied referrer before storing it or paying bonuses. At minimum, reject `referrer == buyer`, reject obvious cycles, and consider requiring the referrer to be a pre-existing eligible participant. Apply validation before `accountToBuyerInfo[buyer].referrer = referrer` and before traversing the referral chain.",
"exploit_scenario": "A buyer can set `referrer` to their own address on their first purchase. The contract stores that value without validation, then walks the referral chain for 3 levels and transfers referral bonuses each time. Because Bronze referral status is reachable at zero historical volume by default, the same buyer can immediately collect all 3 referral tiers on their own purchase. After reaching higher referral status, they can keep buying through the same self-reference and siphon 14% to 17.5% extra sale tokens per purchase. Two or more colluding accounts can also create short referral cycles and recycle the same bonus path."
}
|
| medium | other | detector | CREATE/CREATE2 reachable | 45 | no | no |
viewtrace_id: 0x8e27592399d55f29813d63493ed1f9eb80061c658d234683439c36ff8bfe13f2
validation_json{
"sink": "CREATE",
"errors": 0,
"status": "unknown",
"attempts": 32,
"trace_id": "0x8e27592399d55f29813d63493ed1f9eb80061c658d234683439c36ff8bfe13f2",
"confirmed": false,
"trace_mode": "structLogs",
"call_targets": null,
"matched_probe": null,
"target_varies": null,
"classification": "no_sink"
}
witness_json{
"notes": "heuristic witness; entrypoints are best-effort selectors with zeroed calldata",
"constraints": [],
"entrypoints": [
{
"calldata": "0xdc173042",
"selector": "0xdc173042",
"calldata_variants": [
"0xdc173042",
"0xdc1730420000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xf5b541a6",
"selector": "0xf5b541a6",
"calldata_variants": [
"0xf5b541a6",
"0xf5b541a60000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xf9d9e31b",
"selector": "0xf9d9e31b",
"calldata_variants": [
"0xf9d9e31b",
"0xf9d9e31b0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xfa5a89f1",
"selector": "0xfa5a89f1",
"calldata_variants": [
"0xfa5a89f1",
"0xfa5a89f10000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xd547741f",
"selector": "0xd547741f",
"calldata_variants": [
"0xd547741f",
"0xd547741f0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xd602b9fd",
"selector": "0xd602b9fd",
"calldata_variants": [
"0xd602b9fd",
"0xd602b9fd0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xda71c017",
"selector": "0xda71c017",
"calldata_variants": [
"0xda71c017",
"0xda71c0170000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xc26e2c03",
"selector": "0xc26e2c03",
"calldata_variants": [
"0xc26e2c03",
"0xc26e2c030000000000000000000000000000000000000000000000000000000000000000"
]
}
]
}
evidence_json{
"create_count": 0,
"create2_count": 1
}
|
| medium | math | codex | Exact-output buys can mint market tokens for zero payment because rounding-down is unchecked | 75 | no | — |
viewevidence_json{
"evidence": "`buyExactMarketTokenForPayToken` only enforces a minimum `buyAmount` based on decimal difference, then computes `payTokenAmount` with integer division. `_executeTokenBuy` accepts that value as-is and only checks `msg.value < payTokenAmount` or performs `safeTransferFrom(..., payTokenAmount)`. If `payTokenAmount` is zero, both payment branches succeed while `marketToken.safeTransfer` still sends the purchased tokens.",
"locations": [
"contracts/Sale.sol:169",
"contracts/Sale.sol:173",
"contracts/Sale.sol:174",
"contracts/Sale.sol:349",
"contracts/Sale.sol:368",
"contracts/Sale.sol:375",
"contracts/Sale.sol:376",
"contracts/Sale.sol:379"
],
"recommendation": "After computing `payTokenAmount`, require it to be non-zero before proceeding, or round up instead of down for exact-output purchases. Also consider binding `buyAmount` or `payTokenAmount` into the signed payload if quote authorization is meant to cover the full trade terms.",
"exploit_scenario": "For low-priced payment assets, a buyer can call `buyExactMarketTokenForPayToken` with a small but valid `buyAmount` such that `prices[payTokenIndex] * buyAmount / 10**marketToken.decimals()` rounds down to zero. `_executeTokenBuy` never rejects `payTokenAmount == 0`, so the buyer receives market tokens while paying neither ETH nor ERC20 tokens. Because the signature only covers `(account, payToken, usdPrice, deadline, nonce)` and not `buyAmount`, any valid signed quote for that pay token can be reused with one of these free-buy sizes."
}
|
| low | other | cast | Contract creation opcode present | 60 | no | — |
viewevidence_json{
"notes": "runtime can deploy contracts dynamically via CREATE/CREATE2",
"create_count": 0,
"create2_count": 1
}
|
| info | other | cast | Heavy CALL-family usage | 55 | no | — |
viewevidence_json{
"notes": "large number of CALL/CALLCODE/STATICCALL opcodes; review external call patterns",
"call_family_count": 14
}
|