Skip to content

Mainnet

Mainnet anchoring is not part of the validate consumer. PHP publishes promote.request; promote_processor submits the mainnet Certify.sol transaction and returns promote.response.

Ops constraints

  • Real gas — enable only with MAINNET_CERTIFY_ENABLED=1 and filled RPC / key / address vars.
  • Dedup scan defaults fail-closed (MAINNET_CERTIFY_DEDUP_REQUIRED=1): if the log scan cannot confirm the bundle is new, the job retries instead of risking a duplicate anchor.
  • Set MAINNET_CERTIFY_DEDUP_FROM_BLOCK to the Certify deploy block (public RPCs cap eth_getLogs; earliest often fails).
  • Run at most one promote_processor instance when mainnet is enabled (check-then-act race under at-least-once delivery).

Env names

MAINNET_RPC_URL, MAINNET_CERTIFY_ADDRESS, MAINNET_PRIVATE_KEY (or MAINNET_CERTIFY_PRIVATE_KEY), ETH_MAINNET_CHAIN_ID (default 1), gas buffers, dedup vars.

Mainnet MAINNET_CERTIFY_ADDRESS is 0x4f2a70eC878E9Adae88FF0c7528ebEbf83dFD83c (Etherscan).

Confirm the authorized certifier before enabling

Certify.certify() reverts with UnauthorizedCertifier unless the sender is the contract's immutable AUTHORIZED_CERTIFIER. On mainnet that is the BAIF Gnosis Safe (0x8EAb4dB55DCEfb6D8bF76e1C6132d48D2048ef0e), not an EOA — so a direct submission signed with MAINNET_PRIVATE_KEY reverts unless that key is the authorized address.

Read AUTHORIZED_CERTIFIER() off the deployed contract and match it against your intended submitter before setting MAINNET_CERTIFY_ENABLED=1. Helper scripts under mainnet/ (e.g. certify-mainnet.sh) wrap the Safe-based production flow. Details: Certify contract.