|
|
@ -74,7 +74,7 @@ when (NimMajor, NimMinor, NimPatch) >= (1, 6, 0):
|
|
|
|
{.push hint[XCannotRaiseY]: off.}
|
|
|
|
{.push hint[XCannotRaiseY]: off.}
|
|
|
|
else:
|
|
|
|
else:
|
|
|
|
{.push hint[XDeclaredButNotUsed]: off.}
|
|
|
|
{.push hint[XDeclaredButNotUsed]: off.}
|
|
|
|
|
|
|
|
|
|
|
|
proc toHash(n: Node): Hash256 =
|
|
|
|
proc toHash(n: Node): Hash256 =
|
|
|
|
result.data = hexToByteArray[32](n.stringVal)
|
|
|
|
result.data = hexToByteArray[32](n.stringVal)
|
|
|
|
|
|
|
|
|
|
|
@ -305,7 +305,7 @@ proc getTxAt(ctx: GraphqlContextRef, header: BlockHeader, index: int): RespResul
|
|
|
|
ok(respNull())
|
|
|
|
ok(respNull())
|
|
|
|
except CatchableError as e:
|
|
|
|
except CatchableError as e:
|
|
|
|
err("can't get transaction by index '$1': $2" % [$index, e.msg])
|
|
|
|
err("can't get transaction by index '$1': $2" % [$index, e.msg])
|
|
|
|
except Exception as em:
|
|
|
|
except RlpError as em:
|
|
|
|
err("can't get transaction by index '$1': $2" % [$index, em.msg])
|
|
|
|
err("can't get transaction by index '$1': $2" % [$index, em.msg])
|
|
|
|
|
|
|
|
|
|
|
|
proc getTxByHash(ctx: GraphqlContextRef, hash: Hash256): RespResult =
|
|
|
|
proc getTxByHash(ctx: GraphqlContextRef, hash: Hash256): RespResult =
|
|
|
@ -319,20 +319,28 @@ proc getTxByHash(ctx: GraphqlContextRef, hash: Hash256): RespResult =
|
|
|
|
err("can't get transaction by hash '$1': $2" % [hash.data.toHex, em.msg])
|
|
|
|
err("can't get transaction by hash '$1': $2" % [hash.data.toHex, em.msg])
|
|
|
|
|
|
|
|
|
|
|
|
proc accountNode(ctx: GraphqlContextRef, header: BlockHeader, address: EthAddress): RespResult =
|
|
|
|
proc accountNode(ctx: GraphqlContextRef, header: BlockHeader, address: EthAddress): RespResult =
|
|
|
|
let db = getStateDB(ctx.com, header)
|
|
|
|
try:
|
|
|
|
when false:
|
|
|
|
let db = getStateDB(ctx.com, header)
|
|
|
|
# EIP 1767 unclear about non existent account
|
|
|
|
when false:
|
|
|
|
# but hive test case demand something
|
|
|
|
# EIP 1767 unclear about non existent account
|
|
|
|
if not db.accountExists(address):
|
|
|
|
# but hive test case demand something
|
|
|
|
return ok(respNull())
|
|
|
|
if not db.accountExists(address):
|
|
|
|
let acc = db.getAccount(address)
|
|
|
|
return ok(respNull())
|
|
|
|
ok(accountNode(ctx, acc, address, db))
|
|
|
|
let acc = db.getAccount(address)
|
|
|
|
|
|
|
|
ok(accountNode(ctx, acc, address, db))
|
|
|
|
|
|
|
|
except RlpError as ex:
|
|
|
|
|
|
|
|
err(ex.msg)
|
|
|
|
|
|
|
|
|
|
|
|
proc parseU64(node: Node): uint64 =
|
|
|
|
proc parseU64(node: Node): uint64 =
|
|
|
|
for c in node.intVal:
|
|
|
|
for c in node.intVal:
|
|
|
|
result = result * 10 + uint64(c.int - '0'.int)
|
|
|
|
result = result * 10 + uint64(c.int - '0'.int)
|
|
|
|
|
|
|
|
|
|
|
|
{.pragma: apiPragma, cdecl, gcsafe, raises: [Defect, CatchableError], locks:0.}
|
|
|
|
when (NimMajor, NimMinor) < (1, 6):
|
|
|
|
|
|
|
|
{.pragma: apiRaises, raises: [Defect, CatchableError].}
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
{.pragma: apiRaises, raises: [].}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
{.pragma: apiPragma, cdecl, gcsafe, apiRaises, locks:0.}
|
|
|
|
{.push hint[XDeclaredButNotUsed]: off.}
|
|
|
|
{.push hint[XDeclaredButNotUsed]: off.}
|
|
|
|
|
|
|
|
|
|
|
|
proc validateHex(x: Node, minLen = 0): NodeResult =
|
|
|
|
proc validateHex(x: Node, minLen = 0): NodeResult =
|
|
|
@ -499,15 +507,23 @@ proc accountTxCount(ud: RootRef, params: Args, parent: Node): RespResult {.apiPr
|
|
|
|
proc accountCode(ud: RootRef, params: Args, parent: Node): RespResult {.apiPragma.} =
|
|
|
|
proc accountCode(ud: RootRef, params: Args, parent: Node): RespResult {.apiPragma.} =
|
|
|
|
let ctx = GraphqlContextRef(ud)
|
|
|
|
let ctx = GraphqlContextRef(ud)
|
|
|
|
let acc = AccountNode(parent)
|
|
|
|
let acc = AccountNode(parent)
|
|
|
|
let code = acc.db.getCode(acc.address)
|
|
|
|
try:
|
|
|
|
resp(code)
|
|
|
|
let code = acc.db.getCode(acc.address)
|
|
|
|
|
|
|
|
resp(code)
|
|
|
|
|
|
|
|
except RlpError as ex:
|
|
|
|
|
|
|
|
err(ex.msg)
|
|
|
|
|
|
|
|
|
|
|
|
proc accountStorage(ud: RootRef, params: Args, parent: Node): RespResult {.apiPragma.} =
|
|
|
|
proc accountStorage(ud: RootRef, params: Args, parent: Node): RespResult {.apiPragma.} =
|
|
|
|
let ctx = GraphqlContextRef(ud)
|
|
|
|
let ctx = GraphqlContextRef(ud)
|
|
|
|
let acc = AccountNode(parent)
|
|
|
|
let acc = AccountNode(parent)
|
|
|
|
let slot = parse(params[0].val.stringVal, UInt256, radix = 16)
|
|
|
|
try:
|
|
|
|
let (val, _) = acc.db.getStorage(acc.address, slot)
|
|
|
|
let slot = parse(params[0].val.stringVal, UInt256, radix = 16)
|
|
|
|
byte32Node(val)
|
|
|
|
let (val, _) = acc.db.getStorage(acc.address, slot)
|
|
|
|
|
|
|
|
byte32Node(val)
|
|
|
|
|
|
|
|
except RlpError as ex:
|
|
|
|
|
|
|
|
err(ex.msg)
|
|
|
|
|
|
|
|
except ValueError as ex:
|
|
|
|
|
|
|
|
err(ex.msg)
|
|
|
|
|
|
|
|
|
|
|
|
const accountProcs = {
|
|
|
|
const accountProcs = {
|
|
|
|
# Note: Need to define it as ResolverProc else a proc with noSideEffect is
|
|
|
|
# Note: Need to define it as ResolverProc else a proc with noSideEffect is
|
|
|
@ -899,8 +915,11 @@ proc blockTransactions(ud: RootRef, params: Args, parent: Node): RespResult {.ap
|
|
|
|
proc blockTransactionAt(ud: RootRef, params: Args, parent: Node): RespResult {.apiPragma.} =
|
|
|
|
proc blockTransactionAt(ud: RootRef, params: Args, parent: Node): RespResult {.apiPragma.} =
|
|
|
|
let ctx = GraphqlContextRef(ud)
|
|
|
|
let ctx = GraphqlContextRef(ud)
|
|
|
|
let h = HeaderNode(parent)
|
|
|
|
let h = HeaderNode(parent)
|
|
|
|
let index = parseU64(params[0].val)
|
|
|
|
try:
|
|
|
|
getTxAt(ctx, h.header, index.int)
|
|
|
|
let index = parseU64(params[0].val)
|
|
|
|
|
|
|
|
getTxAt(ctx, h.header, index.int)
|
|
|
|
|
|
|
|
except ValueError as ex:
|
|
|
|
|
|
|
|
err(ex.msg)
|
|
|
|
|
|
|
|
|
|
|
|
proc blockLogs(ud: RootRef, params: Args, parent: Node): RespResult {.apiPragma.} =
|
|
|
|
proc blockLogs(ud: RootRef, params: Args, parent: Node): RespResult {.apiPragma.} =
|
|
|
|
let ctx = GraphqlContextRef(ud)
|
|
|
|
let ctx = GraphqlContextRef(ud)
|
|
|
@ -910,8 +929,11 @@ proc blockLogs(ud: RootRef, params: Args, parent: Node): RespResult {.apiPragma.
|
|
|
|
proc blockAccount(ud: RootRef, params: Args, parent: Node): RespResult {.apiPragma.} =
|
|
|
|
proc blockAccount(ud: RootRef, params: Args, parent: Node): RespResult {.apiPragma.} =
|
|
|
|
let ctx = GraphqlContextRef(ud)
|
|
|
|
let ctx = GraphqlContextRef(ud)
|
|
|
|
let h = HeaderNode(parent)
|
|
|
|
let h = HeaderNode(parent)
|
|
|
|
let address = hexToByteArray[20](params[0].val.stringVal)
|
|
|
|
try:
|
|
|
|
ctx.accountNode(h.header, address)
|
|
|
|
let address = hexToByteArray[20](params[0].val.stringVal)
|
|
|
|
|
|
|
|
ctx.accountNode(h.header, address)
|
|
|
|
|
|
|
|
except ValueError as ex:
|
|
|
|
|
|
|
|
err(ex.msg)
|
|
|
|
|
|
|
|
|
|
|
|
const
|
|
|
|
const
|
|
|
|
fFrom = 0
|
|
|
|
fFrom = 0
|
|
|
@ -1122,13 +1144,16 @@ proc pickBlockNumber(ctx: GraphqlContextRef, number: Node): BlockNumber =
|
|
|
|
|
|
|
|
|
|
|
|
proc queryAccount(ud: RootRef, params: Args, parent: Node): RespResult {.apiPragma.} =
|
|
|
|
proc queryAccount(ud: RootRef, params: Args, parent: Node): RespResult {.apiPragma.} =
|
|
|
|
let ctx = GraphqlContextRef(ud)
|
|
|
|
let ctx = GraphqlContextRef(ud)
|
|
|
|
let address = hexToByteArray[20](params[0].val.stringVal)
|
|
|
|
try:
|
|
|
|
let blockNumber = pickBlockNumber(ctx, params[1].val)
|
|
|
|
let address = hexToByteArray[20](params[0].val.stringVal)
|
|
|
|
let hres = getBlockByNumber(ctx, blockNumber)
|
|
|
|
let blockNumber = pickBlockNumber(ctx, params[1].val)
|
|
|
|
if hres.isErr:
|
|
|
|
let hres = getBlockByNumber(ctx, blockNumber)
|
|
|
|
return hres
|
|
|
|
if hres.isErr:
|
|
|
|
let h = HeaderNode(hres.get())
|
|
|
|
return hres
|
|
|
|
accountNode(ctx, h.header, address)
|
|
|
|
let h = HeaderNode(hres.get())
|
|
|
|
|
|
|
|
accountNode(ctx, h.header, address)
|
|
|
|
|
|
|
|
except ValueError as ex:
|
|
|
|
|
|
|
|
err(ex.msg)
|
|
|
|
|
|
|
|
|
|
|
|
proc queryBlock(ud: RootRef, params: Args, parent: Node): RespResult {.apiPragma.} =
|
|
|
|
proc queryBlock(ud: RootRef, params: Args, parent: Node): RespResult {.apiPragma.} =
|
|
|
|
let ctx = GraphqlContextRef(ud)
|
|
|
|
let ctx = GraphqlContextRef(ud)
|
|
|
@ -1151,7 +1176,8 @@ proc queryBlocks(ud: RootRef, params: Args, parent: Node): RespResult {.apiPragm
|
|
|
|
let toNumber = pickBlockNumber(ctx, to)
|
|
|
|
let toNumber = pickBlockNumber(ctx, to)
|
|
|
|
|
|
|
|
|
|
|
|
if fromNumber > toNumber:
|
|
|
|
if fromNumber > toNumber:
|
|
|
|
return err("from($1) is bigger than to($2)" % [fromNumber.toString, toNumber.toString])
|
|
|
|
return err("from(" & fromNumber.toString &
|
|
|
|
|
|
|
|
") is bigger than to(" & toNumber.toString & ")")
|
|
|
|
|
|
|
|
|
|
|
|
# TODO: what is the maximum number here?
|
|
|
|
# TODO: what is the maximum number here?
|
|
|
|
if toNumber - fromNumber > 32.toBlockNumber:
|
|
|
|
if toNumber - fromNumber > 32.toBlockNumber:
|
|
|
@ -1176,8 +1202,11 @@ proc queryPending(ud: RootRef, params: Args, parent: Node): RespResult {.apiPrag
|
|
|
|
|
|
|
|
|
|
|
|
proc queryTransaction(ud: RootRef, params: Args, parent: Node): RespResult {.apiPragma.} =
|
|
|
|
proc queryTransaction(ud: RootRef, params: Args, parent: Node): RespResult {.apiPragma.} =
|
|
|
|
let ctx = GraphqlContextRef(ud)
|
|
|
|
let ctx = GraphqlContextRef(ud)
|
|
|
|
let hash = toHash(params[0].val)
|
|
|
|
try:
|
|
|
|
getTxByHash(ctx, hash)
|
|
|
|
let hash = toHash(params[0].val)
|
|
|
|
|
|
|
|
getTxByHash(ctx, hash)
|
|
|
|
|
|
|
|
except ValueError as ex:
|
|
|
|
|
|
|
|
err(ex.msg)
|
|
|
|
|
|
|
|
|
|
|
|
proc queryLogs(ud: RootRef, params: Args, parent: Node): RespResult {.apiPragma.} =
|
|
|
|
proc queryLogs(ud: RootRef, params: Args, parent: Node): RespResult {.apiPragma.} =
|
|
|
|
let ctx = GraphqlContextRef(ud)
|
|
|
|
let ctx = GraphqlContextRef(ud)
|
|
|
@ -1257,7 +1286,7 @@ type
|
|
|
|
names: array[QcNames, Name]
|
|
|
|
names: array[QcNames, Name]
|
|
|
|
|
|
|
|
|
|
|
|
proc calcQC(qc: QueryComplexity, field: FieldRef): int {.cdecl,
|
|
|
|
proc calcQC(qc: QueryComplexity, field: FieldRef): int {.cdecl,
|
|
|
|
gcsafe, raises: [Defect, CatchableError].} =
|
|
|
|
gcsafe, apiRaises.} =
|
|
|
|
let qc = EthQueryComplexity(qc)
|
|
|
|
let qc = EthQueryComplexity(qc)
|
|
|
|
if field.parentType.sym.name == qc.names[qcType] and
|
|
|
|
if field.parentType.sym.name == qc.names[qcType] and
|
|
|
|
field.field.name.name == qc.names[qcFields]:
|
|
|
|
field.field.name.name == qc.names[qcFields]:
|
|
|
|