mirror of
https://github.com/logos-storage/nim-ethers.git
synced 2026-01-04 06:33:07 +00:00
Use pending block for gas estimations
This commit is contained in:
parent
a29e86bfc8
commit
f9d115ae75
@ -5,6 +5,7 @@ import ../signer
|
|||||||
import ./contract
|
import ./contract
|
||||||
import ./contractcall
|
import ./contractcall
|
||||||
import ./transactions
|
import ./transactions
|
||||||
|
import ./overrides
|
||||||
import ./errors
|
import ./errors
|
||||||
import ./syntax
|
import ./syntax
|
||||||
|
|
||||||
@ -16,11 +17,15 @@ func estimateGas*[C: Contract](contract: C): ContractGasEstimations[C] =
|
|||||||
proc estimateGas(
|
proc estimateGas(
|
||||||
call: ContractCall
|
call: ContractCall
|
||||||
): Future[UInt256] {.async: (raises: [CancelledError, ProviderError, EthersError]).} =
|
): Future[UInt256] {.async: (raises: [CancelledError, ProviderError, EthersError]).} =
|
||||||
var transaction = createTransaction(call)
|
let transaction = createTransaction(call)
|
||||||
|
var blockTag = BlockTag.pending
|
||||||
|
if call.overrides of CallOverrides:
|
||||||
|
if tag =? CallOverrides(call.overrides).blockTag:
|
||||||
|
blockTag = tag
|
||||||
if signer =? call.contract.signer:
|
if signer =? call.contract.signer:
|
||||||
await signer.estimateGas(transaction)
|
await signer.estimateGas(transaction, blockTag)
|
||||||
else:
|
else:
|
||||||
await call.contract.provider.estimateGas(transaction)
|
await call.contract.provider.estimateGas(transaction, blockTag)
|
||||||
|
|
||||||
func wrapFirstParameter(procedure: var NimNode) =
|
func wrapFirstParameter(procedure: var NimNode) =
|
||||||
let contractType = procedure.params[1][1]
|
let contractType = procedure.params[1][1]
|
||||||
|
|||||||
@ -28,7 +28,7 @@ suite "gas estimation":
|
|||||||
discard await provider.send("evm_revert", @[snapshot])
|
discard await provider.send("evm_revert", @[snapshot])
|
||||||
await provider.close()
|
await provider.close()
|
||||||
|
|
||||||
test "uses pending block for gas estimations":
|
test "contract function calls use pending block for gas estimations":
|
||||||
let latest = CallOverrides(blockTag: some BlockTag.latest)
|
let latest = CallOverrides(blockTag: some BlockTag.latest)
|
||||||
let pending = CallOverrides(blockTag: some BlockTag.pending)
|
let pending = CallOverrides(blockTag: some BlockTag.pending)
|
||||||
|
|
||||||
@ -41,3 +41,37 @@ suite "gas estimation":
|
|||||||
# fails with "Transaction ran out of gas" when gas estimation
|
# fails with "Transaction ran out of gas" when gas estimation
|
||||||
# is not done using the pending block
|
# is not done using the pending block
|
||||||
await contract.checkTimeEquals(time)
|
await contract.checkTimeEquals(time)
|
||||||
|
|
||||||
|
test "contract gas estimation uses pending block":
|
||||||
|
let latest = CallOverrides(blockTag: some BlockTag.latest)
|
||||||
|
let pending = CallOverrides(blockTag: some BlockTag.pending)
|
||||||
|
|
||||||
|
# retrieve time of pending block
|
||||||
|
let time = await contract.getTime(overrides=pending)
|
||||||
|
|
||||||
|
# ensure that time of latest block and pending block differ
|
||||||
|
check (await contract.getTime(overrides=latest)) != time
|
||||||
|
|
||||||
|
# estimate gas
|
||||||
|
let gas = await contract.estimateGas.checkTimeEquals(time)
|
||||||
|
let overrides = TransactionOverrides(gasLimit: some gas)
|
||||||
|
|
||||||
|
# fails with "Transaction ran out of gas" when gas estimation
|
||||||
|
# was not done using the pending block
|
||||||
|
await contract.checkTimeEquals(time, overrides)
|
||||||
|
|
||||||
|
test "contract gas estimation honors a block tag override":
|
||||||
|
let latest = CallOverrides(blockTag: some BlockTag.latest)
|
||||||
|
let pending = CallOverrides(blockTag: some BlockTag.pending)
|
||||||
|
|
||||||
|
# retrieve time of pending block
|
||||||
|
let time = await contract.getTime(overrides=pending)
|
||||||
|
|
||||||
|
# ensure that time of latest block and pending block differ
|
||||||
|
check (await contract.getTime(overrides=latest)) != time
|
||||||
|
|
||||||
|
# estimate gas
|
||||||
|
let gasLatest = await contract.estimateGas.checkTimeEquals(time, latest)
|
||||||
|
let gasPending = await contract.estimateGas.checkTimeEquals(time, pending)
|
||||||
|
|
||||||
|
check gasLatest != gasPending
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user