JSON-RPC API

dApps can get account status, send transactions, and call other functions via zkLink API.

The zkLink API follows the JSON-RPC standard and is accessed via POST.

API OVERVIEW

JSON-RPC API METHODS

getSupportChains

Get the configuration of all supported chains.

Parameters

None

{
    "id": 1,
    "jsonrpc": "2.0",
    "method": "getSupportChains",
    "params": []
}

ChainResp

FieldTypeDescription

chainId

uint32

Defined by zkLink

chainType

uint8

Defined by zkLink {0:"EVM", 1:"STARKNET"}

layerOneChainId

uint32

The chain ID of L1 blockchains

mainContract

address(EVM|StarkNet)

The address of zkLink main contract that interacts with the rest module contracts

layerZeroContract

address(EVM|StarkNet)

The address of layerZero bridge that syncs L1 states

web3Url

string

The url of L1 RPC

feeCap

unit

The max transaction fee when L1 RPC send the transaction

gasTokenId

uint32

The id of the gas token, defined by zkLink

validator

address(EVM|StarkNet)

Validator address

getSupportTokens

Get the data of all tokens with on-chain contract addresses.

Parameters

None

{
    "id": 1,
    "jsonrpc": "2.0",
    "method": "getSupportTokens",
    "params": []
}

It returns a HashMap<TokenId,TokenResp>, which has a unique token id and is used for all token-related queries in the RPC service. Symbols are used only for display on the UI and do not promise uniqueness.

TokenResp

FieldDescription

id

Token id

symbol

Token symbol

usdPrice

Token price

chains

HashMap<ChainId,ChainTokenResp> that includes the contract addresses on each chain

ChainTokenResp

FieldDescription

chainId

Defined by zkLink

address

The on-chain contract address of the token

decimals

The decimals of the token on L1

fastWithdraw

Whether the token supports fast withdraw

The decimal is the accuracy of the token on L1, which is not always 18 (6 for USDC and 18 for ZKL), and varies on different chains for the same token (6 for USDC on Ethereum and 18 for USDC on BSC).

When a user deposits to zkLink from connected networks, the front-end needs to calculate the amount required for calling the contract according to the accuracy:

var amount_of_user_input = 1.0 // input from the user
var amount_to_call_contract = amount_of_user_input * 10 ** token.decimals // the parameter during calling the contract
// Example
// A user deposits 2 USDC, the parameter is 2 * 10^6
// A user deposits 5 ZKL, the parameter is 5 * 10^18

getLatestBlockNumber

Get the latest block height info.

Parameters

None

{
    "id": 1,
    "jsonrpc": "2.0",
    "method": "getLatestBlockNumber",
    "params": []
}

BlockNumberResp

FieldDescription

lastBlockNumber

The block height of the latest batch

timestamp

The timestamp of the last block

committed

The block height of the latest block committed to L1

verified

The block height of the latest block executed on L1

getBlockByNumber

Get the block info by block height.

Parameters

  • blockNumber: the block height, and returns the latest block height if null

  • includeTx : whether contains transaction details: returns transaction hash if false. only successful transactions will be included in a block. call getTransactionByHash to query the failed transactions.

  • includeUpdate: whether contains the state change by transactions; valid only when includeTx is true.

{
    "id": 1,
    "jsonrpc": "2.0",
    "method": "getBlockByNumber",
    "params": [
      123, 
      true, 
      true 
    ]
}

BlockResp

FieldDescription

number

The block height

commitment

The commitment of the block, similar to the block hash of Ethereum

rootHash

The root hash of the state tree

feeAccountId

The id of the fee account

blockSize

The maximum chunk number that a block can contain

opsCompositionNumber

The vk of generating ZKPs

timestamp

The block timestamp

transactions

Returns [BlockTxResp] when includeTx is false, TxResp when true; ordered by transaction execution: the ones executed first come first in the array

BlockTxResp

FieldDescription

txHash

The transaction hash

tx

ZkLinkTx

executedTimestamp

The unix timestamp of transaction execution

updates

[StateUpdateResp], ordered by updateId: the ones executed first come first in the array

StateUpdateResp

The success of transaction execution will lead to the change of the state tree:

  • AccountCreate: create a new account in the state tree

  • AccountChangePubkeyUpdate: change in pubkey and nonce

  • BalanceUpdate: change in account balance and nonce

  • OrderUpdate: change in account slot

AccountCreate

FieldDescription

type

AccountCreate

updateId

The position of the update in the block

accountId

The id of the new account

address

The account address

Example:

{
  "type": "AccountCreate",
  "updateId": 40,
  "accountId": 42,
  "address": "0xe4efc3d7b69a19d3ae574cbc2915ddf598efe43f"
}

Transactions that may generate AccountCreate include:

  • Deposit

  • Transfer

AccountChangePubkeyUpdate

FieldDescription

type

AccountChangePubkeyUpdate

updateId

The position of the update in the block

accountId

The account id

oldPubkeyHash

The old pubkeyHash

newPubkeyHash

The new pubkeyHash

oldNonce

The old nonce

newNonce

The new nonce

Example:

{
  "type": "AccountChangePubkeyUpdate",
  "updateId": 10,
  "accountId": 39,
  "oldPubkeyHash": "0x0000000000000000000000000000000000000000",
  "newPubkeyHash": "0xbfb4f4a68dc9e49f7785082a8c12354ed663b6e0",
  "oldNonce": 0,
  "newNonce": 1
}

only ChangePubKey will generate AccountChangePubkeyUpdate

BalanceUpdate

FieldDescription

type

BalanceUpdate

updateId

The position of the update in the block

accountId

The account id

subAccountId

The id of the sub account

coinId

Token id

oldBalance

The balance of the sub account before change

newBalance

The balance of the sub account after change

oldNonce

The old nonce

newNonce

The new nonce

Example:

{
  "type": "BalanceUpdate",
  "updateId": 1,
  "accountId": 2,
  "subAccountId": 1,
  "coinId": 18,
  "oldBalance": "66517000000000000",
  "newBalance": "66518000000000000",
  "oldNonce": 66518,
  "newNonce": 66519
}

All ZkLinkTx will generate BalanceUpdate

OrderUpdate

FieldDescription

type

OrderUpdate

updateId

The position of the update in the block

accountId

The account id

subAccountId

The id of the sub account

coinId

Token id

oldTidyOrder

The TidyOrder before change

newTidyOrder

The TidyOrder after change

TidyOrder

FieldDescription

nonce

Slot nonce

residue

Slot residue

Example:

{
  "type": "OrderUpdate",
  "updateId": 30,
  "accountId": 11,
  "subAccountId": 1,
  "slotId": 27,
  "oldTidyOrder": {
    "nonce": 14,
    "residue": "4607200000000000000000"
  },
  "newTidyOrder": {
    "nonce": 14,
    "residue": "4233800000000000000000"
  }
}

Only OrderMatching will generate OrderUpdate

getPendingBlock

Get info of transactions waiting to be batched.

Parameters

  • transaction execution time, the timestamp in the return can only be bigger than it.

  • includeTx: whether to include transaction details. False: return transaction hash only. Only successful transactions will be batched in the block. Call getTransactionByHash to query failed transaction details.

  • includeUpdate: whether to include the state change by the transaction. Valid only when includeTx is true.

{
    "id": 1,
    "jsonrpc": "2.0",
    "method": "getPendingBlock",
    "params": [
      1689731233,
      true,
      true
    ]
}

getBlockOnChainByNumber

Get transaction information in a block executed on L1 blockchains. Every block will be submitted to and executed on every L1 chain.

Parameters

  • chain_id

{
    "id": 1,
    "jsonrpc": "2.0",
    "method": "getBlockOnChainByNumber",
    "params": [4906]
}

BlockOnChainResp

FieldDescription

committed

Transaction info committed to L1, with type OnChainResp

verified

Transaction info executed on L1, with type OnChainResp

OnChainResp

FieldDescription

chain_id

The chain id defined by zkLink

tx_hash

The hash of the transaction on L1 blockchains

Noted that since blocks are committed to and executed on L1 blockchains in batches, the on-chain data of blocks in the same batch is the same. For example, when blocks [4906, 4910] are in the same batch, their on-chain transaction info is the same.

Commitment and batching are asynchronous. For example, when the current block height is 1000, the committed block height can be 980, and the verified block height can be 950. The API caller should query the on-chain infor by the committed and verified block height via getLatestBlockNumber. For example, when the latest verified block height is 950, the return of the on-chain block info that is after 950 must be null.

getAccount

Get account info by address or account id.

Parameters

  • Address|AccountID - Address(20Bytes or 32Bytes) or integer account id.

{
    "id": 1,
    "jsonrpc": "2.0",
    "method": "getAccount",
    "params": [
        "0x1aef2b4c06b83cdb2783d3458cdbf3886a6ae7d4"
    ]
}

AccountInfoResp

FieldDescription

id

Account id

address

Account address

nonce

Account nonce

pubKeyHash

Account pubKeyHash

subAccountNonces

Nonce of the subaccount, HashMap<SubAccountId,Nonce>

pubKeyHash being 0x0000000000000000000000000000000000000000 means unactivated account.

getAccountBalances

Get the balance info of an account.

Parameters:

  • accountId: account id

  • subAccountId: optional, the id of the subaccount; null if the query requests the balance of all subaccounts.

{
    "id": 1,
    "jsonrpc": "2.0",
    "method": "getAccountBalances",
    "params": [
        1,
        0
    ]
}

getAccountOrderSlots

Get the order slot of an account.

Parameters

  • accountId: account id

  • subAccountId: optional, the id of the subaccount; null if the query requests the balance of all subaccounts.

{
    "id": 1,
    "jsonrpc": "2.0",
    "method": "getAccountOrderSlots",
    "params": [
        1,
        null
    ]
}

getTokenReserve

Get the withdrawable limit of a token on a certain L1 chain. There are 3 cases:

Case 1

User Input:

Token: ZKL

Withdraw to: ETH

The maximum ZKL that the user can withdraw:

RPC-API tokenId: ZKL, false

Case 2

User Input:

Token: USDC

Withdraw to: ETH

The maximum USDC that the user can withdraw:

RPC-API tokenId: USDC, false

Case 3

User Input:

Token: USD

Withdraw to: ETH

Withdraw as: USDC

The maximum USDC that the user can withdraw:

RPC-API tokenId: USDC, true

Parameters

  • tokenId: tokenId

  • mapping: whether to query mapping, valid only when tokenId corresponds to USD stable.

{
    "id": 1,
    "jsonrpc": "2.0",
    "method": "getTokenReserve",
    "params": [
      17,
      true
    ]
}

getAccountSnapshot

In zkLink v0.4.0, transactions are executed before being batched, thus the APIs that request account states may not return the states in the latest block. The related APIs include:

  • getAccount

  • getAccountBalances

  • getAccountOrderSlots

  • getTokenReserve

getAccountSnapshot is introduced to request the account states of a certain block height, including the basic info, balance info, and order slot info.

Parameters:

  • accountAddress or accountId

  • subAccountId: optional, the id of the subaccount; null if the query requests the balance of all subaccounts.

  • blockNumber: optional, null to return the latest block snapshot

{
    "id": 1,
    "jsonrpc": "2.0",
    "method": "getAccountSnapshot",
    "params": [
      10,
      1,
      103
    ]
}

AccountSnapshotResp

FieldDescription

id

Account id

address

Account address

nonce

Account nonce

pubKeyHash

Account pubKeyHash

subAccountNonces

Nonce of the subaccount, HashMap<SubAccountId,Nonce>

balances

HashMap<SubAccountId,<TokenId,Balance>>

orderSlots

HashMap<SubAccountId,<SlotId, TidyOrder>>

blockNumber

The block height of the snapshot

getTransactionByHash

Get transaction info.

Parameters:

  • txHash

  • includeUpdate: whether to include the state change by the transaction

{
    "id": 1,
    "jsonrpc": "2.0",
    "method": "getTransactionByHash",
    "params": [
        "0x3210bb3d6719d730b30c4c9a0086d507040e25f83bea4ff4b8c2c91bf8e8c4f9",
      	true
    ]
}

TxResp

FieldDecription

txHash

The trasnaction hash

tx

ZkLinkTx

receipt

The execution receipt of the transaction

updates

[StateUpdateResp] that is ordered by updateId: the ones generated first come first in the array

TxReceiptResp

FieldDecription

executed

Whether the transaction is executed

executedTimestamp

The unix timestamp of exection time. Null if executed is false

success

The result of the transaction. If executed is false, it must be false

failReason

The reason of failure of the transaction. Null if success is True.

block

The block height of the transaction. 0 if success is False.

index

The index of the transaction in the block. 0 if success is False.

getAccountTransactionHistory

Get account history in descending order of the transaction id in the database. Current only Deposit, Withdraw, and Transfer are supported.

Parameters

  • Deposit, Withdraw or Transfer

  • account address

  • the page index, starting from 0

  • the page size

{
    "id": 1,
    "jsonrpc": "2.0",
    "method": "getAccountTransactionHistory",
    "params": [
        "Deposit",
        "0xdc9c9863167ee865edd5216964b8b99d43ee7a81",
      	0,
        100
    ]
}

Page<ZkLinkTxHistory>

FieldDescription

totalPageNum

The number of pages

pageIndex

Index of the current page

pageSize

The size of the page

pageData

Page data[ZkLinkTxHistory]

ZkLinkHistory

FieldDescription

chainId

Chain id defined by zkLink

  • Deposit: the chain that the deposit is from

  • Transfer and Withdraw: no specific meaning

fromAccount

Address of from_account

  • Deposit: the L1 address that the deposit is from

  • Transfer: the from_address of the transfer

  • Withdraw: the from_address of the withdraw

toAccount

Address of to_account

  • Deposit: L2 address that the deposit is to

  • Transfer: the to_address of the transfer

  • Withdraw: the L1 address that the withdraw is to

amount

The amount of the transaction

  • Deposit: the amount of the deposit

  • Transfer: the amount of the transfer

  • Withdraw: the amount of the withdraw

nonce

The nonce of the transaction

  • Deposit: the serialId of L1 event

  • Transfer and Withdraw: the nonce of the transaction

tx

ZkLinkTx

txHash

The hash of the transaction

txReceipt

TxReceiptResp

createdAt

The time that the transaction is received by zkLink

Deposit: returns the transaction history of which the account address equals to_address;

Withdraw: returns the transaction history of which the account address equals from_address;

Transfer: returns the transaction history of which the account address equals either to_address or from_address.

getWithdrawTxs

Get transaction info of withdraw transactions.

Parameters:

  • lastTxTimestamp: ISO 8601 standard with date, time, and time zone;

  • maxTxs: the max value of the number of Withdraw in the return.

{
    "id": 1,
    "jsonrpc": "2.0",
    "method": "getWithdrawTxs",
    "params": [
        "2023-02-03T16:41:10.744899Z",
        10
    ]
}

FastWithdrawTxResp

FieldDescription

txHash

Transaction hash on zkLink

tx

zkLink transaction

executedTimestamp

The execution timestamp of the transaction

zkLink will scan the maxTxs number of executed withdraw transactions, and returns the fast_withdraw transactions among which; thus the number of returns might be less than maxTxs, even be 0.

In the first scan, lastTxTimestamp can be set as 0 to scan from the beginning. Then the executedTimestamp of the last record can be used as the lastTxTimestamp of the next scan.

getEthProperty

Get all the information about the Ethereum property.

FieldDescription

chainId

Chain id defined by zkLink

layerOneChainId

The layer 1 chain id

gateways

The list of GateWayInfo

GateWayInfo

FieldDescription

chainId

the chain id

chainId

the chain id

l1GatewayContract

the layer 1 gateway contract address

l2GatewayContract

the layer 2 gateway contract address

tokens

the list that all the TokenInfo on the gateway

TokenInfo

FieldDescription

tokenId

The token id

tokenAddress

token address

decimal

the token amount decimal

fastWithdraw

support fast withdraw or not

{
  "chainId": 4,
  "layerOneChainId": "0x1",
  "gateways": [
    {
      "chainId": 5,
      "l1GatewayContract": "0x3498f456645270ee003441df82c718b56c0e6666",
      "l2GatewayContract": "0x3498f456645270ee003441df82c718b56c0e6666",
      "tokens": [
        {
          "tokenId": 1,
          "tokenAddress":"0x3498f456645270ee003441df82c718b56c0e6666",
          "decimal": 6,
          "fastWithdraw": true
        },
        {
          "tokenId": 3,
          "tokenAddress":"0x3498f456645270ee003441df82c718b56c0e6666",
          "decimal": 7,
          "fastWithdraw": false
        }
      ]
    },
    {
      "chainId": 7,
      "l1GatewayContract": "0x3498f456645270ee003441df82c718b56c0e6666",
      "l2GatewayContract": "0x3498f456645270ee003441df82c718b56c0e6666",
      "tokens": [
        {
          "tokenId": 1,
          "tokenAddress":"0x3498f456645270ee003441df82c718b56c0e6666",
          "decimal": 6,
          "fastWithdraw": true
        },
        {
          "tokenId": 3,
          "tokenAddress":"0x3498f456645270ee003441df82c718b56c0e6666",
          "decimal": 6,
          "fastWithdraw": false
        }
      ]
    }
  ]
}

sendTransaction

Submit L2 transaction and return transaction hash.

Parameters:

  • ZkLinkTx: L2 transaction

  • Layer1Signature: layer1 signature with type Option<TxLayer1Signature>; required for Layer2 transactions apart from ChangePubKey or OrderMatching.

  • submitterSignature: Option<ZkLinkSignature>, required only when the transaction involves subaccounts (except #0 subaccount); submitterSignature is a zk signature to tx hash.

{
    "id": 1,
    "jsonrpc": "2.0",
    "method": "sendTransaction",
    "params": [
        {
            "accountId": 8,
            "fromSubAccountId": 3,
            "toSubAccountId": 3,
            "from": "0x3498F456645270eE003441df82C718b56c0e6666",
            "to": "0xbfDa941Bd2a0eddB57b10f8E8d3486A738B92cCC",
            "tokenId": 3,
            "amount": "998000000000000000",
            "fee": "3000000000000000",
            "ts": 1646101085,
            "nonce": 1,
            "type": "Transfer",
            "token": 3,
            "signature": {
                "pubKey": "0dd4f603531bd78bbecd005d9e7cc62a794dcfadceffe03e269fbb6b72e9c724",
                "signature": "892c622afac908201df54a3cfdecf8eba46d5411bdc29365f5536f024c195f2893d6313a6371fe1659830e2560c1eaedbafcc835837593d017cd557074f0bb03"
            }
        },
        {
            "type": "EthereumSignature",
            "signature": "0xc29d647a5e9e078c66594f04881c34d6b57e1085ab825f17ffb1d0fe233e9834191b374daaaf1e44e5749f6cf44f2143799373fc5e7e844d48fec5e6bc08f0651b"
        },
      	null
    ]
}

TxLayer1Signature

L1 signatures apply EIP-191 specification with zkLink Eth sig message.

FieldDescription

type

The type of the signature

  • EthereumSignature: Ethereum ECDSA signature

  • EIP1271Signature: Ethereum EIP1271 signature

signature

Signature output, a hex string

Examples:

{
  "type": "EthereumSignature",
  "signature": "0xc29d647a5e9e078c66594f04881c34d6b57e1085ab825f17ffb1d0fe233e9834191b374daaaf1e44e5749f6cf44f2143799373fc5e7e844d48fec5e6bc08f0651b"
}
{
  "type": "EIP1271Signature",
  "signature": "0xc29d647a5e9e078c66594f04881c34d6b57e1085ab825f17ffb1d0fe233e9834191b374daaaf1e44e5749f6cf44f2143799373fc5e7e844d48fec5e6bc08f0651b"
}

ZkLinkSignature

Signatures for L2 transactions use zkLink Encode.

FieldDescription

pubKey

The public key of ,a hex string with 0x prefix

signature

Signature output, a hex string without 0x prefix

Example:

{
  "pubKey": "0x0dd4f603531bd78bbecd005d9e7cc62a794dcfadceffe03e269fbb6b72e9c724",
  "signature": "892c622afac908201df54a3cfdecf8eba46d5411bdc29365f5536f024c195f2893d6313a6371fe1659830e2560c1eaedbafcc835837593d017cd557074f0bb03"
}

version: 7df6cd1

Last updated