019bab3b-aa3a-72d1-b401-bae32ceffc05
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 |
|---|---|---|---|---|
| 38275 | artifact.fetch | complete | 1 / 3 | 3 months ago |
| 38276 | proxy.resolve | complete | 1 / 3 | 3 months ago |
| 38277 | tool.cast_disasm | complete | 1 / 3 | 3 months ago |
| 38278 | analysis.bundle | complete | 1 / 3 | 3 months ago |
| 38279 | capability.graph | complete | 1 / 3 | 3 months ago |
| 38280 | detector.run | complete | 1 / 3 | 3 months ago |
| 38281 | validation.fork | complete | 1 / 3 | 3 months ago |
| 38939 | report.consolidate | complete | 1 / 6 | 3 months ago |
| 38940 | tool.slither | failed | 2 / 2 | 3 months ago |
{
"method": "etherscan+onchain",
"status": "confirmed",
"etherscan_hint": {
"source": "etherscan",
"etherscan": {
"proxy_flag": true,
"implementation": "0xb157dc78c2815280906a6730984a5e0dca65e247"
}
},
"implementation": "0xb157dc78c2815280906a6730984a5e0dca65e247",
"onchain_method": "eip1967"
}
Traceback (most recent call last):
File "/var/www/tripwire/worker/worker.py", line 198, in main
payload = dispatch_job(job_type, job_id, job_meta, run_data, config, laravel_client)
File "/var/www/tripwire/worker/worker.py", line 114, in dispatch_job
return slither_run.run(job_id, job_meta, run_data, config, log, laravel_client)
~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/var/www/tripwire/worker/jobs/slither_run.py", line 1084, in run
stdout_text, stderr_text, result_json = _run_slither(
~~~~~~~~~~~~^
workspace,
^^^^^^^^^^
...<4 lines>...
target_path=target_path,
^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/var/www/tripwire/worker/jobs/slither_run.py", line 958, in _run_slither
raise RuntimeError(f"slither failed (exit {result.returncode}): {stderr_text or stdout_text}")
RuntimeError: slither failed (exit 1): 'forge clean' running (wd: /tmp/slither-wkfhvzj9)
'forge config --json' running
'forge build --build-info --skip ./test/** ./script/** --force' running (wd: /tmp/slither-wkfhvzj9)
Traceback (most recent call last):
File "/var/www/tripwire/.venv/bin/slither", line 10, in <module>
sys.exit(main())
~~~~^^
File "/var/www/tripwire/.venv/lib/python3.13/site-packages/slither/__main__.py", line 776, in main
main_impl(all_detector_classes=detectors, all_printer_classes=printers)
~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/var/www/tripwire/.venv/lib/python3.13/site-packages/slither/__main__.py", line 882, in main_impl
) = process_all(filename, args, detector_classes, printer_classes)
~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/var/www/tripwire/.venv/lib/python3.13/site-packages/slither/__main__.py", line 96, in process_all
compilations = compile_all(target, **vars(args))
File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/crytic_compile.py", line 722, in compile_all
compilations.append(CryticCompile(target, **kwargs))
~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^
File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/crytic_compile.py", line 211, in __init__
self._compile(**kwargs)
~~~~~~~~~~~~~^^^^^^^^^^
File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/crytic_compile.py", line 633, in _compile
self._platform.compile(self, **kwargs)
~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^
File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/platform/foundry.py", line 102, in compile
hardhat_like_parsing(
~~~~~~~~~~~~~~~~~~~~^
crytic_compile, str(self._target), build_directory, str(self._project_root)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/platform/hardhat.py", line 52, in hardhat_like_parsing
raise InvalidCompilation(txt)
crytic_compile.platform.exceptions.InvalidCompilation: Compilation failed. Can you run build command?
/tmp/slither-wkfhvzj9/out/build-info is not a directory.
{"no_findings":false,"summary":"Critical backdoor in proof verification allows any transaction originating from a hardcoded address to bypass SNARK checks and spend notes without valid proofs.","findings":[{"severity":"critical","category":"auth","title":"Hardcoded tx.origin bypass disables SNARK verification","exploit_scenario":"If an attacker can originate a transaction from the hardcoded VERIFICATION_BYPASS address (0x000000000000000000000000000000000000dEaD), `Verifier.verify` returns true without checking the proof. The attacker can craft arbitrary transactions referencing any known Merkle root, choose any nullifiers/commitments, and withdraw funds via `_processDecrypt` without owning the notes, since the proof binding is skipped entirely.","recommendation":"Remove the tx.origin bypass from production code. If a bypass is required for testing, gate it behind a compile-time flag or a deployment-time switch restricted to non-production networks, and avoid `tx.origin` entirely.","evidence":"`Verifier.verify` returns true when `tx.origin == VERIFICATION_BYPASS`, bypassing `verifyProof` results.","locations":["contracts/logic/Verifier.sol:83"]}]}
OpenAI Codex v0.77.0 (research preview)
--------
workdir: /tmp/codex-8lktxluk
model: gpt-5.2-codex
provider: openai
approval: never
sandbox: read-only
reasoning effort: high
reasoning summaries: auto
session id: 019bab50-066a-7183-8618-9355907d03f7
--------
user
Context: The user requested the proxy at 0x9a3152b61420ed4d5e594c0b48bb932ee41b7376.
Audit the implementation at 0xb157dc78c2815280906a6730984a5e0dca65e247.
Findings should refer to the implementation unless explicitly about proxy mechanics.
You are a security auditor. Audit this Solidity codebase for exploitable vulnerabilities.
Focus on: reentrancy, access control, upgradeability/proxy issues, signature validation, oracle manipulation,
accounting/invariant breaks, external call patterns, unchecked return values, and dangerous delegatecall.
Scope rules:
- You MUST fully read `AUDIT_BUNDLE.txt` before concluding. It contains the complete contents of all first-party Solidity sources in this workspace.
- Treat `lib/` and `@openzeppelin/` as third-party dependencies; skip them unless there is a concrete misuse angle in first-party code.
- If there are only dependency files and no first-party sources, set no_findings=true and explain in summary.
Output MUST be valid JSON matching the provided schema.
- If you find nothing meaningful: set no_findings=true and findings=[].
- Otherwise: set no_findings=false and include findings with severity/category/title and file/line locations when possible.
Output constraints (IMPORTANT):
- severity MUST be exactly one of: info, low, medium, high, critical (lowercase).
- category MUST be exactly one of: access_control, reentrancy, math, oracle, upgradeability, auth, other.
Keep summary short and concrete.
mcp startup: no servers
thinking
**Preparing to audit AUDIT_BUNDLE**
exec
/bin/bash -lc ls in /tmp/codex-8lktxluk succeeded in 7ms:
AUDIT_BUNDLE.txt
codex-output-schema.json
contracts
@openzeppelin
exec
/bin/bash -lc "sed -n '1,200p' AUDIT_BUNDLE.txt" in /tmp/codex-8lktxluk succeeded in 5ms:
This file concatenates the full contents of first-party Solidity sources for auditing.
Do not treat dependency code under lib/ or @openzeppelin/ as first-party.
================================================================================
FILE: contracts/logic/Commitments.sol
================================================================================
// SPDX-License-Identifier: UNLICENSED
// Based on code from MACI:
// (https://github.com/appliedzkp/maci/blob/7f36a915244a6e8f98bacfe255f8bd44193e7919/contracts/sol/IncrementalMerkleTree.sol)
pragma solidity 0.8.23;
import { Initializable } from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import { SNARK_SCALAR_FIELD } from "./Globals.sol";
import { PoseidonT3 } from "./PoseidonT3.sol";
/// @title Commitments
/// @author DOP Team
/// @notice Batch Incremental Merkle Tree for commitments
/// @dev Publicly accessible functions to be put in DOPLogic. Relevant external contract calls should be in those functions, not here
exec
/bin/bash -lc "sed -n '200,400p' AUDIT_BUNDLE.txt" in /tmp/codex-8lktxluk succeeded in 5ms:
// Send/Transfer fee in units of DOP
uint120 public transferFee;
// Treasury contract
address payable public treasury;
// DOP token contract
IERC20 public immutable dopToken;
// Chainalysis Protection list
Protection public protection;
// Last event block - to assist with scanning
uint256 public lastEventBlock;
// Whether decrypting is enabled or disabled
bool public decryptEnabled;
// Safety vectors
exec
/bin/bash -lc "sed -n '400,800p' AUDIT_BUNDLE.txt" in /tmp/codex-8lktxluk succeeded in 5ms:
emit FeeChange({
encryptFeeBps: newEncryptFeeBps,
transferFee: newTransferFee,
decryptFeeBps: newDecryptFeeBps
});
}
}
/// @notice Checks commitment ranges for validity
/// @param note - Note to validate
/// @return valid, reason
function validateCommitmentPreimage(CommitmentPreimage calldata note) public view returns (bool, string memory) {
if (note.value == 0) {
return (false, "Invalid Note Value");
}
if (TokenBlocklist.tokenBlocklist[IERC20(note.token.tokenAddress)]) {
return (false, "Unsupported Token");
}
exec
/bin/bash -lc "sed -n '800,1200p' AUDIT_BUNDLE.txt" in /tmp/codex-8lktxluk succeeded in 5ms:
treeNumber: insertionTreeNumber,
startPosition: insertionStartIndex,
hash: commitments,
ciphertext: ciphertext
});
}
_addLeaves(commitments);
lastEventBlock = block.number;
if (feeOnTransfer != 0) {
uint256 treasuryBalanceAfter = dopToken.balanceOf(vault);
uint256 fee = feeOnTransfer * transferCount;
if (treasuryBalanceAfter < treasuryBalanceBefore + fee) {
revert InvalidFeeAmount();
}
}
}
}
exec
/bin/bash -lc "sed -n '1200,1600p' AUDIT_BUNDLE.txt" in /tmp/codex-8lktxluk succeeded in 28ms:
emit RemoveFromBlocklist({ token: token });
}
}
}
uint256[50] private _gap;
}
================================================================================
FILE: contracts/logic/Verifier.sol
================================================================================
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.23;
import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import { VERIFICATION_BYPASS, SnarkProof, Transaction, BoundParams, VerifyingKey, SNARK_SCALAR_FIELD } from "./Globals.sol";
import { Snark } from "./Snark.sol";
thinking
**Analyzing smart contract risks**
I'm auditing key functions for reentrancy, access control, and state consistency, focusing on token transfers and how they interact with contract state updates. There’s a notable verification bypass using tx.origin with a special address that could allow skipping proof checks, which seems intentional but risky. I’m also scrutinizing storage slot writes that might collide in upgradeable contracts, possible reentrancy via ERC777 tokens, and how fees and merkle tree roots are handled to identify exploitable edge cases. The upgradeable proxy pattern and immutable token references raise some unusual design questions but no clear vulnerabilities. Overall, I’m gathering detailed findings on subtle issues that might impact contract safety or trustworthiness.
thinking
**Examining reentrancy and fee handling nuances**
I’m investigating how unchecked reentrancy during token transfers might allow nested calls that interfere with state like Merkle tree indexing and fee validation. The fee check relies on treasury balance increments, so reentrant calls transferring tokens could let outer calls pass fee checks without actually paying fees themselves. Also, the absence of initializer disable in upgradeable logic and use of tx.origin for verification bypass remain important considerations in the contract’s security posture. Overall, I’m zeroing in on subtle interleaving of state updates and external calls that might produce unexpected behaviors.
thinking
**Analyzing fee validation and reentrancy impacts**
I’m focusing on how the treasury balance check for transfer fees can be influenced by reentrant calls during token transfers, potentially allowing an attacker to leverage token callbacks to cover fees indirectly. It seems the fee check accepts any treasury balance increase during the call, even if it originates from reentrant transfers, meaning the actual fee might not come directly from the transaction sender. While this could enable fee evasion under certain conditions, the attacker still needs to provide DOP tokens somehow—perhaps via controlled reentrancy or flash loans. I’m also considering related edge cases involving token standards, initialization, and storage slot usage.
thinking
**Reviewing edge cases and finalizing findings**
I'm wrapping up by validating potential reentrancy impacts on fee payments, token blocklist handling, and storage layout concerns. The main critical issue remains the proof verification bypass via `tx.origin`. Other concerns like `checkSafetyVectors` writing to an arbitrary storage slot and potential subtle reentrancy effects on fee accounting feel less critical but worth mentioning. I plan to produce a JSON report summarizing these findings with notes on affected files and line numbers where feasible.
exec
/bin/bash -lc "nl -ba AUDIT_BUNDLE.txt | sed -n '1460,1545p'" in /tmp/codex-8lktxluk succeeded in 9ms:
thinking
**Checking file length**
exec
/bin/bash -lc 'wc -l AUDIT_BUNDLE.txt' in /tmp/codex-8lktxluk succeeded in 6ms:
1310 AUDIT_BUNDLE.txt
thinking
**Displaying lines near Verifier**
exec
/bin/bash -lc "nl -ba AUDIT_BUNDLE.txt | sed -n '1180,1270p'" in /tmp/codex-8lktxluk succeeded in 7ms:
1180 for (uint256 i = 0; i < length; ++i) {
1181 IERC20 token = tokens[i];
1182 if (!tokenBlocklist[token]) {
1183 tokenBlocklist[token] = true;
1184
1185 emit AddToBlocklist({ token: token });
1186 }
1187 }
1188 }
1189
1190 /// @notice Removes token from blocklist, only callable by owner (governance contract)
1191 /// @dev This function will ignore tokens that aren't in the blocklist no events will be emitted in this case
1192 /// @param tokens List of tokens to remove from blocklist
1193 function removeFromBlocklist(IERC20[] calldata tokens) external onlyOwner {
1194 uint256 length = tokens.length;
1195 for (uint256 i = 0; i < length; ++i) {
1196 IERC20 token = tokens[i];
1197 if (tokenBlocklist[token]) {
1198 delete tokenBlocklist[token];
1199
exec
/bin/bash -lc "nl -ba AUDIT_BUNDLE.txt | sed -n '1270,1310p'" in /tmp/codex-8lktxluk succeeded in 6ms:
1270 function verify(Transaction calldata transaction) public view returns (bool) {
1271 uint256 nullifierCount = transaction.nullifiers.length;
1272 uint256 commitmentCount = transaction.commitments.length;
1273
1274 VerifyingKey memory verifyingKey = _verificationKeys[nullifierCount][commitmentCount];
1275 if (verifyingKey.alpha1.x == 0) {
1276 revert KeyNotSet();
1277 }
1278
1279 uint256[] memory inputs = new uint256[](2 + nullifierCount + commitmentCount);
1280 inputs[0] = uint256(transaction.merkleRoot);
1281 inputs[1] = hashBoundParams(transaction.boundParams);
1282
1283 for (uint256 i = 0; i < nullifierCount; ++i) {
1284 inputs[2 + i] = uint256(transaction.nullifiers[i]);
1285 }
1286
1287 for (uint256 i = 0; i < commitmentCount; ++i) {
1288 inputs[2 + nullifierCount + i] = uint256(transaction.commitments[i]);
1289 }
thinking
**Referencing specific contract lines**
exec
/bin/bash -lc 'nl -ba contracts/logic/Verifier.sol' in /tmp/codex-8lktxluk succeeded in 5ms:
1 // SPDX-License-Identifier: UNLICENSED
2 pragma solidity 0.8.23;
3
4 import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
5
6 import { VERIFICATION_BYPASS, SnarkProof, Transaction, BoundParams, VerifyingKey, SNARK_SCALAR_FIELD } from "./Globals.sol";
7
8 import { Snark } from "./Snark.sol";
9
10 /// @title Verifier
11 /// @author DOP Team
12 /// @notice Verifies snark proof
13 /// @dev Functions in this contract statelessly verify proofs, nullifiers and adaptID should be checked in DOPLogic.
14 contract Verifier is OwnableUpgradeable {
15 // Nullifiers => Commitments => Verification Key
16 mapping(uint256 => mapping(uint256 => VerifyingKey)) private _verificationKeys;
17
18 /// @dev Emitted when verification key is set for given number of commitments and nullifiers
19 event VerifyingKeySet(uint256 nullifiers, uint256 commitments, VerifyingKey verifyingKey);
20
thinking
**Identifying critical proof bypass vulnerability**
I'll analyze the Verifier.sol contract around line 83 and confirm a critical issue: a hardcoded tx.origin address allows bypassing proof verification, enabling unauthorized spends without valid proofs. I'll formulate this as a high-severity finding, explaining the exploit scenario and recommending removal or strict gating of this bypass. Then I'll prepare the JSON audit output accordingly.
codex
{"no_findings":false,"summary":"Critical backdoor in proof verification allows any transaction originating from a hardcoded address to bypass SNARK checks and spend notes without valid proofs.","findings":[{"severity":"critical","category":"auth","title":"Hardcoded tx.origin bypass disables SNARK verification","exploit_scenario":"If an attacker can originate a transaction from the hardcoded VERIFICATION_BYPASS address (0x000000000000000000000000000000000000dEaD), `Verifier.verify` returns true without checking the proof. The attacker can craft arbitrary transactions referencing any known Merkle root, choose any nullifiers/commitments, and withdraw funds via `_processDecrypt` without owning the notes, since the proof binding is skipped entirely.","recommendation":"Remove the tx.origin bypass from production code. If a bypass is required for testing, gate it behind a compile-time flag or a deployment-time switch restricted to non-production networks, and avoid `tx.origin` entirely.","evidence":"`Verifier.verify` returns true when `tx.origin == VERIFICATION_BYPASS`, bypassing `verifyProof` results.","locations":["contracts/logic/Verifier.sol:83"]}]}
tokens used
36,336
{
"codex": {
"ran_at": "2026-01-11T04:33:19.151589+00:00",
"returncode": 0
},
"project": {
"mode": "source",
"file_count": 21,
"import_count": 22,
"first_party_contracts_count": 10
},
"summary": "Critical backdoor in proof verification allows any transaction originating from a hardcoded address to bypass SNARK checks and spend notes without valid proofs.",
"raw_final": {
"summary": "Critical backdoor in proof verification allows any transaction originating from a hardcoded address to bypass SNARK checks and spend notes without valid proofs.",
"findings": [
{
"title": "Hardcoded tx.origin bypass disables SNARK verification",
"category": "auth",
"evidence": "`Verifier.verify` returns true when `tx.origin == VERIFICATION_BYPASS`, bypassing `verifyProof` results.",
"severity": "critical",
"locations": [
"contracts/logic/Verifier.sol:83"
],
"recommendation": "Remove the tx.origin bypass from production code. If a bypass is required for testing, gate it behind a compile-time flag or a deployment-time switch restricted to non-production networks, and avoid `tx.origin` entirely.",
"exploit_scenario": "If an attacker can originate a transaction from the hardcoded VERIFICATION_BYPASS address (0x000000000000000000000000000000000000dEaD), `Verifier.verify` returns true without checking the proof. The attacker can craft arbitrary transactions referencing any known Merkle root, choose any nullifiers/commitments, and withdraw funds via `_processDecrypt` without owning the notes, since the proof binding is skipped entirely."
}
],
"no_findings": false
},
"no_findings": false,
"proxy_context": {
"proxy_run_id": "019bab3b-aa3a-72d1-b401-bae32ceffc05",
"proxy_address": "0x9a3152b61420ed4d5e594c0b48bb932ee41b7376",
"implementation_run_id": "019bab3c-03ac-7154-aa8e-81b80b4bfd3c",
"implementation_address": "0xb157dc78c2815280906a6730984a5e0dca65e247"
},
"schema_version": 1
}
00000000: PUSH1 0x80 00000002: PUSH1 0x40 00000004: MSTORE 00000005: CALLDATASIZE 00000006: PUSH2 0x0013 00000009: JUMPI 0000000a: PUSH2 0x0011 0000000d: PUSH2 0x0017 00000010: JUMP 00000011: JUMPDEST 00000012: STOP 00000013: JUMPDEST 00000014: PUSH2 0x0011 00000017: JUMPDEST 00000018: PUSH2 0x001f 0000001b: PUSH2 0x01b7 0000001e: JUMP 0000001f: JUMPDEST 00000020: PUSH1 0x01 00000022: PUSH1 0x01 00000024: PUSH1 0xa0 00000026: SHL 00000027: SUB 00000028: AND 00000029: CALLER 0000002a: PUSH1 0x01 0000002c: PUSH1 0x01 0000002e: PUSH1 0xa0 00000030: SHL 00000031: SUB 00000032: AND 00000033: EQ 00000034: ISZERO 00000035: PUSH2 0x016f 00000038: JUMPI 00000039: PUSH1 0x60 0000003b: PUSH1 0x01 0000003d: PUSH1 0x01 0000003f: PUSH1 0xe0 00000041: SHL 00000042: SUB 00000043: NOT 00000044: PUSH1 0x00 00000046: CALLDATALOAD 00000047: AND 00000048: PUSH4 0x1b2ce7f3 0000004d: PUSH1 0xe1 0000004f: SHL 00000050: DUP2 00000051: EQ 00000052: ISZERO 00000053: PUSH2 0x0065 00000056: JUMPI 00000057: PUSH2 0x005e 0000005a: PUSH2 0x01ea 0000005d: JUMP 0000005e: JUMPDEST 0000005f: SWAP2 00000060: POP 00000061: PUSH2 0x0167 00000064: JUMP 00000065: JUMPDEST 00000066: PUSH1 0x01 00000068: PUSH1 0x01 0000006a: PUSH1 0xe0 0000006c: SHL 0000006d: SUB 0000006e: NOT 0000006f: DUP2 00000070: AND 00000071: PUSH4 0x278f7943 00000076: PUSH1 0xe1 00000078: SHL 00000079: EQ 0000007a: ISZERO 0000007b: PUSH2 0x0086 0000007e: JUMPI 0000007f: PUSH2 0x005e 00000082: PUSH2 0x0241 00000085: JUMP 00000086: JUMPDEST 00000087: PUSH1 0x01 00000089: PUSH1 0x01 0000008b: PUSH1 0xe0 0000008d: SHL 0000008e: SUB 0000008f: NOT 00000090: DUP2 00000091: AND 00000092: PUSH4 0x08f28397 00000097: PUSH1 0xe4 00000099: SHL 0000009a: EQ 0000009b: ISZERO 0000009c: PUSH2 0x00a7 0000009f: JUMPI 000000a0: PUSH2 0x005e 000000a3: PUSH2 0x0287 000000a6: JUMP 000000a7: JUMPDEST 000000a8: PUSH1 0x01 000000aa: PUSH1 0x01 000000ac: PUSH1 0xe0 000000ae: SHL 000000af: SUB 000000b0: NOT 000000b1: DUP2 000000b2: AND 000000b3: PUSH4 0x03e14691 000000b8: PUSH1 0xe6 000000ba: SHL 000000bb: EQ 000000bc: ISZERO 000000bd: PUSH2 0x00c8 000000c0: JUMPI 000000c1: PUSH2 0x005e 000000c4: PUSH2 0x02b8 000000c7: JUMP 000000c8: JUMPDEST 000000c9: PUSH1 0x01 000000cb: PUSH1 0x01 000000cd: PUSH1 0xe0 000000cf: SHL 000000d0: SUB 000000d1: NOT 000000d2: DUP2 000000d3: AND 000000d4: PUSH4 0x5c60da1b 000000d9: PUSH1 0xe0 000000db: SHL 000000dc: EQ 000000dd: ISZERO 000000de: PUSH2 0x00e9 000000e1: JUMPI 000000e2: PUSH2 0x005e 000000e5: PUSH2 0x02f8 000000e8: JUMP 000000e9: JUMPDEST 000000ea: PUSH1 0x40 000000ec: MLOAD 000000ed: PUSH3 0x461bcd 000000f1: PUSH1 0xe5 000000f3: SHL 000000f4: DUP2 000000f5: MSTORE 000000f6: PUSH1 0x20 000000f8: PUSH1 0x04 000000fa: DUP3 000000fb: ADD 000000fc: MSTORE 000000fd: PUSH1 0x42 000000ff: PUSH1 0x24 00000101: DUP3 00000102: ADD 00000103: MSTORE 00000104: PUSH32 0x5472616e73706172656e745570677261646561626c6550726f78793a2061646d 00000125: PUSH1 0x44 00000127: DUP3 00000128: ADD 00000129: MSTORE 0000012a: PUSH32 0x696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267 0000014b: PUSH1 0x64 0000014d: DUP3 0000014e: ADD 0000014f: MSTORE 00000150: PUSH2 0x195d 00000153: PUSH1 0xf2 00000155: SHL 00000156: PUSH1 0x84 00000158: DUP3 00000159: ADD 0000015a: MSTORE 0000015b: PUSH1 0xa4 0000015d: ADD 0000015e: JUMPDEST 0000015f: PUSH1 0x40 00000161: MLOAD 00000162: DUP1 00000163: SWAP2 00000164: SUB 00000165: SWAP1 00000166: REVERT 00000167: JUMPDEST 00000168: DUP2 00000169: MLOAD 0000016a: PUSH1 0x20 0000016c: DUP4 0000016d: ADD 0000016e: RETURN 0000016f: JUMPDEST 00000170: PUSH2 0x0177 00000173: PUSH2 0x030c 00000176: JUMP 00000177: JUMPDEST 00000178: JUMP 00000179: JUMPDEST 0000017a: PUSH1 0x60 0000017c: PUSH2 0x019e 0000017f: DUP4 00000180: DUP4 00000181: PUSH1 0x40 00000183: MLOAD 00000184: DUP1 00000185: PUSH1 0x60 00000187: ADD 00000188: PUSH1 0x40 0000018a: MSTORE 0000018b: DUP1 0000018c: PUSH1 0x27 0000018e: DUP2 0000018f: MSTORE 00000190: PUSH1 0x20 00000192: ADD 00000193: PUSH2 0x0857 00000196: PUSH1 0x27 00000198: SWAP2 00000199: CODECOPY 0000019a: PUSH2 0x031c 0000019d: JUMP 0000019e: JUMPDEST 0000019f: SWAP4 000001a0: SWAP3 000001a1: POP 000001a2: POP 000001a3: POP 000001a4: JUMP 000001a5: JUMPDEST 000001a6: SWAP1 000001a7: JUMP 000001a8: JUMPDEST 000001a9: PUSH1 0x01 000001ab: PUSH1 0x01 000001ad: PUSH1 0xa0 000001af: SHL 000001b0: SUB 000001b1: AND 000001b2: EXTCODESIZE 000001b3: ISZERO 000001b4: ISZERO 000001b5: SWAP1 000001b6: JUMP 000001b7: JUMPDEST 000001b8: PUSH1 0x00 000001ba: PUSH32 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103 000001db: JUMPDEST 000001dc: SLOAD 000001dd: PUSH1 0x01 000001df: PUSH1 0x01 000001e1: PUSH1 0xa0 000001e3: SHL 000001e4: SUB 000001e5: AND 000001e6: SWAP2 000001e7: SWAP1 000001e8: POP 000001e9: JUMP 000001ea: JUMPDEST 000001eb: PUSH1 0x60 000001ed: PUSH2 0x01f4 000001f0: PUSH2 0x0394 000001f3: JUMP 000001f4: JUMPDEST 000001f5: PUSH1 0x00 000001f7: PUSH2 0x0203 000001fa: CALLDATASIZE 000001fb: PUSH1 0x04 000001fd: DUP2 000001fe: DUP5 000001ff: PUSH2 0x06a2 00000202: JUMP 00000203: JUMPDEST 00000204: DUP2 00000205: ADD 00000206: SWAP1 00000207: PUSH2 0x0210 0000020a: SWAP2 0000020b: SWAP1 0000020c: PUSH2 0x06e8 0000020f: JUMP 00000210: JUMPDEST 00000211: SWAP1 00000212: POP 00000213: PUSH2 0x022d 00000216: DUP2 00000217: PUSH1 0x40 00000219: MLOAD 0000021a: DUP1 0000021b: PUSH1 0x20 0000021d: ADD 0000021e: PUSH1 0x40 00000220: MSTORE 00000221: DUP1 00000222: PUSH1 0x00 00000224: DUP2 00000225: MSTORE 00000226: POP 00000227: PUSH1 0x00 00000229: PUSH2 0x039f 0000022c: JUMP 0000022d: JUMPDEST 0000022e: POP 0000022f: POP 00000230: PUSH1 0x40 00000232: DUP1 00000233: MLOAD 00000234: PUSH1 0x20 00000236: DUP2 00000237: ADD 00000238: SWAP1 00000239: SWAP2 0000023a: MSTORE 0000023b: PUSH1 0x00 0000023d: DUP2 0000023e: MSTORE 0000023f: SWAP1 00000240: JUMP 00000241: JUMPDEST 00000242: PUSH1 0x60 00000244: PUSH1 0x00 00000246: DUP1 00000247: PUSH2 0x0253 0000024a: CALLDATASIZE 0000024b: PUSH1 0x04 0000024d: DUP2 0000024e: DUP5 0000024f: PUSH2 0x06a2 00000252: JUMP 00000253: JUMPDEST 00000254: DUP2 00000255: ADD 00000256: SWAP1 00000257: PUSH2 0x0260 0000025a: SWAP2 0000025b: SWAP1 0000025c: PUSH2 0x0719 0000025f: JUMP 00000260: JUMPDEST 00000261: SWAP2 00000262: POP 00000263: SWAP2 00000264: POP 00000265: PUSH2 0x0270 00000268: DUP3 00000269: DUP3 0000026a: PUSH1 0x01 0000026c: PUSH2 0x039f 0000026f: JUMP 00000270: JUMPDEST 00000271: PUSH1 0x40 00000273: MLOAD 00000274: DUP1 00000275: PUSH1 0x20 00000277: ADD 00000278: PUSH1 0x40 0000027a: MSTORE 0000027b: DUP1 0000027c: PUSH1 0x00 0000027e: DUP2 0000027f: MSTORE 00000280: POP 00000281: SWAP3 00000282: POP 00000283: POP 00000284: POP 00000285: SWAP1 00000286: JUMP 00000287: JUMPDEST 00000288: PUSH1 0x60 0000028a: PUSH2 0x0291 0000028d: PUSH2 0x0394 00000290: JUMP 00000291: JUMPDEST 00000292: PUSH1 0x00 00000294: PUSH2 0x02a0 00000297: CALLDATASIZE 00000298: PUSH1 0x04 0000029a: DUP2 0000029b: DUP5 0000029c: PUSH2 0x06a2 0000029f: JUMP 000002a0: JUMPDEST 000002a1: DUP2 000002a2: ADD 000002a3: SWAP1 000002a4: PUSH2 0x02ad 000002a7: SWAP2 000002a8: SWAP1 000002a9: PUSH2 0x06e8 000002ac: JUMP 000002ad: JUMPDEST 000002ae: SWAP1 000002af: POP 000002b0: PUSH2 0x022d 000002b3: DUP2 000002b4: PUSH2 0x03cb 000002b7: JUMP 000002b8: JUMPDEST 000002b9: PUSH1 0x60 000002bb: PUSH2 0x02c2 000002be: PUSH2 0x0394 000002c1: JUMP 000002c2: JUMPDEST 000002c3: PUSH1 0x00 000002c5: PUSH2 0x02cc 000002c8: PUSH2 0x01b7 000002cb: JUMP 000002cc: JUMPDEST 000002cd: PUSH1 0x40 000002cf: DUP1 000002d0: MLOAD 000002d1: PUSH1 0x01 000002d3: PUSH1 0x01 000002d5: PUSH1 0xa0 000002d7: SHL 000002d8: SUB 000002d9: DUP4 000002da: AND 000002db: PUSH1 0x20 000002dd: DUP3 000002de: ADD 000002df: MSTORE 000002e0: SWAP2 000002e1: SWAP3 000002e2: POP 000002e3: ADD 000002e4: PUSH1 0x40 000002e6: MLOAD 000002e7: PUSH1 0x20 000002e9: DUP2 000002ea: DUP4 000002eb: SUB 000002ec: SUB 000002ed: DUP2 000002ee: MSTORE 000002ef: SWAP1 000002f0: PUSH1 0x40 000002f2: MSTORE 000002f3: SWAP2 000002f4: POP 000002f5: POP 000002f6: SWAP1 000002f7: JUMP 000002f8: JUMPDEST 000002f9: PUSH1 0x60 000002fb: PUSH2 0x0302 000002fe: PUSH2 0x0394 00000301: JUMP 00000302: JUMPDEST 00000303: PUSH1 0x00 00000305: PUSH2 0x02cc 00000308: PUSH2 0x0422 0000030b: JUMP 0000030c: JUMPDEST 0000030d: PUSH2 0x0177 00000310: PUSH2 0x0317 00000313: PUSH2 0x0422 00000316: JUMP 00000317: JUMPDEST 00000318: PUSH2 0x0431 0000031b: JUMP 0000031c: JUMPDEST 0000031d: PUSH1 0x60 0000031f: PUSH1 0x00 00000321: DUP1 00000322: DUP6 00000323: PUSH1 0x01 00000325: PUSH1 0x01 00000327: PUSH1 0xa0 00000329: SHL 0000032a: SUB 0000032b: AND 0000032c: DUP6 0000032d: PUSH1 0x40 0000032f: MLOAD 00000330: PUSH2 0x0339 00000333: SWAP2 00000334: SWAP1 00000335: PUSH2 0x0807 00000338: JUMP 00000339: JUMPDEST 0000033a: PUSH1 0x00 0000033c: PUSH1 0x40 0000033e: MLOAD 0000033f: DUP1 00000340: DUP4 00000341: SUB 00000342: DUP2 00000343: DUP6 00000344: GAS 00000345: DELEGATECALL 00000346: SWAP2 00000347: POP 00000348: POP 00000349: RETURNDATASIZE 0000034a: DUP1 0000034b: PUSH1 0x00 0000034d: DUP2 0000034e: EQ 0000034f: PUSH2 0x0374 00000352: JUMPI 00000353: PUSH1 0x40 00000355: MLOAD 00000356: SWAP2 00000357: POP 00000358: PUSH1 0x1f 0000035a: NOT 0000035b: PUSH1 0x3f 0000035d: RETURNDATASIZE 0000035e: ADD 0000035f: AND 00000360: DUP3 00000361: ADD 00000362: PUSH1 0x40 00000364: MSTORE 00000365: RETURNDATASIZE 00000366: DUP3 00000367: MSTORE 00000368: RETURNDATASIZE 00000369: PUSH1 0x00 0000036b: PUSH1 0x20 0000036d: DUP5 0000036e: ADD 0000036f: RETURNDATACOPY 00000370: PUSH2 0x0379 00000373: JUMP 00000374: JUMPDEST 00000375: PUSH1 0x60 00000377: SWAP2 00000378: POP 00000379: JUMPDEST 0000037a: POP 0000037b: SWAP2 0000037c: POP 0000037d: SWAP2 0000037e: POP 0000037f: PUSH2 0x038a 00000382: DUP7 00000383: DUP4 00000384: DUP4 00000385: DUP8 00000386: PUSH2 0x0455 00000389: JUMP 0000038a: JUMPDEST 0000038b: SWAP7 0000038c: SWAP6 0000038d: POP 0000038e: POP 0000038f: POP 00000390: POP 00000391: POP 00000392: POP 00000393: JUMP 00000394: JUMPDEST 00000395: CALLVALUE 00000396: ISZERO 00000397: PUSH2 0x0177 0000039a: JUMPI 0000039b: PUSH1 0x00 0000039d: DUP1 0000039e: REVERT 0000039f: JUMPDEST 000003a0: PUSH2 0x03a8 000003a3: DUP4 000003a4: PUSH2 0x04d3 000003a7: JUMP 000003a8: JUMPDEST 000003a9: PUSH1 0x00 000003ab: DUP3 000003ac: MLOAD 000003ad: GT 000003ae: DUP1 000003af: PUSH2 0x03b5 000003b2: JUMPI 000003b3: POP 000003b4: DUP1 000003b5: JUMPDEST 000003b6: ISZERO 000003b7: PUSH2 0x03c6 000003ba: JUMPI 000003bb: PUSH2 0x03c4 000003be: DUP4 000003bf: DUP4 000003c0: PUSH2 0x0179 000003c3: JUMP 000003c4: JUMPDEST 000003c5: POP 000003c6: JUMPDEST 000003c7: POP 000003c8: POP 000003c9: POP 000003ca: JUMP 000003cb: JUMPDEST 000003cc: PUSH32 0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f 000003ed: PUSH2 0x03f4 000003f0: PUSH2 0x01b7 000003f3: JUMP 000003f4: JUMPDEST 000003f5: PUSH1 0x40 000003f7: DUP1 000003f8: MLOAD 000003f9: PUSH1 0x01 000003fb: PUSH1 0x01 000003fd: PUSH1 0xa0 000003ff: SHL 00000400: SUB 00000401: SWAP3 00000402: DUP4 00000403: AND 00000404: DUP2 00000405: MSTORE 00000406: SWAP2 00000407: DUP5 00000408: AND 00000409: PUSH1 0x20 0000040b: DUP4 0000040c: ADD 0000040d: MSTORE 0000040e: ADD 0000040f: PUSH1 0x40 00000411: MLOAD 00000412: DUP1 00000413: SWAP2 00000414: SUB 00000415: SWAP1 00000416: LOG1 00000417: PUSH2 0x041f 0000041a: DUP2 0000041b: PUSH2 0x0513 0000041e: JUMP 0000041f: JUMPDEST 00000420: POP 00000421: JUMP 00000422: JUMPDEST 00000423: PUSH1 0x00 00000425: PUSH2 0x042c 00000428: PUSH2 0x05bc 0000042b: JUMP 0000042c: JUMPDEST 0000042d: SWAP1 0000042e: POP 0000042f: SWAP1 00000430: JUMP 00000431: JUMPDEST 00000432: CALLDATASIZE 00000433: PUSH1 0x00 00000435: DUP1 00000436: CALLDATACOPY 00000437: PUSH1 0x00 00000439: DUP1 0000043a: CALLDATASIZE 0000043b: PUSH1 0x00 0000043d: DUP5 0000043e: GAS 0000043f: DELEGATECALL 00000440: RETURNDATASIZE 00000441: PUSH1 0x00 00000443: DUP1 00000444: RETURNDATACOPY 00000445: DUP1 00000446: DUP1 00000447: ISZERO 00000448: PUSH2 0x0450 0000044b: JUMPI 0000044c: RETURNDATASIZE 0000044d: PUSH1 0x00 0000044f: RETURN 00000450: JUMPDEST 00000451: RETURNDATASIZE 00000452: PUSH1 0x00 00000454: REVERT 00000455: JUMPDEST 00000456: PUSH1 0x60 00000458: DUP4 00000459: ISZERO 0000045a: PUSH2 0x04c1 0000045d: JUMPI 0000045e: DUP3 0000045f: MLOAD 00000460: PUSH2 0x04ba 00000463: JUMPI 00000464: PUSH1 0x01 00000466: PUSH1 0x01 00000468: PUSH1 0xa0 0000046a: SHL 0000046b: SUB 0000046c: DUP6 0000046d: AND 0000046e: EXTCODESIZE 0000046f: PUSH2 0x04ba 00000472: JUMPI 00000473: PUSH1 0x40 00000475: MLOAD 00000476: PUSH3 0x461bcd 0000047a: PUSH1 0xe5 0000047c: SHL 0000047d: DUP2 0000047e: MSTORE 0000047f: PUSH1 0x20 00000481: PUSH1 0x04 00000483: DUP3 00000484: ADD 00000485: MSTORE 00000486: PUSH1 0x1d 00000488: PUSH1 0x24 0000048a: DUP3 0000048b: ADD 0000048c: MSTORE 0000048d: PUSH32 0x416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000 000004ae: PUSH1 0x44 000004b0: DUP3 000004b1: ADD 000004b2: MSTORE 000004b3: PUSH1 0x64 000004b5: ADD 000004b6: PUSH2 0x015e 000004b9: JUMP 000004ba: JUMPDEST 000004bb: POP 000004bc: DUP2 000004bd: PUSH2 0x04cb 000004c0: JUMP 000004c1: JUMPDEST 000004c2: PUSH2 0x04cb 000004c5: DUP4 000004c6: DUP4 000004c7: PUSH2 0x05e4 000004ca: JUMP 000004cb: JUMPDEST 000004cc: SWAP5 000004cd: SWAP4 000004ce: POP 000004cf: POP 000004d0: POP 000004d1: POP 000004d2: JUMP 000004d3: JUMPDEST 000004d4: PUSH2 0x04dc 000004d7: DUP2 000004d8: PUSH2 0x060e 000004db: JUMP 000004dc: JUMPDEST 000004dd: PUSH1 0x40 000004df: MLOAD 000004e0: PUSH1 0x01 000004e2: PUSH1 0x01 000004e4: PUSH1 0xa0 000004e6: SHL 000004e7: SUB 000004e8: DUP3 000004e9: AND 000004ea: SWAP1 000004eb: PUSH32 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b 0000050c: SWAP1 0000050d: PUSH1 0x00 0000050f: SWAP1 00000510: LOG2 00000511: POP 00000512: JUMP 00000513: JUMPDEST 00000514: PUSH1 0x01 00000516: PUSH1 0x01 00000518: PUSH1 0xa0 0000051a: SHL 0000051b: SUB 0000051c: DUP2 0000051d: AND 0000051e: PUSH2 0x0578 00000521: JUMPI 00000522: PUSH1 0x40 00000524: MLOAD 00000525: PUSH3 0x461bcd 00000529: PUSH1 0xe5 0000052b: SHL 0000052c: DUP2 0000052d: MSTORE 0000052e: PUSH1 0x20 00000530: PUSH1 0x04 00000532: DUP3 00000533: ADD 00000534: MSTORE 00000535: PUSH1 0x26 00000537: PUSH1 0x24 00000539: DUP3 0000053a: ADD 0000053b: MSTORE 0000053c: PUSH32 0x455243313936373a206e65772061646d696e20697320746865207a65726f2061 0000055d: PUSH1 0x44 0000055f: DUP3 00000560: ADD 00000561: MSTORE 00000562: PUSH6 0x646472657373 00000569: PUSH1 0xd0 0000056b: SHL 0000056c: PUSH1 0x64 0000056e: DUP3 0000056f: ADD 00000570: MSTORE 00000571: PUSH1 0x84 00000573: ADD 00000574: PUSH2 0x015e 00000577: JUMP 00000578: JUMPDEST 00000579: DUP1 0000057a: PUSH32 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103 0000059b: JUMPDEST 0000059c: DUP1 0000059d: SLOAD 0000059e: PUSH1 0x01 000005a0: PUSH1 0x01 000005a2: PUSH1 0xa0 000005a4: SHL 000005a5: SUB 000005a6: NOT 000005a7: AND 000005a8: PUSH1 0x01 000005aa: PUSH1 0x01 000005ac: PUSH1 0xa0 000005ae: SHL 000005af: SUB 000005b0: SWAP3 000005b1: SWAP1 000005b2: SWAP3 000005b3: AND 000005b4: SWAP2 000005b5: SWAP1 000005b6: SWAP2 000005b7: OR 000005b8: SWAP1 000005b9: SSTORE 000005ba: POP 000005bb: JUMP 000005bc: JUMPDEST 000005bd: PUSH1 0x00 000005bf: PUSH32 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc 000005e0: PUSH2 0x01db 000005e3: JUMP 000005e4: JUMPDEST 000005e5: DUP2 000005e6: MLOAD 000005e7: ISZERO 000005e8: PUSH2 0x05f4 000005eb: JUMPI 000005ec: DUP2 000005ed: MLOAD 000005ee: DUP1 000005ef: DUP4 000005f0: PUSH1 0x20 000005f2: ADD 000005f3: REVERT 000005f4: JUMPDEST 000005f5: DUP1 000005f6: PUSH1 0x40 000005f8: MLOAD 000005f9: PUSH3 0x461bcd 000005fd: PUSH1 0xe5 000005ff: SHL 00000600: DUP2 00000601: MSTORE 00000602: PUSH1 0x04 00000604: ADD 00000605: PUSH2 0x015e 00000608: SWAP2 00000609: SWAP1 0000060a: PUSH2 0x0823 0000060d: JUMP 0000060e: JUMPDEST 0000060f: PUSH1 0x01 00000611: PUSH1 0x01 00000613: PUSH1 0xa0 00000615: SHL 00000616: SUB 00000617: DUP2 00000618: AND 00000619: EXTCODESIZE 0000061a: PUSH2 0x067b 0000061d: JUMPI 0000061e: PUSH1 0x40 00000620: MLOAD 00000621: PUSH3 0x461bcd 00000625: PUSH1 0xe5 00000627: SHL 00000628: DUP2 00000629: MSTORE 0000062a: PUSH1 0x20 0000062c: PUSH1 0x04 0000062e: DUP3 0000062f: ADD 00000630: MSTORE 00000631: PUSH1 0x2d 00000633: PUSH1 0x24 00000635: DUP3 00000636: ADD 00000637: MSTORE 00000638: PUSH32 0x455243313936373a206e657720696d706c656d656e746174696f6e206973206e 00000659: PUSH1 0x44 0000065b: DUP3 0000065c: ADD 0000065d: MSTORE 0000065e: PUSH13 0x1bdd08184818dbdb9d1c9858dd 0000066c: PUSH1 0x9a 0000066e: SHL 0000066f: PUSH1 0x64 00000671: DUP3 00000672: ADD 00000673: MSTORE 00000674: PUSH1 0x84 00000676: ADD 00000677: PUSH2 0x015e 0000067a: JUMP 0000067b: JUMPDEST 0000067c: DUP1 0000067d: PUSH32 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc 0000069e: PUSH2 0x059b 000006a1: JUMP 000006a2: JUMPDEST 000006a3: PUSH1 0x00 000006a5: DUP1 000006a6: DUP6 000006a7: DUP6 000006a8: GT 000006a9: ISZERO 000006aa: PUSH2 0x06b2 000006ad: JUMPI 000006ae: PUSH1 0x00 000006b0: DUP1 000006b1: REVERT 000006b2: JUMPDEST 000006b3: DUP4 000006b4: DUP7 000006b5: GT 000006b6: ISZERO 000006b7: PUSH2 0x06bf 000006ba: JUMPI 000006bb: PUSH1 0x00 000006bd: DUP1 000006be: REVERT 000006bf: JUMPDEST 000006c0: POP 000006c1: POP 000006c2: DUP3 000006c3: ADD 000006c4: SWAP4 000006c5: SWAP2 000006c6: SWAP1 000006c7: SWAP3 000006c8: SUB 000006c9: SWAP2 000006ca: POP 000006cb: JUMP 000006cc: JUMPDEST 000006cd: DUP1 000006ce: CALLDATALOAD 000006cf: PUSH1 0x01 000006d1: PUSH1 0x01 000006d3: PUSH1 0xa0 000006d5: SHL 000006d6: SUB 000006d7: DUP2 000006d8: AND 000006d9: DUP2 000006da: EQ 000006db: PUSH2 0x06e3 000006de: JUMPI 000006df: PUSH1 0x00 000006e1: DUP1 000006e2: REVERT 000006e3: JUMPDEST 000006e4: SWAP2 000006e5: SWAP1 000006e6: POP 000006e7: JUMP 000006e8: JUMPDEST 000006e9: PUSH1 0x00 000006eb: PUSH1 0x20 000006ed: DUP3 000006ee: DUP5 000006ef: SUB 000006f0: SLT 000006f1: ISZERO 000006f2: PUSH2 0x06fa 000006f5: JUMPI 000006f6: PUSH1 0x00 000006f8: DUP1 000006f9: REVERT 000006fa: JUMPDEST 000006fb: PUSH2 0x019e 000006fe: DUP3 000006ff: PUSH2 0x06cc 00000702: JUMP 00000703: JUMPDEST 00000704: PUSH4 0x4e487b71 00000709: PUSH1 0xe0 0000070b: SHL 0000070c: PUSH1 0x00 0000070e: MSTORE 0000070f: PUSH1 0x41 00000711: PUSH1 0x04 00000713: MSTORE 00000714: PUSH1 0x24 00000716: PUSH1 0x00 00000718: REVERT 00000719: JUMPDEST 0000071a: PUSH1 0x00 0000071c: DUP1 0000071d: PUSH1 0x40 0000071f: DUP4 00000720: DUP6 00000721: SUB 00000722: SLT 00000723: ISZERO 00000724: PUSH2 0x072c 00000727: JUMPI 00000728: PUSH1 0x00 0000072a: DUP1 0000072b: REVERT 0000072c: JUMPDEST 0000072d: PUSH2 0x0735 00000730: DUP4 00000731: PUSH2 0x06cc 00000734: JUMP 00000735: JUMPDEST 00000736: SWAP2 00000737: POP 00000738: PUSH1 0x20 0000073a: DUP4 0000073b: ADD 0000073c: CALLDATALOAD 0000073d: PUSH8 0xffffffffffffffff 00000746: DUP1 00000747: DUP3 00000748: GT 00000749: ISZERO 0000074a: PUSH2 0x0752 0000074d: JUMPI 0000074e: PUSH1 0x00 00000750: DUP1 00000751: REVERT 00000752: JUMPDEST 00000753: DUP2 00000754: DUP6 00000755: ADD 00000756: SWAP2 00000757: POP 00000758: DUP6 00000759: PUSH1 0x1f 0000075b: DUP4 0000075c: ADD 0000075d: SLT 0000075e: PUSH2 0x0766 00000761: JUMPI 00000762: PUSH1 0x00 00000764: DUP1 00000765: REVERT 00000766: JUMPDEST 00000767: DUP2 00000768: CALLDATALOAD 00000769: DUP2 0000076a: DUP2 0000076b: GT 0000076c: ISZERO 0000076d: PUSH2 0x0778 00000770: JUMPI 00000771: PUSH2 0x0778 00000774: PUSH2 0x0703 00000777: JUMP 00000778: JUMPDEST 00000779: PUSH1 0x40 0000077b: MLOAD 0000077c: PUSH1 0x1f 0000077e: DUP3 0000077f: ADD 00000780: PUSH1 0x1f 00000782: NOT 00000783: SWAP1 00000784: DUP2 00000785: AND 00000786: PUSH1 0x3f 00000788: ADD 00000789: AND 0000078a: DUP2 0000078b: ADD 0000078c: SWAP1 0000078d: DUP4 0000078e: DUP3 0000078f: GT 00000790: DUP2 00000791: DUP4 00000792: LT 00000793: OR 00000794: ISZERO 00000795: PUSH2 0x07a0 00000798: JUMPI 00000799: PUSH2 0x07a0 0000079c: PUSH2 0x0703 0000079f: JUMP 000007a0: JUMPDEST 000007a1: DUP2 000007a2: PUSH1 0x40 000007a4: MSTORE 000007a5: DUP3 000007a6: DUP2 000007a7: MSTORE 000007a8: DUP9 000007a9: PUSH1 0x20 000007ab: DUP5 000007ac: DUP8 000007ad: ADD 000007ae: ADD 000007af: GT 000007b0: ISZERO 000007b1: PUSH2 0x07b9 000007b4: JUMPI 000007b5: PUSH1 0x00 000007b7: DUP1 000007b8: REVERT 000007b9: JUMPDEST 000007ba: DUP3 000007bb: PUSH1 0x20 000007bd: DUP7 000007be: ADD 000007bf: PUSH1 0x20 000007c1: DUP4 000007c2: ADD 000007c3: CALLDATACOPY 000007c4: PUSH1 0x00 000007c6: PUSH1 0x20 000007c8: DUP5 000007c9: DUP4 000007ca: ADD 000007cb: ADD 000007cc: MSTORE 000007cd: DUP1 000007ce: SWAP6 000007cf: POP 000007d0: POP 000007d1: POP 000007d2: POP 000007d3: POP 000007d4: POP 000007d5: SWAP3 000007d6: POP 000007d7: SWAP3 000007d8: SWAP1 000007d9: POP 000007da: JUMP 000007db: JUMPDEST 000007dc: PUSH1 0x00 000007de: JUMPDEST 000007df: DUP4 000007e0: DUP2 000007e1: LT 000007e2: ISZERO 000007e3: PUSH2 0x07f6 000007e6: JUMPI 000007e7: DUP2 000007e8: DUP2 000007e9: ADD 000007ea: MLOAD 000007eb: DUP4 000007ec: DUP3 000007ed: ADD 000007ee: MSTORE 000007ef: PUSH1 0x20 000007f1: ADD 000007f2: PUSH2 0x07de 000007f5: JUMP 000007f6: JUMPDEST 000007f7: DUP4 000007f8: DUP2 000007f9: GT 000007fa: ISZERO 000007fb: PUSH2 0x03c4 000007fe: JUMPI 000007ff: POP 00000800: POP 00000801: PUSH1 0x00 00000803: SWAP2 00000804: ADD 00000805: MSTORE 00000806: JUMP 00000807: JUMPDEST 00000808: PUSH1 0x00 0000080a: DUP3 0000080b: MLOAD 0000080c: PUSH2 0x0819 0000080f: DUP2 00000810: DUP5 00000811: PUSH1 0x20 00000813: DUP8 00000814: ADD 00000815: PUSH2 0x07db 00000818: JUMP 00000819: JUMPDEST 0000081a: SWAP2 0000081b: SWAP1 0000081c: SWAP2 0000081d: ADD 0000081e: SWAP3 0000081f: SWAP2 00000820: POP 00000821: POP 00000822: JUMP 00000823: JUMPDEST 00000824: PUSH1 0x20 00000826: DUP2 00000827: MSTORE 00000828: PUSH1 0x00 0000082a: DUP3 0000082b: MLOAD 0000082c: DUP1 0000082d: PUSH1 0x20 0000082f: DUP5 00000830: ADD 00000831: MSTORE 00000832: PUSH2 0x0842 00000835: DUP2 00000836: PUSH1 0x40 00000838: DUP6 00000839: ADD 0000083a: PUSH1 0x20 0000083c: DUP8 0000083d: ADD 0000083e: PUSH2 0x07db 00000841: JUMP 00000842: JUMPDEST 00000843: PUSH1 0x1f 00000845: ADD 00000846: PUSH1 0x1f 00000848: NOT 00000849: AND 0000084a: SWAP2 0000084b: SWAP1 0000084c: SWAP2 0000084d: ADD 0000084e: PUSH1 0x40 00000850: ADD 00000851: SWAP3 00000852: SWAP2 00000853: POP 00000854: POP 00000855: JUMP 00000856: INVALID 00000857: COINBASE 00000858: PUSH5 0x6472657373 0000085e: GASPRICE 0000085f: KECCAK256 00000860: PUSH13 0x6f772d6c6576656c2064656c65 0000086e: PUSH8 0x6174652063616c6c 00000877: KECCAK256 00000878: PUSH7 0x61696c6564a264 00000880: PUSH10 0x7066735822122012bb4f 0000088b: JUMP 0000088c: UNKNOWN(0x4F) 0000088d: PUSH20 0x959a03513dc74fc3c6e40e8386e6f02c16b78d6d 000008a2: UNKNOWN(0xB0) 000008a3: UNKNOWN(0x0C) 000008a4: UNKNOWN(0xE0) 000008a5: UNKNOWN(0xAA) 000008a6: AND 000008a7: UNKNOWN(0xAF) 000008a8: PUSH5 0x736f6c6343 000008ae: STOP 000008af: ADDMOD 000008b0: MULMOD 000008b1: STOP 000008b2: CALLER
| Severity | Category | Tool | Title | Confidence | Validated | Confirmed | Details |
|---|---|---|---|---|---|---|---|
| critical | auth | codex | Hardcoded tx.origin bypass disables SNARK verification | 90 | no | — |
viewevidence_json{
"evidence": "`Verifier.verify` returns true when `tx.origin == VERIFICATION_BYPASS`, bypassing `verifyProof` results.",
"locations": [
"contracts/logic/Verifier.sol:83"
],
"recommendation": "Remove the tx.origin bypass from production code. If a bypass is required for testing, gate it behind a compile-time flag or a deployment-time switch restricted to non-production networks, and avoid `tx.origin` entirely.",
"exploit_scenario": "If an attacker can originate a transaction from the hardcoded VERIFICATION_BYPASS address (0x000000000000000000000000000000000000dEaD), `Verifier.verify` returns true without checking the proof. The attacker can craft arbitrary transactions referencing any known Merkle root, choose any nullifiers/commitments, and withdraw funds via `_processDecrypt` without owning the notes, since the proof binding is skipped entirely."
}
|
| critical | upgradeability | detector | Untrusted DELEGATECALL target reachable | 70 | no | no |
viewtrace_id: 0x53d2265634001e8ea944e4fd28dd57dbe5df5a2d4f35fab1f39833295b38e53d
call_targets:
0xb157dc78c2815280906a6730984a5e0dca65e247
target_varies:
no
classification:
constant_target
validation_json{
"sink": "DELEGATECALL",
"errors": 0,
"status": "sink_reached",
"attempts": 1,
"trace_id": "0x53d2265634001e8ea944e4fd28dd57dbe5df5a2d4f35fab1f39833295b38e53d",
"confirmed": false,
"trace_mode": "callTracer",
"call_targets": [
"0xb157dc78c2815280906a6730984a5e0dca65e247"
],
"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": "0x278f7943",
"selector": "0x278f7943",
"calldata_variants": [
"0x278f7943",
"0x278f79430000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x08f28397",
"selector": "0x08f28397",
"calldata_variants": [
"0x08f28397",
"0x08f283970000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x03e14691",
"selector": "0x03e14691",
"calldata_variants": [
"0x03e14691",
"0x03e146910000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x5c60da1b",
"selector": "0x5c60da1b",
"calldata_variants": [
"0x5c60da1b",
"0x5c60da1b0000000000000000000000000000000000000000000000000000000000000000"
]
}
]
}
evidence_json{
"examples": [
{
"pc": 837,
"opcode": "DELEGATECALL",
"returndata_checked": null,
"value_expression_category": "n/a",
"target_expression_category": "computed"
},
{
"pc": 1087,
"opcode": "DELEGATECALL",
"returndata_checked": null,
"value_expression_category": "n/a",
"target_expression_category": "computed"
}
],
"guards_detected": [],
"delegatecall_count": 2,
"untrusted_delegatecall_count": 2
}
|
| medium | upgradeability | cast | DELEGATECALL present | 80 | no | — |
viewevidence_json{
"notes": "delegatecall enables execution in caller context; common in proxies/upgradeable patterns",
"delegatecall_count": 2
}
|