> ## Documentation Index
> Fetch the complete documentation index at: https://docs.livepeer.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Blockchain Contracts

> Architecture overview of all Livepeer protocol smart contracts on Arbitrum One and Ethereum Mainnet. What each contract does, how contracts interact, and how upgrades work through governance.

export const getBlockchainRawCodeHref = (pageData = {}, slug) => getBlockchainContract(pageData, slug)?.rawContractCodeHref || null;

export const getNamedBlockchainContract = (pageData = {}, chain, name) => {
  const contracts = Object.values(getBlockchainContracts(pageData));
  return contracts.find(contract => contract?.chain === chain && contract?.name === name) || null;
};

export const getBlockchainLastVerifiedDate = (pageData = {}) => pageData?.meta?.lastVerified || 'Pending';

export const getBlockchainExplorerHref = (pageData = {}, chain, name, type = null) => {
  const contract = getNamedBlockchainContract(pageData, chain, name);
  if (!contract) return null;
  if (type === 'proxy') return contract.proxyBlockchainHref || contract.blockchainHref || null;
  if (type === 'target') return contract.targetBlockchainHref || null;
  return contract.blockchainHref || contract.proxyBlockchainHref || contract.targetBlockchainHref || null;
};

export const getBlockchainContracts = (pageData = {}) => pageData?.contracts || ({});

export const getBlockchainContractAddress = (pageData = {}, chain, name, type = null) => {
  const contract = getNamedBlockchainContract(pageData, chain, name);
  if (!contract) return null;
  if (type === 'proxy') return contract.proxyAddress || contract.currentAddress || null;
  if (type === 'target') return contract.targetAddress || null;
  return contract.currentAddress || contract.proxyAddress || contract.targetAddress || null;
};

export const getBlockchainCodeHref = (pageData = {}, chain, name, type = null) => {
  const contract = getNamedBlockchainContract(pageData, chain, name);
  if (!contract) return null;
  if (type === 'proxy') return contract.proxyContractCodeHref || contract.contractCodeHref || null;
  if (type === 'target') return contract.targetContractCodeHref || contract.contractCodeHref || null;
  return contract.contractCodeHref || null;
};

export const getBlockchainContract = (pageData = {}, slug) => getBlockchainContracts(pageData)[slug] || null;

export const contractsRoutes = {
  reference: '/v2/about/resources/reference/livepeer-contract-addresses',
  verifier: '/v2/about/resources/verify-contract-addresses'
};

export const blockchainContractsPageData = {
  "meta": {
    "lastUpdated": "2026-05-04T07:24:22.422Z",
    "lastVerified": "4 May 2026",
    "verificationModel": "contracts-proof-v2",
    "sourceCommit": "2cb192a",
    "explorerUrls": {
      "arbiscan": "https://arbiscan.io",
      "arbiscanAddress": "https://arbiscan.io/address/",
      "etherscan": "https://etherscan.io",
      "etherscanAddress": "https://etherscan.io/address/",
      "blockscoutArbitrum": "https://arbitrum.blockscout.com",
      "blockscoutEthereum": "https://eth.blockscout.com"
    }
  },
  "sections": [{
    "slug": "core-protocol-contracts",
    "title": "Core Protocol Contracts",
    "contracts": ["controller", "bonding-manager", "ticket-broker", "rounds-manager", "minter", "service-registry", "ai-service-registry"]
  }, {
    "slug": "token-and-utility-contracts",
    "title": "Token and Utility Contracts",
    "contracts": ["livepeer-token-arbitrum", "livepeer-token-ethereum", "bridge-minter", "l2-lpt-gateway", "l1-lpt-gateway", "l1-escrow", "livepeer-token-faucet"]
  }, {
    "slug": "governance-contracts",
    "title": "Governance Contracts",
    "contracts": ["bonding-votes", "governor", "livepeer-governor", "treasury"]
  }, {
    "slug": "migration-contracts",
    "title": "Migration Contracts",
    "contracts": ["l2-migrator", "merkle-snapshot"]
  }],
  "contracts": {
    "controller": {
      "slug": "controller",
      "name": "Controller",
      "canonicalName": "Controller",
      "subtitle": "Contract Registry",
      "category": "core",
      "chain": "arbitrumOne",
      "chainLabel": "Arbitrum One",
      "lifecycle": "active",
      "lifecycleLabel": "Active",
      "proofChain": "controller",
      "proofChainLabel": "Controller-managed",
      "type": "standalone",
      "currentAddress": "0xD8E8328501E9645d16Cf49539efC04f734606ee4",
      "proxyAddress": null,
      "targetAddress": null,
      "blockchainHref": "https://arbiscan.io/address/0xD8E8328501E9645d16Cf49539efC04f734606ee4",
      "proxyBlockchainHref": null,
      "targetBlockchainHref": null,
      "contractCodeHref": "https://github.com/livepeer/protocol/blob/6e6b452/contracts/Controller.sol",
      "rawContractCodeHref": "https://raw.githubusercontent.com/livepeer/protocol/6e6b452/contracts/Controller.sol",
      "contractCodeLabel": "Controller.sol",
      "codeSource": {
        "repo": "livepeer/protocol",
        "branch": "delta",
        "path": "contracts/Controller.sol",
        "href": "https://github.com/livepeer/protocol/blob/6e6b452/contracts/Controller.sol",
        "resolvedCommit": "6e6b452",
        "exists": true,
        "resolutionError": null
      },
      "addressSource": {
        "kind": "controller-runtime",
        "repo": null,
        "path": null,
        "refMode": "onchain-root",
        "resolvedCommit": null,
        "key": "Controller"
      },
      "verification": {
        "status": "partial",
        "lastVerifiedAt": "2026-05-04T07:23:26.187Z",
        "explorer": {
          "family": "etherscan",
          "host": "arbiscan.io",
          "addressBaseUrl": "https://arbiscan.io/address/",
          "addressUrl": "https://arbiscan.io/address/0xD8E8328501E9645d16Cf49539efC04f734606ee4"
        },
        "controller": {
          "applicable": false,
          "controllerAddress": null,
          "controllerSlot": null,
          "registrationState": "not_applicable",
          "controllerRegistered": null,
          "resolvedAddress": null,
          "currentAddressMatches": null
        },
        "bridge": {
          "applicable": false,
          "deploymentArtifactAddress": null,
          "deploymentArtifactRepo": null,
          "deploymentArtifactPath": null,
          "deploymentArtifactResolvedCommit": null,
          "deploymentArtifactMatchesAddress": null
        },
        "runtimeConsumer": {
          "applicable": false,
          "required": false,
          "repo": null,
          "path": null,
          "resolvedCommit": null,
          "exactAddressMatch": null
        },
        "proxy": {
          "applicable": false,
          "proxyAddress": null,
          "controllerAddress": null,
          "controllerMatchesExpected": null,
          "targetContractId": null,
          "targetContractName": null,
          "implementationAddress": null,
          "implementationName": null,
          "implementationVersion": null,
          "implementationSource": null,
          "expectedImplementationAddress": null,
          "expectedImplementationSource": null,
          "implementationMatchesExpected": null,
          "controllerCurrentProxyMatches": null
        }
      },
      "supported": true,
      "unsupportedNote": null,
      "functions": [{
        "name": "setContractInfo",
        "params": ["bytes32 _id", "address _contractAddress", "bytes20 _gitCommitHash"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "Controller",
        "signature": "Controller.setContractInfo(bytes32 _id, address _contractAddress, bytes20 _gitCommitHash)"
      }, {
        "name": "updateController",
        "params": ["bytes32 _id", "address _controller"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "Controller",
        "signature": "Controller.updateController(bytes32 _id, address _controller)"
      }, {
        "name": "getContractInfo",
        "params": ["bytes32 _id"],
        "returns": "(address, bytes20)",
        "stateMutability": "view",
        "declaredIn": "Controller",
        "signature": "Controller.getContractInfo(bytes32 _id) returns (address, bytes20) view"
      }, {
        "name": "getContract",
        "params": ["bytes32 _id"],
        "returns": "address",
        "stateMutability": "view",
        "declaredIn": "Controller",
        "signature": "Controller.getContract(bytes32 _id) returns address view"
      }],
      "sourceContractName": "Controller",
      "sourceContractKind": "contract",
      "sourceInheritance": ["Pausable", "IController"],
      "sourceContractFound": true,
      "sourceParseError": null,
      "facts": ["Controller registry", "Active"]
    },
    "bonding-manager": {
      "slug": "bonding-manager",
      "name": "BondingManager",
      "canonicalName": "BondingManager",
      "subtitle": "Staking and Rewards",
      "category": "core",
      "chain": "arbitrumOne",
      "chainLabel": "Arbitrum One",
      "lifecycle": "active",
      "lifecycleLabel": "Active",
      "proofChain": "controller",
      "proofChainLabel": "Controller-managed",
      "type": "proxy",
      "currentAddress": "0x35bcf3c30594191d53231e4ff333e8a770453e40",
      "proxyAddress": "0x35bcf3c30594191d53231e4ff333e8a770453e40",
      "targetAddress": "0xdA6fe3f332Ae11539b3cF777284Ae70fd3bF2D74",
      "blockchainHref": "https://arbiscan.io/address/0x35bcf3c30594191d53231e4ff333e8a770453e40",
      "proxyBlockchainHref": "https://arbiscan.io/address/0x35bcf3c30594191d53231e4ff333e8a770453e40",
      "targetBlockchainHref": "https://arbiscan.io/address/0xdA6fe3f332Ae11539b3cF777284Ae70fd3bF2D74",
      "contractCodeHref": "https://github.com/livepeer/protocol/blob/6e6b452/contracts/bonding/BondingManager.sol",
      "rawContractCodeHref": "https://raw.githubusercontent.com/livepeer/protocol/6e6b452/contracts/bonding/BondingManager.sol",
      "contractCodeLabel": "BondingManager.sol",
      "codeSource": {
        "repo": "livepeer/protocol",
        "branch": "delta",
        "path": "contracts/bonding/BondingManager.sol",
        "href": "https://github.com/livepeer/protocol/blob/6e6b452/contracts/bonding/BondingManager.sol",
        "resolvedCommit": "6e6b452",
        "exists": true,
        "resolutionError": null
      },
      "addressSource": {
        "kind": "controller-runtime",
        "repo": null,
        "path": null,
        "refMode": "onchain-controller",
        "resolvedCommit": null,
        "key": "BondingManager"
      },
      "verification": {
        "status": "strong",
        "lastVerifiedAt": "2026-05-04T07:23:26.187Z",
        "explorer": {
          "family": "etherscan",
          "host": "arbiscan.io",
          "addressBaseUrl": "https://arbiscan.io/address/",
          "addressUrl": "https://arbiscan.io/address/0x35bcf3c30594191d53231e4ff333e8a770453e40"
        },
        "controller": {
          "applicable": true,
          "controllerAddress": "0xD8E8328501E9645d16Cf49539efC04f734606ee4",
          "controllerSlot": "BondingManager",
          "registrationState": "registered",
          "controllerRegistered": true,
          "resolvedAddress": "0x35bcf3c30594191d53231e4ff333e8a770453e40",
          "currentAddressMatches": true
        },
        "bridge": {
          "applicable": false,
          "deploymentArtifactAddress": null,
          "deploymentArtifactRepo": null,
          "deploymentArtifactPath": null,
          "deploymentArtifactResolvedCommit": null,
          "deploymentArtifactMatchesAddress": null
        },
        "runtimeConsumer": {
          "applicable": false,
          "required": false,
          "repo": null,
          "path": null,
          "resolvedCommit": null,
          "exactAddressMatch": null
        },
        "proxy": {
          "applicable": true,
          "proxyAddress": "0x35bcf3c30594191d53231e4ff333e8a770453e40",
          "controllerAddress": "0xd8e8328501e9645d16cf49539efc04f734606ee4",
          "controllerMatchesExpected": true,
          "targetContractId": "0xfc6f6f33d2bb065ac61cbdd4dbe4b7adf6f3e7e6c6a3d1fe297cbf9a187092e4",
          "targetContractName": "BondingManagerTarget",
          "implementationAddress": "0xda6fe3f332ae11539b3cf777284ae70fd3bf2d74",
          "implementationName": null,
          "implementationVersion": null,
          "implementationSource": "proxy-runtime-controller",
          "expectedImplementationAddress": null,
          "expectedImplementationSource": null,
          "implementationMatchesExpected": null,
          "controllerCurrentProxyMatches": true
        }
      },
      "supported": true,
      "unsupportedNote": null,
      "functions": [{
        "name": "setUnbondingPeriod",
        "params": ["uint64 _unbondingPeriod"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "BondingManager",
        "signature": "BondingManager.setUnbondingPeriod(uint64 _unbondingPeriod)"
      }, {
        "name": "setTreasuryRewardCutRate",
        "params": ["uint256 _cutRate"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "BondingManager",
        "signature": "BondingManager.setTreasuryRewardCutRate(uint256 _cutRate)"
      }, {
        "name": "setTreasuryBalanceCeiling",
        "params": ["uint256 _ceiling"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "BondingManager",
        "signature": "BondingManager.setTreasuryBalanceCeiling(uint256 _ceiling)"
      }, {
        "name": "setNumActiveTranscoders",
        "params": ["uint256 _numActiveTranscoders"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "BondingManager",
        "signature": "BondingManager.setNumActiveTranscoders(uint256 _numActiveTranscoders)"
      }, {
        "name": "transcoder",
        "params": ["uint256 _rewardCut", "uint256 _feeShare"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "BondingManager",
        "signature": "BondingManager.transcoder(uint256 _rewardCut, uint256 _feeShare)"
      }, {
        "name": "bond",
        "params": ["uint256 _amount", "address _to"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "BondingManager",
        "signature": "BondingManager.bond(uint256 _amount, address _to)"
      }, {
        "name": "unbond",
        "params": ["uint256 _amount"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "BondingManager",
        "signature": "BondingManager.unbond(uint256 _amount)"
      }, {
        "name": "rebond",
        "params": ["uint256 _unbondingLockId"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "BondingManager",
        "signature": "BondingManager.rebond(uint256 _unbondingLockId)"
      }, {
        "name": "rebondFromUnbonded",
        "params": ["address _to", "uint256 _unbondingLockId"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "BondingManager",
        "signature": "BondingManager.rebondFromUnbonded(address _to, uint256 _unbondingLockId)"
      }, {
        "name": "checkpointBondingState",
        "params": ["address _account"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "BondingManager",
        "signature": "BondingManager.checkpointBondingState(address _account)"
      }, {
        "name": "withdrawStake",
        "params": ["uint256 _unbondingLockId"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "BondingManager",
        "signature": "BondingManager.withdrawStake(uint256 _unbondingLockId)"
      }, {
        "name": "withdrawFees",
        "params": ["address _recipient", "uint256 _amount"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "BondingManager",
        "signature": "BondingManager.withdrawFees(address _recipient, uint256 _amount)"
      }, {
        "name": "reward",
        "params": [],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "BondingManager",
        "signature": "BondingManager.reward()"
      }, {
        "name": "updateTranscoderWithFees",
        "params": ["address _transcoder", "uint256 _fees", "uint256 _round"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "BondingManager",
        "signature": "BondingManager.updateTranscoderWithFees(address _transcoder, uint256 _fees, uint256 _round)"
      }, {
        "name": "slashTranscoder",
        "params": ["address _transcoder", "address _finder", "uint256 _slashAmount", "uint256 _finderFee"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "BondingManager",
        "signature": "BondingManager.slashTranscoder(address _transcoder, address _finder, uint256 _slashAmount, uint256 _finderFee)"
      }, {
        "name": "claimEarnings",
        "params": ["uint256 _endRound"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "BondingManager",
        "signature": "BondingManager.claimEarnings(uint256 _endRound)"
      }, {
        "name": "setCurrentRoundTotalActiveStake",
        "params": [],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "BondingManager",
        "signature": "BondingManager.setCurrentRoundTotalActiveStake()"
      }, {
        "name": "transcoderWithHint",
        "params": ["uint256 _rewardCut", "uint256 _feeShare", "address _newPosPrev", "address _newPosNext"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "BondingManager",
        "signature": "BondingManager.transcoderWithHint(uint256 _rewardCut, uint256 _feeShare, address _newPosPrev, address _newPosNext)"
      }, {
        "name": "bondForWithHint",
        "params": ["uint256 _amount", "address _owner", "address _to", "address _oldDelegateNewPosPrev", "address _oldDelegateNewPosNext", "address _currDelegateNewPosPrev", "address _currDelegateNewPosNext"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "BondingManager",
        "signature": "BondingManager.bondForWithHint(uint256 _amount, address _owner, address _to, address _oldDelegateNewPosPrev, address _oldDelegateNewPosNext, address _currDelegateNewPosPrev, address _currDelegateNewPosNext)"
      }, {
        "name": "bondWithHint",
        "params": ["uint256 _amount", "address _to", "address _oldDelegateNewPosPrev", "address _oldDelegateNewPosNext", "address _currDelegateNewPosPrev", "address _currDelegateNewPosNext"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "BondingManager",
        "signature": "BondingManager.bondWithHint(uint256 _amount, address _to, address _oldDelegateNewPosPrev, address _oldDelegateNewPosNext, address _currDelegateNewPosPrev, address _currDelegateNewPosNext)"
      }, {
        "name": "transferBond",
        "params": ["address _delegator", "uint256 _amount", "address _oldDelegateNewPosPrev", "address _oldDelegateNewPosNext", "address _newDelegateNewPosPrev", "address _newDelegateNewPosNext"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "BondingManager",
        "signature": "BondingManager.transferBond(address _delegator, uint256 _amount, address _oldDelegateNewPosPrev, address _oldDelegateNewPosNext, address _newDelegateNewPosPrev, address _newDelegateNewPosNext)"
      }, {
        "name": "unbondWithHint",
        "params": ["uint256 _amount", "address _newPosPrev", "address _newPosNext"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "BondingManager",
        "signature": "BondingManager.unbondWithHint(uint256 _amount, address _newPosPrev, address _newPosNext)"
      }, {
        "name": "rebondWithHint",
        "params": ["uint256 _unbondingLockId", "address _newPosPrev", "address _newPosNext"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "BondingManager",
        "signature": "BondingManager.rebondWithHint(uint256 _unbondingLockId, address _newPosPrev, address _newPosNext)"
      }, {
        "name": "rebondFromUnbondedWithHint",
        "params": ["address _to", "uint256 _unbondingLockId", "address _newPosPrev", "address _newPosNext"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "BondingManager",
        "signature": "BondingManager.rebondFromUnbondedWithHint(address _to, uint256 _unbondingLockId, address _newPosPrev, address _newPosNext)"
      }, {
        "name": "rewardWithHint",
        "params": ["address _newPosPrev", "address _newPosNext"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "BondingManager",
        "signature": "BondingManager.rewardWithHint(address _newPosPrev, address _newPosNext)"
      }, {
        "name": "pendingStake",
        "params": ["address _delegator", "uint256 _endRound"],
        "returns": "uint256",
        "stateMutability": "view",
        "declaredIn": "BondingManager",
        "signature": "BondingManager.pendingStake(address _delegator, uint256 _endRound) returns uint256 view"
      }, {
        "name": "pendingFees",
        "params": ["address _delegator", "uint256 _endRound"],
        "returns": "uint256",
        "stateMutability": "view",
        "declaredIn": "BondingManager",
        "signature": "BondingManager.pendingFees(address _delegator, uint256 _endRound) returns uint256 view"
      }, {
        "name": "transcoderTotalStake",
        "params": ["address _transcoder"],
        "returns": "uint256",
        "stateMutability": "view",
        "declaredIn": "BondingManager",
        "signature": "BondingManager.transcoderTotalStake(address _transcoder) returns uint256 view"
      }, {
        "name": "transcoderStatus",
        "params": ["address _transcoder"],
        "returns": "TranscoderStatus",
        "stateMutability": "view",
        "declaredIn": "BondingManager",
        "signature": "BondingManager.transcoderStatus(address _transcoder) returns TranscoderStatus view"
      }, {
        "name": "delegatorStatus",
        "params": ["address _delegator"],
        "returns": "DelegatorStatus",
        "stateMutability": "view",
        "declaredIn": "BondingManager",
        "signature": "BondingManager.delegatorStatus(address _delegator) returns DelegatorStatus view"
      }, {
        "name": "getTranscoder",
        "params": ["address _transcoder"],
        "returns": "(uint256 lastRewardRound, uint256 rewardCut, uint256 feeShare, uint256 lastActiveStakeUpdateRound, uint256 activationRound, uint256 deactivationRound, uint256 activeCumulativeRewards, uint256 cumulativeRewards, uint256 cumulativeFees, uint256 lastFeeRound)",
        "stateMutability": "view",
        "declaredIn": "BondingManager",
        "signature": "BondingManager.getTranscoder(address _transcoder) returns (uint256 lastRewardRound, uint256 rewardCut, uint256 feeShare, uint256 lastActiveStakeUpdateRound, uint256 activationRound, uint256 deactivationRound, uint256 activeCumulativeRewards, uint256 cumulativeRewards, uint256 cumulativeFees, uint256 lastFeeRound) view"
      }, {
        "name": "getTranscoderEarningsPoolForRound",
        "params": ["address _transcoder", "uint256 _round"],
        "returns": "(uint256 totalStake, uint256 transcoderRewardCut, uint256 transcoderFeeShare, uint256 cumulativeRewardFactor, uint256 cumulativeFeeFactor)",
        "stateMutability": "view",
        "declaredIn": "BondingManager",
        "signature": "BondingManager.getTranscoderEarningsPoolForRound(address _transcoder, uint256 _round) returns (uint256 totalStake, uint256 transcoderRewardCut, uint256 transcoderFeeShare, uint256 cumulativeRewardFactor, uint256 cumulativeFeeFactor) view"
      }, {
        "name": "getDelegator",
        "params": ["address _delegator"],
        "returns": "(uint256 bondedAmount, uint256 fees, address delegateAddress, uint256 delegatedAmount, uint256 startRound, uint256 lastClaimRound, uint256 nextUnbondingLockId)",
        "stateMutability": "view",
        "declaredIn": "BondingManager",
        "signature": "BondingManager.getDelegator(address _delegator) returns (uint256 bondedAmount, uint256 fees, address delegateAddress, uint256 delegatedAmount, uint256 startRound, uint256 lastClaimRound, uint256 nextUnbondingLockId) view"
      }, {
        "name": "getDelegatorUnbondingLock",
        "params": ["address _delegator", "uint256 _unbondingLockId"],
        "returns": "(uint256 amount, uint256 withdrawRound)",
        "stateMutability": "view",
        "declaredIn": "BondingManager",
        "signature": "BondingManager.getDelegatorUnbondingLock(address _delegator, uint256 _unbondingLockId) returns (uint256 amount, uint256 withdrawRound) view"
      }, {
        "name": "getTranscoderPoolMaxSize",
        "params": [],
        "returns": "uint256",
        "stateMutability": "view",
        "declaredIn": "BondingManager",
        "signature": "BondingManager.getTranscoderPoolMaxSize() returns uint256 view"
      }, {
        "name": "getTranscoderPoolSize",
        "params": [],
        "returns": "uint256",
        "stateMutability": "view",
        "declaredIn": "BondingManager",
        "signature": "BondingManager.getTranscoderPoolSize() returns uint256 view"
      }, {
        "name": "getFirstTranscoderInPool",
        "params": [],
        "returns": "address",
        "stateMutability": "view",
        "declaredIn": "BondingManager",
        "signature": "BondingManager.getFirstTranscoderInPool() returns address view"
      }, {
        "name": "getNextTranscoderInPool",
        "params": ["address _transcoder"],
        "returns": "address",
        "stateMutability": "view",
        "declaredIn": "BondingManager",
        "signature": "BondingManager.getNextTranscoderInPool(address _transcoder) returns address view"
      }, {
        "name": "getTotalBonded",
        "params": [],
        "returns": "uint256",
        "stateMutability": "view",
        "declaredIn": "BondingManager",
        "signature": "BondingManager.getTotalBonded() returns uint256 view"
      }, {
        "name": "isActiveTranscoder",
        "params": ["address _transcoder"],
        "returns": "bool",
        "stateMutability": "view",
        "declaredIn": "BondingManager",
        "signature": "BondingManager.isActiveTranscoder(address _transcoder) returns bool view"
      }, {
        "name": "isRegisteredTranscoder",
        "params": ["address _transcoder"],
        "returns": "bool",
        "stateMutability": "view",
        "declaredIn": "BondingManager",
        "signature": "BondingManager.isRegisteredTranscoder(address _transcoder) returns bool view"
      }, {
        "name": "isValidUnbondingLock",
        "params": ["address _delegator", "uint256 _unbondingLockId"],
        "returns": "bool",
        "stateMutability": "view",
        "declaredIn": "BondingManager",
        "signature": "BondingManager.isValidUnbondingLock(address _delegator, uint256 _unbondingLockId) returns bool view"
      }],
      "sourceContractName": "BondingManager",
      "sourceContractKind": "contract",
      "sourceInheritance": ["ManagerProxyTarget", "IBondingManager"],
      "sourceContractFound": true,
      "sourceParseError": null,
      "facts": ["Controller registered", "Active", "Proxy target resolved", "Target V13"]
    },
    "ticket-broker": {
      "slug": "ticket-broker",
      "name": "TicketBroker",
      "canonicalName": "TicketBroker",
      "subtitle": "Micropayments",
      "category": "core",
      "chain": "arbitrumOne",
      "chainLabel": "Arbitrum One",
      "lifecycle": "active",
      "lifecycleLabel": "Active",
      "proofChain": "controller",
      "proofChainLabel": "Controller-managed",
      "type": "proxy",
      "currentAddress": "0xa8bb618b1520e284046f3dfc448851a1ff26e41b",
      "proxyAddress": "0xa8bb618b1520e284046f3dfc448851a1ff26e41b",
      "targetAddress": "0xea1b0f6c8d158328a6e3d3f924b86a759f41465c",
      "blockchainHref": "https://arbiscan.io/address/0xa8bb618b1520e284046f3dfc448851a1ff26e41b",
      "proxyBlockchainHref": "https://arbiscan.io/address/0xa8bb618b1520e284046f3dfc448851a1ff26e41b",
      "targetBlockchainHref": "https://arbiscan.io/address/0xea1b0f6c8d158328a6e3d3f924b86a759f41465c",
      "contractCodeHref": "https://github.com/livepeer/protocol/blob/6e6b452/contracts/pm/TicketBroker.sol",
      "rawContractCodeHref": "https://raw.githubusercontent.com/livepeer/protocol/6e6b452/contracts/pm/TicketBroker.sol",
      "contractCodeLabel": "TicketBroker.sol",
      "codeSource": {
        "repo": "livepeer/protocol",
        "branch": "delta",
        "path": "contracts/pm/TicketBroker.sol",
        "href": "https://github.com/livepeer/protocol/blob/6e6b452/contracts/pm/TicketBroker.sol",
        "resolvedCommit": "6e6b452",
        "exists": true,
        "resolutionError": null
      },
      "addressSource": {
        "kind": "controller-runtime",
        "repo": null,
        "path": null,
        "refMode": "onchain-controller",
        "resolvedCommit": null,
        "key": "TicketBroker"
      },
      "verification": {
        "status": "strong",
        "lastVerifiedAt": "2026-05-04T07:23:26.187Z",
        "explorer": {
          "family": "etherscan",
          "host": "arbiscan.io",
          "addressBaseUrl": "https://arbiscan.io/address/",
          "addressUrl": "https://arbiscan.io/address/0xa8bb618b1520e284046f3dfc448851a1ff26e41b"
        },
        "controller": {
          "applicable": true,
          "controllerAddress": "0xD8E8328501E9645d16Cf49539efC04f734606ee4",
          "controllerSlot": "TicketBroker",
          "registrationState": "registered",
          "controllerRegistered": true,
          "resolvedAddress": "0xa8bb618b1520e284046f3dfc448851a1ff26e41b",
          "currentAddressMatches": true
        },
        "bridge": {
          "applicable": false,
          "deploymentArtifactAddress": null,
          "deploymentArtifactRepo": null,
          "deploymentArtifactPath": null,
          "deploymentArtifactResolvedCommit": null,
          "deploymentArtifactMatchesAddress": null
        },
        "runtimeConsumer": {
          "applicable": false,
          "required": false,
          "repo": null,
          "path": null,
          "resolvedCommit": null,
          "exactAddressMatch": null
        },
        "proxy": {
          "applicable": true,
          "proxyAddress": "0xa8bb618b1520e284046f3dfc448851a1ff26e41b",
          "controllerAddress": "0xd8e8328501e9645d16cf49539efc04f734606ee4",
          "controllerMatchesExpected": true,
          "targetContractId": "0xf16f832ef171c8058cbd4a32de7d27c32a1a1ad90bb091b4b7f376f1d95ee254",
          "targetContractName": "TicketBrokerTarget",
          "implementationAddress": "0xea1b0f6c8d158328a6e3d3f924b86a759f41465c",
          "implementationName": null,
          "implementationVersion": null,
          "implementationSource": "proxy-runtime-controller",
          "expectedImplementationAddress": null,
          "expectedImplementationSource": null,
          "implementationMatchesExpected": null,
          "controllerCurrentProxyMatches": true
        }
      },
      "supported": true,
      "unsupportedNote": null,
      "functions": [{
        "name": "setUnlockPeriod",
        "params": ["uint256 _unlockPeriod"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "TicketBroker",
        "signature": "TicketBroker.setUnlockPeriod(uint256 _unlockPeriod)"
      }, {
        "name": "setTicketValidityPeriod",
        "params": ["uint256 _ticketValidityPeriod"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "TicketBroker",
        "signature": "TicketBroker.setTicketValidityPeriod(uint256 _ticketValidityPeriod)"
      }],
      "sourceContractName": "TicketBroker",
      "sourceContractKind": "contract",
      "sourceInheritance": ["MixinContractRegistry", "MixinReserve", "MixinTicketBrokerCore", "MixinTicketProcessor", "MixinWrappers"],
      "sourceContractFound": true,
      "sourceParseError": null,
      "facts": ["Controller registered", "Active", "Proxy target resolved"]
    },
    "rounds-manager": {
      "slug": "rounds-manager",
      "name": "RoundsManager",
      "canonicalName": "RoundsManager",
      "subtitle": "Round Progression",
      "category": "core",
      "chain": "arbitrumOne",
      "chainLabel": "Arbitrum One",
      "lifecycle": "active",
      "lifecycleLabel": "Active",
      "proofChain": "controller",
      "proofChainLabel": "Controller-managed",
      "type": "proxy",
      "currentAddress": "0xdd6f56dcc28d3f5f27084381fe8df634985cc39f",
      "proxyAddress": "0xdd6f56dcc28d3f5f27084381fe8df634985cc39f",
      "targetAddress": "0x92d804ed49d92438aea6fe552bd9163aacb7e841",
      "blockchainHref": "https://arbiscan.io/address/0xdd6f56dcc28d3f5f27084381fe8df634985cc39f",
      "proxyBlockchainHref": "https://arbiscan.io/address/0xdd6f56dcc28d3f5f27084381fe8df634985cc39f",
      "targetBlockchainHref": "https://arbiscan.io/address/0x92d804ed49d92438aea6fe552bd9163aacb7e841",
      "contractCodeHref": "https://github.com/livepeer/protocol/blob/6e6b452/contracts/rounds/RoundsManager.sol",
      "rawContractCodeHref": "https://raw.githubusercontent.com/livepeer/protocol/6e6b452/contracts/rounds/RoundsManager.sol",
      "contractCodeLabel": "RoundsManager.sol",
      "codeSource": {
        "repo": "livepeer/protocol",
        "branch": "delta",
        "path": "contracts/rounds/RoundsManager.sol",
        "href": "https://github.com/livepeer/protocol/blob/6e6b452/contracts/rounds/RoundsManager.sol",
        "resolvedCommit": "6e6b452",
        "exists": true,
        "resolutionError": null
      },
      "addressSource": {
        "kind": "controller-runtime",
        "repo": null,
        "path": null,
        "refMode": "onchain-controller",
        "resolvedCommit": null,
        "key": "RoundsManager"
      },
      "verification": {
        "status": "strong",
        "lastVerifiedAt": "2026-05-04T07:23:26.187Z",
        "explorer": {
          "family": "etherscan",
          "host": "arbiscan.io",
          "addressBaseUrl": "https://arbiscan.io/address/",
          "addressUrl": "https://arbiscan.io/address/0xdd6f56dcc28d3f5f27084381fe8df634985cc39f"
        },
        "controller": {
          "applicable": true,
          "controllerAddress": "0xD8E8328501E9645d16Cf49539efC04f734606ee4",
          "controllerSlot": "RoundsManager",
          "registrationState": "registered",
          "controllerRegistered": true,
          "resolvedAddress": "0xdd6f56dcc28d3f5f27084381fe8df634985cc39f",
          "currentAddressMatches": true
        },
        "bridge": {
          "applicable": false,
          "deploymentArtifactAddress": null,
          "deploymentArtifactRepo": null,
          "deploymentArtifactPath": null,
          "deploymentArtifactResolvedCommit": null,
          "deploymentArtifactMatchesAddress": null
        },
        "runtimeConsumer": {
          "applicable": false,
          "required": false,
          "repo": null,
          "path": null,
          "resolvedCommit": null,
          "exactAddressMatch": null
        },
        "proxy": {
          "applicable": true,
          "proxyAddress": "0xdd6f56dcc28d3f5f27084381fe8df634985cc39f",
          "controllerAddress": "0xd8e8328501e9645d16cf49539efc04f734606ee4",
          "controllerMatchesExpected": true,
          "targetContractId": "0x56f65aba3e3e5b6d5adbc6cdc14c51957893b21d4a6a56260af4e03af7e1a51d",
          "targetContractName": "RoundsManagerTarget",
          "implementationAddress": "0x92d804ed49d92438aea6fe552bd9163aacb7e841",
          "implementationName": null,
          "implementationVersion": null,
          "implementationSource": "proxy-runtime-controller",
          "expectedImplementationAddress": null,
          "expectedImplementationSource": null,
          "implementationMatchesExpected": null,
          "controllerCurrentProxyMatches": true
        }
      },
      "supported": true,
      "unsupportedNote": null,
      "functions": [{
        "name": "setRoundLength",
        "params": ["uint256 _roundLength"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "RoundsManager",
        "signature": "RoundsManager.setRoundLength(uint256 _roundLength)"
      }, {
        "name": "setRoundLockAmount",
        "params": ["uint256 _roundLockAmount"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "RoundsManager",
        "signature": "RoundsManager.setRoundLockAmount(uint256 _roundLockAmount)"
      }, {
        "name": "initializeRound",
        "params": [],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "RoundsManager",
        "signature": "RoundsManager.initializeRound()"
      }, {
        "name": "setLIPUpgradeRound",
        "params": ["uint256 _lip", "uint256 _round"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "RoundsManager",
        "signature": "RoundsManager.setLIPUpgradeRound(uint256 _lip, uint256 _round)"
      }, {
        "name": "blockNum",
        "params": [],
        "returns": "uint256",
        "stateMutability": "view",
        "declaredIn": "RoundsManager",
        "signature": "RoundsManager.blockNum() returns uint256 view"
      }, {
        "name": "blockHash",
        "params": ["uint256 _block"],
        "returns": "bytes32",
        "stateMutability": "view",
        "declaredIn": "RoundsManager",
        "signature": "RoundsManager.blockHash(uint256 _block) returns bytes32 view"
      }, {
        "name": "blockHashForRound",
        "params": ["uint256 _round"],
        "returns": "bytes32",
        "stateMutability": "view",
        "declaredIn": "RoundsManager",
        "signature": "RoundsManager.blockHashForRound(uint256 _round) returns bytes32 view"
      }, {
        "name": "currentRound",
        "params": [],
        "returns": "uint256",
        "stateMutability": "view",
        "declaredIn": "RoundsManager",
        "signature": "RoundsManager.currentRound() returns uint256 view"
      }, {
        "name": "currentRoundStartBlock",
        "params": [],
        "returns": "uint256",
        "stateMutability": "view",
        "declaredIn": "RoundsManager",
        "signature": "RoundsManager.currentRoundStartBlock() returns uint256 view"
      }, {
        "name": "currentRoundInitialized",
        "params": [],
        "returns": "bool",
        "stateMutability": "view",
        "declaredIn": "RoundsManager",
        "signature": "RoundsManager.currentRoundInitialized() returns bool view"
      }, {
        "name": "currentRoundLocked",
        "params": [],
        "returns": "bool",
        "stateMutability": "view",
        "declaredIn": "RoundsManager",
        "signature": "RoundsManager.currentRoundLocked() returns bool view"
      }],
      "sourceContractName": "RoundsManager",
      "sourceContractKind": "contract",
      "sourceInheritance": ["ManagerProxyTarget", "IRoundsManager"],
      "sourceContractFound": true,
      "sourceParseError": null,
      "facts": ["Controller registered", "Active", "Proxy target resolved"]
    },
    "minter": {
      "slug": "minter",
      "name": "Minter",
      "canonicalName": "Minter",
      "subtitle": "Token Inflation",
      "category": "core",
      "chain": "arbitrumOne",
      "chainLabel": "Arbitrum One",
      "lifecycle": "active",
      "lifecycleLabel": "Active",
      "proofChain": "controller",
      "proofChainLabel": "Controller-managed",
      "type": "standalone",
      "currentAddress": "0xc20de37170b45774e6cd3d2304017fc962f27252",
      "proxyAddress": null,
      "targetAddress": null,
      "blockchainHref": "https://arbiscan.io/address/0xc20de37170b45774e6cd3d2304017fc962f27252",
      "proxyBlockchainHref": null,
      "targetBlockchainHref": null,
      "contractCodeHref": "https://github.com/livepeer/protocol/blob/6e6b452/contracts/token/Minter.sol",
      "rawContractCodeHref": "https://raw.githubusercontent.com/livepeer/protocol/6e6b452/contracts/token/Minter.sol",
      "contractCodeLabel": "Minter.sol",
      "codeSource": {
        "repo": "livepeer/protocol",
        "branch": "delta",
        "path": "contracts/token/Minter.sol",
        "href": "https://github.com/livepeer/protocol/blob/6e6b452/contracts/token/Minter.sol",
        "resolvedCommit": "6e6b452",
        "exists": true,
        "resolutionError": null
      },
      "addressSource": {
        "kind": "controller-runtime",
        "repo": null,
        "path": null,
        "refMode": "onchain-controller",
        "resolvedCommit": null,
        "key": "Minter"
      },
      "verification": {
        "status": "strong",
        "lastVerifiedAt": "2026-05-04T07:23:26.187Z",
        "explorer": {
          "family": "etherscan",
          "host": "arbiscan.io",
          "addressBaseUrl": "https://arbiscan.io/address/",
          "addressUrl": "https://arbiscan.io/address/0xc20de37170b45774e6cd3d2304017fc962f27252"
        },
        "controller": {
          "applicable": true,
          "controllerAddress": "0xD8E8328501E9645d16Cf49539efC04f734606ee4",
          "controllerSlot": "Minter",
          "registrationState": "registered",
          "controllerRegistered": true,
          "resolvedAddress": "0xc20de37170b45774e6cd3d2304017fc962f27252",
          "currentAddressMatches": true
        },
        "bridge": {
          "applicable": false,
          "deploymentArtifactAddress": null,
          "deploymentArtifactRepo": null,
          "deploymentArtifactPath": null,
          "deploymentArtifactResolvedCommit": null,
          "deploymentArtifactMatchesAddress": null
        },
        "runtimeConsumer": {
          "applicable": false,
          "required": false,
          "repo": null,
          "path": null,
          "resolvedCommit": null,
          "exactAddressMatch": null
        },
        "proxy": {
          "applicable": false,
          "proxyAddress": null,
          "controllerAddress": null,
          "controllerMatchesExpected": null,
          "targetContractId": null,
          "targetContractName": null,
          "implementationAddress": null,
          "implementationName": null,
          "implementationVersion": null,
          "implementationSource": null,
          "expectedImplementationAddress": null,
          "expectedImplementationSource": null,
          "implementationMatchesExpected": null,
          "controllerCurrentProxyMatches": null
        }
      },
      "supported": true,
      "unsupportedNote": null,
      "functions": [{
        "name": "setTargetBondingRate",
        "params": ["uint256 _targetBondingRate"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "Minter",
        "signature": "Minter.setTargetBondingRate(uint256 _targetBondingRate)"
      }, {
        "name": "setInflationChange",
        "params": ["uint256 _inflationChange"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "Minter",
        "signature": "Minter.setInflationChange(uint256 _inflationChange)"
      }, {
        "name": "migrateToNewMinter",
        "params": ["IMinter _newMinter"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "Minter",
        "signature": "Minter.migrateToNewMinter(IMinter _newMinter)"
      }, {
        "name": "createReward",
        "params": ["uint256 _fracNum", "uint256 _fracDenom"],
        "returns": "uint256",
        "stateMutability": null,
        "declaredIn": "Minter",
        "signature": "Minter.createReward(uint256 _fracNum, uint256 _fracDenom) returns uint256"
      }, {
        "name": "trustedTransferTokens",
        "params": ["address _to", "uint256 _amount"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "Minter",
        "signature": "Minter.trustedTransferTokens(address _to, uint256 _amount)"
      }, {
        "name": "trustedBurnTokens",
        "params": ["uint256 _amount"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "Minter",
        "signature": "Minter.trustedBurnTokens(uint256 _amount)"
      }, {
        "name": "trustedWithdrawETH",
        "params": ["address _to", "uint256 _amount"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "Minter",
        "signature": "Minter.trustedWithdrawETH(address _to, uint256 _amount)"
      }, {
        "name": "depositETH",
        "params": [],
        "returns": "bool",
        "stateMutability": "payable",
        "declaredIn": "Minter",
        "signature": "Minter.depositETH() returns bool payable"
      }, {
        "name": "setCurrentRewardTokens",
        "params": [],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "Minter",
        "signature": "Minter.setCurrentRewardTokens()"
      }, {
        "name": "getController",
        "params": [],
        "returns": "IController",
        "stateMutability": "view",
        "declaredIn": "Minter",
        "signature": "Minter.getController() returns IController view"
      }, {
        "name": "getGlobalTotalSupply",
        "params": [],
        "returns": "uint256",
        "stateMutability": "view",
        "declaredIn": "Minter",
        "signature": "Minter.getGlobalTotalSupply() returns uint256 view"
      }],
      "sourceContractName": "Minter",
      "sourceContractKind": "contract",
      "sourceInheritance": ["Manager", "IMinter"],
      "sourceContractFound": true,
      "sourceParseError": null,
      "facts": ["Controller registered", "Active"]
    },
    "service-registry": {
      "slug": "service-registry",
      "name": "ServiceRegistry",
      "canonicalName": "ServiceRegistry",
      "subtitle": "Orchestrator URI Mapping",
      "category": "core",
      "chain": "arbitrumOne",
      "chainLabel": "Arbitrum One",
      "lifecycle": "active",
      "lifecycleLabel": "Active",
      "proofChain": "controller",
      "proofChainLabel": "Controller-managed",
      "type": "proxy",
      "currentAddress": "0xc92d3a360b8f9e083ba64de15d95cf8180897431",
      "proxyAddress": "0xc92d3a360b8f9e083ba64de15d95cf8180897431",
      "targetAddress": "0x38093cdca43aecd7bb474983519a246e93a3b0a7",
      "blockchainHref": "https://arbiscan.io/address/0xc92d3a360b8f9e083ba64de15d95cf8180897431",
      "proxyBlockchainHref": "https://arbiscan.io/address/0xc92d3a360b8f9e083ba64de15d95cf8180897431",
      "targetBlockchainHref": "https://arbiscan.io/address/0x38093cdca43aecd7bb474983519a246e93a3b0a7",
      "contractCodeHref": "https://github.com/livepeer/protocol/blob/6e6b452/contracts/ServiceRegistry.sol",
      "rawContractCodeHref": "https://raw.githubusercontent.com/livepeer/protocol/6e6b452/contracts/ServiceRegistry.sol",
      "contractCodeLabel": "ServiceRegistry.sol",
      "codeSource": {
        "repo": "livepeer/protocol",
        "branch": "delta",
        "path": "contracts/ServiceRegistry.sol",
        "href": "https://github.com/livepeer/protocol/blob/6e6b452/contracts/ServiceRegistry.sol",
        "resolvedCommit": "6e6b452",
        "exists": true,
        "resolutionError": null
      },
      "addressSource": {
        "kind": "controller-runtime",
        "repo": null,
        "path": null,
        "refMode": "onchain-controller",
        "resolvedCommit": null,
        "key": "ServiceRegistry"
      },
      "verification": {
        "status": "strong",
        "lastVerifiedAt": "2026-05-04T07:23:26.187Z",
        "explorer": {
          "family": "etherscan",
          "host": "arbiscan.io",
          "addressBaseUrl": "https://arbiscan.io/address/",
          "addressUrl": "https://arbiscan.io/address/0xc92d3a360b8f9e083ba64de15d95cf8180897431"
        },
        "controller": {
          "applicable": true,
          "controllerAddress": "0xD8E8328501E9645d16Cf49539efC04f734606ee4",
          "controllerSlot": "ServiceRegistry",
          "registrationState": "registered",
          "controllerRegistered": true,
          "resolvedAddress": "0xc92d3a360b8f9e083ba64de15d95cf8180897431",
          "currentAddressMatches": true
        },
        "bridge": {
          "applicable": false,
          "deploymentArtifactAddress": null,
          "deploymentArtifactRepo": null,
          "deploymentArtifactPath": null,
          "deploymentArtifactResolvedCommit": null,
          "deploymentArtifactMatchesAddress": null
        },
        "runtimeConsumer": {
          "applicable": false,
          "required": false,
          "repo": null,
          "path": null,
          "resolvedCommit": null,
          "exactAddressMatch": null
        },
        "proxy": {
          "applicable": true,
          "proxyAddress": "0xc92d3a360b8f9e083ba64de15d95cf8180897431",
          "controllerAddress": "0xd8e8328501e9645d16cf49539efc04f734606ee4",
          "controllerMatchesExpected": true,
          "targetContractId": "0xa65c3dc1a85422ba3e6003be871c3339b882a9c28fc454085d394e4b6436d564",
          "targetContractName": "ServiceRegistryTarget",
          "implementationAddress": "0x38093cdca43aecd7bb474983519a246e93a3b0a7",
          "implementationName": null,
          "implementationVersion": null,
          "implementationSource": "proxy-runtime-controller",
          "expectedImplementationAddress": null,
          "expectedImplementationSource": null,
          "implementationMatchesExpected": null,
          "controllerCurrentProxyMatches": true
        }
      },
      "supported": true,
      "unsupportedNote": null,
      "functions": [{
        "name": "setServiceURI",
        "params": ["string calldata _serviceURI"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "ServiceRegistry",
        "signature": "ServiceRegistry.setServiceURI(string calldata _serviceURI)"
      }, {
        "name": "getServiceURI",
        "params": ["address _addr"],
        "returns": "string memory",
        "stateMutability": "view",
        "declaredIn": "ServiceRegistry",
        "signature": "ServiceRegistry.getServiceURI(address _addr) returns string memory view"
      }],
      "sourceContractName": "ServiceRegistry",
      "sourceContractKind": "contract",
      "sourceInheritance": ["ManagerProxyTarget"],
      "sourceContractFound": true,
      "sourceParseError": null,
      "facts": ["Controller registered", "Active", "Proxy target resolved"]
    },
    "ai-service-registry": {
      "slug": "ai-service-registry",
      "name": "AIServiceRegistry",
      "canonicalName": "AIServiceRegistry",
      "subtitle": "AI Capability Registration",
      "category": "core",
      "chain": "arbitrumOne",
      "chainLabel": "Arbitrum One",
      "lifecycle": "active",
      "lifecycleLabel": "Active",
      "proofChain": "detached",
      "proofChainLabel": "Detached runtime-backed",
      "type": "standalone",
      "currentAddress": "0x04C0b249740175999E5BF5c9ac1dA92431EF34C5",
      "proxyAddress": null,
      "targetAddress": null,
      "blockchainHref": "https://arbiscan.io/address/0x04C0b249740175999E5BF5c9ac1dA92431EF34C5",
      "proxyBlockchainHref": null,
      "targetBlockchainHref": null,
      "contractCodeHref": "https://github.com/livepeer/protocol/blob/6e6b452/contracts/ServiceRegistry.sol",
      "rawContractCodeHref": "https://raw.githubusercontent.com/livepeer/protocol/6e6b452/contracts/ServiceRegistry.sol",
      "contractCodeLabel": "ServiceRegistry.sol",
      "codeSource": {
        "repo": "livepeer/protocol",
        "branch": "delta",
        "path": "contracts/ServiceRegistry.sol",
        "href": "https://github.com/livepeer/protocol/blob/6e6b452/contracts/ServiceRegistry.sol",
        "resolvedCommit": "6e6b452",
        "exists": true,
        "resolutionError": null
      },
      "addressSource": {
        "kind": "deployment-artifact",
        "repo": "livepeer/protocol",
        "path": "deployments/arbitrumMainnet/AIServiceRegistry.json",
        "refMode": "resolved-commit",
        "resolvedCommit": "6e6b452",
        "key": "deployments/arbitrumMainnet/AIServiceRegistry.json"
      },
      "verification": {
        "status": "strong",
        "lastVerifiedAt": "2026-05-04T07:23:26.187Z",
        "explorer": {
          "family": "etherscan",
          "host": "arbiscan.io",
          "addressBaseUrl": "https://arbiscan.io/address/",
          "addressUrl": "https://arbiscan.io/address/0x04C0b249740175999E5BF5c9ac1dA92431EF34C5"
        },
        "controller": {
          "applicable": false,
          "controllerAddress": null,
          "controllerSlot": null,
          "registrationState": "not_applicable",
          "controllerRegistered": null,
          "resolvedAddress": null,
          "currentAddressMatches": null
        },
        "bridge": {
          "applicable": false,
          "deploymentArtifactAddress": "0x04C0b249740175999E5BF5c9ac1dA92431EF34C5",
          "deploymentArtifactRepo": "livepeer/protocol",
          "deploymentArtifactPath": "deployments/arbitrumMainnet/AIServiceRegistry.json",
          "deploymentArtifactResolvedCommit": "6e6b452",
          "deploymentArtifactMatchesAddress": true
        },
        "runtimeConsumer": {
          "applicable": true,
          "required": true,
          "repo": "livepeer/go-livepeer",
          "path": "cmd/livepeer/starter/starter.go",
          "resolvedCommit": "9e68815",
          "exactAddressMatch": true
        },
        "proxy": {
          "applicable": false,
          "proxyAddress": null,
          "controllerAddress": null,
          "controllerMatchesExpected": null,
          "targetContractId": null,
          "targetContractName": null,
          "implementationAddress": null,
          "implementationName": null,
          "implementationVersion": null,
          "implementationSource": null,
          "expectedImplementationAddress": null,
          "expectedImplementationSource": null,
          "implementationMatchesExpected": null,
          "controllerCurrentProxyMatches": null
        }
      },
      "supported": true,
      "unsupportedNote": null,
      "functions": [{
        "name": "setServiceURI",
        "params": ["string calldata _serviceURI"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "ServiceRegistry",
        "signature": "ServiceRegistry.setServiceURI(string calldata _serviceURI)"
      }, {
        "name": "getServiceURI",
        "params": ["address _addr"],
        "returns": "string memory",
        "stateMutability": "view",
        "declaredIn": "ServiceRegistry",
        "signature": "ServiceRegistry.getServiceURI(address _addr) returns string memory view"
      }],
      "sourceContractName": "ServiceRegistry",
      "sourceContractKind": "contract",
      "sourceInheritance": ["ManagerProxyTarget"],
      "sourceContractFound": true,
      "sourceParseError": null,
      "facts": ["Deployment artifact confirmed", "Runtime consumer confirmed", "Active"]
    },
    "livepeer-token-arbitrum": {
      "slug": "livepeer-token-arbitrum",
      "name": "LivepeerToken",
      "canonicalName": "LivepeerToken",
      "subtitle": "ERC-20 Token",
      "category": "token",
      "chain": "arbitrumOne",
      "chainLabel": "Arbitrum One",
      "lifecycle": "active",
      "lifecycleLabel": "Active",
      "proofChain": "controller",
      "proofChainLabel": "Controller-managed",
      "type": "standalone",
      "currentAddress": "0x289ba1701c2f088cf0faf8b3705246331cb8a839",
      "proxyAddress": null,
      "targetAddress": null,
      "blockchainHref": "https://arbiscan.io/address/0x289ba1701c2f088cf0faf8b3705246331cb8a839",
      "proxyBlockchainHref": null,
      "targetBlockchainHref": null,
      "contractCodeHref": "https://github.com/livepeer/arbitrum-lpt-bridge/blob/603314d/contracts/L2/token/LivepeerToken.sol",
      "rawContractCodeHref": "https://raw.githubusercontent.com/livepeer/arbitrum-lpt-bridge/603314d/contracts/L2/token/LivepeerToken.sol",
      "contractCodeLabel": "LivepeerToken.sol (L2)",
      "codeSource": {
        "repo": "livepeer/arbitrum-lpt-bridge",
        "branch": "main",
        "path": "contracts/L2/token/LivepeerToken.sol",
        "href": "https://github.com/livepeer/arbitrum-lpt-bridge/blob/603314d/contracts/L2/token/LivepeerToken.sol",
        "resolvedCommit": "603314d",
        "exists": true,
        "resolutionError": null
      },
      "addressSource": {
        "kind": "controller-runtime",
        "repo": null,
        "path": null,
        "refMode": "onchain-controller",
        "resolvedCommit": null,
        "key": "LivepeerToken"
      },
      "verification": {
        "status": "strong",
        "lastVerifiedAt": "2026-05-04T07:23:26.187Z",
        "explorer": {
          "family": "etherscan",
          "host": "arbiscan.io",
          "addressBaseUrl": "https://arbiscan.io/address/",
          "addressUrl": "https://arbiscan.io/address/0x289ba1701c2f088cf0faf8b3705246331cb8a839"
        },
        "controller": {
          "applicable": true,
          "controllerAddress": "0xD8E8328501E9645d16Cf49539efC04f734606ee4",
          "controllerSlot": "LivepeerToken",
          "registrationState": "registered",
          "controllerRegistered": true,
          "resolvedAddress": "0x289ba1701c2f088cf0faf8b3705246331cb8a839",
          "currentAddressMatches": true
        },
        "bridge": {
          "applicable": false,
          "deploymentArtifactAddress": null,
          "deploymentArtifactRepo": null,
          "deploymentArtifactPath": null,
          "deploymentArtifactResolvedCommit": null,
          "deploymentArtifactMatchesAddress": null
        },
        "runtimeConsumer": {
          "applicable": false,
          "required": false,
          "repo": null,
          "path": null,
          "resolvedCommit": null,
          "exactAddressMatch": null
        },
        "proxy": {
          "applicable": false,
          "proxyAddress": null,
          "controllerAddress": null,
          "controllerMatchesExpected": null,
          "targetContractId": null,
          "targetContractName": null,
          "implementationAddress": null,
          "implementationName": null,
          "implementationVersion": null,
          "implementationSource": null,
          "expectedImplementationAddress": null,
          "expectedImplementationSource": null,
          "implementationMatchesExpected": null,
          "controllerCurrentProxyMatches": null
        }
      },
      "supported": true,
      "unsupportedNote": null,
      "functions": [{
        "name": "mint",
        "params": ["address _to", "uint256 _amount"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "LivepeerToken",
        "signature": "LivepeerToken.mint(address _to, uint256 _amount)"
      }, {
        "name": "burn",
        "params": ["uint256 _amount"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "LivepeerToken",
        "signature": "LivepeerToken.burn(uint256 _amount)"
      }, {
        "name": "burnFrom",
        "params": ["address _from", "uint256 _amount"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "LivepeerToken",
        "signature": "LivepeerToken.burnFrom(address _from, uint256 _amount)"
      }],
      "sourceContractName": "LivepeerToken",
      "sourceContractKind": "contract",
      "sourceInheritance": ["AccessControl", "ERC20Burnable", "ERC20Permit"],
      "sourceContractFound": true,
      "sourceParseError": null,
      "facts": ["Controller registered", "Active"]
    },
    "livepeer-token-ethereum": {
      "slug": "livepeer-token-ethereum",
      "name": "LivepeerToken",
      "canonicalName": "LivepeerToken",
      "subtitle": "ERC-20 Token",
      "category": "token",
      "chain": "ethereumMainnet",
      "chainLabel": "Ethereum Mainnet",
      "lifecycle": "active",
      "lifecycleLabel": "Active",
      "proofChain": "controller",
      "proofChainLabel": "Controller-managed",
      "type": "standalone",
      "currentAddress": "0x58b6a8a3302369daec383334672404ee733ab239",
      "proxyAddress": null,
      "targetAddress": null,
      "blockchainHref": "https://etherscan.io/address/0x58b6a8a3302369daec383334672404ee733ab239",
      "proxyBlockchainHref": null,
      "targetBlockchainHref": null,
      "contractCodeHref": "https://github.com/livepeer/protocol/blob/cbcdf50/contracts/token/LivepeerToken.sol",
      "rawContractCodeHref": "https://raw.githubusercontent.com/livepeer/protocol/cbcdf50/contracts/token/LivepeerToken.sol",
      "contractCodeLabel": "LivepeerToken.sol (L1)",
      "codeSource": {
        "repo": "livepeer/protocol",
        "branch": "master",
        "path": "contracts/token/LivepeerToken.sol",
        "href": "https://github.com/livepeer/protocol/blob/cbcdf50/contracts/token/LivepeerToken.sol",
        "resolvedCommit": "cbcdf50",
        "exists": true,
        "resolutionError": null
      },
      "addressSource": {
        "kind": "controller-runtime",
        "repo": null,
        "path": null,
        "refMode": "onchain-controller",
        "resolvedCommit": null,
        "key": "LivepeerToken"
      },
      "verification": {
        "status": "strong",
        "lastVerifiedAt": "2026-05-04T07:23:34.305Z",
        "explorer": {
          "family": "etherscan",
          "host": "etherscan.io",
          "addressBaseUrl": "https://etherscan.io/address/",
          "addressUrl": "https://etherscan.io/address/0x58b6a8a3302369daec383334672404ee733ab239"
        },
        "controller": {
          "applicable": true,
          "controllerAddress": "0xf96d54e490317c557a967abfa5d6e33006be69b3",
          "controllerSlot": "LivepeerToken",
          "registrationState": "registered",
          "controllerRegistered": true,
          "resolvedAddress": "0x58b6a8a3302369daec383334672404ee733ab239",
          "currentAddressMatches": true
        },
        "bridge": {
          "applicable": false,
          "deploymentArtifactAddress": null,
          "deploymentArtifactRepo": null,
          "deploymentArtifactPath": null,
          "deploymentArtifactResolvedCommit": null,
          "deploymentArtifactMatchesAddress": null
        },
        "runtimeConsumer": {
          "applicable": false,
          "required": false,
          "repo": null,
          "path": null,
          "resolvedCommit": null,
          "exactAddressMatch": null
        },
        "proxy": {
          "applicable": false,
          "proxyAddress": null,
          "controllerAddress": null,
          "controllerMatchesExpected": null,
          "targetContractId": null,
          "targetContractName": null,
          "implementationAddress": null,
          "implementationName": null,
          "implementationVersion": null,
          "implementationSource": null,
          "expectedImplementationAddress": null,
          "expectedImplementationSource": null,
          "implementationMatchesExpected": null,
          "controllerCurrentProxyMatches": null
        }
      },
      "supported": true,
      "unsupportedNote": null,
      "functions": [],
      "sourceContractName": "LivepeerToken",
      "sourceContractKind": "contract",
      "sourceInheritance": ["ILivepeerToken", "VariableSupplyToken"],
      "sourceContractFound": true,
      "sourceParseError": null,
      "facts": ["Controller registered", "Active"]
    },
    "bridge-minter": {
      "slug": "bridge-minter",
      "name": "BridgeMinter",
      "canonicalName": "BridgeMinter",
      "subtitle": "L1 Bridge Minting",
      "category": "bridge",
      "chain": "ethereumMainnet",
      "chainLabel": "Ethereum Mainnet",
      "lifecycle": "active",
      "lifecycleLabel": "Active",
      "proofChain": "bridge",
      "proofChainLabel": "Bridge-derived",
      "type": "standalone",
      "currentAddress": "0x8dDDB96CF36AC8860f1DE5C7c4698fd499FAB405",
      "proxyAddress": null,
      "targetAddress": null,
      "blockchainHref": "https://etherscan.io/address/0x8dDDB96CF36AC8860f1DE5C7c4698fd499FAB405",
      "proxyBlockchainHref": null,
      "targetBlockchainHref": null,
      "contractCodeHref": "https://github.com/livepeer/protocol/blob/01d4ddb/contracts/token/BridgeMinter.sol",
      "rawContractCodeHref": "https://raw.githubusercontent.com/livepeer/protocol/01d4ddb/contracts/token/BridgeMinter.sol",
      "contractCodeLabel": "BridgeMinter.sol",
      "codeSource": {
        "repo": "livepeer/protocol",
        "branch": "streamflow",
        "path": "contracts/token/BridgeMinter.sol",
        "href": "https://github.com/livepeer/protocol/blob/01d4ddb/contracts/token/BridgeMinter.sol",
        "resolvedCommit": "01d4ddb",
        "exists": true,
        "resolutionError": null
      },
      "addressSource": {
        "kind": "governor-manifest",
        "repo": "livepeer/governor-scripts",
        "path": "updates/addresses.js",
        "refMode": "default_branch",
        "resolvedCommit": "2cb192a",
        "key": "bridgeMinter"
      },
      "verification": {
        "status": "partial",
        "lastVerifiedAt": "2026-05-04T07:23:34.305Z",
        "explorer": {
          "family": "etherscan",
          "host": "etherscan.io",
          "addressBaseUrl": "https://etherscan.io/address/",
          "addressUrl": "https://etherscan.io/address/0x8dDDB96CF36AC8860f1DE5C7c4698fd499FAB405"
        },
        "controller": {
          "applicable": false,
          "controllerAddress": null,
          "controllerSlot": null,
          "registrationState": "not_applicable",
          "controllerRegistered": null,
          "resolvedAddress": null,
          "currentAddressMatches": null
        },
        "bridge": {
          "applicable": true,
          "deploymentArtifactAddress": null,
          "deploymentArtifactRepo": null,
          "deploymentArtifactPath": null,
          "deploymentArtifactResolvedCommit": null,
          "deploymentArtifactMatchesAddress": null
        },
        "runtimeConsumer": {
          "applicable": false,
          "required": false,
          "repo": null,
          "path": null,
          "resolvedCommit": null,
          "exactAddressMatch": null
        },
        "proxy": {
          "applicable": false,
          "proxyAddress": null,
          "controllerAddress": null,
          "controllerMatchesExpected": null,
          "targetContractId": null,
          "targetContractName": null,
          "implementationAddress": null,
          "implementationName": null,
          "implementationVersion": null,
          "implementationSource": null,
          "expectedImplementationAddress": null,
          "expectedImplementationSource": null,
          "implementationMatchesExpected": null,
          "controllerCurrentProxyMatches": null
        }
      },
      "supported": true,
      "unsupportedNote": null,
      "functions": [{
        "name": "setL1Migrator",
        "params": ["address _l1MigratorAddr"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "BridgeMinter",
        "signature": "BridgeMinter.setL1Migrator(address _l1MigratorAddr)"
      }, {
        "name": "setL1LPTGateway",
        "params": ["address _l1LPTGatewayAddr"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "BridgeMinter",
        "signature": "BridgeMinter.setL1LPTGateway(address _l1LPTGatewayAddr)"
      }, {
        "name": "migrateToNewMinter",
        "params": ["address _newMinterAddr"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "BridgeMinter",
        "signature": "BridgeMinter.migrateToNewMinter(address _newMinterAddr)"
      }, {
        "name": "withdrawETHToL1Migrator",
        "params": [],
        "returns": "uint256",
        "stateMutability": null,
        "declaredIn": "BridgeMinter",
        "signature": "BridgeMinter.withdrawETHToL1Migrator() returns uint256"
      }, {
        "name": "withdrawLPTToL1Migrator",
        "params": [],
        "returns": "uint256",
        "stateMutability": null,
        "declaredIn": "BridgeMinter",
        "signature": "BridgeMinter.withdrawLPTToL1Migrator() returns uint256"
      }, {
        "name": "bridgeMint",
        "params": ["address _to", "uint256 _amount"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "BridgeMinter",
        "signature": "BridgeMinter.bridgeMint(address _to, uint256 _amount)"
      }, {
        "name": "depositETH",
        "params": [],
        "returns": "bool",
        "stateMutability": "payable",
        "declaredIn": "BridgeMinter",
        "signature": "BridgeMinter.depositETH() returns bool payable"
      }, {
        "name": "getController",
        "params": [],
        "returns": "address",
        "stateMutability": "view",
        "declaredIn": "BridgeMinter",
        "signature": "BridgeMinter.getController() returns address view"
      }],
      "sourceContractName": "BridgeMinter",
      "sourceContractKind": "contract",
      "sourceInheritance": ["Manager"],
      "sourceContractFound": true,
      "sourceParseError": null,
      "facts": ["Bridge-derived", "Active"]
    },
    "l2-lpt-gateway": {
      "slug": "l2-lpt-gateway",
      "name": "L2LPTGateway",
      "canonicalName": "L2LPTGateway",
      "subtitle": "Token Bridge",
      "category": "bridge",
      "chain": "arbitrumOne",
      "chainLabel": "Arbitrum One",
      "lifecycle": "active",
      "lifecycleLabel": "Active",
      "proofChain": "bridge",
      "proofChainLabel": "Bridge-derived",
      "type": "standalone",
      "currentAddress": "0x6D2457a4ad276000A615295f7A80F79E48CcD318",
      "proxyAddress": null,
      "targetAddress": null,
      "blockchainHref": "https://arbiscan.io/address/0x6D2457a4ad276000A615295f7A80F79E48CcD318",
      "proxyBlockchainHref": null,
      "targetBlockchainHref": null,
      "contractCodeHref": "https://github.com/livepeer/arbitrum-lpt-bridge/blob/603314d/contracts/L2/gateway/L2LPTGateway.sol",
      "rawContractCodeHref": "https://raw.githubusercontent.com/livepeer/arbitrum-lpt-bridge/603314d/contracts/L2/gateway/L2LPTGateway.sol",
      "contractCodeLabel": "L2LPTGateway.sol",
      "codeSource": {
        "repo": "livepeer/arbitrum-lpt-bridge",
        "branch": "main",
        "path": "contracts/L2/gateway/L2LPTGateway.sol",
        "href": "https://github.com/livepeer/arbitrum-lpt-bridge/blob/603314d/contracts/L2/gateway/L2LPTGateway.sol",
        "resolvedCommit": "603314d",
        "exists": true,
        "resolutionError": null
      },
      "addressSource": {
        "kind": "governor-manifest",
        "repo": "livepeer/governor-scripts",
        "path": "updates/addresses.js",
        "refMode": "default_branch",
        "resolvedCommit": "2cb192a",
        "key": "l2LPTGateway"
      },
      "verification": {
        "status": "strong",
        "lastVerifiedAt": "2026-05-04T07:23:26.187Z",
        "explorer": {
          "family": "etherscan",
          "host": "arbiscan.io",
          "addressBaseUrl": "https://arbiscan.io/address/",
          "addressUrl": "https://arbiscan.io/address/0x6D2457a4ad276000A615295f7A80F79E48CcD318"
        },
        "controller": {
          "applicable": false,
          "controllerAddress": null,
          "controllerSlot": null,
          "registrationState": "not_applicable",
          "controllerRegistered": null,
          "resolvedAddress": null,
          "currentAddressMatches": null
        },
        "bridge": {
          "applicable": true,
          "deploymentArtifactAddress": "0x6D2457a4ad276000A615295f7A80F79E48CcD318",
          "deploymentArtifactRepo": "livepeer/arbitrum-lpt-bridge",
          "deploymentArtifactPath": "deployments/arbitrumMainnet/L2LPTGateway.json",
          "deploymentArtifactResolvedCommit": "603314d",
          "deploymentArtifactMatchesAddress": true
        },
        "runtimeConsumer": {
          "applicable": false,
          "required": false,
          "repo": null,
          "path": null,
          "resolvedCommit": null,
          "exactAddressMatch": null
        },
        "proxy": {
          "applicable": false,
          "proxyAddress": null,
          "controllerAddress": null,
          "controllerMatchesExpected": null,
          "targetContractId": null,
          "targetContractName": null,
          "implementationAddress": null,
          "implementationName": null,
          "implementationVersion": null,
          "implementationSource": null,
          "expectedImplementationAddress": null,
          "expectedImplementationSource": null,
          "implementationMatchesExpected": null,
          "controllerCurrentProxyMatches": null
        }
      },
      "supported": true,
      "unsupportedNote": null,
      "functions": [{
        "name": "setCounterpart",
        "params": ["address _l1Counterpart"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "L2LPTGateway",
        "signature": "L2LPTGateway.setCounterpart(address _l1Counterpart)"
      }, {
        "name": "outboundTransfer",
        "params": ["address _l1Token", "address _to", "uint256 _amount", "bytes calldata _data"],
        "returns": "bytes memory",
        "stateMutability": null,
        "declaredIn": "L2LPTGateway",
        "signature": "L2LPTGateway.outboundTransfer(address _l1Token, address _to, uint256 _amount, bytes calldata _data) returns bytes memory"
      }, {
        "name": "outboundTransfer",
        "params": ["address _l1Token", "address _to", "uint256 _amount", "uint256", "uint256", "bytes calldata _data"],
        "returns": "bytes memory",
        "stateMutability": null,
        "declaredIn": "L2LPTGateway",
        "signature": "L2LPTGateway.outboundTransfer(address _l1Token, address _to, uint256 _amount, uint256, uint256, bytes calldata _data) returns bytes memory"
      }, {
        "name": "finalizeInboundTransfer",
        "params": ["address _l1Token", "address _from", "address _to", "uint256 _amount", "bytes calldata"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "L2LPTGateway",
        "signature": "L2LPTGateway.finalizeInboundTransfer(address _l1Token, address _from, address _to, uint256 _amount, bytes calldata)"
      }, {
        "name": "counterpartGateway",
        "params": [],
        "returns": "address",
        "stateMutability": "view",
        "declaredIn": "L2LPTGateway",
        "signature": "L2LPTGateway.counterpartGateway() returns address view"
      }, {
        "name": "calculateL2TokenAddress",
        "params": ["address l1Token"],
        "returns": "address",
        "stateMutability": "view",
        "declaredIn": "L2LPTGateway",
        "signature": "L2LPTGateway.calculateL2TokenAddress(address l1Token) returns address view"
      }, {
        "name": "getOutboundCalldata",
        "params": ["address token", "address from", "address to", "uint256 amount", "bytes memory data"],
        "returns": "bytes memory outboundCalldata",
        "stateMutability": "pure",
        "declaredIn": "L2LPTGateway",
        "signature": "L2LPTGateway.getOutboundCalldata(address token, address from, address to, uint256 amount, bytes memory data) returns bytes memory outboundCalldata pure"
      }],
      "sourceContractName": "L2LPTGateway",
      "sourceContractKind": "contract",
      "sourceInheritance": ["IL2LPTGateway", "ControlledGateway", "L2ArbitrumMessenger"],
      "sourceContractFound": true,
      "sourceParseError": null,
      "facts": ["Bridge-derived", "Bridge artifact confirmed", "Active"]
    },
    "l1-lpt-gateway": {
      "slug": "l1-lpt-gateway",
      "name": "L1LPTGateway",
      "canonicalName": "L1LPTGateway",
      "subtitle": "Token Bridge",
      "category": "bridge",
      "chain": "ethereumMainnet",
      "chainLabel": "Ethereum Mainnet",
      "lifecycle": "active",
      "lifecycleLabel": "Active",
      "proofChain": "bridge",
      "proofChainLabel": "Bridge-derived",
      "type": "standalone",
      "currentAddress": "0x6142f1C8bBF02E6A6bd074E8d564c9A5420a0676",
      "proxyAddress": null,
      "targetAddress": null,
      "blockchainHref": "https://etherscan.io/address/0x6142f1C8bBF02E6A6bd074E8d564c9A5420a0676",
      "proxyBlockchainHref": null,
      "targetBlockchainHref": null,
      "contractCodeHref": "https://github.com/livepeer/arbitrum-lpt-bridge/blob/603314d/contracts/L1/gateway/L1LPTGateway.sol",
      "rawContractCodeHref": "https://raw.githubusercontent.com/livepeer/arbitrum-lpt-bridge/603314d/contracts/L1/gateway/L1LPTGateway.sol",
      "contractCodeLabel": "L1LPTGateway.sol",
      "codeSource": {
        "repo": "livepeer/arbitrum-lpt-bridge",
        "branch": "main",
        "path": "contracts/L1/gateway/L1LPTGateway.sol",
        "href": "https://github.com/livepeer/arbitrum-lpt-bridge/blob/603314d/contracts/L1/gateway/L1LPTGateway.sol",
        "resolvedCommit": "603314d",
        "exists": true,
        "resolutionError": null
      },
      "addressSource": {
        "kind": "governor-manifest",
        "repo": "livepeer/governor-scripts",
        "path": "updates/addresses.js",
        "refMode": "default_branch",
        "resolvedCommit": "2cb192a",
        "key": "l1LPTGateway"
      },
      "verification": {
        "status": "strong",
        "lastVerifiedAt": "2026-05-04T07:23:34.305Z",
        "explorer": {
          "family": "etherscan",
          "host": "etherscan.io",
          "addressBaseUrl": "https://etherscan.io/address/",
          "addressUrl": "https://etherscan.io/address/0x6142f1C8bBF02E6A6bd074E8d564c9A5420a0676"
        },
        "controller": {
          "applicable": false,
          "controllerAddress": null,
          "controllerSlot": null,
          "registrationState": "not_applicable",
          "controllerRegistered": null,
          "resolvedAddress": null,
          "currentAddressMatches": null
        },
        "bridge": {
          "applicable": true,
          "deploymentArtifactAddress": "0x6142f1C8bBF02E6A6bd074E8d564c9A5420a0676",
          "deploymentArtifactRepo": "livepeer/arbitrum-lpt-bridge",
          "deploymentArtifactPath": "deployments/mainnet/L1LPTGateway.json",
          "deploymentArtifactResolvedCommit": "603314d",
          "deploymentArtifactMatchesAddress": true
        },
        "runtimeConsumer": {
          "applicable": false,
          "required": false,
          "repo": null,
          "path": null,
          "resolvedCommit": null,
          "exactAddressMatch": null
        },
        "proxy": {
          "applicable": false,
          "proxyAddress": null,
          "controllerAddress": null,
          "controllerMatchesExpected": null,
          "targetContractId": null,
          "targetContractName": null,
          "implementationAddress": null,
          "implementationName": null,
          "implementationVersion": null,
          "implementationSource": null,
          "expectedImplementationAddress": null,
          "expectedImplementationSource": null,
          "implementationMatchesExpected": null,
          "controllerCurrentProxyMatches": null
        }
      },
      "supported": true,
      "unsupportedNote": null,
      "functions": [{
        "name": "setCounterpart",
        "params": ["address _l2Counterpart"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "L1LPTGateway",
        "signature": "L1LPTGateway.setCounterpart(address _l2Counterpart)"
      }, {
        "name": "setMinter",
        "params": ["address _minter"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "L1LPTGateway",
        "signature": "L1LPTGateway.setMinter(address _minter)"
      }, {
        "name": "outboundTransfer",
        "params": ["address _l1Token", "address _to", "uint256 _amount", "uint256 _maxGas", "uint256 _gasPriceBid", "bytes calldata _data"],
        "returns": "bytes memory",
        "stateMutability": "payable",
        "declaredIn": "L1LPTGateway",
        "signature": "L1LPTGateway.outboundTransfer(address _l1Token, address _to, uint256 _amount, uint256 _maxGas, uint256 _gasPriceBid, bytes calldata _data) returns bytes memory payable"
      }, {
        "name": "finalizeInboundTransfer",
        "params": ["address l1Token", "address from", "address to", "uint256 amount", "bytes calldata data"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "L1LPTGateway",
        "signature": "L1LPTGateway.finalizeInboundTransfer(address l1Token, address from, address to, uint256 amount, bytes calldata data)"
      }, {
        "name": "counterpartGateway",
        "params": [],
        "returns": "address",
        "stateMutability": "view",
        "declaredIn": "L1LPTGateway",
        "signature": "L1LPTGateway.counterpartGateway() returns address view"
      }, {
        "name": "calculateL2TokenAddress",
        "params": ["address l1Token"],
        "returns": "address",
        "stateMutability": "view",
        "declaredIn": "L1LPTGateway",
        "signature": "L1LPTGateway.calculateL2TokenAddress(address l1Token) returns address view"
      }, {
        "name": "getOutboundCalldata",
        "params": ["address l1Token", "address from", "address to", "uint256 amount", "bytes memory data"],
        "returns": "bytes memory outboundCalldata",
        "stateMutability": "pure",
        "declaredIn": "L1LPTGateway",
        "signature": "L1LPTGateway.getOutboundCalldata(address l1Token, address from, address to, uint256 amount, bytes memory data) returns bytes memory outboundCalldata pure"
      }],
      "sourceContractName": "L1LPTGateway",
      "sourceContractKind": "contract",
      "sourceInheritance": ["IL1LPTGateway", "ControlledGateway", "L1ArbitrumMessenger"],
      "sourceContractFound": true,
      "sourceParseError": null,
      "facts": ["Bridge-derived", "Bridge artifact confirmed", "Active"]
    },
    "l1-escrow": {
      "slug": "l1-escrow",
      "name": "L1Escrow",
      "canonicalName": "L1Escrow",
      "subtitle": "Token Bridge Escrow",
      "category": "bridge",
      "chain": "ethereumMainnet",
      "chainLabel": "Ethereum Mainnet",
      "lifecycle": "active",
      "lifecycleLabel": "Active",
      "proofChain": "bridge",
      "proofChainLabel": "Bridge-derived",
      "type": "standalone",
      "currentAddress": "0x6A23F4940BD5BA117Da261f98aae51A8BFfa210A",
      "proxyAddress": null,
      "targetAddress": null,
      "blockchainHref": "https://etherscan.io/address/0x6A23F4940BD5BA117Da261f98aae51A8BFfa210A",
      "proxyBlockchainHref": null,
      "targetBlockchainHref": null,
      "contractCodeHref": "https://github.com/livepeer/arbitrum-lpt-bridge/blob/603314d/contracts/L1/escrow/L1Escrow.sol",
      "rawContractCodeHref": "https://raw.githubusercontent.com/livepeer/arbitrum-lpt-bridge/603314d/contracts/L1/escrow/L1Escrow.sol",
      "contractCodeLabel": "L1Escrow.sol",
      "codeSource": {
        "repo": "livepeer/arbitrum-lpt-bridge",
        "branch": "main",
        "path": "contracts/L1/escrow/L1Escrow.sol",
        "href": "https://github.com/livepeer/arbitrum-lpt-bridge/blob/603314d/contracts/L1/escrow/L1Escrow.sol",
        "resolvedCommit": "603314d",
        "exists": true,
        "resolutionError": null
      },
      "addressSource": {
        "kind": "deployment-artifact",
        "repo": "livepeer/arbitrum-lpt-bridge",
        "path": "deployments/mainnet/L1Escrow.json",
        "refMode": "resolved-commit",
        "resolvedCommit": "603314d",
        "key": "deployments/mainnet/L1Escrow.json"
      },
      "verification": {
        "status": "strong",
        "lastVerifiedAt": "2026-05-04T07:23:34.305Z",
        "explorer": {
          "family": "etherscan",
          "host": "etherscan.io",
          "addressBaseUrl": "https://etherscan.io/address/",
          "addressUrl": "https://etherscan.io/address/0x6A23F4940BD5BA117Da261f98aae51A8BFfa210A"
        },
        "controller": {
          "applicable": false,
          "controllerAddress": null,
          "controllerSlot": null,
          "registrationState": "not_applicable",
          "controllerRegistered": null,
          "resolvedAddress": null,
          "currentAddressMatches": null
        },
        "bridge": {
          "applicable": true,
          "deploymentArtifactAddress": "0x6A23F4940BD5BA117Da261f98aae51A8BFfa210A",
          "deploymentArtifactRepo": "livepeer/arbitrum-lpt-bridge",
          "deploymentArtifactPath": "deployments/mainnet/L1Escrow.json",
          "deploymentArtifactResolvedCommit": "603314d",
          "deploymentArtifactMatchesAddress": true
        },
        "runtimeConsumer": {
          "applicable": false,
          "required": false,
          "repo": null,
          "path": null,
          "resolvedCommit": null,
          "exactAddressMatch": null
        },
        "proxy": {
          "applicable": false,
          "proxyAddress": null,
          "controllerAddress": null,
          "controllerMatchesExpected": null,
          "targetContractId": null,
          "targetContractName": null,
          "implementationAddress": null,
          "implementationName": null,
          "implementationVersion": null,
          "implementationSource": null,
          "expectedImplementationAddress": null,
          "expectedImplementationSource": null,
          "implementationMatchesExpected": null,
          "controllerCurrentProxyMatches": null
        }
      },
      "supported": true,
      "unsupportedNote": null,
      "functions": [{
        "name": "approve",
        "params": ["address _token", "address _spender", "uint256 _value"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "L1Escrow",
        "signature": "L1Escrow.approve(address _token, address _spender, uint256 _value)"
      }],
      "sourceContractName": "L1Escrow",
      "sourceContractKind": "contract",
      "sourceInheritance": ["AccessControl"],
      "sourceContractFound": true,
      "sourceParseError": null,
      "facts": ["Bridge-derived", "Bridge artifact confirmed", "Active"]
    },
    "livepeer-token-faucet": {
      "slug": "livepeer-token-faucet",
      "name": "LivepeerTokenFaucet",
      "canonicalName": "LivepeerTokenFaucet",
      "subtitle": "Local development utility contract.",
      "category": "token",
      "chain": null,
      "chainLabel": null,
      "lifecycle": "source_only",
      "lifecycleLabel": "Source only",
      "proofChain": "source-only",
      "proofChainLabel": "Source-backed",
      "type": "standalone",
      "currentAddress": null,
      "proxyAddress": null,
      "targetAddress": null,
      "blockchainHref": null,
      "proxyBlockchainHref": null,
      "targetBlockchainHref": null,
      "contractCodeHref": "https://github.com/livepeer/protocol/blob/6e6b452/contracts/token/LivepeerTokenFaucet.sol",
      "rawContractCodeHref": "https://raw.githubusercontent.com/livepeer/protocol/6e6b452/contracts/token/LivepeerTokenFaucet.sol",
      "contractCodeLabel": "LivepeerTokenFaucet.sol",
      "codeSource": {
        "repo": "livepeer/protocol",
        "branch": "delta",
        "path": "contracts/token/LivepeerTokenFaucet.sol",
        "href": "https://github.com/livepeer/protocol/blob/6e6b452/contracts/token/LivepeerTokenFaucet.sol",
        "resolvedCommit": "6e6b452",
        "exists": true,
        "resolutionError": null
      },
      "addressSource": null,
      "verification": null,
      "supported": false,
      "unsupportedNote": "Local development utility contract.",
      "functions": [{
        "name": "addToWhitelist",
        "params": ["address _addr"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "LivepeerTokenFaucet",
        "signature": "LivepeerTokenFaucet.addToWhitelist(address _addr)"
      }, {
        "name": "removeFromWhitelist",
        "params": ["address _addr"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "LivepeerTokenFaucet",
        "signature": "LivepeerTokenFaucet.removeFromWhitelist(address _addr)"
      }, {
        "name": "request",
        "params": [],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "LivepeerTokenFaucet",
        "signature": "LivepeerTokenFaucet.request()"
      }],
      "sourceContractName": "LivepeerTokenFaucet",
      "sourceContractKind": "contract",
      "sourceInheritance": ["Ownable"],
      "sourceContractFound": true,
      "sourceParseError": null,
      "facts": []
    },
    "bonding-votes": {
      "slug": "bonding-votes",
      "name": "BondingVotes",
      "canonicalName": "BondingVotes",
      "subtitle": "Voting Power Checkpoints",
      "category": "governance",
      "chain": "arbitrumOne",
      "chainLabel": "Arbitrum One",
      "lifecycle": "active",
      "lifecycleLabel": "Active",
      "proofChain": "controller",
      "proofChainLabel": "Controller-managed",
      "type": "proxy",
      "currentAddress": "0x0b9c254837e72ebe9fe04960c43b69782e68169a",
      "proxyAddress": "0x0b9c254837e72ebe9fe04960c43b69782e68169a",
      "targetAddress": "0x68AF80376Bc1CA0C25a83b28e5570E8c7bdD3119",
      "blockchainHref": "https://arbiscan.io/address/0x0b9c254837e72ebe9fe04960c43b69782e68169a",
      "proxyBlockchainHref": "https://arbiscan.io/address/0x0b9c254837e72ebe9fe04960c43b69782e68169a",
      "targetBlockchainHref": "https://arbiscan.io/address/0x68AF80376Bc1CA0C25a83b28e5570E8c7bdD3119",
      "contractCodeHref": "https://github.com/livepeer/protocol/blob/6e6b452/contracts/bonding/BondingVotes.sol",
      "rawContractCodeHref": "https://raw.githubusercontent.com/livepeer/protocol/6e6b452/contracts/bonding/BondingVotes.sol",
      "contractCodeLabel": "BondingVotes.sol",
      "codeSource": {
        "repo": "livepeer/protocol",
        "branch": "delta",
        "path": "contracts/bonding/BondingVotes.sol",
        "href": "https://github.com/livepeer/protocol/blob/6e6b452/contracts/bonding/BondingVotes.sol",
        "resolvedCommit": "6e6b452",
        "exists": true,
        "resolutionError": null
      },
      "addressSource": {
        "kind": "controller-runtime",
        "repo": null,
        "path": null,
        "refMode": "onchain-controller",
        "resolvedCommit": null,
        "key": "BondingVotes"
      },
      "verification": {
        "status": "strong",
        "lastVerifiedAt": "2026-05-04T07:23:26.187Z",
        "explorer": {
          "family": "etherscan",
          "host": "arbiscan.io",
          "addressBaseUrl": "https://arbiscan.io/address/",
          "addressUrl": "https://arbiscan.io/address/0x0b9c254837e72ebe9fe04960c43b69782e68169a"
        },
        "controller": {
          "applicable": true,
          "controllerAddress": "0xD8E8328501E9645d16Cf49539efC04f734606ee4",
          "controllerSlot": "BondingVotes",
          "registrationState": "registered",
          "controllerRegistered": true,
          "resolvedAddress": "0x0b9c254837e72ebe9fe04960c43b69782e68169a",
          "currentAddressMatches": true
        },
        "bridge": {
          "applicable": false,
          "deploymentArtifactAddress": null,
          "deploymentArtifactRepo": null,
          "deploymentArtifactPath": null,
          "deploymentArtifactResolvedCommit": null,
          "deploymentArtifactMatchesAddress": null
        },
        "runtimeConsumer": {
          "applicable": false,
          "required": false,
          "repo": null,
          "path": null,
          "resolvedCommit": null,
          "exactAddressMatch": null
        },
        "proxy": {
          "applicable": true,
          "proxyAddress": "0x0b9c254837e72ebe9fe04960c43b69782e68169a",
          "controllerAddress": "0xd8e8328501e9645d16cf49539efc04f734606ee4",
          "controllerMatchesExpected": true,
          "targetContractId": "0x7de5a5b8ecd5bb031f348e5f6eaba02944a498be282a3242da27f5a559dbd5dc",
          "targetContractName": "BondingVotesTarget",
          "implementationAddress": "0x68af80376bc1ca0c25a83b28e5570e8c7bdd3119",
          "implementationName": null,
          "implementationVersion": null,
          "implementationSource": "proxy-runtime-controller",
          "expectedImplementationAddress": null,
          "expectedImplementationSource": null,
          "implementationMatchesExpected": null,
          "controllerCurrentProxyMatches": true
        }
      },
      "supported": true,
      "unsupportedNote": null,
      "functions": [{
        "name": "name",
        "params": [],
        "returns": "string memory",
        "stateMutability": "pure",
        "declaredIn": "BondingVotes",
        "signature": "BondingVotes.name() returns string memory pure"
      }, {
        "name": "symbol",
        "params": [],
        "returns": "string memory",
        "stateMutability": "pure",
        "declaredIn": "BondingVotes",
        "signature": "BondingVotes.symbol() returns string memory pure"
      }, {
        "name": "decimals",
        "params": [],
        "returns": "uint8",
        "stateMutability": "pure",
        "declaredIn": "BondingVotes",
        "signature": "BondingVotes.decimals() returns uint8 pure"
      }, {
        "name": "clock",
        "params": [],
        "returns": "uint48",
        "stateMutability": "view",
        "declaredIn": "BondingVotes",
        "signature": "BondingVotes.clock() returns uint48 view"
      }, {
        "name": "CLOCK_MODE",
        "params": [],
        "returns": "string memory",
        "stateMutability": "pure",
        "declaredIn": "BondingVotes",
        "signature": "BondingVotes.CLOCK_MODE() returns string memory pure"
      }, {
        "name": "getVotes",
        "params": ["address _account"],
        "returns": "uint256",
        "stateMutability": "view",
        "declaredIn": "BondingVotes",
        "signature": "BondingVotes.getVotes(address _account) returns uint256 view"
      }, {
        "name": "getPastVotes",
        "params": ["address _account", "uint256 _round"],
        "returns": "uint256",
        "stateMutability": "view",
        "declaredIn": "BondingVotes",
        "signature": "BondingVotes.getPastVotes(address _account, uint256 _round) returns uint256 view"
      }, {
        "name": "totalSupply",
        "params": [],
        "returns": "uint256",
        "stateMutability": "view",
        "declaredIn": "BondingVotes",
        "signature": "BondingVotes.totalSupply() returns uint256 view"
      }, {
        "name": "getPastTotalSupply",
        "params": ["uint256 _round"],
        "returns": "uint256",
        "stateMutability": "view",
        "declaredIn": "BondingVotes",
        "signature": "BondingVotes.getPastTotalSupply(uint256 _round) returns uint256 view"
      }, {
        "name": "delegates",
        "params": ["address _account"],
        "returns": "address",
        "stateMutability": "view",
        "declaredIn": "BondingVotes",
        "signature": "BondingVotes.delegates(address _account) returns address view"
      }, {
        "name": "delegatedAt",
        "params": ["address _account", "uint256 _round"],
        "returns": "address",
        "stateMutability": "view",
        "declaredIn": "BondingVotes",
        "signature": "BondingVotes.delegatedAt(address _account, uint256 _round) returns address view"
      }, {
        "name": "delegate",
        "params": ["address"],
        "returns": null,
        "stateMutability": "pure",
        "declaredIn": "BondingVotes",
        "signature": "BondingVotes.delegate(address) pure"
      }, {
        "name": "delegateBySig",
        "params": ["address", "uint256", "uint256", "uint8", "bytes32", "bytes32"],
        "returns": null,
        "stateMutability": "pure",
        "declaredIn": "BondingVotes",
        "signature": "BondingVotes.delegateBySig(address, uint256, uint256, uint8, bytes32, bytes32) pure"
      }, {
        "name": "checkpointBondingState",
        "params": ["address _account", "uint256 _startRound", "uint256 _bondedAmount", "address _delegateAddress", "uint256 _delegatedAmount", "uint256 _lastClaimRound", "uint256 _lastRewardRound"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "BondingVotes",
        "signature": "BondingVotes.checkpointBondingState(address _account, uint256 _startRound, uint256 _bondedAmount, address _delegateAddress, uint256 _delegatedAmount, uint256 _lastClaimRound, uint256 _lastRewardRound)"
      }, {
        "name": "checkpointTotalActiveStake",
        "params": ["uint256 _totalStake", "uint256 _round"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "BondingVotes",
        "signature": "BondingVotes.checkpointTotalActiveStake(uint256 _totalStake, uint256 _round)"
      }, {
        "name": "hasCheckpoint",
        "params": ["address _account"],
        "returns": "bool",
        "stateMutability": "view",
        "declaredIn": "BondingVotes",
        "signature": "BondingVotes.hasCheckpoint(address _account) returns bool view"
      }, {
        "name": "getTotalActiveStakeAt",
        "params": ["uint256 _round"],
        "returns": "uint256",
        "stateMutability": "view",
        "declaredIn": "BondingVotes",
        "signature": "BondingVotes.getTotalActiveStakeAt(uint256 _round) returns uint256 view"
      }, {
        "name": "getVotesAndDelegateAtRoundStart",
        "params": ["address _account", "uint256 _round"],
        "returns": "(uint256 votes, address delegateAddress)",
        "stateMutability": "view",
        "declaredIn": "BondingVotes",
        "signature": "BondingVotes.getVotesAndDelegateAtRoundStart(address _account, uint256 _round) returns (uint256 votes, address delegateAddress) view"
      }],
      "sourceContractName": "BondingVotes",
      "sourceContractKind": "contract",
      "sourceInheritance": ["ManagerProxyTarget", "IBondingVotes"],
      "sourceContractFound": true,
      "sourceParseError": null,
      "facts": ["Controller registered", "Active", "Proxy target resolved", "Target V2"]
    },
    "governor": {
      "slug": "governor",
      "name": "Governor",
      "canonicalName": "Governor",
      "subtitle": "Upgrade Executor",
      "category": "governance",
      "chain": "arbitrumOne",
      "chainLabel": "Arbitrum One",
      "lifecycle": "active",
      "lifecycleLabel": "Active",
      "proofChain": "detached",
      "proofChainLabel": "Detached runtime-backed",
      "type": "standalone",
      "currentAddress": "0xD9dEd6f9959176F0A04dcf88a0d2306178A736a6",
      "proxyAddress": null,
      "targetAddress": null,
      "blockchainHref": "https://arbiscan.io/address/0xD9dEd6f9959176F0A04dcf88a0d2306178A736a6",
      "proxyBlockchainHref": null,
      "targetBlockchainHref": null,
      "contractCodeHref": "https://github.com/livepeer/protocol/blob/6e6b452/contracts/governance/Governor.sol",
      "rawContractCodeHref": "https://raw.githubusercontent.com/livepeer/protocol/6e6b452/contracts/governance/Governor.sol",
      "contractCodeLabel": "Governor.sol",
      "codeSource": {
        "repo": "livepeer/protocol",
        "branch": "delta",
        "path": "contracts/governance/Governor.sol",
        "href": "https://github.com/livepeer/protocol/blob/6e6b452/contracts/governance/Governor.sol",
        "resolvedCommit": "6e6b452",
        "exists": true,
        "resolutionError": null
      },
      "addressSource": {
        "kind": "deployment-artifact",
        "repo": "livepeer/protocol",
        "path": "deployments/arbitrumMainnet/Governor.json",
        "refMode": "resolved-commit",
        "resolvedCommit": "6e6b452",
        "key": "deployments/arbitrumMainnet/Governor.json"
      },
      "verification": {
        "status": "partial",
        "lastVerifiedAt": "2026-05-04T07:23:26.187Z",
        "explorer": {
          "family": "etherscan",
          "host": "arbiscan.io",
          "addressBaseUrl": "https://arbiscan.io/address/",
          "addressUrl": "https://arbiscan.io/address/0xD9dEd6f9959176F0A04dcf88a0d2306178A736a6"
        },
        "controller": {
          "applicable": false,
          "controllerAddress": null,
          "controllerSlot": null,
          "registrationState": "not_applicable",
          "controllerRegistered": null,
          "resolvedAddress": null,
          "currentAddressMatches": null
        },
        "bridge": {
          "applicable": false,
          "deploymentArtifactAddress": "0xD9dEd6f9959176F0A04dcf88a0d2306178A736a6",
          "deploymentArtifactRepo": "livepeer/protocol",
          "deploymentArtifactPath": "deployments/arbitrumMainnet/Governor.json",
          "deploymentArtifactResolvedCommit": "6e6b452",
          "deploymentArtifactMatchesAddress": true
        },
        "runtimeConsumer": {
          "applicable": false,
          "required": false,
          "repo": null,
          "path": null,
          "resolvedCommit": null,
          "exactAddressMatch": null
        },
        "proxy": {
          "applicable": false,
          "proxyAddress": null,
          "controllerAddress": null,
          "controllerMatchesExpected": null,
          "targetContractId": null,
          "targetContractName": null,
          "implementationAddress": null,
          "implementationName": null,
          "implementationVersion": null,
          "implementationSource": null,
          "expectedImplementationAddress": null,
          "expectedImplementationSource": null,
          "implementationMatchesExpected": null,
          "controllerCurrentProxyMatches": null
        }
      },
      "supported": true,
      "unsupportedNote": null,
      "functions": [{
        "name": "transferOwnership",
        "params": ["address newOwner"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "Governor",
        "signature": "Governor.transferOwnership(address newOwner)"
      }, {
        "name": "stage",
        "params": ["Update memory _update", "uint256 _delay"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "Governor",
        "signature": "Governor.stage(Update memory _update, uint256 _delay)"
      }, {
        "name": "execute",
        "params": ["Update memory _update"],
        "returns": null,
        "stateMutability": "payable",
        "declaredIn": "Governor",
        "signature": "Governor.execute(Update memory _update) payable"
      }, {
        "name": "cancel",
        "params": ["Update memory _update"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "Governor",
        "signature": "Governor.cancel(Update memory _update)"
      }],
      "sourceContractName": "Governor",
      "sourceContractKind": "contract",
      "sourceInheritance": [],
      "sourceContractFound": true,
      "sourceParseError": null,
      "facts": ["Deployment artifact confirmed", "Active"]
    },
    "livepeer-governor": {
      "slug": "livepeer-governor",
      "name": "LivepeerGovernor",
      "canonicalName": "LivepeerGovernor",
      "subtitle": "On-chain Voting",
      "category": "governance",
      "chain": "arbitrumOne",
      "chainLabel": "Arbitrum One",
      "lifecycle": "active",
      "lifecycleLabel": "Active",
      "proofChain": "controller",
      "proofChainLabel": "Controller-managed",
      "type": "proxy",
      "currentAddress": "0xcfe4e2879b786c3aa075813f0e364bb5accb6aa0",
      "proxyAddress": "0xcfe4e2879b786c3aa075813f0e364bb5accb6aa0",
      "targetAddress": "0xd2Ce37BCB287CaDc40647f567C2D3C4220901634",
      "blockchainHref": "https://arbiscan.io/address/0xcfe4e2879b786c3aa075813f0e364bb5accb6aa0",
      "proxyBlockchainHref": "https://arbiscan.io/address/0xcfe4e2879b786c3aa075813f0e364bb5accb6aa0",
      "targetBlockchainHref": "https://arbiscan.io/address/0xd2Ce37BCB287CaDc40647f567C2D3C4220901634",
      "contractCodeHref": "https://github.com/livepeer/protocol/blob/6e6b452/contracts/treasury/LivepeerGovernor.sol",
      "rawContractCodeHref": "https://raw.githubusercontent.com/livepeer/protocol/6e6b452/contracts/treasury/LivepeerGovernor.sol",
      "contractCodeLabel": "LivepeerGovernor.sol",
      "codeSource": {
        "repo": "livepeer/protocol",
        "branch": "delta",
        "path": "contracts/treasury/LivepeerGovernor.sol",
        "href": "https://github.com/livepeer/protocol/blob/6e6b452/contracts/treasury/LivepeerGovernor.sol",
        "resolvedCommit": "6e6b452",
        "exists": true,
        "resolutionError": null
      },
      "addressSource": {
        "kind": "controller-runtime",
        "repo": null,
        "path": null,
        "refMode": "onchain-controller",
        "resolvedCommit": null,
        "key": "LivepeerGovernor"
      },
      "verification": {
        "status": "strong",
        "lastVerifiedAt": "2026-05-04T07:23:26.187Z",
        "explorer": {
          "family": "etherscan",
          "host": "arbiscan.io",
          "addressBaseUrl": "https://arbiscan.io/address/",
          "addressUrl": "https://arbiscan.io/address/0xcfe4e2879b786c3aa075813f0e364bb5accb6aa0"
        },
        "controller": {
          "applicable": true,
          "controllerAddress": "0xD8E8328501E9645d16Cf49539efC04f734606ee4",
          "controllerSlot": "LivepeerGovernor",
          "registrationState": "registered",
          "controllerRegistered": true,
          "resolvedAddress": "0xcfe4e2879b786c3aa075813f0e364bb5accb6aa0",
          "currentAddressMatches": true
        },
        "bridge": {
          "applicable": false,
          "deploymentArtifactAddress": null,
          "deploymentArtifactRepo": null,
          "deploymentArtifactPath": null,
          "deploymentArtifactResolvedCommit": null,
          "deploymentArtifactMatchesAddress": null
        },
        "runtimeConsumer": {
          "applicable": false,
          "required": false,
          "repo": null,
          "path": null,
          "resolvedCommit": null,
          "exactAddressMatch": null
        },
        "proxy": {
          "applicable": true,
          "proxyAddress": "0xcfe4e2879b786c3aa075813f0e364bb5accb6aa0",
          "controllerAddress": "0xd8e8328501e9645d16cf49539efc04f734606ee4",
          "controllerMatchesExpected": true,
          "targetContractId": "0xd4c5f51c55641d608f9aa8c83a618a0b4bafdf778911c37f61b63c6be7a6992e",
          "targetContractName": "LivepeerGovernorTarget",
          "implementationAddress": "0xd2ce37bcb287cadc40647f567c2d3c4220901634",
          "implementationName": null,
          "implementationVersion": null,
          "implementationSource": "proxy-runtime-controller",
          "expectedImplementationAddress": null,
          "expectedImplementationSource": null,
          "implementationMatchesExpected": null,
          "controllerCurrentProxyMatches": true
        }
      },
      "supported": true,
      "unsupportedNote": null,
      "functions": [{
        "name": "initialize",
        "params": ["uint256 initialVotingDelay", "uint256 initialVotingPeriod", "uint256 initialProposalThreshold", "uint256 initialQuorum", "uint256 quota"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "LivepeerGovernor",
        "signature": "LivepeerGovernor.initialize(uint256 initialVotingDelay, uint256 initialVotingPeriod, uint256 initialProposalThreshold, uint256 initialQuorum, uint256 quota)"
      }, {
        "name": "quorumDenominator",
        "params": [],
        "returns": "uint256",
        "stateMutability": "view",
        "declaredIn": "LivepeerGovernor",
        "signature": "LivepeerGovernor.quorumDenominator() returns uint256 view"
      }, {
        "name": "votes",
        "params": [],
        "returns": "IVotes",
        "stateMutability": "view",
        "declaredIn": "LivepeerGovernor",
        "signature": "LivepeerGovernor.votes() returns IVotes view"
      }, {
        "name": "bumpGovernorVotesTokenAddress",
        "params": [],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "LivepeerGovernor",
        "signature": "LivepeerGovernor.bumpGovernorVotesTokenAddress()"
      }, {
        "name": "proposalThreshold",
        "params": [],
        "returns": "uint256",
        "stateMutability": "view",
        "declaredIn": "LivepeerGovernor",
        "signature": "LivepeerGovernor.proposalThreshold() returns uint256 view"
      }, {
        "name": "state",
        "params": ["uint256 proposalId"],
        "returns": "ProposalState",
        "stateMutability": "view",
        "declaredIn": "LivepeerGovernor",
        "signature": "LivepeerGovernor.state(uint256 proposalId) returns ProposalState view"
      }, {
        "name": "supportsInterface",
        "params": ["bytes4 interfaceId"],
        "returns": "bool",
        "stateMutability": "view",
        "declaredIn": "LivepeerGovernor",
        "signature": "LivepeerGovernor.supportsInterface(bytes4 interfaceId) returns bool view"
      }],
      "sourceContractName": "LivepeerGovernor",
      "sourceContractKind": "contract",
      "sourceInheritance": ["ManagerProxyTarget", "Initializable", "GovernorUpgradeable", "GovernorSettingsUpgradeable", "GovernorTimelockControlUpgradeable", "GovernorVotesUpgradeable", "GovernorVotesQuorumFractionUpgradeable", "GovernorCountingOverridable"],
      "sourceContractFound": true,
      "sourceParseError": null,
      "facts": ["Controller registered", "Active", "Proxy target resolved"]
    },
    "treasury": {
      "slug": "treasury",
      "name": "Treasury",
      "canonicalName": "Treasury",
      "subtitle": "Protocol Treasury",
      "category": "governance",
      "chain": "arbitrumOne",
      "chainLabel": "Arbitrum One",
      "lifecycle": "active",
      "lifecycleLabel": "Active",
      "proofChain": "controller",
      "proofChainLabel": "Controller-managed",
      "type": "standalone",
      "currentAddress": "0xf82c1ff415f1fcf582554fdba790e27019c8e8c4",
      "proxyAddress": null,
      "targetAddress": null,
      "blockchainHref": "https://arbiscan.io/address/0xf82c1ff415f1fcf582554fdba790e27019c8e8c4",
      "proxyBlockchainHref": null,
      "targetBlockchainHref": null,
      "contractCodeHref": "https://github.com/livepeer/protocol/blob/6e6b452/contracts/treasury/Treasury.sol",
      "rawContractCodeHref": "https://raw.githubusercontent.com/livepeer/protocol/6e6b452/contracts/treasury/Treasury.sol",
      "contractCodeLabel": "Treasury.sol",
      "codeSource": {
        "repo": "livepeer/protocol",
        "branch": "delta",
        "path": "contracts/treasury/Treasury.sol",
        "href": "https://github.com/livepeer/protocol/blob/6e6b452/contracts/treasury/Treasury.sol",
        "resolvedCommit": "6e6b452",
        "exists": true,
        "resolutionError": null
      },
      "addressSource": {
        "kind": "controller-runtime",
        "repo": null,
        "path": null,
        "refMode": "onchain-controller",
        "resolvedCommit": null,
        "key": "Treasury"
      },
      "verification": {
        "status": "strong",
        "lastVerifiedAt": "2026-05-04T07:23:26.187Z",
        "explorer": {
          "family": "etherscan",
          "host": "arbiscan.io",
          "addressBaseUrl": "https://arbiscan.io/address/",
          "addressUrl": "https://arbiscan.io/address/0xf82c1ff415f1fcf582554fdba790e27019c8e8c4"
        },
        "controller": {
          "applicable": true,
          "controllerAddress": "0xD8E8328501E9645d16Cf49539efC04f734606ee4",
          "controllerSlot": "Treasury",
          "registrationState": "registered",
          "controllerRegistered": true,
          "resolvedAddress": "0xf82c1ff415f1fcf582554fdba790e27019c8e8c4",
          "currentAddressMatches": true
        },
        "bridge": {
          "applicable": false,
          "deploymentArtifactAddress": null,
          "deploymentArtifactRepo": null,
          "deploymentArtifactPath": null,
          "deploymentArtifactResolvedCommit": null,
          "deploymentArtifactMatchesAddress": null
        },
        "runtimeConsumer": {
          "applicable": false,
          "required": false,
          "repo": null,
          "path": null,
          "resolvedCommit": null,
          "exactAddressMatch": null
        },
        "proxy": {
          "applicable": false,
          "proxyAddress": null,
          "controllerAddress": null,
          "controllerMatchesExpected": null,
          "targetContractId": null,
          "targetContractName": null,
          "implementationAddress": null,
          "implementationName": null,
          "implementationVersion": null,
          "implementationSource": null,
          "expectedImplementationAddress": null,
          "expectedImplementationSource": null,
          "implementationMatchesExpected": null,
          "controllerCurrentProxyMatches": null
        }
      },
      "supported": true,
      "unsupportedNote": null,
      "functions": [{
        "name": "initialize",
        "params": ["uint256 minDelay", "address[] memory proposers", "address[] memory executors", "address admin"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "Treasury",
        "signature": "Treasury.initialize(uint256 minDelay, address[] memory proposers, address[] memory executors, address admin)"
      }],
      "sourceContractName": "Treasury",
      "sourceContractKind": "contract",
      "sourceInheritance": ["Initializable", "TimelockControllerUpgradeable"],
      "sourceContractFound": true,
      "sourceParseError": null,
      "facts": ["Controller registered", "Active"]
    },
    "l2-migrator": {
      "slug": "l2-migrator",
      "name": "L2Migrator",
      "canonicalName": "L2Migrator",
      "subtitle": "Stake Migration",
      "category": "migration",
      "chain": "arbitrumOne",
      "chainLabel": "Arbitrum One",
      "lifecycle": "migration_residual",
      "lifecycleLabel": "Migration",
      "proofChain": "controller",
      "proofChainLabel": "Controller-managed",
      "type": "proxy",
      "currentAddress": "0x148d5b6b4df9530c7c76a810bd1cdf69ec4c2085",
      "proxyAddress": "0x148d5b6b4df9530c7c76a810bd1cdf69ec4c2085",
      "targetAddress": "0x93bb030735747708b4d33093a98d4c804cd6b58c",
      "blockchainHref": "https://arbiscan.io/address/0x148d5b6b4df9530c7c76a810bd1cdf69ec4c2085",
      "proxyBlockchainHref": "https://arbiscan.io/address/0x148d5b6b4df9530c7c76a810bd1cdf69ec4c2085",
      "targetBlockchainHref": "https://arbiscan.io/address/0x93bb030735747708b4d33093a98d4c804cd6b58c",
      "contractCodeHref": "https://github.com/livepeer/arbitrum-lpt-bridge/blob/603314d/contracts/L2/gateway/L2Migrator.sol",
      "rawContractCodeHref": "https://raw.githubusercontent.com/livepeer/arbitrum-lpt-bridge/603314d/contracts/L2/gateway/L2Migrator.sol",
      "contractCodeLabel": "L2Migrator.sol",
      "codeSource": {
        "repo": "livepeer/arbitrum-lpt-bridge",
        "branch": "main",
        "path": "contracts/L2/gateway/L2Migrator.sol",
        "href": "https://github.com/livepeer/arbitrum-lpt-bridge/blob/603314d/contracts/L2/gateway/L2Migrator.sol",
        "resolvedCommit": "603314d",
        "exists": true,
        "resolutionError": null
      },
      "addressSource": {
        "kind": "controller-runtime",
        "repo": null,
        "path": null,
        "refMode": "onchain-controller",
        "resolvedCommit": null,
        "key": "L2Migrator"
      },
      "verification": {
        "status": "strong",
        "lastVerifiedAt": "2026-05-04T07:23:26.187Z",
        "explorer": {
          "family": "etherscan",
          "host": "arbiscan.io",
          "addressBaseUrl": "https://arbiscan.io/address/",
          "addressUrl": "https://arbiscan.io/address/0x148d5b6b4df9530c7c76a810bd1cdf69ec4c2085"
        },
        "controller": {
          "applicable": true,
          "controllerAddress": "0xD8E8328501E9645d16Cf49539efC04f734606ee4",
          "controllerSlot": "L2Migrator",
          "registrationState": "registered",
          "controllerRegistered": true,
          "resolvedAddress": "0x148d5b6b4df9530c7c76a810bd1cdf69ec4c2085",
          "currentAddressMatches": true
        },
        "bridge": {
          "applicable": false,
          "deploymentArtifactAddress": null,
          "deploymentArtifactRepo": null,
          "deploymentArtifactPath": null,
          "deploymentArtifactResolvedCommit": null,
          "deploymentArtifactMatchesAddress": null
        },
        "runtimeConsumer": {
          "applicable": false,
          "required": false,
          "repo": null,
          "path": null,
          "resolvedCommit": null,
          "exactAddressMatch": null
        },
        "proxy": {
          "applicable": true,
          "proxyAddress": "0x148d5b6b4df9530c7c76a810bd1cdf69ec4c2085",
          "controllerAddress": "0xd8e8328501e9645d16cf49539efc04f734606ee4",
          "controllerMatchesExpected": true,
          "targetContractId": "0xf2067c9567f013942aa0abbd1c844dbf9301abbb14dba85f598a220968c88dd9",
          "targetContractName": "L2MigratorTarget",
          "implementationAddress": "0x93bb030735747708b4d33093a98d4c804cd6b58c",
          "implementationName": null,
          "implementationVersion": null,
          "implementationSource": "proxy-runtime-controller",
          "expectedImplementationAddress": null,
          "expectedImplementationSource": null,
          "implementationMatchesExpected": null,
          "controllerCurrentProxyMatches": true
        }
      },
      "supported": true,
      "unsupportedNote": null,
      "functions": [{
        "name": "initialize",
        "params": ["address _l1MigratorAddr", "address _delegatorPoolImpl"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "L2Migrator",
        "signature": "L2Migrator.initialize(address _l1MigratorAddr, address _delegatorPoolImpl)"
      }, {
        "name": "setL1Migrator",
        "params": ["address _l1MigratorAddr"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "L2Migrator",
        "signature": "L2Migrator.setL1Migrator(address _l1MigratorAddr)"
      }, {
        "name": "setDelegatorPoolImpl",
        "params": ["address _delegatorPoolImpl"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "L2Migrator",
        "signature": "L2Migrator.setDelegatorPoolImpl(address _delegatorPoolImpl)"
      }, {
        "name": "setClaimStakeEnabled",
        "params": ["bool _enabled"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "L2Migrator",
        "signature": "L2Migrator.setClaimStakeEnabled(bool _enabled)"
      }, {
        "name": "finalizeMigrateDelegator",
        "params": ["MigrateDelegatorParams calldata _params"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "L2Migrator",
        "signature": "L2Migrator.finalizeMigrateDelegator(MigrateDelegatorParams calldata _params)"
      }, {
        "name": "finalizeMigrateUnbondingLocks",
        "params": ["MigrateUnbondingLocksParams calldata _params"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "L2Migrator",
        "signature": "L2Migrator.finalizeMigrateUnbondingLocks(MigrateUnbondingLocksParams calldata _params)"
      }, {
        "name": "finalizeMigrateSender",
        "params": ["MigrateSenderParams calldata _params"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "L2Migrator",
        "signature": "L2Migrator.finalizeMigrateSender(MigrateSenderParams calldata _params)"
      }, {
        "name": "claimStake",
        "params": ["address _delegate", "uint256 _stake", "uint256 _fees", "bytes32[] calldata _proof", "address _newDelegate"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "L2Migrator",
        "signature": "L2Migrator.claimStake(address _delegate, uint256 _stake, uint256 _fees, bytes32[] calldata _proof, address _newDelegate)"
      }, {
        "name": "syncControllerContracts",
        "params": [],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "L2Migrator",
        "signature": "L2Migrator.syncControllerContracts()"
      }],
      "sourceContractName": "L2Migrator",
      "sourceContractKind": "contract",
      "sourceInheritance": ["ManagerProxyTarget", "L2ArbitrumMessenger", "IMigrator"],
      "sourceContractFound": true,
      "sourceParseError": null,
      "facts": ["Controller registered", "Migration", "Proxy target resolved"]
    },
    "merkle-snapshot": {
      "slug": "merkle-snapshot",
      "name": "MerkleSnapshot",
      "canonicalName": "MerkleSnapshot",
      "subtitle": "Migration Proof Verification",
      "category": "migration",
      "chain": "arbitrumOne",
      "chainLabel": "Arbitrum One",
      "lifecycle": "migration_residual",
      "lifecycleLabel": "Migration",
      "proofChain": "controller",
      "proofChainLabel": "Controller-managed",
      "type": "standalone",
      "currentAddress": "0x10736fface687658f88a46d042631d182c7757f7",
      "proxyAddress": null,
      "targetAddress": null,
      "blockchainHref": "https://arbiscan.io/address/0x10736fface687658f88a46d042631d182c7757f7",
      "proxyBlockchainHref": null,
      "targetBlockchainHref": null,
      "contractCodeHref": "https://github.com/livepeer/protocol/blob/6e6b452/contracts/snapshots/MerkleSnapshot.sol",
      "rawContractCodeHref": "https://raw.githubusercontent.com/livepeer/protocol/6e6b452/contracts/snapshots/MerkleSnapshot.sol",
      "contractCodeLabel": "MerkleSnapshot.sol",
      "codeSource": {
        "repo": "livepeer/protocol",
        "branch": "delta",
        "path": "contracts/snapshots/MerkleSnapshot.sol",
        "href": "https://github.com/livepeer/protocol/blob/6e6b452/contracts/snapshots/MerkleSnapshot.sol",
        "resolvedCommit": "6e6b452",
        "exists": true,
        "resolutionError": null
      },
      "addressSource": {
        "kind": "controller-runtime",
        "repo": null,
        "path": null,
        "refMode": "onchain-controller",
        "resolvedCommit": null,
        "key": "MerkleSnapshot"
      },
      "verification": {
        "status": "strong",
        "lastVerifiedAt": "2026-05-04T07:23:26.187Z",
        "explorer": {
          "family": "etherscan",
          "host": "arbiscan.io",
          "addressBaseUrl": "https://arbiscan.io/address/",
          "addressUrl": "https://arbiscan.io/address/0x10736fface687658f88a46d042631d182c7757f7"
        },
        "controller": {
          "applicable": true,
          "controllerAddress": "0xD8E8328501E9645d16Cf49539efC04f734606ee4",
          "controllerSlot": "MerkleSnapshot",
          "registrationState": "registered",
          "controllerRegistered": true,
          "resolvedAddress": "0x10736fface687658f88a46d042631d182c7757f7",
          "currentAddressMatches": true
        },
        "bridge": {
          "applicable": false,
          "deploymentArtifactAddress": null,
          "deploymentArtifactRepo": null,
          "deploymentArtifactPath": null,
          "deploymentArtifactResolvedCommit": null,
          "deploymentArtifactMatchesAddress": null
        },
        "runtimeConsumer": {
          "applicable": false,
          "required": false,
          "repo": null,
          "path": null,
          "resolvedCommit": null,
          "exactAddressMatch": null
        },
        "proxy": {
          "applicable": false,
          "proxyAddress": null,
          "controllerAddress": null,
          "controllerMatchesExpected": null,
          "targetContractId": null,
          "targetContractName": null,
          "implementationAddress": null,
          "implementationName": null,
          "implementationVersion": null,
          "implementationSource": null,
          "expectedImplementationAddress": null,
          "expectedImplementationSource": null,
          "implementationMatchesExpected": null,
          "controllerCurrentProxyMatches": null
        }
      },
      "supported": true,
      "unsupportedNote": null,
      "functions": [{
        "name": "setSnapshot",
        "params": ["bytes32 _id", "bytes32 _root"],
        "returns": null,
        "stateMutability": null,
        "declaredIn": "MerkleSnapshot",
        "signature": "MerkleSnapshot.setSnapshot(bytes32 _id, bytes32 _root)"
      }, {
        "name": "verify",
        "params": ["bytes32 _id", "bytes32[] calldata _proof", "bytes32 _leaf"],
        "returns": "bool",
        "stateMutability": "view",
        "declaredIn": "MerkleSnapshot",
        "signature": "MerkleSnapshot.verify(bytes32 _id, bytes32[] calldata _proof, bytes32 _leaf) returns bool view"
      }],
      "sourceContractName": "MerkleSnapshot",
      "sourceContractKind": "contract",
      "sourceInheritance": ["Manager"],
      "sourceContractFound": true,
      "sourceParseError": null,
      "facts": ["Controller registered", "Migration"]
    }
  }
};

export const DataWrap = ({value}) => {
  return <>{value}</>;
};

export const FField = ({name, params = [], returns, children, line = true, style = {}, className = '', ...rest}) => {
  const paramsFormatted = params.length > 0 ? params.map(p => {
    const parts = p.split(/\s+/);
    const type = parts[0];
    const pName = parts.slice(1).join(' ');
    return pName ? `${pName}: ${type}` : type;
  }).join(', ') : '';
  const returnType = returns ? `returns: ${returns}` : 'returns: void';
  const post = params.length > 0 ? [<span>
          <span style={{
    color: "white"
  }}>params: </span>
          <span style={{
    color: "var(--lp-color-arbitrum, #3ea6f8)"
  }}>({paramsFormatted})</span>
        </span>] : null;
  return <div className={className} style={style} {...rest}>
      <ResponseField name={name} type={returnType} post={post}>
        {children}
      </ResponseField>
    </div>;
};

export const SolidityEmbed = ({url, title, filename, maxHeight = '500px', className = '', style = {}, ...rest}) => {
  const [code, setCode] = useState('');
  const [error, setError] = useState(false);
  useEffect(() => {
    fetch(url).then(res => {
      if (!res.ok) throw new Error(res.statusText);
      return res.text();
    }).then(text => setCode(text)).catch(() => setError(true));
  }, [url]);
  const styles = {
    titleBar: {
      padding: '0.5rem 0',
      borderBottom: '1px solid var(--lp-color-border-default)',
      fontSize: '0.8rem',
      color: 'var(--text-secondary)',
      fontFamily: 'monospace'
    },
    scrollContainer: {
      maxHeight,
      overflowY: 'auto'
    },
    message: {
      padding: "var(--lp-spacing-4)",
      color: 'var(--text-secondary)'
    }
  };
  return <LazyLoad height={maxHeight}>
      <BorderedBox variant="muted">
        <div className={className} style={style} {...rest}>
          {title && <div style={styles.titleBar}>{title}</div>}
          <div style={styles.scrollContainer}>
            {error && <p style={styles.message}>Failed to load contract source.</p>}
            {!error && !code && <p style={styles.message}>Loading...</p>}
            {code && <CodeBlock language="js" filename={filename}>
                {code}
              </CodeBlock>}
          </div>
        </div>
      </BorderedBox>
    </LazyLoad>;
};

export const LivepeerSVG = ({size = 24, ...props}) => {
  return <svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="none" role="img" aria-label="Livepeer logo" {...props}>
      <path fill="currentColor" fillRule="evenodd" d="M.017.377v71.028h71.027V.377H.017Zm130.355 82.72v71.028H201.4V83.097h-71.028Zm130.6 153.28v-71.028H332v71.028h-71.028Zm-130.6 12.185v71.028H201.4v-71.028h-71.028ZM.017 402.31v-71.027h71.027v71.027H.017Zm0-236.492v71.028h71.027v-71.028H.017Z" clipRule="evenodd" />
    </svg>;
};

export const LivepeerIcon = ({size = 16, color, style = {}, className = '', ...rest}) => <svg className={`icon inline bg-gray-800 dark:bg-gray-100 ${className}`} style={{
  maskImage: 'url("/snippets/assets/logos/Livepeer-Logo-Symbol-Mask.svg")',
  WebkitMaskImage: 'url("/snippets/assets/logos/Livepeer-Logo-Symbol-Mask.svg")',
  maskRepeat: 'no-repeat',
  maskPosition: 'center center',
  width: `${size}px`,
  height: `${size}px`,
  display: 'inline-block',
  verticalAlign: 'middle',
  ...color && ({
    backgroundColor: color
  }),
  ...style
}} {...rest} />;

export const ArbitrumSVG = ({size = 24, ...props}) => {
  return <svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 742.07 799.07" fill="none" role="img" aria-label="Arbitrum logo" {...props}>
      <path fill="currentColor" d="M541.1,286.36l-153.31-89.02c-4.97-2.84-10.39-4.31-15.9-4.31s-10.92,1.47-15.81,4.31l-153.36,89.11c-9.72,5.68-15.81,16.16-15.81,27.48v178.22c0,11.32,6.08,21.93,15.81,27.57l27.57,16.03,40.23,23.35,9.01-24.82,82.85-228.48c.75-2.22-.84-4.62-3.33-4.62h-38.85c-2.89,0-5.55,1.82-6.48,4.53l-74.37,205.21-23.62-13.72c-1.78-1.02-2.89-2.93-2.89-4.97v-178.31c0-2.04,1.11-3.95,2.89-4.97l153.36-89.11c.84-.53,1.86-.75,2.84-.75s1.95.27,2.89.75l153.4,89.11c1.78,1.02,2.89,2.93,2.89,4.97v178.22c0,2.04-1.11,3.95-2.89,4.97l-23.35,13.59-61.45-169.56c-1.11-3.11-5.37-3.11-6.48,0l-20.25,55.77c-.58,1.55-.58,3.29,0,4.79l47.95,132.36-15.94,9.28-39.25-108.38c-1.11-3.11-5.37-3.11-6.48,0l-20.25,55.77c-.58,1.55-.58,3.29,0,4.79l25.8,71.17-33.66,19.58c-.84.53-1.86.76-2.89.76s-1.95-.27-2.89-.76l-33.26-19.36,94.62-261.07c.84-2.31-.84-4.75-3.24-4.75h-38.85c-2.89,0-5.55,1.82-6.48,4.53l-86.27,237.89-9.01,24.82,40.23,23.36,29.35,17.05c4.88,2.84,10.35,4.31,15.81,4.31s10.92-1.46,15.81-4.31l153.4-89.11c9.81-5.68,15.81-16.16,15.81-27.57v-178.13c0-11.32-6.08-21.93-15.81-27.57h-.09Z" />
    </svg>;
};

export const ArbitrumIcon = ({size = 16, color, style = {}, className = '', ...rest}) => <svg className={`icon inline bg-gray-800 dark:bg-gray-100 ${className}`} style={{
  maskImage: 'url("/snippets/assets/logos/Arbitrum/Arbitrum-Logo.svg")',
  WebkitMaskImage: 'url("/snippets/assets/logos/Arbitrum/Arbitrum-Logo.svg")',
  maskRepeat: 'no-repeat',
  maskPosition: 'center center',
  width: `${size}px`,
  height: `${size}px`,
  display: 'inline-block',
  verticalAlign: 'middle',
  ...color && ({
    backgroundColor: color
  }),
  ...style
}} {...rest} />;

export const LazyLoad = ({children, height = "200px", offset = "200px", fadeDuration = 400, className = "", style = {}, ...rest}) => {
  const ref = useRef(null);
  const [visible, setVisible] = useState(false);
  const [ready, setReady] = useState(false);
  useEffect(() => {
    const el = ref.current;
    if (!el) return;
    const observer = new IntersectionObserver(([entry]) => {
      if (entry.isIntersecting) {
        setVisible(true);
        observer.disconnect();
      }
    }, {
      rootMargin: offset
    });
    observer.observe(el);
    return () => observer.disconnect();
  }, []);
  useEffect(() => {
    if (!visible) return;
    const frameId = requestAnimationFrame(() => {
      setReady(true);
    });
    return () => cancelAnimationFrame(frameId);
  }, [visible]);
  const placeholder = <div ref={ref} className={className} style={{
    minHeight: height,
    ...style
  }} {...rest} />;
  if (!visible) return placeholder;
  return <div ref={ref} className={className} style={{
    opacity: ready ? 1 : 0,
    transition: `opacity ${fadeDuration}ms ease-in`,
    ...style
  }} {...rest}>
      {children}
    </div>;
};

export const ScrollableDiagram = ({children, title = '', maxHeight = '500px', minWidth = '100%', showControls = false, className = '', style = {}, ...rest}) => {
  const buildDiagramKey = (currentTitle = '', currentClassName = '') => {
    const source = `${currentTitle}|${currentClassName}|scrollable-diagram`;
    let hash = 0;
    for (let index = 0; index < source.length; index += 1) {
      hash = hash * 31 + source.charCodeAt(index) >>> 0;
    }
    return `docs-diagram-${hash.toString(36)}`;
  };
  const diagramKey = buildDiagramKey(title, className);
  const zoomName = `${diagramKey}-zoom`;
  const zoomLevels = [{
    label: '75%',
    value: 0.75
  }, {
    label: '100%',
    value: 1
  }, {
    label: '125%',
    value: 1.25
  }, {
    label: '150%',
    value: 1.5
  }];
  const containerStyle = {
    overflow: 'auto',
    maxHeight,
    border: '1px solid var(--lp-color-border-default)',
    borderRadius: "8px",
    padding: "var(--lp-spacing-4)",
    background: 'var(--lp-color-bg-card)',
    position: 'relative'
  };
  return <div className={className} style={{
    position: 'relative',
    marginBottom: "var(--lp-spacing-4)",
    ...style
  }} {...rest}>
      {title && <p style={{
    textAlign: 'center',
    fontStyle: 'italic',
    color: 'var(--lp-color-text-secondary)',
    marginBottom: "var(--lp-spacing-2)",
    fontSize: '0.875rem'
  }}>
          {title}
        </p>}

      {showControls ? <style>{`
          [data-docs-diagram-key="${diagramKey}"] [data-docs-diagram-content] {
            transform: scale(1);
            transform-origin: top left;
            width: max-content;
          }
          ${zoomLevels.map(zoomLevel => `
          #${diagramKey}-${zoomLevel.label.replace('%', '')}:checked ~ [data-docs-diagram-shell] [data-docs-diagram-content] {
            transform: scale(${zoomLevel.value});
          }
          #${diagramKey}-${zoomLevel.label.replace('%', '')}:checked ~ [data-docs-diagram-controls] label[for="${diagramKey}-${zoomLevel.label.replace('%', '')}"] {
            background: var(--lp-color-accent);
            color: var(--lp-color-on-accent);
            border-color: var(--lp-color-accent);
          }`).join('\n')}
        `}</style> : null}

      {showControls ? zoomLevels.map(zoomLevel => {
    const inputId = `${diagramKey}-${zoomLevel.label.replace('%', '')}`;
    return <input key={inputId} id={inputId} type="radio" name={zoomName} defaultChecked={zoomLevel.value === 1} style={{
      position: 'absolute',
      opacity: 0,
      pointerEvents: 'none'
    }} />;
  }) : null}

      <div data-docs-diagram-key={diagramKey} data-docs-diagram-shell style={containerStyle}>
        <div data-docs-diagram-content style={{
    minWidth,
    transformOrigin: 'top left',
    width: 'max-content'
  }}>
          {children}
        </div>
      </div>

      {showControls ? <div data-docs-diagram-controls style={{
    display: 'flex',
    justifyContent: 'flex-end',
    alignItems: 'center',
    gap: "var(--lp-spacing-2)",
    marginTop: "var(--lp-spacing-2)",
    flexWrap: 'wrap'
  }}>
          <span style={{
    fontSize: "0.75rem",
    color: 'var(--lp-color-text-muted)',
    marginRight: 'auto'
  }}>
            Scroll to pan
          </span>
          {zoomLevels.map(zoomLevel => {
    const inputId = `${diagramKey}-${zoomLevel.label.replace('%', '')}`;
    return <label key={inputId} htmlFor={inputId} style={{
      background: 'transparent',
      color: 'var(--lp-color-text-secondary)',
      border: '1px solid var(--lp-color-border-default)',
      borderRadius: "4px",
      padding: '4px 10px',
      cursor: 'pointer',
      fontSize: "0.75rem",
      fontWeight: '600'
    }}>
                {zoomLevel.label}
              </label>;
  })}
        </div> : null}
    </div>;
};

export const FlexContainer = ({children, direction = "row", gap = "var(--lp-spacing-4)", align = "flex-start", justify = "flex-start", wrap = false, marginTop = "", marginBottom = "", margin = "", padding = "", style = {}, className = "", ...rest}) => {
  return <div className={className} style={{
    display: "flex",
    flexDirection: direction,
    gap: gap,
    alignItems: align,
    justifyContent: justify,
    flexWrap: wrap ? "wrap" : "nowrap",
    ...margin ? {
      margin
    } : {},
    ...padding ? {
      padding
    } : {},
    ...marginTop ? {
      marginTop
    } : {},
    ...marginBottom ? {
      marginBottom
    } : {},
    ...style
  }} {...rest}>
      {children}
    </div>;
};

export const BorderedBox = ({children, variant = "default", padding = "var(--lp-spacing-4)", borderRadius = "var(--lp-spacing-px-8)", margin = "", accentBar = "", style = {}, className = "", ...rest}) => {
  const variants = {
    default: {
      border: "1px solid var(--lp-color-border-default)",
      backgroundColor: "var(--lp-color-bg-card)"
    },
    accent: {
      border: "1px solid var(--lp-color-accent)",
      backgroundColor: "var(--lp-color-bg-card)"
    },
    muted: {
      border: "1px solid var(--lp-color-border-default)",
      backgroundColor: "transparent"
    }
  };
  const accentBarColors = {
    accent: "var(--lp-color-accent)",
    positive: "var(--green-9)"
  };
  return <div data-docs-bordered-box="" data-accent-bar={accentBarColors[accentBar] ? "" : undefined} className={className} style={{
    ...variants[variant],
    padding: padding,
    borderRadius: borderRadius,
    ...margin ? {
      margin
    } : {},
    ...accentBarColors[accentBar] ? {
      position: "relative",
      '--accent-bar-color': accentBarColors[accentBar]
    } : {},
    ...style
  }} {...rest}>
      {children}
    </div>;
};

export const CenteredContainer = ({children, maxWidth = "800px", padding = "0", preset = "default", width = "", minWidth = "", marginRight = "", marginBottom = "", textAlign = "", style = {}, className = "", ...rest}) => {
  const presets = {
    default: {},
    fitContent: {
      width: "fit-content",
      minWidth: "fit-content"
    },
    readable70: {
      width: "70%",
      minWidth: "fit-content"
    },
    readable80: {
      width: "80%",
      minWidth: "fit-content"
    },
    readable90: {
      width: "90%"
    },
    wide900: {
      maxWidth: "900px"
    }
  };
  const presetStyle = presets[preset] || presets.default;
  return <div className={className} style={{
    maxWidth: presetStyle.maxWidth || maxWidth,
    margin: "0 auto",
    padding: padding,
    ...presetStyle.width ? {
      width: presetStyle.width
    } : {},
    ...presetStyle.minWidth ? {
      minWidth: presetStyle.minWidth
    } : {},
    ...width ? {
      width
    } : {},
    ...minWidth ? {
      minWidth
    } : {},
    ...marginRight ? {
      marginRight
    } : {},
    ...marginBottom ? {
      marginBottom
    } : {},
    ...textAlign ? {
      textAlign
    } : {},
    ...style
  }} {...rest}>
      {children}
    </div>;
};

export const CustomCardTitle = ({icon, title, variant = "card", iconSize, style = {}, className = "", ...rest}) => {
  const variants = {
    card: {
      display: 'flex',
      alignItems: 'center',
      gap: "var(--lp-spacing-2)",
      marginBottom: "var(--lp-spacing-3)",
      color: 'var(--lp-color-text-primary)',
      fontSize: '1rem',
      fontWeight: 600
    },
    accordion: {
      display: 'inline-flex',
      alignItems: 'center',
      gap: "var(--lp-spacing-2)"
    },
    tab: {
      display: 'inline-flex',
      alignItems: 'center',
      gap: '0.4rem',
      fontSize: '0.875rem'
    }
  };
  const sizes = {
    card: 20,
    accordion: 18,
    tab: 14
  };
  const size = iconSize || sizes[variant] || 20;
  const baseStyle = variants[variant] || variants.card;
  return variant === 'card' ? <div className={className} style={{
    ...baseStyle,
    ...style
  }} {...rest}>
      {typeof icon === 'string' ? <Icon icon={icon} size={size} color="var(--lp-color-accent)" /> : icon}
      {title}
    </div> : <span className={className} style={{
    ...baseStyle,
    ...style
  }} {...rest}>
      {typeof icon === 'string' ? <Icon icon={icon} size={size} color="var(--lp-color-accent)" /> : icon}
      {title}
    </span>;
};

export const CopyText = ({text, label, className = '', style = {}, ...rest}) => {
  const handleCopy = () => {
    navigator.clipboard.writeText(text);
  };
  return <span className={className} style={{
    display: 'flex',
    alignItems: 'center',
    padding: '0.2rem 0.4rem',
    borderRadius: "4px",
    fontSize: '0.85rem',
    fontFamily: 'monospace',
    backgroundColor: 'var(--lp-color-bg-card)',
    border: '1px solid var(--lp-color-border-default)',
    minWidth: 0,
    overflow: 'hidden',
    ...style
  }} {...rest}>
      {label && <strong style={{
    flexShrink: 0,
    marginRight: "var(--lp-spacing-2)"
  }}>{label}</strong>}
      <span style={{
    overflow: 'hidden',
    textOverflow: 'ellipsis',
    whiteSpace: 'nowrap',
    flex: 1,
    minWidth: 0
  }}>
        {text}
      </span>
      <button onClick={handleCopy} style={{
    background: 'none',
    border: 'none',
    cursor: 'pointer',
    padding: '0 0 0 0.4rem',
    display: 'inline-flex',
    alignItems: 'center',
    color: 'var(--lp-color-text-secondary)',
    flexShrink: 0
  }} title="Copy to clipboard">
        <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
          <rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect>
          <path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path>
        </svg>
      </button>
    </span>;
};

export const Subtitle = ({style = {}, text, children, variant = 'default', fontSize = '', fontWeight = '', fontStyle = '', marginTop = '', marginBottom = '', color = '', className = '', ...rest}) => {
  const renderInlineCode = (value, keyPrefix) => {
    return value.split(/(`[^`]+`)/g).map((segment, index) => {
      if (segment.startsWith('`') && segment.endsWith('`')) {
        return <code key={`${keyPrefix}-code-${index}`}>{segment.slice(1, -1)}</code>;
      }
      return segment;
    });
  };
  const renderInlineMarkup = (value, keyPrefix = 'subtitle') => {
    if (typeof value !== 'string') {
      return value;
    }
    return value.split(/(\*\*[\s\S]+?\*\*)/g).map((segment, index) => {
      if (segment.startsWith('**') && segment.endsWith('**')) {
        const inner = segment.slice(2, -2);
        return <strong key={`${keyPrefix}-strong-${index}`}>
            {renderInlineCode(inner, `${keyPrefix}-strong-${index}`)}
          </strong>;
      }
      return renderInlineCode(segment, `${keyPrefix}-${index}`);
    });
  };
  const renderContent = (value, keyPrefix) => {
    if (Array.isArray(value)) {
      return value.map((item, index) => renderContent(item, `${keyPrefix}-${index}`));
    }
    return renderInlineMarkup(value, keyPrefix);
  };
  const variants = {
    default: {
      fontSize: '1rem',
      fontStyle: 'italic',
      color: 'var(--lp-color-accent)',
      marginBottom: 0
    },
    changelog: {
      fontSize: '0.8rem',
      fontStyle: 'normal',
      fontWeight: 700,
      color: 'var(--lp-color-text-primary)',
      marginBottom: 0
    }
  };
  const base = variants[variant] || variants.default;
  return <span className={className} style={{
    ...base,
    ...fontSize ? {
      fontSize
    } : {},
    ...fontWeight ? {
      fontWeight
    } : {},
    ...fontStyle ? {
      fontStyle
    } : {},
    ...marginTop ? {
      marginTop
    } : {},
    ...marginBottom ? {
      marginBottom
    } : {},
    ...color ? {
      color
    } : {},
    ...style
  }} {...rest}>
      {renderContent(text, 'text')}
      {renderContent(children, 'children')}
    </span>;
};

export const AddressLinks = ({address, blockchainHref, githubHref, style = {}, className = '', ...rest}) => {
  return <span className={className} style={{
    display: 'flex',
    alignItems: 'center',
    gap: '0.3rem',
    ...style
  }} {...rest}>
      <CopyText text={address} />
      <span style={{
    display: 'flex',
    alignItems: 'center',
    gap: "var(--lp-spacing-2)",
    marginBottom: '0.2rem'
  }}>
        {blockchainHref && <LinkIcon color="var(--lp-color-text-secondary)" href={blockchainHref} />}
        {githubHref && <LinkIcon icon="github" size={14} color="var(--lp-color-text-secondary)" href={githubHref} />}
      </span>
    </span>;
};

export const LinkIcon = ({href, target = '_blank', rel = 'noopener noreferrer', style = {}, className = '', icon = 'arrow-up-right-from-square', size = 12, ...iconProps}) => {
  return <a href={href} target={target} rel={rel} className={className} style={{
    borderBottom: 'none',
    textDecoration: 'none',
    ...style
  }}>
      <Icon icon={icon} size={size} {...iconProps} />
    </a>;
};

export const DoubleIconLink = ({label = '', labelColor, href = '#', text = '', iconLeft = 'github', iconLeftColor, iconRight = 'arrow-up-right', iconRightColor = 'var(--lp-color-accent)', className = '', style = {}, ...rest}) => {
  return <span className={className} style={{
    whiteSpace: 'nowrap',
    display: 'inline-flex',
    alignItems: 'center',
    gap: "var(--lp-spacing-1)",
    marginLeft: '0.3rem',
    ...style
  }} {...rest}>
      {text && <span style={{
    marginRight: 8
  }}>{text}</span>}
      <Icon icon={iconLeft} color={iconLeftColor} />
      <a href={href} style={{
    color: {
      labelColor
    }
  }}>
        {label}
      </a>
      <div style={{
    marginRight: '0.3rem'
  }}>
        <Icon icon={iconRight} size={12} color={iconRightColor} />
      </div>
    </span>;
};

export const LinkArrow = ({href, label, description, newline = true, borderColor, className = '', style = {}, ...rest}) => {
  const linkArrowStyle = {
    display: 'inline-flex',
    alignItems: 'center',
    justifyContent: 'center',
    gap: "var(--lp-spacing-1)",
    width: 'fit-content',
    ...borderColor && ({
      borderColor
    })
  };
  return <span className={className} style={style} {...rest}>
      {newline && <br />}
      <span style={linkArrowStyle}>
        <a href={href} target="_blank" rel="noopener noreferrer">
          {label}
        </a>
        <Icon icon="arrow-up-right" size={14} color="var(--lp-color-accent)" />
      </span>
      {description && description}
      {description && <div style={{
    height: "var(--lp-spacing-3)"
  }} />}
    </span>;
};

export const CustomDivider = ({color = "var(--lp-color-border-default)", middleText = "", spacing = "default", style = {}, className = "", ...rest}) => {
  const spacingPresets = {
    default: {
      margin: "24px 0"
    },
    overlap: {
      margin: "-1rem 0 -1rem 0"
    },
    tight: {
      margin: "0 0 -1rem 0"
    },
    section: {
      margin: "0 0 -2rem 0"
    },
    sectionOverlap: {
      margin: "-1rem 0 -2rem 0"
    },
    deepOverlap: {
      margin: "-1rem 0 -1.5rem 0"
    }
  };
  const spacingStyle = spacingPresets[spacing] || spacingPresets.default;
  return <div role="separator" aria-orientation="horizontal" className={className} style={{
    display: "flex",
    alignItems: "center",
    ...spacingStyle,
    fontSize: style?.fontSize || "16px",
    height: "fit-content",
    ...style
  }} {...rest}>
      <span style={{
    marginRight: "var(--lp-spacing-px-8)",
    opacity: 0.2
  }}>
        <Icon icon="/snippets/assets/logos/Livepeer-Logo-Symbol-Theme.svg" />
      </span>
      <div style={{
    flex: 1,
    height: "1px",
    background: "var(--lp-color-border-default)",
    opacity: 0.4
  }}></div>
      {middleText && <>
          <Icon icon="circle" size={2} />
          <span style={{
    margin: "0 8px",
    fontWeight: "bold",
    color: color,
    opacity: 0.7
  }}>
            {middleText}
          </span>
          <Icon icon="circle" size={2} />
        </>}
      <div style={{
    flex: 1,
    height: "1px",
    background: "var(--lp-color-border-default)",
    opacity: 0.4
  }}></div>
      <span style={{
    marginLeft: "var(--lp-spacing-px-8)",
    opacity: 0.2
  }}>
        <span style={{
    display: "inline-block",
    transform: "scaleX(-1)"
  }}>
          <Icon icon="/snippets/assets/logos/Livepeer-Logo-Symbol-Theme.svg" />
        </span>
      </span>
    </div>;
};

<Note>
  Use [Contract Addresses](\{contractsRoutes.reference}) for the current official registry and
  [Verify Contract Addresses](\{contractsRoutes.verifier}) for browser-based or manual self-verification workflows.
</Note>

<Tip>
  Addresses on this page are automatically updated via a GitHub Action workflow. <br />
  <FlexContainer align="center" marginTop="0.2rem"> Data is recovered from live chain state, upstream source provenance, and explorer verification before it is published on the canonical contracts page. </FlexContainer> <br />
  <Subtitle marginTop="0.5rem"> Last Verified: <DataWrap value={getBlockchainLastVerifiedDate(blockchainContractsPageData)} /> </Subtitle>
</Tip>

<Columns cols={2}>
  <Card href="https://github.com/livepeer/protocol" icon="github" title={<>Livepeer Protocol Source <br/>  <Badge color="green"> Commit Pinned </Badge></>} horizontal />

  <Card href="https://arbiscan.io/accounts/label/livepeer" icon="cubes" title={<>Livepeer Contracts Arbiscan <br/>  <Badge color="green"> On-chain Canonical </Badge></>} horizontal />

  <Card title="Solidity Protocol Contracts" icon="github" href="https://github.com/livepeer/protocol/tree/delta/contracts" horizontal />

  <Card title="Solidity LPT Bridge Contracts" icon="github" href="https://github.com/livepeer/arbitrum-lpt-bridge/tree/main/contracts" horizontal />
</Columns>

<CustomDivider />

Livepeer uses a system of Ethereum smart contracts to permissionlessly govern its decentralised network.

The [Livepeer Protocol](https://github.com/livepeer/protocol/tree/delta) <LivepeerIcon size={12} color="var(--accent)" /> is deployed on [Arbitrum One](https://arbiscan.io/accounts/label/livepeer) <ArbitrumIcon size={14} color="var(--arbitrum)" /> and uses these contracts to govern:

* Livepeer Token (LPT) ownership and delegation
* Staking and selection of active Orchestrators
* Distribution of inflationary rewards and fees to participants
* Time-based progression of the protocol through rounds
* Payment processing through a probabilistic micropayment system

## Livepeer Contracts

There are three categories of contracts in the Livepeer Protocol as well as migration contacts:

1. **[Core Protocol Contracts](#core-protocol-contracts)** – staking, payments, round progression, and service discovery
2. **[Token and Utility Contracts](#token-and-utility-contracts)** – the LPT token and bridge infrastructure
3. **[Governance Contracts](#governance-contracts)** – on-chain voting, proposal execution, and treasury management
4. **[Migration Contracts](#migration-contracts)** – historical Confluence upgrade contracts, migration complete

<LazyLoad>
  <ScrollableDiagram title="Contract Interaction Architecture" maxHeight="1000px" maxWidth="100%" showControls={true}>
    ```mermaid theme={"theme":{"light":"github-light","dark":"dark-plus"}}
    %%{init: {'theme': 'base', 'themeVariables': {'primaryColor': '#18794E', 'primaryTextColor': '#fff', 'primaryBorderColor': '#3CB540', 'lineColor': '#3CB540', 'mainBkg': '#18794E', 'nodeBorder': '#3CB540', 'clusterBkg': 'transparent', 'clusterBorder': '#3CB540', 'titleColor': '#3CB540', 'edgeLabelBackground': 'transparent', 'textColor': '#3CB540', 'nodeTextColor': '#fff'}}}%%
    graph TB
        subgraph "Registry"
            Controller["Controller\nContract Registry"]
        end

        subgraph "Discovery"
            ServiceRegistry["ServiceRegistry\nOrchestrator URI Mapping"]
            AIServiceRegistry["AIServiceRegistry\nAI Capability Registration"]
        end

        subgraph "Economic"
            LPT["LivepeerToken\nERC-20"]
            BondingManager["BondingManager\nStaking & Rewards"]
            TicketBroker["TicketBroker\nMicropayments"]
            Minter["Minter\nToken Inflation"]
        end

        subgraph "Time"
            RoundsManager["RoundsManager\nProtocol Rounds"]
        end

        subgraph "Governance"
            BondingVotes["BondingVotes\nStake Checkpointing"]
            Governor["Governor\nUpgrade Executor"]
            LivepeerGovernor["LivepeerGovernor\nOn-chain Voting"]
            Treasury["Treasury\nProtocol Treasury"]
        end

        subgraph "Participants"
            Gateway["Gateway Node"]
            Orchestrator["Orchestrator Node"]
            Delegator["LPT Holder"]
        end

        Controller -.->|"Address Lookup"| LPT
        Controller -.->|"Address Lookup"| BondingManager
        Controller -.->|"Address Lookup"| TicketBroker
        Controller -.->|"Address Lookup"| RoundsManager
        Controller -.->|"Address Lookup"| Minter
        Controller -.->|"Address Lookup"| ServiceRegistry
        Controller -.->|"Address Lookup"| BondingVotes
        Controller -.->|"Address Lookup"| LivepeerGovernor
        Controller -.->|"Address Lookup"| Treasury

        Delegator -->|"approve() LPT"| LPT
        Delegator -->|"bond(amount, orch)"| BondingManager
        Delegator -->|"castVote()"| LivepeerGovernor
        BondingManager -->|"transferFrom()"| LPT
        BondingManager -->|"checkpointBondingState()"| BondingVotes

        Orchestrator -->|"transcoder(rewardCut, feeShare)"| BondingManager
        Orchestrator -->|"setServiceURI(url)"| ServiceRegistry
        Orchestrator -->|"reward()"| BondingManager
        BondingManager -->|"createReward()"| Minter
        Minter -->|"mint() new LPT"| LPT
        Minter -->|"trustedTransferTokens()"| Treasury

        Gateway -->|"fundDepositAndReserve()"| TicketBroker
        Orchestrator -->|"redeemWinningTicket()"| TicketBroker
        TicketBroker -->|"winningTicketTransfer()"| LPT

        RoundsManager -->|"currentRound()"| BondingManager
        RoundsManager -->|"blockHashForRound()"| TicketBroker

        BondingVotes -->|"getPastVotes()"| LivepeerGovernor
        LivepeerGovernor -->|"execute()"| Governor
        Governor -->|"setContractInfo()"| Controller
    ```
  </ScrollableDiagram>
</LazyLoad>

<CustomDivider style={{marginBottom: "-2rem"}} />

## Core Protocol Contracts

The core protocol contracts manage staking, delegation, reward distribution, round progression, payment processing, and service discovery. The Controller serves as the central registry – upgrading a contract means registering a new target implementation address via the Controller, while the proxy address remains stable.

```mermaid theme={"theme":{"light":"github-light","dark":"dark-plus"}}
%%{init: {'theme': 'base', 'themeVariables': {'primaryColor': '#18794E', 'primaryTextColor': '#fff', 'primaryBorderColor': '#3CB540', 'lineColor': '#3CB540', 'mainBkg': '#18794E', 'nodeBorder': '#3CB540', 'clusterBkg': 'transparent', 'clusterBorder': '#3CB540', 'titleColor': '#3CB540', 'edgeLabelBackground': 'transparent', 'textColor': '#3CB540', 'nodeTextColor': '#fff'}}}%%
graph LR
    D[Delegator] -->|"bond / unbond"| BM[BondingManager]
    O[Orchestrator] -->|"register / reward"| BM
    O -->|"set URI"| SR[ServiceRegistry]
    G[Gateway] -->|"fund deposit"| TB[TicketBroker]
    O -->|"redeem ticket"| TB
    BM -->|"create reward"| M[Minter]
    M -->|"mint LPT"| LPT[LivepeerToken]
    TB -->|"pay fees"| LPT
    RM[RoundsManager] -.->|"round timing"| BM
    RM -.->|"block hash"| TB
```

***

#### **Controller** <Subtitle text="Contract Registry" />

<Badge color="blue">
  Arbitrum One
</Badge>

The Controller is the central registry for all protocol contracts. Every other contract resolves peer contract addresses by calling `getContract(keccak256("<n>"))` on the Controller. Upgrades are applied by registering a new implementation address under the same name hash – the proxy addresses never change.

<Accordion title={<CustomCardTitle variant="accordion" icon={<ArbitrumIcon color="var(--arbitrum)" />} title="Controller"/>}>
  <AddressLinks address={getBlockchainContractAddress(blockchainContractsPageData, 'arbitrumOne', 'Controller')} blockchainHref={getBlockchainExplorerHref(blockchainContractsPageData, 'arbitrumOne', 'Controller')} githubHref={getBlockchainCodeHref(blockchainContractsPageData, 'arbitrumOne', 'Controller')} />

  <Icon icon="check" color="var(--text)" /> *Verified · Controller registry · Active*

  **Purpose**:

  * Central address registry for all protocol contracts
  * Enables contract upgrades while keeping proxy addresses stable
  * Provides `pause()`/`unpause()` for emergency system-wide halts
  * Owner is the Governor contract – all upgrades must go through governance

  **Key functions** (from `Controller.sol`):

  <FField name="getContract" returns="address" params={["bytes32 _id"]}>
    Look up a registered contract by keccak256 name hash
  </FField>

  <FField name="getContractInfo" returns="(address, bytes20)" params={["bytes32 _id"]}>
    Returns address and git commit hash
  </FField>

  <FField name="setContractInfo" params={["bytes32 _id", "address _contractAddress", "bytes20 _gitCommitHash"]}>
    Register or update a contract; callable by owner (Governor) only
  </FField>

  <FField name="pause">
    Halt all contracts that check `controller.paused()`
  </FField>

  <FField name="unpause">
    Resume all contracts that check `controller.paused()`
  </FField>

  <FField name="updateController" params={["bytes32 _id", "address _controller"]}>
    Update the Controller reference in a registered contract
  </FField>

  **Contract**

  <SolidityEmbed url={getBlockchainRawCodeHref(blockchainContractsPageData, 'controller')} title={<DoubleIconLink label="Controller.sol"/>} filename="Controller.sol" />
</Accordion>

#### **BondingManager** <Subtitle text="Staking and Delegation" />

<Badge color="blue">
  Arbitrum One
</Badge>

The BondingManager is the most critical economic contract in the protocol. It manages the active Orchestrator pool as a sorted doubly-linked list, handles all LPT bonding and unbonding, and distributes inflationary rewards and fees each round.

The `feeShare` in the protocol is defined as: **the percentage of fees paid to Delegators by the transcoder (Orchestrator)**. It is not the Gateway's cut – it is the Orchestrator's share of fees that they pass on to their Delegators.

Source: `BondingManager.sol` includes this as struct comment: "// % of fees paid to Delegators by transcoder".

<Accordion title={<CustomCardTitle variant="accordion" icon={<ArbitrumIcon color="var(--arbitrum)" />} title="BondingManager" />}>
  **Address (Arbitrum One)**:

  <AddressLinks address={getBlockchainContractAddress(blockchainContractsPageData, 'arbitrumOne', 'BondingManager', 'proxy')} blockchainHref={getBlockchainExplorerHref(blockchainContractsPageData, 'arbitrumOne', 'BondingManager', 'proxy')} githubHref={getBlockchainCodeHref(blockchainContractsPageData, 'arbitrumOne', 'BondingManager', 'proxy')} />

  <Icon icon="check" color="var(--text)" /> *Verified · Controller registered · Active · Proxy target resolved · Target V13*

  **Purpose**:

  * Manages the active Orchestrator pool (sorted by stake using SortedDoublyLL)
  * Handles `bond()`, `unbond()`, and `withdrawStake()` for all Delegators
  * Distributes inflationary LPT rewards to Orchestrators and their Delegators each round
  * Manages the unbonding period – Delegators must wait `unbondingPeriod` rounds before withdrawing
  * Tracks per-round earnings pools for each Orchestrator
  * Calls `checkpointBondingState()` on BondingVotes on every state change for governance weight
  * Since Delta upgrade: sends `treasuryRewardCutRate` fraction of each reward to Treasury; contributions halt automatically when treasury balance exceeds `treasuryBalanceCeiling`

  <Info>
    **Slashing:** `slashTranscoder()` exists in the contract but is currently inoperative: the Verifier role is set to the null address (`0x000...`). Slashing could be re-enabled via governance by configuring the Verifier role and making necessary compatibility updates. It is out of scope for current audits.
  </Info>

  **Key functions** (from `BondingManager.sol`, `delta` branch):

  <FField name="bond" params={["uint256 _amount", "address _to"]}>
    Delegate LPT stake to an Orchestrator
  </FField>

  <FField name="unbond" params={["uint256 _amount"]}>
    Begin withdrawal; creates an unbonding lock, starts the unbonding period
  </FField>

  <FField name="rebond" params={["uint256 _unbondingLockId"]}>
    Cancel unbonding and re-bond stake to current delegate
  </FField>

  <FField name="rebondFromUnbonded" params={["address _to", "uint256 _unbondingLockId"]}>
    Re-bond to a new Orchestrator from unbonded state
  </FField>

  <FField name="withdrawStake" params={["uint256 _unbondingLockId"]}>
    Complete withdrawal after unbonding period expires
  </FField>

  <FField name="withdrawFees" params={["address payable _recipient", "uint256 _amount"]}>
    Withdraw accumulated ETH fees to a recipient address
  </FField>

  <FField name="transcoder" params={["uint256 _rewardCut", "uint256 _feeShare"]}>
    Register as an Orchestrator or update parameters; `_rewardCut` is % of reward kept by Orchestrator; `_feeShare` is % of fees passed to Delegators
  </FField>

  <FField name="reward">
    Called by active Orchestrators each round to mint inflationary LPT and distribute to earnings pool
  </FField>

  <FField name="claimEarnings" params={["uint256 _endRound"]}>
    Claim accumulated rewards and fees. Note: `_endRound` is unused; earnings are always claimed through the current round regardless of the value passed.
  </FField>

  <FField name="checkpointBondingState" params={["address _account"]}>
    Publicly callable function to fix a stale voting power checkpoint for any account. Useful for operators after an inconsistent state.
  </FField>

  <FField name="transferBond" params={["address _delegator", "uint256 _amount", "address _oldDelegateNewPosPrev", "address _oldDelegateNewPosNext", "address _newDelegateNewPosPrev", "address _newDelegateNewPosNext"]}>
    Transfer ownership of a bond (or portion) to a new Delegator. Used for stake migrations between wallets.
  </FField>

  <FField name="pendingStake" returns="uint256" params={["address _addr", "uint256 _endRound"]}>
    Returns unclaimed pending stake for a Delegator through the current round
  </FField>

  <FField name="pendingFees" returns="uint256" params={["address _addr", "uint256 _endRound"]}>
    Returns unclaimed pending ETH fees for a Delegator through the current round
  </FField>

  <FField name="getTranscoder" params={["address _transcoder"]}>
    Returns Orchestrator state: lastRewardRound, rewardCut, feeShare, activationRound, deactivationRound, cumulativeRewards, cumulativeFees, lastFeeRound
  </FField>

  <FField name="getDelegator" params={["address _delegator"]}>
    Returns Delegator state: bondedAmount, fees, delegateAddress, delegatedAmount, startRound, lastClaimRound, nextUnbondingLockId
  </FField>

  **Contract**

  <SolidityEmbed url={getBlockchainRawCodeHref(blockchainContractsPageData, 'bonding-manager')} title={<DoubleIconLink label="BondingManager.sol"/>} filename="BondingManager.sol" />
</Accordion>

#### **TicketBroker** <Subtitle text="Probabilistic Micropayments" />

<Badge color="blue">
  Arbitrum One
</Badge>

The TicketBroker implements Livepeer's off-chain probabilistic micropayment (PM) system. Gateways pre-fund a deposit and reserve on-chain; they send lottery tickets to Orchestrators off-chain with each transcoding job. Orchestrators redeem winning tickets on-chain to claim payment. This amortises per-segment payment costs across many tickets.

<Accordion title={<CustomCardTitle variant="accordion" icon={<ArbitrumIcon color="var(--arbitrum)" />} title="TicketBroker" />}>
  **Address (Arbitrum One)**:

  <AddressLinks address={getBlockchainContractAddress(blockchainContractsPageData, 'arbitrumOne', 'TicketBroker', 'proxy')} blockchainHref={getBlockchainExplorerHref(blockchainContractsPageData, 'arbitrumOne', 'TicketBroker', 'proxy')} githubHref={getBlockchainCodeHref(blockchainContractsPageData, 'arbitrumOne', 'TicketBroker', 'proxy')} />

  <Icon icon="check" color="var(--text)" /> *Verified · Controller registered · Active · Proxy target resolved*

  **Purpose**:

  * Holds Gateway ETH deposits and reserves
  * Validates and settles winning probabilistic payment tickets
  * Manages the unlock period before Gateways can withdraw funds
  * Tracks claimed reserves per Orchestrator per round to prevent over-redemption
  * Emits `WinningTicketRedeemed` (ticket redemption attempt) and `WinningTicketTransfer` (ETH actually moved) events used for on-chain payment monitoring

  **Key functions** (from `MixinTicketBrokerCore.sol`):

  <FField name="fundDeposit">
    Gateway adds ETH to deposit (payable)
  </FField>

  <FField name="fundReserve">
    Gateway adds ETH to reserve (payable)
  </FField>

  <FField name="fundDepositAndReserve" params={["uint256 _depositAmount", "uint256 _reserveAmount"]}>
    Fund both deposit and reserve in one call (payable); msg.value must equal the sum of both amounts
  </FField>

  <FField name="fundDepositAndReserveFor" params={["address _addr", "uint256 _depositAmount", "uint256 _reserveAmount"]}>
    Fund deposit and reserve on behalf of another address (payable)
  </FField>

  <FField name="redeemWinningTicket" params={["Ticket memory _ticket", "bytes memory _sig", "uint256 _recipientRand"]}>
    Orchestrator redeems a winning ticket; transfers ETH to fee pool via BondingManager. Emits both `WinningTicketTransfer` and `WinningTicketRedeemed`.
  </FField>

  <FField name="unlock">
    Gateway initiates the withdrawal unlock period; emits `Unlock`
  </FField>

  <FField name="cancelUnlock">
    Gateway cancels an in-progress unlock; emits `UnlockCancelled`
  </FField>

  <FField name="withdraw">
    Gateway withdraws all deposit and reserve after unlock period; emits `Withdrawal`
  </FField>

  <FField name="getSenderInfo" returns="(Sender memory sender, ReserveInfo memory reserve)" params={["address _sender"]}>
    Returns full sender state: deposit amount, withdrawRound, and reserve info
  </FField>

  <FField name="isUnlockInProgress" returns="bool" params={["address _sender"]}>
    Returns whether a sender has an unlock in progress
  </FField>

  **Contract**

  <SolidityEmbed url={getBlockchainRawCodeHref(blockchainContractsPageData, 'ticket-broker')} title={<DoubleIconLink label="TicketBroker.sol"/>} filename="TicketBroker.sol" />
</Accordion>

#### **RoundsManager** <Subtitle text="Protocol Time Management" />

<Badge color="blue">
  Arbitrum One
</Badge>

The RoundsManager defines the protocol's time unit. A round is a fixed number of Arbitrum blocks. The current round must be initialised before Orchestrators can call `reward()`. It stores per-round block hashes used as randomness for ticket validation.

<Accordion title={<CustomCardTitle variant="accordion" icon={<ArbitrumIcon color="var(--arbitrum)" />} title="RoundsManager" />}>
  **Address (Arbitrum One)**:

  <AddressLinks address={getBlockchainContractAddress(blockchainContractsPageData, 'arbitrumOne', 'RoundsManager', 'proxy')} blockchainHref={getBlockchainExplorerHref(blockchainContractsPageData, 'arbitrumOne', 'RoundsManager', 'proxy')} githubHref={getBlockchainCodeHref(blockchainContractsPageData, 'arbitrumOne', 'RoundsManager', 'proxy')} />

  <Icon icon="check" color="var(--text)" /> *Verified · Controller registered · Active · Proxy target resolved*

  **Purpose**:

  * Tracks the current round number and round length in blocks
  * Stores block hashes per round for ticket randomness (used by TicketBroker)
  * Enforces the round lock period – Orchestrators cannot change parameters during the lock window at end of each round
  * `initializeRound()` must be called at the start of each new round before reward calls proceed

  **Key functions** (from `RoundsManager.sol`):

  <FField name="initializeRound">
    Initialise a new round; callable by any address; updates block hash store and LIP upgrade rounds
  </FField>

  <FField name="currentRound" returns="uint256">
    Returns current round number
  </FField>

  <FField name="currentRoundInitialized" returns="bool">
    Returns whether the current round has been initialised
  </FField>

  <FField name="currentRoundLocked" returns="bool">
    Returns whether the current round is in its lock period
  </FField>

  <FField name="blockHashForRound" returns="bytes32" params={["uint256 _round"]}>
    Returns the stored block hash for a given round
  </FField>

  <FField name="roundLength" returns="uint256">
    Returns round length in blocks
  </FField>

  <FField name="roundLockAmount" returns="uint256">
    Returns lock period as a percentage of round length (MathUtils percPoint)
  </FField>

  **Contract**

  <SolidityEmbed url={getBlockchainRawCodeHref(blockchainContractsPageData, 'rounds-manager')} title={<DoubleIconLink label="RoundsManager.sol"/>} filename="RoundsManager.sol" />
</Accordion>

#### **Minter** <Subtitle text="Token Inflation" />

<Badge color="blue">
  Arbitrum One
</Badge>

The Minter controls LPT token inflation. Each round it calculates the mintable token supply based on the configured inflation rate. Since the Delta upgrade (LIP-91), a configurable fraction of each round's reward is minted to the Treasury rather than solely to Orchestrators and Delegators.

<Accordion title={<CustomCardTitle variant="accordion" icon={<ArbitrumIcon color="var(--arbitrum)" />} title="Minter" />}>
  **Address (Arbitrum One)**:

  <AddressLinks address={getBlockchainContractAddress(blockchainContractsPageData, 'arbitrumOne', 'Minter')} blockchainHref={getBlockchainExplorerHref(blockchainContractsPageData, 'arbitrumOne', 'Minter')} githubHref={getBlockchainCodeHref(blockchainContractsPageData, 'arbitrumOne', 'Minter')} />

  <Icon icon="check" color="var(--text)" /> *Verified · Controller registered · Active*

  **Purpose**:

  * Manages LPT token inflation schedule
  * Calculates mintable tokens per round based on current `inflation` rate and total LPT supply
  * Adjusts inflation up or down each round based on actual bonding rate vs `targetBondingRate`
  * Called by BondingManager during Orchestrator `reward()` calls – not called directly
  * Holds ETH received from TicketBroker redemptions and disburses to Orchestrators

  **Key functions** (from `Minter.sol`):

  <FField name="createReward" returns="uint256" params={["uint256 _fracNum", "uint256 _fracDenom"]}>
    Called only by BondingManager; mints a fraction of mintable tokens for the round as a reward
  </FField>

  <FField name="trustedTransferTokens" params={["address _to", "uint256 _amount"]}>
    Transfer LPT to an address; callable by BondingManager only
  </FField>

  <FField name="trustedBurnTokens" params={["uint256 _amount"]}>
    Burn LPT; callable by BondingManager only
  </FField>

  <FField name="trustedWithdrawETH" params={["address payable _to", "uint256 _amount"]}>
    Withdraw ETH to an address; callable by BondingManager only
  </FField>

  <FField name="depositETH">
    Receive ETH from TicketBroker on ticket redemption (payable)
  </FField>

  <FField name="currentMintableTokens" returns="uint256">
    Returns LPT mintable in the current round
  </FField>

  <FField name="currentMintedTokens" returns="uint256">
    Returns LPT already minted in the current round
  </FField>

  <FField name="inflation" returns="uint256">
    Returns current inflation rate as a MathUtils percPoint value
  </FField>

  <FField name="inflationChange" returns="uint256">
    Returns per-round inflation adjustment amount
  </FField>

  <FField name="targetBondingRate" returns="uint256">
    Returns the target bonding rate that inflation adjusts towards
  </FField>

  **Contract**

  <SolidityEmbed url={getBlockchainRawCodeHref(blockchainContractsPageData, 'minter')} title={<DoubleIconLink label="Minter.sol"/>} filename="Minter.sol" />
</Accordion>

#### **ServiceRegistry** <Subtitle text="Orchestrator Discovery" />

<Badge color="blue">
  Arbitrum One
</Badge>

The ServiceRegistry stores each Orchestrator's publicly advertised HTTPS service URI on-chain. Gateway nodes query this registry during network initialisation to discover Orchestrators. Each update emits a `ServiceURIUpdate` event that off-chain indexers track.

<Accordion title={<CustomCardTitle variant="accordion" icon={<ArbitrumIcon color="var(--arbitrum)" />} title="ServiceRegistry" />}>
  **Address (Arbitrum One)**:

  <AddressLinks address={getBlockchainContractAddress(blockchainContractsPageData, 'arbitrumOne', 'ServiceRegistry', 'proxy')} blockchainHref={getBlockchainExplorerHref(blockchainContractsPageData, 'arbitrumOne', 'ServiceRegistry', 'proxy')} githubHref={getBlockchainCodeHref(blockchainContractsPageData, 'arbitrumOne', 'ServiceRegistry', 'proxy')} />

  <Icon icon="check" color="var(--text)" /> *Verified · Controller registered · Active · Proxy target resolved*

  **Purpose**:

  * Allows Orchestrators to register and update their service endpoint URIs
  * Enables Gateway nodes to discover Orchestrators when using `-network arbitrum-one-mainnet`
  * Not used when a Gateway specifies `-orchAddr` directly

  **Key functions** (from `ServiceRegistry.sol`):

  <FField name="setServiceURI" params={["string calldata _serviceURI"]}>
    Orchestrator registers or updates their HTTPS endpoint; emits `ServiceURIUpdate(address indexed _addr, string _serviceURI)`
  </FField>

  <FField name="getServiceURI" returns="string" params={["address _addr"]}>
    Returns the registered URI for a given Orchestrator address
  </FField>

  **Contract**

  <SolidityEmbed url={getBlockchainRawCodeHref(blockchainContractsPageData, 'service-registry')} title={<DoubleIconLink label="ServiceRegistry.sol"/>} filename="ServiceRegistry.sol" />
</Accordion>

#### **AIServiceRegistry** <Subtitle text="AI Capability Registration" />

<Badge color="blue">
  Arbitrum One
</Badge>

A standalone ServiceRegistry for AI subnet Orchestrators. Detached from the Controller – its address is hardcoded in go-livepeer (`starter.go`) rather than resolved dynamically. Deployed by a different deployer than the main protocol contracts.

<Accordion title={<CustomCardTitle variant="accordion" icon={<ArbitrumIcon color="var(--arbitrum)" />} title="AIServiceRegistry" />}>
  **Address (Arbitrum One)**:

  <AddressLinks address={getBlockchainContractAddress(blockchainContractsPageData, 'arbitrumOne', 'AIServiceRegistry')} blockchainHref={getBlockchainExplorerHref(blockchainContractsPageData, 'arbitrumOne', 'AIServiceRegistry')} githubHref={getBlockchainCodeHref(blockchainContractsPageData, 'arbitrumOne', 'AIServiceRegistry')} />

  <Icon icon="check" color="var(--text)" /> *Verified · Deployment artifact confirmed · Runtime consumer confirmed · Active*

  **Purpose**:

  * Stores service URI and capability metadata for AI-enabled Orchestrators
  * Used when a node is started with `-aiServiceRegistry` flag
  * Same interface as ServiceRegistry (`setServiceURI`, `getServiceURI`)
</Accordion>

<CustomDivider style={{margin: "0 0 -2rem 0"}} />

## Token and Utility Contracts

The LivepeerToken contract originates on Ethereum Mainnet and is bridged to Arbitrum One via paired Gateway contracts, with a BridgeMinter handling L1 mint operations.
All active protocol operations use the Arbitrum One representation.
LPT must be bridged before it can be staked, delegated, or used for payments.

<Info>
  Livepeer moved from Ethereum Mainnet to Arbitrum One in 2022 (the Confluence upgrade) to increase throughput and reduce fees.

  On Ethereum Mainnet, only the `LivepeerToken` and `BridgeMinter` contracts remain operational. All other Ethereum Mainnet protocol contracts are paused.
</Info>

```mermaid theme={"theme":{"light":"github-light","dark":"dark-plus"}}
%%{init: {'theme': 'base', 'themeVariables': {'primaryColor': '#18794E', 'primaryTextColor': '#fff', 'primaryBorderColor': '#3CB540', 'lineColor': '#3CB540', 'mainBkg': '#18794E', 'nodeBorder': '#3CB540', 'clusterBkg': 'transparent', 'clusterBorder': '#3CB540', 'titleColor': '#3CB540', 'edgeLabelBackground': 'transparent', 'textColor': '#3CB540', 'nodeTextColor': '#fff'}}}%%
graph TB
    subgraph "Ethereum Mainnet"
        L1LPT["LivepeerToken (origin)"]
        BridgeMinter["BridgeMinter"]
        L1GW["L1LPTGateway"]
        ESC["L1Escrow"]
    end
    subgraph "Arbitrum One"
        L2LPT["LivepeerToken (bridged)"]
        L2GW["L2LPTGateway"]
        Minter["Minter (inflation)"]
    end
    L1GW -->|"lock LPT"| ESC
    L2GW -->|"mint on L2"| L2LPT
    BridgeMinter -->|"mint on L1"| L1LPT
    Minter -->|"mint rewards"| L2LPT
    L1GW <-.->|"Arbitrum bridge"| L2GW
```

***

#### **LivepeerToken (LPT)** <Subtitle text="ERC-20 Token" />

<Badge color="green">
  Ethereum Mainnet (origin)
</Badge>

The LivepeerToken is the native protocol token. It is an ERC-20 with AccessControl-based MINTER\_ROLE and BURNER\_ROLE. The canonical token contract lives on Ethereum Mainnet; a bridged representation exists on Arbitrum One.

<Accordion title={<CustomCardTitle variant="accordion" icon={<LivepeerIcon color="var(--accent)" size={13} />} title="LivepeerToken" />}>
  **Address (Arbitrum One)**:

  <AddressLinks address={getBlockchainContractAddress(blockchainContractsPageData, 'arbitrumOne', 'LivepeerToken')} blockchainHref={getBlockchainExplorerHref(blockchainContractsPageData, 'arbitrumOne', 'LivepeerToken')} githubHref={getBlockchainCodeHref(blockchainContractsPageData, 'arbitrumOne', 'LivepeerToken')} />

  <Icon icon="check" color="var(--text)" /> *Verified · Controller registered · Active*

  **Address (Ethereum Mainnet)**:

  <AddressLinks address={getBlockchainContractAddress(blockchainContractsPageData, 'ethereumMainnet', 'LivepeerToken')} blockchainHref={getBlockchainExplorerHref(blockchainContractsPageData, 'ethereumMainnet', 'LivepeerToken')} githubHref={getBlockchainCodeHref(blockchainContractsPageData, 'ethereumMainnet', 'LivepeerToken')} />

  <Icon icon="check" color="var(--text)" /> *Verified · Controller registered · Active*

  **Purpose**:

  * ERC-20 token used for bonding, staking, Gateway payment reserves, and governance voting weight
  * `approve()` must be called before bonding or funding deposits
  * On Arbitrum One: minted by Minter (inflationary rewards) and by the bridge (inflows from L1)

  **Key functions** (from `LivepeerToken.sol`, inherits [OpenZeppelin](https://docs.openzeppelin.com/contracts/5.x/api/token/erc20) ERC20 + ERC20Permit + ERC20Burnable + AccessControl):

  <FField name="transfer / transferFrom / approve / balanceOf / totalSupply / allowance">
    Standard ERC-20 interface
  </FField>

  <FField name="permit" params={["..."]}>
    EIP-2612 gasless approval
  </FField>

  <FField name="mint" params={["address _to", "uint256 _amount"]}>
    Callable only by MINTER\_ROLE (Minter contract on Arbitrum, BridgeMinter on L1)
  </FField>

  <FField name="burn" params={["uint256 _amount"]}>
    Callable only by BURNER\_ROLE
  </FField>

  **Contract**

  <SolidityEmbed url={getBlockchainRawCodeHref(blockchainContractsPageData, 'livepeer-token-arbitrum')} title={<DoubleIconLink label="LivepeerToken.sol (L2)"/>} filename="LivepeerToken.sol" />
</Accordion>

#### **BridgeMinter** <Subtitle text="L1 Bridge Minting" />

<Badge color="green">Ethereum Mainnet</Badge>

Holds MINTER\_ROLE on the L1 LivepeerToken. Called by the bridge when LPT is transferred from Arbitrum back to Ethereum Mainnet, minting the corresponding L1 LPT.

<Info>
  `BridgeMinter.sol` is an Ethereum Mainnet contract predating the Delta upgrade.
  <FlexContainer align="center" marginTop="0.5rem"> See <DoubleIconLink label="BridgeMinter.sol" href={getBlockchainCodeHref(blockchainContractsPageData, 'ethereumMainnet', 'BridgeMinter')} /> on the `streamflow` branch of `livepeer/protocol`</FlexContainer>
</Info>

<Accordion title={<CustomCardTitle variant="accordion" icon={<Icon icon="ethereum" color="var(--hero-text)"/>} title="BridgeMinter" />}>
  **Address (Ethereum Mainnet)**:

  <AddressLinks address={getBlockchainContractAddress(blockchainContractsPageData, 'ethereumMainnet', 'BridgeMinter')} blockchainHref={getBlockchainExplorerHref(blockchainContractsPageData, 'ethereumMainnet', 'BridgeMinter')} githubHref={getBlockchainCodeHref(blockchainContractsPageData, 'ethereumMainnet', 'BridgeMinter')} />

  <Icon icon="check" color="var(--text)" /> *Verified · Bridge-derived · Active*

  **Purpose**:

  * Holds MINTER\_ROLE on the L1 LivepeerToken contract
  * Called exclusively by L1LPTGateway when LPT is bridged from Arbitrum back to Ethereum Mainnet
  * Also callable by L1Migrator for migration operations (`withdrawETHToL1Migrator`, `withdrawLPTToL1Migrator`)
  * Registered with the Ethereum Mainnet Controller (`0xF96D54E490317c557A967ABfA5d6e33006BE69b3`)

  **Key functions** (from `BridgeMinter.sol`, `streamflow` branch):

  <FField name="bridgeMint" params={["address _to", "uint256 _amount"]}>
    Mint LPT to an address; callable by L1LPTGateway only
  </FField>

  <FField name="withdrawETHToL1Migrator" returns="uint256">
    Send contract ETH balance to L1Migrator; callable by L1Migrator only
  </FField>

  <FField name="withdrawLPTToL1Migrator" returns="uint256">
    Send contract LPT balance to L1Migrator; callable by L1Migrator only
  </FField>

  <FField name="migrateToNewMinter" params={["address _newMinterAddr"]}>
    Transfer token ownership and balances to a new Minter; callable by Controller owner only
  </FField>

  <FField name="depositETH" returns="bool">
    Accept ETH deposits; required for migration compatibility with older Minter implementations (payable)
  </FField>

  **Contract**

  <SolidityEmbed url={getBlockchainRawCodeHref(blockchainContractsPageData, 'bridge-minter')} title={<DoubleIconLink label="BridgeMinter.sol"/>} filename="BridgeMinter.sol" />
</Accordion>

#### **L1 LPTGateway / L2 LPTGateway** <Subtitle text="Token Bridge" />

<Badge color="green">
  Ethereum Mainnet
</Badge>

<Badge color="blue">
  Arbitrum One
</Badge>

Paired bridge Gateway contracts on Ethereum Mainnet (L1) and Arbitrum One (L2). LPT bridged L1→L2 is locked in L1Escrow; LPT bridged L2→L1 is released from escrow or minted via BridgeMinter. Based on the Dai bridge architecture.

<Accordion title={<CustomCardTitle variant="accordion" icon={<ArbitrumIcon color="var(--arbitrum)" />} title="Bridge Gateways" />}>
  **L2LPTGateway (Arbitrum One)**:

  <AddressLinks address={getBlockchainContractAddress(blockchainContractsPageData, 'arbitrumOne', 'L2LPTGateway')} blockchainHref={getBlockchainExplorerHref(blockchainContractsPageData, 'arbitrumOne', 'L2LPTGateway')} githubHref={getBlockchainCodeHref(blockchainContractsPageData, 'arbitrumOne', 'L2LPTGateway')} />

  <Icon icon="check" color="var(--text)" /> *Verified · Bridge-derived · Bridge artifact confirmed · Active*

  **L1LPTGateway (Ethereum Mainnet)**:

  <AddressLinks address={getBlockchainContractAddress(blockchainContractsPageData, 'ethereumMainnet', 'L1LPTGateway')} blockchainHref={getBlockchainExplorerHref(blockchainContractsPageData, 'ethereumMainnet', 'L1LPTGateway')} githubHref={getBlockchainCodeHref(blockchainContractsPageData, 'ethereumMainnet', 'L1LPTGateway')} />

  <Icon icon="check" color="var(--text)" /> *Verified · Bridge-derived · Bridge artifact confirmed · Active*

  **L1Escrow (Ethereum Mainnet)**:

  <AddressLinks address={getBlockchainContractAddress(blockchainContractsPageData, 'ethereumMainnet', 'L1Escrow')} blockchainHref={getBlockchainExplorerHref(blockchainContractsPageData, 'ethereumMainnet', 'L1Escrow')} githubHref={getBlockchainCodeHref(blockchainContractsPageData, 'ethereumMainnet', 'L1Escrow')} />

  <Icon icon="check" color="var(--text)" /> *Verified · Bridge-derived · Bridge artifact confirmed · Active*

  **Contract**

  <SolidityEmbed url={getBlockchainRawCodeHref(blockchainContractsPageData, 'l2-lpt-gateway')} title={<DoubleIconLink label="L2LPTGateway.sol"/>} filename="L2LPTGateway.sol" />
</Accordion>

#### **LivepeerTokenFaucet** <Subtitle text="Local development utility" />

<Badge color="surface">Local development</Badge>

<Note>Local development utility contract.</Note>

<CustomDivider />

## Governance Contracts

The Delta upgrade ([LIP-89](https://github.com/livepeer/LIPs/blob/master/LIPs/LIP-89.md), [LIP-91](https://github.com/livepeer/LIPs/blob/master/LIPs/LIP-91.md) - October 2023) introduced full on-chain governance alongside the [Livepeer Treasury](/v2/about/protocol/treasury). The governance system consists of four contracts working together: BondingVotes checkpoints voting power, LivepeerGovernor manages proposal voting, Treasury holds protocol funds, and Governor executes approved upgrades.

```mermaid theme={"theme":{"light":"github-light","dark":"dark-plus"}}
%%{init: {'theme': 'base', 'themeVariables': {'primaryColor': '#18794E', 'primaryTextColor': '#fff', 'primaryBorderColor': '#3CB540', 'lineColor': '#3CB540', 'mainBkg': '#18794E', 'nodeBorder': '#3CB540', 'clusterBkg': 'transparent', 'clusterBorder': '#3CB540', 'titleColor': '#3CB540', 'edgeLabelBackground': 'transparent', 'textColor': '#3CB540', 'nodeTextColor': '#fff'}}}%%
graph LR
    BM[BondingManager] -->|"checkpoint"| BV[BondingVotes]
    D[Delegator] -->|"castVote()"| LG[LivepeerGovernor]
    BV -->|"voting power"| LG
    LG -->|"queue"| T[Treasury / Timelock]
    T -->|"execute"| GOV[Governor]
    GOV -->|"update contracts"| C[Controller]
    MINT[Minter] -.->|"trustedTransferTokens()"| T
```

***

#### **BondingVotes** <Subtitle text="Voting Power Checkpointing" />

<Badge color="blue">
  Arbitrum One
</Badge>

BondingVotes implements the ERC-5805 votes interface, storing per-round stake checkpoints for every Delegator and Orchestrator. The LivepeerGovernor queries it to determine voting power at proposal creation time. Checkpoints are written automatically by BondingManager on every bond, unbond, reward, and earnings claim.

<Accordion title={<CustomCardTitle variant="accordion" icon={<ArbitrumIcon color="var(--arbitrum)" />} title="BondingVotes" />}>
  **Address (Arbitrum One)**:

  <AddressLinks address={getBlockchainContractAddress(blockchainContractsPageData, 'arbitrumOne', 'BondingVotes', 'proxy')} blockchainHref={getBlockchainExplorerHref(blockchainContractsPageData, 'arbitrumOne', 'BondingVotes', 'proxy')} githubHref={getBlockchainCodeHref(blockchainContractsPageData, 'arbitrumOne', 'BondingVotes', 'proxy')} />

  <Icon icon="check" color="var(--text)" /> *Verified · Controller registered · Active · Proxy target resolved · Target V2*

  **Purpose**:

  * Stores per-round stake checkpoints for every participant
  * Implements ERC-5805 (`getPastVotes`, `getPastTotalSupply`) used by LivepeerGovernor
  * Checkpoints are written by BondingManager – not called directly by users
  * Supports Delegator vote overrides: a Delegator can override their Orchestrator's vote

  **Key functions** (from `BondingVotes.sol`, `delta` branch):

  <FField name="checkpointBondingState" params={["address _owner", "uint256 _startRound", "uint256 _bondedAmount", "address _delegateAddress", "uint256 _delegatedAmount", "uint256 _lastClaimRound", "uint256 _lastRewardRound"]}>
    Called by BondingManager to checkpoint stake state; not callable directly by users
  </FField>

  <FField name="checkpointTotalActiveStake" params={["uint256 _totalStake", "uint256 _round"]}>
    Checkpoint total active stake; called by BondingManager
  </FField>

  <FField name="getPastVotes" returns="uint256" params={["address _account", "uint256 _round"]}>
    Returns voting power for an account at the start of a given round
  </FField>

  <FField name="getPastTotalSupply" returns="uint256" params={["uint256 _round"]}>
    Returns total voting power (active stake) at a given round
  </FField>

  <FField name="hasCheckpoint" returns="bool" params={["address _account"]}>
    Returns whether an account has any checkpointed stake
  </FField>

  **Contract**

  <SolidityEmbed url={getBlockchainRawCodeHref(blockchainContractsPageData, 'bonding-votes')} title={<DoubleIconLink label="BondingVotes.sol"/>} filename="BondingVotes.sol" />
</Accordion>

#### **Governor** <Subtitle text="Protocol Upgrade Executor" />

<Badge color="blue">
  Arbitrum One
</Badge>

The original upgrade execution contract. Holds the owner role on the Controller. Executes protocol upgrades (contract address updates, parameter changes) via a staged update queue with a configurable block delay.

<Accordion title={<CustomCardTitle variant="accordion" icon={<ArbitrumIcon color="var(--arbitrum)" />} title="Governor" />}>
  **Address (Arbitrum One)**:

  <AddressLinks address={getBlockchainContractAddress(blockchainContractsPageData, 'arbitrumOne', 'Governor')} blockchainHref={getBlockchainExplorerHref(blockchainContractsPageData, 'arbitrumOne', 'Governor')} githubHref={getBlockchainCodeHref(blockchainContractsPageData, 'arbitrumOne', 'Governor')} />

  <Icon icon="check" color="var(--text)" /> *Verified · Deployment artifact confirmed · Active*

  **Purpose**:

  * Owns the Controller contract – only address that can call `setContractInfo()`
  * Executes protocol upgrade transactions after governance approval
  * Enforces a staged execution queue with a mandatory block-number delay

  **Key functions** (from `Governor.sol`):

  <FField name="stage" params={["Update memory _update", "uint256 _delay"]}>
    Queue a batch of upgrade transactions with a delay in blocks; callable by owner only; emits `UpdateStaged`
  </FField>

  <FField name="execute" params={["Update memory _update"]}>
    Execute a queued update after its block delay has elapsed; emits `UpdateExecuted`
  </FField>

  <FField name="cancel" params={["Update memory _update"]}>
    Cancel a staged update; callable by owner only; emits `UpdateCancelled`
  </FField>

  The `Update` struct contains: `address[] target`, `uint256[] value`, `bytes[] data`, `uint256 nonce`.

  `owner` is a public state variable (not a function) returning the current owner address.

  **Contract**

  <SolidityEmbed url={getBlockchainRawCodeHref(blockchainContractsPageData, 'governor')} title={<DoubleIconLink label="Governor.sol"/>} filename="Governor.sol" />
</Accordion>

#### **LivepeerGovernor** <Subtitle text="On-Chain Voting" />

<Badge color="blue">
  Arbitrum One
</Badge>

Implements [OpenZeppelin](https://docs.openzeppelin.com/contracts/5.x/api/governance)'s upgradeable Governor framework adapted for Livepeer's stake-weighted voting. Voting power equals bonded LPT as recorded by BondingVotes at proposal creation time. Supports GovernorCountingOverridable – Delegators can override their Orchestrator's vote on any proposal.

<Accordion title={<CustomCardTitle variant="accordion" icon={<ArbitrumIcon color="var(--arbitrum)" />} title="LivepeerGovernor" />}>
  **Address (Arbitrum One)**:

  <AddressLinks address={getBlockchainContractAddress(blockchainContractsPageData, 'arbitrumOne', 'LivepeerGovernor', 'proxy')} blockchainHref={getBlockchainExplorerHref(blockchainContractsPageData, 'arbitrumOne', 'LivepeerGovernor', 'proxy')} githubHref={getBlockchainCodeHref(blockchainContractsPageData, 'arbitrumOne', 'LivepeerGovernor', 'proxy')} />

  <Icon icon="check" color="var(--text)" /> *Verified · Controller registered · Active · Proxy target resolved*

  **Purpose**:

  * On-chain voting for protocol proposals, weighted by bonded LPT stake
  * Delegators can override their Orchestrator's vote (GovernorCountingOverridable)
  * Passed proposals execute through the Treasury timelock, then through the Governor to the Controller
  * `bumpGovernorVotesTokenAddress()` must be called if BondingVotes address ever changes

  **Key functions** (from `LivepeerGovernor.sol`, `delta` branch):

  <FField name="initialize" params={["uint256 _initialVotingDelay", "uint256 _initialVotingPeriod", "uint256 _initialProposalThreshold", "uint256 _initialQuorumNumerator", "TimelockControllerUpgradeable _timelock", "address _controller"]}>
    One-time initialisation via proxy
  </FField>

  <FField name="propose" returns="uint256" params={["address[] memory targets", "uint256[] memory values", "bytes[] memory calldatas", "string memory description"]}>
    Submit a new governance proposal; returns proposalId
  </FField>

  <FField name="castVote" returns="uint256" params={["uint256 proposalId", "uint8 support"]}>
    Cast a vote (0=Against, 1=For, 2=Abstain)
  </FField>

  <FField name="castVoteWithReason" returns="uint256" params={["uint256 proposalId", "uint8 support", "string calldata reason"]}>
    Vote with explanation
  </FField>

  <FField name="queue" returns="uint256" params={["address[] memory targets", "uint256[] memory values", "bytes[] memory calldatas", "bytes32 descriptionHash"]}>
    Queue a passed proposal into the timelock
  </FField>

  <FField name="execute" returns="uint256" params={["address[] memory targets", "uint256[] memory values", "bytes[] memory calldatas", "bytes32 descriptionHash"]}>
    Execute a queued proposal after timelock delay
  </FField>

  <FField name="quorumDenominator" returns="uint256">
    Returns `MathUtils.PERC_DIVISOR` (the quorum denominator)
  </FField>

  <FField name="bumpGovernorVotesTokenAddress">
    Update the internal BondingVotes reference if its address has changed
  </FField>

  **Contract**

  <SolidityEmbed url={getBlockchainRawCodeHref(blockchainContractsPageData, 'livepeer-governor')} title={<DoubleIconLink label="LivepeerGovernor.sol"/>} filename="LivepeerGovernor.sol" />
</Accordion>

#### **Treasury** <Subtitle text="Protocol Treasury" />

<Badge color="blue">
  Arbitrum One
</Badge>

An [OpenZeppelin](https://docs.openzeppelin.com/contracts/5.x/api/governance#TimelockController) TimelockControllerUpgradeable that holds the protocol's on-chain treasury. A configurable percentage of each round's inflationary LPT rewards is directed here by the Minter. All disbursements require a passed LivepeerGovernor proposal. Automatic contributions halt when the treasury balance exceeds `treasuryBalanceCeiling` (configured in BondingManager).

<Accordion title={<CustomCardTitle variant="accordion" icon={<ArbitrumIcon color="var(--arbitrum)" />} title="Treasury" />}>
  **Address (Arbitrum One)**:

  <AddressLinks address={getBlockchainContractAddress(blockchainContractsPageData, 'arbitrumOne', 'Treasury')} blockchainHref={getBlockchainExplorerHref(blockchainContractsPageData, 'arbitrumOne', 'Treasury')} githubHref={getBlockchainCodeHref(blockchainContractsPageData, 'arbitrumOne', 'Treasury')} />

  <Icon icon="check" color="var(--text)" /> *Verified · Controller registered · Active*

  **Purpose**:

  * Receives a fraction of each round's inflationary LPT rewards (rate set by `treasuryRewardCutRate` in BondingManager)
  * Governed entirely by LivepeerGovernor – all disbursements require a passed proposal
  * Implements TimelockController – all operations have a mandatory delay between queue and execution
  * Contributions automatically halt when LPT balance exceeds `treasuryBalanceCeiling`
  * Funds Special Purpose Entities (SPEs) and ecosystem grants via governance proposals

  **Key functions** ([OpenZeppelin](https://docs.openzeppelin.com/contracts/5.x/api/governance#TimelockController)) TimelockControllerUpgradeable):

  <FField name="schedule" params={["address target", "uint256 value", "bytes calldata data", "bytes32 predecessor", "bytes32 salt", "uint256 delay"]}>
    Schedule an operation; callable by proposer role (LivepeerGovernor)
  </FField>

  <FField name="execute" params={["address target", "uint256 value", "bytes calldata payload", "bytes32 predecessor", "bytes32 salt"]}>
    Execute a ready operation; callable by executor role
  </FField>

  <FField name="cancel" params={["bytes32 id"]}>
    Cancel a pending operation; callable by canceller role
  </FField>

  <FField name="isOperation" returns="bool" params={["bytes32 id"]}>
    Check if an operation exists
  </FField>

  <FField name="isOperationReady" returns="bool" params={["bytes32 id"]}>
    Check if an operation is past its delay and ready to execute
  </FField>

  <FField name="getMinDelay" returns="uint256">
    Returns the minimum delay for all operations
  </FField>

  **Contract**

  <SolidityEmbed url={getBlockchainRawCodeHref(blockchainContractsPageData, 'treasury')} title={<DoubleIconLink label="Treasury.sol"/>} filename="Treasury.sol" />
</Accordion>

<CustomDivider />

## Migration Contracts

The [Confluence upgrade (2022)](https://medium.com/livepeer-blog/the-confluence-upgrade-is-live-3b6b342ea71e) migrated the Livepeer Protocol from Ethereum Mainnet to Arbitrum One.
These contracts facilitated that migration.
<br />The migration is complete - no new migrations are possible - but both contracts remain registered in the Controller.
<Info> L2Migrator continues to process pending `claimStake` calls from participants who have not yet claimed their migrated stake as of March 2026.</Info>

#### **L2Migrator** <Subtitle text="Stake Migration" />

<Badge color="blue">
  Arbitrum One
</Badge>

Facilitated the migration of bonded stake and delegations from Ethereum Mainnet to Arbitrum One during the Confluence upgrade. Participants who migrated on L1 claim their Arbitrum-side stake by calling `claimStake()` here. The contract still holds residual ETH and continues to receive `claimStake` calls from participants who have not yet claimed.

<Accordion title={<CustomCardTitle variant="accordion" icon={<ArbitrumIcon color="var(--arbitrum)" />} title="L2Migrator" />}>
  **Proxy Address (Arbitrum One)**:

  <AddressLinks address={getBlockchainContractAddress(blockchainContractsPageData, 'arbitrumOne', 'L2Migrator', 'proxy')} blockchainHref={getBlockchainExplorerHref(blockchainContractsPageData, 'arbitrumOne', 'L2Migrator', 'proxy')} githubHref={getBlockchainCodeHref(blockchainContractsPageData, 'arbitrumOne', 'L2Migrator', 'proxy')} />

  **Current Target (Arbitrum One)**:

  <AddressLinks address={getBlockchainContractAddress(blockchainContractsPageData, 'arbitrumOne', 'L2Migrator', 'target')} blockchainHref={getBlockchainExplorerHref(blockchainContractsPageData, 'arbitrumOne', 'L2Migrator', 'target')} githubHref={getBlockchainCodeHref(blockchainContractsPageData, 'arbitrumOne', 'L2Migrator', 'target')} />

  <Icon icon="check" color="var(--text)" /> *Verified · Controller registered · Migration · Proxy target resolved*

  **Purpose**:

  * Receives cross-chain migration messages from the L1Migrator via the Arbitrum bridge
  * Allows participants to claim their migrated bonded stake on Arbitrum One via `claimStake()`
  * Allows Delegators to claim migrated delegations via `claimDelegatorStake()`
  * Holds residual ETH from migration fee payments; no new migrations are possible

  **Key functions**:

  <FField name="claimStake" params={["address _delegate", "uint256 _stake", "uint256 _fees", "address[] calldata _delegators", "uint256[] calldata _delegatorStakes"]}>
    Claim migrated stake on Arbitrum One; callable by participants who completed an L1 migration
  </FField>

  <FField name="finalizeMigrateDelegator" params={["address _l1Addr", "address _l2Addr", "address _delegate", "uint256 _stake", "uint256 _fees"]}>
    Finalise a Delegator migration initiated on L1; called via the bridge
  </FField>
</Accordion>

#### **MerkleSnapshot** <Subtitle text="Migration Proof Verification" />

<Badge color="blue">
  Arbitrum One
</Badge>

Stores Merkle roots used to verify stake snapshots taken at the time of the Confluence migration. Used internally by L2Migrator to validate migration claims.

<Accordion title={<CustomCardTitle variant="accordion" icon={<ArbitrumIcon color="var(--arbitrum)" />} title="MerkleSnapshot" />}>
  **Address (Arbitrum One)**:

  <AddressLinks address={getBlockchainContractAddress(blockchainContractsPageData, 'arbitrumOne', 'MerkleSnapshot')} blockchainHref={getBlockchainExplorerHref(blockchainContractsPageData, 'arbitrumOne', 'MerkleSnapshot')} githubHref={getBlockchainCodeHref(blockchainContractsPageData, 'arbitrumOne', 'MerkleSnapshot')} />

  <Icon icon="check" color="var(--text)" /> *Verified · Controller registered · Migration*

  **Purpose**:

  * Stores Merkle root snapshots (keyed by snapshot ID) set at migration time
  * Provides `verify()` for L2Migrator to validate that a claimed stake amount was included in the original snapshot
  * Read-only in practice; `setSnapshot()` is callable only by the Controller owner and has not been called since the migration

  **Key functions** (from `MerkleSnapshot.sol`):

  <FField name="verify" returns="bool" params={["bytes32 _id", "bytes32[] calldata _proof", "bytes32 _leaf"]}>
    Verify a Merkle proof against a stored snapshot root
  </FField>

  <FField name="setSnapshot" params={["bytes32 _id", "bytes32 _root"]}>
    Store a Merkle root for a given snapshot ID; callable by Controller owner only
  </FField>

  **Contract**

  <SolidityEmbed url={getBlockchainRawCodeHref(blockchainContractsPageData, 'merkle-snapshot')} title={<DoubleIconLink label="MerkleSnapshot.sol"/>} filename="MerkleSnapshot.sol" />
</Accordion>

<CustomDivider style={{margin: "-0.5rem 0 -2rem 0"}} />

## Full Address Reference

For the complete list of all current, paused, migration-residual, legacy-operational, and historical contract addresses across Arbitrum One and Ethereum Mainnet, see the [Contract Addresses](/v2/about/resources/reference/livepeer-contract-addresses) reference page.

<Icon icon="check" color="var(--lp-color-text-secondary)" /> <span className="lp-text-italic-muted">Last Verified {<DataWrap value={blockchainContractsPageData.meta.lastVerified} />}</span>

<Card href="/v2/about/resources/reference/livepeer-contract-addresses" icon="file-code" title={<> Contract Address Reference Page · Livepeer Docs <br/> <Badge color="surface"> <><Icon icon="user-robot" color="var(--text)"/> Automatically Updated </></Badge></>} horizontal arrow />

<Columns cols={2}>
  <Card href="https://github.com/livepeer/protocol" icon="github" title={<>Livepeer Protocol Source <br/>  <Badge color="green"> Commit Pinned </Badge></>} horizontal />

  <Card href="https://arbiscan.io/accounts/label/livepeer" icon="cubes" title={<>Livepeer Contracts Arbiscan <br/>  <Badge color="green"> On-chain Canonical </Badge></>} horizontal />
</Columns>

<CustomDivider style={{margin: "0 0 -2rem 0"}} />

## Related Pages

<Columns cols={2}>
  <Card title={<CustomCardTitle icon="coins" title="Livepeer Token" />} href="/v2/about/protocol/livepeer-token" horizontal arrow>
    LPT token mechanics, supply, minting, and the role of the token in the protocol.
  </Card>

  <Card title={<CustomCardTitle icon="vault" title="Treasury" />} href="/v2/about/protocol/treasury" horizontal arrow>
    On-chain treasury, funding proposals, SPEs, and the treasury balance ceiling.
  </Card>

  <Card title={<CustomCardTitle icon="landmark" title="Governance" />} href="/v2/about/protocol/governance-model" horizontal arrow>
    On-chain voting, proposal lifecycle, and Delegator vote overrides.
  </Card>

  <Card title={<CustomCardTitle icon="chart-line" title="Economics" />} href="/v2/about/protocol/economics" horizontal arrow>
    Inflation model, bonding rate targets, reward distribution, and fee economics.
  </Card>
</Columns>
