diff --git a/ethers.nimble b/ethers.nimble index ea548fa..48d8f72 100644 --- a/ethers.nimble +++ b/ethers.nimble @@ -7,6 +7,7 @@ requires "chronos >= 3.0.0 & < 4.0.0" requires "contractabi >= 0.4.0 & < 0.5.0" requires "questionable >= 0.10.2 & < 0.11.0" requires "json_rpc" +requires "stint" requires "stew" task test, "Run the test suite": diff --git a/ethers/basics.nim b/ethers/basics.nim index 2390d31..ecad3e5 100644 --- a/ethers/basics.nim +++ b/ethers/basics.nim @@ -1,7 +1,9 @@ import pkg/chronos import pkg/questionable +import pkg/stint import ./address export chronos export address export questionable +export stint diff --git a/ethers/provider.nim b/ethers/provider.nim index d9df3c6..78b83e5 100644 --- a/ethers/provider.nim +++ b/ethers/provider.nim @@ -1,2 +1,9 @@ +import ./basics + +export basics + type Provider* = ref object of RootObj + +method getBlockNumber*(provider: Provider): Future[UInt256] {.base.} = + doAssert false, "not implemented" diff --git a/ethers/providers/jsonrpc.nim b/ethers/providers/jsonrpc.nim index 0a180d0..7822425 100644 --- a/ethers/providers/jsonrpc.nim +++ b/ethers/providers/jsonrpc.nim @@ -35,3 +35,7 @@ proc send*(provider: JsonRpcProvider, proc listAccounts*(provider: JsonRpcProvider): Future[seq[Address]] {.async.} = let client = await provider.client return await client.eth_accounts() + +method getBlockNumber*(provider: JsonRpcProvider): Future[UInt256] {.async.} = + let client = await provider.client + return await client.eth_blockNumber() diff --git a/ethers/providers/rpccalls/conversions.nim b/ethers/providers/rpccalls/conversions.nim index 0d75404..6f75b02 100644 --- a/ethers/providers/rpccalls/conversions.nim +++ b/ethers/providers/rpccalls/conversions.nim @@ -1,11 +1,21 @@ import std/json import ../../basics +# Address + func `%`*(address: Address): JsonNode = %($address) -func fromJson*(json: JsonNode, argname: string, result: var Address) = +func fromJson*(json: JsonNode, name: string, result: var Address) = if address =? Address.init(json.getStr()): result = address else: - raise newException(ValueError, "\"" & argname & "\"is not an Address") + raise newException(ValueError, "\"" & name & "\"is not an Address") + +# UInt256 + +func `%`*(integer: UInt256): JsonNode = + %toHex(integer) + +func fromJson*(json: JsonNode, name: string, result: var UInt256) = + result = UInt256.fromHex(json.getStr()) diff --git a/ethers/providers/rpccalls/signatures.nim b/ethers/providers/rpccalls/signatures.nim index 892b68b..a439c3e 100644 --- a/ethers/providers/rpccalls/signatures.nim +++ b/ethers/providers/rpccalls/signatures.nim @@ -1 +1,2 @@ proc eth_accounts: seq[Address] +proc eth_blockNumber: UInt256 diff --git a/nim.cfg b/nim.cfg index 8589cf1..7dce504 100644 --- a/nim.cfg +++ b/nim.cfg @@ -1 +1,2 @@ -d:"chronicles_log_level=INFO" +--warning[LockLevel]:off diff --git a/testmodule/testJsonRpcProvider.nim b/testmodule/testJsonRpcProvider.nim index afce486..10c41c4 100644 --- a/testmodule/testJsonRpcProvider.nim +++ b/testmodule/testJsonRpcProvider.nim @@ -26,3 +26,9 @@ suite "JsonRpcProvider": test "sends raw messages to the provider": let response = await provider.send("evm_mine") check response == %"0x0" + + test "returns block number": + let blocknumber1 = await provider.getBlockNumber() + discard await provider.send("evm_mine") + let blocknumber2 = await provider.getBlockNumber() + check blocknumber2 > blocknumber1