019d451d-12b9-703e-95cd-186aabb998b8
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 |
|---|---|---|---|---|
| 42708 | artifact.fetch | complete | 1 / 3 | 2 weeks ago |
| 42709 | proxy.resolve | complete | 1 / 3 | 2 weeks ago |
| 42710 | tool.cast_disasm | complete | 1 / 3 | 2 weeks ago |
| 42711 | analysis.bundle | complete | 1 / 3 | 2 weeks ago |
| 42712 | capability.graph | complete | 1 / 3 | 2 weeks ago |
| 42713 | detector.run | complete | 1 / 3 | 2 weeks ago |
| 42714 | validation.fork | complete | 1 / 3 | 2 weeks ago |
| 42717 | report.consolidate | complete | 1 / 6 | 2 weeks ago |
| 42718 | tool.slither | complete | 1 / 2 | 2 weeks ago |
{
"status": "not_proxy"
}
'forge clean' running (wd: /tmp/slither-mtmdz1mn)
'forge config --json' running
'forge build --build-info --skip ./test/** ./script/** --force' running (wd: /tmp/slither-mtmdz1mn)
ERC4626Upgradeable._deposit(address,address,uint256,uint256) (contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol#245-262) uses arbitrary from in transferFrom: SafeERC20Upgradeable.safeTransferFrom(_asset,caller,address(this),assets) (contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol#258)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#arbitrary-from-in-transferfrom
Staking.pushToBeacon(Staking.Node[],uint256,uint256,bytes32) (contracts/Staking.sol#296-337) sends eth to arbitrary user
Dangerous calls:
- depositContract.deposit{value: 32000000000000000000}(_nodes[i].pubkey,_withdrawalCredential,_nodes[i].signature,_nodes[i].depositDataRoot) (contracts/Staking.sol#326-331)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#functions-that-send-ether-to-arbitrary-destinations
MathUpgradeable.mulDiv(uint256,uint256,uint256) (@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol#55-134) has bitwise-xor operator ^ instead of the exponentiation operator **:
- inverse = (3 * denominator) ^ 2 (@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol#116)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#incorrect-exponentiation
Reentrancy in Staking._deposit(address,address,uint256,uint256) (contracts/Staking.sol#381-408):
External calls:
- (sharesFromPool,assetsToPool) = _getmpETHFromPool(_shares,address(this)) (contracts/Staking.sol#388)
- assert(bool)(LiquidUnstakePool(liquidUnstakePool).swapETHFormpETH{value: assetsToPool}(_receiver) == sharesFromPool) (contracts/Staking.sol#423-427)
State variables written after the call(s):
- _mint(address(this),sharesToMint) (contracts/Staking.sol#392)
- _balances[account] += amount (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#264)
ERC20Upgradeable._balances (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#40) can be used in cross function reentrancies:
- ERC20Upgradeable._burn(address,uint256) (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#282-298)
- ERC20Upgradeable._mint(address,uint256) (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#256-269)
- ERC20Upgradeable._transfer(address,address,uint256) (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#227-245)
- ERC20Upgradeable.balanceOf(address) (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#106-108)
- _transfer(address(this),treasury,sharesToTreasury) (contracts/Staking.sol#400)
- _balances[from] = fromBalance - amount (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#236)
- _balances[to] += amount (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#239)
ERC20Upgradeable._balances (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#40) can be used in cross function reentrancies:
- ERC20Upgradeable._burn(address,uint256) (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#282-298)
- ERC20Upgradeable._mint(address,uint256) (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#256-269)
- ERC20Upgradeable._transfer(address,address,uint256) (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#227-245)
- ERC20Upgradeable.balanceOf(address) (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#106-108)
- _transfer(address(this),_receiver,sharesToUser) (contracts/Staking.sol#405)
- _balances[from] = fromBalance - amount (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#236)
- _balances[to] += amount (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#239)
ERC20Upgradeable._balances (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#40) can be used in cross function reentrancies:
- ERC20Upgradeable._burn(address,uint256) (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#282-298)
- ERC20Upgradeable._mint(address,uint256) (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#256-269)
- ERC20Upgradeable._transfer(address,address,uint256) (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#227-245)
- ERC20Upgradeable.balanceOf(address) (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#106-108)
- _mint(address(this),sharesToMint) (contracts/Staking.sol#392)
- _totalSupply += amount (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#261)
ERC20Upgradeable._totalSupply (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#44) can be used in cross function reentrancies:
- ERC20Upgradeable._burn(address,uint256) (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#282-298)
- ERC20Upgradeable._mint(address,uint256) (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#256-269)
- ERC20Upgradeable.totalSupply() (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#99-101)
- totalUnderlying += assetsToAdd (contracts/Staking.sol#393)
Staking.totalUnderlying (contracts/Staking.sol#45) can be used in cross function reentrancies:
- Staking._deposit(address,address,uint256,uint256) (contracts/Staking.sol#381-408)
- Staking._withdraw(address,address,address,uint256,uint256) (contracts/Staking.sol#433-448)
- Staking.initialize(address,address,address,IERC20MetadataUpgradeable,address,address,address,address,uint256,uint256) (contracts/Staking.sol#107-144)
- Staking.reportEpochs(Staking.EpochsReport,int256) (contracts/Staking.sol#260-289)
- Staking.totalAssets() (contracts/Staking.sol#155-163)
- Staking.totalUnderlying (contracts/Staking.sol#45)
Reentrancy in Staking.pushToBeacon(Staking.Node[],uint256,uint256,bytes32) (contracts/Staking.sol#296-337):
External calls:
- LiquidUnstakePool(liquidUnstakePool).getEthForValidator(_requestPoolAmount) (contracts/Staking.sol#317)
- Withdrawal(withdrawal).getEthForValidator(_requestWithdrawalAmount) (contracts/Staking.sol#319)
- depositContract.deposit{value: 32000000000000000000}(_nodes[i].pubkey,_withdrawalCredential,_nodes[i].signature,_nodes[i].depositDataRoot) (contracts/Staking.sol#326-331)
External calls sending eth:
- depositContract.deposit{value: 32000000000000000000}(_nodes[i].pubkey,_withdrawalCredential,_nodes[i].signature,_nodes[i].depositDataRoot) (contracts/Staking.sol#326-331)
State variables written after the call(s):
- nodePubkeyUsed[_nodes[i].pubkey] = true (contracts/Staking.sol#325)
Staking.nodePubkeyUsed (contracts/Staking.sol#52) can be used in cross function reentrancies:
- Staking.nodePubkeyUsed (contracts/Staking.sol#52)
- Staking.pushToBeacon(Staking.Node[],uint256,uint256,bytes32) (contracts/Staking.sol#296-337)
- totalNodesActivated = _totalNodesActivated (contracts/Staking.sol#336)
Staking.totalNodesActivated (contracts/Staking.sol#47) can be used in cross function reentrancies:
- Staking.pushToBeacon(Staking.Node[],uint256,uint256,bytes32) (contracts/Staking.sol#296-337)
- Staking.totalNodesActivated (contracts/Staking.sol#47)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities
MathUpgradeable.mulDiv(uint256,uint256,uint256) (@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol#55-134) performs a multiplication on the result of a division:
- denominator = denominator / twos (@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol#101)
- inverse = (3 * denominator) ^ 2 (@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol#116)
MathUpgradeable.mulDiv(uint256,uint256,uint256) (@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol#55-134) performs a multiplication on the result of a division:
- denominator = denominator / twos (@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol#101)
- inverse *= 2 - denominator * inverse (@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol#120)
MathUpgradeable.mulDiv(uint256,uint256,uint256) (@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol#55-134) performs a multiplication on the result of a division:
- denominator = denominator / twos (@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol#101)
- inverse *= 2 - denominator * inverse (@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol#121)
MathUpgradeable.mulDiv(uint256,uint256,uint256) (@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol#55-134) performs a multiplication on the result of a division:
- denominator = denominator / twos (@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol#101)
- inverse *= 2 - denominator * inverse (@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol#122)
MathUpgradeable.mulDiv(uint256,uint256,uint256) (@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol#55-134) performs a multiplication on the result of a division:
- denominator = denominator / twos (@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol#101)
- inverse *= 2 - denominator * inverse (@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol#123)
MathUpgradeable.mulDiv(uint256,uint256,uint256) (@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol#55-134) performs a multiplication on the result of a division:
- denominator = denominator / twos (@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol#101)
- inverse *= 2 - denominator * inverse (@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol#124)
MathUpgradeable.mulDiv(uint256,uint256,uint256) (@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol#55-134) performs a multiplication on the result of a division:
- denominator = denominator / twos (@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol#101)
- inverse *= 2 - denominator * inverse (@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol#125)
MathUpgradeable.mulDiv(uint256,uint256,uint256) (@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol#55-134) performs a multiplication on the result of a division:
- prod0 = prod0 / twos (@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol#104)
- result = prod0 * inverse (@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol#131)
LiquidUnstakePool.withdraw(uint256,address,address) (contracts/LiquidUnstakePool.sol#175-193) performs a multiplication on the result of a division:
- poolPercentage = (_assets * 1000000000000000000) / totalAssets() (contracts/LiquidUnstakePool.sol#182)
- ETHToSend = (poolPercentage * ethBalance) / 1000000000000000000 (contracts/LiquidUnstakePool.sol#184)
LiquidUnstakePool.withdraw(uint256,address,address) (contracts/LiquidUnstakePool.sol#175-193) performs a multiplication on the result of a division:
- poolPercentage = (_assets * 1000000000000000000) / totalAssets() (contracts/LiquidUnstakePool.sol#182)
- mpETHToSend = (poolPercentage * Staking(STAKING).balanceOf(address(this))) / 1000000000000000000 (contracts/LiquidUnstakePool.sol#185-186)
LiquidUnstakePool.redeem(uint256,address,address) (contracts/LiquidUnstakePool.sol#197-214) performs a multiplication on the result of a division:
- poolPercentage = (_shares * 1000000000000000000) / totalSupply() (contracts/LiquidUnstakePool.sol#203)
- ETHToSend = (poolPercentage * ethBalance) / 1000000000000000000 (contracts/LiquidUnstakePool.sol#205)
LiquidUnstakePool.redeem(uint256,address,address) (contracts/LiquidUnstakePool.sol#197-214) performs a multiplication on the result of a division:
- poolPercentage = (_shares * 1000000000000000000) / totalSupply() (contracts/LiquidUnstakePool.sol#203)
- mpETHToSend = (poolPercentage * Staking(STAKING).balanceOf(address(this))) / 1000000000000000000 (contracts/LiquidUnstakePool.sol#206-207)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#divide-before-multiply
LiquidUnstakePool._getAssetsDeposit(uint256) (contracts/LiquidUnstakePool.sol#161-171) uses a dangerous strict equality:
- _assets == 0 (contracts/LiquidUnstakePool.sol#162)
LiquidUnstakePool.getAvailableEthForValidator() (contracts/LiquidUnstakePool.sol#277-282) uses a dangerous strict equality:
- totalAssets() == 0 (contracts/LiquidUnstakePool.sol#278)
LiquidUnstakePool.initialize(address,IERC20MetadataUpgradeable,address) (contracts/LiquidUnstakePool.sol#79-94) uses a dangerous strict equality:
- require(bool,string)(address(this).balance == 0,Error initialize with no zero balance) (contracts/LiquidUnstakePool.sol#84)
LiquidUnstakePool.redeem(uint256,address,address) (contracts/LiquidUnstakePool.sol#197-214) uses a dangerous strict equality:
- poolPercentage == 0 (contracts/LiquidUnstakePool.sol#204)
LiquidUnstakePool.withdraw(uint256,address,address) (contracts/LiquidUnstakePool.sol#175-193) uses a dangerous strict equality:
- poolPercentage == 0 (contracts/LiquidUnstakePool.sol#183)
Staking._getmpETHFromPool(uint256,address) (contracts/Staking.sol#414-430) uses a dangerous strict equality:
- assert(bool)(LiquidUnstakePool(liquidUnstakePool).swapETHFormpETH{value: assetsToPool}(_receiver) == sharesFromPool) (contracts/Staking.sol#423-427)
Staking.initialize(address,address,address,IERC20MetadataUpgradeable,address,address,address,address,uint256,uint256) (contracts/Staking.sol#107-144) uses a dangerous strict equality:
- require(bool,string)(address(this).balance == 0,Error initialize with no zero balance) (contracts/Staking.sol#125)
Withdrawal.initialize(address) (contracts/Withdrawal.sol#66-73) uses a dangerous strict equality:
- require(bool,string)(address(this).balance == 0,Error initialize with no zero balance) (contracts/Withdrawal.sol#67)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#dangerous-strict-equalities
LiquidUnstakePool.getEthForValidator(uint256) (contracts/LiquidUnstakePool.sol#257-264) ignores return value by Staking(STAKING).depositETH{value: _requestedETH}(address(this)) (contracts/LiquidUnstakePool.sol#262)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#unused-return
LiquidUnstakePool.withdraw(uint256,address,address)._owner (contracts/LiquidUnstakePool.sol#178) shadows:
- OwnableUpgradeable._owner (@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol#22) (state variable)
LiquidUnstakePool.redeem(uint256,address,address)._owner (contracts/LiquidUnstakePool.sol#200) shadows:
- OwnableUpgradeable._owner (@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol#22) (state variable)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#local-variable-shadowing
LiquidUnstakePool.updateTargetLiquidity(uint256) (contracts/LiquidUnstakePool.sol#101-103) should emit an event for:
- targetLiquidity = _targetLiquidity (contracts/LiquidUnstakePool.sol#102)
LiquidUnstakePool.updateMinETHPercentage(uint256) (contracts/LiquidUnstakePool.sol#107-109) should emit an event for:
- minETHPercentage = _minETHPercentage (contracts/LiquidUnstakePool.sol#108)
LiquidUnstakePool.updateSwapFees(uint16,uint16,uint16) (contracts/LiquidUnstakePool.sol#113-119) should emit an event for:
- minFee = _minFee (contracts/LiquidUnstakePool.sol#116)
- maxFee = _maxFee (contracts/LiquidUnstakePool.sol#117)
- treasuryFee = _treasuryFee (contracts/LiquidUnstakePool.sol#118)
LiquidUnstakePool.swapETHFormpETH(address) (contracts/LiquidUnstakePool.sol#267-275) should emit an event for:
- ethBalance += msg.value (contracts/LiquidUnstakePool.sol#273)
Staking.initialize(address,address,address,IERC20MetadataUpgradeable,address,address,address,address,uint256,uint256) (contracts/Staking.sol#107-144) should emit an event for:
- totalUnderlying = _totalUnderlying (contracts/Staking.sol#142)
Withdrawal.setValidatorsDisassembleTime(uint32) (contracts/Withdrawal.sol#96-100) should emit an event for:
- validatorsDisassembleTime = _disassembleTime (contracts/Withdrawal.sol#99)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#missing-events-arithmetic
LiquidUnstakePool.initialize(address,IERC20MetadataUpgradeable,address)._staking (contracts/LiquidUnstakePool.sol#80) lacks a zero-check on :
- STAKING = _staking (contracts/LiquidUnstakePool.sol#90)
LiquidUnstakePool.initialize(address,IERC20MetadataUpgradeable,address)._treasury (contracts/LiquidUnstakePool.sol#82) lacks a zero-check on :
- treasury = _treasury (contracts/LiquidUnstakePool.sol#91)
Withdrawal.initialize(address)._mpETH (contracts/Withdrawal.sol#66) lacks a zero-check on :
- mpETH = _mpETH (contracts/Withdrawal.sol#70)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#missing-zero-address-validation
Staking.pushToBeacon(Staking.Node[],uint256,uint256,bytes32) (contracts/Staking.sol#296-337) has external calls inside a loop: depositContract.deposit{value: 32000000000000000000}(_nodes[i].pubkey,_withdrawalCredential,_nodes[i].signature,_nodes[i].depositDataRoot) (contracts/Staking.sol#326-331)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation/#calls-inside-a-loop
Reentrancy in LiquidUnstakePool._deposit(address,address,uint256,uint256) (contracts/LiquidUnstakePool.sol#146-157):
External calls:
- _assets = _getAssetsDeposit(_assets) (contracts/LiquidUnstakePool.sol#152)
- returndata = address(token).functionCall(data,SafeERC20: low-level call failed) (@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol#122)
- IERC20Upgradeable(asset()).safeTransferFrom(msg.sender,address(this),_assets) (contracts/LiquidUnstakePool.sol#167)
- (success,returndata) = target.call{value: value}(data) (@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol#135)
- IWETH(asset()).withdraw(_assets) (contracts/LiquidUnstakePool.sol#168)
External calls sending eth:
- _assets = _getAssetsDeposit(_assets) (contracts/LiquidUnstakePool.sol#152)
- (success,returndata) = target.call{value: value}(data) (@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol#135)
State variables written after the call(s):
- _mint(_receiver,_shares) (contracts/LiquidUnstakePool.sol#154)
- _balances[account] += amount (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#264)
- _mint(_receiver,_shares) (contracts/LiquidUnstakePool.sol#154)
- _totalSupply += amount (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#261)
- ethBalance += _assets (contracts/LiquidUnstakePool.sol#155)
Reentrancy in ERC4626Upgradeable._deposit(address,address,uint256,uint256) (contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol#245-262):
External calls:
- SafeERC20Upgradeable.safeTransferFrom(_asset,caller,address(this),assets) (contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol#258)
State variables written after the call(s):
- _mint(receiver,shares) (contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol#259)
- _balances[account] += amount (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#264)
- _mint(receiver,shares) (contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol#259)
- _totalSupply += amount (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#261)
Reentrancy in LiquidUnstakePool.swapETHFormpETH(address) (contracts/LiquidUnstakePool.sol#267-275):
External calls:
- IERC20Upgradeable(staking).safeTransfer(_to,mpETHToSend) (contracts/LiquidUnstakePool.sol#272)
State variables written after the call(s):
- ethBalance += msg.value (contracts/LiquidUnstakePool.sol#273)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-2
Reentrancy in Staking._deposit(address,address,uint256,uint256) (contracts/Staking.sol#381-408):
External calls:
- (sharesFromPool,assetsToPool) = _getmpETHFromPool(_shares,address(this)) (contracts/Staking.sol#388)
- assert(bool)(LiquidUnstakePool(liquidUnstakePool).swapETHFormpETH{value: assetsToPool}(_receiver) == sharesFromPool) (contracts/Staking.sol#423-427)
Event emitted after the call(s):
- Deposit(_caller,_receiver,_assets,_shares) (contracts/Staking.sol#407)
- Transfer(address(0),account,amount) (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#266)
- _mint(address(this),sharesToMint) (contracts/Staking.sol#392)
- Transfer(from,to,amount) (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#242)
- _transfer(address(this),treasury,sharesToTreasury) (contracts/Staking.sol#400)
- Transfer(from,to,amount) (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#242)
- _transfer(address(this),_receiver,sharesToUser) (contracts/Staking.sol#405)
Reentrancy in ERC4626Upgradeable._deposit(address,address,uint256,uint256) (contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol#245-262):
External calls:
- SafeERC20Upgradeable.safeTransferFrom(_asset,caller,address(this),assets) (contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol#258)
Event emitted after the call(s):
- Deposit(caller,receiver,assets,shares) (contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol#261)
- Transfer(address(0),account,amount) (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#266)
- _mint(receiver,shares) (contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol#259)
Reentrancy in Staking._withdraw(address,address,address,uint256,uint256) (contracts/Staking.sol#433-448):
External calls:
- Withdrawal(withdrawal).requestWithdraw(assets,caller,receiver) (contracts/Staking.sol#445)
Event emitted after the call(s):
- Withdraw(caller,receiver,owner,assets,shares) (contracts/Staking.sol#447)
Reentrancy in ERC4626Upgradeable._withdraw(address,address,address,uint256,uint256) (contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol#267-288):
External calls:
- SafeERC20Upgradeable.safeTransfer(_asset,receiver,assets) (contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol#285)
Event emitted after the call(s):
- Withdraw(caller,receiver,owner,assets,shares) (contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol#287)
Reentrancy in Withdrawal.completeWithdraw() (contracts/Withdrawal.sol#124-142):
External calls:
- address(_withdrawR.receiver).sendValue(_withdrawR.amount) (contracts/Withdrawal.sol#135)
Event emitted after the call(s):
- CompleteWithdraw(msg.sender,_withdrawR.amount,_withdrawR.receiver,_withdrawR.unlockEpoch) (contracts/Withdrawal.sol#136-141)
Reentrancy in Staking.deposit(uint256,address) (contracts/Staking.sol#351-357):
External calls:
- IERC20Upgradeable(asset()).safeTransferFrom(msg.sender,address(this),_assets) (contracts/Staking.sol#353)
- IWETH(asset()).withdraw(_assets) (contracts/Staking.sol#354)
- _deposit(msg.sender,_receiver,_assets,_shares) (contracts/Staking.sol#355)
- assert(bool)(LiquidUnstakePool(liquidUnstakePool).swapETHFormpETH{value: assetsToPool}(_receiver) == sharesFromPool) (contracts/Staking.sol#423-427)
External calls sending eth:
- _deposit(msg.sender,_receiver,_assets,_shares) (contracts/Staking.sol#355)
- assert(bool)(LiquidUnstakePool(liquidUnstakePool).swapETHFormpETH{value: assetsToPool}(_receiver) == sharesFromPool) (contracts/Staking.sol#423-427)
Event emitted after the call(s):
- Deposit(_caller,_receiver,_assets,_shares) (contracts/Staking.sol#407)
- _deposit(msg.sender,_receiver,_assets,_shares) (contracts/Staking.sol#355)
- Transfer(address(0),account,amount) (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#266)
- _deposit(msg.sender,_receiver,_assets,_shares) (contracts/Staking.sol#355)
- Transfer(from,to,amount) (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#242)
- _deposit(msg.sender,_receiver,_assets,_shares) (contracts/Staking.sol#355)
Reentrancy in Staking.mint(uint256,address) (contracts/Staking.sol#360-369):
External calls:
- IERC20Upgradeable(asset()).safeTransferFrom(msg.sender,address(this),assets) (contracts/Staking.sol#364)
- IWETH(asset()).withdraw(assets) (contracts/Staking.sol#365)
- _deposit(_msgSender(),_receiver,assets,_shares) (contracts/Staking.sol#366)
- assert(bool)(LiquidUnstakePool(liquidUnstakePool).swapETHFormpETH{value: assetsToPool}(_receiver) == sharesFromPool) (contracts/Staking.sol#423-427)
External calls sending eth:
- _deposit(_msgSender(),_receiver,assets,_shares) (contracts/Staking.sol#366)
- assert(bool)(LiquidUnstakePool(liquidUnstakePool).swapETHFormpETH{value: assetsToPool}(_receiver) == sharesFromPool) (contracts/Staking.sol#423-427)
Event emitted after the call(s):
- Deposit(_caller,_receiver,_assets,_shares) (contracts/Staking.sol#407)
- _deposit(_msgSender(),_receiver,assets,_shares) (contracts/Staking.sol#366)
- Transfer(address(0),account,amount) (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#266)
- _deposit(_msgSender(),_receiver,assets,_shares) (contracts/Staking.sol#366)
- Transfer(from,to,amount) (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#242)
- _deposit(_msgSender(),_receiver,assets,_shares) (contracts/Staking.sol#366)
Reentrancy in Staking.pushToBeacon(Staking.Node[],uint256,uint256,bytes32) (contracts/Staking.sol#296-337):
External calls:
- LiquidUnstakePool(liquidUnstakePool).getEthForValidator(_requestPoolAmount) (contracts/Staking.sol#317)
- Withdrawal(withdrawal).getEthForValidator(_requestWithdrawalAmount) (contracts/Staking.sol#319)
- depositContract.deposit{value: 32000000000000000000}(_nodes[i].pubkey,_withdrawalCredential,_nodes[i].signature,_nodes[i].depositDataRoot) (contracts/Staking.sol#326-331)
External calls sending eth:
- depositContract.deposit{value: 32000000000000000000}(_nodes[i].pubkey,_withdrawalCredential,_nodes[i].signature,_nodes[i].depositDataRoot) (contracts/Staking.sol#326-331)
Event emitted after the call(s):
- Stake(_totalNodesActivated,_nodes[i].pubkey) (contracts/Staking.sol#333)
Reentrancy in LiquidUnstakePool.withdraw(uint256,address,address) (contracts/LiquidUnstakePool.sol#175-193):
External calls:
- IERC20Upgradeable(STAKING).safeTransfer(_receiver,mpETHToSend) (contracts/LiquidUnstakePool.sol#189)
- address(_receiver).sendValue(ETHToSend) (contracts/LiquidUnstakePool.sol#190)
Event emitted after the call(s):
- RemoveLiquidity(msg.sender,_owner,shares,ETHToSend,mpETHToSend) (contracts/LiquidUnstakePool.sol#191)
- Withdraw(msg.sender,_receiver,_owner,ETHToSend,shares) (contracts/LiquidUnstakePool.sol#192)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-3
Staking.totalAssets() (contracts/Staking.sol#155-163) uses timestamp for comparisons
Dangerous comparisons:
- rewardsSinceUpdate >= 0 (contracts/Staking.sol#158)
Staking.updateEstimatedRewardsPerSecond(int256) (contracts/Staking.sol#222-235) uses timestamp for comparisons
Dangerous comparisons:
- _estimatedRewardsPerSecond > int256(maxEstimatedRewardsPerSecond) || _estimatedRewardsPerSecond < - int256(maxEstimatedRewardsPerSecond) (contracts/Staking.sol#227-228)
Staking.reportEpochs(Staking.EpochsReport,int256) (contracts/Staking.sol#260-289) uses timestamp for comparisons
Dangerous comparisons:
- diff > maxDiff (contracts/Staking.sol#277)
Staking._deposit(address,address,uint256,uint256) (contracts/Staking.sol#381-408) uses timestamp for comparisons
Dangerous comparisons:
- _assets < MIN_DEPOSIT (contracts/Staking.sol#387)
- sharesToMint > 0 (contracts/Staking.sol#392)
- sharesToTreasury > 0 (contracts/Staking.sol#399)
Staking._getmpETHFromPool(uint256,address) (contracts/Staking.sol#414-430) uses timestamp for comparisons
Dangerous comparisons:
- sharesFromPool > 0 (contracts/Staking.sol#421)
- assert(bool)(LiquidUnstakePool(liquidUnstakePool).swapETHFormpETH{value: assetsToPool}(_receiver) == sharesFromPool) (contracts/Staking.sol#423-427)
Withdrawal.requestWithdraw(uint256,address,address) (contracts/Withdrawal.sol#107-121) uses timestamp for comparisons
Dangerous comparisons:
- currentEpoch < withdrawalsStartEpoch (contracts/Withdrawal.sol#113)
Withdrawal.completeWithdraw() (contracts/Withdrawal.sol#124-142) uses timestamp for comparisons
Dangerous comparisons:
- block.timestamp < unlockTime (contracts/Withdrawal.sol#130)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#block-timestamp
AddressUpgradeable._revert(bytes,string) (@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol#231-243) uses assembly
- INLINE ASM (@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol#236-239)
StringsUpgradeable.toString(uint256) (@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol#19-39) uses assembly
- INLINE ASM (@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol#25-27)
- INLINE ASM (@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol#31-33)
MathUpgradeable.mulDiv(uint256,uint256,uint256) (@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol#55-134) uses assembly
- INLINE ASM (@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol#62-66)
- INLINE ASM (@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol#85-92)
- INLINE ASM (@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol#99-108)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#assembly-usage
5 different versions of Solidity are used:
- Version constraint ^0.8.0 is used by:
-^0.8.0 (@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol#4)
-^0.8.0 (@openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol#4)
-^0.8.0 (@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol#4)
-^0.8.0 (@openzeppelin/contracts-upgradeable/interfaces/IERC4626Upgradeable.sol#4)
-^0.8.0 (@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol#4)
-^0.8.0 (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#4)
-^0.8.0 (@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol#4)
-^0.8.0 (@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol#4)
-^0.8.0 (@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20PermitUpgradeable.sol#4)
-^0.8.0 (@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol#4)
-^0.8.0 (@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol#4)
-^0.8.0 (@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol#4)
-^0.8.0 (@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol#4)
-^0.8.0 (@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol#4)
-^0.8.0 (@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol#4)
-^0.8.0 (@openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol#4)
-^0.8.0 (@openzeppelin/contracts-upgradeable/utils/math/SignedMathUpgradeable.sol#4)
-^0.8.0 (contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol#11)
- Version constraint ^0.8.2 is used by:
-^0.8.2 (@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol#4)
- Version constraint ^0.8.1 is used by:
-^0.8.1 (@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol#4)
- Version constraint 0.8.4 is used by:
-0.8.4 (contracts/LiquidUnstakePool.sol#2)
-0.8.4 (contracts/Staking.sol#2)
-0.8.4 (contracts/Withdrawal.sol#2)
-0.8.4 (contracts/interfaces/IDeposit.sol#2)
-0.8.4 (contracts/interfaces/IWETH.sol#2)
- Version constraint >=0.4.16 is used by:
->=0.4.16 (lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol#4)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#different-pragma-directives-are-used
AccessControlUpgradeable.__AccessControl_init_unchained() (@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol#79-80) is never used and should be removed
AccessControlUpgradeable._setRoleAdmin(bytes32,bytes32) (@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol#221-225) is never used and should be removed
AccessControlUpgradeable._setupRole(bytes32,address) (@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol#212-214) is never used and should be removed
ContextUpgradeable.__Context_init() (@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol#18-19) is never used and should be removed
ContextUpgradeable.__Context_init_unchained() (@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol#21-22) is never used and should be removed
ContextUpgradeable._contextSuffixLength() (@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol#31-33) is never used and should be removed
ContextUpgradeable._msgData() (@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol#27-29) is never used and should be removed
ERC165Upgradeable.__ERC165_init() (@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol#24-25) is never used and should be removed
ERC165Upgradeable.__ERC165_init_unchained() (@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol#27-28) is never used and should be removed
ERC4626Upgradeable._deposit(address,address,uint256,uint256) (contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol#245-262) is never used and should be removed
ERC4626Upgradeable._withdraw(address,address,address,uint256,uint256) (contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol#267-288) is never used and should be removed
Initializable._getInitializedVersion() (@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol#156-158) is never used and should be removed
Initializable._isInitializing() (@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol#163-165) is never used and should be removed
ReentrancyGuardUpgradeable._reentrancyGuardEntered() (@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol#79-81) is never used and should be removed
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#dead-code
Version constraint ^0.8.0 contains known severe issues (https://solidity.readthedocs.io/en/latest/bugs.html)
- FullInlinerNonExpressionSplitArgumentEvaluationOrder
- MissingSideEffectsOnSelectorAccess
- AbiReencodingHeadOverflowWithStaticArrayCleanup
- DirtyBytesArrayToStorage
- DataLocationChangeInInternalOverride
- NestedCalldataArrayAbiReencodingSizeValidation
- SignedImmutables
- ABIDecodeTwoDimensionalArrayMemory
- KeccakCaching.
It is used by:
- ^0.8.0 (@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol#4)
- ^0.8.0 (@openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol#4)
- ^0.8.0 (@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol#4)
- ^0.8.0 (@openzeppelin/contracts-upgradeable/interfaces/IERC4626Upgradeable.sol#4)
- ^0.8.0 (@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol#4)
- ^0.8.0 (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#4)
- ^0.8.0 (@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol#4)
- ^0.8.0 (@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol#4)
- ^0.8.0 (@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20PermitUpgradeable.sol#4)
- ^0.8.0 (@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol#4)
- ^0.8.0 (@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol#4)
- ^0.8.0 (@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol#4)
- ^0.8.0 (@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol#4)
- ^0.8.0 (@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol#4)
- ^0.8.0 (@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol#4)
- ^0.8.0 (@openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol#4)
- ^0.8.0 (@openzeppelin/contracts-upgradeable/utils/math/SignedMathUpgradeable.sol#4)
- ^0.8.0 (contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol#11)
Version constraint ^0.8.2 contains known severe issues (https://solidity.readthedocs.io/en/latest/bugs.html)
- FullInlinerNonExpressionSplitArgumentEvaluationOrder
- MissingSideEffectsOnSelectorAccess
- AbiReencodingHeadOverflowWithStaticArrayCleanup
- DirtyBytesArrayToStorage
- DataLocationChangeInInternalOverride
- NestedCalldataArrayAbiReencodingSizeValidation
- SignedImmutables
- ABIDecodeTwoDimensionalArrayMemory
- KeccakCaching.
It is used by:
- ^0.8.2 (@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol#4)
Version constraint ^0.8.1 contains known severe issues (https://solidity.readthedocs.io/en/latest/bugs.html)
- FullInlinerNonExpressionSplitArgumentEvaluationOrder
- MissingSideEffectsOnSelectorAccess
- AbiReencodingHeadOverflowWithStaticArrayCleanup
- DirtyBytesArrayToStorage
- DataLocationChangeInInternalOverride
- NestedCalldataArrayAbiReencodingSizeValidation
- SignedImmutables
- ABIDecodeTwoDimensionalArrayMemory
- KeccakCaching.
It is used by:
- ^0.8.1 (@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol#4)
Version constraint 0.8.4 contains known severe issues (https://solidity.readthedocs.io/en/latest/bugs.html)
- FullInlinerNonExpressionSplitArgumentEvaluationOrder
- MissingSideEffectsOnSelectorAccess
- AbiReencodingHeadOverflowWithStaticArrayCleanup
- DirtyBytesArrayToStorage
- DataLocationChangeInInternalOverride
- NestedCalldataArrayAbiReencodingSizeValidation
- SignedImmutables.
It is used by:
- 0.8.4 (contracts/LiquidUnstakePool.sol#2)
- 0.8.4 (contracts/Staking.sol#2)
- 0.8.4 (contracts/Withdrawal.sol#2)
- 0.8.4 (contracts/interfaces/IDeposit.sol#2)
- 0.8.4 (contracts/interfaces/IWETH.sol#2)
Version constraint >=0.4.16 contains known severe issues (https://solidity.readthedocs.io/en/latest/bugs.html)
- DirtyBytesArrayToStorage
- ABIDecodeTwoDimensionalArrayMemory
- KeccakCaching
- EmptyByteArrayCopy
- DynamicArrayCleanup
- ImplicitConstructorCallvalueCheck
- TupleAssignmentMultiStackSlotComponents
- MemoryArrayCreationOverflow
- privateCanBeOverridden
- SignedArrayStorageCopy
- ABIEncoderV2StorageArrayWithMultiSlotElement
- DynamicConstructorArgumentsClippedABIV2
- UninitializedFunctionPointerInConstructor_0.4.x
- IncorrectEventSignatureInLibraries_0.4.x
- ExpExponentCleanup
- NestedArrayFunctionCallDecoder
- ZeroFunctionSelector.
It is used by:
- >=0.4.16 (lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol#4)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#incorrect-versions-of-solidity
Low level call in SafeERC20Upgradeable._callOptionalReturnBool(IERC20Upgradeable,bytes) (@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol#134-142):
- (success,returndata) = address(token).call(data) (@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol#139)
Low level call in AddressUpgradeable.sendValue(address,uint256) (@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol#64-69):
- (success,None) = recipient.call{value: amount}() (@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol#67)
Low level call in AddressUpgradeable.functionCallWithValue(address,bytes,uint256,string) (@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol#128-137):
- (success,returndata) = target.call{value: value}(data) (@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol#135)
Low level call in AddressUpgradeable.functionStaticCall(address,bytes,string) (@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol#155-162):
- (success,returndata) = target.staticcall(data) (@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol#160)
Low level call in AddressUpgradeable.functionDelegateCall(address,bytes,string) (@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol#180-187):
- (success,returndata) = target.delegatecall(data) (@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol#185)
Low level call in ERC4626Upgradeable._tryGetAssetDecimals(IERC20Upgradeable) (contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol#80-91):
- (success,encodedDecimals) = address(asset_).staticcall(abi.encodeWithSelector(IERC20MetadataUpgradeable.decimals.selector)) (contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol#81-83)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#low-level-calls
Function AccessControlUpgradeable.__AccessControl_init() (@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol#76-77) is not in mixedCase
Function AccessControlUpgradeable.__AccessControl_init_unchained() (@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol#79-80) is not in mixedCase
Variable AccessControlUpgradeable.__gap (@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol#260) is not in mixedCase
Function OwnableUpgradeable.__Ownable_init() (@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol#29-31) is not in mixedCase
Function OwnableUpgradeable.__Ownable_init_unchained() (@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol#33-35) is not in mixedCase
Variable OwnableUpgradeable.__gap (@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol#94) is not in mixedCase
Function ReentrancyGuardUpgradeable.__ReentrancyGuard_init() (@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol#40-42) is not in mixedCase
Function ReentrancyGuardUpgradeable.__ReentrancyGuard_init_unchained() (@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol#44-46) is not in mixedCase
Variable ReentrancyGuardUpgradeable.__gap (@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol#88) is not in mixedCase
Function ERC20Upgradeable.__ERC20_init(string,string) (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#55-57) is not in mixedCase
Function ERC20Upgradeable.__ERC20_init_unchained(string,string) (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#59-62) is not in mixedCase
Variable ERC20Upgradeable.__gap (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#376) is not in mixedCase
Function IERC20PermitUpgradeable.DOMAIN_SEPARATOR() (@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20PermitUpgradeable.sol#89) is not in mixedCase
Function ContextUpgradeable.__Context_init() (@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol#18-19) is not in mixedCase
Function ContextUpgradeable.__Context_init_unchained() (@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol#21-22) is not in mixedCase
Variable ContextUpgradeable.__gap (@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol#40) is not in mixedCase
Function ERC165Upgradeable.__ERC165_init() (@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol#24-25) is not in mixedCase
Function ERC165Upgradeable.__ERC165_init_unchained() (@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol#27-28) is not in mixedCase
Variable ERC165Upgradeable.__gap (@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol#41) is not in mixedCase
Parameter LiquidUnstakePool.initialize(address,IERC20MetadataUpgradeable,address)._staking (contracts/LiquidUnstakePool.sol#80) is not in mixedCase
Parameter LiquidUnstakePool.initialize(address,IERC20MetadataUpgradeable,address)._weth (contracts/LiquidUnstakePool.sol#81) is not in mixedCase
Parameter LiquidUnstakePool.initialize(address,IERC20MetadataUpgradeable,address)._treasury (contracts/LiquidUnstakePool.sol#82) is not in mixedCase
Parameter LiquidUnstakePool.updateTargetLiquidity(uint256)._targetLiquidity (contracts/LiquidUnstakePool.sol#101) is not in mixedCase
Parameter LiquidUnstakePool.updateMinETHPercentage(uint256)._minETHPercentage (contracts/LiquidUnstakePool.sol#107) is not in mixedCase
Parameter LiquidUnstakePool.updateSwapFees(uint16,uint16,uint16)._minFee (contracts/LiquidUnstakePool.sol#113) is not in mixedCase
Parameter LiquidUnstakePool.updateSwapFees(uint16,uint16,uint16)._maxFee (contracts/LiquidUnstakePool.sol#113) is not in mixedCase
Parameter LiquidUnstakePool.updateSwapFees(uint16,uint16,uint16)._treasuryFee (contracts/LiquidUnstakePool.sol#113) is not in mixedCase
Parameter LiquidUnstakePool.deposit(uint256,address)._assets (contracts/LiquidUnstakePool.sol#130) is not in mixedCase
Parameter LiquidUnstakePool.deposit(uint256,address)._receiver (contracts/LiquidUnstakePool.sol#130) is not in mixedCase
Parameter LiquidUnstakePool.depositETH(address)._receiver (contracts/LiquidUnstakePool.sol#138) is not in mixedCase
Parameter LiquidUnstakePool.withdraw(uint256,address,address)._assets (contracts/LiquidUnstakePool.sol#176) is not in mixedCase
Parameter LiquidUnstakePool.withdraw(uint256,address,address)._receiver (contracts/LiquidUnstakePool.sol#177) is not in mixedCase
Parameter LiquidUnstakePool.withdraw(uint256,address,address)._owner (contracts/LiquidUnstakePool.sol#178) is not in mixedCase
Parameter LiquidUnstakePool.redeem(uint256,address,address)._shares (contracts/LiquidUnstakePool.sol#198) is not in mixedCase
Parameter LiquidUnstakePool.redeem(uint256,address,address)._receiver (contracts/LiquidUnstakePool.sol#199) is not in mixedCase
Parameter LiquidUnstakePool.redeem(uint256,address,address)._owner (contracts/LiquidUnstakePool.sol#200) is not in mixedCase
Parameter LiquidUnstakePool.swapmpETHforETH(uint256,uint256)._amount (contracts/LiquidUnstakePool.sol#219) is not in mixedCase
Parameter LiquidUnstakePool.swapmpETHforETH(uint256,uint256)._minOut (contracts/LiquidUnstakePool.sol#220) is not in mixedCase
Parameter LiquidUnstakePool.getAmountOut(uint256)._amountIn (contracts/LiquidUnstakePool.sol#239) is not in mixedCase
Parameter LiquidUnstakePool.getEthForValidator(uint256)._requestedETH (contracts/LiquidUnstakePool.sol#257) is not in mixedCase
Parameter LiquidUnstakePool.swapETHFormpETH(address)._to (contracts/LiquidUnstakePool.sol#268) is not in mixedCase
Variable LiquidUnstakePool.STAKING (contracts/LiquidUnstakePool.sol#24) is not in mixedCase
Parameter Staking.initialize(address,address,address,IERC20MetadataUpgradeable,address,address,address,address,uint256,uint256)._liquidPool (contracts/Staking.sol#108) is not in mixedCase
Parameter Staking.initialize(address,address,address,IERC20MetadataUpgradeable,address,address,address,address,uint256,uint256)._withdrawal (contracts/Staking.sol#109) is not in mixedCase
Parameter Staking.initialize(address,address,address,IERC20MetadataUpgradeable,address,address,address,address,uint256,uint256)._depositContract (contracts/Staking.sol#110) is not in mixedCase
Parameter Staking.initialize(address,address,address,IERC20MetadataUpgradeable,address,address,address,address,uint256,uint256)._weth (contracts/Staking.sol#111) is not in mixedCase
Parameter Staking.initialize(address,address,address,IERC20MetadataUpgradeable,address,address,address,address,uint256,uint256)._treasury (contracts/Staking.sol#112) is not in mixedCase
Parameter Staking.initialize(address,address,address,IERC20MetadataUpgradeable,address,address,address,address,uint256,uint256)._updater (contracts/Staking.sol#113) is not in mixedCase
Parameter Staking.initialize(address,address,address,IERC20MetadataUpgradeable,address,address,address,address,uint256,uint256)._activator (contracts/Staking.sol#114) is not in mixedCase
Parameter Staking.initialize(address,address,address,IERC20MetadataUpgradeable,address,address,address,address,uint256,uint256)._trustedDistributor (contracts/Staking.sol#118) is not in mixedCase
Parameter Staking.initialize(address,address,address,IERC20MetadataUpgradeable,address,address,address,address,uint256,uint256)._initialTokensToDistribute (contracts/Staking.sol#119) is not in mixedCase
Parameter Staking.initialize(address,address,address,IERC20MetadataUpgradeable,address,address,address,address,uint256,uint256)._totalUnderlying (contracts/Staking.sol#120) is not in mixedCase
Parameter Staking.updateWithdrawal(address)._withdrawal (contracts/Staking.sol#183) is not in mixedCase
Parameter Staking.updateLiquidPool(address)._liquidPool (contracts/Staking.sol#192) is not in mixedCase
Parameter Staking.updateRewardsFee(uint16)._rewardsFee (contracts/Staking.sol#199) is not in mixedCase
Parameter Staking.updateDepositFee(uint16)._depositFee (contracts/Staking.sol#206) is not in mixedCase
Parameter Staking.updateAcceptableUnderlyingChange(uint16)._acceptableUnderlyingChange (contracts/Staking.sol#212) is not in mixedCase
Parameter Staking.updateEstimatedRewardsPerSecond(int256)._estimatedRewardsPerSecond (contracts/Staking.sol#223) is not in mixedCase
Parameter Staking.reportEpochs(Staking.EpochsReport,int256)._epochsReport (contracts/Staking.sol#261) is not in mixedCase
Parameter Staking.reportEpochs(Staking.EpochsReport,int256)._estimatedRewardsPerSecond (contracts/Staking.sol#262) is not in mixedCase
Parameter Staking.pushToBeacon(Staking.Node[],uint256,uint256,bytes32)._nodes (contracts/Staking.sol#297) is not in mixedCase
Parameter Staking.pushToBeacon(Staking.Node[],uint256,uint256,bytes32)._requestPoolAmount (contracts/Staking.sol#298) is not in mixedCase
Parameter Staking.pushToBeacon(Staking.Node[],uint256,uint256,bytes32)._requestWithdrawalAmount (contracts/Staking.sol#299) is not in mixedCase
Parameter Staking.pushToBeacon(Staking.Node[],uint256,uint256,bytes32)._depositContractRoot (contracts/Staking.sol#300) is not in mixedCase
Parameter Staking.requestEthFromLiquidPoolToWithdrawal(uint256)._requestedETH (contracts/Staking.sol#343) is not in mixedCase
Parameter Staking.deposit(uint256,address)._assets (contracts/Staking.sol#351) is not in mixedCase
Parameter Staking.deposit(uint256,address)._receiver (contracts/Staking.sol#351) is not in mixedCase
Parameter Staking.mint(uint256,address)._shares (contracts/Staking.sol#360) is not in mixedCase
Parameter Staking.mint(uint256,address)._receiver (contracts/Staking.sol#360) is not in mixedCase
Parameter Staking.depositETH(address)._receiver (contracts/Staking.sol#373) is not in mixedCase
Parameter Withdrawal.initialize(address)._mpETH (contracts/Withdrawal.sol#66) is not in mixedCase
Parameter Withdrawal.getEpochStartTime(uint256)._epoch (contracts/Withdrawal.sol#85) is not in mixedCase
Parameter Withdrawal.setWithdrawalsStartEpoch(uint8)._epoch (contracts/Withdrawal.sol#90) is not in mixedCase
Parameter Withdrawal.setValidatorsDisassembleTime(uint32)._disassembleTime (contracts/Withdrawal.sol#96) is not in mixedCase
Parameter Withdrawal.requestWithdraw(uint256,address,address)._amountOut (contracts/Withdrawal.sol#108) is not in mixedCase
Parameter Withdrawal.requestWithdraw(uint256,address,address)._user (contracts/Withdrawal.sol#109) is not in mixedCase
Parameter Withdrawal.requestWithdraw(uint256,address,address)._receiver (contracts/Withdrawal.sol#110) is not in mixedCase
Parameter Withdrawal.getEthForValidator(uint256)._amount (contracts/Withdrawal.sol#146) is not in mixedCase
Parameter IDeposit.deposit(bytes,bytes,bytes,bytes32).withdrawal_credentials (contracts/interfaces/IDeposit.sol#7) is not in mixedCase
Parameter IDeposit.deposit(bytes,bytes,bytes,bytes32).deposit_data_root (contracts/interfaces/IDeposit.sol#9) is not in mixedCase
Function IDeposit.get_deposit_root() (contracts/interfaces/IDeposit.sol#12) is not in mixedCase
Function ERC4626Upgradeable.__ERC4626_init(IERC20Upgradeable) (contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol#67-69) is not in mixedCase
Function ERC4626Upgradeable.__ERC4626_init_unchained(IERC20Upgradeable) (contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol#71-75) is not in mixedCase
Variable ERC4626Upgradeable.__gap (contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol#299) is not in mixedCase
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#conformance-to-solidity-naming-conventions
Staking.updateEstimatedRewardsPerSecond(int256) (contracts/Staking.sol#222-235) uses literals with too many digits:
- maxEstimatedRewardsPerSecond = totalAssets() / 30000000 (contracts/Staking.sol#225)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#too-many-digits
. analyzed (26 contracts with 100 detectors), 171 result(s) found
{
"solc": {
"status": "ok",
"use_rc": 0,
"version": "0.8.4",
"strategy": "solc-select",
"solc_path": "/var/www/tripwire/.venv/bin/solc",
"install_rc": 0,
"use_stderr": null,
"use_stdout": "Switched global version to 0.8.4",
"install_stderr": null,
"install_stdout": "Version '0.8.4' is already installed, skipping..."
},
"solc_args": "--base-path /tmp/slither-mtmdz1mn --include-path /tmp/slither-mtmdz1mn/lib --include-path /tmp/slither-mtmdz1mn/lib/openzeppelin-contracts --allow-paths /tmp/slither-mtmdz1mn,/tmp/slither-mtmdz1mn/lib,/tmp/slither-mtmdz1mn/lib/openzeppelin-contracts,/tmp/slither-mtmdz1mn/src",
"remappings": [
"openzeppelin-contracts/=lib/openzeppelin-contracts/",
"@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/"
],
"source_files": [
"@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol",
"@openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol",
"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol",
"@openzeppelin/contracts-upgradeable/interfaces/IERC4626Upgradeable.sol",
"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol",
"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol",
"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol",
"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol",
"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20PermitUpgradeable.sol",
"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol",
"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol",
"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol",
"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol",
"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol",
"@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol",
"@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol",
"@openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol",
"@openzeppelin/contracts-upgradeable/utils/math/SignedMathUpgradeable.sol",
"@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol",
"@openzeppelin/contracts/token/ERC20/IERC20.sol",
"contracts/interfaces/IDeposit.sol",
"contracts/interfaces/IWETH.sol",
"contracts/LiquidUnstakePool.sol",
"contracts/Staking.sol",
"contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol",
"contracts/Withdrawal.sol"
],
"contract_count": 0,
"contract_names": [],
"detector_count": 171,
"workspace_hash": "cb18f26e1996aedb98bc94f82ec17886fe502cf23e7692984d0ee5288bd2ffc2",
"duration_seconds": 3.051992177963257,
"solc_version_requested": "0.8.4"
}
OpenAI Codex v0.77.0 (research preview) -------- workdir: /tmp/codex-y9jrc2np model: gpt-5.4 provider: openai approval: never sandbox: read-only reasoning effort: high reasoning summaries: auto session id: 019d451d-3d6c-7c81-a7bc-ab89a0b3c473 -------- 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 Reconnecting... 1/5 Reconnecting... 2/5 Reconnecting... 3/5 Reconnecting... 4/5 Reconnecting... 5/5 ERROR: Your access token could not be refreshed because your refresh token was already used. Please log out and sign in again. Warning: no last agent message; wrote empty content to /tmp/codex-y9jrc2np/codex-last-message.json
{
"codex": {
"ran_at": "2026-03-31T18:17:24.198199+00:00",
"returncode": 1
},
"project": {
"mode": "source",
"file_count": 26,
"import_count": 36,
"first_party_contracts_count": 6
},
"summary": null,
"no_findings": null,
"schema_version": 1
}
00000000: PUSH1 0x80 00000002: PUSH1 0x40 00000004: MSTORE 00000005: PUSH1 0x04 00000007: CALLDATASIZE 00000008: LT 00000009: PUSH2 0x0117 0000000c: JUMPI 0000000d: PUSH1 0x00 0000000f: CALLDATALOAD 00000010: PUSH1 0xe0 00000012: SHR 00000013: DUP1 00000014: PUSH4 0x715018a6 00000019: GT 0000001a: PUSH2 0x00a0 0000001d: JUMPI 0000001e: DUP1 0000001f: PUSH4 0xe6fd48bc 00000024: GT 00000025: PUSH2 0x0064 00000028: JUMPI 00000029: DUP1 0000002a: PUSH4 0xe6fd48bc 0000002f: EQ 00000030: PUSH2 0x0307 00000033: JUMPI 00000034: DUP1 00000035: PUSH4 0xf2fde38b 0000003a: EQ 0000003b: PUSH2 0x031d 0000003e: JUMPI 0000003f: DUP1 00000040: PUSH4 0xf756fa21 00000045: EQ 00000046: PUSH2 0x033d 00000049: JUMPI 0000004a: DUP1 0000004b: PUSH4 0xf7fc7002 00000050: EQ 00000051: PUSH2 0x0352 00000054: JUMPI 00000055: DUP1 00000056: PUSH4 0xfa14d481 0000005b: EQ 0000005c: PUSH2 0x0368 0000005f: JUMPI 00000060: PUSH1 0x00 00000062: DUP1 00000063: REVERT 00000064: JUMPDEST 00000065: DUP1 00000066: PUSH4 0x715018a6 0000006b: EQ 0000006c: PUSH2 0x028a 0000006f: JUMPI 00000070: DUP1 00000071: PUSH4 0x750f0ba6 00000076: EQ 00000077: PUSH2 0x029f 0000007a: JUMPI 0000007b: DUP1 0000007c: PUSH4 0x757991a8 00000081: EQ 00000082: PUSH2 0x02b4 00000085: JUMPI 00000086: DUP1 00000087: PUSH4 0x8da5cb5b 0000008c: EQ 0000008d: PUSH2 0x02c9 00000090: JUMPI 00000091: DUP1 00000092: PUSH4 0xc4d66de8 00000097: EQ 00000098: PUSH2 0x02e7 0000009b: JUMPI 0000009c: PUSH1 0x00 0000009e: DUP1 0000009f: REVERT 000000a0: JUMPDEST 000000a1: DUP1 000000a2: PUSH4 0x3ba00415 000000a7: GT 000000a8: PUSH2 0x00e7 000000ab: JUMPI 000000ac: DUP1 000000ad: PUSH4 0x3ba00415 000000b2: EQ 000000b3: PUSH2 0x01b6 000000b6: JUMPI 000000b7: DUP1 000000b8: PUSH4 0x405657f9 000000bd: EQ 000000be: PUSH2 0x01d8 000000c1: JUMPI 000000c2: DUP1 000000c3: PUSH4 0x61dd0ea5 000000c8: EQ 000000c9: PUSH2 0x0210 000000cc: JUMPI 000000cd: DUP1 000000ce: PUSH4 0x633e9e09 000000d3: EQ 000000d4: PUSH2 0x023c 000000d7: JUMPI 000000d8: DUP1 000000d9: PUSH4 0x67305ec2 000000de: EQ 000000df: PUSH2 0x026a 000000e2: JUMPI 000000e3: PUSH1 0x00 000000e5: DUP1 000000e6: REVERT 000000e7: JUMPDEST 000000e8: DUP1 000000e9: PUSH3 0x0101a0 000000ed: EQ 000000ee: PUSH2 0x0123 000000f1: JUMPI 000000f2: DUP1 000000f3: PUSH4 0x09e411fd 000000f8: EQ 000000f9: PUSH2 0x0154 000000fc: JUMPI 000000fd: DUP1 000000fe: PUSH4 0x32f25a3a 00000103: EQ 00000104: PUSH2 0x0176 00000107: JUMPI 00000108: DUP1 00000109: PUSH4 0x3701206b 0000010e: EQ 0000010f: PUSH2 0x0196 00000112: JUMPI 00000113: PUSH1 0x00 00000115: DUP1 00000116: REVERT 00000117: JUMPDEST 00000118: CALLDATASIZE 00000119: PUSH2 0x011e 0000011c: JUMPI 0000011d: STOP 0000011e: JUMPDEST 0000011f: PUSH1 0x00 00000121: DUP1 00000122: REVERT 00000123: JUMPDEST 00000124: CALLVALUE 00000125: DUP1 00000126: ISZERO 00000127: PUSH2 0x012f 0000012a: JUMPI 0000012b: PUSH1 0x00 0000012d: DUP1 0000012e: REVERT 0000012f: JUMPDEST 00000130: POP 00000131: PUSH2 0x013a 00000134: PUSH3 0x76a700 00000138: DUP2 00000139: JUMP 0000013a: JUMPDEST 0000013b: PUSH1 0x40 0000013d: MLOAD 0000013e: PUSH4 0xffffffff 00000143: SWAP1 00000144: SWAP2 00000145: AND 00000146: DUP2 00000147: MSTORE 00000148: PUSH1 0x20 0000014a: ADD 0000014b: JUMPDEST 0000014c: PUSH1 0x40 0000014e: MLOAD 0000014f: DUP1 00000150: SWAP2 00000151: SUB 00000152: SWAP1 00000153: RETURN 00000154: JUMPDEST 00000155: CALLVALUE 00000156: DUP1 00000157: ISZERO 00000158: PUSH2 0x0160 0000015b: JUMPI 0000015c: PUSH1 0x00 0000015e: DUP1 0000015f: REVERT 00000160: JUMPDEST 00000161: POP 00000162: PUSH2 0x0174 00000165: PUSH2 0x016f 00000168: CALLDATASIZE 00000169: PUSH1 0x04 0000016b: PUSH2 0x0dac 0000016e: JUMP 0000016f: JUMPDEST 00000170: PUSH2 0x03d1 00000173: JUMP 00000174: JUMPDEST 00000175: STOP 00000176: JUMPDEST 00000177: CALLVALUE 00000178: DUP1 00000179: ISZERO 0000017a: PUSH2 0x0182 0000017d: JUMPI 0000017e: PUSH1 0x00 00000180: DUP1 00000181: REVERT 00000182: JUMPDEST 00000183: POP 00000184: PUSH2 0x0174 00000187: PUSH2 0x0191 0000018a: CALLDATASIZE 0000018b: PUSH1 0x04 0000018d: PUSH2 0x0d47 00000190: JUMP 00000191: JUMPDEST 00000192: PUSH2 0x0425 00000195: JUMP 00000196: JUMPDEST 00000197: CALLVALUE 00000198: DUP1 00000199: ISZERO 0000019a: PUSH2 0x01a2 0000019d: JUMPI 0000019e: PUSH1 0x00 000001a0: DUP1 000001a1: REVERT 000001a2: JUMPDEST 000001a3: POP 000001a4: PUSH2 0x0174 000001a7: PUSH2 0x01b1 000001aa: CALLDATASIZE 000001ab: PUSH1 0x04 000001ad: PUSH2 0x0d2f 000001b0: JUMP 000001b1: JUMPDEST 000001b2: PUSH2 0x058c 000001b5: JUMP 000001b6: JUMPDEST 000001b7: CALLVALUE 000001b8: DUP1 000001b9: ISZERO 000001ba: PUSH2 0x01c2 000001bd: JUMPI 000001be: PUSH1 0x00 000001c0: DUP1 000001c1: REVERT 000001c2: JUMPDEST 000001c3: POP 000001c4: PUSH1 0x69 000001c6: SLOAD 000001c7: PUSH2 0x013a 000001ca: SWAP1 000001cb: PUSH2 0x0100 000001ce: SWAP1 000001cf: DIV 000001d0: PUSH4 0xffffffff 000001d5: AND 000001d6: DUP2 000001d7: JUMP 000001d8: JUMPDEST 000001d9: CALLVALUE 000001da: DUP1 000001db: ISZERO 000001dc: PUSH2 0x01e4 000001df: JUMPI 000001e0: PUSH1 0x00 000001e2: DUP1 000001e3: REVERT 000001e4: JUMPDEST 000001e5: POP 000001e6: PUSH1 0x65 000001e8: SLOAD 000001e9: PUSH2 0x01f8 000001ec: SWAP1 000001ed: PUSH1 0x01 000001ef: PUSH1 0x01 000001f1: PUSH1 0xa0 000001f3: SHL 000001f4: SUB 000001f5: AND 000001f6: DUP2 000001f7: JUMP 000001f8: JUMPDEST 000001f9: PUSH1 0x40 000001fb: MLOAD 000001fc: PUSH1 0x01 000001fe: PUSH1 0x01 00000200: PUSH1 0xa0 00000202: SHL 00000203: SUB 00000204: SWAP1 00000205: SWAP2 00000206: AND 00000207: DUP2 00000208: MSTORE 00000209: PUSH1 0x20 0000020b: ADD 0000020c: PUSH2 0x014b 0000020f: JUMP 00000210: JUMPDEST 00000211: CALLVALUE 00000212: DUP1 00000213: ISZERO 00000214: PUSH2 0x021c 00000217: JUMPI 00000218: PUSH1 0x00 0000021a: DUP1 0000021b: REVERT 0000021c: JUMPDEST 0000021d: POP 0000021e: PUSH1 0x69 00000220: SLOAD 00000221: PUSH2 0x022a 00000224: SWAP1 00000225: PUSH1 0xff 00000227: AND 00000228: DUP2 00000229: JUMP 0000022a: JUMPDEST 0000022b: PUSH1 0x40 0000022d: MLOAD 0000022e: PUSH1 0xff 00000230: SWAP1 00000231: SWAP2 00000232: AND 00000233: DUP2 00000234: MSTORE 00000235: PUSH1 0x20 00000237: ADD 00000238: PUSH2 0x014b 0000023b: JUMP 0000023c: JUMPDEST 0000023d: CALLVALUE 0000023e: DUP1 0000023f: ISZERO 00000240: PUSH2 0x0248 00000243: JUMPI 00000244: PUSH1 0x00 00000246: DUP1 00000247: REVERT 00000248: JUMPDEST 00000249: POP 0000024a: PUSH2 0x025c 0000024d: PUSH2 0x0257 00000250: CALLDATASIZE 00000251: PUSH1 0x04 00000253: PUSH2 0x0d2f 00000256: JUMP 00000257: JUMPDEST 00000258: PUSH2 0x0650 0000025b: JUMP 0000025c: JUMPDEST 0000025d: PUSH1 0x40 0000025f: MLOAD 00000260: SWAP1 00000261: DUP2 00000262: MSTORE 00000263: PUSH1 0x20 00000265: ADD 00000266: PUSH2 0x014b 00000269: JUMP 0000026a: JUMPDEST 0000026b: CALLVALUE 0000026c: DUP1 0000026d: ISZERO 0000026e: PUSH2 0x0276 00000271: JUMPI 00000272: PUSH1 0x00 00000274: DUP1 00000275: REVERT 00000276: JUMPDEST 00000277: POP 00000278: PUSH2 0x0174 0000027b: PUSH2 0x0285 0000027e: CALLDATASIZE 0000027f: PUSH1 0x04 00000281: PUSH2 0x0d88 00000284: JUMP 00000285: JUMPDEST 00000286: PUSH2 0x0672 00000289: JUMP 0000028a: JUMPDEST 0000028b: CALLVALUE 0000028c: DUP1 0000028d: ISZERO 0000028e: PUSH2 0x0296 00000291: JUMPI 00000292: PUSH1 0x00 00000294: DUP1 00000295: REVERT 00000296: JUMPDEST 00000297: POP 00000298: PUSH2 0x0174 0000029b: PUSH2 0x06d7 0000029e: JUMP 0000029f: JUMPDEST 000002a0: CALLVALUE 000002a1: DUP1 000002a2: ISZERO 000002a3: PUSH2 0x02ab 000002a6: JUMPI 000002a7: PUSH1 0x00 000002a9: DUP1 000002aa: REVERT 000002ab: JUMPDEST 000002ac: POP 000002ad: PUSH2 0x025c 000002b0: PUSH2 0x06eb 000002b3: JUMP 000002b4: JUMPDEST 000002b5: CALLVALUE 000002b6: DUP1 000002b7: ISZERO 000002b8: PUSH2 0x02c0 000002bb: JUMPI 000002bc: PUSH1 0x00 000002be: DUP1 000002bf: REVERT 000002c0: JUMPDEST 000002c1: POP 000002c2: PUSH2 0x025c 000002c5: PUSH2 0x072a 000002c8: JUMP 000002c9: JUMPDEST 000002ca: CALLVALUE 000002cb: DUP1 000002cc: ISZERO 000002cd: PUSH2 0x02d5 000002d0: JUMPI 000002d1: PUSH1 0x00 000002d3: DUP1 000002d4: REVERT 000002d5: JUMPDEST 000002d6: POP 000002d7: PUSH1 0x33 000002d9: SLOAD 000002da: PUSH1 0x01 000002dc: PUSH1 0x01 000002de: PUSH1 0xa0 000002e0: SHL 000002e1: SUB 000002e2: AND 000002e3: PUSH2 0x01f8 000002e6: JUMP 000002e7: JUMPDEST 000002e8: CALLVALUE 000002e9: DUP1 000002ea: ISZERO 000002eb: PUSH2 0x02f3 000002ee: JUMPI 000002ef: PUSH1 0x00 000002f1: DUP1 000002f2: REVERT 000002f3: JUMPDEST 000002f4: POP 000002f5: PUSH2 0x0174 000002f8: PUSH2 0x0302 000002fb: CALLDATASIZE 000002fc: PUSH1 0x04 000002fe: PUSH2 0x0d0c 00000301: JUMP 00000302: JUMPDEST 00000303: PUSH2 0x0748 00000306: JUMP 00000307: JUMPDEST 00000308: CALLVALUE 00000309: DUP1 0000030a: ISZERO 0000030b: PUSH2 0x0313 0000030e: JUMPI 0000030f: PUSH1 0x00 00000311: DUP1 00000312: REVERT 00000313: JUMPDEST 00000314: POP 00000315: PUSH2 0x025c 00000318: PUSH1 0x67 0000031a: SLOAD 0000031b: DUP2 0000031c: JUMP 0000031d: JUMPDEST 0000031e: CALLVALUE 0000031f: DUP1 00000320: ISZERO 00000321: PUSH2 0x0329 00000324: JUMPI 00000325: PUSH1 0x00 00000327: DUP1 00000328: REVERT 00000329: JUMPDEST 0000032a: POP 0000032b: PUSH2 0x0174 0000032e: PUSH2 0x0338 00000331: CALLDATASIZE 00000332: PUSH1 0x04 00000334: PUSH2 0x0d0c 00000337: JUMP 00000338: JUMPDEST 00000339: PUSH2 0x08ea 0000033c: JUMP 0000033d: JUMPDEST 0000033e: CALLVALUE 0000033f: DUP1 00000340: ISZERO 00000341: PUSH2 0x0349 00000344: JUMPI 00000345: PUSH1 0x00 00000347: DUP1 00000348: REVERT 00000349: JUMPDEST 0000034a: POP 0000034b: PUSH2 0x0174 0000034e: PUSH2 0x0963 00000351: JUMP 00000352: JUMPDEST 00000353: CALLVALUE 00000354: DUP1 00000355: ISZERO 00000356: PUSH2 0x035e 00000359: JUMPI 0000035a: PUSH1 0x00 0000035c: DUP1 0000035d: REVERT 0000035e: JUMPDEST 0000035f: POP 00000360: PUSH2 0x025c 00000363: PUSH1 0x66 00000365: SLOAD 00000366: DUP2 00000367: JUMP 00000368: JUMPDEST 00000369: CALLVALUE 0000036a: DUP1 0000036b: ISZERO 0000036c: PUSH2 0x0374 0000036f: JUMPI 00000370: PUSH1 0x00 00000372: DUP1 00000373: REVERT 00000374: JUMPDEST 00000375: POP 00000376: PUSH2 0x03ad 00000379: PUSH2 0x0383 0000037c: CALLDATASIZE 0000037d: PUSH1 0x04 0000037f: PUSH2 0x0d0c 00000382: JUMP 00000383: JUMPDEST 00000384: PUSH1 0x68 00000386: PUSH1 0x20 00000388: MSTORE 00000389: PUSH1 0x00 0000038b: SWAP1 0000038c: DUP2 0000038d: MSTORE 0000038e: PUSH1 0x40 00000390: SWAP1 00000391: KECCAK256 00000392: DUP1 00000393: SLOAD 00000394: PUSH1 0x01 00000396: DUP3 00000397: ADD 00000398: SLOAD 00000399: PUSH1 0x02 0000039b: SWAP1 0000039c: SWAP3 0000039d: ADD 0000039e: SLOAD 0000039f: SWAP1 000003a0: SWAP2 000003a1: SWAP1 000003a2: PUSH1 0x01 000003a4: PUSH1 0x01 000003a6: PUSH1 0xa0 000003a8: SHL 000003a9: SUB 000003aa: AND 000003ab: DUP4 000003ac: JUMP 000003ad: JUMPDEST 000003ae: PUSH1 0x40 000003b0: DUP1 000003b1: MLOAD 000003b2: SWAP4 000003b3: DUP5 000003b4: MSTORE 000003b5: PUSH1 0x20 000003b7: DUP5 000003b8: ADD 000003b9: SWAP3 000003ba: SWAP1 000003bb: SWAP3 000003bc: MSTORE 000003bd: PUSH1 0x01 000003bf: PUSH1 0x01 000003c1: PUSH1 0xa0 000003c3: SHL 000003c4: SUB 000003c5: AND 000003c6: SWAP1 000003c7: DUP3 000003c8: ADD 000003c9: MSTORE 000003ca: PUSH1 0x60 000003cc: ADD 000003cd: PUSH2 0x014b 000003d0: JUMP 000003d1: JUMPDEST 000003d2: PUSH2 0x03d9 000003d5: PUSH2 0x0ae8 000003d8: JUMP 000003d9: JUMPDEST 000003da: PUSH1 0x20 000003dc: DUP2 000003dd: PUSH1 0xff 000003df: AND 000003e0: GT 000003e1: ISZERO 000003e2: PUSH2 0x040f 000003e5: JUMPI 000003e6: PUSH1 0x40 000003e8: MLOAD 000003e9: PUSH4 0x6a06bb65 000003ee: PUSH1 0xe1 000003f0: SHL 000003f1: DUP2 000003f2: MSTORE 000003f3: PUSH1 0xff 000003f5: DUP3 000003f6: AND 000003f7: PUSH1 0x04 000003f9: DUP3 000003fa: ADD 000003fb: MSTORE 000003fc: PUSH1 0x20 000003fe: PUSH1 0x24 00000400: DUP3 00000401: ADD 00000402: MSTORE 00000403: PUSH1 0x44 00000405: ADD 00000406: JUMPDEST 00000407: PUSH1 0x40 00000409: MLOAD 0000040a: DUP1 0000040b: SWAP2 0000040c: SUB 0000040d: SWAP1 0000040e: REVERT 0000040f: JUMPDEST 00000410: PUSH1 0x69 00000412: DUP1 00000413: SLOAD 00000414: PUSH1 0xff 00000416: NOT 00000417: AND 00000418: PUSH1 0xff 0000041a: SWAP3 0000041b: SWAP1 0000041c: SWAP3 0000041d: AND 0000041e: SWAP2 0000041f: SWAP1 00000420: SWAP2 00000421: OR 00000422: SWAP1 00000423: SSTORE 00000424: JUMP 00000425: JUMPDEST 00000426: PUSH1 0x65 00000428: SLOAD 00000429: PUSH1 0x01 0000042b: PUSH1 0x01 0000042d: PUSH1 0xa0 0000042f: SHL 00000430: SUB 00000431: AND 00000432: CALLER 00000433: EQ 00000434: PUSH2 0x0465 00000437: JUMPI 00000438: PUSH1 0x65 0000043a: SLOAD 0000043b: PUSH1 0x40 0000043d: MLOAD 0000043e: PUSH4 0xc55ddc97 00000443: PUSH1 0xe0 00000445: SHL 00000446: DUP2 00000447: MSTORE 00000448: CALLER 00000449: PUSH1 0x04 0000044b: DUP3 0000044c: ADD 0000044d: MSTORE 0000044e: PUSH1 0x01 00000450: PUSH1 0x01 00000452: PUSH1 0xa0 00000454: SHL 00000455: SUB 00000456: SWAP1 00000457: SWAP2 00000458: AND 00000459: PUSH1 0x24 0000045b: DUP3 0000045c: ADD 0000045d: MSTORE 0000045e: PUSH1 0x44 00000460: ADD 00000461: PUSH2 0x0406 00000464: JUMP 00000465: JUMPDEST 00000466: PUSH1 0x00 00000468: PUSH2 0x046f 0000046b: PUSH2 0x072a 0000046e: JUMP 0000046f: JUMPDEST 00000470: PUSH1 0x69 00000472: SLOAD 00000473: SWAP1 00000474: SWAP2 00000475: POP 00000476: PUSH1 0xff 00000478: AND 00000479: DUP2 0000047a: LT 0000047b: ISZERO 0000047c: PUSH2 0x04a8 0000047f: JUMPI 00000480: PUSH1 0x69 00000482: SLOAD 00000483: PUSH1 0x40 00000485: MLOAD 00000486: PUSH4 0x92638fb7 0000048b: PUSH1 0xe0 0000048d: SHL 0000048e: DUP2 0000048f: MSTORE 00000490: PUSH1 0x04 00000492: DUP2 00000493: ADD 00000494: DUP4 00000495: SWAP1 00000496: MSTORE 00000497: PUSH1 0xff 00000499: SWAP1 0000049a: SWAP2 0000049b: AND 0000049c: PUSH1 0x24 0000049e: DUP3 0000049f: ADD 000004a0: MSTORE 000004a1: PUSH1 0x44 000004a3: ADD 000004a4: PUSH2 0x0406 000004a7: JUMP 000004a8: JUMPDEST 000004a9: PUSH1 0x00 000004ab: PUSH2 0x04b5 000004ae: DUP3 000004af: PUSH1 0x01 000004b1: PUSH2 0x0e18 000004b4: JUMP 000004b5: JUMPDEST 000004b6: PUSH1 0x01 000004b8: PUSH1 0x01 000004ba: PUSH1 0xa0 000004bc: SHL 000004bd: SUB 000004be: DUP6 000004bf: AND 000004c0: PUSH1 0x00 000004c2: SWAP1 000004c3: DUP2 000004c4: MSTORE 000004c5: PUSH1 0x68 000004c7: PUSH1 0x20 000004c9: MSTORE 000004ca: PUSH1 0x40 000004cc: DUP2 000004cd: KECCAK256 000004ce: DUP1 000004cf: SLOAD 000004d0: SWAP3 000004d1: SWAP4 000004d2: POP 000004d3: DUP8 000004d4: SWAP3 000004d5: SWAP1 000004d6: SWAP2 000004d7: SWAP1 000004d8: PUSH2 0x04e2 000004db: SWAP1 000004dc: DUP5 000004dd: SWAP1 000004de: PUSH2 0x0e18 000004e1: JUMP 000004e2: JUMPDEST 000004e3: SWAP1 000004e4: SWAP2 000004e5: SSTORE 000004e6: POP 000004e7: POP 000004e8: PUSH1 0x01 000004ea: PUSH1 0x01 000004ec: PUSH1 0xa0 000004ee: SHL 000004ef: SUB 000004f0: DUP5 000004f1: DUP2 000004f2: AND 000004f3: PUSH1 0x00 000004f5: SWAP1 000004f6: DUP2 000004f7: MSTORE 000004f8: PUSH1 0x68 000004fa: PUSH1 0x20 000004fc: MSTORE 000004fd: PUSH1 0x40 000004ff: DUP2 00000500: KECCAK256 00000501: PUSH1 0x01 00000503: DUP2 00000504: ADD 00000505: DUP5 00000506: SWAP1 00000507: SSTORE 00000508: PUSH1 0x02 0000050a: ADD 0000050b: DUP1 0000050c: SLOAD 0000050d: PUSH1 0x01 0000050f: PUSH1 0x01 00000511: PUSH1 0xa0 00000513: SHL 00000514: SUB 00000515: NOT 00000516: AND 00000517: SWAP3 00000518: DUP7 00000519: AND 0000051a: SWAP3 0000051b: SWAP1 0000051c: SWAP3 0000051d: OR 0000051e: SWAP1 0000051f: SWAP2 00000520: SSTORE 00000521: PUSH1 0x66 00000523: DUP1 00000524: SLOAD 00000525: DUP8 00000526: SWAP3 00000527: SWAP1 00000528: PUSH2 0x0532 0000052b: SWAP1 0000052c: DUP5 0000052d: SWAP1 0000052e: PUSH2 0x0e18 00000531: JUMP 00000532: JUMPDEST 00000533: SWAP1 00000534: SWAP2 00000535: SSTORE 00000536: POP 00000537: POP 00000538: PUSH1 0x40 0000053a: DUP1 0000053b: MLOAD 0000053c: DUP7 0000053d: DUP2 0000053e: MSTORE 0000053f: PUSH1 0x01 00000541: PUSH1 0x01 00000543: PUSH1 0xa0 00000545: SHL 00000546: SUB 00000547: DUP6 00000548: DUP2 00000549: AND 0000054a: PUSH1 0x20 0000054c: DUP4 0000054d: ADD 0000054e: MSTORE 0000054f: SWAP2 00000550: DUP2 00000551: ADD 00000552: DUP4 00000553: SWAP1 00000554: MSTORE 00000555: SWAP1 00000556: DUP6 00000557: AND 00000558: SWAP1 00000559: PUSH32 0xd49d4546791beefb79e592ab12e9eea6586cb0ae680bafd50d535d0835374ef3 0000057a: SWAP1 0000057b: PUSH1 0x60 0000057d: ADD 0000057e: PUSH1 0x40 00000580: MLOAD 00000581: DUP1 00000582: SWAP2 00000583: SUB 00000584: SWAP1 00000585: LOG2 00000586: POP 00000587: POP 00000588: POP 00000589: POP 0000058a: POP 0000058b: JUMP 0000058c: JUMPDEST 0000058d: PUSH1 0x65 0000058f: SLOAD 00000590: PUSH1 0x01 00000592: PUSH1 0x01 00000594: PUSH1 0xa0 00000596: SHL 00000597: SUB 00000598: AND 00000599: CALLER 0000059a: EQ 0000059b: PUSH2 0x05cc 0000059e: JUMPI 0000059f: PUSH1 0x65 000005a1: SLOAD 000005a2: PUSH1 0x40 000005a4: MLOAD 000005a5: PUSH4 0xc55ddc97 000005aa: PUSH1 0xe0 000005ac: SHL 000005ad: DUP2 000005ae: MSTORE 000005af: CALLER 000005b0: PUSH1 0x04 000005b2: DUP3 000005b3: ADD 000005b4: MSTORE 000005b5: PUSH1 0x01 000005b7: PUSH1 0x01 000005b9: PUSH1 0xa0 000005bb: SHL 000005bc: SUB 000005bd: SWAP1 000005be: SWAP2 000005bf: AND 000005c0: PUSH1 0x24 000005c2: DUP3 000005c3: ADD 000005c4: MSTORE 000005c5: PUSH1 0x44 000005c7: ADD 000005c8: PUSH2 0x0406 000005cb: JUMP 000005cc: JUMPDEST 000005cd: SELFBALANCE 000005ce: PUSH1 0x66 000005d0: SLOAD 000005d1: GT 000005d2: ISZERO 000005d3: PUSH2 0x05f9 000005d6: JUMPI 000005d7: PUSH1 0x40 000005d9: MLOAD 000005da: PUSH4 0x1cd24c31 000005df: PUSH1 0xe1 000005e1: SHL 000005e2: DUP2 000005e3: MSTORE 000005e4: PUSH1 0x04 000005e6: DUP2 000005e7: ADD 000005e8: DUP3 000005e9: SWAP1 000005ea: MSTORE 000005eb: PUSH1 0x00 000005ed: PUSH1 0x24 000005ef: DUP3 000005f0: ADD 000005f1: MSTORE 000005f2: PUSH1 0x44 000005f4: ADD 000005f5: PUSH2 0x0406 000005f8: JUMP 000005f9: JUMPDEST 000005fa: PUSH1 0x00 000005fc: PUSH1 0x66 000005fe: SLOAD 000005ff: SELFBALANCE 00000600: PUSH2 0x0609 00000603: SWAP2 00000604: SWAP1 00000605: PUSH2 0x0e6f 00000608: JUMP 00000609: JUMPDEST 0000060a: SWAP1 0000060b: POP 0000060c: DUP1 0000060d: DUP3 0000060e: GT 0000060f: ISZERO 00000610: PUSH2 0x0636 00000613: JUMPI 00000614: PUSH1 0x40 00000616: MLOAD 00000617: PUSH4 0x1cd24c31 0000061c: PUSH1 0xe1 0000061e: SHL 0000061f: DUP2 00000620: MSTORE 00000621: PUSH1 0x04 00000623: DUP2 00000624: ADD 00000625: DUP4 00000626: SWAP1 00000627: MSTORE 00000628: PUSH1 0x24 0000062a: DUP2 0000062b: ADD 0000062c: DUP3 0000062d: SWAP1 0000062e: MSTORE 0000062f: PUSH1 0x44 00000631: ADD 00000632: PUSH2 0x0406 00000635: JUMP 00000636: JUMPDEST 00000637: PUSH1 0x65 00000639: SLOAD 0000063a: PUSH2 0x064c 0000063d: SWAP1 0000063e: PUSH1 0x01 00000640: PUSH1 0x01 00000642: PUSH1 0xa0 00000644: SHL 00000645: SUB 00000646: AND 00000647: DUP4 00000648: PUSH2 0x0b42 0000064b: JUMP 0000064c: JUMPDEST 0000064d: POP 0000064e: POP 0000064f: JUMP 00000650: JUMPDEST 00000651: PUSH1 0x00 00000653: PUSH2 0x065f 00000656: DUP3 00000657: PUSH3 0x093a80 0000065b: PUSH2 0x0e50 0000065e: JUMP 0000065f: JUMPDEST 00000660: PUSH1 0x67 00000662: SLOAD 00000663: PUSH2 0x066c 00000666: SWAP2 00000667: SWAP1 00000668: PUSH2 0x0e18 0000066b: JUMP 0000066c: JUMPDEST 0000066d: SWAP3 0000066e: SWAP2 0000066f: POP 00000670: POP 00000671: JUMP 00000672: JUMPDEST 00000673: PUSH2 0x067a 00000676: PUSH2 0x0ae8 00000679: JUMP 0000067a: JUMPDEST 0000067b: PUSH3 0x76a700 0000067f: PUSH4 0xffffffff 00000684: DUP3 00000685: AND 00000686: GT 00000687: ISZERO 00000688: PUSH2 0x06b5 0000068b: JUMPI 0000068c: PUSH1 0x40 0000068e: MLOAD 0000068f: PUSH4 0x6a06bb65 00000694: PUSH1 0xe1 00000696: SHL 00000697: DUP2 00000698: MSTORE 00000699: PUSH4 0xffffffff 0000069e: DUP3 0000069f: AND 000006a0: PUSH1 0x04 000006a2: DUP3 000006a3: ADD 000006a4: MSTORE 000006a5: PUSH3 0x76a700 000006a9: PUSH1 0x24 000006ab: DUP3 000006ac: ADD 000006ad: MSTORE 000006ae: PUSH1 0x44 000006b0: ADD 000006b1: PUSH2 0x0406 000006b4: JUMP 000006b5: JUMPDEST 000006b6: PUSH1 0x69 000006b8: DUP1 000006b9: SLOAD 000006ba: PUSH4 0xffffffff 000006bf: SWAP1 000006c0: SWAP3 000006c1: AND 000006c2: PUSH2 0x0100 000006c5: MUL 000006c6: PUSH5 0xffffffff00 000006cc: NOT 000006cd: SWAP1 000006ce: SWAP3 000006cf: AND 000006d0: SWAP2 000006d1: SWAP1 000006d2: SWAP2 000006d3: OR 000006d4: SWAP1 000006d5: SSTORE 000006d6: JUMP 000006d7: JUMPDEST 000006d8: PUSH2 0x06df 000006db: PUSH2 0x0ae8 000006de: JUMP 000006df: JUMPDEST 000006e0: PUSH2 0x06e9 000006e3: PUSH1 0x00 000006e5: PUSH2 0x0c60 000006e8: JUMP 000006e9: JUMPDEST 000006ea: JUMP 000006eb: JUMPDEST 000006ec: PUSH1 0x00 000006ee: TIMESTAMP 000006ef: PUSH2 0x06f6 000006f2: PUSH2 0x072a 000006f5: JUMP 000006f6: JUMPDEST 000006f7: PUSH2 0x0701 000006fa: SWAP1 000006fb: PUSH1 0x01 000006fd: PUSH2 0x0e18 00000700: JUMP 00000701: JUMPDEST 00000702: PUSH2 0x070e 00000705: SWAP1 00000706: PUSH3 0x093a80 0000070a: PUSH2 0x0e50 0000070d: JUMP 0000070e: JUMPDEST 0000070f: PUSH1 0x67 00000711: SLOAD 00000712: PUSH2 0x071b 00000715: SWAP2 00000716: SWAP1 00000717: PUSH2 0x0e18 0000071a: JUMP 0000071b: JUMPDEST 0000071c: PUSH2 0x0725 0000071f: SWAP2 00000720: SWAP1 00000721: PUSH2 0x0e6f 00000724: JUMP 00000725: JUMPDEST 00000726: SWAP1 00000727: POP 00000728: SWAP1 00000729: JUMP 0000072a: JUMPDEST 0000072b: PUSH1 0x00 0000072d: PUSH3 0x093a80 00000731: PUSH1 0x67 00000733: SLOAD 00000734: TIMESTAMP 00000735: PUSH2 0x073e 00000738: SWAP2 00000739: SWAP1 0000073a: PUSH2 0x0e6f 0000073d: JUMP 0000073e: JUMPDEST 0000073f: PUSH2 0x0725 00000742: SWAP2 00000743: SWAP1 00000744: PUSH2 0x0e30 00000747: JUMP 00000748: JUMPDEST 00000749: PUSH1 0x00 0000074b: SLOAD 0000074c: PUSH2 0x0100 0000074f: SWAP1 00000750: DIV 00000751: PUSH1 0xff 00000753: AND 00000754: ISZERO 00000755: DUP1 00000756: DUP1 00000757: ISZERO 00000758: PUSH2 0x0768 0000075b: JUMPI 0000075c: POP 0000075d: PUSH1 0x00 0000075f: SLOAD 00000760: PUSH1 0x01 00000762: PUSH1 0xff 00000764: SWAP1 00000765: SWAP2 00000766: AND 00000767: LT 00000768: JUMPDEST 00000769: DUP1 0000076a: PUSH2 0x0782 0000076d: JUMPI 0000076e: POP 0000076f: ADDRESS 00000770: EXTCODESIZE 00000771: ISZERO 00000772: DUP1 00000773: ISZERO 00000774: PUSH2 0x0782 00000777: JUMPI 00000778: POP 00000779: PUSH1 0x00 0000077b: SLOAD 0000077c: PUSH1 0xff 0000077e: AND 0000077f: PUSH1 0x01 00000781: EQ 00000782: JUMPDEST 00000783: PUSH2 0x07e5 00000786: JUMPI 00000787: PUSH1 0x40 00000789: MLOAD 0000078a: PUSH3 0x461bcd 0000078e: PUSH1 0xe5 00000790: SHL 00000791: DUP2 00000792: MSTORE 00000793: PUSH1 0x20 00000795: PUSH1 0x04 00000797: DUP3 00000798: ADD 00000799: MSTORE 0000079a: PUSH1 0x2e 0000079c: PUSH1 0x24 0000079e: DUP3 0000079f: ADD 000007a0: MSTORE 000007a1: PUSH32 0x496e697469616c697a61626c653a20636f6e747261637420697320616c726561 000007c2: PUSH1 0x44 000007c4: DUP3 000007c5: ADD 000007c6: MSTORE 000007c7: PUSH14 0x191e481a5b9a5d1a585b1a5e9959 000007d6: PUSH1 0x92 000007d8: SHL 000007d9: PUSH1 0x64 000007db: DUP3 000007dc: ADD 000007dd: MSTORE 000007de: PUSH1 0x84 000007e0: ADD 000007e1: PUSH2 0x0406 000007e4: JUMP 000007e5: JUMPDEST 000007e6: PUSH1 0x00 000007e8: DUP1 000007e9: SLOAD 000007ea: PUSH1 0xff 000007ec: NOT 000007ed: AND 000007ee: PUSH1 0x01 000007f0: OR 000007f1: SWAP1 000007f2: SSTORE 000007f3: DUP1 000007f4: ISZERO 000007f5: PUSH2 0x0808 000007f8: JUMPI 000007f9: PUSH1 0x00 000007fb: DUP1 000007fc: SLOAD 000007fd: PUSH2 0xff00 00000800: NOT 00000801: AND 00000802: PUSH2 0x0100 00000805: OR 00000806: SWAP1 00000807: SSTORE 00000808: JUMPDEST 00000809: SELFBALANCE 0000080a: ISZERO 0000080b: PUSH2 0x0864 0000080e: JUMPI 0000080f: PUSH1 0x40 00000811: MLOAD 00000812: PUSH3 0x461bcd 00000816: PUSH1 0xe5 00000818: SHL 00000819: DUP2 0000081a: MSTORE 0000081b: PUSH1 0x20 0000081d: PUSH1 0x04 0000081f: DUP3 00000820: ADD 00000821: MSTORE 00000822: PUSH1 0x25 00000824: PUSH1 0x24 00000826: DUP3 00000827: ADD 00000828: MSTORE 00000829: PUSH32 0x4572726f7220696e697469616c697a652077697468206e6f207a65726f206261 0000084a: PUSH1 0x44 0000084c: DUP3 0000084d: ADD 0000084e: MSTORE 0000084f: PUSH5 0x6c616e6365 00000855: PUSH1 0xd8 00000857: SHL 00000858: PUSH1 0x64 0000085a: DUP3 0000085b: ADD 0000085c: MSTORE 0000085d: PUSH1 0x84 0000085f: ADD 00000860: PUSH2 0x0406 00000863: JUMP 00000864: JUMPDEST 00000865: PUSH2 0x086c 00000868: PUSH2 0x0cb2 0000086b: JUMP 0000086c: JUMPDEST 0000086d: TIMESTAMP 0000086e: PUSH1 0x67 00000870: SSTORE 00000871: PUSH1 0x65 00000873: DUP1 00000874: SLOAD 00000875: PUSH1 0x01 00000877: PUSH1 0x01 00000879: PUSH1 0xa0 0000087b: SHL 0000087c: SUB 0000087d: NOT 0000087e: AND 0000087f: PUSH1 0x01 00000881: PUSH1 0x01 00000883: PUSH1 0xa0 00000885: SHL 00000886: SUB 00000887: DUP5 00000888: AND 00000889: OR 0000088a: SWAP1 0000088b: SSTORE 0000088c: PUSH2 0x0895 0000088f: PUSH1 0x08 00000891: PUSH2 0x03d1 00000894: JUMP 00000895: JUMPDEST 00000896: PUSH2 0x08a1 00000899: PUSH3 0x093a80 0000089d: PUSH2 0x0672 000008a0: JUMP 000008a1: JUMPDEST 000008a2: DUP1 000008a3: ISZERO 000008a4: PUSH2 0x064c 000008a7: JUMPI 000008a8: PUSH1 0x00 000008aa: DUP1 000008ab: SLOAD 000008ac: PUSH2 0xff00 000008af: NOT 000008b0: AND 000008b1: SWAP1 000008b2: SSTORE 000008b3: PUSH1 0x40 000008b5: MLOAD 000008b6: PUSH1 0x01 000008b8: DUP2 000008b9: MSTORE 000008ba: PUSH32 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498 000008db: SWAP1 000008dc: PUSH1 0x20 000008de: ADD 000008df: PUSH1 0x40 000008e1: MLOAD 000008e2: DUP1 000008e3: SWAP2 000008e4: SUB 000008e5: SWAP1 000008e6: LOG1 000008e7: POP 000008e8: POP 000008e9: JUMP 000008ea: JUMPDEST 000008eb: PUSH2 0x08f2 000008ee: PUSH2 0x0ae8 000008f1: JUMP 000008f2: JUMPDEST 000008f3: PUSH1 0x01 000008f5: PUSH1 0x01 000008f7: PUSH1 0xa0 000008f9: SHL 000008fa: SUB 000008fb: DUP2 000008fc: AND 000008fd: PUSH2 0x0957 00000900: JUMPI 00000901: PUSH1 0x40 00000903: MLOAD 00000904: PUSH3 0x461bcd 00000908: PUSH1 0xe5 0000090a: SHL 0000090b: DUP2 0000090c: MSTORE 0000090d: PUSH1 0x20 0000090f: PUSH1 0x04 00000911: DUP3 00000912: ADD 00000913: MSTORE 00000914: PUSH1 0x26 00000916: PUSH1 0x24 00000918: DUP3 00000919: ADD 0000091a: MSTORE 0000091b: PUSH32 0x4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061 0000093c: PUSH1 0x44 0000093e: DUP3 0000093f: ADD 00000940: MSTORE 00000941: PUSH6 0x646472657373 00000948: PUSH1 0xd0 0000094a: SHL 0000094b: PUSH1 0x64 0000094d: DUP3 0000094e: ADD 0000094f: MSTORE 00000950: PUSH1 0x84 00000952: ADD 00000953: PUSH2 0x0406 00000956: JUMP 00000957: JUMPDEST 00000958: PUSH2 0x0960 0000095b: DUP2 0000095c: PUSH2 0x0c60 0000095f: JUMP 00000960: JUMPDEST 00000961: POP 00000962: JUMP 00000963: JUMPDEST 00000964: CALLER 00000965: PUSH1 0x00 00000967: SWAP1 00000968: DUP2 00000969: MSTORE 0000096a: PUSH1 0x68 0000096c: PUSH1 0x20 0000096e: SWAP1 0000096f: DUP2 00000970: MSTORE 00000971: PUSH1 0x40 00000973: SWAP2 00000974: DUP3 00000975: SWAP1 00000976: KECCAK256 00000977: DUP3 00000978: MLOAD 00000979: PUSH1 0x60 0000097b: DUP2 0000097c: ADD 0000097d: DUP5 0000097e: MSTORE 0000097f: DUP2 00000980: SLOAD 00000981: DUP1 00000982: DUP3 00000983: MSTORE 00000984: PUSH1 0x01 00000986: DUP4 00000987: ADD 00000988: SLOAD 00000989: SWAP4 0000098a: DUP3 0000098b: ADD 0000098c: SWAP4 0000098d: SWAP1 0000098e: SWAP4 0000098f: MSTORE 00000990: PUSH1 0x02 00000992: SWAP1 00000993: SWAP2 00000994: ADD 00000995: SLOAD 00000996: PUSH1 0x01 00000998: PUSH1 0x01 0000099a: PUSH1 0xa0 0000099c: SHL 0000099d: SUB 0000099e: AND 0000099f: SWAP3 000009a0: DUP2 000009a1: ADD 000009a2: SWAP3 000009a3: SWAP1 000009a4: SWAP3 000009a5: MSTORE 000009a6: PUSH2 0x09c4 000009a9: JUMPI 000009aa: PUSH1 0x40 000009ac: MLOAD 000009ad: PUSH4 0x2285814f 000009b2: PUSH1 0xe0 000009b4: SHL 000009b5: DUP2 000009b6: MSTORE 000009b7: CALLER 000009b8: PUSH1 0x04 000009ba: DUP3 000009bb: ADD 000009bc: MSTORE 000009bd: PUSH1 0x24 000009bf: ADD 000009c0: PUSH2 0x0406 000009c3: JUMP 000009c4: JUMPDEST 000009c5: PUSH1 0x69 000009c7: SLOAD 000009c8: PUSH1 0x20 000009ca: DUP3 000009cb: ADD 000009cc: MLOAD 000009cd: PUSH1 0x00 000009cf: SWAP2 000009d0: PUSH2 0x0100 000009d3: SWAP1 000009d4: DIV 000009d5: PUSH4 0xffffffff 000009da: AND 000009db: SWAP1 000009dc: PUSH2 0x09e4 000009df: SWAP1 000009e0: PUSH2 0x0650 000009e3: JUMP 000009e4: JUMPDEST 000009e5: PUSH2 0x09ee 000009e8: SWAP2 000009e9: SWAP1 000009ea: PUSH2 0x0e18 000009ed: JUMP 000009ee: JUMPDEST 000009ef: SWAP1 000009f0: POP 000009f1: DUP1 000009f2: TIMESTAMP 000009f3: LT 000009f4: ISZERO 000009f5: PUSH2 0x0a14 000009f8: JUMPI 000009f9: PUSH1 0x40 000009fb: MLOAD 000009fc: PUSH4 0x0854f3dd 00000a01: PUSH1 0xe4 00000a03: SHL 00000a04: DUP2 00000a05: MSTORE 00000a06: PUSH1 0x04 00000a08: DUP2 00000a09: ADD 00000a0a: DUP3 00000a0b: SWAP1 00000a0c: MSTORE 00000a0d: PUSH1 0x24 00000a0f: ADD 00000a10: PUSH2 0x0406 00000a13: JUMP 00000a14: JUMPDEST 00000a15: PUSH1 0x40 00000a17: DUP3 00000a18: ADD 00000a19: MLOAD 00000a1a: PUSH1 0x01 00000a1c: PUSH1 0x01 00000a1e: PUSH1 0xa0 00000a20: SHL 00000a21: SUB 00000a22: AND 00000a23: PUSH2 0x0a2d 00000a26: JUMPI 00000a27: CALLER 00000a28: PUSH1 0x40 00000a2a: DUP4 00000a2b: ADD 00000a2c: MSTORE 00000a2d: JUMPDEST 00000a2e: DUP2 00000a2f: MLOAD 00000a30: PUSH1 0x66 00000a32: DUP1 00000a33: SLOAD 00000a34: PUSH1 0x00 00000a36: SWAP1 00000a37: PUSH2 0x0a41 00000a3a: SWAP1 00000a3b: DUP5 00000a3c: SWAP1 00000a3d: PUSH2 0x0e6f 00000a40: JUMP 00000a41: JUMPDEST 00000a42: SWAP1 00000a43: SWAP2 00000a44: SSTORE 00000a45: POP 00000a46: POP 00000a47: CALLER 00000a48: PUSH1 0x00 00000a4a: SWAP1 00000a4b: DUP2 00000a4c: MSTORE 00000a4d: PUSH1 0x68 00000a4f: PUSH1 0x20 00000a51: MSTORE 00000a52: PUSH1 0x40 00000a54: DUP1 00000a55: DUP3 00000a56: KECCAK256 00000a57: DUP3 00000a58: DUP2 00000a59: SSTORE 00000a5a: PUSH1 0x01 00000a5c: DUP2 00000a5d: ADD 00000a5e: SWAP3 00000a5f: SWAP1 00000a60: SWAP3 00000a61: SSTORE 00000a62: PUSH1 0x02 00000a64: SWAP1 00000a65: SWAP2 00000a66: ADD 00000a67: DUP1 00000a68: SLOAD 00000a69: PUSH1 0x01 00000a6b: PUSH1 0x01 00000a6d: PUSH1 0xa0 00000a6f: SHL 00000a70: SUB 00000a71: NOT 00000a72: AND 00000a73: SWAP1 00000a74: SSTORE 00000a75: DUP3 00000a76: MLOAD 00000a77: SWAP1 00000a78: DUP4 00000a79: ADD 00000a7a: MLOAD 00000a7b: PUSH2 0x0a8f 00000a7e: SWAP2 00000a7f: PUSH1 0x01 00000a81: PUSH1 0x01 00000a83: PUSH1 0xa0 00000a85: SHL 00000a86: SUB 00000a87: SWAP1 00000a88: SWAP2 00000a89: AND 00000a8a: SWAP1 00000a8b: PUSH2 0x0b42 00000a8e: JUMP 00000a8f: JUMPDEST 00000a90: DUP2 00000a91: MLOAD 00000a92: PUSH1 0x40 00000a94: DUP1 00000a95: DUP5 00000a96: ADD 00000a97: MLOAD 00000a98: PUSH1 0x20 00000a9a: DUP1 00000a9b: DUP7 00000a9c: ADD 00000a9d: MLOAD 00000a9e: DUP4 00000a9f: MLOAD 00000aa0: SWAP5 00000aa1: DUP6 00000aa2: MSTORE 00000aa3: PUSH1 0x01 00000aa5: PUSH1 0x01 00000aa7: PUSH1 0xa0 00000aa9: SHL 00000aaa: SUB 00000aab: SWAP1 00000aac: SWAP3 00000aad: AND 00000aae: SWAP1 00000aaf: DUP5 00000ab0: ADD 00000ab1: MSTORE 00000ab2: SWAP1 00000ab3: DUP3 00000ab4: ADD 00000ab5: MSTORE 00000ab6: CALLER 00000ab7: SWAP1 00000ab8: PUSH32 0x4ad6c9db614816b1d4fdd5a52f2080b9917d523b6e804ebd14e96182278c8c1f 00000ad9: SWAP1 00000ada: PUSH1 0x60 00000adc: ADD 00000add: PUSH1 0x40 00000adf: MLOAD 00000ae0: DUP1 00000ae1: SWAP2 00000ae2: SUB 00000ae3: SWAP1 00000ae4: LOG2 00000ae5: POP 00000ae6: POP 00000ae7: JUMP 00000ae8: JUMPDEST 00000ae9: PUSH1 0x33 00000aeb: SLOAD 00000aec: PUSH1 0x01 00000aee: PUSH1 0x01 00000af0: PUSH1 0xa0 00000af2: SHL 00000af3: SUB 00000af4: AND 00000af5: CALLER 00000af6: EQ 00000af7: PUSH2 0x06e9 00000afa: JUMPI 00000afb: PUSH1 0x40 00000afd: MLOAD 00000afe: PUSH3 0x461bcd 00000b02: PUSH1 0xe5 00000b04: SHL 00000b05: DUP2 00000b06: MSTORE 00000b07: PUSH1 0x20 00000b09: PUSH1 0x04 00000b0b: DUP3 00000b0c: ADD 00000b0d: DUP2 00000b0e: SWAP1 00000b0f: MSTORE 00000b10: PUSH1 0x24 00000b12: DUP3 00000b13: ADD 00000b14: MSTORE 00000b15: PUSH32 0x4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572 00000b36: PUSH1 0x44 00000b38: DUP3 00000b39: ADD 00000b3a: MSTORE 00000b3b: PUSH1 0x64 00000b3d: ADD 00000b3e: PUSH2 0x0406 00000b41: JUMP 00000b42: JUMPDEST 00000b43: DUP1 00000b44: SELFBALANCE 00000b45: LT 00000b46: ISZERO 00000b47: PUSH2 0x0b92 00000b4a: JUMPI 00000b4b: PUSH1 0x40 00000b4d: MLOAD 00000b4e: PUSH3 0x461bcd 00000b52: PUSH1 0xe5 00000b54: SHL 00000b55: DUP2 00000b56: MSTORE 00000b57: PUSH1 0x20 00000b59: PUSH1 0x04 00000b5b: DUP3 00000b5c: ADD 00000b5d: MSTORE 00000b5e: PUSH1 0x1d 00000b60: PUSH1 0x24 00000b62: DUP3 00000b63: ADD 00000b64: MSTORE 00000b65: PUSH32 0x416464726573733a20696e73756666696369656e742062616c616e6365000000 00000b86: PUSH1 0x44 00000b88: DUP3 00000b89: ADD 00000b8a: MSTORE 00000b8b: PUSH1 0x64 00000b8d: ADD 00000b8e: PUSH2 0x0406 00000b91: JUMP 00000b92: JUMPDEST 00000b93: PUSH1 0x00 00000b95: DUP3 00000b96: PUSH1 0x01 00000b98: PUSH1 0x01 00000b9a: PUSH1 0xa0 00000b9c: SHL 00000b9d: SUB 00000b9e: AND 00000b9f: DUP3 00000ba0: PUSH1 0x40 00000ba2: MLOAD 00000ba3: PUSH1 0x00 00000ba5: PUSH1 0x40 00000ba7: MLOAD 00000ba8: DUP1 00000ba9: DUP4 00000baa: SUB 00000bab: DUP2 00000bac: DUP6 00000bad: DUP8 00000bae: GAS 00000baf: CALL 00000bb0: SWAP3 00000bb1: POP 00000bb2: POP 00000bb3: POP 00000bb4: RETURNDATASIZE 00000bb5: DUP1 00000bb6: PUSH1 0x00 00000bb8: DUP2 00000bb9: EQ 00000bba: PUSH2 0x0bdf 00000bbd: JUMPI 00000bbe: PUSH1 0x40 00000bc0: MLOAD 00000bc1: SWAP2 00000bc2: POP 00000bc3: PUSH1 0x1f 00000bc5: NOT 00000bc6: PUSH1 0x3f 00000bc8: RETURNDATASIZE 00000bc9: ADD 00000bca: AND 00000bcb: DUP3 00000bcc: ADD 00000bcd: PUSH1 0x40 00000bcf: MSTORE 00000bd0: RETURNDATASIZE 00000bd1: DUP3 00000bd2: MSTORE 00000bd3: RETURNDATASIZE 00000bd4: PUSH1 0x00 00000bd6: PUSH1 0x20 00000bd8: DUP5 00000bd9: ADD 00000bda: RETURNDATACOPY 00000bdb: PUSH2 0x0be4 00000bde: JUMP 00000bdf: JUMPDEST 00000be0: PUSH1 0x60 00000be2: SWAP2 00000be3: POP 00000be4: JUMPDEST 00000be5: POP 00000be6: POP 00000be7: SWAP1 00000be8: POP 00000be9: DUP1 00000bea: PUSH2 0x0c5b 00000bed: JUMPI 00000bee: PUSH1 0x40 00000bf0: MLOAD 00000bf1: PUSH3 0x461bcd 00000bf5: PUSH1 0xe5 00000bf7: SHL 00000bf8: DUP2 00000bf9: MSTORE 00000bfa: PUSH1 0x20 00000bfc: PUSH1 0x04 00000bfe: DUP3 00000bff: ADD 00000c00: MSTORE 00000c01: PUSH1 0x3a 00000c03: PUSH1 0x24 00000c05: DUP3 00000c06: ADD 00000c07: MSTORE 00000c08: PUSH32 0x416464726573733a20756e61626c6520746f2073656e642076616c75652c2072 00000c29: PUSH1 0x44 00000c2b: DUP3 00000c2c: ADD 00000c2d: MSTORE 00000c2e: PUSH32 0x6563697069656e74206d61792068617665207265766572746564000000000000 00000c4f: PUSH1 0x64 00000c51: DUP3 00000c52: ADD 00000c53: MSTORE 00000c54: PUSH1 0x84 00000c56: ADD 00000c57: PUSH2 0x0406 00000c5a: JUMP 00000c5b: JUMPDEST 00000c5c: POP 00000c5d: POP 00000c5e: POP 00000c5f: JUMP 00000c60: JUMPDEST 00000c61: PUSH1 0x33 00000c63: DUP1 00000c64: SLOAD 00000c65: PUSH1 0x01 00000c67: PUSH1 0x01 00000c69: PUSH1 0xa0 00000c6b: SHL 00000c6c: SUB 00000c6d: DUP4 00000c6e: DUP2 00000c6f: AND 00000c70: PUSH1 0x01 00000c72: PUSH1 0x01 00000c74: PUSH1 0xa0 00000c76: SHL 00000c77: SUB 00000c78: NOT 00000c79: DUP4 00000c7a: AND 00000c7b: DUP2 00000c7c: OR 00000c7d: SWAP1 00000c7e: SWAP4 00000c7f: SSTORE 00000c80: PUSH1 0x40 00000c82: MLOAD 00000c83: SWAP2 00000c84: AND 00000c85: SWAP2 00000c86: SWAP1 00000c87: DUP3 00000c88: SWAP1 00000c89: PUSH32 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0 00000caa: SWAP1 00000cab: PUSH1 0x00 00000cad: SWAP1 00000cae: LOG3 00000caf: POP 00000cb0: POP 00000cb1: JUMP 00000cb2: JUMPDEST 00000cb3: PUSH1 0x00 00000cb5: SLOAD 00000cb6: PUSH2 0x0100 00000cb9: SWAP1 00000cba: DIV 00000cbb: PUSH1 0xff 00000cbd: AND 00000cbe: PUSH2 0x0cd9 00000cc1: JUMPI 00000cc2: PUSH1 0x40 00000cc4: MLOAD 00000cc5: PUSH3 0x461bcd 00000cc9: PUSH1 0xe5 00000ccb: SHL 00000ccc: DUP2 00000ccd: MSTORE 00000cce: PUSH1 0x04 00000cd0: ADD 00000cd1: PUSH2 0x0406 00000cd4: SWAP1 00000cd5: PUSH2 0x0dcd 00000cd8: JUMP 00000cd9: JUMPDEST 00000cda: PUSH2 0x06e9 00000cdd: PUSH1 0x00 00000cdf: SLOAD 00000ce0: PUSH2 0x0100 00000ce3: SWAP1 00000ce4: DIV 00000ce5: PUSH1 0xff 00000ce7: AND 00000ce8: PUSH2 0x0d03 00000ceb: JUMPI 00000cec: PUSH1 0x40 00000cee: MLOAD 00000cef: PUSH3 0x461bcd 00000cf3: PUSH1 0xe5 00000cf5: SHL 00000cf6: DUP2 00000cf7: MSTORE 00000cf8: PUSH1 0x04 00000cfa: ADD 00000cfb: PUSH2 0x0406 00000cfe: SWAP1 00000cff: PUSH2 0x0dcd 00000d02: JUMP 00000d03: JUMPDEST 00000d04: PUSH2 0x06e9 00000d07: CALLER 00000d08: PUSH2 0x0c60 00000d0b: JUMP 00000d0c: JUMPDEST 00000d0d: PUSH1 0x00 00000d0f: PUSH1 0x20 00000d11: DUP3 00000d12: DUP5 00000d13: SUB 00000d14: SLT 00000d15: ISZERO 00000d16: PUSH2 0x0d1d 00000d19: JUMPI 00000d1a: DUP1 00000d1b: DUP2 00000d1c: REVERT 00000d1d: JUMPDEST 00000d1e: DUP2 00000d1f: CALLDATALOAD 00000d20: PUSH2 0x0d28 00000d23: DUP2 00000d24: PUSH2 0x0e9c 00000d27: JUMP 00000d28: JUMPDEST 00000d29: SWAP4 00000d2a: SWAP3 00000d2b: POP 00000d2c: POP 00000d2d: POP 00000d2e: JUMP 00000d2f: JUMPDEST 00000d30: PUSH1 0x00 00000d32: PUSH1 0x20 00000d34: DUP3 00000d35: DUP5 00000d36: SUB 00000d37: SLT 00000d38: ISZERO 00000d39: PUSH2 0x0d40 00000d3c: JUMPI 00000d3d: DUP1 00000d3e: DUP2 00000d3f: REVERT 00000d40: JUMPDEST 00000d41: POP 00000d42: CALLDATALOAD 00000d43: SWAP2 00000d44: SWAP1 00000d45: POP 00000d46: JUMP 00000d47: JUMPDEST 00000d48: PUSH1 0x00 00000d4a: DUP1 00000d4b: PUSH1 0x00 00000d4d: PUSH1 0x60 00000d4f: DUP5 00000d50: DUP7 00000d51: SUB 00000d52: SLT 00000d53: ISZERO 00000d54: PUSH2 0x0d5b 00000d57: JUMPI 00000d58: DUP2 00000d59: DUP3 00000d5a: REVERT 00000d5b: JUMPDEST 00000d5c: DUP4 00000d5d: CALLDATALOAD 00000d5e: SWAP3 00000d5f: POP 00000d60: PUSH1 0x20 00000d62: DUP5 00000d63: ADD 00000d64: CALLDATALOAD 00000d65: PUSH2 0x0d6d 00000d68: DUP2 00000d69: PUSH2 0x0e9c 00000d6c: JUMP 00000d6d: JUMPDEST 00000d6e: SWAP2 00000d6f: POP 00000d70: PUSH1 0x40 00000d72: DUP5 00000d73: ADD 00000d74: CALLDATALOAD 00000d75: PUSH2 0x0d7d 00000d78: DUP2 00000d79: PUSH2 0x0e9c 00000d7c: JUMP 00000d7d: JUMPDEST 00000d7e: DUP1 00000d7f: SWAP2 00000d80: POP 00000d81: POP 00000d82: SWAP3 00000d83: POP 00000d84: SWAP3 00000d85: POP 00000d86: SWAP3 00000d87: JUMP 00000d88: JUMPDEST 00000d89: PUSH1 0x00 00000d8b: PUSH1 0x20 00000d8d: DUP3 00000d8e: DUP5 00000d8f: SUB 00000d90: SLT 00000d91: ISZERO 00000d92: PUSH2 0x0d99 00000d95: JUMPI 00000d96: DUP1 00000d97: DUP2 00000d98: REVERT 00000d99: JUMPDEST 00000d9a: DUP2 00000d9b: CALLDATALOAD 00000d9c: PUSH4 0xffffffff 00000da1: DUP2 00000da2: AND 00000da3: DUP2 00000da4: EQ 00000da5: PUSH2 0x0d28 00000da8: JUMPI 00000da9: DUP2 00000daa: DUP3 00000dab: REVERT 00000dac: JUMPDEST 00000dad: PUSH1 0x00 00000daf: PUSH1 0x20 00000db1: DUP3 00000db2: DUP5 00000db3: SUB 00000db4: SLT 00000db5: ISZERO 00000db6: PUSH2 0x0dbd 00000db9: JUMPI 00000dba: DUP1 00000dbb: DUP2 00000dbc: REVERT 00000dbd: JUMPDEST 00000dbe: DUP2 00000dbf: CALLDATALOAD 00000dc0: PUSH1 0xff 00000dc2: DUP2 00000dc3: AND 00000dc4: DUP2 00000dc5: EQ 00000dc6: PUSH2 0x0d28 00000dc9: JUMPI 00000dca: DUP2 00000dcb: DUP3 00000dcc: REVERT 00000dcd: JUMPDEST 00000dce: PUSH1 0x20 00000dd0: DUP1 00000dd1: DUP3 00000dd2: MSTORE 00000dd3: PUSH1 0x2b 00000dd5: SWAP1 00000dd6: DUP3 00000dd7: ADD 00000dd8: MSTORE 00000dd9: PUSH32 0x496e697469616c697a61626c653a20636f6e7472616374206973206e6f742069 00000dfa: PUSH1 0x40 00000dfc: DUP3 00000dfd: ADD 00000dfe: MSTORE 00000dff: PUSH11 0x6e697469616c697a696e67 00000e0b: PUSH1 0xa8 00000e0d: SHL 00000e0e: PUSH1 0x60 00000e10: DUP3 00000e11: ADD 00000e12: MSTORE 00000e13: PUSH1 0x80 00000e15: ADD 00000e16: SWAP1 00000e17: JUMP 00000e18: JUMPDEST 00000e19: PUSH1 0x00 00000e1b: DUP3 00000e1c: NOT 00000e1d: DUP3 00000e1e: GT 00000e1f: ISZERO 00000e20: PUSH2 0x0e2b 00000e23: JUMPI 00000e24: PUSH2 0x0e2b 00000e27: PUSH2 0x0e86 00000e2a: JUMP 00000e2b: JUMPDEST 00000e2c: POP 00000e2d: ADD 00000e2e: SWAP1 00000e2f: JUMP 00000e30: JUMPDEST 00000e31: PUSH1 0x00 00000e33: DUP3 00000e34: PUSH2 0x0e4b 00000e37: JUMPI 00000e38: PUSH4 0x4e487b71 00000e3d: PUSH1 0xe0 00000e3f: SHL 00000e40: DUP2 00000e41: MSTORE 00000e42: PUSH1 0x12 00000e44: PUSH1 0x04 00000e46: MSTORE 00000e47: PUSH1 0x24 00000e49: DUP2 00000e4a: REVERT 00000e4b: JUMPDEST 00000e4c: POP 00000e4d: DIV 00000e4e: SWAP1 00000e4f: JUMP 00000e50: JUMPDEST 00000e51: PUSH1 0x00 00000e53: DUP2 00000e54: PUSH1 0x00 00000e56: NOT 00000e57: DIV 00000e58: DUP4 00000e59: GT 00000e5a: DUP3 00000e5b: ISZERO 00000e5c: ISZERO 00000e5d: AND 00000e5e: ISZERO 00000e5f: PUSH2 0x0e6a 00000e62: JUMPI 00000e63: PUSH2 0x0e6a 00000e66: PUSH2 0x0e86 00000e69: JUMP 00000e6a: JUMPDEST 00000e6b: POP 00000e6c: MUL 00000e6d: SWAP1 00000e6e: JUMP 00000e6f: JUMPDEST 00000e70: PUSH1 0x00 00000e72: DUP3 00000e73: DUP3 00000e74: LT 00000e75: ISZERO 00000e76: PUSH2 0x0e81 00000e79: JUMPI 00000e7a: PUSH2 0x0e81 00000e7d: PUSH2 0x0e86 00000e80: JUMP 00000e81: JUMPDEST 00000e82: POP 00000e83: SUB 00000e84: SWAP1 00000e85: JUMP 00000e86: JUMPDEST 00000e87: PUSH4 0x4e487b71 00000e8c: PUSH1 0xe0 00000e8e: SHL 00000e8f: PUSH1 0x00 00000e91: MSTORE 00000e92: PUSH1 0x11 00000e94: PUSH1 0x04 00000e96: MSTORE 00000e97: PUSH1 0x24 00000e99: PUSH1 0x00 00000e9b: REVERT 00000e9c: JUMPDEST 00000e9d: PUSH1 0x01 00000e9f: PUSH1 0x01 00000ea1: PUSH1 0xa0 00000ea3: SHL 00000ea4: SUB 00000ea5: DUP2 00000ea6: AND 00000ea7: DUP2 00000ea8: EQ 00000ea9: PUSH2 0x0960 00000eac: JUMPI 00000ead: PUSH1 0x00 00000eaf: DUP1 00000eb0: REVERT 00000eb1: INVALID 00000eb2: LOG2 00000eb3: PUSH5 0x6970667358 00000eb9: UNKNOWN(0x22) 00000eba: SLT 00000ebb: KECCAK256 00000ebc: NUMBER 00000ebd: UNKNOWN(0xDB) 00000ebe: UNKNOWN(0xBB) 00000ebf: UNKNOWN(0xE0) 00000ec0: DIV 00000ec1: UNKNOWN(0xE2) 00000ec2: DUP6 00000ec3: DUP16 00000ec4: INVALID 00000ec5: SWAP12 00000ec6: PUSH23 0x77e949bce7acbe9977997ad4d37fff5fb25f31184c6473 00000ede: PUSH16
| Severity | Category | Tool | Title | Confidence | Validated | Confirmed | Details |
|---|---|---|---|---|---|---|---|
| high | other | detector | Untrusted CALL target/value reachable | 60 | no | no |
viewtrace_id: 0x67b7fd34719d497129c0dd24da119b93abdfc23ddc9b9976bbddbc1157958f55
call_targets:
0xcb894c063c74053c9401ac8fdd9a9f2bb1a03c61
target_varies:
no
classification:
constant_target
validation_json{
"sink": "CALL",
"errors": 0,
"status": "sink_reached",
"attempts": 1,
"trace_id": "0x67b7fd34719d497129c0dd24da119b93abdfc23ddc9b9976bbddbc1157958f55",
"confirmed": false,
"trace_mode": "callTracer",
"call_targets": [
"0xcb894c063c74053c9401ac8fdd9a9f2bb1a03c61"
],
"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": "0xe6fd48bc",
"selector": "0xe6fd48bc",
"calldata_variants": [
"0xe6fd48bc",
"0xe6fd48bc0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xf2fde38b",
"selector": "0xf2fde38b",
"calldata_variants": [
"0xf2fde38b",
"0xf2fde38b0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xf756fa21",
"selector": "0xf756fa21",
"calldata_variants": [
"0xf756fa21",
"0xf756fa210000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xf7fc7002",
"selector": "0xf7fc7002",
"calldata_variants": [
"0xf7fc7002",
"0xf7fc70020000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xfa14d481",
"selector": "0xfa14d481",
"calldata_variants": [
"0xfa14d481",
"0xfa14d4810000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x715018a6",
"selector": "0x715018a6",
"calldata_variants": [
"0x715018a6",
"0x715018a60000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x750f0ba6",
"selector": "0x750f0ba6",
"calldata_variants": [
"0x750f0ba6",
"0x750f0ba60000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x757991a8",
"selector": "0x757991a8",
"calldata_variants": [
"0x757991a8",
"0x757991a80000000000000000000000000000000000000000000000000000000000000000"
]
}
]
}
evidence_json{
"examples": [
{
"pc": 2991,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
}
],
"call_count": 1,
"guards_detected": [],
"untrusted_call_count": 1
}
|
| high | other | detector | ETH value transfer possible | 55 | no | no |
viewtrace_id: 0x67b7fd34719d497129c0dd24da119b93abdfc23ddc9b9976bbddbc1157958f55
call_targets:
0xcb894c063c74053c9401ac8fdd9a9f2bb1a03c61
target_varies:
no
classification:
constant_target
validation_json{
"sink": "CALL",
"errors": 0,
"status": "sink_reached",
"attempts": 1,
"trace_id": "0x67b7fd34719d497129c0dd24da119b93abdfc23ddc9b9976bbddbc1157958f55",
"confirmed": false,
"trace_mode": "callTracer",
"call_targets": [
"0xcb894c063c74053c9401ac8fdd9a9f2bb1a03c61"
],
"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": "0xe6fd48bc",
"selector": "0xe6fd48bc",
"calldata_variants": [
"0xe6fd48bc",
"0xe6fd48bc0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xf2fde38b",
"selector": "0xf2fde38b",
"calldata_variants": [
"0xf2fde38b",
"0xf2fde38b0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xf756fa21",
"selector": "0xf756fa21",
"calldata_variants": [
"0xf756fa21",
"0xf756fa210000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xf7fc7002",
"selector": "0xf7fc7002",
"calldata_variants": [
"0xf7fc7002",
"0xf7fc70020000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xfa14d481",
"selector": "0xfa14d481",
"calldata_variants": [
"0xfa14d481",
"0xfa14d4810000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x715018a6",
"selector": "0x715018a6",
"calldata_variants": [
"0x715018a6",
"0x715018a60000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x750f0ba6",
"selector": "0x750f0ba6",
"calldata_variants": [
"0x750f0ba6",
"0x750f0ba60000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x757991a8",
"selector": "0x757991a8",
"calldata_variants": [
"0x757991a8",
"0x757991a80000000000000000000000000000000000000000000000000000000000000000"
]
}
]
}
evidence_json{
"examples": [
{
"pc": 2991,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "computed",
"target_expression_category": "computed"
}
],
"eth_value_calls": 1,
"guards_detected": []
}
|
| high | upgradeability | slither | ERC4626Upgradeable._deposit(address,address,uint256,uint256) (contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol#245-262) uses arbitrary from in transfe... | 85 | no | — |
viewevidence_json{
"impact": "High",
"detector": "arbitrary-send-erc20",
"elements": [
{
"name": "_deposit",
"type": "function",
"source_mapping": {
"lines": [
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262
],
"start": 10734,
"length": 879,
"ending_column": 6,
"is_dependency": false,
"filename_short": "contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol",
"starting_column": 5,
"filename_absolute": "/tmp/slither-mtmdz1mn/contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol",
"filename_relative": "contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol"
},
"type_specific_fields": {
"parent": {
"name": "ERC4626Upgradeable",
"type": "contract",
"source_mapping": {
"lines": [
58,
59,
60,
61,
62,
63,
64,
65,
66,
67,
68,
69,
70,
71,
72,
73,
74,
75,
76,
77,
78,
79,
80,
81,
82,
83,
84,
85,
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300
],
"start": 3771,
"length": 9223,
"ending_column": 2,
"is_dependency": false,
"filename_short": "contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol",
"starting_column": 1,
"filename_absolute": "/tmp/slither-mtmdz1mn/contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol",
"filename_relative": "contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol"
}
},
"signature": "_deposit(address,address,uint256,uint256)"
}
},
{
"name": "SafeERC20Upgradeable.safeTransferFrom(_asset,caller,address(this),assets)",
"type": "node",
"source_mapping": {
"lines": [
258
],
"start": 11440,
"length": 76,
"ending_column": 85,
"is_dependency": false,
"filename_short": "contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol",
"starting_column": 9,
"filename_absolute": "/tmp/slither-mtmdz1mn/contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol",
"filename_relative": "contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol"
},
"type_specific_fields": {
"parent": {
"name": "_deposit",
"type": "function",
"source_mapping": {
"lines": [
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262
],
"start": 10734,
"length": 879,
"ending_column": 6,
"is_dependency": false,
"filename_short": "contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol",
"starting_column": 5,
"filename_absolute": "/tmp/slither-mtmdz1mn/contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol",
"filename_relative": "contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol"
},
"type_specific_fields": {
"parent": {
"name": "ERC4626Upgradeable",
"type": "contract",
"source_mapping": {
"lines": [
58,
59,
60,
61,
62,
63,
64,
65,
66,
67,
68,
69,
70,
71,
72,
73,
74,
75,
76,
77,
78,
79,
80,
81,
82,
83,
84,
85,
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300
],
"start": 3771,
"length": 9223,
"ending_column": 2,
"is_dependency": false,
"filename_short": "contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol",
"starting_column": 1,
"filename_absolute": "/tmp/slither-mtmdz1mn/contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol",
"filename_relative": "contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol"
}
},
"signature": "_deposit(address,address,uint256,uint256)"
}
}
}
}
],
"locations": [
{
"file": "contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol",
"name": "_deposit",
"type": "function",
"lines": [
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262
]
},
{
"file": "contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol",
"name": "SafeERC20Upgradeable.safeTransferFrom(_asset,caller,address(this),assets)",
"type": "node",
"lines": [
258
]
}
],
"description": "ERC4626Upgradeable._deposit(address,address,uint256,uint256) (contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol#245-262) uses arbitrary from in transferFrom: SafeERC20Upgradeable.safeTransferFrom(_asset,caller,address(this),assets) (contracts/vendor/openzeppelin/token/ERC20/extensions/ERC4626Upgradeable.sol#258)"
}
|
| high | other | slither | Staking.pushToBeacon(Staking.Node[],uint256,uint256,bytes32) (contracts/Staking.sol#296-337) sends eth to arbitrary user | 85 | no | — |
viewevidence_json{
"impact": "High",
"detector": "arbitrary-send-eth",
"elements": [
{
"name": "pushToBeacon",
"type": "function",
"source_mapping": {
"lines": [
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334,
335,
336,
337
],
"start": 12580,
"length": 1801,
"ending_column": 6,
"is_dependency": false,
"filename_short": "contracts/Staking.sol",
"starting_column": 5,
"filename_absolute": "/tmp/slither-mtmdz1mn/contracts/Staking.sol",
"filename_relative": "contracts/Staking.sol"
},
"type_specific_fields": {
"parent": {
"name": "Staking",
"type": "contract",
"source_mapping": {
"lines": [
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31,
32,
33,
34,
35,
36,
37,
38,
39,
40,
41,
42,
43,
44,
45,
46,
47,
48,
49,
50,
51,
52,
53,
54,
55,
56,
57,
58,
59,
60,
61,
62,
63,
64,
65,
66,
67,
68,
69,
70,
71,
72,
73,
74,
75,
76,
77,
78,
79,
80,
81,
82,
83,
84,
85,
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334,
335,
336,
337,
338,
339,
340,
341,
342,
343,
344,
345,
346,
347,
348,
349,
350,
351,
352,
353,
354,
355,
356,
357,
358,
359,
360,
361,
362,
363,
364,
365,
366,
367,
368,
369,
370,
371,
372,
373,
374,
375,
376,
377,
378,
379,
380,
381,
382,
383,
384,
385,
386,
387,
388,
389,
390,
391,
392,
393,
394,
395,
396,
397,
398,
399,
400,
401,
402,
403,
404,
405,
406,
407,
408,
409,
410,
411,
412,
413,
414,
415,
416,
417,
418,
419,
420,
421,
422,
423,
424,
425,
426,
427,
428,
429,
430,
431,
432,
433,
434,
435,
436,
437,
438,
439,
440,
441,
442,
443,
444,
445,
446,
447,
448,
449
],
"start": 1009,
"length": 17943,
"ending_column": 2,
"is_dependency": false,
"filename_short": "contracts/Staking.sol",
"starting_column": 1,
"filename_absolute": "/tmp/slither-mtmdz1mn/contracts/Staking.sol",
"filename_relative": "contracts/Staking.sol"
}
},
"signature": "pushToBeacon(Staking.Node[],uint256,uint256,bytes32)"
}
},
{
"name": "depositContract.deposit{value: 32000000000000000000}(_nodes[i].pubkey,_withdrawalCredential,_nodes[i].signature,_nodes[i].depositDataRoot)",
"type": "node",
"source_mapping": {
"lines": [
326,
327,
328,
329,
330,
331
],
"start": 14004,
"length": 207,
"ending_column": 14,
"is_dependency": false,
"filename_short": "contracts/Staking.sol",
"starting_column": 13,
"filename_absolute": "/tmp/slither-mtmdz1mn/contracts/Staking.sol",
"filename_relative": "contracts/Staking.sol"
},
"type_specific_fields": {
"parent": {
"name": "pushToBeacon",
"type": "function",
"source_mapping": {
"lines": [
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334,
335,
336,
337
],
"start": 12580,
"length": 1801,
"ending_column": 6,
"is_dependency": false,
"filename_short": "contracts/Staking.sol",
"starting_column": 5,
"filename_absolute": "/tmp/slither-mtmdz1mn/contracts/Staking.sol",
"filename_relative": "contracts/Staking.sol"
},
"type_specific_fields": {
"parent": {
"name": "Staking",
"type": "contract",
"source_mapping": {
"lines": [
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31,
32,
33,
34,
35,
36,
37,
38,
39,
40,
41,
42,
43,
44,
45,
46,
47,
48,
49,
50,
51,
52,
53,
54,
55,
56,
57,
58,
59,
60,
61,
62,
63,
64,
65,
66,
67,
68,
69,
70,
71,
72,
73,
74,
75,
76,
77,
78,
79,
80,
81,
82,
83,
84,
85,
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334,
335,
336,
337,
338,
339,
340,
341,
342,
343,
344,
345,
346,
347,
348,
349,
350,
351,
352,
353,
354,
355,
356,
357,
358,
359,
360,
361,
362,
363,
364,
365,
366,
367,
368,
369,
370,
371,
372,
373,
374,
375,
376,
377,
378,
379,
380,
381,
382,
383,
384,
385,
386,
387,
388,
389,
390,
391,
392,
393,
394,
395,
396,
397,
398,
399,
400,
401,
402,
403,
404,
405,
406,
407,
408,
409,
410,
411,
412,
413,
414,
415,
416,
417,
418,
419,
420,
421,
422,
423,
424,
425,
426,
427,
428,
429,
430,
431,
432,
433,
434,
435,
436,
437,
438,
439,
440,
441,
442,
443,
444,
445,
446,
447,
448,
449
],
"start": 1009,
"length": 17943,
"ending_column": 2,
"is_dependency": false,
"filename_short": "contracts/Staking.sol",
"starting_column": 1,
"filename_absolute": "/tmp/slither-mtmdz1mn/contracts/Staking.sol",
"filename_relative": "contracts/Staking.sol"
}
},
"signature": "pushToBeacon(Staking.Node[],uint256,uint256,bytes32)"
}
}
}
}
],
"locations": [
{
"file": "contracts/Staking.sol",
"name": "pushToBeacon",
"type": "function",
"lines": [
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334,
335,
336,
337
]
},
{
"file": "contracts/Staking.sol",
"name": "depositContract.deposit{value: 32000000000000000000}(_nodes[i].pubkey,_withdrawalCredential,_nodes[i].signature,_nodes[i].depositDataRoot)",
"type": "node",
"lines": [
326,
327,
328,
329,
330,
331
]
}
],
"description": "Staking.pushToBeacon(Staking.Node[],uint256,uint256,bytes32) (contracts/Staking.sol#296-337) sends eth to arbitrary user\n\tDangerous calls:\n\t- depositContract.deposit{value: 32000000000000000000}(_nodes[i].pubkey,_withdrawalCredential,_nodes[i].signature,_nodes[i].depositDataRoot) (contracts/Staking.sol#326-331)"
}
|
| high | reentrancy | slither | Reentrancy in Staking._deposit(address,address,uint256,uint256) (contracts/Staking.sol#381-408): | 85 | no | — |
viewevidence_json{
"impact": "High",
"detector": "reentrancy-eth",
"elements": [
{
"name": "_deposit",
"type": "function",
"source_mapping": {
"lines": [
381,
382,
383,
384,
385,
386,
387,
388,
389,
390,
391,
392,
393,
394,
395,
396,
397,
398,
399,
400,
401,
402,
403,
404,
405,
406,
407,
408
],
"start": 16310,
"length": 1031,
"ending_column": 6,
"is_dependency": false,
"filename_short": "contracts/Staking.sol",
"starting_column": 5,
"filename_absolute": "/tmp/slither-mtmdz1mn/contracts/Staking.sol",
"filename_relative": "contracts/Staking.sol"
},
"type_specific_fields": {
"parent": {
"name": "Staking",
"type": "contract",
"source_mapping": {
"lines": [
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31,
32,
33,
34,
35,
36,
37,
38,
39,
40,
41,
42,
43,
44,
45,
46,
47,
48,
49,
50,
51,
52,
53,
54,
55,
56,
57,
58,
59,
60,
61,
62,
63,
64,
65,
66,
67,
68,
69,
70,
71,
72,
73,
74,
75,
76,
77,
78,
79,
80,
81,
82,
83,
84,
85,
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334,
335,
336,
337,
338,
339,
340,
341,
342,
343,
344,
345,
346,
347,
348,
349,
350,
351,
352,
353,
354,
355,
356,
357,
358,
359,
360,
361,
362,
363,
364,
365,
366,
367,
368,
369,
370,
371,
372,
373,
374,
375,
376,
377,
378,
379,
380,
381,
382,
383,
384,
385,
386,
387,
388,
389,
390,
391,
392,
393,
394,
395,
396,
397,
398,
399,
400,
401,
402,
403,
404,
405,
406,
407,
408,
409,
410,
411,
412,
413,
414,
415,
416,
417,
418,
419,
420,
421,
422,
423,
424,
425,
426,
427,
428,
429,
430,
431,
432,
433,
434,
435,
436,
437,
438,
439,
440,
441,
442,
443,
444,
445,
446,
447,
448,
449
],
"start": 1009,
"length": 17943,
"ending_column": 2,
"is_dependency": false,
"filename_short": "contracts/Staking.sol",
"starting_column": 1,
"filename_absolute": "/tmp/slither-mtmdz1mn/contracts/Staking.sol",
"filename_relative": "contracts/Staking.sol"
}
},
"signature": "_deposit(address,address,uint256,uint256)"
}
},
{
"name": "(sharesFromPool,assetsToPool) = _getmpETHFromPool(_shares,address(this))",
"type": "node",
"source_mapping": {
"lines": [
388
],
"start": 16561,
"length": 90,
"ending_column": 99,
"is_dependency": false,
"filename_short": "contracts/Staking.sol",
"starting_column": 9,
"filename_absolute": "/tmp/slither-mtmdz1mn/contracts/Staking.sol",
"filename_relative": "contracts/Staking.sol"
},
"additional_fields": {
"underlying_type": "external_calls"
},
"type_specific_fields": {
"parent": {
"name": "_deposit",
"type": "function",
"source_mapping": {
"lines": [
381,
382,
383,
384,
385,
386,
387,
388,
389,
390,
391,
392,
393,
394,
395,
396,
397,
398,
399,
400,
401,
402,
403,
404,
405,
406,
407,
408
],
"start": 16310,
"length": 1031,
"ending_column": 6,
"is_dependency": false,
"filename_short": "contracts/Staking.sol",
"starting_column": 5,
"filename_absolute": "/tmp/slither-mtmdz1mn/contracts/Staking.sol",
"filename_relative": "contracts/Staking.sol"
},
"type_specific_fields": {
"parent": {
"name": "Staking",
"type": "contract",
"source_mapping": {
"lines": [
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31,
32,
33,
34,
35,
36,
37,
38,
39,
40,
41,
42,
43,
44,
45,
46,
47,
48,
49,
50,
51,
52,
53,
54,
55,
56,
57,
58,
59,
60,
61,
62,
63,
64,
65,
66,
67,
68,
69,
70,
71,
72,
73,
74,
75,
76,
77,
78,
79,
80,
81,
82,
83,
84,
85,
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334,
335,
336,
337,
338,
339,
340,
341,
342,
343,
344,
345,
346,
347,
348,
349,
350,
351,
352,
353,
354,
355,
356,
357,
358,
359,
360,
361,
362,
363,
364,
365,
366,
367,
368,
369,
370,
371,
372,
373,
374,
375,
376,
377,
378,
379,
380,
381,
382,
383,
384,
385,
386,
387,
388,
389,
390,
391,
392,
393,
394,
395,
396,
397,
398,
399,
400,
401,
402,
403,
404,
405,
406,
407,
408,
409,
410,
411,
412,
413,
414,
415,
416,
417,
418,
419,
420,
421,
422,
423,
424,
425,
426,
427,
428,
429,
430,
431,
432,
433,
434,
435,
436,
437,
438,
439,
440,
441,
442,
443,
444,
445,
446,
447,
448,
449
],
"start": 1009,
"length": 17943,
"ending_column": 2,
"is_dependency": false,
"filename_short": "contracts/Staking.sol",
"starting_column": 1,
"filename_absolute": "/tmp/slither-mtmdz1mn/contracts/Staking.sol",
"filename_relative": "contracts/Staking.sol"
}
},
"signature": "_deposit(address,address,uint256,uint256)"
}
}
}
},
{
"name": "assert(bool)(LiquidUnstakePool(liquidUnstakePool).swapETHFormpETH{value: assetsToPool}(_receiver) == sharesFromPool)",
"type": "node",
"source_mapping": {
"lines": [
423,
424,
425,
426,
427
],
"start": 18120,
"length": 194,
"ending_column": 18,
"is_dependency": false,
"filename_short": "contracts/Staking.sol",
"starting_column": 17,
"filename_absolute": "/tmp/slither-mtmdz1mn/contracts/Staking.sol",
"filename_relative": "contracts/Staking.sol"
},
"additional_fields": {
"underlying_type": "external_calls_sending_eth"
},
"type_specific_fields": {
"parent": {
"name": "_getmpETHFromPool",
"type": "function",
"source_mapping": {
"lines": [
414,
415,
416,
417,
418,
419,
420,
421,
422,
423,
424,
425,
426,
427,
428,
429,
430
],
"start": 17719,
"length": 626,
"ending_column": 6,
"is_dependency": false,
"filename_short": "contracts/Staking.sol",
"starting_column": 5,
"filename_absolute": "/tmp/slither-mtmdz1mn/contracts/Staking.sol",
"filename_relative": "contracts/Staking.sol"
},
"type_specific_fields": {
"parent": {
"name": "Staking",
"type": "contract",
"source_mapping": {
"lines": [
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31,
32,
33,
34,
35,
36,
37,
38,
39,
40,
41,
42,
43,
44,
45,
46,
47,
48,
49,
50,
51,
52,
53,
54,
55,
56,
57,
58,
59,
60,
61,
62,
63,
64,
65,
66,
67,
68,
69,
70,
71,
72,
73,
74,
75,
76,
77,
78,
79,
80,
81,
82,
83,
84,
85,
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334,
335,
336,
337,
338,
339,
340,
341,
342,
343,
344,
345,
346,
347,
348,
349,
350,
351,
352,
353,
354,
355,
356,
357,
358,
359,
360,
361,
362,
363,
364,
365,
366,
367,
368,
369,
370,
371,
372,
373,
374,
375,
376,
377,
378,
379,
380,
381,
382,
383,
384,
385,
386,
387,
388,
389,
390,
391,
392,
393,
394,
395,
396,
397,
398,
399,
400,
401,
402,
403,
404,
405,
406,
407,
408,
409,
410,
411,
412,
413,
414,
415,
416,
417,
418,
419,
420,
421,
422,
423,
424,
425,
426,
427,
428,
429,
430,
431,
432,
433,
434,
435,
436,
437,
438,
439,
440,
441,
442,
443,
444,
445,
446,
447,
448,
449
],
"start": 1009,
"length": 17943,
"ending_column": 2,
"is_dependency": false,
"filename_short": "contracts/Staking.sol",
"starting_column": 1,
"filename_absolute": "/tmp/slither-mtmdz1mn/contracts/Staking.sol",
"filename_relative": "contracts/Staking.sol"
}
},
"signature": "_getmpETHFromPool(uint256,address)"
}
}
}
},
{
"name": "_mint(address(this),sharesToMint)",
"type": "node",
"source_mapping": {
"lines": [
392
],
"start": 16795,
"length": 34,
"ending_column": 65,
"is_dependency": false,
"filename_short": "contracts/Staking.sol",
"starting_column": 31,
"filename_absolute": "/tmp/slither-mtmdz1mn/contracts/Staking.sol",
"filename_relative": "contracts/Staking.sol"
},
"additional_fields": {
"variable_name": "_balances",
"underlying_type": "variables_written"
},
"type_specific_fields": {
"parent": {
"name": "_deposit",
"type": "function",
"source_mapping": {
"lines": [
381,
382,
383,
384,
385,
386,
387,
388,
389,
390,
391,
392,
393,
394,
395,
396,
397,
398,
399,
400,
401,
402,
403,
404,
405,
406,
407,
408
],
"start": 16310,
"length": 1031,
"ending_column": 6,
"is_dependency": false,
"filename_short": "contracts/Staking.sol",
"starting_column": 5,
"filename_absolute": "/tmp/slither-mtmdz1mn/contracts/Staking.sol",
"filename_relative": "contracts/Staking.sol"
},
"type_specific_fields": {
"parent": {
"name": "Staking",
"type": "contract",
"source_mapping": {
"lines": [
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31,
32,
33,
34,
35,
36,
37,
38,
39,
40,
41,
42,
43,
44,
45,
46,
47,
48,
49,
50,
51,
52,
53,
54,
55,
56,
57,
58,
59,
60,
61,
62,
63,
64,
65,
66,
67,
68,
69,
70,
71,
72,
73,
74,
75,
76,
77,
78,
79,
80,
81,
82,
83,
84,
85,
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334,
335,
336,
337,
338,
339,
340,
341,
342,
343,
344,
345,
346,
347,
348,
349,
350,
351,
352,
353,
354,
355,
356,
357,
358,
359,
360,
361,
362,
363,
364,
365,
366,
367,
368,
369,
370,
371,
372,
373,
374,
375,
376,
377,
378,
379,
380,
381,
382,
383,
384,
385,
386,
387,
388,
389,
390,
391,
392,
393,
394,
395,
396,
397,
398,
399,
400,
401,
402,
403,
404,
405,
406,
407,
408,
409,
410,
411,
412,
413,
414,
415,
416,
417,
418,
419,
420,
421,
422,
423,
424,
425,
426,
427,
428,
429,
430,
431,
432,
433,
434,
435,
436,
437,
438,
439,
440,
441,
442,
443,
444,
445,
446,
447,
448,
449
],
"start": 1009,
"length": 17943,
"ending_column": 2,
"is_dependency": false,
"filename_short": "contracts/Staking.sol",
"starting_column": 1,
"filename_absolute": "/tmp/slither-mtmdz1mn/contracts/Staking.sol",
"filename_relative": "contracts/Staking.sol"
}
},
"signature": "_deposit(address,address,uint256,uint256)"
}
}
}
},
{
"name": "_balances[account] += amount",
"type": "node",
"source_mapping": {
"lines": [
264
],
"start": 9257,
"length": 28,
"ending_column": 41,
"is_dependency": false,
"filename_short": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol",
"starting_column": 13,
"filename_absolute": "/tmp/slither-mtmdz1mn/@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol",
"filename_relative": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"
},
"additional_fields": {
"variable_name": "_balances",
"underlying_type": "variables_written"
},
"type_specific_fields": {
"parent": {
"name": "_mint",
"type": "function",
"source_mapping": {
"lines": [
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269
],
"start": 8878,
"length": 535,
"ending_column": 6,
"is_dependency": false,
"filename_short": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol",
"starting_column": 5,
"filename_absolute": "/tmp/slither-mtmdz1mn/@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol",
"filename_relative": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"
},
"type_specific_fields": {
"parent": {
"name": "ERC20Upgradeable",
"type": "contract",
"source_mapping": {
"lines": [
39,
40,
41,
42,
43,
44,
45,
46,
47,
48,
49,
50,
51,
52,
53,
54,
55,
56,
57,
58,
59,
60,
61,
62,
63,
64,
65,
66,
67,
68,
69,
70,
71,
72,
73,
74,
75,
76,
77,
78,
79,
80,
81,
82,
83,
84,
85,
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334,
335,
336,
337,
338,
339,
340,
341,
342,
343,
344,
345,
346,
347,
348,
349,
350,
351,
352,
353,
354,
355,
356,
357,
358,
359,
360,
361,
362,
363,
364,
365,
366,
367,
368,
369,
370,
371,
372,
373,
374,
375,
376,
377
],
"start": 1632,
"length": 11861,
"ending_column": 2,
"is_dependency": false,
"filename_short": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol",
"starting_column": 1,
"filename_absolute": "/tmp/slither-mtmdz1mn/@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol",
"filename_relative": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"
}
},
"signature": "_mint(address,uint256)"
}
}
}
}
],
"locations": [
{
"file": "contracts/Staking.sol",
"name": "_deposit",
"type": "function",
"lines": [
381,
382,
383,
384,
385,
386,
387,
388,
389,
390,
391,
392,
393,
394,
395,
396,
397,
398,
399,
400,
401,
402,
403,
404,
405,
406,
407,
408
]
},
{
"file": "contracts/Staking.sol",
"name": "(sharesFromPool,assetsToPool) = _getmpETHFromPool(_shares,address(this))",
"type": "node",
"lines": [
388
]
},
{
"file": "contracts/Staking.sol",
"name": "assert(bool)(LiquidUnstakePool(liquidUnstakePool).swapETHFormpETH{value: assetsToPool}(_receiver) == sharesFromPool)",
"type": "node",
"lines": [
423,
424,
425,
426,
427
]
},
{
"file": "contracts/Staking.sol",
"name": "_mint(address(this),sharesToMint)",
"type": "node",
"lines": [
392
]
},
{
"file": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol",
"name": "_balances[account] += amount",
"type": "node",
"lines": [
264
]
},
{
"file": "contracts/Staking.sol",
"name": "_transfer(address(this),treasury,sharesToTreasury)",
"type": "node",
"lines": [
400
]
},
{
"file": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol",
"name": "_balances[from] = fromBalance - amount",
"type": "node",
"lines": [
236
]
},
{
"file": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol",
"name": "_balances[to] += amount",
"type": "node",
"lines": [
239
]
},
{
"file": "contracts/Staking.sol",
"name": "_transfer(address(this),_receiver,sharesToUser)",
"type": "node",
"lines": [
405
]
},
{
"file": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol",
"name": "_balances[from] = fromBalance - amount",
"type": "node",
"lines": [
236
]
},
{
"file": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol",
"name": "_balances[to] += amount",
"type": "node",
"lines": [
239
]
},
{
"file": "contracts/Staking.sol",
"name": "_mint(address(this),sharesToMint)",
"type": "node",
"lines": [
392
]
},
{
"file": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol",
"name": "_totalSupply += amount",
"type": "node",
"lines": [
261
]
},
{
"file": "contracts/Staking.sol",
"name": "totalUnderlying += assetsToAdd",
"type": "node",
"lines": [
393
]
}
],
"description": "Reentrancy in Staking._deposit(address,address,uint256,uint256) (contracts/Staking.sol#381-408):\n\tExternal calls:\n\t- (sharesFromPool,assetsToPool) = _getmpETHFromPool(_shares,address(this)) (contracts/Staking.sol#388)\n\t\t- assert(bool)(LiquidUnstakePool(liquidUnstakePool).swapETHFormpETH{value: assetsToPool}(_receiver) == sharesFromPool) (contracts/Staking.sol#423-427)\n\tState variables written after the call(s):\n\t- _mint(address(this),sharesToMint) (contracts/Staking.sol#392)\n\t\t- _balances[account] += amount (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#264)\n\tERC20Upgradeable._balances (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#40) can be used in cross function reentrancies:\n\t- ERC20Upgradeable._burn(address,uint256) (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#282-298)\n\t- ERC20Upgradeable._mint(address,uint256) (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#256-269)\n\t- ERC20Upgradeable._transfer(address,address,uint256) (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#227-245)\n\t- ERC20Upgradeable.balanceOf(address) (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#106-108)\n\t- _transfer(address(this),treasury,sharesToTreasury) (contracts/Staking.sol#400)\n\t\t- _balances[from] = fromBalance - amount (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#236)\n\t\t- _balances[to] += amount (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#239)\n\tERC20Upgradeable._balances (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#40) can be used in cross function reentrancies:\n\t- ERC20Upgradeable._burn(address,uint256) (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#282-298)\n\t- ERC20Upgradeable._mint(address,uint256) (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#256-269)\n\t- ERC20Upgradeable._transfer(address,address,uint256) (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#227-245)\n\t- ERC20Upgradeable.balanceOf(address) (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#106-108)\n\t- _transfer(address(this),_receiver,sharesToUser) (contracts/Staking.sol#405)\n\t\t- _balances[from] = fromBalance - amount (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#236)\n\t\t- _balances[to] += amount (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#239)\n\tERC20Upgradeable._balances (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#40) can be used in cross function reentrancies:\n\t- ERC20Upgradeable._burn(address,uint256) (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#282-298)\n\t- ERC20Upgradeable._mint(address,uint256) (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#256-269)\n\t- ERC20Upgradeable._transfer(address,address,uint256) (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#227-245)\n\t- ERC20Upgradeable.balanceOf(address) (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#106-108)\n\t- _mint(address(this),sharesToMint) (contracts/Staking.sol#392)\n\t\t- _totalSupply += amount (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#261)\n\tERC20Upgradeable._totalSupply (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#44) can be used in cross function reentrancies:\n\t- ERC20Upgradeable._burn(address,uint256) (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#282-298)\n\t- ERC20Upgradeable._mint(address,uint256) (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#256-269)\n\t- ERC20Upgradeable.totalSupply() (@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#99-101)\n\t- totalUnderlying += assetsToAdd (contracts/Staking.sol#393)\n\tStaking.totalUnderlying (contracts/Staking.sol#45) can be used in cross function reentrancies:\n\t- Staking._deposit(address,address,uint256,uint256) (contracts/Staking.sol#381-408)\n\t- Staking._withdraw(address,address,address,uint256,uint256) (contracts/Staking.sol#433-448)\n\t- Staking.initialize(address,address,address,IERC20MetadataUpgradeable,address,address,address,address,uint256,uint256) (contracts/Staking.sol#107-144)\n\t- Staking.reportEpochs(Staking.EpochsReport,int256) (contracts/Staking.sol#260-289)\n\t- Staking.totalAssets() (contracts/Staking.sol#155-163)\n\t- Staking.totalUnderlying (contracts/Staking.sol#45)"
}
|
| high | reentrancy | slither | Reentrancy in Staking.pushToBeacon(Staking.Node[],uint256,uint256,bytes32) (contracts/Staking.sol#296-337): | 85 | no | — |
viewevidence_json{
"impact": "High",
"detector": "reentrancy-eth",
"elements": [
{
"name": "pushToBeacon",
"type": "function",
"source_mapping": {
"lines": [
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334,
335,
336,
337
],
"start": 12580,
"length": 1801,
"ending_column": 6,
"is_dependency": false,
"filename_short": "contracts/Staking.sol",
"starting_column": 5,
"filename_absolute": "/tmp/slither-mtmdz1mn/contracts/Staking.sol",
"filename_relative": "contracts/Staking.sol"
},
"type_specific_fields": {
"parent": {
"name": "Staking",
"type": "contract",
"source_mapping": {
"lines": [
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31,
32,
33,
34,
35,
36,
37,
38,
39,
40,
41,
42,
43,
44,
45,
46,
47,
48,
49,
50,
51,
52,
53,
54,
55,
56,
57,
58,
59,
60,
61,
62,
63,
64,
65,
66,
67,
68,
69,
70,
71,
72,
73,
74,
75,
76,
77,
78,
79,
80,
81,
82,
83,
84,
85,
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334,
335,
336,
337,
338,
339,
340,
341,
342,
343,
344,
345,
346,
347,
348,
349,
350,
351,
352,
353,
354,
355,
356,
357,
358,
359,
360,
361,
362,
363,
364,
365,
366,
367,
368,
369,
370,
371,
372,
373,
374,
375,
376,
377,
378,
379,
380,
381,
382,
383,
384,
385,
386,
387,
388,
389,
390,
391,
392,
393,
394,
395,
396,
397,
398,
399,
400,
401,
402,
403,
404,
405,
406,
407,
408,
409,
410,
411,
412,
413,
414,
415,
416,
417,
418,
419,
420,
421,
422,
423,
424,
425,
426,
427,
428,
429,
430,
431,
432,
433,
434,
435,
436,
437,
438,
439,
440,
441,
442,
443,
444,
445,
446,
447,
448,
449
],
"start": 1009,
"length": 17943,
"ending_column": 2,
"is_dependency": false,
"filename_short": "contracts/Staking.sol",
"starting_column": 1,
"filename_absolute": "/tmp/slither-mtmdz1mn/contracts/Staking.sol",
"filename_relative": "contracts/Staking.sol"
}
},
"signature": "pushToBeacon(Staking.Node[],uint256,uint256,bytes32)"
}
},
{
"name": "LiquidUnstakePool(liquidUnstakePool).getEthForValidator(_requestPoolAmount)",
"type": "node",
"source_mapping": {
"lines": [
317
],
"start": 13467,
"length": 75,
"ending_column": 88,
"is_dependency": false,
"filename_short": "contracts/Staking.sol",
"starting_column": 13,
"filename_absolute": "/tmp/slither-mtmdz1mn/contracts/Staking.sol",
"filename_relative": "contracts/Staking.sol"
},
"additional_fields": {
"underlying_type": "external_calls"
},
"type_specific_fields": {
"parent": {
"name": "pushToBeacon",
"type": "function",
"source_mapping": {
"lines": [
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334,
335,
336,
337
],
"start": 12580,
"length": 1801,
"ending_column": 6,
"is_dependency": false,
"filename_short": "contracts/Staking.sol",
"starting_column": 5,
"filename_absolute": "/tmp/slither-mtmdz1mn/contracts/Staking.sol",
"filename_relative": "contracts/Staking.sol"
},
"type_specific_fields": {
"parent": {
"name": "Staking",
"type": "contract",
"source_mapping": {
"lines": [
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31,
32,
33,
34,
35,
36,
37,
38,
39,
40,
41,
42,
43,
44,
45,
46,
47,
48,
49,
50,
51,
52,
53,
54,
55,
56,
57,
58,
59,
60,
61,
62,
63,
64,
65,
66,
67,
68,
69,
70,
71,
72,
73,
74,
75,
76,
77,
78,
79,
80,
81,
82,
83,
84,
85,
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334,
335,
336,
337,
338,
339,
340,
341,
342,
343,
344,
345,
346,
347,
348,
349,
350,
351,
352,
353,
354,
355,
356,
357,
358,
359,
360,
361,
362,
363,
364,
365,
366,
367,
368,
369,
370,
371,
372,
373,
374,
375,
376,
377,
378,
379,
380,
381,
382,
383,
384,
385,
386,
387,
388,
389,
390,
391,
392,
393,
394,
395,
396,
397,
398,
399,
400,
401,
402,
403,
404,
405,
406,
407,
408,
409,
410,
411,
412,
413,
414,
415,
416,
417,
418,
419,
420,
421,
422,
423,
424,
425,
426,
427,
428,
429,
430,
431,
432,
433,
434,
435,
436,
437,
438,
439,
440,
441,
442,
443,
444,
445,
446,
447,
448,
449
],
"start": 1009,
"length": 17943,
"ending_column": 2,
"is_dependency": false,
"filename_short": "contracts/Staking.sol",
"starting_column": 1,
"filename_absolute": "/tmp/slither-mtmdz1mn/contracts/Staking.sol",
"filename_relative": "contracts/Staking.sol"
}
},
"signature": "pushToBeacon(Staking.Node[],uint256,uint256,bytes32)"
}
}
}
},
{
"name": "Withdrawal(withdrawal).getEthForValidator(_requestWithdrawalAmount)",
"type": "node",
"source_mapping": {
"lines": [
319
],
"start": 13598,
"length": 67,
"ending_column": 80,
"is_dependency": false,
"filename_short": "contracts/Staking.sol",
"starting_column": 13,
"filename_absolute": "/tmp/slither-mtmdz1mn/contracts/Staking.sol",
"filename_relative": "contracts/Staking.sol"
},
"additional_fields": {
"underlying_type": "external_calls"
},
"type_specific_fields": {
"parent": {
"name": "pushToBeacon",
"type": "function",
"source_mapping": {
"lines": [
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334,
335,
336,
337
],
"start": 12580,
"length": 1801,
"ending_column": 6,
"is_dependency": false,
"filename_short": "contracts/Staking.sol",
"starting_column": 5,
"filename_absolute": "/tmp/slither-mtmdz1mn/contracts/Staking.sol",
"filename_relative": "contracts/Staking.sol"
},
"type_specific_fields": {
"parent": {
"name": "Staking",
"type": "contract",
"source_mapping": {
"lines": [
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31,
32,
33,
34,
35,
36,
37,
38,
39,
40,
41,
42,
43,
44,
45,
46,
47,
48,
49,
50,
51,
52,
53,
54,
55,
56,
57,
58,
59,
60,
61,
62,
63,
64,
65,
66,
67,
68,
69,
70,
71,
72,
73,
74,
75,
76,
77,
78,
79,
80,
81,
82,
83,
84,
85,
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334,
335,
336,
337,
338,
339,
340,
341,
342,
343,
344,
345,
346,
347,
348,
349,
350,
351,
352,
353,
354,
355,
356,
357,
358,
359,
360,
361,
362,
363,
364,
365,
366,
367,
368,
369,
370,
371,
372,
373,
374,
375,
376,
377,
378,
379,
380,
381,
382,
383,
384,
385,
386,
387,
388,
389,
390,
391,
392,
393,
394,
395,
396,
397,
398,
399,
400,
401,
402,
403,
404,
405,
406,
407,
408,
409,
410,
411,
412,
413,
414,
415,
416,
417,
418,
419,
420,
421,
422,
423,
424,
425,
426,
427,
428,
429,
430,
431,
432,
433,
434,
435,
436,
437,
438,
439,
440,
441,
442,
443,
444,
445,
446,
447,
448,
449
],
"start": 1009,
"length": 17943,
"ending_column": 2,
"is_dependency": false,
"filename_short": "contracts/Staking.sol",
"starting_column": 1,
"filename_absolute": "/tmp/slither-mtmdz1mn/contracts/Staking.sol",
"filename_relative": "contracts/Staking.sol"
}
},
"signature": "pushToBeacon(Staking.Node[],uint256,uint256,bytes32)"
}
}
}
},
{
"name": "depositContract.deposit{value: 32000000000000000000}(_nodes[i].pubkey,_withdrawalCredential,_nodes[i].signature,_nodes[i].depositDataRoot)",
"type": "node",
"source_mapping": {
"lines": [
326,
327,
328,
329,
330,
331
],
"start": 14004,
"length": 207,
"ending_column": 14,
"is_dependency": false,
"filename_short": "contracts/Staking.sol",
"starting_column": 13,
"filename_absolute": "/tmp/slither-mtmdz1mn/contracts/Staking.sol",
"filename_relative": "contracts/Staking.sol"
},
"additional_fields": {
"underlying_type": "external_calls"
},
"type_specific_fields": {
"parent": {
"name": "pushToBeacon",
"type": "function",
"source_mapping": {
"lines": [
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334,
335,
336,
337
],
"start": 12580,
"length": 1801,
"ending_column": 6,
"is_dependency": false,
"filename_short": "contracts/Staking.sol",
"starting_column": 5,
"filename_absolute": "/tmp/slither-mtmdz1mn/contracts/Staking.sol",
"filename_relative": "contracts/Staking.sol"
},
"type_specific_fields": {
"parent": {
"name": "Staking",
"type": "contract",
"source_mapping": {
"lines": [
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31,
32,
33,
34,
35,
36,
37,
38,
39,
40,
41,
42,
43,
44,
45,
46,
47,
48,
49,
50,
51,
52,
53,
54,
55,
56,
57,
58,
59,
60,
61,
62,
63,
64,
65,
66,
67,
68,
69,
70,
71,
72,
73,
74,
75,
76,
77,
78,
79,
80,
81,
82,
83,
84,
85,
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334,
335,
336,
337,
338,
339,
340,
341,
342,
343,
344,
345,
346,
347,
348,
349,
350,
351,
352,
353,
354,
355,
356,
357,
358,
359,
360,
361,
362,
363,
364,
365,
366,
367,
368,
369,
370,
371,
372,
373,
374,
375,
376,
377,
378,
379,
380,
381,
382,
383,
384,
385,
386,
387,
388,
389,
390,
391,
392,
393,
394,
395,
396,
397,
398,
399,
400,
401,
402,
403,
404,
405,
406,
407,
408,
409,
410,
411,
412,
413,
414,
415,
416,
417,
418,
419,
420,
421,
422,
423,
424,
425,
426,
427,
428,
429,
430,
431,
432,
433,
434,
435,
436,
437,
438,
439,
440,
441,
442,
443,
444,
445,
446,
447,
448,
449
],
"start": 1009,
"length": 17943,
"ending_column": 2,
"is_dependency": false,
"filename_short": "contracts/Staking.sol",
"starting_column": 1,
"filename_absolute": "/tmp/slither-mtmdz1mn/contracts/Staking.sol",
"filename_relative": "contracts/Staking.sol"
}
},
"signature": "pushToBeacon(Staking.Node[],uint256,uint256,bytes32)"
}
}
}
},
{
"name": "depositContract.deposit{value: 32000000000000000000}(_nodes[i].pubkey,_withdrawalCredential,_nodes[i].signature,_nodes[i].depositDataRoot)",
"type": "node",
"source_mapping": {
"lines": [
326,
327,
328,
329,
330,
331
],
"start": 14004,
"length": 207,
"ending_column": 14,
"is_dependency": false,
"filename_short": "contracts/Staking.sol",
"starting_column": 13,
"filename_absolute": "/tmp/slither-mtmdz1mn/contracts/Staking.sol",
"filename_relative": "contracts/Staking.sol"
},
"additional_fields": {
"underlying_type": "external_calls_sending_eth"
},
"type_specific_fields": {
"parent": {
"name": "pushToBeacon",
"type": "function",
"source_mapping": {
"lines": [
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334,
335,
336,
337
],
"start": 12580,
"length": 1801,
"ending_column": 6,
"is_dependency": false,
"filename_short": "contracts/Staking.sol",
"starting_column": 5,
"filename_absolute": "/tmp/slither-mtmdz1mn/contracts/Staking.sol",
"filename_relative": "contracts/Staking.sol"
},
"type_specific_fields": {
"parent": {
"name": "Staking",
"type": "contract",
"source_mapping": {
"lines": [
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31,
32,
33,
34,
35,
36,
37,
38,
39,
40,
41,
42,
43,
44,
45,
46,
47,
48,
49,
50,
51,
52,
53,
54,
55,
56,
57,
58,
59,
60,
61,
62,
63,
64,
65,
66,
67,
68,
69,
70,
71,
72,
73,
74,
75,
76,
77,
78,
79,
80,
81,
82,
83,
84,
85,
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334,
335,
336,
337,
338,
339,
340,
341,
342,
343,
344,
345,
346,
347,
348,
349,
350,
351,
352,
353,
354,
355,
356,
357,
358,
359,
360,
361,
362,
363,
364,
365,
366,
367,
368,
369,
370,
371,
372,
373,
374,
375,
376,
377,
378,
379,
380,
381,
382,
383,
384,
385,
386,
387,
388,
389,
390,
391,
392,
393,
394,
395,
396,
397,
398,
399,
400,
401,
402,
403,
404,
405,
406,
407,
408,
409,
410,
411,
412,
413,
414,
415,
416,
417,
418,
419,
420,
421,
422,
423,
424,
425,
426,
427,
428,
429,
430,
431,
432,
433,
434,
435,
436,
437,
438,
439,
440,
441,
442,
443,
444,
445,
446,
447,
448,
449
],
"start": 1009,
"length": 17943,
"ending_column": 2,
"is_dependency": false,
"filename_short": "contracts/Staking.sol",
"starting_column": 1,
"filename_absolute": "/tmp/slither-mtmdz1mn/contracts/Staking.sol",
"filename_relative": "contracts/Staking.sol"
}
},
"signature": "pushToBeacon(Staking.Node[],uint256,uint256,bytes32)"
}
}
}
}
],
"locations": [
{
"file": "contracts/Staking.sol",
"name": "pushToBeacon",
"type": "function",
"lines": [
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334,
335,
336,
337
]
},
{
"file": "contracts/Staking.sol",
"name": "LiquidUnstakePool(liquidUnstakePool).getEthForValidator(_requestPoolAmount)",
"type": "node",
"lines": [
317
]
},
{
"file": "contracts/Staking.sol",
"name": "Withdrawal(withdrawal).getEthForValidator(_requestWithdrawalAmount)",
"type": "node",
"lines": [
319
]
},
{
"file": "contracts/Staking.sol",
"name": "depositContract.deposit{value: 32000000000000000000}(_nodes[i].pubkey,_withdrawalCredential,_nodes[i].signature,_nodes[i].depositDataRoot)",
"type": "node",
"lines": [
326,
327,
328,
329,
330,
331
]
},
{
"file": "contracts/Staking.sol",
"name": "depositContract.deposit{value: 32000000000000000000}(_nodes[i].pubkey,_withdrawalCredential,_nodes[i].signature,_nodes[i].depositDataRoot)",
"type": "node",
"lines": [
326,
327,
328,
329,
330,
331
]
},
{
"file": "contracts/Staking.sol",
"name": "nodePubkeyUsed[_nodes[i].pubkey] = true",
"type": "node",
"lines": [
325
]
},
{
"file": "contracts/Staking.sol",
"name": "totalNodesActivated = _totalNodesActivated",
"type": "node",
"lines": [
336
]
}
],
"description": "Reentrancy in Staking.pushToBeacon(Staking.Node[],uint256,uint256,bytes32) (contracts/Staking.sol#296-337):\n\tExternal calls:\n\t- LiquidUnstakePool(liquidUnstakePool).getEthForValidator(_requestPoolAmount) (contracts/Staking.sol#317)\n\t- Withdrawal(withdrawal).getEthForValidator(_requestWithdrawalAmount) (contracts/Staking.sol#319)\n\t- depositContract.deposit{value: 32000000000000000000}(_nodes[i].pubkey,_withdrawalCredential,_nodes[i].signature,_nodes[i].depositDataRoot) (contracts/Staking.sol#326-331)\n\tExternal calls sending eth:\n\t- depositContract.deposit{value: 32000000000000000000}(_nodes[i].pubkey,_withdrawalCredential,_nodes[i].signature,_nodes[i].depositDataRoot) (contracts/Staking.sol#326-331)\n\tState variables written after the call(s):\n\t- nodePubkeyUsed[_nodes[i].pubkey] = true (contracts/Staking.sol#325)\n\tStaking.nodePubkeyUsed (contracts/Staking.sol#52) can be used in cross function reentrancies:\n\t- Staking.nodePubkeyUsed (contracts/Staking.sol#52)\n\t- Staking.pushToBeacon(Staking.Node[],uint256,uint256,bytes32) (contracts/Staking.sol#296-337)\n\t- totalNodesActivated = _totalNodesActivated (contracts/Staking.sol#336)\n\tStaking.totalNodesActivated (contracts/Staking.sol#47) can be used in cross function reentrancies:\n\t- Staking.pushToBeacon(Staking.Node[],uint256,uint256,bytes32) (contracts/Staking.sol#296-337)\n\t- Staking.totalNodesActivated (contracts/Staking.sol#47)"
}
|