diff --git a/docs/images/multichain-registration.png b/docs/images/multichain-registration.png
new file mode 100644
index 0000000000..3efd029b9e
Binary files /dev/null and b/docs/images/multichain-registration.png differ
diff --git a/docs/multichain/README.md b/docs/multichain/README.md
new file mode 100644
index 0000000000..6dda21ded7
--- /dev/null
+++ b/docs/multichain/README.md
@@ -0,0 +1,162 @@
+[elip-008]: https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-008.md
+
+## Multichain Docs
+
+The EigenLayer multichain protocol enables *consumption* of EigenLayer L1 stake on supported destination chains. For launch the source chain is Ethereum Mainnet and the destination chains are Ethereum Mainnet and Base.
+
+This document provides an overview of system components, contracts, and user roles and is up-to-date with the latest [ELIP-008][elip-008]. Further documentation on the specific contracts can be found in this folder.
+
+---
+
+### Contents
+
+* [System Diagram](#system-diagram)
+* [Source Chain](#source-chain)
+ * [`CrossChainRegistry`](#cross-chain-registry)
+ * [`OperatorTableCalculator`](#operator-table-calculator)
+* [Destination Chain](#destination-chain)
+ * [`OperatorTableUpdater`](#operator-table-updater)
+ * [`CertificateVerifier`](#certificate-verifier)
+* [Roles and Actors](#roles-and-actors)
+* [Common User Flows](#common-user-flows)
+ * [Register for Generation/Transport](#registering-for-generationtransport)
+
+---
+
+### System Diagram
+
+```mermaid
+classDiagram
+direction TD
+namespace Source Chain {
+ class CrossChainRegistry {
+ createGenerationReservation
+ removeGenerationReservation
+ calculateOperatorTableBytes
+ }
+ class OperatorTableCalculator {
+ ECDSA/BN254 Table Calculator
+ }
+ class EigenLayer Core {
+ DelegationManager
+ AllocationManager
+ KeyRegistrar
+ PermissionController
+ }
+}
+namespace Off Chain {
+ class Generator {
+ generateGlobalTableRoot
+ }
+ class Transporter {
+ confirmGlobalTableRoot
+ updateOperatorTable
+ }
+}
+namespace Destination Chain {
+ class OperatorTableUpdater {
+ confirmGlobalTableRoot
+ updateOperatorTable
+ }
+ class CertificateVerifier {
+ BN254/ECDSA
+ }
+}
+
+
+CrossChainRegistry --> OperatorTableCalculator: Reads
+OperatorTableCalculator --> EigenLayer Core: Reads
+Generator --> CrossChainRegistry: Reads
+Transporter --> Generator: Gets Root
+Transporter --> OperatorTableUpdater: Confirms Root, Updates Tables
+OperatorTableUpdater --> CertificateVerifier: Updates table
+```
+---
+
+### Source Chain
+
+Source chain contracts are deployed to Ethereum Mainnet.
+
+#### Cross Chain Registry
+
+| File | Type | Proxy |
+| -------- | -------- | -------- |
+| [`CrossChainRegistry.sol`](../../src/contracts/multichain/CrossChainRegistry.sol) | Singleton | Transparent proxy |
+
+This contract enables AVSs to register to have their stakes transported to supported destination chains:
+* For a given operatorSet, an AVS denotes its operator table calculator and global configuration
+* The offchain service calculates and transports each operator table from this contract at a pre-defined cadence
+
+See full documentation in [`/source/CrossChainRegistry.md`](./source/CrossChainRegistry.md).
+
+#### Operator Table Calculator
+
+These contracts are **deployed by an AVS** and define custom stake weights of operators in an operatorSet. They are segmented by key-type.
+
+See full documentation in the [middleware repository](https://github.com/Layr-Labs/eigenlayer-middleware/tree/dev/docs).
+
+---
+
+### Destination Chain
+
+Destination chain contracts receive transported stake weights from an offchain service. The supported destination chains are Mainnet and Base.
+
+#### Operator Table Updater
+
+| File | Type | Proxy |
+| -------- | -------- | -------- |
+| [`OperatorTableUpdater.sol`](../../src/contracts/multichain/OperatorTableUpdater.sol) | Singleton | Transparent proxy |
+
+The `operatorTableUpdater` carries out two basic functions:
+* Updating the `globalTableRoot` via a signed certificate from the *off-chain* `generator`. This is a permissionless function.
+* Updating operator tables via merkle proofs against the `globalTableRoot`. This is a permissionless function.
+
+See full documentation in [`/destination/OperatorTableUpdater.md`](./destination/OperatorTableUpdater.md).
+
+#### Certificate Verifier
+
+| File | Type | Proxy |
+| -------- | -------- | -------- |
+| [`BN254CertificateVerifier`](../../src/contracts/multichain/BN254CertificateVerifier.sol) | Singleton | Transparent proxy |
+| [`ECDSACertificateVerifier`](../../src/contracts/multichain/ECDSACertificateVerifier.sol) | Singleton | Transparent proxy |
+
+A `Certificate` is a proof of a task being executed offchain by the operators of an operatorSet. Two types of key material are supported: ECDSA and BN254.
+
+See full documentation in [`/destination/CertificateVerifier.md`](./destination/CertificateVerifier.md).
+
+---
+
+### Roles and Actors
+
+#### AVS
+
+An AVS is an entity that uses delegated or slashable security from operators to execute off-chain tasks. Consumers of an AVS utilize the `CertificateVerifier` to validate tasks.
+
+*Flows:*
+* AVSs **register** for transporting their stakes via the `CrossChainRegistry`
+* AVSs **deploy** an OperatorTableCalculator for each of their operatorSets
+
+#### Generator
+
+The `Generator` is an EigenLabs-operated entity that calculates and signs off on the `GlobalTableRoot` for all operatorSets that have requested to be transported to a `DestinationChain`. For the pilot program, there is no stake backing the `Generator` and it is not slashable.
+
+*Offchain Flows:*
+* The generator **calculates** and **signs** the `GlobalTableRoot`. Within the contracts, this is referred to as the `globalRootConfirmerSet`.
+
+#### Transporter
+
+The `Transporter` serves two purposes:
+* **Transport** the `GlobalTableRoot` to all destination chains
+* **Transport** operator tables to all destination chains
+
+Note: The Transport of the `GlobalTableRoot` and Operator Tables is *permissionless*. Any entity can transport the `GlobalTableRoot` with a valid certificate from the `Generator`. In addition, any entity can update the table with a valid merkle proof. See the [sidecar](https://github.com/Layr-Labs/sidecar) for how to run a transporter.
+
+---
+
+### Common User Flows
+
+#### Registering for Generation/Transport
+
+Registering for generation/transport is done by the AVS. The AVS *MUST* set the `KeyType` in the `KeyRegistrar`, even if it is not using the `KeyRegistrar` for storing operator keys.
+
+
\ No newline at end of file
diff --git a/docs/multichain/destination/CertificateVerifier.md b/docs/multichain/destination/CertificateVerifier.md
new file mode 100644
index 0000000000..b96eaaff6a
--- /dev/null
+++ b/docs/multichain/destination/CertificateVerifier.md
@@ -0,0 +1,465 @@
+## CertificateVerifier
+
+| File | Type | Proxy |
+| -------- | -------- | -------- |
+| [`ECDSACertificateVerifier.sol`](../../../src/contracts/multichain/ECDSACertificateVerifier.sol) | Singleton | Transparent proxy |
+| [`BN254CertificateVerifier.sol`](../../../src/contracts/multichain/BN254CertificateVerifier.sol) | Singleton | Transparent proxy |
+| [`IBaseCertificateVerifier.sol`](../../../src/contracts/interfaces/IBaseCertificateVerifier.sol) | Base interface for all verifiers | |
+
+Libraries and Mixins:
+
+| File | Used By | Notes |
+| -------- | -------- | -------- |
+| [`ECDSA.sol`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/utils/cryptography/ECDSA.sol) | ECDSACertificateVerifier | ECDSA signature recovery |
+| [`SignatureUtilsMixin.sol`](../../../src/contracts/mixins/SignatureUtilsMixin.sol) | ECDSACertificateVerifier | EIP-712 and signature validation |
+| [`BN254.sol`](../../../src/contracts/libraries/BN254.sol) | BN254CertificateVerifier | BN254 curve operations |
+| [`BN254SignatureVerifier.sol`](../../../src/contracts/libraries/BN254SignatureVerifier.sol) | BN254CertificateVerifier | BLS signature verification |
+| [`Merkle.sol`](../../../src/contracts/libraries/Merkle.sol) | BN254CertificateVerifier | Merkle proof verification |
+| [`SemVerMixin.sol`](../../../src/contracts/mixins/SemVerMixin.sol) | BN254CertificateVerifier | Semantic versioning |
+| [`OperatorSetLib.sol`](../../../src/contracts/libraries/OperatorSetLib.sol) | Both | Operator set key encoding |
+
+---
+
+## Overview
+
+The CertificateVerifier contracts are responsible for verifying certificates from an offchain task, on-chain. The operatorSet tables are updated by the [`OperatorTableUpdater`](./OperatorTableUpdater.md) to. These contracts support two signature schemes: ECDSA for individual signatures and BN254 for aggregated signatures.
+
+Both verifiers implement staleness checks based on a `maxStalenessPeriod` to ensure certificates are not verified against outdated operator information.
+
+*Note: Setting a max staleness period to 0 enables certificates to be confirmed against any `referenceTimestamp`*.
+
+---
+
+## ECDSACertificateVerifier
+
+The `ECDSACertificateVerifier` implements ECDSA signature verification where each operator signs individually. For a given operatorSet, it stores the list of all operators and their corresponding weights.
+
+### Update Table
+The `operatorTableUpdater` will update the via a merkle proof of the table against the `globalTableRoot`. See [`operatorTableUpdater`](./OperatorTableUpdater.md#updateoperatortable) for more information.
+
+#### `updateOperatorTable`
+
+```solidity
+/**
+ * @notice A struct that contains information about a single operator
+ * @param pubkey The address of the signing ECDSA key of the operator and not the operator address itself.
+ * This is read from the KeyRegistrar contract.
+ * @param weights The weights of the operator for a single operatorSet
+ * @dev The `weights` array can be defined as a list of arbitrary groupings. For example,
+ * it can be [slashable_stake, delegated_stake, strategy_i_stake, ...]
+ * @dev The `weights` array should be the same length for each operator in the operatorSet.
+ */
+struct ECDSAOperatorInfo {
+ address pubkey;
+ uint256[] weights;
+}
+
+/**
+ * @notice updates the operator table
+ * @param operatorSet the operatorSet to update the operator table for
+ * @param referenceTimestamp the timestamp at which the operatorInfos were sourced
+ * @param operatorInfos the operatorInfos to update the operator table with
+ * @param operatorSetConfig the configuration of the operatorSet
+ * @dev only callable by the operatorTableUpdater for the given operatorSet
+ * @dev The `referenceTimestamp` must be greater than the latest reference timestamp for the given operatorSet
+ */
+function updateOperatorTable(
+ OperatorSet calldata operatorSet,
+ uint32 referenceTimestamp,
+ ECDSAOperatorInfo[] calldata operatorInfos,
+ OperatorSetConfig calldata operatorSetConfig
+) external;
+```
+
+Updates the operator table with new `operatorInfos` and `operatorSetConfig`. All operators and weights are written to storage.
+
+*Effects*:
+* Stores the number of operators at `_numOperators[operatorSetKey][referenceTimestamp]`
+* Stores each operator info at `_operatorInfos[operatorSetKey][referenceTimestamp][index]`
+* Updates `_latestReferenceTimestamps[operatorSetKey]` to `referenceTimestamp`
+* Updates `_operatorSetOwners[operatorSetKey]` to `operatorSetConfig.owner`
+* Updates `_maxStalenessPeriods[operatorSetKey]` to `operatorSetConfig.maxStalenessPeriod`
+* Emits a `TableUpdated` event
+
+*Requirements*:
+* Caller MUST be the `operatorTableUpdater`
+* The `referenceTimestamp` MUST be greater than the latest reference timestamp
+
+
+### Certificate Verification
+The contract supports 3 verification patterns:
+1. [Basic verification](#verifycertificate) - Returns the signed stakes for further processing
+2. [Nominal verification](#verifycertificatenominal) - Verifies against absolute stake thresholds
+3. [Proportional verification](#verifycertificateproportion) - Verifies against percentage-based thresholds
+
+#### `verifyCertificate`
+
+```solidity
+/**
+ * @notice A ECDSA Certificate
+ * @param referenceTimestamp the timestamp at which the certificate was created
+ * @param messageHash the hash of the message that was signed by operators
+ * @param sig the concatenated signature of each signing operator
+ */
+struct ECDSACertificate {
+ uint32 referenceTimestamp;
+ bytes32 messageHash;
+ bytes sig;
+}
+
+/**
+ * @notice verifies a certificate
+ * @param operatorSet the operatorSet to verify the certificate for
+ * @param cert a certificate
+ * @return signedStakes amount of stake that signed the certificate for each stake
+ * type. Each index corresponds to a stake type in the `weights` array in the `ECDSAOperatorInfo`
+ */
+function verifyCertificate(
+ OperatorSet calldata operatorSet,
+ ECDSACertificate memory cert
+) external returns (uint256[] memory signedStakes);
+```
+
+Verifies an ECDSA certificate by checking individual signatures from operators. Each individual operator must sign off on a `signableDigest` given by [`calculateCertificateDigest`](#calculatecertificatedigest).
+
+*Process*:
+* Validates the certificate timestamp against staleness requirements
+* Computes the EIP-712 digest for the certificate
+* Parses concatenated signatures and recovers signers
+* For each recovered signer:
+ * Verifies the signer is a registered operator
+ * Adds the operator's weights to signed stakes
+* Returns the total signed stakes
+
+*Requirements*:
+* The certificate MUST NOT be stale (based on `maxStalenessPeriod`)
+* The root at `referenceTimestamp` MUST be valid (not disabled)
+* The operator table MUST exist for the `referenceTimestamp`
+* Signatures MUST be ordered by signer address (ascending)
+* All signers MUST be registered operators
+* Each signature MUST be valid
+
+#### `verifyCertificateNominal`
+
+```solidity
+/**
+ * @notice verifies a certificate and makes sure that the signed stakes meet
+ * provided portions of the total stake on the AVS
+ * @param operatorSet the operatorSet to verify the certificate for
+ * @param cert a certificate
+ * @param totalStakeNominalThresholds the nominal amount of total stake that
+ * the signed stake of the certificate should meet. Each index corresponds to
+ * a stake type in the `weights` array in the `ECDSAOperatorInfo`
+ * @return Whether or not the certificate is valid and meets thresholds
+ */
+function verifyCertificateNominal(
+ OperatorSet calldata operatorSet,
+ ECDSACertificate memory cert,
+ uint256[] memory totalStakeNominalThresholds
+) external returns (bool);
+```
+
+Verifies that a certificate meets specified nominal (absolute) stake thresholds for each stake type.
+
+*Process*:
+* Performs the same verification as `verifyCertificate` to get signed stakes
+* Compares signed stakes against absolute thresholds
+* Returns true only if all thresholds are met
+
+*Requirements*:
+* All requirements from `verifyCertificate`
+* `signedStakes.length` MUST equal `totalStakeNominalThresholds.length`
+* For each stake type: `signedStakes[i] >= totalStakeNominalThresholds[i]`
+
+#### `verifyCertificateProportion`
+
+```solidity
+/**
+ * @notice verifies a certificate and makes sure that the signed stakes meet
+ * provided portions of the total stake on the AVS
+ * @param operatorSet the operatorSet to verify the certificate for
+ * @param cert a certificate
+ * @param totalStakeProportionThresholds the proportion, in BPS, of total stake that
+ * the signed stake of the certificate should meet. Each index corresponds to
+ * a stake type in the `weights` array in the `ECDSAOperatorInfo`
+ * @return Whether or not the certificate is valid and meets thresholds
+ */
+function verifyCertificateProportion(
+ OperatorSet calldata operatorSet,
+ ECDSACertificate memory cert,
+ uint16[] memory totalStakeProportionThresholds
+) external returns (bool);
+```
+
+Verifies that a certificate meets specified proportion thresholds as a percentage of total stake for each stake type.
+
+*Process*:
+* Performs the same verification as `verifyCertificate` to get signed stakes
+* Calculates the total stakes for the operator set
+* Compares signed stakes against proportion thresholds
+* Returns true only if all thresholds are met
+
+*Requirements*:
+* All requirements from `verifyCertificate`
+* `signedStakes.length` MUST equal `totalStakeProportionThresholds.length`
+* For each stake type: `signedStakes[i] >= (totalStakes[i] * totalStakeProportionThresholds[i]) / 10000`
+
+### Utility Functions
+
+#### `calculateCertificateDigest`
+
+```solidity
+/**
+ * @notice Calculate the EIP-712 digest for a certificate
+ * @param referenceTimestamp The reference timestamp
+ * @param messageHash The message hash
+ * @return The EIP-712 digest
+ * @dev This function is public to allow offchain tools to calculate the same digest
+ * @dev Note: This does not support smart contract based signatures for multichain
+ */
+function calculateCertificateDigest(
+ uint32 referenceTimestamp,
+ bytes32 messageHash
+) external view returns (bytes32);
+```
+
+Computes the EIP-712 structured data hash for ECDSA certificate signing. This digest is what operators must sign to create a valid certificate.
+
+*Returns*:
+* EIP-712 digest using domain separator and certificate type hash
+
+---
+
+## BN254CertificateVerifier
+
+The `BN254CertificateVerifier` implements BN254 signature verification. BN254 signatures enable signature aggreagtion for larger operatorSets. It uses merkle proofs to cache nonsigners to for efficient stake table transport.
+
+### Update Table
+The `operatorTableUpdater` will update the table via a merkle proof against the `globalTableRoot`. Unlike ECDSA which stores individual operators, BN254 stores aggregated data and a merkle root of operator stakes.
+
+#### `updateOperatorTable`
+
+```solidity
+/**
+ * @notice A struct that contains information about a single operator
+ * @param pubkey The G1 public key of the operator.
+ * @param weights The weights of the operator for a single operatorSet.
+ * @dev The `weights` array can be defined as a list of arbitrary groupings. For example,
+ * it can be [slashable_stake, delegated_stake, strategy_i_stake, ...]
+ */
+struct BN254OperatorInfo {
+ BN254.G1Point pubkey;
+ uint256[] weights;
+}
+
+
+/**
+ * @notice A struct that contains information about all operators for a given operatorSet
+ * @param operatorInfoTreeRoot The root of the operatorInfo tree. Each leaf is a `BN254OperatorInfo` struct
+ * @param numOperators The number of operators in the operatorSet.
+ * @param aggregatePubkey The aggregate G1 public key of the operators in the operatorSet.
+ * @param totalWeights The total weights of the operators in the operatorSet.
+ *
+ * @dev The operatorInfoTreeRoot is the root of a merkle tree that contains the operatorInfos for each operator in the operatorSet.
+ * It is calculated in this function and used by the `IBN254CertificateVerifier` to verify stakes against the non-signing operators
+ *
+ * @dev Retrieval of the `aggregatePubKey` depends on maintaining a key registry contract or using the core `KeyRegistrar` contract.
+ * See `BN254TableCalculatorBase` in the middleware repo for an example implementation.
+ *
+ * @dev The `totalWeights` array should be the same length as each individual `weights` array in `operatorInfos`.
+ */
+struct BN254OperatorSetInfo {
+ bytes32 operatorInfoTreeRoot;
+ uint256 numOperators;
+ BN254.G1Point aggregatePubkey;
+ uint256[] totalWeights;
+}
+
+/**
+ * @notice updates the operator table
+ * @param operatorSet the operatorSet to update the operator table for
+ * @param referenceTimestamp the timestamp at which the operatorInfos were sourced
+ * @param operatorSetInfo the operatorInfos to update the operator table with
+ * @param operatorSetConfig the configuration of the operatorSet
+ * @dev only callable by the operatorTableUpdater for the given operatorSet
+ * @dev The `referenceTimestamp` must be greater than the latest reference timestamp for the given operatorSet
+ */
+function updateOperatorTable(
+ OperatorSet calldata operatorSet,
+ uint32 referenceTimestamp,
+ BN254OperatorSetInfo memory operatorSetInfo,
+ OperatorSetConfig calldata operatorSetConfig
+) external onlyTableUpdater;
+```
+
+Updates the operator table with new `operatorSetInfo` and `operatorSetConfig`.
+
+*Effects*:
+* Stores `operatorSetInfo` at `_operatorSetInfos[operatorSetKey][referenceTimestamp]` containing:
+ * `operatorInfoTreeRoot` - Merkle root of all operator information, each leaf is a `BN254OperatorInfo`
+ * `numOperators` - Total number of operators
+ * `aggregatePubkey` - Aggregate BN254 public key
+ * `totalWeights` - Sum of all operator weights
+* Updates `_latestReferenceTimestamps[operatorSetKey]` to `referenceTimestamp`
+* Updates `_operatorSetOwners[operatorSetKey]` to `operatorSetConfig.owner`
+* Updates `_maxStalenessPeriods[operatorSetKey]` to `operatorSetConfig.maxStalenessPeriod`
+* Emits a `TableUpdated` event
+
+*Requirements*:
+* Caller MUST be the `operatorTableUpdater`
+* The `referenceTimestamp` MUST be greater than the latest reference timestamp
+
+### Certificate Verification
+The contract supports 3 verification patterns:
+1. [Basic verification](#verifycertificate-1) - Returns the signed stakes for further processing
+2. [Nominal verification](#verifycertificatenominal-1) - Verifies against absolute stake thresholds
+3. [Proportional verification](#verifycertificateproportion-1) - Verifies against percentage-based thresholds
+
+#### `verifyCertificate`
+
+```solidity
+/**
+ * @notice A BN254 Certificate
+ * @param referenceTimestamp the timestamp at which the certificate was created
+ * @param messageHash the hash of the message that was signed by operators and used to verify the aggregated signature
+ * @param signature the G1 signature of the message
+ * @param apk the G2 aggregate public key
+ * @param nonSignerWitnesses an array of witnesses of non-signing operators
+ */
+struct BN254Certificate {
+ uint32 referenceTimestamp;
+ bytes32 messageHash;
+ BN254.G1Point signature;
+ BN254.G2Point apk;
+ BN254OperatorInfoWitness[] nonSignerWitnesses;
+}
+
+/**
+ * @notice verifies a certificate
+ * @param operatorSet the operatorSet that the certificate is for
+ * @param cert a certificate
+ * @return signedStakes amount of stake that signed the certificate for each stake
+ * type. Each index corresponds to a stake type in the `totalWeights` array in the `BN254OperatorSetInfo`.
+ */
+function verifyCertificate(
+ OperatorSet memory operatorSet,
+ BN254Certificate memory cert
+) external returns (uint256[] memory signedStakes);
+```
+
+Verifies a BN254 certificate by checking the aggregated signature against the operator set's aggregate public key. *Note: This function is non-view because the non-signers are cached in storage.*. See [cachingMechanism](#caching-mechanism) for more information.
+
+*Process*:
+* Validates the certificate timestamp against staleness requirements
+* Initializes signed stakes with total stakes from the operator set
+* Processes non-signer witnesses:
+ * Verifies merkle proofs for non-signers (or uses cached data)
+ * Subtracts non-signer stakes from total signed stakes
+ * Aggregates non-signer public keys
+* Calculates signer aggregate public key by subtracting non-signers from total
+* Verifies the BLS signature using pairing checks
+
+*Requirements*:
+* The certificate MUST NOT be stale (based on `maxStalenessPeriod`)
+* The root at `referenceTimestamp` MUST be valid (not disabled)
+* The operator set info MUST exist for the `referenceTimestamp`
+* All merkle proofs MUST be valid
+* The BLS signature MUST verify correctly
+
+#### `verifyCertificateNominal`
+
+```solidity
+/**
+ * @notice verifies a certificate and makes sure that the signed stakes meet
+ * provided nominal stake thresholds
+ * @param operatorSet the operatorSet that the certificate is for
+ * @param cert a certificate
+ * @param totalStakeNominalThresholds the nominal amount of stake that
+ * the signed stake of the certificate should meet. Each index corresponds to
+ * a stake type in the `totalWeights` array in the `BN254OperatorSetInfo`.
+ * @return whether or not certificate is valid and meets thresholds
+ */
+function verifyCertificateNominal(
+ OperatorSet memory operatorSet,
+ BN254Certificate memory cert,
+ uint256[] memory totalStakeNominalThresholds
+) external returns (bool);
+```
+
+Verifies that a certificate meets specified nominal (absolute) stake thresholds for each stake type.
+
+*Process*:
+* Performs the same verification as `verifyCertificate` to get signed stakes
+* Compares signed stakes against absolute thresholds
+* Returns true only if all thresholds are met
+
+*Requirements*:
+* All requirements from `verifyCertificate`
+* `signedStakes.length` MUST equal `totalStakeNominalThresholds.length`
+* For each stake type: `signedStakes[i] >= totalStakeNominalThresholds[i]`
+
+*Note*: This function has state-changing effects due to non-signer caching
+
+#### `verifyCertificateProportion`
+
+```solidity
+/**
+ * @notice verifies a certificate and makes sure that the signed stakes meet
+ * provided portions of the total stake on the AVS
+ * @param operatorSet the operatorSet that the certificate is for
+ * @param cert a certificate
+ * @param totalStakeProportionThresholds the proportion, in BPS,of total stake that
+ * the signed stake of the certificate should meet. Each index corresponds to
+ * a stake type in the `totalWeights` array in the `BN254OperatorSetInfo`.
+ * @return whether or not certificate is valid and meets thresholds
+ */
+function verifyCertificateProportion(
+ OperatorSet memory operatorSet,
+ BN254Certificate memory cert,
+ uint16[] memory totalStakeProportionThresholds
+) external returns (bool);
+```
+
+Verifies that a certificate meets specified proportion thresholds as a percentage of total stake for each stake type.
+
+*Process*:
+* Performs the same verification as `verifyCertificate` to get signed stakes
+* Retrieves the total stakes from the stored operator set info
+* Compares signed stakes against proportion thresholds
+* Returns true only if all thresholds are met
+
+*Requirements*:
+* All requirements from `verifyCertificate`
+* `signedStakes.length` MUST equal `totalStakeProportionThresholds.length`
+* For each stake type: `signedStakes[i] >= (totalStakes[i] * totalStakeProportionThresholds[i]) / 10000`
+
+*Note*: This function has state-changing effects due to non-signer caching
+
+### Caching Mechanism
+
+```solidity
+/**
+ * @notice A witness for an operator
+ * @param operatorIndex the index of the nonsigner in the `BN254OperatorInfo` tree
+ * @param operatorInfoProof merkle proofs of the nonsigner at the index. Empty if operator is in cache.
+ * @param operatorInfo the `BN254OperatorInfo` for the operator. Empty if operator is in cache
+ */
+struct BN254OperatorInfoWitness {
+ uint32 operatorIndex;
+ bytes operatorInfoProof;
+ BN254OperatorInfo operatorInfo;
+}
+```
+
+The `BN254CertificateVerifier` requires merkle proofs of nonSigning operators. When an operator is proven against an `operatorInfoTreeRoot` for the first time, it will be stored in the `operatorInfos` mapping so it doesn’t need to be proven for future `referenceTimestamps`. This results in the stake table of all proven operators being cached over time for a given `operatorSet's` table. Once cached, future `certificates` do not need to pass in a proof for the `nonSigner`.
+
+```mermaid
+flowchart TB
+ R((OperatorInfoTreeRoot))
+ R --> N0((Internal Node 0-1))
+ R --> N1((Internal Node 2-3))
+ N0 --> L0[[Leaf 0
BN254OperatorInfo #0]]
+ N0 --> L1[[Leaf 1
BN254OperatorInfo #1]]
+ N1 --> L2[[Leaf 2
BN254OperatorInfo #2]]
+ N1 --> L3[[Leaf 3
BN254OperatorInfo #3]]
+```
diff --git a/docs/multichain/source/CrossChainRegistry.md b/docs/multichain/source/CrossChainRegistry.md
new file mode 100644
index 0000000000..af631fef82
--- /dev/null
+++ b/docs/multichain/source/CrossChainRegistry.md
@@ -0,0 +1,332 @@
+## CrossChainRegistry
+
+| File | Type | Proxy |
+| -------- | -------- |
+| [`CrossChainRegistry.sol`](../../src/contracts/multichain/CrossChainRegistry.sol) | Singleton | Transparent Proxy |
+
+Libraries and Mixins:
+
+| File | Notes |
+| -------- | -------- |
+| [`PermissionControllerMixin.sol`](../../../src/contracts/mixins/PermissionControllerMixin.sol) | account delegation |
+| [`SemverMixin.sol`](../../../src/contracts/mixins/SemVerMixin.sol) | versioning |
+| [`OperatorSetLib.sol`](../../src/contracts/libraries/OperatorSetLib.sol) | encode/decode operator sets |
+
+## Overview
+
+The `CrossChainRegistry` manages the registration/deregistration of operatorSets to the multichain protocol. The contract also exposes read-only functions to calculate an operator table, which is used offchain by the `Generator` to generate a `GlobalTableRoot` and `Transporter` to transport the operator table. See [ELIP-007](https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-007.md) for more information.
+
+```solidity
+/**
+ * @notice A per-operatorSet configuration struct that is transported from the CrossChainRegistry on L1.
+ * @param owner the permissioned owner of the OperatorSet on L2 that can call the CertificateVerifier specific setters
+ * @param maxStalenessPeriod the maximum staleness period of the operatorSet
+ */
+struct OperatorSetConfig {
+ address owner;
+ uint32 maxStalenessPeriod;
+}
+```
+
+## Parameterization
+* `SupportedChains` (via `getSupportedChains`) are `Mainnet` and `Base`
+ * These are chains to which tables can be transported to
+ * On Testnet, the supported chains are `Sepolia` and `Base-Sepolia`
+
+---
+
+## Create/Remove Generation Reservation
+A generation reservation registers the operatorSet to be included in the `GlobalTableRoot` and transported to an avs-defined set of destination chains. AVSs do not have to pay for reservations.
+
+### `createGenerationReservation`
+
+```solidity
+/**
+ * @notice Creates a generation reservation
+ * @param operatorSet the operatorSet to make a reservation for
+ * @param operatorTableCalculator the address of the operatorTableCalculator
+ * @param config the config to set for the operatorSet
+ * @param chainIDs the chainIDs to add as transport destinations
+ * @dev msg.sender must be UAM permissioned for operatorSet.avs
+ */
+function createGenerationReservation(
+ OperatorSet calldata operatorSet,
+ IOperatorTableCalculator operatorTableCalculator,
+ OperatorSetConfig calldata config,
+ uint256[] calldata chainIDs
+) external;
+```
+
+Creates a generation reservation for a given `operatorSet`, which enables the operatorSet to be included in the `GlobalTableRoot` generation and transported to specified destination chains. This function sets up the complete configuration for cross-chain operations in a single transaction.
+
+*Effects*:
+* Adds the `operatorSet` to `_activeGenerationReservations`
+* Sets the `operatorTableCalculator` for the `operatorSet`
+* Sets the `OperatorSetConfig` containing the `owner` and `maxStalenessPeriod`
+* Adds all specified `chainIDs` as transport destinations
+* Emits a `GenerationReservationCreated` event
+* Emits an `OperatorTableCalculatorSet` event
+* Emits an `OperatorSetConfigSet` event
+* Emits a `TransportDestinationChainAdded` event for each added chain
+
+*Requirements*:
+* The global paused status MUST NOT be set: `PAUSED_GENERATION_RESERVATIONS`
+* Caller MUST be UAM permissioned for `operatorSet.avs`
+* The `operatorSet` MUST exist in the `AllocationManager`
+* A generation reservation MUST NOT already exist for the `operatorSet`
+* At least one `chainID` MUST be provided
+* All provided `chainIDs` MUST be whitelisted
+
+### `removeGenerationReservation`
+
+```solidity
+/**
+ * @notice Removes a generation reservation for a given operatorSet
+ * @param operatorSet the operatorSet to remove
+ * @dev msg.sender must be UAM permissioned for operatorSet.avs
+ */
+function removeGenerationReservation(
+ OperatorSet calldata operatorSet
+) external;
+```
+
+Removes a generation reservation for a given `operatorSet` and clears all associated storage including the operator table calculator, operator set config, and transport destinations.
+
+*Effects*:
+* Removes the `operatorTableCalculator` mapping for the `operatorSet`
+* Removes the `operatorSetConfig` mapping for the `operatorSet`
+* Removes all transport destinations for the `operatorSet`
+* Removes the `operatorSet` from `_activeGenerationReservations`
+* Emits an `OperatorTableCalculatorRemoved` event
+* Emits an `OperatorSetConfigRemoved` event
+* Emits a `TransportDestinationsRemoved` event
+* Emits a `GenerationReservationRemoved` event
+
+*Requirements*:
+* The global paused status MUST NOT be set: `PAUSED_GENERATION_RESERVATIONS`
+* Caller MUST be UAM permissioned for `operatorSet.avs`
+* The `operatorSet` MUST exist in the `AllocationManager`
+* A generation reservation MUST exist for the `operatorSet`
+
+---
+
+## Update Configuration
+For a given operatorSet, an AVS can set the [`OperatorTableCalculator`](./OperatorTableCalculator.md) and `OperatorSetConfig`, which is an `owner` and `maxStalenessPeriod` transported to each chain. The [`CertificateVerifier`](../destination/CertificateVerifier.md) has more information on the `maxStalenessPeriod`.
+
+### `setOperatorTableCalculator`
+
+```solidity
+/**
+ * @notice Sets the operatorTableCalculator for the operatorSet
+ * @param operatorSet the operatorSet whose operatorTableCalculator is desired to be set
+ * @param operatorTableCalculator the contract to call to calculate the operator table
+ * @dev msg.sender must be UAM permissioned for operatorSet.avs
+ * @dev operatorSet must have an active reservation
+ */
+function setOperatorTableCalculator(
+ OperatorSet calldata operatorSet,
+ IOperatorTableCalculator operatorTableCalculator
+) external;
+```
+
+Updates the operator table calculator contract for a given `operatorSet`. The operator table calculator is responsible for computing the operator table bytes that will be included in cross-chain transports.
+
+*Effects*:
+* Updates the `_operatorTableCalculators` mapping for the `operatorSet`
+* Emits an `OperatorTableCalculatorSet` event
+
+*Requirements*:
+* The global paused status MUST NOT be set: `PAUSED_OPERATOR_TABLE_CALCULATOR`
+* Caller MUST be UAM permissioned for `operatorSet.avs`
+* The `operatorSet` MUST exist in the `AllocationManager`
+* A generation reservation MUST exist for the `operatorSet`
+
+### `setOperatorSetConfig`
+
+```solidity
+/**
+ * @notice Sets the operatorSetConfig for a given operatorSet
+ * @param operatorSet the operatorSet to set the operatorSetConfig for
+ * @param config the config to set
+ * @dev msg.sender must be UAM permissioned for operatorSet.avs
+ * @dev operatorSet must have an active generation reservation
+ */
+function setOperatorSetConfig(
+ OperatorSet calldata operatorSet,
+ OperatorSetConfig calldata config
+) external;
+```
+
+Updates the operator set configuration for a given `operatorSet`. The config contains an `owner` address and `maxStalenessPeriod` that will be transported to destination chains for use in certificate verification.
+
+*Effects*:
+* Updates the `_operatorSetConfigs` mapping with the new `config` containing:
+ * `owner`: The permissioned owner of the OperatorSet on L2
+ * `maxStalenessPeriod`: The maximum staleness period for the operatorSet
+* Emits an `OperatorSetConfigSet` event
+
+*Requirements*:
+* The global paused status MUST NOT be set: `PAUSED_OPERATOR_SET_CONFIG`
+* Caller MUST be UAM permissioned for `operatorSet.avs`
+* The `operatorSet` MUST exist in the `AllocationManager`
+* A generation reservation MUST exist for the `operatorSet`
+
+### `addTransportDestinations`
+
+```solidity
+/**
+ * @notice Adds destination chains to transport to
+ * @param operatorSet the operatorSet to add transport destinations for
+ * @param chainIDs to add transport to
+ * @dev msg.sender must be UAM permissioned for operatorSet.avs
+ * @dev Will create a transport reservation if one doesn't exist
+ */
+function addTransportDestinations(
+ OperatorSet calldata operatorSet,
+ uint256[] calldata chainIDs
+) external;
+```
+
+Adds destination chain IDs to the transport list for a given `operatorSet`. These chains will receive the operator table data during cross-chain transports.
+
+*Effects*:
+* Adds each `chainID` to the `_transportDestinations` set for the `operatorSet`
+* Emits a `TransportDestinationChainAdded` event for each successfully added chain
+
+*Requirements*:
+* The global paused status MUST NOT be set: `PAUSED_TRANSPORT_DESTINATIONS`
+* Caller MUST be UAM permissioned for `operatorSet.avs`
+* The `operatorSet` MUST exist in the `AllocationManager`
+* A generation reservation MUST exist for the `operatorSet`
+* At least one `chainID` MUST be provided
+* All provided `chainIDs` MUST be whitelisted
+* Each `chainID` MUST NOT already be a transport destination
+
+### `removeTransportDestinations`
+
+```solidity
+/**
+ * @notice Removes destination chains to transport to
+ * @param operatorSet the operatorSet to remove transport destinations for
+ * @param chainIDs to remove transport to
+ * @dev msg.sender must be UAM permissioned for operatorSet.avs
+ * @dev Will remove the transport reservation if all destinations are removed
+ */
+function removeTransportDestinations(
+ OperatorSet calldata operatorSet,
+ uint256[] calldata chainIDs
+) external;
+```
+
+Removes destination chain IDs from the transport list for a given `operatorSet`.
+
+*Effects*:
+* Removes each `chainID` from the `_transportDestinations` set for the `operatorSet`
+* Emits a `TransportDestinationChainRemoved` event for each successfully removed chain
+
+*Requirements*:
+* The global paused status MUST NOT be set: `PAUSED_TRANSPORT_DESTINATIONS`
+* Caller MUST be UAM permissioned for `operatorSet.avs`
+* The `operatorSet` MUST exist in the `AllocationManager`
+* A generation reservation MUST exist for the `operatorSet`
+* Each `chainID` MUST exist in the transport destinations
+* At least one transport destination MUST remain after removal (use `removeGenerationReservation` to remove all)
+
+---
+
+## System Configuration
+The `owner` of the `CrossChainRegistry` can update the whitelisted chain IDs. If a chainID is not whitelisted, it cannot be transported to.
+
+### `addChainIDsToWhitelist`
+
+```solidity
+/**
+ * @notice Adds chainIDs to the whitelist of chainIDs that can be transported to
+ * @param chainIDs the chainIDs to add to the whitelist
+ * @param operatorTableUpdaters the operatorTableUpdaters for each whitelisted chainID
+ * @dev msg.sender must be the owner of the CrossChainRegistry
+ */
+function addChainIDsToWhitelist(uint256[] calldata chainIDs, address[] calldata operatorTableUpdaters) external;
+```
+
+Adds chain IDs to the global whitelist, enabling them as valid transport destinations. Each chain ID is associated with an operator table updater address that will be responsible for updating operator tables on that chain.
+
+*Effects*:
+* Adds each `chainID` and its corresponding `operatorTableUpdater` to the `_whitelistedChainIDs` mapping
+* Emits a `ChainIDAddedToWhitelist` event for each successfully added chain
+
+*Requirements*:
+* Caller MUST be the `owner` of the contract
+* The global paused status MUST NOT be set: `PAUSED_CHAIN_WHITELIST`
+* The `chainIDs` and `operatorTableUpdaters` arrays MUST have the same length
+* Each `chainID` MUST NOT be zero
+* Each `chainID` MUST NOT already be whitelisted
+
+### `removeChainIDsFromWhitelist`
+
+```solidity
+/**
+ * @notice Removes chainIDs from the whitelist of chainIDs that can be transported to
+ * @param chainIDs the chainIDs to remove from the whitelist
+ * @dev msg.sender must be the owner of the CrossChainRegistry
+ */
+function removeChainIDsFromWhitelist(
+ uint256[] calldata chainIDs
+) external;
+```
+
+Removes chain IDs from the global whitelist, preventing them from being used as transport destinations. Note that existing transport destinations for operator sets will continue to filter out non-whitelisted chains when queried.
+
+*Effects*:
+* Removes each `chainID` from the `_whitelistedChainIDs` mapping
+* Emits a `ChainIDRemovedFromWhitelist` event for each successfully removed chain
+
+*Requirements*:
+* Caller MUST be the `owner` of the contract
+* The global paused status MUST NOT be set: `PAUSED_CHAIN_WHITELIST`
+* Each `chainID` MUST be currently whitelisted
+
+---
+
+## Offchain View Functions
+
+The `Generator` and `Transporter` use the below view functions to generate and transport tables:
+
+1. `getActiveGenerationReservations`: Gets the operatorSets to be included in the `globalTableRoot`
+
+```solidity
+/**
+ * @notice Gets the active generation reservations
+ * @return An array of operatorSets with active generationReservations
+ */
+function getActiveGenerationReservations() external view returns (OperatorSet[] memory);
+```
+
+2. `calculateOperatorTableBytes`: Calculates the operator table bytes, which is then merkleized into the `globalTableRoot` offchain
+
+```solidity
+/**
+ * @notice Calculates the operatorTableBytes for a given operatorSet
+ * @param operatorSet the operatorSet to calculate the operator table for
+ * @return the encoded operatorTableBytes containing:
+ * - operatorSet details
+ * - curve type from KeyRegistrar
+ * - operator set configuration
+ * - calculated operator table from the calculator contract
+ * @dev This function aggregates data from multiple sources for cross-chain transport
+ */
+function calculateOperatorTableBytes(
+ OperatorSet calldata operatorSet
+) external view returns (bytes memory);
+```
+
+3. `getActiveTransportReservations`: Gets all operatorSets with active transport reservations and their destinations
+
+```solidity
+/**
+ * @notice Gets the active transport reservations
+ * @return An array of operatorSets with active transport reservations
+ * @return An array of chainIDs that the operatorSet is configured to transport to
+ */
+function getActiveTransportReservations() external view returns (OperatorSet[] memory, uint256[][] memory);
+```
diff --git a/docs/multichain/source/OperatorTableCalculator.md b/docs/multichain/source/OperatorTableCalculator.md
new file mode 100644
index 0000000000..78c9ceac99
--- /dev/null
+++ b/docs/multichain/source/OperatorTableCalculator.md
@@ -0,0 +1,248 @@
+## OperatorTableCalculator
+
+| File | Type | Notes |
+| -------- | -------- |
+| [`ECDSATableCalculatorBase.sol`](../../../src/contracts/multichain/ECDSATableCalculatorBase.sol) | Abstract | Base functionality for ECDSA operator tables |
+| [`BN254TableCalculatorBase.sol`](../../../src/contracts/multichain/BN254TableCalculatorBase.sol) | Abstract | Base functionality for BN254 operator tables |
+
+Interfaces:
+
+| File | Notes |
+| -------- | -------- |
+| [`IOperatorTableCalculator.sol`](../../../src/contracts/interfaces/IOperatorTableCalculator.sol) | Base interface for all calculators |
+| [`IECDSATableCalculator.sol`](../../../src/contracts/interfaces/IECDSATableCalculator.sol) | ECDSA-specific interface |
+| [`IBN254TableCalculator.sol`](../../../src/contracts/interfaces/IBN254TableCalculator.sol) | BN254-specific interface |
+
+---
+
+## Overview
+
+The OperatorTableCalculator contracts are responsible for calculating operator tables that are used in the multichain protocol. These tables contain operator information (public keys and weights) that are read from the [`CrossChainRegistry`](./CrossChainRegistry.md) to transport stakes.
+
+The base contracts (`ECDSATableCalculatorBase` and `BN254TableCalculatorBase`) provide the core logic for table calculation, while leaving weight calculation as an unimplemented method to be implemented by derived contracts.
+
+---
+
+## ECDSATableCalculatorBase
+
+The `ECDSATableCalculatorBase` provides base functionality for calculating ECDSA operator tables. It handles operator key retrieval and table construction.
+
+### Core Functions
+
+#### `calculateOperatorTable`
+
+```solidity
+/**
+ * @notice A struct that contains information about a single operator
+ * @param pubkey The address of the signing ECDSA key of the operator and not the operator address itself.
+ * This is read from the KeyRegistrar contract.
+ * @param weights The weights of the operator for a single operatorSet
+ * @dev The `weights` array can be defined as a list of arbitrary groupings. For example,
+ * it can be [slashable_stake, delegated_stake, strategy_i_stake, ...]
+ * @dev The `weights` array should be the same length for each operator in the operatorSet.
+ */
+struct ECDSAOperatorInfo {
+ address pubkey;
+ uint256[] weights;
+}
+
+/**
+ * @notice calculates the operatorInfos for a given operatorSet
+ * @param operatorSet the operatorSet to calculate the operator table for
+ * @return operatorInfos the list of operatorInfos for the given operatorSet
+ * @dev The output of this function is converted to bytes via the `calculateOperatorTableBytes` function
+ */
+function calculateOperatorTable(
+ OperatorSet calldata operatorSet
+) external view returns (ECDSAOperatorInfo[] memory operatorInfos);
+```
+
+Calculates and returns an array of `ECDSAOperatorInfo` structs containing public keys and weights for all operators in the operatorSet who have registered ECDSA keys.
+
+*Effects*:
+* None (view function)
+
+*Process*:
+* Calls `_getOperatorWeights` to retrieve operator addresses and their weights
+* For each operator with a registered ECDSA key:
+ * Retrieves the ECDSA address (public key) from the `KeyRegistrar`
+ * Creates an `ECDSAOperatorInfo` struct with the public key and weights
+* Returns only operators with registered keys
+
+#### `calculateOperatorTableBytes`
+
+```solidity
+/**
+ * @notice Calculates the operator table bytes for a given operatorSet
+ * @param operatorSet The operatorSet to calculate the operator table for
+ * @return operatorTableBytes The encoded operator table bytes
+ */
+function calculateOperatorTableBytes(
+ OperatorSet calldata operatorSet
+) external view returns (bytes memory operatorTableBytes);
+```
+
+Returns the ABI-encoded bytes representation of the operator table, which is used by the `CrossChainRegistry` to calculate the operatorTable.
+
+*Returns*:
+* ABI-encoded array of `ECDSAOperatorInfo` structs
+
+### Abstract Methods
+
+#### `_getOperatorWeights`
+
+```solidity
+/**
+ * @notice Abstract function to get the operator weights for a given operatorSet
+ * @param operatorSet The operatorSet to get the weights for
+ * @return operators The addresses of the operators in the operatorSet
+ * @return weights The weights for each operator in the operatorSet
+ */
+function _getOperatorWeights(
+ OperatorSet calldata operatorSet
+) internal view virtual returns (address[] memory operators, uint256[][] memory weights);
+```
+
+Must be implemented by derived contracts to define the weight calculation strategy. The weights are returned as a 2D array indexed by operator. It is up to the AVS to define each operator's weights array. Some examples include:
+
+- A single array evaluated purely on slashable stake `[slashable_stake]` o
+- An array of 2 values can be used for evaluating on slashable and delegated stake `[slashable_stake, delegated_stake]`
+- An array of several values can be used for evaluating stake on multiple strategies `[slashable_stake_stETH, slashable_stake_USDC, slashable_stake_EIGEN]`
+
+In addition, an AVS can have custom calculation methodologies that include:
+- Capping the stake of an operator
+- Using oracles to price stake
+
+An example integration is defined by [`ECDSATableCalculator`](../../../src/contracts/multichain/ECDSATableCalculator.sol)
+
+---
+
+## BN254TableCalculatorBase
+
+The `BN254TableCalculatorBase` provides base functionality for calculating BN254 operator tables.
+
+### Core Functions
+
+#### `calculateOperatorTable`
+
+```solidity
+/**
+ * @notice A struct that contains information about a single operator
+ * @param pubkey The G1 public key of the operator.
+ * @param weights The weights of the operator for a single operatorSet.
+ * @dev The `weights` array can be defined as a list of arbitrary groupings. For example,
+ * it can be [slashable_stake, delegated_stake, strategy_i_stake, ...]
+ */
+struct BN254OperatorInfo {
+ BN254.G1Point pubkey;
+ uint256[] weights;
+}
+
+/**
+ * @notice A struct that contains information about all operators for a given operatorSet
+ * @param operatorInfoTreeRoot The root of the operatorInfo tree. Each leaf is a `BN254OperatorInfo` struct
+ * @param numOperators The number of operators in the operatorSet.
+ * @param aggregatePubkey The aggregate G1 public key of the operators in the operatorSet.
+ * @param totalWeights The total weights of the operators in the operatorSet.
+ *
+ * @dev The operatorInfoTreeRoot is the root of a merkle tree that contains the operatorInfos for each operator in the operatorSet.
+ * It is calculated in this function and used by the `IBN254CertificateVerifier` to verify stakes against the non-signing operators
+ *
+ * @dev Retrieval of the `aggregatePubKey` depends on maintaining a key registry contract, see `BN254TableCalculatorBase` for an example implementation.
+ *
+ * @dev The `totalWeights` array should be the same length as each individual `weights` array in `operatorInfos`.
+ */
+struct BN254OperatorSetInfo {
+ bytes32 operatorInfoTreeRoot;
+ uint256 numOperators;
+ BN254.G1Point aggregatePubkey;
+ uint256[] totalWeights;
+}
+
+/**
+ * @notice calculates the operatorInfos for a given operatorSet
+ * @param operatorSet the operatorSet to calculate the operator table for
+ * @return operatorSetInfo the operatorSetInfo for the given operatorSet
+ * @dev The output of this function is converted to bytes via the `calculateOperatorTableBytes` function
+ */
+function calculateOperatorTable(
+ OperatorSet calldata operatorSet
+) external view returns (BN254OperatorSetInfo memory operatorSetInfo);
+```
+
+Calculates and returns a `BN254OperatorSetInfo` struct containing:
+- A merkle tree root of operator information
+- The total number of operators
+- An aggregate BN254 public key
+- Total weights across all operators
+
+*Effects*:
+* None (view function)
+
+*Process*:
+* Calls `_getOperatorWeights` to retrieve operator addresses and their weights
+* For each operator with a registered BN254 key:
+ * Retrieves the BN254 G1 point from the `KeyRegistrar`
+ * Adds the operator's weights to the total weights
+ * Creates a merkle leaf from the operator info
+ * Adds the G1 point to the aggregate public key
+* Constructs a merkle tree from all operator info leaves
+* Returns the complete operator set information
+
+BN254 tables take advantage of signature aggregation. As such, we add operator's weights to the total weights. We generate a merkle root that contains individual operator stakes (`BN254OperatorInfo`) to lower transport costs. See [`BN254CertificateVerifier`](../destination/CertificateVerifier.md#bn254certificateverifier) for more information on the caching and verification scheme.
+
+#### `calculateOperatorTableBytes`
+
+```solidity
+/**
+ * @notice Calculates the operator table bytes for a given operatorSet
+ * @param operatorSet The operatorSet to calculate the operator table for
+ * @return operatorTableBytes The encoded operator table bytes
+ */
+function calculateOperatorTableBytes(
+ OperatorSet calldata operatorSet
+) external view returns (bytes memory operatorTableBytes);
+```
+
+Returns the ABI-encoded bytes representation of the operator table, which is used by the `CrossChainRegistry` to calculate the operatorTable.
+
+*Returns*:
+* ABI-encoded `BN254OperatorSetInfo` struct
+
+#### `getOperatorInfos`
+
+```solidity
+/**
+ * @notice Get the operatorInfos for a given operatorSet
+ * @param operatorSet the operatorSet to get the operatorInfos for
+ * @return operatorInfos the operatorInfos for the given operatorSet
+ */
+function getOperatorInfos(
+ OperatorSet calldata operatorSet
+) external view returns (BN254OperatorInfo[] memory operatorInfos);
+```
+
+Returns an array of `BN254OperatorInfo` structs for all operators in the operatorSet who have registered BN254 keys.
+
+*Effects*:
+* None (view function)
+
+### Abstract Methods
+
+#### `_getOperatorWeights`
+
+```solidity
+/**
+ * @notice Abstract function to get the operator weights for a given operatorSet
+ * @param operatorSet The operatorSet to get the weights for
+ * @return operators The addresses of the operators in the operatorSet
+ * @return weights The weights for each operator in the operatorSet
+ */
+function _getOperatorWeights(
+ OperatorSet calldata operatorSet
+) internal view virtual returns (address[] memory operators, uint256[][] memory weights);
+```
+
+Must be implemented by derived contracts to define the weight calculation strategy. Similar to ECDSA, weights are a 2D array supporting multiple weight types per operator.
+
+An example integration is defined by [`BN254TableCalculator`](../../../src/contracts/multichain/BN254TableCalculator.sol)
diff --git a/docs/permissions/KeyRegistrar.md b/docs/permissions/KeyRegistrar.md
new file mode 100644
index 0000000000..bf1bce223a
--- /dev/null
+++ b/docs/permissions/KeyRegistrar.md
@@ -0,0 +1,215 @@
+# KeyRegistrar
+
+| File | Type | Proxy |
+| -------- | -------- | -------- |
+| [`KeyRegistrar.sol`](../../src/contracts/permissions/KeyRegistrar.sol) | Singleton | Transparent proxy |
+
+The `KeyRegistrar` manages cryptographic keys for operators across different operator sets. It supports both ECDSA and BN254 key types and ensures global uniqueness of keys across all operator sets.
+
+Key features:
+* **Per-OperatorSet Configuration**: Each operator set must be configured with a specific curve type before keys can be registered
+* **Global Key Registry**: Keys are globally unique - once registered, a key cannot be reused across operatorSets or operators
+
+---
+
+## Operator Set Configuration
+
+An AVS must configure the operator set with a specific curve type.
+
+### `configureOperatorSet`
+
+```solidity
+/**
+ * @notice Configures an operator set with curve type
+ * @param operatorSet The operator set to configure
+ * @param curveType Type of curve (ECDSA, BN254)
+ * @dev Only authorized callers for the AVS can configure operator sets
+ */
+function configureOperatorSet(OperatorSet memory operatorSet, CurveType curveType) external;
+```
+
+Configures an operator set to use a specific cryptographic curve type. This must be called before any keys can be registered for the operator set.
+*Note: Registering for an operatorSet in the core protocol does not require a key to be registered. However, the AVS may have logic that gates registration based on a key being registered in the `KeyRegistrar`.*
+
+*Effects*:
+* Sets the curve type for the specified operator set
+* Emits an `OperatorSetConfigured` event
+
+*Requirements*:
+* Caller MUST be authorized for the AVS (via PermissionController)
+* The operator set MUST NOT already be configured
+* The curve type MUST be either ECDSA or BN254
+
+---
+
+## Key Registration
+
+Key registration is segmented by curve type: ECDSA and BN254.
+
+### ECDSA Key Registration
+
+#### `registerKey` (ECDSA)
+
+```solidity
+/**
+ * @notice Registers a cryptographic key for an operator with a specific operator set
+ * @param operator Address of the operator to register key for
+ * @param operatorSet The operator set to register the key for
+ * @param pubkey Public key bytes
+ * @param signature Signature proving ownership (only needed for BN254 keys)
+ * @dev Can be called by operator directly or by addresses they've authorized via PermissionController
+ * @dev Reverts if key is already registered
+ */
+function registerKey(
+ address operator,
+ OperatorSet memory operatorSet,
+ bytes calldata pubkey,
+ bytes calldata signature
+) external;
+```
+
+For ECDSA keys:
+- `pubkey`: 20 bytes representing the Ethereum address
+- `signature`: EIP-712 signature from the key's private key
+
+*Effects*:
+* Registers the key for the operator in the specified operator set
+* Adds the key to the global registry
+* Emits a `KeyRegistered` event with curve type ECDSA
+
+*Requirements*:
+* Caller MUST be the operator or authorized via PermissionController
+* The operator MUST NOT be already registered for the operatorSet in the `KeyRegistrar`
+* The key MUST be exactly 20 bytes
+* The key MUST NOT be the zero address
+* The key MUST NOT already be registered globally
+* The signature MUST be valid
+
+#### `getECDSAKeyRegistrationMessageHash`
+
+```solidity
+/**
+ * @notice Returns the message hash for ECDSA key registration
+ * @param operator The operator address
+ * @param operatorSet The operator set
+ * @param keyAddress The address of the key
+ * @return The message hash for signing
+ */
+function getECDSAKeyRegistrationMessageHash(
+ address operator,
+ OperatorSet memory operatorSet,
+ address keyAddress
+) external view returns (bytes32);
+```
+
+Returns the message hash that must be signed over for ECDSA key registration.
+
+
+### BN254 Key Registration
+
+BN254 keys registration requires passing in G1 and G2 points.
+
+#### `registerKey` (BN254)
+
+```solidity
+/**
+ * @notice Registers a cryptographic key for an operator with a specific operator set
+ * @param operator Address of the operator to register key for
+ * @param operatorSet The operator set to register the key for
+ * @param pubkey Public key bytes
+ * @param signature Signature proving ownership (only needed for BN254 keys)
+ * @dev Can be called by operator directly or by addresses they've authorized via PermissionController
+ * @dev Reverts if key is already registered
+ */
+function registerKey(
+ address operator,
+ OperatorSet memory operatorSet,
+ bytes calldata pubkey,
+ bytes calldata signature
+) external;
+```
+
+For BN254 keys:
+- `pubkey`: [Encoded](#encodebn254keydata) BN254 key data containing G1 and G2 points
+- `signature`: BN254 signature proving ownership over a set [digest](#getbn254keyregistrationmessagehash)
+
+*Effects*:
+* Registers the BN254 key for the operator in the specified operator set
+* Adds the key hash to the global registry
+* Emits a `KeyRegistered` event with curve type BN254
+
+*Requirements*:
+* Caller MUST be the operator or authorized via PermissionController
+* The operator MUST NOT be already registered for the operatorSet in the `KeyRegistrar`
+* The key MUST contain valid G1 and G2 points
+* The G1 point MUST NOT be the zero point
+* The key MUST NOT already be registered globally (by hash)
+* The signature MUST be valid
+
+#### `encodeBN254KeyData`
+
+```solidity
+/**
+ * @notice Encodes the BN254 key data into a bytes array
+ * @param g1Point The BN254 G1 public key
+ * @param g2Point The BN254 G2 public key
+ * @return The encoded key data
+ */
+function encodeBN254KeyData(
+ BN254.G1Point memory g1Point,
+ BN254.G2Point memory g2Point
+) external pure returns (bytes memory);
+```
+
+Utility function to properly encode BN254 key data for registration.
+
+#### `getBN254KeyRegistrationMessageHash`
+
+```solidity
+/**
+ * @notice Returns the message hash for BN254 key registration
+ * @param operator The operator address
+ * @param operatorSet The operator set
+ * @param keyData The BN254 key data
+ * @return The message hash for signing
+ */
+function getBN254KeyRegistrationMessageHash(
+ address operator,
+ OperatorSet memory operatorSet,
+ bytes calldata keyData
+) external view returns (bytes32);
+```
+
+Returns the message hash that must be signed over for BN254 key registration.
+
+---
+
+## Key Deregistration
+
+### `deregisterKey`
+
+```solidity
+/**
+ * @notice Deregisters a cryptographic key for an operator with a specific operator set
+ * @param operator Address of the operator to deregister key for
+ * @param operatorSet The operator set to deregister the key from
+ * @dev Can be called by avs directly or by addresses they've authorized via PermissionController
+ * @dev Reverts if key was not registered
+ * @dev Keys remain in global key registry to prevent reuse
+ */
+function deregisterKey(address operator, OperatorSet memory operatorSet) external;
+```
+
+Removes an operator's key from the specified operator set. Note that the key remains in the global registry to prevent reuse.
+
+*Effects*:
+* Removes the key from the operator's record for the operator set
+* Emits a `KeyDeregistered` event
+* The key remains in the global registry
+
+*Requirements*:
+* Caller MUST be authorized for the AVS (via PermissionController)
+* The operator set MUST be configured
+* The operator MUST have a registered key for this operator set
+
+---
diff --git a/pkg/bindings/BN254CertificateVerifier/binding.go b/pkg/bindings/BN254CertificateVerifier/binding.go
index b703a58110..fd1efac7c2 100644
--- a/pkg/bindings/BN254CertificateVerifier/binding.go
+++ b/pkg/bindings/BN254CertificateVerifier/binding.go
@@ -86,7 +86,7 @@ type OperatorSet struct {
// BN254CertificateVerifierMetaData contains all meta data concerning the BN254CertificateVerifier contract.
var BN254CertificateVerifierMetaData = &bind.MetaData{
ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_operatorTableUpdater\",\"type\":\"address\",\"internalType\":\"contractIOperatorTableUpdater\"},{\"name\":\"_version\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getNonsignerOperatorInfo\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorInfo\",\"components\":[{\"name\":\"pubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetInfo\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorSetInfo\",\"components\":[{\"name\":\"operatorInfoTreeRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"numOperators\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"aggregatePubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"totalWeights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetOwner\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isNonsignerCached\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestReferenceTimestamp\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"maxOperatorTableStaleness\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorTableUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIOperatorTableUpdater\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"trySignatureVerification\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"aggPubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apkG2\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"signature\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"pairingSuccessful\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"signatureValid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"updateOperatorTable\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorSetInfo\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorSetInfo\",\"components\":[{\"name\":\"operatorInfoTreeRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"numOperators\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"aggregatePubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"totalWeights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"operatorSetConfig\",\"type\":\"tuple\",\"internalType\":\"structICrossChainRegistryTypes.OperatorSetConfig\",\"components\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"maxStalenessPeriod\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyCertificate\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"cert\",\"type\":\"tuple\",\"internalType\":\"structIBN254CertificateVerifierTypes.BN254Certificate\",\"components\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signature\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apk\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"nonSignerWitnesses\",\"type\":\"tuple[]\",\"internalType\":\"structIBN254CertificateVerifierTypes.BN254OperatorInfoWitness[]\",\"components\":[{\"name\":\"operatorIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorInfoProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"operatorInfo\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorInfo\",\"components\":[{\"name\":\"pubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}]}]}],\"outputs\":[{\"name\":\"signedStakes\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyCertificateNominal\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"cert\",\"type\":\"tuple\",\"internalType\":\"structIBN254CertificateVerifierTypes.BN254Certificate\",\"components\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signature\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apk\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"nonSignerWitnesses\",\"type\":\"tuple[]\",\"internalType\":\"structIBN254CertificateVerifierTypes.BN254OperatorInfoWitness[]\",\"components\":[{\"name\":\"operatorIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorInfoProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"operatorInfo\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorInfo\",\"components\":[{\"name\":\"pubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}]}]},{\"name\":\"totalStakeNominalThresholds\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyCertificateProportion\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"cert\",\"type\":\"tuple\",\"internalType\":\"structIBN254CertificateVerifierTypes.BN254Certificate\",\"components\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signature\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apk\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"nonSignerWitnesses\",\"type\":\"tuple[]\",\"internalType\":\"structIBN254CertificateVerifierTypes.BN254OperatorInfoWitness[]\",\"components\":[{\"name\":\"operatorIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorInfoProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"operatorInfo\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorInfo\",\"components\":[{\"name\":\"pubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}]}]},{\"name\":\"totalStakeProportionThresholds\",\"type\":\"uint16[]\",\"internalType\":\"uint16[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxStalenessPeriodUpdated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"maxStalenessPeriod\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetOwnerUpdated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"owner\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TableUpdated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"operatorSetInfo\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorSetInfo\",\"components\":[{\"name\":\"operatorInfoTreeRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"numOperators\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"aggregatePubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"totalWeights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CertificateStale\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ECAddFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ECMulFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ECPairingFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpModFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyTableUpdater\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReferenceTimestampDoesNotExist\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"TableUpdateStale\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VerificationFailed\",\"inputs\":[]}]",
- Bin: "0x60c060405234801561000f575f5ffd5b50604051612a06380380612a0683398101604081905261002e9161016a565b6001600160a01b0382166080528061004581610058565b60a0525061005161009e565b5050610294565b5f5f829050601f8151111561008b578260405163305a27a960e01b81526004016100829190610239565b60405180910390fd5b80516100968261026e565b179392505050565b5f54610100900460ff16156101055760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401610082565b5f5460ff90811614610154575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b634e487b7160e01b5f52604160045260245ffd5b5f5f6040838503121561017b575f5ffd5b82516001600160a01b0381168114610191575f5ffd5b60208401519092506001600160401b038111156101ac575f5ffd5b8301601f810185136101bc575f5ffd5b80516001600160401b038111156101d5576101d5610156565b604051601f8201601f19908116603f011681016001600160401b038111828210171561020357610203610156565b60405281815282820160200187101561021a575f5ffd5b8160208401602083015e5f602083830101528093505050509250929050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b8051602080830151919081101561028e575f198160200360031b1b821691505b50919050565b60805160a0516127436102c35f395f6104e401525f81816101de0152818161062f0152610d0201526127435ff3fe608060405234801561000f575f5ffd5b50600436106100cb575f3560e01c80635ddb9b5b1161008857806368d6e0811161006357806368d6e081146101d95780638481892014610218578063dd2ae1b91461022b578063eb39e68f1461023e575f5ffd5b80635ddb9b5b146101895780636141879e146101b15780636738c40b146101c4575f5ffd5b8063017d7974146100cf578063080b7150146100f75780631a18746c1461011757806326af6a3c1461014157806354fd4d50146101615780635be8727414610176575b5f5ffd5b6100e26100dd366004612103565b61025e565b60405190151581526020015b60405180910390f35b61010a6101053660046121de565b6103ef565b6040516100ee9190612229565b61012a610125366004612260565b610404565b6040805192151583529015156020830152016100ee565b61015461014f3660046122ae565b610425565b6040516100ee9190612323565b6101696104dd565b6040516100ee9190612358565b6100e26101843660046122ae565b61050d565b61019c61019736600461238d565b6105d8565b60405163ffffffff90911681526020016100ee565b61019c6101bf36600461238d565b6105fe565b6101d76101d23660046123bd565b610624565b005b6102007f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100ee565b61020061022636600461238d565b6107f1565b6100e2610239366004612476565b61081a565b61025161024c3660046124e9565b6108ad565b6040516100ee9190612560565b5f5f61026a8585610972565b90505f61027686610b32565b5f8181526004602081815260408084208a5163ffffffff16855282528084208151608081018352815481526001820154818501528251808401845260028301548152600383015481860152818401529381018054835181860281018601909452808452969750949593949093606086019383018282801561031457602002820191905f5260205f20905b815481526020019060010190808311610300575b50505050508152505090505f8160600151905085518451146103495760405163512509d360e11b815260040160405180910390fd5b5f5b84518110156103de575f61271088838151811061036a5761036a612572565b602002602001015161ffff1684848151811061038857610388612572565b602002602001015161039a919061259a565b6103a491906125c5565b9050808683815181106103b9576103b9612572565b602002602001015110156103d5575f96505050505050506103e8565b5060010161034b565b5060019450505050505b9392505050565b60606103fb8383610972565b90505b92915050565b5f5f61041886848787600162061a80610b95565b9150915094509492505050565b61042d611a9c565b5f61043785610b32565b5f81815260056020908152604080832063ffffffff8916845282528083208784528252918290208251608081018452815481850190815260018301546060830152815260028201805485518186028101860190965280865295965090949193858401939092908301828280156104ca57602002820191905f5260205f20905b8154815260200190600101908083116104b6575b5050505050815250509150509392505050565b60606105087f0000000000000000000000000000000000000000000000000000000000000000610c5d565b905090565b5f5f61051885610b32565b5f81815260056020908152604080832063ffffffff891684528252808320878452825280832081516080810183528154818401908152600183015460608301528152600282018054845181870281018701909552808552969750949590949193858101939291908301828280156105ac57602002820191905f5260205f20905b815481526020019060010190808311610598575b50505091909252505081515191925050158015906105ce575080516020015115155b9695505050505050565b5f5f6105e383610b32565b5f9081526003602052604090205463ffffffff169392505050565b5f5f61060983610b32565b5f9081526002602052604090205463ffffffff169392505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461066d5760405163030c1b6b60e11b815260040160405180910390fd5b5f6106856106803687900387018761238d565b610b32565b5f8181526003602052604090205490915063ffffffff908116908516116106bf57604051632f20889f60e01b815260040160405180910390fd5b5f81815260046020818152604080842063ffffffff8916855282529283902086518155818701516001820155928601518051600285015581015160038401556060860151805187949361071793908501920190611ac6565b5050505f818152600360209081526040909120805463ffffffff191663ffffffff8716179055610749908301836125d8565b5f8281526001602090815260409182902080546001600160a01b0319166001600160a01b039490941693909317909255610788919084019084016125f1565b5f8281526002602052604090819020805463ffffffff191663ffffffff9390931692909217909155517f93e6bea1c9b5dce4a5c07b00261e956df2a4a253d9ab6ca070ca2037d72ada9e906107e29087908790879061260a565b60405180910390a15050505050565b5f5f6107fc83610b32565b5f908152600160205260409020546001600160a01b03169392505050565b5f5f6108268585610972565b9050825181511461084a5760405163512509d360e11b815260040160405180910390fd5b5f5b81518110156108a15783818151811061086757610867612572565b602002602001015182828151811061088157610881612572565b60200260200101511015610899575f925050506103e8565b60010161084c565b50600195945050505050565b6108b5611b0f565b5f6108bf84610b32565b5f81815260046020818152604080842063ffffffff891685528252928390208351608081018552815481526001820154818401528451808601865260028301548152600383015481850152818601529281018054855181850281018501909652808652959650929490936060860193909290919083018282801561096057602002820191905f5260205f20905b81548152602001906001019080831161094c575b50505050508152505091505092915050565b606061097c611b41565b61098584610b32565b80825283516109949190610c9a565b80515f908152600460208181526040808420875163ffffffff1685528252928390208351608081018552815481526001820154818401528451808601865260028301548152600383015481850152818601529281018054855181850281018501909652808652939491936060860193830182828015610a3057602002820191905f5260205f20905b815481526020019060010190808311610a1c575b505050919092525050506020820181905251610a5f57604051630cad17b760e31b815260040160405180910390fd5b806020015160600151516001600160401b03811115610a8057610a80611c6f565b604051908082528060200260200182016040528015610aa9578160200160208202803683370190505b5060408201525f5b81602001516060015151811015610b0d578160200151606001518181518110610adc57610adc612572565b602002602001015182604001518281518110610afa57610afa612572565b6020908102919091010152600101610ab1565b50610b188184610d95565b6060820152610b278184610ebf565b604001519392505050565b5f815f0151826020015163ffffffff16604051602001610b7d92919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b6040516020818303038152906040526103fe90612656565b5f5f5f610ba189610f2d565b90505f610bb08a89898c610fb7565b90505f610bc7610bc08a8461106b565b8b906110db565b90505f610c09610c0284610bfc6040805180820182525f80825260209182015281518083019092526001825260029082015290565b9061106b565b85906110db565b90508715610c2e57610c2582610c1d61114f565b838c8b61120f565b96509450610c4e565b610c4182610c3a61114f565b838c611423565b95508515610c4e57600194505b50505050965096945050505050565b60605f610c698361165a565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f8281526002602052604090205463ffffffff16801580610cca5750610cc08183612679565b63ffffffff164211155b610ce75760405163640fcd6b60e11b815260040160405180910390fd5b60405163193877e160e21b815263ffffffff831660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906364e1df8490602401602060405180830381865afa158015610d4f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d739190612695565b610d9057604051631b14174b60e01b815260040160405180910390fd5b505050565b6040805180820182525f808252602091820181905282518084019093528083529082018190525b826080015151811015610eb8575f83608001518281518110610de057610de0612572565b60200260200101519050846020015160200151815f015163ffffffff1610610e1b576040516301fa53c760e11b815260040160405180910390fd5b845184515f91610e2b9184611681565b8051909150610e3b9085906110db565b93505f5b816020015151811015610ead57866040015151811015610ea55781602001518181518110610e6f57610e6f612572565b602002602001015187604001518281518110610e8d57610e8d612572565b60200260200101818151610ea191906126b4565b9052505b600101610e3f565b505050600101610dbc565b5092915050565b5f610edf610ed084606001516117f8565b602085015160400151906110db565b90505f5f610efb84602001518486606001518760400151610404565b91509150818015610f095750805b610f265760405163439cc0cd60e01b815260040160405180910390fd5b5050505050565b604080518082019091525f80825260208201525f8080610f5a5f5160206126ee5f395f51905f52866126c7565b90505b610f668161188e565b90935091505f5160206126ee5f395f51905f528283098303610f9e576040805180820190915290815260208101919091529392505050565b5f5160206126ee5f395f51905f52600182089050610f5d565b8251602080850151845180519083015186840151805190850151875188870151604080519889018e90528801989098526060870195909552608086019390935260a085019190915260c084015260e08301526101008201526101208101919091525f907f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019061014001604051602081830303815290604052805190602001205f1c61106291906126c7565b95945050505050565b604080518082019091525f8082526020820152611086611b86565b835181526020808501519082015260408082018490525f908360608460076107d05a03fa905080806110b457fe5b50806110d357604051632319df1960e11b815260040160405180910390fd5b505092915050565b604080518082019091525f80825260208201526110f6611ba4565b835181526020808501518183015283516040808401919091529084015160608301525f908360808460066107d05a03fa9050808061113057fe5b50806110d35760405163d4b68fd760e01b815260040160405180910390fd5b611157611bc2565b50604080516080810182527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c28183019081527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060830152815281518083019092527f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec82527f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d60208381019190915281019190915290565b6040805180820182528681526020808201869052825180840190935286835282018490525f91829190611240611be2565b5f5b60028110156113f7575f61125782600661259a565b905084826002811061126b5761126b612572565b6020020151518361127c835f6126da565b600c811061128c5761128c612572565b60200201528482600281106112a3576112a3612572565b602002015160200151838260016112ba91906126da565b600c81106112ca576112ca612572565b60200201528382600281106112e1576112e1612572565b60200201515151836112f48360026126da565b600c811061130457611304612572565b602002015283826002811061131b5761131b612572565b60200201515160016020020151836113348360036126da565b600c811061134457611344612572565b602002015283826002811061135b5761135b612572565b6020020151602001515f6002811061137557611375612572565b6020020151836113868360046126da565b600c811061139657611396612572565b60200201528382600281106113ad576113ad612572565b6020020151602001516001600281106113c8576113c8612572565b6020020151836113d98360056126da565b600c81106113e9576113e9612572565b602002015250600101611242565b50611400611c01565b5f6020826101808560088cfa9151919c9115159b50909950505050505050505050565b6040805180820182528581526020808201859052825180840190935285835282018390525f91611451611be2565b5f5b6002811015611608575f61146882600661259a565b905084826002811061147c5761147c612572565b6020020151518361148d835f6126da565b600c811061149d5761149d612572565b60200201528482600281106114b4576114b4612572565b602002015160200151838260016114cb91906126da565b600c81106114db576114db612572565b60200201528382600281106114f2576114f2612572565b60200201515151836115058360026126da565b600c811061151557611515612572565b602002015283826002811061152c5761152c612572565b60200201515160016020020151836115458360036126da565b600c811061155557611555612572565b602002015283826002811061156c5761156c612572565b6020020151602001515f6002811061158657611586612572565b6020020151836115978360046126da565b600c81106115a7576115a7612572565b60200201528382600281106115be576115be612572565b6020020151602001516001600281106115d9576115d9612572565b6020020151836115ea8360056126da565b600c81106115fa576115fa612572565b602002015250600101611453565b50611611611c01565b5f6020826101808560086107d05a03fa9050808061162b57fe5b508061164a576040516324ccc79360e21b815260040160405180910390fd5b5051151598975050505050505050565b5f60ff8216601f8111156103fe57604051632cd44ac360e21b815260040160405180910390fd5b611689611a9c565b5f84815260056020908152604080832063ffffffff808816855290835281842086519091168452825280832081516080810183528154818401908152600183015460608301528152600282018054845181870281018701909552808552919492938584019390929083018282801561171e57602002820191905f5260205f20905b81548152602001906001019080831161170a575b5050509190925250508151519192505f911515905080611742575081516020015115155b9050806117eb575f6117628787875f01518860400151896020015161190a565b9050806117825760405163439cc0cd60e01b815260040160405180910390fd5b6040808601515f8981526005602090815283822063ffffffff808c1684529082528483208a51909116835281529290208151805182558301516001820155828201518051929391926117da9260028501920190611ac6565b5090505084604001519350506117ef565b8192505b50509392505050565b604080518082019091525f8082526020820152815115801561181c57506020820151155b15611839575050604080518082019091525f808252602082015290565b6040518060400160405280835f015181526020015f5160206126ee5f395f51905f52846020015161186a91906126c7565b611881905f5160206126ee5f395f51905f526126b4565b905292915050565b919050565b5f80805f5160206126ee5f395f51905f5260035f5160206126ee5f395f51905f52865f5160206126ee5f395f51905f52888909090890505f6118fe827f0c19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f525f5160206126ee5f395f51905f52611975565b91959194509092505050565b5f5f8360405160200161191d9190612323565b60408051601f1981840301815291815281516020928301205f8a81526004845282812063ffffffff808c1683529452919091205490925090611969908590839085908a8116906119ee16565b98975050505050505050565b5f5f61197f611c01565b611987611c1f565b602080825281810181905260408201819052606082018890526080820187905260a082018690528260c08360056107d05a03fa925082806119c457fe5b50826119e35760405163d51edae360e01b815260040160405180910390fd5b505195945050505050565b5f836119fb868585611a05565b1495945050505050565b5f60208451611a1491906126c7565b15611a32576040516313717da960e21b815260040160405180910390fd5b8260205b85518111611a9357611a496002856126c7565b5f03611a6a57815f528086015160205260405f209150600284049350611a81565b808601515f528160205260405f2091506002840493505b611a8c6020826126da565b9050611a36565b50949350505050565b604080516080810182525f91810182815260608201929092529081905b8152602001606081525090565b828054828255905f5260205f20908101928215611aff579160200282015b82811115611aff578251825591602001919060010190611ae4565b50611b0b929150611c3d565b5090565b60405180608001604052805f81526020015f8152602001611ab960405180604001604052805f81526020015f81525090565b60405180608001604052805f8152602001611b5a611b0f565b815260200160608152602001611b8160405180604001604052805f81526020015f81525090565b905290565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b6040518060400160405280611bd5611c51565b8152602001611b81611c51565b604051806101800160405280600c906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b6040518060c001604052806006906020820280368337509192915050565b5b80821115611b0b575f8155600101611c3e565b60405180604001604052806002906020820280368337509192915050565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b0381118282101715611ca557611ca5611c6f565b60405290565b60405160a081016001600160401b0381118282101715611ca557611ca5611c6f565b604051606081016001600160401b0381118282101715611ca557611ca5611c6f565b604051608081016001600160401b0381118282101715611ca557611ca5611c6f565b604051601f8201601f191681016001600160401b0381118282101715611d3957611d39611c6f565b604052919050565b80356001600160a01b0381168114611889575f5ffd5b803563ffffffff81168114611889575f5ffd5b5f60408284031215611d7a575f5ffd5b611d82611c83565b9050611d8d82611d41565b8152611d9b60208301611d57565b602082015292915050565b5f60408284031215611db6575f5ffd5b611dbe611c83565b823581526020928301359281019290925250919050565b5f82601f830112611de4575f5ffd5b611dec611c83565b806040840185811115611dfd575f5ffd5b845b81811015611e17578035845260209384019301611dff565b509095945050505050565b5f60808284031215611e32575f5ffd5b611e3a611c83565b9050611e468383611dd5565b8152611d9b8360408401611dd5565b5f6001600160401b03821115611e6d57611e6d611c6f565b5060051b60200190565b5f82601f830112611e86575f5ffd5b8135611e99611e9482611e55565b611d11565b8082825260208201915060208360051b860101925085831115611eba575f5ffd5b602085015b83811015611ed7578035835260209283019201611ebf565b5095945050505050565b5f60608284031215611ef1575f5ffd5b611ef9611c83565b9050611f058383611da6565b815260408201356001600160401b03811115611f1f575f5ffd5b611f2b84828501611e77565b60208301525092915050565b5f6101208284031215611f48575f5ffd5b611f50611cab565b9050611f5b82611d57565b815260208281013590820152611f748360408401611da6565b6040820152611f868360808401611e22565b60608201526101008201356001600160401b03811115611fa4575f5ffd5b8201601f81018413611fb4575f5ffd5b8035611fc2611e9482611e55565b8082825260208201915060208360051b850101925086831115611fe3575f5ffd5b602084015b838110156120f35780356001600160401b03811115612005575f5ffd5b85016060818a03601f1901121561201a575f5ffd5b612022611ccd565b61202e60208301611d57565b815260408201356001600160401b03811115612048575f5ffd5b82016020810190603f018b1361205c575f5ffd5b80356001600160401b0381111561207557612075611c6f565b612088601f8201601f1916602001611d11565b8181528c602083850101111561209c575f5ffd5b816020840160208301375f6020838301015280602085015250505060608201356001600160401b038111156120cf575f5ffd5b6120de8b602083860101611ee1565b60408301525084525060209283019201611fe8565b5060808501525091949350505050565b5f5f5f60808486031215612115575f5ffd5b61211f8585611d6a565b925060408401356001600160401b03811115612139575f5ffd5b61214586828701611f37565b92505060608401356001600160401b03811115612160575f5ffd5b8401601f81018613612170575f5ffd5b803561217e611e9482611e55565b8082825260208201915060208360051b85010192508883111561219f575f5ffd5b6020840193505b828410156121d057833561ffff811681146121bf575f5ffd5b8252602093840193909101906121a6565b809450505050509250925092565b5f5f606083850312156121ef575f5ffd5b6121f98484611d6a565b915060408301356001600160401b03811115612213575f5ffd5b61221f85828601611f37565b9150509250929050565b602080825282518282018190525f918401906040840190835b81811015611e17578351835260209384019390920191600101612242565b5f5f5f5f6101208587031215612274575f5ffd5b843593506122858660208701611da6565b92506122948660608701611e22565b91506122a38660e08701611da6565b905092959194509250565b5f5f5f608084860312156122c0575f5ffd5b6122ca8585611d6a565b92506122d860408501611d57565b929592945050506060919091013590565b5f8151808452602084019350602083015f5b828110156123195781518652602095860195909101906001016122fb565b5093949350505050565b60208082528251805183830152015160408201525f602083015160608084015261235060808401826122e9565b949350505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f6040828403121561239d575f5ffd5b6103fb8383611d6a565b5f604082840312156123b7575f5ffd5b50919050565b5f5f5f5f60c085870312156123d0575f5ffd5b6123da86866123a7565b93506123e860408601611d57565b925060608501356001600160401b03811115612402575f5ffd5b850160a08188031215612413575f5ffd5b61241b611cef565b81358152602080830135908201526124368860408401611da6565b604082015260808201356001600160401b03811115612453575f5ffd5b61245f89828501611e77565b60608301525092506122a3905086608087016123a7565b5f5f5f60808486031215612488575f5ffd5b6124928585611d6a565b925060408401356001600160401b038111156124ac575f5ffd5b6124b886828701611f37565b92505060608401356001600160401b038111156124d3575f5ffd5b6124df86828701611e77565b9150509250925092565b5f5f606083850312156124fa575f5ffd5b6125048484611d6a565b915061251260408401611d57565b90509250929050565b80518252602081015160208301525f6040820151612546604085018280518252602090810151910152565b50606082015160a0608085015261235060a08501826122e9565b602081525f6103fb602083018461251b565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176103fe576103fe612586565b634e487b7160e01b5f52601260045260245ffd5b5f826125d3576125d36125b1565b500490565b5f602082840312156125e8575f5ffd5b6103fb82611d41565b5f60208284031215612601575f5ffd5b6103fb82611d57565b6001600160a01b0361261b85611d41565b16815263ffffffff61262f60208601611d57565b16602082015263ffffffff83166040820152608060608201525f611062608083018461251b565b805160208083015191908110156123b7575f1960209190910360031b1b16919050565b63ffffffff81811683821601908111156103fe576103fe612586565b5f602082840312156126a5575f5ffd5b815180151581146103e8575f5ffd5b818103818111156103fe576103fe612586565b5f826126d5576126d56125b1565b500690565b808201808211156103fe576103fe61258656fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47a26469706673582212209023b3da16d558489f1909eb4e2eac1ae1c7b6e1992d0fb52f5e3bde23fd629d64736f6c634300081b0033",
+ Bin: "0x60c060405234801561000f575f5ffd5b50604051612a06380380612a0683398101604081905261002e9161016a565b6001600160a01b0382166080528061004581610058565b60a0525061005161009e565b5050610294565b5f5f829050601f8151111561008b578260405163305a27a960e01b81526004016100829190610239565b60405180910390fd5b80516100968261026e565b179392505050565b5f54610100900460ff16156101055760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401610082565b5f5460ff90811614610154575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b634e487b7160e01b5f52604160045260245ffd5b5f5f6040838503121561017b575f5ffd5b82516001600160a01b0381168114610191575f5ffd5b60208401519092506001600160401b038111156101ac575f5ffd5b8301601f810185136101bc575f5ffd5b80516001600160401b038111156101d5576101d5610156565b604051601f8201601f19908116603f011681016001600160401b038111828210171561020357610203610156565b60405281815282820160200187101561021a575f5ffd5b8160208401602083015e5f602083830101528093505050509250929050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b8051602080830151919081101561028e575f198160200360031b1b821691505b50919050565b60805160a0516127436102c35f395f6104e401525f81816101de0152818161062f0152610d0201526127435ff3fe608060405234801561000f575f5ffd5b50600436106100cb575f3560e01c80635ddb9b5b1161008857806368d6e0811161006357806368d6e081146101d95780638481892014610218578063dd2ae1b91461022b578063eb39e68f1461023e575f5ffd5b80635ddb9b5b146101895780636141879e146101b15780636738c40b146101c4575f5ffd5b8063017d7974146100cf578063080b7150146100f75780631a18746c1461011757806326af6a3c1461014157806354fd4d50146101615780635be8727414610176575b5f5ffd5b6100e26100dd366004612103565b61025e565b60405190151581526020015b60405180910390f35b61010a6101053660046121de565b6103ef565b6040516100ee9190612229565b61012a610125366004612260565b610404565b6040805192151583529015156020830152016100ee565b61015461014f3660046122ae565b610425565b6040516100ee9190612323565b6101696104dd565b6040516100ee9190612358565b6100e26101843660046122ae565b61050d565b61019c61019736600461238d565b6105d8565b60405163ffffffff90911681526020016100ee565b61019c6101bf36600461238d565b6105fe565b6101d76101d23660046123bd565b610624565b005b6102007f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100ee565b61020061022636600461238d565b6107f1565b6100e2610239366004612476565b61081a565b61025161024c3660046124e9565b6108ad565b6040516100ee9190612560565b5f5f61026a8585610972565b90505f61027686610b32565b5f8181526004602081815260408084208a5163ffffffff16855282528084208151608081018352815481526001820154818501528251808401845260028301548152600383015481860152818401529381018054835181860281018601909452808452969750949593949093606086019383018282801561031457602002820191905f5260205f20905b815481526020019060010190808311610300575b50505050508152505090505f8160600151905085518451146103495760405163512509d360e11b815260040160405180910390fd5b5f5b84518110156103de575f61271088838151811061036a5761036a612572565b602002602001015161ffff1684848151811061038857610388612572565b602002602001015161039a919061259a565b6103a491906125c5565b9050808683815181106103b9576103b9612572565b602002602001015110156103d5575f96505050505050506103e8565b5060010161034b565b5060019450505050505b9392505050565b60606103fb8383610972565b90505b92915050565b5f5f61041886848787600162061a80610b95565b9150915094509492505050565b61042d611a9c565b5f61043785610b32565b5f81815260056020908152604080832063ffffffff8916845282528083208784528252918290208251608081018452815481850190815260018301546060830152815260028201805485518186028101860190965280865295965090949193858401939092908301828280156104ca57602002820191905f5260205f20905b8154815260200190600101908083116104b6575b5050505050815250509150509392505050565b60606105087f0000000000000000000000000000000000000000000000000000000000000000610c5d565b905090565b5f5f61051885610b32565b5f81815260056020908152604080832063ffffffff891684528252808320878452825280832081516080810183528154818401908152600183015460608301528152600282018054845181870281018701909552808552969750949590949193858101939291908301828280156105ac57602002820191905f5260205f20905b815481526020019060010190808311610598575b50505091909252505081515191925050158015906105ce575080516020015115155b9695505050505050565b5f5f6105e383610b32565b5f9081526003602052604090205463ffffffff169392505050565b5f5f61060983610b32565b5f9081526002602052604090205463ffffffff169392505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461066d5760405163030c1b6b60e11b815260040160405180910390fd5b5f6106856106803687900387018761238d565b610b32565b5f8181526003602052604090205490915063ffffffff908116908516116106bf57604051632f20889f60e01b815260040160405180910390fd5b5f81815260046020818152604080842063ffffffff8916855282529283902086518155818701516001820155928601518051600285015581015160038401556060860151805187949361071793908501920190611ac6565b5050505f818152600360209081526040909120805463ffffffff191663ffffffff8716179055610749908301836125d8565b5f8281526001602090815260409182902080546001600160a01b0319166001600160a01b039490941693909317909255610788919084019084016125f1565b5f8281526002602052604090819020805463ffffffff191663ffffffff9390931692909217909155517f93e6bea1c9b5dce4a5c07b00261e956df2a4a253d9ab6ca070ca2037d72ada9e906107e29087908790879061260a565b60405180910390a15050505050565b5f5f6107fc83610b32565b5f908152600160205260409020546001600160a01b03169392505050565b5f5f6108268585610972565b9050825181511461084a5760405163512509d360e11b815260040160405180910390fd5b5f5b81518110156108a15783818151811061086757610867612572565b602002602001015182828151811061088157610881612572565b60200260200101511015610899575f925050506103e8565b60010161084c565b50600195945050505050565b6108b5611b0f565b5f6108bf84610b32565b5f81815260046020818152604080842063ffffffff891685528252928390208351608081018552815481526001820154818401528451808601865260028301548152600383015481850152818601529281018054855181850281018501909652808652959650929490936060860193909290919083018282801561096057602002820191905f5260205f20905b81548152602001906001019080831161094c575b50505050508152505091505092915050565b606061097c611b41565b61098584610b32565b80825283516109949190610c9a565b80515f908152600460208181526040808420875163ffffffff1685528252928390208351608081018552815481526001820154818401528451808601865260028301548152600383015481850152818601529281018054855181850281018501909652808652939491936060860193830182828015610a3057602002820191905f5260205f20905b815481526020019060010190808311610a1c575b505050919092525050506020820181905251610a5f57604051630cad17b760e31b815260040160405180910390fd5b806020015160600151516001600160401b03811115610a8057610a80611c6f565b604051908082528060200260200182016040528015610aa9578160200160208202803683370190505b5060408201525f5b81602001516060015151811015610b0d578160200151606001518181518110610adc57610adc612572565b602002602001015182604001518281518110610afa57610afa612572565b6020908102919091010152600101610ab1565b50610b188184610d95565b6060820152610b278184610ebf565b604001519392505050565b5f815f0151826020015163ffffffff16604051602001610b7d92919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b6040516020818303038152906040526103fe90612656565b5f5f5f610ba189610f2d565b90505f610bb08a89898c610fb7565b90505f610bc7610bc08a8461106b565b8b906110db565b90505f610c09610c0284610bfc6040805180820182525f80825260209182015281518083019092526001825260029082015290565b9061106b565b85906110db565b90508715610c2e57610c2582610c1d61114f565b838c8b61120f565b96509450610c4e565b610c4182610c3a61114f565b838c611423565b95508515610c4e57600194505b50505050965096945050505050565b60605f610c698361165a565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f8281526002602052604090205463ffffffff16801580610cca5750610cc08183612679565b63ffffffff164211155b610ce75760405163640fcd6b60e11b815260040160405180910390fd5b60405163193877e160e21b815263ffffffff831660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906364e1df8490602401602060405180830381865afa158015610d4f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d739190612695565b610d9057604051631b14174b60e01b815260040160405180910390fd5b505050565b6040805180820182525f808252602091820181905282518084019093528083529082018190525b826080015151811015610eb8575f83608001518281518110610de057610de0612572565b60200260200101519050846020015160200151815f015163ffffffff1610610e1b576040516301fa53c760e11b815260040160405180910390fd5b845184515f91610e2b9184611681565b8051909150610e3b9085906110db565b93505f5b816020015151811015610ead57866040015151811015610ea55781602001518181518110610e6f57610e6f612572565b602002602001015187604001518281518110610e8d57610e8d612572565b60200260200101818151610ea191906126b4565b9052505b600101610e3f565b505050600101610dbc565b5092915050565b5f610edf610ed084606001516117f8565b602085015160400151906110db565b90505f5f610efb84602001518486606001518760400151610404565b91509150818015610f095750805b610f265760405163439cc0cd60e01b815260040160405180910390fd5b5050505050565b604080518082019091525f80825260208201525f8080610f5a5f5160206126ee5f395f51905f52866126c7565b90505b610f668161188e565b90935091505f5160206126ee5f395f51905f528283098303610f9e576040805180820190915290815260208101919091529392505050565b5f5160206126ee5f395f51905f52600182089050610f5d565b8251602080850151845180519083015186840151805190850151875188870151604080519889018e90528801989098526060870195909552608086019390935260a085019190915260c084015260e08301526101008201526101208101919091525f907f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019061014001604051602081830303815290604052805190602001205f1c61106291906126c7565b95945050505050565b604080518082019091525f8082526020820152611086611b86565b835181526020808501519082015260408082018490525f908360608460076107d05a03fa905080806110b457fe5b50806110d357604051632319df1960e11b815260040160405180910390fd5b505092915050565b604080518082019091525f80825260208201526110f6611ba4565b835181526020808501518183015283516040808401919091529084015160608301525f908360808460066107d05a03fa9050808061113057fe5b50806110d35760405163d4b68fd760e01b815260040160405180910390fd5b611157611bc2565b50604080516080810182527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c28183019081527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060830152815281518083019092527f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec82527f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d60208381019190915281019190915290565b6040805180820182528681526020808201869052825180840190935286835282018490525f91829190611240611be2565b5f5b60028110156113f7575f61125782600661259a565b905084826002811061126b5761126b612572565b6020020151518361127c835f6126da565b600c811061128c5761128c612572565b60200201528482600281106112a3576112a3612572565b602002015160200151838260016112ba91906126da565b600c81106112ca576112ca612572565b60200201528382600281106112e1576112e1612572565b60200201515151836112f48360026126da565b600c811061130457611304612572565b602002015283826002811061131b5761131b612572565b60200201515160016020020151836113348360036126da565b600c811061134457611344612572565b602002015283826002811061135b5761135b612572565b6020020151602001515f6002811061137557611375612572565b6020020151836113868360046126da565b600c811061139657611396612572565b60200201528382600281106113ad576113ad612572565b6020020151602001516001600281106113c8576113c8612572565b6020020151836113d98360056126da565b600c81106113e9576113e9612572565b602002015250600101611242565b50611400611c01565b5f6020826101808560088cfa9151919c9115159b50909950505050505050505050565b6040805180820182528581526020808201859052825180840190935285835282018390525f91611451611be2565b5f5b6002811015611608575f61146882600661259a565b905084826002811061147c5761147c612572565b6020020151518361148d835f6126da565b600c811061149d5761149d612572565b60200201528482600281106114b4576114b4612572565b602002015160200151838260016114cb91906126da565b600c81106114db576114db612572565b60200201528382600281106114f2576114f2612572565b60200201515151836115058360026126da565b600c811061151557611515612572565b602002015283826002811061152c5761152c612572565b60200201515160016020020151836115458360036126da565b600c811061155557611555612572565b602002015283826002811061156c5761156c612572565b6020020151602001515f6002811061158657611586612572565b6020020151836115978360046126da565b600c81106115a7576115a7612572565b60200201528382600281106115be576115be612572565b6020020151602001516001600281106115d9576115d9612572565b6020020151836115ea8360056126da565b600c81106115fa576115fa612572565b602002015250600101611453565b50611611611c01565b5f6020826101808560086107d05a03fa9050808061162b57fe5b508061164a576040516324ccc79360e21b815260040160405180910390fd5b5051151598975050505050505050565b5f60ff8216601f8111156103fe57604051632cd44ac360e21b815260040160405180910390fd5b611689611a9c565b5f84815260056020908152604080832063ffffffff808816855290835281842086519091168452825280832081516080810183528154818401908152600183015460608301528152600282018054845181870281018701909552808552919492938584019390929083018282801561171e57602002820191905f5260205f20905b81548152602001906001019080831161170a575b5050509190925250508151519192505f911515905080611742575081516020015115155b9050806117eb575f6117628787875f01518860400151896020015161190a565b9050806117825760405163439cc0cd60e01b815260040160405180910390fd5b6040808601515f8981526005602090815283822063ffffffff808c1684529082528483208a51909116835281529290208151805182558301516001820155828201518051929391926117da9260028501920190611ac6565b5090505084604001519350506117ef565b8192505b50509392505050565b604080518082019091525f8082526020820152815115801561181c57506020820151155b15611839575050604080518082019091525f808252602082015290565b6040518060400160405280835f015181526020015f5160206126ee5f395f51905f52846020015161186a91906126c7565b611881905f5160206126ee5f395f51905f526126b4565b905292915050565b919050565b5f80805f5160206126ee5f395f51905f5260035f5160206126ee5f395f51905f52865f5160206126ee5f395f51905f52888909090890505f6118fe827f0c19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f525f5160206126ee5f395f51905f52611975565b91959194509092505050565b5f5f8360405160200161191d9190612323565b60408051601f1981840301815291815281516020928301205f8a81526004845282812063ffffffff808c1683529452919091205490925090611969908590839085908a8116906119ee16565b98975050505050505050565b5f5f61197f611c01565b611987611c1f565b602080825281810181905260408201819052606082018890526080820187905260a082018690528260c08360056107d05a03fa925082806119c457fe5b50826119e35760405163d51edae360e01b815260040160405180910390fd5b505195945050505050565b5f836119fb868585611a05565b1495945050505050565b5f60208451611a1491906126c7565b15611a32576040516313717da960e21b815260040160405180910390fd5b8260205b85518111611a9357611a496002856126c7565b5f03611a6a57815f528086015160205260405f209150600284049350611a81565b808601515f528160205260405f2091506002840493505b611a8c6020826126da565b9050611a36565b50949350505050565b604080516080810182525f91810182815260608201929092529081905b8152602001606081525090565b828054828255905f5260205f20908101928215611aff579160200282015b82811115611aff578251825591602001919060010190611ae4565b50611b0b929150611c3d565b5090565b60405180608001604052805f81526020015f8152602001611ab960405180604001604052805f81526020015f81525090565b60405180608001604052805f8152602001611b5a611b0f565b815260200160608152602001611b8160405180604001604052805f81526020015f81525090565b905290565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b6040518060400160405280611bd5611c51565b8152602001611b81611c51565b604051806101800160405280600c906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b6040518060c001604052806006906020820280368337509192915050565b5b80821115611b0b575f8155600101611c3e565b60405180604001604052806002906020820280368337509192915050565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b0381118282101715611ca557611ca5611c6f565b60405290565b60405160a081016001600160401b0381118282101715611ca557611ca5611c6f565b604051606081016001600160401b0381118282101715611ca557611ca5611c6f565b604051608081016001600160401b0381118282101715611ca557611ca5611c6f565b604051601f8201601f191681016001600160401b0381118282101715611d3957611d39611c6f565b604052919050565b80356001600160a01b0381168114611889575f5ffd5b803563ffffffff81168114611889575f5ffd5b5f60408284031215611d7a575f5ffd5b611d82611c83565b9050611d8d82611d41565b8152611d9b60208301611d57565b602082015292915050565b5f60408284031215611db6575f5ffd5b611dbe611c83565b823581526020928301359281019290925250919050565b5f82601f830112611de4575f5ffd5b611dec611c83565b806040840185811115611dfd575f5ffd5b845b81811015611e17578035845260209384019301611dff565b509095945050505050565b5f60808284031215611e32575f5ffd5b611e3a611c83565b9050611e468383611dd5565b8152611d9b8360408401611dd5565b5f6001600160401b03821115611e6d57611e6d611c6f565b5060051b60200190565b5f82601f830112611e86575f5ffd5b8135611e99611e9482611e55565b611d11565b8082825260208201915060208360051b860101925085831115611eba575f5ffd5b602085015b83811015611ed7578035835260209283019201611ebf565b5095945050505050565b5f60608284031215611ef1575f5ffd5b611ef9611c83565b9050611f058383611da6565b815260408201356001600160401b03811115611f1f575f5ffd5b611f2b84828501611e77565b60208301525092915050565b5f6101208284031215611f48575f5ffd5b611f50611cab565b9050611f5b82611d57565b815260208281013590820152611f748360408401611da6565b6040820152611f868360808401611e22565b60608201526101008201356001600160401b03811115611fa4575f5ffd5b8201601f81018413611fb4575f5ffd5b8035611fc2611e9482611e55565b8082825260208201915060208360051b850101925086831115611fe3575f5ffd5b602084015b838110156120f35780356001600160401b03811115612005575f5ffd5b85016060818a03601f1901121561201a575f5ffd5b612022611ccd565b61202e60208301611d57565b815260408201356001600160401b03811115612048575f5ffd5b82016020810190603f018b1361205c575f5ffd5b80356001600160401b0381111561207557612075611c6f565b612088601f8201601f1916602001611d11565b8181528c602083850101111561209c575f5ffd5b816020840160208301375f6020838301015280602085015250505060608201356001600160401b038111156120cf575f5ffd5b6120de8b602083860101611ee1565b60408301525084525060209283019201611fe8565b5060808501525091949350505050565b5f5f5f60808486031215612115575f5ffd5b61211f8585611d6a565b925060408401356001600160401b03811115612139575f5ffd5b61214586828701611f37565b92505060608401356001600160401b03811115612160575f5ffd5b8401601f81018613612170575f5ffd5b803561217e611e9482611e55565b8082825260208201915060208360051b85010192508883111561219f575f5ffd5b6020840193505b828410156121d057833561ffff811681146121bf575f5ffd5b8252602093840193909101906121a6565b809450505050509250925092565b5f5f606083850312156121ef575f5ffd5b6121f98484611d6a565b915060408301356001600160401b03811115612213575f5ffd5b61221f85828601611f37565b9150509250929050565b602080825282518282018190525f918401906040840190835b81811015611e17578351835260209384019390920191600101612242565b5f5f5f5f6101208587031215612274575f5ffd5b843593506122858660208701611da6565b92506122948660608701611e22565b91506122a38660e08701611da6565b905092959194509250565b5f5f5f608084860312156122c0575f5ffd5b6122ca8585611d6a565b92506122d860408501611d57565b929592945050506060919091013590565b5f8151808452602084019350602083015f5b828110156123195781518652602095860195909101906001016122fb565b5093949350505050565b60208082528251805183830152015160408201525f602083015160608084015261235060808401826122e9565b949350505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f6040828403121561239d575f5ffd5b6103fb8383611d6a565b5f604082840312156123b7575f5ffd5b50919050565b5f5f5f5f60c085870312156123d0575f5ffd5b6123da86866123a7565b93506123e860408601611d57565b925060608501356001600160401b03811115612402575f5ffd5b850160a08188031215612413575f5ffd5b61241b611cef565b81358152602080830135908201526124368860408401611da6565b604082015260808201356001600160401b03811115612453575f5ffd5b61245f89828501611e77565b60608301525092506122a3905086608087016123a7565b5f5f5f60808486031215612488575f5ffd5b6124928585611d6a565b925060408401356001600160401b038111156124ac575f5ffd5b6124b886828701611f37565b92505060608401356001600160401b038111156124d3575f5ffd5b6124df86828701611e77565b9150509250925092565b5f5f606083850312156124fa575f5ffd5b6125048484611d6a565b915061251260408401611d57565b90509250929050565b80518252602081015160208301525f6040820151612546604085018280518252602090810151910152565b50606082015160a0608085015261235060a08501826122e9565b602081525f6103fb602083018461251b565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176103fe576103fe612586565b634e487b7160e01b5f52601260045260245ffd5b5f826125d3576125d36125b1565b500490565b5f602082840312156125e8575f5ffd5b6103fb82611d41565b5f60208284031215612601575f5ffd5b6103fb82611d57565b6001600160a01b0361261b85611d41565b16815263ffffffff61262f60208601611d57565b16602082015263ffffffff83166040820152608060608201525f611062608083018461251b565b805160208083015191908110156123b7575f1960209190910360031b1b16919050565b63ffffffff81811683821601908111156103fe576103fe612586565b5f602082840312156126a5575f5ffd5b815180151581146103e8575f5ffd5b818103818111156103fe576103fe612586565b5f826126d5576126d56125b1565b500690565b808201808211156103fe576103fe61258656fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47a26469706673582212206fd3a0141843c00711802970cdf44e4c37ec698294505e9170e942963e33491e64736f6c634300081b0033",
}
// BN254CertificateVerifierABI is the input ABI used to generate the binding from.
diff --git a/pkg/bindings/BN254TableCalculator/binding.go b/pkg/bindings/BN254TableCalculator/binding.go
new file mode 100644
index 0000000000..331cd1ca74
--- /dev/null
+++ b/pkg/bindings/BN254TableCalculator/binding.go
@@ -0,0 +1,491 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package BN254TableCalculator
+
+import (
+ "errors"
+ "math/big"
+ "strings"
+
+ ethereum "github.com/ethereum/go-ethereum"
+ "github.com/ethereum/go-ethereum/accounts/abi"
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+ _ = errors.New
+ _ = big.NewInt
+ _ = strings.NewReader
+ _ = ethereum.NotFound
+ _ = bind.Bind
+ _ = common.Big1
+ _ = types.BloomLookup
+ _ = event.NewSubscription
+ _ = abi.ConvertType
+)
+
+// BN254G1Point is an auto generated low-level Go binding around an user-defined struct.
+type BN254G1Point struct {
+ X *big.Int
+ Y *big.Int
+}
+
+// IBN254TableCalculatorTypesBN254OperatorInfo is an auto generated low-level Go binding around an user-defined struct.
+type IBN254TableCalculatorTypesBN254OperatorInfo struct {
+ Pubkey BN254G1Point
+ Weights []*big.Int
+}
+
+// IBN254TableCalculatorTypesBN254OperatorSetInfo is an auto generated low-level Go binding around an user-defined struct.
+type IBN254TableCalculatorTypesBN254OperatorSetInfo struct {
+ OperatorInfoTreeRoot [32]byte
+ NumOperators *big.Int
+ AggregatePubkey BN254G1Point
+ TotalWeights []*big.Int
+}
+
+// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
+type OperatorSet struct {
+ Avs common.Address
+ Id uint32
+}
+
+// BN254TableCalculatorMetaData contains all meta data concerning the BN254TableCalculator contract.
+var BN254TableCalculatorMetaData = &bind.MetaData{
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_keyRegistrar\",\"type\":\"address\",\"internalType\":\"contractIKeyRegistrar\"},{\"name\":\"_allocationManager\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"},{\"name\":\"_LOOKAHEAD_BLOCKS\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"LOOKAHEAD_BLOCKS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allocationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorTable\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"operatorSetInfo\",\"type\":\"tuple\",\"internalType\":\"structIBN254TableCalculatorTypes.BN254OperatorSetInfo\",\"components\":[{\"name\":\"operatorInfoTreeRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"numOperators\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"aggregatePubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"totalWeights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorTableBytes\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"operatorTableBytes\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorInfos\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIBN254TableCalculatorTypes.BN254OperatorInfo[]\",\"components\":[{\"name\":\"pubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorWeight\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"weight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorWeights\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"weights\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"keyRegistrar\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIKeyRegistrar\"}],\"stateMutability\":\"view\"},{\"type\":\"error\",\"name\":\"ECAddFailed\",\"inputs\":[]}]",
+ Bin: "0x60e060405234801561000f575f5ffd5b506040516118b23803806118b283398101604081905261002e91610060565b6001600160a01b03928316608052911660a05260c0526100a0565b6001600160a01b038116811461005d575f5ffd5b50565b5f5f5f60608486031215610072575f5ffd5b835161007d81610049565b602085015190935061008e81610049565b80925050604084015190509250925092565b60805160a05160c0516117b16101015f395f8181610133015261063401525f818161017b015281816104df0152818161056f015261060701525f818160d401528181610328015281816103d401528181610a040152610b1f01526117b15ff3fe608060405234801561000f575f5ffd5b5060043610610085575f3560e01c80635e120ffc116100585780635e120ffc1461012e57806371ca71d914610155578063ca8aa7c714610176578063cf2d90ef1461019d575f5ffd5b80631088794a14610089578063124c87e0146100af5780633ec45c7e146100cf57806341ee6d0e1461010e575b5f5ffd5b61009c610097366004610ff1565b6101bd565b6040519081526020015b60405180910390f35b6100c26100bd366004611027565b61025d565b6040516100a69190611082565b6100f67f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100a6565b61012161011c366004611027565b61026e565b6040516100a691906110d5565b61009c7f000000000000000000000000000000000000000000000000000000000000000081565b610168610163366004611027565b61029f565b6040516100a6929190611143565b6100f67f000000000000000000000000000000000000000000000000000000000000000081565b6101b06101ab366004611027565b6102b4565b6040516100a691906111e7565b5f5f5f6101c9856104d9565b90925090505f5b825181101561025057846001600160a01b03168382815181106101f5576101f561124a565b60200260200101516001600160a01b0316036102485781818151811061021d5761021d61124a565b60200260200101515f815181106102365761023661124a565b60200260200101519350505050610257565b6001016101d0565b505f925050505b92915050565b610265610f46565b61025782610894565b606061027982610894565b6040516020016102899190611082565b6040516020818303038152906040529050919050565b6060806102ab836104d9565b91509150915091565b60605f5f6102c1846104d9565b915091505f82516001600160401b038111156102df576102df61125e565b60405190808252806020026020018201604052801561031857816020015b610305610f85565b8152602001906001900390816102fd5790505b5090505f5b83518110156104d0577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663bd30a0b9878684815181106103685761036861124a565b60200260200101516040518363ffffffff1660e01b815260040161038d9291906112ab565b602060405180830381865afa1580156103a8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103cc91906112d1565b156104c8575f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639a43e3fb888785815181106104145761041461124a565b60200260200101516040518363ffffffff1660e01b81526004016104399291906112ab565b60c060405180830381865afa158015610454573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104789190611395565b509050604051806040016040528082815260200185848151811061049e5761049e61124a565b60200260200101518152508383815181106104bb576104bb61124a565b6020026020010181905250505b60010161031d565b50949350505050565b6060805f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636e875dba856040518263ffffffff1660e01b81526004016105299190611412565b5f60405180830381865afa158015610543573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261056a9190810190611442565b90505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634177a87c866040518263ffffffff1660e01b81526004016105b99190611412565b5f60405180830381865afa1580156105d3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105fa91908101906114e0565b90505f6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016632bab2c4a8785856106597f000000000000000000000000000000000000000000000000000000000000000043611583565b6040518563ffffffff1660e01b81526004016106789493929190611596565b5f60405180830381865afa158015610692573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106b9919081019061160f565b905082516001600160401b038111156106d4576106d461125e565b6040519080825280602002602001820160405280156106fd578160200160208202803683370190505b50945082516001600160401b038111156107195761071961125e565b60405190808252806020026020018201604052801561074c57816020015b60608152602001906001900390816107375790505b5093505f805b8451811015610884575f805b85518110156107af578483815181106107795761077961124a565b602002602001015181815181106107925761079261124a565b6020026020010151826107a59190611583565b915060010161075e565b50801561087b576040805160018082528183019092529060208083019080368337019050508784815181106107e6576107e661124a565b6020026020010181905250808784815181106108045761080461124a565b60200260200101515f8151811061081d5761081d61124a565b60200260200101818152505085828151811061083b5761083b61124a565b60200260200101518884815181106108555761085561124a565b6001600160a01b0390921660209283029190910190910152826108778161171b565b9350505b50600101610752565b5080865280855250505050915091565b61089c610f46565b5f5f6108a7846104d9565b9150915080515f036109325760405180608001604052805f5f1b81526020015f815260200160405180604001604052805f81526020015f81525081526020015f6001600160401b038111156108fe576108fe61125e565b604051908082528060200260200182016040528015610927578160200160208202803683370190505b509052949350505050565b5f815f815181106109455761094561124a565b60200260200101515190505f816001600160401b038111156109695761096961125e565b604051908082528060200260200182016040528015610992578160200160208202803683370190505b5090505f84516001600160401b038111156109af576109af61125e565b6040519080825280602002602001820160405280156109d8578160200160208202803683370190505b5090506109f660405180604001604052805f81526020015f81525090565b5f805b8751811015610c5a577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663bd30a0b98b8a8481518110610a4457610a4461124a565b60200260200101516040518363ffffffff1660e01b8152600401610a699291906112ab565b602060405180830381865afa158015610a84573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa891906112d1565b15610c52575f5b86811015610b1b57878281518110610ac957610ac961124a565b60200260200101518181518110610ae257610ae261124a565b6020026020010151868281518110610afc57610afc61124a565b60200260200101818151610b109190611583565b905250600101610aaf565b505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639a43e3fb8c8b8581518110610b5f57610b5f61124a565b60200260200101516040518363ffffffff1660e01b8152600401610b849291906112ab565b60c060405180830381865afa158015610b9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bc39190611395565b5090506040518060400160405280828152602001898481518110610be957610be961124a565b6020026020010151815250604051602001610c049190611733565b60405160208183030381529060405280519060200120858381518110610c2c57610c2c61124a565b6020908102919091010152610c418482610d25565b935082610c4d8161171b565b935050505b6001016109f9565b50805f03610ce65760405180608001604052805f5f1b81526020015f815260200160405180604001604052805f81526020015f81525081526020015f6001600160401b03811115610cad57610cad61125e565b604051908082528060200260200182016040528015610cd6578160200160208202803683370190505b5090529998505050505050505050565b8083525f610cf384610da1565b905060405180608001604052808281526020018381526020018481526020018681525098505050505050505050919050565b604080518082019091525f8082526020820152610d40610fa6565b835181526020808501518183015283516040808401919091529084015160608301525f908360808460066107d05a03fa90508080610d7a57fe5b5080610d995760405163d4b68fd760e01b815260040160405180910390fd5b505092915050565b5f60015b8251811015610dc057610db9600282611745565b9050610da5565b5f816001600160401b03811115610dd957610dd961125e565b604051908082528060200260200182016040528015610e02578160200160208202803683370190505b5090505f5b8451811015610e4f57848181518110610e2257610e2261124a565b6020026020010151828281518110610e3c57610e3c61124a565b6020908102919091010152600101610e07565b505b81600114610f23575f610e6560028461175c565b90505f5b81811015610f1b5782610e7d826002611745565b81518110610e8d57610e8d61124a565b602002602001015183826002610ea39190611745565b610eae906001611583565b81518110610ebe57610ebe61124a565b6020026020010151604051602001610ee0929190918252602082015260400190565b60405160208183030381529060405280519060200120838281518110610f0857610f0861124a565b6020908102919091010152600101610e69565b509150610e51565b805f81518110610f3557610f3561124a565b602002602001015192505050919050565b60405180608001604052805f81526020015f8152602001610f7860405180604001604052805f81526020015f81525090565b8152602001606081525090565b604080516080810182525f9181018281526060820192909252908190610f78565b60405180608001604052806004906020820280368337509192915050565b5f60408284031215610fd4575f5ffd5b50919050565b6001600160a01b0381168114610fee575f5ffd5b50565b5f5f60608385031215611002575f5ffd5b61100c8484610fc4565b9150604083013561101c81610fda565b809150509250929050565b5f60408284031215611037575f5ffd5b6110418383610fc4565b9392505050565b5f8151808452602084019350602083015f5b8281101561107857815186526020958601959091019060010161105a565b5093949350505050565b6020815281516020820152602082015160408201525f60408301516110b4606084018280518252602090810151910152565b50606083015160a0808401526110cd60c0840182611048565b949350505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f8151808452602084019350602083015f5b828110156110785781516001600160a01b031686526020958601959091019060010161111c565b604081525f611155604083018561110a565b828103602084015280845180835260208301915060208160051b840101602087015f5b838110156111aa57601f19868403018552611194838351611048565b6020958601959093509190910190600101611178565b509098975050505050505050565b6111cd82825180518252602090810151910152565b5f6020820151606060408501526110cd6060850182611048565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b8281101561123e57603f198786030184526112298583516111b8565b9450602093840193919091019060010161120d565b50929695505050505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b803561127d81610fda565b6001600160a01b03168252602081013563ffffffff811680821461129f575f5ffd5b80602085015250505050565b606081016112b98285611272565b6001600160a01b039290921660409190910152919050565b5f602082840312156112e1575f5ffd5b81518015158114611041575f5ffd5b604080519081016001600160401b03811182821017156113125761131261125e565b60405290565b604051601f8201601f191681016001600160401b03811182821017156113405761134061125e565b604052919050565b5f82601f830112611357575f5ffd5b61135f6112f0565b806040840185811115611370575f5ffd5b845b8181101561138a578051845260209384019301611372565b509095945050505050565b5f5f82840360c08112156113a7575f5ffd5b60408112156113b4575f5ffd5b6113bc6112f0565b845181526020808601519082015292506080603f19820112156113dd575f5ffd5b506113e66112f0565b6113f38560408601611348565b81526114028560808601611348565b6020820152809150509250929050565b604081016102578284611272565b5f6001600160401b038211156114385761143861125e565b5060051b60200190565b5f60208284031215611452575f5ffd5b81516001600160401b03811115611467575f5ffd5b8201601f81018413611477575f5ffd5b805161148a61148582611420565b611318565b8082825260208201915060208360051b8501019250868311156114ab575f5ffd5b6020840193505b828410156114d65783516114c581610fda565b8252602093840193909101906114b2565b9695505050505050565b5f602082840312156114f0575f5ffd5b81516001600160401b03811115611505575f5ffd5b8201601f81018413611515575f5ffd5b805161152361148582611420565b8082825260208201915060208360051b850101925086831115611544575f5ffd5b6020840193505b828410156114d657835161155e81610fda565b82526020938401939091019061154b565b634e487b7160e01b5f52601160045260245ffd5b808201808211156102575761025761156f565b6115a08186611272565b60a060408201525f6115b560a083018661110a565b8281036060840152845180825260208087019201905f5b818110156115f35783516001600160a01b03168352602093840193909201916001016115cc565b5050809250505063ffffffff8316608083015295945050505050565b5f6020828403121561161f575f5ffd5b81516001600160401b03811115611634575f5ffd5b8201601f81018413611644575f5ffd5b805161165261148582611420565b8082825260208201915060208360051b850101925086831115611673575f5ffd5b602084015b838110156117105780516001600160401b03811115611695575f5ffd5b8501603f810189136116a5575f5ffd5b60208101516116b661148582611420565b808282526020820191506020808460051b8601010192508b8311156116d9575f5ffd5b6040840193505b828410156116fb5783518252602093840193909101906116e0565b86525050602093840193919091019050611678565b509695505050505050565b5f6001820161172c5761172c61156f565b5060010190565b602081525f61104160208301846111b8565b80820281158282048414176102575761025761156f565b5f8261177657634e487b7160e01b5f52601260045260245ffd5b50049056fea26469706673582212207206da6ee6b3e3f50e0be8a9df432760c19400f5213de4f95ccadae49e425ada64736f6c634300081b0033",
+}
+
+// BN254TableCalculatorABI is the input ABI used to generate the binding from.
+// Deprecated: Use BN254TableCalculatorMetaData.ABI instead.
+var BN254TableCalculatorABI = BN254TableCalculatorMetaData.ABI
+
+// BN254TableCalculatorBin is the compiled bytecode used for deploying new contracts.
+// Deprecated: Use BN254TableCalculatorMetaData.Bin instead.
+var BN254TableCalculatorBin = BN254TableCalculatorMetaData.Bin
+
+// DeployBN254TableCalculator deploys a new Ethereum contract, binding an instance of BN254TableCalculator to it.
+func DeployBN254TableCalculator(auth *bind.TransactOpts, backend bind.ContractBackend, _keyRegistrar common.Address, _allocationManager common.Address, _LOOKAHEAD_BLOCKS *big.Int) (common.Address, *types.Transaction, *BN254TableCalculator, error) {
+ parsed, err := BN254TableCalculatorMetaData.GetAbi()
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ if parsed == nil {
+ return common.Address{}, nil, nil, errors.New("GetABI returned nil")
+ }
+
+ address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(BN254TableCalculatorBin), backend, _keyRegistrar, _allocationManager, _LOOKAHEAD_BLOCKS)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &BN254TableCalculator{BN254TableCalculatorCaller: BN254TableCalculatorCaller{contract: contract}, BN254TableCalculatorTransactor: BN254TableCalculatorTransactor{contract: contract}, BN254TableCalculatorFilterer: BN254TableCalculatorFilterer{contract: contract}}, nil
+}
+
+// BN254TableCalculator is an auto generated Go binding around an Ethereum contract.
+type BN254TableCalculator struct {
+ BN254TableCalculatorCaller // Read-only binding to the contract
+ BN254TableCalculatorTransactor // Write-only binding to the contract
+ BN254TableCalculatorFilterer // Log filterer for contract events
+}
+
+// BN254TableCalculatorCaller is an auto generated read-only Go binding around an Ethereum contract.
+type BN254TableCalculatorCaller struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// BN254TableCalculatorTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type BN254TableCalculatorTransactor struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// BN254TableCalculatorFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type BN254TableCalculatorFilterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// BN254TableCalculatorSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type BN254TableCalculatorSession struct {
+ Contract *BN254TableCalculator // Generic contract binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// BN254TableCalculatorCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type BN254TableCalculatorCallerSession struct {
+ Contract *BN254TableCalculatorCaller // Generic contract caller binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// BN254TableCalculatorTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type BN254TableCalculatorTransactorSession struct {
+ Contract *BN254TableCalculatorTransactor // Generic contract transactor binding to set the session for
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// BN254TableCalculatorRaw is an auto generated low-level Go binding around an Ethereum contract.
+type BN254TableCalculatorRaw struct {
+ Contract *BN254TableCalculator // Generic contract binding to access the raw methods on
+}
+
+// BN254TableCalculatorCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type BN254TableCalculatorCallerRaw struct {
+ Contract *BN254TableCalculatorCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// BN254TableCalculatorTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type BN254TableCalculatorTransactorRaw struct {
+ Contract *BN254TableCalculatorTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewBN254TableCalculator creates a new instance of BN254TableCalculator, bound to a specific deployed contract.
+func NewBN254TableCalculator(address common.Address, backend bind.ContractBackend) (*BN254TableCalculator, error) {
+ contract, err := bindBN254TableCalculator(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &BN254TableCalculator{BN254TableCalculatorCaller: BN254TableCalculatorCaller{contract: contract}, BN254TableCalculatorTransactor: BN254TableCalculatorTransactor{contract: contract}, BN254TableCalculatorFilterer: BN254TableCalculatorFilterer{contract: contract}}, nil
+}
+
+// NewBN254TableCalculatorCaller creates a new read-only instance of BN254TableCalculator, bound to a specific deployed contract.
+func NewBN254TableCalculatorCaller(address common.Address, caller bind.ContractCaller) (*BN254TableCalculatorCaller, error) {
+ contract, err := bindBN254TableCalculator(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &BN254TableCalculatorCaller{contract: contract}, nil
+}
+
+// NewBN254TableCalculatorTransactor creates a new write-only instance of BN254TableCalculator, bound to a specific deployed contract.
+func NewBN254TableCalculatorTransactor(address common.Address, transactor bind.ContractTransactor) (*BN254TableCalculatorTransactor, error) {
+ contract, err := bindBN254TableCalculator(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &BN254TableCalculatorTransactor{contract: contract}, nil
+}
+
+// NewBN254TableCalculatorFilterer creates a new log filterer instance of BN254TableCalculator, bound to a specific deployed contract.
+func NewBN254TableCalculatorFilterer(address common.Address, filterer bind.ContractFilterer) (*BN254TableCalculatorFilterer, error) {
+ contract, err := bindBN254TableCalculator(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &BN254TableCalculatorFilterer{contract: contract}, nil
+}
+
+// bindBN254TableCalculator binds a generic wrapper to an already deployed contract.
+func bindBN254TableCalculator(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := BN254TableCalculatorMetaData.GetAbi()
+ if err != nil {
+ return nil, err
+ }
+ return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_BN254TableCalculator *BN254TableCalculatorRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _BN254TableCalculator.Contract.BN254TableCalculatorCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_BN254TableCalculator *BN254TableCalculatorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _BN254TableCalculator.Contract.BN254TableCalculatorTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_BN254TableCalculator *BN254TableCalculatorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _BN254TableCalculator.Contract.BN254TableCalculatorTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_BN254TableCalculator *BN254TableCalculatorCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _BN254TableCalculator.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_BN254TableCalculator *BN254TableCalculatorTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _BN254TableCalculator.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_BN254TableCalculator *BN254TableCalculatorTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _BN254TableCalculator.Contract.contract.Transact(opts, method, params...)
+}
+
+// LOOKAHEADBLOCKS is a free data retrieval call binding the contract method 0x5e120ffc.
+//
+// Solidity: function LOOKAHEAD_BLOCKS() view returns(uint256)
+func (_BN254TableCalculator *BN254TableCalculatorCaller) LOOKAHEADBLOCKS(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _BN254TableCalculator.contract.Call(opts, &out, "LOOKAHEAD_BLOCKS")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// LOOKAHEADBLOCKS is a free data retrieval call binding the contract method 0x5e120ffc.
+//
+// Solidity: function LOOKAHEAD_BLOCKS() view returns(uint256)
+func (_BN254TableCalculator *BN254TableCalculatorSession) LOOKAHEADBLOCKS() (*big.Int, error) {
+ return _BN254TableCalculator.Contract.LOOKAHEADBLOCKS(&_BN254TableCalculator.CallOpts)
+}
+
+// LOOKAHEADBLOCKS is a free data retrieval call binding the contract method 0x5e120ffc.
+//
+// Solidity: function LOOKAHEAD_BLOCKS() view returns(uint256)
+func (_BN254TableCalculator *BN254TableCalculatorCallerSession) LOOKAHEADBLOCKS() (*big.Int, error) {
+ return _BN254TableCalculator.Contract.LOOKAHEADBLOCKS(&_BN254TableCalculator.CallOpts)
+}
+
+// AllocationManager is a free data retrieval call binding the contract method 0xca8aa7c7.
+//
+// Solidity: function allocationManager() view returns(address)
+func (_BN254TableCalculator *BN254TableCalculatorCaller) AllocationManager(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _BN254TableCalculator.contract.Call(opts, &out, "allocationManager")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// AllocationManager is a free data retrieval call binding the contract method 0xca8aa7c7.
+//
+// Solidity: function allocationManager() view returns(address)
+func (_BN254TableCalculator *BN254TableCalculatorSession) AllocationManager() (common.Address, error) {
+ return _BN254TableCalculator.Contract.AllocationManager(&_BN254TableCalculator.CallOpts)
+}
+
+// AllocationManager is a free data retrieval call binding the contract method 0xca8aa7c7.
+//
+// Solidity: function allocationManager() view returns(address)
+func (_BN254TableCalculator *BN254TableCalculatorCallerSession) AllocationManager() (common.Address, error) {
+ return _BN254TableCalculator.Contract.AllocationManager(&_BN254TableCalculator.CallOpts)
+}
+
+// CalculateOperatorTable is a free data retrieval call binding the contract method 0x124c87e0.
+//
+// Solidity: function calculateOperatorTable((address,uint32) operatorSet) view returns((bytes32,uint256,(uint256,uint256),uint256[]) operatorSetInfo)
+func (_BN254TableCalculator *BN254TableCalculatorCaller) CalculateOperatorTable(opts *bind.CallOpts, operatorSet OperatorSet) (IBN254TableCalculatorTypesBN254OperatorSetInfo, error) {
+ var out []interface{}
+ err := _BN254TableCalculator.contract.Call(opts, &out, "calculateOperatorTable", operatorSet)
+
+ if err != nil {
+ return *new(IBN254TableCalculatorTypesBN254OperatorSetInfo), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(IBN254TableCalculatorTypesBN254OperatorSetInfo)).(*IBN254TableCalculatorTypesBN254OperatorSetInfo)
+
+ return out0, err
+
+}
+
+// CalculateOperatorTable is a free data retrieval call binding the contract method 0x124c87e0.
+//
+// Solidity: function calculateOperatorTable((address,uint32) operatorSet) view returns((bytes32,uint256,(uint256,uint256),uint256[]) operatorSetInfo)
+func (_BN254TableCalculator *BN254TableCalculatorSession) CalculateOperatorTable(operatorSet OperatorSet) (IBN254TableCalculatorTypesBN254OperatorSetInfo, error) {
+ return _BN254TableCalculator.Contract.CalculateOperatorTable(&_BN254TableCalculator.CallOpts, operatorSet)
+}
+
+// CalculateOperatorTable is a free data retrieval call binding the contract method 0x124c87e0.
+//
+// Solidity: function calculateOperatorTable((address,uint32) operatorSet) view returns((bytes32,uint256,(uint256,uint256),uint256[]) operatorSetInfo)
+func (_BN254TableCalculator *BN254TableCalculatorCallerSession) CalculateOperatorTable(operatorSet OperatorSet) (IBN254TableCalculatorTypesBN254OperatorSetInfo, error) {
+ return _BN254TableCalculator.Contract.CalculateOperatorTable(&_BN254TableCalculator.CallOpts, operatorSet)
+}
+
+// CalculateOperatorTableBytes is a free data retrieval call binding the contract method 0x41ee6d0e.
+//
+// Solidity: function calculateOperatorTableBytes((address,uint32) operatorSet) view returns(bytes operatorTableBytes)
+func (_BN254TableCalculator *BN254TableCalculatorCaller) CalculateOperatorTableBytes(opts *bind.CallOpts, operatorSet OperatorSet) ([]byte, error) {
+ var out []interface{}
+ err := _BN254TableCalculator.contract.Call(opts, &out, "calculateOperatorTableBytes", operatorSet)
+
+ if err != nil {
+ return *new([]byte), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte)
+
+ return out0, err
+
+}
+
+// CalculateOperatorTableBytes is a free data retrieval call binding the contract method 0x41ee6d0e.
+//
+// Solidity: function calculateOperatorTableBytes((address,uint32) operatorSet) view returns(bytes operatorTableBytes)
+func (_BN254TableCalculator *BN254TableCalculatorSession) CalculateOperatorTableBytes(operatorSet OperatorSet) ([]byte, error) {
+ return _BN254TableCalculator.Contract.CalculateOperatorTableBytes(&_BN254TableCalculator.CallOpts, operatorSet)
+}
+
+// CalculateOperatorTableBytes is a free data retrieval call binding the contract method 0x41ee6d0e.
+//
+// Solidity: function calculateOperatorTableBytes((address,uint32) operatorSet) view returns(bytes operatorTableBytes)
+func (_BN254TableCalculator *BN254TableCalculatorCallerSession) CalculateOperatorTableBytes(operatorSet OperatorSet) ([]byte, error) {
+ return _BN254TableCalculator.Contract.CalculateOperatorTableBytes(&_BN254TableCalculator.CallOpts, operatorSet)
+}
+
+// GetOperatorInfos is a free data retrieval call binding the contract method 0xcf2d90ef.
+//
+// Solidity: function getOperatorInfos((address,uint32) operatorSet) view returns(((uint256,uint256),uint256[])[])
+func (_BN254TableCalculator *BN254TableCalculatorCaller) GetOperatorInfos(opts *bind.CallOpts, operatorSet OperatorSet) ([]IBN254TableCalculatorTypesBN254OperatorInfo, error) {
+ var out []interface{}
+ err := _BN254TableCalculator.contract.Call(opts, &out, "getOperatorInfos", operatorSet)
+
+ if err != nil {
+ return *new([]IBN254TableCalculatorTypesBN254OperatorInfo), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([]IBN254TableCalculatorTypesBN254OperatorInfo)).(*[]IBN254TableCalculatorTypesBN254OperatorInfo)
+
+ return out0, err
+
+}
+
+// GetOperatorInfos is a free data retrieval call binding the contract method 0xcf2d90ef.
+//
+// Solidity: function getOperatorInfos((address,uint32) operatorSet) view returns(((uint256,uint256),uint256[])[])
+func (_BN254TableCalculator *BN254TableCalculatorSession) GetOperatorInfos(operatorSet OperatorSet) ([]IBN254TableCalculatorTypesBN254OperatorInfo, error) {
+ return _BN254TableCalculator.Contract.GetOperatorInfos(&_BN254TableCalculator.CallOpts, operatorSet)
+}
+
+// GetOperatorInfos is a free data retrieval call binding the contract method 0xcf2d90ef.
+//
+// Solidity: function getOperatorInfos((address,uint32) operatorSet) view returns(((uint256,uint256),uint256[])[])
+func (_BN254TableCalculator *BN254TableCalculatorCallerSession) GetOperatorInfos(operatorSet OperatorSet) ([]IBN254TableCalculatorTypesBN254OperatorInfo, error) {
+ return _BN254TableCalculator.Contract.GetOperatorInfos(&_BN254TableCalculator.CallOpts, operatorSet)
+}
+
+// GetOperatorWeight is a free data retrieval call binding the contract method 0x1088794a.
+//
+// Solidity: function getOperatorWeight((address,uint32) operatorSet, address operator) view returns(uint256 weight)
+func (_BN254TableCalculator *BN254TableCalculatorCaller) GetOperatorWeight(opts *bind.CallOpts, operatorSet OperatorSet, operator common.Address) (*big.Int, error) {
+ var out []interface{}
+ err := _BN254TableCalculator.contract.Call(opts, &out, "getOperatorWeight", operatorSet, operator)
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// GetOperatorWeight is a free data retrieval call binding the contract method 0x1088794a.
+//
+// Solidity: function getOperatorWeight((address,uint32) operatorSet, address operator) view returns(uint256 weight)
+func (_BN254TableCalculator *BN254TableCalculatorSession) GetOperatorWeight(operatorSet OperatorSet, operator common.Address) (*big.Int, error) {
+ return _BN254TableCalculator.Contract.GetOperatorWeight(&_BN254TableCalculator.CallOpts, operatorSet, operator)
+}
+
+// GetOperatorWeight is a free data retrieval call binding the contract method 0x1088794a.
+//
+// Solidity: function getOperatorWeight((address,uint32) operatorSet, address operator) view returns(uint256 weight)
+func (_BN254TableCalculator *BN254TableCalculatorCallerSession) GetOperatorWeight(operatorSet OperatorSet, operator common.Address) (*big.Int, error) {
+ return _BN254TableCalculator.Contract.GetOperatorWeight(&_BN254TableCalculator.CallOpts, operatorSet, operator)
+}
+
+// GetOperatorWeights is a free data retrieval call binding the contract method 0x71ca71d9.
+//
+// Solidity: function getOperatorWeights((address,uint32) operatorSet) view returns(address[] operators, uint256[][] weights)
+func (_BN254TableCalculator *BN254TableCalculatorCaller) GetOperatorWeights(opts *bind.CallOpts, operatorSet OperatorSet) (struct {
+ Operators []common.Address
+ Weights [][]*big.Int
+}, error) {
+ var out []interface{}
+ err := _BN254TableCalculator.contract.Call(opts, &out, "getOperatorWeights", operatorSet)
+
+ outstruct := new(struct {
+ Operators []common.Address
+ Weights [][]*big.Int
+ })
+ if err != nil {
+ return *outstruct, err
+ }
+
+ outstruct.Operators = *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address)
+ outstruct.Weights = *abi.ConvertType(out[1], new([][]*big.Int)).(*[][]*big.Int)
+
+ return *outstruct, err
+
+}
+
+// GetOperatorWeights is a free data retrieval call binding the contract method 0x71ca71d9.
+//
+// Solidity: function getOperatorWeights((address,uint32) operatorSet) view returns(address[] operators, uint256[][] weights)
+func (_BN254TableCalculator *BN254TableCalculatorSession) GetOperatorWeights(operatorSet OperatorSet) (struct {
+ Operators []common.Address
+ Weights [][]*big.Int
+}, error) {
+ return _BN254TableCalculator.Contract.GetOperatorWeights(&_BN254TableCalculator.CallOpts, operatorSet)
+}
+
+// GetOperatorWeights is a free data retrieval call binding the contract method 0x71ca71d9.
+//
+// Solidity: function getOperatorWeights((address,uint32) operatorSet) view returns(address[] operators, uint256[][] weights)
+func (_BN254TableCalculator *BN254TableCalculatorCallerSession) GetOperatorWeights(operatorSet OperatorSet) (struct {
+ Operators []common.Address
+ Weights [][]*big.Int
+}, error) {
+ return _BN254TableCalculator.Contract.GetOperatorWeights(&_BN254TableCalculator.CallOpts, operatorSet)
+}
+
+// KeyRegistrar is a free data retrieval call binding the contract method 0x3ec45c7e.
+//
+// Solidity: function keyRegistrar() view returns(address)
+func (_BN254TableCalculator *BN254TableCalculatorCaller) KeyRegistrar(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _BN254TableCalculator.contract.Call(opts, &out, "keyRegistrar")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// KeyRegistrar is a free data retrieval call binding the contract method 0x3ec45c7e.
+//
+// Solidity: function keyRegistrar() view returns(address)
+func (_BN254TableCalculator *BN254TableCalculatorSession) KeyRegistrar() (common.Address, error) {
+ return _BN254TableCalculator.Contract.KeyRegistrar(&_BN254TableCalculator.CallOpts)
+}
+
+// KeyRegistrar is a free data retrieval call binding the contract method 0x3ec45c7e.
+//
+// Solidity: function keyRegistrar() view returns(address)
+func (_BN254TableCalculator *BN254TableCalculatorCallerSession) KeyRegistrar() (common.Address, error) {
+ return _BN254TableCalculator.Contract.KeyRegistrar(&_BN254TableCalculator.CallOpts)
+}
diff --git a/pkg/bindings/ECDSACertificateVerifier/binding.go b/pkg/bindings/ECDSACertificateVerifier/binding.go
index d2f5bcc8f7..9245d17e6e 100644
--- a/pkg/bindings/ECDSACertificateVerifier/binding.go
+++ b/pkg/bindings/ECDSACertificateVerifier/binding.go
@@ -57,7 +57,7 @@ type OperatorSet struct {
// ECDSACertificateVerifierMetaData contains all meta data concerning the ECDSACertificateVerifier contract.
var ECDSACertificateVerifierMetaData = &bind.MetaData{
ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_operatorTableUpdater\",\"type\":\"address\",\"internalType\":\"contractIOperatorTableUpdater\"},{\"name\":\"_version\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateCertificateDigest\",\"inputs\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorInfo\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.ECDSAOperatorInfo\",\"components\":[{\"name\":\"pubkey\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorInfos\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIOperatorTableCalculatorTypes.ECDSAOperatorInfo[]\",\"components\":[{\"name\":\"pubkey\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetOwner\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTotalStakes\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestReferenceTimestamp\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"maxOperatorTableStaleness\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorTableUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIOperatorTableUpdater\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"updateOperatorTable\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorInfos\",\"type\":\"tuple[]\",\"internalType\":\"structIOperatorTableCalculatorTypes.ECDSAOperatorInfo[]\",\"components\":[{\"name\":\"pubkey\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"operatorSetConfig\",\"type\":\"tuple\",\"internalType\":\"structICrossChainRegistryTypes.OperatorSetConfig\",\"components\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"maxStalenessPeriod\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyCertificate\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"cert\",\"type\":\"tuple\",\"internalType\":\"structIECDSACertificateVerifierTypes.ECDSACertificate\",\"components\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCertificateNominal\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"cert\",\"type\":\"tuple\",\"internalType\":\"structIECDSACertificateVerifierTypes.ECDSACertificate\",\"components\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"totalStakeNominalThresholds\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCertificateProportion\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"cert\",\"type\":\"tuple\",\"internalType\":\"structIECDSACertificateVerifierTypes.ECDSACertificate\",\"components\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"totalStakeProportionThresholds\",\"type\":\"uint16[]\",\"internalType\":\"uint16[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxStalenessPeriodUpdated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"maxStalenessPeriod\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetOwnerUpdated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"owner\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TableUpdated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"operatorInfos\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structIOperatorTableCalculatorTypes.ECDSAOperatorInfo[]\",\"components\":[{\"name\":\"pubkey\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CertificateStale\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignatureLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyTableUpdater\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReferenceTimestampDoesNotExist\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"TableUpdateStale\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VerificationFailed\",\"inputs\":[]}]",
- Bin: "0x60c060405234801561000f575f5ffd5b5060405161244038038061244083398101604081905261002e9161016d565b6001600160a01b03821660805280806100468161005b565b60a0525061005490506100a1565b5050610297565b5f5f829050601f8151111561008e578260405163305a27a960e01b8152600401610085919061023c565b60405180910390fd5b805161009982610271565b179392505050565b5f54610100900460ff16156101085760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401610085565b5f5460ff90811614610157575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b634e487b7160e01b5f52604160045260245ffd5b5f5f6040838503121561017e575f5ffd5b82516001600160a01b0381168114610194575f5ffd5b60208401519092506001600160401b038111156101af575f5ffd5b8301601f810185136101bf575f5ffd5b80516001600160401b038111156101d8576101d8610159565b604051601f8201601f19908116603f011681016001600160401b038111828210171561020657610206610159565b60405281815282820160200187101561021d575f5ffd5b8160208401602083015e5f602083830101528093505050509250929050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80516020808301519190811015610291575f198160200360031b1b821691505b50919050565b60805160a0516121736102cd5f395f8181610679015261123f01525f81816101db015281816106ad0152610e7401526121735ff3fe608060405234801561000f575f5ffd5b50600436106100f0575f3560e01c80636141879e1161009357806384818920116100635780638481892014610248578063be86e0b21461025b578063c0da24201461027e578063f698da2514610291575f5ffd5b80636141879e146101c357806368d6e081146101d65780637c85ac4c1461021557806380c7d3f314610235575f5ffd5b806323c2a3cb116100ce57806323c2a3cb1461015e57806354fd4d501461018657806356d482f51461019b5780635ddb9b5b146101b0575f5ffd5b806304cdbae4146100f4578063082ef73d1461011d578063184674341461013d575b5f5ffd5b6101076101023660046117ab565b610299565b60405161011491906117dd565b60405180910390f35b61013061012b3660046118d7565b61049d565b604051610114919061196d565b61015061014b36600461197f565b6105d0565b604051908152602001610114565b61017161016c3660046119a7565b61063f565b60405163ffffffff9091168152602001610114565b61018e610672565b60405161011491906119f0565b6101ae6101a9366004611a42565b6106a2565b005b6101716101be366004611ab4565b61089f565b6101716101d1366004611ab4565b6108c5565b6101fd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610114565b6102286102233660046119a7565b6108eb565b6040516101149190611ace565b610107610243366004611b41565b610a59565b6101fd610256366004611ab4565b610a65565b61026e610269366004611b8c565b610a8e565b6040519015158152602001610114565b61026e61028c366004611c6e565b610b21565b610150610c13565b60605f6102b36102ae36869003860186611ab4565b610cd3565b5f8181526003602052604090205490915063ffffffff8481169116146102ec57604051630cad17b760e31b815260040160405180910390fd5b5f81815260046020908152604080832063ffffffff871684529091529020548061032957604051630cad17b760e31b815260040160405180910390fd5b5f82815260056020908152604080832063ffffffff88168452825280832083805290915281206001015490816001600160401b0381111561036c5761036c61181f565b604051908082528060200260200182016040528015610395578160200160208202803683370190505b5090505f5b83811015610490575f85815260056020908152604080832063ffffffff808c168552908352818420908516845282528083206001018054825181850281018501909352808352919290919083018282801561041257602002820191905f5260205f20905b8154815260200190600101908083116103fe575b509394505f93505050505b81518110801561042c57508481105b156104865781818151811061044357610443611ce4565b602002602001015184828151811061045d5761045d611ce4565b602002602001018181516104719190611d0c565b9052508061047e81611d1f565b91505061041d565b505060010161039a565b5093505050505b92915050565b604080518082019091525f8152606060208201525f6104bb85610cd3565b5f81815260046020908152604080832063ffffffff808a1685529252909120549192508416106105315760405162461bcd60e51b815260206004820152601c60248201527f4f70657261746f7220696e646578206f7574206f6620626f756e647300000000604482015260640160405180910390fd5b5f81815260056020908152604080832063ffffffff808916855290835281842090871684528252918290208251808401845281546001600160a01b03168152600182018054855181860281018601909652808652919492938581019392908301828280156105bc57602002820191905f5260205f20905b8154815260200190600101908083116105a8575b5050505050815250509150505b9392505050565b604080517fda346acb3ce99e7c5132bf8cafb159ad8085970ebfdba78007ef0fe163063d14602082015263ffffffff841691810191909152606081018290525f90819060800160405160208183030381529060405280519060200120905061063781610d36565b949350505050565b5f5f61064a84610cd3565b5f90815260046020908152604080832063ffffffff8716845290915290205491505092915050565b606061069d7f0000000000000000000000000000000000000000000000000000000000000000610d7c565b905090565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106eb5760405163030c1b6b60e11b815260040160405180910390fd5b5f6106fe6102ae36889003880188611ab4565b5f8181526003602052604090205490915063ffffffff9081169086161161073857604051632f20889f60e01b815260040160405180910390fd5b5f81815260046020908152604080832063ffffffff8916845290915281208490555b838110156107c45784848281811061077457610774611ce4565b90506020028101906107869190611d37565b5f83815260056020908152604080832063ffffffff808c168552908352818420908616845290915290206107ba8282611d6c565b505060010161075a565b505f818152600360209081526040909120805463ffffffff191663ffffffff88161790556107f490830183611e6f565b5f8281526001602090815260409182902080546001600160a01b0319166001600160a01b03949094169390931790925561083391908401908401611e8a565b5f8281526002602052604090819020805463ffffffff191663ffffffff9390931692909217909155517f4f588da9ec57976194a79b5594f8f8782923d93013df2b9ed12fe125805011ef9061088f908890889088908890611ea3565b60405180910390a1505050505050565b5f5f6108aa83610cd3565b5f9081526003602052604090205463ffffffff169392505050565b5f5f6108d083610cd3565b5f9081526002602052604090205463ffffffff169392505050565b60605f6108f784610cd3565b5f81815260046020908152604080832063ffffffff8089168552925282205492935082166001600160401b038111156109325761093261181f565b60405190808252806020026020018201604052801561097757816020015b604080518082019091525f8152606060208201528152602001906001900390816109505790505b5090505f5b8263ffffffff168163ffffffff161015610a4f575f84815260056020908152604080832063ffffffff808b16855290835281842090851684528252918290208251808401845281546001600160a01b0316815260018201805485518186028101860190965280865291949293858101939290830182828015610a1b57602002820191905f5260205f20905b815481526020019060010190808311610a07575b505050505081525050828263ffffffff1681518110610a3c57610a3c611ce4565b602090810291909101015260010161097c565b5095945050505050565b60606105c98383610db9565b5f5f610a7083610cd3565b5f908152600160205260409020546001600160a01b03169392505050565b5f5f610a9a8585610db9565b90508251815114610abe5760405163512509d360e11b815260040160405180910390fd5b5f5b8151811015610b1557838181518110610adb57610adb611ce4565b6020026020010151828281518110610af557610af5611ce4565b60200260200101511015610b0d575f925050506105c9565b600101610ac0565b50600195945050505050565b5f5f610b2d8686610db9565b90505f610b41876101026020890189611e8a565b82519091508414610b655760405163512509d360e11b815260040160405180910390fd5b5f5b8251811015610c05575f612710878784818110610b8657610b86611ce4565b9050602002016020810190610b9b9190611fd6565b61ffff16848481518110610bb157610bb1611ce4565b6020026020010151610bc39190611d55565b610bcd919061200b565b905080848381518110610be257610be2611ce4565b60200260200101511015610bfc575f945050505050610637565b50600101610b67565b506001979650505050505050565b60408051808201909152600a81526922b4b3b2b72630bcb2b960b11b6020909101525f7f91ab3d17e3a50a9d89e63fd30b92be7f5336b03b287bb946787a83a9d62a27667f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea610c80611237565b8051602091820120604051610cb8949392309101938452602084019290925260408301526001600160a01b0316606082015260800190565b60405160208183030381529060405280519060200120905090565b5f815f0151826020015163ffffffff16604051602001610d1e92919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b6040516020818303038152906040526104979061201e565b5f610d3f610c13565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b60605f610d88836112ac565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b60605f610dce6102ae36869003860186611ab4565b5f8181526002602090815260409091205491925063ffffffff90911690610df790850185611e8a565b610e019190612041565b63ffffffff16421115610e275760405163640fcd6b60e11b815260040160405180910390fd5b610e346020840184611e8a565b5f8281526003602052604090205463ffffffff908116911614610e6a57604051630cad17b760e31b815260040160405180910390fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166364e1df84610ea66020860186611e8a565b6040516001600160e01b031960e084901b16815263ffffffff919091166004820152602401602060405180830381865afa158015610ee6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f0a919061205d565b610f2757604051631b14174b60e01b815260040160405180910390fd5b5f610f39856101026020870187611e8a565b90505f81516001600160401b03811115610f5557610f5561181f565b604051908082528060200260200182016040528015610f7e578160200160208202803683370190505b5090505f610f9c610f926020880188611e8a565b87602001356105d0565b90505f80610fea83610fb160408b018b61207c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506112d392505050565b915091508061100c5760405163439cc0cd60e01b815260040160405180910390fd5b5f5b8251811015611229575f83828151811061102a5761102a611ce4565b602002602001015190505f5f905061105d60405180604001604052805f6001600160a01b03168152602001606081525090565b5f5b60045f8c81526020019081526020015f205f8e5f0160208101906110839190611e8a565b63ffffffff1663ffffffff1681526020019081526020015f20548110156111885760055f8c81526020019081526020015f205f8e5f0160208101906110c89190611e8a565b63ffffffff908116825260208083019390935260409182015f90812091851681529083528190208151808301835281546001600160a01b03168152600182018054845181870281018701909552808552919492938584019390929083018282801561115057602002820191905f5260205f20905b81548152602001906001019080831161113c575b5050505050815250509150836001600160a01b0316825f01516001600160a01b0316036111805760019250611188565b60010161105f565b50816111a75760405163439cc0cd60e01b815260040160405180910390fd5b60208101515f5b8151811080156111be5750895181105b15611218578181815181106111d5576111d5611ce4565b60200260200101518a82815181106111ef576111ef611ce4565b602002602001018181516112039190611d0c565b9052508061121081611d1f565b9150506111ae565b50506001909301925061100e915050565b509298975050505050505050565b60605f6112637f0000000000000000000000000000000000000000000000000000000000000000610d7c565b9050805f8151811061127757611277611ce4565b016020908101516040516001600160f81b03199091169181019190915260210160405160208183030381529060405291505090565b5f60ff8216601f81111561049757604051632cd44ac360e21b815260040160405180910390fd5b60605f604183516112e491906120be565b1561130257604051634be6321b60e01b815260040160405180910390fd5b5f60418451611311919061200b565b9050806001600160401b0381111561132b5761132b61181f565b604051908082528060200260200182016040528015611354578160200160208202803683370190505b5092505f5b818110156114d657604080516041808252608082019092525f916020820181803683370190505090505f5b60418110156113ef57868161139a856041611d55565b6113a49190611d0c565b815181106113b4576113b4611ce4565b602001015160f81c60f81b8282815181106113d1576113d1611ce4565b60200101906001600160f81b03191690815f1a905350600101611384565b505f5f6113fc89846114e4565b90925090505f816004811115611414576114146120d1565b14158061142857506001600160a01b038216155b1561143b57505f94506114dd9350505050565b5f8411801561147f5750866114516001866120e5565b8151811061146157611461611ce4565b60200260200101516001600160a01b0316826001600160a01b031611155b1561149257505f94506114dd9350505050565b61149f828a855f19611523565b818785815181106114b2576114b2611ce4565b6001600160a01b039290921660209283029190910190910152505050600101611359565b5060019150505b9250929050565b5f5f8251604103611518576020830151604084015160608501515f1a61150c8782858561157b565b945094505050506114dd565b505f905060026114dd565b4281101561154457604051630819bdcd60e01b815260040160405180910390fd5b6115586001600160a01b0385168484611638565b61157557604051638baa579f60e01b815260040160405180910390fd5b50505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156115b057505f9050600361162f565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611601573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116611629575f6001925092505061162f565b91505f90505b94509492505050565b5f5f5f61164585856114e4565b90925090505f81600481111561165d5761165d6120d1565b14801561167b5750856001600160a01b0316826001600160a01b0316145b8061168c575061168c868686611696565b9695505050505050565b5f5f5f856001600160a01b0316631626ba7e60e01b86866040516024016116be9291906120f8565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516116fc9190612110565b5f60405180830381855afa9150503d805f8114611734576040519150601f19603f3d011682016040523d82523d5f602084013e611739565b606091505b509150915081801561174d57506020815110155b801561168c57508051630b135d3f60e11b906117729083016020908101908401612126565b149695505050505050565b5f6040828403121561178d575f5ffd5b50919050565b803563ffffffff811681146117a6575f5ffd5b919050565b5f5f606083850312156117bc575f5ffd5b6117c6848461177d565b91506117d460408401611793565b90509250929050565b602080825282518282018190525f918401906040840190835b818110156118145783518352602093840193909201916001016117f6565b509095945050505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561185b5761185b61181f565b604052919050565b6001600160a01b0381168114611877575f5ffd5b50565b5f6040828403121561188a575f5ffd5b604080519081016001600160401b03811182821017156118ac576118ac61181f565b60405290508082356118bd81611863565b81526118cb60208401611793565b60208201525092915050565b5f5f5f608084860312156118e9575f5ffd5b6118f3858561187a565b925061190160408501611793565b915061190f60608501611793565b90509250925092565b80516001600160a01b03168252602080820151604082850181905281519085018190525f929190910190829060608601905b80831015610a4f578351825260208201915060208401935060018301925061194a565b602081525f6105c96020830184611918565b5f5f60408385031215611990575f5ffd5b61199983611793565b946020939093013593505050565b5f5f606083850312156119b8575f5ffd5b6117c6848461187a565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105c960208301846119c2565b5f5f83601f840112611a12575f5ffd5b5081356001600160401b03811115611a28575f5ffd5b6020830191508360208260051b85010111156114dd575f5ffd5b5f5f5f5f5f60c08688031215611a56575f5ffd5b611a60878761177d565b9450611a6e60408701611793565b935060608601356001600160401b03811115611a88575f5ffd5b611a9488828901611a02565b9094509250611aa89050876080880161177d565b90509295509295909350565b5f60408284031215611ac4575f5ffd5b6105c9838361187a565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015611b2557603f19878603018452611b10858351611918565b94506020938401939190910190600101611af4565b50929695505050505050565b5f6060828403121561178d575f5ffd5b5f5f60608385031215611b52575f5ffd5b611b5c848461177d565b915060408301356001600160401b03811115611b76575f5ffd5b611b8285828601611b31565b9150509250929050565b5f5f5f60808486031215611b9e575f5ffd5b611ba8858561177d565b925060408401356001600160401b03811115611bc2575f5ffd5b611bce86828701611b31565b92505060608401356001600160401b03811115611be9575f5ffd5b8401601f81018613611bf9575f5ffd5b80356001600160401b03811115611c1257611c1261181f565b8060051b611c2260208201611833565b91825260208184018101929081019089841115611c3d575f5ffd5b6020850194505b83851015611c5f578435825260209485019490910190611c44565b80955050505050509250925092565b5f5f5f5f60808587031215611c81575f5ffd5b611c8b868661177d565b935060408501356001600160401b03811115611ca5575f5ffd5b611cb187828801611b31565b93505060608501356001600160401b03811115611ccc575f5ffd5b611cd887828801611a02565b95989497509550505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561049757610497611cf8565b5f60018201611d3057611d30611cf8565b5060010190565b5f8235603e19833603018112611d4b575f5ffd5b9190910192915050565b808202811582820484141761049757610497611cf8565b8135611d7781611863565b81546001600160a01b0319166001600160a01b0391909116178155602082013536839003601e19018112611da9575f5ffd5b820180356001600160401b03811115611dc0575f5ffd5b6020820191508060051b3603821315611dd7575f5ffd5b600183016001600160401b03821115611df257611df261181f565b68010000000000000000821115611e0b57611e0b61181f565b805482825580831015611e40575f828152602090208381019082015b80821015611e3d575f8255600182019150611e27565b50505b505f90815260208120905b82811015611e6757833582820155602090930192600101611e4b565b505050505050565b5f60208284031215611e7f575f5ffd5b81356105c981611863565b5f60208284031215611e9a575f5ffd5b6105c982611793565b5f608082018635611eb381611863565b6001600160a01b0316835263ffffffff611ecf60208901611793565b16602084015263ffffffff861660408401526080606084015283905260a0600584901b83018101908301855f603e1936839003015b87821015611fc757868503609f190184528235818112611f22575f5ffd5b89018035611f2f81611863565b6001600160a01b03168652602081013536829003601e19018112611f51575f5ffd5b016020810190356001600160401b03811115611f6b575f5ffd5b8060051b803603831315611f7d575f5ffd5b60406020890181905288018290526001600160fb1b03821115611f9e575f5ffd5b808360608a01376060818901019750505050602083019250602084019350600182019150611f04565b50929998505050505050505050565b5f60208284031215611fe6575f5ffd5b813561ffff811681146105c9575f5ffd5b634e487b7160e01b5f52601260045260245ffd5b5f8261201957612019611ff7565b500490565b8051602080830151919081101561178d575f1960209190910360031b1b16919050565b63ffffffff818116838216019081111561049757610497611cf8565b5f6020828403121561206d575f5ffd5b815180151581146105c9575f5ffd5b5f5f8335601e19843603018112612091575f5ffd5b8301803591506001600160401b038211156120aa575f5ffd5b6020019150368190038213156114dd575f5ffd5b5f826120cc576120cc611ff7565b500690565b634e487b7160e01b5f52602160045260245ffd5b8181038181111561049757610497611cf8565b828152604060208201525f61063760408301846119c2565b5f82518060208501845e5f920191825250919050565b5f60208284031215612136575f5ffd5b505191905056fea26469706673582212200bbcbd6931eb1e4b9a88e51b2b31dcb43cd54bebcc7cdbde1c749c08e86239a464736f6c634300081b0033",
+ Bin: "0x60c060405234801561000f575f5ffd5b5060405161244038038061244083398101604081905261002e9161016d565b6001600160a01b03821660805280806100468161005b565b60a0525061005490506100a1565b5050610297565b5f5f829050601f8151111561008e578260405163305a27a960e01b8152600401610085919061023c565b60405180910390fd5b805161009982610271565b179392505050565b5f54610100900460ff16156101085760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401610085565b5f5460ff90811614610157575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b634e487b7160e01b5f52604160045260245ffd5b5f5f6040838503121561017e575f5ffd5b82516001600160a01b0381168114610194575f5ffd5b60208401519092506001600160401b038111156101af575f5ffd5b8301601f810185136101bf575f5ffd5b80516001600160401b038111156101d8576101d8610159565b604051601f8201601f19908116603f011681016001600160401b038111828210171561020657610206610159565b60405281815282820160200187101561021d575f5ffd5b8160208401602083015e5f602083830101528093505050509250929050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80516020808301519190811015610291575f198160200360031b1b821691505b50919050565b60805160a0516121736102cd5f395f8181610679015261123f01525f81816101db015281816106ad0152610e7401526121735ff3fe608060405234801561000f575f5ffd5b50600436106100f0575f3560e01c80636141879e1161009357806384818920116100635780638481892014610248578063be86e0b21461025b578063c0da24201461027e578063f698da2514610291575f5ffd5b80636141879e146101c357806368d6e081146101d65780637c85ac4c1461021557806380c7d3f314610235575f5ffd5b806323c2a3cb116100ce57806323c2a3cb1461015e57806354fd4d501461018657806356d482f51461019b5780635ddb9b5b146101b0575f5ffd5b806304cdbae4146100f4578063082ef73d1461011d578063184674341461013d575b5f5ffd5b6101076101023660046117ab565b610299565b60405161011491906117dd565b60405180910390f35b61013061012b3660046118d7565b61049d565b604051610114919061196d565b61015061014b36600461197f565b6105d0565b604051908152602001610114565b61017161016c3660046119a7565b61063f565b60405163ffffffff9091168152602001610114565b61018e610672565b60405161011491906119f0565b6101ae6101a9366004611a42565b6106a2565b005b6101716101be366004611ab4565b61089f565b6101716101d1366004611ab4565b6108c5565b6101fd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610114565b6102286102233660046119a7565b6108eb565b6040516101149190611ace565b610107610243366004611b41565b610a59565b6101fd610256366004611ab4565b610a65565b61026e610269366004611b8c565b610a8e565b6040519015158152602001610114565b61026e61028c366004611c6e565b610b21565b610150610c13565b60605f6102b36102ae36869003860186611ab4565b610cd3565b5f8181526003602052604090205490915063ffffffff8481169116146102ec57604051630cad17b760e31b815260040160405180910390fd5b5f81815260046020908152604080832063ffffffff871684529091529020548061032957604051630cad17b760e31b815260040160405180910390fd5b5f82815260056020908152604080832063ffffffff88168452825280832083805290915281206001015490816001600160401b0381111561036c5761036c61181f565b604051908082528060200260200182016040528015610395578160200160208202803683370190505b5090505f5b83811015610490575f85815260056020908152604080832063ffffffff808c168552908352818420908516845282528083206001018054825181850281018501909352808352919290919083018282801561041257602002820191905f5260205f20905b8154815260200190600101908083116103fe575b509394505f93505050505b81518110801561042c57508481105b156104865781818151811061044357610443611ce4565b602002602001015184828151811061045d5761045d611ce4565b602002602001018181516104719190611d0c565b9052508061047e81611d1f565b91505061041d565b505060010161039a565b5093505050505b92915050565b604080518082019091525f8152606060208201525f6104bb85610cd3565b5f81815260046020908152604080832063ffffffff808a1685529252909120549192508416106105315760405162461bcd60e51b815260206004820152601c60248201527f4f70657261746f7220696e646578206f7574206f6620626f756e647300000000604482015260640160405180910390fd5b5f81815260056020908152604080832063ffffffff808916855290835281842090871684528252918290208251808401845281546001600160a01b03168152600182018054855181860281018601909652808652919492938581019392908301828280156105bc57602002820191905f5260205f20905b8154815260200190600101908083116105a8575b5050505050815250509150505b9392505050565b604080517fda346acb3ce99e7c5132bf8cafb159ad8085970ebfdba78007ef0fe163063d14602082015263ffffffff841691810191909152606081018290525f90819060800160405160208183030381529060405280519060200120905061063781610d36565b949350505050565b5f5f61064a84610cd3565b5f90815260046020908152604080832063ffffffff8716845290915290205491505092915050565b606061069d7f0000000000000000000000000000000000000000000000000000000000000000610d7c565b905090565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106eb5760405163030c1b6b60e11b815260040160405180910390fd5b5f6106fe6102ae36889003880188611ab4565b5f8181526003602052604090205490915063ffffffff9081169086161161073857604051632f20889f60e01b815260040160405180910390fd5b5f81815260046020908152604080832063ffffffff8916845290915281208490555b838110156107c45784848281811061077457610774611ce4565b90506020028101906107869190611d37565b5f83815260056020908152604080832063ffffffff808c168552908352818420908616845290915290206107ba8282611d6c565b505060010161075a565b505f818152600360209081526040909120805463ffffffff191663ffffffff88161790556107f490830183611e6f565b5f8281526001602090815260409182902080546001600160a01b0319166001600160a01b03949094169390931790925561083391908401908401611e8a565b5f8281526002602052604090819020805463ffffffff191663ffffffff9390931692909217909155517f4f588da9ec57976194a79b5594f8f8782923d93013df2b9ed12fe125805011ef9061088f908890889088908890611ea3565b60405180910390a1505050505050565b5f5f6108aa83610cd3565b5f9081526003602052604090205463ffffffff169392505050565b5f5f6108d083610cd3565b5f9081526002602052604090205463ffffffff169392505050565b60605f6108f784610cd3565b5f81815260046020908152604080832063ffffffff8089168552925282205492935082166001600160401b038111156109325761093261181f565b60405190808252806020026020018201604052801561097757816020015b604080518082019091525f8152606060208201528152602001906001900390816109505790505b5090505f5b8263ffffffff168163ffffffff161015610a4f575f84815260056020908152604080832063ffffffff808b16855290835281842090851684528252918290208251808401845281546001600160a01b0316815260018201805485518186028101860190965280865291949293858101939290830182828015610a1b57602002820191905f5260205f20905b815481526020019060010190808311610a07575b505050505081525050828263ffffffff1681518110610a3c57610a3c611ce4565b602090810291909101015260010161097c565b5095945050505050565b60606105c98383610db9565b5f5f610a7083610cd3565b5f908152600160205260409020546001600160a01b03169392505050565b5f5f610a9a8585610db9565b90508251815114610abe5760405163512509d360e11b815260040160405180910390fd5b5f5b8151811015610b1557838181518110610adb57610adb611ce4565b6020026020010151828281518110610af557610af5611ce4565b60200260200101511015610b0d575f925050506105c9565b600101610ac0565b50600195945050505050565b5f5f610b2d8686610db9565b90505f610b41876101026020890189611e8a565b82519091508414610b655760405163512509d360e11b815260040160405180910390fd5b5f5b8251811015610c05575f612710878784818110610b8657610b86611ce4565b9050602002016020810190610b9b9190611fd6565b61ffff16848481518110610bb157610bb1611ce4565b6020026020010151610bc39190611d55565b610bcd919061200b565b905080848381518110610be257610be2611ce4565b60200260200101511015610bfc575f945050505050610637565b50600101610b67565b506001979650505050505050565b60408051808201909152600a81526922b4b3b2b72630bcb2b960b11b6020909101525f7f91ab3d17e3a50a9d89e63fd30b92be7f5336b03b287bb946787a83a9d62a27667f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea610c80611237565b8051602091820120604051610cb8949392309101938452602084019290925260408301526001600160a01b0316606082015260800190565b60405160208183030381529060405280519060200120905090565b5f815f0151826020015163ffffffff16604051602001610d1e92919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b6040516020818303038152906040526104979061201e565b5f610d3f610c13565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b60605f610d88836112ac565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b60605f610dce6102ae36869003860186611ab4565b5f8181526002602090815260409091205491925063ffffffff90911690610df790850185611e8a565b610e019190612041565b63ffffffff16421115610e275760405163640fcd6b60e11b815260040160405180910390fd5b610e346020840184611e8a565b5f8281526003602052604090205463ffffffff908116911614610e6a57604051630cad17b760e31b815260040160405180910390fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166364e1df84610ea66020860186611e8a565b6040516001600160e01b031960e084901b16815263ffffffff919091166004820152602401602060405180830381865afa158015610ee6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f0a919061205d565b610f2757604051631b14174b60e01b815260040160405180910390fd5b5f610f39856101026020870187611e8a565b90505f81516001600160401b03811115610f5557610f5561181f565b604051908082528060200260200182016040528015610f7e578160200160208202803683370190505b5090505f610f9c610f926020880188611e8a565b87602001356105d0565b90505f80610fea83610fb160408b018b61207c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506112d392505050565b915091508061100c5760405163439cc0cd60e01b815260040160405180910390fd5b5f5b8251811015611229575f83828151811061102a5761102a611ce4565b602002602001015190505f5f905061105d60405180604001604052805f6001600160a01b03168152602001606081525090565b5f5b60045f8c81526020019081526020015f205f8e5f0160208101906110839190611e8a565b63ffffffff1663ffffffff1681526020019081526020015f20548110156111885760055f8c81526020019081526020015f205f8e5f0160208101906110c89190611e8a565b63ffffffff908116825260208083019390935260409182015f90812091851681529083528190208151808301835281546001600160a01b03168152600182018054845181870281018701909552808552919492938584019390929083018282801561115057602002820191905f5260205f20905b81548152602001906001019080831161113c575b5050505050815250509150836001600160a01b0316825f01516001600160a01b0316036111805760019250611188565b60010161105f565b50816111a75760405163439cc0cd60e01b815260040160405180910390fd5b60208101515f5b8151811080156111be5750895181105b15611218578181815181106111d5576111d5611ce4565b60200260200101518a82815181106111ef576111ef611ce4565b602002602001018181516112039190611d0c565b9052508061121081611d1f565b9150506111ae565b50506001909301925061100e915050565b509298975050505050505050565b60605f6112637f0000000000000000000000000000000000000000000000000000000000000000610d7c565b9050805f8151811061127757611277611ce4565b016020908101516040516001600160f81b03199091169181019190915260210160405160208183030381529060405291505090565b5f60ff8216601f81111561049757604051632cd44ac360e21b815260040160405180910390fd5b60605f604183516112e491906120be565b1561130257604051634be6321b60e01b815260040160405180910390fd5b5f60418451611311919061200b565b9050806001600160401b0381111561132b5761132b61181f565b604051908082528060200260200182016040528015611354578160200160208202803683370190505b5092505f5b818110156114d657604080516041808252608082019092525f916020820181803683370190505090505f5b60418110156113ef57868161139a856041611d55565b6113a49190611d0c565b815181106113b4576113b4611ce4565b602001015160f81c60f81b8282815181106113d1576113d1611ce4565b60200101906001600160f81b03191690815f1a905350600101611384565b505f5f6113fc89846114e4565b90925090505f816004811115611414576114146120d1565b14158061142857506001600160a01b038216155b1561143b57505f94506114dd9350505050565b5f8411801561147f5750866114516001866120e5565b8151811061146157611461611ce4565b60200260200101516001600160a01b0316826001600160a01b031611155b1561149257505f94506114dd9350505050565b61149f828a855f19611523565b818785815181106114b2576114b2611ce4565b6001600160a01b039290921660209283029190910190910152505050600101611359565b5060019150505b9250929050565b5f5f8251604103611518576020830151604084015160608501515f1a61150c8782858561157b565b945094505050506114dd565b505f905060026114dd565b4281101561154457604051630819bdcd60e01b815260040160405180910390fd5b6115586001600160a01b0385168484611638565b61157557604051638baa579f60e01b815260040160405180910390fd5b50505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156115b057505f9050600361162f565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611601573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116611629575f6001925092505061162f565b91505f90505b94509492505050565b5f5f5f61164585856114e4565b90925090505f81600481111561165d5761165d6120d1565b14801561167b5750856001600160a01b0316826001600160a01b0316145b8061168c575061168c868686611696565b9695505050505050565b5f5f5f856001600160a01b0316631626ba7e60e01b86866040516024016116be9291906120f8565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516116fc9190612110565b5f60405180830381855afa9150503d805f8114611734576040519150601f19603f3d011682016040523d82523d5f602084013e611739565b606091505b509150915081801561174d57506020815110155b801561168c57508051630b135d3f60e11b906117729083016020908101908401612126565b149695505050505050565b5f6040828403121561178d575f5ffd5b50919050565b803563ffffffff811681146117a6575f5ffd5b919050565b5f5f606083850312156117bc575f5ffd5b6117c6848461177d565b91506117d460408401611793565b90509250929050565b602080825282518282018190525f918401906040840190835b818110156118145783518352602093840193909201916001016117f6565b509095945050505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561185b5761185b61181f565b604052919050565b6001600160a01b0381168114611877575f5ffd5b50565b5f6040828403121561188a575f5ffd5b604080519081016001600160401b03811182821017156118ac576118ac61181f565b60405290508082356118bd81611863565b81526118cb60208401611793565b60208201525092915050565b5f5f5f608084860312156118e9575f5ffd5b6118f3858561187a565b925061190160408501611793565b915061190f60608501611793565b90509250925092565b80516001600160a01b03168252602080820151604082850181905281519085018190525f929190910190829060608601905b80831015610a4f578351825260208201915060208401935060018301925061194a565b602081525f6105c96020830184611918565b5f5f60408385031215611990575f5ffd5b61199983611793565b946020939093013593505050565b5f5f606083850312156119b8575f5ffd5b6117c6848461187a565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105c960208301846119c2565b5f5f83601f840112611a12575f5ffd5b5081356001600160401b03811115611a28575f5ffd5b6020830191508360208260051b85010111156114dd575f5ffd5b5f5f5f5f5f60c08688031215611a56575f5ffd5b611a60878761177d565b9450611a6e60408701611793565b935060608601356001600160401b03811115611a88575f5ffd5b611a9488828901611a02565b9094509250611aa89050876080880161177d565b90509295509295909350565b5f60408284031215611ac4575f5ffd5b6105c9838361187a565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015611b2557603f19878603018452611b10858351611918565b94506020938401939190910190600101611af4565b50929695505050505050565b5f6060828403121561178d575f5ffd5b5f5f60608385031215611b52575f5ffd5b611b5c848461177d565b915060408301356001600160401b03811115611b76575f5ffd5b611b8285828601611b31565b9150509250929050565b5f5f5f60808486031215611b9e575f5ffd5b611ba8858561177d565b925060408401356001600160401b03811115611bc2575f5ffd5b611bce86828701611b31565b92505060608401356001600160401b03811115611be9575f5ffd5b8401601f81018613611bf9575f5ffd5b80356001600160401b03811115611c1257611c1261181f565b8060051b611c2260208201611833565b91825260208184018101929081019089841115611c3d575f5ffd5b6020850194505b83851015611c5f578435825260209485019490910190611c44565b80955050505050509250925092565b5f5f5f5f60808587031215611c81575f5ffd5b611c8b868661177d565b935060408501356001600160401b03811115611ca5575f5ffd5b611cb187828801611b31565b93505060608501356001600160401b03811115611ccc575f5ffd5b611cd887828801611a02565b95989497509550505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561049757610497611cf8565b5f60018201611d3057611d30611cf8565b5060010190565b5f8235603e19833603018112611d4b575f5ffd5b9190910192915050565b808202811582820484141761049757610497611cf8565b8135611d7781611863565b81546001600160a01b0319166001600160a01b0391909116178155602082013536839003601e19018112611da9575f5ffd5b820180356001600160401b03811115611dc0575f5ffd5b6020820191508060051b3603821315611dd7575f5ffd5b600183016001600160401b03821115611df257611df261181f565b68010000000000000000821115611e0b57611e0b61181f565b805482825580831015611e40575f828152602090208381019082015b80821015611e3d575f8255600182019150611e27565b50505b505f90815260208120905b82811015611e6757833582820155602090930192600101611e4b565b505050505050565b5f60208284031215611e7f575f5ffd5b81356105c981611863565b5f60208284031215611e9a575f5ffd5b6105c982611793565b5f608082018635611eb381611863565b6001600160a01b0316835263ffffffff611ecf60208901611793565b16602084015263ffffffff861660408401526080606084015283905260a0600584901b83018101908301855f603e1936839003015b87821015611fc757868503609f190184528235818112611f22575f5ffd5b89018035611f2f81611863565b6001600160a01b03168652602081013536829003601e19018112611f51575f5ffd5b016020810190356001600160401b03811115611f6b575f5ffd5b8060051b803603831315611f7d575f5ffd5b60406020890181905288018290526001600160fb1b03821115611f9e575f5ffd5b808360608a01376060818901019750505050602083019250602084019350600182019150611f04565b50929998505050505050505050565b5f60208284031215611fe6575f5ffd5b813561ffff811681146105c9575f5ffd5b634e487b7160e01b5f52601260045260245ffd5b5f8261201957612019611ff7565b500490565b8051602080830151919081101561178d575f1960209190910360031b1b16919050565b63ffffffff818116838216019081111561049757610497611cf8565b5f6020828403121561206d575f5ffd5b815180151581146105c9575f5ffd5b5f5f8335601e19843603018112612091575f5ffd5b8301803591506001600160401b038211156120aa575f5ffd5b6020019150368190038213156114dd575f5ffd5b5f826120cc576120cc611ff7565b500690565b634e487b7160e01b5f52602160045260245ffd5b8181038181111561049757610497611cf8565b828152604060208201525f61063760408301846119c2565b5f82518060208501845e5f920191825250919050565b5f60208284031215612136575f5ffd5b505191905056fea2646970667358221220c93352236b0ae149893fb737267a372ff12bd72f76c9a38903add33d01fca41a64736f6c634300081b0033",
}
// ECDSACertificateVerifierABI is the input ABI used to generate the binding from.
diff --git a/pkg/bindings/ECDSATableCalculator/binding.go b/pkg/bindings/ECDSATableCalculator/binding.go
new file mode 100644
index 0000000000..ce0ede4995
--- /dev/null
+++ b/pkg/bindings/ECDSATableCalculator/binding.go
@@ -0,0 +1,580 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package ECDSATableCalculator
+
+import (
+ "errors"
+ "math/big"
+ "strings"
+
+ ethereum "github.com/ethereum/go-ethereum"
+ "github.com/ethereum/go-ethereum/accounts/abi"
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+ _ = errors.New
+ _ = big.NewInt
+ _ = strings.NewReader
+ _ = ethereum.NotFound
+ _ = bind.Bind
+ _ = common.Big1
+ _ = types.BloomLookup
+ _ = event.NewSubscription
+ _ = abi.ConvertType
+)
+
+// IECDSATableCalculatorTypesECDSAOperatorInfo is an auto generated low-level Go binding around an user-defined struct.
+type IECDSATableCalculatorTypesECDSAOperatorInfo struct {
+ Pubkey common.Address
+ Weights []*big.Int
+}
+
+// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
+type OperatorSet struct {
+ Avs common.Address
+ Id uint32
+}
+
+// ECDSATableCalculatorMetaData contains all meta data concerning the ECDSATableCalculator contract.
+var ECDSATableCalculatorMetaData = &bind.MetaData{
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_keyRegistrar\",\"type\":\"address\",\"internalType\":\"contractIKeyRegistrar\"},{\"name\":\"_allocationManager\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"},{\"name\":\"_LOOKAHEAD_BLOCKS\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"LOOKAHEAD_BLOCKS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allocationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorTable\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"operatorInfos\",\"type\":\"tuple[]\",\"internalType\":\"structIECDSATableCalculatorTypes.ECDSAOperatorInfo[]\",\"components\":[{\"name\":\"pubkey\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorTableBytes\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"operatorTableBytes\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorWeight\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"weight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorWeights\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"weights\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"keyRegistrar\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIKeyRegistrar\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"LookaheadBlocksSet\",\"inputs\":[{\"name\":\"lookaheadBlocks\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"LookaheadBlocksTooHigh\",\"inputs\":[]}]",
+ Bin: "0x60e060405234801561000f575f5ffd5b5060405161108938038061108983398101604081905261002e91610060565b6001600160a01b03928316608052911660a05260c0526100a0565b6001600160a01b038116811461005d575f5ffd5b50565b5f5f5f60608486031215610072575f5ffd5b835161007d81610049565b602085015190935061008e81610049565b80925050604084015190509250925092565b60805160a05160c051610f966100f35f395f818161012801526103de01525f8181610170015281816102890152818161031901526103b101525f818160c90152818161070e01526107ba0152610f965ff3fe608060405234801561000f575f5ffd5b506004361061007a575f3560e01c806341ee6d0e1161005857806341ee6d0e146101035780635e120ffc1461012357806371ca71d91461014a578063ca8aa7c71461016b575f5ffd5b80631088794a1461007e578063124c87e0146100a45780633ec45c7e146100c4575b5f5ffd5b61009161008c366004610951565b610192565b6040519081526020015b60405180910390f35b6100b76100b2366004610987565b610232565b60405161009b91906109e2565b6100eb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161009b565b610116610111366004610987565b61023d565b60405161009b9190610a65565b6100917f000000000000000000000000000000000000000000000000000000000000000081565b61015d610158366004610987565b61026e565b60405161009b929190610ad3565b6100eb7f000000000000000000000000000000000000000000000000000000000000000081565b5f5f5f61019e85610283565b90925090505f5b825181101561022557846001600160a01b03168382815181106101ca576101ca610b48565b60200260200101516001600160a01b03160361021d578181815181106101f2576101f2610b48565b60200260200101515f8151811061020b5761020b610b48565b6020026020010151935050505061022c565b6001016101a5565b505f925050505b92915050565b606061022c82610640565b606061024882610640565b60405160200161025891906109e2565b6040516020818303038152906040529050919050565b60608061027a83610283565b91509150915091565b6060805f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636e875dba856040518263ffffffff1660e01b81526004016102d39190610b95565b5f60405180830381865afa1580156102ed573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526103149190810190610c0b565b90505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634177a87c866040518263ffffffff1660e01b81526004016103639190610b95565b5f60405180830381865afa15801561037d573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526103a49190810190610caa565b90505f6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016632bab2c4a8785856104037f000000000000000000000000000000000000000000000000000000000000000043610d4e565b6040518563ffffffff1660e01b81526004016104229493929190610d61565b5f60405180830381865afa15801561043c573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526104639190810190610dda565b9050825167ffffffffffffffff81111561047f5761047f610ba3565b6040519080825280602002602001820160405280156104a8578160200160208202803683370190505b509450825167ffffffffffffffff8111156104c5576104c5610ba3565b6040519080825280602002602001820160405280156104f857816020015b60608152602001906001900390816104e35790505b5093505f805b8451811015610630575f805b855181101561055b5784838151811061052557610525610b48565b6020026020010151818151811061053e5761053e610b48565b6020026020010151826105519190610d4e565b915060010161050a565b5080156106275760408051600180825281830190925290602080830190803683370190505087848151811061059257610592610b48565b6020026020010181905250808784815181106105b0576105b0610b48565b60200260200101515f815181106105c9576105c9610b48565b6020026020010181815250508582815181106105e7576105e7610b48565b602002602001015188848151811061060157610601610b48565b6001600160a01b03909216602092830291909101909101528261062381610ee8565b9350505b506001016104fe565b5080865280855250505050915091565b60605f5f61064d84610283565b9150915080515f0361069e57604080515f8082526020820190925290610695565b604080518082019091525f81526060602082015281526020019060019003908161066e5790505b50949350505050565b815167ffffffffffffffff8111156106b8576106b8610ba3565b6040519080825280602002602001820160405280156106fd57816020015b604080518082019091525f8152606060208201528152602001906001900390816106d65790505b5092505f805b83518110156108cc577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663bd30a0b98786848151811061074e5761074e610b48565b60200260200101516040518363ffffffff1660e01b8152600401610773929190610f00565b602060405180830381865afa15801561078e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b29190610f26565b156108c4575f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633b32a7bd888785815181106107fa576107fa610b48565b60200260200101516040518363ffffffff1660e01b815260040161081f929190610f00565b602060405180830381865afa15801561083a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061085e9190610f45565b90506040518060400160405280826001600160a01b0316815260200185848151811061088c5761088c610b48565b60200260200101518152508684815181106108a9576108a9610b48565b602002602001018190525082806108bf90610ee8565b935050505b600101610703565b50805f0361091a57604080515f8082526020820190925290610910565b604080518082019091525f8152606060208201528152602001906001900390816108e95790505b5095945050505050565b8352509092915050565b5f60408284031215610934575f5ffd5b50919050565b6001600160a01b038116811461094e575f5ffd5b50565b5f5f60608385031215610962575f5ffd5b61096c8484610924565b9150604083013561097c8161093a565b809150509250929050565b5f60408284031215610997575f5ffd5b6109a18383610924565b9392505050565b5f8151808452602084019350602083015f5b828110156109d85781518652602095860195909101906001016109ba565b5093949350505050565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015610a5957868503603f19018452815180516001600160a01b03168652602090810151604091870182905290610a43908701826109a8565b9550506020938401939190910190600101610a08565b50929695505050505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f8151808452602084019350602083015f5b828110156109d85781516001600160a01b0316865260209586019590910190600101610aac565b604081525f610ae56040830185610a9a565b828103602084015280845180835260208301915060208160051b840101602087015f5b83811015610b3a57601f19868403018552610b248383516109a8565b6020958601959093509190910190600101610b08565b509098975050505050505050565b634e487b7160e01b5f52603260045260245ffd5b8035610b678161093a565b6001600160a01b03168252602081013563ffffffff8116808214610b89575f5ffd5b80602085015250505050565b6040810161022c8284610b5c565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610be057610be0610ba3565b604052919050565b5f67ffffffffffffffff821115610c0157610c01610ba3565b5060051b60200190565b5f60208284031215610c1b575f5ffd5b815167ffffffffffffffff811115610c31575f5ffd5b8201601f81018413610c41575f5ffd5b8051610c54610c4f82610be8565b610bb7565b8082825260208201915060208360051b850101925086831115610c75575f5ffd5b6020840193505b82841015610ca0578351610c8f8161093a565b825260209384019390910190610c7c565b9695505050505050565b5f60208284031215610cba575f5ffd5b815167ffffffffffffffff811115610cd0575f5ffd5b8201601f81018413610ce0575f5ffd5b8051610cee610c4f82610be8565b8082825260208201915060208360051b850101925086831115610d0f575f5ffd5b6020840193505b82841015610ca0578351610d298161093a565b825260209384019390910190610d16565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561022c5761022c610d3a565b610d6b8186610b5c565b60a060408201525f610d8060a0830186610a9a565b8281036060840152845180825260208087019201905f5b81811015610dbe5783516001600160a01b0316835260209384019390920191600101610d97565b5050809250505063ffffffff8316608083015295945050505050565b5f60208284031215610dea575f5ffd5b815167ffffffffffffffff811115610e00575f5ffd5b8201601f81018413610e10575f5ffd5b8051610e1e610c4f82610be8565b8082825260208201915060208360051b850101925086831115610e3f575f5ffd5b602084015b83811015610edd57805167ffffffffffffffff811115610e62575f5ffd5b8501603f81018913610e72575f5ffd5b6020810151610e83610c4f82610be8565b808282526020820191506020808460051b8601010192508b831115610ea6575f5ffd5b6040840193505b82841015610ec8578351825260209384019390910190610ead565b86525050602093840193919091019050610e44565b509695505050505050565b5f60018201610ef957610ef9610d3a565b5060010190565b60608101610f0e8285610b5c565b6001600160a01b039290921660409190910152919050565b5f60208284031215610f36575f5ffd5b815180151581146109a1575f5ffd5b5f60208284031215610f55575f5ffd5b81516109a18161093a56fea2646970667358221220a9a8b7ab79fd27d5486e0911871c7fe599d64614b9fd39a4a1e0d82b473e5bea64736f6c634300081b0033",
+}
+
+// ECDSATableCalculatorABI is the input ABI used to generate the binding from.
+// Deprecated: Use ECDSATableCalculatorMetaData.ABI instead.
+var ECDSATableCalculatorABI = ECDSATableCalculatorMetaData.ABI
+
+// ECDSATableCalculatorBin is the compiled bytecode used for deploying new contracts.
+// Deprecated: Use ECDSATableCalculatorMetaData.Bin instead.
+var ECDSATableCalculatorBin = ECDSATableCalculatorMetaData.Bin
+
+// DeployECDSATableCalculator deploys a new Ethereum contract, binding an instance of ECDSATableCalculator to it.
+func DeployECDSATableCalculator(auth *bind.TransactOpts, backend bind.ContractBackend, _keyRegistrar common.Address, _allocationManager common.Address, _LOOKAHEAD_BLOCKS *big.Int) (common.Address, *types.Transaction, *ECDSATableCalculator, error) {
+ parsed, err := ECDSATableCalculatorMetaData.GetAbi()
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ if parsed == nil {
+ return common.Address{}, nil, nil, errors.New("GetABI returned nil")
+ }
+
+ address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(ECDSATableCalculatorBin), backend, _keyRegistrar, _allocationManager, _LOOKAHEAD_BLOCKS)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &ECDSATableCalculator{ECDSATableCalculatorCaller: ECDSATableCalculatorCaller{contract: contract}, ECDSATableCalculatorTransactor: ECDSATableCalculatorTransactor{contract: contract}, ECDSATableCalculatorFilterer: ECDSATableCalculatorFilterer{contract: contract}}, nil
+}
+
+// ECDSATableCalculator is an auto generated Go binding around an Ethereum contract.
+type ECDSATableCalculator struct {
+ ECDSATableCalculatorCaller // Read-only binding to the contract
+ ECDSATableCalculatorTransactor // Write-only binding to the contract
+ ECDSATableCalculatorFilterer // Log filterer for contract events
+}
+
+// ECDSATableCalculatorCaller is an auto generated read-only Go binding around an Ethereum contract.
+type ECDSATableCalculatorCaller struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// ECDSATableCalculatorTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type ECDSATableCalculatorTransactor struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// ECDSATableCalculatorFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type ECDSATableCalculatorFilterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// ECDSATableCalculatorSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type ECDSATableCalculatorSession struct {
+ Contract *ECDSATableCalculator // Generic contract binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// ECDSATableCalculatorCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type ECDSATableCalculatorCallerSession struct {
+ Contract *ECDSATableCalculatorCaller // Generic contract caller binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// ECDSATableCalculatorTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type ECDSATableCalculatorTransactorSession struct {
+ Contract *ECDSATableCalculatorTransactor // Generic contract transactor binding to set the session for
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// ECDSATableCalculatorRaw is an auto generated low-level Go binding around an Ethereum contract.
+type ECDSATableCalculatorRaw struct {
+ Contract *ECDSATableCalculator // Generic contract binding to access the raw methods on
+}
+
+// ECDSATableCalculatorCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type ECDSATableCalculatorCallerRaw struct {
+ Contract *ECDSATableCalculatorCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// ECDSATableCalculatorTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type ECDSATableCalculatorTransactorRaw struct {
+ Contract *ECDSATableCalculatorTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewECDSATableCalculator creates a new instance of ECDSATableCalculator, bound to a specific deployed contract.
+func NewECDSATableCalculator(address common.Address, backend bind.ContractBackend) (*ECDSATableCalculator, error) {
+ contract, err := bindECDSATableCalculator(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &ECDSATableCalculator{ECDSATableCalculatorCaller: ECDSATableCalculatorCaller{contract: contract}, ECDSATableCalculatorTransactor: ECDSATableCalculatorTransactor{contract: contract}, ECDSATableCalculatorFilterer: ECDSATableCalculatorFilterer{contract: contract}}, nil
+}
+
+// NewECDSATableCalculatorCaller creates a new read-only instance of ECDSATableCalculator, bound to a specific deployed contract.
+func NewECDSATableCalculatorCaller(address common.Address, caller bind.ContractCaller) (*ECDSATableCalculatorCaller, error) {
+ contract, err := bindECDSATableCalculator(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &ECDSATableCalculatorCaller{contract: contract}, nil
+}
+
+// NewECDSATableCalculatorTransactor creates a new write-only instance of ECDSATableCalculator, bound to a specific deployed contract.
+func NewECDSATableCalculatorTransactor(address common.Address, transactor bind.ContractTransactor) (*ECDSATableCalculatorTransactor, error) {
+ contract, err := bindECDSATableCalculator(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &ECDSATableCalculatorTransactor{contract: contract}, nil
+}
+
+// NewECDSATableCalculatorFilterer creates a new log filterer instance of ECDSATableCalculator, bound to a specific deployed contract.
+func NewECDSATableCalculatorFilterer(address common.Address, filterer bind.ContractFilterer) (*ECDSATableCalculatorFilterer, error) {
+ contract, err := bindECDSATableCalculator(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &ECDSATableCalculatorFilterer{contract: contract}, nil
+}
+
+// bindECDSATableCalculator binds a generic wrapper to an already deployed contract.
+func bindECDSATableCalculator(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := ECDSATableCalculatorMetaData.GetAbi()
+ if err != nil {
+ return nil, err
+ }
+ return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_ECDSATableCalculator *ECDSATableCalculatorRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _ECDSATableCalculator.Contract.ECDSATableCalculatorCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_ECDSATableCalculator *ECDSATableCalculatorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _ECDSATableCalculator.Contract.ECDSATableCalculatorTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_ECDSATableCalculator *ECDSATableCalculatorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _ECDSATableCalculator.Contract.ECDSATableCalculatorTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_ECDSATableCalculator *ECDSATableCalculatorCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _ECDSATableCalculator.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_ECDSATableCalculator *ECDSATableCalculatorTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _ECDSATableCalculator.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_ECDSATableCalculator *ECDSATableCalculatorTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _ECDSATableCalculator.Contract.contract.Transact(opts, method, params...)
+}
+
+// LOOKAHEADBLOCKS is a free data retrieval call binding the contract method 0x5e120ffc.
+//
+// Solidity: function LOOKAHEAD_BLOCKS() view returns(uint256)
+func (_ECDSATableCalculator *ECDSATableCalculatorCaller) LOOKAHEADBLOCKS(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _ECDSATableCalculator.contract.Call(opts, &out, "LOOKAHEAD_BLOCKS")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// LOOKAHEADBLOCKS is a free data retrieval call binding the contract method 0x5e120ffc.
+//
+// Solidity: function LOOKAHEAD_BLOCKS() view returns(uint256)
+func (_ECDSATableCalculator *ECDSATableCalculatorSession) LOOKAHEADBLOCKS() (*big.Int, error) {
+ return _ECDSATableCalculator.Contract.LOOKAHEADBLOCKS(&_ECDSATableCalculator.CallOpts)
+}
+
+// LOOKAHEADBLOCKS is a free data retrieval call binding the contract method 0x5e120ffc.
+//
+// Solidity: function LOOKAHEAD_BLOCKS() view returns(uint256)
+func (_ECDSATableCalculator *ECDSATableCalculatorCallerSession) LOOKAHEADBLOCKS() (*big.Int, error) {
+ return _ECDSATableCalculator.Contract.LOOKAHEADBLOCKS(&_ECDSATableCalculator.CallOpts)
+}
+
+// AllocationManager is a free data retrieval call binding the contract method 0xca8aa7c7.
+//
+// Solidity: function allocationManager() view returns(address)
+func (_ECDSATableCalculator *ECDSATableCalculatorCaller) AllocationManager(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _ECDSATableCalculator.contract.Call(opts, &out, "allocationManager")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// AllocationManager is a free data retrieval call binding the contract method 0xca8aa7c7.
+//
+// Solidity: function allocationManager() view returns(address)
+func (_ECDSATableCalculator *ECDSATableCalculatorSession) AllocationManager() (common.Address, error) {
+ return _ECDSATableCalculator.Contract.AllocationManager(&_ECDSATableCalculator.CallOpts)
+}
+
+// AllocationManager is a free data retrieval call binding the contract method 0xca8aa7c7.
+//
+// Solidity: function allocationManager() view returns(address)
+func (_ECDSATableCalculator *ECDSATableCalculatorCallerSession) AllocationManager() (common.Address, error) {
+ return _ECDSATableCalculator.Contract.AllocationManager(&_ECDSATableCalculator.CallOpts)
+}
+
+// CalculateOperatorTable is a free data retrieval call binding the contract method 0x124c87e0.
+//
+// Solidity: function calculateOperatorTable((address,uint32) operatorSet) view returns((address,uint256[])[] operatorInfos)
+func (_ECDSATableCalculator *ECDSATableCalculatorCaller) CalculateOperatorTable(opts *bind.CallOpts, operatorSet OperatorSet) ([]IECDSATableCalculatorTypesECDSAOperatorInfo, error) {
+ var out []interface{}
+ err := _ECDSATableCalculator.contract.Call(opts, &out, "calculateOperatorTable", operatorSet)
+
+ if err != nil {
+ return *new([]IECDSATableCalculatorTypesECDSAOperatorInfo), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([]IECDSATableCalculatorTypesECDSAOperatorInfo)).(*[]IECDSATableCalculatorTypesECDSAOperatorInfo)
+
+ return out0, err
+
+}
+
+// CalculateOperatorTable is a free data retrieval call binding the contract method 0x124c87e0.
+//
+// Solidity: function calculateOperatorTable((address,uint32) operatorSet) view returns((address,uint256[])[] operatorInfos)
+func (_ECDSATableCalculator *ECDSATableCalculatorSession) CalculateOperatorTable(operatorSet OperatorSet) ([]IECDSATableCalculatorTypesECDSAOperatorInfo, error) {
+ return _ECDSATableCalculator.Contract.CalculateOperatorTable(&_ECDSATableCalculator.CallOpts, operatorSet)
+}
+
+// CalculateOperatorTable is a free data retrieval call binding the contract method 0x124c87e0.
+//
+// Solidity: function calculateOperatorTable((address,uint32) operatorSet) view returns((address,uint256[])[] operatorInfos)
+func (_ECDSATableCalculator *ECDSATableCalculatorCallerSession) CalculateOperatorTable(operatorSet OperatorSet) ([]IECDSATableCalculatorTypesECDSAOperatorInfo, error) {
+ return _ECDSATableCalculator.Contract.CalculateOperatorTable(&_ECDSATableCalculator.CallOpts, operatorSet)
+}
+
+// CalculateOperatorTableBytes is a free data retrieval call binding the contract method 0x41ee6d0e.
+//
+// Solidity: function calculateOperatorTableBytes((address,uint32) operatorSet) view returns(bytes operatorTableBytes)
+func (_ECDSATableCalculator *ECDSATableCalculatorCaller) CalculateOperatorTableBytes(opts *bind.CallOpts, operatorSet OperatorSet) ([]byte, error) {
+ var out []interface{}
+ err := _ECDSATableCalculator.contract.Call(opts, &out, "calculateOperatorTableBytes", operatorSet)
+
+ if err != nil {
+ return *new([]byte), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte)
+
+ return out0, err
+
+}
+
+// CalculateOperatorTableBytes is a free data retrieval call binding the contract method 0x41ee6d0e.
+//
+// Solidity: function calculateOperatorTableBytes((address,uint32) operatorSet) view returns(bytes operatorTableBytes)
+func (_ECDSATableCalculator *ECDSATableCalculatorSession) CalculateOperatorTableBytes(operatorSet OperatorSet) ([]byte, error) {
+ return _ECDSATableCalculator.Contract.CalculateOperatorTableBytes(&_ECDSATableCalculator.CallOpts, operatorSet)
+}
+
+// CalculateOperatorTableBytes is a free data retrieval call binding the contract method 0x41ee6d0e.
+//
+// Solidity: function calculateOperatorTableBytes((address,uint32) operatorSet) view returns(bytes operatorTableBytes)
+func (_ECDSATableCalculator *ECDSATableCalculatorCallerSession) CalculateOperatorTableBytes(operatorSet OperatorSet) ([]byte, error) {
+ return _ECDSATableCalculator.Contract.CalculateOperatorTableBytes(&_ECDSATableCalculator.CallOpts, operatorSet)
+}
+
+// GetOperatorWeight is a free data retrieval call binding the contract method 0x1088794a.
+//
+// Solidity: function getOperatorWeight((address,uint32) operatorSet, address operator) view returns(uint256 weight)
+func (_ECDSATableCalculator *ECDSATableCalculatorCaller) GetOperatorWeight(opts *bind.CallOpts, operatorSet OperatorSet, operator common.Address) (*big.Int, error) {
+ var out []interface{}
+ err := _ECDSATableCalculator.contract.Call(opts, &out, "getOperatorWeight", operatorSet, operator)
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// GetOperatorWeight is a free data retrieval call binding the contract method 0x1088794a.
+//
+// Solidity: function getOperatorWeight((address,uint32) operatorSet, address operator) view returns(uint256 weight)
+func (_ECDSATableCalculator *ECDSATableCalculatorSession) GetOperatorWeight(operatorSet OperatorSet, operator common.Address) (*big.Int, error) {
+ return _ECDSATableCalculator.Contract.GetOperatorWeight(&_ECDSATableCalculator.CallOpts, operatorSet, operator)
+}
+
+// GetOperatorWeight is a free data retrieval call binding the contract method 0x1088794a.
+//
+// Solidity: function getOperatorWeight((address,uint32) operatorSet, address operator) view returns(uint256 weight)
+func (_ECDSATableCalculator *ECDSATableCalculatorCallerSession) GetOperatorWeight(operatorSet OperatorSet, operator common.Address) (*big.Int, error) {
+ return _ECDSATableCalculator.Contract.GetOperatorWeight(&_ECDSATableCalculator.CallOpts, operatorSet, operator)
+}
+
+// GetOperatorWeights is a free data retrieval call binding the contract method 0x71ca71d9.
+//
+// Solidity: function getOperatorWeights((address,uint32) operatorSet) view returns(address[] operators, uint256[][] weights)
+func (_ECDSATableCalculator *ECDSATableCalculatorCaller) GetOperatorWeights(opts *bind.CallOpts, operatorSet OperatorSet) (struct {
+ Operators []common.Address
+ Weights [][]*big.Int
+}, error) {
+ var out []interface{}
+ err := _ECDSATableCalculator.contract.Call(opts, &out, "getOperatorWeights", operatorSet)
+
+ outstruct := new(struct {
+ Operators []common.Address
+ Weights [][]*big.Int
+ })
+ if err != nil {
+ return *outstruct, err
+ }
+
+ outstruct.Operators = *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address)
+ outstruct.Weights = *abi.ConvertType(out[1], new([][]*big.Int)).(*[][]*big.Int)
+
+ return *outstruct, err
+
+}
+
+// GetOperatorWeights is a free data retrieval call binding the contract method 0x71ca71d9.
+//
+// Solidity: function getOperatorWeights((address,uint32) operatorSet) view returns(address[] operators, uint256[][] weights)
+func (_ECDSATableCalculator *ECDSATableCalculatorSession) GetOperatorWeights(operatorSet OperatorSet) (struct {
+ Operators []common.Address
+ Weights [][]*big.Int
+}, error) {
+ return _ECDSATableCalculator.Contract.GetOperatorWeights(&_ECDSATableCalculator.CallOpts, operatorSet)
+}
+
+// GetOperatorWeights is a free data retrieval call binding the contract method 0x71ca71d9.
+//
+// Solidity: function getOperatorWeights((address,uint32) operatorSet) view returns(address[] operators, uint256[][] weights)
+func (_ECDSATableCalculator *ECDSATableCalculatorCallerSession) GetOperatorWeights(operatorSet OperatorSet) (struct {
+ Operators []common.Address
+ Weights [][]*big.Int
+}, error) {
+ return _ECDSATableCalculator.Contract.GetOperatorWeights(&_ECDSATableCalculator.CallOpts, operatorSet)
+}
+
+// KeyRegistrar is a free data retrieval call binding the contract method 0x3ec45c7e.
+//
+// Solidity: function keyRegistrar() view returns(address)
+func (_ECDSATableCalculator *ECDSATableCalculatorCaller) KeyRegistrar(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _ECDSATableCalculator.contract.Call(opts, &out, "keyRegistrar")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// KeyRegistrar is a free data retrieval call binding the contract method 0x3ec45c7e.
+//
+// Solidity: function keyRegistrar() view returns(address)
+func (_ECDSATableCalculator *ECDSATableCalculatorSession) KeyRegistrar() (common.Address, error) {
+ return _ECDSATableCalculator.Contract.KeyRegistrar(&_ECDSATableCalculator.CallOpts)
+}
+
+// KeyRegistrar is a free data retrieval call binding the contract method 0x3ec45c7e.
+//
+// Solidity: function keyRegistrar() view returns(address)
+func (_ECDSATableCalculator *ECDSATableCalculatorCallerSession) KeyRegistrar() (common.Address, error) {
+ return _ECDSATableCalculator.Contract.KeyRegistrar(&_ECDSATableCalculator.CallOpts)
+}
+
+// ECDSATableCalculatorLookaheadBlocksSetIterator is returned from FilterLookaheadBlocksSet and is used to iterate over the raw logs and unpacked data for LookaheadBlocksSet events raised by the ECDSATableCalculator contract.
+type ECDSATableCalculatorLookaheadBlocksSetIterator struct {
+ Event *ECDSATableCalculatorLookaheadBlocksSet // Event containing the contract specifics and raw log
+
+ contract *bind.BoundContract // Generic contract to use for unpacking event data
+ event string // Event name to use for unpacking event data
+
+ logs chan types.Log // Log channel receiving the found contract events
+ sub ethereum.Subscription // Subscription for errors, completion and termination
+ done bool // Whether the subscription completed delivering logs
+ fail error // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *ECDSATableCalculatorLookaheadBlocksSetIterator) Next() bool {
+ // If the iterator failed, stop iterating
+ if it.fail != nil {
+ return false
+ }
+ // If the iterator completed, deliver directly whatever's available
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(ECDSATableCalculatorLookaheadBlocksSet)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ default:
+ return false
+ }
+ }
+ // Iterator still in progress, wait for either a data or an error event
+ select {
+ case log := <-it.logs:
+ it.Event = new(ECDSATableCalculatorLookaheadBlocksSet)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ case err := <-it.sub.Err():
+ it.done = true
+ it.fail = err
+ return it.Next()
+ }
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *ECDSATableCalculatorLookaheadBlocksSetIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *ECDSATableCalculatorLookaheadBlocksSetIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// ECDSATableCalculatorLookaheadBlocksSet represents a LookaheadBlocksSet event raised by the ECDSATableCalculator contract.
+type ECDSATableCalculatorLookaheadBlocksSet struct {
+ LookaheadBlocks *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterLookaheadBlocksSet is a free log retrieval operation binding the contract event 0xa41e64dd47db91b61b43ccea8b57d75abfa496f23efc708c22753c4bc9d68842.
+//
+// Solidity: event LookaheadBlocksSet(uint256 lookaheadBlocks)
+func (_ECDSATableCalculator *ECDSATableCalculatorFilterer) FilterLookaheadBlocksSet(opts *bind.FilterOpts) (*ECDSATableCalculatorLookaheadBlocksSetIterator, error) {
+
+ logs, sub, err := _ECDSATableCalculator.contract.FilterLogs(opts, "LookaheadBlocksSet")
+ if err != nil {
+ return nil, err
+ }
+ return &ECDSATableCalculatorLookaheadBlocksSetIterator{contract: _ECDSATableCalculator.contract, event: "LookaheadBlocksSet", logs: logs, sub: sub}, nil
+}
+
+// WatchLookaheadBlocksSet is a free log subscription operation binding the contract event 0xa41e64dd47db91b61b43ccea8b57d75abfa496f23efc708c22753c4bc9d68842.
+//
+// Solidity: event LookaheadBlocksSet(uint256 lookaheadBlocks)
+func (_ECDSATableCalculator *ECDSATableCalculatorFilterer) WatchLookaheadBlocksSet(opts *bind.WatchOpts, sink chan<- *ECDSATableCalculatorLookaheadBlocksSet) (event.Subscription, error) {
+
+ logs, sub, err := _ECDSATableCalculator.contract.WatchLogs(opts, "LookaheadBlocksSet")
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+ // New log arrived, parse the event and forward to the user
+ event := new(ECDSATableCalculatorLookaheadBlocksSet)
+ if err := _ECDSATableCalculator.contract.UnpackLog(event, "LookaheadBlocksSet", log); err != nil {
+ return err
+ }
+ event.Raw = log
+
+ select {
+ case sink <- event:
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ }
+ }), nil
+}
+
+// ParseLookaheadBlocksSet is a log parse operation binding the contract event 0xa41e64dd47db91b61b43ccea8b57d75abfa496f23efc708c22753c4bc9d68842.
+//
+// Solidity: event LookaheadBlocksSet(uint256 lookaheadBlocks)
+func (_ECDSATableCalculator *ECDSATableCalculatorFilterer) ParseLookaheadBlocksSet(log types.Log) (*ECDSATableCalculatorLookaheadBlocksSet, error) {
+ event := new(ECDSATableCalculatorLookaheadBlocksSet)
+ if err := _ECDSATableCalculator.contract.UnpackLog(event, "LookaheadBlocksSet", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
diff --git a/pkg/bindings/KeyRegistrar/binding.go b/pkg/bindings/KeyRegistrar/binding.go
index 9ee88e1ea5..459070a1b0 100644
--- a/pkg/bindings/KeyRegistrar/binding.go
+++ b/pkg/bindings/KeyRegistrar/binding.go
@@ -50,7 +50,7 @@ type OperatorSet struct {
// KeyRegistrarMetaData contains all meta data concerning the KeyRegistrar contract.
var KeyRegistrarMetaData = &bind.MetaData{
ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_permissionController\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"},{\"name\":\"_allocationManager\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"},{\"name\":\"_version\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"BN254_KEY_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ECDSA_KEY_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allocationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkKey\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"configureOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"curveType\",\"type\":\"uint8\",\"internalType\":\"enumIKeyRegistrarTypes.CurveType\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterKey\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"encodeBN254KeyData\",\"inputs\":[{\"name\":\"g1Point\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"g2Point\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getBN254Key\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"g1Point\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"g2Point\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBN254KeyRegistrationMessageHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"keyData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getECDSAAddress\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getECDSAKey\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getECDSAKeyRegistrationMessageHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"keyAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getKeyHash\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetCurveType\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIKeyRegistrarTypes.CurveType\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isKeyGloballyRegistered\",\"inputs\":[{\"name\":\"keyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRegistered\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permissionController\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerKey\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"keyData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AggregateBN254KeyUpdated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"newAggregateKey\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"KeyDeregistered\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"curveType\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIKeyRegistrarTypes.CurveType\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"KeyRegistered\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"curveType\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIKeyRegistrarTypes.CurveType\"},{\"name\":\"pubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetConfigured\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"curveType\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIKeyRegistrarTypes.CurveType\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ConfigurationAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ECAddFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ECMulFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ECPairingFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpModFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCurveType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidKeyFormat\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidKeypair\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPermissions\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"KeyAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"KeyNotFound\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OperatorSetNotConfigured\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorStillSlashable\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ZeroAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroPubkey\",\"inputs\":[]}]",
- Bin: "0x60e060405234801561000f575f5ffd5b5060405161305f38038061305f83398101604081905261002e916100cb565b6001600160a01b03808316608052831660a052808061004c8161005a565b60c052506101fc9350505050565b5f5f829050601f8151111561008d578260405163305a27a960e01b815260040161008491906101a1565b60405180910390fd5b8051610098826101d6565b179392505050565b6001600160a01b03811681146100b4575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f606084860312156100dd575f5ffd5b83516100e8816100a0565b60208501519093506100f9816100a0565b60408501519092506001600160401b03811115610114575f5ffd5b8401601f81018613610124575f5ffd5b80516001600160401b0381111561013d5761013d6100b7565b604051601f8201601f19908116603f011681016001600160401b038111828210171561016b5761016b6100b7565b604052818152828201602001881015610182575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b805160208083015191908110156101f6575f198160200360031b1b821691505b50919050565b60805160a05160c051612e2461023b5f395f818161051501526116f601525f81816101b801526112e701525f818161031c015261064a0152612e245ff3fe608060405234801561000f575f5ffd5b5060043610610127575f3560e01c8063aa165c30116100a9578063d9f12db21161006e578063d9f12db214610351578063dab42d7e14610364578063ea0d814914610386578063ea194e2e14610399578063f698da25146103ac575f5ffd5b8063aa165c30146102ca578063b05c8f6d146102dd578063bd30a0b914610304578063ca8aa7c714610317578063d40cda161461033e575f5ffd5b806354fd4d50116100ef57806354fd4d50146102595780637690e395146102615780637cffe48c1461027457806387ab86f4146102945780639a43e3fb146102a9575f5ffd5b80630a6ac2641461012b578063166aa127146101535780633b32a7bd146101885780634657e26a146101b357806350435add146101da575b5f5ffd5b61013e610139366004612579565b6103b4565b60405190151581526020015b60405180910390f35b61017a7f991b0a3376ce87f8ecc5d70962279ac09cdce934e8b5b9683e73c8ff087c7f8181565b60405190815260200161014a565b61019b610196366004612579565b6104f0565b6040516001600160a01b03909116815260200161014a565b61019b7f000000000000000000000000000000000000000000000000000000000000000081565b61024c6101e83660046125fa565b8151602080840151835180519083015185840151805190850151604080519687019790975295850193909352606084810192909252608084015260a083019190915260c082019290925260e001604051602081830303815290604052905092915050565b60405161014a91906126a5565b61024c61050e565b61017a61026f3660046126f5565b61053e565b610287610282366004612753565b6105e6565b60405161014a91906127a1565b6102a76102a23660046127af565b61060c565b005b6102bc6102b7366004612579565b61091d565b60405161014a9291906127fa565b61024c6102d8366004612579565b610b07565b61017a7fda86e76deaed01641f80ff5f72c372a038fa5182697aeb967e8b1f9819d58d8181565b61013e610312366004612579565b610c44565b61019b7f000000000000000000000000000000000000000000000000000000000000000081565b6102a761034c366004612837565b610c81565b61017a61035f3660046128c8565b610e0b565b61013e610372366004612909565b5f9081526002602052604090205460ff1690565b6102a7610394366004612920565b610ea4565b61017a6103a7366004612579565b610fe7565b61017a61110f565b5f5f60015f6103c2866111c8565b815260208101919091526040015f9081205460ff1691508160028111156103eb576103eb61276d565b0361040957604051635cd3106d60e11b815260040160405180910390fd5b5f5f5f610415876111c8565b815260208082019290925260409081015f9081206001600160a01b038816825283528190208151808301909252805460ff1615158252600181018054929391929184019161046290612959565b80601f016020809104026020016040519081016040528092919081815260200182805461048e90612959565b80156104d95780601f106104b0576101008083540402835291602001916104d9565b820191905f5260205f20905b8154815290600101906020018083116104bc57829003601f168201915b505050919092525050905193505050505b92915050565b5f6104fb8383610b07565b61050490612991565b60601c9392505050565b60606105397f0000000000000000000000000000000000000000000000000000000000000000611226565b905090565b5f5f7fda86e76deaed01641f80ff5f72c372a038fa5182697aeb967e8b1f9819d58d8186865f01518760200151878760405161057b9291906129e9565b6040805191829003822060208301969096526001600160a01b039485169082015292909116606083015263ffffffff16608082015260a081019190915260c0016040516020818303038152906040528051906020012090506105dc81611263565b9695505050505050565b5f60015f6105f3846111c8565b815260208101919091526040015f205460ff1692915050565b81610616816112a9565b6106335760405163932d94f760e01b815260040160405180910390fd5b6040516309a961f360e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631352c3e69061068190869086906004016129f8565b602060405180830381865afa15801561069c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106c09190612a2e565b158284909161070d57604051631070287960e01b815282516001600160a01b03908116600483015260209093015163ffffffff166024820152911660448201526064015b60405180910390fd5b50505f60015f61071c856111c8565b815260208101919091526040015f9081205460ff1691508160028111156107455761074561276d565b0361076357604051635cd3106d60e11b815260040160405180910390fd5b5f5f5f61076f866111c8565b815260208082019290925260409081015f9081206001600160a01b038916825283528190208151808301909252805460ff161515825260018101805492939192918401916107bc90612959565b80601f01602080910402602001604051908101604052809291908181526020018280546107e890612959565b80156108335780601f1061080a57610100808354040283529160200191610833565b820191905f5260205f20905b81548152906001019060200180831161081657829003601f168201915b5050505050815250509050805f01518486909161088957604051632e40e18760e01b815282516001600160a01b03908116600483015260209093015163ffffffff16602482015291166044820152606401610704565b50505f5f610896866111c8565b815260208082019290925260409081015f9081206001600160a01b03891682529092528120805460ff19168155906108d1600183018261237e565b5050846001600160a01b03167f28d3c3cee49478ec6fd219cfd685cd15cd01d95cabf69b4b7b57f9eaa3eb6442858460405161090e929190612a4d565b60405180910390a25050505050565b604080518082019091525f80825260208201526109386123b8565b5f60015f610945876111c8565b815260208101919091526040015f205460ff169050600281600281111561096e5761096e61276d565b1461098c5760405163fdea7c0960e01b815260040160405180910390fd5b5f5f5f610998886111c8565b815260208082019290925260409081015f9081206001600160a01b038916825283528190208151808301909252805460ff161515825260018101805492939192918401916109e590612959565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1190612959565b8015610a5c5780601f10610a3357610100808354040283529160200191610a5c565b820191905f5260205f20905b815481529060010190602001808311610a3f57829003601f168201915b5050505050815250509050805f0151610ab15750506040805180820182525f80825260208083018290528351808501855282815280820192909252835180850190945282845283019190915292509050610b00565b5f5f5f5f8460200151806020019051810190610acd9190612abf565b60408051808201825294855260208086019490945280518082019091529182529181019190915290985096505050505050505b9250929050565b60605f60015f610b16866111c8565b815260208101919091526040015f205460ff1690506001816002811115610b3f57610b3f61276d565b14610b5d5760405163fdea7c0960e01b815260040160405180910390fd5b5f5f5f610b69876111c8565b815260208082019290925260409081015f9081206001600160a01b038816825283528190208151808301909252805460ff16151582526001810180549293919291840191610bb690612959565b80601f0160208091040260200160405190810160405280929190818152602001828054610be290612959565b8015610c2d5780601f10610c0457610100808354040283529160200191610c2d565b820191905f5260205f20905b815481529060010190602001808311610c1057829003601f168201915b505050919092525050506020015195945050505050565b5f5f5f610c50856111c8565b815260208082019290925260409081015f9081206001600160a01b038616825290925290205460ff16905092915050565b85610c8b816112a9565b610ca85760405163932d94f760e01b815260040160405180910390fd5b5f60015f610cb5896111c8565b815260208101919091526040015f9081205460ff169150816002811115610cde57610cde61276d565b03610cfc57604051635cd3106d60e11b815260040160405180910390fd5b5f5f610d07896111c8565b815260208082019290925260409081015f9081206001600160a01b038c16825290925290205460ff1615610d4e57604051630c7bc20160e11b815260040160405180910390fd5b6001816002811115610d6257610d6261276d565b03610d7a57610d75878988888888611353565b610dba565b6002816002811115610d8e57610d8e61276d565b03610da157610d758789888888886114b4565b60405163fdea7c0960e01b815260040160405180910390fd5b876001600160a01b03167f1201ce0c5e577111bce91e907fd99cb183da5edc1e3fb650ca40769e4e9176dd88838989604051610df99493929190612b05565b60405180910390a25050505050505050565b81516020808401516040515f938493610e78937f991b0a3376ce87f8ecc5d70962279ac09cdce934e8b5b9683e73c8ff087c7f81938a93928991019485526001600160a01b039384166020860152918316604085015263ffffffff16606084015216608082015260a00190565b604051602081830303815290604052805190602001209050610e9981611263565b9150505b9392505050565b8151610eaf816112a9565b610ecc5760405163932d94f760e01b815260040160405180910390fd5b6001826002811115610ee057610ee061276d565b1480610efd57506002826002811115610efb57610efb61276d565b145b610f1a5760405163fdea7c0960e01b815260040160405180910390fd5b5f60015f610f27866111c8565b815260208101919091526040015f9081205460ff169150816002811115610f5057610f5061276d565b14610f6d576040516281f09f60e01b815260040160405180910390fd5b8260015f610f7a876111c8565b815260208101919091526040015f20805460ff19166001836002811115610fa357610fa361276d565b02179055507fb2266cb118e57095fcdbedb24dabd9fc9f5127e2dbedf62ce6ee71696fb8b6e78484604051610fd9929190612a4d565b60405180910390a150505050565b5f5f5f5f610ff4866111c8565b815260208082019290925260409081015f9081206001600160a01b038716825283528190208151808301909252805460ff1615158252600181018054929391929184019161104190612959565b80601f016020809104026020016040519081016040528092919081815260200182805461106d90612959565b80156110b85780601f1061108f576101008083540402835291602001916110b8565b820191905f5260205f20905b81548152906001019060200180831161109b57829003601f168201915b50505050508152505090505f60015f6110d0876111c8565b815260208101919091526040015f2054825160ff90911691506110f857505f91506104ea9050565b61110682602001518261166d565b95945050505050565b60408051808201909152600a81526922b4b3b2b72630bcb2b960b11b6020909101525f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea61117c6116ee565b805160209182012060408051928301949094529281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f815f0151826020015163ffffffff1660405160200161120e92919060609290921b6001600160601b031916825260a01b6001600160a01b031916601482015260200190565b6040516020818303038152906040526104ea90612b62565b60605f61123283611763565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f61126c61110f565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af115801561132f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ea9190612a2e565b601483146113745760405163d109118160e01b815260040160405180910390fd5b5f61137f8486612b85565b60601c9050806113a257604051634935505f60e01b815260040160405180910390fd5b5f6113e486868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506001925061166d915050565b5f8181526002602052604090205490915060ff161561141657604051630c7bc20160e11b815260040160405180910390fd5b5f611422888a85610e0b565b9050611467838287878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505f19925061178a915050565b6114a9898989898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508892506117e2915050565b505050505050505050565b604080518082019091525f80825260208201526114cf6123b8565b5f8080806114df898b018b612bc3565b93509350935093506040518060400160405280858152602001848152509550835f14801561150b575082155b1561152957604051634935505f60e01b815260040160405180910390fd5b60408051808201909152918252602082015292505f915061154e9050888a898961053e565b90505f8061155e86880188612bfd565b604080518082019091528281526020810182905291935091505f611586858389898580611866565b915050806115a757604051638baa579f60e01b815260040160405180910390fd5b5f6115e98c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506002925061166d915050565b5f8181526002602052604090205490915060ff161561161b57604051630c7bc20160e11b815260040160405180910390fd5b61165d8e8e8e8e8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508792506117e2915050565b5050505050505050505050505050565b5f60018260028111156116825761168261276d565b036116945750815160208301206104ea565b60028260028111156116a8576116a861276d565b03610da1575f5f848060200190518101906116c39190612abf565b505060408051808201825283815260209081019283525f9384529151909152902092506104ea915050565b60605f61171a7f0000000000000000000000000000000000000000000000000000000000000000611226565b9050805f8151811061172e5761172e6129d5565b016020908101516040516001600160f81b03199091169181019190915260210160405160208183030381529060405291505090565b5f60ff8216601f8111156104ea57604051632cd44ac360e21b815260040160405180910390fd5b428110156117ab57604051630819bdcd60e01b815260040160405180910390fd5b6117bf6001600160a01b038516848461192e565b6117dc57604051638baa579f60e01b815260040160405180910390fd5b50505050565b6040805180820190915260018152602081018390525f80611802876111c8565b815260208082019290925260409081015f9081206001600160a01b03881682528352208251815460ff19169015151781559082015160018201906118469082612c69565b5050505f908152600260205260409020805460ff19166001179055505050565b5f5f5f61187289611982565b90505f6118818a89898c611a0c565b90505f6118986118918a84611ab7565b8b90611b27565b90505f6118da6118d3846118cd6040805180820182525f80825260209182015281518083019092526001825260029082015290565b90611ab7565b8590611b27565b905087156118ff576118f6826118ee611b9b565b838c8b611c5b565b9650945061191f565b6119128261190b611b9b565b838c611e6f565b9550851561191f57600194505b50505050965096945050505050565b5f5f5f61193b85856120a6565b90925090505f8160048111156119535761195361276d565b1480156119715750856001600160a01b0316826001600160a01b0316145b806105dc57506105dc8686866120e5565b604080518082019091525f80825260208201525f80806119af5f516020612dcf5f395f51905f5286612d24565b90505b6119bb816121cc565b90935091505f516020612dcf5f395f51905f5282830983036119f3576040805180820190915290815260208101919091529392505050565b5f516020612dcf5f395f51905f526001820890506119b2565b8251602080850151845180519083015186840151805190850151875188870151604080519889018e90528801989098526060870195909552608086019390935260a085019190915260c084015260e08301526101008201526101208101919091525f907f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019061014001604051602081830303815290604052805190602001205f1c6111069190612d24565b604080518082019091525f8082526020820152611ad26123dd565b835181526020808501519082015260408082018490525f908360608460076107d05a03fa90508080611b0057fe5b5080611b1f57604051632319df1960e11b815260040160405180910390fd5b505092915050565b604080518082019091525f8082526020820152611b426123fb565b835181526020808501518183015283516040808401919091529084015160608301525f908360808460066107d05a03fa90508080611b7c57fe5b5080611b1f5760405163d4b68fd760e01b815260040160405180910390fd5b611ba36123b8565b50604080516080810182527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c28183019081527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060830152815281518083019092527f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec82527f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d60208381019190915281019190915290565b6040805180820182528681526020808201869052825180840190935286835282018490525f91829190611c8c612419565b5f5b6002811015611e43575f611ca3826006612d57565b9050848260028110611cb757611cb76129d5565b60200201515183611cc8835f612d6e565b600c8110611cd857611cd86129d5565b6020020152848260028110611cef57611cef6129d5565b60200201516020015183826001611d069190612d6e565b600c8110611d1657611d166129d5565b6020020152838260028110611d2d57611d2d6129d5565b6020020151515183611d40836002612d6e565b600c8110611d5057611d506129d5565b6020020152838260028110611d6757611d676129d5565b6020020151516001602002015183611d80836003612d6e565b600c8110611d9057611d906129d5565b6020020152838260028110611da757611da76129d5565b6020020151602001515f60028110611dc157611dc16129d5565b602002015183611dd2836004612d6e565b600c8110611de257611de26129d5565b6020020152838260028110611df957611df96129d5565b602002015160200151600160028110611e1457611e146129d5565b602002015183611e25836005612d6e565b600c8110611e3557611e356129d5565b602002015250600101611c8e565b50611e4c612438565b5f6020826101808560088cfa9151919c9115159b50909950505050505050505050565b6040805180820182528581526020808201859052825180840190935285835282018390525f91611e9d612419565b5f5b6002811015612054575f611eb4826006612d57565b9050848260028110611ec857611ec86129d5565b60200201515183611ed9835f612d6e565b600c8110611ee957611ee96129d5565b6020020152848260028110611f0057611f006129d5565b60200201516020015183826001611f179190612d6e565b600c8110611f2757611f276129d5565b6020020152838260028110611f3e57611f3e6129d5565b6020020151515183611f51836002612d6e565b600c8110611f6157611f616129d5565b6020020152838260028110611f7857611f786129d5565b6020020151516001602002015183611f91836003612d6e565b600c8110611fa157611fa16129d5565b6020020152838260028110611fb857611fb86129d5565b6020020151602001515f60028110611fd257611fd26129d5565b602002015183611fe3836004612d6e565b600c8110611ff357611ff36129d5565b602002015283826002811061200a5761200a6129d5565b602002015160200151600160028110612025576120256129d5565b602002015183612036836005612d6e565b600c8110612046576120466129d5565b602002015250600101611e9f565b5061205d612438565b5f6020826101808560086107d05a03fa9050808061207757fe5b5080612096576040516324ccc79360e21b815260040160405180910390fd5b5051151598975050505050505050565b5f5f82516041036120da576020830151604084015160608501515f1a6120ce87828585612248565b94509450505050610b00565b505f90506002610b00565b5f5f5f856001600160a01b0316631626ba7e60e01b868660405160240161210d929190612d81565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161214b9190612da1565b5f60405180830381855afa9150503d805f8114612183576040519150601f19603f3d011682016040523d82523d5f602084013e612188565b606091505b509150915081801561219c57506020815110155b80156105dc57508051630b135d3f60e11b906121c19083016020908101908401612db7565b149695505050505050565b5f80805f516020612dcf5f395f51905f5260035f516020612dcf5f395f51905f52865f516020612dcf5f395f51905f52888909090890505f61223c827f0c19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f525f516020612dcf5f395f51905f52612305565b91959194509092505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561227d57505f905060036122fc565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156122ce573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166122f6575f600192509250506122fc565b91505f90505b94509492505050565b5f5f61230f612438565b612317612456565b602080825281810181905260408201819052606082018890526080820187905260a082018690528260c08360056107d05a03fa9250828061235457fe5b50826123735760405163d51edae360e01b815260040160405180910390fd5b505195945050505050565b50805461238a90612959565b5f825580601f10612399575050565b601f0160209004905f5260205f20908101906123b59190612474565b50565b60405180604001604052806123cb61248c565b81526020016123d861248c565b905290565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b604051806101800160405280600c906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b6040518060c001604052806006906020820280368337509192915050565b5b80821115612488575f8155600101612475565b5090565b60405180604001604052806002906020820280368337509192915050565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156124e1576124e16124aa565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715612510576125106124aa565b604052919050565b80356001600160a01b038116811461252e575f5ffd5b919050565b5f60408284031215612543575f5ffd5b61254b6124be565b905061255682612518565b8152602082013563ffffffff8116811461256e575f5ffd5b602082015292915050565b5f5f6060838503121561258a575f5ffd5b6125948484612533565b91506125a260408401612518565b90509250929050565b5f82601f8301126125ba575f5ffd5b6125c460406124e7565b8060408401858111156125d5575f5ffd5b845b818110156125ef5780358452602093840193016125d7565b509095945050505050565b5f5f82840360c081121561260c575f5ffd5b6040811215612619575f5ffd5b6126216124be565b843581526020808601359082015292506080603f1982011215612642575f5ffd5b5061264b6124be565b61265885604086016125ab565b815261266785608086016125ab565b6020820152809150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610e9d6020830184612677565b5f5f83601f8401126126c7575f5ffd5b50813567ffffffffffffffff8111156126de575f5ffd5b602083019150836020828501011115610b00575f5ffd5b5f5f5f5f60808587031215612708575f5ffd5b61271185612518565b93506127208660208701612533565b9250606085013567ffffffffffffffff81111561273b575f5ffd5b612747878288016126b7565b95989497509550505050565b5f60408284031215612763575f5ffd5b610e9d8383612533565b634e487b7160e01b5f52602160045260245ffd5b6003811061279d57634e487b7160e01b5f52602160045260245ffd5b9052565b602081016104ea8284612781565b5f5f606083850312156127c0575f5ffd5b6127c983612518565b91506125a28460208501612533565b805f5b60028110156117dc5781518452602093840193909101906001016127db565b5f60c082019050835182526020840151602083015261281d6040830184516127d8565b602083015161282f60808401826127d8565b509392505050565b5f5f5f5f5f5f60a0878903121561284c575f5ffd5b61285587612518565b95506128648860208901612533565b9450606087013567ffffffffffffffff81111561287f575f5ffd5b61288b89828a016126b7565b909550935050608087013567ffffffffffffffff8111156128aa575f5ffd5b6128b689828a016126b7565b979a9699509497509295939492505050565b5f5f5f608084860312156128da575f5ffd5b6128e384612518565b92506128f28560208601612533565b915061290060608501612518565b90509250925092565b5f60208284031215612919575f5ffd5b5035919050565b5f5f60608385031215612931575f5ffd5b61293b8484612533565b915060408301356003811061294e575f5ffd5b809150509250929050565b600181811c9082168061296d57607f821691505b60208210810361298b57634e487b7160e01b5f52602260045260245ffd5b50919050565b805160208201516001600160601b03198116919060148210156129ce576001600160601b03196001600160601b03198360140360031b1b82161692505b5050919050565b634e487b7160e01b5f52603260045260245ffd5b818382375f9101908152919050565b6001600160a01b038316815260608101610e9d602083018480516001600160a01b0316825260209081015163ffffffff16910152565b5f60208284031215612a3e575f5ffd5b81518015158114610e9d575f5ffd5b82516001600160a01b0316815260208084015163ffffffff169082015260608101610e9d6040830184612781565b5f82601f830112612a8a575f5ffd5b612a9460406124e7565b806040840185811115612aa5575f5ffd5b845b818110156125ef578051845260209384019301612aa7565b5f5f5f5f60c08587031215612ad2575f5ffd5b845160208601519094509250612aeb8660408701612a7b565b9150612afa8660808701612a7b565b905092959194509250565b84516001600160a01b0316815260208086015163ffffffff1690820152612b2f6040820185612781565b60806060820152816080820152818360a08301375f81830160a090810191909152601f909201601f191601019392505050565b8051602080830151919081101561298b575f1960209190910360031b1b16919050565b80356001600160601b03198116906014841015612bbc576001600160601b03196001600160601b03198560140360031b1b82161691505b5092915050565b5f5f5f5f60c08587031215612bd6575f5ffd5b8435935060208501359250612bee86604087016125ab565b9150612afa86608087016125ab565b5f5f60408385031215612c0e575f5ffd5b50508035926020909101359150565b601f821115612c6457805f5260205f20601f840160051c81016020851015612c425750805b601f840160051c820191505b81811015612c61575f8155600101612c4e565b50505b505050565b815167ffffffffffffffff811115612c8357612c836124aa565b612c9781612c918454612959565b84612c1d565b6020601f821160018114612cc9575f8315612cb25750848201515b5f19600385901b1c1916600184901b178455612c61565b5f84815260208120601f198516915b82811015612cf85787850151825560209485019460019092019101612cd8565b5084821015612d1557868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f82612d3e57634e487b7160e01b5f52601260045260245ffd5b500690565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176104ea576104ea612d43565b808201808211156104ea576104ea612d43565b828152604060208201525f612d996040830184612677565b949350505050565b5f82518060208501845e5f920191825250919050565b5f60208284031215612dc7575f5ffd5b505191905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47a264697066735822122003bde979f37aa47490e0c2c7ce60e6c9f9cb0930b5c667e21a138ae21c40178c64736f6c634300081b0033",
+ Bin: "0x60e060405234801561000f575f5ffd5b5060405161305f38038061305f83398101604081905261002e916100cb565b6001600160a01b03808316608052831660a052808061004c8161005a565b60c052506101fc9350505050565b5f5f829050601f8151111561008d578260405163305a27a960e01b815260040161008491906101a1565b60405180910390fd5b8051610098826101d6565b179392505050565b6001600160a01b03811681146100b4575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f606084860312156100dd575f5ffd5b83516100e8816100a0565b60208501519093506100f9816100a0565b60408501519092506001600160401b03811115610114575f5ffd5b8401601f81018613610124575f5ffd5b80516001600160401b0381111561013d5761013d6100b7565b604051601f8201601f19908116603f011681016001600160401b038111828210171561016b5761016b6100b7565b604052818152828201602001881015610182575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b805160208083015191908110156101f6575f198160200360031b1b821691505b50919050565b60805160a05160c051612e2461023b5f395f818161051501526116f601525f81816101b801526112e701525f818161031c015261064a0152612e245ff3fe608060405234801561000f575f5ffd5b5060043610610127575f3560e01c8063aa165c30116100a9578063d9f12db21161006e578063d9f12db214610351578063dab42d7e14610364578063ea0d814914610386578063ea194e2e14610399578063f698da25146103ac575f5ffd5b8063aa165c30146102ca578063b05c8f6d146102dd578063bd30a0b914610304578063ca8aa7c714610317578063d40cda161461033e575f5ffd5b806354fd4d50116100ef57806354fd4d50146102595780637690e395146102615780637cffe48c1461027457806387ab86f4146102945780639a43e3fb146102a9575f5ffd5b80630a6ac2641461012b578063166aa127146101535780633b32a7bd146101885780634657e26a146101b357806350435add146101da575b5f5ffd5b61013e610139366004612579565b6103b4565b60405190151581526020015b60405180910390f35b61017a7f991b0a3376ce87f8ecc5d70962279ac09cdce934e8b5b9683e73c8ff087c7f8181565b60405190815260200161014a565b61019b610196366004612579565b6104f0565b6040516001600160a01b03909116815260200161014a565b61019b7f000000000000000000000000000000000000000000000000000000000000000081565b61024c6101e83660046125fa565b8151602080840151835180519083015185840151805190850151604080519687019790975295850193909352606084810192909252608084015260a083019190915260c082019290925260e001604051602081830303815290604052905092915050565b60405161014a91906126a5565b61024c61050e565b61017a61026f3660046126f5565b61053e565b610287610282366004612753565b6105e6565b60405161014a91906127a1565b6102a76102a23660046127af565b61060c565b005b6102bc6102b7366004612579565b61091d565b60405161014a9291906127fa565b61024c6102d8366004612579565b610b07565b61017a7fda86e76deaed01641f80ff5f72c372a038fa5182697aeb967e8b1f9819d58d8181565b61013e610312366004612579565b610c44565b61019b7f000000000000000000000000000000000000000000000000000000000000000081565b6102a761034c366004612837565b610c81565b61017a61035f3660046128c8565b610e0b565b61013e610372366004612909565b5f9081526002602052604090205460ff1690565b6102a7610394366004612920565b610ea4565b61017a6103a7366004612579565b610fe7565b61017a61110f565b5f5f60015f6103c2866111c8565b815260208101919091526040015f9081205460ff1691508160028111156103eb576103eb61276d565b0361040957604051635cd3106d60e11b815260040160405180910390fd5b5f5f5f610415876111c8565b815260208082019290925260409081015f9081206001600160a01b038816825283528190208151808301909252805460ff1615158252600181018054929391929184019161046290612959565b80601f016020809104026020016040519081016040528092919081815260200182805461048e90612959565b80156104d95780601f106104b0576101008083540402835291602001916104d9565b820191905f5260205f20905b8154815290600101906020018083116104bc57829003601f168201915b505050919092525050905193505050505b92915050565b5f6104fb8383610b07565b61050490612991565b60601c9392505050565b60606105397f0000000000000000000000000000000000000000000000000000000000000000611226565b905090565b5f5f7fda86e76deaed01641f80ff5f72c372a038fa5182697aeb967e8b1f9819d58d8186865f01518760200151878760405161057b9291906129e9565b6040805191829003822060208301969096526001600160a01b039485169082015292909116606083015263ffffffff16608082015260a081019190915260c0016040516020818303038152906040528051906020012090506105dc81611263565b9695505050505050565b5f60015f6105f3846111c8565b815260208101919091526040015f205460ff1692915050565b81610616816112a9565b6106335760405163932d94f760e01b815260040160405180910390fd5b6040516309a961f360e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631352c3e69061068190869086906004016129f8565b602060405180830381865afa15801561069c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106c09190612a2e565b158284909161070d57604051631070287960e01b815282516001600160a01b03908116600483015260209093015163ffffffff166024820152911660448201526064015b60405180910390fd5b50505f60015f61071c856111c8565b815260208101919091526040015f9081205460ff1691508160028111156107455761074561276d565b0361076357604051635cd3106d60e11b815260040160405180910390fd5b5f5f5f61076f866111c8565b815260208082019290925260409081015f9081206001600160a01b038916825283528190208151808301909252805460ff161515825260018101805492939192918401916107bc90612959565b80601f01602080910402602001604051908101604052809291908181526020018280546107e890612959565b80156108335780601f1061080a57610100808354040283529160200191610833565b820191905f5260205f20905b81548152906001019060200180831161081657829003601f168201915b5050505050815250509050805f01518486909161088957604051632e40e18760e01b815282516001600160a01b03908116600483015260209093015163ffffffff16602482015291166044820152606401610704565b50505f5f610896866111c8565b815260208082019290925260409081015f9081206001600160a01b03891682529092528120805460ff19168155906108d1600183018261237e565b5050846001600160a01b03167f28d3c3cee49478ec6fd219cfd685cd15cd01d95cabf69b4b7b57f9eaa3eb6442858460405161090e929190612a4d565b60405180910390a25050505050565b604080518082019091525f80825260208201526109386123b8565b5f60015f610945876111c8565b815260208101919091526040015f205460ff169050600281600281111561096e5761096e61276d565b1461098c5760405163fdea7c0960e01b815260040160405180910390fd5b5f5f5f610998886111c8565b815260208082019290925260409081015f9081206001600160a01b038916825283528190208151808301909252805460ff161515825260018101805492939192918401916109e590612959565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1190612959565b8015610a5c5780601f10610a3357610100808354040283529160200191610a5c565b820191905f5260205f20905b815481529060010190602001808311610a3f57829003601f168201915b5050505050815250509050805f0151610ab15750506040805180820182525f80825260208083018290528351808501855282815280820192909252835180850190945282845283019190915292509050610b00565b5f5f5f5f8460200151806020019051810190610acd9190612abf565b60408051808201825294855260208086019490945280518082019091529182529181019190915290985096505050505050505b9250929050565b60605f60015f610b16866111c8565b815260208101919091526040015f205460ff1690506001816002811115610b3f57610b3f61276d565b14610b5d5760405163fdea7c0960e01b815260040160405180910390fd5b5f5f5f610b69876111c8565b815260208082019290925260409081015f9081206001600160a01b038816825283528190208151808301909252805460ff16151582526001810180549293919291840191610bb690612959565b80601f0160208091040260200160405190810160405280929190818152602001828054610be290612959565b8015610c2d5780601f10610c0457610100808354040283529160200191610c2d565b820191905f5260205f20905b815481529060010190602001808311610c1057829003601f168201915b505050919092525050506020015195945050505050565b5f5f5f610c50856111c8565b815260208082019290925260409081015f9081206001600160a01b038616825290925290205460ff16905092915050565b85610c8b816112a9565b610ca85760405163932d94f760e01b815260040160405180910390fd5b5f60015f610cb5896111c8565b815260208101919091526040015f9081205460ff169150816002811115610cde57610cde61276d565b03610cfc57604051635cd3106d60e11b815260040160405180910390fd5b5f5f610d07896111c8565b815260208082019290925260409081015f9081206001600160a01b038c16825290925290205460ff1615610d4e57604051630c7bc20160e11b815260040160405180910390fd5b6001816002811115610d6257610d6261276d565b03610d7a57610d75878988888888611353565b610dba565b6002816002811115610d8e57610d8e61276d565b03610da157610d758789888888886114b4565b60405163fdea7c0960e01b815260040160405180910390fd5b876001600160a01b03167f1201ce0c5e577111bce91e907fd99cb183da5edc1e3fb650ca40769e4e9176dd88838989604051610df99493929190612b05565b60405180910390a25050505050505050565b81516020808401516040515f938493610e78937f991b0a3376ce87f8ecc5d70962279ac09cdce934e8b5b9683e73c8ff087c7f81938a93928991019485526001600160a01b039384166020860152918316604085015263ffffffff16606084015216608082015260a00190565b604051602081830303815290604052805190602001209050610e9981611263565b9150505b9392505050565b8151610eaf816112a9565b610ecc5760405163932d94f760e01b815260040160405180910390fd5b6001826002811115610ee057610ee061276d565b1480610efd57506002826002811115610efb57610efb61276d565b145b610f1a5760405163fdea7c0960e01b815260040160405180910390fd5b5f60015f610f27866111c8565b815260208101919091526040015f9081205460ff169150816002811115610f5057610f5061276d565b14610f6d576040516281f09f60e01b815260040160405180910390fd5b8260015f610f7a876111c8565b815260208101919091526040015f20805460ff19166001836002811115610fa357610fa361276d565b02179055507fb2266cb118e57095fcdbedb24dabd9fc9f5127e2dbedf62ce6ee71696fb8b6e78484604051610fd9929190612a4d565b60405180910390a150505050565b5f5f5f5f610ff4866111c8565b815260208082019290925260409081015f9081206001600160a01b038716825283528190208151808301909252805460ff1615158252600181018054929391929184019161104190612959565b80601f016020809104026020016040519081016040528092919081815260200182805461106d90612959565b80156110b85780601f1061108f576101008083540402835291602001916110b8565b820191905f5260205f20905b81548152906001019060200180831161109b57829003601f168201915b50505050508152505090505f60015f6110d0876111c8565b815260208101919091526040015f2054825160ff90911691506110f857505f91506104ea9050565b61110682602001518261166d565b95945050505050565b60408051808201909152600a81526922b4b3b2b72630bcb2b960b11b6020909101525f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea61117c6116ee565b805160209182012060408051928301949094529281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f815f0151826020015163ffffffff1660405160200161120e92919060609290921b6001600160601b031916825260a01b6001600160a01b031916601482015260200190565b6040516020818303038152906040526104ea90612b62565b60605f61123283611763565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f61126c61110f565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af115801561132f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ea9190612a2e565b601483146113745760405163d109118160e01b815260040160405180910390fd5b5f61137f8486612b85565b60601c9050806113a257604051634935505f60e01b815260040160405180910390fd5b5f6113e486868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506001925061166d915050565b5f8181526002602052604090205490915060ff161561141657604051630c7bc20160e11b815260040160405180910390fd5b5f611422888a85610e0b565b9050611467838287878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505f19925061178a915050565b6114a9898989898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508892506117e2915050565b505050505050505050565b604080518082019091525f80825260208201526114cf6123b8565b5f8080806114df898b018b612bc3565b93509350935093506040518060400160405280858152602001848152509550835f14801561150b575082155b1561152957604051634935505f60e01b815260040160405180910390fd5b60408051808201909152918252602082015292505f915061154e9050888a898961053e565b90505f8061155e86880188612bfd565b604080518082019091528281526020810182905291935091505f611586858389898580611866565b915050806115a757604051638baa579f60e01b815260040160405180910390fd5b5f6115e98c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506002925061166d915050565b5f8181526002602052604090205490915060ff161561161b57604051630c7bc20160e11b815260040160405180910390fd5b61165d8e8e8e8e8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508792506117e2915050565b5050505050505050505050505050565b5f60018260028111156116825761168261276d565b036116945750815160208301206104ea565b60028260028111156116a8576116a861276d565b03610da1575f5f848060200190518101906116c39190612abf565b505060408051808201825283815260209081019283525f9384529151909152902092506104ea915050565b60605f61171a7f0000000000000000000000000000000000000000000000000000000000000000611226565b9050805f8151811061172e5761172e6129d5565b016020908101516040516001600160f81b03199091169181019190915260210160405160208183030381529060405291505090565b5f60ff8216601f8111156104ea57604051632cd44ac360e21b815260040160405180910390fd5b428110156117ab57604051630819bdcd60e01b815260040160405180910390fd5b6117bf6001600160a01b038516848461192e565b6117dc57604051638baa579f60e01b815260040160405180910390fd5b50505050565b6040805180820190915260018152602081018390525f80611802876111c8565b815260208082019290925260409081015f9081206001600160a01b03881682528352208251815460ff19169015151781559082015160018201906118469082612c69565b5050505f908152600260205260409020805460ff19166001179055505050565b5f5f5f61187289611982565b90505f6118818a89898c611a0c565b90505f6118986118918a84611ab7565b8b90611b27565b90505f6118da6118d3846118cd6040805180820182525f80825260209182015281518083019092526001825260029082015290565b90611ab7565b8590611b27565b905087156118ff576118f6826118ee611b9b565b838c8b611c5b565b9650945061191f565b6119128261190b611b9b565b838c611e6f565b9550851561191f57600194505b50505050965096945050505050565b5f5f5f61193b85856120a6565b90925090505f8160048111156119535761195361276d565b1480156119715750856001600160a01b0316826001600160a01b0316145b806105dc57506105dc8686866120e5565b604080518082019091525f80825260208201525f80806119af5f516020612dcf5f395f51905f5286612d24565b90505b6119bb816121cc565b90935091505f516020612dcf5f395f51905f5282830983036119f3576040805180820190915290815260208101919091529392505050565b5f516020612dcf5f395f51905f526001820890506119b2565b8251602080850151845180519083015186840151805190850151875188870151604080519889018e90528801989098526060870195909552608086019390935260a085019190915260c084015260e08301526101008201526101208101919091525f907f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019061014001604051602081830303815290604052805190602001205f1c6111069190612d24565b604080518082019091525f8082526020820152611ad26123dd565b835181526020808501519082015260408082018490525f908360608460076107d05a03fa90508080611b0057fe5b5080611b1f57604051632319df1960e11b815260040160405180910390fd5b505092915050565b604080518082019091525f8082526020820152611b426123fb565b835181526020808501518183015283516040808401919091529084015160608301525f908360808460066107d05a03fa90508080611b7c57fe5b5080611b1f5760405163d4b68fd760e01b815260040160405180910390fd5b611ba36123b8565b50604080516080810182527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c28183019081527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060830152815281518083019092527f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec82527f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d60208381019190915281019190915290565b6040805180820182528681526020808201869052825180840190935286835282018490525f91829190611c8c612419565b5f5b6002811015611e43575f611ca3826006612d57565b9050848260028110611cb757611cb76129d5565b60200201515183611cc8835f612d6e565b600c8110611cd857611cd86129d5565b6020020152848260028110611cef57611cef6129d5565b60200201516020015183826001611d069190612d6e565b600c8110611d1657611d166129d5565b6020020152838260028110611d2d57611d2d6129d5565b6020020151515183611d40836002612d6e565b600c8110611d5057611d506129d5565b6020020152838260028110611d6757611d676129d5565b6020020151516001602002015183611d80836003612d6e565b600c8110611d9057611d906129d5565b6020020152838260028110611da757611da76129d5565b6020020151602001515f60028110611dc157611dc16129d5565b602002015183611dd2836004612d6e565b600c8110611de257611de26129d5565b6020020152838260028110611df957611df96129d5565b602002015160200151600160028110611e1457611e146129d5565b602002015183611e25836005612d6e565b600c8110611e3557611e356129d5565b602002015250600101611c8e565b50611e4c612438565b5f6020826101808560088cfa9151919c9115159b50909950505050505050505050565b6040805180820182528581526020808201859052825180840190935285835282018390525f91611e9d612419565b5f5b6002811015612054575f611eb4826006612d57565b9050848260028110611ec857611ec86129d5565b60200201515183611ed9835f612d6e565b600c8110611ee957611ee96129d5565b6020020152848260028110611f0057611f006129d5565b60200201516020015183826001611f179190612d6e565b600c8110611f2757611f276129d5565b6020020152838260028110611f3e57611f3e6129d5565b6020020151515183611f51836002612d6e565b600c8110611f6157611f616129d5565b6020020152838260028110611f7857611f786129d5565b6020020151516001602002015183611f91836003612d6e565b600c8110611fa157611fa16129d5565b6020020152838260028110611fb857611fb86129d5565b6020020151602001515f60028110611fd257611fd26129d5565b602002015183611fe3836004612d6e565b600c8110611ff357611ff36129d5565b602002015283826002811061200a5761200a6129d5565b602002015160200151600160028110612025576120256129d5565b602002015183612036836005612d6e565b600c8110612046576120466129d5565b602002015250600101611e9f565b5061205d612438565b5f6020826101808560086107d05a03fa9050808061207757fe5b5080612096576040516324ccc79360e21b815260040160405180910390fd5b5051151598975050505050505050565b5f5f82516041036120da576020830151604084015160608501515f1a6120ce87828585612248565b94509450505050610b00565b505f90506002610b00565b5f5f5f856001600160a01b0316631626ba7e60e01b868660405160240161210d929190612d81565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161214b9190612da1565b5f60405180830381855afa9150503d805f8114612183576040519150601f19603f3d011682016040523d82523d5f602084013e612188565b606091505b509150915081801561219c57506020815110155b80156105dc57508051630b135d3f60e11b906121c19083016020908101908401612db7565b149695505050505050565b5f80805f516020612dcf5f395f51905f5260035f516020612dcf5f395f51905f52865f516020612dcf5f395f51905f52888909090890505f61223c827f0c19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f525f516020612dcf5f395f51905f52612305565b91959194509092505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561227d57505f905060036122fc565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156122ce573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166122f6575f600192509250506122fc565b91505f90505b94509492505050565b5f5f61230f612438565b612317612456565b602080825281810181905260408201819052606082018890526080820187905260a082018690528260c08360056107d05a03fa9250828061235457fe5b50826123735760405163d51edae360e01b815260040160405180910390fd5b505195945050505050565b50805461238a90612959565b5f825580601f10612399575050565b601f0160209004905f5260205f20908101906123b59190612474565b50565b60405180604001604052806123cb61248c565b81526020016123d861248c565b905290565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b604051806101800160405280600c906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b6040518060c001604052806006906020820280368337509192915050565b5b80821115612488575f8155600101612475565b5090565b60405180604001604052806002906020820280368337509192915050565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156124e1576124e16124aa565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715612510576125106124aa565b604052919050565b80356001600160a01b038116811461252e575f5ffd5b919050565b5f60408284031215612543575f5ffd5b61254b6124be565b905061255682612518565b8152602082013563ffffffff8116811461256e575f5ffd5b602082015292915050565b5f5f6060838503121561258a575f5ffd5b6125948484612533565b91506125a260408401612518565b90509250929050565b5f82601f8301126125ba575f5ffd5b6125c460406124e7565b8060408401858111156125d5575f5ffd5b845b818110156125ef5780358452602093840193016125d7565b509095945050505050565b5f5f82840360c081121561260c575f5ffd5b6040811215612619575f5ffd5b6126216124be565b843581526020808601359082015292506080603f1982011215612642575f5ffd5b5061264b6124be565b61265885604086016125ab565b815261266785608086016125ab565b6020820152809150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610e9d6020830184612677565b5f5f83601f8401126126c7575f5ffd5b50813567ffffffffffffffff8111156126de575f5ffd5b602083019150836020828501011115610b00575f5ffd5b5f5f5f5f60808587031215612708575f5ffd5b61271185612518565b93506127208660208701612533565b9250606085013567ffffffffffffffff81111561273b575f5ffd5b612747878288016126b7565b95989497509550505050565b5f60408284031215612763575f5ffd5b610e9d8383612533565b634e487b7160e01b5f52602160045260245ffd5b6003811061279d57634e487b7160e01b5f52602160045260245ffd5b9052565b602081016104ea8284612781565b5f5f606083850312156127c0575f5ffd5b6127c983612518565b91506125a28460208501612533565b805f5b60028110156117dc5781518452602093840193909101906001016127db565b5f60c082019050835182526020840151602083015261281d6040830184516127d8565b602083015161282f60808401826127d8565b509392505050565b5f5f5f5f5f5f60a0878903121561284c575f5ffd5b61285587612518565b95506128648860208901612533565b9450606087013567ffffffffffffffff81111561287f575f5ffd5b61288b89828a016126b7565b909550935050608087013567ffffffffffffffff8111156128aa575f5ffd5b6128b689828a016126b7565b979a9699509497509295939492505050565b5f5f5f608084860312156128da575f5ffd5b6128e384612518565b92506128f28560208601612533565b915061290060608501612518565b90509250925092565b5f60208284031215612919575f5ffd5b5035919050565b5f5f60608385031215612931575f5ffd5b61293b8484612533565b915060408301356003811061294e575f5ffd5b809150509250929050565b600181811c9082168061296d57607f821691505b60208210810361298b57634e487b7160e01b5f52602260045260245ffd5b50919050565b805160208201516001600160601b03198116919060148210156129ce576001600160601b03196001600160601b03198360140360031b1b82161692505b5050919050565b634e487b7160e01b5f52603260045260245ffd5b818382375f9101908152919050565b6001600160a01b038316815260608101610e9d602083018480516001600160a01b0316825260209081015163ffffffff16910152565b5f60208284031215612a3e575f5ffd5b81518015158114610e9d575f5ffd5b82516001600160a01b0316815260208084015163ffffffff169082015260608101610e9d6040830184612781565b5f82601f830112612a8a575f5ffd5b612a9460406124e7565b806040840185811115612aa5575f5ffd5b845b818110156125ef578051845260209384019301612aa7565b5f5f5f5f60c08587031215612ad2575f5ffd5b845160208601519094509250612aeb8660408701612a7b565b9150612afa8660808701612a7b565b905092959194509250565b84516001600160a01b0316815260208086015163ffffffff1690820152612b2f6040820185612781565b60806060820152816080820152818360a08301375f81830160a090810191909152601f909201601f191601019392505050565b8051602080830151919081101561298b575f1960209190910360031b1b16919050565b80356001600160601b03198116906014841015612bbc576001600160601b03196001600160601b03198560140360031b1b82161691505b5092915050565b5f5f5f5f60c08587031215612bd6575f5ffd5b8435935060208501359250612bee86604087016125ab565b9150612afa86608087016125ab565b5f5f60408385031215612c0e575f5ffd5b50508035926020909101359150565b601f821115612c6457805f5260205f20601f840160051c81016020851015612c425750805b601f840160051c820191505b81811015612c61575f8155600101612c4e565b50505b505050565b815167ffffffffffffffff811115612c8357612c836124aa565b612c9781612c918454612959565b84612c1d565b6020601f821160018114612cc9575f8315612cb25750848201515b5f19600385901b1c1916600184901b178455612c61565b5f84815260208120601f198516915b82811015612cf85787850151825560209485019460019092019101612cd8565b5084821015612d1557868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f82612d3e57634e487b7160e01b5f52601260045260245ffd5b500690565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176104ea576104ea612d43565b808201808211156104ea576104ea612d43565b828152604060208201525f612d996040830184612677565b949350505050565b5f82518060208501845e5f920191825250919050565b5f60208284031215612dc7575f5ffd5b505191905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47a26469706673582212204a73b0e905ca69f8d4cb09eb724c73d09df6abae039ad3012f177bb6208d901e64736f6c634300081b0033",
}
// KeyRegistrarABI is the input ABI used to generate the binding from.
diff --git a/pkg/bindings/OperatorTableUpdater/binding.go b/pkg/bindings/OperatorTableUpdater/binding.go
index 374a1f257f..9b7db6ecfb 100644
--- a/pkg/bindings/OperatorTableUpdater/binding.go
+++ b/pkg/bindings/OperatorTableUpdater/binding.go
@@ -86,7 +86,7 @@ type OperatorSet struct {
// OperatorTableUpdaterMetaData contains all meta data concerning the OperatorTableUpdater contract.
var OperatorTableUpdaterMetaData = &bind.MetaData{
ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_bn254CertificateVerifier\",\"type\":\"address\",\"internalType\":\"contractIBN254CertificateVerifier\"},{\"name\":\"_ecdsaCertificateVerifier\",\"type\":\"address\",\"internalType\":\"contractIECDSACertificateVerifier\"},{\"name\":\"_version\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"GLOBAL_TABLE_ROOT_CERT_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_BPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bn254CertificateVerifier\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBN254CertificateVerifier\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"confirmGlobalTableRoot\",\"inputs\":[{\"name\":\"globalTableRootCert\",\"type\":\"tuple\",\"internalType\":\"structIBN254CertificateVerifierTypes.BN254Certificate\",\"components\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signature\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apk\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"nonSignerWitnesses\",\"type\":\"tuple[]\",\"internalType\":\"structIBN254CertificateVerifierTypes.BN254OperatorInfoWitness[]\",\"components\":[{\"name\":\"operatorIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorInfoProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"operatorInfo\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorInfo\",\"components\":[{\"name\":\"pubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}]}]},{\"name\":\"globalTableRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"referenceBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"globalTableRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ecdsaCertificateVerifier\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIECDSACertificateVerifier\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCertificateVerifier\",\"inputs\":[{\"name\":\"curveType\",\"type\":\"uint8\",\"internalType\":\"enumIKeyRegistrarTypes.CurveType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentGlobalTableRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getGlobalConfirmerSetReferenceTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getGlobalRootConfirmerSet\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getGlobalTableRootByTimestamp\",\"inputs\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getGlobalTableUpdateMessageHash\",\"inputs\":[{\"name\":\"globalTableRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"referenceBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getLatestReferenceBlockNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLatestReferenceTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getReferenceBlockNumberByTimestamp\",\"inputs\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getReferenceTimestampByBlockNumber\",\"inputs\":[{\"name\":\"referenceBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"globalRootConfirmationThreshold\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_globalRootConfirmerSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"_globalRootConfirmationThreshold\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"globalRootConfirmerSetInfo\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorSetInfo\",\"components\":[{\"name\":\"operatorInfoTreeRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"numOperators\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"aggregatePubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"totalWeights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"globalRootConfirmerSetConfig\",\"type\":\"tuple\",\"internalType\":\"structICrossChainRegistryTypes.OperatorSetConfig\",\"components\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"maxStalenessPeriod\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isRootValid\",\"inputs\":[{\"name\":\"globalTableRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRootValidByTimestamp\",\"inputs\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setGlobalRootConfirmationThreshold\",\"inputs\":[{\"name\":\"bps\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setGlobalRootConfirmerSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateGlobalRootConfirmerSet\",\"inputs\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"globalRootConfirmerSetInfo\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorSetInfo\",\"components\":[{\"name\":\"operatorInfoTreeRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"numOperators\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"aggregatePubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"totalWeights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"globalRootConfirmerSetConfig\",\"type\":\"tuple\",\"internalType\":\"structICrossChainRegistryTypes.OperatorSetConfig\",\"components\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"maxStalenessPeriod\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateOperatorTable\",\"inputs\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"globalTableRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"operatorSetIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"operatorTableBytes\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"GlobalRootConfirmationThresholdUpdated\",\"inputs\":[{\"name\":\"bps\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GlobalRootConfirmerSetUpdated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GlobalRootDisabled\",\"inputs\":[{\"name\":\"globalTableRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewGlobalTableRoot\",\"inputs\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"globalTableRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CertificateInvalid\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GlobalTableRootInFuture\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GlobalTableRootStale\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidConfirmationThreshold\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCurveType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidGlobalTableRoot\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageHash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSetProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRoot\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignatureLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"TableUpdateForPastTimestamp\",\"inputs\":[]}]",
- Bin: "0x60e060405234801561000f575f5ffd5b5060405161231638038061231683398101604081905261002e91610188565b6001600160a01b03808416608052821660a0528061004b8161005f565b60c052506100576100a5565b5050506102b9565b5f5f829050601f81511115610092578260405163305a27a960e01b8152600401610089919061025e565b60405180910390fd5b805161009d82610293565b179392505050565b5f54610100900460ff161561010c5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401610089565b5f5460ff9081161461015b575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610171575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f6060848603121561019a575f5ffd5b83516101a58161015d565b60208501519093506101b68161015d565b60408501519092506001600160401b038111156101d1575f5ffd5b8401601f810186136101e1575f5ffd5b80516001600160401b038111156101fa576101fa610174565b604051601f8201601f19908116603f011681016001600160401b038111828210171561022857610228610174565b60405281815282820160200188101561023f575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b805160208083015191908110156102b3575f198160200360031b1b821691505b50919050565b60805160a05160c0516120026103145f395f61073601525f818161042b015281816107b701526109d501525f81816104520152818161068c015281816107770152818161093001528181610c040152610ed801526120025ff3fe608060405234801561000f575f5ffd5b50600436106101bb575f3560e01c806364e1df84116100f3578063c252aa2211610093578063c5916a391161006e578063c5916a39146104bb578063eaaed9d5146104e0578063f2fde38b146104f3578063fd967f4714610506575f5ffd5b8063c252aa2214610474578063c3621f0a14610495578063c3be1e33146104a8575f5ffd5b80638da5cb5b116100ce5780638da5cb5b146104025780639ea9477814610413578063ad0f958214610426578063b8c143061461044d575f5ffd5b806364e1df841461039a5780636f728c50146103cf578063715018a6146103fa575f5ffd5b806328522d791161015e5780633ef6cd7a116101395780633ef6cd7a146103025780634624e6a314610329578063462828891461033d57806354fd4d5014610385575f5ffd5b806328522d791461027f57806330ef41b4146102ab57806331a599d2146102dd575f5ffd5b8063193b79f311610199578063193b79f3146102095780631ab78d90146102315780632370356c1461024457806323b7b5b214610257575f5ffd5b8063021ab442146101bf5780630371406e146101d45780630f3f8edd146101e7575b5f5ffd5b6101d26101cd366004611264565b61050f565b005b6101d26101e23660046112f4565b61065f565b6101ef610673565b60405163ffffffff90911681526020015b60405180910390f35b6101ef610217366004611315565b63ffffffff9081165f908152606960205260409020541690565b6101d261023f366004611330565b610706565b6101d261025236600461138c565b61071e565b6101ef610265366004611315565b63ffffffff9081165f908152606860205260409020541690565b60655462010000900463ffffffff165f908152606760205260409020545b604051908152602001610200565b6102cd6102b93660046113a5565b5f908152606a602052604090205460ff1690565b6040519015158152602001610200565b60655462010000900463ffffffff9081165f90815260686020526040902054166101ef565b61029d7f4491f5ee91595f938885ef73c9a1fa8a6d14ff9b9dab4aa24b8802bbb9bfc1cc81565b60655462010000900463ffffffff166101ef565b6040805180820182525f80825260209182015281518083019092526066546001600160a01b0381168352600160a01b900463ffffffff169082015260405161020091906113da565b61038d61072f565b60405161020091906113e8565b6102cd6103a8366004611315565b63ffffffff165f908152606760209081526040808320548352606a90915290205460ff1690565b6103e26103dd36600461142b565b61075a565b6040516001600160a01b039091168152602001610200565b6101d26107f9565b6033546001600160a01b03166103e2565b6101d2610421366004611488565b61080c565b6103e27f000000000000000000000000000000000000000000000000000000000000000081565b6103e27f000000000000000000000000000000000000000000000000000000000000000081565b6065546104829061ffff1681565b60405161ffff9091168152602001610200565b6101d26104a33660046113a5565b610a3a565b61029d6104b6366004611523565b610aaf565b61029d6104c9366004611315565b63ffffffff165f9081526067602052604090205490565b6101d26104ee366004611562565b610b17565b6101d26105013660046115ce565b610d49565b61048261271081565b5f54610100900460ff161580801561052d57505f54600160ff909116105b806105465750303b15801561054657505f5460ff166001145b6105ae5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156105cf575f805461ff0019166101001790555b6105d887610dbb565b6105e186610e0c565b6105ea85610e56565b6105f5848484610ec1565b6065805465ffffffff000019166201000063ffffffff8716021790558015610656575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b610667610f3d565b61067081610e0c565b50565b604051635ddb9b5b60e01b81525f906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635ddb9b5b906106c2906066906004016115e9565b602060405180830381865afa1580156106dd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107019190611610565b905090565b61070e610f3d565b610719838383610ec1565b505050565b610726610f3d565b61067081610e56565b60606107017f0000000000000000000000000000000000000000000000000000000000000000610f97565b5f600282600281111561076f5761076f61162b565b0361079b57507f0000000000000000000000000000000000000000000000000000000000000000919050565b60018260028111156107af576107af61162b565b036107db57507f0000000000000000000000000000000000000000000000000000000000000000919050565b60405163fdea7c0960e01b815260040160405180910390fd5b919050565b610801610f3d565b61080a5f610dbb565b565b5f5f5f5f61081a8686610fd4565b5f8e8152606a60205260409020549397509195509350915060ff166108525760405163504570e360e01b815260040160405180910390fd5b61085b8361075a565b6001600160a01b0316635ddb9b5b856040518263ffffffff1660e01b815260040161088691906113da565b602060405180830381865afa1580156108a1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c59190611610565b63ffffffff168b63ffffffff16116108f05760405163207617df60e01b815260040160405180910390fd5b6109158b8b8b8b8b8b8b60405161090892919061163f565b604051809103902061101b565b60028360028111156109295761092961162b565b036109ba577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636738c40b858d610968856110bc565b866040518563ffffffff1660e01b81526004016109889493929190611688565b5f604051808303815f87803b15801561099f575f5ffd5b505af11580156109b1573d5f5f3e3d5ffd5b50505050610a2d565b60018360028111156109ce576109ce61162b565b036107db577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166356d482f5858d610a0d856110de565b866040518563ffffffff1660e01b81526004016109889493929190611704565b5050505050505050505050565b610a42610f3d565b5f818152606a602052604090205460ff16610a705760405163504570e360e01b815260040160405180910390fd5b5f818152606a6020526040808220805460ff191690555182917f8bd43de1250f58fe6ec9a78671a8b78dba70f0018656d157a3aeaabec389df3491a250565b604080517f4491f5ee91595f938885ef73c9a1fa8a6d14ff9b9dab4aa24b8802bbb9bfc1cc602082015290810184905263ffffffff8084166060830152821660808201525f9060a0016040516020818303038152906040528051906020012090509392505050565b428263ffffffff161115610b3e57604051635a119db560e11b815260040160405180910390fd5b60655463ffffffff62010000909104811690831611610b705760405163037fa86b60e31b815260040160405180910390fd5b610b7b838383610aaf565b846020013514610b9e57604051638b56642d60e01b815260040160405180910390fd5b6040805160018082528183019092525f91602080830190803683375050606554825192935061ffff16918391505f90610bd957610bd96117bd565b61ffff90921660209283029190910190910152604051625f5e5d60e21b81525f906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063017d797490610c3e906066908a9087906004016118ef565b6020604051808303815f875af1158015610c5a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c7e9190611a7c565b905080610c9e57604051633042041f60e21b815260040160405180910390fd5b6065805463ffffffff80871662010000810265ffffffff000019909316929092179092555f818152606860209081526040808320805495891663ffffffff1996871681179091558352606982528083208054909516841790945582825260678152838220899055888252606a9052828120805460ff19166001179055915187927f010dcbe0d1e019c93357711f7bb6287d543b7ff7de74f29df3fb5ecceec8d36991a3505050505050565b610d51610f3d565b6001600160a01b038116610db65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105a5565b610670815b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b806066610e198282611a9b565b9050507f20100394950e66014c25009b45d12b675210a6e7a002044a0e3de6544e3c4b3781604051610e4b9190611b2c565b60405180910390a150565b61271061ffff82161115610e7d576040516307336f0360e11b815260040160405180910390fd5b6065805461ffff191661ffff83169081179091556040519081527ff5d1836df8fcd7c1e54047e94ac8773d2855395603e2ef9ba5f5f16905f2259290602001610e4b565b604051636738c40b60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636738c40b90610f1490606690879087908790600401611b3a565b5f604051808303815f87803b158015610f2b575f5ffd5b505af1158015610656573d5f5f3e3d5ffd5b6033546001600160a01b0316331461080a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105a5565b60605f610fa3836110f4565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b604080518082019091525f8082526020820152604080518082019091525f8082526020820181905290606061100b85870187611c8d565b9299919850965090945092505050565b63ffffffff86165f90815260676020526040902054851461104f5760405163639d09b560e11b815260040160405180910390fd5b61109783838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508992508591505063ffffffff881661111b565b6110b45760405163afa42ca760e01b815260040160405180910390fd5b505050505050565b6110c46111c9565b818060200190518101906110d89190611dde565b92915050565b6060818060200190518101906110d89190611e8d565b5f60ff8216601f8111156110d857604051632cd44ac360e21b815260040160405180910390fd5b5f83611128868585611132565b1495945050505050565b5f602084516111419190611f8e565b1561115f576040516313717da960e21b815260040160405180910390fd5b8260205b855181116111c057611176600285611f8e565b5f0361119757815f528086015160205260405f2091506002840493506111ae565b808601515f528160205260405f2091506002840493505b6111b9602082611fad565b9050611163565b50949350505050565b60405180608001604052805f81526020015f81526020016111fb60405180604001604052805f81526020015f81525090565b8152602001606081525090565b6001600160a01b0381168114610670575f5ffd5b5f6040828403121561122c575f5ffd5b50919050565b803561ffff811681146107f4575f5ffd5b63ffffffff81168114610670575f5ffd5b5f60a0828403121561122c575f5ffd5b5f5f5f5f5f5f610100878903121561127a575f5ffd5b863561128581611208565b9550611294886020890161121c565b94506112a260608801611232565b935060808701356112b281611243565b925060a08701356001600160401b038111156112cc575f5ffd5b6112d889828a01611254565b9250506112e88860c0890161121c565b90509295509295509295565b5f60408284031215611304575f5ffd5b61130e838361121c565b9392505050565b5f60208284031215611325575f5ffd5b813561130e81611243565b5f5f5f60808486031215611342575f5ffd5b833561134d81611243565b925060208401356001600160401b03811115611367575f5ffd5b61137386828701611254565b925050611383856040860161121c565b90509250925092565b5f6020828403121561139c575f5ffd5b61130e82611232565b5f602082840312156113b5575f5ffd5b5035919050565b80516001600160a01b0316825260209081015163ffffffff16910152565b604081016110d882846113bc565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b8035600381106107f4575f5ffd5b5f6020828403121561143b575f5ffd5b61130e8261141d565b5f5f83601f840112611454575f5ffd5b5081356001600160401b0381111561146a575f5ffd5b602083019150836020828501011115611481575f5ffd5b9250929050565b5f5f5f5f5f5f5f60a0888a03121561149e575f5ffd5b87356114a981611243565b96506020880135955060408801356114c081611243565b945060608801356001600160401b038111156114da575f5ffd5b6114e68a828b01611444565b90955093505060808801356001600160401b03811115611504575f5ffd5b6115108a828b01611444565b989b979a50959850939692959293505050565b5f5f5f60608486031215611535575f5ffd5b83359250602084013561154781611243565b9150604084013561155781611243565b809150509250925092565b5f5f5f5f60808587031215611575575f5ffd5b84356001600160401b0381111561158a575f5ffd5b8501610120818803121561159c575f5ffd5b93506020850135925060408501356115b381611243565b915060608501356115c381611243565b939692955090935050565b5f602082840312156115de575f5ffd5b813561130e81611208565b604081016110d88284546001600160a01b038116825260a01c63ffffffff16602090910152565b5f60208284031215611620575f5ffd5b815161130e81611243565b634e487b7160e01b5f52602160045260245ffd5b818382375f9101908152919050565b5f8151808452602084019350602083015f5b8281101561167e578151865260209586019590910190600101611660565b5093949350505050565b61169281866113bc565b63ffffffff8416604082015260c06060820152825160c0820152602083015160e08201525f60408401518051610100840152602081015161012084015250606084015160a06101408401526116eb61016084018261164e565b9150506116fb60808301846113bc565b95945050505050565b5f60c0820161171383886113bc565b63ffffffff8616604084015260c0606084015280855180835260e08501915060e08160051b8601019250602087015f5b828110156117945786850360df19018452815180516001600160a01b0316865260209081015160409187018290529061177e9087018261164e565b9550506020938401939190910190600101611743565b50505050809150506116fb60808301846113bc565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f5f8335601e198436030181126117e6575f5ffd5b83016020810192503590506001600160401b03811115611804575f5ffd5b8060051b3603821315611481575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8235605e19833603018112611851575f5ffd5b90910192915050565b8183525f6001600160fb1b03831115611871575f5ffd5b8260051b80836020870137939093016020019392505050565b80358252602080820135908301525f6118a660408301836117d1565b606060408601526116fb60608601828461185a565b5f8151808452602084019350602083015f5b8281101561167e57815161ffff168652602095860195909101906001016118cd565b6119128185546001600160a01b038116825260a01c63ffffffff16602090910152565b608060408201525f6101a08201843561192a81611243565b63ffffffff166080840152602085013560a0840152604085013560c0840152606085013560e0840152604060808601610100850137604060c086016101408501376119796101008601866117d1565b610120610180860152828184526101c0860190506101c08260051b8701019350825f5b83811015611a5b578786036101bf190183526119b8828661183d565b80356119c381611243565b63ffffffff168752602081013536829003601e190181126119e2575f5ffd5b81016020810190356001600160401b038111156119fd575f5ffd5b803603821315611a0b575f5ffd5b606060208a0152611a2060608a018284611815565b915050611a30604083018361183d565b91508781036040890152611a44818361188a565b97505050602092830192919091019060010161199c565b50505050508281036060840152611a7281856118bb565b9695505050505050565b5f60208284031215611a8c575f5ffd5b8151801515811461130e575f5ffd5b8135611aa681611208565b81546001600160a01b031981166001600160a01b039290921691821783556020840135611ad281611243565b6001600160c01b03199190911690911760a09190911b63ffffffff60a01b1617905550565b8035611b0281611208565b6001600160a01b031682526020810135611b1b81611243565b63ffffffff81166020840152505050565b604081016110d88284611af7565b611b5d8186546001600160a01b038116825260a01c63ffffffff16602090910152565b63ffffffff841660408281019190915260c06060808401829052853591840191909152602085013560e0840152908401356101008301528301356101208201525f611bab60808501856117d1565b60a0610140850152611bc26101608501828461185a565b925050506116fb6080830184611af7565b604080519081016001600160401b0381118282101715611bf557611bf56117a9565b60405290565b604051608081016001600160401b0381118282101715611bf557611bf56117a9565b604051601f8201601f191681016001600160401b0381118282101715611c4557611c456117a9565b604052919050565b5f60408284031215611c5d575f5ffd5b611c65611bd3565b90508135611c7281611208565b81526020820135611c8281611243565b602082015292915050565b5f5f5f5f60c08587031215611ca0575f5ffd5b611caa8686611c4d565b9350611cb86040860161141d565b9250611cc78660608701611c4d565b915060a08501356001600160401b03811115611ce1575f5ffd5b8501601f81018713611cf1575f5ffd5b80356001600160401b03811115611d0a57611d0a6117a9565b611d1d601f8201601f1916602001611c1d565b818152886020838501011115611d31575f5ffd5b816020840160208301375f6020838301015280935050505092959194509250565b5f6001600160401b03821115611d6a57611d6a6117a9565b5060051b60200190565b5f82601f830112611d83575f5ffd5b8151611d96611d9182611d52565b611c1d565b8082825260208201915060208360051b860101925085831115611db7575f5ffd5b602085015b83811015611dd4578051835260209283019201611dbc565b5095945050505050565b5f60208284031215611dee575f5ffd5b81516001600160401b03811115611e03575f5ffd5b820180840360a0811215611e15575f5ffd5b611e1d611bfb565b82518152602080840151908201526040603f1983011215611e3c575f5ffd5b611e44611bd3565b604084810151825260608501516020830152820152608083015191506001600160401b03821115611e73575f5ffd5b611e7f86838501611d74565b606082015295945050505050565b5f60208284031215611e9d575f5ffd5b81516001600160401b03811115611eb2575f5ffd5b8201601f81018413611ec2575f5ffd5b8051611ed0611d9182611d52565b8082825260208201915060208360051b850101925086831115611ef1575f5ffd5b602084015b83811015611f835780516001600160401b03811115611f13575f5ffd5b85016040818a03601f19011215611f28575f5ffd5b611f30611bd3565b6020820151611f3e81611208565b815260408201516001600160401b03811115611f58575f5ffd5b611f678b602083860101611d74565b6020830152508085525050602083019250602081019050611ef6565b509695505050505050565b5f82611fa857634e487b7160e01b5f52601260045260245ffd5b500690565b808201808211156110d857634e487b7160e01b5f52601160045260245ffdfea2646970667358221220cfe7b7fbc9077ac2afa7009b29263d1c42df26fddbd6f0875100a2981768952b64736f6c634300081b0033",
+ Bin: "0x60e060405234801561000f575f5ffd5b5060405161231638038061231683398101604081905261002e91610188565b6001600160a01b03808416608052821660a0528061004b8161005f565b60c052506100576100a5565b5050506102b9565b5f5f829050601f81511115610092578260405163305a27a960e01b8152600401610089919061025e565b60405180910390fd5b805161009d82610293565b179392505050565b5f54610100900460ff161561010c5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401610089565b5f5460ff9081161461015b575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610171575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f6060848603121561019a575f5ffd5b83516101a58161015d565b60208501519093506101b68161015d565b60408501519092506001600160401b038111156101d1575f5ffd5b8401601f810186136101e1575f5ffd5b80516001600160401b038111156101fa576101fa610174565b604051601f8201601f19908116603f011681016001600160401b038111828210171561022857610228610174565b60405281815282820160200188101561023f575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b805160208083015191908110156102b3575f198160200360031b1b821691505b50919050565b60805160a05160c0516120026103145f395f61073601525f818161042b015281816107b701526109d501525f81816104520152818161068c015281816107770152818161093001528181610c040152610ed801526120025ff3fe608060405234801561000f575f5ffd5b50600436106101bb575f3560e01c806364e1df84116100f3578063c252aa2211610093578063c5916a391161006e578063c5916a39146104bb578063eaaed9d5146104e0578063f2fde38b146104f3578063fd967f4714610506575f5ffd5b8063c252aa2214610474578063c3621f0a14610495578063c3be1e33146104a8575f5ffd5b80638da5cb5b116100ce5780638da5cb5b146104025780639ea9477814610413578063ad0f958214610426578063b8c143061461044d575f5ffd5b806364e1df841461039a5780636f728c50146103cf578063715018a6146103fa575f5ffd5b806328522d791161015e5780633ef6cd7a116101395780633ef6cd7a146103025780634624e6a314610329578063462828891461033d57806354fd4d5014610385575f5ffd5b806328522d791461027f57806330ef41b4146102ab57806331a599d2146102dd575f5ffd5b8063193b79f311610199578063193b79f3146102095780631ab78d90146102315780632370356c1461024457806323b7b5b214610257575f5ffd5b8063021ab442146101bf5780630371406e146101d45780630f3f8edd146101e7575b5f5ffd5b6101d26101cd366004611264565b61050f565b005b6101d26101e23660046112f4565b61065f565b6101ef610673565b60405163ffffffff90911681526020015b60405180910390f35b6101ef610217366004611315565b63ffffffff9081165f908152606960205260409020541690565b6101d261023f366004611330565b610706565b6101d261025236600461138c565b61071e565b6101ef610265366004611315565b63ffffffff9081165f908152606860205260409020541690565b60655462010000900463ffffffff165f908152606760205260409020545b604051908152602001610200565b6102cd6102b93660046113a5565b5f908152606a602052604090205460ff1690565b6040519015158152602001610200565b60655462010000900463ffffffff9081165f90815260686020526040902054166101ef565b61029d7f4491f5ee91595f938885ef73c9a1fa8a6d14ff9b9dab4aa24b8802bbb9bfc1cc81565b60655462010000900463ffffffff166101ef565b6040805180820182525f80825260209182015281518083019092526066546001600160a01b0381168352600160a01b900463ffffffff169082015260405161020091906113da565b61038d61072f565b60405161020091906113e8565b6102cd6103a8366004611315565b63ffffffff165f908152606760209081526040808320548352606a90915290205460ff1690565b6103e26103dd36600461142b565b61075a565b6040516001600160a01b039091168152602001610200565b6101d26107f9565b6033546001600160a01b03166103e2565b6101d2610421366004611488565b61080c565b6103e27f000000000000000000000000000000000000000000000000000000000000000081565b6103e27f000000000000000000000000000000000000000000000000000000000000000081565b6065546104829061ffff1681565b60405161ffff9091168152602001610200565b6101d26104a33660046113a5565b610a3a565b61029d6104b6366004611523565b610aaf565b61029d6104c9366004611315565b63ffffffff165f9081526067602052604090205490565b6101d26104ee366004611562565b610b17565b6101d26105013660046115ce565b610d49565b61048261271081565b5f54610100900460ff161580801561052d57505f54600160ff909116105b806105465750303b15801561054657505f5460ff166001145b6105ae5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156105cf575f805461ff0019166101001790555b6105d887610dbb565b6105e186610e0c565b6105ea85610e56565b6105f5848484610ec1565b6065805465ffffffff000019166201000063ffffffff8716021790558015610656575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b610667610f3d565b61067081610e0c565b50565b604051635ddb9b5b60e01b81525f906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635ddb9b5b906106c2906066906004016115e9565b602060405180830381865afa1580156106dd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107019190611610565b905090565b61070e610f3d565b610719838383610ec1565b505050565b610726610f3d565b61067081610e56565b60606107017f0000000000000000000000000000000000000000000000000000000000000000610f97565b5f600282600281111561076f5761076f61162b565b0361079b57507f0000000000000000000000000000000000000000000000000000000000000000919050565b60018260028111156107af576107af61162b565b036107db57507f0000000000000000000000000000000000000000000000000000000000000000919050565b60405163fdea7c0960e01b815260040160405180910390fd5b919050565b610801610f3d565b61080a5f610dbb565b565b5f5f5f5f61081a8686610fd4565b5f8e8152606a60205260409020549397509195509350915060ff166108525760405163504570e360e01b815260040160405180910390fd5b61085b8361075a565b6001600160a01b0316635ddb9b5b856040518263ffffffff1660e01b815260040161088691906113da565b602060405180830381865afa1580156108a1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c59190611610565b63ffffffff168b63ffffffff16116108f05760405163207617df60e01b815260040160405180910390fd5b6109158b8b8b8b8b8b8b60405161090892919061163f565b604051809103902061101b565b60028360028111156109295761092961162b565b036109ba577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636738c40b858d610968856110bc565b866040518563ffffffff1660e01b81526004016109889493929190611688565b5f604051808303815f87803b15801561099f575f5ffd5b505af11580156109b1573d5f5f3e3d5ffd5b50505050610a2d565b60018360028111156109ce576109ce61162b565b036107db577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166356d482f5858d610a0d856110de565b866040518563ffffffff1660e01b81526004016109889493929190611704565b5050505050505050505050565b610a42610f3d565b5f818152606a602052604090205460ff16610a705760405163504570e360e01b815260040160405180910390fd5b5f818152606a6020526040808220805460ff191690555182917f8bd43de1250f58fe6ec9a78671a8b78dba70f0018656d157a3aeaabec389df3491a250565b604080517f4491f5ee91595f938885ef73c9a1fa8a6d14ff9b9dab4aa24b8802bbb9bfc1cc602082015290810184905263ffffffff8084166060830152821660808201525f9060a0016040516020818303038152906040528051906020012090509392505050565b428263ffffffff161115610b3e57604051635a119db560e11b815260040160405180910390fd5b60655463ffffffff62010000909104811690831611610b705760405163037fa86b60e31b815260040160405180910390fd5b610b7b838383610aaf565b846020013514610b9e57604051638b56642d60e01b815260040160405180910390fd5b6040805160018082528183019092525f91602080830190803683375050606554825192935061ffff16918391505f90610bd957610bd96117bd565b61ffff90921660209283029190910190910152604051625f5e5d60e21b81525f906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063017d797490610c3e906066908a9087906004016118ef565b6020604051808303815f875af1158015610c5a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c7e9190611a7c565b905080610c9e57604051633042041f60e21b815260040160405180910390fd5b6065805463ffffffff80871662010000810265ffffffff000019909316929092179092555f818152606860209081526040808320805495891663ffffffff1996871681179091558352606982528083208054909516841790945582825260678152838220899055888252606a9052828120805460ff19166001179055915187927f010dcbe0d1e019c93357711f7bb6287d543b7ff7de74f29df3fb5ecceec8d36991a3505050505050565b610d51610f3d565b6001600160a01b038116610db65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105a5565b610670815b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b806066610e198282611a9b565b9050507f20100394950e66014c25009b45d12b675210a6e7a002044a0e3de6544e3c4b3781604051610e4b9190611b2c565b60405180910390a150565b61271061ffff82161115610e7d576040516307336f0360e11b815260040160405180910390fd5b6065805461ffff191661ffff83169081179091556040519081527ff5d1836df8fcd7c1e54047e94ac8773d2855395603e2ef9ba5f5f16905f2259290602001610e4b565b604051636738c40b60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636738c40b90610f1490606690879087908790600401611b3a565b5f604051808303815f87803b158015610f2b575f5ffd5b505af1158015610656573d5f5f3e3d5ffd5b6033546001600160a01b0316331461080a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105a5565b60605f610fa3836110f4565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b604080518082019091525f8082526020820152604080518082019091525f8082526020820181905290606061100b85870187611c8d565b9299919850965090945092505050565b63ffffffff86165f90815260676020526040902054851461104f5760405163639d09b560e11b815260040160405180910390fd5b61109783838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508992508591505063ffffffff881661111b565b6110b45760405163afa42ca760e01b815260040160405180910390fd5b505050505050565b6110c46111c9565b818060200190518101906110d89190611dde565b92915050565b6060818060200190518101906110d89190611e8d565b5f60ff8216601f8111156110d857604051632cd44ac360e21b815260040160405180910390fd5b5f83611128868585611132565b1495945050505050565b5f602084516111419190611f8e565b1561115f576040516313717da960e21b815260040160405180910390fd5b8260205b855181116111c057611176600285611f8e565b5f0361119757815f528086015160205260405f2091506002840493506111ae565b808601515f528160205260405f2091506002840493505b6111b9602082611fad565b9050611163565b50949350505050565b60405180608001604052805f81526020015f81526020016111fb60405180604001604052805f81526020015f81525090565b8152602001606081525090565b6001600160a01b0381168114610670575f5ffd5b5f6040828403121561122c575f5ffd5b50919050565b803561ffff811681146107f4575f5ffd5b63ffffffff81168114610670575f5ffd5b5f60a0828403121561122c575f5ffd5b5f5f5f5f5f5f610100878903121561127a575f5ffd5b863561128581611208565b9550611294886020890161121c565b94506112a260608801611232565b935060808701356112b281611243565b925060a08701356001600160401b038111156112cc575f5ffd5b6112d889828a01611254565b9250506112e88860c0890161121c565b90509295509295509295565b5f60408284031215611304575f5ffd5b61130e838361121c565b9392505050565b5f60208284031215611325575f5ffd5b813561130e81611243565b5f5f5f60808486031215611342575f5ffd5b833561134d81611243565b925060208401356001600160401b03811115611367575f5ffd5b61137386828701611254565b925050611383856040860161121c565b90509250925092565b5f6020828403121561139c575f5ffd5b61130e82611232565b5f602082840312156113b5575f5ffd5b5035919050565b80516001600160a01b0316825260209081015163ffffffff16910152565b604081016110d882846113bc565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b8035600381106107f4575f5ffd5b5f6020828403121561143b575f5ffd5b61130e8261141d565b5f5f83601f840112611454575f5ffd5b5081356001600160401b0381111561146a575f5ffd5b602083019150836020828501011115611481575f5ffd5b9250929050565b5f5f5f5f5f5f5f60a0888a03121561149e575f5ffd5b87356114a981611243565b96506020880135955060408801356114c081611243565b945060608801356001600160401b038111156114da575f5ffd5b6114e68a828b01611444565b90955093505060808801356001600160401b03811115611504575f5ffd5b6115108a828b01611444565b989b979a50959850939692959293505050565b5f5f5f60608486031215611535575f5ffd5b83359250602084013561154781611243565b9150604084013561155781611243565b809150509250925092565b5f5f5f5f60808587031215611575575f5ffd5b84356001600160401b0381111561158a575f5ffd5b8501610120818803121561159c575f5ffd5b93506020850135925060408501356115b381611243565b915060608501356115c381611243565b939692955090935050565b5f602082840312156115de575f5ffd5b813561130e81611208565b604081016110d88284546001600160a01b038116825260a01c63ffffffff16602090910152565b5f60208284031215611620575f5ffd5b815161130e81611243565b634e487b7160e01b5f52602160045260245ffd5b818382375f9101908152919050565b5f8151808452602084019350602083015f5b8281101561167e578151865260209586019590910190600101611660565b5093949350505050565b61169281866113bc565b63ffffffff8416604082015260c06060820152825160c0820152602083015160e08201525f60408401518051610100840152602081015161012084015250606084015160a06101408401526116eb61016084018261164e565b9150506116fb60808301846113bc565b95945050505050565b5f60c0820161171383886113bc565b63ffffffff8616604084015260c0606084015280855180835260e08501915060e08160051b8601019250602087015f5b828110156117945786850360df19018452815180516001600160a01b0316865260209081015160409187018290529061177e9087018261164e565b9550506020938401939190910190600101611743565b50505050809150506116fb60808301846113bc565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f5f8335601e198436030181126117e6575f5ffd5b83016020810192503590506001600160401b03811115611804575f5ffd5b8060051b3603821315611481575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8235605e19833603018112611851575f5ffd5b90910192915050565b8183525f6001600160fb1b03831115611871575f5ffd5b8260051b80836020870137939093016020019392505050565b80358252602080820135908301525f6118a660408301836117d1565b606060408601526116fb60608601828461185a565b5f8151808452602084019350602083015f5b8281101561167e57815161ffff168652602095860195909101906001016118cd565b6119128185546001600160a01b038116825260a01c63ffffffff16602090910152565b608060408201525f6101a08201843561192a81611243565b63ffffffff166080840152602085013560a0840152604085013560c0840152606085013560e0840152604060808601610100850137604060c086016101408501376119796101008601866117d1565b610120610180860152828184526101c0860190506101c08260051b8701019350825f5b83811015611a5b578786036101bf190183526119b8828661183d565b80356119c381611243565b63ffffffff168752602081013536829003601e190181126119e2575f5ffd5b81016020810190356001600160401b038111156119fd575f5ffd5b803603821315611a0b575f5ffd5b606060208a0152611a2060608a018284611815565b915050611a30604083018361183d565b91508781036040890152611a44818361188a565b97505050602092830192919091019060010161199c565b50505050508281036060840152611a7281856118bb565b9695505050505050565b5f60208284031215611a8c575f5ffd5b8151801515811461130e575f5ffd5b8135611aa681611208565b81546001600160a01b031981166001600160a01b039290921691821783556020840135611ad281611243565b6001600160c01b03199190911690911760a09190911b63ffffffff60a01b1617905550565b8035611b0281611208565b6001600160a01b031682526020810135611b1b81611243565b63ffffffff81166020840152505050565b604081016110d88284611af7565b611b5d8186546001600160a01b038116825260a01c63ffffffff16602090910152565b63ffffffff841660408281019190915260c06060808401829052853591840191909152602085013560e0840152908401356101008301528301356101208201525f611bab60808501856117d1565b60a0610140850152611bc26101608501828461185a565b925050506116fb6080830184611af7565b604080519081016001600160401b0381118282101715611bf557611bf56117a9565b60405290565b604051608081016001600160401b0381118282101715611bf557611bf56117a9565b604051601f8201601f191681016001600160401b0381118282101715611c4557611c456117a9565b604052919050565b5f60408284031215611c5d575f5ffd5b611c65611bd3565b90508135611c7281611208565b81526020820135611c8281611243565b602082015292915050565b5f5f5f5f60c08587031215611ca0575f5ffd5b611caa8686611c4d565b9350611cb86040860161141d565b9250611cc78660608701611c4d565b915060a08501356001600160401b03811115611ce1575f5ffd5b8501601f81018713611cf1575f5ffd5b80356001600160401b03811115611d0a57611d0a6117a9565b611d1d601f8201601f1916602001611c1d565b818152886020838501011115611d31575f5ffd5b816020840160208301375f6020838301015280935050505092959194509250565b5f6001600160401b03821115611d6a57611d6a6117a9565b5060051b60200190565b5f82601f830112611d83575f5ffd5b8151611d96611d9182611d52565b611c1d565b8082825260208201915060208360051b860101925085831115611db7575f5ffd5b602085015b83811015611dd4578051835260209283019201611dbc565b5095945050505050565b5f60208284031215611dee575f5ffd5b81516001600160401b03811115611e03575f5ffd5b820180840360a0811215611e15575f5ffd5b611e1d611bfb565b82518152602080840151908201526040603f1983011215611e3c575f5ffd5b611e44611bd3565b604084810151825260608501516020830152820152608083015191506001600160401b03821115611e73575f5ffd5b611e7f86838501611d74565b606082015295945050505050565b5f60208284031215611e9d575f5ffd5b81516001600160401b03811115611eb2575f5ffd5b8201601f81018413611ec2575f5ffd5b8051611ed0611d9182611d52565b8082825260208201915060208360051b850101925086831115611ef1575f5ffd5b602084015b83811015611f835780516001600160401b03811115611f13575f5ffd5b85016040818a03601f19011215611f28575f5ffd5b611f30611bd3565b6020820151611f3e81611208565b815260408201516001600160401b03811115611f58575f5ffd5b611f678b602083860101611d74565b6020830152508085525050602083019250602081019050611ef6565b509695505050505050565b5f82611fa857634e487b7160e01b5f52601260045260245ffd5b500690565b808201808211156110d857634e487b7160e01b5f52601160045260245ffdfea2646970667358221220b836ba05a5dfc0bcc0e069a30586c95fda74afaead97b10b0de1eb72351ddac464736f6c634300081b0033",
}
// OperatorTableUpdaterABI is the input ABI used to generate the binding from.
diff --git a/src/contracts/interfaces/IBN254CertificateVerifier.sol b/src/contracts/interfaces/IBN254CertificateVerifier.sol
index 4bff1f30c6..9769ed6784 100644
--- a/src/contracts/interfaces/IBN254CertificateVerifier.sol
+++ b/src/contracts/interfaces/IBN254CertificateVerifier.sol
@@ -74,7 +74,7 @@ interface IBN254CertificateVerifier is
* @param operatorSet the operatorSet that the certificate is for
* @param cert a certificate
* @return signedStakes amount of stake that signed the certificate for each stake
- * type
+ * type. Each index corresponds to a stake type in the `totalWeights` array in the `BN254OperatorSetInfo`.
*/
function verifyCertificate(
OperatorSet memory operatorSet,
@@ -86,8 +86,9 @@ interface IBN254CertificateVerifier is
* provided portions of the total stake on the AVS
* @param operatorSet the operatorSet that the certificate is for
* @param cert a certificate
- * @param totalStakeProportionThresholds the proportion of total stake that
- * the signed stake of the certificate should meet
+ * @param totalStakeProportionThresholds the proportion, in BPS,of total stake that
+ * the signed stake of the certificate should meet. Each index corresponds to
+ * a stake type in the `totalWeights` array in the `BN254OperatorSetInfo`.
* @return whether or not certificate is valid and meets thresholds
*/
function verifyCertificateProportion(
@@ -102,7 +103,8 @@ interface IBN254CertificateVerifier is
* @param operatorSet the operatorSet that the certificate is for
* @param cert a certificate
* @param totalStakeNominalThresholds the nominal amount of stake that
- * the signed stake of the certificate should meet
+ * the signed stake of the certificate should meet. Each index corresponds to
+ * a stake type in the `totalWeights` array in the `BN254OperatorSetInfo`.
* @return whether or not certificate is valid and meets thresholds
*/
function verifyCertificateNominal(
diff --git a/src/contracts/interfaces/IBN254TableCalculator.sol b/src/contracts/interfaces/IBN254TableCalculator.sol
new file mode 100644
index 0000000000..6741351b7c
--- /dev/null
+++ b/src/contracts/interfaces/IBN254TableCalculator.sol
@@ -0,0 +1,63 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity >=0.5.0;
+
+import "../libraries/BN254.sol";
+import "../libraries/OperatorSetLib.sol";
+import "./IOperatorTableCalculator.sol";
+
+interface IBN254TableCalculatorTypes {
+ /**
+ * @notice A struct that contains information about a single operator
+ * @param pubkey The G1 public key of the operator.
+ * @param weights The weights of the operator for a single operatorSet.
+ * @dev The `weights` array can be defined as a list of arbitrary groupings. For example,
+ * it can be [slashable_stake, delegated_stake, strategy_i_stake, ...]
+ */
+ struct BN254OperatorInfo {
+ BN254.G1Point pubkey;
+ uint256[] weights;
+ }
+
+ /**
+ * @notice A struct that contains information about all operators for a given operatorSet
+ * @param operatorInfoTreeRoot The root of the operatorInfo tree. Each leaf is a `BN254OperatorInfo` struct
+ * @param numOperators The number of operators in the operatorSet.
+ * @param aggregatePubkey The aggregate G1 public key of the operators in the operatorSet.
+ * @param totalWeights The total weights of the operators in the operatorSet.
+ *
+ * @dev The operatorInfoTreeRoot is the root of a merkle tree that contains the operatorInfos for each operator in the operatorSet.
+ * It is calculated in this function and used by the `IBN254CertificateVerifier` to verify stakes against the non-signing operators
+ *
+ * @dev Retrieval of the `aggregatePubKey` depends on maintaining a key registry contract or using the core `KeyRegistrar` contract.
+ * See `BN254TableCalculatorBase` in the middleware repo for an example implementation.
+ *
+ * @dev The `totalWeights` array should be the same length as each individual `weights` array in `operatorInfos`.
+ */
+ struct BN254OperatorSetInfo {
+ bytes32 operatorInfoTreeRoot;
+ uint256 numOperators;
+ BN254.G1Point aggregatePubkey;
+ uint256[] totalWeights;
+ }
+}
+
+interface IBN254TableCalculator is IOperatorTableCalculator, IBN254TableCalculatorTypes {
+ /**
+ * @notice calculates the operatorInfos for a given operatorSet
+ * @param operatorSet the operatorSet to calculate the operator table for
+ * @return operatorSetInfo the operatorSetInfo for the given operatorSet
+ * @dev The output of this function is converted to bytes via the `calculateOperatorTableBytes` function
+ */
+ function calculateOperatorTable(
+ OperatorSet calldata operatorSet
+ ) external view returns (BN254OperatorSetInfo memory operatorSetInfo);
+
+ /**
+ * @notice Get the operatorInfos for a given operatorSet
+ * @param operatorSet the operatorSet to get the operatorInfos for
+ * @return operatorInfos the operatorInfos for the given operatorSet
+ */
+ function getOperatorInfos(
+ OperatorSet calldata operatorSet
+ ) external view returns (BN254OperatorInfo[] memory operatorInfos);
+}
diff --git a/src/contracts/interfaces/IECDSACertificateVerifier.sol b/src/contracts/interfaces/IECDSACertificateVerifier.sol
index 55e263dca1..1adb83933d 100644
--- a/src/contracts/interfaces/IECDSACertificateVerifier.sol
+++ b/src/contracts/interfaces/IECDSACertificateVerifier.sol
@@ -13,7 +13,7 @@ interface IECDSACertificateVerifierTypes is IOperatorTableCalculatorTypes {
* @notice A ECDSA Certificate
* @param referenceTimestamp the timestamp at which the certificate was created
* @param messageHash the hash of the message that was signed by operators
- * @param signature the concatenated signature of each signing operator
+ * @param sig the concatenated signature of each signing operator
*/
struct ECDSACertificate {
uint32 referenceTimestamp;
@@ -50,7 +50,7 @@ interface IECDSACertificateVerifier is IECDSACertificateVerifierEvents, IBaseCer
* @notice verifies a certificate
* @param cert a certificate
* @return signedStakes amount of stake that signed the certificate for each stake
- * type
+ * type. Each index corresponds to a stake type in the `weights` array in the `ECDSAOperatorInfo`
*/
function verifyCertificate(
OperatorSet calldata operatorSet,
@@ -61,8 +61,9 @@ interface IECDSACertificateVerifier is IECDSACertificateVerifierEvents, IBaseCer
* @notice verifies a certificate and makes sure that the signed stakes meet
* provided portions of the total stake on the AVS
* @param cert a certificate
- * @param totalStakeProportionThresholds the proportion of total stake that
- * the signed stake of the certificate should meet
+ * @param totalStakeProportionThresholds the proportion, in BPS, of total stake that
+ * the signed stake of the certificate should meet. Each index corresponds to
+ * a stake type in the `weights` array in the `ECDSAOperatorInfo`
* @return Whether or not the certificate is valid and meets thresholds
*/
function verifyCertificateProportion(
@@ -75,8 +76,9 @@ interface IECDSACertificateVerifier is IECDSACertificateVerifierEvents, IBaseCer
* @notice verifies a certificate and makes sure that the signed stakes meet
* provided portions of the total stake on the AVS
* @param cert a certificate
- * @param totalStakeNominalThresholds the proportion of total stake that
- * the signed stake of the certificate should meet
+ * @param totalStakeNominalThresholds the nominal amount of total stake that
+ * the signed stake of the certificate should meet. Each index corresponds to
+ * a stake type in the `weights` array in the `ECDSAOperatorInfo`
* @return Whether or not the certificate is valid and meets thresholds
*/
function verifyCertificateNominal(
diff --git a/src/contracts/interfaces/IECDSATableCalculator.sol b/src/contracts/interfaces/IECDSATableCalculator.sol
new file mode 100644
index 0000000000..f233a8fa12
--- /dev/null
+++ b/src/contracts/interfaces/IECDSATableCalculator.sol
@@ -0,0 +1,48 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity >=0.5.0;
+
+import "../libraries/OperatorSetLib.sol";
+import "./IOperatorTableCalculator.sol";
+
+interface IECDSATableCalculatorTypes {
+ /**
+ * @notice A struct that contains information about a single operator
+ * @param pubkey The address of the signing ECDSA key of the operator and not the operator address itself.
+ * This is read from the KeyRegistrar contract.
+ * @param weights The weights of the operator for a single operatorSet
+ * @dev The `weights` array can be defined as a list of arbitrary groupings. For example,
+ * it can be [slashable_stake, delegated_stake, strategy_i_stake, ...]
+ * @dev The `weights` array should be the same length for each operator in the operatorSet.
+ */
+ struct ECDSAOperatorInfo {
+ address pubkey;
+ uint256[] weights;
+ }
+}
+
+interface IECDSATableCalculatorEvents {
+ /// @notice Emitted when the lookahead blocks are set
+ event LookaheadBlocksSet(uint256 lookaheadBlocks);
+}
+
+interface IECDSATableCalculatorErrors {
+ /// @notice Emitted when the lookahead blocks are too high
+ error LookaheadBlocksTooHigh();
+}
+
+interface IECDSATableCalculator is
+ IOperatorTableCalculator,
+ IECDSATableCalculatorTypes,
+ IECDSATableCalculatorEvents,
+ IECDSATableCalculatorErrors
+{
+ /**
+ * @notice calculates the operatorInfos for a given operatorSet
+ * @param operatorSet the operatorSet to calculate the operator table for
+ * @return operatorInfos the list of operatorInfos for the given operatorSet
+ * @dev The output of this function is converted to bytes via the `calculateOperatorTableBytes` function
+ */
+ function calculateOperatorTable(
+ OperatorSet calldata operatorSet
+ ) external view returns (ECDSAOperatorInfo[] memory operatorInfos);
+}
diff --git a/src/contracts/permissions/KeyRegistrar.sol b/src/contracts/permissions/KeyRegistrar.sol
index 10b98857d8..800cc8dce0 100644
--- a/src/contracts/permissions/KeyRegistrar.sol
+++ b/src/contracts/permissions/KeyRegistrar.sol
@@ -73,7 +73,7 @@ contract KeyRegistrar is KeyRegistrarStorage, PermissionControllerMixin, Signatu
CurveType curveType = _operatorSetCurveTypes[operatorSet.key()];
require(curveType != CurveType.NONE, OperatorSetNotConfigured());
- // Check if the key is already registered
+ // Check if the operator is already registered to the operatorSet
require(!_operatorKeyInfo[operatorSet.key()][operator].isRegistered, KeyAlreadyRegistered());
// Register key based on curve type - both now require signature verification