diff --git a/docs.json b/docs.json index e114eee51..c95032ed0 100644 --- a/docs.json +++ b/docs.json @@ -107,6 +107,18 @@ "source": "/v1/:slug*", "destination": "/network" }, + { + "source": "/v2/about/resources/reference/livepeer-contract-addresses", + "destination": "/network/reference/contracts" + }, + { + "source": "/v2/orchestrators/resources/reference/technical/contract-addresses", + "destination": "/network/reference/contracts" + }, + { + "source": "/v2/delegators/resources/reference/contracts", + "destination": "/network/reference/contracts" + }, { "source": "/v2/:slug*", "destination": "/network" diff --git a/network/reference/contracts.mdx b/network/reference/contracts.mdx index 13ec75ee2..4d3e635f5 100644 --- a/network/reference/contracts.mdx +++ b/network/reference/contracts.mdx @@ -1,6 +1,6 @@ --- title: "Contract addresses" -description: "The Livepeer protocol contracts orchestrators and delegators interact with, and how to verify any address on-chain." +description: "The Livepeer protocol contracts orchestrators, delegators, and applications interact with, and how to verify any address on-chain." --- Livepeer protocol contracts are deployed on **Arbitrum One** (active) and **Ethereum Mainnet** (legacy @@ -17,7 +17,8 @@ governance upgrades, while the target changes when a new implementation is deplo ## Deployed addresses (Arbitrum One) Resolved from the on-chain **Controller** (`getContract(keccak256(name))`) — **last verified -30 July 2026**. These are the stable proxy addresses. +4 August 2026**. These are the stable addresses to integrate against; where a contract uses the +proxy/target pattern, this is the proxy. | Contract | Address | Used by / for | | --- | --- | --- | @@ -31,9 +32,12 @@ Resolved from the on-chain **Controller** (`getContract(keccak256(name))`) — * | `LivepeerGovernor` | [`0xcFE4E2879B786C3aa075813F0E364bb5acCb6aa0`](https://arbiscan.io/address/0xcfe4e2879b786c3aa075813f0e364bb5accb6aa0) | Proposals and voting (protocol + treasury) | | `Treasury` | [`0xf82C1FF415F1fCf582554fDba790E27019c8E8C4`](https://arbiscan.io/address/0xf82c1ff415f1fcf582554fdba790e27019c8e8c4) | Governance-controlled community funds | | `BondingVotes` | [`0x0B9C254837E72Ebe9Fe04960C43B69782E68169A`](https://arbiscan.io/address/0x0b9c254837e72ebe9fe04960c43b69782e68169a) | Stake snapshots for voting power | +| `MerkleSnapshot` | [`0x10736ffaCe687658F88a46D042631d182C7757f7`](https://arbiscan.io/address/0x10736ffaCe687658F88a46D042631d182C7757f7) | Merkle-proof earnings claims | +| `L2Migrator` | [`0x148D5b6B4df9530c7C76A810bd1Cdf69EC4c2085`](https://arbiscan.io/address/0x148D5b6B4df9530c7C76A810bd1Cdf69EC4c2085) | Arbitrum side of the Confluence migration; unmigrated stake is still claimable | +| `L2LPTDataCache` | [`0xd78b6bD09cd28A83cFb21aFa0DA95c685A6bb0B1`](https://arbiscan.io/address/0xd78b6bD09cd28A83cFb21aFa0DA95c685A6bb0B1) | Caches L1 LPT supply data on Arbitrum | These Arbitrum One contracts are **not** registered in the Controller. Addresses come from Livepeer's -own deployment artifacts ([livepeer/protocol](https://github.com/livepeer/protocol/tree/confluence/deployments/arbitrumMainnet), +own deployment artifacts ([livepeer/protocol](https://github.com/livepeer/protocol/tree/delta/deployments/arbitrumMainnet), [livepeer/arbitrum-lpt-bridge](https://github.com/livepeer/arbitrum-lpt-bridge/tree/main/deployments)), cross-checked against on-chain state: @@ -41,10 +45,8 @@ cross-checked against on-chain state: | --- | --- | --- | | `AIServiceRegistry` | [`0x04C0b249740175999E5BF5c9ac1dA92431EF34C5`](https://arbiscan.io/address/0x04C0b249740175999E5BF5c9ac1dA92431EF34C5) | AI capability registration (`-aiServiceRegistry`) | | `L2LPTGateway` | [`0x6D2457a4ad276000A615295f7A80F79E48CcD318`](https://arbiscan.io/address/0x6D2457a4ad276000A615295f7A80F79E48CcD318) | Arbitrum side of the canonical LPT bridge | -| `L2LPTDataCache` | [`0xd78b6bD09cd28A83cFb21aFa0DA95c685A6bb0B1`](https://arbiscan.io/address/0xd78b6bD09cd28A83cFb21aFa0DA95c685A6bb0B1) | Caches L1 LPT supply data on Arbitrum | | `Governor` | [`0xD9dEd6f9959176F0A04dcf88a0d2306178A736a6`](https://arbiscan.io/address/0xD9dEd6f9959176F0A04dcf88a0d2306178A736a6) | Protocol admin / parameter execution (pre-treasury governance) | | `PollCreator` | [`0x8bb50806D60c492c0004DAD5D9627DAA2d9732E6`](https://arbiscan.io/address/0x8bb50806D60c492c0004DAD5D9627DAA2d9732E6) | Poll-based LIP voting | -| `MerkleSnapshot` | [`0x10736ffaCe687658F88a46D042631d182C7757f7`](https://arbiscan.io/address/0x10736ffaCe687658F88a46D042631d182C7757f7) | Merkle-proof earnings claims | ## Deployed addresses (Ethereum Mainnet) @@ -59,19 +61,22 @@ names) — **last verified 30 July 2026**: | `L1Escrow` | [`0x6A23F4940BD5BA117Da261f98aae51A8BFfa210A`](https://etherscan.io/address/0x6A23F4940BD5BA117Da261f98aae51A8BFfa210A) | Holds all L1 LPT locked into the bridge | | `L1LPTGateway` | [`0x6142f1C8bBF02E6A6bd074E8d564c9A5420a0676`](https://etherscan.io/address/0x6142f1C8bBF02E6A6bd074E8d564c9A5420a0676) | Ethereum side of the canonical LPT bridge | | `L1LPTDataCache` | [`0x1d24838b35A9c138Ac157A852e19e948aD6323D7`](https://etherscan.io/address/0x1d24838b35A9c138Ac157A852e19e948aD6323D7) | Publishes L1 LPT supply data to Arbitrum | -| `L1Migrator` | [`0x2a69191B43c9DB47C927bD7287F9C93838d07759`](https://etherscan.io/address/0x2a69191B43c9DB47C927bD7287F9C93838d07759) | L1→L2 state migration (Confluence, 2022) | +| `L1Migrator` (V2) | [`0x2a69191B43c9DB47C927bD7287F9C93838d07759`](https://etherscan.io/address/0x2a69191B43c9DB47C927bD7287F9C93838d07759) | L1→L2 state migration (Confluence, 2022) | **Historical:** before the 2022 Confluence migration the protocol ran on Ethereum mainnet; those contracts remain deployed but are **permanently paused** — if you find an old mainnet `BondingManager` or staking link, it is not the live protocol. All protocol activity is on - Arbitrum One. Migration-era and genesis-era contracts are cataloged in the - [protocol repo](https://github.com/livepeer/protocol). + Arbitrum One. The legacy Ethereum + [`Controller`](https://etherscan.io/address/0xf96d54e490317c557a967abfa5d6e33006be69b3) + (`0xf96d54e4…`) still resolves the migration-era addresses via `getContract` if you need to + identify one; migration-era and genesis-era contract code lives on the protocol repo's + [`streamflow` branch](https://github.com/livepeer/protocol/tree/streamflow). ## Verify against the on-chain Controller -Every Arbitrum One protocol address is registered in the **Controller** at +Most Arbitrum One protocol addresses are registered in the **Controller** at `0xD8E8328501E9645d16Cf49539efC04f734606ee4` (chain 42161). Query it directly — no trust in docs required: @@ -83,12 +88,24 @@ cast call 0xD8E8328501E9645d16Cf49539efC04f734606ee4 \ --rpc-url https://arb1.arbitrum.io/rpc ``` -A registered contract returns a non-zero address. `0x000…000` means the name is misspelled or not on -this chain. Then cross-check the returned address on +A registered contract returns a non-zero address. `0x000…000` means the name is misspelled, not on +this chain, or not proxied (for `…Target` lookups). Then cross-check the returned address on [Arbiscan](https://arbiscan.io/accounts/label/livepeer) or [Blockscout](https://arbitrum.blockscout.com): it should carry a `Livepeer:` label and verified source. +### Checking a proxy's current Target implementation + +The proxy addresses above are stable and are what you should interact with. Behind each proxy, the +**Target** (implementation) address changes when governance deploys an upgrade. If you need to see +the current implementation, the Controller registers it under the contract name with a `Target` +suffix, e.g. `BondingManagerTarget`: + +1. Compute `keccak256("BondingManagerTarget")` with any keccak-256 tool, such as [an online UI](https://webencrypt.org/onlinetoolsjs/keccak_256.html) or `cast keccak "BondingManagerTarget"`. Prefix the digest with `0x`, since online tools omit it and Arbiscan rejects bare hex. +2. Call `getContract` with that hash on the [Controller's Read Contract tab on Arbiscan](https://arbiscan.io/address/0xD8E8328501E9645d16Cf49539efC04f734606ee4#readContract#F1) (or via `cast`, as above). + +The returned address is the live implementation behind that proxy. + ## Canonical sources