mirror of
https://github.com/status-im/nim-ethers.git
synced 2025-01-14 17:44:25 +00:00
2f97a03fe2
Allows specified number of transaction confirmations to be awaited before a transaction is considered finalised. Polls for a transaction receipt then listens for new blocks and calculates the number of blocks between the receipt and the new block. Notes 1. Only works with websockets currently 2. Replaced transaction not supported yet
87 lines
2.1 KiB
Nim
87 lines
2.1 KiB
Nim
import std/json
|
|
import std/strutils
|
|
import pkg/json_rpc/jsonmarshal
|
|
import pkg/stew/byteutils
|
|
import ../../basics
|
|
import ../../transaction
|
|
import ../../blocktag
|
|
import ../../provider
|
|
|
|
export jsonmarshal
|
|
|
|
func fromJson*(T: type, json: JsonNode, name = ""): T =
|
|
fromJson(json, name, result)
|
|
|
|
# byte sequence
|
|
|
|
func `%`*(bytes: seq[byte]): JsonNode =
|
|
%("0x" & bytes.toHex)
|
|
|
|
func fromJson*(json: JsonNode, name: string, result: var seq[byte]) =
|
|
result = hexToSeqByte(json.getStr())
|
|
|
|
# byte arrays
|
|
|
|
func `%`*[N](bytes: array[N, byte]): JsonNode =
|
|
%("0x" & bytes.toHex)
|
|
|
|
func fromJson*[N](json: JsonNode, name: string, result: var array[N, byte]) =
|
|
hexToByteArray(json.getStr(), result)
|
|
|
|
# Address
|
|
|
|
func `%`*(address: Address): JsonNode =
|
|
%($address)
|
|
|
|
func fromJson*(json: JsonNode, name: string, result: var Address) =
|
|
if address =? Address.init(json.getStr()):
|
|
result = address
|
|
else:
|
|
raise newException(ValueError, "\"" & name & "\"is not an Address")
|
|
|
|
# UInt256
|
|
|
|
func `%`*(integer: UInt256): JsonNode =
|
|
%("0x" & toHex(integer))
|
|
|
|
func fromJson*(json: JsonNode, name: string, result: var UInt256) =
|
|
result = UInt256.fromHex(json.getStr())
|
|
|
|
# Transaction
|
|
|
|
func `%`*(transaction: Transaction): JsonNode =
|
|
result = %{ "to": %transaction.to, "data": %transaction.data }
|
|
if sender =? transaction.sender:
|
|
result["from"] = %sender
|
|
if nonce =? transaction.nonce:
|
|
result["nonce"] = %nonce
|
|
if chainId =? transaction.chainId:
|
|
result["chainId"] = %chainId
|
|
if gasPrice =? transaction.gasPrice:
|
|
result["gasPrice"] = %gasPrice
|
|
if gasLimit =? transaction.gasLimit:
|
|
result["gas"] = %gasLimit
|
|
|
|
# BlockTag
|
|
|
|
func `%`*(blockTag: BlockTag): JsonNode =
|
|
%($blockTag)
|
|
|
|
# Log
|
|
|
|
func fromJson*(json: JsonNode, name: string, result: var Log) =
|
|
var data: seq[byte]
|
|
var topics: seq[Topic]
|
|
fromJson(json["data"], "data", data)
|
|
fromJson(json["topics"], "topics", topics)
|
|
result = Log(data: data, topics: topics)
|
|
|
|
# TransactionStatus
|
|
|
|
func fromJson*(json: JsonNode, name: string, result: var TransactionStatus) =
|
|
let val = fromHex[int](json.getStr)
|
|
result = TransactionStatus(val)
|
|
|
|
func `%`*(status: TransactionStatus): JsonNode =
|
|
%(status.int.toHex)
|