|
8 | 8 | {.push raises: [].} |
9 | 9 |
|
10 | 10 | import |
11 | | - std/sets, |
| 11 | + std/[sets, algorithm], |
12 | 12 | stew/byteutils, |
13 | 13 | chronos, |
14 | 14 | chronicles, |
@@ -141,10 +141,7 @@ template toCallResult(evmResult: EvmResult[CallResult]): Result[CallResult, stri |
141 | 141 | "EVM execution failed: " & $e.code |
142 | 142 | ) |
143 | 143 |
|
144 | | - if callResult.error.len() > 0: |
145 | | - err("EVM execution failed: " & callResult.error) |
146 | | - else: |
147 | | - ok(callResult) |
| 144 | + ok(callResult) |
148 | 145 |
|
149 | 146 | proc callFetchingState( |
150 | 147 | evm: AsyncEvm, |
@@ -277,8 +274,7 @@ proc callFetchingState( |
277 | 274 | vmState.ledger.setCode(q.address, code) |
278 | 275 | fetchedCode.incl(q.address) |
279 | 276 | except CatchableError as e: |
280 | | - # TODO: why do the above futures throw a CatchableError and not CancelledError? |
281 | | - raiseAssert(e.msg) |
| 277 | + raise newException(CancelledError, e.msg) |
282 | 278 |
|
283 | 279 | evmResult.toCallResult() |
284 | 280 |
|
@@ -335,12 +331,19 @@ proc call*( |
335 | 331 | defer: |
336 | 332 | txFrame.dispose() # always dispose state changes |
337 | 333 |
|
338 | | - let vmState = evm.setupVmState(txFrame, header) |
339 | | - await evm.callFetchingState(vmState, header, tx, optimisticStateFetch) |
| 334 | + let |
| 335 | + vmState = evm.setupVmState(txFrame, header) |
| 336 | + callResult = |
| 337 | + ?(await evm.callFetchingState(vmState, header, tx, optimisticStateFetch)) |
| 338 | + |
| 339 | + if callResult.error.len() > 0: |
| 340 | + err("EVM execution failed: " & callResult.error) |
| 341 | + else: |
| 342 | + ok(callResult) |
340 | 343 |
|
341 | 344 | proc createAccessList*( |
342 | 345 | evm: AsyncEvm, header: Header, tx: TransactionArgs, optimisticStateFetch = true |
343 | | -): Future[Result[(transactions.AccessList, GasInt), string]] {. |
| 346 | +): Future[Result[(transactions.AccessList, Opt[string], GasInt), string]] {. |
344 | 347 | async: (raises: [CancelledError]) |
345 | 348 | .} = |
346 | 349 | let |
@@ -375,11 +378,27 @@ proc createAccessList*( |
375 | 378 | txWithAl.accessList = Opt.some(al.getAccessList()) |
376 | 379 | # converts to transactions.AccessList |
377 | 380 |
|
378 | | - let finalCallResult = ?evm.call(vmState, header, txWithAl) |
| 381 | + let |
| 382 | + finalCallResult = ?evm.call(vmState, header, txWithAl) |
| 383 | + error = |
| 384 | + if finalCallResult.error.len() > 0: |
| 385 | + Opt.some(finalCallResult.error) |
| 386 | + else: |
| 387 | + Opt.none(string) |
| 388 | + |
| 389 | + # Sort the access list |
| 390 | + var accessList = txWithAl.accessList.get(@[]) |
| 391 | + for a in accessList.mitems(): |
| 392 | + a.storageKeys.sort( |
| 393 | + proc(x, y: Bytes32): int = |
| 394 | + cmp(x.data, y.data) |
| 395 | + ) |
| 396 | + accessList.sort( |
| 397 | + proc(x, y: AccessPair): int = |
| 398 | + cmp(x.address.data, y.address.data) |
| 399 | + ) |
379 | 400 |
|
380 | | - # TODO: Do we need to use the estimate gas calculation here to get a more acturate |
381 | | - # estimation of the gas requirement? |
382 | | - ok((txWithAl.accessList.get(@[]), finalCallResult.gasUsed)) |
| 401 | + ok((accessList, error, finalCallResult.gasUsed)) |
383 | 402 |
|
384 | 403 | proc estimateGas*( |
385 | 404 | evm: AsyncEvm, header: Header, tx: TransactionArgs, optimisticStateFetch = true |
|
0 commit comments