019d5666-f542-7208-84bc-d2e3db83e367
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 |
|---|---|---|---|---|
| 42971 | artifact.fetch | complete | 1 / 3 | 1 week ago |
| 42972 | proxy.resolve | complete | 1 / 3 | 1 week ago |
| 42973 | tool.cast_disasm | complete | 1 / 3 | 1 week ago |
| 42974 | analysis.bundle | complete | 1 / 3 | 1 week ago |
| 42975 | capability.graph | complete | 1 / 3 | 1 week ago |
| 42976 | detector.run | complete | 1 / 3 | 1 week ago |
| 42977 | validation.fork | complete | 1 / 3 | 1 week ago |
| 43010 | report.consolidate | complete | 1 / 6 | 1 week ago |
| 43011 | tool.slither | complete | 1 / 2 | 1 week ago |
{
"status": "not_proxy"
}
'forge clean' running (wd: /tmp/slither-bjjc5fai) 'forge config --json' running 'forge build --build-info --skip ./test/** ./script/** --force' running (wd: /tmp/slither-bjjc5fai) Impossible to generate IR for GPv2Settlement.executeInteractions (lib/contracts/src/contracts/GPv2Settlement.sol#446-466): 'Contract' object has no attribute 'type' GPv2Transfer.fastTransferFromAccount(IVault,GPv2Transfer.Data,address) (lib/contracts/src/contracts/libraries/GPv2Transfer.sol#46-77) uses arbitrary from in transferFrom: transfer.token.safeTransferFrom(transfer.account,recipient,transfer.amount) (lib/contracts/src/contracts/libraries/GPv2Transfer.sol#57-61) GPv2Transfer.transferFromAccounts(IVault,GPv2Transfer.Data[],address) (lib/contracts/src/contracts/libraries/GPv2Transfer.sol#91-136) uses arbitrary from in transferFrom: transfer.token.safeTransferFrom(transfer.account,recipient,transfer.amount) (lib/contracts/src/contracts/libraries/GPv2Transfer.sol#113-117) TransferLibrary.receiveAssets(address,address,uint256) (src/libraries/TransferLibrary.sol#40-48) uses arbitrary from in transferFrom: IERC20(asset).safeTransferFrom(from,address(this),assets) (src/libraries/TransferLibrary.sol#46) Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#arbitrary-from-in-transferfrom StorageAccessible.simulateDelegatecallInternal(address,bytes) (lib/contracts/src/contracts/mixins/StorageAccessible.sol#87-95) uses delegatecall to a input-controlled function id - (success,response) = targetContract.delegatecall(calldataPayload) (lib/contracts/src/contracts/mixins/StorageAccessible.sol#93) Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#controlled-delegatecall 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 GPv2Settlement.computeTradeExecution(GPv2Signing.RecoveredOrder,uint256,uint256,uint256,GPv2Transfer.Data,GPv2Transfer.Data) (lib/contracts/src/contracts/GPv2Settlement.sol#337-442) performs a multiplication on the result of a division: - executedBuyAmount = executedSellAmount.mul(sellPrice).ceilDiv(buyPrice) (lib/contracts/src/contracts/GPv2Settlement.sol#389-391) - executedSellAmount = executedBuyAmount.mul(buyPrice).div(sellPrice) (lib/contracts/src/contracts/GPv2Settlement.sol#411) GPv2Settlement.computeTradeExecution(GPv2Signing.RecoveredOrder,uint256,uint256,uint256,GPv2Transfer.Data,GPv2Transfer.Data) (lib/contracts/src/contracts/GPv2Settlement.sol#337-442) performs a multiplication on the result of a division: - executedFeeAmount = order.feeAmount.mul(executedSellAmount).div(order.sellAmount) (lib/contracts/src/contracts/GPv2Settlement.sol#381-383) - executedSellAmount = executedBuyAmount.mul(buyPrice).div(sellPrice) (lib/contracts/src/contracts/GPv2Settlement.sol#411) 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 GPv2Settlement.swap(IVault.BatchSwapStep[],IERC20[],GPv2Trade.Data).funds (lib/contracts/src/contracts/GPv2Settlement.sol#166) is a local variable never initialized GPv2Settlement.swap(IVault.BatchSwapStep[],IERC20[],GPv2Trade.Data).feeTransfer (lib/contracts/src/contracts/GPv2Settlement.sol#189) is a local variable never initialized Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#uninitialized-local-variables GPv2Signing.setPreSignature(bytes,bool) (lib/contracts/src/contracts/mixins/GPv2Signing.sol#88-97) ignores return value by (None,owner,None) = orderUid.extractOrderUidParams() (lib/contracts/src/contracts/mixins/GPv2Signing.sol#89) GPv2Settlement.invalidateOrder(bytes) (lib/contracts/src/contracts/GPv2Settlement.sol#250-255) ignores return value by (None,owner,None) = orderUid.extractOrderUidParams() (lib/contracts/src/contracts/GPv2Settlement.sol#251) GPv2Settlement.freeOrderStorage(mapping(bytes => uint256),bytes[]) (lib/contracts/src/contracts/GPv2Settlement.sol#474-487) ignores return value by (None,None,validTo) = orderUid.extractOrderUidParams() (lib/contracts/src/contracts/GPv2Settlement.sol#481) MellowACL._revokeRole(bytes32,address) (src/permissions/MellowACL.sol#47-56) ignores return value by _mellowACLStorage().supportedRoles.remove(role) (src/permissions/MellowACL.sol#50) AccessControlEnumerableUpgradeable._grantRole(bytes32,address) (lib/openzeppelin-contracts-upgradeable/contracts/access/extensions/AccessControlEnumerableUpgradeable.sol#85-92) ignores return value by $._roleMembers[role].add(account) (lib/openzeppelin-contracts-upgradeable/contracts/access/extensions/AccessControlEnumerableUpgradeable.sol#89) AccessControlEnumerableUpgradeable._revokeRole(bytes32,address) (lib/openzeppelin-contracts-upgradeable/contracts/access/extensions/AccessControlEnumerableUpgradeable.sol#97-104) ignores return value by $._roleMembers[role].remove(account) (lib/openzeppelin-contracts-upgradeable/contracts/access/extensions/AccessControlEnumerableUpgradeable.sol#101) Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#unused-return StorageAccessible.simulateDelegatecallInternal(address,bytes).targetContract (lib/contracts/src/contracts/mixins/StorageAccessible.sol#88) lacks a zero-check on : - (success,response) = targetContract.delegatecall(calldataPayload) (lib/contracts/src/contracts/mixins/StorageAccessible.sol#93) SwapModule.constructor(string,uint256,address,address,address).cowswapSettlement_ (src/utils/SwapModule.sol#42) lacks a zero-check on : - cowswapSettlement = cowswapSettlement_ (src/utils/SwapModule.sol#46) SwapModule.constructor(string,uint256,address,address,address).cowswapVaultRelayer_ (src/utils/SwapModule.sol#43) lacks a zero-check on : - cowswapVaultRelayer = cowswapVaultRelayer_ (src/utils/SwapModule.sol#47) SwapModule.constructor(string,uint256,address,address,address).weth_ (src/utils/SwapModule.sol#44) lacks a zero-check on : - weth = weth_ (src/utils/SwapModule.sol#48) Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#missing-zero-address-validation GPv2Signing.recoverEip1271Signer(bytes32,bytes) (lib/contracts/src/contracts/mixins/GPv2Signing.sol#281-303) has external calls inside a loop: require(bool,string)(EIP1271Verifier(owner).isValidSignature(orderDigest,signature) == GPv2EIP1271.MAGICVALUE,GPv2: invalid eip1271 signature) (lib/contracts/src/contracts/mixins/GPv2Signing.sol#298-302) Calls stack containing the loop: GPv2Settlement.settle(IERC20[],uint256[],GPv2Trade.Data[],GPv2Interaction.Data[][3]) GPv2Settlement.computeTradeExecutions(IERC20[],uint256[],GPv2Trade.Data[]) GPv2Signing.recoverOrderFromTrade(GPv2Signing.RecoveredOrder,IERC20[],GPv2Trade.Data) GPv2Signing.recoverOrderSigner(GPv2Order.Data,GPv2Signing.Scheme,bytes) Reference: https://github.com/crytic/slither/wiki/Detector-Documentation/#calls-inside-a-loop Reentrancy in GPv2Settlement.swap(IVault.BatchSwapStep[],IERC20[],GPv2Trade.Data) (lib/contracts/src/contracts/GPv2Settlement.sol#153-242): External calls: - tokenDeltas = vaultRelayer.batchSwapWithFee(kind,swaps,tokens,funds,limits,order.validTo,feeTransfer) (lib/contracts/src/contracts/GPv2Settlement.sol#195-205) State variables written after the call(s): - filledAmount[orderUid] = order.sellAmount (lib/contracts/src/contracts/GPv2Settlement.sol#223) - filledAmount[orderUid] = order.buyAmount (lib/contracts/src/contracts/GPv2Settlement.sol#229) Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-2 Reentrancy in SwapModule.createLimitOrder(ISwapModule.Params,GPv2Order.Data,bytes) (src/utils/SwapModule.sol#286-294): External calls: - GPv2Settlement(address(cowswapSettlement)).setPreSignature(orderUid,true) (src/utils/SwapModule.sol#292) Event emitted after the call(s): - LimitOrderCreated(params,orderUid) (src/utils/SwapModule.sol#293) Reentrancy in SwapModule.invalidateOrder(bytes) (src/utils/SwapModule.sol#297-300): External calls: - GPv2Settlement(address(cowswapSettlement)).invalidateOrder(orderUid) (src/utils/SwapModule.sol#298) Event emitted after the call(s): - LimitOrderInvalidated(orderUid) (src/utils/SwapModule.sol#299) Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-3 GPv2Settlement.computeTradeExecution(GPv2Signing.RecoveredOrder,uint256,uint256,uint256,GPv2Transfer.Data,GPv2Transfer.Data) (lib/contracts/src/contracts/GPv2Settlement.sol#337-442) uses timestamp for comparisons Dangerous comparisons: - require(bool,string)(order.validTo >= block.timestamp,GPv2: order expired) (lib/contracts/src/contracts/GPv2Settlement.sol#349) GPv2Settlement.freeOrderStorage(mapping(bytes => uint256),bytes[]) (lib/contracts/src/contracts/GPv2Settlement.sol#474-487) uses timestamp for comparisons Dangerous comparisons: - require(bool,string)(validTo < block.timestamp,GPv2: order still valid) (lib/contracts/src/contracts/GPv2Settlement.sol#483) SwapModule.checkParams(ISwapModule.Params) (src/utils/SwapModule.sol#107-134) uses timestamp for comparisons Dangerous comparisons: - params.deadline < block.timestamp (src/utils/SwapModule.sol#128) Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#block-timestamp GPv2Interaction.execute(GPv2Interaction.Data) (lib/contracts/src/contracts/libraries/GPv2Interaction.sol#18-49) uses assembly - INLINE ASM (lib/contracts/src/contracts/libraries/GPv2Interaction.sol#31-48) GPv2Interaction.selector(GPv2Interaction.Data) (lib/contracts/src/contracts/libraries/GPv2Interaction.sol#56-72) uses assembly - INLINE ASM (lib/contracts/src/contracts/libraries/GPv2Interaction.sol#68-70) GPv2Order.hash(GPv2Order.Data,bytes32) (lib/contracts/src/contracts/libraries/GPv2Order.sol#133-165) uses assembly - INLINE ASM (lib/contracts/src/contracts/libraries/GPv2Order.sol#144-150) - INLINE ASM (lib/contracts/src/contracts/libraries/GPv2Order.sol#158-164) GPv2Order.packOrderUidParams(bytes,bytes32,address,uint32) (lib/contracts/src/contracts/libraries/GPv2Order.sol#178-212) uses assembly - INLINE ASM (lib/contracts/src/contracts/libraries/GPv2Order.sol#207-211) GPv2Order.extractOrderUidParams(bytes) (lib/contracts/src/contracts/libraries/GPv2Order.sol#226-242) uses assembly - INLINE ASM (lib/contracts/src/contracts/libraries/GPv2Order.sol#237-241) GPv2SafeERC20.safeTransfer(IERC20,address,uint256) (lib/contracts/src/contracts/libraries/GPv2SafeERC20.sol#12-32) uses assembly - INLINE ASM (lib/contracts/src/contracts/libraries/GPv2SafeERC20.sol#16-29) GPv2SafeERC20.safeTransferFrom(IERC20,address,address,uint256) (lib/contracts/src/contracts/libraries/GPv2SafeERC20.sol#36-65) uses assembly - INLINE ASM (lib/contracts/src/contracts/libraries/GPv2SafeERC20.sol#45-62) GPv2SafeERC20.getLastTransferResult(IERC20) (lib/contracts/src/contracts/libraries/GPv2SafeERC20.sol#70-130) uses assembly - INLINE ASM (lib/contracts/src/contracts/libraries/GPv2SafeERC20.sol#80-129) GPv2SafeERC20.getLastTransferResult.asm_0.revertWithMessage() (lib/contracts/src/contracts/libraries/GPv2SafeERC20.sol#93-99) uses assembly - INLINE ASM (lib/contracts/src/contracts/libraries/GPv2SafeERC20.sol#93-99) GPv2Transfer.truncateBalanceOpsArray(IVault.UserBalanceOp[],uint256) (lib/contracts/src/contracts/libraries/GPv2Transfer.sol#191-203) uses assembly - INLINE ASM (lib/contracts/src/contracts/libraries/GPv2Transfer.sol#200-202) GPv2Signing.constructor() (lib/contracts/src/contracts/mixins/GPv2Signing.sol#63-81) uses assembly - INLINE ASM (lib/contracts/src/contracts/mixins/GPv2Signing.sol#68-70) GPv2Signing.ecdsaRecover(bytes32,bytes) (lib/contracts/src/contracts/mixins/GPv2Signing.sol#183-209) uses assembly - INLINE ASM (lib/contracts/src/contracts/mixins/GPv2Signing.sol#198-205) GPv2Signing.recoverEip1271Signer(bytes32,bytes) (lib/contracts/src/contracts/mixins/GPv2Signing.sol#281-303) uses assembly - INLINE ASM (lib/contracts/src/contracts/mixins/GPv2Signing.sol#288-291) GPv2Signing.recoverPreSigner(bytes32,bytes,uint32) (lib/contracts/src/contracts/mixins/GPv2Signing.sol#313-334) uses assembly - INLINE ASM (lib/contracts/src/contracts/mixins/GPv2Signing.sol#322-325) StorageAccessible.getStorageAt(uint256,uint256) (lib/contracts/src/contracts/mixins/StorageAccessible.sol#39-52) uses assembly - INLINE ASM (lib/contracts/src/contracts/mixins/StorageAccessible.sol#46-49) StorageAccessible.revertWith(bytes) (lib/contracts/src/contracts/mixins/StorageAccessible.sol#97-102) uses assembly - INLINE ASM (lib/contracts/src/contracts/mixins/StorageAccessible.sol#99-101) StorageAccessible.setLength(bytes,uint256) (lib/contracts/src/contracts/mixins/StorageAccessible.sol#104-109) uses assembly - INLINE ASM (lib/contracts/src/contracts/mixins/StorageAccessible.sol#106-108) 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) Arrays._begin(uint256[]) (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#142-146) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#143-145) Arrays._mload(uint256) (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#161-165) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#162-164) Arrays._swap(uint256,uint256) (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#170-177) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#171-176) Arrays._castToUint256Array(address[]) (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#180-184) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#181-183) Arrays._castToUint256Array(bytes32[]) (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#187-191) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#188-190) Arrays._castToUint256Comp(function(address,address) returns(bool)) (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#194-200) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#197-199) Arrays._castToUint256Comp(function(bytes32,bytes32) returns(bool)) (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#203-209) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#206-208) Arrays.slice(address[],uint256,uint256) (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#394-406) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#401-403) Arrays.slice(bytes32[],uint256,uint256) (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#424-436) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#431-433) Arrays.slice(uint256[],uint256,uint256) (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#454-466) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#461-463) Arrays.splice(address[],uint256,uint256) (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#485-497) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#491-494) Arrays.replace(address[],uint256,address[],uint256,uint256) (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#526-548) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#539-545) Arrays.splice(bytes32[],uint256,uint256) (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#567-579) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#573-576) Arrays.replace(bytes32[],uint256,bytes32[],uint256,uint256) (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#608-630) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#621-627) Arrays.splice(uint256[],uint256,uint256) (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#649-661) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#655-658) Arrays.replace(uint256[],uint256,uint256[],uint256,uint256) (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#690-712) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#703-709) Arrays.unsafeAccess(address[],uint256) (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#719-725) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#721-723) Arrays.unsafeAccess(bytes32[],uint256) (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#732-738) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#734-736) Arrays.unsafeAccess(uint256[],uint256) (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#745-751) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#747-749) Arrays.unsafeAccess(bytes[],uint256) (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#758-764) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#760-762) Arrays.unsafeAccess(string[],uint256) (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#771-777) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#773-775) Arrays.unsafeMemoryAccess(address[],uint256) (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#784-788) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#785-787) Arrays.unsafeMemoryAccess(bytes32[],uint256) (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#795-799) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#796-798) Arrays.unsafeMemoryAccess(uint256[],uint256) (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#806-810) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#807-809) Arrays.unsafeMemoryAccess(bytes[],uint256) (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#817-821) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#818-820) Arrays.unsafeMemoryAccess(string[],uint256) (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#828-832) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#829-831) Arrays.unsafeSetLength(address[],uint256) (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#839-843) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#840-842) Arrays.unsafeSetLength(bytes32[],uint256) (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#850-854) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#851-853) Arrays.unsafeSetLength(uint256[],uint256) (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#861-865) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#862-864) Arrays.unsafeSetLength(bytes[],uint256) (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#872-876) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#873-875) Arrays.unsafeSetLength(string[],uint256) (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#883-887) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#884-886) LowLevelCall.callNoReturn(address,uint256,bytes) (lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol#19-23) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol#20-22) LowLevelCall.callReturn64Bytes(address,uint256,bytes) (lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol#38-48) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol#43-47) LowLevelCall.staticcallNoReturn(address,bytes) (lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol#51-55) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol#52-54) LowLevelCall.staticcallReturn64Bytes(address,bytes) (lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol#62-71) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol#66-70) LowLevelCall.delegatecallNoReturn(address,bytes) (lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol#74-78) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol#75-77) LowLevelCall.delegatecallReturn64Bytes(address,bytes) (lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol#85-94) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol#89-93) LowLevelCall.returnDataSize() (lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol#97-101) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol#98-100) LowLevelCall.returnData() (lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol#104-111) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol#105-110) LowLevelCall.bubbleRevert() (lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol#114-120) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol#115-119) LowLevelCall.bubbleRevert(bytes) (lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol#122-126) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol#123-125) 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) SlotDerivation.erc7201Slot(string) (lib/openzeppelin-contracts/contracts/utils/SlotDerivation.sol#45-50) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/SlotDerivation.sol#46-49) SlotDerivation.deriveArray(bytes32) (lib/openzeppelin-contracts/contracts/utils/SlotDerivation.sol#64-69) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/SlotDerivation.sol#65-68) SlotDerivation.deriveMapping(bytes32,address) (lib/openzeppelin-contracts/contracts/utils/SlotDerivation.sol#74-80) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/SlotDerivation.sol#75-79) SlotDerivation.deriveMapping(bytes32,bool) (lib/openzeppelin-contracts/contracts/utils/SlotDerivation.sol#85-91) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/SlotDerivation.sol#86-90) SlotDerivation.deriveMapping(bytes32,bytes32) (lib/openzeppelin-contracts/contracts/utils/SlotDerivation.sol#96-102) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/SlotDerivation.sol#97-101) SlotDerivation.deriveMapping(bytes32,uint256) (lib/openzeppelin-contracts/contracts/utils/SlotDerivation.sol#107-113) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/SlotDerivation.sol#108-112) SlotDerivation.deriveMapping(bytes32,int256) (lib/openzeppelin-contracts/contracts/utils/SlotDerivation.sol#118-124) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/SlotDerivation.sol#119-123) SlotDerivation.deriveMapping(bytes32,string) (lib/openzeppelin-contracts/contracts/utils/SlotDerivation.sol#129-139) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/SlotDerivation.sol#130-138) SlotDerivation.deriveMapping(bytes32,bytes) (lib/openzeppelin-contracts/contracts/utils/SlotDerivation.sol#144-154) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/SlotDerivation.sol#145-153) 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) 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) EnumerableSet.values(EnumerableSet.Bytes32Set) (lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol#276-285) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol#280-282) EnumerableSet.values(EnumerableSet.Bytes32Set,uint256,uint256) (lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol#295-304) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol#299-301) EnumerableSet.values(EnumerableSet.Bytes4Set) (lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol#378-387) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol#382-384) EnumerableSet.values(EnumerableSet.Bytes4Set,uint256,uint256) (lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol#397-406) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol#401-403) EnumerableSet.values(EnumerableSet.AddressSet) (lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol#480-489) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol#484-486) EnumerableSet.values(EnumerableSet.AddressSet,uint256,uint256) (lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol#499-508) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol#503-505) EnumerableSet.values(EnumerableSet.UintSet) (lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol#582-591) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol#586-588) EnumerableSet.values(EnumerableSet.UintSet,uint256,uint256) (lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol#601-610) uses assembly - INLINE ASM (lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol#605-607) AccessControlUpgradeable._getAccessControlStorage() (lib/openzeppelin-contracts-upgradeable/contracts/access/AccessControlUpgradeable.sol#67-71) uses assembly - INLINE ASM (lib/openzeppelin-contracts-upgradeable/contracts/access/AccessControlUpgradeable.sol#68-70) AccessControlEnumerableUpgradeable._getAccessControlEnumerableStorage() (lib/openzeppelin-contracts-upgradeable/contracts/access/extensions/AccessControlEnumerableUpgradeable.sol#25-29) uses assembly - INLINE ASM (lib/openzeppelin-contracts-upgradeable/contracts/access/extensions/AccessControlEnumerableUpgradeable.sol#26-28) Initializable._getInitializableStorage() (lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol#232-237) uses assembly - INLINE ASM (lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol#234-236) ReentrancyGuardUpgradeable._getReentrancyGuardStorage() (lib/openzeppelin-contracts-upgradeable/contracts/utils/ReentrancyGuardUpgradeable.sol#49-53) uses assembly - INLINE ASM (lib/openzeppelin-contracts-upgradeable/contracts/utils/ReentrancyGuardUpgradeable.sol#50-52) MellowACL._mellowACLStorage() (src/permissions/MellowACL.sol#58-63) uses assembly - INLINE ASM (src/permissions/MellowACL.sol#60-62) SwapModule._swapModuleStorage() (src/utils/SwapModule.sol#306-311) uses assembly - INLINE ASM (src/utils/SwapModule.sol#308-310) Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#assembly-usage 7 different versions of Solidity are used: - Version constraint >=0.7.6<0.9.0 is used by: ->=0.7.6<0.9.0 (lib/contracts/src/contracts/GPv2Settlement.sol#2) ->=0.7.6<0.9.0 (lib/contracts/src/contracts/GPv2VaultRelayer.sol#2) ->=0.7.6<0.9.0 (lib/contracts/src/contracts/interfaces/GPv2Authentication.sol#2) ->=0.7.6<0.9.0 (lib/contracts/src/contracts/interfaces/GPv2EIP1271.sol#2) ->=0.7.6<0.9.0 (lib/contracts/src/contracts/interfaces/IERC20.sol#9) ->=0.7.6<0.9.0 (lib/contracts/src/contracts/interfaces/IVault.sol#15) ->=0.7.6<0.9.0 (lib/contracts/src/contracts/libraries/GPv2Interaction.sol#2) ->=0.7.6<0.9.0 (lib/contracts/src/contracts/libraries/GPv2Order.sol#2) ->=0.7.6<0.9.0 (lib/contracts/src/contracts/libraries/GPv2SafeERC20.sol#2) ->=0.7.6<0.9.0 (lib/contracts/src/contracts/libraries/GPv2Trade.sol#2) ->=0.7.6<0.9.0 (lib/contracts/src/contracts/libraries/GPv2Transfer.sol#2) ->=0.7.6<0.9.0 (lib/contracts/src/contracts/libraries/SafeCast.sol#11) ->=0.7.6<0.9.0 (lib/contracts/src/contracts/libraries/SafeMath.sol#11) ->=0.7.6<0.9.0 (lib/contracts/src/contracts/mixins/GPv2Signing.sol#2) ->=0.7.6<0.9.0 (lib/contracts/src/contracts/mixins/ReentrancyGuard.sol#8) ->=0.7.6<0.9.0 (lib/contracts/src/contracts/mixins/StorageAccessible.sol#9) - 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/IAccessControlEnumerable.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/token/ERC20/IERC20.sol#4) ->=0.4.16 (lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol#4) - Version constraint ^0.8.20 is used by: -^0.8.20 (lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol#4) -^0.8.20 (lib/openzeppelin-contracts/contracts/utils/Address.sol#4) -^0.8.20 (lib/openzeppelin-contracts/contracts/utils/Comparators.sol#4) -^0.8.20 (lib/openzeppelin-contracts/contracts/utils/Errors.sol#4) -^0.8.20 (lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol#4) -^0.8.20 (lib/openzeppelin-contracts/contracts/utils/Panic.sol#4) -^0.8.20 (lib/openzeppelin-contracts/contracts/utils/SlotDerivation.sol#5) -^0.8.20 (lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#5) -^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-upgradeable/contracts/access/AccessControlUpgradeable.sol#4) -^0.8.20 (lib/openzeppelin-contracts-upgradeable/contracts/access/extensions/AccessControlEnumerableUpgradeable.sol#4) -^0.8.20 (lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol#4) -^0.8.20 (lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol#4) -^0.8.20 (lib/openzeppelin-contracts-upgradeable/contracts/utils/ReentrancyGuardUpgradeable.sol#4) -^0.8.20 (lib/openzeppelin-contracts-upgradeable/contracts/utils/introspection/ERC165Upgradeable.sol#4) - Version constraint ^0.8.24 is used by: -^0.8.24 (lib/openzeppelin-contracts/contracts/utils/Arrays.sol#5) -^0.8.24 (lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol#5) - Version constraint 0.8.25 is used by: -0.8.25 (src/interfaces/external/aave/IAaveOracle.sol#2) -0.8.25 (src/interfaces/factories/IFactoryEntity.sol#2) -0.8.25 (src/interfaces/permissions/IMellowACL.sol#2) -0.8.25 (src/interfaces/utils/ISwapModule.sol#2) -0.8.25 (src/libraries/SlotLibrary.sol#2) -0.8.25 (src/libraries/TransferLibrary.sol#2) -0.8.25 (src/permissions/MellowACL.sol#2) -0.8.25 (src/utils/SwapModule.sol#2) Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#different-pragma-directives-are-used Version constraint >=0.7.6<0.9.0 is too complex. It is used by: - >=0.7.6<0.9.0 (lib/contracts/src/contracts/GPv2Settlement.sol#2) - >=0.7.6<0.9.0 (lib/contracts/src/contracts/GPv2VaultRelayer.sol#2) - >=0.7.6<0.9.0 (lib/contracts/src/contracts/interfaces/GPv2Authentication.sol#2) - >=0.7.6<0.9.0 (lib/contracts/src/contracts/interfaces/GPv2EIP1271.sol#2) - >=0.7.6<0.9.0 (lib/contracts/src/contracts/interfaces/IERC20.sol#9) - >=0.7.6<0.9.0 (lib/contracts/src/contracts/interfaces/IVault.sol#15) - >=0.7.6<0.9.0 (lib/contracts/src/contracts/libraries/GPv2Interaction.sol#2) - >=0.7.6<0.9.0 (lib/contracts/src/contracts/libraries/GPv2Order.sol#2) - >=0.7.6<0.9.0 (lib/contracts/src/contracts/libraries/GPv2SafeERC20.sol#2) - >=0.7.6<0.9.0 (lib/contracts/src/contracts/libraries/GPv2Trade.sol#2) - >=0.7.6<0.9.0 (lib/contracts/src/contracts/libraries/GPv2Transfer.sol#2) - >=0.7.6<0.9.0 (lib/contracts/src/contracts/libraries/SafeCast.sol#11) - >=0.7.6<0.9.0 (lib/contracts/src/contracts/libraries/SafeMath.sol#11) - >=0.7.6<0.9.0 (lib/contracts/src/contracts/mixins/GPv2Signing.sol#2) - >=0.7.6<0.9.0 (lib/contracts/src/contracts/mixins/ReentrancyGuard.sol#8) - >=0.7.6<0.9.0 (lib/contracts/src/contracts/mixins/StorageAccessible.sol#9) 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/IAccessControlEnumerable.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/token/ERC20/IERC20.sol#4) - >=0.4.16 (lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol#4) 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/token/ERC20/utils/SafeERC20.sol#4) - ^0.8.20 (lib/openzeppelin-contracts/contracts/utils/Address.sol#4) - ^0.8.20 (lib/openzeppelin-contracts/contracts/utils/Comparators.sol#4) - ^0.8.20 (lib/openzeppelin-contracts/contracts/utils/Errors.sol#4) - ^0.8.20 (lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol#4) - ^0.8.20 (lib/openzeppelin-contracts/contracts/utils/Panic.sol#4) - ^0.8.20 (lib/openzeppelin-contracts/contracts/utils/SlotDerivation.sol#5) - ^0.8.20 (lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#5) - ^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-upgradeable/contracts/access/AccessControlUpgradeable.sol#4) - ^0.8.20 (lib/openzeppelin-contracts-upgradeable/contracts/access/extensions/AccessControlEnumerableUpgradeable.sol#4) - ^0.8.20 (lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol#4) - ^0.8.20 (lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol#4) - ^0.8.20 (lib/openzeppelin-contracts-upgradeable/contracts/utils/ReentrancyGuardUpgradeable.sol#4) - ^0.8.20 (lib/openzeppelin-contracts-upgradeable/contracts/utils/introspection/ERC165Upgradeable.sol#4) Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#incorrect-versions-of-solidity Low level call in StorageAccessible.simulateDelegatecall(address,bytes) (lib/contracts/src/contracts/mixins/StorageAccessible.sol#60-78): - (None,response) = address(this).call(innerCall) (lib/contracts/src/contracts/mixins/StorageAccessible.sol#70) Low level call in StorageAccessible.simulateDelegatecallInternal(address,bytes) (lib/contracts/src/contracts/mixins/StorageAccessible.sol#87-95): - (success,response) = targetContract.delegatecall(calldataPayload) (lib/contracts/src/contracts/mixins/StorageAccessible.sol#93) Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#low-level-calls Parameter GPv2SafeERC20.getLastTransferResult.asm_0.revertWithMessage().length_getLastTransferResult_asm_0_revertWithMessage (lib/contracts/src/contracts/libraries/GPv2SafeERC20.sol#93) is not in mixedCase Parameter GPv2SafeERC20.getLastTransferResult.asm_0.revertWithMessage().message_getLastTransferResult_asm_0_revertWithMessage (lib/contracts/src/contracts/libraries/GPv2SafeERC20.sol#93) is not in mixedCase Function AccessControlUpgradeable.__AccessControl_init() (lib/openzeppelin-contracts-upgradeable/contracts/access/AccessControlUpgradeable.sol#82-83) is not in mixedCase Function AccessControlUpgradeable.__AccessControl_init_unchained() (lib/openzeppelin-contracts-upgradeable/contracts/access/AccessControlUpgradeable.sol#85-86) is not in mixedCase Constant AccessControlUpgradeable.AccessControlStorageLocation (lib/openzeppelin-contracts-upgradeable/contracts/access/AccessControlUpgradeable.sol#65) is not in UPPER_CASE_WITH_UNDERSCORES Function AccessControlEnumerableUpgradeable.__AccessControlEnumerable_init() (lib/openzeppelin-contracts-upgradeable/contracts/access/extensions/AccessControlEnumerableUpgradeable.sol#31-32) is not in mixedCase Function AccessControlEnumerableUpgradeable.__AccessControlEnumerable_init_unchained() (lib/openzeppelin-contracts-upgradeable/contracts/access/extensions/AccessControlEnumerableUpgradeable.sol#34-35) is not in mixedCase Constant AccessControlEnumerableUpgradeable.AccessControlEnumerableStorageLocation (lib/openzeppelin-contracts-upgradeable/contracts/access/extensions/AccessControlEnumerableUpgradeable.sol#23) is not in UPPER_CASE_WITH_UNDERSCORES Function ContextUpgradeable.__Context_init() (lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol#18-19) is not in mixedCase Function ContextUpgradeable.__Context_init_unchained() (lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol#21-22) is not in mixedCase Function ReentrancyGuardUpgradeable.__ReentrancyGuard_init() (lib/openzeppelin-contracts-upgradeable/contracts/utils/ReentrancyGuardUpgradeable.sol#60-62) is not in mixedCase Function ReentrancyGuardUpgradeable.__ReentrancyGuard_init_unchained() (lib/openzeppelin-contracts-upgradeable/contracts/utils/ReentrancyGuardUpgradeable.sol#64-67) is not in mixedCase Constant ReentrancyGuardUpgradeable.ReentrancyGuardStorageLocation (lib/openzeppelin-contracts-upgradeable/contracts/utils/ReentrancyGuardUpgradeable.sol#47) is not in UPPER_CASE_WITH_UNDERSCORES Function ERC165Upgradeable.__ERC165_init() (lib/openzeppelin-contracts-upgradeable/contracts/utils/introspection/ERC165Upgradeable.sol#22-23) is not in mixedCase Function ERC165Upgradeable.__ERC165_init_unchained() (lib/openzeppelin-contracts-upgradeable/contracts/utils/introspection/ERC165Upgradeable.sol#25-26) is not in mixedCase Function ISwapModule.MIN_MULTIPLIER() (src/interfaces/utils/ISwapModule.sol#41) is not in mixedCase Function ISwapModule.MAX_MULTIPLIER() (src/interfaces/utils/ISwapModule.sol#42) is not in mixedCase Function ISwapModule.BASE_MULTIPLIER() (src/interfaces/utils/ISwapModule.sol#43) is not in mixedCase Function ISwapModule.TOKEN_IN_ROLE() (src/interfaces/utils/ISwapModule.sol#45) is not in mixedCase Function ISwapModule.TOKEN_OUT_ROLE() (src/interfaces/utils/ISwapModule.sol#46) is not in mixedCase Function ISwapModule.ROUTER_ROLE() (src/interfaces/utils/ISwapModule.sol#47) is not in mixedCase Function ISwapModule.CALLER_ROLE() (src/interfaces/utils/ISwapModule.sol#48) is not in mixedCase Function ISwapModule.SET_SLIPPAGE_ROLE() (src/interfaces/utils/ISwapModule.sol#49) is not in mixedCase Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#conformance-to-solidity-naming-conventions 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 (50 contracts with 100 detectors), 172 result(s) found
{
"solc": {
"status": "ok",
"use_rc": 0,
"version": "0.8.25",
"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.25",
"install_stderr": null,
"install_stdout": "Version '0.8.25' is already installed, skipping..."
},
"solc_args": "--base-path /tmp/slither-bjjc5fai --include-path /tmp/slither-bjjc5fai/lib --include-path /tmp/slither-bjjc5fai/lib/contracts --include-path /tmp/slither-bjjc5fai/lib/openzeppelin-contracts-upgradeable --include-path /tmp/slither-bjjc5fai/lib/openzeppelin-contracts --allow-paths /tmp/slither-bjjc5fai,/tmp/slither-bjjc5fai/lib,/tmp/slither-bjjc5fai/lib/contracts,/tmp/slither-bjjc5fai/lib/openzeppelin-contracts,/tmp/slither-bjjc5fai/lib/openzeppelin-contracts-upgradeable,/tmp/slither-bjjc5fai/src",
"remappings": [
"forge-std/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/",
"@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
"@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
"@cowswap/contracts/=lib/contracts/src/contracts/",
"contracts/=lib/contracts/",
"erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/",
"halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/",
"openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",
"openzeppelin-contracts/=lib/openzeppelin-contracts/",
"src/=src/"
],
"source_files": [
"src/utils/SwapModule.sol",
"src/interfaces/utils/ISwapModule.sol",
"src/libraries/TransferLibrary.sol",
"src/permissions/MellowACL.sol",
"src/interfaces/external/aave/IAaveOracle.sol",
"lib/openzeppelin-contracts-upgradeable/contracts/utils/ReentrancyGuardUpgradeable.sol",
"lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol",
"lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol",
"lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/math/Math.sol",
"lib/contracts/src/contracts/GPv2Settlement.sol",
"lib/contracts/src/contracts/libraries/GPv2Order.sol",
"src/interfaces/factories/IFactoryEntity.sol",
"lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/Address.sol",
"src/interfaces/permissions/IMellowACL.sol",
"src/libraries/SlotLibrary.sol",
"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol",
"lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol",
"lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol",
"lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/Panic.sol",
"lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol",
"lib/contracts/src/contracts/GPv2VaultRelayer.sol",
"lib/contracts/src/contracts/interfaces/GPv2Authentication.sol",
"lib/contracts/src/contracts/interfaces/IERC20.sol",
"lib/contracts/src/contracts/interfaces/IVault.sol",
"lib/contracts/src/contracts/libraries/GPv2Interaction.sol",
"lib/contracts/src/contracts/libraries/GPv2Trade.sol",
"lib/contracts/src/contracts/libraries/GPv2Transfer.sol",
"lib/contracts/src/contracts/libraries/SafeCast.sol",
"lib/contracts/src/contracts/libraries/SafeMath.sol",
"lib/contracts/src/contracts/mixins/GPv2Signing.sol",
"lib/contracts/src/contracts/mixins/ReentrancyGuard.sol",
"lib/contracts/src/contracts/mixins/StorageAccessible.sol",
"lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/Errors.sol",
"lib/openzeppelin-contracts-upgradeable/contracts/access/extensions/AccessControlEnumerableUpgradeable.sol",
"lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol",
"lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol",
"lib/contracts/src/contracts/libraries/GPv2SafeERC20.sol",
"lib/contracts/src/contracts/interfaces/GPv2EIP1271.sol",
"lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/access/extensions/IAccessControlEnumerable.sol",
"lib/openzeppelin-contracts-upgradeable/contracts/access/AccessControlUpgradeable.sol",
"lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol",
"lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol",
"lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/access/IAccessControl.sol",
"lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol",
"lib/openzeppelin-contracts-upgradeable/contracts/utils/introspection/ERC165Upgradeable.sol",
"lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/Arrays.sol",
"lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/Comparators.sol",
"lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/SlotDerivation.sol",
"lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol"
],
"contract_count": 0,
"contract_names": [],
"detector_count": 172,
"workspace_hash": "af3f6c7baa6fd3c781e7bde2fca53897d3236dff9676306f289cef4f1a3ffd7e",
"duration_seconds": 3.3431577682495117,
"solc_version_requested": "0.8.25"
}
{"no_findings":false,"summary":"Read the full AUDIT_BUNDLE.txt. Found one high-severity invariant break in CowSwap limit-order validation: the module does not constrain order fees, so a presigned order can spend more sellToken than params.amountIn.","findings":[{"severity":"high","category":"other","title":"Unchecked CowSwap feeAmount lets a limit order drain extra sellToken beyond params.amountIn","exploit_scenario":"An address with CALLER_ROLE first sets a large allowance for cowswapVaultRelayer via setCowswapApproval, then calls createLimitOrder with params.amountIn = X and params.minAmountOut matching an apparently valid order, but sets order.feeAmount to a large value. checkCowswapOrder only checks sellAmount/buyAmount/receiver/validTo and accepts the order. When the presigned order is settled, CowSwap charges executedSellAmount + executedFeeAmount from the module, so the contract can lose much more than X of sellToken while only enforcing the buyAmount floor for X. Any extra approved balance becomes spendable as fee.","recommendation":"Validate the full GPv2Order.Data payload, not just sellAmount/buyAmount. At minimum require order.feeAmount == 0 unless fees are explicitly modeled in Params. If fees must be supported, include them in params and enforce balance/price checks on total spend (sellAmount + feeAmount). Also consider rejecting partiallyFillable orders unless their fee behavior is explicitly accounted for.","evidence":"In src/utils/SwapModule.sol, checkCowswapOrder validates sellToken, buyToken, receiver, sellAmount, buyAmount, validTo, kind, and token balance modes, but never checks order.feeAmount or order.partiallyFillable. createLimitOrder then presigns that unchecked order. CowSwap settlement adds the fee to the amount pulled from the owner: for sell orders it sets executedFeeAmount = order.feeAmount (or a proportional fraction for partial fills) and then executes executedSellAmount = executedSellAmount + executedFeeAmount.","locations":["src/utils/SwapModule.sol:137","src/utils/SwapModule.sol:286","src/utils/SwapModule.sol:277"]}]}
OpenAI Codex v0.118.0 (research preview)
--------
workdir: /tmp/codex-idj_kbvw
model: gpt-5.4
provider: openai
approval: never
sandbox: read-only
reasoning effort: high
reasoning summaries: none
session id: 019d56bd-9278-7bc2-9227-6721099fb897
--------
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.
exec
/bin/bash -lc pwd in /tmp/codex-idj_kbvw
succeeded in 0ms:
/tmp/codex-idj_kbvw
exec
/bin/bash -lc "rg --files -g 'AUDIT_BUNDLE.txt' -g 'AGENTS.md' -g '*.sol'" in /tmp/codex-idj_kbvw
succeeded in 0ms:
AUDIT_BUNDLE.txt
src/permissions/MellowACL.sol
src/interfaces/permissions/IMellowACL.sol
src/interfaces/factories/IFactoryEntity.sol
src/interfaces/utils/ISwapModule.sol
src/interfaces/external/aave/IAaveOracle.sol
src/libraries/TransferLibrary.sol
src/libraries/SlotLibrary.sol
lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol
lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol
lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol
lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol
src/utils/SwapModule.sol
lib/openzeppelin-contracts-upgradeable/contracts/access/AccessControlUpgradeable.sol
lib/contracts/src/contracts/GPv2Settlement.sol
lib/contracts/src/contracts/GPv2VaultRelayer.sol
lib/openzeppelin-contracts-upgradeable/contracts/access/extensions/AccessControlEnumerableUpgradeable.sol
lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/access/extensions/IAccessControlEnumerable.sol
lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/access/IAccessControl.sol
lib/contracts/src/contracts/interfaces/GPv2Authentication.sol
lib/contracts/src/contracts/interfaces/GPv2EIP1271.sol
lib/contracts/src/contracts/interfaces/IERC20.sol
lib/contracts/src/contracts/interfaces/IVault.sol
lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol
lib/openzeppelin-contracts-upgradeable/contracts/utils/ReentrancyGuardUpgradeable.sol
lib/contracts/src/contracts/mixins/StorageAccessible.sol
lib/contracts/src/contracts/mixins/ReentrancyGuard.sol
lib/contracts/src/contracts/mixins/GPv2Signing.sol
lib/openzeppelin-contracts-upgradeable/contracts/utils/introspection/ERC165Upgradeable.sol
lib/contracts/src/contracts/libraries/GPv2Interaction.sol
lib/contracts/src/contracts/libraries/GPv2Transfer.sol
lib/contracts/src/contracts/libraries/GPv2Order.sol
lib/contracts/src/contracts/libraries/SafeCast.sol
lib/contracts/src/contracts/libraries/GPv2SafeERC20.sol
lib/contracts/src/contracts/libraries/GPv2Trade.sol
lib/contracts/src/contracts/libraries/SafeMath.sol
lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/SlotDerivation.sol
lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/Arrays.sol
lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/Comparators.sol
lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol
lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/Panic.sol
lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/Address.sol
lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol
lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol
lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol
lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/Errors.sol
lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol
lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/math/Math.sol
lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol
lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol
exec
/bin/bash -lc 'wc -l AUDIT_BUNDLE.txt' in /tmp/codex-idj_kbvw
succeeded in 0ms:
658 AUDIT_BUNDLE.txt
exec
/bin/bash -lc "sed -n '1,220p' AUDIT_BUNDLE.txt" in /tmp/codex-idj_kbvw
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: src/interfaces/external/aave/IAaveOracle.sol
================================================================================
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.25;
interface IAaveOracle {
function getAssetPrice(address asset) external view returns (uint256);
}
================================================================================
FILE: src/interfaces/factories/IFactoryEntity.sol
================================================================================
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.25;
/// @title IFactoryEntity
interface IFactoryEntity {
/// @notice Initializes the factory-created entity with arbitrary initialization data.
/// @param initParams The initialization parameters.
function initialize(bytes calldata initParams) external;
/// @notice Emitted once the entity has been initialized.
/// @param initParams The initialization parameters.
event Initialized(bytes initParams);
}
================================================================================
FILE: src/interfaces/permissions/IMellowACL.sol
================================================================================
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.25;
import "@openzeppelin/contracts-upgradeable/access/extensions/AccessControlEnumerableUpgradeable.sol";
/// @notice Interface for the MellowACL contract, which extends OpenZeppelin's AccessControlEnumerable
/// @dev Adds tracking of which roles are actively in use (i.e., assigned to at least one address)
interface IMellowACL is IAccessControlEnumerable {
/// @notice Storage layout used to track actively assigned roles
struct MellowACLStorage {
EnumerableSet.Bytes32Set supportedRoles; // Set of roles that have at least one assigned member
}
/// @notice Returns the total number of unique roles that are currently assigned
function supportedRoles() external view returns (uint256);
/// @notice Returns the role at the specified index in the set of active roles
/// @param index Index within the supported role set
/// @return role The bytes32 identifier of the role
function supportedRoleAt(uint256 index) external view returns (bytes32);
/// @notice Checks whether a given role is currently active (i.e., has at least one member)
/// @param role The bytes32 identifier of the role to check
/// @return isActive True if the role has any members assigned
function hasSupportedRole(bytes32 role) external view returns (bool);
/// @notice Emitted when a new role is granted for the first time
event RoleAdded(bytes32 indexed role);
/// @notice Emitted when a role loses its last member
event RoleRemoved(bytes32 indexed role);
}
================================================================================
FILE: src/interfaces/utils/ISwapModule.sol
================================================================================
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.25;
import "../external/aave/IAaveOracle.sol";
import "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/utils/math/Math.sol";
import {GPv2Settlement} from "@cowswap/contracts/GPv2Settlement.sol";
import {GPv2Order} from "@cowswap/contracts/libraries/GPv2Order.sol";
import "../factories/IFactoryEntity.sol";
interface ISwapModule is IFactoryEntity {
// Errors
error Forbidden(string reason);
error ZeroValue();
// Structs
struct SwapModuleStorage {
address subvault;
address oracle;
uint256 defaultMultiplier;
mapping(address => mapping(address => uint256)) customMultiplier;
}
struct Params {
address tokenIn;
address tokenOut;
uint256 amountIn;
uint256 minAmountOut;
uint256 deadline;
}
// View functions
function MIN_MULTIPLIER() external view returns (uint256);
function MAX_MULTIPLIER() external view returns (uint256);
function BASE_MULTIPLIER() external view returns (uint256);
function TOKEN_IN_ROLE() external view returns (bytes32);
function TOKEN_OUT_ROLE() external view returns (bytes32);
function ROUTER_ROLE() external view returns (bytes32);
function CALLER_ROLE() external view returns (bytes32);
function SET_SLIPPAGE_ROLE() external view returns (bytes32);
function cowswapSettlement() external view returns (address);
function cowswapVaultRelayer() external view returns (address);
function weth() external view returns (address);
function subvault() external view returns (address);
function oracle() external view returns (address);
function checkMultiplier(uint256 multiplier) external pure;
function defaultMultiplier() external view returns (uint256);
function customMultiplier(address tokenIn, address tokenOut) external view returns (uint256);
function evaluate(address tokenIn, address tokenOut, uint256 amountIn) external view returns (uint256);
function checkParams(Params calldata params) external view;
function checkCowswapOrder(Params calldata params, GPv2Order.Data calldata order, bytes calldata orderUid)
external
view;
// Mutable functions
function setOracle(address oracle_) external;
function setDefaultMultiplier(uint256 multiplier) external;
function setCustomMultiplier(address tokenIn, address tokenOut, uint256 multiplier) external;
function pushAssets(address asset, uint256 value) external payable;
function pullAssets(address asset, uint256 value) external;
function swap(Params calldata params, address router, bytes calldata data)
external
returns (bytes memory response);
function setCowswapApproval(address asset, uint256 amount) external;
function createLimitOrder(Params calldata params, GPv2Order.Data calldata order, bytes calldata orderUid)
external;
function invalidateOrder(bytes calldata orderUid) external;
// Events
event AssetsPulled(address indexed asset, uint256 value);
event AssetsPushed(address indexed asset, uint256 value);
event DefaultMultiplierSet(uint256 indexed multiplier);
event CustomMultiplierSet(address indexed tokenIn, address indexed tokenOut, uint256 indexed multiplier);
event CowswapApprovalSet(address indexed asset, uint256 amount);
event LimitOrderCreated(Params params, bytes orderUid);
event LimitOrderInvalidated(bytes orderUid);
event Swap(Params params, address router, uint256 amountOut);
event OracleSet(address indexed oracle);
}
================================================================================
FILE: src/libraries/SlotLibrary.sol
================================================================================
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.25;
/// @title SlotLibrary
/// @notice Library for computing deterministic and collision-resistant storage slots
/// @dev Used to generate unique storage slots for upgradeable modules using string identifiers
library SlotLibrary {
/// @notice Computes a unique storage slot based on the module's identifiers
/// @param contractName Logical contract/module name (e.g., "ShareModule")
/// @param name Human-readable instance name (e.g., "Mellow")
/// @param version Version number for the module configuration
/// @return A bytes32 value representing the derived storage slot
function getSlot(string memory contractName, string memory name, uint256 version) internal pure returns (bytes32) {
return keccak256(
abi.encode(
uint256(keccak256(abi.encodePacked("mellow.flexible-vaults.storage.", contractName, name, version))) - 1
)
) & ~bytes32(uint256(0xff));
}
}
================================================================================
FILE: src/libraries/TransferLibrary.sol
================================================================================
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.25;
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/utils/Address.sol";
/// @title TransferLibrary
/// @notice Library for unified handling of native ETH and ERC20 asset transfers.
exec
/bin/bash -lc "sed -n '221,440p' AUDIT_BUNDLE.txt" in /tmp/codex-idj_kbvw
succeeded in 0ms:
/// @dev Provides safe and abstracted methods for sending and receiving both ETH and ERC20 tokens.
///
/// # ETH Convention
/// Uses the constant `ETH = 0xEeee...EeE` to distinguish native ETH from ERC20 tokens.
library TransferLibrary {
using SafeERC20 for IERC20;
/// @notice Error thrown when `msg.value` does not match expected ETH amount
error InvalidValue();
/// @dev Placeholder address used to represent native ETH transfers
address public constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
/// @notice Safely sends assets (ETH or ERC20) to a recipient
/// @param asset Address of the asset to send (use `ETH` constant for native ETH)
/// @param to Recipient address
/// @param assets Amount of assets to send
/// @dev Uses `Address.sendValue` for ETH and `safeTransfer` for ERC20
function sendAssets(address asset, address to, uint256 assets) internal {
if (asset == ETH) {
Address.sendValue(payable(to), assets);
} else {
IERC20(asset).safeTransfer(to, assets);
}
}
/// @notice Safely receives assets (ETH or ERC20) from a sender
/// @param asset Address of the asset to receive (use `ETH` constant for native ETH)
/// @param from Sender address (only used for ERC20)
/// @param assets Amount of assets expected to receive
/// @dev Reverts if `msg.value` is incorrect for ETH or uses `safeTransferFrom` for ERC20
function receiveAssets(address asset, address from, uint256 assets) internal {
if (asset == ETH) {
if (msg.value != assets) {
revert InvalidValue();
}
} else {
IERC20(asset).safeTransferFrom(from, address(this), assets);
}
}
/// @notice Returns the balance of an account for a given asset
/// @param asset Address of the asset to check the balance of (use `ETH` constant for native ETH)
/// @param account Address of the account to check the balance of
/// @return Balance of the account for the given asset
function balanceOf(address asset, address account) internal view returns (uint256) {
if (asset == ETH) {
return account.balance;
} else {
return IERC20(asset).balanceOf(account);
}
}
}
================================================================================
FILE: src/permissions/MellowACL.sol
================================================================================
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.25;
import "../interfaces/permissions/IMellowACL.sol";
import "../libraries/SlotLibrary.sol";
abstract contract MellowACL is IMellowACL, AccessControlEnumerableUpgradeable {
using EnumerableSet for EnumerableSet.Bytes32Set;
bytes32 private immutable _mellowACLStorageSlot;
constructor(string memory name_, uint256 version_) {
_mellowACLStorageSlot = SlotLibrary.getSlot("MellowACL", name_, version_);
_disableInitializers();
}
// View functions
/// @inheritdoc IMellowACL
function supportedRoles() external view returns (uint256) {
return _mellowACLStorage().supportedRoles.length();
}
/// @inheritdoc IMellowACL
function supportedRoleAt(uint256 index) external view returns (bytes32) {
return _mellowACLStorage().supportedRoles.at(index);
}
/// @inheritdoc IMellowACL
function hasSupportedRole(bytes32 role) external view returns (bool) {
return _mellowACLStorage().supportedRoles.contains(role);
}
// Internal functions
function _grantRole(bytes32 role, address account) internal virtual override returns (bool) {
if (super._grantRole(role, account)) {
if (_mellowACLStorage().supportedRoles.add(role)) {
emit RoleAdded(role);
}
return true;
}
return false;
}
function _revokeRole(bytes32 role, address account) internal virtual override returns (bool) {
if (super._revokeRole(role, account)) {
if (getRoleMemberCount(role) == 0) {
_mellowACLStorage().supportedRoles.remove(role);
emit RoleRemoved(role);
}
return true;
}
return false;
}
function _mellowACLStorage() private view returns (MellowACLStorage storage $) {
bytes32 slot = _mellowACLStorageSlot;
assembly {
$.slot := slot
}
}
}
================================================================================
FILE: src/utils/SwapModule.sol
================================================================================
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.25;
import "../interfaces/utils/ISwapModule.sol";
import "../libraries/TransferLibrary.sol";
import "../permissions/MellowACL.sol";
contract SwapModule is ISwapModule, MellowACL, ReentrancyGuardUpgradeable {
using SafeERC20 for IERC20;
/// @inheritdoc ISwapModule
uint256 public constant MIN_MULTIPLIER = 0.9e8;
/// @inheritdoc ISwapModule
uint256 public constant MAX_MULTIPLIER = 1.1e8;
/// @inheritdoc ISwapModule
uint256 public constant BASE_MULTIPLIER = 1e8;
/// @inheritdoc ISwapModule
bytes32 public constant TOKEN_IN_ROLE = keccak256("utils.SwapModule.TOKEN_IN_ROLE");
/// @inheritdoc ISwapModule
bytes32 public constant TOKEN_OUT_ROLE = keccak256("utils.SwapModule.TOKEN_OUT_ROLE");
/// @inheritdoc ISwapModule
bytes32 public constant ROUTER_ROLE = keccak256("utils.SwapModule.ROUTER_ROLE");
/// @inheritdoc ISwapModule
bytes32 public constant CALLER_ROLE = keccak256("utils.SwapModule.CALLER_ROLE");
/// @inheritdoc ISwapModule
bytes32 public constant SET_SLIPPAGE_ROLE = keccak256("utils.SwapModule.SET_SLIPPAGE_ROLE");
/// @inheritdoc ISwapModule
address public immutable cowswapSettlement;
/// @inheritdoc ISwapModule
address public immutable cowswapVaultRelayer;
/// @inheritdoc ISwapModule
address public immutable weth;
bytes32 private immutable _swapModuleStorageSlot;
constructor(
string memory name_,
uint256 version_,
address cowswapSettlement_,
address cowswapVaultRelayer_,
address weth_
) MellowACL(name_, version_) {
cowswapSettlement = cowswapSettlement_;
cowswapVaultRelayer = cowswapVaultRelayer_;
weth = weth_;
_swapModuleStorageSlot = SlotLibrary.getSlot("SwapModule", name_, version_);
}
// View functions
modifier onlySubvault() {
if (_msgSender() != subvault()) {
revert Forbidden("msg.sender != subvault");
}
_;
}
/// @inheritdoc ISwapModule
function subvault() public view returns (address) {
return _swapModuleStorage().subvault;
}
/// @inheritdoc ISwapModule
function oracle() public view returns (address) {
return _swapModuleStorage().oracle;
}
/// @inheritdoc ISwapModule
function checkMultiplier(uint256 multiplier) public pure {
if (multiplier < MIN_MULTIPLIER || multiplier > MAX_MULTIPLIER) {
revert Forbidden("multiplier out of expected range");
}
}
/// @inheritdoc ISwapModule
function defaultMultiplier() public view returns (uint256) {
return _swapModuleStorage().defaultMultiplier;
}
/// @inheritdoc ISwapModule
function customMultiplier(address tokenIn, address tokenOut) public view returns (uint256) {
return _swapModuleStorage().customMultiplier[tokenIn][tokenOut];
}
/// @inheritdoc ISwapModule
function evaluate(address tokenIn, address tokenOut, uint256 amountIn) public view returns (uint256) {
tokenIn = tokenIn == TransferLibrary.ETH ? weth : tokenIn;
tokenOut = tokenOut == TransferLibrary.ETH ? weth : tokenOut;
uint8 decimalsIn = IERC20Metadata(tokenIn).decimals();
uint8 decimalsOut = IERC20Metadata(tokenOut).decimals();
IAaveOracle oracle_ = IAaveOracle(oracle());
uint256 tokenInPrice = oracle_.getAssetPrice(tokenIn);
exec
/bin/bash -lc "sed -n '441,658p' AUDIT_BUNDLE.txt" in /tmp/codex-idj_kbvw
succeeded in 0ms:
uint256 tokenOutPrice = oracle_.getAssetPrice(tokenOut);
if (decimalsIn == decimalsOut) {
return Math.mulDiv(amountIn, tokenInPrice, tokenOutPrice);
} else if (decimalsIn < decimalsOut) {
return Math.mulDiv(amountIn, tokenInPrice * 10 ** (decimalsOut - decimalsIn), tokenOutPrice);
} else {
return Math.mulDiv(amountIn, tokenInPrice, tokenOutPrice * 10 ** (decimalsIn - decimalsOut));
}
}
/// @inheritdoc ISwapModule
function checkParams(Params calldata params) public view {
if (!hasRole(TOKEN_IN_ROLE, params.tokenIn)) {
revert Forbidden("tokenIn");
}
if (!hasRole(TOKEN_OUT_ROLE, params.tokenOut)) {
revert Forbidden("tokenOut");
}
if (TransferLibrary.balanceOf(params.tokenIn, address(this)) < params.amountIn || params.amountIn == 0) {
revert Forbidden("amountIn");
}
SwapModuleStorage storage $ = _swapModuleStorage();
uint256 multiplier = $.customMultiplier[params.tokenIn][params.tokenOut];
if (multiplier == 0) {
multiplier = $.defaultMultiplier;
}
uint256 oracleMinAmount =
Math.mulDiv(evaluate(params.tokenIn, params.tokenOut, params.amountIn), multiplier, BASE_MULTIPLIER);
if (params.minAmountOut < oracleMinAmount) {
revert Forbidden("minAmountOut < oracleMinAmount");
}
if (params.deadline < block.timestamp) {
revert Forbidden("deadline");
}
if (params.tokenIn == params.tokenOut) {
revert Forbidden("tokenIn == tokenOut");
}
}
/// @inheritdoc ISwapModule
function checkCowswapOrder(Params calldata params, GPv2Order.Data calldata order, bytes calldata orderUid)
public
view
{
if (params.tokenIn != address(order.sellToken) || params.tokenIn == TransferLibrary.ETH) {
revert Forbidden("sellToken");
}
if (params.tokenOut != address(order.buyToken) || params.tokenOut == TransferLibrary.ETH) {
revert Forbidden("buyToken");
}
if (address(this) != order.receiver) {
revert Forbidden("receiver");
}
if (params.amountIn != order.sellAmount) {
revert Forbidden("amountIn != sellAmount");
}
if (params.minAmountOut != order.buyAmount) {
revert Forbidden("minAmountOut != buyAmount");
}
if (params.deadline != order.validTo) {
revert Forbidden("deadline != validTo");
}
if (order.kind != GPv2Order.KIND_SELL) {
revert Forbidden("kind != KIND_SELL");
}
if (order.sellTokenBalance != GPv2Order.BALANCE_ERC20) {
revert Forbidden("sellTokenBalance != BALANCE_ERC20");
}
if (order.buyTokenBalance != GPv2Order.BALANCE_ERC20) {
revert Forbidden("buyTokenBalance != BALANCE_ERC20");
}
bytes memory calculatedOrderUid = new bytes(56);
GPv2Order.packOrderUidParams(
calculatedOrderUid,
GPv2Order.hash(order, GPv2Settlement(payable(cowswapSettlement)).domainSeparator()),
address(this),
order.validTo
);
if (keccak256(orderUid) != keccak256(calculatedOrderUid)) {
revert Forbidden("orderUid != calculatedOrderUid");
}
}
// Mutable functions
/// @inheritdoc IFactoryEntity
function initialize(bytes calldata data) external initializer {
(
address admin,
address subvault_,
address oracle_,
uint256 defaultMultiplier_,
address[] memory holders,
bytes32[] memory roles
) = abi.decode(data, (address, address, address, uint256, address[], bytes32[]));
if (admin == address(0) || subvault_ == address(0) || oracle_ == address(0)) {
revert ZeroValue();
}
checkMultiplier(defaultMultiplier_);
SwapModuleStorage storage $ = _swapModuleStorage();
_grantRole(DEFAULT_ADMIN_ROLE, admin);
$.subvault = subvault_;
$.oracle = oracle_;
$.defaultMultiplier = defaultMultiplier_;
for (uint256 i = 0; i < holders.length; i++) {
if (holders[i] == address(0) || roles[i] == bytes32(0)) {
revert ZeroValue();
}
_grantRole(roles[i], holders[i]);
}
emit Initialized(data);
}
/// @inheritdoc ISwapModule
function setOracle(address oracle_) external onlyRole(DEFAULT_ADMIN_ROLE) {
if (oracle_ == address(0)) {
revert ZeroValue();
}
_swapModuleStorage().oracle = oracle_;
emit OracleSet(oracle_);
}
/// @inheritdoc ISwapModule
function setDefaultMultiplier(uint256 multiplier) external onlyRole(SET_SLIPPAGE_ROLE) {
checkMultiplier(multiplier);
_swapModuleStorage().defaultMultiplier = multiplier;
emit DefaultMultiplierSet(multiplier);
}
/// @inheritdoc ISwapModule
function setCustomMultiplier(address tokenIn, address tokenOut, uint256 multiplier)
external
onlyRole(SET_SLIPPAGE_ROLE)
{
checkMultiplier(multiplier);
_swapModuleStorage().customMultiplier[tokenIn][tokenOut] = multiplier;
emit CustomMultiplierSet(tokenIn, tokenOut, multiplier);
}
/// @inheritdoc ISwapModule
function pushAssets(address asset, uint256 value) external payable onlySubvault {
TransferLibrary.receiveAssets(asset, _msgSender(), value);
emit AssetsPushed(asset, value);
}
/// @inheritdoc ISwapModule
function pullAssets(address asset, uint256 value) external onlySubvault {
TransferLibrary.sendAssets(asset, _msgSender(), value);
emit AssetsPulled(asset, value);
}
/// @inheritdoc ISwapModule
function swap(Params calldata params, address router, bytes calldata data)
external
nonReentrant
onlyRole(CALLER_ROLE)
returns (bytes memory response)
{
checkParams(params);
if (!hasRole(ROUTER_ROLE, router)) {
revert Forbidden("router");
}
uint256 balanceBefore = TransferLibrary.balanceOf(params.tokenOut, address(this));
if (params.tokenIn != TransferLibrary.ETH) {
IERC20(params.tokenIn).forceApprove(router, params.amountIn);
response = Address.functionCall(router, data);
IERC20(params.tokenIn).forceApprove(router, 0);
} else {
response = Address.functionCallWithValue(router, data, params.amountIn);
}
uint256 amountOut = TransferLibrary.balanceOf(params.tokenOut, address(this)) - balanceBefore;
if (amountOut < params.minAmountOut) {
revert Forbidden("amountOut < minAmountOut");
}
emit Swap(params, router, amountOut);
}
/// @inheritdoc ISwapModule
function setCowswapApproval(address asset, uint256 amount) external onlyRole(CALLER_ROLE) {
if (asset == TransferLibrary.ETH || !hasRole(TOKEN_IN_ROLE, asset)) {
revert Forbidden("asset");
}
IERC20(asset).forceApprove(cowswapVaultRelayer, amount);
emit CowswapApprovalSet(asset, amount);
}
/// @inheritdoc ISwapModule
function createLimitOrder(Params calldata params, GPv2Order.Data calldata order, bytes calldata orderUid)
external
onlyRole(CALLER_ROLE)
{
checkParams(params);
checkCowswapOrder(params, order, orderUid);
GPv2Settlement(payable(cowswapSettlement)).setPreSignature(orderUid, true);
emit LimitOrderCreated(params, orderUid);
}
/// @inheritdoc ISwapModule
function invalidateOrder(bytes calldata orderUid) external onlyRole(CALLER_ROLE) {
GPv2Settlement(payable(cowswapSettlement)).invalidateOrder(orderUid);
emit LimitOrderInvalidated(orderUid);
}
receive() external payable {}
// Internal functions
function _swapModuleStorage() internal view returns (SwapModuleStorage storage $) {
bytes32 slot = _swapModuleStorageSlot;
assembly {
$.slot := slot
}
}
}
exec
/bin/bash -lc "nl -ba src/utils/SwapModule.sol | sed -n '1,260p'" in /tmp/codex-idj_kbvw
succeeded in 0ms:
1 // SPDX-License-Identifier: BUSL-1.1
2 pragma solidity 0.8.25;
3
4 import "../interfaces/utils/ISwapModule.sol";
5
6 import "../libraries/TransferLibrary.sol";
7 import "../permissions/MellowACL.sol";
8
9 contract SwapModule is ISwapModule, MellowACL, ReentrancyGuardUpgradeable {
10 using SafeERC20 for IERC20;
11
12 /// @inheritdoc ISwapModule
13 uint256 public constant MIN_MULTIPLIER = 0.9e8;
14 /// @inheritdoc ISwapModule
15 uint256 public constant MAX_MULTIPLIER = 1.1e8;
16 /// @inheritdoc ISwapModule
17 uint256 public constant BASE_MULTIPLIER = 1e8;
18
19 /// @inheritdoc ISwapModule
20 bytes32 public constant TOKEN_IN_ROLE = keccak256("utils.SwapModule.TOKEN_IN_ROLE");
21 /// @inheritdoc ISwapModule
22 bytes32 public constant TOKEN_OUT_ROLE = keccak256("utils.SwapModule.TOKEN_OUT_ROLE");
23 /// @inheritdoc ISwapModule
24 bytes32 public constant ROUTER_ROLE = keccak256("utils.SwapModule.ROUTER_ROLE");
25 /// @inheritdoc ISwapModule
26 bytes32 public constant CALLER_ROLE = keccak256("utils.SwapModule.CALLER_ROLE");
27 /// @inheritdoc ISwapModule
28 bytes32 public constant SET_SLIPPAGE_ROLE = keccak256("utils.SwapModule.SET_SLIPPAGE_ROLE");
29
30 /// @inheritdoc ISwapModule
31 address public immutable cowswapSettlement;
32 /// @inheritdoc ISwapModule
33 address public immutable cowswapVaultRelayer;
34 /// @inheritdoc ISwapModule
35 address public immutable weth;
36
37 bytes32 private immutable _swapModuleStorageSlot;
38
39 constructor(
40 string memory name_,
41 uint256 version_,
42 address cowswapSettlement_,
43 address cowswapVaultRelayer_,
44 address weth_
45 ) MellowACL(name_, version_) {
46 cowswapSettlement = cowswapSettlement_;
47 cowswapVaultRelayer = cowswapVaultRelayer_;
48 weth = weth_;
49 _swapModuleStorageSlot = SlotLibrary.getSlot("SwapModule", name_, version_);
50 }
51
52 // View functions
53
54 modifier onlySubvault() {
55 if (_msgSender() != subvault()) {
56 revert Forbidden("msg.sender != subvault");
57 }
58 _;
59 }
60
61 /// @inheritdoc ISwapModule
62 function subvault() public view returns (address) {
63 return _swapModuleStorage().subvault;
64 }
65
66 /// @inheritdoc ISwapModule
67 function oracle() public view returns (address) {
68 return _swapModuleStorage().oracle;
69 }
70
71 /// @inheritdoc ISwapModule
72 function checkMultiplier(uint256 multiplier) public pure {
73 if (multiplier < MIN_MULTIPLIER || multiplier > MAX_MULTIPLIER) {
74 revert Forbidden("multiplier out of expected range");
75 }
76 }
77
78 /// @inheritdoc ISwapModule
79 function defaultMultiplier() public view returns (uint256) {
80 return _swapModuleStorage().defaultMultiplier;
81 }
82
83 /// @inheritdoc ISwapModule
84 function customMultiplier(address tokenIn, address tokenOut) public view returns (uint256) {
85 return _swapModuleStorage().customMultiplier[tokenIn][tokenOut];
86 }
87
88 /// @inheritdoc ISwapModule
89 function evaluate(address tokenIn, address tokenOut, uint256 amountIn) public view returns (uint256) {
90 tokenIn = tokenIn == TransferLibrary.ETH ? weth : tokenIn;
91 tokenOut = tokenOut == TransferLibrary.ETH ? weth : tokenOut;
92 uint8 decimalsIn = IERC20Metadata(tokenIn).decimals();
93 uint8 decimalsOut = IERC20Metadata(tokenOut).decimals();
94 IAaveOracle oracle_ = IAaveOracle(oracle());
95 uint256 tokenInPrice = oracle_.getAssetPrice(tokenIn);
96 uint256 tokenOutPrice = oracle_.getAssetPrice(tokenOut);
97 if (decimalsIn == decimalsOut) {
98 return Math.mulDiv(amountIn, tokenInPrice, tokenOutPrice);
99 } else if (decimalsIn < decimalsOut) {
100 return Math.mulDiv(amountIn, tokenInPrice * 10 ** (decimalsOut - decimalsIn), tokenOutPrice);
101 } else {
102 return Math.mulDiv(amountIn, tokenInPrice, tokenOutPrice * 10 ** (decimalsIn - decimalsOut));
103 }
104 }
105
106 /// @inheritdoc ISwapModule
107 function checkParams(Params calldata params) public view {
108 if (!hasRole(TOKEN_IN_ROLE, params.tokenIn)) {
109 revert Forbidden("tokenIn");
110 }
111 if (!hasRole(TOKEN_OUT_ROLE, params.tokenOut)) {
112 revert Forbidden("tokenOut");
113 }
114 if (TransferLibrary.balanceOf(params.tokenIn, address(this)) < params.amountIn || params.amountIn == 0) {
115 revert Forbidden("amountIn");
116 }
117 SwapModuleStorage storage $ = _swapModuleStorage();
118 uint256 multiplier = $.customMultiplier[params.tokenIn][params.tokenOut];
119 if (multiplier == 0) {
120 multiplier = $.defaultMultiplier;
121 }
122 uint256 oracleMinAmount =
123 Math.mulDiv(evaluate(params.tokenIn, params.tokenOut, params.amountIn), multiplier, BASE_MULTIPLIER);
124
125 if (params.minAmountOut < oracleMinAmount) {
126 revert Forbidden("minAmountOut < oracleMinAmount");
127 }
128 if (params.deadline < block.timestamp) {
129 revert Forbidden("deadline");
130 }
131 if (params.tokenIn == params.tokenOut) {
132 revert Forbidden("tokenIn == tokenOut");
133 }
134 }
135
136 /// @inheritdoc ISwapModule
137 function checkCowswapOrder(Params calldata params, GPv2Order.Data calldata order, bytes calldata orderUid)
138 public
139 view
140 {
141 if (params.tokenIn != address(order.sellToken) || params.tokenIn == TransferLibrary.ETH) {
142 revert Forbidden("sellToken");
143 }
144 if (params.tokenOut != address(order.buyToken) || params.tokenOut == TransferLibrary.ETH) {
145 revert Forbidden("buyToken");
146 }
147 if (address(this) != order.receiver) {
148 revert Forbidden("receiver");
149 }
150 if (params.amountIn != order.sellAmount) {
151 revert Forbidden("amountIn != sellAmount");
152 }
153 if (params.minAmountOut != order.buyAmount) {
154 revert Forbidden("minAmountOut != buyAmount");
155 }
156 if (params.deadline != order.validTo) {
157 revert Forbidden("deadline != validTo");
158 }
159 if (order.kind != GPv2Order.KIND_SELL) {
160 revert Forbidden("kind != KIND_SELL");
161 }
162 if (order.sellTokenBalance != GPv2Order.BALANCE_ERC20) {
163 revert Forbidden("sellTokenBalance != BALANCE_ERC20");
164 }
165 if (order.buyTokenBalance != GPv2Order.BALANCE_ERC20) {
166 revert Forbidden("buyTokenBalance != BALANCE_ERC20");
167 }
168
169 bytes memory calculatedOrderUid = new bytes(56);
170 GPv2Order.packOrderUidParams(
171 calculatedOrderUid,
172 GPv2Order.hash(order, GPv2Settlement(payable(cowswapSettlement)).domainSeparator()),
173 address(this),
174 order.validTo
175 );
176 if (keccak256(orderUid) != keccak256(calculatedOrderUid)) {
177 revert Forbidden("orderUid != calculatedOrderUid");
178 }
179 }
180
181 // Mutable functions
182
183 /// @inheritdoc IFactoryEntity
184 function initialize(bytes calldata data) external initializer {
185 (
186 address admin,
187 address subvault_,
188 address oracle_,
189 uint256 defaultMultiplier_,
190 address[] memory holders,
191 bytes32[] memory roles
192 ) = abi.decode(data, (address, address, address, uint256, address[], bytes32[]));
193 if (admin == address(0) || subvault_ == address(0) || oracle_ == address(0)) {
194 revert ZeroValue();
195 }
196 checkMultiplier(defaultMultiplier_);
197 SwapModuleStorage storage $ = _swapModuleStorage();
198
199 _grantRole(DEFAULT_ADMIN_ROLE, admin);
200 $.subvault = subvault_;
201 $.oracle = oracle_;
202 $.defaultMultiplier = defaultMultiplier_;
203 for (uint256 i = 0; i < holders.length; i++) {
204 if (holders[i] == address(0) || roles[i] == bytes32(0)) {
205 revert ZeroValue();
206 }
207 _grantRole(roles[i], holders[i]);
208 }
209 emit Initialized(data);
210 }
211
212 /// @inheritdoc ISwapModule
213 function setOracle(address oracle_) external onlyRole(DEFAULT_ADMIN_ROLE) {
214 if (oracle_ == address(0)) {
215 revert ZeroValue();
216 }
217 _swapModuleStorage().oracle = oracle_;
218 emit OracleSet(oracle_);
219 }
220
221 /// @inheritdoc ISwapModule
222 function setDefaultMultiplier(uint256 multiplier) external onlyRole(SET_SLIPPAGE_ROLE) {
223 checkMultiplier(multiplier);
224 _swapModuleStorage().defaultMultiplier = multiplier;
225 emit DefaultMultiplierSet(multiplier);
226 }
227
228 /// @inheritdoc ISwapModule
229 function setCustomMultiplier(address tokenIn, address tokenOut, uint256 multiplier)
230 external
231 onlyRole(SET_SLIPPAGE_ROLE)
232 {
233 checkMultiplier(multiplier);
234 _swapModuleStorage().customMultiplier[tokenIn][tokenOut] = multiplier;
235 emit CustomMultiplierSet(tokenIn, tokenOut, multiplier);
236 }
237
238 /// @inheritdoc ISwapModule
239 function pushAssets(address asset, uint256 value) external payable onlySubvault {
240 TransferLibrary.receiveAssets(asset, _msgSender(), value);
241 emit AssetsPushed(asset, value);
242 }
243
244 /// @inheritdoc ISwapModule
245 function pullAssets(address asset, uint256 value) external onlySubvault {
246 TransferLibrary.sendAssets(asset, _msgSender(), value);
247 emit AssetsPulled(asset, value);
248 }
249
250 /// @inheritdoc ISwapModule
251 function swap(Params calldata params, address router, bytes calldata data)
252 external
253 nonReentrant
254 onlyRole(CALLER_ROLE)
255 returns (bytes memory response)
256 {
257 checkParams(params);
258 if (!hasRole(ROUTER_ROLE, router)) {
259 revert Forbidden("router");
260 }
exec
/bin/bash -lc "nl -ba src/permissions/MellowACL.sol | sed -n '1,200p'" in /tmp/codex-idj_kbvw
succeeded in 0ms:
1 // SPDX-License-Identifier: BUSL-1.1
2 pragma solidity 0.8.25;
3
4 import "../interfaces/permissions/IMellowACL.sol";
5
6 import "../libraries/SlotLibrary.sol";
7
8 abstract contract MellowACL is IMellowACL, AccessControlEnumerableUpgradeable {
9 using EnumerableSet for EnumerableSet.Bytes32Set;
10
11 bytes32 private immutable _mellowACLStorageSlot;
12
13 constructor(string memory name_, uint256 version_) {
14 _mellowACLStorageSlot = SlotLibrary.getSlot("MellowACL", name_, version_);
15 _disableInitializers();
16 }
17
18 // View functions
19
20 /// @inheritdoc IMellowACL
21 function supportedRoles() external view returns (uint256) {
22 return _mellowACLStorage().supportedRoles.length();
23 }
24
25 /// @inheritdoc IMellowACL
26 function supportedRoleAt(uint256 index) external view returns (bytes32) {
27 return _mellowACLStorage().supportedRoles.at(index);
28 }
29
30 /// @inheritdoc IMellowACL
31 function hasSupportedRole(bytes32 role) external view returns (bool) {
32 return _mellowACLStorage().supportedRoles.contains(role);
33 }
34
35 // Internal functions
36
37 function _grantRole(bytes32 role, address account) internal virtual override returns (bool) {
38 if (super._grantRole(role, account)) {
39 if (_mellowACLStorage().supportedRoles.add(role)) {
40 emit RoleAdded(role);
41 }
42 return true;
43 }
44 return false;
45 }
46
47 function _revokeRole(bytes32 role, address account) internal virtual override returns (bool) {
48 if (super._revokeRole(role, account)) {
49 if (getRoleMemberCount(role) == 0) {
50 _mellowACLStorage().supportedRoles.remove(role);
51 emit RoleRemoved(role);
52 }
53 return true;
54 }
55 return false;
56 }
57
58 function _mellowACLStorage() private view returns (MellowACLStorage storage $) {
59 bytes32 slot = _mellowACLStorageSlot;
60 assembly {
61 $.slot := slot
62 }
63 }
64 }
exec
/bin/bash -lc "nl -ba src/libraries/TransferLibrary.sol | sed -n '1,200p'" in /tmp/codex-idj_kbvw
succeeded in 0ms:
1 // SPDX-License-Identifier: BUSL-1.1
2 pragma solidity 0.8.25;
3
4 import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
5 import "@openzeppelin/contracts/utils/Address.sol";
6
7 /// @title TransferLibrary
8 /// @notice Library for unified handling of native ETH and ERC20 asset transfers.
9 /// @dev Provides safe and abstracted methods for sending and receiving both ETH and ERC20 tokens.
10 ///
11 /// # ETH Convention
12 /// Uses the constant `ETH = 0xEeee...EeE` to distinguish native ETH from ERC20 tokens.
13 library TransferLibrary {
14 using SafeERC20 for IERC20;
15
16 /// @notice Error thrown when `msg.value` does not match expected ETH amount
17 error InvalidValue();
18
19 /// @dev Placeholder address used to represent native ETH transfers
20 address public constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
21
22 /// @notice Safely sends assets (ETH or ERC20) to a recipient
23 /// @param asset Address of the asset to send (use `ETH` constant for native ETH)
24 /// @param to Recipient address
25 /// @param assets Amount of assets to send
26 /// @dev Uses `Address.sendValue` for ETH and `safeTransfer` for ERC20
27 function sendAssets(address asset, address to, uint256 assets) internal {
28 if (asset == ETH) {
29 Address.sendValue(payable(to), assets);
30 } else {
31 IERC20(asset).safeTransfer(to, assets);
32 }
33 }
34
35 /// @notice Safely receives assets (ETH or ERC20) from a sender
36 /// @param asset Address of the asset to receive (use `ETH` constant for native ETH)
37 /// @param from Sender address (only used for ERC20)
38 /// @param assets Amount of assets expected to receive
39 /// @dev Reverts if `msg.value` is incorrect for ETH or uses `safeTransferFrom` for ERC20
40 function receiveAssets(address asset, address from, uint256 assets) internal {
41 if (asset == ETH) {
42 if (msg.value != assets) {
43 revert InvalidValue();
44 }
45 } else {
46 IERC20(asset).safeTransferFrom(from, address(this), assets);
47 }
48 }
49
50 /// @notice Returns the balance of an account for a given asset
51 /// @param asset Address of the asset to check the balance of (use `ETH` constant for native ETH)
52 /// @param account Address of the account to check the balance of
53 /// @return Balance of the account for the given asset
54 function balanceOf(address asset, address account) internal view returns (uint256) {
55 if (asset == ETH) {
56 return account.balance;
57 } else {
58 return IERC20(asset).balanceOf(account);
59 }
60 }
61 }
exec
/bin/bash -lc "nl -ba src/utils/SwapModule.sol | sed -n '260,360p'" in /tmp/codex-idj_kbvw
succeeded in 0ms:
260 }
261 uint256 balanceBefore = TransferLibrary.balanceOf(params.tokenOut, address(this));
262 if (params.tokenIn != TransferLibrary.ETH) {
263 IERC20(params.tokenIn).forceApprove(router, params.amountIn);
264 response = Address.functionCall(router, data);
265 IERC20(params.tokenIn).forceApprove(router, 0);
266 } else {
267 response = Address.functionCallWithValue(router, data, params.amountIn);
268 }
269 uint256 amountOut = TransferLibrary.balanceOf(params.tokenOut, address(this)) - balanceBefore;
270 if (amountOut < params.minAmountOut) {
271 revert Forbidden("amountOut < minAmountOut");
272 }
273 emit Swap(params, router, amountOut);
274 }
275
276 /// @inheritdoc ISwapModule
277 function setCowswapApproval(address asset, uint256 amount) external onlyRole(CALLER_ROLE) {
278 if (asset == TransferLibrary.ETH || !hasRole(TOKEN_IN_ROLE, asset)) {
279 revert Forbidden("asset");
280 }
281 IERC20(asset).forceApprove(cowswapVaultRelayer, amount);
282 emit CowswapApprovalSet(asset, amount);
283 }
284
285 /// @inheritdoc ISwapModule
286 function createLimitOrder(Params calldata params, GPv2Order.Data calldata order, bytes calldata orderUid)
287 external
288 onlyRole(CALLER_ROLE)
289 {
290 checkParams(params);
291 checkCowswapOrder(params, order, orderUid);
292 GPv2Settlement(payable(cowswapSettlement)).setPreSignature(orderUid, true);
293 emit LimitOrderCreated(params, orderUid);
294 }
295
296 /// @inheritdoc ISwapModule
297 function invalidateOrder(bytes calldata orderUid) external onlyRole(CALLER_ROLE) {
298 GPv2Settlement(payable(cowswapSettlement)).invalidateOrder(orderUid);
299 emit LimitOrderInvalidated(orderUid);
300 }
301
302 receive() external payable {}
303
304 // Internal functions
305
306 function _swapModuleStorage() internal view returns (SwapModuleStorage storage $) {
307 bytes32 slot = _swapModuleStorageSlot;
308 assembly {
309 $.slot := slot
310 }
311 }
312 }
exec
/bin/bash -lc "rg -n \"feeAmount|sellAmount \\+ feeAmount|executedFeeAmount|partiallyFillable\" lib/contracts/src/contracts -g '*.sol'" in /tmp/codex-idj_kbvw
succeeded in 0ms:
lib/contracts/src/contracts/GPv2Settlement.sol:56: uint256 feeAmount,
lib/contracts/src/contracts/GPv2Settlement.sol:192: feeTransfer.amount = order.feeAmount;
lib/contracts/src/contracts/GPv2Settlement.sol:238: order.feeAmount,
lib/contracts/src/contracts/GPv2Settlement.sol:375: uint256 executedFeeAmount;
lib/contracts/src/contracts/GPv2Settlement.sol:379: if (order.partiallyFillable) {
lib/contracts/src/contracts/GPv2Settlement.sol:381: executedFeeAmount = order.feeAmount.mul(executedSellAmount).div(
lib/contracts/src/contracts/GPv2Settlement.sol:386: executedFeeAmount = order.feeAmount;
lib/contracts/src/contracts/GPv2Settlement.sol:401: if (order.partiallyFillable) {
lib/contracts/src/contracts/GPv2Settlement.sol:403: executedFeeAmount = order.feeAmount.mul(executedBuyAmount).div(
lib/contracts/src/contracts/GPv2Settlement.sol:408: executedFeeAmount = order.feeAmount;
lib/contracts/src/contracts/GPv2Settlement.sol:420: executedSellAmount = executedSellAmount.add(executedFeeAmount);
lib/contracts/src/contracts/GPv2Settlement.sol:429: executedFeeAmount,
lib/contracts/src/contracts/libraries/GPv2Trade.sol:24: uint256 feeAmount;
lib/contracts/src/contracts/libraries/GPv2Trade.sol:48: order.feeAmount = trade.feeAmount;
lib/contracts/src/contracts/libraries/GPv2Trade.sol:51: order.partiallyFillable,
lib/contracts/src/contracts/libraries/GPv2Trade.sol:102: bool partiallyFillable,
lib/contracts/src/contracts/libraries/GPv2Trade.sol:113: partiallyFillable = flags & 0x02 != 0;
lib/contracts/src/contracts/libraries/GPv2Order.sol:19: uint256 feeAmount;
lib/contracts/src/contracts/libraries/GPv2Order.sol:21: bool partiallyFillable;
lib/contracts/src/contracts/libraries/GPv2Order.sol:39: /// "uint256 feeAmount," +
lib/contracts/src/contracts/libraries/GPv2Order.sol:41: /// "bool partiallyFillable," +
exec
/bin/bash -lc "rg -n \"setPreSignature|invalidateOrder\" lib/contracts/src/contracts -g '*.sol'" in /tmp/codex-idj_kbvw
succeeded in 0ms:
lib/contracts/src/contracts/GPv2Settlement.sol:250: function invalidateOrder(bytes calldata orderUid) external {
lib/contracts/src/contracts/mixins/GPv2Signing.sol:88: function setPreSignature(bytes calldata orderUid, bool signed) external {
exec
/bin/bash -lc "rg -n \"struct Data\" lib/contracts/src/contracts/libraries/GPv2Order.sol && nl -ba lib/contracts/src/contracts/libraries/GPv2Order.sol | sed -n '1,220p'" in /tmp/codex-idj_kbvw
succeeded in 0ms:
11: struct Data {
1 // SPDX-License-Identifier: LGPL-3.0-or-later
2 pragma solidity >=0.7.6 <0.9.0;
3
4 import "../interfaces/IERC20.sol";
5
6 /// @title Gnosis Protocol v2 Order Library
7 /// @author Gnosis Developers
8 library GPv2Order {
9 /// @dev The complete data for a Gnosis Protocol order. This struct contains
10 /// all order parameters that are signed for submitting to GP.
11 struct Data {
12 IERC20 sellToken;
13 IERC20 buyToken;
14 address receiver;
15 uint256 sellAmount;
16 uint256 buyAmount;
17 uint32 validTo;
18 bytes32 appData;
19 uint256 feeAmount;
20 bytes32 kind;
21 bool partiallyFillable;
22 bytes32 sellTokenBalance;
23 bytes32 buyTokenBalance;
24 }
25
26 /// @dev The order EIP-712 type hash for the [`GPv2Order.Data`] struct.
27 ///
28 /// This value is pre-computed from the following expression:
29 /// ```
30 /// keccak256(
31 /// "Order(" +
32 /// "address sellToken," +
33 /// "address buyToken," +
34 /// "address receiver," +
35 /// "uint256 sellAmount," +
36 /// "uint256 buyAmount," +
37 /// "uint32 validTo," +
38 /// "bytes32 appData," +
39 /// "uint256 feeAmount," +
40 /// "string kind," +
41 /// "bool partiallyFillable," +
42 /// "string sellTokenBalance," +
43 /// "string buyTokenBalance" +
44 /// ")"
45 /// )
46 /// ```
47 bytes32 internal constant TYPE_HASH =
48 hex"d5a25ba2e97094ad7d83dc28a6572da797d6b3e7fc6663bd93efb789fc17e489";
49
50 /// @dev The marker value for a sell order for computing the order struct
51 /// hash. This allows the EIP-712 compatible wallets to display a
52 /// descriptive string for the order kind (instead of 0 or 1).
53 ///
54 /// This value is pre-computed from the following expression:
55 /// ```
56 /// keccak256("sell")
57 /// ```
58 bytes32 internal constant KIND_SELL =
59 hex"f3b277728b3fee749481eb3e0b3b48980dbbab78658fc419025cb16eee346775";
60
61 /// @dev The OrderKind marker value for a buy order for computing the order
62 /// struct hash.
63 ///
64 /// This value is pre-computed from the following expression:
65 /// ```
66 /// keccak256("buy")
67 /// ```
68 bytes32 internal constant KIND_BUY =
69 hex"6ed88e868af0a1983e3886d5f3e95a2fafbd6c3450bc229e27342283dc429ccc";
70
71 /// @dev The TokenBalance marker value for using direct ERC20 balances for
72 /// computing the order struct hash.
73 ///
74 /// This value is pre-computed from the following expression:
75 /// ```
76 /// keccak256("erc20")
77 /// ```
78 bytes32 internal constant BALANCE_ERC20 =
79 hex"5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc9";
80
81 /// @dev The TokenBalance marker value for using Balancer Vault external
82 /// balances (in order to re-use Vault ERC20 approvals) for computing the
83 /// order struct hash.
84 ///
85 /// This value is pre-computed from the following expression:
86 /// ```
87 /// keccak256("external")
88 /// ```
89 bytes32 internal constant BALANCE_EXTERNAL =
90 hex"abee3b73373acd583a130924aad6dc38cfdc44ba0555ba94ce2ff63980ea0632";
91
92 /// @dev The TokenBalance marker value for using Balancer Vault internal
93 /// balances for computing the order struct hash.
94 ///
95 /// This value is pre-computed from the following expression:
96 /// ```
97 /// keccak256("internal")
98 /// ```
99 bytes32 internal constant BALANCE_INTERNAL =
100 hex"4ac99ace14ee0a5ef932dc609df0943ab7ac16b7583634612f8dc35a4289a6ce";
101
102 /// @dev Marker address used to indicate that the receiver of the trade
103 /// proceeds should the owner of the order.
104 ///
105 /// This is chosen to be `address(0)` for gas efficiency as it is expected
106 /// to be the most common case.
107 address internal constant RECEIVER_SAME_AS_OWNER = address(0);
108
109 /// @dev The byte length of an order unique identifier.
110 uint256 internal constant UID_LENGTH = 56;
111
112 /// @dev Returns the actual receiver for an order. This function checks
113 /// whether or not the [`receiver`] field uses the marker value to indicate
114 /// it is the same as the order owner.
115 ///
116 /// @return receiver The actual receiver of trade proceeds.
117 function actualReceiver(
118 Data memory order,
119 address owner
120 ) internal pure returns (address receiver) {
121 if (order.receiver == RECEIVER_SAME_AS_OWNER) {
122 receiver = owner;
123 } else {
124 receiver = order.receiver;
125 }
126 }
127
128 /// @dev Return the EIP-712 signing hash for the specified order.
129 ///
130 /// @param order The order to compute the EIP-712 signing hash for.
131 /// @param domainSeparator The EIP-712 domain separator to use.
132 /// @return orderDigest The 32 byte EIP-712 struct hash.
133 function hash(
134 Data memory order,
135 bytes32 domainSeparator
136 ) internal pure returns (bytes32 orderDigest) {
137 bytes32 structHash;
138
139 // NOTE: Compute the EIP-712 order struct hash in place. As suggested
140 // in the EIP proposal, noting that the order struct has 12 fields, and
141 // prefixing the type hash `(1 + 12) * 32 = 416` bytes to hash.
142 // <https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md#rationale-for-encodedata>
143 // solhint-disable-next-line no-inline-assembly
144 assembly {
145 let dataStart := sub(order, 32)
146 let temp := mload(dataStart)
147 mstore(dataStart, TYPE_HASH)
148 structHash := keccak256(dataStart, 416)
149 mstore(dataStart, temp)
150 }
151
152 // NOTE: Now that we have the struct hash, compute the EIP-712 signing
153 // hash using scratch memory past the free memory pointer. The signing
154 // hash is computed from `"\x19\x01" || domainSeparator || structHash`.
155 // <https://docs.soliditylang.org/en/v0.7.6/internals/layout_in_memory.html#layout-in-memory>
156 // <https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md#specification>
157 // solhint-disable-next-line no-inline-assembly
158 assembly {
159 let freeMemoryPointer := mload(0x40)
160 mstore(freeMemoryPointer, "\x19\x01")
161 mstore(add(freeMemoryPointer, 2), domainSeparator)
162 mstore(add(freeMemoryPointer, 34), structHash)
163 orderDigest := keccak256(freeMemoryPointer, 66)
164 }
165 }
166
167 /// @dev Packs order UID parameters into the specified memory location. The
168 /// result is equivalent to `abi.encodePacked(...)` with the difference that
169 /// it allows re-using the memory for packing the order UID.
170 ///
171 /// This function reverts if the order UID buffer is not the correct size.
172 ///
173 /// @param orderUid The buffer pack the order UID parameters into.
174 /// @param orderDigest The EIP-712 struct digest derived from the order
175 /// parameters.
176 /// @param owner The address of the user who owns this order.
177 /// @param validTo The epoch time at which the order will stop being valid.
178 function packOrderUidParams(
179 bytes memory orderUid,
180 bytes32 orderDigest,
181 address owner,
182 uint32 validTo
183 ) internal pure {
184 require(orderUid.length == UID_LENGTH, "GPv2: uid buffer overflow");
185
186 // NOTE: Write the order UID to the allocated memory buffer. The order
187 // parameters are written to memory in **reverse order** as memory
188 // operations write 32-bytes at a time and we want to use a packed
189 // encoding. This means, for example, that after writing the value of
190 // `owner` to bytes `20:52`, writing the `orderDigest` to bytes `0:32`
191 // will **overwrite** bytes `20:32`. This is desirable as addresses are
192 // only 20 bytes and `20:32` should be `0`s:
193 //
194 // | 1111111111222222222233333333334444444444555555
195 // byte | 01234567890123456789012345678901234567890123456789012345
196 // -------+---------------------------------------------------------
197 // field | [.........orderDigest..........][......owner.......][vT]
198 // -------+---------------------------------------------------------
199 // mstore | [000000000000000000000000000.vT]
200 // | [00000000000.......owner.......]
201 // | [.........orderDigest..........]
202 //
203 // Additionally, since Solidity `bytes memory` are length prefixed,
204 // 32 needs to be added to all the offsets.
205 //
206 // solhint-disable-next-line no-inline-assembly
207 assembly {
208 mstore(add(orderUid, 56), validTo)
209 mstore(add(orderUid, 52), owner)
210 mstore(add(orderUid, 32), orderDigest)
211 }
212 }
213
214 /// @dev Extracts specific order information from the standardized unique
215 /// order id of the protocol.
216 ///
217 /// @param orderUid The unique identifier used to represent an order in
218 /// the protocol. This uid is the packed concatenation of the order digest,
219 /// the validTo order parameter and the address of the user who created the
220 /// order. It is used by the user to interface with the contract directly,
exec
/bin/bash -lc "nl -ba lib/contracts/src/contracts/GPv2Settlement.sol | sed -n '360,435p'" in /tmp/codex-idj_kbvw
succeeded in 0ms:
360 // limit_x * price_x >= limit_y * price_y
361 // ```
362 // - The executed amount of token `y` given some amount of `x` and
363 // clearing prices is:
364 // ```
365 // amount_y = amount_x * price_x / price_y
366 // ```
367
368 require(
369 order.sellAmount.mul(sellPrice) >= order.buyAmount.mul(buyPrice),
370 "GPv2: limit price not respected"
371 );
372
373 uint256 executedSellAmount;
374 uint256 executedBuyAmount;
375 uint256 executedFeeAmount;
376 uint256 currentFilledAmount;
377
378 if (order.kind == GPv2Order.KIND_SELL) {
379 if (order.partiallyFillable) {
380 executedSellAmount = executedAmount;
381 executedFeeAmount = order.feeAmount.mul(executedSellAmount).div(
382 order.sellAmount
383 );
384 } else {
385 executedSellAmount = order.sellAmount;
386 executedFeeAmount = order.feeAmount;
387 }
388
389 executedBuyAmount = executedSellAmount.mul(sellPrice).ceilDiv(
390 buyPrice
391 );
392
393 currentFilledAmount = filledAmount[orderUid].add(
394 executedSellAmount
395 );
396 require(
397 currentFilledAmount <= order.sellAmount,
398 "GPv2: order filled"
399 );
400 } else {
401 if (order.partiallyFillable) {
402 executedBuyAmount = executedAmount;
403 executedFeeAmount = order.feeAmount.mul(executedBuyAmount).div(
404 order.buyAmount
405 );
406 } else {
407 executedBuyAmount = order.buyAmount;
408 executedFeeAmount = order.feeAmount;
409 }
410
411 executedSellAmount = executedBuyAmount.mul(buyPrice).div(sellPrice);
412
413 currentFilledAmount = filledAmount[orderUid].add(executedBuyAmount);
414 require(
415 currentFilledAmount <= order.buyAmount,
416 "GPv2: order filled"
417 );
418 }
419
420 executedSellAmount = executedSellAmount.add(executedFeeAmount);
421 filledAmount[orderUid] = currentFilledAmount;
422
423 emit Trade(
424 recoveredOrder.owner,
425 order.sellToken,
426 order.buyToken,
427 executedSellAmount,
428 executedBuyAmount,
429 executedFeeAmount,
430 orderUid
431 );
432
433 inTransfer.account = recoveredOrder.owner;
434 inTransfer.token = order.sellToken;
435 inTransfer.amount = executedSellAmount;
exec
/bin/bash -lc "nl -ba lib/contracts/src/contracts/GPv2Settlement.sol | sed -n '240,265p' && nl -ba lib/contracts/src/contracts/mixins/GPv2Signing.sol | sed -n '80,105p'" in /tmp/codex-idj_kbvw
succeeded in 0ms:
240 );
241 emit Settlement(msg.sender);
242 }
243
244 /// @dev Invalidate onchain an order that has been signed offline.
245 ///
246 /// @param orderUid The unique identifier of the order that is to be made
247 /// invalid after calling this function. The user that created the order
248 /// must be the sender of this message. See [`extractOrderUidParams`]
249 /// for details on orderUid.
250 function invalidateOrder(bytes calldata orderUid) external {
251 (, address owner, ) = orderUid.extractOrderUidParams();
252 require(owner == msg.sender, "GPv2: caller does not own order");
253 filledAmount[orderUid] = type(uint256).max;
254 emit OrderInvalidated(owner, orderUid);
255 }
256
257 /// @dev Free storage from the filled amounts of **expired** orders to claim
258 /// a gas refund. This method can only be called as an interaction.
259 ///
260 /// @param orderUids The unique identifiers of the expired order to free
261 /// storage for.
262 function freeFilledAmountStorage(
263 bytes[] calldata orderUids
264 ) external onlyInteraction {
265 freeOrderStorage(filledAmount, orderUids);
80 );
81 }
82
83 /// @dev Sets a presignature for the specified order UID.
84 ///
85 /// @param orderUid The unique identifier of the order to pre-sign.
86 /// @param signed True to set the order as tradable with pre-sign, false to
87 /// false to unset it.
88 function setPreSignature(bytes calldata orderUid, bool signed) external {
89 (, address owner, ) = orderUid.extractOrderUidParams();
90 require(owner == msg.sender, "GPv2: cannot presign order");
91 if (signed) {
92 preSignature[orderUid] = PRE_SIGNED;
93 } else {
94 preSignature[orderUid] = 0;
95 }
96 emit PreSignature(owner, orderUid, signed);
97 }
98
99 /// @dev Returns an empty recovered order with a pre-allocated buffer for
100 /// packing the unique identifier.
101 ///
102 /// @return recoveredOrder The empty recovered order data.
103 function allocateRecoveredOrder()
104 internal
105 pure
codex
{"no_findings":false,"summary":"Read the full AUDIT_BUNDLE.txt. Found one high-severity invariant break in CowSwap limit-order validation: the module does not constrain order fees, so a presigned order can spend more sellToken than params.amountIn.","findings":[{"severity":"high","category":"other","title":"Unchecked CowSwap feeAmount lets a limit order drain extra sellToken beyond params.amountIn","exploit_scenario":"An address with CALLER_ROLE first sets a large allowance for cowswapVaultRelayer via setCowswapApproval, then calls createLimitOrder with params.amountIn = X and params.minAmountOut matching an apparently valid order, but sets order.feeAmount to a large value. checkCowswapOrder only checks sellAmount/buyAmount/receiver/validTo and accepts the order. When the presigned order is settled, CowSwap charges executedSellAmount + executedFeeAmount from the module, so the contract can lose much more than X of sellToken while only enforcing the buyAmount floor for X. Any extra approved balance becomes spendable as fee.","recommendation":"Validate the full GPv2Order.Data payload, not just sellAmount/buyAmount. At minimum require order.feeAmount == 0 unless fees are explicitly modeled in Params. If fees must be supported, include them in params and enforce balance/price checks on total spend (sellAmount + feeAmount). Also consider rejecting partiallyFillable orders unless their fee behavior is explicitly accounted for.","evidence":"In src/utils/SwapModule.sol, checkCowswapOrder validates sellToken, buyToken, receiver, sellAmount, buyAmount, validTo, kind, and token balance modes, but never checks order.feeAmount or order.partiallyFillable. createLimitOrder then presigns that unchecked order. CowSwap settlement adds the fee to the amount pulled from the owner: for sell orders it sets executedFeeAmount = order.feeAmount (or a proportional fraction for partial fills) and then executes executedSellAmount = executedSellAmount + executedFeeAmount.","locations":["src/utils/SwapModule.sol:137","src/utils/SwapModule.sol:286","src/utils/SwapModule.sol:277"]}]}
tokens used
25,207
{
"codex": {
"ran_at": "2026-04-04T04:27:53.540454+00:00",
"returncode": 0
},
"project": {
"mode": "source",
"file_count": 49,
"import_count": 60,
"first_party_contracts_count": 8
},
"summary": "Read the full AUDIT_BUNDLE.txt. Found one high-severity invariant break in CowSwap limit-order validation: the module does not constrain order fees, so a presigned order can spend more sellToken than params.amountIn.",
"raw_final": {
"summary": "Read the full AUDIT_BUNDLE.txt. Found one high-severity invariant break in CowSwap limit-order validation: the module does not constrain order fees, so a presigned order can spend more sellToken than params.amountIn.",
"findings": [
{
"title": "Unchecked CowSwap feeAmount lets a limit order drain extra sellToken beyond params.amountIn",
"category": "other",
"evidence": "In src/utils/SwapModule.sol, checkCowswapOrder validates sellToken, buyToken, receiver, sellAmount, buyAmount, validTo, kind, and token balance modes, but never checks order.feeAmount or order.partiallyFillable. createLimitOrder then presigns that unchecked order. CowSwap settlement adds the fee to the amount pulled from the owner: for sell orders it sets executedFeeAmount = order.feeAmount (or a proportional fraction for partial fills) and then executes executedSellAmount = executedSellAmount + executedFeeAmount.",
"severity": "high",
"locations": [
"src/utils/SwapModule.sol:137",
"src/utils/SwapModule.sol:286",
"src/utils/SwapModule.sol:277"
],
"recommendation": "Validate the full GPv2Order.Data payload, not just sellAmount/buyAmount. At minimum require order.feeAmount == 0 unless fees are explicitly modeled in Params. If fees must be supported, include them in params and enforce balance/price checks on total spend (sellAmount + feeAmount). Also consider rejecting partiallyFillable orders unless their fee behavior is explicitly accounted for.",
"exploit_scenario": "An address with CALLER_ROLE first sets a large allowance for cowswapVaultRelayer via setCowswapApproval, then calls createLimitOrder with params.amountIn = X and params.minAmountOut matching an apparently valid order, but sets order.feeAmount to a large value. checkCowswapOrder only checks sellAmount/buyAmount/receiver/validTo and accepts the order. When the presigned order is settled, CowSwap charges executedSellAmount + executedFeeAmount from the module, so the contract can lose much more than X of sellToken while only enforcing the buyAmount floor for X. Any extra approved balance becomes spendable as fee."
}
],
"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 0x024b 0000000c: JUMPI 0000000d: PUSH0 0000000e: CALLDATALOAD 0000000f: PUSH1 0xe0 00000011: SHR 00000012: DUP1 00000013: PUSH4 0x87cd303d 00000018: GT 00000019: PUSH2 0x0134 0000001c: JUMPI 0000001d: DUP1 0000001e: PUSH4 0xc5b26eaa 00000023: GT 00000024: PUSH2 0x00b3 00000027: JUMPI 00000028: DUP1 00000029: PUSH4 0xdac9318f 0000002e: GT 0000002f: PUSH2 0x0078 00000032: JUMPI 00000033: DUP1 00000034: PUSH4 0xdac9318f 00000039: EQ 0000003a: PUSH2 0x0750 0000003d: JUMPI 0000003e: DUP1 0000003f: PUSH4 0xe4891825 00000044: EQ 00000045: PUSH2 0x076f 00000048: JUMPI 00000049: DUP1 0000004a: PUSH4 0xe8d96a2e 0000004f: EQ 00000050: PUSH2 0x07a5 00000053: JUMPI 00000054: DUP1 00000055: PUSH4 0xed03e78c 0000005a: EQ 0000005b: PUSH2 0x07d8 0000005e: JUMPI 0000005f: DUP1 00000060: PUSH4 0xf2309ab6 00000065: EQ 00000066: PUSH2 0x07ef 00000069: JUMPI 0000006a: DUP1 0000006b: PUSH4 0xff0e6489 00000070: EQ 00000071: PUSH2 0x0822 00000074: JUMPI 00000075: PUSH0 00000076: DUP1 00000077: REVERT 00000078: JUMPDEST 00000079: DUP1 0000007a: PUSH4 0xc5b26eaa 0000007f: EQ 00000080: PUSH2 0x06a8 00000083: JUMPI 00000084: DUP1 00000085: PUSH4 0xca15c873 0000008a: EQ 0000008b: PUSH2 0x06c7 0000008e: JUMPI 0000008f: DUP1 00000090: PUSH4 0xd4fec678 00000095: EQ 00000096: PUSH2 0x06e6 00000099: JUMPI 0000009a: DUP1 0000009b: PUSH4 0xd547741f 000000a0: EQ 000000a1: PUSH2 0x0712 000000a4: JUMPI 000000a5: DUP1 000000a6: PUSH4 0xd730ce6d 000000ab: EQ 000000ac: PUSH2 0x0731 000000af: JUMPI 000000b0: PUSH0 000000b1: DUP1 000000b2: REVERT 000000b3: JUMPDEST 000000b4: DUP1 000000b5: PUSH4 0xa217fddf 000000ba: GT 000000bb: PUSH2 0x00f9 000000be: JUMPI 000000bf: DUP1 000000c0: PUSH4 0xa217fddf 000000c5: EQ 000000c6: PUSH2 0x061f 000000c9: JUMPI 000000ca: DUP1 000000cb: PUSH4 0xa2b44393 000000d0: EQ 000000d1: PUSH2 0x0632 000000d4: JUMPI 000000d5: DUP1 000000d6: PUSH4 0xa2cb31e5 000000db: EQ 000000dc: PUSH2 0x0649 000000df: JUMPI 000000e0: DUP1 000000e1: PUSH4 0xa3246ad3 000000e6: EQ 000000e7: PUSH2 0x0668 000000ea: JUMPI 000000eb: DUP1 000000ec: PUSH4 0xb3ab252a 000000f1: EQ 000000f2: PUSH2 0x0694 000000f5: JUMPI 000000f6: PUSH0 000000f7: DUP1 000000f8: REVERT 000000f9: JUMPDEST 000000fa: DUP1 000000fb: PUSH4 0x87cd303d 00000100: EQ 00000101: PUSH2 0x0584 00000104: JUMPI 00000105: DUP1 00000106: PUSH4 0x9010d07c 0000010b: EQ 0000010c: PUSH2 0x05a3 0000010f: JUMPI 00000110: DUP1 00000111: PUSH4 0x908e9ee0 00000116: EQ 00000117: PUSH2 0x05c2 0000011a: JUMPI 0000011b: DUP1 0000011c: PUSH4 0x909e3363 00000121: EQ 00000122: PUSH2 0x05e1 00000125: JUMPI 00000126: DUP1 00000127: PUSH4 0x91d14854 0000012c: EQ 0000012d: PUSH2 0x0600 00000130: JUMPI 00000131: PUSH0 00000132: DUP1 00000133: REVERT 00000134: JUMPDEST 00000135: DUP1 00000136: PUSH4 0x419a2053 0000013b: GT 0000013c: PUSH2 0x01cb 0000013f: JUMPI 00000140: DUP1 00000141: PUSH4 0x5d6a618d 00000146: GT 00000147: PUSH2 0x0190 0000014a: JUMPI 0000014b: DUP1 0000014c: PUSH4 0x5d6a618d 00000151: EQ 00000152: PUSH2 0x04a9 00000155: JUMPI 00000156: DUP1 00000157: PUSH4 0x75d2b607 0000015c: EQ 0000015d: PUSH2 0x04c0 00000160: JUMPI 00000161: DUP1 00000162: PUSH4 0x774237fc 00000167: EQ 00000168: PUSH2 0x04d3 0000016b: JUMPI 0000016c: DUP1 0000016d: PUSH4 0x7adbf973 00000172: EQ 00000173: PUSH2 0x04f3 00000176: JUMPI 00000177: DUP1 00000178: PUSH4 0x7da6aafb 0000017d: EQ 0000017e: PUSH2 0x0512 00000181: JUMPI 00000182: DUP1 00000183: PUSH4 0x7dc0d1d0 00000188: EQ 00000189: PUSH2 0x0545 0000018c: JUMPI 0000018d: PUSH0 0000018e: DUP1 0000018f: REVERT 00000190: JUMPDEST 00000191: DUP1 00000192: PUSH4 0x419a2053 00000197: EQ 00000198: PUSH2 0x0405 0000019b: JUMPI 0000019c: DUP1 0000019d: PUSH4 0x439fab91 000001a2: EQ 000001a3: PUSH2 0x0419 000001a6: JUMPI 000001a7: DUP1 000001a8: PUSH4 0x44a14e94 000001ad: EQ 000001ae: PUSH2 0x0438 000001b1: JUMPI 000001b2: DUP1 000001b3: PUSH4 0x48512509 000001b8: EQ 000001b9: PUSH2 0x0457 000001bc: JUMPI 000001bd: DUP1 000001be: PUSH4 0x4a46b4cf 000001c3: EQ 000001c4: PUSH2 0x048a 000001c7: JUMPI 000001c8: PUSH0 000001c9: DUP1 000001ca: REVERT 000001cb: JUMPDEST 000001cc: DUP1 000001cd: PUSH4 0x2b9b016b 000001d2: GT 000001d3: PUSH2 0x0211 000001d6: JUMPI 000001d7: DUP1 000001d8: PUSH4 0x2b9b016b 000001dd: EQ 000001de: PUSH2 0x032a 000001e1: JUMPI 000001e2: DUP1 000001e3: PUSH4 0x2f2ff15d 000001e8: EQ 000001e9: PUSH2 0x0349 000001ec: JUMPI 000001ed: DUP1 000001ee: PUSH4 0x30d643b5 000001f3: EQ 000001f4: PUSH2 0x0368 000001f7: JUMPI 000001f8: DUP1 000001f9: PUSH4 0x36568abe 000001fe: EQ 000001ff: PUSH2 0x039b 00000202: JUMPI 00000203: DUP1 00000204: PUSH4 0x3fc8cef3 00000209: EQ 0000020a: PUSH2 0x03ba 0000020d: JUMPI 0000020e: PUSH0 0000020f: DUP1 00000210: REVERT 00000211: JUMPDEST 00000212: DUP1 00000213: PUSH3 0x98498a 00000217: EQ 00000218: PUSH2 0x0256 0000021b: JUMPI 0000021c: DUP1 0000021d: PUSH4 0x01ffc9a7 00000222: EQ 00000223: PUSH2 0x0277 00000226: JUMPI 00000227: DUP1 00000228: PUSH4 0x15337bc0 0000022d: EQ 0000022e: PUSH2 0x02ab 00000231: JUMPI 00000232: DUP1 00000233: PUSH4 0x248a9ca3 00000238: EQ 00000239: PUSH2 0x02ca 0000023c: JUMPI 0000023d: DUP1 0000023e: PUSH4 0x281f4705 00000243: EQ 00000244: PUSH2 0x02f7 00000247: JUMPI 00000248: PUSH0 00000249: DUP1 0000024a: REVERT 0000024b: JUMPDEST 0000024c: CALLDATASIZE 0000024d: PUSH2 0x0252 00000250: JUMPI 00000251: STOP 00000252: JUMPDEST 00000253: PUSH0 00000254: DUP1 00000255: REVERT 00000256: JUMPDEST 00000257: CALLVALUE 00000258: DUP1 00000259: ISZERO 0000025a: PUSH2 0x0261 0000025d: JUMPI 0000025e: PUSH0 0000025f: DUP1 00000260: REVERT 00000261: JUMPDEST 00000262: POP 00000263: PUSH2 0x0275 00000266: PUSH2 0x0270 00000269: CALLDATASIZE 0000026a: PUSH1 0x04 0000026c: PUSH2 0x2db0 0000026f: JUMP 00000270: JUMPDEST 00000271: PUSH2 0x0888 00000274: JUMP 00000275: JUMPDEST 00000276: STOP 00000277: JUMPDEST 00000278: CALLVALUE 00000279: DUP1 0000027a: ISZERO 0000027b: PUSH2 0x0282 0000027e: JUMPI 0000027f: PUSH0 00000280: DUP1 00000281: REVERT 00000282: JUMPDEST 00000283: POP 00000284: PUSH2 0x0296 00000287: PUSH2 0x0291 0000028a: CALLDATASIZE 0000028b: PUSH1 0x04 0000028d: PUSH2 0x2dca 00000290: JUMP 00000291: JUMPDEST 00000292: PUSH2 0x0ba3 00000295: JUMP 00000296: JUMPDEST 00000297: PUSH1 0x40 00000299: MLOAD 0000029a: SWAP1 0000029b: ISZERO 0000029c: ISZERO 0000029d: DUP2 0000029e: MSTORE 0000029f: PUSH1 0x20 000002a1: ADD 000002a2: JUMPDEST 000002a3: PUSH1 0x40 000002a5: MLOAD 000002a6: DUP1 000002a7: SWAP2 000002a8: SUB 000002a9: SWAP1 000002aa: RETURN 000002ab: JUMPDEST 000002ac: CALLVALUE 000002ad: DUP1 000002ae: ISZERO 000002af: PUSH2 0x02b6 000002b2: JUMPI 000002b3: PUSH0 000002b4: DUP1 000002b5: REVERT 000002b6: JUMPDEST 000002b7: POP 000002b8: PUSH2 0x0275 000002bb: PUSH2 0x02c5 000002be: CALLDATASIZE 000002bf: PUSH1 0x04 000002c1: PUSH2 0x2e36 000002c4: JUMP 000002c5: JUMPDEST 000002c6: PUSH2 0x0bcd 000002c9: JUMP 000002ca: JUMPDEST 000002cb: CALLVALUE 000002cc: DUP1 000002cd: ISZERO 000002ce: PUSH2 0x02d5 000002d1: JUMPI 000002d2: PUSH0 000002d3: DUP1 000002d4: REVERT 000002d5: JUMPDEST 000002d6: POP 000002d7: PUSH2 0x02e9 000002da: PUSH2 0x02e4 000002dd: CALLDATASIZE 000002de: PUSH1 0x04 000002e0: PUSH2 0x2e75 000002e3: JUMP 000002e4: JUMPDEST 000002e5: PUSH2 0x0c9c 000002e8: JUMP 000002e9: JUMPDEST 000002ea: PUSH1 0x40 000002ec: MLOAD 000002ed: SWAP1 000002ee: DUP2 000002ef: MSTORE 000002f0: PUSH1 0x20 000002f2: ADD 000002f3: PUSH2 0x02a2 000002f6: JUMP 000002f7: JUMPDEST 000002f8: CALLVALUE 000002f9: DUP1 000002fa: ISZERO 000002fb: PUSH2 0x0302 000002fe: JUMPI 000002ff: PUSH0 00000300: DUP1 00000301: REVERT 00000302: JUMPDEST 00000303: POP 00000304: PUSH2 0x02e9 00000307: PUSH32 0x32a83f2101a3db03d031fa7d978ba44116bbbd832fcef7908374354ae8de2b38 00000328: DUP2 00000329: JUMP 0000032a: JUMPDEST 0000032b: CALLVALUE 0000032c: DUP1 0000032d: ISZERO 0000032e: PUSH2 0x0335 00000331: JUMPI 00000332: PUSH0 00000333: DUP1 00000334: REVERT 00000335: JUMPDEST 00000336: POP 00000337: PUSH2 0x0275 0000033a: PUSH2 0x0344 0000033d: CALLDATASIZE 0000033e: PUSH1 0x04 00000340: PUSH2 0x2e75 00000343: JUMP 00000344: JUMPDEST 00000345: PUSH2 0x0cbc 00000348: JUMP 00000349: JUMPDEST 0000034a: CALLVALUE 0000034b: DUP1 0000034c: ISZERO 0000034d: PUSH2 0x0354 00000350: JUMPI 00000351: PUSH0 00000352: DUP1 00000353: REVERT 00000354: JUMPDEST 00000355: POP 00000356: PUSH2 0x0275 00000359: PUSH2 0x0363 0000035c: CALLDATASIZE 0000035d: PUSH1 0x04 0000035f: PUSH2 0x2eb0 00000362: JUMP 00000363: JUMPDEST 00000364: PUSH2 0x0d22 00000367: JUMP 00000368: JUMPDEST 00000369: CALLVALUE 0000036a: DUP1 0000036b: ISZERO 0000036c: PUSH2 0x0373 0000036f: JUMPI 00000370: PUSH0 00000371: DUP1 00000372: REVERT 00000373: JUMPDEST 00000374: POP 00000375: PUSH2 0x02e9 00000378: PUSH32 0x59a256c4d42df67b80d5d3fdaf91897a0d929e43a43a5f8e1a88cbd1476e5d90 00000399: DUP2 0000039a: JUMP 0000039b: JUMPDEST 0000039c: CALLVALUE 0000039d: DUP1 0000039e: ISZERO 0000039f: PUSH2 0x03a6 000003a2: JUMPI 000003a3: PUSH0 000003a4: DUP1 000003a5: REVERT 000003a6: JUMPDEST 000003a7: POP 000003a8: PUSH2 0x0275 000003ab: PUSH2 0x03b5 000003ae: CALLDATASIZE 000003af: PUSH1 0x04 000003b1: PUSH2 0x2eb0 000003b4: JUMP 000003b5: JUMPDEST 000003b6: PUSH2 0x0d3e 000003b9: JUMP 000003ba: JUMPDEST 000003bb: CALLVALUE 000003bc: DUP1 000003bd: ISZERO 000003be: PUSH2 0x03c5 000003c1: JUMPI 000003c2: PUSH0 000003c3: DUP1 000003c4: REVERT 000003c5: JUMPDEST 000003c6: POP 000003c7: PUSH2 0x03ed 000003ca: PUSH32 0x000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2 000003eb: DUP2 000003ec: JUMP 000003ed: JUMPDEST 000003ee: PUSH1 0x40 000003f0: MLOAD 000003f1: PUSH1 0x01 000003f3: PUSH1 0x01 000003f5: PUSH1 0xa0 000003f7: SHL 000003f8: SUB 000003f9: SWAP1 000003fa: SWAP2 000003fb: AND 000003fc: DUP2 000003fd: MSTORE 000003fe: PUSH1 0x20 00000400: ADD 00000401: PUSH2 0x02a2 00000404: JUMP 00000405: JUMPDEST 00000406: CALLVALUE 00000407: DUP1 00000408: ISZERO 00000409: PUSH2 0x0410 0000040c: JUMPI 0000040d: PUSH0 0000040e: DUP1 0000040f: REVERT 00000410: JUMPDEST 00000411: POP 00000412: PUSH2 0x02e9 00000415: PUSH2 0x0d76 00000418: JUMP 00000419: JUMPDEST 0000041a: CALLVALUE 0000041b: DUP1 0000041c: ISZERO 0000041d: PUSH2 0x0424 00000420: JUMPI 00000421: PUSH0 00000422: DUP1 00000423: REVERT 00000424: JUMPDEST 00000425: POP 00000426: PUSH2 0x0275 00000429: PUSH2 0x0433 0000042c: CALLDATASIZE 0000042d: PUSH1 0x04 0000042f: PUSH2 0x2e36 00000432: JUMP 00000433: JUMPDEST 00000434: PUSH2 0x0da5 00000437: JUMP 00000438: JUMPDEST 00000439: CALLVALUE 0000043a: DUP1 0000043b: ISZERO 0000043c: PUSH2 0x0443 0000043f: JUMPI 00000440: PUSH0 00000441: DUP1 00000442: REVERT 00000443: JUMPDEST 00000444: POP 00000445: PUSH2 0x0275 00000448: PUSH2 0x0452 0000044b: CALLDATASIZE 0000044c: PUSH1 0x04 0000044e: PUSH2 0x2ede 00000451: JUMP 00000452: JUMPDEST 00000453: PUSH2 0x1075 00000456: JUMP 00000457: JUMPDEST 00000458: CALLVALUE 00000459: DUP1 0000045a: ISZERO 0000045b: PUSH2 0x0462 0000045e: JUMPI 0000045f: PUSH0 00000460: DUP1 00000461: REVERT 00000462: JUMPDEST 00000463: POP 00000464: PUSH2 0x02e9 00000467: PUSH32 0x9d556436fc766d4a6d24fe48c90073bc03600d7556265a3217def4578d7c2531 00000488: DUP2 00000489: JUMP 0000048a: JUMPDEST 0000048b: CALLVALUE 0000048c: DUP1 0000048d: ISZERO 0000048e: PUSH2 0x0495 00000491: JUMPI 00000492: PUSH0 00000493: DUP1 00000494: REVERT 00000495: JUMPDEST 00000496: POP 00000497: PUSH2 0x0296 0000049a: PUSH2 0x04a4 0000049d: CALLDATASIZE 0000049e: PUSH1 0x04 000004a0: PUSH2 0x2e75 000004a3: JUMP 000004a4: JUMPDEST 000004a5: PUSH2 0x1190 000004a8: JUMP 000004a9: JUMPDEST 000004aa: CALLVALUE 000004ab: DUP1 000004ac: ISZERO 000004ad: PUSH2 0x04b4 000004b0: JUMPI 000004b1: PUSH0 000004b2: DUP1 000004b3: REVERT 000004b4: JUMPDEST 000004b5: POP 000004b6: PUSH2 0x02e9 000004b9: PUSH4 0x068e7780 000004be: DUP2 000004bf: JUMP 000004c0: JUMPDEST 000004c1: PUSH2 0x0275 000004c4: PUSH2 0x04ce 000004c7: CALLDATASIZE 000004c8: PUSH1 0x04 000004ca: PUSH2 0x2ede 000004cd: JUMP 000004ce: JUMPDEST 000004cf: PUSH2 0x11bb 000004d2: JUMP 000004d3: JUMPDEST 000004d4: CALLVALUE 000004d5: DUP1 000004d6: ISZERO 000004d7: PUSH2 0x04de 000004da: JUMPI 000004db: PUSH0 000004dc: DUP1 000004dd: REVERT 000004de: JUMPDEST 000004df: POP 000004e0: PUSH2 0x02e9 000004e3: PUSH0 000004e4: DUP1 000004e5: MLOAD 000004e6: PUSH1 0x20 000004e8: PUSH2 0x36ce 000004eb: DUP4 000004ec: CODECOPY 000004ed: DUP2 000004ee: MLOAD 000004ef: SWAP2 000004f0: MSTORE 000004f1: DUP2 000004f2: JUMP 000004f3: JUMPDEST 000004f4: CALLVALUE 000004f5: DUP1 000004f6: ISZERO 000004f7: PUSH2 0x04fe 000004fa: JUMPI 000004fb: PUSH0 000004fc: DUP1 000004fd: REVERT 000004fe: JUMPDEST 000004ff: POP 00000500: PUSH2 0x0275 00000503: PUSH2 0x050d 00000506: CALLDATASIZE 00000507: PUSH1 0x04 00000509: PUSH2 0x2f08 0000050c: JUMP 0000050d: JUMPDEST 0000050e: PUSH2 0x126f 00000511: JUMP 00000512: JUMPDEST 00000513: CALLVALUE 00000514: DUP1 00000515: ISZERO 00000516: PUSH2 0x051d 00000519: JUMPI 0000051a: PUSH0 0000051b: DUP1 0000051c: REVERT 0000051d: JUMPDEST 0000051e: POP 0000051f: PUSH2 0x03ed 00000522: PUSH32 0x000000000000000000000000c92e8bdf79f0507f65a392b0ab4667716bfe0110 00000543: DUP2 00000544: JUMP 00000545: JUMPDEST 00000546: CALLVALUE 00000547: DUP1 00000548: ISZERO 00000549: PUSH2 0x0550 0000054c: JUMPI 0000054d: PUSH0 0000054e: DUP1 0000054f: REVERT 00000550: JUMPDEST 00000551: POP 00000552: PUSH32 0x275a5493182a3abf69f6f3cc73ffd59f2fced19807d36bac2db251b070f37a00 00000573: PUSH1 0x01 00000575: ADD 00000576: SLOAD 00000577: PUSH1 0x01 00000579: PUSH1 0x01 0000057b: PUSH1 0xa0 0000057d: SHL 0000057e: SUB 0000057f: AND 00000580: PUSH2 0x03ed 00000583: JUMP 00000584: JUMPDEST 00000585: CALLVALUE 00000586: DUP1 00000587: ISZERO 00000588: PUSH2 0x058f 0000058b: JUMPI 0000058c: PUSH0 0000058d: DUP1 0000058e: REVERT 0000058f: JUMPDEST 00000590: POP 00000591: PUSH2 0x0275 00000594: PUSH2 0x059e 00000597: CALLDATASIZE 00000598: PUSH1 0x04 0000059a: PUSH2 0x2ede 0000059d: JUMP 0000059e: JUMPDEST 0000059f: PUSH2 0x130c 000005a2: JUMP 000005a3: JUMPDEST 000005a4: CALLVALUE 000005a5: DUP1 000005a6: ISZERO 000005a7: PUSH2 0x05ae 000005aa: JUMPI 000005ab: PUSH0 000005ac: DUP1 000005ad: REVERT 000005ae: JUMPDEST 000005af: POP 000005b0: PUSH2 0x03ed 000005b3: PUSH2 0x05bd 000005b6: CALLDATASIZE 000005b7: PUSH1 0x04 000005b9: PUSH2 0x2f23 000005bc: JUMP 000005bd: JUMPDEST 000005be: PUSH2 0x13b4 000005c1: JUMP 000005c2: JUMPDEST 000005c3: CALLVALUE 000005c4: DUP1 000005c5: ISZERO 000005c6: PUSH2 0x05cd 000005c9: JUMPI 000005ca: PUSH0 000005cb: DUP1 000005cc: REVERT 000005cd: JUMPDEST 000005ce: POP 000005cf: PUSH2 0x0275 000005d2: PUSH2 0x05dc 000005d5: CALLDATASIZE 000005d6: PUSH1 0x04 000005d8: PUSH2 0x2f43 000005db: JUMP 000005dc: JUMPDEST 000005dd: PUSH2 0x13e1 000005e0: JUMP 000005e1: JUMPDEST 000005e2: CALLVALUE 000005e3: DUP1 000005e4: ISZERO 000005e5: PUSH2 0x05ec 000005e8: JUMPI 000005e9: PUSH0 000005ea: DUP1 000005eb: REVERT 000005ec: JUMPDEST 000005ed: POP 000005ee: PUSH2 0x0275 000005f1: PUSH2 0x05fb 000005f4: CALLDATASIZE 000005f5: PUSH1 0x04 000005f7: PUSH2 0x2e75 000005fa: JUMP 000005fb: JUMPDEST 000005fc: PUSH2 0x14cd 000005ff: JUMP 00000600: JUMPDEST 00000601: CALLVALUE 00000602: DUP1 00000603: ISZERO 00000604: PUSH2 0x060b 00000607: JUMPI 00000608: PUSH0 00000609: DUP1 0000060a: REVERT 0000060b: JUMPDEST 0000060c: POP 0000060d: PUSH2 0x0296 00000610: PUSH2 0x061a 00000613: CALLDATASIZE 00000614: PUSH1 0x04 00000616: PUSH2 0x2eb0 00000619: JUMP 0000061a: JUMPDEST 0000061b: PUSH2 0x1554 0000061e: JUMP 0000061f: JUMPDEST 00000620: CALLVALUE 00000621: DUP1 00000622: ISZERO 00000623: PUSH2 0x062a 00000626: JUMPI 00000627: PUSH0 00000628: DUP1 00000629: REVERT 0000062a: JUMPDEST 0000062b: POP 0000062c: PUSH2 0x02e9 0000062f: PUSH0 00000630: DUP2 00000631: JUMP 00000632: JUMPDEST 00000633: CALLVALUE 00000634: DUP1 00000635: ISZERO 00000636: PUSH2 0x063d 00000639: JUMPI 0000063a: PUSH0 0000063b: DUP1 0000063c: REVERT 0000063d: JUMPDEST 0000063e: POP 0000063f: PUSH2 0x02e9 00000642: PUSH4 0x05f5e100 00000647: DUP2 00000648: JUMP 00000649: JUMPDEST 0000064a: CALLVALUE 0000064b: DUP1 0000064c: ISZERO 0000064d: PUSH2 0x0654 00000650: JUMPI 00000651: PUSH0 00000652: DUP1 00000653: REVERT 00000654: JUMPDEST 00000655: POP 00000656: PUSH2 0x02e9 00000659: PUSH2 0x0663 0000065c: CALLDATASIZE 0000065d: PUSH1 0x04 0000065f: PUSH2 0x2e75 00000662: JUMP 00000663: JUMPDEST 00000664: PUSH2 0x158a 00000667: JUMP 00000668: JUMPDEST 00000669: CALLVALUE 0000066a: DUP1 0000066b: ISZERO 0000066c: PUSH2 0x0673 0000066f: JUMPI 00000670: PUSH0 00000671: DUP1 00000672: REVERT 00000673: JUMPDEST 00000674: POP 00000675: PUSH2 0x0687 00000678: PUSH2 0x0682 0000067b: CALLDATASIZE 0000067c: PUSH1 0x04 0000067e: PUSH2 0x2e75 00000681: JUMP 00000682: JUMPDEST 00000683: PUSH2 0x15b5 00000686: JUMP 00000687: JUMPDEST 00000688: PUSH1 0x40 0000068a: MLOAD 0000068b: PUSH2 0x02a2 0000068e: SWAP2 0000068f: SWAP1 00000690: PUSH2 0x2faf 00000693: JUMP 00000694: JUMPDEST 00000695: CALLVALUE 00000696: DUP1 00000697: ISZERO 00000698: PUSH2 0x069f 0000069b: JUMPI 0000069c: PUSH0 0000069d: DUP1 0000069e: REVERT 0000069f: JUMPDEST 000006a0: POP 000006a1: PUSH2 0x03ed 000006a4: PUSH2 0x15e5 000006a7: JUMP 000006a8: JUMPDEST 000006a9: CALLVALUE 000006aa: DUP1 000006ab: ISZERO 000006ac: PUSH2 0x06b3 000006af: JUMPI 000006b0: PUSH0 000006b1: DUP1 000006b2: REVERT 000006b3: JUMPDEST 000006b4: POP 000006b5: PUSH2 0x0275 000006b8: PUSH2 0x06c2 000006bb: CALLDATASIZE 000006bc: PUSH1 0x04 000006be: PUSH2 0x2ffb 000006c1: JUMP 000006c2: JUMPDEST 000006c3: PUSH2 0x1613 000006c6: JUMP 000006c7: JUMPDEST 000006c8: CALLVALUE 000006c9: DUP1 000006ca: ISZERO 000006cb: PUSH2 0x06d2 000006ce: JUMPI 000006cf: PUSH0 000006d0: DUP1 000006d1: REVERT 000006d2: JUMPDEST 000006d3: POP 000006d4: PUSH2 0x02e9 000006d7: PUSH2 0x06e1 000006da: CALLDATASIZE 000006db: PUSH1 0x04 000006dd: PUSH2 0x2e75 000006e0: JUMP 000006e1: JUMPDEST 000006e2: PUSH2 0x16c1 000006e5: JUMP 000006e6: JUMPDEST 000006e7: CALLVALUE 000006e8: DUP1 000006e9: ISZERO 000006ea: PUSH2 0x06f1 000006ed: JUMPI 000006ee: PUSH0 000006ef: DUP1 000006f0: REVERT 000006f1: JUMPDEST 000006f2: POP 000006f3: PUSH2 0x0705 000006f6: PUSH2 0x0700 000006f9: CALLDATASIZE 000006fa: PUSH1 0x04 000006fc: PUSH2 0x3039 000006ff: JUMP 00000700: JUMPDEST 00000701: PUSH2 0x16e5 00000704: JUMP 00000705: JUMPDEST 00000706: PUSH1 0x40 00000708: MLOAD 00000709: PUSH2 0x02a2 0000070c: SWAP2 0000070d: SWAP1 0000070e: PUSH2 0x3081 00000711: JUMP 00000712: JUMPDEST 00000713: CALLVALUE 00000714: DUP1 00000715: ISZERO 00000716: PUSH2 0x071d 00000719: JUMPI 0000071a: PUSH0 0000071b: DUP1 0000071c: REVERT 0000071d: JUMPDEST 0000071e: POP 0000071f: PUSH2 0x0275 00000722: PUSH2 0x072c 00000725: CALLDATASIZE 00000726: PUSH1 0x04 00000728: PUSH2 0x2eb0 0000072b: JUMP 0000072c: JUMPDEST 0000072d: PUSH2 0x1956 00000730: JUMP 00000731: JUMPDEST 00000732: CALLVALUE 00000733: DUP1 00000734: ISZERO 00000735: PUSH2 0x073c 00000738: JUMPI 00000739: PUSH0 0000073a: DUP1 0000073b: REVERT 0000073c: JUMPDEST 0000073d: POP 0000073e: PUSH2 0x0275 00000741: PUSH2 0x074b 00000744: CALLDATASIZE 00000745: PUSH1 0x04 00000747: PUSH2 0x2f43 0000074a: JUMP 0000074b: JUMPDEST 0000074c: PUSH2 0x1972 0000074f: JUMP 00000750: JUMPDEST 00000751: CALLVALUE 00000752: DUP1 00000753: ISZERO 00000754: PUSH2 0x075b 00000757: JUMPI 00000758: PUSH0 00000759: DUP1 0000075a: REVERT 0000075b: JUMPDEST 0000075c: POP 0000075d: PUSH2 0x02e9 00000760: PUSH2 0x076a 00000763: CALLDATASIZE 00000764: PUSH1 0x04 00000766: PUSH2 0x2ffb 00000769: JUMP 0000076a: JUMPDEST 0000076b: PUSH2 0x1f03 0000076e: JUMP 0000076f: JUMPDEST 00000770: CALLVALUE 00000771: DUP1 00000772: ISZERO 00000773: PUSH2 0x077a 00000776: JUMPI 00000777: PUSH0 00000778: DUP1 00000779: REVERT 0000077a: JUMPDEST 0000077b: POP 0000077c: PUSH32 0x275a5493182a3abf69f6f3cc73ffd59f2fced19807d36bac2db251b070f37a00 0000079d: PUSH1 0x02 0000079f: ADD 000007a0: SLOAD 000007a1: PUSH2 0x02e9 000007a4: JUMP 000007a5: JUMPDEST 000007a6: CALLVALUE 000007a7: DUP1 000007a8: ISZERO 000007a9: PUSH2 0x07b0 000007ac: JUMPI 000007ad: PUSH0 000007ae: DUP1 000007af: REVERT 000007b0: JUMPDEST 000007b1: POP 000007b2: PUSH2 0x02e9 000007b5: PUSH32 0x35f08086aac3799af637e5e9fa5ff324170893731444bf3a9d1edc368bcbfaeb 000007d6: DUP2 000007d7: JUMP 000007d8: JUMPDEST 000007d9: CALLVALUE 000007da: DUP1 000007db: ISZERO 000007dc: PUSH2 0x07e3 000007df: JUMPI 000007e0: PUSH0 000007e1: DUP1 000007e2: REVERT 000007e3: JUMPDEST 000007e4: POP 000007e5: PUSH2 0x02e9 000007e8: PUSH4 0x055d4a80 000007ed: DUP2 000007ee: JUMP 000007ef: JUMPDEST 000007f0: CALLVALUE 000007f1: DUP1 000007f2: ISZERO 000007f3: PUSH2 0x07fa 000007f6: JUMPI 000007f7: PUSH0 000007f8: DUP1 000007f9: REVERT 000007fa: JUMPDEST 000007fb: POP 000007fc: PUSH2 0x03ed 000007ff: PUSH32 0x0000000000000000000000009008d19f58aabd9ed0d60971565aa8510560ab41 00000820: DUP2 00000821: JUMP 00000822: JUMPDEST 00000823: CALLVALUE 00000824: DUP1 00000825: ISZERO 00000826: PUSH2 0x082d 00000829: JUMPI 0000082a: PUSH0 0000082b: DUP1 0000082c: REVERT 0000082d: JUMPDEST 0000082e: POP 0000082f: PUSH2 0x02e9 00000832: PUSH2 0x083c 00000835: CALLDATASIZE 00000836: PUSH1 0x04 00000838: PUSH2 0x30b6 0000083b: JUMP 0000083c: JUMPDEST 0000083d: PUSH1 0x01 0000083f: PUSH1 0x01 00000841: PUSH1 0xa0 00000843: SHL 00000844: SUB 00000845: SWAP2 00000846: DUP3 00000847: AND 00000848: PUSH0 00000849: SWAP1 0000084a: DUP2 0000084b: MSTORE 0000084c: PUSH1 0x03 0000084e: PUSH32 0x275a5493182a3abf69f6f3cc73ffd59f2fced19807d36bac2db251b070f37a00 0000086f: ADD 00000870: PUSH1 0x20 00000872: SWAP1 00000873: DUP2 00000874: MSTORE 00000875: PUSH1 0x40 00000877: DUP1 00000878: DUP4 00000879: KECCAK256 0000087a: SWAP4 0000087b: SWAP1 0000087c: SWAP5 0000087d: AND 0000087e: DUP3 0000087f: MSTORE 00000880: SWAP2 00000881: SWAP1 00000882: SWAP2 00000883: MSTORE 00000884: KECCAK256 00000885: SLOAD 00000886: SWAP1 00000887: JUMP 00000888: JUMPDEST 00000889: PUSH2 0x08b9 0000088c: PUSH32 0x35f08086aac3799af637e5e9fa5ff324170893731444bf3a9d1edc368bcbfaeb 000008ad: PUSH2 0x061a 000008b0: PUSH1 0x20 000008b2: DUP5 000008b3: ADD 000008b4: DUP5 000008b5: PUSH2 0x2f08 000008b8: JUMP 000008b9: JUMPDEST 000008ba: PUSH2 0x08f5 000008bd: JUMPI 000008be: PUSH1 0x40 000008c0: MLOAD 000008c1: PUSH4 0xd5efc6bb 000008c6: PUSH1 0xe0 000008c8: SHL 000008c9: DUP2 000008ca: MSTORE 000008cb: PUSH1 0x20 000008cd: PUSH1 0x04 000008cf: DUP3 000008d0: ADD 000008d1: MSTORE 000008d2: PUSH1 0x07 000008d4: PUSH1 0x24 000008d6: DUP3 000008d7: ADD 000008d8: MSTORE 000008d9: PUSH7 0x3a37b5b2b724b7 000008e1: PUSH1 0xc9 000008e3: SHL 000008e4: PUSH1 0x44 000008e6: DUP3 000008e7: ADD 000008e8: MSTORE 000008e9: PUSH1 0x64 000008eb: ADD 000008ec: JUMPDEST 000008ed: PUSH1 0x40 000008ef: MLOAD 000008f0: DUP1 000008f1: SWAP2 000008f2: SUB 000008f3: SWAP1 000008f4: REVERT 000008f5: JUMPDEST 000008f6: PUSH2 0x0929 000008f9: PUSH32 0x9d556436fc766d4a6d24fe48c90073bc03600d7556265a3217def4578d7c2531 0000091a: PUSH2 0x061a 0000091d: PUSH1 0x40 0000091f: DUP5 00000920: ADD 00000921: PUSH1 0x20 00000923: DUP6 00000924: ADD 00000925: PUSH2 0x2f08 00000928: JUMP 00000929: JUMPDEST 0000092a: PUSH2 0x0961 0000092d: JUMPI 0000092e: PUSH1 0x40 00000930: MLOAD 00000931: PUSH4 0xd5efc6bb 00000936: PUSH1 0xe0 00000938: SHL 00000939: DUP2 0000093a: MSTORE 0000093b: PUSH1 0x20 0000093d: PUSH1 0x04 0000093f: DUP3 00000940: ADD 00000941: MSTORE 00000942: PUSH1 0x08 00000944: PUSH1 0x24 00000946: DUP3 00000947: ADD 00000948: MSTORE 00000949: PUSH8 0x1d1bdad95b93dd5d 00000952: PUSH1 0xc2 00000954: SHL 00000955: PUSH1 0x44 00000957: DUP3 00000958: ADD 00000959: MSTORE 0000095a: PUSH1 0x64 0000095c: ADD 0000095d: PUSH2 0x08ec 00000960: JUMP 00000961: JUMPDEST 00000962: PUSH1 0x40 00000964: DUP2 00000965: ADD 00000966: CALLDATALOAD 00000967: PUSH2 0x097c 0000096a: PUSH2 0x0976 0000096d: PUSH1 0x20 0000096f: DUP5 00000970: ADD 00000971: DUP5 00000972: PUSH2 0x2f08 00000975: JUMP 00000976: JUMPDEST 00000977: ADDRESS 00000978: PUSH2 0x21fb 0000097b: JUMP 0000097c: JUMPDEST 0000097d: LT 0000097e: DUP1 0000097f: PUSH2 0x098a 00000982: JUMPI 00000983: POP 00000984: PUSH1 0x40 00000986: DUP2 00000987: ADD 00000988: CALLDATALOAD 00000989: ISZERO 0000098a: JUMPDEST 0000098b: ISZERO 0000098c: PUSH2 0x09c3 0000098f: JUMPI 00000990: PUSH1 0x40 00000992: MLOAD 00000993: PUSH4 0xd5efc6bb 00000998: PUSH1 0xe0 0000099a: SHL 0000099b: DUP2 0000099c: MSTORE 0000099d: PUSH1 0x20 0000099f: PUSH1 0x04 000009a1: DUP3 000009a2: ADD 000009a3: MSTORE 000009a4: PUSH1 0x08 000009a6: PUSH1 0x24 000009a8: DUP3 000009a9: ADD 000009aa: MSTORE 000009ab: PUSH8 0x30b6b7bab73a24b7 000009b4: PUSH1 0xc1 000009b6: SHL 000009b7: PUSH1 0x44 000009b9: DUP3 000009ba: ADD 000009bb: MSTORE 000009bc: PUSH1 0x64 000009be: ADD 000009bf: PUSH2 0x08ec 000009c2: JUMP 000009c3: JUMPDEST 000009c4: PUSH32 0x275a5493182a3abf69f6f3cc73ffd59f2fced19807d36bac2db251b070f37a00 000009e5: PUSH0 000009e6: PUSH1 0x03 000009e8: DUP3 000009e9: ADD 000009ea: DUP2 000009eb: PUSH2 0x09f7 000009ee: PUSH1 0x20 000009f0: DUP7 000009f1: ADD 000009f2: DUP7 000009f3: PUSH2 0x2f08 000009f6: JUMP 000009f7: JUMPDEST 000009f8: PUSH1 0x01 000009fa: PUSH1 0x01 000009fc: PUSH1 0xa0 000009fe: SHL 000009ff: SUB 00000a00: AND 00000a01: PUSH1 0x01 00000a03: PUSH1 0x01 00000a05: PUSH1 0xa0 00000a07: SHL 00000a08: SUB 00000a09: AND 00000a0a: DUP2 00000a0b: MSTORE 00000a0c: PUSH1 0x20 00000a0e: ADD 00000a0f: SWAP1 00000a10: DUP2 00000a11: MSTORE 00000a12: PUSH1 0x20 00000a14: ADD 00000a15: PUSH0 00000a16: KECCAK256 00000a17: PUSH0 00000a18: DUP5 00000a19: PUSH1 0x20 00000a1b: ADD 00000a1c: PUSH1 0x20 00000a1e: DUP2 00000a1f: ADD 00000a20: SWAP1 00000a21: PUSH2 0x0a2a 00000a24: SWAP2 00000a25: SWAP1 00000a26: PUSH2 0x2f08 00000a29: JUMP 00000a2a: JUMPDEST 00000a2b: PUSH1 0x01 00000a2d: PUSH1 0x01 00000a2f: PUSH1 0xa0 00000a31: SHL 00000a32: SUB 00000a33: AND 00000a34: PUSH1 0x01 00000a36: PUSH1 0x01 00000a38: PUSH1 0xa0 00000a3a: SHL 00000a3b: SUB 00000a3c: AND 00000a3d: DUP2 00000a3e: MSTORE 00000a3f: PUSH1 0x20 00000a41: ADD 00000a42: SWAP1 00000a43: DUP2 00000a44: MSTORE 00000a45: PUSH1 0x20 00000a47: ADD 00000a48: PUSH0 00000a49: KECCAK256 00000a4a: SLOAD 00000a4b: SWAP1 00000a4c: POP 00000a4d: DUP1 00000a4e: PUSH0 00000a4f: SUB 00000a50: PUSH2 0x0a5a 00000a53: JUMPI 00000a54: POP 00000a55: PUSH1 0x02 00000a57: DUP2 00000a58: ADD 00000a59: SLOAD 00000a5a: JUMPDEST 00000a5b: PUSH0 00000a5c: PUSH2 0x0a93 00000a5f: PUSH2 0x0a88 00000a62: PUSH2 0x0a6e 00000a65: PUSH1 0x20 00000a67: DUP8 00000a68: ADD 00000a69: DUP8 00000a6a: PUSH2 0x2f08 00000a6d: JUMP 00000a6e: JUMPDEST 00000a6f: PUSH2 0x0a7e 00000a72: PUSH1 0x40 00000a74: DUP9 00000a75: ADD 00000a76: PUSH1 0x20 00000a78: DUP10 00000a79: ADD 00000a7a: PUSH2 0x2f08 00000a7d: JUMP 00000a7e: JUMPDEST 00000a7f: DUP8 00000a80: PUSH1 0x40 00000a82: ADD 00000a83: CALLDATALOAD 00000a84: PUSH2 0x1f03 00000a87: JUMP 00000a88: JUMPDEST 00000a89: DUP4 00000a8a: PUSH4 0x05f5e100 00000a8f: PUSH2 0x22a1 00000a92: JUMP 00000a93: JUMPDEST 00000a94: SWAP1 00000a95: POP 00000a96: DUP1 00000a97: DUP5 00000a98: PUSH1 0x60 00000a9a: ADD 00000a9b: CALLDATALOAD 00000a9c: LT 00000a9d: ISZERO 00000a9e: PUSH2 0x0aea 00000aa1: JUMPI 00000aa2: PUSH1 0x40 00000aa4: MLOAD 00000aa5: PUSH4 0xd5efc6bb 00000aaa: PUSH1 0xe0 00000aac: SHL 00000aad: DUP2 00000aae: MSTORE 00000aaf: PUSH1 0x20 00000ab1: PUSH1 0x04 00000ab3: DUP3 00000ab4: ADD 00000ab5: MSTORE 00000ab6: PUSH1 0x1e 00000ab8: PUSH1 0x24 00000aba: DUP3 00000abb: ADD 00000abc: MSTORE 00000abd: PUSH32 0x6d696e416d6f756e744f7574203c206f7261636c654d696e416d6f756e740000 00000ade: PUSH1 0x44 00000ae0: DUP3 00000ae1: ADD 00000ae2: MSTORE 00000ae3: PUSH1 0x64 00000ae5: ADD 00000ae6: PUSH2 0x08ec 00000ae9: JUMP 00000aea: JUMPDEST 00000aeb: TIMESTAMP 00000aec: DUP5 00000aed: PUSH1 0x80 00000aef: ADD 00000af0: CALLDATALOAD 00000af1: LT 00000af2: ISZERO 00000af3: PUSH2 0x0b2a 00000af6: JUMPI 00000af7: PUSH1 0x40 00000af9: MLOAD 00000afa: PUSH4 0xd5efc6bb 00000aff: PUSH1 0xe0 00000b01: SHL 00000b02: DUP2 00000b03: MSTORE 00000b04: PUSH1 0x20 00000b06: PUSH1 0x04 00000b08: DUP3 00000b09: ADD 00000b0a: MSTORE 00000b0b: PUSH1 0x08 00000b0d: PUSH1 0x24 00000b0f: DUP3 00000b10: ADD 00000b11: MSTORE 00000b12: PUSH8 0x646561646c696e65 00000b1b: PUSH1 0xc0 00000b1d: SHL 00000b1e: PUSH1 0x44 00000b20: DUP3 00000b21: ADD 00000b22: MSTORE 00000b23: PUSH1 0x64 00000b25: ADD 00000b26: PUSH2 0x08ec 00000b29: JUMP 00000b2a: JUMPDEST 00000b2b: PUSH2 0x0b3a 00000b2e: PUSH1 0x40 00000b30: DUP6 00000b31: ADD 00000b32: PUSH1 0x20 00000b34: DUP7 00000b35: ADD 00000b36: PUSH2 0x2f08 00000b39: JUMP 00000b3a: JUMPDEST 00000b3b: PUSH1 0x01 00000b3d: PUSH1 0x01 00000b3f: PUSH1 0xa0 00000b41: SHL 00000b42: SUB 00000b43: AND 00000b44: PUSH2 0x0b50 00000b47: PUSH1 0x20 00000b49: DUP7 00000b4a: ADD 00000b4b: DUP7 00000b4c: PUSH2 0x2f08 00000b4f: JUMP 00000b50: JUMPDEST 00000b51: PUSH1 0x01 00000b53: PUSH1 0x01 00000b55: PUSH1 0xa0 00000b57: SHL 00000b58: SUB 00000b59: AND 00000b5a: SUB 00000b5b: PUSH2 0x0b9d 00000b5e: JUMPI 00000b5f: PUSH1 0x40 00000b61: MLOAD 00000b62: PUSH4 0xd5efc6bb 00000b67: PUSH1 0xe0 00000b69: SHL 00000b6a: DUP2 00000b6b: MSTORE 00000b6c: PUSH1 0x20 00000b6e: PUSH1 0x04 00000b70: DUP3 00000b71: ADD 00000b72: MSTORE 00000b73: PUSH1 0x13 00000b75: PUSH1 0x24 00000b77: DUP3 00000b78: ADD 00000b79: MSTORE 00000b7a: PUSH19 0x1d1bdad95b925b880f4f481d1bdad95b93dd5d 00000b8e: PUSH1 0x6a 00000b90: SHL 00000b91: PUSH1 0x44 00000b93: DUP3 00000b94: ADD 00000b95: MSTORE 00000b96: PUSH1 0x64 00000b98: ADD 00000b99: PUSH2 0x08ec 00000b9c: JUMP 00000b9d: JUMPDEST 00000b9e: POP 00000b9f: POP 00000ba0: POP 00000ba1: POP 00000ba2: JUMP 00000ba3: JUMPDEST 00000ba4: PUSH0 00000ba5: PUSH1 0x01 00000ba7: PUSH1 0x01 00000ba9: PUSH1 0xe0 00000bab: SHL 00000bac: SUB 00000bad: NOT 00000bae: DUP3 00000baf: AND 00000bb0: PUSH4 0x5a05180f 00000bb5: PUSH1 0xe0 00000bb7: SHL 00000bb8: EQ 00000bb9: DUP1 00000bba: PUSH2 0x0bc7 00000bbd: JUMPI 00000bbe: POP 00000bbf: PUSH2 0x0bc7 00000bc2: DUP3 00000bc3: PUSH2 0x2351 00000bc6: JUMP 00000bc7: JUMPDEST 00000bc8: SWAP3 00000bc9: SWAP2 00000bca: POP 00000bcb: POP 00000bcc: JUMP 00000bcd: JUMPDEST 00000bce: PUSH0 00000bcf: DUP1 00000bd0: MLOAD 00000bd1: PUSH1 0x20 00000bd3: PUSH2 0x36ce 00000bd6: DUP4 00000bd7: CODECOPY 00000bd8: DUP2 00000bd9: MLOAD 00000bda: SWAP2 00000bdb: MSTORE 00000bdc: PUSH2 0x0be4 00000bdf: DUP2 00000be0: PUSH2 0x2385 00000be3: JUMP 00000be4: JUMPDEST 00000be5: PUSH1 0x40 00000be7: MLOAD 00000be8: PUSH3 0x54cdef 00000bec: PUSH1 0xe6 00000bee: SHL 00000bef: DUP2 00000bf0: MSTORE 00000bf1: PUSH1 0x01 00000bf3: PUSH1 0x01 00000bf5: PUSH1 0xa0 00000bf7: SHL 00000bf8: SUB 00000bf9: PUSH32 0x0000000000000000000000009008d19f58aabd9ed0d60971565aa8510560ab41 00000c1a: AND 00000c1b: SWAP1 00000c1c: PUSH4 0x15337bc0 00000c21: SWAP1 00000c22: PUSH2 0x0c31 00000c25: SWAP1 00000c26: DUP7 00000c27: SWAP1 00000c28: DUP7 00000c29: SWAP1 00000c2a: PUSH1 0x04 00000c2c: ADD 00000c2d: PUSH2 0x310a 00000c30: JUMP 00000c31: JUMPDEST 00000c32: PUSH0 00000c33: PUSH1 0x40 00000c35: MLOAD 00000c36: DUP1 00000c37: DUP4 00000c38: SUB 00000c39: DUP2 00000c3a: PUSH0 00000c3b: DUP8 00000c3c: DUP1 00000c3d: EXTCODESIZE 00000c3e: ISZERO 00000c3f: DUP1 00000c40: ISZERO 00000c41: PUSH2 0x0c48 00000c44: JUMPI 00000c45: PUSH0 00000c46: DUP1 00000c47: REVERT 00000c48: JUMPDEST 00000c49: POP 00000c4a: GAS 00000c4b: CALL 00000c4c: ISZERO 00000c4d: DUP1 00000c4e: ISZERO 00000c4f: PUSH2 0x0c5a 00000c52: JUMPI 00000c53: RETURNDATASIZE 00000c54: PUSH0 00000c55: DUP1 00000c56: RETURNDATACOPY 00000c57: RETURNDATASIZE 00000c58: PUSH0 00000c59: REVERT 00000c5a: JUMPDEST 00000c5b: POP 00000c5c: POP 00000c5d: POP 00000c5e: POP 00000c5f: PUSH32 0x53a0d823aed1a4804707fe8fd5f5fbd95767ee12e836f69db0c4b88333f12062 00000c80: DUP4 00000c81: DUP4 00000c82: PUSH1 0x40 00000c84: MLOAD 00000c85: PUSH2 0x0c8f 00000c88: SWAP3 00000c89: SWAP2 00000c8a: SWAP1 00000c8b: PUSH2 0x310a 00000c8e: JUMP 00000c8f: JUMPDEST 00000c90: PUSH1 0x40 00000c92: MLOAD 00000c93: DUP1 00000c94: SWAP2 00000c95: SUB 00000c96: SWAP1 00000c97: LOG1 00000c98: POP 00000c99: POP 00000c9a: POP 00000c9b: JUMP 00000c9c: JUMPDEST 00000c9d: PUSH0 00000c9e: SWAP1 00000c9f: DUP2 00000ca0: MSTORE 00000ca1: PUSH0 00000ca2: DUP1 00000ca3: MLOAD 00000ca4: PUSH1 0x20 00000ca6: PUSH2 0x36ee 00000ca9: DUP4 00000caa: CODECOPY 00000cab: DUP2 00000cac: MLOAD 00000cad: SWAP2 00000cae: MSTORE 00000caf: PUSH1 0x20 00000cb1: MSTORE 00000cb2: PUSH1 0x40 00000cb4: SWAP1 00000cb5: KECCAK256 00000cb6: PUSH1 0x01 00000cb8: ADD 00000cb9: SLOAD 00000cba: SWAP1 00000cbb: JUMP 00000cbc: JUMPDEST 00000cbd: PUSH4 0x055d4a80 00000cc2: DUP2 00000cc3: LT 00000cc4: DUP1 00000cc5: PUSH2 0x0cd1 00000cc8: JUMPI 00000cc9: POP 00000cca: PUSH4 0x068e7780 00000ccf: DUP2 00000cd0: GT 00000cd1: JUMPDEST 00000cd2: ISZERO 00000cd3: PUSH2 0x0d1f 00000cd6: JUMPI 00000cd7: PUSH1 0x40 00000cd9: MLOAD 00000cda: PUSH4 0xd5efc6bb 00000cdf: PUSH1 0xe0 00000ce1: SHL 00000ce2: DUP2 00000ce3: MSTORE 00000ce4: PUSH1 0x20 00000ce6: PUSH1 0x04 00000ce8: DUP3 00000ce9: ADD 00000cea: DUP2 00000ceb: SWAP1 00000cec: MSTORE 00000ced: PUSH1 0x24 00000cef: DUP3 00000cf0: ADD 00000cf1: MSTORE 00000cf2: PUSH32 0x6d756c7469706c696572206f7574206f662065787065637465642072616e6765 00000d13: PUSH1 0x44 00000d15: DUP3 00000d16: ADD 00000d17: MSTORE 00000d18: PUSH1 0x64 00000d1a: ADD 00000d1b: PUSH2 0x08ec 00000d1e: JUMP 00000d1f: JUMPDEST 00000d20: POP 00000d21: JUMP 00000d22: JUMPDEST 00000d23: PUSH2 0x0d2b 00000d26: DUP3 00000d27: PUSH2 0x0c9c 00000d2a: JUMP 00000d2b: JUMPDEST 00000d2c: PUSH2 0x0d34 00000d2f: DUP2 00000d30: PUSH2 0x2385 00000d33: JUMP 00000d34: JUMPDEST 00000d35: PUSH2 0x0b9d 00000d38: DUP4 00000d39: DUP4 00000d3a: PUSH2 0x238f 00000d3d: JUMP 00000d3e: JUMPDEST 00000d3f: PUSH1 0x01 00000d41: PUSH1 0x01 00000d43: PUSH1 0xa0 00000d45: SHL 00000d46: SUB 00000d47: DUP2 00000d48: AND 00000d49: CALLER 00000d4a: EQ 00000d4b: PUSH2 0x0d67 00000d4e: JUMPI 00000d4f: PUSH1 0x40 00000d51: MLOAD 00000d52: PUSH4 0x334bd919 00000d57: PUSH1 0xe1 00000d59: SHL 00000d5a: DUP2 00000d5b: MSTORE 00000d5c: PUSH1 0x04 00000d5e: ADD 00000d5f: PUSH1 0x40 00000d61: MLOAD 00000d62: DUP1 00000d63: SWAP2 00000d64: SUB 00000d65: SWAP1 00000d66: REVERT 00000d67: JUMPDEST 00000d68: PUSH2 0x0d71 00000d6b: DUP3 00000d6c: DUP3 00000d6d: PUSH2 0x2409 00000d70: JUMP 00000d71: JUMPDEST 00000d72: POP 00000d73: POP 00000d74: POP 00000d75: JUMP 00000d76: JUMPDEST 00000d77: PUSH0 00000d78: PUSH2 0x0da0 00000d7b: PUSH32 0x062030953ce644a2a7115259790ad01d3c2b5e8c98fc6b190da443a3f0a7c900 00000d9c: PUSH2 0x2485 00000d9f: JUMP 00000da0: JUMPDEST 00000da1: SWAP1 00000da2: POP 00000da3: SWAP1 00000da4: JUMP 00000da5: JUMPDEST 00000da6: PUSH0 00000da7: PUSH2 0x0dae 00000daa: PUSH2 0x248e 00000dad: JUMP 00000dae: JUMPDEST 00000daf: DUP1 00000db0: SLOAD 00000db1: SWAP1 00000db2: SWAP2 00000db3: POP 00000db4: PUSH1 0xff 00000db6: PUSH1 0x01 00000db8: PUSH1 0x40 00000dba: SHL 00000dbb: DUP3 00000dbc: DIV 00000dbd: AND 00000dbe: ISZERO 00000dbf: SWAP1 00000dc0: PUSH8 0xffffffffffffffff 00000dc9: AND 00000dca: PUSH0 00000dcb: DUP2 00000dcc: ISZERO 00000dcd: DUP1 00000dce: ISZERO 00000dcf: PUSH2 0x0dd5 00000dd2: JUMPI 00000dd3: POP 00000dd4: DUP3 00000dd5: JUMPDEST 00000dd6: SWAP1 00000dd7: POP 00000dd8: PUSH0 00000dd9: DUP3 00000dda: PUSH8 0xffffffffffffffff 00000de3: AND 00000de4: PUSH1 0x01 00000de6: EQ 00000de7: DUP1 00000de8: ISZERO 00000de9: PUSH2 0x0df1 00000dec: JUMPI 00000ded: POP 00000dee: ADDRESS 00000def: EXTCODESIZE 00000df0: ISZERO 00000df1: JUMPDEST 00000df2: SWAP1 00000df3: POP 00000df4: DUP2 00000df5: ISZERO 00000df6: DUP1 00000df7: ISZERO 00000df8: PUSH2 0x0dff 00000dfb: JUMPI 00000dfc: POP 00000dfd: DUP1 00000dfe: ISZERO 00000dff: JUMPDEST 00000e00: ISZERO 00000e01: PUSH2 0x0e1d 00000e04: JUMPI 00000e05: PUSH1 0x40 00000e07: MLOAD 00000e08: PUSH4 0xf92ee8a9 00000e0d: PUSH1 0xe0 00000e0f: SHL 00000e10: DUP2 00000e11: MSTORE 00000e12: PUSH1 0x04 00000e14: ADD 00000e15: PUSH1 0x40 00000e17: MLOAD 00000e18: DUP1 00000e19: SWAP2 00000e1a: SUB 00000e1b: SWAP1 00000e1c: REVERT 00000e1d: JUMPDEST 00000e1e: DUP5 00000e1f: SLOAD 00000e20: PUSH8 0xffffffffffffffff 00000e29: NOT 00000e2a: AND 00000e2b: PUSH1 0x01 00000e2d: OR 00000e2e: DUP6 00000e2f: SSTORE 00000e30: DUP4 00000e31: ISZERO 00000e32: PUSH2 0x0e47 00000e35: JUMPI 00000e36: DUP5 00000e37: SLOAD 00000e38: PUSH1 0xff 00000e3a: PUSH1 0x40 00000e3c: SHL 00000e3d: NOT 00000e3e: AND 00000e3f: PUSH1 0x01 00000e41: PUSH1 0x40 00000e43: SHL 00000e44: OR 00000e45: DUP6 00000e46: SSTORE 00000e47: JUMPDEST 00000e48: PUSH0 00000e49: DUP1 00000e4a: DUP1 00000e4b: DUP1 00000e4c: DUP1 00000e4d: DUP1 00000e4e: PUSH2 0x0e59 00000e51: DUP13 00000e52: DUP15 00000e53: ADD 00000e54: DUP15 00000e55: PUSH2 0x321b 00000e58: JUMP 00000e59: JUMPDEST 00000e5a: SWAP6 00000e5b: POP 00000e5c: SWAP6 00000e5d: POP 00000e5e: SWAP6 00000e5f: POP 00000e60: SWAP6 00000e61: POP 00000e62: SWAP6 00000e63: POP 00000e64: SWAP6 00000e65: POP 00000e66: PUSH0 00000e67: PUSH1 0x01 00000e69: PUSH1 0x01 00000e6b: PUSH1 0xa0 00000e6d: SHL 00000e6e: SUB 00000e6f: AND 00000e70: DUP7 00000e71: PUSH1 0x01 00000e73: PUSH1 0x01 00000e75: PUSH1 0xa0 00000e77: SHL 00000e78: SUB 00000e79: AND 00000e7a: EQ 00000e7b: DUP1 00000e7c: PUSH2 0x0e8c 00000e7f: JUMPI 00000e80: POP 00000e81: PUSH1 0x01 00000e83: PUSH1 0x01 00000e85: PUSH1 0xa0 00000e87: SHL 00000e88: SUB 00000e89: DUP6 00000e8a: AND 00000e8b: ISZERO 00000e8c: JUMPDEST 00000e8d: DUP1 00000e8e: PUSH2 0x0e9e 00000e91: JUMPI 00000e92: POP 00000e93: PUSH1 0x01 00000e95: PUSH1 0x01 00000e97: PUSH1 0xa0 00000e99: SHL 00000e9a: SUB 00000e9b: DUP5 00000e9c: AND 00000e9d: ISZERO 00000e9e: JUMPDEST 00000e9f: ISZERO 00000ea0: PUSH2 0x0ebc 00000ea3: JUMPI 00000ea4: PUSH1 0x40 00000ea6: MLOAD 00000ea7: PUSH4 0x7c946ed7 00000eac: PUSH1 0xe0 00000eae: SHL 00000eaf: DUP2 00000eb0: MSTORE 00000eb1: PUSH1 0x04 00000eb3: ADD 00000eb4: PUSH1 0x40 00000eb6: MLOAD 00000eb7: DUP1 00000eb8: SWAP2 00000eb9: SUB 00000eba: SWAP1 00000ebb: REVERT 00000ebc: JUMPDEST 00000ebd: PUSH2 0x0ec5 00000ec0: DUP4 00000ec1: PUSH2 0x0cbc 00000ec4: JUMP 00000ec5: JUMPDEST 00000ec6: PUSH32 0x275a5493182a3abf69f6f3cc73ffd59f2fced19807d36bac2db251b070f37a00 00000ee7: PUSH2 0x0ef0 00000eea: PUSH0 00000eeb: DUP9 00000eec: PUSH2 0x238f 00000eef: JUMP 00000ef0: JUMPDEST 00000ef1: POP 00000ef2: DUP1 00000ef3: SLOAD 00000ef4: PUSH1 0x01 00000ef6: PUSH1 0x01 00000ef8: PUSH1 0xa0 00000efa: SHL 00000efb: SUB 00000efc: DUP1 00000efd: DUP9 00000efe: AND 00000eff: PUSH1 0x01 00000f01: PUSH1 0x01 00000f03: PUSH1 0xa0 00000f05: SHL 00000f06: SUB 00000f07: NOT 00000f08: SWAP3 00000f09: DUP4 00000f0a: AND 00000f0b: OR 00000f0c: DUP4 00000f0d: SSTORE 00000f0e: PUSH1 0x01 00000f10: DUP4 00000f11: ADD 00000f12: DUP1 00000f13: SLOAD 00000f14: SWAP2 00000f15: DUP9 00000f16: AND 00000f17: SWAP2 00000f18: SWAP1 00000f19: SWAP3 00000f1a: AND 00000f1b: OR 00000f1c: SWAP1 00000f1d: SSTORE 00000f1e: PUSH1 0x02 00000f20: DUP2 00000f21: ADD 00000f22: DUP5 00000f23: SWAP1 00000f24: SSTORE 00000f25: PUSH0 00000f26: JUMPDEST 00000f27: DUP4 00000f28: MLOAD 00000f29: DUP2 00000f2a: LT 00000f2b: ISZERO 00000f2c: PUSH2 0x0fe5 00000f2f: JUMPI 00000f30: PUSH0 00000f31: PUSH1 0x01 00000f33: PUSH1 0x01 00000f35: PUSH1 0xa0 00000f37: SHL 00000f38: SUB 00000f39: AND 00000f3a: DUP5 00000f3b: DUP3 00000f3c: DUP2 00000f3d: MLOAD 00000f3e: DUP2 00000f3f: LT 00000f40: PUSH2 0x0f4b 00000f43: JUMPI 00000f44: PUSH2 0x0f4b 00000f47: PUSH2 0x3317 00000f4a: JUMP 00000f4b: JUMPDEST 00000f4c: PUSH1 0x20 00000f4e: MUL 00000f4f: PUSH1 0x20 00000f51: ADD 00000f52: ADD 00000f53: MLOAD 00000f54: PUSH1 0x01 00000f56: PUSH1 0x01 00000f58: PUSH1 0xa0 00000f5a: SHL 00000f5b: SUB 00000f5c: AND 00000f5d: EQ 00000f5e: DUP1 00000f5f: PUSH2 0x0f82 00000f62: JUMPI 00000f63: POP 00000f64: PUSH0 00000f65: DUP1 00000f66: SHL 00000f67: DUP4 00000f68: DUP3 00000f69: DUP2 00000f6a: MLOAD 00000f6b: DUP2 00000f6c: LT 00000f6d: PUSH2 0x0f78 00000f70: JUMPI 00000f71: PUSH2 0x0f78 00000f74: PUSH2 0x3317 00000f77: JUMP 00000f78: JUMPDEST 00000f79: PUSH1 0x20 00000f7b: MUL 00000f7c: PUSH1 0x20 00000f7e: ADD 00000f7f: ADD 00000f80: MLOAD 00000f81: EQ 00000f82: JUMPDEST 00000f83: ISZERO 00000f84: PUSH2 0x0fa0 00000f87: JUMPI 00000f88: PUSH1 0x40 00000f8a: MLOAD 00000f8b: PUSH4 0x7c946ed7 00000f90: PUSH1 0xe0 00000f92: SHL 00000f93: DUP2 00000f94: MSTORE 00000f95: PUSH1 0x04 00000f97: ADD 00000f98: PUSH1 0x40 00000f9a: MLOAD 00000f9b: DUP1 00000f9c: SWAP2 00000f9d: SUB 00000f9e: SWAP1 00000f9f: REVERT 00000fa0: JUMPDEST 00000fa1: PUSH2 0x0fdc 00000fa4: DUP4 00000fa5: DUP3 00000fa6: DUP2 00000fa7: MLOAD 00000fa8: DUP2 00000fa9: LT 00000faa: PUSH2 0x0fb5 00000fad: JUMPI 00000fae: PUSH2 0x0fb5 00000fb1: PUSH2 0x3317 00000fb4: JUMP 00000fb5: JUMPDEST 00000fb6: PUSH1 0x20 00000fb8: MUL 00000fb9: PUSH1 0x20 00000fbb: ADD 00000fbc: ADD 00000fbd: MLOAD 00000fbe: DUP6 00000fbf: DUP4 00000fc0: DUP2 00000fc1: MLOAD 00000fc2: DUP2 00000fc3: LT 00000fc4: PUSH2 0x0fcf 00000fc7: JUMPI 00000fc8: PUSH2 0x0fcf 00000fcb: PUSH2 0x3317 00000fce: JUMP 00000fcf: JUMPDEST 00000fd0: PUSH1 0x20 00000fd2: MUL 00000fd3: PUSH1 0x20 00000fd5: ADD 00000fd6: ADD 00000fd7: MLOAD 00000fd8: PUSH2 0x238f 00000fdb: JUMP 00000fdc: JUMPDEST 00000fdd: POP 00000fde: PUSH1 0x01 00000fe0: ADD 00000fe1: PUSH2 0x0f26 00000fe4: JUMP 00000fe5: JUMPDEST 00000fe6: POP 00000fe7: PUSH32 0x5e399709a9ff1709f6f6be7268c8e5c3eeaa9da9cd9797e78f07ef287c3717fe 00001008: DUP15 00001009: DUP15 0000100a: PUSH1 0x40 0000100c: MLOAD 0000100d: PUSH2 0x1017 00001010: SWAP3 00001011: SWAP2 00001012: SWAP1 00001013: PUSH2 0x310a 00001016: JUMP 00001017: JUMPDEST 00001018: PUSH1 0x40 0000101a: MLOAD 0000101b: DUP1 0000101c: SWAP2 0000101d: SUB 0000101e: SWAP1 0000101f: LOG1 00001020: POP 00001021: POP 00001022: POP 00001023: POP 00001024: POP 00001025: POP 00001026: POP 00001027: DUP4 00001028: ISZERO 00001029: PUSH2 0x106c 0000102c: JUMPI 0000102d: DUP5 0000102e: SLOAD 0000102f: PUSH1 0xff 00001031: PUSH1 0x40 00001033: SHL 00001034: NOT 00001035: AND 00001036: DUP6 00001037: SSTORE 00001038: PUSH1 0x40 0000103a: MLOAD 0000103b: PUSH1 0x01 0000103d: DUP2 0000103e: MSTORE 0000103f: PUSH32 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2 00001060: SWAP1 00001061: PUSH1 0x20 00001063: ADD 00001064: PUSH1 0x40 00001066: MLOAD 00001067: DUP1 00001068: SWAP2 00001069: SUB 0000106a: SWAP1 0000106b: LOG1 0000106c: JUMPDEST 0000106d: POP 0000106e: POP 0000106f: POP 00001070: POP 00001071: POP 00001072: POP 00001073: POP 00001074: JUMP 00001075: JUMPDEST 00001076: PUSH0 00001077: DUP1 00001078: MLOAD 00001079: PUSH1 0x20 0000107b: PUSH2 0x36ce 0000107e: DUP4 0000107f: CODECOPY 00001080: DUP2 00001081: MLOAD 00001082: SWAP2 00001083: MSTORE 00001084: PUSH2 0x108c 00001087: DUP2 00001088: PUSH2 0x2385 0000108b: JUMP 0000108c: JUMPDEST 0000108d: PUSH1 0x01 0000108f: PUSH1 0x01 00001091: PUSH1 0xa0 00001093: SHL 00001094: SUB 00001095: DUP4 00001096: AND 00001097: PUSH20 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee 000010ac: EQ 000010ad: DUP1 000010ae: PUSH2 0x10de 000010b1: JUMPI 000010b2: POP 000010b3: PUSH2 0x10dc 000010b6: PUSH32 0x35f08086aac3799af637e5e9fa5ff324170893731444bf3a9d1edc368bcbfaeb 000010d7: DUP5 000010d8: PUSH2 0x1554 000010db: JUMP 000010dc: JUMPDEST 000010dd: ISZERO 000010de: JUMPDEST 000010df: ISZERO 000010e0: PUSH2 0x1114 000010e3: JUMPI 000010e4: PUSH1 0x40 000010e6: MLOAD 000010e7: PUSH4 0xd5efc6bb 000010ec: PUSH1 0xe0 000010ee: SHL 000010ef: DUP2 000010f0: MSTORE 000010f1: PUSH1 0x20 000010f3: PUSH1 0x04 000010f5: DUP3 000010f6: ADD 000010f7: MSTORE 000010f8: PUSH1 0x05 000010fa: PUSH1 0x24 000010fc: DUP3 000010fd: ADD 000010fe: MSTORE 000010ff: PUSH5 0x185cdcd95d 00001105: PUSH1 0xda 00001107: SHL 00001108: PUSH1 0x44 0000110a: DUP3 0000110b: ADD 0000110c: MSTORE 0000110d: PUSH1 0x64 0000110f: ADD 00001110: PUSH2 0x08ec 00001113: JUMP 00001114: JUMPDEST 00001115: PUSH2 0x1148 00001118: PUSH1 0x01 0000111a: PUSH1 0x01 0000111c: PUSH1 0xa0 0000111e: SHL 0000111f: SUB 00001120: DUP5 00001121: AND 00001122: PUSH32 0x000000000000000000000000c92e8bdf79f0507f65a392b0ab4667716bfe0110 00001143: DUP5 00001144: PUSH2 0x24b6 00001147: JUMP 00001148: JUMPDEST 00001149: DUP3 0000114a: PUSH1 0x01 0000114c: PUSH1 0x01 0000114e: PUSH1 0xa0 00001150: SHL 00001151: SUB 00001152: AND 00001153: PUSH32 0x3ab165fa63d80ae70966ca9ed739045883dcca32c4573b17c48d8c8d63578835 00001174: DUP4 00001175: PUSH1 0x40 00001177: MLOAD 00001178: PUSH2 0x1183 0000117b: SWAP2 0000117c: DUP2 0000117d: MSTORE 0000117e: PUSH1 0x20 00001180: ADD 00001181: SWAP1 00001182: JUMP 00001183: JUMPDEST 00001184: PUSH1 0x40 00001186: MLOAD 00001187: DUP1 00001188: SWAP2 00001189: SUB 0000118a: SWAP1 0000118b: LOG2 0000118c: POP 0000118d: POP 0000118e: POP 0000118f: JUMP 00001190: JUMPDEST 00001191: PUSH0 00001192: PUSH2 0x0bc7 00001195: PUSH32 0x062030953ce644a2a7115259790ad01d3c2b5e8c98fc6b190da443a3f0a7c900 000011b6: DUP4 000011b7: PUSH2 0x2573 000011ba: JUMP 000011bb: JUMPDEST 000011bc: PUSH2 0x11c3 000011bf: PUSH2 0x15e5 000011c2: JUMP 000011c3: JUMPDEST 000011c4: PUSH1 0x01 000011c6: PUSH1 0x01 000011c8: PUSH1 0xa0 000011ca: SHL 000011cb: SUB 000011cc: AND 000011cd: CALLER 000011ce: PUSH1 0x01 000011d0: PUSH1 0x01 000011d2: PUSH1 0xa0 000011d4: SHL 000011d5: SUB 000011d6: AND 000011d7: EQ 000011d8: PUSH2 0x121d 000011db: JUMPI 000011dc: PUSH1 0x40 000011de: MLOAD 000011df: PUSH4 0xd5efc6bb 000011e4: PUSH1 0xe0 000011e6: SHL 000011e7: DUP2 000011e8: MSTORE 000011e9: PUSH1 0x20 000011eb: PUSH1 0x04 000011ed: DUP3 000011ee: ADD 000011ef: MSTORE 000011f0: PUSH1 0x16 000011f2: PUSH1 0x24 000011f4: DUP3 000011f5: ADD 000011f6: MSTORE 000011f7: PUSH22 0x1b5cd9cb9cd95b99195c88084f481cdd589d985d5b1d 0000120e: PUSH1 0x52 00001210: SHL 00001211: PUSH1 0x44 00001213: DUP3 00001214: ADD 00001215: MSTORE 00001216: PUSH1 0x64 00001218: ADD 00001219: PUSH2 0x08ec 0000121c: JUMP 0000121d: JUMPDEST 0000121e: PUSH2 0x1228 00001221: DUP3 00001222: CALLER 00001223: DUP4 00001224: PUSH2 0x258a 00001227: JUMP 00001228: JUMPDEST 00001229: DUP2 0000122a: PUSH1 0x01 0000122c: PUSH1 0x01 0000122e: PUSH1 0xa0 00001230: SHL 00001231: SUB 00001232: AND 00001233: PUSH32 0x4c56d82314c7ba16ae8b6c8f189249e688d64c23ce4ad32dce3533e7e14b550a 00001254: DUP3 00001255: PUSH1 0x40 00001257: MLOAD 00001258: PUSH2 0x1263 0000125b: SWAP2 0000125c: DUP2 0000125d: MSTORE 0000125e: PUSH1 0x20 00001260: ADD 00001261: SWAP1 00001262: JUMP 00001263: JUMPDEST 00001264: PUSH1 0x40 00001266: MLOAD 00001267: DUP1 00001268: SWAP2 00001269: SUB 0000126a: SWAP1 0000126b: LOG2 0000126c: POP 0000126d: POP 0000126e: JUMP 0000126f: JUMPDEST 00001270: PUSH0 00001271: PUSH2 0x1279 00001274: DUP2 00001275: PUSH2 0x2385 00001278: JUMP 00001279: JUMPDEST 0000127a: PUSH1 0x01 0000127c: PUSH1 0x01 0000127e: PUSH1 0xa0 00001280: SHL 00001281: SUB 00001282: DUP3 00001283: AND 00001284: PUSH2 0x12a0 00001287: JUMPI 00001288: PUSH1 0x40 0000128a: MLOAD 0000128b: PUSH4 0x7c946ed7 00001290: PUSH1 0xe0 00001292: SHL 00001293: DUP2 00001294: MSTORE 00001295: PUSH1 0x04 00001297: ADD 00001298: PUSH1 0x40 0000129a: MLOAD 0000129b: DUP1 0000129c: SWAP2 0000129d: SUB 0000129e: SWAP1 0000129f: REVERT 000012a0: JUMPDEST 000012a1: PUSH32 0x275a5493182a3abf69f6f3cc73ffd59f2fced19807d36bac2db251b070f37a00 000012c2: PUSH1 0x01 000012c4: ADD 000012c5: DUP1 000012c6: SLOAD 000012c7: PUSH1 0x01 000012c9: PUSH1 0x01 000012cb: PUSH1 0xa0 000012cd: SHL 000012ce: SUB 000012cf: NOT 000012d0: AND 000012d1: PUSH1 0x01 000012d3: PUSH1 0x01 000012d5: PUSH1 0xa0 000012d7: SHL 000012d8: SUB 000012d9: DUP5 000012da: AND 000012db: SWAP1 000012dc: DUP2 000012dd: OR 000012de: SWAP1 000012df: SWAP2 000012e0: SSTORE 000012e1: PUSH1 0x40 000012e3: MLOAD 000012e4: PUSH32 0x3f32684a32a11dabdbb8c0177de80aa3ae36a004d75210335b49e544e48cd0aa 00001305: SWAP1 00001306: PUSH0 00001307: SWAP1 00001308: LOG2 00001309: POP 0000130a: POP 0000130b: JUMP 0000130c: JUMPDEST 0000130d: PUSH2 0x1314 00001310: PUSH2 0x15e5 00001313: JUMP 00001314: JUMPDEST 00001315: PUSH1 0x01 00001317: PUSH1 0x01 00001319: PUSH1 0xa0 0000131b: SHL 0000131c: SUB 0000131d: AND 0000131e: CALLER 0000131f: PUSH1 0x01 00001321: PUSH1 0x01 00001323: PUSH1 0xa0 00001325: SHL 00001326: SUB 00001327: AND 00001328: EQ 00001329: PUSH2 0x136e 0000132c: JUMPI 0000132d: PUSH1 0x40 0000132f: MLOAD 00001330: PUSH4 0xd5efc6bb 00001335: PUSH1 0xe0 00001337: SHL 00001338: DUP2 00001339: MSTORE 0000133a: PUSH1 0x20 0000133c: PUSH1 0x04 0000133e: DUP3 0000133f: ADD 00001340: MSTORE 00001341: PUSH1 0x16 00001343: PUSH1 0x24 00001345: DUP3 00001346: ADD 00001347: MSTORE 00001348: PUSH22 0x1b5cd9cb9cd95b99195c88084f481cdd589d985d5b1d 0000135f: PUSH1 0x52 00001361: SHL 00001362: PUSH1 0x44 00001364: DUP3 00001365: ADD 00001366: MSTORE 00001367: PUSH1 0x64 00001369: ADD 0000136a: PUSH2 0x08ec 0000136d: JUMP 0000136e: JUMPDEST 0000136f: PUSH2 0x1379 00001372: DUP3 00001373: CALLER 00001374: DUP4 00001375: PUSH2 0x25e4 00001378: JUMP 00001379: JUMPDEST 0000137a: DUP2 0000137b: PUSH1 0x01 0000137d: PUSH1 0x01 0000137f: PUSH1 0xa0 00001381: SHL 00001382: SUB 00001383: AND 00001384: PUSH32 0xed89c4acc03daec7926ae32a91e983603182ad723fe3103a929a39475cc05581 000013a5: DUP3 000013a6: PUSH1 0x40 000013a8: MLOAD 000013a9: PUSH2 0x1263 000013ac: SWAP2 000013ad: DUP2 000013ae: MSTORE 000013af: PUSH1 0x20 000013b1: ADD 000013b2: SWAP1 000013b3: JUMP 000013b4: JUMPDEST 000013b5: PUSH0 000013b6: DUP3 000013b7: DUP2 000013b8: MSTORE 000013b9: PUSH0 000013ba: DUP1 000013bb: MLOAD 000013bc: PUSH1 0x20 000013be: PUSH2 0x36ae 000013c1: DUP4 000013c2: CODECOPY 000013c3: DUP2 000013c4: MLOAD 000013c5: SWAP2 000013c6: MSTORE 000013c7: PUSH1 0x20 000013c9: DUP2 000013ca: SWAP1 000013cb: MSTORE 000013cc: PUSH1 0x40 000013ce: DUP3 000013cf: KECCAK256 000013d0: PUSH2 0x13d9 000013d3: SWAP1 000013d4: DUP5 000013d5: PUSH2 0x2627 000013d8: JUMP 000013d9: JUMPDEST 000013da: SWAP5 000013db: SWAP4 000013dc: POP 000013dd: POP 000013de: POP 000013df: POP 000013e0: JUMP 000013e1: JUMPDEST 000013e2: PUSH0 000013e3: DUP1 000013e4: MLOAD 000013e5: PUSH1 0x20 000013e7: PUSH2 0x36ce 000013ea: DUP4 000013eb: CODECOPY 000013ec: DUP2 000013ed: MLOAD 000013ee: SWAP2 000013ef: MSTORE 000013f0: PUSH2 0x13f8 000013f3: DUP2 000013f4: PUSH2 0x2385 000013f7: JUMP 000013f8: JUMPDEST 000013f9: PUSH2 0x1401 000013fc: DUP6 000013fd: PUSH2 0x0888 00001400: JUMP 00001401: JUMPDEST 00001402: PUSH2 0x140d 00001405: DUP6 00001406: DUP6 00001407: DUP6 00001408: DUP6 00001409: PUSH2 0x1972 0000140c: JUMP 0000140d: JUMPDEST 0000140e: PUSH1 0x40 00001410: MLOAD 00001411: PUSH4 0xec6cb13f 00001416: PUSH1 0xe0 00001418: SHL 00001419: DUP2 0000141a: MSTORE 0000141b: PUSH1 0x01 0000141d: PUSH1 0x01 0000141f: PUSH1 0xa0 00001421: SHL 00001422: SUB 00001423: PUSH32 0x0000000000000000000000009008d19f58aabd9ed0d60971565aa8510560ab41 00001444: AND 00001445: SWAP1 00001446: PUSH4 0xec6cb13f 0000144b: SWAP1 0000144c: PUSH2 0x145e 0000144f: SWAP1 00001450: DUP7 00001451: SWAP1 00001452: DUP7 00001453: SWAP1 00001454: PUSH1 0x01 00001456: SWAP1 00001457: PUSH1 0x04 00001459: ADD 0000145a: PUSH2 0x332b 0000145d: JUMP 0000145e: JUMPDEST 0000145f: PUSH0 00001460: PUSH1 0x40 00001462: MLOAD 00001463: DUP1 00001464: DUP4 00001465: SUB 00001466: DUP2 00001467: PUSH0 00001468: DUP8 00001469: DUP1 0000146a: EXTCODESIZE 0000146b: ISZERO 0000146c: DUP1 0000146d: ISZERO 0000146e: PUSH2 0x1475 00001471: JUMPI 00001472: PUSH0 00001473: DUP1 00001474: REVERT 00001475: JUMPDEST 00001476: POP 00001477: GAS 00001478: CALL 00001479: ISZERO 0000147a: DUP1 0000147b: ISZERO 0000147c: PUSH2 0x1487 0000147f: JUMPI 00001480: RETURNDATASIZE 00001481: PUSH0 00001482: DUP1 00001483: RETURNDATACOPY 00001484: RETURNDATASIZE 00001485: PUSH0 00001486: REVERT 00001487: JUMPDEST 00001488: POP 00001489: POP 0000148a: POP 0000148b: POP 0000148c: PUSH32 0xbadc4749810f6b5532313b0920dd8812deedbb04f42adf83f472c202bfdf776b 000014ad: DUP6 000014ae: DUP5 000014af: DUP5 000014b0: PUSH1 0x40 000014b2: MLOAD 000014b3: PUSH2 0x14be 000014b6: SWAP4 000014b7: SWAP3 000014b8: SWAP2 000014b9: SWAP1 000014ba: PUSH2 0x339c 000014bd: JUMP 000014be: JUMPDEST 000014bf: PUSH1 0x40 000014c1: MLOAD 000014c2: DUP1 000014c3: SWAP2 000014c4: SUB 000014c5: SWAP1 000014c6: LOG1 000014c7: POP 000014c8: POP 000014c9: POP 000014ca: POP 000014cb: POP 000014cc: JUMP 000014cd: JUMPDEST 000014ce: PUSH32 0x32a83f2101a3db03d031fa7d978ba44116bbbd832fcef7908374354ae8de2b38 000014ef: PUSH2 0x14f7 000014f2: DUP2 000014f3: PUSH2 0x2385 000014f6: JUMP 000014f7: JUMPDEST 000014f8: PUSH2 0x1500 000014fb: DUP3 000014fc: PUSH2 0x0cbc 000014ff: JUMP 00001500: JUMPDEST 00001501: DUP2 00001502: PUSH32 0x275a5493182a3abf69f6f3cc73ffd59f2fced19807d36bac2db251b070f37a00 00001523: PUSH1 0x02 00001525: ADD 00001526: SSTORE 00001527: PUSH1 0x40 00001529: MLOAD 0000152a: DUP3 0000152b: SWAP1 0000152c: PUSH32 0x2997a873aca04517aa548a1e9510fc7ea367f3ed402435343d3d99ee2ec01d80 0000154d: SWAP1 0000154e: PUSH0 0000154f: SWAP1 00001550: LOG2 00001551: POP 00001552: POP 00001553: JUMP 00001554: JUMPDEST 00001555: PUSH0 00001556: SWAP2 00001557: DUP3 00001558: MSTORE 00001559: PUSH0 0000155a: DUP1 0000155b: MLOAD 0000155c: PUSH1 0x20 0000155e: PUSH2 0x36ee 00001561: DUP4 00001562: CODECOPY 00001563: DUP2 00001564: MLOAD 00001565: SWAP2 00001566: MSTORE 00001567: PUSH1 0x20 00001569: SWAP1 0000156a: DUP2 0000156b: MSTORE 0000156c: PUSH1 0x40 0000156e: DUP1 0000156f: DUP5 00001570: KECCAK256 00001571: PUSH1 0x01 00001573: PUSH1 0x01 00001575: PUSH1 0xa0 00001577: SHL 00001578: SUB 00001579: SWAP4 0000157a: SWAP1 0000157b: SWAP4 0000157c: AND 0000157d: DUP5 0000157e: MSTORE 0000157f: SWAP2 00001580: SWAP1 00001581: MSTORE 00001582: SWAP1 00001583: KECCAK256 00001584: SLOAD 00001585: PUSH1 0xff 00001587: AND 00001588: SWAP1 00001589: JUMP 0000158a: JUMPDEST 0000158b: PUSH0 0000158c: PUSH2 0x0bc7 0000158f: PUSH32 0x062030953ce644a2a7115259790ad01d3c2b5e8c98fc6b190da443a3f0a7c900 000015b0: DUP4 000015b1: PUSH2 0x2627 000015b4: JUMP 000015b5: JUMPDEST 000015b6: PUSH0 000015b7: DUP2 000015b8: DUP2 000015b9: MSTORE 000015ba: PUSH0 000015bb: DUP1 000015bc: MLOAD 000015bd: PUSH1 0x20 000015bf: PUSH2 0x36ae 000015c2: DUP4 000015c3: CODECOPY 000015c4: DUP2 000015c5: MLOAD 000015c6: SWAP2 000015c7: MSTORE 000015c8: PUSH1 0x20 000015ca: DUP2 000015cb: SWAP1 000015cc: MSTORE 000015cd: PUSH1 0x40 000015cf: SWAP1 000015d0: SWAP2 000015d1: KECCAK256 000015d2: PUSH1 0x60 000015d4: SWAP2 000015d5: SWAP1 000015d6: PUSH2 0x15de 000015d9: SWAP1 000015da: PUSH2 0x2632 000015dd: JUMP 000015de: JUMPDEST 000015df: SWAP4 000015e0: SWAP3 000015e1: POP 000015e2: POP 000015e3: POP 000015e4: JUMP 000015e5: JUMPDEST 000015e6: PUSH32 0x275a5493182a3abf69f6f3cc73ffd59f2fced19807d36bac2db251b070f37a00 00001607: SLOAD 00001608: PUSH1 0x01 0000160a: PUSH1 0x01 0000160c: PUSH1 0xa0 0000160e: SHL 0000160f: SUB 00001610: AND 00001611: SWAP1 00001612: JUMP 00001613: JUMPDEST 00001614: PUSH32 0x32a83f2101a3db03d031fa7d978ba44116bbbd832fcef7908374354ae8de2b38 00001635: PUSH2 0x163d 00001638: DUP2 00001639: PUSH2 0x2385 0000163c: JUMP 0000163d: JUMPDEST 0000163e: PUSH2 0x1646 00001641: DUP3 00001642: PUSH2 0x0cbc 00001645: JUMP 00001646: JUMPDEST 00001647: PUSH1 0x01 00001649: PUSH1 0x01 0000164b: PUSH1 0xa0 0000164d: SHL 0000164e: SUB 0000164f: DUP5 00001650: DUP2 00001651: AND 00001652: PUSH0 00001653: DUP2 00001654: DUP2 00001655: MSTORE 00001656: PUSH1 0x03 00001658: PUSH32 0x275a5493182a3abf69f6f3cc73ffd59f2fced19807d36bac2db251b070f37a00 00001679: ADD 0000167a: PUSH1 0x20 0000167c: SWAP1 0000167d: DUP2 0000167e: MSTORE 0000167f: PUSH1 0x40 00001681: DUP1 00001682: DUP4 00001683: KECCAK256 00001684: SWAP5 00001685: DUP9 00001686: AND 00001687: DUP1 00001688: DUP5 00001689: MSTORE 0000168a: SWAP5 0000168b: SWAP1 0000168c: SWAP2 0000168d: MSTORE 0000168e: DUP1 0000168f: DUP3 00001690: KECCAK256 00001691: DUP7 00001692: SWAP1 00001693: SSTORE 00001694: MLOAD 00001695: DUP6 00001696: SWAP4 00001697: SWAP3 00001698: SWAP2 00001699: PUSH32 0x5ea20a02bb6cfa47321a28b04de1d37a2ff3b52c5e5bac2c041b749ab1066946 000016ba: SWAP2 000016bb: LOG4 000016bc: POP 000016bd: POP 000016be: POP 000016bf: POP 000016c0: JUMP 000016c1: JUMPDEST 000016c2: PUSH0 000016c3: DUP2 000016c4: DUP2 000016c5: MSTORE 000016c6: PUSH0 000016c7: DUP1 000016c8: MLOAD 000016c9: PUSH1 0x20 000016cb: PUSH2 0x36ae 000016ce: DUP4 000016cf: CODECOPY 000016d0: DUP2 000016d1: MLOAD 000016d2: SWAP2 000016d3: MSTORE 000016d4: PUSH1 0x20 000016d6: DUP2 000016d7: SWAP1 000016d8: MSTORE 000016d9: PUSH1 0x40 000016db: DUP3 000016dc: KECCAK256 000016dd: PUSH2 0x15de 000016e0: SWAP1 000016e1: PUSH2 0x2485 000016e4: JUMP 000016e5: JUMPDEST 000016e6: PUSH1 0x60 000016e8: PUSH2 0x16ef 000016eb: PUSH2 0x263e 000016ee: JUMP 000016ef: JUMPDEST 000016f0: PUSH0 000016f1: DUP1 000016f2: MLOAD 000016f3: PUSH1 0x20 000016f5: PUSH2 0x36ce 000016f8: DUP4 000016f9: CODECOPY 000016fa: DUP2 000016fb: MLOAD 000016fc: SWAP2 000016fd: MSTORE 000016fe: PUSH2 0x1706 00001701: DUP2 00001702: PUSH2 0x2385 00001705: JUMP 00001706: JUMPDEST 00001707: PUSH2 0x170f 0000170a: DUP7 0000170b: PUSH2 0x0888 0000170e: JUMP 0000170f: JUMPDEST 00001710: PUSH2 0x1739 00001713: PUSH32 0x59a256c4d42df67b80d5d3fdaf91897a0d929e43a43a5f8e1a88cbd1476e5d90 00001734: DUP7 00001735: PUSH2 0x1554 00001738: JUMP 00001739: JUMPDEST 0000173a: PUSH2 0x176f 0000173d: JUMPI 0000173e: PUSH1 0x40 00001740: MLOAD 00001741: PUSH4 0xd5efc6bb 00001746: PUSH1 0xe0 00001748: SHL 00001749: DUP2 0000174a: MSTORE 0000174b: PUSH1 0x20 0000174d: PUSH1 0x04 0000174f: DUP3 00001750: ADD 00001751: MSTORE 00001752: PUSH1 0x06 00001754: PUSH1 0x24 00001756: DUP3 00001757: ADD 00001758: MSTORE 00001759: PUSH6 0x3937baba32b9 00001760: PUSH1 0xd1 00001762: SHL 00001763: PUSH1 0x44 00001765: DUP3 00001766: ADD 00001767: MSTORE 00001768: PUSH1 0x64 0000176a: ADD 0000176b: PUSH2 0x08ec 0000176e: JUMP 0000176f: JUMPDEST 00001770: PUSH0 00001771: PUSH2 0x1783 00001774: PUSH2 0x0976 00001777: PUSH1 0x40 00001779: DUP10 0000177a: ADD 0000177b: PUSH1 0x20 0000177d: DUP11 0000177e: ADD 0000177f: PUSH2 0x2f08 00001782: JUMP 00001783: JUMPDEST 00001784: SWAP1 00001785: POP 00001786: PUSH20 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee 0000179b: PUSH2 0x17a7 0000179e: PUSH1 0x20 000017a0: DUP10 000017a1: ADD 000017a2: DUP10 000017a3: PUSH2 0x2f08 000017a6: JUMP 000017a7: JUMPDEST 000017a8: PUSH1 0x01 000017aa: PUSH1 0x01 000017ac: PUSH1 0xa0 000017ae: SHL 000017af: SUB 000017b0: AND 000017b1: EQ 000017b2: PUSH2 0x1833 000017b5: JUMPI 000017b6: PUSH2 0x17db 000017b9: DUP7 000017ba: PUSH1 0x40 000017bc: DUP10 000017bd: ADD 000017be: CALLDATALOAD 000017bf: PUSH2 0x17cb 000017c2: PUSH1 0x20 000017c4: DUP12 000017c5: ADD 000017c6: DUP12 000017c7: PUSH2 0x2f08 000017ca: JUMP 000017cb: JUMPDEST 000017cc: PUSH1 0x01 000017ce: PUSH1 0x01 000017d0: PUSH1 0xa0 000017d2: SHL 000017d3: SUB 000017d4: AND 000017d5: SWAP2 000017d6: SWAP1 000017d7: PUSH2 0x24b6 000017da: JUMP 000017db: JUMPDEST 000017dc: PUSH2 0x181a 000017df: DUP7 000017e0: DUP7 000017e1: DUP7 000017e2: DUP1 000017e3: DUP1 000017e4: PUSH1 0x1f 000017e6: ADD 000017e7: PUSH1 0x20 000017e9: DUP1 000017ea: SWAP2 000017eb: DIV 000017ec: MUL 000017ed: PUSH1 0x20 000017ef: ADD 000017f0: PUSH1 0x40 000017f2: MLOAD 000017f3: SWAP1 000017f4: DUP2 000017f5: ADD 000017f6: PUSH1 0x40 000017f8: MSTORE 000017f9: DUP1 000017fa: SWAP4 000017fb: SWAP3 000017fc: SWAP2 000017fd: SWAP1 000017fe: DUP2 000017ff: DUP2 00001800: MSTORE 00001801: PUSH1 0x20 00001803: ADD 00001804: DUP4 00001805: DUP4 00001806: DUP1 00001807: DUP3 00001808: DUP5 00001809: CALLDATACOPY 0000180a: PUSH0 0000180b: SWAP3 0000180c: ADD 0000180d: SWAP2 0000180e: SWAP1 0000180f: SWAP2 00001810: MSTORE 00001811: POP 00001812: PUSH2 0x2688 00001815: SWAP3 00001816: POP 00001817: POP 00001818: POP 00001819: JUMP 0000181a: JUMPDEST 0000181b: SWAP3 0000181c: POP 0000181d: PUSH2 0x182e 00001820: DUP7 00001821: PUSH0 00001822: PUSH2 0x17cb 00001825: PUSH1 0x20 00001827: DUP12 00001828: ADD 00001829: DUP12 0000182a: PUSH2 0x2f08 0000182d: JUMP 0000182e: JUMPDEST 0000182f: PUSH2 0x1879 00001832: JUMP 00001833: JUMPDEST 00001834: PUSH2 0x1876 00001837: DUP7 00001838: DUP7 00001839: DUP7 0000183a: DUP1 0000183b: DUP1 0000183c: PUSH1 0x1f 0000183e: ADD 0000183f: PUSH1 0x20 00001841: DUP1 00001842: SWAP2 00001843: DIV 00001844: MUL 00001845: PUSH1 0x20 00001847: ADD 00001848: PUSH1 0x40 0000184a: MLOAD 0000184b: SWAP1 0000184c: DUP2 0000184d: ADD 0000184e: PUSH1 0x40 00001850: MSTORE 00001851: DUP1 00001852: SWAP4 00001853: SWAP3 00001854: SWAP2 00001855: SWAP1 00001856: DUP2 00001857: DUP2 00001858: MSTORE 00001859: PUSH1 0x20 0000185b: ADD 0000185c: DUP4 0000185d: DUP4 0000185e: DUP1 0000185f: DUP3 00001860: DUP5 00001861: CALLDATACOPY 00001862: PUSH0 00001863: SWAP3 00001864: ADD 00001865: SWAP2 00001866: SWAP1 00001867: SWAP2 00001868: MSTORE 00001869: POP 0000186a: POP 0000186b: POP 0000186c: POP 0000186d: PUSH1 0x40 0000186f: DUP11 00001870: ADD 00001871: CALLDATALOAD 00001872: PUSH2 0x2691 00001875: JUMP 00001876: JUMPDEST 00001877: SWAP3 00001878: POP 00001879: JUMPDEST 0000187a: PUSH0 0000187b: DUP2 0000187c: PUSH2 0x188e 0000187f: PUSH2 0x0976 00001882: PUSH1 0x40 00001884: DUP12 00001885: ADD 00001886: PUSH1 0x20 00001888: DUP13 00001889: ADD 0000188a: PUSH2 0x2f08 0000188d: JUMP 0000188e: JUMPDEST 0000188f: PUSH2 0x1898 00001892: SWAP2 00001893: SWAP1 00001894: PUSH2 0x33d9 00001897: JUMP 00001898: JUMPDEST 00001899: SWAP1 0000189a: POP 0000189b: DUP8 0000189c: PUSH1 0x60 0000189e: ADD 0000189f: CALLDATALOAD 000018a0: DUP2 000018a1: LT 000018a2: ISZERO 000018a3: PUSH2 0x18ef 000018a6: JUMPI 000018a7: PUSH1 0x40 000018a9: MLOAD 000018aa: PUSH4 0xd5efc6bb 000018af: PUSH1 0xe0 000018b1: SHL 000018b2: DUP2 000018b3: MSTORE 000018b4: PUSH1 0x20 000018b6: PUSH1 0x04 000018b8: DUP3 000018b9: ADD 000018ba: MSTORE 000018bb: PUSH1 0x18 000018bd: PUSH1 0x24 000018bf: DUP3 000018c0: ADD 000018c1: MSTORE 000018c2: PUSH32 0x616d6f756e744f7574203c206d696e416d6f756e744f75740000000000000000 000018e3: PUSH1 0x44 000018e5: DUP3 000018e6: ADD 000018e7: MSTORE 000018e8: PUSH1 0x64 000018ea: ADD 000018eb: PUSH2 0x08ec 000018ee: JUMP 000018ef: JUMPDEST 000018f0: PUSH32 0xfeed6b2fb656525ae8e13aa421310ffe163eeb86c2f81141d799f300f6393858 00001911: DUP9 00001912: DUP9 00001913: DUP4 00001914: PUSH1 0x40 00001916: MLOAD 00001917: PUSH2 0x1922 0000191a: SWAP4 0000191b: SWAP3 0000191c: SWAP2 0000191d: SWAP1 0000191e: PUSH2 0x33ec 00001921: JUMP 00001922: JUMPDEST 00001923: PUSH1 0x40 00001925: MLOAD 00001926: DUP1 00001927: SWAP2 00001928: SUB 00001929: SWAP1 0000192a: LOG1 0000192b: POP 0000192c: POP 0000192d: POP 0000192e: PUSH2 0x13d9 00001931: PUSH1 0x01 00001933: PUSH32 0x9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00 00001954: SSTORE 00001955: JUMP 00001956: JUMPDEST 00001957: PUSH2 0x195f 0000195a: DUP3 0000195b: PUSH2 0x0c9c 0000195e: JUMP 0000195f: JUMPDEST 00001960: PUSH2 0x1968 00001963: DUP2 00001964: PUSH2 0x2385 00001967: JUMP 00001968: JUMPDEST 00001969: PUSH2 0x0b9d 0000196c: DUP4 0000196d: DUP4 0000196e: PUSH2 0x2409 00001971: JUMP 00001972: JUMPDEST 00001973: PUSH2 0x197f 00001976: PUSH1 0x20 00001978: DUP5 00001979: ADD 0000197a: DUP5 0000197b: PUSH2 0x2f08 0000197e: JUMP 0000197f: JUMPDEST 00001980: PUSH1 0x01 00001982: PUSH1 0x01 00001984: PUSH1 0xa0 00001986: SHL 00001987: SUB 00001988: AND 00001989: PUSH2 0x1995 0000198c: PUSH1 0x20 0000198e: DUP7 0000198f: ADD 00001990: DUP7 00001991: PUSH2 0x2f08 00001994: JUMP 00001995: JUMPDEST 00001996: PUSH1 0x01 00001998: PUSH1 0x01 0000199a: PUSH1 0xa0 0000199c: SHL 0000199d: SUB 0000199e: AND 0000199f: EQ 000019a0: ISZERO 000019a1: DUP1 000019a2: PUSH2 0x19d3 000019a5: JUMPI 000019a6: POP 000019a7: PUSH20 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee 000019bc: PUSH2 0x19c8 000019bf: PUSH1 0x20 000019c1: DUP7 000019c2: ADD 000019c3: DUP7 000019c4: PUSH2 0x2f08 000019c7: JUMP 000019c8: JUMPDEST 000019c9: PUSH1 0x01 000019cb: PUSH1 0x01 000019cd: PUSH1 0xa0 000019cf: SHL 000019d0: SUB 000019d1: AND 000019d2: EQ 000019d3: JUMPDEST 000019d4: ISZERO 000019d5: PUSH2 0x1a0d 000019d8: JUMPI 000019d9: PUSH1 0x40 000019db: MLOAD 000019dc: PUSH4 0xd5efc6bb 000019e1: PUSH1 0xe0 000019e3: SHL 000019e4: DUP2 000019e5: MSTORE 000019e6: PUSH1 0x20 000019e8: PUSH1 0x04 000019ea: DUP3 000019eb: ADD 000019ec: MSTORE 000019ed: PUSH1 0x09 000019ef: PUSH1 0x24 000019f1: DUP3 000019f2: ADD 000019f3: MSTORE 000019f4: PUSH9 0x39b2b6362a37b5b2b7 000019fe: PUSH1 0xb9 00001a00: SHL 00001a01: PUSH1 0x44 00001a03: DUP3 00001a04: ADD 00001a05: MSTORE 00001a06: PUSH1 0x64 00001a08: ADD 00001a09: PUSH2 0x08ec 00001a0c: JUMP 00001a0d: JUMPDEST 00001a0e: PUSH2 0x1a1d 00001a11: PUSH1 0x40 00001a13: DUP5 00001a14: ADD 00001a15: PUSH1 0x20 00001a17: DUP6 00001a18: ADD 00001a19: PUSH2 0x2f08 00001a1c: JUMP 00001a1d: JUMPDEST 00001a1e: PUSH1 0x01 00001a20: PUSH1 0x01 00001a22: PUSH1 0xa0 00001a24: SHL 00001a25: SUB 00001a26: AND 00001a27: PUSH2 0x1a36 00001a2a: PUSH1 0x40 00001a2c: DUP7 00001a2d: ADD 00001a2e: PUSH1 0x20 00001a30: DUP8 00001a31: ADD 00001a32: PUSH2 0x2f08 00001a35: JUMP 00001a36: JUMPDEST 00001a37: PUSH1 0x01 00001a39: PUSH1 0x01 00001a3b: PUSH1 0xa0 00001a3d: SHL 00001a3e: SUB 00001a3f: AND 00001a40: EQ 00001a41: ISZERO 00001a42: DUP1 00001a43: PUSH2 0x1a77 00001a46: JUMPI 00001a47: POP 00001a48: PUSH20 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee 00001a5d: PUSH2 0x1a6c 00001a60: PUSH1 0x40 00001a62: DUP7 00001a63: ADD 00001a64: PUSH1 0x20 00001a66: DUP8 00001a67: ADD 00001a68: PUSH2 0x2f08 00001a6b: JUMP 00001a6c: JUMPDEST 00001a6d: PUSH1 0x01 00001a6f: PUSH1 0x01 00001a71: PUSH1 0xa0 00001a73: SHL 00001a74: SUB 00001a75: AND 00001a76: EQ 00001a77: JUMPDEST 00001a78: ISZERO 00001a79: PUSH2 0x1ab0 00001a7c: JUMPI 00001a7d: PUSH1 0x40 00001a7f: MLOAD 00001a80: PUSH4 0xd5efc6bb 00001a85: PUSH1 0xe0 00001a87: SHL 00001a88: DUP2 00001a89: MSTORE 00001a8a: PUSH1 0x20 00001a8c: PUSH1 0x04 00001a8e: DUP3 00001a8f: ADD 00001a90: MSTORE 00001a91: PUSH1 0x08 00001a93: PUSH1 0x24 00001a95: DUP3 00001a96: ADD 00001a97: MSTORE 00001a98: PUSH8 0x313abcaa37b5b2b7 00001aa1: PUSH1 0xc1 00001aa3: SHL 00001aa4: PUSH1 0x44 00001aa6: DUP3 00001aa7: ADD 00001aa8: MSTORE 00001aa9: PUSH1 0x64 00001aab: ADD 00001aac: PUSH2 0x08ec 00001aaf: JUMP 00001ab0: JUMPDEST 00001ab1: PUSH2 0x1ac0 00001ab4: PUSH1 0x60 00001ab6: DUP5 00001ab7: ADD 00001ab8: PUSH1 0x40 00001aba: DUP6 00001abb: ADD 00001abc: PUSH2 0x2f08 00001abf: JUMP 00001ac0: JUMPDEST 00001ac1: PUSH1 0x01 00001ac3: PUSH1 0x01 00001ac5: PUSH1 0xa0 00001ac7: SHL 00001ac8: SUB 00001ac9: AND 00001aca: ADDRESS 00001acb: PUSH1 0x01 00001acd: PUSH1 0x01 00001acf: PUSH1 0xa0 00001ad1: SHL 00001ad2: SUB 00001ad3: AND 00001ad4: EQ 00001ad5: PUSH2 0x1b0c 00001ad8: JUMPI 00001ad9: PUSH1 0x40 00001adb: MLOAD 00001adc: PUSH4 0xd5efc6bb 00001ae1: PUSH1 0xe0 00001ae3: SHL 00001ae4: DUP2 00001ae5: MSTORE 00001ae6: PUSH1 0x20 00001ae8: PUSH1 0x04 00001aea: DUP3 00001aeb: ADD 00001aec: MSTORE 00001aed: PUSH1 0x08 00001aef: PUSH1 0x24 00001af1: DUP3 00001af2: ADD 00001af3: MSTORE 00001af4: PUSH8 0x3932b1b2b4bb32b9 00001afd: PUSH1 0xc1 00001aff: SHL 00001b00: PUSH1 0x44 00001b02: DUP3 00001b03: ADD 00001b04: MSTORE 00001b05: PUSH1 0x64 00001b07: ADD 00001b08: PUSH2 0x08ec 00001b0b: JUMP 00001b0c: JUMPDEST 00001b0d: DUP3 00001b0e: PUSH1 0x60 00001b10: ADD 00001b11: CALLDATALOAD 00001b12: DUP5 00001b13: PUSH1 0x40 00001b15: ADD 00001b16: CALLDATALOAD 00001b17: EQ 00001b18: PUSH2 0x1b5d 00001b1b: JUMPI 00001b1c: PUSH1 0x40 00001b1e: MLOAD 00001b1f: PUSH4 0xd5efc6bb 00001b24: PUSH1 0xe0 00001b26: SHL 00001b27: DUP2 00001b28: MSTORE 00001b29: PUSH1 0x20 00001b2b: PUSH1 0x04 00001b2d: DUP3 00001b2e: ADD 00001b2f: MSTORE 00001b30: PUSH1 0x16 00001b32: PUSH1 0x24 00001b34: DUP3 00001b35: ADD 00001b36: MSTORE 00001b37: PUSH22 0x185b5bdd5b9d125b88084f481cd95b1b105b5bdd5b9d 00001b4e: PUSH1 0x52 00001b50: SHL 00001b51: PUSH1 0x44 00001b53: DUP3 00001b54: ADD 00001b55: MSTORE 00001b56: PUSH1 0x64 00001b58: ADD 00001b59: PUSH2 0x08ec 00001b5c: JUMP 00001b5d: JUMPDEST 00001b5e: DUP3 00001b5f: PUSH1 0x80 00001b61: ADD 00001b62: CALLDATALOAD 00001b63: DUP5 00001b64: PUSH1 0x60 00001b66: ADD 00001b67: CALLDATALOAD 00001b68: EQ 00001b69: PUSH2 0x1bb5 00001b6c: JUMPI 00001b6d: PUSH1 0x40 00001b6f: MLOAD 00001b70: PUSH4 0xd5efc6bb 00001b75: PUSH1 0xe0 00001b77: SHL 00001b78: DUP2 00001b79: MSTORE 00001b7a: PUSH1 0x20 00001b7c: PUSH1 0x04 00001b7e: DUP3 00001b7f: ADD 00001b80: MSTORE 00001b81: PUSH1 0x19 00001b83: PUSH1 0x24 00001b85: DUP3 00001b86: ADD 00001b87: MSTORE 00001b88: PUSH32 0x6d696e416d6f756e744f757420213d20627579416d6f756e7400000000000000 00001ba9: PUSH1 0x44 00001bab: DUP3 00001bac: ADD 00001bad: MSTORE 00001bae: PUSH1 0x64 00001bb0: ADD 00001bb1: PUSH2 0x08ec 00001bb4: JUMP 00001bb5: JUMPDEST 00001bb6: PUSH2 0x1bc5 00001bb9: PUSH1 0xc0 00001bbb: DUP5 00001bbc: ADD 00001bbd: PUSH1 0xa0 00001bbf: DUP6 00001bc0: ADD 00001bc1: PUSH2 0x3427 00001bc4: JUMP 00001bc5: JUMPDEST 00001bc6: PUSH4 0xffffffff 00001bcb: AND 00001bcc: DUP5 00001bcd: PUSH1 0x80 00001bcf: ADD 00001bd0: CALLDATALOAD 00001bd1: EQ 00001bd2: PUSH2 0x1c14 00001bd5: JUMPI 00001bd6: PUSH1 0x40 00001bd8: MLOAD 00001bd9: PUSH4 0xd5efc6bb 00001bde: PUSH1 0xe0 00001be0: SHL 00001be1: DUP2 00001be2: MSTORE 00001be3: PUSH1 0x20 00001be5: PUSH1 0x04 00001be7: DUP3 00001be8: ADD 00001be9: MSTORE 00001bea: PUSH1 0x13 00001bec: PUSH1 0x24 00001bee: DUP3 00001bef: ADD 00001bf0: MSTORE 00001bf1: PUSH19 0x646561646c696e6520213d2076616c6964546f 00001c05: PUSH1 0x68 00001c07: SHL 00001c08: PUSH1 0x44 00001c0a: DUP3 00001c0b: ADD 00001c0c: MSTORE 00001c0d: PUSH1 0x64 00001c0f: ADD 00001c10: PUSH2 0x08ec 00001c13: JUMP 00001c14: JUMPDEST 00001c15: PUSH32 0xf3b277728b3fee749481eb3e0b3b48980dbbab78658fc419025cb16eee346775 00001c36: DUP4 00001c37: PUSH2 0x0100 00001c3a: ADD 00001c3b: CALLDATALOAD 00001c3c: EQ 00001c3d: PUSH2 0x1c7d 00001c40: JUMPI 00001c41: PUSH1 0x40 00001c43: MLOAD 00001c44: PUSH4 0xd5efc6bb 00001c49: PUSH1 0xe0 00001c4b: SHL 00001c4c: DUP2 00001c4d: MSTORE 00001c4e: PUSH1 0x20 00001c50: PUSH1 0x04 00001c52: DUP3 00001c53: ADD 00001c54: MSTORE 00001c55: PUSH1 0x11 00001c57: PUSH1 0x24 00001c59: DUP3 00001c5a: ADD 00001c5b: MSTORE 00001c5c: PUSH17 0x1ada5b9908084f4812d2539117d4d15313 00001c6e: PUSH1 0x7a 00001c70: SHL 00001c71: PUSH1 0x44 00001c73: DUP3 00001c74: ADD 00001c75: MSTORE 00001c76: PUSH1 0x64 00001c78: ADD 00001c79: PUSH2 0x08ec 00001c7c: JUMP 00001c7d: JUMPDEST 00001c7e: PUSH32 0x5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc9 00001c9f: DUP4 00001ca0: PUSH2 0x0140 00001ca3: ADD 00001ca4: CALLDATALOAD 00001ca5: EQ 00001ca6: PUSH2 0x1cfc 00001ca9: JUMPI 00001caa: PUSH1 0x40 00001cac: MLOAD 00001cad: PUSH4 0xd5efc6bb 00001cb2: PUSH1 0xe0 00001cb4: SHL 00001cb5: DUP2 00001cb6: MSTORE 00001cb7: PUSH1 0x20 00001cb9: PUSH1 0x04 00001cbb: DUP3 00001cbc: ADD 00001cbd: MSTORE 00001cbe: PUSH1 0x21 00001cc0: PUSH1 0x24 00001cc2: DUP3 00001cc3: ADD 00001cc4: MSTORE 00001cc5: PUSH32 0x73656c6c546f6b656e42616c616e636520213d2042414c414e43455f45524332 00001ce6: PUSH1 0x44 00001ce8: DUP3 00001ce9: ADD 00001cea: MSTORE 00001ceb: PUSH1 0x03 00001ced: PUSH1 0xfc 00001cef: SHL 00001cf0: PUSH1 0x64 00001cf2: DUP3 00001cf3: ADD 00001cf4: MSTORE 00001cf5: PUSH1 0x84 00001cf7: ADD 00001cf8: PUSH2 0x08ec 00001cfb: JUMP 00001cfc: JUMPDEST 00001cfd: PUSH32 0x5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc9 00001d1e: DUP4 00001d1f: PUSH2 0x0160 00001d22: ADD 00001d23: CALLDATALOAD 00001d24: EQ 00001d25: PUSH2 0x1d71 00001d28: JUMPI 00001d29: PUSH1 0x40 00001d2b: MLOAD 00001d2c: PUSH4 0xd5efc6bb 00001d31: PUSH1 0xe0 00001d33: SHL 00001d34: DUP2 00001d35: MSTORE 00001d36: PUSH1 0x20 00001d38: PUSH1 0x04 00001d3a: DUP3 00001d3b: ADD 00001d3c: DUP2 00001d3d: SWAP1 00001d3e: MSTORE 00001d3f: PUSH1 0x24 00001d41: DUP3 00001d42: ADD 00001d43: MSTORE 00001d44: PUSH32 0x627579546f6b656e42616c616e636520213d2042414c414e43455f4552433230 00001d65: PUSH1 0x44 00001d67: DUP3 00001d68: ADD 00001d69: MSTORE 00001d6a: PUSH1 0x64 00001d6c: ADD 00001d6d: PUSH2 0x08ec 00001d70: JUMP 00001d71: JUMPDEST 00001d72: PUSH1 0x40 00001d74: DUP1 00001d75: MLOAD 00001d76: PUSH1 0x38 00001d78: DUP1 00001d79: DUP3 00001d7a: MSTORE 00001d7b: PUSH1 0x60 00001d7d: DUP3 00001d7e: ADD 00001d7f: SWAP1 00001d80: SWAP3 00001d81: MSTORE 00001d82: PUSH0 00001d83: SWAP2 00001d84: PUSH1 0x20 00001d86: DUP3 00001d87: ADD 00001d88: DUP2 00001d89: DUP1 00001d8a: CALLDATASIZE 00001d8b: DUP4 00001d8c: CALLDATACOPY 00001d8d: ADD 00001d8e: SWAP1 00001d8f: POP 00001d90: POP 00001d91: SWAP1 00001d92: POP 00001d93: PUSH2 0x1e8f 00001d96: DUP2 00001d97: PUSH2 0x1e79 00001d9a: PUSH2 0x1da8 00001d9d: CALLDATASIZE 00001d9e: DUP9 00001d9f: SWAP1 00001da0: SUB 00001da1: DUP9 00001da2: ADD 00001da3: DUP9 00001da4: PUSH2 0x344f 00001da7: JUMP 00001da8: JUMPDEST 00001da9: PUSH32 0x0000000000000000000000009008d19f58aabd9ed0d60971565aa8510560ab41 00001dca: PUSH1 0x01 00001dcc: PUSH1 0x01 00001dce: PUSH1 0xa0 00001dd0: SHL 00001dd1: SUB 00001dd2: AND 00001dd3: PUSH4 0xf698da25 00001dd8: PUSH1 0x40 00001dda: MLOAD 00001ddb: DUP2 00001ddc: PUSH4 0xffffffff 00001de1: AND 00001de2: PUSH1 0xe0 00001de4: SHL 00001de5: DUP2 00001de6: MSTORE 00001de7: PUSH1 0x04 00001de9: ADD 00001dea: PUSH1 0x20 00001dec: PUSH1 0x40 00001dee: MLOAD 00001def: DUP1 00001df0: DUP4 00001df1: SUB 00001df2: DUP2 00001df3: DUP7 00001df4: GAS 00001df5: STATICCALL 00001df6: ISZERO 00001df7: DUP1 00001df8: ISZERO 00001df9: PUSH2 0x1e04 00001dfc: JUMPI 00001dfd: RETURNDATASIZE 00001dfe: PUSH0 00001dff: DUP1 00001e00: RETURNDATACOPY 00001e01: RETURNDATASIZE 00001e02: PUSH0 00001e03: REVERT 00001e04: JUMPDEST 00001e05: POP 00001e06: POP 00001e07: POP 00001e08: POP 00001e09: PUSH1 0x40 00001e0b: MLOAD 00001e0c: RETURNDATASIZE 00001e0d: PUSH1 0x1f 00001e0f: NOT 00001e10: PUSH1 0x1f 00001e12: DUP3 00001e13: ADD 00001e14: AND 00001e15: DUP3 00001e16: ADD 00001e17: DUP1 00001e18: PUSH1 0x40 00001e1a: MSTORE 00001e1b: POP 00001e1c: DUP2 00001e1d: ADD 00001e1e: SWAP1 00001e1f: PUSH2 0x1e28 00001e22: SWAP2 00001e23: SWAP1 00001e24: PUSH2 0x350b 00001e27: JUMP 00001e28: JUMPDEST 00001e29: PUSH1 0x1f 00001e2b: NOT 00001e2c: SWAP1 00001e2d: SWAP2 00001e2e: ADD 00001e2f: DUP1 00001e30: MLOAD 00001e31: PUSH32 0xd5a25ba2e97094ad7d83dc28a6572da797d6b3e7fc6663bd93efb789fc17e489 00001e52: DUP3 00001e53: MSTORE 00001e54: PUSH2 0x01a0 00001e57: DUP3 00001e58: KECCAK256 00001e59: SWAP2 00001e5a: MSTORE 00001e5b: PUSH1 0x40 00001e5d: MLOAD 00001e5e: PUSH2 0x1901 00001e61: PUSH1 0xf0 00001e63: SHL 00001e64: DUP2 00001e65: MSTORE 00001e66: PUSH1 0x02 00001e68: DUP2 00001e69: ADD 00001e6a: SWAP3 00001e6b: SWAP1 00001e6c: SWAP3 00001e6d: MSTORE 00001e6e: PUSH1 0x22 00001e70: DUP3 00001e71: ADD 00001e72: MSTORE 00001e73: PUSH1 0x42 00001e75: SWAP1 00001e76: KECCAK256 00001e77: SWAP1 00001e78: JUMP 00001e79: JUMPDEST 00001e7a: ADDRESS 00001e7b: PUSH2 0x1e8a 00001e7e: PUSH1 0xc0 00001e80: DUP10 00001e81: ADD 00001e82: PUSH1 0xa0 00001e84: DUP11 00001e85: ADD 00001e86: PUSH2 0x3427 00001e89: JUMP 00001e8a: JUMPDEST 00001e8b: PUSH2 0x2731 00001e8e: JUMP 00001e8f: JUMPDEST 00001e90: DUP1 00001e91: MLOAD 00001e92: PUSH1 0x20 00001e94: DUP3 00001e95: ADD 00001e96: KECCAK256 00001e97: PUSH1 0x40 00001e99: MLOAD 00001e9a: PUSH2 0x1ea6 00001e9d: SWAP1 00001e9e: DUP6 00001e9f: SWAP1 00001ea0: DUP6 00001ea1: SWAP1 00001ea2: PUSH2 0x3522 00001ea5: JUMP 00001ea6: JUMPDEST 00001ea7: PUSH1 0x40 00001ea9: MLOAD 00001eaa: DUP1 00001eab: SWAP2 00001eac: SUB 00001ead: SWAP1 00001eae: KECCAK256 00001eaf: EQ 00001eb0: PUSH2 0x1efc 00001eb3: JUMPI 00001eb4: PUSH1 0x40 00001eb6: MLOAD 00001eb7: PUSH4 0xd5efc6bb 00001ebc: PUSH1 0xe0 00001ebe: SHL 00001ebf: DUP2 00001ec0: MSTORE 00001ec1: PUSH1 0x20 00001ec3: PUSH1 0x04 00001ec5: DUP3 00001ec6: ADD 00001ec7: MSTORE 00001ec8: PUSH1 0x1e 00001eca: PUSH1 0x24 00001ecc: DUP3 00001ecd: ADD 00001ece: MSTORE 00001ecf: PUSH32 0x6f7264657255696420213d2063616c63756c617465644f726465725569640000 00001ef0: PUSH1 0x44 00001ef2: DUP3 00001ef3: ADD 00001ef4: MSTORE 00001ef5: PUSH1 0x64 00001ef7: ADD 00001ef8: PUSH2 0x08ec 00001efb: JUMP 00001efc: JUMPDEST 00001efd: POP 00001efe: POP 00001eff: POP 00001f00: POP 00001f01: POP 00001f02: JUMP 00001f03: JUMPDEST 00001f04: PUSH0 00001f05: PUSH1 0x01 00001f07: PUSH1 0x01 00001f09: PUSH1 0xa0 00001f0b: SHL 00001f0c: SUB 00001f0d: DUP5 00001f0e: AND 00001f0f: PUSH20 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee 00001f24: EQ 00001f25: PUSH2 0x1f2e 00001f28: JUMPI 00001f29: DUP4 00001f2a: PUSH2 0x1f50 00001f2d: JUMP 00001f2e: JUMPDEST 00001f2f: PUSH32 0x000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2 00001f50: JUMPDEST 00001f51: SWAP4 00001f52: POP 00001f53: PUSH1 0x01 00001f55: PUSH1 0x01 00001f57: PUSH1 0xa0 00001f59: SHL 00001f5a: SUB 00001f5b: DUP4 00001f5c: AND 00001f5d: PUSH20 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee 00001f72: EQ 00001f73: PUSH2 0x1f7c 00001f76: JUMPI 00001f77: DUP3 00001f78: PUSH2 0x1f9e 00001f7b: JUMP 00001f7c: JUMPDEST 00001f7d: PUSH32 0x000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2 00001f9e: JUMPDEST 00001f9f: SWAP3 00001fa0: POP 00001fa1: PUSH0 00001fa2: DUP5 00001fa3: PUSH1 0x01 00001fa5: PUSH1 0x01 00001fa7: PUSH1 0xa0 00001fa9: SHL 00001faa: SUB 00001fab: AND 00001fac: PUSH4 0x313ce567 00001fb1: PUSH1 0x40 00001fb3: MLOAD 00001fb4: DUP2 00001fb5: PUSH4 0xffffffff 00001fba: AND 00001fbb: PUSH1 0xe0 00001fbd: SHL 00001fbe: DUP2 00001fbf: MSTORE 00001fc0: PUSH1 0x04 00001fc2: ADD 00001fc3: PUSH1 0x20 00001fc5: PUSH1 0x40 00001fc7: MLOAD 00001fc8: DUP1 00001fc9: DUP4 00001fca: SUB 00001fcb: DUP2 00001fcc: DUP7 00001fcd: GAS 00001fce: STATICCALL 00001fcf: ISZERO 00001fd0: DUP1 00001fd1: ISZERO 00001fd2: PUSH2 0x1fdd 00001fd5: JUMPI 00001fd6: RETURNDATASIZE 00001fd7: PUSH0 00001fd8: DUP1 00001fd9: RETURNDATACOPY 00001fda: RETURNDATASIZE 00001fdb: PUSH0 00001fdc: REVERT 00001fdd: JUMPDEST 00001fde: POP 00001fdf: POP 00001fe0: POP 00001fe1: POP 00001fe2: PUSH1 0x40 00001fe4: MLOAD 00001fe5: RETURNDATASIZE 00001fe6: PUSH1 0x1f 00001fe8: NOT 00001fe9: PUSH1 0x1f 00001feb: DUP3 00001fec: ADD 00001fed: AND 00001fee: DUP3 00001fef: ADD 00001ff0: DUP1 00001ff1: PUSH1 0x40 00001ff3: MSTORE 00001ff4: POP 00001ff5: DUP2 00001ff6: ADD 00001ff7: SWAP1 00001ff8: PUSH2 0x2001 00001ffb: SWAP2 00001ffc: SWAP1 00001ffd: PUSH2 0x3531 00002000: JUMP 00002001: JUMPDEST 00002002: SWAP1 00002003: POP 00002004: PUSH0 00002005: DUP5 00002006: PUSH1 0x01 00002008: PUSH1 0x01 0000200a: PUSH1 0xa0 0000200c: SHL 0000200d: SUB 0000200e: AND 0000200f: PUSH4 0x313ce567 00002014: PUSH1 0x40 00002016: MLOAD 00002017: DUP2 00002018: PUSH4 0xffffffff 0000201d: AND 0000201e: PUSH1 0xe0 00002020: SHL 00002021: DUP2 00002022: MSTORE 00002023: PUSH1 0x04 00002025: ADD 00002026: PUSH1 0x20 00002028: PUSH1 0x40 0000202a: MLOAD 0000202b: DUP1 0000202c: DUP4 0000202d: SUB 0000202e: DUP2 0000202f: DUP7 00002030: GAS 00002031: STATICCALL 00002032: ISZERO 00002033: DUP1 00002034: ISZERO 00002035: PUSH2 0x2040 00002038: JUMPI 00002039: RETURNDATASIZE 0000203a: PUSH0 0000203b: DUP1 0000203c: RETURNDATACOPY 0000203d: RETURNDATASIZE 0000203e: PUSH0 0000203f: REVERT 00002040: JUMPDEST 00002041: POP 00002042: POP 00002043: POP 00002044: POP 00002045: PUSH1 0x40 00002047: MLOAD 00002048: RETURNDATASIZE 00002049: PUSH1 0x1f 0000204b: NOT 0000204c: PUSH1 0x1f 0000204e: DUP3 0000204f: ADD 00002050: AND 00002051: DUP3 00002052: ADD 00002053: DUP1 00002054: PUSH1 0x40 00002056: MSTORE 00002057: POP 00002058: DUP2 00002059: ADD 0000205a: SWAP1 0000205b: PUSH2 0x2064 0000205e: SWAP2 0000205f: SWAP1 00002060: PUSH2 0x3531 00002063: JUMP 00002064: JUMPDEST 00002065: SWAP1 00002066: POP 00002067: PUSH0 00002068: PUSH2 0x209b 0000206b: PUSH1 0x01 0000206d: PUSH32 0x275a5493182a3abf69f6f3cc73ffd59f2fced19807d36bac2db251b070f37a00 0000208e: ADD 0000208f: SLOAD 00002090: PUSH1 0x01 00002092: PUSH1 0x01 00002094: PUSH1 0xa0 00002096: SHL 00002097: SUB 00002098: AND 00002099: SWAP1 0000209a: JUMP 0000209b: JUMPDEST 0000209c: PUSH1 0x40 0000209e: MLOAD 0000209f: PUSH4 0xb3596f07 000020a4: PUSH1 0xe0 000020a6: SHL 000020a7: DUP2 000020a8: MSTORE 000020a9: PUSH1 0x01 000020ab: PUSH1 0x01 000020ad: PUSH1 0xa0 000020af: SHL 000020b0: SUB 000020b1: DUP10 000020b2: DUP2 000020b3: AND 000020b4: PUSH1 0x04 000020b6: DUP4 000020b7: ADD 000020b8: MSTORE 000020b9: SWAP2 000020ba: SWAP3 000020bb: POP 000020bc: PUSH0 000020bd: SWAP2 000020be: DUP4 000020bf: AND 000020c0: SWAP1 000020c1: PUSH4 0xb3596f07 000020c6: SWAP1 000020c7: PUSH1 0x24 000020c9: ADD 000020ca: PUSH1 0x20 000020cc: PUSH1 0x40 000020ce: MLOAD 000020cf: DUP1 000020d0: DUP4 000020d1: SUB 000020d2: DUP2 000020d3: DUP7 000020d4: GAS 000020d5: STATICCALL 000020d6: ISZERO 000020d7: DUP1 000020d8: ISZERO 000020d9: PUSH2 0x20e4 000020dc: JUMPI 000020dd: RETURNDATASIZE 000020de: PUSH0 000020df: DUP1 000020e0: RETURNDATACOPY 000020e1: RETURNDATASIZE 000020e2: PUSH0 000020e3: REVERT 000020e4: JUMPDEST 000020e5: POP 000020e6: POP 000020e7: POP 000020e8: POP 000020e9: PUSH1 0x40 000020eb: MLOAD 000020ec: RETURNDATASIZE 000020ed: PUSH1 0x1f 000020ef: NOT 000020f0: PUSH1 0x1f 000020f2: DUP3 000020f3: ADD 000020f4: AND 000020f5: DUP3 000020f6: ADD 000020f7: DUP1 000020f8: PUSH1 0x40 000020fa: MSTORE 000020fb: POP 000020fc: DUP2 000020fd: ADD 000020fe: SWAP1 000020ff: PUSH2 0x2108 00002102: SWAP2 00002103: SWAP1 00002104: PUSH2 0x350b 00002107: JUMP 00002108: JUMPDEST 00002109: PUSH1 0x40 0000210b: MLOAD 0000210c: PUSH4 0xb3596f07 00002111: PUSH1 0xe0 00002113: SHL 00002114: DUP2 00002115: MSTORE 00002116: PUSH1 0x01 00002118: PUSH1 0x01 0000211a: PUSH1 0xa0 0000211c: SHL 0000211d: SUB 0000211e: DUP10 0000211f: DUP2 00002120: AND 00002121: PUSH1 0x04 00002123: DUP4 00002124: ADD 00002125: MSTORE 00002126: SWAP2 00002127: SWAP3 00002128: POP 00002129: PUSH0 0000212a: SWAP2 0000212b: DUP5 0000212c: AND 0000212d: SWAP1 0000212e: PUSH4 0xb3596f07 00002133: SWAP1 00002134: PUSH1 0x24 00002136: ADD 00002137: PUSH1 0x20 00002139: PUSH1 0x40 0000213b: MLOAD 0000213c: DUP1 0000213d: DUP4 0000213e: SUB 0000213f: DUP2 00002140: DUP7 00002141: GAS 00002142: STATICCALL 00002143: ISZERO 00002144: DUP1 00002145: ISZERO 00002146: PUSH2 0x2151 00002149: JUMPI 0000214a: RETURNDATASIZE 0000214b: PUSH0 0000214c: DUP1 0000214d: RETURNDATACOPY 0000214e: RETURNDATASIZE 0000214f: PUSH0 00002150: REVERT 00002151: JUMPDEST 00002152: POP 00002153: POP 00002154: POP 00002155: POP 00002156: PUSH1 0x40 00002158: MLOAD 00002159: RETURNDATASIZE 0000215a: PUSH1 0x1f 0000215c: NOT 0000215d: PUSH1 0x1f 0000215f: DUP3 00002160: ADD 00002161: AND 00002162: DUP3 00002163: ADD 00002164: DUP1 00002165: PUSH1 0x40 00002167: MSTORE 00002168: POP 00002169: DUP2 0000216a: ADD 0000216b: SWAP1 0000216c: PUSH2 0x2175 0000216f: SWAP2 00002170: SWAP1 00002171: PUSH2 0x350b 00002174: JUMP 00002175: JUMPDEST 00002176: SWAP1 00002177: POP 00002178: DUP4 00002179: PUSH1 0xff 0000217b: AND 0000217c: DUP6 0000217d: PUSH1 0xff 0000217f: AND 00002180: SUB 00002181: PUSH2 0x219b 00002184: JUMPI 00002185: PUSH2 0x218f 00002188: DUP8 00002189: DUP4 0000218a: DUP4 0000218b: PUSH2 0x22a1 0000218e: JUMP 0000218f: JUMPDEST 00002190: SWAP6 00002191: POP 00002192: POP 00002193: POP 00002194: POP 00002195: POP 00002196: POP 00002197: PUSH2 0x15de 0000219a: JUMP 0000219b: JUMPDEST 0000219c: DUP4 0000219d: PUSH1 0xff 0000219f: AND 000021a0: DUP6 000021a1: PUSH1 0xff 000021a3: AND 000021a4: LT 000021a5: ISZERO 000021a6: PUSH2 0x21d2 000021a9: JUMPI 000021aa: PUSH2 0x218f 000021ad: DUP8 000021ae: PUSH2 0x21b7 000021b1: DUP8 000021b2: DUP8 000021b3: PUSH2 0x3551 000021b6: JUMP 000021b7: JUMPDEST 000021b8: PUSH2 0x21c2 000021bb: SWAP1 000021bc: PUSH1 0x0a 000021be: PUSH2 0x364a 000021c1: JUMP 000021c2: JUMPDEST 000021c3: PUSH2 0x21cc 000021c6: SWAP1 000021c7: DUP6 000021c8: PUSH2 0x3658 000021cb: JUMP 000021cc: JUMPDEST 000021cd: DUP4 000021ce: PUSH2 0x22a1 000021d1: JUMP 000021d2: JUMPDEST 000021d3: PUSH2 0x218f 000021d6: DUP8 000021d7: DUP4 000021d8: PUSH2 0x21e1 000021db: DUP8 000021dc: DUP10 000021dd: PUSH2 0x3551 000021e0: JUMP 000021e1: JUMPDEST 000021e2: PUSH2 0x21ec 000021e5: SWAP1 000021e6: PUSH1 0x0a 000021e8: PUSH2 0x364a 000021eb: JUMP 000021ec: JUMPDEST 000021ed: PUSH2 0x21f6 000021f0: SWAP1 000021f1: DUP6 000021f2: PUSH2 0x3658 000021f5: JUMP 000021f6: JUMPDEST 000021f7: PUSH2 0x22a1 000021fa: JUMP 000021fb: JUMPDEST 000021fc: PUSH0 000021fd: PUSH20 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed 00002212: NOT 00002213: PUSH1 0x01 00002215: PUSH1 0x01 00002217: PUSH1 0xa0 00002219: SHL 0000221a: SUB 0000221b: DUP5 0000221c: AND 0000221d: ADD 0000221e: PUSH2 0x2232 00002221: JUMPI 00002222: POP 00002223: PUSH1 0x01 00002225: PUSH1 0x01 00002227: PUSH1 0xa0 00002229: SHL 0000222a: SUB 0000222b: DUP2 0000222c: AND 0000222d: BALANCE 0000222e: PUSH2 0x0bc7 00002231: JUMP 00002232: JUMPDEST 00002233: PUSH1 0x40 00002235: MLOAD 00002236: PUSH4 0x70a08231 0000223b: PUSH1 0xe0 0000223d: SHL 0000223e: DUP2 0000223f: MSTORE 00002240: PUSH1 0x01 00002242: PUSH1 0x01 00002244: PUSH1 0xa0 00002246: SHL 00002247: SUB 00002248: DUP4 00002249: DUP2 0000224a: AND 0000224b: PUSH1 0x04 0000224d: DUP4 0000224e: ADD 0000224f: MSTORE 00002250: DUP5 00002251: AND 00002252: SWAP1 00002253: PUSH4 0x70a08231 00002258: SWAP1 00002259: PUSH1 0x24 0000225b: ADD 0000225c: PUSH1 0x20 0000225e: PUSH1 0x40 00002260: MLOAD 00002261: DUP1 00002262: DUP4 00002263: SUB 00002264: DUP2 00002265: DUP7 00002266: GAS 00002267: STATICCALL 00002268: ISZERO 00002269: DUP1 0000226a: ISZERO 0000226b: PUSH2 0x2276 0000226e: JUMPI 0000226f: RETURNDATASIZE 00002270: PUSH0 00002271: DUP1 00002272: RETURNDATACOPY 00002273: RETURNDATASIZE 00002274: PUSH0 00002275: REVERT 00002276: JUMPDEST 00002277: POP 00002278: POP 00002279: POP 0000227a: POP 0000227b: PUSH1 0x40 0000227d: MLOAD 0000227e: RETURNDATASIZE 0000227f: PUSH1 0x1f 00002281: NOT 00002282: PUSH1 0x1f 00002284: DUP3 00002285: ADD 00002286: AND 00002287: DUP3 00002288: ADD 00002289: DUP1 0000228a: PUSH1 0x40 0000228c: MSTORE 0000228d: POP 0000228e: DUP2 0000228f: ADD 00002290: SWAP1 00002291: PUSH2 0x229a 00002294: SWAP2 00002295: SWAP1 00002296: PUSH2 0x350b 00002299: JUMP 0000229a: JUMPDEST 0000229b: SWAP1 0000229c: POP 0000229d: PUSH2 0x0bc7 000022a0: JUMP 000022a1: JUMPDEST 000022a2: PUSH0 000022a3: DUP1 000022a4: PUSH0 000022a5: PUSH2 0x22ae 000022a8: DUP7 000022a9: DUP7 000022aa: PUSH2 0x2794 000022ad: JUMP 000022ae: JUMPDEST 000022af: SWAP2 000022b0: POP 000022b1: SWAP2 000022b2: POP 000022b3: DUP2 000022b4: PUSH0 000022b5: SUB 000022b6: PUSH2 0x22d2 000022b9: JUMPI 000022ba: DUP4 000022bb: DUP2 000022bc: DUP2 000022bd: PUSH2 0x22c8 000022c0: JUMPI 000022c1: PUSH2 0x22c8 000022c4: PUSH2 0x366f 000022c7: JUMP 000022c8: JUMPDEST 000022c9: DIV 000022ca: SWAP3 000022cb: POP 000022cc: POP 000022cd: POP 000022ce: PUSH2 0x15de 000022d1: JUMP 000022d2: JUMPDEST 000022d3: DUP2 000022d4: DUP5 000022d5: GT 000022d6: PUSH2 0x22e9 000022d9: JUMPI 000022da: PUSH2 0x22e9 000022dd: PUSH1 0x03 000022df: DUP6 000022e0: ISZERO 000022e1: MUL 000022e2: PUSH1 0x11 000022e4: XOR 000022e5: PUSH2 0x27b0 000022e8: JUMP 000022e9: JUMPDEST 000022ea: PUSH0 000022eb: DUP5 000022ec: DUP7 000022ed: DUP9 000022ee: MULMOD 000022ef: PUSH0 000022f0: DUP7 000022f1: DUP2 000022f2: SUB 000022f3: DUP8 000022f4: AND 000022f5: SWAP7 000022f6: DUP8 000022f7: SWAP1 000022f8: DIV 000022f9: SWAP7 000022fa: PUSH1 0x02 000022fc: PUSH1 0x03 000022fe: DUP10 000022ff: MUL 00002300: DUP2 00002301: XOR 00002302: DUP1 00002303: DUP11 00002304: MUL 00002305: DUP3 00002306: SUB 00002307: MUL 00002308: DUP1 00002309: DUP11 0000230a: MUL 0000230b: DUP3 0000230c: SUB 0000230d: MUL 0000230e: DUP1 0000230f: DUP11 00002310: MUL 00002311: DUP3 00002312: SUB 00002313: MUL 00002314: DUP1 00002315: DUP11 00002316: MUL 00002317: DUP3 00002318: SUB 00002319: MUL 0000231a: DUP1 0000231b: DUP11 0000231c: MUL 0000231d: DUP3 0000231e: SUB 0000231f: MUL 00002320: DUP1 00002321: DUP11 00002322: MUL 00002323: SWAP1 00002324: SWAP2 00002325: SUB 00002326: MUL 00002327: SWAP2 00002328: DUP2 00002329: SWAP1 0000232a: SUB 0000232b: DUP2 0000232c: SWAP1 0000232d: DIV 0000232e: PUSH1 0x01 00002330: ADD 00002331: DUP6 00002332: DUP5 00002333: GT 00002334: SWAP1 00002335: SWAP7 00002336: SUB 00002337: SWAP6 00002338: SWAP1 00002339: SWAP6 0000233a: MUL 0000233b: SWAP2 0000233c: SWAP1 0000233d: SWAP4 0000233e: SUB 0000233f: SWAP4 00002340: SWAP1 00002341: SWAP4 00002342: DIV 00002343: SWAP3 00002344: SWAP1 00002345: SWAP3 00002346: OR 00002347: MUL 00002348: SWAP2 00002349: POP 0000234a: POP 0000234b: SWAP4 0000234c: SWAP3 0000234d: POP 0000234e: POP 0000234f: POP 00002350: JUMP 00002351: JUMPDEST 00002352: PUSH0 00002353: PUSH1 0x01 00002355: PUSH1 0x01 00002357: PUSH1 0xe0 00002359: SHL 0000235a: SUB 0000235b: NOT 0000235c: DUP3 0000235d: AND 0000235e: PUSH4 0x7965db0b 00002363: PUSH1 0xe0 00002365: SHL 00002366: EQ 00002367: DUP1 00002368: PUSH2 0x0bc7 0000236b: JUMPI 0000236c: POP 0000236d: PUSH4 0x01ffc9a7 00002372: PUSH1 0xe0 00002374: SHL 00002375: PUSH1 0x01 00002377: PUSH1 0x01 00002379: PUSH1 0xe0 0000237b: SHL 0000237c: SUB 0000237d: NOT 0000237e: DUP4 0000237f: AND 00002380: EQ 00002381: PUSH2 0x0bc7 00002384: JUMP 00002385: JUMPDEST 00002386: PUSH2 0x0d1f 00002389: DUP2 0000238a: CALLER 0000238b: PUSH2 0x27c1 0000238e: JUMP 0000238f: JUMPDEST 00002390: PUSH0 00002391: PUSH2 0x239a 00002394: DUP4 00002395: DUP4 00002396: PUSH2 0x27fe 00002399: JUMP 0000239a: JUMPDEST 0000239b: ISZERO 0000239c: PUSH2 0x2401 0000239f: JUMPI 000023a0: PUSH2 0x23c9 000023a3: PUSH32 0x062030953ce644a2a7115259790ad01d3c2b5e8c98fc6b190da443a3f0a7c900 000023c4: DUP5 000023c5: PUSH2 0x2840 000023c8: JUMP 000023c9: JUMPDEST 000023ca: ISZERO 000023cb: PUSH2 0x23f9 000023ce: JUMPI 000023cf: PUSH1 0x40 000023d1: MLOAD 000023d2: DUP4 000023d3: SWAP1 000023d4: PUSH32 0xea0f1c470fa813c725756c036120b6688028969f5afbc607918fcd1ff9229435 000023f5: SWAP1 000023f6: PUSH0 000023f7: SWAP1 000023f8: LOG2 000023f9: JUMPDEST 000023fa: POP 000023fb: PUSH1 0x01 000023fd: PUSH2 0x0bc7 00002400: JUMP 00002401: JUMPDEST 00002402: POP 00002403: PUSH0 00002404: SWAP3 00002405: SWAP2 00002406: POP 00002407: POP 00002408: JUMP 00002409: JUMPDEST 0000240a: PUSH0 0000240b: PUSH2 0x2414 0000240e: DUP4 0000240f: DUP4 00002410: PUSH2 0x284b 00002413: JUMP 00002414: JUMPDEST 00002415: ISZERO 00002416: PUSH2 0x2401 00002419: JUMPI 0000241a: PUSH2 0x2422 0000241d: DUP4 0000241e: PUSH2 0x16c1 00002421: JUMP 00002422: JUMPDEST 00002423: PUSH0 00002424: SUB 00002425: PUSH2 0x23f9 00002428: JUMPI 00002429: PUSH2 0x2452 0000242c: PUSH32 0x062030953ce644a2a7115259790ad01d3c2b5e8c98fc6b190da443a3f0a7c900 0000244d: DUP5 0000244e: PUSH2 0x2884 00002451: JUMP 00002452: JUMPDEST 00002453: POP 00002454: PUSH1 0x40 00002456: MLOAD 00002457: DUP4 00002458: SWAP1 00002459: PUSH32 0x4c9a714f78b79aa08074addab7cbdb196cccdf6d67efbf0b99914db8a6b08e73 0000247a: SWAP1 0000247b: PUSH0 0000247c: SWAP1 0000247d: LOG2 0000247e: POP 0000247f: PUSH1 0x01 00002481: PUSH2 0x0bc7 00002484: JUMP 00002485: JUMPDEST 00002486: PUSH0 00002487: PUSH2 0x0bc7 0000248a: DUP3 0000248b: SLOAD 0000248c: SWAP1 0000248d: JUMP 0000248e: JUMPDEST 0000248f: PUSH0 00002490: DUP1 00002491: PUSH32 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00 000024b2: PUSH2 0x0bc7 000024b5: JUMP 000024b6: JUMPDEST 000024b7: PUSH1 0x40 000024b9: DUP1 000024ba: MLOAD 000024bb: PUSH1 0x01 000024bd: PUSH1 0x01 000024bf: PUSH1 0xa0 000024c1: SHL 000024c2: SUB 000024c3: DUP5 000024c4: AND 000024c5: PUSH1 0x24 000024c7: DUP3 000024c8: ADD 000024c9: MSTORE 000024ca: PUSH1 0x44 000024cc: DUP1 000024cd: DUP3 000024ce: ADD 000024cf: DUP5 000024d0: SWAP1 000024d1: MSTORE 000024d2: DUP3 000024d3: MLOAD 000024d4: DUP1 000024d5: DUP4 000024d6: SUB 000024d7: SWAP1 000024d8: SWAP2 000024d9: ADD 000024da: DUP2 000024db: MSTORE 000024dc: PUSH1 0x64 000024de: SWAP1 000024df: SWAP2 000024e0: ADD 000024e1: SWAP1 000024e2: SWAP2 000024e3: MSTORE 000024e4: PUSH1 0x20 000024e6: DUP2 000024e7: ADD 000024e8: DUP1 000024e9: MLOAD 000024ea: PUSH1 0x01 000024ec: PUSH1 0x01 000024ee: PUSH1 0xe0 000024f0: SHL 000024f1: SUB 000024f2: AND 000024f3: PUSH4 0x095ea7b3 000024f8: PUSH1 0xe0 000024fa: SHL 000024fb: OR 000024fc: SWAP1 000024fd: MSTORE 000024fe: PUSH2 0x2507 00002501: DUP5 00002502: DUP3 00002503: PUSH2 0x288f 00002506: JUMP 00002507: JUMPDEST 00002508: PUSH2 0x0b9d 0000250b: JUMPI 0000250c: PUSH1 0x40 0000250e: MLOAD 0000250f: PUSH1 0x01 00002511: PUSH1 0x01 00002513: PUSH1 0xa0 00002515: SHL 00002516: SUB 00002517: DUP5 00002518: DUP2 00002519: AND 0000251a: PUSH1 0x24 0000251c: DUP4 0000251d: ADD 0000251e: MSTORE 0000251f: PUSH0 00002520: PUSH1 0x44 00002522: DUP4 00002523: ADD 00002524: MSTORE 00002525: PUSH2 0x2569 00002528: SWAP2 00002529: DUP7 0000252a: SWAP2 0000252b: DUP3 0000252c: AND 0000252d: SWAP1 0000252e: PUSH4 0x095ea7b3 00002533: SWAP1 00002534: PUSH1 0x64 00002536: ADD 00002537: JUMPDEST 00002538: PUSH1 0x40 0000253a: MLOAD 0000253b: PUSH1 0x20 0000253d: DUP2 0000253e: DUP4 0000253f: SUB 00002540: SUB 00002541: DUP2 00002542: MSTORE 00002543: SWAP1 00002544: PUSH1 0x40 00002546: MSTORE 00002547: SWAP2 00002548: POP 00002549: PUSH1 0xe0 0000254b: SHL 0000254c: PUSH1 0x20 0000254e: DUP3 0000254f: ADD 00002550: DUP1 00002551: MLOAD 00002552: PUSH1 0x01 00002554: PUSH1 0x01 00002556: PUSH1 0xe0 00002558: SHL 00002559: SUB 0000255a: DUP4 0000255b: DUP2 0000255c: DUP4 0000255d: AND 0000255e: OR 0000255f: DUP4 00002560: MSTORE 00002561: POP 00002562: POP 00002563: POP 00002564: POP 00002565: PUSH2 0x28d4 00002568: JUMP 00002569: JUMPDEST 0000256a: PUSH2 0x0b9d 0000256d: DUP5 0000256e: DUP3 0000256f: PUSH2 0x28d4 00002572: JUMP 00002573: JUMPDEST 00002574: PUSH0 00002575: DUP2 00002576: DUP2 00002577: MSTORE 00002578: PUSH1 0x01 0000257a: DUP4 0000257b: ADD 0000257c: PUSH1 0x20 0000257e: MSTORE 0000257f: PUSH1 0x40 00002581: DUP2 00002582: KECCAK256 00002583: SLOAD 00002584: ISZERO 00002585: ISZERO 00002586: PUSH2 0x15de 00002589: JUMP 0000258a: JUMPDEST 0000258b: PUSH20 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed 000025a0: NOT 000025a1: PUSH1 0x01 000025a3: PUSH1 0x01 000025a5: PUSH1 0xa0 000025a7: SHL 000025a8: SUB 000025a9: DUP5 000025aa: AND 000025ab: ADD 000025ac: PUSH2 0x25cf 000025af: JUMPI 000025b0: DUP1 000025b1: CALLVALUE 000025b2: EQ 000025b3: PUSH2 0x0d71 000025b6: JUMPI 000025b7: PUSH1 0x40 000025b9: MLOAD 000025ba: PUSH4 0x2a9ffab7 000025bf: PUSH1 0xe2 000025c1: SHL 000025c2: DUP2 000025c3: MSTORE 000025c4: PUSH1 0x04 000025c6: ADD 000025c7: PUSH1 0x40 000025c9: MLOAD 000025ca: DUP1 000025cb: SWAP2 000025cc: SUB 000025cd: SWAP1 000025ce: REVERT 000025cf: JUMPDEST 000025d0: PUSH2 0x0d71 000025d3: PUSH1 0x01 000025d5: PUSH1 0x01 000025d7: PUSH1 0xa0 000025d9: SHL 000025da: SUB 000025db: DUP5 000025dc: AND 000025dd: DUP4 000025de: ADDRESS 000025df: DUP5 000025e0: PUSH2 0x2940 000025e3: JUMP 000025e4: JUMPDEST 000025e5: PUSH20 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed 000025fa: NOT 000025fb: PUSH1 0x01 000025fd: PUSH1 0x01 000025ff: PUSH1 0xa0 00002601: SHL 00002602: SUB 00002603: DUP5 00002604: AND 00002605: ADD 00002606: PUSH2 0x2613 00002609: JUMPI 0000260a: PUSH2 0x0d71 0000260d: DUP3 0000260e: DUP3 0000260f: PUSH2 0x2979 00002612: JUMP 00002613: JUMPDEST 00002614: PUSH2 0x0d71 00002617: PUSH1 0x01 00002619: PUSH1 0x01 0000261b: PUSH1 0xa0 0000261d: SHL 0000261e: SUB 0000261f: DUP5 00002620: AND 00002621: DUP4 00002622: DUP4 00002623: PUSH2 0x2a05 00002626: JUMP 00002627: JUMPDEST 00002628: PUSH0 00002629: PUSH2 0x15de 0000262c: DUP4 0000262d: DUP4 0000262e: PUSH2 0x2a36 00002631: JUMP 00002632: JUMPDEST 00002633: PUSH1 0x60 00002635: PUSH0 00002636: PUSH2 0x15de 00002639: DUP4 0000263a: PUSH2 0x2a5c 0000263d: JUMP 0000263e: JUMPDEST 0000263f: PUSH32 0x9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00 00002660: DUP1 00002661: SLOAD 00002662: PUSH1 0x01 00002664: NOT 00002665: ADD 00002666: PUSH2 0x2682 00002669: JUMPI 0000266a: PUSH1 0x40 0000266c: MLOAD 0000266d: PUSH4 0x3ee5aeb5 00002672: PUSH1 0xe0 00002674: SHL 00002675: DUP2 00002676: MSTORE 00002677: PUSH1 0x04 00002679: ADD 0000267a: PUSH1 0x40 0000267c: MLOAD 0000267d: DUP1 0000267e: SWAP2 0000267f: SUB 00002680: SWAP1 00002681: REVERT 00002682: JUMPDEST 00002683: PUSH1 0x02 00002685: SWAP1 00002686: SSTORE 00002687: JUMP 00002688: JUMPDEST 00002689: PUSH1 0x60 0000268b: PUSH2 0x15de 0000268e: DUP4 0000268f: DUP4 00002690: PUSH0 00002691: JUMPDEST 00002692: PUSH1 0x60 00002694: DUP2 00002695: SELFBALANCE 00002696: LT 00002697: ISZERO 00002698: PUSH2 0x26bd 0000269b: JUMPI 0000269c: PUSH1 0x40 0000269e: MLOAD 0000269f: PUSH4 0xcf479181 000026a4: PUSH1 0xe0 000026a6: SHL 000026a7: DUP2 000026a8: MSTORE 000026a9: SELFBALANCE 000026aa: PUSH1 0x04 000026ac: DUP3 000026ad: ADD 000026ae: MSTORE 000026af: PUSH1 0x24 000026b1: DUP2 000026b2: ADD 000026b3: DUP4 000026b4: SWAP1 000026b5: MSTORE 000026b6: PUSH1 0x44 000026b8: ADD 000026b9: PUSH2 0x08ec 000026bc: JUMP 000026bd: JUMPDEST 000026be: PUSH0 000026bf: DUP1 000026c0: DUP6 000026c1: PUSH1 0x01 000026c3: PUSH1 0x01 000026c5: PUSH1 0xa0 000026c7: SHL 000026c8: SUB 000026c9: AND 000026ca: DUP5 000026cb: DUP7 000026cc: PUSH1 0x40 000026ce: MLOAD 000026cf: PUSH2 0x26d8 000026d2: SWAP2 000026d3: SWAP1 000026d4: PUSH2 0x3683 000026d7: JUMP 000026d8: JUMPDEST 000026d9: PUSH0 000026da: PUSH1 0x40 000026dc: MLOAD 000026dd: DUP1 000026de: DUP4 000026df: SUB 000026e0: DUP2 000026e1: DUP6 000026e2: DUP8 000026e3: GAS 000026e4: CALL 000026e5: SWAP3 000026e6: POP 000026e7: POP 000026e8: POP 000026e9: RETURNDATASIZE 000026ea: DUP1 000026eb: PUSH0 000026ec: DUP2 000026ed: EQ 000026ee: PUSH2 0x2712 000026f1: JUMPI 000026f2: PUSH1 0x40 000026f4: MLOAD 000026f5: SWAP2 000026f6: POP 000026f7: PUSH1 0x1f 000026f9: NOT 000026fa: PUSH1 0x3f 000026fc: RETURNDATASIZE 000026fd: ADD 000026fe: AND 000026ff: DUP3 00002700: ADD 00002701: PUSH1 0x40 00002703: MSTORE 00002704: RETURNDATASIZE 00002705: DUP3 00002706: MSTORE 00002707: RETURNDATASIZE 00002708: PUSH0 00002709: PUSH1 0x20 0000270b: DUP5 0000270c: ADD 0000270d: RETURNDATACOPY 0000270e: PUSH2 0x2717 00002711: JUMP 00002712: JUMPDEST 00002713: PUSH1 0x60 00002715: SWAP2 00002716: POP 00002717: JUMPDEST 00002718: POP 00002719: SWAP2 0000271a: POP 0000271b: SWAP2 0000271c: POP 0000271d: PUSH2 0x2727 00002720: DUP7 00002721: DUP4 00002722: DUP4 00002723: PUSH2 0x2ab5 00002726: JUMP 00002727: JUMPDEST 00002728: SWAP7 00002729: SWAP6 0000272a: POP 0000272b: POP 0000272c: POP 0000272d: POP 0000272e: POP 0000272f: POP 00002730: JUMP 00002731: JUMPDEST 00002732: PUSH1 0x38 00002734: DUP5 00002735: MLOAD 00002736: EQ 00002737: PUSH2 0x2782 0000273a: JUMPI 0000273b: PUSH1 0x40 0000273d: MLOAD 0000273e: PUSH3 0x461bcd 00002742: PUSH1 0xe5 00002744: SHL 00002745: DUP2 00002746: MSTORE 00002747: PUSH1 0x20 00002749: PUSH1 0x04 0000274b: DUP3 0000274c: ADD 0000274d: MSTORE 0000274e: PUSH1 0x19 00002750: PUSH1 0x24 00002752: DUP3 00002753: ADD 00002754: MSTORE 00002755: PUSH32 0x475076323a2075696420627566666572206f766572666c6f7700000000000000 00002776: PUSH1 0x44 00002778: DUP3 00002779: ADD 0000277a: MSTORE 0000277b: PUSH1 0x64 0000277d: ADD 0000277e: PUSH2 0x08ec 00002781: JUMP 00002782: JUMPDEST 00002783: PUSH1 0x38 00002785: DUP5 00002786: ADD 00002787: MSTORE 00002788: PUSH1 0x34 0000278a: DUP4 0000278b: ADD 0000278c: MSTORE 0000278d: PUSH1 0x20 0000278f: SWAP1 00002790: SWAP2 00002791: ADD 00002792: MSTORE 00002793: JUMP 00002794: JUMPDEST 00002795: PUSH0 00002796: DUP1 00002797: PUSH0 00002798: NOT 00002799: DUP4 0000279a: DUP6 0000279b: MULMOD 0000279c: SWAP4 0000279d: SWAP1 0000279e: SWAP3 0000279f: MUL 000027a0: DUP1 000027a1: DUP5 000027a2: LT 000027a3: SWAP4 000027a4: DUP2 000027a5: SWAP1 000027a6: SUB 000027a7: SWAP4 000027a8: SWAP1 000027a9: SWAP4 000027aa: SUB 000027ab: SWAP4 000027ac: SWAP2 000027ad: POP 000027ae: POP 000027af: JUMP 000027b0: JUMPDEST 000027b1: PUSH4 0x4e487b71 000027b6: PUSH0 000027b7: MSTORE 000027b8: DUP1 000027b9: PUSH1 0x20 000027bb: MSTORE 000027bc: PUSH1 0x24 000027be: PUSH1 0x1c 000027c0: REVERT 000027c1: JUMPDEST 000027c2: PUSH2 0x27cb 000027c5: DUP3 000027c6: DUP3 000027c7: PUSH2 0x1554 000027ca: JUMP 000027cb: JUMPDEST 000027cc: PUSH2 0x27fa 000027cf: JUMPI 000027d0: PUSH1 0x40 000027d2: MLOAD 000027d3: PUSH4 0xe2517d3f 000027d8: PUSH1 0xe0 000027da: SHL 000027db: DUP2 000027dc: MSTORE 000027dd: PUSH1 0x01 000027df: PUSH1 0x01 000027e1: PUSH1 0xa0 000027e3: SHL 000027e4: SUB 000027e5: DUP3 000027e6: AND 000027e7: PUSH1 0x04 000027e9: DUP3 000027ea: ADD 000027eb: MSTORE 000027ec: PUSH1 0x24 000027ee: DUP2 000027ef: ADD 000027f0: DUP4 000027f1: SWAP1 000027f2: MSTORE 000027f3: PUSH1 0x44 000027f5: ADD 000027f6: PUSH2 0x08ec 000027f9: JUMP 000027fa: JUMPDEST 000027fb: POP 000027fc: POP 000027fd: JUMP 000027fe: JUMPDEST 000027ff: PUSH0 00002800: PUSH0 00002801: DUP1 00002802: MLOAD 00002803: PUSH1 0x20 00002805: PUSH2 0x36ae 00002808: DUP4 00002809: CODECOPY 0000280a: DUP2 0000280b: MLOAD 0000280c: SWAP2 0000280d: MSTORE 0000280e: DUP2 0000280f: PUSH2 0x2818 00002812: DUP6 00002813: DUP6 00002814: PUSH2 0x2b11 00002817: JUMP 00002818: JUMPDEST 00002819: SWAP1 0000281a: POP 0000281b: DUP1 0000281c: ISZERO 0000281d: PUSH2 0x13d9 00002820: JUMPI 00002821: PUSH0 00002822: DUP6 00002823: DUP2 00002824: MSTORE 00002825: PUSH1 0x20 00002827: DUP4 00002828: SWAP1 00002829: MSTORE 0000282a: PUSH1 0x40 0000282c: SWAP1 0000282d: KECCAK256 0000282e: PUSH2 0x2837 00002831: SWAP1 00002832: DUP6 00002833: PUSH2 0x2bb2 00002836: JUMP 00002837: JUMPDEST 00002838: POP 00002839: SWAP5 0000283a: SWAP4 0000283b: POP 0000283c: POP 0000283d: POP 0000283e: POP 0000283f: JUMP 00002840: JUMPDEST 00002841: PUSH0 00002842: PUSH2 0x15de 00002845: DUP4 00002846: DUP4 00002847: PUSH2 0x2bc2 0000284a: JUMP 0000284b: JUMPDEST 0000284c: PUSH0 0000284d: PUSH0 0000284e: DUP1 0000284f: MLOAD 00002850: PUSH1 0x20 00002852: PUSH2 0x36ae 00002855: DUP4 00002856: CODECOPY 00002857: DUP2 00002858: MLOAD 00002859: SWAP2 0000285a: MSTORE 0000285b: DUP2 0000285c: PUSH2 0x2865 0000285f: DUP6 00002860: DUP6 00002861: PUSH2 0x2c0e 00002864: JUMP 00002865: JUMPDEST 00002866: SWAP1 00002867: POP 00002868: DUP1 00002869: ISZERO 0000286a: PUSH2 0x13d9 0000286d: JUMPI 0000286e: PUSH0 0000286f: DUP6 00002870: DUP2 00002871: MSTORE 00002872: PUSH1 0x20 00002874: DUP4 00002875: SWAP1 00002876: MSTORE 00002877: PUSH1 0x40 00002879: SWAP1 0000287a: KECCAK256 0000287b: PUSH2 0x2837 0000287e: SWAP1 0000287f: DUP6 00002880: PUSH2 0x2c87 00002883: JUMP 00002884: JUMPDEST 00002885: PUSH0 00002886: PUSH2 0x15de 00002889: DUP4 0000288a: DUP4 0000288b: PUSH2 0x2c97 0000288e: JUMP 0000288f: JUMPDEST 00002890: PUSH0 00002891: DUP1 00002892: PUSH0 00002893: DUP1 00002894: PUSH1 0x20 00002896: PUSH0 00002897: DUP7 00002898: MLOAD 00002899: PUSH1 0x20 0000289b: DUP9 0000289c: ADD 0000289d: PUSH0 0000289e: DUP11 0000289f: GAS 000028a0: CALL 000028a1: SWAP3 000028a2: POP 000028a3: RETURNDATASIZE 000028a4: SWAP2 000028a5: POP 000028a6: PUSH0 000028a7: MLOAD 000028a8: SWAP1 000028a9: POP 000028aa: DUP3 000028ab: DUP1 000028ac: ISZERO 000028ad: PUSH2 0x2727 000028b0: JUMPI 000028b1: POP 000028b2: DUP2 000028b3: ISZERO 000028b4: PUSH2 0x28c0 000028b7: JUMPI 000028b8: DUP1 000028b9: PUSH1 0x01 000028bb: EQ 000028bc: PUSH2 0x2727 000028bf: JUMP 000028c0: JUMPDEST 000028c1: POP 000028c2: POP 000028c3: POP 000028c4: POP 000028c5: POP 000028c6: PUSH1 0x01 000028c8: PUSH1 0x01 000028ca: PUSH1 0xa0 000028cc: SHL 000028cd: SUB 000028ce: AND 000028cf: EXTCODESIZE 000028d0: ISZERO 000028d1: ISZERO 000028d2: SWAP1 000028d3: JUMP 000028d4: JUMPDEST 000028d5: PUSH0 000028d6: DUP1 000028d7: PUSH1 0x20 000028d9: PUSH0 000028da: DUP5 000028db: MLOAD 000028dc: PUSH1 0x20 000028de: DUP7 000028df: ADD 000028e0: PUSH0 000028e1: DUP9 000028e2: GAS 000028e3: CALL 000028e4: DUP1 000028e5: PUSH2 0x28f3 000028e8: JUMPI 000028e9: PUSH1 0x40 000028eb: MLOAD 000028ec: RETURNDATASIZE 000028ed: PUSH0 000028ee: DUP3 000028ef: RETURNDATACOPY 000028f0: RETURNDATASIZE 000028f1: DUP2 000028f2: REVERT 000028f3: JUMPDEST 000028f4: POP 000028f5: POP 000028f6: PUSH0 000028f7: MLOAD 000028f8: RETURNDATASIZE 000028f9: SWAP2 000028fa: POP 000028fb: DUP2 000028fc: ISZERO 000028fd: PUSH2 0x290a 00002900: JUMPI 00002901: DUP1 00002902: PUSH1 0x01 00002904: EQ 00002905: ISZERO 00002906: PUSH2 0x2917 00002909: JUMP 0000290a: JUMPDEST 0000290b: PUSH1 0x01 0000290d: PUSH1 0x01 0000290f: PUSH1 0xa0 00002911: SHL 00002912: SUB 00002913: DUP5 00002914: AND 00002915: EXTCODESIZE 00002916: ISZERO 00002917: JUMPDEST 00002918: ISZERO 00002919: PUSH2 0x0b9d 0000291c: JUMPI 0000291d: PUSH1 0x40 0000291f: MLOAD 00002920: PUSH4 0x5274afe7 00002925: PUSH1 0xe0 00002927: SHL 00002928: DUP2 00002929: MSTORE 0000292a: PUSH1 0x01 0000292c: PUSH1 0x01 0000292e: PUSH1 0xa0 00002930: SHL 00002931: SUB 00002932: DUP6 00002933: AND 00002934: PUSH1 0x04 00002936: DUP3 00002937: ADD 00002938: MSTORE 00002939: PUSH1 0x24 0000293b: ADD 0000293c: PUSH2 0x08ec 0000293f: JUMP 00002940: JUMPDEST 00002941: PUSH1 0x40 00002943: MLOAD 00002944: PUSH1 0x01 00002946: PUSH1 0x01 00002948: PUSH1 0xa0 0000294a: SHL 0000294b: SUB 0000294c: DUP5 0000294d: DUP2 0000294e: AND 0000294f: PUSH1 0x24 00002951: DUP4 00002952: ADD 00002953: MSTORE 00002954: DUP4 00002955: DUP2 00002956: AND 00002957: PUSH1 0x44 00002959: DUP4 0000295a: ADD 0000295b: MSTORE 0000295c: PUSH1 0x64 0000295e: DUP3 0000295f: ADD 00002960: DUP4 00002961: SWAP1 00002962: MSTORE 00002963: PUSH2 0x0b9d 00002966: SWAP2 00002967: DUP7 00002968: SWAP2 00002969: DUP3 0000296a: AND 0000296b: SWAP1 0000296c: PUSH4 0x23b872dd 00002971: SWAP1 00002972: PUSH1 0x84 00002974: ADD 00002975: PUSH2 0x2537 00002978: JUMP 00002979: JUMPDEST 0000297a: DUP1 0000297b: SELFBALANCE 0000297c: LT 0000297d: ISZERO 0000297e: PUSH2 0x29a3 00002981: JUMPI 00002982: PUSH1 0x40 00002984: MLOAD 00002985: PUSH4 0xcf479181 0000298a: PUSH1 0xe0 0000298c: SHL 0000298d: DUP2 0000298e: MSTORE 0000298f: SELFBALANCE 00002990: PUSH1 0x04 00002992: DUP3 00002993: ADD 00002994: MSTORE 00002995: PUSH1 0x24 00002997: DUP2 00002998: ADD 00002999: DUP3 0000299a: SWAP1 0000299b: MSTORE 0000299c: PUSH1 0x44 0000299e: ADD 0000299f: PUSH2 0x08ec 000029a2: JUMP 000029a3: JUMPDEST 000029a4: PUSH0 000029a5: DUP1 000029a6: DUP4 000029a7: PUSH1 0x01 000029a9: PUSH1 0x01 000029ab: PUSH1 0xa0 000029ad: SHL 000029ae: SUB 000029af: AND 000029b0: DUP4 000029b1: PUSH1 0x40 000029b3: MLOAD 000029b4: PUSH0 000029b5: PUSH1 0x40 000029b7: MLOAD 000029b8: DUP1 000029b9: DUP4 000029ba: SUB 000029bb: DUP2 000029bc: DUP6 000029bd: DUP8 000029be: GAS 000029bf: CALL 000029c0: SWAP3 000029c1: POP 000029c2: POP 000029c3: POP 000029c4: RETURNDATASIZE 000029c5: DUP1 000029c6: PUSH0 000029c7: DUP2 000029c8: EQ 000029c9: PUSH2 0x29ed 000029cc: JUMPI 000029cd: PUSH1 0x40 000029cf: MLOAD 000029d0: SWAP2 000029d1: POP 000029d2: PUSH1 0x1f 000029d4: NOT 000029d5: PUSH1 0x3f 000029d7: RETURNDATASIZE 000029d8: ADD 000029d9: AND 000029da: DUP3 000029db: ADD 000029dc: PUSH1 0x40 000029de: MSTORE 000029df: RETURNDATASIZE 000029e0: DUP3 000029e1: MSTORE 000029e2: RETURNDATASIZE 000029e3: PUSH0 000029e4: PUSH1 0x20 000029e6: DUP5 000029e7: ADD 000029e8: RETURNDATACOPY 000029e9: PUSH2 0x29f2 000029ec: JUMP 000029ed: JUMPDEST 000029ee: PUSH1 0x60 000029f0: SWAP2 000029f1: POP 000029f2: JUMPDEST 000029f3: POP 000029f4: SWAP2 000029f5: POP 000029f6: SWAP2 000029f7: POP 000029f8: DUP2 000029f9: PUSH2 0x0b9d 000029fc: JUMPI 000029fd: PUSH2 0x0b9d 00002a00: DUP2 00002a01: PUSH2 0x2d71 00002a04: JUMP 00002a05: JUMPDEST 00002a06: PUSH1 0x40 00002a08: MLOAD 00002a09: PUSH1 0x01 00002a0b: PUSH1 0x01 00002a0d: PUSH1 0xa0 00002a0f: SHL 00002a10: SUB 00002a11: DUP4 00002a12: DUP2 00002a13: AND 00002a14: PUSH1 0x24 00002a16: DUP4 00002a17: ADD 00002a18: MSTORE 00002a19: PUSH1 0x44 00002a1b: DUP3 00002a1c: ADD 00002a1d: DUP4 00002a1e: SWAP1 00002a1f: MSTORE 00002a20: PUSH2 0x0d71 00002a23: SWAP2 00002a24: DUP6 00002a25: SWAP2 00002a26: DUP3 00002a27: AND 00002a28: SWAP1 00002a29: PUSH4 0xa9059cbb 00002a2e: SWAP1 00002a2f: PUSH1 0x64 00002a31: ADD 00002a32: PUSH2 0x2537 00002a35: JUMP 00002a36: JUMPDEST 00002a37: PUSH0 00002a38: DUP3 00002a39: PUSH0 00002a3a: ADD 00002a3b: DUP3 00002a3c: DUP2 00002a3d: SLOAD 00002a3e: DUP2 00002a3f: LT 00002a40: PUSH2 0x2a4b 00002a43: JUMPI 00002a44: PUSH2 0x2a4b 00002a47: PUSH2 0x3317 00002a4a: JUMP 00002a4b: JUMPDEST 00002a4c: SWAP1 00002a4d: PUSH0 00002a4e: MSTORE 00002a4f: PUSH1 0x20 00002a51: PUSH0 00002a52: KECCAK256 00002a53: ADD 00002a54: SLOAD 00002a55: SWAP1 00002a56: POP 00002a57: SWAP3 00002a58: SWAP2 00002a59: POP 00002a5a: POP 00002a5b: JUMP 00002a5c: JUMPDEST 00002a5d: PUSH1 0x60 00002a5f: DUP2 00002a60: PUSH0 00002a61: ADD 00002a62: DUP1 00002a63: SLOAD 00002a64: DUP1 00002a65: PUSH1 0x20 00002a67: MUL 00002a68: PUSH1 0x20 00002a6a: ADD 00002a6b: PUSH1 0x40 00002a6d: MLOAD 00002a6e: SWAP1 00002a6f: DUP2 00002a70: ADD 00002a71: PUSH1 0x40 00002a73: MSTORE 00002a74: DUP1 00002a75: SWAP3 00002a76: SWAP2 00002a77: SWAP1 00002a78: DUP2 00002a79: DUP2 00002a7a: MSTORE 00002a7b: PUSH1 0x20 00002a7d: ADD 00002a7e: DUP3 00002a7f: DUP1 00002a80: SLOAD 00002a81: DUP1 00002a82: ISZERO 00002a83: PUSH2 0x2aa9 00002a86: JUMPI 00002a87: PUSH1 0x20 00002a89: MUL 00002a8a: DUP3 00002a8b: ADD 00002a8c: SWAP2 00002a8d: SWAP1 00002a8e: PUSH0 00002a8f: MSTORE 00002a90: PUSH1 0x20 00002a92: PUSH0 00002a93: KECCAK256 00002a94: SWAP1 00002a95: JUMPDEST 00002a96: DUP2 00002a97: SLOAD 00002a98: DUP2 00002a99: MSTORE 00002a9a: PUSH1 0x20 00002a9c: ADD 00002a9d: SWAP1 00002a9e: PUSH1 0x01 00002aa0: ADD 00002aa1: SWAP1 00002aa2: DUP1 00002aa3: DUP4 00002aa4: GT 00002aa5: PUSH2 0x2a95 00002aa8: JUMPI 00002aa9: JUMPDEST 00002aaa: POP 00002aab: POP 00002aac: POP 00002aad: POP 00002aae: POP 00002aaf: SWAP1 00002ab0: POP 00002ab1: SWAP2 00002ab2: SWAP1 00002ab3: POP 00002ab4: JUMP 00002ab5: JUMPDEST 00002ab6: PUSH1 0x60 00002ab8: DUP3 00002ab9: PUSH2 0x2aca 00002abc: JUMPI 00002abd: PUSH2 0x2ac5 00002ac0: DUP3 00002ac1: PUSH2 0x2d71 00002ac4: JUMP 00002ac5: JUMPDEST 00002ac6: PUSH2 0x15de 00002ac9: JUMP 00002aca: JUMPDEST 00002acb: DUP2 00002acc: MLOAD 00002acd: ISZERO 00002ace: DUP1 00002acf: ISZERO 00002ad0: PUSH2 0x2ae1 00002ad3: JUMPI 00002ad4: POP 00002ad5: PUSH1 0x01 00002ad7: PUSH1 0x01 00002ad9: PUSH1 0xa0 00002adb: SHL 00002adc: SUB 00002add: DUP5 00002ade: AND 00002adf: EXTCODESIZE 00002ae0: ISZERO 00002ae1: JUMPDEST 00002ae2: ISZERO 00002ae3: PUSH2 0x2b0a 00002ae6: JUMPI 00002ae7: PUSH1 0x40 00002ae9: MLOAD 00002aea: PUSH4 0x9996b315 00002aef: PUSH1 0xe0 00002af1: SHL 00002af2: DUP2 00002af3: MSTORE 00002af4: PUSH1 0x01 00002af6: PUSH1 0x01 00002af8: PUSH1 0xa0 00002afa: SHL 00002afb: SUB 00002afc: DUP6 00002afd: AND 00002afe: PUSH1 0x04 00002b00: DUP3 00002b01: ADD 00002b02: MSTORE 00002b03: PUSH1 0x24 00002b05: ADD 00002b06: PUSH2 0x08ec 00002b09: JUMP 00002b0a: JUMPDEST 00002b0b: POP 00002b0c: DUP1 00002b0d: PUSH2 0x15de 00002b10: JUMP 00002b11: JUMPDEST 00002b12: PUSH0 00002b13: PUSH0 00002b14: DUP1 00002b15: MLOAD 00002b16: PUSH1 0x20 00002b18: PUSH2 0x36ee 00002b1b: DUP4 00002b1c: CODECOPY 00002b1d: DUP2 00002b1e: MLOAD 00002b1f: SWAP2 00002b20: MSTORE 00002b21: PUSH2 0x2b2a 00002b24: DUP5 00002b25: DUP5 00002b26: PUSH2 0x1554 00002b29: JUMP 00002b2a: JUMPDEST 00002b2b: PUSH2 0x2ba9 00002b2e: JUMPI 00002b2f: PUSH0 00002b30: DUP5 00002b31: DUP2 00002b32: MSTORE 00002b33: PUSH1 0x20 00002b35: DUP3 00002b36: DUP2 00002b37: MSTORE 00002b38: PUSH1 0x40 00002b3a: DUP1 00002b3b: DUP4 00002b3c: KECCAK256 00002b3d: PUSH1 0x01 00002b3f: PUSH1 0x01 00002b41: PUSH1 0xa0 00002b43: SHL 00002b44: SUB 00002b45: DUP8 00002b46: AND 00002b47: DUP5 00002b48: MSTORE 00002b49: SWAP1 00002b4a: SWAP2 00002b4b: MSTORE 00002b4c: SWAP1 00002b4d: KECCAK256 00002b4e: DUP1 00002b4f: SLOAD 00002b50: PUSH1 0xff 00002b52: NOT 00002b53: AND 00002b54: PUSH1 0x01 00002b56: OR 00002b57: SWAP1 00002b58: SSTORE 00002b59: PUSH2 0x2b5f 00002b5c: CALLER 00002b5d: SWAP1 00002b5e: JUMP 00002b5f: JUMPDEST 00002b60: PUSH1 0x01 00002b62: PUSH1 0x01 00002b64: PUSH1 0xa0 00002b66: SHL 00002b67: SUB 00002b68: AND 00002b69: DUP4 00002b6a: PUSH1 0x01 00002b6c: PUSH1 0x01 00002b6e: PUSH1 0xa0 00002b70: SHL 00002b71: SUB 00002b72: AND 00002b73: DUP6 00002b74: PUSH32 0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d 00002b95: PUSH1 0x40 00002b97: MLOAD 00002b98: PUSH1 0x40 00002b9a: MLOAD 00002b9b: DUP1 00002b9c: SWAP2 00002b9d: SUB 00002b9e: SWAP1 00002b9f: LOG4 00002ba0: PUSH1 0x01 00002ba2: SWAP2 00002ba3: POP 00002ba4: POP 00002ba5: PUSH2 0x0bc7 00002ba8: JUMP 00002ba9: JUMPDEST 00002baa: PUSH0 00002bab: SWAP2 00002bac: POP 00002bad: POP 00002bae: PUSH2 0x0bc7 00002bb1: JUMP 00002bb2: JUMPDEST 00002bb3: PUSH0 00002bb4: PUSH2 0x15de 00002bb7: DUP4 00002bb8: PUSH1 0x01 00002bba: PUSH1 0x01 00002bbc: PUSH1 0xa0 00002bbe: SHL 00002bbf: SUB 00002bc0: DUP5 00002bc1: AND 00002bc2: JUMPDEST 00002bc3: PUSH0 00002bc4: DUP2 00002bc5: DUP2 00002bc6: MSTORE 00002bc7: PUSH1 0x01 00002bc9: DUP4 00002bca: ADD 00002bcb: PUSH1 0x20 00002bcd: MSTORE 00002bce: PUSH1 0x40 00002bd0: DUP2 00002bd1: KECCAK256 00002bd2: SLOAD 00002bd3: PUSH2 0x2c07 00002bd6: JUMPI 00002bd7: POP 00002bd8: DUP2 00002bd9: SLOAD 00002bda: PUSH1 0x01 00002bdc: DUP2 00002bdd: DUP2 00002bde: ADD 00002bdf: DUP5 00002be0: SSTORE 00002be1: PUSH0 00002be2: DUP5 00002be3: DUP2 00002be4: MSTORE 00002be5: PUSH1 0x20 00002be7: DUP1 00002be8: DUP3 00002be9: KECCAK256 00002bea: SWAP1 00002beb: SWAP4 00002bec: ADD 00002bed: DUP5 00002bee: SWAP1 00002bef: SSTORE 00002bf0: DUP5 00002bf1: SLOAD 00002bf2: DUP5 00002bf3: DUP3 00002bf4: MSTORE 00002bf5: DUP3 00002bf6: DUP7 00002bf7: ADD 00002bf8: SWAP1 00002bf9: SWAP4 00002bfa: MSTORE 00002bfb: PUSH1 0x40 00002bfd: SWAP1 00002bfe: KECCAK256 00002bff: SWAP2 00002c00: SWAP1 00002c01: SWAP2 00002c02: SSTORE 00002c03: PUSH2 0x0bc7 00002c06: JUMP 00002c07: JUMPDEST 00002c08: POP 00002c09: PUSH0 00002c0a: PUSH2 0x0bc7 00002c0d: JUMP 00002c0e: JUMPDEST 00002c0f: PUSH0 00002c10: PUSH0 00002c11: DUP1 00002c12: MLOAD 00002c13: PUSH1 0x20 00002c15: PUSH2 0x36ee 00002c18: DUP4 00002c19: CODECOPY 00002c1a: DUP2 00002c1b: MLOAD 00002c1c: SWAP2 00002c1d: MSTORE 00002c1e: PUSH2 0x2c27 00002c21: DUP5 00002c22: DUP5 00002c23: PUSH2 0x1554 00002c26: JUMP 00002c27: JUMPDEST 00002c28: ISZERO 00002c29: PUSH2 0x2ba9 00002c2c: JUMPI 00002c2d: PUSH0 00002c2e: DUP5 00002c2f: DUP2 00002c30: MSTORE 00002c31: PUSH1 0x20 00002c33: DUP3 00002c34: DUP2 00002c35: MSTORE 00002c36: PUSH1 0x40 00002c38: DUP1 00002c39: DUP4 00002c3a: KECCAK256 00002c3b: PUSH1 0x01 00002c3d: PUSH1 0x01 00002c3f: PUSH1 0xa0 00002c41: SHL 00002c42: SUB 00002c43: DUP8 00002c44: AND 00002c45: DUP1 00002c46: DUP6 00002c47: MSTORE 00002c48: SWAP3 00002c49: MSTORE 00002c4a: DUP1 00002c4b: DUP4 00002c4c: KECCAK256 00002c4d: DUP1 00002c4e: SLOAD 00002c4f: PUSH1 0xff 00002c51: NOT 00002c52: AND 00002c53: SWAP1 00002c54: SSTORE 00002c55: MLOAD 00002c56: CALLER 00002c57: SWAP3 00002c58: DUP8 00002c59: SWAP2 00002c5a: PUSH32 0xf6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b 00002c7b: SWAP2 00002c7c: SWAP1 00002c7d: LOG4 00002c7e: PUSH1 0x01 00002c80: SWAP2 00002c81: POP 00002c82: POP 00002c83: PUSH2 0x0bc7 00002c86: JUMP 00002c87: JUMPDEST 00002c88: PUSH0 00002c89: PUSH2 0x15de 00002c8c: DUP4 00002c8d: PUSH1 0x01 00002c8f: PUSH1 0x01 00002c91: PUSH1 0xa0 00002c93: SHL 00002c94: SUB 00002c95: DUP5 00002c96: AND 00002c97: JUMPDEST 00002c98: PUSH0 00002c99: DUP2 00002c9a: DUP2 00002c9b: MSTORE 00002c9c: PUSH1 0x01 00002c9e: DUP4 00002c9f: ADD 00002ca0: PUSH1 0x20 00002ca2: MSTORE 00002ca3: PUSH1 0x40 00002ca5: DUP2 00002ca6: KECCAK256 00002ca7: SLOAD 00002ca8: DUP1 00002ca9: ISZERO 00002caa: PUSH2 0x2ba9 00002cad: JUMPI 00002cae: PUSH0 00002caf: PUSH2 0x2cb9 00002cb2: PUSH1 0x01 00002cb4: DUP4 00002cb5: PUSH2 0x33d9 00002cb8: JUMP 00002cb9: JUMPDEST 00002cba: DUP6 00002cbb: SLOAD 00002cbc: SWAP1 00002cbd: SWAP2 00002cbe: POP 00002cbf: PUSH0 00002cc0: SWAP1 00002cc1: PUSH2 0x2ccc 00002cc4: SWAP1 00002cc5: PUSH1 0x01 00002cc7: SWAP1 00002cc8: PUSH2 0x33d9 00002ccb: JUMP 00002ccc: JUMPDEST 00002ccd: SWAP1 00002cce: POP 00002ccf: DUP1 00002cd0: DUP3 00002cd1: EQ 00002cd2: PUSH2 0x2d2b 00002cd5: JUMPI 00002cd6: PUSH0 00002cd7: DUP7 00002cd8: PUSH0 00002cd9: ADD 00002cda: DUP3 00002cdb: DUP2 00002cdc: SLOAD 00002cdd: DUP2 00002cde: LT 00002cdf: PUSH2 0x2cea 00002ce2: JUMPI 00002ce3: PUSH2 0x2cea 00002ce6: PUSH2 0x3317 00002ce9: JUMP 00002cea: JUMPDEST 00002ceb: SWAP1 00002cec: PUSH0 00002ced: MSTORE 00002cee: PUSH1 0x20 00002cf0: PUSH0 00002cf1: KECCAK256 00002cf2: ADD 00002cf3: SLOAD 00002cf4: SWAP1 00002cf5: POP 00002cf6: DUP1 00002cf7: DUP8 00002cf8: PUSH0 00002cf9: ADD 00002cfa: DUP5 00002cfb: DUP2 00002cfc: SLOAD 00002cfd: DUP2 00002cfe: LT 00002cff: PUSH2 0x2d0a 00002d02: JUMPI 00002d03: PUSH2 0x2d0a 00002d06: PUSH2 0x3317 00002d09: JUMP 00002d0a: JUMPDEST 00002d0b: PUSH0 00002d0c: SWAP2 00002d0d: DUP3 00002d0e: MSTORE 00002d0f: PUSH1 0x20 00002d11: DUP1 00002d12: DUP4 00002d13: KECCAK256 00002d14: SWAP1 00002d15: SWAP2 00002d16: ADD 00002d17: SWAP3 00002d18: SWAP1 00002d19: SWAP3 00002d1a: SSTORE 00002d1b: SWAP2 00002d1c: DUP3 00002d1d: MSTORE 00002d1e: PUSH1 0x01 00002d20: DUP9 00002d21: ADD 00002d22: SWAP1 00002d23: MSTORE 00002d24: PUSH1 0x40 00002d26: SWAP1 00002d27: KECCAK256 00002d28: DUP4 00002d29: SWAP1 00002d2a: SSTORE 00002d2b: JUMPDEST 00002d2c: DUP6 00002d2d: SLOAD 00002d2e: DUP7 00002d2f: SWAP1 00002d30: DUP1 00002d31: PUSH2 0x2d3c 00002d34: JUMPI 00002d35: PUSH2 0x2d3c 00002d38: PUSH2 0x3699 00002d3b: JUMP 00002d3c: JUMPDEST 00002d3d: PUSH1 0x01 00002d3f: SWAP1 00002d40: SUB 00002d41: DUP2 00002d42: DUP2 00002d43: SWAP1 00002d44: PUSH0 00002d45: MSTORE 00002d46: PUSH1 0x20 00002d48: PUSH0 00002d49: KECCAK256 00002d4a: ADD 00002d4b: PUSH0 00002d4c: SWAP1 00002d4d: SSTORE 00002d4e: SWAP1 00002d4f: SSTORE 00002d50: DUP6 00002d51: PUSH1 0x01 00002d53: ADD 00002d54: PUSH0 00002d55: DUP7 00002d56: DUP2 00002d57: MSTORE 00002d58: PUSH1 0x20 00002d5a: ADD 00002d5b: SWAP1 00002d5c: DUP2 00002d5d: MSTORE 00002d5e: PUSH1 0x20 00002d60: ADD 00002d61: PUSH0 00002d62: KECCAK256 00002d63: PUSH0 00002d64: SWAP1 00002d65: SSTORE 00002d66: PUSH1 0x01 00002d68: SWAP4 00002d69: POP 00002d6a: POP 00002d6b: POP 00002d6c: POP 00002d6d: PUSH2 0x0bc7 00002d70: JUMP 00002d71: JUMPDEST 00002d72: DUP1 00002d73: MLOAD 00002d74: ISZERO 00002d75: PUSH2 0x2d81 00002d78: JUMPI 00002d79: DUP1 00002d7a: MLOAD 00002d7b: DUP1 00002d7c: DUP3 00002d7d: PUSH1 0x20 00002d7f: ADD 00002d80: REVERT 00002d81: JUMPDEST 00002d82: PUSH1 0x40 00002d84: MLOAD 00002d85: PUSH4 0xd6bda275 00002d8a: PUSH1 0xe0 00002d8c: SHL 00002d8d: DUP2 00002d8e: MSTORE 00002d8f: PUSH1 0x04 00002d91: ADD 00002d92: PUSH1 0x40 00002d94: MLOAD 00002d95: DUP1 00002d96: SWAP2 00002d97: SUB 00002d98: SWAP1 00002d99: REVERT 00002d9a: JUMPDEST 00002d9b: PUSH0 00002d9c: PUSH1 0xa0 00002d9e: DUP3 00002d9f: DUP5 00002da0: SUB 00002da1: SLT 00002da2: ISZERO 00002da3: PUSH2 0x2daa 00002da6: JUMPI 00002da7: PUSH0 00002da8: DUP1 00002da9: REVERT 00002daa: JUMPDEST 00002dab: POP 00002dac: SWAP2 00002dad: SWAP1 00002dae: POP 00002daf: JUMP 00002db0: JUMPDEST 00002db1: PUSH0 00002db2: PUSH1 0xa0 00002db4: DUP3 00002db5: DUP5 00002db6: SUB 00002db7: SLT 00002db8: ISZERO 00002db9: PUSH2 0x2dc0 00002dbc: JUMPI 00002dbd: PUSH0 00002dbe: DUP1 00002dbf: REVERT 00002dc0: JUMPDEST 00002dc1: PUSH2 0x15de 00002dc4: DUP4 00002dc5: DUP4 00002dc6: PUSH2 0x2d9a 00002dc9: JUMP 00002dca: JUMPDEST 00002dcb: PUSH0 00002dcc: PUSH1 0x20 00002dce: DUP3 00002dcf: DUP5 00002dd0: SUB 00002dd1: SLT 00002dd2: ISZERO 00002dd3: PUSH2 0x2dda 00002dd6: JUMPI 00002dd7: PUSH0 00002dd8: DUP1 00002dd9: REVERT 00002dda: JUMPDEST 00002ddb: DUP2 00002ddc: CALLDATALOAD 00002ddd: PUSH1 0x01 00002ddf: PUSH1 0x01 00002de1: PUSH1 0xe0 00002de3: SHL 00002de4: SUB 00002de5: NOT 00002de6: DUP2 00002de7: AND 00002de8: DUP2 00002de9: EQ 00002dea: PUSH2 0x15de 00002ded: JUMPI 00002dee: PUSH0 00002def: DUP1 00002df0: REVERT 00002df1: JUMPDEST 00002df2: PUSH0 00002df3: DUP1 00002df4: DUP4 00002df5: PUSH1 0x1f 00002df7: DUP5 00002df8: ADD 00002df9: SLT 00002dfa: PUSH2 0x2e01 00002dfd: JUMPI 00002dfe: PUSH0 00002dff: DUP1 00002e00: REVERT 00002e01: JUMPDEST 00002e02: POP 00002e03: DUP2 00002e04: CALLDATALOAD 00002e05: PUSH8 0xffffffffffffffff 00002e0e: DUP2 00002e0f: GT 00002e10: ISZERO 00002e11: PUSH2 0x2e18 00002e14: JUMPI 00002e15: PUSH0 00002e16: DUP1 00002e17: REVERT 00002e18: JUMPDEST 00002e19: PUSH1 0x20 00002e1b: DUP4 00002e1c: ADD 00002e1d: SWAP2 00002e1e: POP 00002e1f: DUP4 00002e20: PUSH1 0x20 00002e22: DUP3 00002e23: DUP6 00002e24: ADD 00002e25: ADD 00002e26: GT 00002e27: ISZERO 00002e28: PUSH2 0x2e2f 00002e2b: JUMPI 00002e2c: PUSH0 00002e2d: DUP1 00002e2e: REVERT 00002e2f: JUMPDEST 00002e30: SWAP3 00002e31: POP 00002e32: SWAP3 00002e33: SWAP1 00002e34: POP 00002e35: JUMP 00002e36: JUMPDEST 00002e37: PUSH0 00002e38: DUP1 00002e39: PUSH1 0x20 00002e3b: DUP4 00002e3c: DUP6 00002e3d: SUB 00002e3e: SLT 00002e3f: ISZERO 00002e40: PUSH2 0x2e47 00002e43: JUMPI 00002e44: PUSH0 00002e45: DUP1 00002e46: REVERT 00002e47: JUMPDEST 00002e48: DUP3 00002e49: CALLDATALOAD 00002e4a: PUSH8 0xffffffffffffffff 00002e53: DUP2 00002e54: GT 00002e55: ISZERO 00002e56: PUSH2 0x2e5d 00002e59: JUMPI 00002e5a: PUSH0 00002e5b: DUP1 00002e5c: REVERT 00002e5d: JUMPDEST 00002e5e: PUSH2 0x2e69 00002e61: DUP6 00002e62: DUP3 00002e63: DUP7 00002e64: ADD 00002e65: PUSH2 0x2df1 00002e68: JUMP 00002e69: JUMPDEST 00002e6a: SWAP1 00002e6b: SWAP7 00002e6c: SWAP1 00002e6d: SWAP6 00002e6e: POP 00002e6f: SWAP4 00002e70: POP 00002e71: POP 00002e72: POP 00002e73: POP 00002e74: JUMP 00002e75: JUMPDEST 00002e76: PUSH0 00002e77: PUSH1 0x20 00002e79: DUP3 00002e7a: DUP5 00002e7b: SUB 00002e7c: SLT 00002e7d: ISZERO 00002e7e: PUSH2 0x2e85 00002e81: JUMPI 00002e82: PUSH0 00002e83: DUP1 00002e84: REVERT 00002e85: JUMPDEST 00002e86: POP 00002e87: CALLDATALOAD 00002e88: SWAP2 00002e89: SWAP1 00002e8a: POP 00002e8b: JUMP 00002e8c: JUMPDEST 00002e8d: PUSH1 0x01 00002e8f: PUSH1 0x01 00002e91: PUSH1 0xa0 00002e93: SHL 00002e94: SUB 00002e95: DUP2 00002e96: AND 00002e97: DUP2 00002e98: EQ 00002e99: PUSH2 0x0d1f 00002e9c: JUMPI 00002e9d: PUSH0 00002e9e: DUP1 00002e9f: REVERT 00002ea0: JUMPDEST 00002ea1: DUP1 00002ea2: CALLDATALOAD 00002ea3: PUSH2 0x2eab 00002ea6: DUP2 00002ea7: PUSH2 0x2e8c 00002eaa: JUMP 00002eab: JUMPDEST 00002eac: SWAP2 00002ead: SWAP1 00002eae: POP 00002eaf: JUMP 00002eb0: JUMPDEST 00002eb1: PUSH0 00002eb2: DUP1 00002eb3: PUSH1 0x40 00002eb5: DUP4 00002eb6: DUP6 00002eb7: SUB 00002eb8: SLT 00002eb9: ISZERO 00002eba: PUSH2 0x2ec1 00002ebd: JUMPI 00002ebe: PUSH0 00002ebf: DUP1 00002ec0: REVERT 00002ec1: JUMPDEST 00002ec2: DUP3 00002ec3: CALLDATALOAD 00002ec4: SWAP2 00002ec5: POP 00002ec6: PUSH1 0x20 00002ec8: DUP4 00002ec9: ADD 00002eca: CALLDATALOAD 00002ecb: PUSH2 0x2ed3 00002ece: DUP2 00002ecf: PUSH2 0x2e8c 00002ed2: JUMP 00002ed3: JUMPDEST 00002ed4: DUP1 00002ed5: SWAP2 00002ed6: POP 00002ed7: POP 00002ed8: SWAP3 00002ed9: POP 00002eda: SWAP3 00002edb: SWAP1 00002edc: POP 00002edd: JUMP 00002ede: JUMPDEST 00002edf: PUSH0 00002ee0: DUP1 00002ee1: PUSH1 0x40 00002ee3: DUP4 00002ee4: DUP6 00002ee5: SUB 00002ee6: SLT 00002ee7: ISZERO 00002ee8: PUSH2 0x2eef 00002eeb: JUMPI 00002eec: PUSH0 00002eed: DUP1 00002eee: REVERT 00002eef: JUMPDEST 00002ef0: DUP3 00002ef1: CALLDATALOAD 00002ef2: PUSH2 0x2efa 00002ef5: DUP2 00002ef6: PUSH2 0x2e8c 00002ef9: JUMP 00002efa: JUMPDEST 00002efb: SWAP5 00002efc: PUSH1 0x20 00002efe: SWAP4 00002eff: SWAP1 00002f00: SWAP4 00002f01: ADD 00002f02: CALLDATALOAD 00002f03: SWAP4 00002f04: POP 00002f05: POP 00002f06: POP 00002f07: JUMP 00002f08: JUMPDEST 00002f09: PUSH0 00002f0a: PUSH1 0x20 00002f0c: DUP3 00002f0d: DUP5 00002f0e: SUB 00002f0f: SLT 00002f10: ISZERO 00002f11: PUSH2 0x2f18 00002f14: JUMPI 00002f15: PUSH0 00002f16: DUP1 00002f17: REVERT 00002f18: JUMPDEST 00002f19: DUP2 00002f1a: CALLDATALOAD 00002f1b: PUSH2 0x15de 00002f1e: DUP2 00002f1f: PUSH2 0x2e8c 00002f22: JUMP 00002f23: JUMPDEST 00002f24: PUSH0 00002f25: DUP1 00002f26: PUSH1 0x40 00002f28: DUP4 00002f29: DUP6 00002f2a: SUB 00002f2b: SLT 00002f2c: ISZERO 00002f2d: PUSH2 0x2f34 00002f30: JUMPI 00002f31: PUSH0 00002f32: DUP1 00002f33: REVERT 00002f34: JUMPDEST 00002f35: POP 00002f36: POP 00002f37: DUP1 00002f38: CALLDATALOAD 00002f39: SWAP3 00002f3a: PUSH1 0x20 00002f3c: SWAP1 00002f3d: SWAP2 00002f3e: ADD 00002f3f: CALLDATALOAD 00002f40: SWAP2 00002f41: POP 00002f42: JUMP 00002f43: JUMPDEST 00002f44: PUSH0 00002f45: DUP1 00002f46: PUSH0 00002f47: DUP1 00002f48: DUP5 00002f49: DUP7 00002f4a: SUB 00002f4b: PUSH2 0x0240 00002f4e: DUP2 00002f4f: SLT 00002f50: ISZERO 00002f51: PUSH2 0x2f58 00002f54: JUMPI 00002f55: PUSH0 00002f56: DUP1 00002f57: REVERT 00002f58: JUMPDEST 00002f59: PUSH2 0x2f62 00002f5c: DUP8 00002f5d: DUP8 00002f5e: PUSH2 0x2d9a 00002f61: JUMP 00002f62: JUMPDEST 00002f63: SWAP5 00002f64: POP 00002f65: PUSH2 0x0180 00002f68: PUSH1 0x9f 00002f6a: NOT 00002f6b: DUP3 00002f6c: ADD 00002f6d: SLT 00002f6e: ISZERO 00002f6f: PUSH2 0x2f76 00002f72: JUMPI 00002f73: PUSH0 00002f74: DUP1 00002f75: REVERT 00002f76: JUMPDEST 00002f77: POP 00002f78: PUSH1 0xa0 00002f7a: DUP6 00002f7b: ADD 00002f7c: SWAP3 00002f7d: POP 00002f7e: PUSH2 0x0220 00002f81: DUP6 00002f82: ADD 00002f83: CALLDATALOAD 00002f84: PUSH8 0xffffffffffffffff 00002f8d: DUP2 00002f8e: GT 00002f8f: ISZERO 00002f90: PUSH2 0x2f97 00002f93: JUMPI 00002f94: PUSH0 00002f95: DUP1 00002f96: REVERT 00002f97: JUMPDEST 00002f98: PUSH2 0x2fa3 00002f9b: DUP8 00002f9c: DUP3 00002f9d: DUP9 00002f9e: ADD 00002f9f: PUSH2 0x2df1 00002fa2: JUMP 00002fa3: JUMPDEST 00002fa4: SWAP6 00002fa5: SWAP9 00002fa6: SWAP5 00002fa7: SWAP8 00002fa8: POP 00002fa9: SWAP6 00002faa: POP 00002fab: POP 00002fac: POP 00002fad: POP 00002fae: JUMP 00002faf: JUMPDEST 00002fb0: PUSH1 0x20 00002fb2: DUP1 00002fb3: DUP3 00002fb4: MSTORE 00002fb5: DUP3 00002fb6: MLOAD 00002fb7: DUP3 00002fb8: DUP3 00002fb9: ADD 00002fba: DUP2 00002fbb: SWAP1 00002fbc: MSTORE 00002fbd: PUSH0 00002fbe: SWAP2 00002fbf: SWAP1 00002fc0: DUP5 00002fc1: DUP3 00002fc2: ADD 00002fc3: SWAP1 00002fc4: PUSH1 0x40 00002fc6: DUP6 00002fc7: ADD 00002fc8: SWAP1 00002fc9: DUP5 00002fca: JUMPDEST 00002fcb: DUP2 00002fcc: DUP2 00002fcd: LT 00002fce: ISZERO 00002fcf: PUSH2 0x2fef 00002fd2: JUMPI 00002fd3: DUP4 00002fd4: MLOAD 00002fd5: PUSH1 0x01 00002fd7: PUSH1 0x01 00002fd9: PUSH1 0xa0 00002fdb: SHL 00002fdc: SUB 00002fdd: AND 00002fde: DUP4 00002fdf: MSTORE 00002fe0: SWAP3 00002fe1: DUP5 00002fe2: ADD 00002fe3: SWAP3 00002fe4: SWAP2 00002fe5: DUP5 00002fe6: ADD 00002fe7: SWAP2 00002fe8: PUSH1 0x01 00002fea: ADD 00002feb: PUSH2 0x2fca 00002fee: JUMP 00002fef: JUMPDEST 00002ff0: POP 00002ff1: SWAP1 00002ff2: SWAP7 00002ff3: SWAP6 00002ff4: POP 00002ff5: POP 00002ff6: POP 00002ff7: POP 00002ff8: POP 00002ff9: POP 00002ffa: JUMP 00002ffb: JUMPDEST 00002ffc: PUSH0 00002ffd: DUP1 00002ffe: PUSH0 00002fff: PUSH1 0x60 00003001: DUP5 00003002: DUP7 00003003: SUB 00003004: SLT 00003005: ISZERO 00003006: PUSH2 0x300d 00003009: JUMPI 0000300a: PUSH0 0000300b: DUP1 0000300c: REVERT 0000300d: JUMPDEST 0000300e: DUP4 0000300f: CALLDATALOAD 00003010: PUSH2 0x3018 00003013: DUP2 00003014: PUSH2 0x2e8c 00003017: JUMP 00003018: JUMPDEST 00003019: SWAP3 0000301a: POP 0000301b: PUSH1 0x20 0000301d: DUP5 0000301e: ADD 0000301f: CALLDATALOAD 00003020: PUSH2 0x3028 00003023: DUP2 00003024: PUSH2 0x2e8c 00003027: JUMP 00003028: JUMPDEST 00003029: SWAP3 0000302a: SWAP6 0000302b: SWAP3 0000302c: SWAP5 0000302d: POP 0000302e: POP 0000302f: POP 00003030: PUSH1 0x40 00003032: SWAP2 00003033: SWAP1 00003034: SWAP2 00003035: ADD 00003036: CALLDATALOAD 00003037: SWAP1 00003038: JUMP 00003039: JUMPDEST 0000303a: PUSH0 0000303b: DUP1 0000303c: PUSH0 0000303d: DUP1 0000303e: PUSH1 0xe0 00003040: DUP6 00003041: DUP8 00003042: SUB 00003043: SLT 00003044: ISZERO 00003045: PUSH2 0x304c 00003048: JUMPI 00003049: PUSH0 0000304a: DUP1 0000304b: REVERT 0000304c: JUMPDEST 0000304d: PUSH2 0x3056 00003050: DUP7 00003051: DUP7 00003052: PUSH2 0x2d9a 00003055: JUMP 00003056: JUMPDEST 00003057: SWAP4 00003058: POP 00003059: PUSH1 0xa0 0000305b: DUP6 0000305c: ADD 0000305d: CALLDATALOAD 0000305e: PUSH2 0x3066 00003061: DUP2 00003062: PUSH2 0x2e8c 00003065: JUMP 00003066: JUMPDEST 00003067: SWAP3 00003068: POP 00003069: PUSH1 0xc0 0000306b: DUP6 0000306c: ADD 0000306d: CALLDATALOAD 0000306e: PUSH8 0xffffffffffffffff 00003077: DUP2 00003078: GT 00003079: ISZERO 0000307a: PUSH2 0x2f97 0000307d: JUMPI 0000307e: PUSH0 0000307f: DUP1 00003080: REVERT 00003081: JUMPDEST 00003082: PUSH1 0x20 00003084: DUP2 00003085: MSTORE 00003086: PUSH0 00003087: DUP3 00003088: MLOAD 00003089: DUP1 0000308a: PUSH1 0x20 0000308c: DUP5 0000308d: ADD 0000308e: MSTORE 0000308f: DUP1 00003090: PUSH1 0x20 00003092: DUP6 00003093: ADD 00003094: PUSH1 0x40 00003096: DUP6 00003097: ADD 00003098: MCOPY 00003099: PUSH0 0000309a: PUSH1 0x40 0000309c: DUP3 0000309d: DUP6 0000309e: ADD 0000309f: ADD 000030a0: MSTORE 000030a1: PUSH1 0x40 000030a3: PUSH1 0x1f 000030a5: NOT 000030a6: PUSH1 0x1f 000030a8: DUP4 000030a9: ADD 000030aa: AND 000030ab: DUP5 000030ac: ADD 000030ad: ADD 000030ae: SWAP2 000030af: POP 000030b0: POP 000030b1: SWAP3 000030b2: SWAP2 000030b3: POP 000030b4: POP 000030b5: JUMP 000030b6: JUMPDEST 000030b7: PUSH0 000030b8: DUP1 000030b9: PUSH1 0x40 000030bb: DUP4 000030bc: DUP6 000030bd: SUB 000030be: SLT 000030bf: ISZERO 000030c0: PUSH2 0x30c7 000030c3: JUMPI 000030c4: PUSH0 000030c5: DUP1 000030c6: REVERT 000030c7: JUMPDEST 000030c8: DUP3 000030c9: CALLDATALOAD 000030ca: PUSH2 0x30d2 000030cd: DUP2 000030ce: PUSH2 0x2e8c 000030d1: JUMP 000030d2: JUMPDEST 000030d3: SWAP2 000030d4: POP 000030d5: PUSH1 0x20 000030d7: DUP4 000030d8: ADD 000030d9: CALLDATALOAD 000030da: PUSH2 0x2ed3 000030dd: DUP2 000030de: PUSH2 0x2e8c 000030e1: JUMP 000030e2: JUMPDEST 000030e3: DUP2 000030e4: DUP4 000030e5: MSTORE 000030e6: DUP2 000030e7: DUP2 000030e8: PUSH1 0x20 000030ea: DUP6 000030eb: ADD 000030ec: CALLDATACOPY 000030ed: POP 000030ee: PUSH0 000030ef: DUP3 000030f0: DUP3 000030f1: ADD 000030f2: PUSH1 0x20 000030f4: SWAP1 000030f5: DUP2 000030f6: ADD 000030f7: SWAP2 000030f8: SWAP1 000030f9: SWAP2 000030fa: MSTORE 000030fb: PUSH1 0x1f 000030fd: SWAP1 000030fe: SWAP2 000030ff: ADD 00003100: PUSH1 0x1f 00003102: NOT 00003103: AND 00003104: SWAP1 00003105: SWAP2 00003106: ADD 00003107: ADD 00003108: SWAP1 00003109: JUMP 0000310a: JUMPDEST 0000310b: PUSH1 0x20 0000310d: DUP2 0000310e: MSTORE 0000310f: PUSH0 00003110: PUSH2 0x13d9 00003113: PUSH1 0x20 00003115: DUP4 00003116: ADD 00003117: DUP5 00003118: DUP7 00003119: PUSH2 0x30e2 0000311c: JUMP 0000311d: JUMPDEST 0000311e: PUSH4 0x4e487b71 00003123: PUSH1 0xe0 00003125: SHL 00003126: PUSH0 00003127: MSTORE 00003128: PUSH1 0x41 0000312a: PUSH1 0x04 0000312c: MSTORE 0000312d: PUSH1 0x24 0000312f: PUSH0 00003130: REVERT 00003131: JUMPDEST 00003132: PUSH1 0x40 00003134: MLOAD 00003135: PUSH2 0x0180 00003138: DUP2 00003139: ADD 0000313a: PUSH8 0xffffffffffffffff 00003143: DUP2 00003144: GT 00003145: DUP3 00003146: DUP3 00003147: LT 00003148: OR 00003149: ISZERO 0000314a: PUSH2 0x3155 0000314d: JUMPI 0000314e: PUSH2 0x3155 00003151: PUSH2 0x311d 00003154: JUMP 00003155: JUMPDEST 00003156: PUSH1 0x40 00003158: MSTORE 00003159: SWAP1 0000315a: JUMP 0000315b: JUMPDEST 0000315c: PUSH1 0x40 0000315e: MLOAD 0000315f: PUSH1 0x1f 00003161: DUP3 00003162: ADD 00003163: PUSH1 0x1f 00003165: NOT 00003166: AND 00003167: DUP2 00003168: ADD 00003169: PUSH8 0xffffffffffffffff 00003172: DUP2 00003173: GT 00003174: DUP3 00003175: DUP3 00003176: LT 00003177: OR 00003178: ISZERO 00003179: PUSH2 0x3184 0000317c: JUMPI 0000317d: PUSH2 0x3184 00003180: PUSH2 0x311d 00003183: JUMP 00003184: JUMPDEST 00003185: PUSH1 0x40 00003187: MSTORE 00003188: SWAP2 00003189: SWAP1 0000318a: POP 0000318b: JUMP 0000318c: JUMPDEST 0000318d: PUSH0 0000318e: PUSH8 0xffffffffffffffff 00003197: DUP3 00003198: GT 00003199: ISZERO 0000319a: PUSH2 0x31a5 0000319d: JUMPI 0000319e: PUSH2 0x31a5 000031a1: PUSH2 0x311d 000031a4: JUMP 000031a5: JUMPDEST 000031a6: POP 000031a7: PUSH1 0x05 000031a9: SHL 000031aa: PUSH1 0x20 000031ac: ADD 000031ad: SWAP1 000031ae: JUMP 000031af: JUMPDEST 000031b0: PUSH0 000031b1: DUP3 000031b2: PUSH1 0x1f 000031b4: DUP4 000031b5: ADD 000031b6: SLT 000031b7: PUSH2 0x31be 000031ba: JUMPI 000031bb: PUSH0 000031bc: DUP1 000031bd: REVERT 000031be: JUMPDEST 000031bf: DUP2 000031c0: CALLDATALOAD 000031c1: PUSH1 0x20 000031c3: PUSH2 0x31d3 000031c6: PUSH2 0x31ce 000031c9: DUP4 000031ca: PUSH2 0x318c 000031cd: JUMP 000031ce: JUMPDEST 000031cf: PUSH2 0x315b 000031d2: JUMP 000031d3: JUMPDEST 000031d4: DUP1 000031d5: DUP4 000031d6: DUP3 000031d7: MSTORE 000031d8: PUSH1 0x20 000031da: DUP3 000031db: ADD 000031dc: SWAP2 000031dd: POP 000031de: PUSH1 0x20 000031e0: DUP5 000031e1: PUSH1 0x05 000031e3: SHL 000031e4: DUP8 000031e5: ADD 000031e6: ADD 000031e7: SWAP4 000031e8: POP 000031e9: DUP7 000031ea: DUP5 000031eb: GT 000031ec: ISZERO 000031ed: PUSH2 0x31f4 000031f0: JUMPI 000031f1: PUSH0 000031f2: DUP1 000031f3: REVERT 000031f4: JUMPDEST 000031f5: PUSH1 0x20 000031f7: DUP7 000031f8: ADD 000031f9: JUMPDEST 000031fa: DUP5 000031fb: DUP2 000031fc: LT 000031fd: ISZERO 000031fe: PUSH2 0x3210 00003201: JUMPI 00003202: DUP1 00003203: CALLDATALOAD 00003204: DUP4 00003205: MSTORE 00003206: SWAP2 00003207: DUP4 00003208: ADD 00003209: SWAP2 0000320a: DUP4 0000320b: ADD 0000320c: PUSH2 0x31f9 0000320f: JUMP 00003210: JUMPDEST 00003211: POP 00003212: SWAP7 00003213: SWAP6 00003214: POP 00003215: POP 00003216: POP 00003217: POP 00003218: POP 00003219: POP 0000321a: JUMP 0000321b: JUMPDEST 0000321c: PUSH0 0000321d: DUP1 0000321e: PUSH0 0000321f: DUP1 00003220: PUSH0 00003221: DUP1 00003222: PUSH1 0xc0 00003224: DUP8 00003225: DUP10 00003226: SUB 00003227: SLT 00003228: ISZERO 00003229: PUSH2 0x3230 0000322c: JUMPI 0000322d: PUSH0 0000322e: DUP1 0000322f: REVERT 00003230: JUMPDEST 00003231: DUP7 00003232: CALLDATALOAD 00003233: PUSH2 0x323b 00003236: DUP2 00003237: PUSH2 0x2e8c 0000323a: JUMP 0000323b: JUMPDEST 0000323c: SWAP6 0000323d: POP 0000323e: PUSH1 0x20 00003240: DUP8 00003241: DUP2 00003242: ADD 00003243: CALLDATALOAD 00003244: PUSH2 0x324c 00003247: DUP2 00003248: PUSH2 0x2e8c 0000324b: JUMP 0000324c: JUMPDEST 0000324d: SWAP6 0000324e: POP 0000324f: PUSH1 0x40 00003251: DUP9 00003252: ADD 00003253: CALLDATALOAD 00003254: PUSH2 0x325c 00003257: DUP2 00003258: PUSH2 0x2e8c 0000325b: JUMP 0000325c: JUMPDEST 0000325d: SWAP5 0000325e: POP 0000325f: PUSH1 0x60 00003261: DUP9 00003262: ADD 00003263: CALLDATALOAD 00003264: SWAP4 00003265: POP 00003266: PUSH1 0x80 00003268: DUP9 00003269: ADD 0000326a: CALLDATALOAD 0000326b: PUSH8 0xffffffffffffffff 00003274: DUP1 00003275: DUP3 00003276: GT 00003277: ISZERO 00003278: PUSH2 0x327f 0000327b: JUMPI 0000327c: PUSH0 0000327d: DUP1 0000327e: REVERT 0000327f: JUMPDEST 00003280: DUP2 00003281: DUP11 00003282: ADD 00003283: SWAP2 00003284: POP 00003285: DUP11 00003286: PUSH1 0x1f 00003288: DUP4 00003289: ADD 0000328a: SLT 0000328b: PUSH2 0x3292 0000328e: JUMPI 0000328f: PUSH0 00003290: DUP1 00003291: REVERT 00003292: JUMPDEST 00003293: DUP2 00003294: CALLDATALOAD 00003295: PUSH2 0x32a0 00003298: PUSH2 0x31ce 0000329b: DUP3 0000329c: PUSH2 0x318c 0000329f: JUMP 000032a0: JUMPDEST 000032a1: DUP2 000032a2: DUP2 000032a3: MSTORE 000032a4: PUSH1 0x05 000032a6: SWAP2 000032a7: SWAP1 000032a8: SWAP2 000032a9: SHL 000032aa: DUP4 000032ab: ADD 000032ac: DUP5 000032ad: ADD 000032ae: SWAP1 000032af: DUP5 000032b0: DUP2 000032b1: ADD 000032b2: SWAP1 000032b3: DUP14 000032b4: DUP4 000032b5: GT 000032b6: ISZERO 000032b7: PUSH2 0x32be 000032ba: JUMPI 000032bb: PUSH0 000032bc: DUP1 000032bd: REVERT 000032be: JUMPDEST 000032bf: SWAP4 000032c0: DUP6 000032c1: ADD 000032c2: SWAP4 000032c3: JUMPDEST 000032c4: DUP3 000032c5: DUP6 000032c6: LT 000032c7: ISZERO 000032c8: PUSH2 0x32e5 000032cb: JUMPI 000032cc: DUP5 000032cd: CALLDATALOAD 000032ce: PUSH2 0x32d6 000032d1: DUP2 000032d2: PUSH2 0x2e8c 000032d5: JUMP 000032d6: JUMPDEST 000032d7: DUP3 000032d8: MSTORE 000032d9: SWAP4 000032da: DUP6 000032db: ADD 000032dc: SWAP4 000032dd: SWAP1 000032de: DUP6 000032df: ADD 000032e0: SWAP1 000032e1: PUSH2 0x32c3 000032e4: JUMP 000032e5: JUMPDEST 000032e6: SWAP7 000032e7: POP 000032e8: POP 000032e9: POP 000032ea: PUSH1 0xa0 000032ec: DUP11 000032ed: ADD 000032ee: CALLDATALOAD 000032ef: SWAP3 000032f0: POP 000032f1: DUP1 000032f2: DUP4 000032f3: GT 000032f4: ISZERO 000032f5: PUSH2 0x32fc 000032f8: JUMPI 000032f9: PUSH0 000032fa: DUP1 000032fb: REVERT 000032fc: JUMPDEST 000032fd: POP 000032fe: POP 000032ff: PUSH2 0x330a 00003302: DUP10 00003303: DUP3 00003304: DUP11 00003305: ADD 00003306: PUSH2 0x31af 00003309: JUMP 0000330a: JUMPDEST 0000330b: SWAP2 0000330c: POP 0000330d: POP 0000330e: SWAP3 0000330f: SWAP6 00003310: POP 00003311: SWAP3 00003312: SWAP6 00003313: POP 00003314: SWAP3 00003315: SWAP6 00003316: JUMP 00003317: JUMPDEST 00003318: PUSH4 0x4e487b71 0000331d: PUSH1 0xe0 0000331f: SHL 00003320: PUSH0 00003321: MSTORE 00003322: PUSH1 0x32 00003324: PUSH1 0x04 00003326: MSTORE 00003327: PUSH1 0x24 00003329: PUSH0 0000332a: REVERT 0000332b: JUMPDEST 0000332c: PUSH1 0x40 0000332e: DUP2 0000332f: MSTORE 00003330: PUSH0 00003331: PUSH2 0x333e 00003334: PUSH1 0x40 00003336: DUP4 00003337: ADD 00003338: DUP6 00003339: DUP8 0000333a: PUSH2 0x30e2 0000333d: JUMP 0000333e: JUMPDEST 0000333f: SWAP1 00003340: POP 00003341: DUP3 00003342: ISZERO 00003343: ISZERO 00003344: PUSH1 0x20 00003346: DUP4 00003347: ADD 00003348: MSTORE 00003349: SWAP5 0000334a: SWAP4 0000334b: POP 0000334c: POP 0000334d: POP 0000334e: POP 0000334f: JUMP 00003350: JUMPDEST 00003351: DUP1 00003352: CALLDATALOAD 00003353: PUSH2 0x335b 00003356: DUP2 00003357: PUSH2 0x2e8c 0000335a: JUMP 0000335b: JUMPDEST 0000335c: PUSH1 0x01 0000335e: PUSH1 0x01 00003360: PUSH1 0xa0 00003362: SHL 00003363: SUB 00003364: SWAP1 00003365: DUP2 00003366: AND 00003367: DUP4 00003368: MSTORE 00003369: PUSH1 0x20 0000336b: DUP3 0000336c: ADD 0000336d: CALLDATALOAD 0000336e: SWAP1 0000336f: PUSH2 0x3377 00003372: DUP3 00003373: PUSH2 0x2e8c 00003376: JUMP 00003377: JUMPDEST 00003378: AND 00003379: PUSH1 0x20 0000337b: DUP4 0000337c: ADD 0000337d: MSTORE 0000337e: PUSH1 0x40 00003380: DUP2 00003381: DUP2 00003382: ADD 00003383: CALLDATALOAD 00003384: SWAP1 00003385: DUP4 00003386: ADD 00003387: MSTORE 00003388: PUSH1 0x60 0000338a: DUP1 0000338b: DUP3 0000338c: ADD 0000338d: CALLDATALOAD 0000338e: SWAP1 0000338f: DUP4 00003390: ADD 00003391: MSTORE 00003392: PUSH1 0x80 00003394: SWAP1 00003395: DUP2 00003396: ADD 00003397: CALLDATALOAD 00003398: SWAP2 00003399: ADD 0000339a: MSTORE 0000339b: JUMP 0000339c: JUMPDEST 0000339d: PUSH2 0x33a6 000033a0: DUP2 000033a1: DUP6 000033a2: PUSH2 0x3350 000033a5: JUMP 000033a6: JUMPDEST 000033a7: PUSH1 0xc0 000033a9: PUSH1 0xa0 000033ab: DUP3 000033ac: ADD 000033ad: MSTORE 000033ae: PUSH0 000033af: PUSH2 0x33bc 000033b2: PUSH1 0xc0 000033b4: DUP4 000033b5: ADD 000033b6: DUP5 000033b7: DUP7 000033b8: PUSH2 0x30e2 000033bb: JUMP 000033bc: JUMPDEST 000033bd: SWAP6 000033be: SWAP5 000033bf: POP 000033c0: POP 000033c1: POP 000033c2: POP 000033c3: POP 000033c4: JUMP 000033c5: JUMPDEST 000033c6: PUSH4 0x4e487b71 000033cb: PUSH1 0xe0 000033cd: SHL 000033ce: PUSH0 000033cf: MSTORE 000033d0: PUSH1 0x11 000033d2: PUSH1 0x04 000033d4: MSTORE 000033d5: PUSH1 0x24 000033d7: PUSH0 000033d8: REVERT 000033d9: JUMPDEST 000033da: DUP2 000033db: DUP2 000033dc: SUB 000033dd: DUP2 000033de: DUP2 000033df: GT 000033e0: ISZERO 000033e1: PUSH2 0x0bc7 000033e4: JUMPI 000033e5: PUSH2 0x0bc7 000033e8: PUSH2 0x33c5 000033eb: JUMP 000033ec: JUMPDEST 000033ed: PUSH1 0xe0 000033ef: DUP2 000033f0: ADD 000033f1: PUSH2 0x33fa 000033f4: DUP3 000033f5: DUP7 000033f6: PUSH2 0x3350 000033f9: JUMP 000033fa: JUMPDEST 000033fb: PUSH1 0x01 000033fd: PUSH1 0x01 000033ff: PUSH1 0xa0 00003401: SHL 00003402: SUB 00003403: SWAP4 00003404: SWAP1 00003405: SWAP4 00003406: AND 00003407: PUSH1 0xa0 00003409: DUP3 0000340a: ADD 0000340b: MSTORE 0000340c: PUSH1 0xc0 0000340e: ADD 0000340f: MSTORE 00003410: SWAP2 00003411: SWAP1 00003412: POP 00003413: JUMP 00003414: JUMPDEST 00003415: DUP1 00003416: CALLDATALOAD 00003417: PUSH4 0xffffffff 0000341c: DUP2 0000341d: AND 0000341e: DUP2 0000341f: EQ 00003420: PUSH2 0x2eab 00003423: JUMPI 00003424: PUSH0 00003425: DUP1 00003426: REVERT 00003427: JUMPDEST 00003428: PUSH0 00003429: PUSH1 0x20 0000342b: DUP3 0000342c: DUP5 0000342d: SUB 0000342e: SLT 0000342f: ISZERO 00003430: PUSH2 0x3437 00003433: JUMPI 00003434: PUSH0 00003435: DUP1 00003436: REVERT 00003437: JUMPDEST 00003438: PUSH2 0x15de 0000343b: DUP3 0000343c: PUSH2 0x3414 0000343f: JUMP 00003440: JUMPDEST 00003441: DUP1 00003442: CALLDATALOAD 00003443: DUP1 00003444: ISZERO 00003445: ISZERO 00003446: DUP2 00003447: EQ 00003448: PUSH2 0x2eab 0000344b: JUMPI 0000344c: PUSH0 0000344d: DUP1 0000344e: REVERT 0000344f: JUMPDEST 00003450: PUSH0 00003451: PUSH2 0x0180 00003454: DUP3 00003455: DUP5 00003456: SUB 00003457: SLT 00003458: ISZERO 00003459: PUSH2 0x3460 0000345c: JUMPI 0000345d: PUSH0 0000345e: DUP1 0000345f: REVERT 00003460: JUMPDEST 00003461: PUSH2 0x3468 00003464: PUSH2 0x3131 00003467: JUMP 00003468: JUMPDEST 00003469: PUSH2 0x3471 0000346c: DUP4 0000346d: PUSH2 0x2ea0 00003470: JUMP 00003471: JUMPDEST 00003472: DUP2 00003473: MSTORE 00003474: PUSH2 0x347f 00003477: PUSH1 0x20 00003479: DUP5 0000347a: ADD 0000347b: PUSH2 0x2ea0 0000347e: JUMP 0000347f: JUMPDEST 00003480: PUSH1 0x20 00003482: DUP3 00003483: ADD 00003484: MSTORE 00003485: PUSH2 0x3490 00003488: PUSH1 0x40 0000348a: DUP5 0000348b: ADD 0000348c: PUSH2 0x2ea0 0000348f: JUMP 00003490: JUMPDEST 00003491: PUSH1 0x40 00003493: DUP3 00003494: ADD 00003495: MSTORE 00003496: PUSH1 0x60 00003498: DUP4 00003499: ADD 0000349a: CALLDATALOAD 0000349b: PUSH1 0x60 0000349d: DUP3 0000349e: ADD 0000349f: MSTORE 000034a0: PUSH1 0x80 000034a2: DUP4 000034a3: ADD 000034a4: CALLDATALOAD 000034a5: PUSH1 0x80 000034a7: DUP3 000034a8: ADD 000034a9: MSTORE 000034aa: PUSH2 0x34b5 000034ad: PUSH1 0xa0 000034af: DUP5 000034b0: ADD 000034b1: PUSH2 0x3414 000034b4: JUMP 000034b5: JUMPDEST 000034b6: PUSH1 0xa0 000034b8: DUP3 000034b9: ADD 000034ba: MSTORE 000034bb: PUSH1 0xc0 000034bd: DUP4 000034be: ADD 000034bf: CALLDATALOAD 000034c0: PUSH1 0xc0 000034c2: DUP3 000034c3: ADD 000034c4: MSTORE 000034c5: PUSH1 0xe0 000034c7: DUP4 000034c8: ADD 000034c9: CALLDATALOAD 000034ca: PUSH1 0xe0 000034cc: DUP3 000034cd: ADD 000034ce: MSTORE 000034cf: PUSH2 0x0100 000034d2: DUP1 000034d3: DUP5 000034d4: ADD 000034d5: CALLDATALOAD 000034d6: DUP2 000034d7: DUP4 000034d8: ADD 000034d9: MSTORE 000034da: POP 000034db: PUSH2 0x0120 000034de: PUSH2 0x34e8 000034e1: DUP2 000034e2: DUP6 000034e3: ADD 000034e4: PUSH2 0x3440 000034e7: JUMP 000034e8: JUMPDEST 000034e9: SWAP1 000034ea: DUP3 000034eb: ADD 000034ec: MSTORE 000034ed: PUSH2 0x0140 000034f0: DUP4 000034f1: DUP2 000034f2: ADD 000034f3: CALLDATALOAD 000034f4: SWAP1 000034f5: DUP3 000034f6: ADD 000034f7: MSTORE 000034f8: PUSH2 0x0160 000034fb: SWAP3 000034fc: DUP4 000034fd: ADD 000034fe: CALLDATALOAD 000034ff: SWAP3 00003500: DUP2 00003501: ADD 00003502: SWAP3 00003503: SWAP1 00003504: SWAP3 00003505: MSTORE 00003506: POP 00003507: SWAP2 00003508: SWAP1 00003509: POP 0000350a: JUMP 0000350b: JUMPDEST 0000350c: PUSH0 0000350d: PUSH1 0x20 0000350f: DUP3 00003510: DUP5 00003511: SUB 00003512: SLT 00003513: ISZERO 00003514: PUSH2 0x351b 00003517: JUMPI 00003518: PUSH0 00003519: DUP1 0000351a: REVERT 0000351b: JUMPDEST 0000351c: POP 0000351d: MLOAD 0000351e: SWAP2 0000351f: SWAP1 00003520: POP 00003521: JUMP 00003522: JUMPDEST 00003523: DUP2 00003524: DUP4 00003525: DUP3 00003526: CALLDATACOPY 00003527: PUSH0 00003528: SWAP2 00003529: ADD 0000352a: SWAP1 0000352b: DUP2 0000352c: MSTORE 0000352d: SWAP2 0000352e: SWAP1 0000352f: POP 00003530: JUMP 00003531: JUMPDEST 00003532: PUSH0 00003533: PUSH1 0x20 00003535: DUP3 00003536: DUP5 00003537: SUB 00003538: SLT 00003539: ISZERO 0000353a: PUSH2 0x3541 0000353d: JUMPI 0000353e: PUSH0 0000353f: DUP1 00003540: REVERT 00003541: JUMPDEST 00003542: DUP2 00003543: MLOAD 00003544: PUSH1 0xff 00003546: DUP2 00003547: AND 00003548: DUP2 00003549: EQ 0000354a: PUSH2 0x15de 0000354d: JUMPI 0000354e: PUSH0 0000354f: DUP1 00003550: REVERT 00003551: JUMPDEST 00003552: PUSH1 0xff 00003554: DUP3 00003555: DUP2 00003556: AND 00003557: DUP3 00003558: DUP3 00003559: AND 0000355a: SUB 0000355b: SWAP1 0000355c: DUP2 0000355d: GT 0000355e: ISZERO 0000355f: PUSH2 0x0bc7 00003562: JUMPI 00003563: PUSH2 0x0bc7 00003566: PUSH2 0x33c5 00003569: JUMP 0000356a: JUMPDEST 0000356b: PUSH1 0x01 0000356d: DUP2 0000356e: DUP2 0000356f: JUMPDEST 00003570: DUP1 00003571: DUP6 00003572: GT 00003573: ISZERO 00003574: PUSH2 0x35a4 00003577: JUMPI 00003578: DUP2 00003579: PUSH0 0000357a: NOT 0000357b: DIV 0000357c: DUP3 0000357d: GT 0000357e: ISZERO 0000357f: PUSH2 0x358a 00003582: JUMPI 00003583: PUSH2 0x358a 00003586: PUSH2 0x33c5 00003589: JUMP 0000358a: JUMPDEST 0000358b: DUP1 0000358c: DUP6 0000358d: AND 0000358e: ISZERO 0000358f: PUSH2 0x3597 00003592: JUMPI 00003593: SWAP2 00003594: DUP2 00003595: MUL 00003596: SWAP2 00003597: JUMPDEST 00003598: SWAP4 00003599: DUP5 0000359a: SHR 0000359b: SWAP4 0000359c: SWAP1 0000359d: DUP1 0000359e: MUL 0000359f: SWAP1 000035a0: PUSH2 0x356f 000035a3: JUMP 000035a4: JUMPDEST 000035a5: POP 000035a6: SWAP3 000035a7: POP 000035a8: SWAP3 000035a9: SWAP1 000035aa: POP 000035ab: JUMP 000035ac: JUMPDEST 000035ad: PUSH0 000035ae: DUP3 000035af: PUSH2 0x35ba 000035b2: JUMPI 000035b3: POP 000035b4: PUSH1 0x01 000035b6: PUSH2 0x0bc7 000035b9: JUMP 000035ba: JUMPDEST 000035bb: DUP2 000035bc: PUSH2 0x35c6 000035bf: JUMPI 000035c0: POP 000035c1: PUSH0 000035c2: PUSH2 0x0bc7 000035c5: JUMP 000035c6: JUMPDEST 000035c7: DUP2 000035c8: PUSH1 0x01 000035ca: DUP2 000035cb: EQ 000035cc: PUSH2 0x35dc 000035cf: JUMPI 000035d0: PUSH1 0x02 000035d2: DUP2 000035d3: EQ 000035d4: PUSH2 0x35e6 000035d7: JUMPI 000035d8: PUSH2 0x3602 000035db: JUMP 000035dc: JUMPDEST 000035dd: PUSH1 0x01 000035df: SWAP2 000035e0: POP 000035e1: POP 000035e2: PUSH2 0x0bc7 000035e5: JUMP 000035e6: JUMPDEST 000035e7: PUSH1 0xff 000035e9: DUP5 000035ea: GT 000035eb: ISZERO 000035ec: PUSH2 0x35f7 000035ef: JUMPI 000035f0: PUSH2 0x35f7 000035f3: PUSH2 0x33c5 000035f6: JUMP 000035f7: JUMPDEST 000035f8: POP 000035f9: POP 000035fa: PUSH1 0x01 000035fc: DUP3 000035fd: SHL 000035fe: PUSH2 0x0bc7 00003601: JUMP 00003602: JUMPDEST 00003603: POP 00003604: PUSH1 0x20 00003606: DUP4 00003607: LT 00003608: PUSH2 0x0133 0000360b: DUP4 0000360c: LT 0000360d: AND 0000360e: PUSH1 0x4e 00003610: DUP5 00003611: LT 00003612: PUSH1 0x0b 00003614: DUP5 00003615: LT 00003616: AND 00003617: OR 00003618: ISZERO 00003619: PUSH2 0x3625 0000361c: JUMPI 0000361d: POP 0000361e: DUP2 0000361f: DUP2 00003620: EXP 00003621: PUSH2 0x0bc7 00003624: JUMP 00003625: JUMPDEST 00003626: PUSH2 0x362f 00003629: DUP4 0000362a: DUP4 0000362b: PUSH2 0x356a 0000362e: JUMP 0000362f: JUMPDEST 00003630: DUP1 00003631: PUSH0 00003632: NOT 00003633: DIV 00003634: DUP3 00003635: GT 00003636: ISZERO 00003637: PUSH2 0x3642 0000363a: JUMPI 0000363b: PUSH2 0x3642 0000363e: PUSH2 0x33c5 00003641: JUMP 00003642: JUMPDEST 00003643: MUL 00003644: SWAP4 00003645: SWAP3 00003646: POP 00003647: POP 00003648: POP 00003649: JUMP 0000364a: JUMPDEST 0000364b: PUSH0 0000364c: PUSH2 0x15de 0000364f: PUSH1 0xff 00003651: DUP5 00003652: AND 00003653: DUP4 00003654: PUSH2 0x35ac 00003657: JUMP 00003658: JUMPDEST 00003659: DUP1 0000365a: DUP3 0000365b: MUL 0000365c: DUP2 0000365d: ISZERO 0000365e: DUP3 0000365f: DUP3 00003660: DIV 00003661: DUP5 00003662: EQ 00003663: OR 00003664: PUSH2 0x0bc7 00003667: JUMPI 00003668: PUSH2 0x0bc7 0000366b: PUSH2 0x33c5 0000366e: JUMP 0000366f: JUMPDEST 00003670: PUSH4 0x4e487b71 00003675: PUSH1 0xe0 00003677: SHL 00003678: PUSH0 00003679: MSTORE 0000367a: PUSH1 0x12 0000367c: PUSH1 0x04 0000367e: MSTORE 0000367f: PUSH1 0x24 00003681: PUSH0 00003682: REVERT 00003683: JUMPDEST 00003684: PUSH0 00003685: DUP3 00003686: MLOAD 00003687: DUP1 00003688: PUSH1 0x20 0000368a: DUP6 0000368b: ADD 0000368c: DUP5 0000368d: MCOPY 0000368e: PUSH0 0000368f: SWAP3 00003690: ADD 00003691: SWAP2 00003692: DUP3 00003693: MSTORE 00003694: POP 00003695: SWAP2 00003696: SWAP1 00003697: POP 00003698: JUMP 00003699: JUMPDEST 0000369a: PUSH4 0x4e487b71 0000369f: PUSH1 0xe0 000036a1: SHL 000036a2: PUSH0 000036a3: MSTORE 000036a4: PUSH1 0x31 000036a6: PUSH1 0x04 000036a8: MSTORE 000036a9: PUSH1 0x24 000036ab: PUSH0 000036ac: REVERT 000036ad: INVALID 000036ae: UNKNOWN(0xC1) 000036af: UNKNOWN(0xF6) 000036b0: INVALID 000036b1: UNKNOWN(0x24) 000036b2: PUSH3 0x1ce81e 000036b6: UNKNOWN(0xC5) 000036b7: DUP3 000036b8: PUSH29 0xaf0253cadb74709b061630e6b55e82371705932000aef53ff2a64da421 000036d6: JUMP 000036d7: MCOPY 000036d8: STATICCALL 000036d9: GASLIMIT 000036da: UNKNOWN(0xC5) 000036db: EXP 000036dc: SWAP7 000036dd: CREATE 000036de: PUSH17 0xd7bb66ffc4ca806c77c72a0e763f6602dd 000036f0: PUSH28 0xc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268 0000370d: STOP 0000370e: LOG2 0000370f: PUSH5 0x6970667358 00003715: UNKNOWN(0x22) 00003716: SLT 00003717: KECCAK256 00003718: JUMP 00003719: CALLCODE 0000371a: UNKNOWN(0xD8) 0000371b: UNKNOWN(0x4D) 0000371c: LOG2 0000371d: PUSH24 0xfdd43ca7c4c1f812ed5f873cb9d2de82e04d730cb8fd6cc0 00003736: UNKNOWN(0xFB) 00003737: PUSH12
| Severity | Category | Tool | Title | Confidence | Validated | Confirmed | Details |
|---|---|---|---|---|---|---|---|
| high | other | detector | Untrusted CALL target/value reachable | 60 | no | no |
viewtrace_id: 0x46413b6eeb90d80b705b7ab50ea778965eecda7dac896bac3a4453d5c2e42ce5
call_targets:
0x00000000d681e85e5783588f87a9573cb97eda01
target_varies:
no
classification:
constant_target
validation_json{
"sink": "CALL",
"errors": 0,
"status": "sink_reached",
"attempts": 1,
"trace_id": "0x46413b6eeb90d80b705b7ab50ea778965eecda7dac896bac3a4453d5c2e42ce5",
"confirmed": false,
"trace_mode": "callTracer",
"call_targets": [
"0x00000000d681e85e5783588f87a9573cb97eda01"
],
"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": "0xdac9318f",
"selector": "0xdac9318f",
"calldata_variants": [
"0xdac9318f",
"0xdac9318f0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xe4891825",
"selector": "0xe4891825",
"calldata_variants": [
"0xe4891825",
"0xe48918250000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xe8d96a2e",
"selector": "0xe8d96a2e",
"calldata_variants": [
"0xe8d96a2e",
"0xe8d96a2e0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xed03e78c",
"selector": "0xed03e78c",
"calldata_variants": [
"0xed03e78c",
"0xed03e78c0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xf2309ab6",
"selector": "0xf2309ab6",
"calldata_variants": [
"0xf2309ab6",
"0xf2309ab60000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xff0e6489",
"selector": "0xff0e6489",
"calldata_variants": [
"0xff0e6489",
"0xff0e64890000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xc5b26eaa",
"selector": "0xc5b26eaa",
"calldata_variants": [
"0xc5b26eaa",
"0xc5b26eaa0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xca15c873",
"selector": "0xca15c873",
"calldata_variants": [
"0xca15c873",
"0xca15c8730000000000000000000000000000000000000000000000000000000000000000"
]
}
]
}
evidence_json{
"examples": [
{
"pc": 3147,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
},
{
"pc": 5240,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
},
{
"pc": 9956,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
}
],
"call_count": 7,
"guards_detected": [],
"untrusted_call_count": 7
}
|
| high | other | detector | ETH value transfer possible | 55 | no | no |
viewtrace_id: 0x46413b6eeb90d80b705b7ab50ea778965eecda7dac896bac3a4453d5c2e42ce5
call_targets:
0x00000000d681e85e5783588f87a9573cb97eda01
target_varies:
no
classification:
constant_target
validation_json{
"sink": "CALL",
"errors": 0,
"status": "sink_reached",
"attempts": 1,
"trace_id": "0x46413b6eeb90d80b705b7ab50ea778965eecda7dac896bac3a4453d5c2e42ce5",
"confirmed": false,
"trace_mode": "callTracer",
"call_targets": [
"0x00000000d681e85e5783588f87a9573cb97eda01"
],
"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": "0xdac9318f",
"selector": "0xdac9318f",
"calldata_variants": [
"0xdac9318f",
"0xdac9318f0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xe4891825",
"selector": "0xe4891825",
"calldata_variants": [
"0xe4891825",
"0xe48918250000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xe8d96a2e",
"selector": "0xe8d96a2e",
"calldata_variants": [
"0xe8d96a2e",
"0xe8d96a2e0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xed03e78c",
"selector": "0xed03e78c",
"calldata_variants": [
"0xed03e78c",
"0xed03e78c0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xf2309ab6",
"selector": "0xf2309ab6",
"calldata_variants": [
"0xf2309ab6",
"0xf2309ab60000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xff0e6489",
"selector": "0xff0e6489",
"calldata_variants": [
"0xff0e6489",
"0xff0e64890000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xc5b26eaa",
"selector": "0xc5b26eaa",
"calldata_variants": [
"0xc5b26eaa",
"0xc5b26eaa0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xca15c873",
"selector": "0xca15c873",
"calldata_variants": [
"0xca15c873",
"0xca15c8730000000000000000000000000000000000000000000000000000000000000000"
]
}
]
}
evidence_json{
"examples": [
{
"pc": 3147,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
},
{
"pc": 5240,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
},
{
"pc": 9956,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
}
],
"eth_value_calls": 6,
"guards_detected": []
}
|
| high | other | codex | Unchecked CowSwap feeAmount lets a limit order drain extra sellToken beyond params.amountIn | 85 | no | — |
viewevidence_json{
"evidence": "In src/utils/SwapModule.sol, checkCowswapOrder validates sellToken, buyToken, receiver, sellAmount, buyAmount, validTo, kind, and token balance modes, but never checks order.feeAmount or order.partiallyFillable. createLimitOrder then presigns that unchecked order. CowSwap settlement adds the fee to the amount pulled from the owner: for sell orders it sets executedFeeAmount = order.feeAmount (or a proportional fraction for partial fills) and then executes executedSellAmount = executedSellAmount + executedFeeAmount.",
"locations": [
"src/utils/SwapModule.sol:137",
"src/utils/SwapModule.sol:286",
"src/utils/SwapModule.sol:277"
],
"recommendation": "Validate the full GPv2Order.Data payload, not just sellAmount/buyAmount. At minimum require order.feeAmount == 0 unless fees are explicitly modeled in Params. If fees must be supported, include them in params and enforce balance/price checks on total spend (sellAmount + feeAmount). Also consider rejecting partiallyFillable orders unless their fee behavior is explicitly accounted for.",
"exploit_scenario": "An address with CALLER_ROLE first sets a large allowance for cowswapVaultRelayer via setCowswapApproval, then calls createLimitOrder with params.amountIn = X and params.minAmountOut matching an apparently valid order, but sets order.feeAmount to a large value. checkCowswapOrder only checks sellAmount/buyAmount/receiver/validTo and accepts the order. When the presigned order is settled, CowSwap charges executedSellAmount + executedFeeAmount from the module, so the contract can lose much more than X of sellToken while only enforcing the buyAmount floor for X. Any extra approved balance becomes spendable as fee."
}
|
| high | other | slither | GPv2Transfer.transferFromAccounts(IVault,GPv2Transfer.Data[],address) (lib/contracts/src/contracts/libraries/GPv2Transfer.sol#91-136) uses arbitrary from in transferFrom: transf... | 85 | no | — |
viewevidence_json{
"impact": "High",
"detector": "arbitrary-send-erc20",
"elements": [
{
"name": "transferFromAccounts",
"type": "function",
"source_mapping": {
"lines": [
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
],
"start": 3507,
"length": 1809,
"ending_column": 6,
"is_dependency": true,
"filename_short": "lib/contracts/src/contracts/libraries/GPv2Transfer.sol",
"starting_column": 5,
"filename_absolute": "/tmp/slither-bjjc5fai/lib/contracts/src/contracts/libraries/GPv2Transfer.sol",
"filename_relative": "lib/contracts/src/contracts/libraries/GPv2Transfer.sol"
},
"type_specific_fields": {
"parent": {
"name": "GPv2Transfer",
"type": "contract",
"source_mapping": {
"lines": [
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
],
"start": 296,
"length": 7744,
"ending_column": 2,
"is_dependency": true,
"filename_short": "lib/contracts/src/contracts/libraries/GPv2Transfer.sol",
"starting_column": 1,
"filename_absolute": "/tmp/slither-bjjc5fai/lib/contracts/src/contracts/libraries/GPv2Transfer.sol",
"filename_relative": "lib/contracts/src/contracts/libraries/GPv2Transfer.sol"
}
},
"signature": "transferFromAccounts(IVault,GPv2Transfer.Data[],address)"
}
},
{
"name": "transfer.token.safeTransferFrom(transfer.account,recipient,transfer.amount)",
"type": "node",
"source_mapping": {
"lines": [
113,
114,
115,
116,
117
],
"start": 4402,
"length": 155,
"ending_column": 18,
"is_dependency": true,
"filename_short": "lib/contracts/src/contracts/libraries/GPv2Transfer.sol",
"starting_column": 17,
"filename_absolute": "/tmp/slither-bjjc5fai/lib/contracts/src/contracts/libraries/GPv2Transfer.sol",
"filename_relative": "lib/contracts/src/contracts/libraries/GPv2Transfer.sol"
},
"type_specific_fields": {
"parent": {
"name": "transferFromAccounts",
"type": "function",
"source_mapping": {
"lines": [
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
],
"start": 3507,
"length": 1809,
"ending_column": 6,
"is_dependency": true,
"filename_short": "lib/contracts/src/contracts/libraries/GPv2Transfer.sol",
"starting_column": 5,
"filename_absolute": "/tmp/slither-bjjc5fai/lib/contracts/src/contracts/libraries/GPv2Transfer.sol",
"filename_relative": "lib/contracts/src/contracts/libraries/GPv2Transfer.sol"
},
"type_specific_fields": {
"parent": {
"name": "GPv2Transfer",
"type": "contract",
"source_mapping": {
"lines": [
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
],
"start": 296,
"length": 7744,
"ending_column": 2,
"is_dependency": true,
"filename_short": "lib/contracts/src/contracts/libraries/GPv2Transfer.sol",
"starting_column": 1,
"filename_absolute": "/tmp/slither-bjjc5fai/lib/contracts/src/contracts/libraries/GPv2Transfer.sol",
"filename_relative": "lib/contracts/src/contracts/libraries/GPv2Transfer.sol"
}
},
"signature": "transferFromAccounts(IVault,GPv2Transfer.Data[],address)"
}
}
}
}
],
"locations": [
{
"file": "lib/contracts/src/contracts/libraries/GPv2Transfer.sol",
"name": "transferFromAccounts",
"type": "function",
"lines": [
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
]
},
{
"file": "lib/contracts/src/contracts/libraries/GPv2Transfer.sol",
"name": "transfer.token.safeTransferFrom(transfer.account,recipient,transfer.amount)",
"type": "node",
"lines": [
113,
114,
115,
116,
117
]
}
],
"description": "GPv2Transfer.transferFromAccounts(IVault,GPv2Transfer.Data[],address) (lib/contracts/src/contracts/libraries/GPv2Transfer.sol#91-136) uses arbitrary from in transferFrom: transfer.token.safeTransferFrom(transfer.account,recipient,transfer.amount) (lib/contracts/src/contracts/libraries/GPv2Transfer.sol#113-117)"
}
|
| high | other | slither | GPv2Transfer.fastTransferFromAccount(IVault,GPv2Transfer.Data,address) (lib/contracts/src/contracts/libraries/GPv2Transfer.sol#46-77) uses arbitrary from in transferFrom: transf... | 85 | no | — |
viewevidence_json{
"impact": "High",
"detector": "arbitrary-send-erc20",
"elements": [
{
"name": "fastTransferFromAccount",
"type": "function",
"source_mapping": {
"lines": [
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
],
"start": 1787,
"length": 1123,
"ending_column": 6,
"is_dependency": true,
"filename_short": "lib/contracts/src/contracts/libraries/GPv2Transfer.sol",
"starting_column": 5,
"filename_absolute": "/tmp/slither-bjjc5fai/lib/contracts/src/contracts/libraries/GPv2Transfer.sol",
"filename_relative": "lib/contracts/src/contracts/libraries/GPv2Transfer.sol"
},
"type_specific_fields": {
"parent": {
"name": "GPv2Transfer",
"type": "contract",
"source_mapping": {
"lines": [
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
],
"start": 296,
"length": 7744,
"ending_column": 2,
"is_dependency": true,
"filename_short": "lib/contracts/src/contracts/libraries/GPv2Transfer.sol",
"starting_column": 1,
"filename_absolute": "/tmp/slither-bjjc5fai/lib/contracts/src/contracts/libraries/GPv2Transfer.sol",
"filename_relative": "lib/contracts/src/contracts/libraries/GPv2Transfer.sol"
}
},
"signature": "fastTransferFromAccount(IVault,GPv2Transfer.Data,address)"
}
},
{
"name": "transfer.token.safeTransferFrom(transfer.account,recipient,transfer.amount)",
"type": "node",
"source_mapping": {
"lines": [
57,
58,
59,
60,
61
],
"start": 2121,
"length": 139,
"ending_column": 14,
"is_dependency": true,
"filename_short": "lib/contracts/src/contracts/libraries/GPv2Transfer.sol",
"starting_column": 13,
"filename_absolute": "/tmp/slither-bjjc5fai/lib/contracts/src/contracts/libraries/GPv2Transfer.sol",
"filename_relative": "lib/contracts/src/contracts/libraries/GPv2Transfer.sol"
},
"type_specific_fields": {
"parent": {
"name": "fastTransferFromAccount",
"type": "function",
"source_mapping": {
"lines": [
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
],
"start": 1787,
"length": 1123,
"ending_column": 6,
"is_dependency": true,
"filename_short": "lib/contracts/src/contracts/libraries/GPv2Transfer.sol",
"starting_column": 5,
"filename_absolute": "/tmp/slither-bjjc5fai/lib/contracts/src/contracts/libraries/GPv2Transfer.sol",
"filename_relative": "lib/contracts/src/contracts/libraries/GPv2Transfer.sol"
},
"type_specific_fields": {
"parent": {
"name": "GPv2Transfer",
"type": "contract",
"source_mapping": {
"lines": [
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
],
"start": 296,
"length": 7744,
"ending_column": 2,
"is_dependency": true,
"filename_short": "lib/contracts/src/contracts/libraries/GPv2Transfer.sol",
"starting_column": 1,
"filename_absolute": "/tmp/slither-bjjc5fai/lib/contracts/src/contracts/libraries/GPv2Transfer.sol",
"filename_relative": "lib/contracts/src/contracts/libraries/GPv2Transfer.sol"
}
},
"signature": "fastTransferFromAccount(IVault,GPv2Transfer.Data,address)"
}
}
}
}
],
"locations": [
{
"file": "lib/contracts/src/contracts/libraries/GPv2Transfer.sol",
"name": "fastTransferFromAccount",
"type": "function",
"lines": [
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
]
},
{
"file": "lib/contracts/src/contracts/libraries/GPv2Transfer.sol",
"name": "transfer.token.safeTransferFrom(transfer.account,recipient,transfer.amount)",
"type": "node",
"lines": [
57,
58,
59,
60,
61
]
}
],
"description": "GPv2Transfer.fastTransferFromAccount(IVault,GPv2Transfer.Data,address) (lib/contracts/src/contracts/libraries/GPv2Transfer.sol#46-77) uses arbitrary from in transferFrom: transfer.token.safeTransferFrom(transfer.account,recipient,transfer.amount) (lib/contracts/src/contracts/libraries/GPv2Transfer.sol#57-61)"
}
|
| high | other | slither | TransferLibrary.receiveAssets(address,address,uint256) (src/libraries/TransferLibrary.sol#40-48) uses arbitrary from in transferFrom: IERC20(asset).safeTransferFrom(from,address... | 85 | no | — |
viewevidence_json{
"impact": "High",
"detector": "arbitrary-send-erc20",
"elements": [
{
"name": "receiveAssets",
"type": "function",
"source_mapping": {
"lines": [
40,
41,
42,
43,
44,
45,
46,
47,
48
],
"start": 1745,
"length": 304,
"ending_column": 6,
"is_dependency": false,
"filename_short": "src/libraries/TransferLibrary.sol",
"starting_column": 5,
"filename_absolute": "/tmp/slither-bjjc5fai/src/libraries/TransferLibrary.sol",
"filename_relative": "src/libraries/TransferLibrary.sol"
},
"type_specific_fields": {
"parent": {
"name": "TransferLibrary",
"type": "contract",
"source_mapping": {
"lines": [
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
],
"start": 502,
"length": 2088,
"ending_column": 2,
"is_dependency": false,
"filename_short": "src/libraries/TransferLibrary.sol",
"starting_column": 1,
"filename_absolute": "/tmp/slither-bjjc5fai/src/libraries/TransferLibrary.sol",
"filename_relative": "src/libraries/TransferLibrary.sol"
}
},
"signature": "receiveAssets(address,address,uint256)"
}
},
{
"name": "IERC20(asset).safeTransferFrom(from,address(this),assets)",
"type": "node",
"source_mapping": {
"lines": [
46
],
"start": 1973,
"length": 59,
"ending_column": 72,
"is_dependency": false,
"filename_short": "src/libraries/TransferLibrary.sol",
"starting_column": 13,
"filename_absolute": "/tmp/slither-bjjc5fai/src/libraries/TransferLibrary.sol",
"filename_relative": "src/libraries/TransferLibrary.sol"
},
"type_specific_fields": {
"parent": {
"name": "receiveAssets",
"type": "function",
"source_mapping": {
"lines": [
40,
41,
42,
43,
44,
45,
46,
47,
48
],
"start": 1745,
"length": 304,
"ending_column": 6,
"is_dependency": false,
"filename_short": "src/libraries/TransferLibrary.sol",
"starting_column": 5,
"filename_absolute": "/tmp/slither-bjjc5fai/src/libraries/TransferLibrary.sol",
"filename_relative": "src/libraries/TransferLibrary.sol"
},
"type_specific_fields": {
"parent": {
"name": "TransferLibrary",
"type": "contract",
"source_mapping": {
"lines": [
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
],
"start": 502,
"length": 2088,
"ending_column": 2,
"is_dependency": false,
"filename_short": "src/libraries/TransferLibrary.sol",
"starting_column": 1,
"filename_absolute": "/tmp/slither-bjjc5fai/src/libraries/TransferLibrary.sol",
"filename_relative": "src/libraries/TransferLibrary.sol"
}
},
"signature": "receiveAssets(address,address,uint256)"
}
}
}
}
],
"locations": [
{
"file": "src/libraries/TransferLibrary.sol",
"name": "receiveAssets",
"type": "function",
"lines": [
40,
41,
42,
43,
44,
45,
46,
47,
48
]
},
{
"file": "src/libraries/TransferLibrary.sol",
"name": "IERC20(asset).safeTransferFrom(from,address(this),assets)",
"type": "node",
"lines": [
46
]
}
],
"description": "TransferLibrary.receiveAssets(address,address,uint256) (src/libraries/TransferLibrary.sol#40-48) uses arbitrary from in transferFrom: IERC20(asset).safeTransferFrom(from,address(this),assets) (src/libraries/TransferLibrary.sol#46)"
}
|
| high | upgradeability | slither | StorageAccessible.simulateDelegatecallInternal(address,bytes) (lib/contracts/src/contracts/mixins/StorageAccessible.sol#87-95) uses delegatecall to a input-controlled function id | 85 | no | — |
viewevidence_json{
"impact": "High",
"detector": "controlled-delegatecall",
"elements": [
{
"name": "simulateDelegatecallInternal",
"type": "function",
"source_mapping": {
"lines": [
87,
88,
89,
90,
91,
92,
93,
94,
95
],
"start": 3738,
"length": 376,
"ending_column": 6,
"is_dependency": true,
"filename_short": "lib/contracts/src/contracts/mixins/StorageAccessible.sol",
"starting_column": 5,
"filename_absolute": "/tmp/slither-bjjc5fai/lib/contracts/src/contracts/mixins/StorageAccessible.sol",
"filename_relative": "lib/contracts/src/contracts/mixins/StorageAccessible.sol"
},
"type_specific_fields": {
"parent": {
"name": "StorageAccessible",
"type": "contract",
"source_mapping": {
"lines": [
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
],
"start": 1305,
"length": 3226,
"ending_column": 2,
"is_dependency": true,
"filename_short": "lib/contracts/src/contracts/mixins/StorageAccessible.sol",
"starting_column": 1,
"filename_absolute": "/tmp/slither-bjjc5fai/lib/contracts/src/contracts/mixins/StorageAccessible.sol",
"filename_relative": "lib/contracts/src/contracts/mixins/StorageAccessible.sol"
}
},
"signature": "simulateDelegatecallInternal(address,bytes)"
}
},
{
"name": "(success,response) = targetContract.delegatecall(calldataPayload)",
"type": "node",
"source_mapping": {
"lines": [
93
],
"start": 3984,
"length": 66,
"ending_column": 75,
"is_dependency": true,
"filename_short": "lib/contracts/src/contracts/mixins/StorageAccessible.sol",
"starting_column": 9,
"filename_absolute": "/tmp/slither-bjjc5fai/lib/contracts/src/contracts/mixins/StorageAccessible.sol",
"filename_relative": "lib/contracts/src/contracts/mixins/StorageAccessible.sol"
},
"type_specific_fields": {
"parent": {
"name": "simulateDelegatecallInternal",
"type": "function",
"source_mapping": {
"lines": [
87,
88,
89,
90,
91,
92,
93,
94,
95
],
"start": 3738,
"length": 376,
"ending_column": 6,
"is_dependency": true,
"filename_short": "lib/contracts/src/contracts/mixins/StorageAccessible.sol",
"starting_column": 5,
"filename_absolute": "/tmp/slither-bjjc5fai/lib/contracts/src/contracts/mixins/StorageAccessible.sol",
"filename_relative": "lib/contracts/src/contracts/mixins/StorageAccessible.sol"
},
"type_specific_fields": {
"parent": {
"name": "StorageAccessible",
"type": "contract",
"source_mapping": {
"lines": [
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
],
"start": 1305,
"length": 3226,
"ending_column": 2,
"is_dependency": true,
"filename_short": "lib/contracts/src/contracts/mixins/StorageAccessible.sol",
"starting_column": 1,
"filename_absolute": "/tmp/slither-bjjc5fai/lib/contracts/src/contracts/mixins/StorageAccessible.sol",
"filename_relative": "lib/contracts/src/contracts/mixins/StorageAccessible.sol"
}
},
"signature": "simulateDelegatecallInternal(address,bytes)"
}
}
}
}
],
"locations": [
{
"file": "lib/contracts/src/contracts/mixins/StorageAccessible.sol",
"name": "simulateDelegatecallInternal",
"type": "function",
"lines": [
87,
88,
89,
90,
91,
92,
93,
94,
95
]
},
{
"file": "lib/contracts/src/contracts/mixins/StorageAccessible.sol",
"name": "(success,response) = targetContract.delegatecall(calldataPayload)",
"type": "node",
"lines": [
93
]
}
],
"description": "StorageAccessible.simulateDelegatecallInternal(address,bytes) (lib/contracts/src/contracts/mixins/StorageAccessible.sol#87-95) uses delegatecall to a input-controlled function id\n\t- (success,response) = targetContract.delegatecall(calldataPayload) (lib/contracts/src/contracts/mixins/StorageAccessible.sol#93)"
}
|
| medium | other | detector | CREATE/CREATE2 reachable | 45 | no | no |
viewtrace_id: 0x55aa683749f92f6346227bd6b14c873acdb4a4a461962228dd8fe49160e62935
validation_json{
"sink": "CREATE",
"errors": 0,
"status": "unknown",
"attempts": 32,
"trace_id": "0x55aa683749f92f6346227bd6b14c873acdb4a4a461962228dd8fe49160e62935",
"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": "0xdac9318f",
"selector": "0xdac9318f",
"calldata_variants": [
"0xdac9318f",
"0xdac9318f0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xe4891825",
"selector": "0xe4891825",
"calldata_variants": [
"0xe4891825",
"0xe48918250000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xe8d96a2e",
"selector": "0xe8d96a2e",
"calldata_variants": [
"0xe8d96a2e",
"0xe8d96a2e0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xed03e78c",
"selector": "0xed03e78c",
"calldata_variants": [
"0xed03e78c",
"0xed03e78c0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xf2309ab6",
"selector": "0xf2309ab6",
"calldata_variants": [
"0xf2309ab6",
"0xf2309ab60000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xff0e6489",
"selector": "0xff0e6489",
"calldata_variants": [
"0xff0e6489",
"0xff0e64890000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xc5b26eaa",
"selector": "0xc5b26eaa",
"calldata_variants": [
"0xc5b26eaa",
"0xc5b26eaa0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xca15c873",
"selector": "0xca15c873",
"calldata_variants": [
"0xca15c873",
"0xca15c8730000000000000000000000000000000000000000000000000000000000000000"
]
}
]
}
evidence_json{
"create_count": 1,
"create2_count": 0
}
|
| low | other | cast | Contract creation opcode present | 60 | no | — |
viewevidence_json{
"notes": "runtime can deploy contracts dynamically via CREATE/CREATE2",
"create_count": 1,
"create2_count": 0
}
|
| 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
}
|
| info | other | cast | Heavy EXTCODE*/BALANCE usage | 55 | no | — |
viewevidence_json{
"notes": "frequent external code or balance checks; may indicate introspection or validation logic",
"ext_balance_count": 7
}
|