019c0ea9-0936-7262-bcf9-9ef5de23bf57
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 |
|---|---|---|---|---|
| 42019 | artifact.fetch | complete | 1 / 3 | 2 months ago |
| 42020 | proxy.resolve | complete | 1 / 3 | 2 months ago |
| 42021 | tool.cast_disasm | complete | 1 / 3 | 2 months ago |
| 42022 | analysis.bundle | complete | 1 / 3 | 2 months ago |
| 42023 | capability.graph | complete | 1 / 3 | 2 months ago |
| 42024 | detector.run | complete | 1 / 3 | 2 months ago |
| 42025 | validation.fork | complete | 1 / 3 | 2 months ago |
| 42410 | report.consolidate | complete | 1 / 6 | 2 months ago |
| 42411 | tool.slither | complete | 1 / 2 | 2 months ago |
{
"status": "not_proxy"
}
'forge clean' running (wd: /tmp/slither-fbqpa74m)
'forge config --json' running
'forge build --build-info --skip ./test/** ./script/** --force' running (wd: /tmp/slither-fbqpa74m)
Pool.safeRewardTransfer(address,uint256) (contracts/Contract.sol#1269-1276) ignores return value by rewardToken.transfer(_to,balance) (contracts/Contract.sol#1272-1273)
Pool.safeRewardTransfer(address,uint256) (contracts/Contract.sol#1269-1276) ignores return value by rewardToken.transfer(_to,_amount) (contracts/Contract.sol#1273-1276)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#unchecked-transfer
Pool.updatePool(uint256) (contracts/Contract.sol#1207-1221) uses a dangerous strict equality:
- totalStake == 0 (contracts/Contract.sol#1213)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#dangerous-strict-equalities
Reentrancy in Pool.deposit(uint256,uint256) (contracts/Contract.sol#1237-1255):
External calls:
- updatePool(_pid) (contracts/Contract.sol#1242)
- rewardToken.mint(address(this),reward) (contracts/Contract.sol#1216-1217)
- safeRewardTransfer(msg.sender,pendingReward) (contracts/Contract.sol#1248-1249)
- rewardToken.transfer(_to,balance) (contracts/Contract.sol#1272-1273)
- rewardToken.transfer(_to,_amount) (contracts/Contract.sol#1273-1276)
- pool.token.safeTransferFrom(address(msg.sender),address(this),_amount) (contracts/Contract.sol#1250)
State variables written after the call(s):
- user.amount = user.amount.add(_amount) (contracts/Contract.sol#1250-1251)
Pool.users (contracts/Contract.sol#1111) can be used in cross function reentrancies:
- Pool.deposit(uint256,uint256) (contracts/Contract.sol#1237-1255)
- Pool.pending(uint256,address) (contracts/Contract.sol#1221-1237)
- Pool.users (contracts/Contract.sol#1111)
- Pool.withdraw(uint256,uint256) (contracts/Contract.sol#1255-1269)
- user.rewardDebt = user.amount.mul(pool.accRewardPerShare).div(1e12) (contracts/Contract.sol#1251-1254)
Pool.users (contracts/Contract.sol#1111) can be used in cross function reentrancies:
- Pool.deposit(uint256,uint256) (contracts/Contract.sol#1237-1255)
- Pool.pending(uint256,address) (contracts/Contract.sol#1221-1237)
- Pool.users (contracts/Contract.sol#1111)
- Pool.withdraw(uint256,uint256) (contracts/Contract.sol#1255-1269)
Reentrancy in Pool.updatePool(uint256) (contracts/Contract.sol#1207-1221):
External calls:
- rewardToken.mint(address(this),reward) (contracts/Contract.sol#1216-1217)
State variables written after the call(s):
- pool.accRewardPerShare = pool.accRewardPerShare.add(reward.mul(1e12).div(totalStake)) (contracts/Contract.sol#1217-1220)
Pool.pools (contracts/Contract.sol#1111) can be used in cross function reentrancies:
- Pool.addPool(IERC20,uint256,uint256,uint256,uint256) (contracts/Contract.sol#1131-1169)
- Pool.checkPool(uint256) (contracts/Contract.sol#1123-1124)
- Pool.deposit(uint256,uint256) (contracts/Contract.sol#1237-1255)
- Pool.pending(uint256,address) (contracts/Contract.sol#1221-1237)
- Pool.poolLength() (contracts/Contract.sol#1124-1129)
- Pool.pools (contracts/Contract.sol#1111)
- Pool.updatePool(uint256) (contracts/Contract.sol#1207-1221)
- Pool.withdraw(uint256,uint256) (contracts/Contract.sol#1255-1269)
- pool.lastRewardBlock = block.number (contracts/Contract.sol#1220-1221)
Pool.pools (contracts/Contract.sol#1111) can be used in cross function reentrancies:
- Pool.addPool(IERC20,uint256,uint256,uint256,uint256) (contracts/Contract.sol#1131-1169)
- Pool.checkPool(uint256) (contracts/Contract.sol#1123-1124)
- Pool.deposit(uint256,uint256) (contracts/Contract.sol#1237-1255)
- Pool.pending(uint256,address) (contracts/Contract.sol#1221-1237)
- Pool.poolLength() (contracts/Contract.sol#1124-1129)
- Pool.pools (contracts/Contract.sol#1111)
- Pool.updatePool(uint256) (contracts/Contract.sol#1207-1221)
- Pool.withdraw(uint256,uint256) (contracts/Contract.sol#1255-1269)
Reentrancy in Pool.withdraw(uint256,uint256) (contracts/Contract.sol#1255-1269):
External calls:
- updatePool(_pid) (contracts/Contract.sol#1259)
- rewardToken.mint(address(this),reward) (contracts/Contract.sol#1216-1217)
- safeRewardTransfer(msg.sender,pendingReward) (contracts/Contract.sol#1261-1263)
- rewardToken.transfer(_to,balance) (contracts/Contract.sol#1272-1273)
- rewardToken.transfer(_to,_amount) (contracts/Contract.sol#1273-1276)
State variables written after the call(s):
- user.amount = user.amount.sub(_amount) (contracts/Contract.sol#1263-1265)
Pool.users (contracts/Contract.sol#1111) can be used in cross function reentrancies:
- Pool.deposit(uint256,uint256) (contracts/Contract.sol#1237-1255)
- Pool.pending(uint256,address) (contracts/Contract.sol#1221-1237)
- Pool.users (contracts/Contract.sol#1111)
- Pool.withdraw(uint256,uint256) (contracts/Contract.sol#1255-1269)
- user.rewardDebt = user.amount.mul(pool.accRewardPerShare).div(1e12) (contracts/Contract.sol#1266)
Pool.users (contracts/Contract.sol#1111) can be used in cross function reentrancies:
- Pool.deposit(uint256,uint256) (contracts/Contract.sol#1237-1255)
- Pool.pending(uint256,address) (contracts/Contract.sol#1221-1237)
- Pool.users (contracts/Contract.sol#1111)
- Pool.withdraw(uint256,uint256) (contracts/Contract.sol#1255-1269)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-1
ERC20.constructor(string,string).name (contracts/Contract.sol#837) shadows:
- ERC20.name() (contracts/Contract.sol#841-845) (function)
ERC20.constructor(string,string).symbol (contracts/Contract.sol#837-838) shadows:
- ERC20.symbol() (contracts/Contract.sol#847-852) (function)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#local-variable-shadowing
Reentrancy in Pool.deposit(uint256,uint256) (contracts/Contract.sol#1237-1255):
External calls:
- updatePool(_pid) (contracts/Contract.sol#1242)
- rewardToken.mint(address(this),reward) (contracts/Contract.sol#1216-1217)
- safeRewardTransfer(msg.sender,pendingReward) (contracts/Contract.sol#1248-1249)
- rewardToken.transfer(_to,balance) (contracts/Contract.sol#1272-1273)
- rewardToken.transfer(_to,_amount) (contracts/Contract.sol#1273-1276)
- pool.token.safeTransferFrom(address(msg.sender),address(this),_amount) (contracts/Contract.sol#1250)
Event emitted after the call(s):
- Deposit(msg.sender,_pid,_amount) (contracts/Contract.sol#1254)
Reentrancy in Pool.withdraw(uint256,uint256) (contracts/Contract.sol#1255-1269):
External calls:
- updatePool(_pid) (contracts/Contract.sol#1259)
- rewardToken.mint(address(this),reward) (contracts/Contract.sol#1216-1217)
- safeRewardTransfer(msg.sender,pendingReward) (contracts/Contract.sol#1261-1263)
- rewardToken.transfer(_to,balance) (contracts/Contract.sol#1272-1273)
- rewardToken.transfer(_to,_amount) (contracts/Contract.sol#1273-1276)
- pool.token.safeTransfer(address(msg.sender),_amount) (contracts/Contract.sol#1267-1268)
Event emitted after the call(s):
- Withdraw(msg.sender,_pid,_amount) (contracts/Contract.sol#1268-1269)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-3
Address.isContract(address) (contracts/Contract.sol#261-275) uses assembly
- INLINE ASM (contracts/Contract.sol#272-273)
Address._functionCallWithValue(address,bytes,uint256,string) (contracts/Contract.sol#356-373) uses assembly
- INLINE ASM (contracts/Contract.sol#367-371)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#assembly-usage
3 different versions of Solidity are used:
- Version constraint ^0.6.0 is used by:
-^0.6.0 (contracts/Contract.sol#3-5)
-^0.6.0 (contracts/Contract.sol#78-79)
-^0.6.0 (contracts/Contract.sol#375)
-^0.6.0 (contracts/Contract.sol#454)
-^0.6.0 (contracts/Contract.sol#689)
-^0.6.0 (contracts/Contract.sol#719)
-^0.6.0 (contracts/Contract.sol#786-787)
- Version constraint ^0.6.2 is used by:
-^0.6.2 (contracts/Contract.sol#235-237)
- Version constraint 0.6.12 is used by:
-0.6.12 (contracts/Contract.sol#1089)
-0.6.12 (contracts/Contract.sol#1095)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#different-pragma-directives-are-used
Context._msgData() (contracts/Contract.sol#710-718) is never used and should be removed
ERC20._burn(address,uint256) (contracts/Contract.sol#1023-1036) is never used and should be removed
ERC20._setupDecimals(uint8) (contracts/Contract.sol#1068-1070) is never used and should be removed
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#dead-code
Version constraint ^0.6.0 contains known severe issues (https://solidity.readthedocs.io/en/latest/bugs.html)
- AbiReencodingHeadOverflowWithStaticArrayCleanup
- DirtyBytesArrayToStorage
- NestedCalldataArrayAbiReencodingSizeValidation
- ABIDecodeTwoDimensionalArrayMemory
- KeccakCaching
- EmptyByteArrayCopy
- DynamicArrayCleanup
- MissingEscapingInFormatting
- ArraySliceDynamicallyEncodedBaseType
- ImplicitConstructorCallvalueCheck
- TupleAssignmentMultiStackSlotComponents
- MemoryArrayCreationOverflow
- YulOptimizerRedundantAssignmentBreakContinue.
It is used by:
- ^0.6.0 (contracts/Contract.sol#3-5)
- ^0.6.0 (contracts/Contract.sol#78-79)
- ^0.6.0 (contracts/Contract.sol#375)
- ^0.6.0 (contracts/Contract.sol#454)
- ^0.6.0 (contracts/Contract.sol#689)
- ^0.6.0 (contracts/Contract.sol#719)
- ^0.6.0 (contracts/Contract.sol#786-787)
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 (contracts/Contract.sol#235-237)
Version constraint 0.6.12 contains known severe issues (https://solidity.readthedocs.io/en/latest/bugs.html)
- FullInlinerNonExpressionSplitArgumentEvaluationOrder
- MissingSideEffectsOnSelectorAccess
- AbiReencodingHeadOverflowWithStaticArrayCleanup
- DirtyBytesArrayToStorage
- DataLocationChangeInInternalOverride
- NestedCalldataArrayAbiReencodingSizeValidation
- SignedImmutables
- ABIDecodeTwoDimensionalArrayMemory
- KeccakCaching
- EmptyByteArrayCopy
- DynamicArrayCleanup.
It is used by:
- 0.6.12 (contracts/Contract.sol#1089)
- 0.6.12 (contracts/Contract.sol#1095)
solc-0.6.12 is an outdated solc version. Use a more recent version (at least 0.8.0), if possible.
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#incorrect-versions-of-solidity
Low level call in Address.sendValue(address,uint256) (contracts/Contract.sol#292-298):
- (success,None) = recipient.call{value: amount}() (contracts/Contract.sol#295-297)
Low level call in Address._functionCallWithValue(address,bytes,uint256,string) (contracts/Contract.sol#356-373):
- (success,returndata) = target.call{value: weiValue}(data) (contracts/Contract.sol#360-363)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#low-level-calls
Parameter Token.mint(address,uint256)._to (contracts/Contract.sol#1092) is not in mixedCase
Parameter Token.mint(address,uint256)._amount (contracts/Contract.sol#1092-1093) is not in mixedCase
Parameter Pool.addPool(IERC20,uint256,uint256,uint256,uint256)._token (contracts/Contract.sol#1131-1135) is not in mixedCase
Parameter Pool.addPool(IERC20,uint256,uint256,uint256,uint256)._startBlock (contracts/Contract.sol#1136-1139) is not in mixedCase
Parameter Pool.addPool(IERC20,uint256,uint256,uint256,uint256)._endBlock (contracts/Contract.sol#1139-1140) is not in mixedCase
Parameter Pool.addPool(IERC20,uint256,uint256,uint256,uint256)._rewardPerBlock (contracts/Contract.sol#1140) is not in mixedCase
Parameter Pool.addPool(IERC20,uint256,uint256,uint256,uint256)._halvingPeriod (contracts/Contract.sol#1140-1141) is not in mixedCase
Parameter Pool.updatePool(uint256)._pid (contracts/Contract.sol#1207) is not in mixedCase
Parameter Pool.pending(uint256,address)._pid (contracts/Contract.sol#1221) is not in mixedCase
Parameter Pool.pending(uint256,address)._user (contracts/Contract.sol#1221-1222) is not in mixedCase
Parameter Pool.deposit(uint256,uint256)._pid (contracts/Contract.sol#1237) is not in mixedCase
Parameter Pool.deposit(uint256,uint256)._amount (contracts/Contract.sol#1237) is not in mixedCase
Parameter Pool.withdraw(uint256,uint256)._pid (contracts/Contract.sol#1255) is not in mixedCase
Parameter Pool.withdraw(uint256,uint256)._amount (contracts/Contract.sol#1255-1256) is not in mixedCase
Parameter Pool.safeRewardTransfer(address,uint256)._to (contracts/Contract.sol#1270-1271) is not in mixedCase
Parameter Pool.safeRewardTransfer(address,uint256)._amount (contracts/Contract.sol#1271) is not in mixedCase
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#conformance-to-solidity-naming-conventions
Redundant expression "this (contracts/Contract.sol#716-717)" inContext (contracts/Contract.sol#705-718)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#redundant-statements
Loop condition i < pools.length (contracts/Contract.sol#1144) should use cached array length instead of referencing `length` member of the storage array.
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#cache-array-length
Pool.rewardToken (contracts/Contract.sol#1109-1110) should be immutable
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#state-variables-that-could-be-declared-immutable
. analyzed (10 contracts with 100 detectors), 41 result(s) found
{
"solc": {
"status": "ok",
"use_rc": 0,
"version": "0.6.12",
"strategy": "solc-select",
"solc_path": "/var/www/tripwire/.venv/bin/solc",
"install_rc": 0,
"use_stderr": null,
"use_stdout": "Switched global version to 0.6.12",
"install_stderr": null,
"install_stdout": "Version '0.6.12' is already installed, skipping..."
},
"solc_args": "--base-path /tmp/slither-fbqpa74m --allow-paths /tmp/slither-fbqpa74m,/tmp/slither-fbqpa74m/lib,/tmp/slither-fbqpa74m/src",
"remappings": [],
"source_files": [
"contracts/Contract.sol"
],
"contract_count": 0,
"contract_names": [],
"detector_count": 41,
"workspace_hash": "cfbf281ee566557ea5ae89986f4cac2333aed545a97cad7f87e654aa99276c45",
"duration_seconds": 0.9905388355255127,
"solc_version_requested": "0.6.12"
}
{"no_findings":false,"summary":"Found 3 issues: reward calculation underflows after endBlock and can lock withdrawals; deposit can be reentered via ERC777/malicious pool tokens; fee-on-transfer/rebasing tokens break accounting and rewards.","findings":[{"severity":"high","category":"math","title":"Pool can be permanently bricked after endBlock due to underflow in reward calculation","exploit_scenario":"Once block.number > endBlock, the first call to updatePool (triggered by any deposit/withdraw) sets lastRewardBlock to the current block. On the next interaction, getTotalReward computes to = min(block.number, endBlock+1), which is now less than lastRewardBlock, so to.sub(from) underflows and reverts. This makes updatePool/pending/deposit/withdraw permanently revert, locking all remaining staked tokens. An attacker can trigger this by calling any pool action after endBlock, preventing others from withdrawing.","recommendation":"Guard in getTotalReward for lastRewardBlock >= endBlock+1 and return 0; or clamp lastRewardBlock to endBlock+1 in updatePool. Also validate endBlock > startBlock when adding pools.","evidence":"getTotalReward subtracts to.sub(from) without handling lastRewardBlock > endBlock+1, and updatePool sets lastRewardBlock = block.number even after endBlock.","locations":["contracts/Contract.sol:1201","contracts/Contract.sol:1205","contracts/Contract.sol:1206","contracts/Contract.sol:1207","contracts/Contract.sol:1251"]},{"severity":"medium","category":"reentrancy","title":"Reentrancy in deposit via untrusted pool tokens can double-claim rewards","exploit_scenario":"If a pool token is ERC777 or otherwise invokes callbacks on transferFrom, a malicious user contract can reenter deposit during pool.token.safeTransferFrom. Because rewardDebt and amount are only updated after the external call, the reentrant deposit can claim the same pending rewards multiple times, draining rewardToken.","recommendation":"Apply a reentrancy guard and/or move state updates (rewardDebt/amount) before external calls. Alternatively restrict pools to non-callback ERC20 tokens.","evidence":"deposit pays pending rewards, then calls pool.token.safeTransferFrom before updating user.amount and user.rewardDebt.","locations":["contracts/Contract.sol:1266","contracts/Contract.sol:1271","contracts/Contract.sol:1273","contracts/Contract.sol:1276","contracts/Contract.sol:1277"]},{"severity":"low","category":"other","title":"Fee-on-transfer/rebasing tokens break accounting and reward distribution","exploit_scenario":"For deflationary or rebasing tokens, the contract credits user.amount with the requested _amount even if fewer tokens were received. This lets users accrue rewards on more than their actual stake and can cause withdrawals to revert when the pool balance is insufficient.","recommendation":"Track actual received amount via pre/post balance checks, and maintain a separate totalStaked variable. Consider rejecting fee-on-transfer/rebasing tokens.","evidence":"user.amount is incremented by _amount without checking actual received tokens; totalStake is derived from balanceOf which can diverge from tracked user amounts.","locations":["contracts/Contract.sol:1242","contracts/Contract.sol:1266","contracts/Contract.sol:1276","contracts/Contract.sol:1277"]}]}
OpenAI Codex v0.77.0 (research preview)
--------
workdir: /tmp/codex-q804fcet
model: gpt-5.2-codex
provider: openai
approval: never
sandbox: read-only
reasoning effort: high
reasoning summaries: auto
session id: 019c0f64-f7f5-7523-af82-b49c4cb7a37a
--------
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.
mcp startup: no servers
exec
/bin/bash -lc ls in /tmp/codex-q804fcet succeeded in 15ms:
AUDIT_BUNDLE.txt
codex-output-schema.json
contracts
exec
/bin/bash -lc 'cat AUDIT_BUNDLE.txt' in /tmp/codex-q804fcet succeeded in 7ms:
This file concatenates the full contents of first-party Solidity sources for auditing.
Do not treat dependency code under lib/ or @openzeppelin/ as first-party.
================================================================================
FILE: contracts/Contract.sol
================================================================================
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
pragma solidity ^0.6.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
exec
/bin/bash -lc 'nl -ba contracts/Pool.sol' in /tmp/codex-q804fcet exited 1 in 7ms:
nl: contracts/Pool.sol: No such file or directory
exec
/bin/bash -lc 'rg --files' in /tmp/codex-q804fcet succeeded in 13ms:
codex-output-schema.json
AUDIT_BUNDLE.txt
contracts/Contract.sol
exec
/bin/bash -lc "nl -ba contracts/Contract.sol | sed -n '900,1150p'" in /tmp/codex-q804fcet succeeded in 7ms:
900 }
901
902 /**
903 * @dev See {IERC20-totalSupply}.
904 */
905 function totalSupply() public view override returns (uint256) {
906 return _totalSupply;
907 }
908
909 /**
910 * @dev See {IERC20-balanceOf}.
911 */
912 function balanceOf(address account) public view override returns (uint256) {
913 return _balances[account];
914 }
915
916 /**
917 * @dev See {IERC20-transfer}.
918 *
919 * Requirements:
exec
/bin/bash -lc "nl -ba contracts/Contract.sol | sed -n '1138,1320p'" in /tmp/codex-q804fcet succeeded in 6ms:
1138
1139 contract Pool is Ownable {
1140 using SafeMath for uint256;
1141 using SafeERC20 for IERC20;
1142
1143 struct UserInfo {
1144 uint256 amount;
1145 uint256 rewardDebt;
1146 }
1147
1148 struct PoolInfo {
1149 IERC20 token;
1150 uint256 startBlock;
1151 uint256 endBlock;
1152 uint256 rewardPerBlock;
1153 uint256 halvingPeriod;
1154 uint256 halving1Block;
1155 uint256 halving2Block;
1156 uint256 halving3Block;
1157 uint256 lastRewardBlock;
codex
{"no_findings":false,"summary":"Found 3 issues: reward calculation underflows after endBlock and can lock withdrawals; deposit can be reentered via ERC777/malicious pool tokens; fee-on-transfer/rebasing tokens break accounting and rewards.","findings":[{"severity":"high","category":"math","title":"Pool can be permanently bricked after endBlock due to underflow in reward calculation","exploit_scenario":"Once block.number > endBlock, the first call to updatePool (triggered by any deposit/withdraw) sets lastRewardBlock to the current block. On the next interaction, getTotalReward computes to = min(block.number, endBlock+1), which is now less than lastRewardBlock, so to.sub(from) underflows and reverts. This makes updatePool/pending/deposit/withdraw permanently revert, locking all remaining staked tokens. An attacker can trigger this by calling any pool action after endBlock, preventing others from withdrawing.","recommendation":"Guard in getTotalReward for lastRewardBlock >= endBlock+1 and return 0; or clamp lastRewardBlock to endBlock+1 in updatePool. Also validate endBlock > startBlock when adding pools.","evidence":"getTotalReward subtracts to.sub(from) without handling lastRewardBlock > endBlock+1, and updatePool sets lastRewardBlock = block.number even after endBlock.","locations":["contracts/Contract.sol:1201","contracts/Contract.sol:1205","contracts/Contract.sol:1206","contracts/Contract.sol:1207","contracts/Contract.sol:1251"]},{"severity":"medium","category":"reentrancy","title":"Reentrancy in deposit via untrusted pool tokens can double-claim rewards","exploit_scenario":"If a pool token is ERC777 or otherwise invokes callbacks on transferFrom, a malicious user contract can reenter deposit during pool.token.safeTransferFrom. Because rewardDebt and amount are only updated after the external call, the reentrant deposit can claim the same pending rewards multiple times, draining rewardToken.","recommendation":"Apply a reentrancy guard and/or move state updates (rewardDebt/amount) before external calls. Alternatively restrict pools to non-callback ERC20 tokens.","evidence":"deposit pays pending rewards, then calls pool.token.safeTransferFrom before updating user.amount and user.rewardDebt.","locations":["contracts/Contract.sol:1266","contracts/Contract.sol:1271","contracts/Contract.sol:1273","contracts/Contract.sol:1276","contracts/Contract.sol:1277"]},{"severity":"low","category":"other","title":"Fee-on-transfer/rebasing tokens break accounting and reward distribution","exploit_scenario":"For deflationary or rebasing tokens, the contract credits user.amount with the requested _amount even if fewer tokens were received. This lets users accrue rewards on more than their actual stake and can cause withdrawals to revert when the pool balance is insufficient.","recommendation":"Track actual received amount via pre/post balance checks, and maintain a separate totalStaked variable. Consider rejecting fee-on-transfer/rebasing tokens.","evidence":"user.amount is incremented by _amount without checking actual received tokens; totalStake is derived from balanceOf which can diverge from tracked user amounts.","locations":["contracts/Contract.sol:1242","contracts/Contract.sol:1266","contracts/Contract.sol:1276","contracts/Contract.sol:1277"]}]}
tokens used
33,192
{
"codex": {
"ran_at": "2026-01-30T14:57:07.667200+00:00",
"returncode": 0
},
"project": {
"mode": "source",
"file_count": 1,
"import_count": 0,
"first_party_contracts_count": 1
},
"summary": "Found 3 issues: reward calculation underflows after endBlock and can lock withdrawals; deposit can be reentered via ERC777/malicious pool tokens; fee-on-transfer/rebasing tokens break accounting and rewards.",
"raw_final": {
"summary": "Found 3 issues: reward calculation underflows after endBlock and can lock withdrawals; deposit can be reentered via ERC777/malicious pool tokens; fee-on-transfer/rebasing tokens break accounting and rewards.",
"findings": [
{
"title": "Pool can be permanently bricked after endBlock due to underflow in reward calculation",
"category": "math",
"evidence": "getTotalReward subtracts to.sub(from) without handling lastRewardBlock > endBlock+1, and updatePool sets lastRewardBlock = block.number even after endBlock.",
"severity": "high",
"locations": [
"contracts/Contract.sol:1201",
"contracts/Contract.sol:1205",
"contracts/Contract.sol:1206",
"contracts/Contract.sol:1207",
"contracts/Contract.sol:1251"
],
"recommendation": "Guard in getTotalReward for lastRewardBlock >= endBlock+1 and return 0; or clamp lastRewardBlock to endBlock+1 in updatePool. Also validate endBlock > startBlock when adding pools.",
"exploit_scenario": "Once block.number > endBlock, the first call to updatePool (triggered by any deposit/withdraw) sets lastRewardBlock to the current block. On the next interaction, getTotalReward computes to = min(block.number, endBlock+1), which is now less than lastRewardBlock, so to.sub(from) underflows and reverts. This makes updatePool/pending/deposit/withdraw permanently revert, locking all remaining staked tokens. An attacker can trigger this by calling any pool action after endBlock, preventing others from withdrawing."
},
{
"title": "Reentrancy in deposit via untrusted pool tokens can double-claim rewards",
"category": "reentrancy",
"evidence": "deposit pays pending rewards, then calls pool.token.safeTransferFrom before updating user.amount and user.rewardDebt.",
"severity": "medium",
"locations": [
"contracts/Contract.sol:1266",
"contracts/Contract.sol:1271",
"contracts/Contract.sol:1273",
"contracts/Contract.sol:1276",
"contracts/Contract.sol:1277"
],
"recommendation": "Apply a reentrancy guard and/or move state updates (rewardDebt/amount) before external calls. Alternatively restrict pools to non-callback ERC20 tokens.",
"exploit_scenario": "If a pool token is ERC777 or otherwise invokes callbacks on transferFrom, a malicious user contract can reenter deposit during pool.token.safeTransferFrom. Because rewardDebt and amount are only updated after the external call, the reentrant deposit can claim the same pending rewards multiple times, draining rewardToken."
},
{
"title": "Fee-on-transfer/rebasing tokens break accounting and reward distribution",
"category": "other",
"evidence": "user.amount is incremented by _amount without checking actual received tokens; totalStake is derived from balanceOf which can diverge from tracked user amounts.",
"severity": "low",
"locations": [
"contracts/Contract.sol:1242",
"contracts/Contract.sol:1266",
"contracts/Contract.sol:1276",
"contracts/Contract.sol:1277"
],
"recommendation": "Track actual received amount via pre/post balance checks, and maintain a separate totalStaked variable. Consider rejecting fee-on-transfer/rebasing tokens.",
"exploit_scenario": "For deflationary or rebasing tokens, the contract credits user.amount with the requested _amount even if fewer tokens were received. This lets users accrue rewards on more than their actual stake and can cause withdrawals to revert when the pool balance is insufficient."
}
],
"no_findings": false
},
"no_findings": false,
"schema_version": 1
}
00000000: PUSH1 0x80 00000002: PUSH1 0x40 00000004: MSTORE 00000005: CALLVALUE 00000006: DUP1 00000007: ISZERO 00000008: PUSH2 0x0010 0000000b: JUMPI 0000000c: PUSH1 0x00 0000000e: DUP1 0000000f: REVERT 00000010: JUMPDEST 00000011: POP 00000012: PUSH1 0x04 00000014: CALLDATASIZE 00000015: LT 00000016: PUSH2 0x00b4 00000019: JUMPI 0000001a: PUSH1 0x00 0000001c: CALLDATALOAD 0000001d: PUSH1 0xe0 0000001f: SHR 00000020: DUP1 00000021: PUSH4 0xac4afa38 00000026: GT 00000027: PUSH2 0x0071 0000002a: JUMPI 0000002b: DUP1 0000002c: PUSH4 0xac4afa38 00000031: EQ 00000032: PUSH2 0x01e7 00000035: JUMPI 00000036: DUP1 00000037: PUSH4 0xb9d02df4 0000003c: EQ 0000003d: PUSH2 0x027e 00000040: JUMPI 00000041: DUP1 00000042: PUSH4 0xe2bbb158 00000047: EQ 00000048: PUSH2 0x02e7 0000004b: JUMPI 0000004c: DUP1 0000004d: PUSH4 0xe4c75c27 00000052: EQ 00000053: PUSH2 0x031f 00000056: JUMPI 00000057: DUP1 00000058: PUSH4 0xf2fde38b 0000005d: EQ 0000005e: PUSH2 0x0381 00000061: JUMPI 00000062: DUP1 00000063: PUSH4 0xf7c618c1 00000068: EQ 00000069: PUSH2 0x03c5 0000006c: JUMPI 0000006d: PUSH2 0x00b4 00000070: JUMP 00000071: JUMPDEST 00000072: DUP1 00000073: PUSH4 0x081e3eda 00000078: EQ 00000079: PUSH2 0x00b9 0000007c: JUMPI 0000007d: DUP1 0000007e: PUSH4 0x29cb0090 00000083: EQ 00000084: PUSH2 0x00d7 00000087: JUMPI 00000088: DUP1 00000089: PUSH4 0x441a3e70 0000008e: EQ 0000008f: PUSH2 0x0143 00000092: JUMPI 00000093: DUP1 00000094: PUSH4 0x51eb05a6 00000099: EQ 0000009a: PUSH2 0x017b 0000009d: JUMPI 0000009e: DUP1 0000009f: PUSH4 0x715018a6 000000a4: EQ 000000a5: PUSH2 0x01a9 000000a8: JUMPI 000000a9: DUP1 000000aa: PUSH4 0x8da5cb5b 000000af: EQ 000000b0: PUSH2 0x01b3 000000b3: JUMPI 000000b4: JUMPDEST 000000b5: PUSH1 0x00 000000b7: DUP1 000000b8: REVERT 000000b9: JUMPDEST 000000ba: PUSH2 0x00c1 000000bd: PUSH2 0x03f9 000000c0: JUMP 000000c1: JUMPDEST 000000c2: PUSH1 0x40 000000c4: MLOAD 000000c5: DUP1 000000c6: DUP3 000000c7: DUP2 000000c8: MSTORE 000000c9: PUSH1 0x20 000000cb: ADD 000000cc: SWAP2 000000cd: POP 000000ce: POP 000000cf: PUSH1 0x40 000000d1: MLOAD 000000d2: DUP1 000000d3: SWAP2 000000d4: SUB 000000d5: SWAP1 000000d6: RETURN 000000d7: JUMPDEST 000000d8: PUSH2 0x0141 000000db: PUSH1 0x04 000000dd: DUP1 000000de: CALLDATASIZE 000000df: SUB 000000e0: PUSH1 0xa0 000000e2: DUP2 000000e3: LT 000000e4: ISZERO 000000e5: PUSH2 0x00ed 000000e8: JUMPI 000000e9: PUSH1 0x00 000000eb: DUP1 000000ec: REVERT 000000ed: JUMPDEST 000000ee: DUP2 000000ef: ADD 000000f0: SWAP1 000000f1: DUP1 000000f2: DUP1 000000f3: CALLDATALOAD 000000f4: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00000109: AND 0000010a: SWAP1 0000010b: PUSH1 0x20 0000010d: ADD 0000010e: SWAP1 0000010f: SWAP3 00000110: SWAP2 00000111: SWAP1 00000112: DUP1 00000113: CALLDATALOAD 00000114: SWAP1 00000115: PUSH1 0x20 00000117: ADD 00000118: SWAP1 00000119: SWAP3 0000011a: SWAP2 0000011b: SWAP1 0000011c: DUP1 0000011d: CALLDATALOAD 0000011e: SWAP1 0000011f: PUSH1 0x20 00000121: ADD 00000122: SWAP1 00000123: SWAP3 00000124: SWAP2 00000125: SWAP1 00000126: DUP1 00000127: CALLDATALOAD 00000128: SWAP1 00000129: PUSH1 0x20 0000012b: ADD 0000012c: SWAP1 0000012d: SWAP3 0000012e: SWAP2 0000012f: SWAP1 00000130: DUP1 00000131: CALLDATALOAD 00000132: SWAP1 00000133: PUSH1 0x20 00000135: ADD 00000136: SWAP1 00000137: SWAP3 00000138: SWAP2 00000139: SWAP1 0000013a: POP 0000013b: POP 0000013c: POP 0000013d: PUSH2 0x0406 00000140: JUMP 00000141: JUMPDEST 00000142: STOP 00000143: JUMPDEST 00000144: PUSH2 0x0179 00000147: PUSH1 0x04 00000149: DUP1 0000014a: CALLDATASIZE 0000014b: SUB 0000014c: PUSH1 0x40 0000014e: DUP2 0000014f: LT 00000150: ISZERO 00000151: PUSH2 0x0159 00000154: JUMPI 00000155: PUSH1 0x00 00000157: DUP1 00000158: REVERT 00000159: JUMPDEST 0000015a: DUP2 0000015b: ADD 0000015c: SWAP1 0000015d: DUP1 0000015e: DUP1 0000015f: CALLDATALOAD 00000160: SWAP1 00000161: PUSH1 0x20 00000163: ADD 00000164: SWAP1 00000165: SWAP3 00000166: SWAP2 00000167: SWAP1 00000168: DUP1 00000169: CALLDATALOAD 0000016a: SWAP1 0000016b: PUSH1 0x20 0000016d: ADD 0000016e: SWAP1 0000016f: SWAP3 00000170: SWAP2 00000171: SWAP1 00000172: POP 00000173: POP 00000174: POP 00000175: PUSH2 0x076e 00000178: JUMP 00000179: JUMPDEST 0000017a: STOP 0000017b: JUMPDEST 0000017c: PUSH2 0x01a7 0000017f: PUSH1 0x04 00000181: DUP1 00000182: CALLDATASIZE 00000183: SUB 00000184: PUSH1 0x20 00000186: DUP2 00000187: LT 00000188: ISZERO 00000189: PUSH2 0x0191 0000018c: JUMPI 0000018d: PUSH1 0x00 0000018f: DUP1 00000190: REVERT 00000191: JUMPDEST 00000192: DUP2 00000193: ADD 00000194: SWAP1 00000195: DUP1 00000196: DUP1 00000197: CALLDATALOAD 00000198: SWAP1 00000199: PUSH1 0x20 0000019b: ADD 0000019c: SWAP1 0000019d: SWAP3 0000019e: SWAP2 0000019f: SWAP1 000001a0: POP 000001a1: POP 000001a2: POP 000001a3: PUSH2 0x0aa5 000001a6: JUMP 000001a7: JUMPDEST 000001a8: STOP 000001a9: JUMPDEST 000001aa: PUSH2 0x01b1 000001ad: PUSH2 0x0dab 000001b0: JUMP 000001b1: JUMPDEST 000001b2: STOP 000001b3: JUMPDEST 000001b4: PUSH2 0x01bb 000001b7: PUSH2 0x0f31 000001ba: JUMP 000001bb: JUMPDEST 000001bc: PUSH1 0x40 000001be: MLOAD 000001bf: DUP1 000001c0: DUP3 000001c1: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 000001d6: AND 000001d7: DUP2 000001d8: MSTORE 000001d9: PUSH1 0x20 000001db: ADD 000001dc: SWAP2 000001dd: POP 000001de: POP 000001df: PUSH1 0x40 000001e1: MLOAD 000001e2: DUP1 000001e3: SWAP2 000001e4: SUB 000001e5: SWAP1 000001e6: RETURN 000001e7: JUMPDEST 000001e8: PUSH2 0x0213 000001eb: PUSH1 0x04 000001ed: DUP1 000001ee: CALLDATASIZE 000001ef: SUB 000001f0: PUSH1 0x20 000001f2: DUP2 000001f3: LT 000001f4: ISZERO 000001f5: PUSH2 0x01fd 000001f8: JUMPI 000001f9: PUSH1 0x00 000001fb: DUP1 000001fc: REVERT 000001fd: JUMPDEST 000001fe: DUP2 000001ff: ADD 00000200: SWAP1 00000201: DUP1 00000202: DUP1 00000203: CALLDATALOAD 00000204: SWAP1 00000205: PUSH1 0x20 00000207: ADD 00000208: SWAP1 00000209: SWAP3 0000020a: SWAP2 0000020b: SWAP1 0000020c: POP 0000020d: POP 0000020e: POP 0000020f: PUSH2 0x0f5a 00000212: JUMP 00000213: JUMPDEST 00000214: PUSH1 0x40 00000216: MLOAD 00000217: DUP1 00000218: DUP12 00000219: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 0000022e: AND 0000022f: DUP2 00000230: MSTORE 00000231: PUSH1 0x20 00000233: ADD 00000234: DUP11 00000235: DUP2 00000236: MSTORE 00000237: PUSH1 0x20 00000239: ADD 0000023a: DUP10 0000023b: DUP2 0000023c: MSTORE 0000023d: PUSH1 0x20 0000023f: ADD 00000240: DUP9 00000241: DUP2 00000242: MSTORE 00000243: PUSH1 0x20 00000245: ADD 00000246: DUP8 00000247: DUP2 00000248: MSTORE 00000249: PUSH1 0x20 0000024b: ADD 0000024c: DUP7 0000024d: DUP2 0000024e: MSTORE 0000024f: PUSH1 0x20 00000251: ADD 00000252: DUP6 00000253: DUP2 00000254: MSTORE 00000255: PUSH1 0x20 00000257: ADD 00000258: DUP5 00000259: DUP2 0000025a: MSTORE 0000025b: PUSH1 0x20 0000025d: ADD 0000025e: DUP4 0000025f: DUP2 00000260: MSTORE 00000261: PUSH1 0x20 00000263: ADD 00000264: DUP3 00000265: DUP2 00000266: MSTORE 00000267: PUSH1 0x20 00000269: ADD 0000026a: SWAP11 0000026b: POP 0000026c: POP 0000026d: POP 0000026e: POP 0000026f: POP 00000270: POP 00000271: POP 00000272: POP 00000273: POP 00000274: POP 00000275: POP 00000276: PUSH1 0x40 00000278: MLOAD 00000279: DUP1 0000027a: SWAP2 0000027b: SUB 0000027c: SWAP1 0000027d: RETURN 0000027e: JUMPDEST 0000027f: PUSH2 0x02ca 00000282: PUSH1 0x04 00000284: DUP1 00000285: CALLDATASIZE 00000286: SUB 00000287: PUSH1 0x40 00000289: DUP2 0000028a: LT 0000028b: ISZERO 0000028c: PUSH2 0x0294 0000028f: JUMPI 00000290: PUSH1 0x00 00000292: DUP1 00000293: REVERT 00000294: JUMPDEST 00000295: DUP2 00000296: ADD 00000297: SWAP1 00000298: DUP1 00000299: DUP1 0000029a: CALLDATALOAD 0000029b: SWAP1 0000029c: PUSH1 0x20 0000029e: ADD 0000029f: SWAP1 000002a0: SWAP3 000002a1: SWAP2 000002a2: SWAP1 000002a3: DUP1 000002a4: CALLDATALOAD 000002a5: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 000002ba: AND 000002bb: SWAP1 000002bc: PUSH1 0x20 000002be: ADD 000002bf: SWAP1 000002c0: SWAP3 000002c1: SWAP2 000002c2: SWAP1 000002c3: POP 000002c4: POP 000002c5: POP 000002c6: PUSH2 0x0fdb 000002c9: JUMP 000002ca: JUMPDEST 000002cb: PUSH1 0x40 000002cd: MLOAD 000002ce: DUP1 000002cf: DUP4 000002d0: DUP2 000002d1: MSTORE 000002d2: PUSH1 0x20 000002d4: ADD 000002d5: DUP3 000002d6: DUP2 000002d7: MSTORE 000002d8: PUSH1 0x20 000002da: ADD 000002db: SWAP3 000002dc: POP 000002dd: POP 000002de: POP 000002df: PUSH1 0x40 000002e1: MLOAD 000002e2: DUP1 000002e3: SWAP2 000002e4: SUB 000002e5: SWAP1 000002e6: RETURN 000002e7: JUMPDEST 000002e8: PUSH2 0x031d 000002eb: PUSH1 0x04 000002ed: DUP1 000002ee: CALLDATASIZE 000002ef: SUB 000002f0: PUSH1 0x40 000002f2: DUP2 000002f3: LT 000002f4: ISZERO 000002f5: PUSH2 0x02fd 000002f8: JUMPI 000002f9: PUSH1 0x00 000002fb: DUP1 000002fc: REVERT 000002fd: JUMPDEST 000002fe: DUP2 000002ff: ADD 00000300: SWAP1 00000301: DUP1 00000302: DUP1 00000303: CALLDATALOAD 00000304: SWAP1 00000305: PUSH1 0x20 00000307: ADD 00000308: SWAP1 00000309: SWAP3 0000030a: SWAP2 0000030b: SWAP1 0000030c: DUP1 0000030d: CALLDATALOAD 0000030e: SWAP1 0000030f: PUSH1 0x20 00000311: ADD 00000312: SWAP1 00000313: SWAP3 00000314: SWAP2 00000315: SWAP1 00000316: POP 00000317: POP 00000318: POP 00000319: PUSH2 0x100c 0000031c: JUMP 0000031d: JUMPDEST 0000031e: STOP 0000031f: JUMPDEST 00000320: PUSH2 0x036b 00000323: PUSH1 0x04 00000325: DUP1 00000326: CALLDATASIZE 00000327: SUB 00000328: PUSH1 0x40 0000032a: DUP2 0000032b: LT 0000032c: ISZERO 0000032d: PUSH2 0x0335 00000330: JUMPI 00000331: PUSH1 0x00 00000333: DUP1 00000334: REVERT 00000335: JUMPDEST 00000336: DUP2 00000337: ADD 00000338: SWAP1 00000339: DUP1 0000033a: DUP1 0000033b: CALLDATALOAD 0000033c: SWAP1 0000033d: PUSH1 0x20 0000033f: ADD 00000340: SWAP1 00000341: SWAP3 00000342: SWAP2 00000343: SWAP1 00000344: DUP1 00000345: CALLDATALOAD 00000346: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 0000035b: AND 0000035c: SWAP1 0000035d: PUSH1 0x20 0000035f: ADD 00000360: SWAP1 00000361: SWAP3 00000362: SWAP2 00000363: SWAP1 00000364: POP 00000365: POP 00000366: POP 00000367: PUSH2 0x12d9 0000036a: JUMP 0000036b: JUMPDEST 0000036c: PUSH1 0x40 0000036e: MLOAD 0000036f: DUP1 00000370: DUP3 00000371: DUP2 00000372: MSTORE 00000373: PUSH1 0x20 00000375: ADD 00000376: SWAP2 00000377: POP 00000378: POP 00000379: PUSH1 0x40 0000037b: MLOAD 0000037c: DUP1 0000037d: SWAP2 0000037e: SUB 0000037f: SWAP1 00000380: RETURN 00000381: JUMPDEST 00000382: PUSH2 0x03c3 00000385: PUSH1 0x04 00000387: DUP1 00000388: CALLDATASIZE 00000389: SUB 0000038a: PUSH1 0x20 0000038c: DUP2 0000038d: LT 0000038e: ISZERO 0000038f: PUSH2 0x0397 00000392: JUMPI 00000393: PUSH1 0x00 00000395: DUP1 00000396: REVERT 00000397: JUMPDEST 00000398: DUP2 00000399: ADD 0000039a: SWAP1 0000039b: DUP1 0000039c: DUP1 0000039d: CALLDATALOAD 0000039e: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 000003b3: AND 000003b4: SWAP1 000003b5: PUSH1 0x20 000003b7: ADD 000003b8: SWAP1 000003b9: SWAP3 000003ba: SWAP2 000003bb: SWAP1 000003bc: POP 000003bd: POP 000003be: POP 000003bf: PUSH2 0x15b9 000003c2: JUMP 000003c3: JUMPDEST 000003c4: STOP 000003c5: JUMPDEST 000003c6: PUSH2 0x03cd 000003c9: PUSH2 0x17c4 000003cc: JUMP 000003cd: JUMPDEST 000003ce: PUSH1 0x40 000003d0: MLOAD 000003d1: DUP1 000003d2: DUP3 000003d3: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 000003e8: AND 000003e9: DUP2 000003ea: MSTORE 000003eb: PUSH1 0x20 000003ed: ADD 000003ee: SWAP2 000003ef: POP 000003f0: POP 000003f1: PUSH1 0x40 000003f3: MLOAD 000003f4: DUP1 000003f5: SWAP2 000003f6: SUB 000003f7: SWAP1 000003f8: RETURN 000003f9: JUMPDEST 000003fa: PUSH1 0x00 000003fc: PUSH1 0x02 000003fe: DUP1 000003ff: SLOAD 00000400: SWAP1 00000401: POP 00000402: SWAP1 00000403: POP 00000404: SWAP1 00000405: JUMP 00000406: JUMPDEST 00000407: PUSH2 0x040e 0000040a: PUSH2 0x17ea 0000040d: JUMP 0000040e: JUMPDEST 0000040f: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00000424: AND 00000425: PUSH1 0x00 00000427: DUP1 00000428: SLOAD 00000429: SWAP1 0000042a: PUSH2 0x0100 0000042d: EXP 0000042e: SWAP1 0000042f: DIV 00000430: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00000445: AND 00000446: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 0000045b: AND 0000045c: EQ 0000045d: PUSH2 0x04ce 00000460: JUMPI 00000461: PUSH1 0x40 00000463: MLOAD 00000464: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000 00000485: DUP2 00000486: MSTORE 00000487: PUSH1 0x04 00000489: ADD 0000048a: DUP1 0000048b: DUP1 0000048c: PUSH1 0x20 0000048e: ADD 0000048f: DUP3 00000490: DUP2 00000491: SUB 00000492: DUP3 00000493: MSTORE 00000494: PUSH1 0x20 00000496: DUP2 00000497: MSTORE 00000498: PUSH1 0x20 0000049a: ADD 0000049b: DUP1 0000049c: PUSH32 0x4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572 000004bd: DUP2 000004be: MSTORE 000004bf: POP 000004c0: PUSH1 0x20 000004c2: ADD 000004c3: SWAP2 000004c4: POP 000004c5: POP 000004c6: PUSH1 0x40 000004c8: MLOAD 000004c9: DUP1 000004ca: SWAP2 000004cb: SUB 000004cc: SWAP1 000004cd: REVERT 000004ce: JUMPDEST 000004cf: PUSH1 0x00 000004d1: JUMPDEST 000004d2: PUSH1 0x02 000004d4: DUP1 000004d5: SLOAD 000004d6: SWAP1 000004d7: POP 000004d8: DUP2 000004d9: LT 000004da: ISZERO 000004db: PUSH2 0x05c9 000004de: JUMPI 000004df: DUP6 000004e0: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 000004f5: AND 000004f6: PUSH1 0x02 000004f8: DUP3 000004f9: DUP2 000004fa: SLOAD 000004fb: DUP2 000004fc: LT 000004fd: PUSH2 0x0502 00000500: JUMPI 00000501: INVALID 00000502: JUMPDEST 00000503: SWAP1 00000504: PUSH1 0x00 00000506: MSTORE 00000507: PUSH1 0x20 00000509: PUSH1 0x00 0000050b: KECCAK256 0000050c: SWAP1 0000050d: PUSH1 0x0a 0000050f: MUL 00000510: ADD 00000511: PUSH1 0x00 00000513: ADD 00000514: PUSH1 0x00 00000516: SWAP1 00000517: SLOAD 00000518: SWAP1 00000519: PUSH2 0x0100 0000051c: EXP 0000051d: SWAP1 0000051e: DIV 0000051f: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00000534: AND 00000535: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 0000054a: AND 0000054b: EQ 0000054c: ISZERO 0000054d: PUSH2 0x05be 00000550: JUMPI 00000551: PUSH1 0x40 00000553: MLOAD 00000554: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000 00000575: DUP2 00000576: MSTORE 00000577: PUSH1 0x04 00000579: ADD 0000057a: DUP1 0000057b: DUP1 0000057c: PUSH1 0x20 0000057e: ADD 0000057f: DUP3 00000580: DUP2 00000581: SUB 00000582: DUP3 00000583: MSTORE 00000584: PUSH1 0x12 00000586: DUP2 00000587: MSTORE 00000588: PUSH1 0x20 0000058a: ADD 0000058b: DUP1 0000058c: PUSH32 0x706f6f6c20616c72656164792065786973740000000000000000000000000000 000005ad: DUP2 000005ae: MSTORE 000005af: POP 000005b0: PUSH1 0x20 000005b2: ADD 000005b3: SWAP2 000005b4: POP 000005b5: POP 000005b6: PUSH1 0x40 000005b8: MLOAD 000005b9: DUP1 000005ba: SWAP2 000005bb: SUB 000005bc: SWAP1 000005bd: REVERT 000005be: JUMPDEST 000005bf: DUP1 000005c0: PUSH1 0x01 000005c2: ADD 000005c3: SWAP1 000005c4: POP 000005c5: PUSH2 0x04d1 000005c8: JUMP 000005c9: JUMPDEST 000005ca: POP 000005cb: PUSH1 0x00 000005cd: DUP5 000005ce: NUMBER 000005cf: GT 000005d0: PUSH2 0x05d9 000005d3: JUMPI 000005d4: DUP5 000005d5: PUSH2 0x05db 000005d8: JUMP 000005d9: JUMPDEST 000005da: NUMBER 000005db: JUMPDEST 000005dc: SWAP1 000005dd: POP 000005de: PUSH1 0x02 000005e0: PUSH1 0x40 000005e2: MLOAD 000005e3: DUP1 000005e4: PUSH2 0x0140 000005e7: ADD 000005e8: PUSH1 0x40 000005ea: MSTORE 000005eb: DUP1 000005ec: DUP9 000005ed: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00000602: AND 00000603: DUP2 00000604: MSTORE 00000605: PUSH1 0x20 00000607: ADD 00000608: DUP8 00000609: DUP2 0000060a: MSTORE 0000060b: PUSH1 0x20 0000060d: ADD 0000060e: DUP7 0000060f: DUP2 00000610: MSTORE 00000611: PUSH1 0x20 00000613: ADD 00000614: DUP6 00000615: DUP2 00000616: MSTORE 00000617: PUSH1 0x20 00000619: ADD 0000061a: DUP5 0000061b: DUP2 0000061c: MSTORE 0000061d: PUSH1 0x20 0000061f: ADD 00000620: PUSH2 0x0632 00000623: DUP6 00000624: DUP10 00000625: PUSH2 0x17f2 00000628: SWAP1 00000629: SWAP2 0000062a: SWAP1 0000062b: PUSH4 0xffffffff 00000630: AND 00000631: JUMP 00000632: JUMPDEST 00000633: DUP2 00000634: MSTORE 00000635: PUSH1 0x20 00000637: ADD 00000638: PUSH2 0x065d 0000063b: PUSH2 0x064e 0000063e: PUSH1 0x02 00000640: DUP8 00000641: PUSH2 0x187a 00000644: SWAP1 00000645: SWAP2 00000646: SWAP1 00000647: PUSH4 0xffffffff 0000064c: AND 0000064d: JUMP 0000064e: JUMPDEST 0000064f: DUP10 00000650: PUSH2 0x17f2 00000653: SWAP1 00000654: SWAP2 00000655: SWAP1 00000656: PUSH4 0xffffffff 0000065b: AND 0000065c: JUMP 0000065d: JUMPDEST 0000065e: DUP2 0000065f: MSTORE 00000660: PUSH1 0x20 00000662: ADD 00000663: PUSH2 0x0688 00000666: PUSH2 0x0679 00000669: PUSH1 0x03 0000066b: DUP8 0000066c: PUSH2 0x187a 0000066f: SWAP1 00000670: SWAP2 00000671: SWAP1 00000672: PUSH4 0xffffffff 00000677: AND 00000678: JUMP 00000679: JUMPDEST 0000067a: DUP10 0000067b: PUSH2 0x17f2 0000067e: SWAP1 0000067f: SWAP2 00000680: SWAP1 00000681: PUSH4 0xffffffff 00000686: AND 00000687: JUMP 00000688: JUMPDEST 00000689: DUP2 0000068a: MSTORE 0000068b: PUSH1 0x20 0000068d: ADD 0000068e: DUP4 0000068f: DUP2 00000690: MSTORE 00000691: PUSH1 0x20 00000693: ADD 00000694: PUSH1 0x00 00000696: DUP2 00000697: MSTORE 00000698: POP 00000699: SWAP1 0000069a: DUP1 0000069b: PUSH1 0x01 0000069d: DUP2 0000069e: SLOAD 0000069f: ADD 000006a0: DUP1 000006a1: DUP3 000006a2: SSTORE 000006a3: DUP1 000006a4: SWAP2 000006a5: POP 000006a6: POP 000006a7: PUSH1 0x01 000006a9: SWAP1 000006aa: SUB 000006ab: SWAP1 000006ac: PUSH1 0x00 000006ae: MSTORE 000006af: PUSH1 0x20 000006b1: PUSH1 0x00 000006b3: KECCAK256 000006b4: SWAP1 000006b5: PUSH1 0x0a 000006b7: MUL 000006b8: ADD 000006b9: PUSH1 0x00 000006bb: SWAP1 000006bc: SWAP2 000006bd: SWAP1 000006be: SWAP2 000006bf: SWAP1 000006c0: SWAP2 000006c1: POP 000006c2: PUSH1 0x00 000006c4: DUP3 000006c5: ADD 000006c6: MLOAD 000006c7: DUP2 000006c8: PUSH1 0x00 000006ca: ADD 000006cb: PUSH1 0x00 000006cd: PUSH2 0x0100 000006d0: EXP 000006d1: DUP2 000006d2: SLOAD 000006d3: DUP2 000006d4: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 000006e9: MUL 000006ea: NOT 000006eb: AND 000006ec: SWAP1 000006ed: DUP4 000006ee: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00000703: AND 00000704: MUL 00000705: OR 00000706: SWAP1 00000707: SSTORE 00000708: POP 00000709: PUSH1 0x20 0000070b: DUP3 0000070c: ADD 0000070d: MLOAD 0000070e: DUP2 0000070f: PUSH1 0x01 00000711: ADD 00000712: SSTORE 00000713: PUSH1 0x40 00000715: DUP3 00000716: ADD 00000717: MLOAD 00000718: DUP2 00000719: PUSH1 0x02 0000071b: ADD 0000071c: SSTORE 0000071d: PUSH1 0x60 0000071f: DUP3 00000720: ADD 00000721: MLOAD 00000722: DUP2 00000723: PUSH1 0x03 00000725: ADD 00000726: SSTORE 00000727: PUSH1 0x80 00000729: DUP3 0000072a: ADD 0000072b: MLOAD 0000072c: DUP2 0000072d: PUSH1 0x04 0000072f: ADD 00000730: SSTORE 00000731: PUSH1 0xa0 00000733: DUP3 00000734: ADD 00000735: MLOAD 00000736: DUP2 00000737: PUSH1 0x05 00000739: ADD 0000073a: SSTORE 0000073b: PUSH1 0xc0 0000073d: DUP3 0000073e: ADD 0000073f: MLOAD 00000740: DUP2 00000741: PUSH1 0x06 00000743: ADD 00000744: SSTORE 00000745: PUSH1 0xe0 00000747: DUP3 00000748: ADD 00000749: MLOAD 0000074a: DUP2 0000074b: PUSH1 0x07 0000074d: ADD 0000074e: SSTORE 0000074f: PUSH2 0x0100 00000752: DUP3 00000753: ADD 00000754: MLOAD 00000755: DUP2 00000756: PUSH1 0x08 00000758: ADD 00000759: SSTORE 0000075a: PUSH2 0x0120 0000075d: DUP3 0000075e: ADD 0000075f: MLOAD 00000760: DUP2 00000761: PUSH1 0x09 00000763: ADD 00000764: SSTORE 00000765: POP 00000766: POP 00000767: POP 00000768: POP 00000769: POP 0000076a: POP 0000076b: POP 0000076c: POP 0000076d: JUMP 0000076e: JUMPDEST 0000076f: DUP2 00000770: PUSH1 0x00 00000772: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00000787: AND 00000788: PUSH1 0x02 0000078a: DUP3 0000078b: DUP2 0000078c: SLOAD 0000078d: DUP2 0000078e: LT 0000078f: PUSH2 0x0794 00000792: JUMPI 00000793: INVALID 00000794: JUMPDEST 00000795: SWAP1 00000796: PUSH1 0x00 00000798: MSTORE 00000799: PUSH1 0x20 0000079b: PUSH1 0x00 0000079d: KECCAK256 0000079e: SWAP1 0000079f: PUSH1 0x0a 000007a1: MUL 000007a2: ADD 000007a3: PUSH1 0x00 000007a5: ADD 000007a6: PUSH1 0x00 000007a8: SWAP1 000007a9: SLOAD 000007aa: SWAP1 000007ab: PUSH2 0x0100 000007ae: EXP 000007af: SWAP1 000007b0: DIV 000007b1: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 000007c6: AND 000007c7: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 000007dc: AND 000007dd: EQ 000007de: ISZERO 000007df: PUSH2 0x0850 000007e2: JUMPI 000007e3: PUSH1 0x40 000007e5: MLOAD 000007e6: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000 00000807: DUP2 00000808: MSTORE 00000809: PUSH1 0x04 0000080b: ADD 0000080c: DUP1 0000080d: DUP1 0000080e: PUSH1 0x20 00000810: ADD 00000811: DUP3 00000812: DUP2 00000813: SUB 00000814: DUP3 00000815: MSTORE 00000816: PUSH1 0x0e 00000818: DUP2 00000819: MSTORE 0000081a: PUSH1 0x20 0000081c: ADD 0000081d: DUP1 0000081e: PUSH32 0x706f6f6c206e6f74206578697374000000000000000000000000000000000000 0000083f: DUP2 00000840: MSTORE 00000841: POP 00000842: PUSH1 0x20 00000844: ADD 00000845: SWAP2 00000846: POP 00000847: POP 00000848: PUSH1 0x40 0000084a: MLOAD 0000084b: DUP1 0000084c: SWAP2 0000084d: SUB 0000084e: SWAP1 0000084f: REVERT 00000850: JUMPDEST 00000851: PUSH1 0x00 00000853: PUSH1 0x02 00000855: DUP5 00000856: DUP2 00000857: SLOAD 00000858: DUP2 00000859: LT 0000085a: PUSH2 0x085f 0000085d: JUMPI 0000085e: INVALID 0000085f: JUMPDEST 00000860: SWAP1 00000861: PUSH1 0x00 00000863: MSTORE 00000864: PUSH1 0x20 00000866: PUSH1 0x00 00000868: KECCAK256 00000869: SWAP1 0000086a: PUSH1 0x0a 0000086c: MUL 0000086d: ADD 0000086e: SWAP1 0000086f: POP 00000870: PUSH1 0x00 00000872: PUSH1 0x03 00000874: PUSH1 0x00 00000876: DUP7 00000877: DUP2 00000878: MSTORE 00000879: PUSH1 0x20 0000087b: ADD 0000087c: SWAP1 0000087d: DUP2 0000087e: MSTORE 0000087f: PUSH1 0x20 00000881: ADD 00000882: PUSH1 0x00 00000884: KECCAK256 00000885: PUSH1 0x00 00000887: CALLER 00000888: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 0000089d: AND 0000089e: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 000008b3: AND 000008b4: DUP2 000008b5: MSTORE 000008b6: PUSH1 0x20 000008b8: ADD 000008b9: SWAP1 000008ba: DUP2 000008bb: MSTORE 000008bc: PUSH1 0x20 000008be: ADD 000008bf: PUSH1 0x00 000008c1: KECCAK256 000008c2: SWAP1 000008c3: POP 000008c4: DUP4 000008c5: DUP2 000008c6: PUSH1 0x00 000008c8: ADD 000008c9: SLOAD 000008ca: LT 000008cb: ISZERO 000008cc: PUSH2 0x093d 000008cf: JUMPI 000008d0: PUSH1 0x40 000008d2: MLOAD 000008d3: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000 000008f4: DUP2 000008f5: MSTORE 000008f6: PUSH1 0x04 000008f8: ADD 000008f9: DUP1 000008fa: DUP1 000008fb: PUSH1 0x20 000008fd: ADD 000008fe: DUP3 000008ff: DUP2 00000900: SUB 00000901: DUP3 00000902: MSTORE 00000903: PUSH1 0x1e 00000905: DUP2 00000906: MSTORE 00000907: PUSH1 0x20 00000909: ADD 0000090a: DUP1 0000090b: PUSH32 0x77697468647261773a20696e73756666696369656e742062616c616e63650000 0000092c: DUP2 0000092d: MSTORE 0000092e: POP 0000092f: PUSH1 0x20 00000931: ADD 00000932: SWAP2 00000933: POP 00000934: POP 00000935: PUSH1 0x40 00000937: MLOAD 00000938: DUP1 00000939: SWAP2 0000093a: SUB 0000093b: SWAP1 0000093c: REVERT 0000093d: JUMPDEST 0000093e: PUSH2 0x0946 00000941: DUP6 00000942: PUSH2 0x0aa5 00000945: JUMP 00000946: JUMPDEST 00000947: PUSH1 0x00 00000949: PUSH2 0x0990 0000094c: DUP3 0000094d: PUSH1 0x01 0000094f: ADD 00000950: SLOAD 00000951: PUSH2 0x0982 00000954: PUSH5 0xe8d4a51000 0000095a: PUSH2 0x0974 0000095d: DUP8 0000095e: PUSH1 0x09 00000960: ADD 00000961: SLOAD 00000962: DUP8 00000963: PUSH1 0x00 00000965: ADD 00000966: SLOAD 00000967: PUSH2 0x187a 0000096a: SWAP1 0000096b: SWAP2 0000096c: SWAP1 0000096d: PUSH4 0xffffffff 00000972: AND 00000973: JUMP 00000974: JUMPDEST 00000975: PUSH2 0x1900 00000978: SWAP1 00000979: SWAP2 0000097a: SWAP1 0000097b: PUSH4 0xffffffff 00000980: AND 00000981: JUMP 00000982: JUMPDEST 00000983: PUSH2 0x194a 00000986: SWAP1 00000987: SWAP2 00000988: SWAP1 00000989: PUSH4 0xffffffff 0000098e: AND 0000098f: JUMP 00000990: JUMPDEST 00000991: SWAP1 00000992: POP 00000993: PUSH1 0x00 00000995: DUP2 00000996: GT 00000997: ISZERO 00000998: PUSH2 0x09a6 0000099b: JUMPI 0000099c: PUSH2 0x09a5 0000099f: CALLER 000009a0: DUP3 000009a1: PUSH2 0x1994 000009a4: JUMP 000009a5: JUMPDEST 000009a6: JUMPDEST 000009a7: PUSH2 0x09bd 000009aa: DUP6 000009ab: DUP4 000009ac: PUSH1 0x00 000009ae: ADD 000009af: SLOAD 000009b0: PUSH2 0x194a 000009b3: SWAP1 000009b4: SWAP2 000009b5: SWAP1 000009b6: PUSH4 0xffffffff 000009bb: AND 000009bc: JUMP 000009bd: JUMPDEST 000009be: DUP3 000009bf: PUSH1 0x00 000009c1: ADD 000009c2: DUP2 000009c3: SWAP1 000009c4: SSTORE 000009c5: POP 000009c6: PUSH2 0x09f7 000009c9: PUSH5 0xe8d4a51000 000009cf: PUSH2 0x09e9 000009d2: DUP6 000009d3: PUSH1 0x09 000009d5: ADD 000009d6: SLOAD 000009d7: DUP6 000009d8: PUSH1 0x00 000009da: ADD 000009db: SLOAD 000009dc: PUSH2 0x187a 000009df: SWAP1 000009e0: SWAP2 000009e1: SWAP1 000009e2: PUSH4 0xffffffff 000009e7: AND 000009e8: JUMP 000009e9: JUMPDEST 000009ea: PUSH2 0x1900 000009ed: SWAP1 000009ee: SWAP2 000009ef: SWAP1 000009f0: PUSH4 0xffffffff 000009f5: AND 000009f6: JUMP 000009f7: JUMPDEST 000009f8: DUP3 000009f9: PUSH1 0x01 000009fb: ADD 000009fc: DUP2 000009fd: SWAP1 000009fe: SSTORE 000009ff: POP 00000a00: PUSH2 0x0a4e 00000a03: CALLER 00000a04: DUP7 00000a05: DUP6 00000a06: PUSH1 0x00 00000a08: ADD 00000a09: PUSH1 0x00 00000a0b: SWAP1 00000a0c: SLOAD 00000a0d: SWAP1 00000a0e: PUSH2 0x0100 00000a11: EXP 00000a12: SWAP1 00000a13: DIV 00000a14: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00000a29: AND 00000a2a: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00000a3f: AND 00000a40: PUSH2 0x1c0d 00000a43: SWAP1 00000a44: SWAP3 00000a45: SWAP2 00000a46: SWAP1 00000a47: PUSH4 0xffffffff 00000a4c: AND 00000a4d: JUMP 00000a4e: JUMPDEST 00000a4f: DUP6 00000a50: CALLER 00000a51: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00000a66: AND 00000a67: PUSH32 0xf279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568 00000a88: DUP8 00000a89: PUSH1 0x40 00000a8b: MLOAD 00000a8c: DUP1 00000a8d: DUP3 00000a8e: DUP2 00000a8f: MSTORE 00000a90: PUSH1 0x20 00000a92: ADD 00000a93: SWAP2 00000a94: POP 00000a95: POP 00000a96: PUSH1 0x40 00000a98: MLOAD 00000a99: DUP1 00000a9a: SWAP2 00000a9b: SUB 00000a9c: SWAP1 00000a9d: LOG3 00000a9e: POP 00000a9f: POP 00000aa0: POP 00000aa1: POP 00000aa2: POP 00000aa3: POP 00000aa4: JUMP 00000aa5: JUMPDEST 00000aa6: DUP1 00000aa7: PUSH1 0x00 00000aa9: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00000abe: AND 00000abf: PUSH1 0x02 00000ac1: DUP3 00000ac2: DUP2 00000ac3: SLOAD 00000ac4: DUP2 00000ac5: LT 00000ac6: PUSH2 0x0acb 00000ac9: JUMPI 00000aca: INVALID 00000acb: JUMPDEST 00000acc: SWAP1 00000acd: PUSH1 0x00 00000acf: MSTORE 00000ad0: PUSH1 0x20 00000ad2: PUSH1 0x00 00000ad4: KECCAK256 00000ad5: SWAP1 00000ad6: PUSH1 0x0a 00000ad8: MUL 00000ad9: ADD 00000ada: PUSH1 0x00 00000adc: ADD 00000add: PUSH1 0x00 00000adf: SWAP1 00000ae0: SLOAD 00000ae1: SWAP1 00000ae2: PUSH2 0x0100 00000ae5: EXP 00000ae6: SWAP1 00000ae7: DIV 00000ae8: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00000afd: AND 00000afe: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00000b13: AND 00000b14: EQ 00000b15: ISZERO 00000b16: PUSH2 0x0b87 00000b19: JUMPI 00000b1a: PUSH1 0x40 00000b1c: MLOAD 00000b1d: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000 00000b3e: DUP2 00000b3f: MSTORE 00000b40: PUSH1 0x04 00000b42: ADD 00000b43: DUP1 00000b44: DUP1 00000b45: PUSH1 0x20 00000b47: ADD 00000b48: DUP3 00000b49: DUP2 00000b4a: SUB 00000b4b: DUP3 00000b4c: MSTORE 00000b4d: PUSH1 0x0e 00000b4f: DUP2 00000b50: MSTORE 00000b51: PUSH1 0x20 00000b53: ADD 00000b54: DUP1 00000b55: PUSH32 0x706f6f6c206e6f74206578697374000000000000000000000000000000000000 00000b76: DUP2 00000b77: MSTORE 00000b78: POP 00000b79: PUSH1 0x20 00000b7b: ADD 00000b7c: SWAP2 00000b7d: POP 00000b7e: POP 00000b7f: PUSH1 0x40 00000b81: MLOAD 00000b82: DUP1 00000b83: SWAP2 00000b84: SUB 00000b85: SWAP1 00000b86: REVERT 00000b87: JUMPDEST 00000b88: PUSH1 0x00 00000b8a: PUSH1 0x02 00000b8c: DUP4 00000b8d: DUP2 00000b8e: SLOAD 00000b8f: DUP2 00000b90: LT 00000b91: PUSH2 0x0b96 00000b94: JUMPI 00000b95: INVALID 00000b96: JUMPDEST 00000b97: SWAP1 00000b98: PUSH1 0x00 00000b9a: MSTORE 00000b9b: PUSH1 0x20 00000b9d: PUSH1 0x00 00000b9f: KECCAK256 00000ba0: SWAP1 00000ba1: PUSH1 0x0a 00000ba3: MUL 00000ba4: ADD 00000ba5: SWAP1 00000ba6: POP 00000ba7: DUP1 00000ba8: PUSH1 0x08 00000baa: ADD 00000bab: SLOAD 00000bac: NUMBER 00000bad: GT 00000bae: PUSH2 0x0bb7 00000bb1: JUMPI 00000bb2: POP 00000bb3: PUSH2 0x0da7 00000bb6: JUMP 00000bb7: JUMPDEST 00000bb8: PUSH1 0x00 00000bba: DUP2 00000bbb: PUSH1 0x00 00000bbd: ADD 00000bbe: PUSH1 0x00 00000bc0: SWAP1 00000bc1: SLOAD 00000bc2: SWAP1 00000bc3: PUSH2 0x0100 00000bc6: EXP 00000bc7: SWAP1 00000bc8: DIV 00000bc9: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00000bde: AND 00000bdf: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00000bf4: AND 00000bf5: PUSH4 0x70a08231 00000bfa: ADDRESS 00000bfb: PUSH1 0x40 00000bfd: MLOAD 00000bfe: DUP3 00000bff: PUSH4 0xffffffff 00000c04: AND 00000c05: PUSH1 0xe0 00000c07: SHL 00000c08: DUP2 00000c09: MSTORE 00000c0a: PUSH1 0x04 00000c0c: ADD 00000c0d: DUP1 00000c0e: DUP3 00000c0f: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00000c24: AND 00000c25: DUP2 00000c26: MSTORE 00000c27: PUSH1 0x20 00000c29: ADD 00000c2a: SWAP2 00000c2b: POP 00000c2c: POP 00000c2d: PUSH1 0x20 00000c2f: PUSH1 0x40 00000c31: MLOAD 00000c32: DUP1 00000c33: DUP4 00000c34: SUB 00000c35: DUP2 00000c36: DUP7 00000c37: DUP1 00000c38: EXTCODESIZE 00000c39: ISZERO 00000c3a: DUP1 00000c3b: ISZERO 00000c3c: PUSH2 0x0c44 00000c3f: JUMPI 00000c40: PUSH1 0x00 00000c42: DUP1 00000c43: REVERT 00000c44: JUMPDEST 00000c45: POP 00000c46: GAS 00000c47: STATICCALL 00000c48: ISZERO 00000c49: DUP1 00000c4a: ISZERO 00000c4b: PUSH2 0x0c58 00000c4e: JUMPI 00000c4f: RETURNDATASIZE 00000c50: PUSH1 0x00 00000c52: DUP1 00000c53: RETURNDATACOPY 00000c54: RETURNDATASIZE 00000c55: PUSH1 0x00 00000c57: REVERT 00000c58: JUMPDEST 00000c59: POP 00000c5a: POP 00000c5b: POP 00000c5c: POP 00000c5d: PUSH1 0x40 00000c5f: MLOAD 00000c60: RETURNDATASIZE 00000c61: PUSH1 0x20 00000c63: DUP2 00000c64: LT 00000c65: ISZERO 00000c66: PUSH2 0x0c6e 00000c69: JUMPI 00000c6a: PUSH1 0x00 00000c6c: DUP1 00000c6d: REVERT 00000c6e: JUMPDEST 00000c6f: DUP2 00000c70: ADD 00000c71: SWAP1 00000c72: DUP1 00000c73: DUP1 00000c74: MLOAD 00000c75: SWAP1 00000c76: PUSH1 0x20 00000c78: ADD 00000c79: SWAP1 00000c7a: SWAP3 00000c7b: SWAP2 00000c7c: SWAP1 00000c7d: POP 00000c7e: POP 00000c7f: POP 00000c80: SWAP1 00000c81: POP 00000c82: PUSH1 0x00 00000c84: DUP2 00000c85: EQ 00000c86: ISZERO 00000c87: PUSH2 0x0c9a 00000c8a: JUMPI 00000c8b: NUMBER 00000c8c: DUP3 00000c8d: PUSH1 0x08 00000c8f: ADD 00000c90: DUP2 00000c91: SWAP1 00000c92: SSTORE 00000c93: POP 00000c94: POP 00000c95: POP 00000c96: PUSH2 0x0da7 00000c99: JUMP 00000c9a: JUMPDEST 00000c9b: PUSH1 0x00 00000c9d: PUSH2 0x0ca5 00000ca0: DUP4 00000ca1: PUSH2 0x1caf 00000ca4: JUMP 00000ca5: JUMPDEST 00000ca6: SWAP1 00000ca7: POP 00000ca8: PUSH1 0x01 00000caa: PUSH1 0x00 00000cac: SWAP1 00000cad: SLOAD 00000cae: SWAP1 00000caf: PUSH2 0x0100 00000cb2: EXP 00000cb3: SWAP1 00000cb4: DIV 00000cb5: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00000cca: AND 00000ccb: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00000ce0: AND 00000ce1: PUSH4 0x40c10f19 00000ce6: ADDRESS 00000ce7: DUP4 00000ce8: PUSH1 0x40 00000cea: MLOAD 00000ceb: DUP4 00000cec: PUSH4 0xffffffff 00000cf1: AND 00000cf2: PUSH1 0xe0 00000cf4: SHL 00000cf5: DUP2 00000cf6: MSTORE 00000cf7: PUSH1 0x04 00000cf9: ADD 00000cfa: DUP1 00000cfb: DUP4 00000cfc: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00000d11: AND 00000d12: DUP2 00000d13: MSTORE 00000d14: PUSH1 0x20 00000d16: ADD 00000d17: DUP3 00000d18: DUP2 00000d19: MSTORE 00000d1a: PUSH1 0x20 00000d1c: ADD 00000d1d: SWAP3 00000d1e: POP 00000d1f: POP 00000d20: POP 00000d21: PUSH1 0x00 00000d23: PUSH1 0x40 00000d25: MLOAD 00000d26: DUP1 00000d27: DUP4 00000d28: SUB 00000d29: DUP2 00000d2a: PUSH1 0x00 00000d2c: DUP8 00000d2d: DUP1 00000d2e: EXTCODESIZE 00000d2f: ISZERO 00000d30: DUP1 00000d31: ISZERO 00000d32: PUSH2 0x0d3a 00000d35: JUMPI 00000d36: PUSH1 0x00 00000d38: DUP1 00000d39: REVERT 00000d3a: JUMPDEST 00000d3b: POP 00000d3c: GAS 00000d3d: CALL 00000d3e: ISZERO 00000d3f: DUP1 00000d40: ISZERO 00000d41: PUSH2 0x0d4e 00000d44: JUMPI 00000d45: RETURNDATASIZE 00000d46: PUSH1 0x00 00000d48: DUP1 00000d49: RETURNDATACOPY 00000d4a: RETURNDATASIZE 00000d4b: PUSH1 0x00 00000d4d: REVERT 00000d4e: JUMPDEST 00000d4f: POP 00000d50: POP 00000d51: POP 00000d52: POP 00000d53: PUSH2 0x0d92 00000d56: PUSH2 0x0d7f 00000d59: DUP4 00000d5a: PUSH2 0x0d71 00000d5d: PUSH5 0xe8d4a51000 00000d63: DUP6 00000d64: PUSH2 0x187a 00000d67: SWAP1 00000d68: SWAP2 00000d69: SWAP1 00000d6a: PUSH4 0xffffffff 00000d6f: AND 00000d70: JUMP 00000d71: JUMPDEST 00000d72: PUSH2 0x1900 00000d75: SWAP1 00000d76: SWAP2 00000d77: SWAP1 00000d78: PUSH4 0xffffffff 00000d7d: AND 00000d7e: JUMP 00000d7f: JUMPDEST 00000d80: DUP5 00000d81: PUSH1 0x09 00000d83: ADD 00000d84: SLOAD 00000d85: PUSH2 0x17f2 00000d88: SWAP1 00000d89: SWAP2 00000d8a: SWAP1 00000d8b: PUSH4 0xffffffff 00000d90: AND 00000d91: JUMP 00000d92: JUMPDEST 00000d93: DUP4 00000d94: PUSH1 0x09 00000d96: ADD 00000d97: DUP2 00000d98: SWAP1 00000d99: SSTORE 00000d9a: POP 00000d9b: NUMBER 00000d9c: DUP4 00000d9d: PUSH1 0x08 00000d9f: ADD 00000da0: DUP2 00000da1: SWAP1 00000da2: SSTORE 00000da3: POP 00000da4: POP 00000da5: POP 00000da6: POP 00000da7: JUMPDEST 00000da8: POP 00000da9: POP 00000daa: JUMP 00000dab: JUMPDEST 00000dac: PUSH2 0x0db3 00000daf: PUSH2 0x17ea 00000db2: JUMP 00000db3: JUMPDEST 00000db4: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00000dc9: AND 00000dca: PUSH1 0x00 00000dcc: DUP1 00000dcd: SLOAD 00000dce: SWAP1 00000dcf: PUSH2 0x0100 00000dd2: EXP 00000dd3: SWAP1 00000dd4: DIV 00000dd5: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00000dea: AND 00000deb: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00000e00: AND 00000e01: EQ 00000e02: PUSH2 0x0e73 00000e05: JUMPI 00000e06: PUSH1 0x40 00000e08: MLOAD 00000e09: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000 00000e2a: DUP2 00000e2b: MSTORE 00000e2c: PUSH1 0x04 00000e2e: ADD 00000e2f: DUP1 00000e30: DUP1 00000e31: PUSH1 0x20 00000e33: ADD 00000e34: DUP3 00000e35: DUP2 00000e36: SUB 00000e37: DUP3 00000e38: MSTORE 00000e39: PUSH1 0x20 00000e3b: DUP2 00000e3c: MSTORE 00000e3d: PUSH1 0x20 00000e3f: ADD 00000e40: DUP1 00000e41: PUSH32 0x4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572 00000e62: DUP2 00000e63: MSTORE 00000e64: POP 00000e65: PUSH1 0x20 00000e67: ADD 00000e68: SWAP2 00000e69: POP 00000e6a: POP 00000e6b: PUSH1 0x40 00000e6d: MLOAD 00000e6e: DUP1 00000e6f: SWAP2 00000e70: SUB 00000e71: SWAP1 00000e72: REVERT 00000e73: JUMPDEST 00000e74: PUSH1 0x00 00000e76: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00000e8b: AND 00000e8c: PUSH1 0x00 00000e8e: DUP1 00000e8f: SLOAD 00000e90: SWAP1 00000e91: PUSH2 0x0100 00000e94: EXP 00000e95: SWAP1 00000e96: DIV 00000e97: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00000eac: AND 00000ead: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00000ec2: AND 00000ec3: PUSH32 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0 00000ee4: PUSH1 0x40 00000ee6: MLOAD 00000ee7: PUSH1 0x40 00000ee9: MLOAD 00000eea: DUP1 00000eeb: SWAP2 00000eec: SUB 00000eed: SWAP1 00000eee: LOG3 00000eef: PUSH1 0x00 00000ef1: DUP1 00000ef2: PUSH1 0x00 00000ef4: PUSH2 0x0100 00000ef7: EXP 00000ef8: DUP2 00000ef9: SLOAD 00000efa: DUP2 00000efb: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00000f10: MUL 00000f11: NOT 00000f12: AND 00000f13: SWAP1 00000f14: DUP4 00000f15: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00000f2a: AND 00000f2b: MUL 00000f2c: OR 00000f2d: SWAP1 00000f2e: SSTORE 00000f2f: POP 00000f30: JUMP 00000f31: JUMPDEST 00000f32: PUSH1 0x00 00000f34: DUP1 00000f35: PUSH1 0x00 00000f37: SWAP1 00000f38: SLOAD 00000f39: SWAP1 00000f3a: PUSH2 0x0100 00000f3d: EXP 00000f3e: SWAP1 00000f3f: DIV 00000f40: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00000f55: AND 00000f56: SWAP1 00000f57: POP 00000f58: SWAP1 00000f59: JUMP 00000f5a: JUMPDEST 00000f5b: PUSH1 0x02 00000f5d: DUP2 00000f5e: DUP2 00000f5f: SLOAD 00000f60: DUP2 00000f61: LT 00000f62: PUSH2 0x0f67 00000f65: JUMPI 00000f66: INVALID 00000f67: JUMPDEST 00000f68: SWAP1 00000f69: PUSH1 0x00 00000f6b: MSTORE 00000f6c: PUSH1 0x20 00000f6e: PUSH1 0x00 00000f70: KECCAK256 00000f71: SWAP1 00000f72: PUSH1 0x0a 00000f74: MUL 00000f75: ADD 00000f76: PUSH1 0x00 00000f78: SWAP2 00000f79: POP 00000f7a: SWAP1 00000f7b: POP 00000f7c: DUP1 00000f7d: PUSH1 0x00 00000f7f: ADD 00000f80: PUSH1 0x00 00000f82: SWAP1 00000f83: SLOAD 00000f84: SWAP1 00000f85: PUSH2 0x0100 00000f88: EXP 00000f89: SWAP1 00000f8a: DIV 00000f8b: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00000fa0: AND 00000fa1: SWAP1 00000fa2: DUP1 00000fa3: PUSH1 0x01 00000fa5: ADD 00000fa6: SLOAD 00000fa7: SWAP1 00000fa8: DUP1 00000fa9: PUSH1 0x02 00000fab: ADD 00000fac: SLOAD 00000fad: SWAP1 00000fae: DUP1 00000faf: PUSH1 0x03 00000fb1: ADD 00000fb2: SLOAD 00000fb3: SWAP1 00000fb4: DUP1 00000fb5: PUSH1 0x04 00000fb7: ADD 00000fb8: SLOAD 00000fb9: SWAP1 00000fba: DUP1 00000fbb: PUSH1 0x05 00000fbd: ADD 00000fbe: SLOAD 00000fbf: SWAP1 00000fc0: DUP1 00000fc1: PUSH1 0x06 00000fc3: ADD 00000fc4: SLOAD 00000fc5: SWAP1 00000fc6: DUP1 00000fc7: PUSH1 0x07 00000fc9: ADD 00000fca: SLOAD 00000fcb: SWAP1 00000fcc: DUP1 00000fcd: PUSH1 0x08 00000fcf: ADD 00000fd0: SLOAD 00000fd1: SWAP1 00000fd2: DUP1 00000fd3: PUSH1 0x09 00000fd5: ADD 00000fd6: SLOAD 00000fd7: SWAP1 00000fd8: POP 00000fd9: DUP11 00000fda: JUMP 00000fdb: JUMPDEST 00000fdc: PUSH1 0x03 00000fde: PUSH1 0x20 00000fe0: MSTORE 00000fe1: DUP2 00000fe2: PUSH1 0x00 00000fe4: MSTORE 00000fe5: PUSH1 0x40 00000fe7: PUSH1 0x00 00000fe9: KECCAK256 00000fea: PUSH1 0x20 00000fec: MSTORE 00000fed: DUP1 00000fee: PUSH1 0x00 00000ff0: MSTORE 00000ff1: PUSH1 0x40 00000ff3: PUSH1 0x00 00000ff5: KECCAK256 00000ff6: PUSH1 0x00 00000ff8: SWAP2 00000ff9: POP 00000ffa: SWAP2 00000ffb: POP 00000ffc: POP 00000ffd: DUP1 00000ffe: PUSH1 0x00 00001000: ADD 00001001: SLOAD 00001002: SWAP1 00001003: DUP1 00001004: PUSH1 0x01 00001006: ADD 00001007: SLOAD 00001008: SWAP1 00001009: POP 0000100a: DUP3 0000100b: JUMP 0000100c: JUMPDEST 0000100d: DUP2 0000100e: PUSH1 0x00 00001010: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00001025: AND 00001026: PUSH1 0x02 00001028: DUP3 00001029: DUP2 0000102a: SLOAD 0000102b: DUP2 0000102c: LT 0000102d: PUSH2 0x1032 00001030: JUMPI 00001031: INVALID 00001032: JUMPDEST 00001033: SWAP1 00001034: PUSH1 0x00 00001036: MSTORE 00001037: PUSH1 0x20 00001039: PUSH1 0x00 0000103b: KECCAK256 0000103c: SWAP1 0000103d: PUSH1 0x0a 0000103f: MUL 00001040: ADD 00001041: PUSH1 0x00 00001043: ADD 00001044: PUSH1 0x00 00001046: SWAP1 00001047: SLOAD 00001048: SWAP1 00001049: PUSH2 0x0100 0000104c: EXP 0000104d: SWAP1 0000104e: DIV 0000104f: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00001064: AND 00001065: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 0000107a: AND 0000107b: EQ 0000107c: ISZERO 0000107d: PUSH2 0x10ee 00001080: JUMPI 00001081: PUSH1 0x40 00001083: MLOAD 00001084: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000 000010a5: DUP2 000010a6: MSTORE 000010a7: PUSH1 0x04 000010a9: ADD 000010aa: DUP1 000010ab: DUP1 000010ac: PUSH1 0x20 000010ae: ADD 000010af: DUP3 000010b0: DUP2 000010b1: SUB 000010b2: DUP3 000010b3: MSTORE 000010b4: PUSH1 0x0e 000010b6: DUP2 000010b7: MSTORE 000010b8: PUSH1 0x20 000010ba: ADD 000010bb: DUP1 000010bc: PUSH32 0x706f6f6c206e6f74206578697374000000000000000000000000000000000000 000010dd: DUP2 000010de: MSTORE 000010df: POP 000010e0: PUSH1 0x20 000010e2: ADD 000010e3: SWAP2 000010e4: POP 000010e5: POP 000010e6: PUSH1 0x40 000010e8: MLOAD 000010e9: DUP1 000010ea: SWAP2 000010eb: SUB 000010ec: SWAP1 000010ed: REVERT 000010ee: JUMPDEST 000010ef: PUSH1 0x00 000010f1: PUSH1 0x02 000010f3: DUP5 000010f4: DUP2 000010f5: SLOAD 000010f6: DUP2 000010f7: LT 000010f8: PUSH2 0x10fd 000010fb: JUMPI 000010fc: INVALID 000010fd: JUMPDEST 000010fe: SWAP1 000010ff: PUSH1 0x00 00001101: MSTORE 00001102: PUSH1 0x20 00001104: PUSH1 0x00 00001106: KECCAK256 00001107: SWAP1 00001108: PUSH1 0x0a 0000110a: MUL 0000110b: ADD 0000110c: SWAP1 0000110d: POP 0000110e: PUSH1 0x00 00001110: PUSH1 0x03 00001112: PUSH1 0x00 00001114: DUP7 00001115: DUP2 00001116: MSTORE 00001117: PUSH1 0x20 00001119: ADD 0000111a: SWAP1 0000111b: DUP2 0000111c: MSTORE 0000111d: PUSH1 0x20 0000111f: ADD 00001120: PUSH1 0x00 00001122: KECCAK256 00001123: PUSH1 0x00 00001125: CALLER 00001126: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 0000113b: AND 0000113c: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00001151: AND 00001152: DUP2 00001153: MSTORE 00001154: PUSH1 0x20 00001156: ADD 00001157: SWAP1 00001158: DUP2 00001159: MSTORE 0000115a: PUSH1 0x20 0000115c: ADD 0000115d: PUSH1 0x00 0000115f: KECCAK256 00001160: SWAP1 00001161: POP 00001162: PUSH2 0x116a 00001165: DUP6 00001166: PUSH2 0x0aa5 00001169: JUMP 0000116a: JUMPDEST 0000116b: PUSH1 0x00 0000116d: DUP2 0000116e: PUSH1 0x00 00001170: ADD 00001171: SLOAD 00001172: GT 00001173: ISZERO 00001174: PUSH2 0x11d9 00001177: JUMPI 00001178: PUSH1 0x00 0000117a: PUSH2 0x11c1 0000117d: DUP3 0000117e: PUSH1 0x01 00001180: ADD 00001181: SLOAD 00001182: PUSH2 0x11b3 00001185: PUSH5 0xe8d4a51000 0000118b: PUSH2 0x11a5 0000118e: DUP8 0000118f: PUSH1 0x09 00001191: ADD 00001192: SLOAD 00001193: DUP8 00001194: PUSH1 0x00 00001196: ADD 00001197: SLOAD 00001198: PUSH2 0x187a 0000119b: SWAP1 0000119c: SWAP2 0000119d: SWAP1 0000119e: PUSH4 0xffffffff 000011a3: AND 000011a4: JUMP 000011a5: JUMPDEST 000011a6: PUSH2 0x1900 000011a9: SWAP1 000011aa: SWAP2 000011ab: SWAP1 000011ac: PUSH4 0xffffffff 000011b1: AND 000011b2: JUMP 000011b3: JUMPDEST 000011b4: PUSH2 0x194a 000011b7: SWAP1 000011b8: SWAP2 000011b9: SWAP1 000011ba: PUSH4 0xffffffff 000011bf: AND 000011c0: JUMP 000011c1: JUMPDEST 000011c2: SWAP1 000011c3: POP 000011c4: PUSH1 0x00 000011c6: DUP2 000011c7: GT 000011c8: ISZERO 000011c9: PUSH2 0x11d7 000011cc: JUMPI 000011cd: PUSH2 0x11d6 000011d0: CALLER 000011d1: DUP3 000011d2: PUSH2 0x1994 000011d5: JUMP 000011d6: JUMPDEST 000011d7: JUMPDEST 000011d8: POP 000011d9: JUMPDEST 000011da: PUSH2 0x122a 000011dd: CALLER 000011de: ADDRESS 000011df: DUP7 000011e0: DUP6 000011e1: PUSH1 0x00 000011e3: ADD 000011e4: PUSH1 0x00 000011e6: SWAP1 000011e7: SLOAD 000011e8: SWAP1 000011e9: PUSH2 0x0100 000011ec: EXP 000011ed: SWAP1 000011ee: DIV 000011ef: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00001204: AND 00001205: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 0000121a: AND 0000121b: PUSH2 0x1f71 0000121e: SWAP1 0000121f: SWAP4 00001220: SWAP3 00001221: SWAP2 00001222: SWAP1 00001223: PUSH4 0xffffffff 00001228: AND 00001229: JUMP 0000122a: JUMPDEST 0000122b: PUSH2 0x1241 0000122e: DUP5 0000122f: DUP3 00001230: PUSH1 0x00 00001232: ADD 00001233: SLOAD 00001234: PUSH2 0x17f2 00001237: SWAP1 00001238: SWAP2 00001239: SWAP1 0000123a: PUSH4 0xffffffff 0000123f: AND 00001240: JUMP 00001241: JUMPDEST 00001242: DUP2 00001243: PUSH1 0x00 00001245: ADD 00001246: DUP2 00001247: SWAP1 00001248: SSTORE 00001249: POP 0000124a: PUSH2 0x127b 0000124d: PUSH5 0xe8d4a51000 00001253: PUSH2 0x126d 00001256: DUP5 00001257: PUSH1 0x09 00001259: ADD 0000125a: SLOAD 0000125b: DUP5 0000125c: PUSH1 0x00 0000125e: ADD 0000125f: SLOAD 00001260: PUSH2 0x187a 00001263: SWAP1 00001264: SWAP2 00001265: SWAP1 00001266: PUSH4 0xffffffff 0000126b: AND 0000126c: JUMP 0000126d: JUMPDEST 0000126e: PUSH2 0x1900 00001271: SWAP1 00001272: SWAP2 00001273: SWAP1 00001274: PUSH4 0xffffffff 00001279: AND 0000127a: JUMP 0000127b: JUMPDEST 0000127c: DUP2 0000127d: PUSH1 0x01 0000127f: ADD 00001280: DUP2 00001281: SWAP1 00001282: SSTORE 00001283: POP 00001284: DUP5 00001285: CALLER 00001286: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 0000129b: AND 0000129c: PUSH32 0x90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15 000012bd: DUP7 000012be: PUSH1 0x40 000012c0: MLOAD 000012c1: DUP1 000012c2: DUP3 000012c3: DUP2 000012c4: MSTORE 000012c5: PUSH1 0x20 000012c7: ADD 000012c8: SWAP2 000012c9: POP 000012ca: POP 000012cb: PUSH1 0x40 000012cd: MLOAD 000012ce: DUP1 000012cf: SWAP2 000012d0: SUB 000012d1: SWAP1 000012d2: LOG3 000012d3: POP 000012d4: POP 000012d5: POP 000012d6: POP 000012d7: POP 000012d8: JUMP 000012d9: JUMPDEST 000012da: PUSH1 0x00 000012dc: DUP3 000012dd: PUSH1 0x00 000012df: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 000012f4: AND 000012f5: PUSH1 0x02 000012f7: DUP3 000012f8: DUP2 000012f9: SLOAD 000012fa: DUP2 000012fb: LT 000012fc: PUSH2 0x1301 000012ff: JUMPI 00001300: INVALID 00001301: JUMPDEST 00001302: SWAP1 00001303: PUSH1 0x00 00001305: MSTORE 00001306: PUSH1 0x20 00001308: PUSH1 0x00 0000130a: KECCAK256 0000130b: SWAP1 0000130c: PUSH1 0x0a 0000130e: MUL 0000130f: ADD 00001310: PUSH1 0x00 00001312: ADD 00001313: PUSH1 0x00 00001315: SWAP1 00001316: SLOAD 00001317: SWAP1 00001318: PUSH2 0x0100 0000131b: EXP 0000131c: SWAP1 0000131d: DIV 0000131e: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00001333: AND 00001334: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00001349: AND 0000134a: EQ 0000134b: ISZERO 0000134c: PUSH2 0x13bd 0000134f: JUMPI 00001350: PUSH1 0x40 00001352: MLOAD 00001353: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000 00001374: DUP2 00001375: MSTORE 00001376: PUSH1 0x04 00001378: ADD 00001379: DUP1 0000137a: DUP1 0000137b: PUSH1 0x20 0000137d: ADD 0000137e: DUP3 0000137f: DUP2 00001380: SUB 00001381: DUP3 00001382: MSTORE 00001383: PUSH1 0x0e 00001385: DUP2 00001386: MSTORE 00001387: PUSH1 0x20 00001389: ADD 0000138a: DUP1 0000138b: PUSH32 0x706f6f6c206e6f74206578697374000000000000000000000000000000000000 000013ac: DUP2 000013ad: MSTORE 000013ae: POP 000013af: PUSH1 0x20 000013b1: ADD 000013b2: SWAP2 000013b3: POP 000013b4: POP 000013b5: PUSH1 0x40 000013b7: MLOAD 000013b8: DUP1 000013b9: SWAP2 000013ba: SUB 000013bb: SWAP1 000013bc: REVERT 000013bd: JUMPDEST 000013be: PUSH1 0x00 000013c0: PUSH1 0x02 000013c2: DUP6 000013c3: DUP2 000013c4: SLOAD 000013c5: DUP2 000013c6: LT 000013c7: PUSH2 0x13cc 000013ca: JUMPI 000013cb: INVALID 000013cc: JUMPDEST 000013cd: SWAP1 000013ce: PUSH1 0x00 000013d0: MSTORE 000013d1: PUSH1 0x20 000013d3: PUSH1 0x00 000013d5: KECCAK256 000013d6: SWAP1 000013d7: PUSH1 0x0a 000013d9: MUL 000013da: ADD 000013db: SWAP1 000013dc: POP 000013dd: PUSH1 0x00 000013df: PUSH1 0x03 000013e1: PUSH1 0x00 000013e3: DUP8 000013e4: DUP2 000013e5: MSTORE 000013e6: PUSH1 0x20 000013e8: ADD 000013e9: SWAP1 000013ea: DUP2 000013eb: MSTORE 000013ec: PUSH1 0x20 000013ee: ADD 000013ef: PUSH1 0x00 000013f1: KECCAK256 000013f2: PUSH1 0x00 000013f4: DUP7 000013f5: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 0000140a: AND 0000140b: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00001420: AND 00001421: DUP2 00001422: MSTORE 00001423: PUSH1 0x20 00001425: ADD 00001426: SWAP1 00001427: DUP2 00001428: MSTORE 00001429: PUSH1 0x20 0000142b: ADD 0000142c: PUSH1 0x00 0000142e: KECCAK256 0000142f: SWAP1 00001430: POP 00001431: PUSH1 0x00 00001433: DUP3 00001434: PUSH1 0x09 00001436: ADD 00001437: SLOAD 00001438: SWAP1 00001439: POP 0000143a: PUSH1 0x00 0000143c: DUP4 0000143d: PUSH1 0x00 0000143f: ADD 00001440: PUSH1 0x00 00001442: SWAP1 00001443: SLOAD 00001444: SWAP1 00001445: PUSH2 0x0100 00001448: EXP 00001449: SWAP1 0000144a: DIV 0000144b: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00001460: AND 00001461: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00001476: AND 00001477: PUSH4 0x70a08231 0000147c: ADDRESS 0000147d: PUSH1 0x40 0000147f: MLOAD 00001480: DUP3 00001481: PUSH4 0xffffffff 00001486: AND 00001487: PUSH1 0xe0 00001489: SHL 0000148a: DUP2 0000148b: MSTORE 0000148c: PUSH1 0x04 0000148e: ADD 0000148f: DUP1 00001490: DUP3 00001491: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 000014a6: AND 000014a7: DUP2 000014a8: MSTORE 000014a9: PUSH1 0x20 000014ab: ADD 000014ac: SWAP2 000014ad: POP 000014ae: POP 000014af: PUSH1 0x20 000014b1: PUSH1 0x40 000014b3: MLOAD 000014b4: DUP1 000014b5: DUP4 000014b6: SUB 000014b7: DUP2 000014b8: DUP7 000014b9: DUP1 000014ba: EXTCODESIZE 000014bb: ISZERO 000014bc: DUP1 000014bd: ISZERO 000014be: PUSH2 0x14c6 000014c1: JUMPI 000014c2: PUSH1 0x00 000014c4: DUP1 000014c5: REVERT 000014c6: JUMPDEST 000014c7: POP 000014c8: GAS 000014c9: STATICCALL 000014ca: ISZERO 000014cb: DUP1 000014cc: ISZERO 000014cd: PUSH2 0x14da 000014d0: JUMPI 000014d1: RETURNDATASIZE 000014d2: PUSH1 0x00 000014d4: DUP1 000014d5: RETURNDATACOPY 000014d6: RETURNDATASIZE 000014d7: PUSH1 0x00 000014d9: REVERT 000014da: JUMPDEST 000014db: POP 000014dc: POP 000014dd: POP 000014de: POP 000014df: PUSH1 0x40 000014e1: MLOAD 000014e2: RETURNDATASIZE 000014e3: PUSH1 0x20 000014e5: DUP2 000014e6: LT 000014e7: ISZERO 000014e8: PUSH2 0x14f0 000014eb: JUMPI 000014ec: PUSH1 0x00 000014ee: DUP1 000014ef: REVERT 000014f0: JUMPDEST 000014f1: DUP2 000014f2: ADD 000014f3: SWAP1 000014f4: DUP1 000014f5: DUP1 000014f6: MLOAD 000014f7: SWAP1 000014f8: PUSH1 0x20 000014fa: ADD 000014fb: SWAP1 000014fc: SWAP3 000014fd: SWAP2 000014fe: SWAP1 000014ff: POP 00001500: POP 00001501: POP 00001502: SWAP1 00001503: POP 00001504: DUP4 00001505: PUSH1 0x08 00001507: ADD 00001508: SLOAD 00001509: NUMBER 0000150a: GT 0000150b: DUP1 0000150c: ISZERO 0000150d: PUSH2 0x1516 00001510: JUMPI 00001511: POP 00001512: PUSH1 0x00 00001514: DUP2 00001515: GT 00001516: JUMPDEST 00001517: ISZERO 00001518: PUSH2 0x1568 0000151b: JUMPI 0000151c: PUSH1 0x00 0000151e: PUSH2 0x1526 00001521: DUP6 00001522: PUSH2 0x1caf 00001525: JUMP 00001526: JUMPDEST 00001527: SWAP1 00001528: POP 00001529: PUSH2 0x1564 0000152c: PUSH2 0x1555 0000152f: DUP4 00001530: PUSH2 0x1547 00001533: PUSH5 0xe8d4a51000 00001539: DUP6 0000153a: PUSH2 0x187a 0000153d: SWAP1 0000153e: SWAP2 0000153f: SWAP1 00001540: PUSH4 0xffffffff 00001545: AND 00001546: JUMP 00001547: JUMPDEST 00001548: PUSH2 0x1900 0000154b: SWAP1 0000154c: SWAP2 0000154d: SWAP1 0000154e: PUSH4 0xffffffff 00001553: AND 00001554: JUMP 00001555: JUMPDEST 00001556: DUP5 00001557: PUSH2 0x17f2 0000155a: SWAP1 0000155b: SWAP2 0000155c: SWAP1 0000155d: PUSH4 0xffffffff 00001562: AND 00001563: JUMP 00001564: JUMPDEST 00001565: SWAP3 00001566: POP 00001567: POP 00001568: JUMPDEST 00001569: PUSH2 0x15ac 0000156c: DUP4 0000156d: PUSH1 0x01 0000156f: ADD 00001570: SLOAD 00001571: PUSH2 0x159e 00001574: PUSH5 0xe8d4a51000 0000157a: PUSH2 0x1590 0000157d: DUP7 0000157e: DUP9 0000157f: PUSH1 0x00 00001581: ADD 00001582: SLOAD 00001583: PUSH2 0x187a 00001586: SWAP1 00001587: SWAP2 00001588: SWAP1 00001589: PUSH4 0xffffffff 0000158e: AND 0000158f: JUMP 00001590: JUMPDEST 00001591: PUSH2 0x1900 00001594: SWAP1 00001595: SWAP2 00001596: SWAP1 00001597: PUSH4 0xffffffff 0000159c: AND 0000159d: JUMP 0000159e: JUMPDEST 0000159f: PUSH2 0x194a 000015a2: SWAP1 000015a3: SWAP2 000015a4: SWAP1 000015a5: PUSH4 0xffffffff 000015aa: AND 000015ab: JUMP 000015ac: JUMPDEST 000015ad: SWAP6 000015ae: POP 000015af: POP 000015b0: POP 000015b1: POP 000015b2: POP 000015b3: POP 000015b4: SWAP3 000015b5: SWAP2 000015b6: POP 000015b7: POP 000015b8: JUMP 000015b9: JUMPDEST 000015ba: PUSH2 0x15c1 000015bd: PUSH2 0x17ea 000015c0: JUMP 000015c1: JUMPDEST 000015c2: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 000015d7: AND 000015d8: PUSH1 0x00 000015da: DUP1 000015db: SLOAD 000015dc: SWAP1 000015dd: PUSH2 0x0100 000015e0: EXP 000015e1: SWAP1 000015e2: DIV 000015e3: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 000015f8: AND 000015f9: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 0000160e: AND 0000160f: EQ 00001610: PUSH2 0x1681 00001613: JUMPI 00001614: PUSH1 0x40 00001616: MLOAD 00001617: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000 00001638: DUP2 00001639: MSTORE 0000163a: PUSH1 0x04 0000163c: ADD 0000163d: DUP1 0000163e: DUP1 0000163f: PUSH1 0x20 00001641: ADD 00001642: DUP3 00001643: DUP2 00001644: SUB 00001645: DUP3 00001646: MSTORE 00001647: PUSH1 0x20 00001649: DUP2 0000164a: MSTORE 0000164b: PUSH1 0x20 0000164d: ADD 0000164e: DUP1 0000164f: PUSH32 0x4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572 00001670: DUP2 00001671: MSTORE 00001672: POP 00001673: PUSH1 0x20 00001675: ADD 00001676: SWAP2 00001677: POP 00001678: POP 00001679: PUSH1 0x40 0000167b: MLOAD 0000167c: DUP1 0000167d: SWAP2 0000167e: SUB 0000167f: SWAP1 00001680: REVERT 00001681: JUMPDEST 00001682: PUSH1 0x00 00001684: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00001699: AND 0000169a: DUP2 0000169b: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 000016b0: AND 000016b1: EQ 000016b2: ISZERO 000016b3: PUSH2 0x1707 000016b6: JUMPI 000016b7: PUSH1 0x40 000016b9: MLOAD 000016ba: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000 000016db: DUP2 000016dc: MSTORE 000016dd: PUSH1 0x04 000016df: ADD 000016e0: DUP1 000016e1: DUP1 000016e2: PUSH1 0x20 000016e4: ADD 000016e5: DUP3 000016e6: DUP2 000016e7: SUB 000016e8: DUP3 000016e9: MSTORE 000016ea: PUSH1 0x26 000016ec: DUP2 000016ed: MSTORE 000016ee: PUSH1 0x20 000016f0: ADD 000016f1: DUP1 000016f2: PUSH2 0x2511 000016f5: PUSH1 0x26 000016f7: SWAP2 000016f8: CODECOPY 000016f9: PUSH1 0x40 000016fb: ADD 000016fc: SWAP2 000016fd: POP 000016fe: POP 000016ff: PUSH1 0x40 00001701: MLOAD 00001702: DUP1 00001703: SWAP2 00001704: SUB 00001705: SWAP1 00001706: REVERT 00001707: JUMPDEST 00001708: DUP1 00001709: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 0000171e: AND 0000171f: PUSH1 0x00 00001721: DUP1 00001722: SLOAD 00001723: SWAP1 00001724: PUSH2 0x0100 00001727: EXP 00001728: SWAP1 00001729: DIV 0000172a: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 0000173f: AND 00001740: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00001755: AND 00001756: PUSH32 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0 00001777: PUSH1 0x40 00001779: MLOAD 0000177a: PUSH1 0x40 0000177c: MLOAD 0000177d: DUP1 0000177e: SWAP2 0000177f: SUB 00001780: SWAP1 00001781: LOG3 00001782: DUP1 00001783: PUSH1 0x00 00001785: DUP1 00001786: PUSH2 0x0100 00001789: EXP 0000178a: DUP2 0000178b: SLOAD 0000178c: DUP2 0000178d: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 000017a2: MUL 000017a3: NOT 000017a4: AND 000017a5: SWAP1 000017a6: DUP4 000017a7: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 000017bc: AND 000017bd: MUL 000017be: OR 000017bf: SWAP1 000017c0: SSTORE 000017c1: POP 000017c2: POP 000017c3: JUMP 000017c4: JUMPDEST 000017c5: PUSH1 0x01 000017c7: PUSH1 0x00 000017c9: SWAP1 000017ca: SLOAD 000017cb: SWAP1 000017cc: PUSH2 0x0100 000017cf: EXP 000017d0: SWAP1 000017d1: DIV 000017d2: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 000017e7: AND 000017e8: DUP2 000017e9: JUMP 000017ea: JUMPDEST 000017eb: PUSH1 0x00 000017ed: CALLER 000017ee: SWAP1 000017ef: POP 000017f0: SWAP1 000017f1: JUMP 000017f2: JUMPDEST 000017f3: PUSH1 0x00 000017f5: DUP1 000017f6: DUP3 000017f7: DUP5 000017f8: ADD 000017f9: SWAP1 000017fa: POP 000017fb: DUP4 000017fc: DUP2 000017fd: LT 000017fe: ISZERO 000017ff: PUSH2 0x1870 00001802: JUMPI 00001803: PUSH1 0x40 00001805: MLOAD 00001806: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000 00001827: DUP2 00001828: MSTORE 00001829: PUSH1 0x04 0000182b: ADD 0000182c: DUP1 0000182d: DUP1 0000182e: PUSH1 0x20 00001830: ADD 00001831: DUP3 00001832: DUP2 00001833: SUB 00001834: DUP3 00001835: MSTORE 00001836: PUSH1 0x1b 00001838: DUP2 00001839: MSTORE 0000183a: PUSH1 0x20 0000183c: ADD 0000183d: DUP1 0000183e: PUSH32 0x536166654d6174683a206164646974696f6e206f766572666c6f770000000000 0000185f: DUP2 00001860: MSTORE 00001861: POP 00001862: PUSH1 0x20 00001864: ADD 00001865: SWAP2 00001866: POP 00001867: POP 00001868: PUSH1 0x40 0000186a: MLOAD 0000186b: DUP1 0000186c: SWAP2 0000186d: SUB 0000186e: SWAP1 0000186f: REVERT 00001870: JUMPDEST 00001871: DUP1 00001872: SWAP2 00001873: POP 00001874: POP 00001875: SWAP3 00001876: SWAP2 00001877: POP 00001878: POP 00001879: JUMP 0000187a: JUMPDEST 0000187b: PUSH1 0x00 0000187d: DUP1 0000187e: DUP4 0000187f: EQ 00001880: ISZERO 00001881: PUSH2 0x188d 00001884: JUMPI 00001885: PUSH1 0x00 00001887: SWAP1 00001888: POP 00001889: PUSH2 0x18fa 0000188c: JUMP 0000188d: JUMPDEST 0000188e: PUSH1 0x00 00001890: DUP3 00001891: DUP5 00001892: MUL 00001893: SWAP1 00001894: POP 00001895: DUP3 00001896: DUP5 00001897: DUP3 00001898: DUP2 00001899: PUSH2 0x189e 0000189c: JUMPI 0000189d: INVALID 0000189e: JUMPDEST 0000189f: DIV 000018a0: EQ 000018a1: PUSH2 0x18f5 000018a4: JUMPI 000018a5: PUSH1 0x40 000018a7: MLOAD 000018a8: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000 000018c9: DUP2 000018ca: MSTORE 000018cb: PUSH1 0x04 000018cd: ADD 000018ce: DUP1 000018cf: DUP1 000018d0: PUSH1 0x20 000018d2: ADD 000018d3: DUP3 000018d4: DUP2 000018d5: SUB 000018d6: DUP3 000018d7: MSTORE 000018d8: PUSH1 0x21 000018da: DUP2 000018db: MSTORE 000018dc: PUSH1 0x20 000018de: ADD 000018df: DUP1 000018e0: PUSH2 0x2537 000018e3: PUSH1 0x21 000018e5: SWAP2 000018e6: CODECOPY 000018e7: PUSH1 0x40 000018e9: ADD 000018ea: SWAP2 000018eb: POP 000018ec: POP 000018ed: PUSH1 0x40 000018ef: MLOAD 000018f0: DUP1 000018f1: SWAP2 000018f2: SUB 000018f3: SWAP1 000018f4: REVERT 000018f5: JUMPDEST 000018f6: DUP1 000018f7: SWAP2 000018f8: POP 000018f9: POP 000018fa: JUMPDEST 000018fb: SWAP3 000018fc: SWAP2 000018fd: POP 000018fe: POP 000018ff: JUMP 00001900: JUMPDEST 00001901: PUSH1 0x00 00001903: PUSH2 0x1942 00001906: DUP4 00001907: DUP4 00001908: PUSH1 0x40 0000190a: MLOAD 0000190b: DUP1 0000190c: PUSH1 0x40 0000190e: ADD 0000190f: PUSH1 0x40 00001911: MSTORE 00001912: DUP1 00001913: PUSH1 0x1a 00001915: DUP2 00001916: MSTORE 00001917: PUSH1 0x20 00001919: ADD 0000191a: PUSH32 0x536166654d6174683a206469766973696f6e206279207a65726f000000000000 0000193b: DUP2 0000193c: MSTORE 0000193d: POP 0000193e: PUSH2 0x2032 00001941: JUMP 00001942: JUMPDEST 00001943: SWAP1 00001944: POP 00001945: SWAP3 00001946: SWAP2 00001947: POP 00001948: POP 00001949: JUMP 0000194a: JUMPDEST 0000194b: PUSH1 0x00 0000194d: PUSH2 0x198c 00001950: DUP4 00001951: DUP4 00001952: PUSH1 0x40 00001954: MLOAD 00001955: DUP1 00001956: PUSH1 0x40 00001958: ADD 00001959: PUSH1 0x40 0000195b: MSTORE 0000195c: DUP1 0000195d: PUSH1 0x1e 0000195f: DUP2 00001960: MSTORE 00001961: PUSH1 0x20 00001963: ADD 00001964: PUSH32 0x536166654d6174683a207375627472616374696f6e206f766572666c6f770000 00001985: DUP2 00001986: MSTORE 00001987: POP 00001988: PUSH2 0x20f8 0000198b: JUMP 0000198c: JUMPDEST 0000198d: SWAP1 0000198e: POP 0000198f: SWAP3 00001990: SWAP2 00001991: POP 00001992: POP 00001993: JUMP 00001994: JUMPDEST 00001995: PUSH1 0x00 00001997: PUSH1 0x01 00001999: PUSH1 0x00 0000199b: SWAP1 0000199c: SLOAD 0000199d: SWAP1 0000199e: PUSH2 0x0100 000019a1: EXP 000019a2: SWAP1 000019a3: DIV 000019a4: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 000019b9: AND 000019ba: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 000019cf: AND 000019d0: PUSH4 0x70a08231 000019d5: ADDRESS 000019d6: PUSH1 0x40 000019d8: MLOAD 000019d9: DUP3 000019da: PUSH4 0xffffffff 000019df: AND 000019e0: PUSH1 0xe0 000019e2: SHL 000019e3: DUP2 000019e4: MSTORE 000019e5: PUSH1 0x04 000019e7: ADD 000019e8: DUP1 000019e9: DUP3 000019ea: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 000019ff: AND 00001a00: DUP2 00001a01: MSTORE 00001a02: PUSH1 0x20 00001a04: ADD 00001a05: SWAP2 00001a06: POP 00001a07: POP 00001a08: PUSH1 0x20 00001a0a: PUSH1 0x40 00001a0c: MLOAD 00001a0d: DUP1 00001a0e: DUP4 00001a0f: SUB 00001a10: DUP2 00001a11: DUP7 00001a12: DUP1 00001a13: EXTCODESIZE 00001a14: ISZERO 00001a15: DUP1 00001a16: ISZERO 00001a17: PUSH2 0x1a1f 00001a1a: JUMPI 00001a1b: PUSH1 0x00 00001a1d: DUP1 00001a1e: REVERT 00001a1f: JUMPDEST 00001a20: POP 00001a21: GAS 00001a22: STATICCALL 00001a23: ISZERO 00001a24: DUP1 00001a25: ISZERO 00001a26: PUSH2 0x1a33 00001a29: JUMPI 00001a2a: RETURNDATASIZE 00001a2b: PUSH1 0x00 00001a2d: DUP1 00001a2e: RETURNDATACOPY 00001a2f: RETURNDATASIZE 00001a30: PUSH1 0x00 00001a32: REVERT 00001a33: JUMPDEST 00001a34: POP 00001a35: POP 00001a36: POP 00001a37: POP 00001a38: PUSH1 0x40 00001a3a: MLOAD 00001a3b: RETURNDATASIZE 00001a3c: PUSH1 0x20 00001a3e: DUP2 00001a3f: LT 00001a40: ISZERO 00001a41: PUSH2 0x1a49 00001a44: JUMPI 00001a45: PUSH1 0x00 00001a47: DUP1 00001a48: REVERT 00001a49: JUMPDEST 00001a4a: DUP2 00001a4b: ADD 00001a4c: SWAP1 00001a4d: DUP1 00001a4e: DUP1 00001a4f: MLOAD 00001a50: SWAP1 00001a51: PUSH1 0x20 00001a53: ADD 00001a54: SWAP1 00001a55: SWAP3 00001a56: SWAP2 00001a57: SWAP1 00001a58: POP 00001a59: POP 00001a5a: POP 00001a5b: SWAP1 00001a5c: POP 00001a5d: DUP1 00001a5e: DUP3 00001a5f: GT 00001a60: ISZERO 00001a61: PUSH2 0x1b38 00001a64: JUMPI 00001a65: PUSH1 0x01 00001a67: PUSH1 0x00 00001a69: SWAP1 00001a6a: SLOAD 00001a6b: SWAP1 00001a6c: PUSH2 0x0100 00001a6f: EXP 00001a70: SWAP1 00001a71: DIV 00001a72: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00001a87: AND 00001a88: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00001a9d: AND 00001a9e: PUSH4 0xa9059cbb 00001aa3: DUP5 00001aa4: DUP4 00001aa5: PUSH1 0x40 00001aa7: MLOAD 00001aa8: DUP4 00001aa9: PUSH4 0xffffffff 00001aae: AND 00001aaf: PUSH1 0xe0 00001ab1: SHL 00001ab2: DUP2 00001ab3: MSTORE 00001ab4: PUSH1 0x04 00001ab6: ADD 00001ab7: DUP1 00001ab8: DUP4 00001ab9: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00001ace: AND 00001acf: DUP2 00001ad0: MSTORE 00001ad1: PUSH1 0x20 00001ad3: ADD 00001ad4: DUP3 00001ad5: DUP2 00001ad6: MSTORE 00001ad7: PUSH1 0x20 00001ad9: ADD 00001ada: SWAP3 00001adb: POP 00001adc: POP 00001add: POP 00001ade: PUSH1 0x20 00001ae0: PUSH1 0x40 00001ae2: MLOAD 00001ae3: DUP1 00001ae4: DUP4 00001ae5: SUB 00001ae6: DUP2 00001ae7: PUSH1 0x00 00001ae9: DUP8 00001aea: DUP1 00001aeb: EXTCODESIZE 00001aec: ISZERO 00001aed: DUP1 00001aee: ISZERO 00001aef: PUSH2 0x1af7 00001af2: JUMPI 00001af3: PUSH1 0x00 00001af5: DUP1 00001af6: REVERT 00001af7: JUMPDEST 00001af8: POP 00001af9: GAS 00001afa: CALL 00001afb: ISZERO 00001afc: DUP1 00001afd: ISZERO 00001afe: PUSH2 0x1b0b 00001b01: JUMPI 00001b02: RETURNDATASIZE 00001b03: PUSH1 0x00 00001b05: DUP1 00001b06: RETURNDATACOPY 00001b07: RETURNDATASIZE 00001b08: PUSH1 0x00 00001b0a: REVERT 00001b0b: JUMPDEST 00001b0c: POP 00001b0d: POP 00001b0e: POP 00001b0f: POP 00001b10: PUSH1 0x40 00001b12: MLOAD 00001b13: RETURNDATASIZE 00001b14: PUSH1 0x20 00001b16: DUP2 00001b17: LT 00001b18: ISZERO 00001b19: PUSH2 0x1b21 00001b1c: JUMPI 00001b1d: PUSH1 0x00 00001b1f: DUP1 00001b20: REVERT 00001b21: JUMPDEST 00001b22: DUP2 00001b23: ADD 00001b24: SWAP1 00001b25: DUP1 00001b26: DUP1 00001b27: MLOAD 00001b28: SWAP1 00001b29: PUSH1 0x20 00001b2b: ADD 00001b2c: SWAP1 00001b2d: SWAP3 00001b2e: SWAP2 00001b2f: SWAP1 00001b30: POP 00001b31: POP 00001b32: POP 00001b33: POP 00001b34: PUSH2 0x1c08 00001b37: JUMP 00001b38: JUMPDEST 00001b39: PUSH1 0x01 00001b3b: PUSH1 0x00 00001b3d: SWAP1 00001b3e: SLOAD 00001b3f: SWAP1 00001b40: PUSH2 0x0100 00001b43: EXP 00001b44: SWAP1 00001b45: DIV 00001b46: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00001b5b: AND 00001b5c: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00001b71: AND 00001b72: PUSH4 0xa9059cbb 00001b77: DUP5 00001b78: DUP5 00001b79: PUSH1 0x40 00001b7b: MLOAD 00001b7c: DUP4 00001b7d: PUSH4 0xffffffff 00001b82: AND 00001b83: PUSH1 0xe0 00001b85: SHL 00001b86: DUP2 00001b87: MSTORE 00001b88: PUSH1 0x04 00001b8a: ADD 00001b8b: DUP1 00001b8c: DUP4 00001b8d: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00001ba2: AND 00001ba3: DUP2 00001ba4: MSTORE 00001ba5: PUSH1 0x20 00001ba7: ADD 00001ba8: DUP3 00001ba9: DUP2 00001baa: MSTORE 00001bab: PUSH1 0x20 00001bad: ADD 00001bae: SWAP3 00001baf: POP 00001bb0: POP 00001bb1: POP 00001bb2: PUSH1 0x20 00001bb4: PUSH1 0x40 00001bb6: MLOAD 00001bb7: DUP1 00001bb8: DUP4 00001bb9: SUB 00001bba: DUP2 00001bbb: PUSH1 0x00 00001bbd: DUP8 00001bbe: DUP1 00001bbf: EXTCODESIZE 00001bc0: ISZERO 00001bc1: DUP1 00001bc2: ISZERO 00001bc3: PUSH2 0x1bcb 00001bc6: JUMPI 00001bc7: PUSH1 0x00 00001bc9: DUP1 00001bca: REVERT 00001bcb: JUMPDEST 00001bcc: POP 00001bcd: GAS 00001bce: CALL 00001bcf: ISZERO 00001bd0: DUP1 00001bd1: ISZERO 00001bd2: PUSH2 0x1bdf 00001bd5: JUMPI 00001bd6: RETURNDATASIZE 00001bd7: PUSH1 0x00 00001bd9: DUP1 00001bda: RETURNDATACOPY 00001bdb: RETURNDATASIZE 00001bdc: PUSH1 0x00 00001bde: REVERT 00001bdf: JUMPDEST 00001be0: POP 00001be1: POP 00001be2: POP 00001be3: POP 00001be4: PUSH1 0x40 00001be6: MLOAD 00001be7: RETURNDATASIZE 00001be8: PUSH1 0x20 00001bea: DUP2 00001beb: LT 00001bec: ISZERO 00001bed: PUSH2 0x1bf5 00001bf0: JUMPI 00001bf1: PUSH1 0x00 00001bf3: DUP1 00001bf4: REVERT 00001bf5: JUMPDEST 00001bf6: DUP2 00001bf7: ADD 00001bf8: SWAP1 00001bf9: DUP1 00001bfa: DUP1 00001bfb: MLOAD 00001bfc: SWAP1 00001bfd: PUSH1 0x20 00001bff: ADD 00001c00: SWAP1 00001c01: SWAP3 00001c02: SWAP2 00001c03: SWAP1 00001c04: POP 00001c05: POP 00001c06: POP 00001c07: POP 00001c08: JUMPDEST 00001c09: POP 00001c0a: POP 00001c0b: POP 00001c0c: JUMP 00001c0d: JUMPDEST 00001c0e: PUSH2 0x1caa 00001c11: DUP4 00001c12: PUSH4 0xa9059cbb 00001c17: PUSH1 0xe0 00001c19: SHL 00001c1a: DUP5 00001c1b: DUP5 00001c1c: PUSH1 0x40 00001c1e: MLOAD 00001c1f: PUSH1 0x24 00001c21: ADD 00001c22: DUP1 00001c23: DUP4 00001c24: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00001c39: AND 00001c3a: DUP2 00001c3b: MSTORE 00001c3c: PUSH1 0x20 00001c3e: ADD 00001c3f: DUP3 00001c40: DUP2 00001c41: MSTORE 00001c42: PUSH1 0x20 00001c44: ADD 00001c45: SWAP3 00001c46: POP 00001c47: POP 00001c48: POP 00001c49: PUSH1 0x40 00001c4b: MLOAD 00001c4c: PUSH1 0x20 00001c4e: DUP2 00001c4f: DUP4 00001c50: SUB 00001c51: SUB 00001c52: DUP2 00001c53: MSTORE 00001c54: SWAP1 00001c55: PUSH1 0x40 00001c57: MSTORE 00001c58: SWAP1 00001c59: PUSH28 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00001c76: NOT 00001c77: AND 00001c78: PUSH1 0x20 00001c7a: DUP3 00001c7b: ADD 00001c7c: DUP1 00001c7d: MLOAD 00001c7e: PUSH28 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00001c9b: DUP4 00001c9c: DUP2 00001c9d: DUP4 00001c9e: AND 00001c9f: OR 00001ca0: DUP4 00001ca1: MSTORE 00001ca2: POP 00001ca3: POP 00001ca4: POP 00001ca5: POP 00001ca6: PUSH2 0x21b8 00001ca9: JUMP 00001caa: JUMPDEST 00001cab: POP 00001cac: POP 00001cad: POP 00001cae: JUMP 00001caf: JUMPDEST 00001cb0: PUSH1 0x00 00001cb2: DUP2 00001cb3: PUSH1 0x08 00001cb5: ADD 00001cb6: SLOAD 00001cb7: NUMBER 00001cb8: GT 00001cb9: PUSH2 0x1cc5 00001cbc: JUMPI 00001cbd: PUSH1 0x00 00001cbf: SWAP1 00001cc0: POP 00001cc1: PUSH2 0x1f6c 00001cc4: JUMP 00001cc5: JUMPDEST 00001cc6: PUSH1 0x00 00001cc8: DUP3 00001cc9: PUSH1 0x08 00001ccb: ADD 00001ccc: SLOAD 00001ccd: SWAP1 00001cce: POP 00001ccf: PUSH1 0x00 00001cd1: PUSH2 0x1ce8 00001cd4: PUSH1 0x01 00001cd6: DUP6 00001cd7: PUSH1 0x02 00001cd9: ADD 00001cda: SLOAD 00001cdb: PUSH2 0x17f2 00001cde: SWAP1 00001cdf: SWAP2 00001ce0: SWAP1 00001ce1: PUSH4 0xffffffff 00001ce6: AND 00001ce7: JUMP 00001ce8: JUMPDEST 00001ce9: NUMBER 00001cea: LT 00001ceb: PUSH2 0x1d0b 00001cee: JUMPI 00001cef: PUSH2 0x1d06 00001cf2: PUSH1 0x01 00001cf4: DUP6 00001cf5: PUSH1 0x02 00001cf7: ADD 00001cf8: SLOAD 00001cf9: PUSH2 0x17f2 00001cfc: SWAP1 00001cfd: SWAP2 00001cfe: SWAP1 00001cff: PUSH4 0xffffffff 00001d04: AND 00001d05: JUMP 00001d06: JUMPDEST 00001d07: PUSH2 0x1d0d 00001d0a: JUMP 00001d0b: JUMPDEST 00001d0c: NUMBER 00001d0d: JUMPDEST 00001d0e: SWAP1 00001d0f: POP 00001d10: PUSH1 0x00 00001d12: PUSH2 0x1d24 00001d15: DUP4 00001d16: DUP4 00001d17: PUSH2 0x194a 00001d1a: SWAP1 00001d1b: SWAP2 00001d1c: SWAP1 00001d1d: PUSH4 0xffffffff 00001d22: AND 00001d23: JUMP 00001d24: JUMPDEST 00001d25: SWAP1 00001d26: POP 00001d27: PUSH1 0x00 00001d29: DUP6 00001d2a: PUSH1 0x04 00001d2c: ADD 00001d2d: SLOAD 00001d2e: EQ 00001d2f: ISZERO 00001d30: PUSH2 0x1d54 00001d33: JUMPI 00001d34: PUSH2 0x1d4a 00001d37: DUP6 00001d38: PUSH1 0x03 00001d3a: ADD 00001d3b: SLOAD 00001d3c: DUP3 00001d3d: PUSH2 0x187a 00001d40: SWAP1 00001d41: SWAP2 00001d42: SWAP1 00001d43: PUSH4 0xffffffff 00001d48: AND 00001d49: JUMP 00001d4a: JUMPDEST 00001d4b: SWAP4 00001d4c: POP 00001d4d: POP 00001d4e: POP 00001d4f: POP 00001d50: PUSH2 0x1f6c 00001d53: JUMP 00001d54: JUMPDEST 00001d55: DUP5 00001d56: PUSH1 0x05 00001d58: ADD 00001d59: SLOAD 00001d5a: DUP4 00001d5b: LT 00001d5c: ISZERO 00001d5d: PUSH2 0x1e0c 00001d60: JUMPI 00001d61: DUP5 00001d62: PUSH1 0x05 00001d64: ADD 00001d65: SLOAD 00001d66: DUP3 00001d67: GT 00001d68: PUSH2 0x1dc6 00001d6b: JUMPI 00001d6c: PUSH2 0x1da3 00001d6f: PUSH2 0x1d94 00001d72: PUSH1 0x07 00001d74: PUSH2 0x1d86 00001d77: DUP7 00001d78: DUP7 00001d79: PUSH2 0x194a 00001d7c: SWAP1 00001d7d: SWAP2 00001d7e: SWAP1 00001d7f: PUSH4 0xffffffff 00001d84: AND 00001d85: JUMP 00001d86: JUMPDEST 00001d87: PUSH2 0x187a 00001d8a: SWAP1 00001d8b: SWAP2 00001d8c: SWAP1 00001d8d: PUSH4 0xffffffff 00001d92: AND 00001d93: JUMP 00001d94: JUMPDEST 00001d95: DUP3 00001d96: PUSH2 0x17f2 00001d99: SWAP1 00001d9a: SWAP2 00001d9b: SWAP1 00001d9c: PUSH4 0xffffffff 00001da1: AND 00001da2: JUMP 00001da3: JUMPDEST 00001da4: SWAP1 00001da5: POP 00001da6: PUSH2 0x1dbc 00001da9: DUP6 00001daa: PUSH1 0x03 00001dac: ADD 00001dad: SLOAD 00001dae: DUP3 00001daf: PUSH2 0x187a 00001db2: SWAP1 00001db3: SWAP2 00001db4: SWAP1 00001db5: PUSH4 0xffffffff 00001dba: AND 00001dbb: JUMP 00001dbc: JUMPDEST 00001dbd: SWAP4 00001dbe: POP 00001dbf: POP 00001dc0: POP 00001dc1: POP 00001dc2: PUSH2 0x1f6c 00001dc5: JUMP 00001dc6: JUMPDEST 00001dc7: PUSH2 0x1e02 00001dca: PUSH2 0x1df3 00001dcd: PUSH1 0x07 00001dcf: PUSH2 0x1de5 00001dd2: DUP7 00001dd3: DUP10 00001dd4: PUSH1 0x05 00001dd6: ADD 00001dd7: SLOAD 00001dd8: PUSH2 0x194a 00001ddb: SWAP1 00001ddc: SWAP2 00001ddd: SWAP1 00001dde: PUSH4 0xffffffff 00001de3: AND 00001de4: JUMP 00001de5: JUMPDEST 00001de6: PUSH2 0x187a 00001de9: SWAP1 00001dea: SWAP2 00001deb: SWAP1 00001dec: PUSH4 0xffffffff 00001df1: AND 00001df2: JUMP 00001df3: JUMPDEST 00001df4: DUP3 00001df5: PUSH2 0x17f2 00001df8: SWAP1 00001df9: SWAP2 00001dfa: SWAP1 00001dfb: PUSH4 0xffffffff 00001e00: AND 00001e01: JUMP 00001e02: JUMPDEST 00001e03: SWAP1 00001e04: POP 00001e05: DUP5 00001e06: PUSH1 0x05 00001e08: ADD 00001e09: SLOAD 00001e0a: SWAP3 00001e0b: POP 00001e0c: JUMPDEST 00001e0d: DUP5 00001e0e: PUSH1 0x06 00001e10: ADD 00001e11: SLOAD 00001e12: DUP4 00001e13: LT 00001e14: ISZERO 00001e15: PUSH2 0x1ec4 00001e18: JUMPI 00001e19: DUP5 00001e1a: PUSH1 0x06 00001e1c: ADD 00001e1d: SLOAD 00001e1e: DUP3 00001e1f: GT 00001e20: PUSH2 0x1e7e 00001e23: JUMPI 00001e24: PUSH2 0x1e5b 00001e27: PUSH2 0x1e4c 00001e2a: PUSH1 0x03 00001e2c: PUSH2 0x1e3e 00001e2f: DUP7 00001e30: DUP7 00001e31: PUSH2 0x194a 00001e34: SWAP1 00001e35: SWAP2 00001e36: SWAP1 00001e37: PUSH4 0xffffffff 00001e3c: AND 00001e3d: JUMP 00001e3e: JUMPDEST 00001e3f: PUSH2 0x187a 00001e42: SWAP1 00001e43: SWAP2 00001e44: SWAP1 00001e45: PUSH4 0xffffffff 00001e4a: AND 00001e4b: JUMP 00001e4c: JUMPDEST 00001e4d: DUP3 00001e4e: PUSH2 0x17f2 00001e51: SWAP1 00001e52: SWAP2 00001e53: SWAP1 00001e54: PUSH4 0xffffffff 00001e59: AND 00001e5a: JUMP 00001e5b: JUMPDEST 00001e5c: SWAP1 00001e5d: POP 00001e5e: PUSH2 0x1e74 00001e61: DUP6 00001e62: PUSH1 0x03 00001e64: ADD 00001e65: SLOAD 00001e66: DUP3 00001e67: PUSH2 0x187a 00001e6a: SWAP1 00001e6b: SWAP2 00001e6c: SWAP1 00001e6d: PUSH4 0xffffffff 00001e72: AND 00001e73: JUMP 00001e74: JUMPDEST 00001e75: SWAP4 00001e76: POP 00001e77: POP 00001e78: POP 00001e79: POP 00001e7a: PUSH2 0x1f6c 00001e7d: JUMP 00001e7e: JUMPDEST 00001e7f: PUSH2 0x1eba 00001e82: PUSH2 0x1eab 00001e85: PUSH1 0x03 00001e87: PUSH2 0x1e9d 00001e8a: DUP7 00001e8b: DUP10 00001e8c: PUSH1 0x06 00001e8e: ADD 00001e8f: SLOAD 00001e90: PUSH2 0x194a 00001e93: SWAP1 00001e94: SWAP2 00001e95: SWAP1 00001e96: PUSH4 0xffffffff 00001e9b: AND 00001e9c: JUMP 00001e9d: JUMPDEST 00001e9e: PUSH2 0x187a 00001ea1: SWAP1 00001ea2: SWAP2 00001ea3: SWAP1 00001ea4: PUSH4 0xffffffff 00001ea9: AND 00001eaa: JUMP 00001eab: JUMPDEST 00001eac: DUP3 00001ead: PUSH2 0x17f2 00001eb0: SWAP1 00001eb1: SWAP2 00001eb2: SWAP1 00001eb3: PUSH4 0xffffffff 00001eb8: AND 00001eb9: JUMP 00001eba: JUMPDEST 00001ebb: SWAP1 00001ebc: POP 00001ebd: DUP5 00001ebe: PUSH1 0x06 00001ec0: ADD 00001ec1: SLOAD 00001ec2: SWAP3 00001ec3: POP 00001ec4: JUMPDEST 00001ec5: DUP5 00001ec6: PUSH1 0x07 00001ec8: ADD 00001ec9: SLOAD 00001eca: DUP4 00001ecb: LT 00001ecc: ISZERO 00001ecd: PUSH2 0x1f4f 00001ed0: JUMPI 00001ed1: DUP5 00001ed2: PUSH1 0x07 00001ed4: ADD 00001ed5: SLOAD 00001ed6: DUP3 00001ed7: GT 00001ed8: PUSH2 0x1f23 00001edb: JUMPI 00001edc: PUSH2 0x1f00 00001edf: PUSH2 0x1ef1 00001ee2: DUP5 00001ee3: DUP5 00001ee4: PUSH2 0x194a 00001ee7: SWAP1 00001ee8: SWAP2 00001ee9: SWAP1 00001eea: PUSH4 0xffffffff 00001eef: AND 00001ef0: JUMP 00001ef1: JUMPDEST 00001ef2: DUP3 00001ef3: PUSH2 0x17f2 00001ef6: SWAP1 00001ef7: SWAP2 00001ef8: SWAP1 00001ef9: PUSH4 0xffffffff 00001efe: AND 00001eff: JUMP 00001f00: JUMPDEST 00001f01: SWAP1 00001f02: POP 00001f03: PUSH2 0x1f19 00001f06: DUP6 00001f07: PUSH1 0x03 00001f09: ADD 00001f0a: SLOAD 00001f0b: DUP3 00001f0c: PUSH2 0x187a 00001f0f: SWAP1 00001f10: SWAP2 00001f11: SWAP1 00001f12: PUSH4 0xffffffff 00001f17: AND 00001f18: JUMP 00001f19: JUMPDEST 00001f1a: SWAP4 00001f1b: POP 00001f1c: POP 00001f1d: POP 00001f1e: POP 00001f1f: PUSH2 0x1f6c 00001f22: JUMP 00001f23: JUMPDEST 00001f24: PUSH2 0x1f4c 00001f27: PUSH2 0x1f3d 00001f2a: DUP5 00001f2b: DUP8 00001f2c: PUSH1 0x07 00001f2e: ADD 00001f2f: SLOAD 00001f30: PUSH2 0x194a 00001f33: SWAP1 00001f34: SWAP2 00001f35: SWAP1 00001f36: PUSH4 0xffffffff 00001f3b: AND 00001f3c: JUMP 00001f3d: JUMPDEST 00001f3e: DUP3 00001f3f: PUSH2 0x17f2 00001f42: SWAP1 00001f43: SWAP2 00001f44: SWAP1 00001f45: PUSH4 0xffffffff 00001f4a: AND 00001f4b: JUMP 00001f4c: JUMPDEST 00001f4d: SWAP1 00001f4e: POP 00001f4f: JUMPDEST 00001f50: PUSH2 0x1f66 00001f53: DUP6 00001f54: PUSH1 0x03 00001f56: ADD 00001f57: SLOAD 00001f58: DUP3 00001f59: PUSH2 0x187a 00001f5c: SWAP1 00001f5d: SWAP2 00001f5e: SWAP1 00001f5f: PUSH4 0xffffffff 00001f64: AND 00001f65: JUMP 00001f66: JUMPDEST 00001f67: SWAP4 00001f68: POP 00001f69: POP 00001f6a: POP 00001f6b: POP 00001f6c: JUMPDEST 00001f6d: SWAP2 00001f6e: SWAP1 00001f6f: POP 00001f70: JUMP 00001f71: JUMPDEST 00001f72: PUSH2 0x202c 00001f75: DUP5 00001f76: PUSH4 0x23b872dd 00001f7b: PUSH1 0xe0 00001f7d: SHL 00001f7e: DUP6 00001f7f: DUP6 00001f80: DUP6 00001f81: PUSH1 0x40 00001f83: MLOAD 00001f84: PUSH1 0x24 00001f86: ADD 00001f87: DUP1 00001f88: DUP5 00001f89: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00001f9e: AND 00001f9f: DUP2 00001fa0: MSTORE 00001fa1: PUSH1 0x20 00001fa3: ADD 00001fa4: DUP4 00001fa5: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00001fba: AND 00001fbb: DUP2 00001fbc: MSTORE 00001fbd: PUSH1 0x20 00001fbf: ADD 00001fc0: DUP3 00001fc1: DUP2 00001fc2: MSTORE 00001fc3: PUSH1 0x20 00001fc5: ADD 00001fc6: SWAP4 00001fc7: POP 00001fc8: POP 00001fc9: POP 00001fca: POP 00001fcb: PUSH1 0x40 00001fcd: MLOAD 00001fce: PUSH1 0x20 00001fd0: DUP2 00001fd1: DUP4 00001fd2: SUB 00001fd3: SUB 00001fd4: DUP2 00001fd5: MSTORE 00001fd6: SWAP1 00001fd7: PUSH1 0x40 00001fd9: MSTORE 00001fda: SWAP1 00001fdb: PUSH28 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00001ff8: NOT 00001ff9: AND 00001ffa: PUSH1 0x20 00001ffc: DUP3 00001ffd: ADD 00001ffe: DUP1 00001fff: MLOAD 00002000: PUSH28 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000201d: DUP4 0000201e: DUP2 0000201f: DUP4 00002020: AND 00002021: OR 00002022: DUP4 00002023: MSTORE 00002024: POP 00002025: POP 00002026: POP 00002027: POP 00002028: PUSH2 0x21b8 0000202b: JUMP 0000202c: JUMPDEST 0000202d: POP 0000202e: POP 0000202f: POP 00002030: POP 00002031: JUMP 00002032: JUMPDEST 00002033: PUSH1 0x00 00002035: DUP1 00002036: DUP4 00002037: GT 00002038: DUP3 00002039: SWAP1 0000203a: PUSH2 0x20de 0000203d: JUMPI 0000203e: PUSH1 0x40 00002040: MLOAD 00002041: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000 00002062: DUP2 00002063: MSTORE 00002064: PUSH1 0x04 00002066: ADD 00002067: DUP1 00002068: DUP1 00002069: PUSH1 0x20 0000206b: ADD 0000206c: DUP3 0000206d: DUP2 0000206e: SUB 0000206f: DUP3 00002070: MSTORE 00002071: DUP4 00002072: DUP2 00002073: DUP2 00002074: MLOAD 00002075: DUP2 00002076: MSTORE 00002077: PUSH1 0x20 00002079: ADD 0000207a: SWAP2 0000207b: POP 0000207c: DUP1 0000207d: MLOAD 0000207e: SWAP1 0000207f: PUSH1 0x20 00002081: ADD 00002082: SWAP1 00002083: DUP1 00002084: DUP4 00002085: DUP4 00002086: PUSH1 0x00 00002088: JUMPDEST 00002089: DUP4 0000208a: DUP2 0000208b: LT 0000208c: ISZERO 0000208d: PUSH2 0x20a3 00002090: JUMPI 00002091: DUP1 00002092: DUP3 00002093: ADD 00002094: MLOAD 00002095: DUP2 00002096: DUP5 00002097: ADD 00002098: MSTORE 00002099: PUSH1 0x20 0000209b: DUP2 0000209c: ADD 0000209d: SWAP1 0000209e: POP 0000209f: PUSH2 0x2088 000020a2: JUMP 000020a3: JUMPDEST 000020a4: POP 000020a5: POP 000020a6: POP 000020a7: POP 000020a8: SWAP1 000020a9: POP 000020aa: SWAP1 000020ab: DUP2 000020ac: ADD 000020ad: SWAP1 000020ae: PUSH1 0x1f 000020b0: AND 000020b1: DUP1 000020b2: ISZERO 000020b3: PUSH2 0x20d0 000020b6: JUMPI 000020b7: DUP1 000020b8: DUP3 000020b9: SUB 000020ba: DUP1 000020bb: MLOAD 000020bc: PUSH1 0x01 000020be: DUP4 000020bf: PUSH1 0x20 000020c1: SUB 000020c2: PUSH2 0x0100 000020c5: EXP 000020c6: SUB 000020c7: NOT 000020c8: AND 000020c9: DUP2 000020ca: MSTORE 000020cb: PUSH1 0x20 000020cd: ADD 000020ce: SWAP2 000020cf: POP 000020d0: JUMPDEST 000020d1: POP 000020d2: SWAP3 000020d3: POP 000020d4: POP 000020d5: POP 000020d6: PUSH1 0x40 000020d8: MLOAD 000020d9: DUP1 000020da: SWAP2 000020db: SUB 000020dc: SWAP1 000020dd: REVERT 000020de: JUMPDEST 000020df: POP 000020e0: PUSH1 0x00 000020e2: DUP4 000020e3: DUP6 000020e4: DUP2 000020e5: PUSH2 0x20ea 000020e8: JUMPI 000020e9: INVALID 000020ea: JUMPDEST 000020eb: DIV 000020ec: SWAP1 000020ed: POP 000020ee: DUP1 000020ef: SWAP2 000020f0: POP 000020f1: POP 000020f2: SWAP4 000020f3: SWAP3 000020f4: POP 000020f5: POP 000020f6: POP 000020f7: JUMP 000020f8: JUMPDEST 000020f9: PUSH1 0x00 000020fb: DUP4 000020fc: DUP4 000020fd: GT 000020fe: ISZERO 000020ff: DUP3 00002100: SWAP1 00002101: PUSH2 0x21a5 00002104: JUMPI 00002105: PUSH1 0x40 00002107: MLOAD 00002108: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000 00002129: DUP2 0000212a: MSTORE 0000212b: PUSH1 0x04 0000212d: ADD 0000212e: DUP1 0000212f: DUP1 00002130: PUSH1 0x20 00002132: ADD 00002133: DUP3 00002134: DUP2 00002135: SUB 00002136: DUP3 00002137: MSTORE 00002138: DUP4 00002139: DUP2 0000213a: DUP2 0000213b: MLOAD 0000213c: DUP2 0000213d: MSTORE 0000213e: PUSH1 0x20 00002140: ADD 00002141: SWAP2 00002142: POP 00002143: DUP1 00002144: MLOAD 00002145: SWAP1 00002146: PUSH1 0x20 00002148: ADD 00002149: SWAP1 0000214a: DUP1 0000214b: DUP4 0000214c: DUP4 0000214d: PUSH1 0x00 0000214f: JUMPDEST 00002150: DUP4 00002151: DUP2 00002152: LT 00002153: ISZERO 00002154: PUSH2 0x216a 00002157: JUMPI 00002158: DUP1 00002159: DUP3 0000215a: ADD 0000215b: MLOAD 0000215c: DUP2 0000215d: DUP5 0000215e: ADD 0000215f: MSTORE 00002160: PUSH1 0x20 00002162: DUP2 00002163: ADD 00002164: SWAP1 00002165: POP 00002166: PUSH2 0x214f 00002169: JUMP 0000216a: JUMPDEST 0000216b: POP 0000216c: POP 0000216d: POP 0000216e: POP 0000216f: SWAP1 00002170: POP 00002171: SWAP1 00002172: DUP2 00002173: ADD 00002174: SWAP1 00002175: PUSH1 0x1f 00002177: AND 00002178: DUP1 00002179: ISZERO 0000217a: PUSH2 0x2197 0000217d: JUMPI 0000217e: DUP1 0000217f: DUP3 00002180: SUB 00002181: DUP1 00002182: MLOAD 00002183: PUSH1 0x01 00002185: DUP4 00002186: PUSH1 0x20 00002188: SUB 00002189: PUSH2 0x0100 0000218c: EXP 0000218d: SUB 0000218e: NOT 0000218f: AND 00002190: DUP2 00002191: MSTORE 00002192: PUSH1 0x20 00002194: ADD 00002195: SWAP2 00002196: POP 00002197: JUMPDEST 00002198: POP 00002199: SWAP3 0000219a: POP 0000219b: POP 0000219c: POP 0000219d: PUSH1 0x40 0000219f: MLOAD 000021a0: DUP1 000021a1: SWAP2 000021a2: SUB 000021a3: SWAP1 000021a4: REVERT 000021a5: JUMPDEST 000021a6: POP 000021a7: PUSH1 0x00 000021a9: DUP4 000021aa: DUP6 000021ab: SUB 000021ac: SWAP1 000021ad: POP 000021ae: DUP1 000021af: SWAP2 000021b0: POP 000021b1: POP 000021b2: SWAP4 000021b3: SWAP3 000021b4: POP 000021b5: POP 000021b6: POP 000021b7: JUMP 000021b8: JUMPDEST 000021b9: PUSH1 0x60 000021bb: PUSH2 0x221a 000021be: DUP3 000021bf: PUSH1 0x40 000021c1: MLOAD 000021c2: DUP1 000021c3: PUSH1 0x40 000021c5: ADD 000021c6: PUSH1 0x40 000021c8: MSTORE 000021c9: DUP1 000021ca: PUSH1 0x20 000021cc: DUP2 000021cd: MSTORE 000021ce: PUSH1 0x20 000021d0: ADD 000021d1: PUSH32 0x5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564 000021f2: DUP2 000021f3: MSTORE 000021f4: POP 000021f5: DUP6 000021f6: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 0000220b: AND 0000220c: PUSH2 0x22a7 0000220f: SWAP1 00002210: SWAP3 00002211: SWAP2 00002212: SWAP1 00002213: PUSH4 0xffffffff 00002218: AND 00002219: JUMP 0000221a: JUMPDEST 0000221b: SWAP1 0000221c: POP 0000221d: PUSH1 0x00 0000221f: DUP2 00002220: MLOAD 00002221: GT 00002222: ISZERO 00002223: PUSH2 0x22a2 00002226: JUMPI 00002227: DUP1 00002228: DUP1 00002229: PUSH1 0x20 0000222b: ADD 0000222c: SWAP1 0000222d: MLOAD 0000222e: PUSH1 0x20 00002230: DUP2 00002231: LT 00002232: ISZERO 00002233: PUSH2 0x223b 00002236: JUMPI 00002237: PUSH1 0x00 00002239: DUP1 0000223a: REVERT 0000223b: JUMPDEST 0000223c: DUP2 0000223d: ADD 0000223e: SWAP1 0000223f: DUP1 00002240: DUP1 00002241: MLOAD 00002242: SWAP1 00002243: PUSH1 0x20 00002245: ADD 00002246: SWAP1 00002247: SWAP3 00002248: SWAP2 00002249: SWAP1 0000224a: POP 0000224b: POP 0000224c: POP 0000224d: PUSH2 0x22a1 00002250: JUMPI 00002251: PUSH1 0x40 00002253: MLOAD 00002254: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000 00002275: DUP2 00002276: MSTORE 00002277: PUSH1 0x04 00002279: ADD 0000227a: DUP1 0000227b: DUP1 0000227c: PUSH1 0x20 0000227e: ADD 0000227f: DUP3 00002280: DUP2 00002281: SUB 00002282: DUP3 00002283: MSTORE 00002284: PUSH1 0x2a 00002286: DUP2 00002287: MSTORE 00002288: PUSH1 0x20 0000228a: ADD 0000228b: DUP1 0000228c: PUSH2 0x2558 0000228f: PUSH1 0x2a 00002291: SWAP2 00002292: CODECOPY 00002293: PUSH1 0x40 00002295: ADD 00002296: SWAP2 00002297: POP 00002298: POP 00002299: PUSH1 0x40 0000229b: MLOAD 0000229c: DUP1 0000229d: SWAP2 0000229e: SUB 0000229f: SWAP1 000022a0: REVERT 000022a1: JUMPDEST 000022a2: JUMPDEST 000022a3: POP 000022a4: POP 000022a5: POP 000022a6: JUMP 000022a7: JUMPDEST 000022a8: PUSH1 0x60 000022aa: PUSH2 0x22b6 000022ad: DUP5 000022ae: DUP5 000022af: PUSH1 0x00 000022b1: DUP6 000022b2: PUSH2 0x22bf 000022b5: JUMP 000022b6: JUMPDEST 000022b7: SWAP1 000022b8: POP 000022b9: SWAP4 000022ba: SWAP3 000022bb: POP 000022bc: POP 000022bd: POP 000022be: JUMP 000022bf: JUMPDEST 000022c0: PUSH1 0x60 000022c2: PUSH2 0x22ca 000022c5: DUP6 000022c6: PUSH2 0x24c5 000022c9: JUMP 000022ca: JUMPDEST 000022cb: PUSH2 0x233c 000022ce: JUMPI 000022cf: PUSH1 0x40 000022d1: MLOAD 000022d2: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000 000022f3: DUP2 000022f4: MSTORE 000022f5: PUSH1 0x04 000022f7: ADD 000022f8: DUP1 000022f9: DUP1 000022fa: PUSH1 0x20 000022fc: ADD 000022fd: DUP3 000022fe: DUP2 000022ff: SUB 00002300: DUP3 00002301: MSTORE 00002302: PUSH1 0x1d 00002304: DUP2 00002305: MSTORE 00002306: PUSH1 0x20 00002308: ADD 00002309: DUP1 0000230a: PUSH32 0x416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000 0000232b: DUP2 0000232c: MSTORE 0000232d: POP 0000232e: PUSH1 0x20 00002330: ADD 00002331: SWAP2 00002332: POP 00002333: POP 00002334: PUSH1 0x40 00002336: MLOAD 00002337: DUP1 00002338: SWAP2 00002339: SUB 0000233a: SWAP1 0000233b: REVERT 0000233c: JUMPDEST 0000233d: PUSH1 0x00 0000233f: PUSH1 0x60 00002341: DUP7 00002342: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00002357: AND 00002358: DUP6 00002359: DUP8 0000235a: PUSH1 0x40 0000235c: MLOAD 0000235d: DUP1 0000235e: DUP3 0000235f: DUP1 00002360: MLOAD 00002361: SWAP1 00002362: PUSH1 0x20 00002364: ADD 00002365: SWAP1 00002366: DUP1 00002367: DUP4 00002368: DUP4 00002369: JUMPDEST 0000236a: PUSH1 0x20 0000236c: DUP4 0000236d: LT 0000236e: PUSH2 0x238c 00002371: JUMPI 00002372: DUP1 00002373: MLOAD 00002374: DUP3 00002375: MSTORE 00002376: PUSH1 0x20 00002378: DUP3 00002379: ADD 0000237a: SWAP2 0000237b: POP 0000237c: PUSH1 0x20 0000237e: DUP2 0000237f: ADD 00002380: SWAP1 00002381: POP 00002382: PUSH1 0x20 00002384: DUP4 00002385: SUB 00002386: SWAP3 00002387: POP 00002388: PUSH2 0x2369 0000238b: JUMP 0000238c: JUMPDEST 0000238d: PUSH1 0x01 0000238f: DUP4 00002390: PUSH1 0x20 00002392: SUB 00002393: PUSH2 0x0100 00002396: EXP 00002397: SUB 00002398: DUP1 00002399: NOT 0000239a: DUP3 0000239b: MLOAD 0000239c: AND 0000239d: DUP2 0000239e: DUP5 0000239f: MLOAD 000023a0: AND 000023a1: DUP1 000023a2: DUP3 000023a3: OR 000023a4: DUP6 000023a5: MSTORE 000023a6: POP 000023a7: POP 000023a8: POP 000023a9: POP 000023aa: POP 000023ab: POP 000023ac: SWAP1 000023ad: POP 000023ae: ADD 000023af: SWAP2 000023b0: POP 000023b1: POP 000023b2: PUSH1 0x00 000023b4: PUSH1 0x40 000023b6: MLOAD 000023b7: DUP1 000023b8: DUP4 000023b9: SUB 000023ba: DUP2 000023bb: DUP6 000023bc: DUP8 000023bd: GAS 000023be: CALL 000023bf: SWAP3 000023c0: POP 000023c1: POP 000023c2: POP 000023c3: RETURNDATASIZE 000023c4: DUP1 000023c5: PUSH1 0x00 000023c7: DUP2 000023c8: EQ 000023c9: PUSH2 0x23ee 000023cc: JUMPI 000023cd: PUSH1 0x40 000023cf: MLOAD 000023d0: SWAP2 000023d1: POP 000023d2: PUSH1 0x1f 000023d4: NOT 000023d5: PUSH1 0x3f 000023d7: RETURNDATASIZE 000023d8: ADD 000023d9: AND 000023da: DUP3 000023db: ADD 000023dc: PUSH1 0x40 000023de: MSTORE 000023df: RETURNDATASIZE 000023e0: DUP3 000023e1: MSTORE 000023e2: RETURNDATASIZE 000023e3: PUSH1 0x00 000023e5: PUSH1 0x20 000023e7: DUP5 000023e8: ADD 000023e9: RETURNDATACOPY 000023ea: PUSH2 0x23f3 000023ed: JUMP 000023ee: JUMPDEST 000023ef: PUSH1 0x60 000023f1: SWAP2 000023f2: POP 000023f3: JUMPDEST 000023f4: POP 000023f5: SWAP2 000023f6: POP 000023f7: SWAP2 000023f8: POP 000023f9: DUP2 000023fa: ISZERO 000023fb: PUSH2 0x2408 000023fe: JUMPI 000023ff: DUP1 00002400: SWAP3 00002401: POP 00002402: POP 00002403: POP 00002404: PUSH2 0x24bd 00002407: JUMP 00002408: JUMPDEST 00002409: PUSH1 0x00 0000240b: DUP2 0000240c: MLOAD 0000240d: GT 0000240e: ISZERO 0000240f: PUSH2 0x241b 00002412: JUMPI 00002413: DUP1 00002414: MLOAD 00002415: DUP1 00002416: DUP3 00002417: PUSH1 0x20 00002419: ADD 0000241a: REVERT 0000241b: JUMPDEST 0000241c: DUP4 0000241d: PUSH1 0x40 0000241f: MLOAD 00002420: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000 00002441: DUP2 00002442: MSTORE 00002443: PUSH1 0x04 00002445: ADD 00002446: DUP1 00002447: DUP1 00002448: PUSH1 0x20 0000244a: ADD 0000244b: DUP3 0000244c: DUP2 0000244d: SUB 0000244e: DUP3 0000244f: MSTORE 00002450: DUP4 00002451: DUP2 00002452: DUP2 00002453: MLOAD 00002454: DUP2 00002455: MSTORE 00002456: PUSH1 0x20 00002458: ADD 00002459: SWAP2 0000245a: POP 0000245b: DUP1 0000245c: MLOAD 0000245d: SWAP1 0000245e: PUSH1 0x20 00002460: ADD 00002461: SWAP1 00002462: DUP1 00002463: DUP4 00002464: DUP4 00002465: PUSH1 0x00 00002467: JUMPDEST 00002468: DUP4 00002469: DUP2 0000246a: LT 0000246b: ISZERO 0000246c: PUSH2 0x2482 0000246f: JUMPI 00002470: DUP1 00002471: DUP3 00002472: ADD 00002473: MLOAD 00002474: DUP2 00002475: DUP5 00002476: ADD 00002477: MSTORE 00002478: PUSH1 0x20 0000247a: DUP2 0000247b: ADD 0000247c: SWAP1 0000247d: POP 0000247e: PUSH2 0x2467 00002481: JUMP 00002482: JUMPDEST 00002483: POP 00002484: POP 00002485: POP 00002486: POP 00002487: SWAP1 00002488: POP 00002489: SWAP1 0000248a: DUP2 0000248b: ADD 0000248c: SWAP1 0000248d: PUSH1 0x1f 0000248f: AND 00002490: DUP1 00002491: ISZERO 00002492: PUSH2 0x24af 00002495: JUMPI 00002496: DUP1 00002497: DUP3 00002498: SUB 00002499: DUP1 0000249a: MLOAD 0000249b: PUSH1 0x01 0000249d: DUP4 0000249e: PUSH1 0x20 000024a0: SUB 000024a1: PUSH2 0x0100 000024a4: EXP 000024a5: SUB 000024a6: NOT 000024a7: AND 000024a8: DUP2 000024a9: MSTORE 000024aa: PUSH1 0x20 000024ac: ADD 000024ad: SWAP2 000024ae: POP 000024af: JUMPDEST 000024b0: POP 000024b1: SWAP3 000024b2: POP 000024b3: POP 000024b4: POP 000024b5: PUSH1 0x40 000024b7: MLOAD 000024b8: DUP1 000024b9: SWAP2 000024ba: SUB 000024bb: SWAP1 000024bc: REVERT 000024bd: JUMPDEST 000024be: SWAP5 000024bf: SWAP4 000024c0: POP 000024c1: POP 000024c2: POP 000024c3: POP 000024c4: JUMP 000024c5: JUMPDEST 000024c6: PUSH1 0x00 000024c8: DUP1 000024c9: PUSH1 0x00 000024cb: PUSH32 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 000024ec: PUSH1 0x00 000024ee: SHL 000024ef: SWAP1 000024f0: POP 000024f1: DUP4 000024f2: EXTCODEHASH 000024f3: SWAP2 000024f4: POP 000024f5: DUP1 000024f6: DUP3 000024f7: EQ 000024f8: ISZERO 000024f9: DUP1 000024fa: ISZERO 000024fb: PUSH2 0x2507 000024fe: JUMPI 000024ff: POP 00002500: PUSH1 0x00 00002502: DUP1 00002503: SHL 00002504: DUP3 00002505: EQ 00002506: ISZERO 00002507: JUMPDEST 00002508: SWAP3 00002509: POP 0000250a: POP 0000250b: POP 0000250c: SWAP2 0000250d: SWAP1 0000250e: POP 0000250f: JUMP 00002510: INVALID 00002511: UNKNOWN(0x4F) 00002512: PUSH24 0x6e61626c653a206e6577206f776e65722069732074686520 0000252b: PUSH27 0x65726f2061646472657373536166654d6174683a206d756c746970 00002547: PUSH13 0x69636174696f6e206f76657266 00002555: PUSH13 0x6f775361666545524332303a20 00002563: GASLIMIT 00002564: MSTORE 00002565: NUMBER 00002566: ORIGIN 00002567: ADDRESS 00002568: KECCAK256 00002569: PUSH16 0x7065726174696f6e20646964206e6f74 0000257a: KECCAK256 0000257b: PUSH20 0x756363656564a2646970667358221220bbf3f14e 00002590: UNKNOWN(0x23) 00002591: PUSH31 0x0213add356e33959d72553d41272768fb8222ea855c6107879b164736f6c63 000025b1: NUMBER 000025b2: STOP 000025b3: MOD 000025b4: UNKNOWN(0x0C) 000025b5: STOP 000025b6: CALLER
| Severity | Category | Tool | Title | Confidence | Validated | Confirmed | Details |
|---|---|---|---|---|---|---|---|
| high | other | slither | Pool.safeRewardTransfer(address,uint256) (contracts/Contract.sol#1269-1276) ignores return value by rewardToken.transfer(_to,balance) (contracts/Contract.sol#1272-1273) | 85 | no | — |
viewevidence_json{
"impact": "High",
"detector": "unchecked-transfer",
"elements": [
{
"name": "safeRewardTransfer",
"type": "function",
"source_mapping": {
"lines": [
1269,
1270,
1271,
1272,
1273,
1274,
1275,
1276
],
"start": 45980,
"length": 294,
"ending_column": 19,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 21,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "Pool",
"type": "contract",
"source_mapping": {
"lines": [
1095,
1096,
1097,
1098,
1099,
1100,
1101,
1102,
1103,
1104,
1105,
1106,
1107,
1108,
1109,
1110,
1111,
1112,
1113,
1114,
1115,
1116,
1117,
1118,
1119,
1120,
1121,
1122,
1123,
1124,
1125,
1126,
1127,
1128,
1129,
1130,
1131,
1132,
1133,
1134,
1135,
1136,
1137,
1138,
1139,
1140,
1141,
1142,
1143,
1144,
1145,
1146,
1147,
1148,
1149,
1150,
1151,
1152,
1153,
1154,
1155,
1156,
1157,
1158,
1159,
1160,
1161,
1162,
1163,
1164,
1165,
1166,
1167,
1168,
1169,
1170,
1171,
1172,
1173,
1174,
1175,
1176,
1177,
1178,
1179,
1180,
1181,
1182,
1183,
1184,
1185,
1186,
1187,
1188,
1189,
1190,
1191,
1192,
1193,
1194,
1195,
1196,
1197,
1198,
1199,
1200,
1201,
1202,
1203,
1204,
1205,
1206,
1207,
1208,
1209,
1210,
1211,
1212,
1213,
1214,
1215,
1216,
1217,
1218,
1219,
1220,
1221,
1222,
1223,
1224,
1225,
1226,
1227,
1228,
1229,
1230,
1231,
1232,
1233,
1234,
1235,
1236,
1237,
1238,
1239,
1240,
1241,
1242,
1243,
1244,
1245,
1246,
1247,
1248,
1249,
1250,
1251,
1252,
1253,
1254,
1255,
1256,
1257,
1258,
1259,
1260,
1261,
1262,
1263,
1264,
1265,
1266,
1267,
1268,
1269,
1270,
1271,
1272,
1273,
1274,
1275,
1276
],
"start": 39751,
"length": 6525,
"ending_column": 21,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 47,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
}
},
"signature": "safeRewardTransfer(address,uint256)"
}
},
{
"name": "rewardToken.transfer(_to,balance)",
"type": "node",
"source_mapping": {
"lines": [
1272,
1273
],
"start": 46158,
"length": 34,
"ending_column": 27,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 31,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "safeRewardTransfer",
"type": "function",
"source_mapping": {
"lines": [
1269,
1270,
1271,
1272,
1273,
1274,
1275,
1276
],
"start": 45980,
"length": 294,
"ending_column": 19,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 21,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "Pool",
"type": "contract",
"source_mapping": {
"lines": [
1095,
1096,
1097,
1098,
1099,
1100,
1101,
1102,
1103,
1104,
1105,
1106,
1107,
1108,
1109,
1110,
1111,
1112,
1113,
1114,
1115,
1116,
1117,
1118,
1119,
1120,
1121,
1122,
1123,
1124,
1125,
1126,
1127,
1128,
1129,
1130,
1131,
1132,
1133,
1134,
1135,
1136,
1137,
1138,
1139,
1140,
1141,
1142,
1143,
1144,
1145,
1146,
1147,
1148,
1149,
1150,
1151,
1152,
1153,
1154,
1155,
1156,
1157,
1158,
1159,
1160,
1161,
1162,
1163,
1164,
1165,
1166,
1167,
1168,
1169,
1170,
1171,
1172,
1173,
1174,
1175,
1176,
1177,
1178,
1179,
1180,
1181,
1182,
1183,
1184,
1185,
1186,
1187,
1188,
1189,
1190,
1191,
1192,
1193,
1194,
1195,
1196,
1197,
1198,
1199,
1200,
1201,
1202,
1203,
1204,
1205,
1206,
1207,
1208,
1209,
1210,
1211,
1212,
1213,
1214,
1215,
1216,
1217,
1218,
1219,
1220,
1221,
1222,
1223,
1224,
1225,
1226,
1227,
1228,
1229,
1230,
1231,
1232,
1233,
1234,
1235,
1236,
1237,
1238,
1239,
1240,
1241,
1242,
1243,
1244,
1245,
1246,
1247,
1248,
1249,
1250,
1251,
1252,
1253,
1254,
1255,
1256,
1257,
1258,
1259,
1260,
1261,
1262,
1263,
1264,
1265,
1266,
1267,
1268,
1269,
1270,
1271,
1272,
1273,
1274,
1275,
1276
],
"start": 39751,
"length": 6525,
"ending_column": 21,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 47,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
}
},
"signature": "safeRewardTransfer(address,uint256)"
}
}
}
}
],
"locations": [
{
"file": "contracts/Contract.sol",
"name": "safeRewardTransfer",
"type": "function",
"lines": [
1269,
1270,
1271,
1272,
1273,
1274,
1275,
1276
]
},
{
"file": "contracts/Contract.sol",
"name": "rewardToken.transfer(_to,balance)",
"type": "node",
"lines": [
1272,
1273
]
}
],
"description": "Pool.safeRewardTransfer(address,uint256) (contracts/Contract.sol#1269-1276) ignores return value by rewardToken.transfer(_to,balance) (contracts/Contract.sol#1272-1273)"
}
|
| high | other | slither | Pool.safeRewardTransfer(address,uint256) (contracts/Contract.sol#1269-1276) ignores return value by rewardToken.transfer(_to,_amount) (contracts/Contract.sol#1273-1276) | 85 | no | — |
viewevidence_json{
"impact": "High",
"detector": "unchecked-transfer",
"elements": [
{
"name": "safeRewardTransfer",
"type": "function",
"source_mapping": {
"lines": [
1269,
1270,
1271,
1272,
1273,
1274,
1275,
1276
],
"start": 45980,
"length": 294,
"ending_column": 19,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 21,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "Pool",
"type": "contract",
"source_mapping": {
"lines": [
1095,
1096,
1097,
1098,
1099,
1100,
1101,
1102,
1103,
1104,
1105,
1106,
1107,
1108,
1109,
1110,
1111,
1112,
1113,
1114,
1115,
1116,
1117,
1118,
1119,
1120,
1121,
1122,
1123,
1124,
1125,
1126,
1127,
1128,
1129,
1130,
1131,
1132,
1133,
1134,
1135,
1136,
1137,
1138,
1139,
1140,
1141,
1142,
1143,
1144,
1145,
1146,
1147,
1148,
1149,
1150,
1151,
1152,
1153,
1154,
1155,
1156,
1157,
1158,
1159,
1160,
1161,
1162,
1163,
1164,
1165,
1166,
1167,
1168,
1169,
1170,
1171,
1172,
1173,
1174,
1175,
1176,
1177,
1178,
1179,
1180,
1181,
1182,
1183,
1184,
1185,
1186,
1187,
1188,
1189,
1190,
1191,
1192,
1193,
1194,
1195,
1196,
1197,
1198,
1199,
1200,
1201,
1202,
1203,
1204,
1205,
1206,
1207,
1208,
1209,
1210,
1211,
1212,
1213,
1214,
1215,
1216,
1217,
1218,
1219,
1220,
1221,
1222,
1223,
1224,
1225,
1226,
1227,
1228,
1229,
1230,
1231,
1232,
1233,
1234,
1235,
1236,
1237,
1238,
1239,
1240,
1241,
1242,
1243,
1244,
1245,
1246,
1247,
1248,
1249,
1250,
1251,
1252,
1253,
1254,
1255,
1256,
1257,
1258,
1259,
1260,
1261,
1262,
1263,
1264,
1265,
1266,
1267,
1268,
1269,
1270,
1271,
1272,
1273,
1274,
1275,
1276
],
"start": 39751,
"length": 6525,
"ending_column": 21,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 47,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
}
},
"signature": "safeRewardTransfer(address,uint256)"
}
},
{
"name": "rewardToken.transfer(_to,_amount)",
"type": "node",
"source_mapping": {
"lines": [
1273,
1274,
1275,
1276
],
"start": 46223,
"length": 34,
"ending_column": 2,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 58,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "safeRewardTransfer",
"type": "function",
"source_mapping": {
"lines": [
1269,
1270,
1271,
1272,
1273,
1274,
1275,
1276
],
"start": 45980,
"length": 294,
"ending_column": 19,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 21,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "Pool",
"type": "contract",
"source_mapping": {
"lines": [
1095,
1096,
1097,
1098,
1099,
1100,
1101,
1102,
1103,
1104,
1105,
1106,
1107,
1108,
1109,
1110,
1111,
1112,
1113,
1114,
1115,
1116,
1117,
1118,
1119,
1120,
1121,
1122,
1123,
1124,
1125,
1126,
1127,
1128,
1129,
1130,
1131,
1132,
1133,
1134,
1135,
1136,
1137,
1138,
1139,
1140,
1141,
1142,
1143,
1144,
1145,
1146,
1147,
1148,
1149,
1150,
1151,
1152,
1153,
1154,
1155,
1156,
1157,
1158,
1159,
1160,
1161,
1162,
1163,
1164,
1165,
1166,
1167,
1168,
1169,
1170,
1171,
1172,
1173,
1174,
1175,
1176,
1177,
1178,
1179,
1180,
1181,
1182,
1183,
1184,
1185,
1186,
1187,
1188,
1189,
1190,
1191,
1192,
1193,
1194,
1195,
1196,
1197,
1198,
1199,
1200,
1201,
1202,
1203,
1204,
1205,
1206,
1207,
1208,
1209,
1210,
1211,
1212,
1213,
1214,
1215,
1216,
1217,
1218,
1219,
1220,
1221,
1222,
1223,
1224,
1225,
1226,
1227,
1228,
1229,
1230,
1231,
1232,
1233,
1234,
1235,
1236,
1237,
1238,
1239,
1240,
1241,
1242,
1243,
1244,
1245,
1246,
1247,
1248,
1249,
1250,
1251,
1252,
1253,
1254,
1255,
1256,
1257,
1258,
1259,
1260,
1261,
1262,
1263,
1264,
1265,
1266,
1267,
1268,
1269,
1270,
1271,
1272,
1273,
1274,
1275,
1276
],
"start": 39751,
"length": 6525,
"ending_column": 21,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 47,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
}
},
"signature": "safeRewardTransfer(address,uint256)"
}
}
}
}
],
"locations": [
{
"file": "contracts/Contract.sol",
"name": "safeRewardTransfer",
"type": "function",
"lines": [
1269,
1270,
1271,
1272,
1273,
1274,
1275,
1276
]
},
{
"file": "contracts/Contract.sol",
"name": "rewardToken.transfer(_to,_amount)",
"type": "node",
"lines": [
1273,
1274,
1275,
1276
]
}
],
"description": "Pool.safeRewardTransfer(address,uint256) (contracts/Contract.sol#1269-1276) ignores return value by rewardToken.transfer(_to,_amount) (contracts/Contract.sol#1273-1276)"
}
|
| high | auth | detector | Authorization based on tx.origin | 70 | no | — |
viewvalidation_json{
"reason": "missing sink mapping",
"status": "no_sink"
}
witness_json{
"notes": "heuristic witness; entrypoints are best-effort selectors with zeroed calldata",
"constraints": [],
"entrypoints": [
{
"calldata": "0xac4afa38",
"selector": "0xac4afa38",
"calldata_variants": [
"0xac4afa38",
"0xac4afa380000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xb9d02df4",
"selector": "0xb9d02df4",
"calldata_variants": [
"0xb9d02df4",
"0xb9d02df40000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xe2bbb158",
"selector": "0xe2bbb158",
"calldata_variants": [
"0xe2bbb158",
"0xe2bbb1580000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xe4c75c27",
"selector": "0xe4c75c27",
"calldata_variants": [
"0xe4c75c27",
"0xe4c75c270000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xf2fde38b",
"selector": "0xf2fde38b",
"calldata_variants": [
"0xf2fde38b",
"0xf2fde38b0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xf7c618c1",
"selector": "0xf7c618c1",
"calldata_variants": [
"0xf7c618c1",
"0xf7c618c10000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x081e3eda",
"selector": "0x081e3eda",
"calldata_variants": [
"0x081e3eda",
"0x081e3eda0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x29cb0090",
"selector": "0x29cb0090",
"calldata_variants": [
"0x29cb0090",
"0x29cb00900000000000000000000000000000000000000000000000000000000000000000"
]
}
]
}
evidence_json{
"guards_detected": [
{
"pc": 9574,
"type": "tx_origin_used"
}
]
}
|
| high | math | codex | Pool can be permanently bricked after endBlock due to underflow in reward calculation | 85 | no | — |
viewevidence_json{
"evidence": "getTotalReward subtracts to.sub(from) without handling lastRewardBlock > endBlock+1, and updatePool sets lastRewardBlock = block.number even after endBlock.",
"locations": [
"contracts/Contract.sol:1201",
"contracts/Contract.sol:1205",
"contracts/Contract.sol:1206",
"contracts/Contract.sol:1207",
"contracts/Contract.sol:1251"
],
"recommendation": "Guard in getTotalReward for lastRewardBlock >= endBlock+1 and return 0; or clamp lastRewardBlock to endBlock+1 in updatePool. Also validate endBlock > startBlock when adding pools.",
"exploit_scenario": "Once block.number > endBlock, the first call to updatePool (triggered by any deposit/withdraw) sets lastRewardBlock to the current block. On the next interaction, getTotalReward computes to = min(block.number, endBlock+1), which is now less than lastRewardBlock, so to.sub(from) underflows and reverts. This makes updatePool/pending/deposit/withdraw permanently revert, locking all remaining staked tokens. An attacker can trigger this by calling any pool action after endBlock, preventing others from withdrawing."
}
|
| medium | other | detector | Untrusted CALL target/value reachable | 45 | no | no |
viewtrace_id: 0xdfe2e366c262252ba136c76ff934fcc04dae9056536a44149bc714d90e0f9ef7
call_targets:
0x8ba5325a98147d67e5ee09bb0273194c68512612
target_varies:
no
classification:
constant_target
validation_json{
"sink": "CALL",
"errors": 0,
"status": "sink_reached",
"attempts": 1,
"trace_id": "0xdfe2e366c262252ba136c76ff934fcc04dae9056536a44149bc714d90e0f9ef7",
"confirmed": false,
"trace_mode": "callTracer",
"call_targets": [
"0x8ba5325a98147d67e5ee09bb0273194c68512612"
],
"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": "0xac4afa38",
"selector": "0xac4afa38",
"calldata_variants": [
"0xac4afa38",
"0xac4afa380000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xb9d02df4",
"selector": "0xb9d02df4",
"calldata_variants": [
"0xb9d02df4",
"0xb9d02df40000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xe2bbb158",
"selector": "0xe2bbb158",
"calldata_variants": [
"0xe2bbb158",
"0xe2bbb1580000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xe4c75c27",
"selector": "0xe4c75c27",
"calldata_variants": [
"0xe4c75c27",
"0xe4c75c270000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xf2fde38b",
"selector": "0xf2fde38b",
"calldata_variants": [
"0xf2fde38b",
"0xf2fde38b0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xf7c618c1",
"selector": "0xf7c618c1",
"calldata_variants": [
"0xf7c618c1",
"0xf7c618c10000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x081e3eda",
"selector": "0x081e3eda",
"calldata_variants": [
"0x081e3eda",
"0x081e3eda0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x29cb0090",
"selector": "0x29cb0090",
"calldata_variants": [
"0x29cb0090",
"0x29cb00900000000000000000000000000000000000000000000000000000000000000000"
]
}
]
}
evidence_json{
"examples": [
{
"pc": 3389,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
},
{
"pc": 6906,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
},
{
"pc": 7118,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
}
],
"call_count": 4,
"guards_detected": [
{
"pc": 9574,
"type": "tx_origin_used"
}
],
"untrusted_call_count": 4
}
|
| medium | other | detector | ETH value transfer possible | 40 | no | no |
viewtrace_id: 0xdfe2e366c262252ba136c76ff934fcc04dae9056536a44149bc714d90e0f9ef7
call_targets:
0x8ba5325a98147d67e5ee09bb0273194c68512612
target_varies:
no
classification:
constant_target
validation_json{
"sink": "CALL",
"errors": 0,
"status": "sink_reached",
"attempts": 1,
"trace_id": "0xdfe2e366c262252ba136c76ff934fcc04dae9056536a44149bc714d90e0f9ef7",
"confirmed": false,
"trace_mode": "callTracer",
"call_targets": [
"0x8ba5325a98147d67e5ee09bb0273194c68512612"
],
"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": "0xac4afa38",
"selector": "0xac4afa38",
"calldata_variants": [
"0xac4afa38",
"0xac4afa380000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xb9d02df4",
"selector": "0xb9d02df4",
"calldata_variants": [
"0xb9d02df4",
"0xb9d02df40000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xe2bbb158",
"selector": "0xe2bbb158",
"calldata_variants": [
"0xe2bbb158",
"0xe2bbb1580000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xe4c75c27",
"selector": "0xe4c75c27",
"calldata_variants": [
"0xe4c75c27",
"0xe4c75c270000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xf2fde38b",
"selector": "0xf2fde38b",
"calldata_variants": [
"0xf2fde38b",
"0xf2fde38b0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xf7c618c1",
"selector": "0xf7c618c1",
"calldata_variants": [
"0xf7c618c1",
"0xf7c618c10000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x081e3eda",
"selector": "0x081e3eda",
"calldata_variants": [
"0x081e3eda",
"0x081e3eda0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x29cb0090",
"selector": "0x29cb0090",
"calldata_variants": [
"0x29cb0090",
"0x29cb00900000000000000000000000000000000000000000000000000000000000000000"
]
}
]
}
evidence_json{
"examples": [
{
"pc": 3389,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
},
{
"pc": 6906,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
},
{
"pc": 7118,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
}
],
"eth_value_calls": 4,
"guards_detected": [
{
"pc": 9574,
"type": "tx_origin_used"
}
]
}
|
| medium | reentrancy | slither | Reentrancy in Pool.withdraw(uint256,uint256) (contracts/Contract.sol#1255-1269): | 75 | no | — |
viewevidence_json{
"impact": "Medium",
"detector": "reentrancy-no-eth",
"elements": [
{
"name": "withdraw",
"type": "function",
"source_mapping": {
"lines": [
1255,
1256,
1257,
1258,
1259,
1260,
1261,
1262,
1263,
1264,
1265,
1266,
1267,
1268,
1269
],
"start": 45248,
"length": 726,
"ending_column": 15,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 13,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "Pool",
"type": "contract",
"source_mapping": {
"lines": [
1095,
1096,
1097,
1098,
1099,
1100,
1101,
1102,
1103,
1104,
1105,
1106,
1107,
1108,
1109,
1110,
1111,
1112,
1113,
1114,
1115,
1116,
1117,
1118,
1119,
1120,
1121,
1122,
1123,
1124,
1125,
1126,
1127,
1128,
1129,
1130,
1131,
1132,
1133,
1134,
1135,
1136,
1137,
1138,
1139,
1140,
1141,
1142,
1143,
1144,
1145,
1146,
1147,
1148,
1149,
1150,
1151,
1152,
1153,
1154,
1155,
1156,
1157,
1158,
1159,
1160,
1161,
1162,
1163,
1164,
1165,
1166,
1167,
1168,
1169,
1170,
1171,
1172,
1173,
1174,
1175,
1176,
1177,
1178,
1179,
1180,
1181,
1182,
1183,
1184,
1185,
1186,
1187,
1188,
1189,
1190,
1191,
1192,
1193,
1194,
1195,
1196,
1197,
1198,
1199,
1200,
1201,
1202,
1203,
1204,
1205,
1206,
1207,
1208,
1209,
1210,
1211,
1212,
1213,
1214,
1215,
1216,
1217,
1218,
1219,
1220,
1221,
1222,
1223,
1224,
1225,
1226,
1227,
1228,
1229,
1230,
1231,
1232,
1233,
1234,
1235,
1236,
1237,
1238,
1239,
1240,
1241,
1242,
1243,
1244,
1245,
1246,
1247,
1248,
1249,
1250,
1251,
1252,
1253,
1254,
1255,
1256,
1257,
1258,
1259,
1260,
1261,
1262,
1263,
1264,
1265,
1266,
1267,
1268,
1269,
1270,
1271,
1272,
1273,
1274,
1275,
1276
],
"start": 39751,
"length": 6525,
"ending_column": 21,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 47,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
}
},
"signature": "withdraw(uint256,uint256)"
}
},
{
"name": "updatePool(_pid)",
"type": "node",
"source_mapping": {
"lines": [
1259
],
"start": 45507,
"length": 16,
"ending_column": 61,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 45,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"additional_fields": {
"underlying_type": "external_calls"
},
"type_specific_fields": {
"parent": {
"name": "withdraw",
"type": "function",
"source_mapping": {
"lines": [
1255,
1256,
1257,
1258,
1259,
1260,
1261,
1262,
1263,
1264,
1265,
1266,
1267,
1268,
1269
],
"start": 45248,
"length": 726,
"ending_column": 15,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 13,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "Pool",
"type": "contract",
"source_mapping": {
"lines": [
1095,
1096,
1097,
1098,
1099,
1100,
1101,
1102,
1103,
1104,
1105,
1106,
1107,
1108,
1109,
1110,
1111,
1112,
1113,
1114,
1115,
1116,
1117,
1118,
1119,
1120,
1121,
1122,
1123,
1124,
1125,
1126,
1127,
1128,
1129,
1130,
1131,
1132,
1133,
1134,
1135,
1136,
1137,
1138,
1139,
1140,
1141,
1142,
1143,
1144,
1145,
1146,
1147,
1148,
1149,
1150,
1151,
1152,
1153,
1154,
1155,
1156,
1157,
1158,
1159,
1160,
1161,
1162,
1163,
1164,
1165,
1166,
1167,
1168,
1169,
1170,
1171,
1172,
1173,
1174,
1175,
1176,
1177,
1178,
1179,
1180,
1181,
1182,
1183,
1184,
1185,
1186,
1187,
1188,
1189,
1190,
1191,
1192,
1193,
1194,
1195,
1196,
1197,
1198,
1199,
1200,
1201,
1202,
1203,
1204,
1205,
1206,
1207,
1208,
1209,
1210,
1211,
1212,
1213,
1214,
1215,
1216,
1217,
1218,
1219,
1220,
1221,
1222,
1223,
1224,
1225,
1226,
1227,
1228,
1229,
1230,
1231,
1232,
1233,
1234,
1235,
1236,
1237,
1238,
1239,
1240,
1241,
1242,
1243,
1244,
1245,
1246,
1247,
1248,
1249,
1250,
1251,
1252,
1253,
1254,
1255,
1256,
1257,
1258,
1259,
1260,
1261,
1262,
1263,
1264,
1265,
1266,
1267,
1268,
1269,
1270,
1271,
1272,
1273,
1274,
1275,
1276
],
"start": 39751,
"length": 6525,
"ending_column": 21,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 47,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
}
},
"signature": "withdraw(uint256,uint256)"
}
}
}
},
{
"name": "rewardToken.mint(address(this),reward)",
"type": "node",
"source_mapping": {
"lines": [
1216,
1217
],
"start": 43694,
"length": 39,
"ending_column": 13,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 53,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"additional_fields": {
"underlying_type": "external_calls_sending_eth"
},
"type_specific_fields": {
"parent": {
"name": "updatePool",
"type": "function",
"source_mapping": {
"lines": [
1207,
1208,
1209,
1210,
1211,
1212,
1213,
1214,
1215,
1216,
1217,
1218,
1219,
1220,
1221
],
"start": 43268,
"length": 612,
"ending_column": 22,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 9,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "Pool",
"type": "contract",
"source_mapping": {
"lines": [
1095,
1096,
1097,
1098,
1099,
1100,
1101,
1102,
1103,
1104,
1105,
1106,
1107,
1108,
1109,
1110,
1111,
1112,
1113,
1114,
1115,
1116,
1117,
1118,
1119,
1120,
1121,
1122,
1123,
1124,
1125,
1126,
1127,
1128,
1129,
1130,
1131,
1132,
1133,
1134,
1135,
1136,
1137,
1138,
1139,
1140,
1141,
1142,
1143,
1144,
1145,
1146,
1147,
1148,
1149,
1150,
1151,
1152,
1153,
1154,
1155,
1156,
1157,
1158,
1159,
1160,
1161,
1162,
1163,
1164,
1165,
1166,
1167,
1168,
1169,
1170,
1171,
1172,
1173,
1174,
1175,
1176,
1177,
1178,
1179,
1180,
1181,
1182,
1183,
1184,
1185,
1186,
1187,
1188,
1189,
1190,
1191,
1192,
1193,
1194,
1195,
1196,
1197,
1198,
1199,
1200,
1201,
1202,
1203,
1204,
1205,
1206,
1207,
1208,
1209,
1210,
1211,
1212,
1213,
1214,
1215,
1216,
1217,
1218,
1219,
1220,
1221,
1222,
1223,
1224,
1225,
1226,
1227,
1228,
1229,
1230,
1231,
1232,
1233,
1234,
1235,
1236,
1237,
1238,
1239,
1240,
1241,
1242,
1243,
1244,
1245,
1246,
1247,
1248,
1249,
1250,
1251,
1252,
1253,
1254,
1255,
1256,
1257,
1258,
1259,
1260,
1261,
1262,
1263,
1264,
1265,
1266,
1267,
1268,
1269,
1270,
1271,
1272,
1273,
1274,
1275,
1276
],
"start": 39751,
"length": 6525,
"ending_column": 21,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 47,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
}
},
"signature": "updatePool(uint256)"
}
}
}
},
{
"name": "safeRewardTransfer(msg.sender,pendingReward)",
"type": "node",
"source_mapping": {
"lines": [
1261,
1262,
1263
],
"start": 45674,
"length": 45,
"ending_column": 34,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 90,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"additional_fields": {
"underlying_type": "external_calls"
},
"type_specific_fields": {
"parent": {
"name": "withdraw",
"type": "function",
"source_mapping": {
"lines": [
1255,
1256,
1257,
1258,
1259,
1260,
1261,
1262,
1263,
1264,
1265,
1266,
1267,
1268,
1269
],
"start": 45248,
"length": 726,
"ending_column": 15,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 13,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "Pool",
"type": "contract",
"source_mapping": {
"lines": [
1095,
1096,
1097,
1098,
1099,
1100,
1101,
1102,
1103,
1104,
1105,
1106,
1107,
1108,
1109,
1110,
1111,
1112,
1113,
1114,
1115,
1116,
1117,
1118,
1119,
1120,
1121,
1122,
1123,
1124,
1125,
1126,
1127,
1128,
1129,
1130,
1131,
1132,
1133,
1134,
1135,
1136,
1137,
1138,
1139,
1140,
1141,
1142,
1143,
1144,
1145,
1146,
1147,
1148,
1149,
1150,
1151,
1152,
1153,
1154,
1155,
1156,
1157,
1158,
1159,
1160,
1161,
1162,
1163,
1164,
1165,
1166,
1167,
1168,
1169,
1170,
1171,
1172,
1173,
1174,
1175,
1176,
1177,
1178,
1179,
1180,
1181,
1182,
1183,
1184,
1185,
1186,
1187,
1188,
1189,
1190,
1191,
1192,
1193,
1194,
1195,
1196,
1197,
1198,
1199,
1200,
1201,
1202,
1203,
1204,
1205,
1206,
1207,
1208,
1209,
1210,
1211,
1212,
1213,
1214,
1215,
1216,
1217,
1218,
1219,
1220,
1221,
1222,
1223,
1224,
1225,
1226,
1227,
1228,
1229,
1230,
1231,
1232,
1233,
1234,
1235,
1236,
1237,
1238,
1239,
1240,
1241,
1242,
1243,
1244,
1245,
1246,
1247,
1248,
1249,
1250,
1251,
1252,
1253,
1254,
1255,
1256,
1257,
1258,
1259,
1260,
1261,
1262,
1263,
1264,
1265,
1266,
1267,
1268,
1269,
1270,
1271,
1272,
1273,
1274,
1275,
1276
],
"start": 39751,
"length": 6525,
"ending_column": 21,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 47,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
}
},
"signature": "withdraw(uint256,uint256)"
}
}
}
},
{
"name": "rewardToken.transfer(_to,balance)",
"type": "node",
"source_mapping": {
"lines": [
1272,
1273
],
"start": 46158,
"length": 34,
"ending_column": 27,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 31,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"additional_fields": {
"underlying_type": "external_calls_sending_eth"
},
"type_specific_fields": {
"parent": {
"name": "safeRewardTransfer",
"type": "function",
"source_mapping": {
"lines": [
1269,
1270,
1271,
1272,
1273,
1274,
1275,
1276
],
"start": 45980,
"length": 294,
"ending_column": 19,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 21,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "Pool",
"type": "contract",
"source_mapping": {
"lines": [
1095,
1096,
1097,
1098,
1099,
1100,
1101,
1102,
1103,
1104,
1105,
1106,
1107,
1108,
1109,
1110,
1111,
1112,
1113,
1114,
1115,
1116,
1117,
1118,
1119,
1120,
1121,
1122,
1123,
1124,
1125,
1126,
1127,
1128,
1129,
1130,
1131,
1132,
1133,
1134,
1135,
1136,
1137,
1138,
1139,
1140,
1141,
1142,
1143,
1144,
1145,
1146,
1147,
1148,
1149,
1150,
1151,
1152,
1153,
1154,
1155,
1156,
1157,
1158,
1159,
1160,
1161,
1162,
1163,
1164,
1165,
1166,
1167,
1168,
1169,
1170,
1171,
1172,
1173,
1174,
1175,
1176,
1177,
1178,
1179,
1180,
1181,
1182,
1183,
1184,
1185,
1186,
1187,
1188,
1189,
1190,
1191,
1192,
1193,
1194,
1195,
1196,
1197,
1198,
1199,
1200,
1201,
1202,
1203,
1204,
1205,
1206,
1207,
1208,
1209,
1210,
1211,
1212,
1213,
1214,
1215,
1216,
1217,
1218,
1219,
1220,
1221,
1222,
1223,
1224,
1225,
1226,
1227,
1228,
1229,
1230,
1231,
1232,
1233,
1234,
1235,
1236,
1237,
1238,
1239,
1240,
1241,
1242,
1243,
1244,
1245,
1246,
1247,
1248,
1249,
1250,
1251,
1252,
1253,
1254,
1255,
1256,
1257,
1258,
1259,
1260,
1261,
1262,
1263,
1264,
1265,
1266,
1267,
1268,
1269,
1270,
1271,
1272,
1273,
1274,
1275,
1276
],
"start": 39751,
"length": 6525,
"ending_column": 21,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 47,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
}
},
"signature": "safeRewardTransfer(address,uint256)"
}
}
}
}
],
"locations": [
{
"file": "contracts/Contract.sol",
"name": "withdraw",
"type": "function",
"lines": [
1255,
1256,
1257,
1258,
1259,
1260,
1261,
1262,
1263,
1264,
1265,
1266,
1267,
1268,
1269
]
},
{
"file": "contracts/Contract.sol",
"name": "updatePool(_pid)",
"type": "node",
"lines": [
1259
]
},
{
"file": "contracts/Contract.sol",
"name": "rewardToken.mint(address(this),reward)",
"type": "node",
"lines": [
1216,
1217
]
},
{
"file": "contracts/Contract.sol",
"name": "safeRewardTransfer(msg.sender,pendingReward)",
"type": "node",
"lines": [
1261,
1262,
1263
]
},
{
"file": "contracts/Contract.sol",
"name": "rewardToken.transfer(_to,balance)",
"type": "node",
"lines": [
1272,
1273
]
},
{
"file": "contracts/Contract.sol",
"name": "rewardToken.transfer(_to,_amount)",
"type": "node",
"lines": [
1273,
1274,
1275,
1276
]
},
{
"file": "contracts/Contract.sol",
"name": "user.amount = user.amount.sub(_amount)",
"type": "node",
"lines": [
1263,
1264,
1265
]
},
{
"file": "contracts/Contract.sol",
"name": "user.rewardDebt = user.amount.mul(pool.accRewardPerShare).div(1e12)",
"type": "node",
"lines": [
1266
]
}
],
"description": "Reentrancy in Pool.withdraw(uint256,uint256) (contracts/Contract.sol#1255-1269):\n\tExternal calls:\n\t- updatePool(_pid) (contracts/Contract.sol#1259)\n\t\t- rewardToken.mint(address(this),reward) (contracts/Contract.sol#1216-1217)\n\t- safeRewardTransfer(msg.sender,pendingReward) (contracts/Contract.sol#1261-1263)\n\t\t- rewardToken.transfer(_to,balance) (contracts/Contract.sol#1272-1273)\n\t\t- rewardToken.transfer(_to,_amount) (contracts/Contract.sol#1273-1276)\n\tState variables written after the call(s):\n\t- user.amount = user.amount.sub(_amount) (contracts/Contract.sol#1263-1265)\n\tPool.users (contracts/Contract.sol#1111) can be used in cross function reentrancies:\n\t- Pool.deposit(uint256,uint256) (contracts/Contract.sol#1237-1255)\n\t- Pool.pending(uint256,address) (contracts/Contract.sol#1221-1237)\n\t- Pool.users (contracts/Contract.sol#1111)\n\t- Pool.withdraw(uint256,uint256) (contracts/Contract.sol#1255-1269)\n\t- user.rewardDebt = user.amount.mul(pool.accRewardPerShare).div(1e12) (contracts/Contract.sol#1266)\n\tPool.users (contracts/Contract.sol#1111) can be used in cross function reentrancies:\n\t- Pool.deposit(uint256,uint256) (contracts/Contract.sol#1237-1255)\n\t- Pool.pending(uint256,address) (contracts/Contract.sol#1221-1237)\n\t- Pool.users (contracts/Contract.sol#1111)\n\t- Pool.withdraw(uint256,uint256) (contracts/Contract.sol#1255-1269)"
}
|
| medium | reentrancy | codex | Reentrancy in deposit via untrusted pool tokens can double-claim rewards | 75 | no | — |
viewevidence_json{
"evidence": "deposit pays pending rewards, then calls pool.token.safeTransferFrom before updating user.amount and user.rewardDebt.",
"locations": [
"contracts/Contract.sol:1266",
"contracts/Contract.sol:1271",
"contracts/Contract.sol:1273",
"contracts/Contract.sol:1276",
"contracts/Contract.sol:1277"
],
"recommendation": "Apply a reentrancy guard and/or move state updates (rewardDebt/amount) before external calls. Alternatively restrict pools to non-callback ERC20 tokens.",
"exploit_scenario": "If a pool token is ERC777 or otherwise invokes callbacks on transferFrom, a malicious user contract can reenter deposit during pool.token.safeTransferFrom. Because rewardDebt and amount are only updated after the external call, the reentrant deposit can claim the same pending rewards multiple times, draining rewardToken."
}
|
| medium | reentrancy | slither | Reentrancy in Pool.deposit(uint256,uint256) (contracts/Contract.sol#1237-1255): | 75 | no | — |
viewevidence_json{
"impact": "Medium",
"detector": "reentrancy-no-eth",
"elements": [
{
"name": "deposit",
"type": "function",
"source_mapping": {
"lines": [
1237,
1238,
1239,
1240,
1241,
1242,
1243,
1244,
1245,
1246,
1247,
1248,
1249,
1250,
1251,
1252,
1253,
1254,
1255
],
"start": 44517,
"length": 725,
"ending_column": 7,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 18,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "Pool",
"type": "contract",
"source_mapping": {
"lines": [
1095,
1096,
1097,
1098,
1099,
1100,
1101,
1102,
1103,
1104,
1105,
1106,
1107,
1108,
1109,
1110,
1111,
1112,
1113,
1114,
1115,
1116,
1117,
1118,
1119,
1120,
1121,
1122,
1123,
1124,
1125,
1126,
1127,
1128,
1129,
1130,
1131,
1132,
1133,
1134,
1135,
1136,
1137,
1138,
1139,
1140,
1141,
1142,
1143,
1144,
1145,
1146,
1147,
1148,
1149,
1150,
1151,
1152,
1153,
1154,
1155,
1156,
1157,
1158,
1159,
1160,
1161,
1162,
1163,
1164,
1165,
1166,
1167,
1168,
1169,
1170,
1171,
1172,
1173,
1174,
1175,
1176,
1177,
1178,
1179,
1180,
1181,
1182,
1183,
1184,
1185,
1186,
1187,
1188,
1189,
1190,
1191,
1192,
1193,
1194,
1195,
1196,
1197,
1198,
1199,
1200,
1201,
1202,
1203,
1204,
1205,
1206,
1207,
1208,
1209,
1210,
1211,
1212,
1213,
1214,
1215,
1216,
1217,
1218,
1219,
1220,
1221,
1222,
1223,
1224,
1225,
1226,
1227,
1228,
1229,
1230,
1231,
1232,
1233,
1234,
1235,
1236,
1237,
1238,
1239,
1240,
1241,
1242,
1243,
1244,
1245,
1246,
1247,
1248,
1249,
1250,
1251,
1252,
1253,
1254,
1255,
1256,
1257,
1258,
1259,
1260,
1261,
1262,
1263,
1264,
1265,
1266,
1267,
1268,
1269,
1270,
1271,
1272,
1273,
1274,
1275,
1276
],
"start": 39751,
"length": 6525,
"ending_column": 21,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 47,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
}
},
"signature": "deposit(uint256,uint256)"
}
},
{
"name": "updatePool(_pid)",
"type": "node",
"source_mapping": {
"lines": [
1242
],
"start": 44700,
"length": 16,
"ending_column": 22,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 6,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"additional_fields": {
"underlying_type": "external_calls"
},
"type_specific_fields": {
"parent": {
"name": "deposit",
"type": "function",
"source_mapping": {
"lines": [
1237,
1238,
1239,
1240,
1241,
1242,
1243,
1244,
1245,
1246,
1247,
1248,
1249,
1250,
1251,
1252,
1253,
1254,
1255
],
"start": 44517,
"length": 725,
"ending_column": 7,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 18,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "Pool",
"type": "contract",
"source_mapping": {
"lines": [
1095,
1096,
1097,
1098,
1099,
1100,
1101,
1102,
1103,
1104,
1105,
1106,
1107,
1108,
1109,
1110,
1111,
1112,
1113,
1114,
1115,
1116,
1117,
1118,
1119,
1120,
1121,
1122,
1123,
1124,
1125,
1126,
1127,
1128,
1129,
1130,
1131,
1132,
1133,
1134,
1135,
1136,
1137,
1138,
1139,
1140,
1141,
1142,
1143,
1144,
1145,
1146,
1147,
1148,
1149,
1150,
1151,
1152,
1153,
1154,
1155,
1156,
1157,
1158,
1159,
1160,
1161,
1162,
1163,
1164,
1165,
1166,
1167,
1168,
1169,
1170,
1171,
1172,
1173,
1174,
1175,
1176,
1177,
1178,
1179,
1180,
1181,
1182,
1183,
1184,
1185,
1186,
1187,
1188,
1189,
1190,
1191,
1192,
1193,
1194,
1195,
1196,
1197,
1198,
1199,
1200,
1201,
1202,
1203,
1204,
1205,
1206,
1207,
1208,
1209,
1210,
1211,
1212,
1213,
1214,
1215,
1216,
1217,
1218,
1219,
1220,
1221,
1222,
1223,
1224,
1225,
1226,
1227,
1228,
1229,
1230,
1231,
1232,
1233,
1234,
1235,
1236,
1237,
1238,
1239,
1240,
1241,
1242,
1243,
1244,
1245,
1246,
1247,
1248,
1249,
1250,
1251,
1252,
1253,
1254,
1255,
1256,
1257,
1258,
1259,
1260,
1261,
1262,
1263,
1264,
1265,
1266,
1267,
1268,
1269,
1270,
1271,
1272,
1273,
1274,
1275,
1276
],
"start": 39751,
"length": 6525,
"ending_column": 21,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 47,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
}
},
"signature": "deposit(uint256,uint256)"
}
}
}
},
{
"name": "rewardToken.mint(address(this),reward)",
"type": "node",
"source_mapping": {
"lines": [
1216,
1217
],
"start": 43694,
"length": 39,
"ending_column": 13,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 53,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"additional_fields": {
"underlying_type": "external_calls_sending_eth"
},
"type_specific_fields": {
"parent": {
"name": "updatePool",
"type": "function",
"source_mapping": {
"lines": [
1207,
1208,
1209,
1210,
1211,
1212,
1213,
1214,
1215,
1216,
1217,
1218,
1219,
1220,
1221
],
"start": 43268,
"length": 612,
"ending_column": 22,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 9,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "Pool",
"type": "contract",
"source_mapping": {
"lines": [
1095,
1096,
1097,
1098,
1099,
1100,
1101,
1102,
1103,
1104,
1105,
1106,
1107,
1108,
1109,
1110,
1111,
1112,
1113,
1114,
1115,
1116,
1117,
1118,
1119,
1120,
1121,
1122,
1123,
1124,
1125,
1126,
1127,
1128,
1129,
1130,
1131,
1132,
1133,
1134,
1135,
1136,
1137,
1138,
1139,
1140,
1141,
1142,
1143,
1144,
1145,
1146,
1147,
1148,
1149,
1150,
1151,
1152,
1153,
1154,
1155,
1156,
1157,
1158,
1159,
1160,
1161,
1162,
1163,
1164,
1165,
1166,
1167,
1168,
1169,
1170,
1171,
1172,
1173,
1174,
1175,
1176,
1177,
1178,
1179,
1180,
1181,
1182,
1183,
1184,
1185,
1186,
1187,
1188,
1189,
1190,
1191,
1192,
1193,
1194,
1195,
1196,
1197,
1198,
1199,
1200,
1201,
1202,
1203,
1204,
1205,
1206,
1207,
1208,
1209,
1210,
1211,
1212,
1213,
1214,
1215,
1216,
1217,
1218,
1219,
1220,
1221,
1222,
1223,
1224,
1225,
1226,
1227,
1228,
1229,
1230,
1231,
1232,
1233,
1234,
1235,
1236,
1237,
1238,
1239,
1240,
1241,
1242,
1243,
1244,
1245,
1246,
1247,
1248,
1249,
1250,
1251,
1252,
1253,
1254,
1255,
1256,
1257,
1258,
1259,
1260,
1261,
1262,
1263,
1264,
1265,
1266,
1267,
1268,
1269,
1270,
1271,
1272,
1273,
1274,
1275,
1276
],
"start": 39751,
"length": 6525,
"ending_column": 21,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 47,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
}
},
"signature": "updatePool(uint256)"
}
}
}
},
{
"name": "safeRewardTransfer(msg.sender,pendingReward)",
"type": "node",
"source_mapping": {
"lines": [
1248,
1249
],
"start": 44910,
"length": 45,
"ending_column": 22,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 25,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"additional_fields": {
"underlying_type": "external_calls"
},
"type_specific_fields": {
"parent": {
"name": "deposit",
"type": "function",
"source_mapping": {
"lines": [
1237,
1238,
1239,
1240,
1241,
1242,
1243,
1244,
1245,
1246,
1247,
1248,
1249,
1250,
1251,
1252,
1253,
1254,
1255
],
"start": 44517,
"length": 725,
"ending_column": 7,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 18,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "Pool",
"type": "contract",
"source_mapping": {
"lines": [
1095,
1096,
1097,
1098,
1099,
1100,
1101,
1102,
1103,
1104,
1105,
1106,
1107,
1108,
1109,
1110,
1111,
1112,
1113,
1114,
1115,
1116,
1117,
1118,
1119,
1120,
1121,
1122,
1123,
1124,
1125,
1126,
1127,
1128,
1129,
1130,
1131,
1132,
1133,
1134,
1135,
1136,
1137,
1138,
1139,
1140,
1141,
1142,
1143,
1144,
1145,
1146,
1147,
1148,
1149,
1150,
1151,
1152,
1153,
1154,
1155,
1156,
1157,
1158,
1159,
1160,
1161,
1162,
1163,
1164,
1165,
1166,
1167,
1168,
1169,
1170,
1171,
1172,
1173,
1174,
1175,
1176,
1177,
1178,
1179,
1180,
1181,
1182,
1183,
1184,
1185,
1186,
1187,
1188,
1189,
1190,
1191,
1192,
1193,
1194,
1195,
1196,
1197,
1198,
1199,
1200,
1201,
1202,
1203,
1204,
1205,
1206,
1207,
1208,
1209,
1210,
1211,
1212,
1213,
1214,
1215,
1216,
1217,
1218,
1219,
1220,
1221,
1222,
1223,
1224,
1225,
1226,
1227,
1228,
1229,
1230,
1231,
1232,
1233,
1234,
1235,
1236,
1237,
1238,
1239,
1240,
1241,
1242,
1243,
1244,
1245,
1246,
1247,
1248,
1249,
1250,
1251,
1252,
1253,
1254,
1255,
1256,
1257,
1258,
1259,
1260,
1261,
1262,
1263,
1264,
1265,
1266,
1267,
1268,
1269,
1270,
1271,
1272,
1273,
1274,
1275,
1276
],
"start": 39751,
"length": 6525,
"ending_column": 21,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 47,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
}
},
"signature": "deposit(uint256,uint256)"
}
}
}
},
{
"name": "rewardToken.transfer(_to,balance)",
"type": "node",
"source_mapping": {
"lines": [
1272,
1273
],
"start": 46158,
"length": 34,
"ending_column": 27,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 31,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"additional_fields": {
"underlying_type": "external_calls_sending_eth"
},
"type_specific_fields": {
"parent": {
"name": "safeRewardTransfer",
"type": "function",
"source_mapping": {
"lines": [
1269,
1270,
1271,
1272,
1273,
1274,
1275,
1276
],
"start": 45980,
"length": 294,
"ending_column": 19,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 21,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "Pool",
"type": "contract",
"source_mapping": {
"lines": [
1095,
1096,
1097,
1098,
1099,
1100,
1101,
1102,
1103,
1104,
1105,
1106,
1107,
1108,
1109,
1110,
1111,
1112,
1113,
1114,
1115,
1116,
1117,
1118,
1119,
1120,
1121,
1122,
1123,
1124,
1125,
1126,
1127,
1128,
1129,
1130,
1131,
1132,
1133,
1134,
1135,
1136,
1137,
1138,
1139,
1140,
1141,
1142,
1143,
1144,
1145,
1146,
1147,
1148,
1149,
1150,
1151,
1152,
1153,
1154,
1155,
1156,
1157,
1158,
1159,
1160,
1161,
1162,
1163,
1164,
1165,
1166,
1167,
1168,
1169,
1170,
1171,
1172,
1173,
1174,
1175,
1176,
1177,
1178,
1179,
1180,
1181,
1182,
1183,
1184,
1185,
1186,
1187,
1188,
1189,
1190,
1191,
1192,
1193,
1194,
1195,
1196,
1197,
1198,
1199,
1200,
1201,
1202,
1203,
1204,
1205,
1206,
1207,
1208,
1209,
1210,
1211,
1212,
1213,
1214,
1215,
1216,
1217,
1218,
1219,
1220,
1221,
1222,
1223,
1224,
1225,
1226,
1227,
1228,
1229,
1230,
1231,
1232,
1233,
1234,
1235,
1236,
1237,
1238,
1239,
1240,
1241,
1242,
1243,
1244,
1245,
1246,
1247,
1248,
1249,
1250,
1251,
1252,
1253,
1254,
1255,
1256,
1257,
1258,
1259,
1260,
1261,
1262,
1263,
1264,
1265,
1266,
1267,
1268,
1269,
1270,
1271,
1272,
1273,
1274,
1275,
1276
],
"start": 39751,
"length": 6525,
"ending_column": 21,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 47,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
}
},
"signature": "safeRewardTransfer(address,uint256)"
}
}
}
}
],
"locations": [
{
"file": "contracts/Contract.sol",
"name": "deposit",
"type": "function",
"lines": [
1237,
1238,
1239,
1240,
1241,
1242,
1243,
1244,
1245,
1246,
1247,
1248,
1249,
1250,
1251,
1252,
1253,
1254,
1255
]
},
{
"file": "contracts/Contract.sol",
"name": "updatePool(_pid)",
"type": "node",
"lines": [
1242
]
},
{
"file": "contracts/Contract.sol",
"name": "rewardToken.mint(address(this),reward)",
"type": "node",
"lines": [
1216,
1217
]
},
{
"file": "contracts/Contract.sol",
"name": "safeRewardTransfer(msg.sender,pendingReward)",
"type": "node",
"lines": [
1248,
1249
]
},
{
"file": "contracts/Contract.sol",
"name": "rewardToken.transfer(_to,balance)",
"type": "node",
"lines": [
1272,
1273
]
},
{
"file": "contracts/Contract.sol",
"name": "rewardToken.transfer(_to,_amount)",
"type": "node",
"lines": [
1273,
1274,
1275,
1276
]
},
{
"file": "contracts/Contract.sol",
"name": "pool.token.safeTransferFrom(address(msg.sender),address(this),_amount)",
"type": "node",
"lines": [
1250
]
},
{
"file": "contracts/Contract.sol",
"name": "user.amount = user.amount.add(_amount)",
"type": "node",
"lines": [
1250,
1251
]
},
{
"file": "contracts/Contract.sol",
"name": "user.rewardDebt = user.amount.mul(pool.accRewardPerShare).div(1e12)",
"type": "node",
"lines": [
1251,
1252,
1253,
1254
]
}
],
"description": "Reentrancy in Pool.deposit(uint256,uint256) (contracts/Contract.sol#1237-1255):\n\tExternal calls:\n\t- updatePool(_pid) (contracts/Contract.sol#1242)\n\t\t- rewardToken.mint(address(this),reward) (contracts/Contract.sol#1216-1217)\n\t- safeRewardTransfer(msg.sender,pendingReward) (contracts/Contract.sol#1248-1249)\n\t\t- rewardToken.transfer(_to,balance) (contracts/Contract.sol#1272-1273)\n\t\t- rewardToken.transfer(_to,_amount) (contracts/Contract.sol#1273-1276)\n\t- pool.token.safeTransferFrom(address(msg.sender),address(this),_amount) (contracts/Contract.sol#1250)\n\tState variables written after the call(s):\n\t- user.amount = user.amount.add(_amount) (contracts/Contract.sol#1250-1251)\n\tPool.users (contracts/Contract.sol#1111) can be used in cross function reentrancies:\n\t- Pool.deposit(uint256,uint256) (contracts/Contract.sol#1237-1255)\n\t- Pool.pending(uint256,address) (contracts/Contract.sol#1221-1237)\n\t- Pool.users (contracts/Contract.sol#1111)\n\t- Pool.withdraw(uint256,uint256) (contracts/Contract.sol#1255-1269)\n\t- user.rewardDebt = user.amount.mul(pool.accRewardPerShare).div(1e12) (contracts/Contract.sol#1251-1254)\n\tPool.users (contracts/Contract.sol#1111) can be used in cross function reentrancies:\n\t- Pool.deposit(uint256,uint256) (contracts/Contract.sol#1237-1255)\n\t- Pool.pending(uint256,address) (contracts/Contract.sol#1221-1237)\n\t- Pool.users (contracts/Contract.sol#1111)\n\t- Pool.withdraw(uint256,uint256) (contracts/Contract.sol#1255-1269)"
}
|
| medium | reentrancy | slither | Reentrancy in Pool.updatePool(uint256) (contracts/Contract.sol#1207-1221): | 75 | no | — |
viewevidence_json{
"impact": "Medium",
"detector": "reentrancy-no-eth",
"elements": [
{
"name": "updatePool",
"type": "function",
"source_mapping": {
"lines": [
1207,
1208,
1209,
1210,
1211,
1212,
1213,
1214,
1215,
1216,
1217,
1218,
1219,
1220,
1221
],
"start": 43268,
"length": 612,
"ending_column": 22,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 9,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "Pool",
"type": "contract",
"source_mapping": {
"lines": [
1095,
1096,
1097,
1098,
1099,
1100,
1101,
1102,
1103,
1104,
1105,
1106,
1107,
1108,
1109,
1110,
1111,
1112,
1113,
1114,
1115,
1116,
1117,
1118,
1119,
1120,
1121,
1122,
1123,
1124,
1125,
1126,
1127,
1128,
1129,
1130,
1131,
1132,
1133,
1134,
1135,
1136,
1137,
1138,
1139,
1140,
1141,
1142,
1143,
1144,
1145,
1146,
1147,
1148,
1149,
1150,
1151,
1152,
1153,
1154,
1155,
1156,
1157,
1158,
1159,
1160,
1161,
1162,
1163,
1164,
1165,
1166,
1167,
1168,
1169,
1170,
1171,
1172,
1173,
1174,
1175,
1176,
1177,
1178,
1179,
1180,
1181,
1182,
1183,
1184,
1185,
1186,
1187,
1188,
1189,
1190,
1191,
1192,
1193,
1194,
1195,
1196,
1197,
1198,
1199,
1200,
1201,
1202,
1203,
1204,
1205,
1206,
1207,
1208,
1209,
1210,
1211,
1212,
1213,
1214,
1215,
1216,
1217,
1218,
1219,
1220,
1221,
1222,
1223,
1224,
1225,
1226,
1227,
1228,
1229,
1230,
1231,
1232,
1233,
1234,
1235,
1236,
1237,
1238,
1239,
1240,
1241,
1242,
1243,
1244,
1245,
1246,
1247,
1248,
1249,
1250,
1251,
1252,
1253,
1254,
1255,
1256,
1257,
1258,
1259,
1260,
1261,
1262,
1263,
1264,
1265,
1266,
1267,
1268,
1269,
1270,
1271,
1272,
1273,
1274,
1275,
1276
],
"start": 39751,
"length": 6525,
"ending_column": 21,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 47,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
}
},
"signature": "updatePool(uint256)"
}
},
{
"name": "rewardToken.mint(address(this),reward)",
"type": "node",
"source_mapping": {
"lines": [
1216,
1217
],
"start": 43694,
"length": 39,
"ending_column": 13,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 53,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"additional_fields": {
"underlying_type": "external_calls"
},
"type_specific_fields": {
"parent": {
"name": "updatePool",
"type": "function",
"source_mapping": {
"lines": [
1207,
1208,
1209,
1210,
1211,
1212,
1213,
1214,
1215,
1216,
1217,
1218,
1219,
1220,
1221
],
"start": 43268,
"length": 612,
"ending_column": 22,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 9,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "Pool",
"type": "contract",
"source_mapping": {
"lines": [
1095,
1096,
1097,
1098,
1099,
1100,
1101,
1102,
1103,
1104,
1105,
1106,
1107,
1108,
1109,
1110,
1111,
1112,
1113,
1114,
1115,
1116,
1117,
1118,
1119,
1120,
1121,
1122,
1123,
1124,
1125,
1126,
1127,
1128,
1129,
1130,
1131,
1132,
1133,
1134,
1135,
1136,
1137,
1138,
1139,
1140,
1141,
1142,
1143,
1144,
1145,
1146,
1147,
1148,
1149,
1150,
1151,
1152,
1153,
1154,
1155,
1156,
1157,
1158,
1159,
1160,
1161,
1162,
1163,
1164,
1165,
1166,
1167,
1168,
1169,
1170,
1171,
1172,
1173,
1174,
1175,
1176,
1177,
1178,
1179,
1180,
1181,
1182,
1183,
1184,
1185,
1186,
1187,
1188,
1189,
1190,
1191,
1192,
1193,
1194,
1195,
1196,
1197,
1198,
1199,
1200,
1201,
1202,
1203,
1204,
1205,
1206,
1207,
1208,
1209,
1210,
1211,
1212,
1213,
1214,
1215,
1216,
1217,
1218,
1219,
1220,
1221,
1222,
1223,
1224,
1225,
1226,
1227,
1228,
1229,
1230,
1231,
1232,
1233,
1234,
1235,
1236,
1237,
1238,
1239,
1240,
1241,
1242,
1243,
1244,
1245,
1246,
1247,
1248,
1249,
1250,
1251,
1252,
1253,
1254,
1255,
1256,
1257,
1258,
1259,
1260,
1261,
1262,
1263,
1264,
1265,
1266,
1267,
1268,
1269,
1270,
1271,
1272,
1273,
1274,
1275,
1276
],
"start": 39751,
"length": 6525,
"ending_column": 21,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 47,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
}
},
"signature": "updatePool(uint256)"
}
}
}
},
{
"name": "pool.accRewardPerShare = pool.accRewardPerShare.add(reward.mul(1e12).div(totalStake))",
"type": "node",
"source_mapping": {
"lines": [
1217,
1218,
1219,
1220
],
"start": 43743,
"length": 85,
"ending_column": 15,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 23,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"additional_fields": {
"variable_name": "pools",
"underlying_type": "variables_written"
},
"type_specific_fields": {
"parent": {
"name": "updatePool",
"type": "function",
"source_mapping": {
"lines": [
1207,
1208,
1209,
1210,
1211,
1212,
1213,
1214,
1215,
1216,
1217,
1218,
1219,
1220,
1221
],
"start": 43268,
"length": 612,
"ending_column": 22,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 9,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "Pool",
"type": "contract",
"source_mapping": {
"lines": [
1095,
1096,
1097,
1098,
1099,
1100,
1101,
1102,
1103,
1104,
1105,
1106,
1107,
1108,
1109,
1110,
1111,
1112,
1113,
1114,
1115,
1116,
1117,
1118,
1119,
1120,
1121,
1122,
1123,
1124,
1125,
1126,
1127,
1128,
1129,
1130,
1131,
1132,
1133,
1134,
1135,
1136,
1137,
1138,
1139,
1140,
1141,
1142,
1143,
1144,
1145,
1146,
1147,
1148,
1149,
1150,
1151,
1152,
1153,
1154,
1155,
1156,
1157,
1158,
1159,
1160,
1161,
1162,
1163,
1164,
1165,
1166,
1167,
1168,
1169,
1170,
1171,
1172,
1173,
1174,
1175,
1176,
1177,
1178,
1179,
1180,
1181,
1182,
1183,
1184,
1185,
1186,
1187,
1188,
1189,
1190,
1191,
1192,
1193,
1194,
1195,
1196,
1197,
1198,
1199,
1200,
1201,
1202,
1203,
1204,
1205,
1206,
1207,
1208,
1209,
1210,
1211,
1212,
1213,
1214,
1215,
1216,
1217,
1218,
1219,
1220,
1221,
1222,
1223,
1224,
1225,
1226,
1227,
1228,
1229,
1230,
1231,
1232,
1233,
1234,
1235,
1236,
1237,
1238,
1239,
1240,
1241,
1242,
1243,
1244,
1245,
1246,
1247,
1248,
1249,
1250,
1251,
1252,
1253,
1254,
1255,
1256,
1257,
1258,
1259,
1260,
1261,
1262,
1263,
1264,
1265,
1266,
1267,
1268,
1269,
1270,
1271,
1272,
1273,
1274,
1275,
1276
],
"start": 39751,
"length": 6525,
"ending_column": 21,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 47,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
}
},
"signature": "updatePool(uint256)"
}
}
}
},
{
"name": "pool.lastRewardBlock = block.number",
"type": "node",
"source_mapping": {
"lines": [
1220,
1221
],
"start": 43838,
"length": 35,
"ending_column": 15,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 25,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"additional_fields": {
"variable_name": "pools",
"underlying_type": "variables_written"
},
"type_specific_fields": {
"parent": {
"name": "updatePool",
"type": "function",
"source_mapping": {
"lines": [
1207,
1208,
1209,
1210,
1211,
1212,
1213,
1214,
1215,
1216,
1217,
1218,
1219,
1220,
1221
],
"start": 43268,
"length": 612,
"ending_column": 22,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 9,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "Pool",
"type": "contract",
"source_mapping": {
"lines": [
1095,
1096,
1097,
1098,
1099,
1100,
1101,
1102,
1103,
1104,
1105,
1106,
1107,
1108,
1109,
1110,
1111,
1112,
1113,
1114,
1115,
1116,
1117,
1118,
1119,
1120,
1121,
1122,
1123,
1124,
1125,
1126,
1127,
1128,
1129,
1130,
1131,
1132,
1133,
1134,
1135,
1136,
1137,
1138,
1139,
1140,
1141,
1142,
1143,
1144,
1145,
1146,
1147,
1148,
1149,
1150,
1151,
1152,
1153,
1154,
1155,
1156,
1157,
1158,
1159,
1160,
1161,
1162,
1163,
1164,
1165,
1166,
1167,
1168,
1169,
1170,
1171,
1172,
1173,
1174,
1175,
1176,
1177,
1178,
1179,
1180,
1181,
1182,
1183,
1184,
1185,
1186,
1187,
1188,
1189,
1190,
1191,
1192,
1193,
1194,
1195,
1196,
1197,
1198,
1199,
1200,
1201,
1202,
1203,
1204,
1205,
1206,
1207,
1208,
1209,
1210,
1211,
1212,
1213,
1214,
1215,
1216,
1217,
1218,
1219,
1220,
1221,
1222,
1223,
1224,
1225,
1226,
1227,
1228,
1229,
1230,
1231,
1232,
1233,
1234,
1235,
1236,
1237,
1238,
1239,
1240,
1241,
1242,
1243,
1244,
1245,
1246,
1247,
1248,
1249,
1250,
1251,
1252,
1253,
1254,
1255,
1256,
1257,
1258,
1259,
1260,
1261,
1262,
1263,
1264,
1265,
1266,
1267,
1268,
1269,
1270,
1271,
1272,
1273,
1274,
1275,
1276
],
"start": 39751,
"length": 6525,
"ending_column": 21,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 47,
"filename_absolute": "/tmp/slither-fbqpa74m/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
}
},
"signature": "updatePool(uint256)"
}
}
}
}
],
"locations": [
{
"file": "contracts/Contract.sol",
"name": "updatePool",
"type": "function",
"lines": [
1207,
1208,
1209,
1210,
1211,
1212,
1213,
1214,
1215,
1216,
1217,
1218,
1219,
1220,
1221
]
},
{
"file": "contracts/Contract.sol",
"name": "rewardToken.mint(address(this),reward)",
"type": "node",
"lines": [
1216,
1217
]
},
{
"file": "contracts/Contract.sol",
"name": "pool.accRewardPerShare = pool.accRewardPerShare.add(reward.mul(1e12).div(totalStake))",
"type": "node",
"lines": [
1217,
1218,
1219,
1220
]
},
{
"file": "contracts/Contract.sol",
"name": "pool.lastRewardBlock = block.number",
"type": "node",
"lines": [
1220,
1221
]
}
],
"description": "Reentrancy in Pool.updatePool(uint256) (contracts/Contract.sol#1207-1221):\n\tExternal calls:\n\t- rewardToken.mint(address(this),reward) (contracts/Contract.sol#1216-1217)\n\tState variables written after the call(s):\n\t- pool.accRewardPerShare = pool.accRewardPerShare.add(reward.mul(1e12).div(totalStake)) (contracts/Contract.sol#1217-1220)\n\tPool.pools (contracts/Contract.sol#1111) can be used in cross function reentrancies:\n\t- Pool.addPool(IERC20,uint256,uint256,uint256,uint256) (contracts/Contract.sol#1131-1169)\n\t- Pool.checkPool(uint256) (contracts/Contract.sol#1123-1124)\n\t- Pool.deposit(uint256,uint256) (contracts/Contract.sol#1237-1255)\n\t- Pool.pending(uint256,address) (contracts/Contract.sol#1221-1237)\n\t- Pool.poolLength() (contracts/Contract.sol#1124-1129)\n\t- Pool.pools (contracts/Contract.sol#1111)\n\t- Pool.updatePool(uint256) (contracts/Contract.sol#1207-1221)\n\t- Pool.withdraw(uint256,uint256) (contracts/Contract.sol#1255-1269)\n\t- pool.lastRewardBlock = block.number (contracts/Contract.sol#1220-1221)\n\tPool.pools (contracts/Contract.sol#1111) can be used in cross function reentrancies:\n\t- Pool.addPool(IERC20,uint256,uint256,uint256,uint256) (contracts/Contract.sol#1131-1169)\n\t- Pool.checkPool(uint256) (contracts/Contract.sol#1123-1124)\n\t- Pool.deposit(uint256,uint256) (contracts/Contract.sol#1237-1255)\n\t- Pool.pending(uint256,address) (contracts/Contract.sol#1221-1237)\n\t- Pool.poolLength() (contracts/Contract.sol#1124-1129)\n\t- Pool.pools (contracts/Contract.sol#1111)\n\t- Pool.updatePool(uint256) (contracts/Contract.sol#1207-1221)\n\t- Pool.withdraw(uint256,uint256) (contracts/Contract.sol#1255-1269)"
}
|
| low | other | codex | Fee-on-transfer/rebasing tokens break accounting and reward distribution | 65 | no | — |
viewevidence_json{
"evidence": "user.amount is incremented by _amount without checking actual received tokens; totalStake is derived from balanceOf which can diverge from tracked user amounts.",
"locations": [
"contracts/Contract.sol:1242",
"contracts/Contract.sol:1266",
"contracts/Contract.sol:1276",
"contracts/Contract.sol:1277"
],
"recommendation": "Track actual received amount via pre/post balance checks, and maintain a separate totalStaked variable. Consider rejecting fee-on-transfer/rebasing tokens.",
"exploit_scenario": "For deflationary or rebasing tokens, the contract credits user.amount with the requested _amount even if fewer tokens were received. This lets users accrue rewards on more than their actual stake and can cause withdrawals to revert when the pool balance is insufficient."
}
|
| 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
}
|