Announcing your validator

Announcing information about your validator
Relayers need to know where to find your validator's signatures. You can make relayers aware of your validator by writing to the ValidatorAnnounce contract on the chain that you're validating.

Getting your validator's signed announcement

First, find the signed announcement JSON object automatically created by your validator. This is an attestation made by your validator indicating where its signatures can be found.
AWS S3 validators
Local validators
If you followed the AWS setup instructions, to find your signed announcement:
  1. 1.
    Navigate to your S3 bucket in the AWS console.
  2. 2.
    Select the announcement.json object.
  3. 3.
    Click on "Object URL"
If you followed the Local setup instructions, you can find your signed announcement by running:
cat $MY_VALIDATOR_SIGNATURES_DIRECTORY/announcement.json
Your signed announcement.json should look something like this. Local validators will have a storage_location prefixed with file://.
{
"value": {
"validator": "0xf43fbd072fd38e1121d4b3b0b8a35116bbb01ea9",
"mailbox_address": "0x000000000000000000000000cc737a94fecaec165abcf12ded095bb13f037685",
"mailbox_domain": 5,
"storage_location": "s3://hyperlane-testnet3-goerli-validator-0/us-east-1"
},
"signature": {
"r": "0x2c23ffdc7173019fe2255fddbfa027dc99d5812b7c6595303792efe145c7f2cb",
"s": "0x229da4a683f4785a766cd8fce668741b78acaa7eed95eea9d09b14883de51b83",
"v": 27
},
"serialized_signature": "0x2c23ffdc7173019fe2255fddbfa027dc99d5812b7c6595303792efe145c7f2cb229da4a683f4785a766cd8fce668741b78acaa7eed95eea9d09b14883de51b831b"
}

Submitting your validator's announcement

Now you can submit your signed announcement to the ValidatorAnnounce smart contract. Instructions for doing this either with Etherscan or Cast are provided.
Etherscan
Cast
  1. 1.
    Navigate to the ValidatorAnnounce page on etherscan for the chain you're validating. You can find a link in Contract addresses.
  2. 2.
    Click on the "Contract" tab, and the "Write Contract" button, and click the dropdown on "announce".
  3. 3.
    Fill in the _validator, _storageLocation, and _signature arguments.
    1. 1.
      Set _validator to value.validator from your JSON announcement
    2. 2.
      Set _storageLocation to value.storage_location from your JSON announcement
    3. 3.
      Set _signature to the serialized_signature from your JSON announcement.
      1. 1.
        Older validator versions don't have the serialized_signature field. If this is the case for your validator, consider upgrading your validator to the latest version, or you may instead specify the concatenation of signature.r, signature.s, and the hexadecimal representation of signature.v (0x1C for 28 and 0x1B for 27). Make sure that you remove the 0x prefixes.
Example input
  1. 4.
    Click "Write" and submit the transaction.
  1. 1.
    Announce your validator by running the following command, filling in the following variables:
    1. 1.
      Set $VALIDATOR_ANNOUNCE_ADDRESS to the address of the ValidatorAnnounce contract: Contract addresses
    2. 2.
      Set $VALIDATOR to value.validator from your JSON announcement
    3. 3.
      Set $STORAGE_LOCATION to value.storage_location from your JSON announcement
    4. 4.
      Set $SIGNATURE to the serialized_signature from your JSON announcement.
      1. 1.
        Older validator versions don't have the serialized_signature field. If this is the case for your validator, consider upgrading your validator to the latest version, or you may instead specify the concatenation of signature.r, signature.s, and the hexadecimal representation of signature.v (0x1C for 28 and 0x1B for 27). Make sure that you remove the 0x prefixes.
    5. 5.
      Set $RPC_URL to an RPC URL that can be used to submit transactions
    6. 6.
      Set $PRIVATE_KEY to a hexadecimal private key that can be used to submit transactions
cast send $VALIDATOR_ANNOUNCE_ADDRESS \
"announce(address, string calldata, bytes calldata)(bool)" \
$VALIDATOR $STORAGE_LOCATION $SIGNATURE \
--rpc-url $RPC_URL --private-key $PRIVATE_KEY
Some chains don't support EIP-1559, which is the default transaction mode used by cast. If cast gives an error along the lines of custom error: EIP-1559 not activated, try running the command again with the --legacy flag.
Once you see that your transaction has succeeded, relayers will automatically be made aware of your validator! Your validator is now completely set up.