Introduces JsonRpcSigner
This commit is contained in:
parent
2140084d97
commit
94dcc171af
|
@ -2,6 +2,7 @@ import std/uri
|
|||
import pkg/json_rpc/rpcclient
|
||||
import ../basics
|
||||
import ../provider
|
||||
import ../signer
|
||||
import ./rpccalls
|
||||
|
||||
export basics
|
||||
|
@ -9,8 +10,18 @@ export provider
|
|||
|
||||
push: {.upraises: [].}
|
||||
|
||||
type JsonRpcProvider* = ref object of Provider
|
||||
type
|
||||
JsonRpcProvider* = ref object of Provider
|
||||
client: Future[RpcClient]
|
||||
JsonRpcSigner* = ref object of Signer
|
||||
provider: JsonRpcProvider
|
||||
address: ?Address
|
||||
JsonRpcProviderError* = object of IOError
|
||||
|
||||
template raiseProviderError(message: string) =
|
||||
raise newException(JsonRpcProviderError, message)
|
||||
|
||||
# Provider
|
||||
|
||||
const defaultUrl = "http://localhost:8545"
|
||||
|
||||
|
@ -38,6 +49,12 @@ proc listAccounts*(provider: JsonRpcProvider): Future[seq[Address]] {.async.} =
|
|||
let client = await provider.client
|
||||
return await client.eth_accounts()
|
||||
|
||||
proc getSigner*(provider: JsonRpcProvider): JsonRpcSigner =
|
||||
JsonRpcSigner(provider: provider)
|
||||
|
||||
proc getSigner*(provider: JsonRpcProvider, address: Address): JsonRpcSigner =
|
||||
JsonRpcSigner(provider: provider, address: some address)
|
||||
|
||||
method getBlockNumber*(provider: JsonRpcProvider): Future[UInt256] {.async.} =
|
||||
let client = await provider.client
|
||||
return await client.eth_blockNumber()
|
||||
|
@ -46,3 +63,15 @@ method call*(provider: JsonRpcProvider,
|
|||
tx: Transaction): Future[seq[byte]] {.async.} =
|
||||
let client = await provider.client
|
||||
return await client.eth_call(tx)
|
||||
|
||||
# Signer
|
||||
|
||||
method getAddress*(signer: JsonRpcSigner): Future[Address] {.async.} =
|
||||
if address =? signer.address:
|
||||
return address
|
||||
|
||||
let accounts = await signer.provider.listAccounts()
|
||||
if accounts.len > 0:
|
||||
return accounts[0]
|
||||
|
||||
raiseProviderError "no address found"
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
import ./basics
|
||||
|
||||
export basics
|
||||
|
||||
type Signer* = ref object of RootObj
|
||||
|
||||
method getAddress*(signer: Signer): Future[Address] {.base, async.} =
|
||||
doAssert false, "not implemented"
|
|
@ -1,4 +1,5 @@
|
|||
import ./testJsonRpcProvider
|
||||
import ./testJsonRpcSigner
|
||||
import ./testContracts
|
||||
|
||||
{.warning[UnusedImport]:off.}
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
import pkg/asynctest
|
||||
import pkg/ethers
|
||||
|
||||
suite "JsonRpcSigner":
|
||||
|
||||
var provider: JsonRpcProvider
|
||||
|
||||
setup:
|
||||
provider = JsonRpcProvider.new()
|
||||
|
||||
test "is connected to the first account of the provider by default":
|
||||
let signer = provider.getSigner()
|
||||
check (await signer.getAddress()) == (await provider.listAccounts())[0]
|
||||
|
||||
test "can connect to a different account":
|
||||
let account = (await provider.listAccounts())[1]
|
||||
let signer = provider.getSigner(account)
|
||||
check (await signer.getAddress()) == account
|
Loading…
Reference in New Issue