019be3d6-8329-7283-9a66-0484d43643d5
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 |
|---|---|---|---|---|
| 40799 | artifact.fetch | complete | 1 / 3 | 2 months ago |
| 40800 | proxy.resolve | complete | 1 / 3 | 2 months ago |
| 40801 | tool.cast_disasm | complete | 1 / 3 | 2 months ago |
| 40802 | analysis.bundle | complete | 1 / 3 | 2 months ago |
| 40803 | capability.graph | complete | 1 / 3 | 2 months ago |
| 40804 | detector.run | complete | 1 / 3 | 2 months ago |
| 40805 | validation.fork | complete | 1 / 3 | 2 months ago |
| 41315 | report.consolidate | complete | 1 / 6 | 2 months ago |
| 41316 | tool.slither | complete | 1 / 2 | 2 months ago |
{
"status": "not_proxy"
}
'forge clean' running (wd: /tmp/slither-dbj2922e) 'forge config --json' running 'forge build --build-info --skip ./test/** ./script/** --force' running (wd: /tmp/slither-dbj2922e) Reentrancy in SharkPool.mine() (contracts/Contract.sol#252-288): External calls: - require(bool)(! base_contract.checkMiningAttempt(_blockNum,this)) (contracts/Contract.sol#256-260) - base_contract.mine.value(total_attempt)() (contracts/Contract.sol#287) External calls sending eth: - base_contract.mine.value(total_attempt)() (contracts/Contract.sol#287) State variables written after the call(s): - mined_blocks = mined_blocks + 1 (contracts/Contract.sol#288) SharkPool.mined_blocks (contracts/Contract.sol#105-106) can be used in cross function reentrancies: - SharkPool.fallback() (contracts/Contract.sol#225-252) - SharkPool.find_contribution(address) (contracts/Contract.sol#130-148) - SharkPool.mined_blocks (contracts/Contract.sol#105-106) Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities SharkPool.do_redemption() (contracts/Contract.sol#310-321) ignores return value by base_contract.transfer(owner,owner_cut) (contracts/Contract.sol#316-317) SharkPool.do_redemption() (contracts/Contract.sol#310-321) ignores return value by base_contract.transfer(msg.sender,remainder) (contracts/Contract.sol#319-320) Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#unchecked-transfer SharkPool.distribute_reward(uint256,uint256) (contracts/Contract.sol#192-207) performs a multiplication on the result of a division: - divided_portion = (proportion * divisible_units) / _totalAttempt (contracts/Contract.sol#201-202) - payout = (_balance * divided_portion) / divisible_units (contracts/Contract.sol#202-203) SharkPool.calculate_minimum_contribution() (contracts/Contract.sol#216-220) performs a multiplication on the result of a division: - base_contract.currentDifficultyWei() / 10000000 * contract_period (contracts/Contract.sol#217-220) SharkPool.do_redemption() (contracts/Contract.sol#310-321) performs a multiplication on the result of a division: - owner_cut = (balance / 100) * pool_percentage (contracts/Contract.sol#313-315) Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#divide-before-multiply Reentrancy in SharkPool.do_redemption() (contracts/Contract.sol#310-321): External calls: - base_contract.transfer(owner,owner_cut) (contracts/Contract.sol#316-317) - base_contract.transfer(msg.sender,remainder) (contracts/Contract.sol#319-320) State variables written after the call(s): - balances[msg.sender] = 0 (contracts/Contract.sol#320) SharkPool.balances (contracts/Contract.sol#117-120) can be used in cross function reentrancies: - SharkPool.balanceOf(address) (contracts/Contract.sol#122-124) - SharkPool.do_redemption() (contracts/Contract.sol#310-321) Reentrancy in SharkPool.fallback() (contracts/Contract.sol#225-252): External calls: - require(bool)(msg.value >= calculate_minimum_contribution()) (contracts/Contract.sol#225-226) - base_contract.currentDifficultyWei() / 10000000 * contract_period (contracts/Contract.sol#217-220) - do_redemption() (contracts/Contract.sol#243) - base_contract.transfer(owner,owner_cut) (contracts/Contract.sol#316-317) - base_contract.transfer(msg.sender,remainder) (contracts/Contract.sol#319-320) State variables written after the call(s): - current_user.start_block = mined_blocks (contracts/Contract.sol#248) SharkPool.users (contracts/Contract.sol#114-116) can be used in cross function reentrancies: - SharkPool.fallback() (contracts/Contract.sol#225-252) - SharkPool.find_contribution(address) (contracts/Contract.sol#130-148) - SharkPool.users (contracts/Contract.sol#114-116) - current_user.end_block = mined_blocks + contract_period (contracts/Contract.sol#248-252) SharkPool.users (contracts/Contract.sol#114-116) can be used in cross function reentrancies: - SharkPool.fallback() (contracts/Contract.sol#225-252) - SharkPool.find_contribution(address) (contracts/Contract.sol#130-148) - SharkPool.users (contracts/Contract.sol#114-116) Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-1 Ownable.transferOwnership(address) (contracts/Contract.sol#32-35) should emit an event for: - owner = newOwner (contracts/Contract.sol#35) Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#missing-events-access-control SharkPool.set_pool_percentage(uint8) (contracts/Contract.sol#124-130) should emit an event for: - pool_percentage = _percentage (contracts/Contract.sol#130) Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#missing-events-arithmetic Reentrancy in SharkPool.claim(uint256,address) (contracts/Contract.sol#288-310): External calls: - require(bool)(base_contract.checkWinning(_blockNumber)) (contracts/Contract.sol#295-296) - initial_balance = base_contract.balanceOf(this) (contracts/Contract.sol#299-300) - base_contract.claim(_blockNumber,this) (contracts/Contract.sol#302-304) - balance = base_contract.balanceOf(this) (contracts/Contract.sol#304-305) State variables written after the call(s): - distribute_reward(total_attempt,balance - initial_balance) (contracts/Contract.sol#307-309) - balances[user_address] = balances[user_address] + payout (contracts/Contract.sol#204-205) - claimed_blocks = claimed_blocks + 1 (contracts/Contract.sol#309-310) Reentrancy in SharkPool.fallback() (contracts/Contract.sol#225-252): External calls: - require(bool)(msg.value >= calculate_minimum_contribution()) (contracts/Contract.sol#225-226) - base_contract.currentDifficultyWei() / 10000000 * contract_period (contracts/Contract.sol#217-220) State variables written after the call(s): - allocate_slot(msg.sender) (contracts/Contract.sol#245-248) - active_users[total_users] = _who (contracts/Contract.sol#152-154) - active_users[location] = _who (contracts/Contract.sol#162) - allocate_slot(msg.sender) (contracts/Contract.sol#245-248) - delete slots[slots.length - 1] (contracts/Contract.sol#163-164) - allocate_slot(msg.sender) (contracts/Contract.sol#245-248) - total_users += 1 (contracts/Contract.sol#154-155) - current_user.proportional_contribution = amount_remaining (contracts/Contract.sol#240) - current_user.proportional_contribution = msg.value / contract_period (contracts/Contract.sol#241-242) - current_user.proportional_contribution = msg.value / contract_period (contracts/Contract.sol#244-245) Reentrancy in SharkPool.mine() (contracts/Contract.sol#252-288): External calls: - require(bool)(! base_contract.checkMiningAttempt(_blockNum,this)) (contracts/Contract.sol#256-260) State variables written after the call(s): - delete active_users[i] (contracts/Contract.sol#276-277) - attempts[_blockNum] = total_attempt (contracts/Contract.sol#284-286) - slots.push(i) (contracts/Contract.sol#277) - delete users[active_users[i]] (contracts/Contract.sol#278) Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-2 SharkPool.mine() (contracts/Contract.sol#252-288) has costly operations inside a loop: - delete active_users[i] (contracts/Contract.sol#276-277) SharkPool.mine() (contracts/Contract.sol#252-288) has costly operations inside a loop: - delete users[active_users[i]] (contracts/Contract.sol#278) Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#costly-operations-inside-a-loop Version constraint ^0.4.13 contains known severe issues (https://solidity.readthedocs.io/en/latest/bugs.html) - DirtyBytesArrayToStorage - KeccakCaching - EmptyByteArrayCopy - DynamicArrayCleanup - ImplicitConstructorCallvalueCheck - TupleAssignmentMultiStackSlotComponents - MemoryArrayCreationOverflow - privateCanBeOverridden - SignedArrayStorageCopy - UninitializedFunctionPointerInConstructor_0.4.x - IncorrectEventSignatureInLibraries_0.4.x - ExpExponentCleanup - NestedArrayFunctionCallDecoder - ZeroFunctionSelector - DelegateCallReturnValue - ECRecoverMalformedInput. It is used by: - ^0.4.13 (contracts/Contract.sol#1) solc-0.4.13 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 Variable ReentrancyGuard.rentrancy_lock (contracts/Contract.sol#52) is not in mixedCase Struct SharkPool.user (contracts/Contract.sol#109-114) is not in CapWords Parameter SharkPool.balanceOf(address)._owner (contracts/Contract.sol#122) is not in mixedCase Function SharkPool.set_pool_percentage(uint8) (contracts/Contract.sol#124-130) is not in mixedCase Parameter SharkPool.set_pool_percentage(uint8)._percentage (contracts/Contract.sol#126) is not in mixedCase Function SharkPool.find_contribution(address) (contracts/Contract.sol#130-148) is not in mixedCase Parameter SharkPool.find_contribution(address)._who (contracts/Contract.sol#131) is not in mixedCase Function SharkPool.allocate_slot(address) (contracts/Contract.sol#148-165) is not in mixedCase Parameter SharkPool.allocate_slot(address)._who (contracts/Contract.sol#148) is not in mixedCase Function SharkPool.external_to_internal_block_number(uint256) (contracts/Contract.sol#165-172) is not in mixedCase Parameter SharkPool.external_to_internal_block_number(uint256)._externalBlockNum (contracts/Contract.sol#166) is not in mixedCase Function SharkPool.available_slots() (contracts/Contract.sol#172-177) is not in mixedCase Function SharkPool.get_bitcoineum_contract_address() (contracts/Contract.sol#178-189) is not in mixedCase Function SharkPool.distribute_reward(uint256,uint256) (contracts/Contract.sol#192-207) is not in mixedCase Parameter SharkPool.distribute_reward(uint256,uint256)._totalAttempt (contracts/Contract.sol#192-194) is not in mixedCase Parameter SharkPool.distribute_reward(uint256,uint256)._balance (contracts/Contract.sol#195) is not in mixedCase Function SharkPool.current_external_block() (contracts/Contract.sol#210-216) is not in mixedCase Function SharkPool.calculate_minimum_contribution() (contracts/Contract.sol#216-220) is not in mixedCase Parameter SharkPool.claim(uint256,address)._blockNumber (contracts/Contract.sol#288-289) is not in mixedCase Function SharkPool.do_redemption() (contracts/Contract.sol#310-321) is not in mixedCase Parameter SharkPool.checkMiningAttempt(uint256,address)._blockNum (contracts/Contract.sol#323-324) is not in mixedCase Parameter SharkPool.checkMiningAttempt(uint256,address)._sender (contracts/Contract.sol#324) is not in mixedCase Parameter SharkPool.checkWinning(uint256)._blockNum (contracts/Contract.sol#328) is not in mixedCase Variable SharkPool.pool_percentage (contracts/Contract.sol#92) is not in mixedCase Variable SharkPool.total_users (contracts/Contract.sol#99-101) is not in mixedCase Variable SharkPool.contract_period (contracts/Contract.sol#104) is not in mixedCase Variable SharkPool.mined_blocks (contracts/Contract.sol#105-106) is not in mixedCase Variable SharkPool.claimed_blocks (contracts/Contract.sol#106-107) is not in mixedCase Variable SharkPool.base_contract (contracts/Contract.sol#108-109) is not in mixedCase Variable SharkPool.active_users (contracts/Contract.sol#120-121) is not in mixedCase Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#conformance-to-solidity-naming-conventions SharkPool.calculate_minimum_contribution() (contracts/Contract.sol#216-220) uses literals with too many digits: - base_contract.currentDifficultyWei() / 10000000 * contract_period (contracts/Contract.sol#217-220) SharkPool.slitherConstructorConstantVariables() (contracts/Contract.sol#86-334) uses literals with too many digits: - divisible_units = 10000000 (contracts/Contract.sol#101) Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#too-many-digits SharkPool.contract_period (contracts/Contract.sol#104) should be constant Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#state-variables-that-could-be-declared-constant . analyzed (4 contracts with 100 detectors), 50 result(s) found
{
"solc": {
"status": "ok",
"use_rc": 0,
"version": "0.4.13",
"strategy": "solc-select",
"solc_path": "/var/www/tripwire/.venv/bin/solc",
"install_rc": 0,
"use_stderr": null,
"use_stdout": "Switched global version to 0.4.13",
"install_stderr": null,
"install_stdout": "Installing solc '0.4.13'...\nVersion '0.4.13' installed."
},
"solc_args": "--base-path /tmp/slither-dbj2922e --allow-paths /tmp/slither-dbj2922e,/tmp/slither-dbj2922e/lib,/tmp/slither-dbj2922e/src",
"remappings": [],
"source_files": [
"contracts/Contract.sol"
],
"contract_count": 0,
"contract_names": [],
"detector_count": 50,
"workspace_hash": "ff59782de2cba25b6001b9562c597c8bc5ed93dbf7bff53e1b1b5e440f72b96f",
"duration_seconds": 1.0326552391052246,
"solc_version_requested": "0.4.13"
}
{"no_findings":false,"summary":"Found 4 issues: reentrancy risk in fallback redemption, slot reuse bug that can overwrite active users, stale user mapping blocks re-joins and mis-accounts contributions, and unchecked token transfer return values can zero balances without payout.","findings":[{"severity":"medium","category":"reentrancy","title":"Fallback redemption performs external token transfers before clearing balance and without reentrancy guard","exploit_scenario":"If the Bitcoineum token contract (or an ERC223/777-style token) triggers callbacks on transfer, a malicious recipient contract can reenter `redeem()` or the payable fallback during `do_redemption()` and withdraw its `balances[msg.sender]` multiple times before it is set to 0, draining token rewards.","recommendation":"Apply `nonReentrant` (or a dedicated reentrancy lock) to the payable fallback or avoid calling `do_redemption()` from it; update `balances[msg.sender]` before external calls (checks-effects-interactions) and revert on failed transfers.","evidence":"`function () payable { ... do_redemption(); }` and `do_redemption()` transfers tokens before `balances[msg.sender] = 0`.","locations":["contracts/Contract.sol:229","contracts/Contract.sol:319"]},{"severity":"medium","category":"other","title":"Slot reuse bug can overwrite active users when pool is full","exploit_scenario":"When `total_users` has reached `max_users`, new allocations reuse `slots[slots.length-1]` and then `delete` the element without shrinking the array. This leaves a zero value at the end and keeps `slots.length` unchanged, so subsequent allocations often reuse slot 0 and can overwrite an active user, removing their contribution and skewing rewards.","recommendation":"Use `slots.length--` (or `slots.pop()` in newer Solidity) after reading the last slot, and consider validating the slot index before assignment.","evidence":"`uint8 location = slots[slots.length-1]; ... delete slots[slots.length-1];` does not reduce `slots.length`.","locations":["contracts/Contract.sol:154","contracts/Contract.sol:165"]},{"severity":"low","category":"other","title":"Expired users are not removed from the mapping, preventing re-join and mis-accounting contributions","exploit_scenario":"During ejection, the code deletes `active_users[i]` before deleting the user, so it ends up deleting `users[0]` and leaving the expired user mapping intact. Later, that user still has `start_block > 0`, so the fallback path skips `allocate_slot` and accepts deposits that never get mined, effectively burning the contribution.","recommendation":"Store the address before clearing the slot and delete `users[addr]` first; alternatively, clear `users[msg.sender]` when a user is no longer active and ensure re-joins allocate a slot.","evidence":"`delete active_users[i]; ... delete users[active_users[i]];` deletes the mapping at address 0 instead of the ejected user.","locations":["contracts/Contract.sol:272","contracts/Contract.sol:281"]},{"severity":"low","category":"other","title":"Unchecked token transfer return values can zero balances without payout","exploit_scenario":"If the Bitcoineum token `transfer` returns `false` (e.g., paused token or failure), `do_redemption()` still sets `balances[msg.sender] = 0`, causing the user to lose rewards without receiving tokens.","recommendation":"Require `base_contract.transfer(...)` to return true and revert on failure before clearing balances.","evidence":"`base_contract.transfer(owner, owner_cut);` and `base_contract.transfer(msg.sender, remainder);` are unchecked but `balances[msg.sender]` is cleared afterwards.","locations":["contracts/Contract.sol:325","contracts/Contract.sol:327"]}]}
OpenAI Codex v0.77.0 (research preview)
--------
workdir: /tmp/codex-wk1lu1c1
model: gpt-5.2-codex
provider: openai
approval: never
sandbox: read-only
reasoning effort: high
reasoning summaries: auto
session id: 019be438-13f5-7c93-acae-7d9ced74a7d0
--------
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
thinking
**Preparing to audit with AUDIT_BUNDLE.txt**
I'll read the AUDIT_BUNDLE.txt file in the sandbox to understand its contents before proceeding with the audit.
exec
/bin/bash -lc ls in /tmp/codex-wk1lu1c1 succeeded in 7ms:
AUDIT_BUNDLE.txt
codex-output-schema.json
contracts
exec
/bin/bash -lc 'cat AUDIT_BUNDLE.txt' in /tmp/codex-wk1lu1c1 succeeded in 5ms:
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
================================================================================
pragma solidity ^0.4.13;
/**
* @title Ownable
* @dev The Ownable contract has an owner address, and provides basic authorization control
* functions, this simplifies the implementation of "user permissions".
*/
contract Ownable {
address public owner;
/**
* @dev The Ownable constructor sets the original `owner` of the contract to the sender
* account.
Reconnecting... 1/5
thinking
**Assessing reentrancy and access control**
The fallback function is payable and lacks nonReentrant protection while calling token transfers, but typical ERC20 tokens don't trigger reentrancy via transfer, so the risk seems low. However, the unrestricted access to key functions like mine and claim may warrant further review for potential misuse or griefing.
thinking
**Identifying multiple accounting and logic bugs**
There’s a critical bug where deleting active user entries before clearing user mappings causes stale user data, leading to users trapped without rejoining slots and wasted contributions. Also, improper slot deletion leaves zeroed slots without shrinking the array, risking duplicate slot allocations and overwrites. Unchecked token transfer return values may cause lost funds if transfers fail silently. Finally, a likely reentrancy vector exists in fallback calling token transfers without locking, potentially allowing reentrant withdrawals if the token invokes callbacks.
thinking
**Summarizing core vulnerabilities and bugs**
The fallback function enables reentrancy due to calling external token transfers before updating state without locking, risking multiple withdrawals if tokens have callbacks. The slot management incorrectly deletes slots without reducing length, causing repeated slot reuse that overwrites active users and leads to contribution loss. User ejection logic deletes active user slots before clearing user mappings, leaving stale entries that block users from rejoining and cause wasted deposits. Unchecked transfer return values risk silently losing tokens on failed transfers. These issues range from low to medium severity and span accounting bugs and potential reentrancy.
exec
/bin/bash -lc 'nl -ba contracts/Contract.sol' in /tmp/codex-wk1lu1c1 succeeded in 7ms:
1 pragma solidity ^0.4.13;
2
3 /**
4 * @title Ownable
5 * @dev The Ownable contract has an owner address, and provides basic authorization control
6 * functions, this simplifies the implementation of "user permissions".
7 */
8 contract Ownable {
9 address public owner;
10
11
12 /**
13 * @dev The Ownable constructor sets the original `owner` of the contract to the sender
14 * account.
15 */
16 function Ownable() {
17 owner = msg.sender;
18 }
19
20
thinking
**Summarizing vulnerabilities with locations and severities**
The findings include a medium-severity reentrancy issue in fallback and redemption due to unguarded external calls, a medium-severity slot reuse bug risking user displacement and mining share loss, a low-severity logic bug from expired user mappings not cleared, and a low-severity unchecked token transfer return risking balance loss; all include line references and categorized as reentrancy or other with careful severity justification. Next is crafting the final JSON summary without Unicode.
thinking
**Drafting detailed vulnerability summaries with recommendations**
I've outlined full titles, exploit scenarios, and precise recommendations for each of the four issues, matching line number locations and using ASCII-only text. Next, I'll compose the final JSON summary conforming to the schema with code file references and ensure clarity for all points.
codex
{"no_findings":false,"summary":"Found 4 issues: reentrancy risk in fallback redemption, slot reuse bug that can overwrite active users, stale user mapping blocks re-joins and mis-accounts contributions, and unchecked token transfer return values can zero balances without payout.","findings":[{"severity":"medium","category":"reentrancy","title":"Fallback redemption performs external token transfers before clearing balance and without reentrancy guard","exploit_scenario":"If the Bitcoineum token contract (or an ERC223/777-style token) triggers callbacks on transfer, a malicious recipient contract can reenter `redeem()` or the payable fallback during `do_redemption()` and withdraw its `balances[msg.sender]` multiple times before it is set to 0, draining token rewards.","recommendation":"Apply `nonReentrant` (or a dedicated reentrancy lock) to the payable fallback or avoid calling `do_redemption()` from it; update `balances[msg.sender]` before external calls (checks-effects-interactions) and revert on failed transfers.","evidence":"`function () payable { ... do_redemption(); }` and `do_redemption()` transfers tokens before `balances[msg.sender] = 0`.","locations":["contracts/Contract.sol:229","contracts/Contract.sol:319"]},{"severity":"medium","category":"other","title":"Slot reuse bug can overwrite active users when pool is full","exploit_scenario":"When `total_users` has reached `max_users`, new allocations reuse `slots[slots.length-1]` and then `delete` the element without shrinking the array. This leaves a zero value at the end and keeps `slots.length` unchanged, so subsequent allocations often reuse slot 0 and can overwrite an active user, removing their contribution and skewing rewards.","recommendation":"Use `slots.length--` (or `slots.pop()` in newer Solidity) after reading the last slot, and consider validating the slot index before assignment.","evidence":"`uint8 location = slots[slots.length-1]; ... delete slots[slots.length-1];` does not reduce `slots.length`.","locations":["contracts/Contract.sol:154","contracts/Contract.sol:165"]},{"severity":"low","category":"other","title":"Expired users are not removed from the mapping, preventing re-join and mis-accounting contributions","exploit_scenario":"During ejection, the code deletes `active_users[i]` before deleting the user, so it ends up deleting `users[0]` and leaving the expired user mapping intact. Later, that user still has `start_block > 0`, so the fallback path skips `allocate_slot` and accepts deposits that never get mined, effectively burning the contribution.","recommendation":"Store the address before clearing the slot and delete `users[addr]` first; alternatively, clear `users[msg.sender]` when a user is no longer active and ensure re-joins allocate a slot.","evidence":"`delete active_users[i]; ... delete users[active_users[i]];` deletes the mapping at address 0 instead of the ejected user.","locations":["contracts/Contract.sol:272","contracts/Contract.sol:281"]},{"severity":"low","category":"other","title":"Unchecked token transfer return values can zero balances without payout","exploit_scenario":"If the Bitcoineum token `transfer` returns `false` (e.g., paused token or failure), `do_redemption()` still sets `balances[msg.sender] = 0`, causing the user to lose rewards without receiving tokens.","recommendation":"Require `base_contract.transfer(...)` to return true and revert on failure before clearing balances.","evidence":"`base_contract.transfer(owner, owner_cut);` and `base_contract.transfer(msg.sender, remainder);` are unchecked but `balances[msg.sender]` is cleared afterwards.","locations":["contracts/Contract.sol:325","contracts/Contract.sol:327"]}]}
tokens used
33,106
{
"codex": {
"ran_at": "2026-01-22T05:44:57.365949+00:00",
"returncode": 0
},
"project": {
"mode": "source",
"file_count": 1,
"import_count": 0,
"first_party_contracts_count": 1
},
"summary": "Found 4 issues: reentrancy risk in fallback redemption, slot reuse bug that can overwrite active users, stale user mapping blocks re-joins and mis-accounts contributions, and unchecked token transfer return values can zero balances without payout.",
"raw_final": {
"summary": "Found 4 issues: reentrancy risk in fallback redemption, slot reuse bug that can overwrite active users, stale user mapping blocks re-joins and mis-accounts contributions, and unchecked token transfer return values can zero balances without payout.",
"findings": [
{
"title": "Fallback redemption performs external token transfers before clearing balance and without reentrancy guard",
"category": "reentrancy",
"evidence": "`function () payable { ... do_redemption(); }` and `do_redemption()` transfers tokens before `balances[msg.sender] = 0`.",
"severity": "medium",
"locations": [
"contracts/Contract.sol:229",
"contracts/Contract.sol:319"
],
"recommendation": "Apply `nonReentrant` (or a dedicated reentrancy lock) to the payable fallback or avoid calling `do_redemption()` from it; update `balances[msg.sender]` before external calls (checks-effects-interactions) and revert on failed transfers.",
"exploit_scenario": "If the Bitcoineum token contract (or an ERC223/777-style token) triggers callbacks on transfer, a malicious recipient contract can reenter `redeem()` or the payable fallback during `do_redemption()` and withdraw its `balances[msg.sender]` multiple times before it is set to 0, draining token rewards."
},
{
"title": "Slot reuse bug can overwrite active users when pool is full",
"category": "other",
"evidence": "`uint8 location = slots[slots.length-1]; ... delete slots[slots.length-1];` does not reduce `slots.length`.",
"severity": "medium",
"locations": [
"contracts/Contract.sol:154",
"contracts/Contract.sol:165"
],
"recommendation": "Use `slots.length--` (or `slots.pop()` in newer Solidity) after reading the last slot, and consider validating the slot index before assignment.",
"exploit_scenario": "When `total_users` has reached `max_users`, new allocations reuse `slots[slots.length-1]` and then `delete` the element without shrinking the array. This leaves a zero value at the end and keeps `slots.length` unchanged, so subsequent allocations often reuse slot 0 and can overwrite an active user, removing their contribution and skewing rewards."
},
{
"title": "Expired users are not removed from the mapping, preventing re-join and mis-accounting contributions",
"category": "other",
"evidence": "`delete active_users[i]; ... delete users[active_users[i]];` deletes the mapping at address 0 instead of the ejected user.",
"severity": "low",
"locations": [
"contracts/Contract.sol:272",
"contracts/Contract.sol:281"
],
"recommendation": "Store the address before clearing the slot and delete `users[addr]` first; alternatively, clear `users[msg.sender]` when a user is no longer active and ensure re-joins allocate a slot.",
"exploit_scenario": "During ejection, the code deletes `active_users[i]` before deleting the user, so it ends up deleting `users[0]` and leaving the expired user mapping intact. Later, that user still has `start_block > 0`, so the fallback path skips `allocate_slot` and accepts deposits that never get mined, effectively burning the contribution."
},
{
"title": "Unchecked token transfer return values can zero balances without payout",
"category": "other",
"evidence": "`base_contract.transfer(owner, owner_cut);` and `base_contract.transfer(msg.sender, remainder);` are unchecked but `balances[msg.sender]` is cleared afterwards.",
"severity": "low",
"locations": [
"contracts/Contract.sol:325",
"contracts/Contract.sol:327"
],
"recommendation": "Require `base_contract.transfer(...)` to return true and revert on failure before clearing balances.",
"exploit_scenario": "If the Bitcoineum token `transfer` returns `false` (e.g., paused token or failure), `do_redemption()` still sets `balances[msg.sender] = 0`, causing the user to lose rewards without receiving tokens."
}
],
"no_findings": false
},
"no_findings": false,
"schema_version": 1
}
00000000: PUSH1 0x60 00000002: PUSH1 0x40 00000004: MSTORE 00000005: CALLDATASIZE 00000006: ISZERO 00000007: PUSH2 0x0143 0000000a: JUMPI 0000000b: PUSH4 0xffffffff 00000010: PUSH1 0xe0 00000012: PUSH1 0x02 00000014: EXP 00000015: PUSH1 0x00 00000017: CALLDATALOAD 00000018: DIV 00000019: AND 0000001a: PUSH4 0x014c3dbc 0000001f: DUP2 00000020: EQ 00000021: PUSH2 0x021b 00000024: JUMPI 00000025: DUP1 00000026: PUSH4 0x0ee33c70 0000002b: EQ 0000002c: PUSH2 0x0240 0000002f: JUMPI 00000030: DUP1 00000031: PUSH4 0x2c035157 00000036: EQ 00000037: PUSH2 0x0265 0000003a: JUMPI 0000003b: DUP1 0000003c: PUSH4 0x2d59680d 00000041: EQ 00000042: PUSH2 0x028a 00000045: JUMPI 00000046: DUP1 00000047: PUSH4 0x42b343a3 0000004c: EQ 0000004d: PUSH2 0x0315 00000050: JUMPI 00000051: DUP1 00000052: PUSH4 0x54ba34b5 00000057: EQ 00000058: PUSH2 0x033d 0000005b: JUMPI 0000005c: DUP1 0000005d: PUSH4 0x5f623e15 00000062: EQ 00000063: PUSH2 0x0362 00000066: JUMPI 00000067: DUP1 00000068: PUSH4 0x70a08231 0000006d: EQ 0000006e: PUSH2 0x0387 00000071: JUMPI 00000072: DUP1 00000073: PUSH4 0x88537daf 00000078: EQ 00000079: PUSH2 0x03b8 0000007c: JUMPI 0000007d: DUP1 0000007e: PUSH4 0x8da5cb5b 00000083: EQ 00000084: PUSH2 0x03ee 00000087: JUMPI 00000088: DUP1 00000089: PUSH4 0x99f4b251 0000008e: EQ 0000008f: PUSH2 0x041d 00000092: JUMPI 00000093: DUP1 00000094: PUSH4 0xa263601c 00000099: EQ 0000009a: PUSH2 0x0432 0000009d: JUMPI 0000009e: DUP1 0000009f: PUSH4 0xa87430ba 000000a4: EQ 000000a5: PUSH2 0x0483 000000a8: JUMPI 000000a9: DUP1 000000aa: PUSH4 0xaee1d4d3 000000af: EQ 000000b0: PUSH2 0x04c6 000000b3: JUMPI 000000b4: DUP1 000000b5: PUSH4 0xaf76c4d2 000000ba: EQ 000000bb: PUSH2 0x04eb 000000be: JUMPI 000000bf: DUP1 000000c0: PUSH4 0xb03645b5 000000c5: EQ 000000c6: PUSH2 0x0510 000000c9: JUMPI 000000ca: DUP1 000000cb: PUSH4 0xb8b0f533 000000d0: EQ 000000d1: PUSH2 0x0535 000000d4: JUMPI 000000d5: DUP1 000000d6: PUSH4 0xbe040fb0 000000db: EQ 000000dc: PUSH2 0x0564 000000df: JUMPI 000000e0: DUP1 000000e1: PUSH4 0xc961df66 000000e6: EQ 000000e7: PUSH2 0x0579 000000ea: JUMPI 000000eb: DUP1 000000ec: PUSH4 0xdda6c3ce 000000f1: EQ 000000f2: PUSH2 0x059e 000000f5: JUMPI 000000f6: DUP1 000000f7: PUSH4 0xddd5e1b2 000000fc: EQ 000000fd: PUSH2 0x05c8 00000100: JUMPI 00000101: DUP1 00000102: PUSH4 0xe530db1c 00000107: EQ 00000108: PUSH2 0x05fe 0000010b: JUMPI 0000010c: DUP1 0000010d: PUSH4 0xe6d2ceab 00000112: EQ 00000113: PUSH2 0x0623 00000116: JUMPI 00000117: DUP1 00000118: PUSH4 0xe7cc62bd 0000011d: EQ 0000011e: PUSH2 0x063e 00000121: JUMPI 00000122: DUP1 00000123: PUSH4 0xec083e37 00000128: EQ 00000129: PUSH2 0x0663 0000012c: JUMPI 0000012d: DUP1 0000012e: PUSH4 0xf2fde38b 00000133: EQ 00000134: PUSH2 0x0695 00000137: JUMPI 00000138: DUP1 00000139: PUSH4 0xfab425e7 0000013e: EQ 0000013f: PUSH2 0x06b6 00000142: JUMPI 00000143: JUMPDEST 00000144: PUSH2 0x0219 00000147: JUMPDEST 00000148: PUSH1 0x00 0000014a: DUP1 0000014b: PUSH1 0x00 0000014d: PUSH2 0x0154 00000150: PUSH2 0x06de 00000153: JUMP 00000154: JUMPDEST 00000155: CALLVALUE 00000156: LT 00000157: ISZERO 00000158: PUSH2 0x0160 0000015b: JUMPI 0000015c: PUSH1 0x00 0000015e: DUP1 0000015f: REVERT 00000160: JUMPDEST 00000161: PUSH1 0x01 00000163: PUSH1 0xa0 00000165: PUSH1 0x02 00000167: EXP 00000168: SUB 00000169: CALLER 0000016a: AND 0000016b: PUSH1 0x00 0000016d: SWAP1 0000016e: DUP2 0000016f: MSTORE 00000170: PUSH1 0x08 00000172: PUSH1 0x20 00000174: MSTORE 00000175: PUSH1 0x40 00000177: DUP2 00000178: KECCAK256 00000179: DUP1 0000017a: SLOAD 0000017b: SWAP1 0000017c: SWAP5 0000017d: POP 0000017e: GT 0000017f: ISZERO 00000180: PUSH2 0x01e7 00000183: JUMPI 00000184: PUSH1 0x04 00000186: SLOAD 00000187: DUP4 00000188: PUSH1 0x01 0000018a: ADD 0000018b: SLOAD 0000018c: GT 0000018d: ISZERO 0000018e: PUSH2 0x01c6 00000191: JUMPI 00000192: PUSH1 0x04 00000194: SLOAD 00000195: DUP4 00000196: PUSH1 0x01 00000198: ADD 00000199: SLOAD 0000019a: SUB 0000019b: SWAP2 0000019c: POP 0000019d: DUP2 0000019e: DUP4 0000019f: PUSH1 0x02 000001a1: ADD 000001a2: SLOAD 000001a3: MUL 000001a4: SWAP1 000001a5: POP 000001a6: CALLVALUE 000001a7: DUP2 000001a8: ADD 000001a9: SWAP1 000001aa: POP 000001ab: PUSH1 0x03 000001ad: SLOAD 000001ae: DUP2 000001af: DUP2 000001b0: ISZERO 000001b1: ISZERO 000001b2: PUSH2 0x01b7 000001b5: JUMPI 000001b6: INVALID 000001b7: JUMPDEST 000001b8: DIV 000001b9: PUSH1 0x02 000001bb: DUP5 000001bc: ADD 000001bd: DUP2 000001be: SWAP1 000001bf: SSTORE 000001c0: SWAP1 000001c1: POP 000001c2: PUSH2 0x01da 000001c5: JUMP 000001c6: JUMPDEST 000001c7: PUSH1 0x03 000001c9: SLOAD 000001ca: CALLVALUE 000001cb: DUP2 000001cc: ISZERO 000001cd: ISZERO 000001ce: PUSH2 0x01d3 000001d1: JUMPI 000001d2: INVALID 000001d3: JUMPDEST 000001d4: DIV 000001d5: PUSH1 0x02 000001d7: DUP5 000001d8: ADD 000001d9: SSTORE 000001da: JUMPDEST 000001db: PUSH2 0x01e2 000001de: PUSH2 0x075d 000001e1: JUMP 000001e2: JUMPDEST 000001e3: PUSH2 0x0203 000001e6: JUMP 000001e7: JUMPDEST 000001e8: PUSH1 0x03 000001ea: SLOAD 000001eb: CALLVALUE 000001ec: DUP2 000001ed: ISZERO 000001ee: ISZERO 000001ef: PUSH2 0x01f4 000001f2: JUMPI 000001f3: INVALID 000001f4: JUMPDEST 000001f5: DIV 000001f6: PUSH1 0x02 000001f8: DUP5 000001f9: ADD 000001fa: SSTORE 000001fb: PUSH2 0x0203 000001fe: CALLER 000001ff: PUSH2 0x08b6 00000202: JUMP 00000203: JUMPDEST 00000204: JUMPDEST 00000205: PUSH1 0x04 00000207: SLOAD 00000208: DUP1 00000209: DUP5 0000020a: SSTORE 0000020b: PUSH1 0x03 0000020d: SLOAD 0000020e: ADD 0000020f: PUSH1 0x01 00000211: DUP5 00000212: ADD 00000213: SSTORE 00000214: JUMPDEST 00000215: POP 00000216: POP 00000217: POP 00000218: JUMP 00000219: JUMPDEST 0000021a: STOP 0000021b: JUMPDEST 0000021c: CALLVALUE 0000021d: ISZERO 0000021e: PUSH2 0x0226 00000221: JUMPI 00000222: PUSH1 0x00 00000224: DUP1 00000225: REVERT 00000226: JUMPDEST 00000227: PUSH2 0x022e 0000022a: PUSH2 0x09d0 0000022d: JUMP 0000022e: JUMPDEST 0000022f: PUSH1 0x40 00000231: MLOAD 00000232: SWAP1 00000233: DUP2 00000234: MSTORE 00000235: PUSH1 0x20 00000237: ADD 00000238: PUSH1 0x40 0000023a: MLOAD 0000023b: DUP1 0000023c: SWAP2 0000023d: SUB 0000023e: SWAP1 0000023f: RETURN 00000240: JUMPDEST 00000241: CALLVALUE 00000242: ISZERO 00000243: PUSH2 0x024b 00000246: JUMPI 00000247: PUSH1 0x00 00000249: DUP1 0000024a: REVERT 0000024b: JUMPDEST 0000024c: PUSH2 0x022e 0000024f: PUSH2 0x09d5 00000252: JUMP 00000253: JUMPDEST 00000254: PUSH1 0x40 00000256: MLOAD 00000257: SWAP1 00000258: DUP2 00000259: MSTORE 0000025a: PUSH1 0x20 0000025c: ADD 0000025d: PUSH1 0x40 0000025f: MLOAD 00000260: DUP1 00000261: SWAP2 00000262: SUB 00000263: SWAP1 00000264: RETURN 00000265: JUMPDEST 00000266: CALLVALUE 00000267: ISZERO 00000268: PUSH2 0x0270 0000026b: JUMPI 0000026c: PUSH1 0x00 0000026e: DUP1 0000026f: REVERT 00000270: JUMPDEST 00000271: PUSH2 0x022e 00000274: PUSH2 0x06de 00000277: JUMP 00000278: JUMPDEST 00000279: PUSH1 0x40 0000027b: MLOAD 0000027c: SWAP1 0000027d: DUP2 0000027e: MSTORE 0000027f: PUSH1 0x20 00000281: ADD 00000282: PUSH1 0x40 00000284: MLOAD 00000285: DUP1 00000286: SWAP2 00000287: SUB 00000288: SWAP1 00000289: RETURN 0000028a: JUMPDEST 0000028b: CALLVALUE 0000028c: ISZERO 0000028d: PUSH2 0x0295 00000290: JUMPI 00000291: PUSH1 0x00 00000293: DUP1 00000294: REVERT 00000295: JUMPDEST 00000296: PUSH2 0x029d 00000299: PUSH2 0x09db 0000029c: JUMP 0000029d: JUMPDEST 0000029e: PUSH1 0x40 000002a0: MLOAD 000002a1: PUSH1 0x20 000002a3: DUP1 000002a4: DUP3 000002a5: MSTORE 000002a6: DUP2 000002a7: SWAP1 000002a8: DUP2 000002a9: ADD 000002aa: DUP4 000002ab: DUP2 000002ac: DUP2 000002ad: MLOAD 000002ae: DUP2 000002af: MSTORE 000002b0: PUSH1 0x20 000002b2: ADD 000002b3: SWAP2 000002b4: POP 000002b5: DUP1 000002b6: MLOAD 000002b7: SWAP1 000002b8: PUSH1 0x20 000002ba: ADD 000002bb: SWAP1 000002bc: DUP1 000002bd: DUP4 000002be: DUP4 000002bf: PUSH1 0x00 000002c1: JUMPDEST 000002c2: DUP4 000002c3: DUP2 000002c4: LT 000002c5: ISZERO 000002c6: PUSH2 0x02da 000002c9: JUMPI 000002ca: DUP1 000002cb: DUP3 000002cc: ADD 000002cd: MLOAD 000002ce: DUP2 000002cf: DUP5 000002d0: ADD 000002d1: MSTORE 000002d2: JUMPDEST 000002d3: PUSH1 0x20 000002d5: ADD 000002d6: PUSH2 0x02c1 000002d9: JUMP 000002da: JUMPDEST 000002db: POP 000002dc: POP 000002dd: POP 000002de: POP 000002df: SWAP1 000002e0: POP 000002e1: SWAP1 000002e2: DUP2 000002e3: ADD 000002e4: SWAP1 000002e5: PUSH1 0x1f 000002e7: AND 000002e8: DUP1 000002e9: ISZERO 000002ea: PUSH2 0x0307 000002ed: JUMPI 000002ee: DUP1 000002ef: DUP3 000002f0: SUB 000002f1: DUP1 000002f2: MLOAD 000002f3: PUSH1 0x01 000002f5: DUP4 000002f6: PUSH1 0x20 000002f8: SUB 000002f9: PUSH2 0x0100 000002fc: EXP 000002fd: SUB 000002fe: NOT 000002ff: AND 00000300: DUP2 00000301: MSTORE 00000302: PUSH1 0x20 00000304: ADD 00000305: SWAP2 00000306: POP 00000307: JUMPDEST 00000308: POP 00000309: SWAP3 0000030a: POP 0000030b: POP 0000030c: POP 0000030d: PUSH1 0x40 0000030f: MLOAD 00000310: DUP1 00000311: SWAP2 00000312: SUB 00000313: SWAP1 00000314: RETURN 00000315: JUMPDEST 00000316: CALLVALUE 00000317: ISZERO 00000318: PUSH2 0x0320 0000031b: JUMPI 0000031c: PUSH1 0x00 0000031e: DUP1 0000031f: REVERT 00000320: JUMPDEST 00000321: PUSH2 0x022e 00000324: PUSH1 0x04 00000326: CALLDATALOAD 00000327: PUSH2 0x0a05 0000032a: JUMP 0000032b: JUMPDEST 0000032c: PUSH1 0x40 0000032e: MLOAD 0000032f: SWAP1 00000330: DUP2 00000331: MSTORE 00000332: PUSH1 0x20 00000334: ADD 00000335: PUSH1 0x40 00000337: MLOAD 00000338: DUP1 00000339: SWAP2 0000033a: SUB 0000033b: SWAP1 0000033c: RETURN 0000033d: JUMPDEST 0000033e: CALLVALUE 0000033f: ISZERO 00000340: PUSH2 0x0348 00000343: JUMPI 00000344: PUSH1 0x00 00000346: DUP1 00000347: REVERT 00000348: JUMPDEST 00000349: PUSH2 0x022e 0000034c: PUSH2 0x0a17 0000034f: JUMP 00000350: JUMPDEST 00000351: PUSH1 0x40 00000353: MLOAD 00000354: SWAP1 00000355: DUP2 00000356: MSTORE 00000357: PUSH1 0x20 00000359: ADD 0000035a: PUSH1 0x40 0000035c: MLOAD 0000035d: DUP1 0000035e: SWAP2 0000035f: SUB 00000360: SWAP1 00000361: RETURN 00000362: JUMPDEST 00000363: CALLVALUE 00000364: ISZERO 00000365: PUSH2 0x036d 00000368: JUMPI 00000369: PUSH1 0x00 0000036b: DUP1 0000036c: REVERT 0000036d: JUMPDEST 0000036e: PUSH2 0x022e 00000371: PUSH2 0x0a3d 00000374: JUMP 00000375: JUMPDEST 00000376: PUSH1 0x40 00000378: MLOAD 00000379: SWAP1 0000037a: DUP2 0000037b: MSTORE 0000037c: PUSH1 0x20 0000037e: ADD 0000037f: PUSH1 0x40 00000381: MLOAD 00000382: DUP1 00000383: SWAP2 00000384: SUB 00000385: SWAP1 00000386: RETURN 00000387: JUMPDEST 00000388: CALLVALUE 00000389: ISZERO 0000038a: PUSH2 0x0392 0000038d: JUMPI 0000038e: PUSH1 0x00 00000390: DUP1 00000391: REVERT 00000392: JUMPDEST 00000393: PUSH2 0x022e 00000396: PUSH1 0x01 00000398: PUSH1 0xa0 0000039a: PUSH1 0x02 0000039c: EXP 0000039d: SUB 0000039e: PUSH1 0x04 000003a0: CALLDATALOAD 000003a1: AND 000003a2: PUSH2 0x0a44 000003a5: JUMP 000003a6: JUMPDEST 000003a7: PUSH1 0x40 000003a9: MLOAD 000003aa: SWAP1 000003ab: DUP2 000003ac: MSTORE 000003ad: PUSH1 0x20 000003af: ADD 000003b0: PUSH1 0x40 000003b2: MLOAD 000003b3: DUP1 000003b4: SWAP2 000003b5: SUB 000003b6: SWAP1 000003b7: RETURN 000003b8: JUMPDEST 000003b9: CALLVALUE 000003ba: ISZERO 000003bb: PUSH2 0x03c3 000003be: JUMPI 000003bf: PUSH1 0x00 000003c1: DUP1 000003c2: REVERT 000003c3: JUMPDEST 000003c4: PUSH2 0x03da 000003c7: PUSH1 0x04 000003c9: CALLDATALOAD 000003ca: PUSH1 0x01 000003cc: PUSH1 0xa0 000003ce: PUSH1 0x02 000003d0: EXP 000003d1: SUB 000003d2: PUSH1 0x24 000003d4: CALLDATALOAD 000003d5: AND 000003d6: PUSH2 0x0a63 000003d9: JUMP 000003da: JUMPDEST 000003db: PUSH1 0x40 000003dd: MLOAD 000003de: SWAP1 000003df: ISZERO 000003e0: ISZERO 000003e1: DUP2 000003e2: MSTORE 000003e3: PUSH1 0x20 000003e5: ADD 000003e6: PUSH1 0x40 000003e8: MLOAD 000003e9: DUP1 000003ea: SWAP2 000003eb: SUB 000003ec: SWAP1 000003ed: RETURN 000003ee: JUMPDEST 000003ef: CALLVALUE 000003f0: ISZERO 000003f1: PUSH2 0x03f9 000003f4: JUMPI 000003f5: PUSH1 0x00 000003f7: DUP1 000003f8: REVERT 000003f9: JUMPDEST 000003fa: PUSH2 0x0401 000003fd: PUSH2 0x0ae8 00000400: JUMP 00000401: JUMPDEST 00000402: PUSH1 0x40 00000404: MLOAD 00000405: PUSH1 0x01 00000407: PUSH1 0xa0 00000409: PUSH1 0x02 0000040b: EXP 0000040c: SUB 0000040d: SWAP1 0000040e: SWAP2 0000040f: AND 00000410: DUP2 00000411: MSTORE 00000412: PUSH1 0x20 00000414: ADD 00000415: PUSH1 0x40 00000417: MLOAD 00000418: DUP1 00000419: SWAP2 0000041a: SUB 0000041b: SWAP1 0000041c: RETURN 0000041d: JUMPDEST 0000041e: CALLVALUE 0000041f: ISZERO 00000420: PUSH2 0x0428 00000423: JUMPI 00000424: PUSH1 0x00 00000426: DUP1 00000427: REVERT 00000428: JUMPDEST 00000429: PUSH2 0x0219 0000042c: PUSH2 0x0af7 0000042f: JUMP 00000430: JUMPDEST 00000431: STOP 00000432: JUMPDEST 00000433: CALLVALUE 00000434: ISZERO 00000435: PUSH2 0x043d 00000438: JUMPI 00000439: PUSH1 0x00 0000043b: DUP1 0000043c: REVERT 0000043d: JUMPDEST 0000043e: PUSH2 0x0451 00000441: PUSH1 0x01 00000443: PUSH1 0xa0 00000445: PUSH1 0x02 00000447: EXP 00000448: SUB 00000449: PUSH1 0x04 0000044b: CALLDATALOAD 0000044c: AND 0000044d: PUSH2 0x0dee 00000450: JUMP 00000451: JUMPDEST 00000452: PUSH1 0x40 00000454: MLOAD 00000455: DUP1 00000456: DUP7 00000457: DUP2 00000458: MSTORE 00000459: PUSH1 0x20 0000045b: ADD 0000045c: DUP6 0000045d: DUP2 0000045e: MSTORE 0000045f: PUSH1 0x20 00000461: ADD 00000462: DUP5 00000463: DUP2 00000464: MSTORE 00000465: PUSH1 0x20 00000467: ADD 00000468: DUP4 00000469: DUP2 0000046a: MSTORE 0000046b: PUSH1 0x20 0000046d: ADD 0000046e: DUP3 0000046f: DUP2 00000470: MSTORE 00000471: PUSH1 0x20 00000473: ADD 00000474: SWAP6 00000475: POP 00000476: POP 00000477: POP 00000478: POP 00000479: POP 0000047a: POP 0000047b: PUSH1 0x40 0000047d: MLOAD 0000047e: DUP1 0000047f: SWAP2 00000480: SUB 00000481: SWAP1 00000482: RETURN 00000483: JUMPDEST 00000484: CALLVALUE 00000485: ISZERO 00000486: PUSH2 0x048e 00000489: JUMPI 0000048a: PUSH1 0x00 0000048c: DUP1 0000048d: REVERT 0000048e: JUMPDEST 0000048f: PUSH2 0x04a2 00000492: PUSH1 0x01 00000494: PUSH1 0xa0 00000496: PUSH1 0x02 00000498: EXP 00000499: SUB 0000049a: PUSH1 0x04 0000049c: CALLDATALOAD 0000049d: AND 0000049e: PUSH2 0x0ecd 000004a1: JUMP 000004a2: JUMPDEST 000004a3: PUSH1 0x40 000004a5: MLOAD 000004a6: DUP1 000004a7: DUP5 000004a8: DUP2 000004a9: MSTORE 000004aa: PUSH1 0x20 000004ac: ADD 000004ad: DUP4 000004ae: DUP2 000004af: MSTORE 000004b0: PUSH1 0x20 000004b2: ADD 000004b3: DUP3 000004b4: DUP2 000004b5: MSTORE 000004b6: PUSH1 0x20 000004b8: ADD 000004b9: SWAP4 000004ba: POP 000004bb: POP 000004bc: POP 000004bd: POP 000004be: PUSH1 0x40 000004c0: MLOAD 000004c1: DUP1 000004c2: SWAP2 000004c3: SUB 000004c4: SWAP1 000004c5: RETURN 000004c6: JUMPDEST 000004c7: CALLVALUE 000004c8: ISZERO 000004c9: PUSH2 0x04d1 000004cc: JUMPI 000004cd: PUSH1 0x00 000004cf: DUP1 000004d0: REVERT 000004d1: JUMPDEST 000004d2: PUSH2 0x022e 000004d5: PUSH2 0x0eee 000004d8: JUMP 000004d9: JUMPDEST 000004da: PUSH1 0x40 000004dc: MLOAD 000004dd: SWAP1 000004de: DUP2 000004df: MSTORE 000004e0: PUSH1 0x20 000004e2: ADD 000004e3: PUSH1 0x40 000004e5: MLOAD 000004e6: DUP1 000004e7: SWAP2 000004e8: SUB 000004e9: SWAP1 000004ea: RETURN 000004eb: JUMPDEST 000004ec: CALLVALUE 000004ed: ISZERO 000004ee: PUSH2 0x04f6 000004f1: JUMPI 000004f2: PUSH1 0x00 000004f4: DUP1 000004f5: REVERT 000004f6: JUMPDEST 000004f7: PUSH2 0x022e 000004fa: PUSH2 0x0ef4 000004fd: JUMP 000004fe: JUMPDEST 000004ff: PUSH1 0x40 00000501: MLOAD 00000502: SWAP1 00000503: DUP2 00000504: MSTORE 00000505: PUSH1 0x20 00000507: ADD 00000508: PUSH1 0x40 0000050a: MLOAD 0000050b: DUP1 0000050c: SWAP2 0000050d: SUB 0000050e: SWAP1 0000050f: RETURN 00000510: JUMPDEST 00000511: CALLVALUE 00000512: ISZERO 00000513: PUSH2 0x051b 00000516: JUMPI 00000517: PUSH1 0x00 00000519: DUP1 0000051a: REVERT 0000051b: JUMPDEST 0000051c: PUSH2 0x022e 0000051f: PUSH2 0x0efa 00000522: JUMP 00000523: JUMPDEST 00000524: PUSH1 0x40 00000526: MLOAD 00000527: SWAP1 00000528: DUP2 00000529: MSTORE 0000052a: PUSH1 0x20 0000052c: ADD 0000052d: PUSH1 0x40 0000052f: MLOAD 00000530: DUP1 00000531: SWAP2 00000532: SUB 00000533: SWAP1 00000534: RETURN 00000535: JUMPDEST 00000536: CALLVALUE 00000537: ISZERO 00000538: PUSH2 0x0540 0000053b: JUMPI 0000053c: PUSH1 0x00 0000053e: DUP1 0000053f: REVERT 00000540: JUMPDEST 00000541: PUSH2 0x0401 00000544: PUSH2 0x0eff 00000547: JUMP 00000548: JUMPDEST 00000549: PUSH1 0x40 0000054b: MLOAD 0000054c: PUSH1 0x01 0000054e: PUSH1 0xa0 00000550: PUSH1 0x02 00000552: EXP 00000553: SUB 00000554: SWAP1 00000555: SWAP2 00000556: AND 00000557: DUP2 00000558: MSTORE 00000559: PUSH1 0x20 0000055b: ADD 0000055c: PUSH1 0x40 0000055e: MLOAD 0000055f: DUP1 00000560: SWAP2 00000561: SUB 00000562: SWAP1 00000563: RETURN 00000564: JUMPDEST 00000565: CALLVALUE 00000566: ISZERO 00000567: PUSH2 0x056f 0000056a: JUMPI 0000056b: PUSH1 0x00 0000056d: DUP1 0000056e: REVERT 0000056f: JUMPDEST 00000570: PUSH2 0x0219 00000573: PUSH2 0x0f18 00000576: JUMP 00000577: JUMPDEST 00000578: STOP 00000579: JUMPDEST 0000057a: CALLVALUE 0000057b: ISZERO 0000057c: PUSH2 0x0584 0000057f: JUMPI 00000580: PUSH1 0x00 00000582: DUP1 00000583: REVERT 00000584: JUMPDEST 00000585: PUSH2 0x022e 00000588: PUSH2 0x0f61 0000058b: JUMP 0000058c: JUMPDEST 0000058d: PUSH1 0x40 0000058f: MLOAD 00000590: SWAP1 00000591: DUP2 00000592: MSTORE 00000593: PUSH1 0x20 00000595: ADD 00000596: PUSH1 0x40 00000598: MLOAD 00000599: DUP1 0000059a: SWAP2 0000059b: SUB 0000059c: SWAP1 0000059d: RETURN 0000059e: JUMPDEST 0000059f: CALLVALUE 000005a0: ISZERO 000005a1: PUSH2 0x05a9 000005a4: JUMPI 000005a5: PUSH1 0x00 000005a7: DUP1 000005a8: REVERT 000005a9: JUMPDEST 000005aa: PUSH2 0x03da 000005ad: PUSH1 0x04 000005af: CALLDATALOAD 000005b0: PUSH2 0x0f67 000005b3: JUMP 000005b4: JUMPDEST 000005b5: PUSH1 0x40 000005b7: MLOAD 000005b8: SWAP1 000005b9: ISZERO 000005ba: ISZERO 000005bb: DUP2 000005bc: MSTORE 000005bd: PUSH1 0x20 000005bf: ADD 000005c0: PUSH1 0x40 000005c2: MLOAD 000005c3: DUP1 000005c4: SWAP2 000005c5: SUB 000005c6: SWAP1 000005c7: RETURN 000005c8: JUMPDEST 000005c9: CALLVALUE 000005ca: ISZERO 000005cb: PUSH2 0x05d3 000005ce: JUMPI 000005cf: PUSH1 0x00 000005d1: DUP1 000005d2: REVERT 000005d3: JUMPDEST 000005d4: PUSH2 0x03da 000005d7: PUSH1 0x04 000005d9: CALLDATALOAD 000005da: PUSH1 0x01 000005dc: PUSH1 0xa0 000005de: PUSH1 0x02 000005e0: EXP 000005e1: SUB 000005e2: PUSH1 0x24 000005e4: CALLDATALOAD 000005e5: AND 000005e6: PUSH2 0x0fdc 000005e9: JUMP 000005ea: JUMPDEST 000005eb: PUSH1 0x40 000005ed: MLOAD 000005ee: SWAP1 000005ef: ISZERO 000005f0: ISZERO 000005f1: DUP2 000005f2: MSTORE 000005f3: PUSH1 0x20 000005f5: ADD 000005f6: PUSH1 0x40 000005f8: MLOAD 000005f9: DUP1 000005fa: SWAP2 000005fb: SUB 000005fc: SWAP1 000005fd: RETURN 000005fe: JUMPDEST 000005ff: CALLVALUE 00000600: ISZERO 00000601: PUSH2 0x0609 00000604: JUMPI 00000605: PUSH1 0x00 00000607: DUP1 00000608: REVERT 00000609: JUMPDEST 0000060a: PUSH2 0x022e 0000060d: PUSH2 0x1223 00000610: JUMP 00000611: JUMPDEST 00000612: PUSH1 0x40 00000614: MLOAD 00000615: SWAP1 00000616: DUP2 00000617: MSTORE 00000618: PUSH1 0x20 0000061a: ADD 0000061b: PUSH1 0x40 0000061d: MLOAD 0000061e: DUP1 0000061f: SWAP2 00000620: SUB 00000621: SWAP1 00000622: RETURN 00000623: JUMPDEST 00000624: CALLVALUE 00000625: ISZERO 00000626: PUSH2 0x062e 00000629: JUMPI 0000062a: PUSH1 0x00 0000062c: DUP1 0000062d: REVERT 0000062e: JUMPDEST 0000062f: PUSH2 0x0219 00000632: PUSH1 0xff 00000634: PUSH1 0x04 00000636: CALLDATALOAD 00000637: AND 00000638: PUSH2 0x1229 0000063b: JUMP 0000063c: JUMPDEST 0000063d: STOP 0000063e: JUMPDEST 0000063f: CALLVALUE 00000640: ISZERO 00000641: PUSH2 0x0649 00000644: JUMPI 00000645: PUSH1 0x00 00000647: DUP1 00000648: REVERT 00000649: JUMPDEST 0000064a: PUSH2 0x022e 0000064d: PUSH2 0x129d 00000650: JUMP 00000651: JUMPDEST 00000652: PUSH1 0x40 00000654: MLOAD 00000655: SWAP1 00000656: DUP2 00000657: MSTORE 00000658: PUSH1 0x20 0000065a: ADD 0000065b: PUSH1 0x40 0000065d: MLOAD 0000065e: DUP1 0000065f: SWAP2 00000660: SUB 00000661: SWAP1 00000662: RETURN 00000663: JUMPDEST 00000664: CALLVALUE 00000665: ISZERO 00000666: PUSH2 0x066e 00000669: JUMPI 0000066a: PUSH1 0x00 0000066c: DUP1 0000066d: REVERT 0000066e: JUMPDEST 0000066f: PUSH2 0x0401 00000672: PUSH1 0x04 00000674: CALLDATALOAD 00000675: PUSH2 0x12a3 00000678: JUMP 00000679: JUMPDEST 0000067a: PUSH1 0x40 0000067c: MLOAD 0000067d: PUSH1 0x01 0000067f: PUSH1 0xa0 00000681: PUSH1 0x02 00000683: EXP 00000684: SUB 00000685: SWAP1 00000686: SWAP2 00000687: AND 00000688: DUP2 00000689: MSTORE 0000068a: PUSH1 0x20 0000068c: ADD 0000068d: PUSH1 0x40 0000068f: MLOAD 00000690: DUP1 00000691: SWAP2 00000692: SUB 00000693: SWAP1 00000694: RETURN 00000695: JUMPDEST 00000696: CALLVALUE 00000697: ISZERO 00000698: PUSH2 0x06a0 0000069b: JUMPI 0000069c: PUSH1 0x00 0000069e: DUP1 0000069f: REVERT 000006a0: JUMPDEST 000006a1: PUSH2 0x0219 000006a4: PUSH1 0x01 000006a6: PUSH1 0xa0 000006a8: PUSH1 0x02 000006aa: EXP 000006ab: SUB 000006ac: PUSH1 0x04 000006ae: CALLDATALOAD 000006af: AND 000006b0: PUSH2 0x12cb 000006b3: JUMP 000006b4: JUMPDEST 000006b5: STOP 000006b6: JUMPDEST 000006b7: CALLVALUE 000006b8: ISZERO 000006b9: PUSH2 0x06c1 000006bc: JUMPI 000006bd: PUSH1 0x00 000006bf: DUP1 000006c0: REVERT 000006c1: JUMPDEST 000006c2: PUSH2 0x022e 000006c5: PUSH1 0x04 000006c7: CALLDATALOAD 000006c8: PUSH2 0x1316 000006cb: JUMP 000006cc: JUMPDEST 000006cd: PUSH1 0x40 000006cf: MLOAD 000006d0: SWAP1 000006d1: DUP2 000006d2: MSTORE 000006d3: PUSH1 0x20 000006d5: ADD 000006d6: PUSH1 0x40 000006d8: MLOAD 000006d9: DUP1 000006da: SWAP2 000006db: SUB 000006dc: SWAP1 000006dd: RETURN 000006de: JUMPDEST 000006df: PUSH1 0x03 000006e1: SLOAD 000006e2: PUSH1 0x07 000006e4: SLOAD 000006e5: PUSH1 0x00 000006e7: SWAP2 000006e8: SWAP1 000006e9: PUSH3 0x989680 000006ed: SWAP1 000006ee: PUSH1 0x01 000006f0: PUSH1 0xa0 000006f2: PUSH1 0x02 000006f4: EXP 000006f5: SUB 000006f6: AND 000006f7: PUSH4 0xb0c2a163 000006fc: DUP5 000006fd: PUSH1 0x40 000006ff: MLOAD 00000700: PUSH1 0x20 00000702: ADD 00000703: MSTORE 00000704: PUSH1 0x40 00000706: MLOAD 00000707: DUP2 00000708: PUSH4 0xffffffff 0000070d: AND 0000070e: PUSH1 0xe0 00000710: PUSH1 0x02 00000712: EXP 00000713: MUL 00000714: DUP2 00000715: MSTORE 00000716: PUSH1 0x04 00000718: ADD 00000719: PUSH1 0x20 0000071b: PUSH1 0x40 0000071d: MLOAD 0000071e: DUP1 0000071f: DUP4 00000720: SUB 00000721: DUP2 00000722: PUSH1 0x00 00000724: DUP8 00000725: DUP1 00000726: EXTCODESIZE 00000727: ISZERO 00000728: ISZERO 00000729: PUSH2 0x0731 0000072c: JUMPI 0000072d: PUSH1 0x00 0000072f: DUP1 00000730: REVERT 00000731: JUMPDEST 00000732: PUSH2 0x02c6 00000735: GAS 00000736: SUB 00000737: CALL 00000738: ISZERO 00000739: ISZERO 0000073a: PUSH2 0x0742 0000073d: JUMPI 0000073e: PUSH1 0x00 00000740: DUP1 00000741: REVERT 00000742: JUMPDEST 00000743: POP 00000744: POP 00000745: POP 00000746: PUSH1 0x40 00000748: MLOAD 00000749: DUP1 0000074a: MLOAD 0000074b: SWAP1 0000074c: POP 0000074d: DUP2 0000074e: ISZERO 0000074f: ISZERO 00000750: PUSH2 0x0755 00000753: JUMPI 00000754: INVALID 00000755: JUMPDEST 00000756: DIV 00000757: MUL 00000758: SWAP1 00000759: POP 0000075a: JUMPDEST 0000075b: SWAP1 0000075c: JUMP 0000075d: JUMPDEST 0000075e: PUSH1 0x01 00000760: PUSH1 0xa0 00000762: PUSH1 0x02 00000764: EXP 00000765: SUB 00000766: CALLER 00000767: AND 00000768: PUSH1 0x00 0000076a: SWAP1 0000076b: DUP2 0000076c: MSTORE 0000076d: PUSH1 0x0a 0000076f: PUSH1 0x20 00000771: MSTORE 00000772: PUSH1 0x40 00000774: DUP2 00000775: KECCAK256 00000776: SLOAD 00000777: SWAP1 00000778: DUP1 00000779: DUP1 0000077a: DUP4 0000077b: GT 0000077c: ISZERO 0000077d: PUSH2 0x0214 00000780: JUMPI 00000781: PUSH1 0x01 00000783: SLOAD 00000784: PUSH1 0x64 00000786: DUP5 00000787: JUMPDEST 00000788: DIV 00000789: MUL 0000078a: SWAP2 0000078b: POP 0000078c: POP 0000078d: DUP1 0000078e: DUP3 0000078f: SUB 00000790: PUSH1 0x00 00000792: DUP3 00000793: GT 00000794: ISZERO 00000795: PUSH2 0x081c 00000798: JUMPI 00000799: PUSH1 0x07 0000079b: SLOAD 0000079c: PUSH1 0x00 0000079e: DUP1 0000079f: SLOAD 000007a0: PUSH1 0x01 000007a2: PUSH1 0xa0 000007a4: PUSH1 0x02 000007a6: EXP 000007a7: SUB 000007a8: SWAP3 000007a9: DUP4 000007aa: AND 000007ab: SWAP3 000007ac: PUSH4 0xa9059cbb 000007b1: SWAP3 000007b2: SWAP2 000007b3: AND 000007b4: SWAP1 000007b5: DUP6 000007b6: SWAP1 000007b7: PUSH1 0x40 000007b9: MLOAD 000007ba: PUSH1 0x20 000007bc: ADD 000007bd: MSTORE 000007be: PUSH1 0x40 000007c0: MLOAD 000007c1: PUSH1 0xe0 000007c3: PUSH1 0x02 000007c5: EXP 000007c6: PUSH4 0xffffffff 000007cb: DUP6 000007cc: AND 000007cd: MUL 000007ce: DUP2 000007cf: MSTORE 000007d0: PUSH1 0x01 000007d2: PUSH1 0xa0 000007d4: PUSH1 0x02 000007d6: EXP 000007d7: SUB 000007d8: SWAP1 000007d9: SWAP3 000007da: AND 000007db: PUSH1 0x04 000007dd: DUP4 000007de: ADD 000007df: MSTORE 000007e0: PUSH1 0x24 000007e2: DUP3 000007e3: ADD 000007e4: MSTORE 000007e5: PUSH1 0x44 000007e7: ADD 000007e8: PUSH1 0x20 000007ea: PUSH1 0x40 000007ec: MLOAD 000007ed: DUP1 000007ee: DUP4 000007ef: SUB 000007f0: DUP2 000007f1: PUSH1 0x00 000007f3: DUP8 000007f4: DUP1 000007f5: EXTCODESIZE 000007f6: ISZERO 000007f7: ISZERO 000007f8: PUSH2 0x0800 000007fb: JUMPI 000007fc: PUSH1 0x00 000007fe: DUP1 000007ff: REVERT 00000800: JUMPDEST 00000801: PUSH2 0x02c6 00000804: GAS 00000805: SUB 00000806: CALL 00000807: ISZERO 00000808: ISZERO 00000809: PUSH2 0x0811 0000080c: JUMPI 0000080d: PUSH1 0x00 0000080f: DUP1 00000810: REVERT 00000811: JUMPDEST 00000812: POP 00000813: POP 00000814: POP 00000815: PUSH1 0x40 00000817: MLOAD 00000818: DUP1 00000819: MLOAD 0000081a: POP 0000081b: POP 0000081c: JUMPDEST 0000081d: PUSH1 0x07 0000081f: SLOAD 00000820: PUSH1 0x01 00000822: PUSH1 0xa0 00000824: PUSH1 0x02 00000826: EXP 00000827: SUB 00000828: AND 00000829: PUSH4 0xa9059cbb 0000082e: CALLER 0000082f: DUP4 00000830: PUSH1 0x00 00000832: PUSH1 0x40 00000834: MLOAD 00000835: PUSH1 0x20 00000837: ADD 00000838: MSTORE 00000839: PUSH1 0x40 0000083b: MLOAD 0000083c: PUSH1 0xe0 0000083e: PUSH1 0x02 00000840: EXP 00000841: PUSH4 0xffffffff 00000846: DUP6 00000847: AND 00000848: MUL 00000849: DUP2 0000084a: MSTORE 0000084b: PUSH1 0x01 0000084d: PUSH1 0xa0 0000084f: PUSH1 0x02 00000851: EXP 00000852: SUB 00000853: SWAP1 00000854: SWAP3 00000855: AND 00000856: PUSH1 0x04 00000858: DUP4 00000859: ADD 0000085a: MSTORE 0000085b: PUSH1 0x24 0000085d: DUP3 0000085e: ADD 0000085f: MSTORE 00000860: PUSH1 0x44 00000862: ADD 00000863: PUSH1 0x20 00000865: PUSH1 0x40 00000867: MLOAD 00000868: DUP1 00000869: DUP4 0000086a: SUB 0000086b: DUP2 0000086c: PUSH1 0x00 0000086e: DUP8 0000086f: DUP1 00000870: EXTCODESIZE 00000871: ISZERO 00000872: ISZERO 00000873: PUSH2 0x087b 00000876: JUMPI 00000877: PUSH1 0x00 00000879: DUP1 0000087a: REVERT 0000087b: JUMPDEST 0000087c: PUSH2 0x02c6 0000087f: GAS 00000880: SUB 00000881: CALL 00000882: ISZERO 00000883: ISZERO 00000884: PUSH2 0x088c 00000887: JUMPI 00000888: PUSH1 0x00 0000088a: DUP1 0000088b: REVERT 0000088c: JUMPDEST 0000088d: POP 0000088e: POP 0000088f: POP 00000890: PUSH1 0x40 00000892: MLOAD 00000893: DUP1 00000894: MLOAD 00000895: POP 00000896: POP 00000897: PUSH1 0x01 00000899: PUSH1 0xa0 0000089b: PUSH1 0x02 0000089d: EXP 0000089e: SUB 0000089f: CALLER 000008a0: AND 000008a1: PUSH1 0x00 000008a3: SWAP1 000008a4: DUP2 000008a5: MSTORE 000008a6: PUSH1 0x0a 000008a8: PUSH1 0x20 000008aa: MSTORE 000008ab: PUSH1 0x40 000008ad: DUP2 000008ae: KECCAK256 000008af: SSTORE 000008b0: JUMPDEST 000008b1: JUMPDEST 000008b2: POP 000008b3: POP 000008b4: POP 000008b5: JUMP 000008b6: JUMPDEST 000008b7: PUSH1 0x00 000008b9: PUSH1 0x64 000008bb: PUSH1 0x02 000008bd: SLOAD 000008be: LT 000008bf: ISZERO 000008c0: PUSH2 0x0912 000008c3: JUMPI 000008c4: DUP2 000008c5: PUSH1 0x0c 000008c7: PUSH1 0x02 000008c9: SLOAD 000008ca: PUSH2 0x0100 000008cd: DUP2 000008ce: LT 000008cf: ISZERO 000008d0: ISZERO 000008d1: PUSH2 0x08d6 000008d4: JUMPI 000008d5: INVALID 000008d6: JUMPDEST 000008d7: ADD 000008d8: PUSH1 0x00 000008da: JUMPDEST 000008db: PUSH2 0x0100 000008de: EXP 000008df: DUP2 000008e0: SLOAD 000008e1: DUP2 000008e2: PUSH1 0x01 000008e4: PUSH1 0xa0 000008e6: PUSH1 0x02 000008e8: EXP 000008e9: SUB 000008ea: MUL 000008eb: NOT 000008ec: AND 000008ed: SWAP1 000008ee: DUP4 000008ef: PUSH1 0x01 000008f1: PUSH1 0xa0 000008f3: PUSH1 0x02 000008f5: EXP 000008f6: SUB 000008f7: AND 000008f8: MUL 000008f9: OR 000008fa: SWAP1 000008fb: SSTORE 000008fc: POP 000008fd: PUSH1 0x01 000008ff: PUSH1 0x02 00000901: PUSH1 0x00 00000903: DUP3 00000904: DUP3 00000905: SLOAD 00000906: ADD 00000907: SWAP3 00000908: POP 00000909: POP 0000090a: DUP2 0000090b: SWAP1 0000090c: SSTORE 0000090d: POP 0000090e: PUSH2 0x09ca 00000911: JUMP 00000912: JUMPDEST 00000913: PUSH1 0x0b 00000915: SLOAD 00000916: ISZERO 00000917: ISZERO 00000918: PUSH2 0x0920 0000091b: JUMPI 0000091c: PUSH1 0x00 0000091e: DUP1 0000091f: REVERT 00000920: JUMPDEST 00000921: PUSH1 0x0b 00000923: DUP1 00000924: SLOAD 00000925: PUSH1 0x00 00000927: NOT 00000928: DUP2 00000929: ADD 0000092a: SWAP1 0000092b: DUP2 0000092c: LT 0000092d: PUSH2 0x0932 00000930: JUMPI 00000931: INVALID 00000932: JUMPDEST 00000933: SWAP1 00000934: PUSH1 0x00 00000936: MSTORE 00000937: PUSH1 0x20 00000939: PUSH1 0x00 0000093b: KECCAK256 0000093c: SWAP1 0000093d: PUSH1 0x20 0000093f: SWAP2 00000940: DUP3 00000941: DUP3 00000942: DIV 00000943: ADD 00000944: SWAP2 00000945: SWAP1 00000946: MOD 00000947: JUMPDEST 00000948: SWAP1 00000949: SLOAD 0000094a: SWAP1 0000094b: PUSH2 0x0100 0000094e: EXP 0000094f: SWAP1 00000950: DIV 00000951: PUSH1 0xff 00000953: AND 00000954: SWAP1 00000955: POP 00000956: DUP2 00000957: PUSH1 0x0c 00000959: DUP3 0000095a: PUSH1 0xff 0000095c: AND 0000095d: PUSH2 0x0100 00000960: DUP2 00000961: LT 00000962: ISZERO 00000963: ISZERO 00000964: PUSH2 0x0969 00000967: JUMPI 00000968: INVALID 00000969: JUMPDEST 0000096a: ADD 0000096b: PUSH1 0x00 0000096d: JUMPDEST 0000096e: PUSH2 0x0100 00000971: EXP 00000972: DUP2 00000973: SLOAD 00000974: DUP2 00000975: PUSH1 0x01 00000977: PUSH1 0xa0 00000979: PUSH1 0x02 0000097b: EXP 0000097c: SUB 0000097d: MUL 0000097e: NOT 0000097f: AND 00000980: SWAP1 00000981: DUP4 00000982: PUSH1 0x01 00000984: PUSH1 0xa0 00000986: PUSH1 0x02 00000988: EXP 00000989: SUB 0000098a: AND 0000098b: MUL 0000098c: OR 0000098d: SWAP1 0000098e: SSTORE 0000098f: POP 00000990: PUSH1 0x0b 00000992: PUSH1 0x01 00000994: PUSH1 0x0b 00000996: DUP1 00000997: SLOAD 00000998: SWAP1 00000999: POP 0000099a: SUB 0000099b: DUP2 0000099c: SLOAD 0000099d: DUP2 0000099e: LT 0000099f: ISZERO 000009a0: ISZERO 000009a1: PUSH2 0x09a6 000009a4: JUMPI 000009a5: INVALID 000009a6: JUMPDEST 000009a7: SWAP1 000009a8: PUSH1 0x00 000009aa: MSTORE 000009ab: PUSH1 0x20 000009ad: PUSH1 0x00 000009af: KECCAK256 000009b0: SWAP1 000009b1: PUSH1 0x20 000009b3: SWAP2 000009b4: DUP3 000009b5: DUP3 000009b6: DIV 000009b7: ADD 000009b8: SWAP2 000009b9: SWAP1 000009ba: MOD 000009bb: JUMPDEST 000009bc: PUSH2 0x0100 000009bf: EXP 000009c0: DUP2 000009c1: SLOAD 000009c2: SWAP1 000009c3: PUSH1 0xff 000009c5: MUL 000009c6: NOT 000009c7: AND 000009c8: SWAP1 000009c9: SSTORE 000009ca: JUMPDEST 000009cb: JUMPDEST 000009cc: JUMPDEST 000009cd: POP 000009ce: POP 000009cf: JUMP 000009d0: JUMPDEST 000009d1: NUMBER 000009d2: JUMPDEST 000009d3: SWAP1 000009d4: JUMP 000009d5: JUMPDEST 000009d6: PUSH1 0x05 000009d8: SLOAD 000009d9: DUP2 000009da: JUMP 000009db: JUMPDEST 000009dc: PUSH1 0x40 000009de: DUP1 000009df: MLOAD 000009e0: SWAP1 000009e1: DUP2 000009e2: ADD 000009e3: PUSH1 0x40 000009e5: MSTORE 000009e6: PUSH1 0x0d 000009e8: DUP2 000009e9: MSTORE 000009ea: PUSH1 0x9c 000009ec: PUSH1 0x02 000009ee: EXP 000009ef: PUSH13 0x0536861726b506f6f6c2031303 000009fd: MUL 000009fe: PUSH1 0x20 00000a00: DUP3 00000a01: ADD 00000a02: MSTORE 00000a03: DUP2 00000a04: JUMP 00000a05: JUMPDEST 00000a06: PUSH1 0x09 00000a08: PUSH1 0x20 00000a0a: MSTORE 00000a0b: PUSH1 0x00 00000a0d: SWAP1 00000a0e: DUP2 00000a0f: MSTORE 00000a10: PUSH1 0x40 00000a12: SWAP1 00000a13: KECCAK256 00000a14: SLOAD 00000a15: DUP2 00000a16: JUMP 00000a17: JUMPDEST 00000a18: PUSH1 0x00 00000a1a: PUSH1 0x64 00000a1c: PUSH1 0x02 00000a1e: SLOAD 00000a1f: LT 00000a20: ISZERO 00000a21: PUSH2 0x0a30 00000a24: JUMPI 00000a25: POP 00000a26: PUSH1 0x02 00000a28: SLOAD 00000a29: PUSH1 0x64 00000a2b: SUB 00000a2c: PUSH2 0x075a 00000a2f: JUMP 00000a30: JUMPDEST 00000a31: POP 00000a32: PUSH1 0x0b 00000a34: SLOAD 00000a35: PUSH2 0x075a 00000a38: JUMP 00000a39: JUMPDEST 00000a3a: JUMPDEST 00000a3b: SWAP1 00000a3c: JUMP 00000a3d: JUMPDEST 00000a3e: PUSH3 0x989680 00000a42: DUP2 00000a43: JUMP 00000a44: JUMPDEST 00000a45: PUSH1 0x01 00000a47: PUSH1 0xa0 00000a49: PUSH1 0x02 00000a4b: EXP 00000a4c: SUB 00000a4d: DUP2 00000a4e: AND 00000a4f: PUSH1 0x00 00000a51: SWAP1 00000a52: DUP2 00000a53: MSTORE 00000a54: PUSH1 0x0a 00000a56: PUSH1 0x20 00000a58: MSTORE 00000a59: PUSH1 0x40 00000a5b: SWAP1 00000a5c: KECCAK256 00000a5d: SLOAD 00000a5e: JUMPDEST 00000a5f: SWAP2 00000a60: SWAP1 00000a61: POP 00000a62: JUMP 00000a63: JUMPDEST 00000a64: PUSH1 0x07 00000a66: SLOAD 00000a67: PUSH1 0x00 00000a69: SWAP1 00000a6a: PUSH1 0x01 00000a6c: PUSH1 0xa0 00000a6e: PUSH1 0x02 00000a70: EXP 00000a71: SUB 00000a72: AND 00000a73: PUSH4 0x88537daf 00000a78: DUP5 00000a79: DUP5 00000a7a: DUP5 00000a7b: PUSH1 0x40 00000a7d: MLOAD 00000a7e: PUSH1 0x20 00000a80: ADD 00000a81: MSTORE 00000a82: PUSH1 0x40 00000a84: MLOAD 00000a85: PUSH1 0xe0 00000a87: PUSH1 0x02 00000a89: EXP 00000a8a: PUSH4 0xffffffff 00000a8f: DUP6 00000a90: AND 00000a91: MUL 00000a92: DUP2 00000a93: MSTORE 00000a94: PUSH1 0x04 00000a96: DUP2 00000a97: ADD 00000a98: SWAP3 00000a99: SWAP1 00000a9a: SWAP3 00000a9b: MSTORE 00000a9c: PUSH1 0x01 00000a9e: PUSH1 0xa0 00000aa0: PUSH1 0x02 00000aa2: EXP 00000aa3: SUB 00000aa4: AND 00000aa5: PUSH1 0x24 00000aa7: DUP3 00000aa8: ADD 00000aa9: MSTORE 00000aaa: PUSH1 0x44 00000aac: ADD 00000aad: PUSH1 0x20 00000aaf: PUSH1 0x40 00000ab1: MLOAD 00000ab2: DUP1 00000ab3: DUP4 00000ab4: SUB 00000ab5: DUP2 00000ab6: PUSH1 0x00 00000ab8: DUP8 00000ab9: DUP1 00000aba: EXTCODESIZE 00000abb: ISZERO 00000abc: ISZERO 00000abd: PUSH2 0x0ac5 00000ac0: JUMPI 00000ac1: PUSH1 0x00 00000ac3: DUP1 00000ac4: REVERT 00000ac5: JUMPDEST 00000ac6: PUSH2 0x02c6 00000ac9: GAS 00000aca: SUB 00000acb: CALL 00000acc: ISZERO 00000acd: ISZERO 00000ace: PUSH2 0x0ad6 00000ad1: JUMPI 00000ad2: PUSH1 0x00 00000ad4: DUP1 00000ad5: REVERT 00000ad6: JUMPDEST 00000ad7: POP 00000ad8: POP 00000ad9: POP 00000ada: PUSH1 0x40 00000adc: MLOAD 00000add: DUP1 00000ade: MLOAD 00000adf: SWAP2 00000ae0: POP 00000ae1: POP 00000ae2: JUMPDEST 00000ae3: SWAP3 00000ae4: SWAP2 00000ae5: POP 00000ae6: POP 00000ae7: JUMP 00000ae8: JUMPDEST 00000ae9: PUSH1 0x00 00000aeb: SLOAD 00000aec: PUSH1 0x01 00000aee: PUSH1 0xa0 00000af0: PUSH1 0x02 00000af2: EXP 00000af3: SUB 00000af4: AND 00000af5: DUP2 00000af6: JUMP 00000af7: JUMPDEST 00000af8: PUSH1 0x00 00000afa: DUP1 00000afb: PUSH1 0x00 00000afd: DUP1 00000afe: PUSH1 0x00 00000b00: PUSH2 0x0b07 00000b03: PUSH2 0x140b 00000b06: JUMP 00000b07: JUMPDEST 00000b08: PUSH1 0x00 00000b0a: SLOAD 00000b0b: PUSH1 0xa0 00000b0d: PUSH1 0x02 00000b0f: EXP 00000b10: SWAP1 00000b11: DIV 00000b12: PUSH1 0xff 00000b14: AND 00000b15: ISZERO 00000b16: PUSH2 0x0b1e 00000b19: JUMPI 00000b1a: PUSH1 0x00 00000b1c: DUP1 00000b1d: REVERT 00000b1e: JUMPDEST 00000b1f: PUSH1 0x00 00000b21: DUP1 00000b22: SLOAD 00000b23: PUSH1 0xa0 00000b25: PUSH1 0x02 00000b27: EXP 00000b28: PUSH1 0xff 00000b2a: MUL 00000b2b: NOT 00000b2c: AND 00000b2d: PUSH1 0xa0 00000b2f: PUSH1 0x02 00000b31: EXP 00000b32: OR 00000b33: SWAP1 00000b34: SSTORE 00000b35: PUSH2 0x0b44 00000b38: PUSH2 0x0b3f 00000b3b: PUSH2 0x09d0 00000b3e: JUMP 00000b3f: JUMPDEST 00000b40: PUSH2 0x1316 00000b43: JUMP 00000b44: JUMPDEST 00000b45: PUSH1 0x07 00000b47: SLOAD 00000b48: SWAP1 00000b49: SWAP7 00000b4a: POP 00000b4b: PUSH1 0x01 00000b4d: PUSH1 0xa0 00000b4f: PUSH1 0x02 00000b51: EXP 00000b52: SUB 00000b53: AND 00000b54: PUSH4 0x88537daf 00000b59: DUP8 00000b5a: ADDRESS 00000b5b: PUSH1 0x00 00000b5d: PUSH1 0x40 00000b5f: MLOAD 00000b60: PUSH1 0x20 00000b62: ADD 00000b63: MSTORE 00000b64: PUSH1 0x40 00000b66: MLOAD 00000b67: PUSH1 0xe0 00000b69: PUSH1 0x02 00000b6b: EXP 00000b6c: PUSH4 0xffffffff 00000b71: DUP6 00000b72: AND 00000b73: MUL 00000b74: DUP2 00000b75: MSTORE 00000b76: PUSH1 0x04 00000b78: DUP2 00000b79: ADD 00000b7a: SWAP3 00000b7b: SWAP1 00000b7c: SWAP3 00000b7d: MSTORE 00000b7e: PUSH1 0x01 00000b80: PUSH1 0xa0 00000b82: PUSH1 0x02 00000b84: EXP 00000b85: SUB 00000b86: AND 00000b87: PUSH1 0x24 00000b89: DUP3 00000b8a: ADD 00000b8b: MSTORE 00000b8c: PUSH1 0x44 00000b8e: ADD 00000b8f: PUSH1 0x20 00000b91: PUSH1 0x40 00000b93: MLOAD 00000b94: DUP1 00000b95: DUP4 00000b96: SUB 00000b97: DUP2 00000b98: PUSH1 0x00 00000b9a: DUP8 00000b9b: DUP1 00000b9c: EXTCODESIZE 00000b9d: ISZERO 00000b9e: ISZERO 00000b9f: PUSH2 0x0ba7 00000ba2: JUMPI 00000ba3: PUSH1 0x00 00000ba5: DUP1 00000ba6: REVERT 00000ba7: JUMPDEST 00000ba8: PUSH2 0x02c6 00000bab: GAS 00000bac: SUB 00000bad: CALL 00000bae: ISZERO 00000baf: ISZERO 00000bb0: PUSH2 0x0bb8 00000bb3: JUMPI 00000bb4: PUSH1 0x00 00000bb6: DUP1 00000bb7: REVERT 00000bb8: JUMPDEST 00000bb9: POP 00000bba: POP 00000bbb: POP 00000bbc: PUSH1 0x40 00000bbe: MLOAD 00000bbf: DUP1 00000bc0: MLOAD 00000bc1: ISZERO 00000bc2: SWAP1 00000bc3: POP 00000bc4: PUSH2 0x0bcc 00000bc7: JUMPI 00000bc8: PUSH1 0x00 00000bca: DUP1 00000bcb: REVERT 00000bcc: JUMPDEST 00000bcd: PUSH1 0x00 00000bcf: SWAP5 00000bd0: POP 00000bd1: PUSH1 0x00 00000bd3: SWAP4 00000bd4: POP 00000bd5: PUSH1 0x00 00000bd7: SWAP3 00000bd8: POP 00000bd9: JUMPDEST 00000bda: PUSH1 0x02 00000bdc: SLOAD 00000bdd: DUP4 00000bde: PUSH1 0xff 00000be0: AND 00000be1: LT 00000be2: ISZERO 00000be3: PUSH2 0x0d59 00000be6: JUMPI 00000be7: PUSH1 0x0c 00000be9: PUSH1 0xff 00000beb: DUP5 00000bec: AND 00000bed: PUSH2 0x0100 00000bf0: DUP2 00000bf1: LT 00000bf2: PUSH2 0x0bf7 00000bf5: JUMPI 00000bf6: INVALID 00000bf7: JUMPDEST 00000bf8: ADD 00000bf9: PUSH1 0x00 00000bfb: JUMPDEST 00000bfc: SWAP1 00000bfd: SLOAD 00000bfe: SWAP1 00000bff: PUSH2 0x0100 00000c02: EXP 00000c03: SWAP1 00000c04: DIV 00000c05: PUSH1 0x01 00000c07: PUSH1 0xa0 00000c09: PUSH1 0x02 00000c0b: EXP 00000c0c: SUB 00000c0d: AND 00000c0e: SWAP2 00000c0f: POP 00000c10: PUSH1 0x00 00000c12: DUP3 00000c13: PUSH1 0x01 00000c15: PUSH1 0xa0 00000c17: PUSH1 0x02 00000c19: EXP 00000c1a: SUB 00000c1b: AND 00000c1c: GT 00000c1d: ISZERO 00000c1e: PUSH2 0x0d4c 00000c21: JUMPI 00000c22: PUSH1 0x01 00000c24: PUSH1 0xa0 00000c26: PUSH1 0x02 00000c28: EXP 00000c29: SUB 00000c2a: DUP3 00000c2b: AND 00000c2c: PUSH1 0x00 00000c2e: SWAP1 00000c2f: DUP2 00000c30: MSTORE 00000c31: PUSH1 0x08 00000c33: PUSH1 0x20 00000c35: MSTORE 00000c36: PUSH1 0x40 00000c38: SWAP1 00000c39: DUP2 00000c3a: SWAP1 00000c3b: KECCAK256 00000c3c: SWAP1 00000c3d: PUSH1 0x60 00000c3f: SWAP1 00000c40: MLOAD 00000c41: SWAP1 00000c42: DUP2 00000c43: ADD 00000c44: PUSH1 0x40 00000c46: SWAP1 00000c47: DUP2 00000c48: MSTORE 00000c49: DUP3 00000c4a: SLOAD 00000c4b: DUP3 00000c4c: MSTORE 00000c4d: PUSH1 0x01 00000c4f: DUP4 00000c50: ADD 00000c51: SLOAD 00000c52: PUSH1 0x20 00000c54: DUP4 00000c55: ADD 00000c56: SWAP1 00000c57: DUP2 00000c58: MSTORE 00000c59: PUSH1 0x02 00000c5b: SWAP1 00000c5c: SWAP4 00000c5d: ADD 00000c5e: SLOAD 00000c5f: SWAP1 00000c60: DUP3 00000c61: ADD 00000c62: MSTORE 00000c63: PUSH1 0x04 00000c65: SLOAD 00000c66: SWAP1 00000c67: SWAP3 00000c68: POP 00000c69: SWAP1 00000c6a: MLOAD 00000c6b: GT 00000c6c: PUSH2 0x0d42 00000c6f: JUMPI 00000c70: PUSH1 0x0a 00000c72: DUP5 00000c73: PUSH1 0xff 00000c75: AND 00000c76: LT 00000c77: ISZERO 00000c78: PUSH2 0x0d3d 00000c7b: JUMPI 00000c7c: PUSH1 0x0c 00000c7e: PUSH1 0xff 00000c80: DUP5 00000c81: AND 00000c82: PUSH2 0x0100 00000c85: DUP2 00000c86: LT 00000c87: PUSH2 0x0c8c 00000c8a: JUMPI 00000c8b: INVALID 00000c8c: JUMPDEST 00000c8d: ADD 00000c8e: PUSH1 0x00 00000c90: JUMPDEST 00000c91: PUSH2 0x0100 00000c94: EXP 00000c95: DUP2 00000c96: SLOAD 00000c97: SWAP1 00000c98: PUSH1 0x01 00000c9a: PUSH1 0xa0 00000c9c: PUSH1 0x02 00000c9e: EXP 00000c9f: SUB 00000ca0: MUL 00000ca1: NOT 00000ca2: AND 00000ca3: SWAP1 00000ca4: SSTORE 00000ca5: PUSH1 0x0b 00000ca7: DUP1 00000ca8: SLOAD 00000ca9: DUP1 00000caa: PUSH1 0x01 00000cac: ADD 00000cad: DUP3 00000cae: DUP2 00000caf: PUSH2 0x0cb8 00000cb2: SWAP2 00000cb3: SWAP1 00000cb4: PUSH2 0x142d 00000cb7: JUMP 00000cb8: JUMPDEST 00000cb9: SWAP2 00000cba: PUSH1 0x00 00000cbc: MSTORE 00000cbd: PUSH1 0x20 00000cbf: PUSH1 0x00 00000cc1: KECCAK256 00000cc2: SWAP1 00000cc3: PUSH1 0x20 00000cc5: SWAP2 00000cc6: DUP3 00000cc7: DUP3 00000cc8: DIV 00000cc9: ADD 00000cca: SWAP2 00000ccb: SWAP1 00000ccc: MOD 00000ccd: JUMPDEST 00000cce: DUP2 00000ccf: SLOAD 00000cd0: PUSH1 0xff 00000cd2: DUP1 00000cd3: DUP9 00000cd4: AND 00000cd5: PUSH2 0x0100 00000cd8: SWAP4 00000cd9: DUP5 00000cda: EXP 00000cdb: DUP2 00000cdc: DUP2 00000cdd: MUL 00000cde: SWAP3 00000cdf: MUL 00000ce0: NOT 00000ce1: SWAP1 00000ce2: SWAP3 00000ce3: AND 00000ce4: OR 00000ce5: SWAP1 00000ce6: SWAP3 00000ce7: SSTORE 00000ce8: PUSH1 0x08 00000cea: SWAP3 00000ceb: POP 00000cec: PUSH1 0x00 00000cee: SWAP2 00000cef: PUSH1 0x0c 00000cf1: SWAP2 00000cf2: DUP2 00000cf3: LT 00000cf4: PUSH2 0x0cf9 00000cf7: JUMPI 00000cf8: INVALID 00000cf9: JUMPDEST 00000cfa: ADD 00000cfb: PUSH1 0x00 00000cfd: JUMPDEST 00000cfe: SWAP1 00000cff: SLOAD 00000d00: PUSH1 0x01 00000d02: PUSH1 0xa0 00000d04: PUSH1 0x02 00000d06: EXP 00000d07: SUB 00000d08: PUSH2 0x0100 00000d0b: SWAP3 00000d0c: SWAP1 00000d0d: SWAP3 00000d0e: EXP 00000d0f: SWAP1 00000d10: DIV 00000d11: AND 00000d12: DUP2 00000d13: MSTORE 00000d14: PUSH1 0x20 00000d16: DUP2 00000d17: ADD 00000d18: SWAP2 00000d19: SWAP1 00000d1a: SWAP2 00000d1b: MSTORE 00000d1c: PUSH1 0x40 00000d1e: ADD 00000d1f: PUSH1 0x00 00000d21: SWAP1 00000d22: DUP2 00000d23: KECCAK256 00000d24: DUP2 00000d25: DUP2 00000d26: SSTORE 00000d27: PUSH1 0x01 00000d29: DUP1 00000d2a: DUP3 00000d2b: ADD 00000d2c: DUP4 00000d2d: SWAP1 00000d2e: SSTORE 00000d2f: PUSH1 0x02 00000d31: SWAP1 00000d32: SWAP2 00000d33: ADD 00000d34: SWAP2 00000d35: SWAP1 00000d36: SWAP2 00000d37: SSTORE 00000d38: SWAP4 00000d39: SWAP1 00000d3a: SWAP4 00000d3b: ADD 00000d3c: SWAP3 00000d3d: JUMPDEST 00000d3e: PUSH2 0x0d4c 00000d41: JUMP 00000d42: JUMPDEST 00000d43: DUP1 00000d44: PUSH1 0x40 00000d46: ADD 00000d47: MLOAD 00000d48: DUP6 00000d49: ADD 00000d4a: SWAP5 00000d4b: POP 00000d4c: JUMPDEST 00000d4d: JUMPDEST 00000d4e: JUMPDEST 00000d4f: PUSH1 0x01 00000d51: SWAP1 00000d52: SWAP3 00000d53: ADD 00000d54: SWAP2 00000d55: PUSH2 0x0bd9 00000d58: JUMP 00000d59: JUMPDEST 00000d5a: PUSH1 0x00 00000d5c: DUP6 00000d5d: GT 00000d5e: ISZERO 00000d5f: PUSH2 0x0dd4 00000d62: JUMPI 00000d63: PUSH1 0x00 00000d65: DUP7 00000d66: DUP2 00000d67: MSTORE 00000d68: PUSH1 0x09 00000d6a: PUSH1 0x20 00000d6c: MSTORE 00000d6d: PUSH1 0x40 00000d6f: SWAP1 00000d70: DUP2 00000d71: SWAP1 00000d72: KECCAK256 00000d73: DUP7 00000d74: SWAP1 00000d75: SSTORE 00000d76: PUSH1 0x07 00000d78: SLOAD 00000d79: PUSH1 0x01 00000d7b: PUSH1 0xa0 00000d7d: PUSH1 0x02 00000d7f: EXP 00000d80: SUB 00000d81: AND 00000d82: SWAP1 00000d83: PUSH4 0x99f4b251 00000d88: SWAP1 00000d89: DUP8 00000d8a: SWAP1 00000d8b: MLOAD 00000d8c: DUP3 00000d8d: PUSH4 0xffffffff 00000d92: AND 00000d93: PUSH1 0xe0 00000d95: PUSH1 0x02 00000d97: EXP 00000d98: MUL 00000d99: DUP2 00000d9a: MSTORE 00000d9b: PUSH1 0x04 00000d9d: ADD 00000d9e: PUSH1 0x00 00000da0: PUSH1 0x40 00000da2: MLOAD 00000da3: DUP1 00000da4: DUP4 00000da5: SUB 00000da6: DUP2 00000da7: DUP6 00000da8: DUP9 00000da9: DUP1 00000daa: EXTCODESIZE 00000dab: ISZERO 00000dac: ISZERO 00000dad: PUSH2 0x0db5 00000db0: JUMPI 00000db1: PUSH1 0x00 00000db3: DUP1 00000db4: REVERT 00000db5: JUMPDEST 00000db6: PUSH2 0x25ee 00000db9: GAS 00000dba: SUB 00000dbb: CALL 00000dbc: ISZERO 00000dbd: ISZERO 00000dbe: PUSH2 0x0dc6 00000dc1: JUMPI 00000dc2: PUSH1 0x00 00000dc4: DUP1 00000dc5: REVERT 00000dc6: JUMPDEST 00000dc7: POP 00000dc8: POP 00000dc9: PUSH1 0x04 00000dcb: DUP1 00000dcc: SLOAD 00000dcd: PUSH1 0x01 00000dcf: ADD 00000dd0: SWAP1 00000dd1: SSTORE 00000dd2: POP 00000dd3: POP 00000dd4: JUMPDEST 00000dd5: JUMPDEST 00000dd6: PUSH1 0x00 00000dd8: DUP1 00000dd9: SLOAD 00000dda: PUSH1 0xa0 00000ddc: PUSH1 0x02 00000dde: EXP 00000ddf: PUSH1 0xff 00000de1: MUL 00000de2: NOT 00000de3: AND 00000de4: SWAP1 00000de5: SSTORE 00000de6: JUMPDEST 00000de7: POP 00000de8: POP 00000de9: POP 00000dea: POP 00000deb: POP 00000dec: POP 00000ded: JUMP 00000dee: JUMPDEST 00000def: PUSH1 0x00 00000df1: DUP1 00000df2: PUSH1 0x00 00000df4: DUP1 00000df5: PUSH1 0x00 00000df7: PUSH2 0x0dfe 00000dfa: PUSH2 0x140b 00000dfd: JUMP 00000dfe: JUMPDEST 00000dff: PUSH1 0x01 00000e01: PUSH1 0xa0 00000e03: PUSH1 0x02 00000e05: EXP 00000e06: SUB 00000e07: DUP8 00000e08: AND 00000e09: PUSH1 0x00 00000e0b: SWAP1 00000e0c: DUP2 00000e0d: MSTORE 00000e0e: PUSH1 0x08 00000e10: PUSH1 0x20 00000e12: MSTORE 00000e13: PUSH1 0x40 00000e15: DUP2 00000e16: KECCAK256 00000e17: SLOAD 00000e18: DUP2 00000e19: SWAP1 00000e1a: GT 00000e1b: ISZERO 00000e1c: PUSH2 0x0eb1 00000e1f: JUMPI 00000e20: PUSH1 0x01 00000e22: PUSH1 0xa0 00000e24: PUSH1 0x02 00000e26: EXP 00000e27: SUB 00000e28: DUP9 00000e29: AND 00000e2a: PUSH1 0x00 00000e2c: SWAP1 00000e2d: DUP2 00000e2e: MSTORE 00000e2f: PUSH1 0x08 00000e31: PUSH1 0x20 00000e33: MSTORE 00000e34: PUSH1 0x40 00000e36: SWAP1 00000e37: DUP2 00000e38: SWAP1 00000e39: KECCAK256 00000e3a: SWAP1 00000e3b: PUSH1 0x60 00000e3d: SWAP1 00000e3e: MLOAD 00000e3f: SWAP1 00000e40: DUP2 00000e41: ADD 00000e42: PUSH1 0x40 00000e44: SWAP1 00000e45: DUP2 00000e46: MSTORE 00000e47: DUP3 00000e48: SLOAD 00000e49: DUP3 00000e4a: MSTORE 00000e4b: PUSH1 0x01 00000e4d: DUP4 00000e4e: ADD 00000e4f: SLOAD 00000e50: PUSH1 0x20 00000e52: DUP4 00000e53: ADD 00000e54: SWAP1 00000e55: DUP2 00000e56: MSTORE 00000e57: PUSH1 0x02 00000e59: SWAP1 00000e5a: SWAP4 00000e5b: ADD 00000e5c: SLOAD 00000e5d: SWAP1 00000e5e: DUP3 00000e5f: ADD 00000e60: MSTORE 00000e61: PUSH1 0x04 00000e63: SLOAD 00000e64: SWAP1 00000e65: SWAP4 00000e66: POP 00000e67: PUSH1 0x00 00000e69: SWAP3 00000e6a: POP 00000e6b: SWAP1 00000e6c: MLOAD 00000e6d: GT 00000e6e: ISZERO 00000e6f: PUSH2 0x0e82 00000e72: JUMPI 00000e73: PUSH1 0x04 00000e75: SLOAD 00000e76: DUP3 00000e77: PUSH1 0x20 00000e79: ADD 00000e7a: MLOAD 00000e7b: SUB 00000e7c: SWAP1 00000e7d: POP 00000e7e: PUSH2 0x0e86 00000e81: JUMP 00000e82: JUMPDEST 00000e83: POP 00000e84: PUSH1 0x00 00000e86: JUMPDEST 00000e87: DUP2 00000e88: MLOAD 00000e89: DUP3 00000e8a: PUSH1 0x20 00000e8c: ADD 00000e8d: MLOAD 00000e8e: DUP4 00000e8f: PUSH1 0x40 00000e91: ADD 00000e92: MLOAD 00000e93: PUSH1 0x03 00000e95: SLOAD 00000e96: DUP6 00000e97: PUSH1 0x40 00000e99: ADD 00000e9a: MLOAD 00000e9b: MUL 00000e9c: DUP5 00000e9d: DUP7 00000e9e: PUSH1 0x40 00000ea0: ADD 00000ea1: MLOAD 00000ea2: MUL 00000ea3: SWAP7 00000ea4: POP 00000ea5: SWAP7 00000ea6: POP 00000ea7: SWAP7 00000ea8: POP 00000ea9: SWAP7 00000eaa: POP 00000eab: SWAP7 00000eac: POP 00000ead: PUSH2 0x0ec2 00000eb0: JUMP 00000eb1: JUMPDEST 00000eb2: PUSH1 0x00 00000eb4: SWAP7 00000eb5: POP 00000eb6: DUP7 00000eb7: SWAP6 00000eb8: POP 00000eb9: DUP6 00000eba: SWAP5 00000ebb: POP 00000ebc: DUP5 00000ebd: SWAP4 00000ebe: POP 00000ebf: DUP4 00000ec0: SWAP3 00000ec1: POP 00000ec2: JUMPDEST 00000ec3: POP 00000ec4: POP 00000ec5: SWAP2 00000ec6: SWAP4 00000ec7: SWAP6 00000ec8: SWAP1 00000ec9: SWAP3 00000eca: SWAP5 00000ecb: POP 00000ecc: JUMP 00000ecd: JUMPDEST 00000ece: PUSH1 0x08 00000ed0: PUSH1 0x20 00000ed2: MSTORE 00000ed3: PUSH1 0x00 00000ed5: SWAP1 00000ed6: DUP2 00000ed7: MSTORE 00000ed8: PUSH1 0x40 00000eda: SWAP1 00000edb: KECCAK256 00000edc: DUP1 00000edd: SLOAD 00000ede: PUSH1 0x01 00000ee0: DUP3 00000ee1: ADD 00000ee2: SLOAD 00000ee3: PUSH1 0x02 00000ee5: SWAP1 00000ee6: SWAP3 00000ee7: ADD 00000ee8: SLOAD 00000ee9: SWAP1 00000eea: SWAP2 00000eeb: SWAP1 00000eec: DUP4 00000eed: JUMP 00000eee: JUMPDEST 00000eef: PUSH1 0x06 00000ef1: SLOAD 00000ef2: DUP2 00000ef3: JUMP 00000ef4: JUMPDEST 00000ef5: PUSH1 0x04 00000ef7: SLOAD 00000ef8: DUP2 00000ef9: JUMP 00000efa: JUMPDEST 00000efb: PUSH1 0x64 00000efd: DUP2 00000efe: JUMP 00000eff: JUMPDEST 00000f00: PUSH20 0x73dd069c299a5d691e9836243bcaec9c8c1d8734 00000f15: JUMPDEST 00000f16: SWAP1 00000f17: JUMP 00000f18: JUMPDEST 00000f19: PUSH1 0x00 00000f1b: SLOAD 00000f1c: PUSH1 0xa0 00000f1e: PUSH1 0x02 00000f20: EXP 00000f21: SWAP1 00000f22: DIV 00000f23: PUSH1 0xff 00000f25: AND 00000f26: ISZERO 00000f27: PUSH2 0x0f2f 00000f2a: JUMPI 00000f2b: PUSH1 0x00 00000f2d: DUP1 00000f2e: REVERT 00000f2f: JUMPDEST 00000f30: PUSH1 0x00 00000f32: DUP1 00000f33: SLOAD 00000f34: PUSH1 0xa0 00000f36: PUSH1 0x02 00000f38: EXP 00000f39: PUSH1 0xff 00000f3b: MUL 00000f3c: NOT 00000f3d: AND 00000f3e: PUSH1 0xa0 00000f40: PUSH1 0x02 00000f42: EXP 00000f43: OR 00000f44: SWAP1 00000f45: SSTORE 00000f46: PUSH2 0x0f4d 00000f49: PUSH2 0x075d 00000f4c: JUMP 00000f4d: JUMPDEST 00000f4e: JUMPDEST 00000f4f: PUSH1 0x00 00000f51: DUP1 00000f52: SLOAD 00000f53: PUSH1 0xa0 00000f55: PUSH1 0x02 00000f57: EXP 00000f58: PUSH1 0xff 00000f5a: MUL 00000f5b: NOT 00000f5c: AND 00000f5d: SWAP1 00000f5e: SSTORE 00000f5f: JUMPDEST 00000f60: JUMP 00000f61: JUMPDEST 00000f62: PUSH1 0x03 00000f64: SLOAD 00000f65: DUP2 00000f66: JUMP 00000f67: JUMPDEST 00000f68: PUSH1 0x07 00000f6a: SLOAD 00000f6b: PUSH1 0x00 00000f6d: SWAP1 00000f6e: PUSH1 0x01 00000f70: PUSH1 0xa0 00000f72: PUSH1 0x02 00000f74: EXP 00000f75: SUB 00000f76: AND 00000f77: PUSH4 0xdda6c3ce 00000f7c: DUP4 00000f7d: DUP4 00000f7e: PUSH1 0x40 00000f80: MLOAD 00000f81: PUSH1 0x20 00000f83: ADD 00000f84: MSTORE 00000f85: PUSH1 0x40 00000f87: MLOAD 00000f88: PUSH1 0xe0 00000f8a: PUSH1 0x02 00000f8c: EXP 00000f8d: PUSH4 0xffffffff 00000f92: DUP5 00000f93: AND 00000f94: MUL 00000f95: DUP2 00000f96: MSTORE 00000f97: PUSH1 0x04 00000f99: DUP2 00000f9a: ADD 00000f9b: SWAP2 00000f9c: SWAP1 00000f9d: SWAP2 00000f9e: MSTORE 00000f9f: PUSH1 0x24 00000fa1: ADD 00000fa2: PUSH1 0x20 00000fa4: PUSH1 0x40 00000fa6: MLOAD 00000fa7: DUP1 00000fa8: DUP4 00000fa9: SUB 00000faa: DUP2 00000fab: PUSH1 0x00 00000fad: DUP8 00000fae: DUP1 00000faf: EXTCODESIZE 00000fb0: ISZERO 00000fb1: ISZERO 00000fb2: PUSH2 0x0fba 00000fb5: JUMPI 00000fb6: PUSH1 0x00 00000fb8: DUP1 00000fb9: REVERT 00000fba: JUMPDEST 00000fbb: PUSH2 0x02c6 00000fbe: GAS 00000fbf: SUB 00000fc0: CALL 00000fc1: ISZERO 00000fc2: ISZERO 00000fc3: PUSH2 0x0fcb 00000fc6: JUMPI 00000fc7: PUSH1 0x00 00000fc9: DUP1 00000fca: REVERT 00000fcb: JUMPDEST 00000fcc: POP 00000fcd: POP 00000fce: POP 00000fcf: PUSH1 0x40 00000fd1: MLOAD 00000fd2: DUP1 00000fd3: MLOAD 00000fd4: SWAP2 00000fd5: POP 00000fd6: POP 00000fd7: JUMPDEST 00000fd8: SWAP2 00000fd9: SWAP1 00000fda: POP 00000fdb: JUMP 00000fdc: JUMPDEST 00000fdd: PUSH1 0x00 00000fdf: DUP1 00000fe0: SLOAD 00000fe1: DUP2 00000fe2: SWAP1 00000fe3: DUP2 00000fe4: SWAP1 00000fe5: DUP2 00000fe6: SWAP1 00000fe7: PUSH1 0xa0 00000fe9: PUSH1 0x02 00000feb: EXP 00000fec: SWAP1 00000fed: DIV 00000fee: PUSH1 0xff 00000ff0: AND 00000ff1: ISZERO 00000ff2: PUSH2 0x0ffa 00000ff5: JUMPI 00000ff6: PUSH1 0x00 00000ff8: DUP1 00000ff9: REVERT 00000ffa: JUMPDEST 00000ffb: PUSH1 0x00 00000ffd: DUP1 00000ffe: SLOAD 00000fff: PUSH1 0xa0 00001001: PUSH1 0x02 00001003: EXP 00001004: PUSH1 0xff 00001006: MUL 00001007: NOT 00001008: AND 00001009: PUSH1 0xa0 0000100b: PUSH1 0x02 0000100d: EXP 0000100e: OR 0000100f: DUP2 00001010: SSTORE 00001011: PUSH1 0x07 00001013: SLOAD 00001014: PUSH1 0x01 00001016: PUSH1 0xa0 00001018: PUSH1 0x02 0000101a: EXP 0000101b: SUB 0000101c: AND 0000101d: SWAP1 0000101e: PUSH4 0xdda6c3ce 00001023: SWAP1 00001024: DUP9 00001025: SWAP1 00001026: PUSH1 0x40 00001028: MLOAD 00001029: PUSH1 0x20 0000102b: ADD 0000102c: MSTORE 0000102d: PUSH1 0x40 0000102f: MLOAD 00001030: PUSH1 0xe0 00001032: PUSH1 0x02 00001034: EXP 00001035: PUSH4 0xffffffff 0000103a: DUP5 0000103b: AND 0000103c: MUL 0000103d: DUP2 0000103e: MSTORE 0000103f: PUSH1 0x04 00001041: DUP2 00001042: ADD 00001043: SWAP2 00001044: SWAP1 00001045: SWAP2 00001046: MSTORE 00001047: PUSH1 0x24 00001049: ADD 0000104a: PUSH1 0x20 0000104c: PUSH1 0x40 0000104e: MLOAD 0000104f: DUP1 00001050: DUP4 00001051: SUB 00001052: DUP2 00001053: PUSH1 0x00 00001055: DUP8 00001056: DUP1 00001057: EXTCODESIZE 00001058: ISZERO 00001059: ISZERO 0000105a: PUSH2 0x1062 0000105d: JUMPI 0000105e: PUSH1 0x00 00001060: DUP1 00001061: REVERT 00001062: JUMPDEST 00001063: PUSH2 0x02c6 00001066: GAS 00001067: SUB 00001068: CALL 00001069: ISZERO 0000106a: ISZERO 0000106b: PUSH2 0x1073 0000106e: JUMPI 0000106f: PUSH1 0x00 00001071: DUP1 00001072: REVERT 00001073: JUMPDEST 00001074: POP 00001075: POP 00001076: POP 00001077: PUSH1 0x40 00001079: MLOAD 0000107a: DUP1 0000107b: MLOAD 0000107c: SWAP1 0000107d: POP 0000107e: ISZERO 0000107f: ISZERO 00001080: PUSH2 0x1088 00001083: JUMPI 00001084: PUSH1 0x00 00001086: DUP1 00001087: REVERT 00001088: JUMPDEST 00001089: PUSH1 0x07 0000108b: SLOAD 0000108c: PUSH1 0x01 0000108e: PUSH1 0xa0 00001090: PUSH1 0x02 00001092: EXP 00001093: SUB 00001094: AND 00001095: PUSH4 0x70a08231 0000109a: ADDRESS 0000109b: PUSH1 0x00 0000109d: PUSH1 0x40 0000109f: MLOAD 000010a0: PUSH1 0x20 000010a2: ADD 000010a3: MSTORE 000010a4: PUSH1 0x40 000010a6: MLOAD 000010a7: PUSH1 0xe0 000010a9: PUSH1 0x02 000010ab: EXP 000010ac: PUSH4 0xffffffff 000010b1: DUP5 000010b2: AND 000010b3: MUL 000010b4: DUP2 000010b5: MSTORE 000010b6: PUSH1 0x01 000010b8: PUSH1 0xa0 000010ba: PUSH1 0x02 000010bc: EXP 000010bd: SUB 000010be: SWAP1 000010bf: SWAP2 000010c0: AND 000010c1: PUSH1 0x04 000010c3: DUP3 000010c4: ADD 000010c5: MSTORE 000010c6: PUSH1 0x24 000010c8: ADD 000010c9: PUSH1 0x20 000010cb: PUSH1 0x40 000010cd: MLOAD 000010ce: DUP1 000010cf: DUP4 000010d0: SUB 000010d1: DUP2 000010d2: PUSH1 0x00 000010d4: DUP8 000010d5: DUP1 000010d6: EXTCODESIZE 000010d7: ISZERO 000010d8: ISZERO 000010d9: PUSH2 0x10e1 000010dc: JUMPI 000010dd: PUSH1 0x00 000010df: DUP1 000010e0: REVERT 000010e1: JUMPDEST 000010e2: PUSH2 0x02c6 000010e5: GAS 000010e6: SUB 000010e7: CALL 000010e8: ISZERO 000010e9: ISZERO 000010ea: PUSH2 0x10f2 000010ed: JUMPI 000010ee: PUSH1 0x00 000010f0: DUP1 000010f1: REVERT 000010f2: JUMPDEST 000010f3: POP 000010f4: POP 000010f5: POP 000010f6: PUSH1 0x40 000010f8: MLOAD 000010f9: DUP1 000010fa: MLOAD 000010fb: PUSH1 0x07 000010fd: SLOAD 000010fe: SWAP1 000010ff: SWAP5 00001100: POP 00001101: PUSH1 0x01 00001103: PUSH1 0xa0 00001105: PUSH1 0x02 00001107: EXP 00001108: SUB 00001109: AND 0000110a: SWAP1 0000110b: POP 0000110c: PUSH4 0xddd5e1b2 00001111: DUP8 00001112: ADDRESS 00001113: PUSH1 0x40 00001115: MLOAD 00001116: PUSH1 0xe0 00001118: PUSH1 0x02 0000111a: EXP 0000111b: PUSH4 0xffffffff 00001120: DUP6 00001121: AND 00001122: MUL 00001123: DUP2 00001124: MSTORE 00001125: PUSH1 0x04 00001127: DUP2 00001128: ADD 00001129: SWAP3 0000112a: SWAP1 0000112b: SWAP3 0000112c: MSTORE 0000112d: PUSH1 0x01 0000112f: PUSH1 0xa0 00001131: PUSH1 0x02 00001133: EXP 00001134: SUB 00001135: AND 00001136: PUSH1 0x24 00001138: DUP3 00001139: ADD 0000113a: MSTORE 0000113b: PUSH1 0x44 0000113d: ADD 0000113e: PUSH1 0x00 00001140: PUSH1 0x40 00001142: MLOAD 00001143: DUP1 00001144: DUP4 00001145: SUB 00001146: DUP2 00001147: PUSH1 0x00 00001149: DUP8 0000114a: DUP1 0000114b: EXTCODESIZE 0000114c: ISZERO 0000114d: ISZERO 0000114e: PUSH2 0x1156 00001151: JUMPI 00001152: PUSH1 0x00 00001154: DUP1 00001155: REVERT 00001156: JUMPDEST 00001157: PUSH2 0x02c6 0000115a: GAS 0000115b: SUB 0000115c: CALL 0000115d: ISZERO 0000115e: ISZERO 0000115f: PUSH2 0x1167 00001162: JUMPI 00001163: PUSH1 0x00 00001165: DUP1 00001166: REVERT 00001167: JUMPDEST 00001168: POP 00001169: POP 0000116a: PUSH1 0x07 0000116c: SLOAD 0000116d: PUSH1 0x01 0000116f: PUSH1 0xa0 00001171: PUSH1 0x02 00001173: EXP 00001174: SUB 00001175: AND 00001176: SWAP1 00001177: POP 00001178: PUSH4 0x70a08231 0000117d: ADDRESS 0000117e: PUSH1 0x00 00001180: PUSH1 0x40 00001182: MLOAD 00001183: PUSH1 0x20 00001185: ADD 00001186: MSTORE 00001187: PUSH1 0x40 00001189: MLOAD 0000118a: PUSH1 0xe0 0000118c: PUSH1 0x02 0000118e: EXP 0000118f: PUSH4 0xffffffff 00001194: DUP5 00001195: AND 00001196: MUL 00001197: DUP2 00001198: MSTORE 00001199: PUSH1 0x01 0000119b: PUSH1 0xa0 0000119d: PUSH1 0x02 0000119f: EXP 000011a0: SUB 000011a1: SWAP1 000011a2: SWAP2 000011a3: AND 000011a4: PUSH1 0x04 000011a6: DUP3 000011a7: ADD 000011a8: MSTORE 000011a9: PUSH1 0x24 000011ab: ADD 000011ac: PUSH1 0x20 000011ae: PUSH1 0x40 000011b0: MLOAD 000011b1: DUP1 000011b2: DUP4 000011b3: SUB 000011b4: DUP2 000011b5: PUSH1 0x00 000011b7: DUP8 000011b8: DUP1 000011b9: EXTCODESIZE 000011ba: ISZERO 000011bb: ISZERO 000011bc: PUSH2 0x11c4 000011bf: JUMPI 000011c0: PUSH1 0x00 000011c2: DUP1 000011c3: REVERT 000011c4: JUMPDEST 000011c5: PUSH2 0x02c6 000011c8: GAS 000011c9: SUB 000011ca: CALL 000011cb: ISZERO 000011cc: ISZERO 000011cd: PUSH2 0x11d5 000011d0: JUMPI 000011d1: PUSH1 0x00 000011d3: DUP1 000011d4: REVERT 000011d5: JUMPDEST 000011d6: POP 000011d7: POP 000011d8: POP 000011d9: PUSH1 0x40 000011db: MLOAD 000011dc: DUP1 000011dd: MLOAD 000011de: PUSH1 0x00 000011e0: DUP9 000011e1: DUP2 000011e2: MSTORE 000011e3: PUSH1 0x09 000011e5: PUSH1 0x20 000011e7: MSTORE 000011e8: PUSH1 0x40 000011ea: SWAP1 000011eb: KECCAK256 000011ec: SLOAD 000011ed: SWAP1 000011ee: SWAP4 000011ef: POP 000011f0: SWAP2 000011f1: POP 000011f2: PUSH2 0x11ff 000011f5: SWAP1 000011f6: POP 000011f7: DUP2 000011f8: DUP5 000011f9: DUP5 000011fa: SUB 000011fb: PUSH2 0x132e 000011fe: JUMP 000011ff: JUMPDEST 00001200: PUSH1 0x05 00001202: DUP1 00001203: SLOAD 00001204: PUSH1 0x01 00001206: ADD 00001207: SWAP1 00001208: SSTORE 00001209: JUMPDEST 0000120a: PUSH1 0x00 0000120c: DUP1 0000120d: SLOAD 0000120e: PUSH1 0xa0 00001210: PUSH1 0x02 00001212: EXP 00001213: PUSH1 0xff 00001215: MUL 00001216: NOT 00001217: AND 00001218: SWAP1 00001219: SSTORE 0000121a: JUMPDEST 0000121b: POP 0000121c: POP 0000121d: POP 0000121e: SWAP3 0000121f: SWAP2 00001220: POP 00001221: POP 00001222: JUMP 00001223: JUMPDEST 00001224: PUSH1 0x01 00001226: SLOAD 00001227: DUP2 00001228: JUMP 00001229: JUMPDEST 0000122a: PUSH1 0x00 0000122c: SLOAD 0000122d: PUSH1 0xa0 0000122f: PUSH1 0x02 00001231: EXP 00001232: SWAP1 00001233: DIV 00001234: PUSH1 0xff 00001236: AND 00001237: ISZERO 00001238: PUSH2 0x1240 0000123b: JUMPI 0000123c: PUSH1 0x00 0000123e: DUP1 0000123f: REVERT 00001240: JUMPDEST 00001241: PUSH1 0x00 00001243: DUP1 00001244: SLOAD 00001245: PUSH1 0xa0 00001247: PUSH1 0x02 00001249: EXP 0000124a: PUSH1 0xff 0000124c: MUL 0000124d: NOT 0000124e: AND 0000124f: PUSH1 0xa0 00001251: PUSH1 0x02 00001253: EXP 00001254: OR 00001255: SWAP1 00001256: DUP2 00001257: SWAP1 00001258: SSTORE 00001259: CALLER 0000125a: PUSH1 0x01 0000125c: PUSH1 0xa0 0000125e: PUSH1 0x02 00001260: EXP 00001261: SUB 00001262: SWAP1 00001263: DUP2 00001264: AND 00001265: SWAP2 00001266: AND 00001267: EQ 00001268: PUSH2 0x1270 0000126b: JUMPI 0000126c: PUSH1 0x00 0000126e: DUP1 0000126f: REVERT 00001270: JUMPDEST 00001271: PUSH1 0x06 00001273: PUSH1 0xff 00001275: DUP3 00001276: AND 00001277: LT 00001278: PUSH2 0x1280 0000127b: JUMPI 0000127c: PUSH1 0x00 0000127e: DUP1 0000127f: REVERT 00001280: JUMPDEST 00001281: PUSH1 0xff 00001283: DUP2 00001284: AND 00001285: PUSH1 0x01 00001287: SSTORE 00001288: JUMPDEST 00001289: JUMPDEST 0000128a: PUSH1 0x00 0000128c: DUP1 0000128d: SLOAD 0000128e: PUSH1 0xa0 00001290: PUSH1 0x02 00001292: EXP 00001293: PUSH1 0xff 00001295: MUL 00001296: NOT 00001297: AND 00001298: SWAP1 00001299: SSTORE 0000129a: JUMPDEST 0000129b: POP 0000129c: JUMP 0000129d: JUMPDEST 0000129e: PUSH1 0x02 000012a0: SLOAD 000012a1: DUP2 000012a2: JUMP 000012a3: JUMPDEST 000012a4: PUSH1 0x0c 000012a6: DUP2 000012a7: PUSH2 0x0100 000012aa: DUP2 000012ab: LT 000012ac: PUSH2 0x12b1 000012af: JUMPI 000012b0: INVALID 000012b1: JUMPDEST 000012b2: ADD 000012b3: PUSH1 0x00 000012b5: JUMPDEST 000012b6: SWAP2 000012b7: POP 000012b8: SLOAD 000012b9: SWAP1 000012ba: PUSH2 0x0100 000012bd: EXP 000012be: SWAP1 000012bf: DIV 000012c0: PUSH1 0x01 000012c2: PUSH1 0xa0 000012c4: PUSH1 0x02 000012c6: EXP 000012c7: SUB 000012c8: AND 000012c9: DUP2 000012ca: JUMP 000012cb: JUMPDEST 000012cc: PUSH1 0x00 000012ce: SLOAD 000012cf: CALLER 000012d0: PUSH1 0x01 000012d2: PUSH1 0xa0 000012d4: PUSH1 0x02 000012d6: EXP 000012d7: SUB 000012d8: SWAP1 000012d9: DUP2 000012da: AND 000012db: SWAP2 000012dc: AND 000012dd: EQ 000012de: PUSH2 0x12e6 000012e1: JUMPI 000012e2: PUSH1 0x00 000012e4: DUP1 000012e5: REVERT 000012e6: JUMPDEST 000012e7: PUSH1 0x01 000012e9: PUSH1 0xa0 000012eb: PUSH1 0x02 000012ed: EXP 000012ee: SUB 000012ef: DUP2 000012f0: AND 000012f1: ISZERO 000012f2: PUSH2 0x129a 000012f5: JUMPI 000012f6: PUSH1 0x00 000012f8: DUP1 000012f9: SLOAD 000012fa: PUSH1 0x01 000012fc: PUSH1 0xa0 000012fe: PUSH1 0x02 00001300: EXP 00001301: SUB 00001302: NOT 00001303: AND 00001304: PUSH1 0x01 00001306: PUSH1 0xa0 00001308: PUSH1 0x02 0000130a: EXP 0000130b: SUB 0000130c: DUP4 0000130d: AND 0000130e: OR 0000130f: SWAP1 00001310: SSTORE 00001311: JUMPDEST 00001312: JUMPDEST 00001313: JUMPDEST 00001314: POP 00001315: JUMP 00001316: JUMPDEST 00001317: PUSH1 0x00 00001319: PUSH1 0x06 0000131b: SLOAD 0000131c: DUP3 0000131d: DUP2 0000131e: ISZERO 0000131f: ISZERO 00001320: PUSH2 0x1325 00001323: JUMPI 00001324: INVALID 00001325: JUMPDEST 00001326: DIV 00001327: SWAP1 00001328: POP 00001329: JUMPDEST 0000132a: SWAP2 0000132b: SWAP1 0000132c: POP 0000132d: JUMP 0000132e: JUMPDEST 0000132f: DUP1 00001330: PUSH1 0x00 00001332: DUP1 00001333: DUP1 00001334: DUP1 00001335: DUP1 00001336: JUMPDEST 00001337: PUSH1 0x02 00001339: SLOAD 0000133a: DUP6 0000133b: PUSH1 0xff 0000133d: AND 0000133e: LT 0000133f: ISZERO 00001340: PUSH2 0x1400 00001343: JUMPI 00001344: PUSH1 0x0c 00001346: PUSH1 0xff 00001348: DUP7 00001349: AND 0000134a: PUSH2 0x0100 0000134d: DUP2 0000134e: LT 0000134f: PUSH2 0x1354 00001352: JUMPI 00001353: INVALID 00001354: JUMPDEST 00001355: ADD 00001356: PUSH1 0x00 00001358: JUMPDEST 00001359: SWAP1 0000135a: SLOAD 0000135b: SWAP1 0000135c: PUSH2 0x0100 0000135f: EXP 00001360: SWAP1 00001361: DIV 00001362: PUSH1 0x01 00001364: PUSH1 0xa0 00001366: PUSH1 0x02 00001368: EXP 00001369: SUB 0000136a: AND 0000136b: SWAP4 0000136c: POP 0000136d: PUSH1 0x00 0000136f: DUP5 00001370: PUSH1 0x01 00001372: PUSH1 0xa0 00001374: PUSH1 0x02 00001376: EXP 00001377: SUB 00001378: AND 00001379: GT 0000137a: DUP1 0000137b: ISZERO 0000137c: PUSH2 0x1384 0000137f: JUMPI 00001380: POP 00001381: DUP6 00001382: ISZERO 00001383: ISZERO 00001384: JUMPDEST 00001385: ISZERO 00001386: PUSH2 0x13f4 00001389: JUMPI 0000138a: PUSH1 0x01 0000138c: PUSH1 0xa0 0000138e: PUSH1 0x02 00001390: EXP 00001391: SUB 00001392: DUP5 00001393: AND 00001394: PUSH1 0x00 00001396: SWAP1 00001397: DUP2 00001398: MSTORE 00001399: PUSH1 0x08 0000139b: PUSH1 0x20 0000139d: MSTORE 0000139e: PUSH1 0x40 000013a0: SWAP1 000013a1: KECCAK256 000013a2: PUSH1 0x02 000013a4: ADD 000013a5: SLOAD 000013a6: SWAP3 000013a7: POP 000013a8: DUP8 000013a9: PUSH3 0x989680 000013ad: DUP5 000013ae: MUL 000013af: DUP2 000013b0: ISZERO 000013b1: ISZERO 000013b2: PUSH2 0x13b7 000013b5: JUMPI 000013b6: INVALID 000013b7: JUMPDEST 000013b8: DIV 000013b9: SWAP2 000013ba: POP 000013bb: PUSH3 0x989680 000013bf: DUP8 000013c0: DUP4 000013c1: MUL 000013c2: JUMPDEST 000013c3: DIV 000013c4: SWAP1 000013c5: POP 000013c6: DUP6 000013c7: DUP2 000013c8: GT 000013c9: ISZERO 000013ca: PUSH2 0x13d0 000013cd: JUMPI 000013ce: POP 000013cf: DUP5 000013d0: JUMPDEST 000013d1: PUSH1 0x01 000013d3: PUSH1 0xa0 000013d5: PUSH1 0x02 000013d7: EXP 000013d8: SUB 000013d9: DUP5 000013da: AND 000013db: PUSH1 0x00 000013dd: SWAP1 000013de: DUP2 000013df: MSTORE 000013e0: PUSH1 0x0a 000013e2: PUSH1 0x20 000013e4: MSTORE 000013e5: PUSH1 0x40 000013e7: SWAP1 000013e8: KECCAK256 000013e9: DUP1 000013ea: SLOAD 000013eb: DUP3 000013ec: ADD 000013ed: SWAP1 000013ee: SSTORE 000013ef: SWAP5 000013f0: DUP6 000013f1: SWAP1 000013f2: SUB 000013f3: SWAP5 000013f4: JUMPDEST 000013f5: JUMPDEST 000013f6: PUSH1 0x01 000013f8: SWAP1 000013f9: SWAP5 000013fa: ADD 000013fb: SWAP4 000013fc: PUSH2 0x1336 000013ff: JUMP 00001400: JUMPDEST 00001401: JUMPDEST 00001402: POP 00001403: POP 00001404: POP 00001405: POP 00001406: POP 00001407: POP 00001408: POP 00001409: POP 0000140a: JUMP 0000140b: JUMPDEST 0000140c: PUSH1 0x60 0000140e: PUSH1 0x40 00001410: MLOAD 00001411: SWAP1 00001412: DUP2 00001413: ADD 00001414: PUSH1 0x40 00001416: MSTORE 00001417: DUP1 00001418: PUSH1 0x00 0000141a: DUP2 0000141b: MSTORE 0000141c: PUSH1 0x20 0000141e: ADD 0000141f: PUSH1 0x00 00001421: DUP2 00001422: MSTORE 00001423: PUSH1 0x20 00001425: ADD 00001426: PUSH1 0x00 00001428: DUP2 00001429: MSTORE 0000142a: POP 0000142b: SWAP1 0000142c: JUMP 0000142d: JUMPDEST 0000142e: DUP2 0000142f: SLOAD 00001430: DUP2 00001431: DUP4 00001432: SSTORE 00001433: DUP2 00001434: DUP2 00001435: ISZERO 00001436: GT 00001437: PUSH2 0x0214 0000143a: JUMPI 0000143b: PUSH1 0x1f 0000143d: ADD 0000143e: PUSH1 0x20 00001440: SWAP1 00001441: DIV 00001442: DUP2 00001443: PUSH1 0x1f 00001445: ADD 00001446: PUSH1 0x20 00001448: SWAP1 00001449: DIV 0000144a: DUP4 0000144b: PUSH1 0x00 0000144d: MSTORE 0000144e: PUSH1 0x20 00001450: PUSH1 0x00 00001452: KECCAK256 00001453: SWAP2 00001454: DUP3 00001455: ADD 00001456: SWAP2 00001457: ADD 00001458: PUSH2 0x0214 0000145b: SWAP2 0000145c: SWAP1 0000145d: PUSH2 0x1467 00001460: JUMP 00001461: JUMPDEST 00001462: JUMPDEST 00001463: POP 00001464: POP 00001465: POP 00001466: JUMP 00001467: JUMPDEST 00001468: PUSH2 0x075a 0000146b: SWAP2 0000146c: SWAP1 0000146d: JUMPDEST 0000146e: DUP1 0000146f: DUP3 00001470: GT 00001471: ISZERO 00001472: PUSH2 0x1481 00001475: JUMPI 00001476: PUSH1 0x00 00001478: DUP2 00001479: SSTORE 0000147a: PUSH1 0x01 0000147c: ADD 0000147d: PUSH2 0x146d 00001480: JUMP 00001481: JUMPDEST 00001482: POP 00001483: SWAP1 00001484: JUMP 00001485: JUMPDEST 00001486: SWAP1 00001487: JUMP 00001488: STOP 00001489: LOG1 0000148a: PUSH6 0x627a7a723058 00001491: KECCAK256 00001492: UNKNOWN(0xAD) 00001493: GASPRICE 00001494: UNKNOWN(0xBA) 00001495: UNKNOWN(0x2B) 00001496: SWAP4 00001497: CODESIZE 00001498: UNKNOWN(0xC3) 00001499: UNKNOWN(0xC5) 0000149a: DUP15 0000149b: TLOAD 0000149c: OR 0000149d: DIFFICULTY 0000149e: UNKNOWN(0xDA) 0000149f: PUSH3 0x17b18f 000014a3: PUSH16 0x75a9ce0d1cea621e7fc59c0749970029
| Severity | Category | Tool | Title | Confidence | Validated | Confirmed | Details |
|---|---|---|---|---|---|---|---|
| high | auth | slither | SharkPool.do_redemption() (contracts/Contract.sol#310-321) ignores return value by base_contract.transfer(owner,owner_cut) (contracts/Contract.sol#316-317) | 85 | no | — |
viewevidence_json{
"impact": "High",
"detector": "unchecked-transfer",
"elements": [
{
"name": "do_redemption",
"type": "function",
"source_mapping": {
"lines": [
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321
],
"start": 10742,
"length": 409,
"ending_column": 9,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 44,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "SharkPool",
"type": "contract",
"source_mapping": {
"lines": [
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334
],
"start": 2391,
"length": 9156,
"ending_column": 12,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 36,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
}
},
"signature": "do_redemption()"
}
},
{
"name": "base_contract.transfer(owner,owner_cut)",
"type": "node",
"source_mapping": {
"lines": [
316,
317
],
"start": 11000,
"length": 40,
"ending_column": 7,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 23,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "do_redemption",
"type": "function",
"source_mapping": {
"lines": [
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321
],
"start": 10742,
"length": 409,
"ending_column": 9,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 44,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "SharkPool",
"type": "contract",
"source_mapping": {
"lines": [
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334
],
"start": 2391,
"length": 9156,
"ending_column": 12,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 36,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
}
},
"signature": "do_redemption()"
}
}
}
}
],
"locations": [
{
"file": "contracts/Contract.sol",
"name": "do_redemption",
"type": "function",
"lines": [
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321
]
},
{
"file": "contracts/Contract.sol",
"name": "base_contract.transfer(owner,owner_cut)",
"type": "node",
"lines": [
316,
317
]
}
],
"description": "SharkPool.do_redemption() (contracts/Contract.sol#310-321) ignores return value by base_contract.transfer(owner,owner_cut) (contracts/Contract.sol#316-317)"
}
|
| high | other | detector | Untrusted CALL target/value reachable | 60 | no | no |
viewtrace_id: 0x5b3047404d20b6e54ab69a83cc590797a899936c4931f0e34e66f8c8e1375e45
call_targets:
0x29aa20fb9b23421e310bdb8a7cfb81d7fbb4a1b3
target_varies:
no
classification:
constant_target
validation_json{
"sink": "CALL",
"errors": 0,
"status": "sink_reached",
"attempts": 1,
"trace_id": "0x5b3047404d20b6e54ab69a83cc590797a899936c4931f0e34e66f8c8e1375e45",
"confirmed": false,
"trace_mode": "callTracer",
"call_targets": [
"0x29aa20fb9b23421e310bdb8a7cfb81d7fbb4a1b3"
],
"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": "0x014c3dbc",
"selector": "0x014c3dbc",
"calldata_variants": [
"0x014c3dbc",
"0x014c3dbc0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x0ee33c70",
"selector": "0x0ee33c70",
"calldata_variants": [
"0x0ee33c70",
"0x0ee33c700000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x2c035157",
"selector": "0x2c035157",
"calldata_variants": [
"0x2c035157",
"0x2c0351570000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x2d59680d",
"selector": "0x2d59680d",
"calldata_variants": [
"0x2d59680d",
"0x2d59680d0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x42b343a3",
"selector": "0x42b343a3",
"calldata_variants": [
"0x42b343a3",
"0x42b343a30000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x54ba34b5",
"selector": "0x54ba34b5",
"calldata_variants": [
"0x54ba34b5",
"0x54ba34b50000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x5f623e15",
"selector": "0x5f623e15",
"calldata_variants": [
"0x5f623e15",
"0x5f623e150000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x70a08231",
"selector": "0x70a08231",
"calldata_variants": [
"0x70a08231",
"0x70a082310000000000000000000000000000000000000000000000000000000000000000"
]
}
]
}
evidence_json{
"examples": [
{
"pc": 1847,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
},
{
"pc": 2054,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
},
{
"pc": 2177,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
}
],
"call_count": 11,
"guards_detected": [],
"untrusted_call_count": 11
}
|
| high | reentrancy | slither | Reentrancy in SharkPool.mine() (contracts/Contract.sol#252-288): | 85 | no | — |
viewevidence_json{
"impact": "High",
"detector": "reentrancy-eth",
"elements": [
{
"name": "mine",
"type": "function",
"source_mapping": {
"lines": [
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288
],
"start": 8553,
"length": 1431,
"ending_column": 52,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 56,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "SharkPool",
"type": "contract",
"source_mapping": {
"lines": [
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334
],
"start": 2391,
"length": 9156,
"ending_column": 12,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 36,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
}
},
"signature": "mine()"
}
},
{
"name": "require(bool)(! base_contract.checkMiningAttempt(_blockNum,this))",
"type": "node",
"source_mapping": {
"lines": [
256,
257,
258,
259,
260
],
"start": 8739,
"length": 59,
"ending_column": 19,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 48,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"additional_fields": {
"underlying_type": "external_calls"
},
"type_specific_fields": {
"parent": {
"name": "mine",
"type": "function",
"source_mapping": {
"lines": [
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288
],
"start": 8553,
"length": 1431,
"ending_column": 52,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 56,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "SharkPool",
"type": "contract",
"source_mapping": {
"lines": [
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334
],
"start": 2391,
"length": 9156,
"ending_column": 12,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 36,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
}
},
"signature": "mine()"
}
}
}
},
{
"name": "base_contract.mine.value(total_attempt)()",
"type": "node",
"source_mapping": {
"lines": [
287
],
"start": 9889,
"length": 41,
"ending_column": 43,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 2,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"additional_fields": {
"underlying_type": "external_calls"
},
"type_specific_fields": {
"parent": {
"name": "mine",
"type": "function",
"source_mapping": {
"lines": [
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288
],
"start": 8553,
"length": 1431,
"ending_column": 52,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 56,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "SharkPool",
"type": "contract",
"source_mapping": {
"lines": [
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334
],
"start": 2391,
"length": 9156,
"ending_column": 12,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 36,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
}
},
"signature": "mine()"
}
}
}
},
{
"name": "base_contract.mine.value(total_attempt)()",
"type": "node",
"source_mapping": {
"lines": [
287
],
"start": 9889,
"length": 41,
"ending_column": 43,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 2,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"additional_fields": {
"underlying_type": "external_calls_sending_eth"
},
"type_specific_fields": {
"parent": {
"name": "mine",
"type": "function",
"source_mapping": {
"lines": [
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288
],
"start": 8553,
"length": 1431,
"ending_column": 52,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 56,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "SharkPool",
"type": "contract",
"source_mapping": {
"lines": [
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334
],
"start": 2391,
"length": 9156,
"ending_column": 12,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 36,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
}
},
"signature": "mine()"
}
}
}
},
{
"name": "mined_blocks = mined_blocks + 1",
"type": "node",
"source_mapping": {
"lines": [
288
],
"start": 9940,
"length": 31,
"ending_column": 39,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 8,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"additional_fields": {
"variable_name": "mined_blocks",
"underlying_type": "variables_written"
},
"type_specific_fields": {
"parent": {
"name": "mine",
"type": "function",
"source_mapping": {
"lines": [
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288
],
"start": 8553,
"length": 1431,
"ending_column": 52,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 56,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "SharkPool",
"type": "contract",
"source_mapping": {
"lines": [
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334
],
"start": 2391,
"length": 9156,
"ending_column": 12,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 36,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
}
},
"signature": "mine()"
}
}
}
}
],
"locations": [
{
"file": "contracts/Contract.sol",
"name": "mine",
"type": "function",
"lines": [
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288
]
},
{
"file": "contracts/Contract.sol",
"name": "require(bool)(! base_contract.checkMiningAttempt(_blockNum,this))",
"type": "node",
"lines": [
256,
257,
258,
259,
260
]
},
{
"file": "contracts/Contract.sol",
"name": "base_contract.mine.value(total_attempt)()",
"type": "node",
"lines": [
287
]
},
{
"file": "contracts/Contract.sol",
"name": "base_contract.mine.value(total_attempt)()",
"type": "node",
"lines": [
287
]
},
{
"file": "contracts/Contract.sol",
"name": "mined_blocks = mined_blocks + 1",
"type": "node",
"lines": [
288
]
}
],
"description": "Reentrancy in SharkPool.mine() (contracts/Contract.sol#252-288):\n\tExternal calls:\n\t- require(bool)(! base_contract.checkMiningAttempt(_blockNum,this)) (contracts/Contract.sol#256-260)\n\t- base_contract.mine.value(total_attempt)() (contracts/Contract.sol#287)\n\tExternal calls sending eth:\n\t- base_contract.mine.value(total_attempt)() (contracts/Contract.sol#287)\n\tState variables written after the call(s):\n\t- mined_blocks = mined_blocks + 1 (contracts/Contract.sol#288)\n\tSharkPool.mined_blocks (contracts/Contract.sol#105-106) can be used in cross function reentrancies:\n\t- SharkPool.fallback() (contracts/Contract.sol#225-252)\n\t- SharkPool.find_contribution(address) (contracts/Contract.sol#130-148)\n\t- SharkPool.mined_blocks (contracts/Contract.sol#105-106)"
}
|
| high | other | detector | ETH value transfer possible | 55 | no | no |
viewtrace_id: 0x5b3047404d20b6e54ab69a83cc590797a899936c4931f0e34e66f8c8e1375e45
call_targets:
0x29aa20fb9b23421e310bdb8a7cfb81d7fbb4a1b3
target_varies:
no
classification:
constant_target
validation_json{
"sink": "CALL",
"errors": 0,
"status": "sink_reached",
"attempts": 1,
"trace_id": "0x5b3047404d20b6e54ab69a83cc590797a899936c4931f0e34e66f8c8e1375e45",
"confirmed": false,
"trace_mode": "callTracer",
"call_targets": [
"0x29aa20fb9b23421e310bdb8a7cfb81d7fbb4a1b3"
],
"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": "0x014c3dbc",
"selector": "0x014c3dbc",
"calldata_variants": [
"0x014c3dbc",
"0x014c3dbc0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x0ee33c70",
"selector": "0x0ee33c70",
"calldata_variants": [
"0x0ee33c70",
"0x0ee33c700000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x2c035157",
"selector": "0x2c035157",
"calldata_variants": [
"0x2c035157",
"0x2c0351570000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x2d59680d",
"selector": "0x2d59680d",
"calldata_variants": [
"0x2d59680d",
"0x2d59680d0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x42b343a3",
"selector": "0x42b343a3",
"calldata_variants": [
"0x42b343a3",
"0x42b343a30000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x54ba34b5",
"selector": "0x54ba34b5",
"calldata_variants": [
"0x54ba34b5",
"0x54ba34b50000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x5f623e15",
"selector": "0x5f623e15",
"calldata_variants": [
"0x5f623e15",
"0x5f623e150000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x70a08231",
"selector": "0x70a08231",
"calldata_variants": [
"0x70a08231",
"0x70a082310000000000000000000000000000000000000000000000000000000000000000"
]
}
]
}
evidence_json{
"examples": [
{
"pc": 1847,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
},
{
"pc": 2054,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
},
{
"pc": 2177,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
}
],
"eth_value_calls": 11,
"guards_detected": []
}
|
| high | other | slither | SharkPool.do_redemption() (contracts/Contract.sol#310-321) ignores return value by base_contract.transfer(msg.sender,remainder) (contracts/Contract.sol#319-320) | 85 | no | — |
viewevidence_json{
"impact": "High",
"detector": "unchecked-transfer",
"elements": [
{
"name": "do_redemption",
"type": "function",
"source_mapping": {
"lines": [
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321
],
"start": 10742,
"length": 409,
"ending_column": 9,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 44,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "SharkPool",
"type": "contract",
"source_mapping": {
"lines": [
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334
],
"start": 2391,
"length": 9156,
"ending_column": 12,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 36,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
}
},
"signature": "do_redemption()"
}
},
{
"name": "base_contract.transfer(msg.sender,remainder)",
"type": "node",
"source_mapping": {
"lines": [
319,
320
],
"start": 11060,
"length": 45,
"ending_column": 9,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 4,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "do_redemption",
"type": "function",
"source_mapping": {
"lines": [
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321
],
"start": 10742,
"length": 409,
"ending_column": 9,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 44,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "SharkPool",
"type": "contract",
"source_mapping": {
"lines": [
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334
],
"start": 2391,
"length": 9156,
"ending_column": 12,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 36,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
}
},
"signature": "do_redemption()"
}
}
}
}
],
"locations": [
{
"file": "contracts/Contract.sol",
"name": "do_redemption",
"type": "function",
"lines": [
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321
]
},
{
"file": "contracts/Contract.sol",
"name": "base_contract.transfer(msg.sender,remainder)",
"type": "node",
"lines": [
319,
320
]
}
],
"description": "SharkPool.do_redemption() (contracts/Contract.sol#310-321) ignores return value by base_contract.transfer(msg.sender,remainder) (contracts/Contract.sol#319-320)"
}
|
| medium | reentrancy | slither | Reentrancy in SharkPool.do_redemption() (contracts/Contract.sol#310-321): | 75 | no | — |
viewevidence_json{
"impact": "Medium",
"detector": "reentrancy-no-eth",
"elements": [
{
"name": "do_redemption",
"type": "function",
"source_mapping": {
"lines": [
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321
],
"start": 10742,
"length": 409,
"ending_column": 9,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 44,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "SharkPool",
"type": "contract",
"source_mapping": {
"lines": [
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334
],
"start": 2391,
"length": 9156,
"ending_column": 12,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 36,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
}
},
"signature": "do_redemption()"
}
},
{
"name": "base_contract.transfer(owner,owner_cut)",
"type": "node",
"source_mapping": {
"lines": [
316,
317
],
"start": 11000,
"length": 40,
"ending_column": 7,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 23,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"additional_fields": {
"underlying_type": "external_calls"
},
"type_specific_fields": {
"parent": {
"name": "do_redemption",
"type": "function",
"source_mapping": {
"lines": [
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321
],
"start": 10742,
"length": 409,
"ending_column": 9,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 44,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "SharkPool",
"type": "contract",
"source_mapping": {
"lines": [
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334
],
"start": 2391,
"length": 9156,
"ending_column": 12,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 36,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
}
},
"signature": "do_redemption()"
}
}
}
},
{
"name": "base_contract.transfer(msg.sender,remainder)",
"type": "node",
"source_mapping": {
"lines": [
319,
320
],
"start": 11060,
"length": 45,
"ending_column": 9,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 4,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"additional_fields": {
"underlying_type": "external_calls"
},
"type_specific_fields": {
"parent": {
"name": "do_redemption",
"type": "function",
"source_mapping": {
"lines": [
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321
],
"start": 10742,
"length": 409,
"ending_column": 9,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 44,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "SharkPool",
"type": "contract",
"source_mapping": {
"lines": [
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334
],
"start": 2391,
"length": 9156,
"ending_column": 12,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 36,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
}
},
"signature": "do_redemption()"
}
}
}
},
{
"name": "balances[msg.sender] = 0",
"type": "node",
"source_mapping": {
"lines": [
320
],
"start": 11115,
"length": 24,
"ending_column": 43,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 19,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"additional_fields": {
"variable_name": "balances",
"underlying_type": "variables_written"
},
"type_specific_fields": {
"parent": {
"name": "do_redemption",
"type": "function",
"source_mapping": {
"lines": [
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321
],
"start": 10742,
"length": 409,
"ending_column": 9,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 44,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "SharkPool",
"type": "contract",
"source_mapping": {
"lines": [
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334
],
"start": 2391,
"length": 9156,
"ending_column": 12,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 36,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
}
},
"signature": "do_redemption()"
}
}
}
}
],
"locations": [
{
"file": "contracts/Contract.sol",
"name": "do_redemption",
"type": "function",
"lines": [
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321
]
},
{
"file": "contracts/Contract.sol",
"name": "base_contract.transfer(owner,owner_cut)",
"type": "node",
"lines": [
316,
317
]
},
{
"file": "contracts/Contract.sol",
"name": "base_contract.transfer(msg.sender,remainder)",
"type": "node",
"lines": [
319,
320
]
},
{
"file": "contracts/Contract.sol",
"name": "balances[msg.sender] = 0",
"type": "node",
"lines": [
320
]
}
],
"description": "Reentrancy in SharkPool.do_redemption() (contracts/Contract.sol#310-321):\n\tExternal calls:\n\t- base_contract.transfer(owner,owner_cut) (contracts/Contract.sol#316-317)\n\t- base_contract.transfer(msg.sender,remainder) (contracts/Contract.sol#319-320)\n\tState variables written after the call(s):\n\t- balances[msg.sender] = 0 (contracts/Contract.sol#320)\n\tSharkPool.balances (contracts/Contract.sol#117-120) can be used in cross function reentrancies:\n\t- SharkPool.balanceOf(address) (contracts/Contract.sol#122-124)\n\t- SharkPool.do_redemption() (contracts/Contract.sol#310-321)"
}
|
| medium | other | codex | Slot reuse bug can overwrite active users when pool is full | 75 | no | — |
viewevidence_json{
"evidence": "`uint8 location = slots[slots.length-1]; ... delete slots[slots.length-1];` does not reduce `slots.length`.",
"locations": [
"contracts/Contract.sol:154",
"contracts/Contract.sol:165"
],
"recommendation": "Use `slots.length--` (or `slots.pop()` in newer Solidity) after reading the last slot, and consider validating the slot index before assignment.",
"exploit_scenario": "When `total_users` has reached `max_users`, new allocations reuse `slots[slots.length-1]` and then `delete` the element without shrinking the array. This leaves a zero value at the end and keeps `slots.length` unchanged, so subsequent allocations often reuse slot 0 and can overwrite an active user, removing their contribution and skewing rewards."
}
|
| medium | reentrancy | codex | Fallback redemption performs external token transfers before clearing balance and without reentrancy guard | 75 | no | — |
viewevidence_json{
"evidence": "`function () payable { ... do_redemption(); }` and `do_redemption()` transfers tokens before `balances[msg.sender] = 0`.",
"locations": [
"contracts/Contract.sol:229",
"contracts/Contract.sol:319"
],
"recommendation": "Apply `nonReentrant` (or a dedicated reentrancy lock) to the payable fallback or avoid calling `do_redemption()` from it; update `balances[msg.sender]` before external calls (checks-effects-interactions) and revert on failed transfers.",
"exploit_scenario": "If the Bitcoineum token contract (or an ERC223/777-style token) triggers callbacks on transfer, a malicious recipient contract can reenter `redeem()` or the payable fallback during `do_redemption()` and withdraw its `balances[msg.sender]` multiple times before it is set to 0, draining token rewards."
}
|
| medium | reentrancy | slither | Reentrancy in SharkPool.fallback() (contracts/Contract.sol#225-252): | 75 | no | — |
viewevidence_json{
"impact": "Medium",
"detector": "reentrancy-no-eth",
"elements": [
{
"name": "fallback",
"type": "function",
"source_mapping": {
"lines": [
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252
],
"start": 7289,
"length": 1225,
"ending_column": 17,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 11,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "SharkPool",
"type": "contract",
"source_mapping": {
"lines": [
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334
],
"start": 2391,
"length": 9156,
"ending_column": 12,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 36,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
}
},
"signature": "fallback()"
}
},
{
"name": "require(bool)(msg.value >= calculate_minimum_contribution())",
"type": "node",
"source_mapping": {
"lines": [
225,
226
],
"start": 7320,
"length": 54,
"ending_column": 12,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 42,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"additional_fields": {
"underlying_type": "external_calls"
},
"type_specific_fields": {
"parent": {
"name": "fallback",
"type": "function",
"source_mapping": {
"lines": [
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252
],
"start": 7289,
"length": 1225,
"ending_column": 17,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 11,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "SharkPool",
"type": "contract",
"source_mapping": {
"lines": [
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334
],
"start": 2391,
"length": 9156,
"ending_column": 12,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 36,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
}
},
"signature": "fallback()"
}
}
}
},
{
"name": "base_contract.currentDifficultyWei() / 10000000 * contract_period",
"type": "node",
"source_mapping": {
"lines": [
217,
218,
219,
220
],
"start": 7145,
"length": 72,
"ending_column": 55,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 71,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"additional_fields": {
"underlying_type": "external_calls_sending_eth"
},
"type_specific_fields": {
"parent": {
"name": "calculate_minimum_contribution",
"type": "function",
"source_mapping": {
"lines": [
216,
217,
218,
219,
220
],
"start": 7059,
"length": 165,
"ending_column": 62,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 29,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "SharkPool",
"type": "contract",
"source_mapping": {
"lines": [
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334
],
"start": 2391,
"length": 9156,
"ending_column": 12,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 36,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
}
},
"signature": "calculate_minimum_contribution()"
}
}
}
},
{
"name": "do_redemption()",
"type": "node",
"source_mapping": {
"lines": [
243
],
"start": 8210,
"length": 15,
"ending_column": 56,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 41,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"additional_fields": {
"underlying_type": "external_calls"
},
"type_specific_fields": {
"parent": {
"name": "fallback",
"type": "function",
"source_mapping": {
"lines": [
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252
],
"start": 7289,
"length": 1225,
"ending_column": 17,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 11,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "SharkPool",
"type": "contract",
"source_mapping": {
"lines": [
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334
],
"start": 2391,
"length": 9156,
"ending_column": 12,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 36,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
}
},
"signature": "fallback()"
}
}
}
},
{
"name": "base_contract.transfer(owner,owner_cut)",
"type": "node",
"source_mapping": {
"lines": [
316,
317
],
"start": 11000,
"length": 40,
"ending_column": 7,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 23,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"additional_fields": {
"underlying_type": "external_calls_sending_eth"
},
"type_specific_fields": {
"parent": {
"name": "do_redemption",
"type": "function",
"source_mapping": {
"lines": [
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321
],
"start": 10742,
"length": 409,
"ending_column": 9,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 44,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
},
"type_specific_fields": {
"parent": {
"name": "SharkPool",
"type": "contract",
"source_mapping": {
"lines": [
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334
],
"start": 2391,
"length": 9156,
"ending_column": 12,
"is_dependency": false,
"filename_short": "contracts/Contract.sol",
"starting_column": 36,
"filename_absolute": "/tmp/slither-dbj2922e/contracts/Contract.sol",
"filename_relative": "contracts/Contract.sol"
}
},
"signature": "do_redemption()"
}
}
}
}
],
"locations": [
{
"file": "contracts/Contract.sol",
"name": "fallback",
"type": "function",
"lines": [
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252
]
},
{
"file": "contracts/Contract.sol",
"name": "require(bool)(msg.value >= calculate_minimum_contribution())",
"type": "node",
"lines": [
225,
226
]
},
{
"file": "contracts/Contract.sol",
"name": "base_contract.currentDifficultyWei() / 10000000 * contract_period",
"type": "node",
"lines": [
217,
218,
219,
220
]
},
{
"file": "contracts/Contract.sol",
"name": "do_redemption()",
"type": "node",
"lines": [
243
]
},
{
"file": "contracts/Contract.sol",
"name": "base_contract.transfer(owner,owner_cut)",
"type": "node",
"lines": [
316,
317
]
},
{
"file": "contracts/Contract.sol",
"name": "base_contract.transfer(msg.sender,remainder)",
"type": "node",
"lines": [
319,
320
]
},
{
"file": "contracts/Contract.sol",
"name": "current_user.start_block = mined_blocks",
"type": "node",
"lines": [
248
]
},
{
"file": "contracts/Contract.sol",
"name": "current_user.end_block = mined_blocks + contract_period",
"type": "node",
"lines": [
248,
249,
250,
251,
252
]
}
],
"description": "Reentrancy in SharkPool.fallback() (contracts/Contract.sol#225-252):\n\tExternal calls:\n\t- require(bool)(msg.value >= calculate_minimum_contribution()) (contracts/Contract.sol#225-226)\n\t\t- base_contract.currentDifficultyWei() / 10000000 * contract_period (contracts/Contract.sol#217-220)\n\t- do_redemption() (contracts/Contract.sol#243)\n\t\t- base_contract.transfer(owner,owner_cut) (contracts/Contract.sol#316-317)\n\t\t- base_contract.transfer(msg.sender,remainder) (contracts/Contract.sol#319-320)\n\tState variables written after the call(s):\n\t- current_user.start_block = mined_blocks (contracts/Contract.sol#248)\n\tSharkPool.users (contracts/Contract.sol#114-116) can be used in cross function reentrancies:\n\t- SharkPool.fallback() (contracts/Contract.sol#225-252)\n\t- SharkPool.find_contribution(address) (contracts/Contract.sol#130-148)\n\t- SharkPool.users (contracts/Contract.sol#114-116)\n\t- current_user.end_block = mined_blocks + contract_period (contracts/Contract.sol#248-252)\n\tSharkPool.users (contracts/Contract.sol#114-116) can be used in cross function reentrancies:\n\t- SharkPool.fallback() (contracts/Contract.sol#225-252)\n\t- SharkPool.find_contribution(address) (contracts/Contract.sol#130-148)\n\t- SharkPool.users (contracts/Contract.sol#114-116)"
}
|
| low | other | codex | Expired users are not removed from the mapping, preventing re-join and mis-accounting contributions | 65 | no | — |
viewevidence_json{
"evidence": "`delete active_users[i]; ... delete users[active_users[i]];` deletes the mapping at address 0 instead of the ejected user.",
"locations": [
"contracts/Contract.sol:272",
"contracts/Contract.sol:281"
],
"recommendation": "Store the address before clearing the slot and delete `users[addr]` first; alternatively, clear `users[msg.sender]` when a user is no longer active and ensure re-joins allocate a slot.",
"exploit_scenario": "During ejection, the code deletes `active_users[i]` before deleting the user, so it ends up deleting `users[0]` and leaving the expired user mapping intact. Later, that user still has `start_block > 0`, so the fallback path skips `allocate_slot` and accepts deposits that never get mined, effectively burning the contribution."
}
|
| low | other | codex | Unchecked token transfer return values can zero balances without payout | 65 | no | — |
viewevidence_json{
"evidence": "`base_contract.transfer(owner, owner_cut);` and `base_contract.transfer(msg.sender, remainder);` are unchecked but `balances[msg.sender]` is cleared afterwards.",
"locations": [
"contracts/Contract.sol:325",
"contracts/Contract.sol:327"
],
"recommendation": "Require `base_contract.transfer(...)` to return true and revert on failure before clearing balances.",
"exploit_scenario": "If the Bitcoineum token `transfer` returns `false` (e.g., paused token or failure), `do_redemption()` still sets `balances[msg.sender] = 0`, causing the user to lose rewards without receiving tokens."
}
|
| 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": 11
}
|