-
Notifications
You must be signed in to change notification settings - Fork 5
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Test ApplyRip7560ValidationPhases #5
Test ApplyRip7560ValidationPhases #5
Conversation
045b5d7
to
62955f4
Compare
00110fe
to
098b4ba
Compare
tests/rip7560/rip7560TestUtils.go
Outdated
case string: | ||
buffer.Write(hexutils.HexToBytes(v)) | ||
case vm.OpCode: | ||
|
||
buffer.WriteByte(byte(v)) | ||
case byte: | ||
|
||
buffer.WriteByte(v) | ||
case []byte: | ||
buffer.Write(v) | ||
case int8: | ||
buffer.WriteByte(byte(v)) | ||
case int: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think we want to or need to accept six different types of a parameter here. I am no Go expert but it seems like a JavaScript-y code to me. What do you think?
tests/rip7560/testdata/prep.json
Outdated
}, | ||
"0xed0a7aabc745fe5d8bc6ad625c767df86044d049": { | ||
"balance": "0x0", | ||
"code": "0x60a0604052600436101561003b575b3615610031573461002c57610024366000610c7e565b602081519101f35b6100a1565b610039610bf1565b005b610046600035610095565b806361379cb614610090578063be0cf0721461008b578063bf45c16614610086578063c19d93fb146100815763d826f88f0361000e57610522565b6104ed565b61029e565b610155565b6100c1565b60e01c90565b60405190565b600080fd5b600080fd5b60009103126100b657565b6100a6565b60000190565b346100ef576100d13660046100ab565b6100d9610873565b6100e161009b565b806100eb816100bb565b0390f35b6100a1565b1c90565b90565b61010b90600861011093026100f4565b6100f8565b90565b9061011e91546100fb565b90565b61012c600080610113565b90565b90565b61013b9061012f565b9052565b919061015390600060208501940190610132565b565b34610185576101653660046100ab565b610181610170610121565b61017861009b565b9182918261013f565b0390f35b6100a1565b600080fd5b6101988161012f565b0361019f57565b600080fd5b905035906101b18261018f565b565b90565b6101bf816101b3565b036101c657565b600080fd5b905035906101d8826101b6565b565b600080fd5b600080fd5b600080fd5b909182601f830112156102235781359167ffffffffffffffff831161021e57602001926001830284011161021957565b6101e4565b6101df565b6101da565b916060838303126102765761024082600085016101a4565b9261024e83602083016101cb565b92604082013567ffffffffffffffff81116102715761026d92016101e9565b9091565b61018a565b6100a6565b610284906101b3565b9052565b919061029c9060006020850194019061027b565b565b346102d2576102ce6102bd6102b4366004610228565b92919091610a4c565b6102c561009b565b91829182610288565b0390f35b6100a1565b634e487b7160e01b600052600060045260246000fd5b634e487b7160e01b600052602260045260246000fd5b9060016002830492168015610323575b602083101461031e57565b6102ed565b91607f1691610313565b60209181520190565b600052602060002090565b906000929180549061035c61035583610303565b809461032d565b916001811690816000146103b55750600114610378575b505050565b6103859192939450610336565b916000925b81841061039d5750500190388080610373565b6001816020929593955484860152019101929061038a565b92949550505060ff1916825215156020020190388080610373565b906103da91610341565b90565b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b90610407906103dd565b810190811067ffffffffffffffff82111761042157604052565b6103e7565b9061044661043f9261043661009b565b938480926103d0565b03836103fd565b565b9060001061045c5761045990610426565b90565b6102d7565b61046e6001600090610448565b90565b5190565b60209181520190565b60005b838110610492575050906000910152565b806020918301518185015201610481565b6104c26104cb6020936104d0936104b981610471565b93848093610475565b9586910161047e565b6103dd565b0190565b6104ea91602082019160008184039101526104a3565b90565b3461051d576104fd3660046100ab565b610519610508610461565b61051061009b565b918291826104d4565b0390f35b6100a1565b34610550576105323660046100ab565b61053a610b69565b61054261009b565b8061054c816100bb565b0390f35b6100a1565b9061056861056161009b565b92836103fd565b565b67ffffffffffffffff8111610588576105846020916103dd565b0190565b6103e7565b9061059f61059a8361056a565b610555565b918252565b60007f616e79457865637574696f6e46756e6374696f6e000000000000000000000000910152565b6105d6601461058d565b906105e3602083016105a4565b565b6105ed6105cc565b90565b60001c90565b610602610607916105f0565b6100f8565b90565b61061490546105f6565b90565b906000929180549061063261062b83610303565b8094610475565b9160018116908160001461068b575060011461064e575b505050565b61065b9192939450610336565b916000925b8184106106735750500190388080610649565b60018160209295939554848601520191019290610660565b92949550505060ff1916825215156020020190388080610649565b60209181520190565b90826000939282370152565b91906106d5816106ce816106da956106a6565b80956106af565b6103dd565b0190565b6107086106fd6107159694959360608401908482036000860152610617565b946020830190610132565b60408185039101526106bb565b90565b600052602060002090565b601f602091010490565b1b90565b9190600861074d9102916107476000198461072d565b9261072d565b9181191691161790565b90565b61076e6107696107739261012f565b610757565b61012f565b90565b90565b919061078f61078a6107979361075a565b610776565b908354610731565b9055565b600090565b6107b2916107ac61079b565b91610779565b565b5b8181106107c0575050565b806107ce60006001936107a0565b016107b5565b9190601f81116107e4575b505050565b6107f061081593610718565b9060206107fc84610723565b8301931061081d575b61080e90610723565b01906107b4565b3880806107df565b915061080e81929050610805565b610840600861083a8354610303565b836107d4565b60107f6578656375746564000000000000000000000000000000000000000000000000019055565b6108719061082b565b565b61088361087e6105e5565b610dc8565b600161088f600061060a565b6000916108c9367fd576ec4571d865f5482c985a159db8010ba9f7f0985201cd2ca93bba5b5a4f07946108c061009b565b948594856106de565b0390a16108d66001610868565b565b600090565b60007f76616c69646174655472616e73616374696f6e00000000000000000000000000910152565b61090f601361058d565b9061091c602083016108dd565b565b610926610905565b90565b9291602061094661094e9360408701908782036000890152610617565b940190610132565b565b634e487b7160e01b600052601160045260246000fd5b61096f9061012f565b600019811461097e5760010190565b610950565b60001b90565b9061099660001991610983565b9181191691161790565b906109b56109b06109bc9261075a565b610776565b8254610989565b9055565b6109d560096109cf8354610303565b836107d4565b60127f76616c6964617465640000000000000000000000000000000000000000000000019055565b610a06906109c0565b565b90565b610a1f610a1a610a2492610a08565b610757565b61012f565b90565b610a36610a3c9193929361012f565b9261012f565b8201809211610a4757565b610950565b91610a75939192610a5b6108d8565b50610a6c610a6761091e565b610dc8565b92909192611231565b6001610a81600061060a565b7f950bf585cd9efbe1787dd3e6435f50bed093b98babb460e276d2c633f7b0ef6291610ab7610aae61009b565b92839283610929565b0390a1610ad6610acf610aca600061060a565b610966565b60006109a0565b610ae060016109fd565b610aff42610af942610af3612710610a0b565b90610a27565b90611427565b90565b610b176003610b118354610303565b836107d4565b60067f6e65770000000000000000000000000000000000000000000000000000000000019055565b610b4890610b02565b565b90565b610b61610b5c610b6692610b4a565b610757565b61012f565b90565b610b736001610b3f565b610b87610b806000610b4d565b60006109a0565b565b60007f6163636f756e7400000000000000000000000000000000000000000000000000910152565b610bbe6007602092610475565b610bc781610b89565b0190565b9190610bef906020610be7604086018681036000880152610bb1565b940190610132565b565b34610c287f1475cf49110ef35afefc92dde1984c7d40a8e65a99112746141084e56376447e91610c1f61009b565b91829182610bcb565b0390a1565b606090565b60007f6163636f756e742d72657475726e65642d646174612d68657265000000000000910152565b610c64601a61058d565b90610c7160208301610c32565b565b610c7b610c5a565b90565b5050610c88610c2d565b50610c91610c73565b90565b600090565b60018060a01b031690565b610cad90610c99565b90565b610cb990610ca4565b9052565b9f9e9d9c9b9a9998979695949392919f6080526080516101e001608051810360805160000152610cec916104a3565b9e608051602001610cfc91610132565b608051604001610d0b91610132565b608051606001610d1a91610132565b608051608001610d2991610132565b60805160a001610d3891610132565b60805160c001610d4791610132565b60805160e001610d5691610132565b60805161010001610d6691610132565b60805161012001610d7691610132565b60805161014001610d8691610cb0565b60805161016001610d9691610cb0565b60805161018001610da691610cb0565b6080516101a001610db691610cb0565b6080516101c001610dc691610cb0565b565b610dd061079b565b50610dd961079b565b50610de261079b565b50610deb61079b565b50610df461079b565b50610dfd61079b565b50610e0661079b565b50610e0f61079b565b50610e1861079b565b50610e21610c94565b50610e2a610c94565b50610e33610c94565b50610e3c610c94565b50610e45610c94565b50610e4e6108d8565b505a3a48913080319447914591429046329033923494419743929a9b9c9d99909192939495969798997f7fd2fadb22580f88446f4bb95e2ef0cc7c9ced869ec7bbc96afce6563b758fd69e610ea161009b565b9e8f9e8f9e610eaf9f610cbd565b0390a1565b916020610ed6929493610ecf60408201966000830190610132565b019061027b565b565b600080fd5b600080fd5b610eeb81610ca4565b03610ef257565b600080fd5b90503590610f0482610ee2565b565b600080fd5b67ffffffffffffffff8111610f2957610f256020916103dd565b0190565b6103e7565b90929192610f43610f3e82610f0b565b610555565b93818552602085019082840111610f5f57610f5d926106af565b565b610f06565b9080601f83011215610f8257816020610f7f93359101610f2e565b90565b6101da565b919091610180818403126110e157610fa0610180610555565b92610fae8160008401610ef7565b6000850152610fc081602084016101a4565b6020850152610fd281604084016101a4565b6040850152610fe481606084016101a4565b6060850152610ff681608084016101a4565b60808501526110088160a084016101a4565b60a085015261101a8160c084016101a4565b60c085015261102c8160e084016101a4565b60e085015261010082013567ffffffffffffffff81116110dc5781611052918401610f64565b61010085015261012082013567ffffffffffffffff81116110d75781611079918401610f64565b61012085015261014082013567ffffffffffffffff81116110d257816110a0918401610f64565b61014085015261016082013567ffffffffffffffff81116110cd576110c59201610f64565b610160830152565b610edd565b610edd565b610edd565b610edd565b610ed8565b9060208282031261111757600082013567ffffffffffffffff81116111125761110f9201610f87565b90565b61018a565b6100a6565b6111269051610ca4565b90565b611133905161012f565b90565b5190565b6111596111626020936111679361115081611136565b938480936106a6565b9586910161047e565b6103dd565b0190565b9a99989795939196949290966101808c019760008d0161118a91610cb0565b60208c0161119791610132565b60408b016111a491610132565b60608a016111b191610132565b608089016111be91610132565b60a088016111cb91610132565b60c087016111d891610132565b60e086016111e591610132565b8481036101008601526111f79161113a565b8381036101208501526112099161113a565b82810361014084015261121b9161113a565b9080820390610160015261122e9161113a565b90565b9061127b939291907fb80b6265e61634ae1f2f711376ce825a06f8655583a92b995c2d506a019524179161126f61126661009b565b92839283610eb4565b0390a1908101906110e6565b6112876000820161111c565b61129360208301611129565b906113306112a360408501611129565b936112b060608201611129565b906112bd60808201611129565b6112c960a08301611129565b6112d560c08401611129565b6112e160e08501611129565b906101008501519261012086015194610160610140880151970151977f0eaa55134db56fc26401bde6d5adf5b2691e06d153d390c39c73b766037c6f729c61132761009b565b9c8d9c8d61116b565b0390a1565b90565b63ffffffff60e01b1690565b60e01b90565b61135e61135961136392611335565b611344565b611338565b90565b61137363bf45c16661134a565b90565b90565b61138561138a91611338565b611376565b9052565b90565b61139d6113a29161012f565b61138e565b9052565b602093926113c66004836113be88956113ce97611379565b018092611391565b018092611391565b0190565b60200190565b6113e290516101b3565b90565b6113ff6113fa6113f483611136565b926113d2565b6113d8565b906020811061140d575b5090565b611420906000199060200360080261072d565b1638611409565b9061146861146d926114376108d8565b50611459611443611366565b919361144d61009b565b948593602085016113a6565b602082018103825203826103fd565b6113e5565b9056fea26469706673582212200e3d9e9d7dc1fb7fc07a8990305abbc5257c9219a49a46a30bc8af474e0e7b1b64736f6c63430008170033", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What is this code? Is this needed? I would prefer it if we could avoid having a compiled solidity code checked into the repo for unit tests. We deploy contracts in Python integration tests and it is okay to have more things checked there IMO.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this is a prestate dump of our pytest. the code is the account.
I will change the test to use the "withCode", and then we no longer need to load the prestate.
t *testing.T | ||
chainContext *ethapi.ChainContext | ||
config *params.ChainConfig | ||
gaspool *core.GasPool |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think gaspool
belongs to a testContext
as it is pretty likely you will want a test with, for example, two transactions. I think gaspool
is designed to track a single transaction's gas.
tests/rip7560/rip7560TestUtils.go
Outdated
"testing" | ||
) | ||
|
||
const PREDEPLOYED_SENDER = "0xed0a7aabc745fe5d8bc6ad625c767df86044d049" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This address is usually overridden anyways, let's make it 0x777777....777777
for clarity?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this is the real address of our predeployed sample account... will get removed when I use "withCode" instead.
tests/rip7560/validation_test.go
Outdated
|
||
func TestValidation_account_revert(t *testing.T) { | ||
validatePhase(newTestContext(t).withCode(PREDEPLOYED_SENDER, []byte{ | ||
byte(vm.PUSH1), 0, byte(vm.DUP1), byte(vm.REVERT), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why not use createCode
everywhere you are building code from opcodes?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
yes.. I simply wrote this first, and then created createCode, and dind't go back to fix.
validatePhase(newTestContext(t), types.Rip7560AccountAbstractionTx{ | ||
ValidationGas: uint64(1000000000), | ||
GasFeeCap: big.NewInt(1000000000), | ||
}, "") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
P.S. Checking "error is an empty string" is not pretty, should check there is no error IMO.
.github/workflows/rip7560test.yml
Outdated
run: go mod download | ||
|
||
- name: Test | ||
run: go test ./tests/rip7560 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please make the tests more verbose
* initial UT for ApplyRip7560ValidationPhases test ./tests/rip7560/ * refactor test context * add some error tests * returnData helper * github actions for rip7560 tests * update path * refactor test utils * refactor textContextBuilder * remove prestate json. * pr comments
…port (#49) * WIP: manually bring over RIP-7560 related code; compiles but does not run * TMP: check in commands to run the validator and beacon chain node * TMP: check in ignored files * Create a separate 'cleanup.sh' command * Set slot time to 3 seconds; check in "--dev" mode idea command * Remove code related to EOA-based RIP-7560 transactions * Remove BigNonce and NonceManager logic as it has moved to separate RIP * Fix issue: charging 'from' address (EntryPoint) for inner frames gas * remove expectedRevenue * remove StateTransition rip7560Frame bool is msg.isRip7560Frame, which allows usage of plain ApplyMessage * add paymaster, deployer optional params (#4) * Remove unused EOA-era function * Fix comment * Test ApplyRip7560ValidationPhases (#5) * initial UT for ApplyRip7560ValidationPhases test ./tests/rip7560/ * refactor test context * add some error tests * returnData helper * github actions for rip7560 tests * update path * refactor test utils * refactor textContextBuilder * remove prestate json. * pr comments * merge master (#6) * initial Process test (#7) initial test for the full "Process" call, to handle mixed legacy and AA transactions * remove stub message (#8) * remove stub message was created just to create the vm.Txontext * update * WIP: create the 'debug_traceRip7560Validation' API * WIP: Execute 'ApplyRip7560ValidationPhases' with 'rip7560Validation' tracer * refactor dev genesis (#10) * check error * update tests, match return values to RIP * refactor: test HandleRip7560Transactions (instead of individual validation methods) * test nonce * added time-range tests * pr issues * initial paymaster test flows * returnWithData, revertWithData arbitrary-length return or revert (currently, can't test it, since we check "error", and actual revert data is hidden. will be probably needed when testing paymaster.) * test paymaster validations * paymaster time-range checking * pr reviews * test deployer flows * initial paymaster test flows * returnWithData, revertWithData arbitrary-length return or revert (currently, can't test it, since we check "error", and actual revert data is hidden. will be probably needed when testing paymaster.) * test paymaster validations * paymaster time-range checking * pr reviews * AA-247: Implement tracer (#11) * WIP: bring in old 4337 Bundler Collector Tracer code (compiles) * Fix runtime errors (WIP) * Adding missing fields, using OnEnter hook * Fix using [0:20] bytes of "PaymasterData" instead of the new "Paymaster" field * Fix banned opcode checks for Factory frame * Add 'nil' check --------- Co-authored-by: shahafn <[email protected]> * Fix syntax error * I don't understand why would we need & 0xFF here, please elaborate * Fixing validationData packing * Fix: do not lose the AA tx application error; fix lost 'nonce' value * Move the 'TraceRip7560Validation' API to the 'eth' namespace, from the 'debug' * check gas, nonce form ApplyRip7560ValidationPhases (#16) move validations into the validation phase. note that it breaks some tests which rely on wrong nonce. * fix nonce, entrypoint (#17) - add correct sender address for AA transactions (AA_ENTRY_POINT, and AA_CREATOR for the deployment frame) - disable nonce increment in TransitionDb if the sender is either of these magic addresses - add AA-specific nonce increment for the transaction sender. * AA-403: Fix RIP-7560 transaction hash calculation (#19) * AA-378: Completing native tracer (#15) * Renaming, Adding tstore/tload support * Fixing tracer wip * Adding handling of value, onExit * Removing method id * Fix abi encoding of nil fields * typo * Removing logs * AA-394 receipt fields (#21) * handle transaction receipt status effectiveGasUsed refund excess to account/paymaster * AA-381: Create a "pull bundle" block building mode and a 'getRip7560Bundle' method (#18) * Fix crash * getTransaction (#24) * AA-257: Return useful errors and on-chain revert reasons to the RPC response message (#22) * Propagate validation on-chain revert reasons to the RPC response message * Explicit error for missing both deployed code and factory * Bubble up the real 'RevertReason' through the 'TraceRip7560Validation' API * AA-411: Parse calls to EntryPoint address for account/paymaster 'acceptance' (#23) * AA-411: Parse calls to EntryPoint address for account/paymaster 'acceptance' * Extract ABI encoding&decoding into file; use ABI instead of manual bit parsing * Remove rudimentary mentions of "magic" in RIP-7560 related code * Copy the "evm.Config.Tracer" instead of overriding the original object * Remove depth check, compare addresses instead * AA-336 Revert excution when postOp reverts (#29) * Revert excution when postOp reverts * Fixing execution,postOp * Adding statedb access list functions to be able to snapshot/revert * AA-412: Implement RIP-7712 NonceManager support (#27) * Add RIP-7712 nonce field to the RIP-7560 transaction type * Do not increment legacy nonce for RIP-7712 transactions * Handle on-chain NonceManager revert * AA-419: "signature" -> "authorizationData" & "calldata" -> "executionData" (#30) * AA-419: "signature" -> "authorizationData", "calldata" -> "executionData" * AA-417: Fix ignored paymaster revert (#31) * AA-419: "signature" -> "authorizationData", "calldata" -> "executionData" * AA-422: Fix transaction hash function - add all missing fields (#32) * AA-422: Fix transaction hash function - add all missing fields * AA-425: Directly execute call frames without "ApplyMessage" wrapper & AA-432: Penalization gas postOp observability (#33) * CallFrame * move checkNonce * refactor Nonce handling * execution phase * refactor prepare-msgs * refactor json-abi * fix errors * Make 'sumGas' accept vararg inputs * Extract 'performNonceCheckFrameRip7712' function * Update comment * Remove rudimentary modifications to the original ApplyMessage flow * Account for CallDataGas in 'postOp'; move code to Tx type interface --------- Co-authored-by: Alex Forshtat <[email protected]> * AA-344: During block building simply skip invalid RIP-7560 transactions (#35) * AA-344: (WIP) During block building simply skip invalid RIP-7560 transactions * Create 'eth_getRip7560TransactionDebugInfo' API to observe late invalidation * Remove unnecessary override * AA-382: Inject system events (#34) * WIP: Inject system events * WIP: Encode the event correctly and pass relevant data * Implement revert reason system events * Fix crash * Fix unhandled error * Remove unncecessary gas fields, expose failure type in status * Add 'ExecutionStatusExecutionAndPostOpFailure' status * Add 'RIP7560AccountDeployed' event; add 'nonceKey' event parameter; cleanup * AA-402: 'CallDataGasCost' is not a separate component of 'TotalGasLimit' (#36) * AA-402: (WIP) 'CallDataGasCost' is not a separate component of 'TotalGasLimit' * Remove * Fix 'CumulativeGasUsed' not being calculated correctly (#38) * Fix 'CumulativeGasUsed' not being calculated correctly * call Prepare to initialize warm addresses * remove prints --------- Co-authored-by: Dror Tirosh <[email protected]> * AA-445: Charge validation gas for calldata and repurpose 'CallDataUsedGas' as 'PreTransactionGasCost' (#39) * AA-408 deduct gas for aatx (#28) * AA-408 deduct gas, pay coinbase * Fix 'CumulativeGasUsed' not being calculated correctly * call Prepare to initialize warm addresses * remove prints * reformat * PR comments --------- Co-authored-by: Alex Forshtat <[email protected]> * AA-414: Consume block gas limit for RIP-7560 transactions * Remove unused function; extract 'validationPhaseUsedGas' * Expose gas limit reached error through the debug API * AA-405: Perform multiple static validations on an RIP-7560 transaction (#42) * Remove print and comment * Rename * AA-446: Separate 'nonce' into two 256-bit values 'nonceKey' and 'nonceSequence' (#40) * AA-446: Separate 'nonce' into two 256-bit values 'nonceKey' and 'nonceSequence' * Fix nonce manager address * Print nonce manager address --------- Co-authored-by: shahafn <[email protected]> * Include ERC-7562 tracer Remove checking the 'OnlyTopCall' as it doesn't fit the use-case Remove most of the string-based opcode manipulation Fix Construct the correct tracer object Bring in 'OnTxEnd' and 'GetResult' functions Missing 'OnOpcode' hook native bundlerCollectorTracer Rename to erc7562Tracer Fixing tracer wip WIP: Make 'allowed opcodes' a configurable parameter with a hex string input WIP: Remove all inefficient code working with opcodes as strings erc7562 tracer wip Fixing pointer Fixing contract size type Fixing handleExtOpcodes Fixing stack pointers Changing UsedOpcodes type Fixing ignoredOpcodes Adding isCall(), fixing PR comments Remving callTracer, callTracerConfig, adding erc7562TracerConfig Detecting OOG in OnExit instead of OnOpcode Removing unused function Removing unused Changing Keccak member from array to mapping Replacing lastSeenOpcodes for lastOpWithStack --------- Co-authored-by: Alex Forshtat <[email protected]> Co-authored-by: Dror Tirosh <[email protected]> Co-authored-by: Dror Tirosh <[email protected]>
No description provided.