Register a resolver
curl --request POST \
--url https://relay-production-f175.up.railway.app/v1/resolvers/register \
--header 'Content-Type: application/json' \
--data '
{
"chainId": 123,
"address": {},
"name": "<string>",
"alertEmail": "<string>",
"region": "<string>",
"signerType": "<string>",
"issuedAt": 123,
"signature": {}
}
'import requests
url = "https://relay-production-f175.up.railway.app/v1/resolvers/register"
payload = {
"chainId": 123,
"address": {},
"name": "<string>",
"alertEmail": "<string>",
"region": "<string>",
"signerType": "<string>",
"issuedAt": 123,
"signature": {}
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
chainId: 123,
address: {},
name: '<string>',
alertEmail: '<string>',
region: '<string>',
signerType: '<string>',
issuedAt: 123,
signature: {}
})
};
fetch('https://relay-production-f175.up.railway.app/v1/resolvers/register', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://relay-production-f175.up.railway.app/v1/resolvers/register",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'chainId' => 123,
'address' => [
],
'name' => '<string>',
'alertEmail' => '<string>',
'region' => '<string>',
'signerType' => '<string>',
'issuedAt' => 123,
'signature' => [
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://relay-production-f175.up.railway.app/v1/resolvers/register"
payload := strings.NewReader("{\n \"chainId\": 123,\n \"address\": {},\n \"name\": \"<string>\",\n \"alertEmail\": \"<string>\",\n \"region\": \"<string>\",\n \"signerType\": \"<string>\",\n \"issuedAt\": 123,\n \"signature\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://relay-production-f175.up.railway.app/v1/resolvers/register")
.header("Content-Type", "application/json")
.body("{\n \"chainId\": 123,\n \"address\": {},\n \"name\": \"<string>\",\n \"alertEmail\": \"<string>\",\n \"region\": \"<string>\",\n \"signerType\": \"<string>\",\n \"issuedAt\": 123,\n \"signature\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://relay-production-f175.up.railway.app/v1/resolvers/register")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"chainId\": 123,\n \"address\": {},\n \"name\": \"<string>\",\n \"alertEmail\": \"<string>\",\n \"region\": \"<string>\",\n \"signerType\": \"<string>\",\n \"issuedAt\": 123,\n \"signature\": {}\n}"
response = http.request(request)
puts response.read_body{
"address": {},
"registeredAt": "<string>",
"requireRegistration": true
}Resolvers
Register a resolver
Self-serve registration signed by the resolver key. What panofx-node register sends.
POST
/
v1
/
resolvers
/
register
Register a resolver
curl --request POST \
--url https://relay-production-f175.up.railway.app/v1/resolvers/register \
--header 'Content-Type: application/json' \
--data '
{
"chainId": 123,
"address": {},
"name": "<string>",
"alertEmail": "<string>",
"region": "<string>",
"signerType": "<string>",
"issuedAt": 123,
"signature": {}
}
'import requests
url = "https://relay-production-f175.up.railway.app/v1/resolvers/register"
payload = {
"chainId": 123,
"address": {},
"name": "<string>",
"alertEmail": "<string>",
"region": "<string>",
"signerType": "<string>",
"issuedAt": 123,
"signature": {}
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
chainId: 123,
address: {},
name: '<string>',
alertEmail: '<string>',
region: '<string>',
signerType: '<string>',
issuedAt: 123,
signature: {}
})
};
fetch('https://relay-production-f175.up.railway.app/v1/resolvers/register', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://relay-production-f175.up.railway.app/v1/resolvers/register",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'chainId' => 123,
'address' => [
],
'name' => '<string>',
'alertEmail' => '<string>',
'region' => '<string>',
'signerType' => '<string>',
'issuedAt' => 123,
'signature' => [
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://relay-production-f175.up.railway.app/v1/resolvers/register"
payload := strings.NewReader("{\n \"chainId\": 123,\n \"address\": {},\n \"name\": \"<string>\",\n \"alertEmail\": \"<string>\",\n \"region\": \"<string>\",\n \"signerType\": \"<string>\",\n \"issuedAt\": 123,\n \"signature\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://relay-production-f175.up.railway.app/v1/resolvers/register")
.header("Content-Type", "application/json")
.body("{\n \"chainId\": 123,\n \"address\": {},\n \"name\": \"<string>\",\n \"alertEmail\": \"<string>\",\n \"region\": \"<string>\",\n \"signerType\": \"<string>\",\n \"issuedAt\": 123,\n \"signature\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://relay-production-f175.up.railway.app/v1/resolvers/register")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"chainId\": 123,\n \"address\": {},\n \"name\": \"<string>\",\n \"alertEmail\": \"<string>\",\n \"region\": \"<string>\",\n \"signerType\": \"<string>\",\n \"issuedAt\": 123,\n \"signature\": {}\n}"
response = http.request(request)
puts response.read_body{
"address": {},
"registeredAt": "<string>",
"requireRegistration": true
}Registration proves the operator controls the signing key and records the name, region and alert email.
There is no review. Re-sending it updates the record.
number
required
The chain the node quotes; binds the signature to this relay.
address
required
The resolver’s identity.
string
required
1 to 64 characters. Public.
string
Up to 254 characters. Private.
string
Up to 32 characters. Informational.
string
required
keyfile, turnkey or mpcvault.number
required
Unix seconds. Checked for freshness.
hex
required
EIP-191 over
panofx-register|<chainId>|<address>|<name>|<alertEmail>|<region>|<issuedAt>.address
string
boolean
Whether the relay admits only registered resolvers.
401 bad_signature; 400 with a detail for a stale issuedAt or an invalid field; 429 rate_limited.
