JSON-RPC basics
JSON-RPC API introduction
All Vega Wallet software supports a JSON-RPC API to manage the wallets and their keys, and sign and send transactions. It's the core of the wallet backend and is consistent across implementations.
Read the JSON-RPC specification ↗ for the standards and conventions.
id
propertyBe sure to specify the id
, in the JSON-RPC request, if you are interested in the response.
If the id
property is not set, no response will be returned, even on error.
See the JSON-RPC notification documentation for more details.
Namespaces
The methods of this JSON-RPC API are scoped in two namespaces: admin - methods starting with admin.
; and client - methods starting with client.
.
Admin namespace
The admin namespace exposes methods to administrate the wallets, the keys within them and their permissions, and the networks. It can also sign and send transactions. These methods are primarily meant to be consumed by wallet frontends only.
Third-party applications cannot access this namespace. The admin namespace is not accessible from the communication layer (the top level API) of the Vega Wallet software. Issuing the request targeting a method of the admin namespace from a third-party application will result in a rejection.
Therefore, as an example, if you want to programmatically create a wallet, you have 3 options:
- Use the command line (
vega wallet create
), if you have the Vega software available. We recommend using thejson
output flag in scripts. - Write your own software in Golang and use Vega code as a library.
- Reimplement the wallet creation from scratch using the technology of you choice.
Client namespace
The client namespace exposes methods that primarily support third-party connections and transaction signing and sending.
This is the only namespace that is fully accessible by third-party applications.
The client namespace is made to reduce the amount of information given to third-party applications down to a minimum, on purpose.
Everything is done to prevent unmasking the user. As a result, the third-party application can only:
- List the public keys the users explicitly gave access to
- Get the chain ID of the network the user is connected to
- Request the sending, signing and checking of a transaction
Basic workflow
This example shows how a third-party application should use the JSON-RPC API.
- The app has to connect to the wallet using the method
client.connect_wallet
. The connection must be reviewed and approved by the user to succeed. Depending on the software you send this request to, you may have to go through extra steps, like retrieving a connection token from the response.
{
"jsonrpc": "2.0",
"method": "client.connect_wallet",
"id": "request_1"
}
- Once connected, list the keys the user selected for your application, using the method
client.list_keys
. That's an important step because sending a transaction requires the third-party application to specify the public key to use. This method relies on a permission system. As a result, the user has to grant your app access to their keys. The permission access is requested only once per third-party application.
{
"jsonrpc": "2.0",
"method": "client.list_keys",
"id": "request_3"
}
- Once access to the keys has been granted, you can send a transaction using the method
client.send_transaction
. Once again the user will have to review and approve the transaction. Once approved, it can take some time for the wallet to bundle the transaction, sign, and send it. The transaction field below is set as an example.
{
"jsonrpc": "2.0",
"method": "client.send_transaction",
"params": {
"publicKey": "ONE_OF_THE_PUBLIC_KEY_FROM_THE_LIST_KEY_CALL",
"sendingMode": "TYPE_SYNC",
"transaction": {
"voteSubmission": {
"proposalId": "SOME_PROPOSAL_ID",
"value": "VALUE_YES"
}
}
},
"id": "request_3"
}
- Optional but highly recommended - Your application should expose a button to disconnect the wallet, calling the method
client.disconnect_wallet
:
{
"jsonrpc": "2.0",
"method": "client.disconnect_wallet",
"id": "request_4"
}