From 14786498e4c7d7a7fc7f5de6e29f3cdf71421386 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 23 Jul 2025 22:50:16 -0700 Subject: [PATCH 001/117] wip --- contracts/contracts/core/BlockTracker.sol | 1 + contracts/contracts/core/BlockTrackerStorage.sol | 1 + 2 files changed, 2 insertions(+) diff --git a/contracts/contracts/core/BlockTracker.sol b/contracts/contracts/core/BlockTracker.sol index 8a55e0b33..b555732e9 100644 --- a/contracts/contracts/core/BlockTracker.sol +++ b/contracts/contracts/core/BlockTracker.sol @@ -115,6 +115,7 @@ contract BlockTracker is IBlockTracker, BlockTrackerStorage, * @dev Retrieves the current window number. * @return currentWindow The current window number. */ + // TODO: Remove this and related. function getCurrentWindow() external view returns (uint256) { return currentWindow; } diff --git a/contracts/contracts/core/BlockTrackerStorage.sol b/contracts/contracts/core/BlockTrackerStorage.sol index ccd5286ea..91f49c9b0 100644 --- a/contracts/contracts/core/BlockTrackerStorage.sol +++ b/contracts/contracts/core/BlockTrackerStorage.sol @@ -7,6 +7,7 @@ abstract contract BlockTrackerStorage { /// @dev Permissioned address of the oracle account. address public oracleAccount; + // TODO: Remove this and associated update logic. uint256 public currentWindow; // Mapping from block number to the winner's address From 39344e0a985b52d0e48ef16857116b464e46a5df Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Tue, 29 Jul 2025 18:13:40 -0700 Subject: [PATCH 002/117] wip --- contracts/contracts/core/BidderRegistry.sol | 210 +++++++++--------- .../contracts/core/BidderRegistryStorage.sol | 16 +- .../contracts/interfaces/IBidderRegistry.sol | 69 ++++-- 3 files changed, 154 insertions(+), 141 deletions(-) diff --git a/contracts/contracts/core/BidderRegistry.sol b/contracts/contracts/core/BidderRegistry.sol index d8e1d3350..ed73a8222 100644 --- a/contracts/contracts/core/BidderRegistry.sol +++ b/contracts/contracts/core/BidderRegistry.sol @@ -10,6 +10,8 @@ import {BidderRegistryStorage} from "./BidderRegistryStorage.sol"; import {IBlockTracker} from "../interfaces/IBlockTracker.sol"; import {WindowFromBlockNumber} from "../utils/WindowFromBlockNumber.sol"; import {FeePayout} from "../utils/FeePayout.sol"; +import {TimestampOccurrence} from "../utils/Occurrence.sol"; + /// @title Bidder Registry /// @notice This contract is for bidder registry and staking. @@ -57,97 +59,95 @@ contract BidderRegistry is * @param _owner Owner of the contract, explicitly needed since contract is deployed w/ create2 factory. * @param _blockTracker The address of the block tracker contract. * @param _feePayoutPeriod The number of seconds or ms on the mev-commit chain for the fee payout period + * @param _bidderWithdrawalPeriodMs bidder withdrawal period in milliseconds (mev-commit chain uses ms timestamps) */ function initialize( address _protocolFeeRecipient, uint256 _feePercent, address _owner, address _blockTracker, - uint256 _feePayoutPeriod + uint256 _feePayoutPeriod, + uint256 _bidderWithdrawalPeriodMs ) external initializer { FeePayout.initTimestampTracker(protocolFeeTracker, _protocolFeeRecipient, _feePayoutPeriod); feePercent = _feePercent; blockTrackerContract = IBlockTracker(_blockTracker); + bidderWithdrawalPeriodMs = _bidderWithdrawalPeriodMs; __ReentrancyGuard_init(); __Ownable_init(_owner); __Pausable_init(); } /** - * @dev Deposit for a specific window. - * @param window The window for which the deposit is being made. + * @dev Enables a bidder to deposit for a specific provider. + * @param provider The provider for which the deposit is being made. */ - function depositForWindow(uint256 window) external payable whenNotPaused { + function depositForProvider(address provider) external payable whenNotPaused { require(msg.value != 0, DepositAmountIsZero()); - - uint256 newLockedFunds = lockedFunds[msg.sender][window] + msg.value; - lockedFunds[msg.sender][window] = newLockedFunds; - - // Calculate the maximum bid per block for the given window - maxBidPerBlock[msg.sender][window] = newLockedFunds / WindowFromBlockNumber.BLOCKS_PER_WINDOW; - - emit BidderRegistered(msg.sender, newLockedFunds, window); + _depositForProvider(provider, msg.value); } /** - * @dev Deposit for multiple windows. - * @param windows The windows for which the deposits are being made. + * @dev Enables a bidder to deposit eth evenly to multiple providers. + * @param providers The providers for which the deposits are being made. */ - function depositForWindows(uint256[] calldata windows) external payable whenNotPaused { + function depositEvenlyToProviders(address[] calldata providers) external payable whenNotPaused { require(msg.value != 0, DepositAmountIsZero()); - uint256 amountToDeposit = msg.value / windows.length; - uint256 remainingAmount = msg.value % windows.length; // to handle rounding issues + uint256 amountToDeposit = msg.value / providers.length; + uint256 remainingAmount = msg.value % providers.length; // to handle rounding issues - uint256 len = windows.length; + uint256 len = providers.length; for (uint16 i = 0; i < len; ++i) { - uint256 window = windows[i]; - - uint256 currentLockedFunds = lockedFunds[msg.sender][window]; - - uint256 newLockedFunds = currentLockedFunds + amountToDeposit; + address provider = providers[i]; + uint256 amount = amountToDeposit; if (i == len - 1) { - newLockedFunds += remainingAmount; // Add the remainder to the last window + amount += remainingAmount; // Add the remainder to the last provider } + _depositForProvider(provider, amount); + } + } - lockedFunds[msg.sender][window] = newLockedFunds; - maxBidPerBlock[msg.sender][window] = - newLockedFunds / - WindowFromBlockNumber.BLOCKS_PER_WINDOW; - - emit BidderRegistered(msg.sender, newLockedFunds, window); + /** + * @dev Enables a bidder to request a withdrawal from specific providers. + * @param providers Providers to request a withdrawal from. + */ + function requestWithdrawals(address[] calldata providers) external nonReentrant whenNotPaused { + address bidder = msg.sender; + uint256 len = providers.length; + for (uint256 i = 0; i < len; ++i) { + address provider = providers[i]; + Deposit storage deposit = deposits[bidder][provider]; + require(deposit.exists, DepositDoesNotExist(bidder, provider)); + TimestampOccurrence.captureOccurrence(deposit.withdrawalRequestOccurrence); + emit WithdrawalRequested(bidder, provider, deposit.withdrawalRequestOccurrence.timestamp); } } /** - * @dev Withdraw from specific windows. - * @param windows The windows from which the deposit is being withdrawn. + * @dev Enables a bidder to withdraw from specific providers. + * @param providers Providers to withdraw from. */ - function withdrawFromWindows( - uint256[] calldata windows - ) external nonReentrant whenNotPaused { - uint256 currentWindow = blockTrackerContract.getCurrentWindow(); + function withdrawFromProviders(address[] calldata providers) external nonReentrant whenNotPaused { + address bidder = msg.sender; uint256 totalAmount; - uint256 len = windows.length; + uint256 len = providers.length; for (uint256 i = 0; i < len; ++i) { - uint256 window = windows[i]; - require(window < currentWindow, WithdrawAfterWindowSettled(window, currentWindow)); - - uint256 amount = lockedFunds[msg.sender][window]; - - lockedFunds[msg.sender][window] = 0; - maxBidPerBlock[msg.sender][window] = 0; - - (uint256 startBlock, uint256 endBlock) = WindowFromBlockNumber.getBlockNumbersFromWindow(window); - - for (uint256 blockNumber = startBlock; blockNumber <= endBlock; ++blockNumber) { - usedFunds[msg.sender][uint64(blockNumber)] = 0; - } - - emit BidderWithdrawal(msg.sender, window, amount); - - totalAmount += amount; + address provider = providers[i]; + Deposit storage deposit = deposits[bidder][provider]; + require(deposit.exists, DepositDoesNotExist(bidder, provider)); + require(deposit.withdrawalRequestOccurrence.exists, WithdrawalOccurrenceDoesNotExist(bidder, provider)); + require(deposit.withdrawalRequestOccurrence.timestamp + bidderWithdrawalPeriodMs < block.timestamp, + WithdrawalPeriodNotElapsed(block.timestamp, deposit.withdrawalRequestOccurrence.timestamp, bidderWithdrawalPeriodMs)); + + // Note deposit.escrowedAmount isn't withdrawn here as it still needs to be settled. + // In the normal flow of the protocol it'd be zero anyways. + + uint256 availableAmount = deposit.availableAmount; + deposit.availableAmount = 0; + totalAmount += availableAmount; + emit BidderWithdrawal(msg.sender, provider, availableAmount, deposit.escrowedAmount); } (bool success, ) = msg.sender.call{value: totalAmount}(""); @@ -155,16 +155,14 @@ contract BidderRegistry is } /** - * @dev Converts bidder's deposited funds into withdrawable eth (reward) for the provider. + * @dev Converts bidder's escrowed funds into withdrawable eth (reward) for the provider. * @dev This function is only callable from the pre-confirmations contract during reward settlement. * @dev reenterancy not necessary but still putting here for precaution - * @param windowToSettle The window for which the funds are being retrieved. * @param commitmentDigest is the Bid ID that allows us to identify the bid, and deposit * @param provider The address to transfer the retrieved funds to. * @param residualBidPercentAfterDecay The residual bid percent after decay. */ - function retrieveFunds( - uint256 windowToSettle, + function convertFundsToProviderReward( bytes32 commitmentDigest, address payable provider, uint256 residualBidPercentAfterDecay @@ -192,10 +190,13 @@ contract BidderRegistry is if (!payable(bidState.bidder).send(fundsToReturn)) { // edge case, when bidder is rejecting transfer emit TransferToBidderFailed(bidState.bidder, fundsToReturn); - lockedFunds[bidState.bidder][windowToSettle] += fundsToReturn; + deposits[bidState.bidder][provider].availableAmount += fundsToReturn; } } + Deposit storage deposit = deposits[bidState.bidder][provider]; + deposit.escrowedAmount -= decayedAmt; + bidState.state = State.Withdrawn; bidState.bidAmt = 0; @@ -203,7 +204,6 @@ contract BidderRegistry is commitmentDigest, bidState.bidder, provider, - windowToSettle, decayedAmt ); } @@ -212,11 +212,11 @@ contract BidderRegistry is * @dev Returns escrowed funds to the bidder, since the provider is being slashed and didn't earn it. * @dev This function is only callable from the pre-confirmations contract during slashing. * @dev reenterancy not necessary but still putting here for precaution - * @param window The window for which the funds are being retrieved. + * @param provider that committed * @param commitmentDigest is the Bid ID that allows us to identify the bid, and deposit */ function unlockFunds( - uint256 window, + address provider, bytes32 commitmentDigest ) external nonReentrant onlyPreconfManager whenNotPaused { BidState storage bidState = bidPayment[commitmentDigest]; @@ -226,41 +226,41 @@ contract BidderRegistry is bidState.state = State.Withdrawn; bidState.bidAmt = 0; + Deposit storage deposit = deposits[bidState.bidder][provider]; + deposit.escrowedAmount -= amt; + if (!payable(bidState.bidder).send(amt)) { emit TransferToBidderFailed(bidState.bidder, amt); - lockedFunds[bidState.bidder][window] += amt; + deposit.availableAmount += amt; } - emit FundsRetrieved(commitmentDigest, bidState.bidder, window, amt); + emit FundsUnlocked(commitmentDigest, bidState.bidder, provider, amt); } /** - * @dev Open a bid and update the used funds for the block (only callable by the pre-confirmations contract). + * @dev Opens a bid and escrows funds equivalent to the bid amount. * @param commitmentDigest is the Bid ID that allows us to identify the bid, and deposit * @param bidAmt The bid amount. * @param bidder The address of the bidder. - * @param blockNumber The block number. + * @param provider The address of the provider. */ function openBid( bytes32 commitmentDigest, uint256 bidAmt, address bidder, - uint64 blockNumber + address provider ) external onlyPreconfManager whenNotPaused returns (uint256) { BidState storage bidState = bidPayment[commitmentDigest]; if (bidState.state != State.Undefined) { return bidAmt; } - uint256 currentWindow = WindowFromBlockNumber.getWindowFromBlockNumber( - blockNumber - ); - uint256 windowAmount = maxBidPerBlock[bidder][currentWindow]; - uint256 usedAmount = usedFunds[bidder][blockNumber]; + Deposit storage deposit = deposits[bidder][provider]; + deposit.escrowedAmount += bidAmt; // Calculate the available amount for this block - uint256 availableAmount = windowAmount > usedAmount - ? windowAmount - usedAmount + uint256 availableAmount = deposit.availableAmount > bidAmt + ? deposit.availableAmount - bidAmt : 0; // Check if bid exceeds the available amount for the block @@ -270,10 +270,9 @@ contract BidderRegistry is bidAmt = availableAmount; } - // Update the used funds for the block and locked funds if bid is greater than 0 if (bidAmt > 0) { - usedFunds[bidder][blockNumber] += bidAmt; - lockedFunds[bidder][currentWindow] -= bidAmt; + deposit.escrowedAmount += bidAmt; + deposit.availableAmount -= bidAmt; } bidState.state = State.PreConfirmed; @@ -345,36 +344,6 @@ contract BidderRegistry is require(success, TransferToProviderFailed(provider, amount)); } - /** - * @dev Withdraw funds to the bidder. - * @param bidder The address of the bidder. - * @param window The window for which the funds are being withdrawn. - */ - function withdrawBidderAmountFromWindow( - address payable bidder, - uint256 window - ) external nonReentrant whenNotPaused { - require(msg.sender == bidder, OnlyBidderCanWithdraw(msg.sender, bidder)); - uint256 currentWindow = blockTrackerContract.getCurrentWindow(); - // withdraw is enabled only when closed and settled - require(window < currentWindow, WindowNotSettled()); - uint256 amount = lockedFunds[bidder][window]; - - lockedFunds[bidder][window] = 0; - maxBidPerBlock[bidder][window] = 0; - - (uint256 startBlock, uint256 endBlock) = WindowFromBlockNumber.getBlockNumbersFromWindow(window); - - for (uint256 blockNumber = startBlock; blockNumber <= endBlock; ++blockNumber) { - usedFunds[bidder][uint64(blockNumber)] = 0; - } - - (bool success, ) = bidder.call{value: amount}(""); - require(success, BidderWithdrawalTransferFailed(bidder, amount)); - - emit BidderWithdrawal(bidder, window, amount); - } - /** * @dev Manually withdraws accumulated protocol fees to the recipient * to cover the edge case that oracle doesn't slash/reward, and funds still need to be withdrawn. @@ -393,6 +362,25 @@ contract BidderRegistry is _unpause(); } + function _depositForProvider(address provider, uint256 amount) internal { + address bidder = msg.sender; + Deposit storage deposit = deposits[bidder][provider]; + if (deposit.exists) { + require(!deposit.withdrawalRequestOccurrence.exists, WithdrawalOccurrenceExists(bidder, provider)); + deposit.availableAmount += amount; + } else { + deposits[bidder][provider] = Deposit({ + exists: true, + availableAmount: amount, + escrowedAmount: 0, + withdrawalRequestOccurrence: TimestampOccurrence.Occurrence({ + exists: false, + timestamp: 0}) + }); + } + emit BidderDeposited(bidder, provider, amount); + } + /** * @dev Get the amount of funds rewarded to a provider for fulfilling commitments * @param provider The address of the provider. @@ -406,14 +394,14 @@ contract BidderRegistry is /** * @dev Check the deposit of a bidder. * @param bidder The address of the bidder. - * @param window The window for which the deposit is being checked. - * @return The deposited amount for the bidder. + * @param provider The address of the provider. + * @return The available deposited amount for the bidder. */ function getDeposit( address bidder, - uint256 window + address provider ) external view returns (uint256) { - return lockedFunds[bidder][window]; + return deposits[bidder][provider].availableAmount; } /// @return protocolFee amount not yet transferred to recipient diff --git a/contracts/contracts/core/BidderRegistryStorage.sol b/contracts/contracts/core/BidderRegistryStorage.sol index 97d053289..54cd29b5d 100644 --- a/contracts/contracts/core/BidderRegistryStorage.sol +++ b/contracts/contracts/core/BidderRegistryStorage.sol @@ -24,21 +24,19 @@ abstract contract BidderRegistryStorage { /// Struct enabling automatic protocol fee payouts FeePayout.TimestampTracker public protocolFeeTracker; - // Mapping from bidder addresses and window numbers to their locked funds - mapping(address => mapping(uint256 => uint256)) public lockedFunds; - - // Mapping from bidder addresses and blocks to their used funds - mapping(address => mapping(uint64 => uint256)) public usedFunds; - - /// Mapping from bidder addresses and window numbers to their funds per window - mapping(address => mapping(uint256 => uint256)) public maxBidPerBlock; - /// @dev Mapping from commitment digest for a bid, to its BidState mapping(bytes32 => IBidderRegistry.BidState) public bidPayment; /// @dev Funds rewarded to providers for fulfilling commitments mapping(address => uint256) public providerAmount; + /// @dev Bidder withdrawal period in milliseconds (mev-commit chain uses ms timestamps) + /// @dev This period should be greater than the worst case scenario amount of time it'd take for a newly opened bid to be settled. + uint256 public bidderWithdrawalPeriodMs; + + /// @dev Mapping from bidder address to deposits for specific providers + mapping(address bidder => mapping(address provider => IBidderRegistry.Deposit deposit)) public deposits; + /// @dev See https://docs.openzeppelin.com/upgrades-plugins/1.x/writing-upgradeable#storage-gaps uint256[48] private __gap; } diff --git a/contracts/contracts/interfaces/IBidderRegistry.sol b/contracts/contracts/interfaces/IBidderRegistry.sol index f8a8e1abb..56a0af087 100644 --- a/contracts/contracts/interfaces/IBidderRegistry.sol +++ b/contracts/contracts/interfaces/IBidderRegistry.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: BSL 1.1 pragma solidity 0.8.26; +import { TimestampOccurrence } from "../utils/Occurrence.sol"; + interface IBidderRegistry { enum State { Undefined, @@ -18,6 +20,19 @@ interface IBidderRegistry { string commitmentSignature; } + // Represents a bidder's deposit for a specific provider + struct Deposit { + // Whether a deposit exists + bool exists; + // Amount deposited for this provider, not yet associated with an opened bid + uint256 availableAmount; + // Cumulative amount escrowed toward bid(s) for this provider + /// @dev This corresponds to funds from bids that have been opened, but not yet settled + uint256 escrowedAmount; + // Occurrence struct facilitating withdrawal request + TimestampOccurrence.Occurrence withdrawalRequestOccurrence; + } + struct BidState { address bidder; uint256 bidAmt; @@ -25,17 +40,24 @@ interface IBidderRegistry { } /// @dev Event emitted when a bidder is registered with their deposited amount - event BidderRegistered( + event BidderDeposited( address indexed bidder, - uint256 indexed depositedAmount, - uint256 indexed windowNumber + address indexed provider, + uint256 indexed depositedAmount ); - /// @dev Event emitted when funds are retrieved from a bidder's deposit - event FundsRetrieved( + /// @dev Event emitted when a bidder requests a withdrawal from a specific provider + event WithdrawalRequested( + address indexed bidder, + address indexed provider, + uint256 indexed timestamp + ); + + /// @dev Event emitted when funds are unlocked from a bidder's escrowed deposit + event FundsUnlocked( bytes32 indexed commitmentDigest, address indexed bidder, - uint256 indexed window, + address indexed provider, uint256 amount ); @@ -44,15 +66,15 @@ interface IBidderRegistry { bytes32 indexed commitmentDigest, address indexed bidder, address indexed provider, - uint256 window, uint256 amount ); /// @dev Event emitted when a bidder withdraws their deposit event BidderWithdrawal( address indexed bidder, - uint256 indexed window, - uint256 indexed amount + address indexed provider, + uint256 indexed amountWithdrawn, + uint256 amountEscrowed ); /// @dev Event emitted when the preconfManager is updated @@ -79,9 +101,6 @@ interface IBidderRegistry { /// @dev Error emitted when the bid is not preconfirmed error BidNotPreConfirmed(bytes32 commitmentDigest, State actualState, State expectedState); - /// @dev Error emitted when the withdraw after window settled - error WithdrawAfterWindowSettled(uint256 window, uint256 currentWindow); - /// @dev Error emitted when the transfer to the provider fails error TransferToProviderFailed(address provider, uint256 amount); @@ -94,32 +113,40 @@ interface IBidderRegistry { /// @dev Error emitted when the bidder tries to deposit 0 amount error DepositAmountIsZero(); - /// @dev Error emitted when the window is not settled - error WindowNotSettled(); - /// @dev Error emitted when withdrawal transfer failed error BidderWithdrawalTransferFailed(address bidder, uint256 amount); + /// @dev Error emitted when the bidder withdrawal period has not elapsed + error WithdrawalPeriodNotElapsed(uint256 currentTimestampMs, uint256 withdrawalTimestampMs, uint256 withdrawalPeriodMs); + + /// @dev Error emitted when a deposit does not exist + error DepositDoesNotExist(address bidder, address provider); + + /// @dev Error emitted when a withdrawal occurrence exists + error WithdrawalOccurrenceExists(address bidder, address provider); + + /// @dev Error emitted when a withdrawal occurrence does not exist + error WithdrawalOccurrenceDoesNotExist(address bidder, address provider); + function openBid( bytes32 commitmentDigest, uint256 bidAmt, address bidder, - uint64 blockNumber + address provider ) external returns (uint256); - function depositForWindow(uint256 window) external payable; + function depositForProvider(address provider) external payable; - function retrieveFunds( - uint256 windowToSettle, + function convertFundsToProviderReward( bytes32 commitmentDigest, address payable provider, uint256 residualBidPercentAfterDecay ) external; - function unlockFunds(uint256 windowToSettle, bytes32 bidID) external; + function unlockFunds(address provider, bytes32 commitmentDigest) external; function getDeposit( address bidder, - uint256 window + address provider ) external view returns (uint256); } From e632375c4c5367bf1ffedac2518097ac8a1b3391 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Tue, 29 Jul 2025 22:03:52 -0700 Subject: [PATCH 003/117] Update PreconfManager.sol --- contracts/contracts/core/PreconfManager.sol | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/contracts/contracts/core/PreconfManager.sol b/contracts/contracts/core/PreconfManager.sol index e60ddfdf7..11173da85 100644 --- a/contracts/contracts/core/PreconfManager.sol +++ b/contracts/contracts/core/PreconfManager.sol @@ -15,9 +15,11 @@ import {Errors} from "../utils/Errors.sol"; import {BN128} from "../utils/BN128.sol"; import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; + /** * @title PreconfManager - A contract for managing preconfirmation commitments and bids. * @notice This contract allows bidders to make precommitments and bids and provides a mechanism for the oracle to verify and process them. + * @notice IBidderRegistry interface has changed, so this contract will need upgrade or redeployment on mainnet. */ contract PreconfManager is IPreconfManager, @@ -294,7 +296,7 @@ contract PreconfManager is commitmentDigest, params.bidAmt, bidderAddress, - params.blockNumber + committerAddress ); newCommitment.bidAmt = updatedBidAmt; @@ -388,10 +390,6 @@ contract PreconfManager is commitment.isSettled = true; --commitmentsCount[commitment.committer]; - uint256 windowToSettle = WindowFromBlockNumber.getWindowFromBlockNumber( - commitment.blockNumber - ); - providerRegistry.slash( commitment.bidAmt, commitment.slashAmt, @@ -400,7 +398,7 @@ contract PreconfManager is residualBidPercentAfterDecay ); - bidderRegistry.unlockFunds(windowToSettle, commitment.commitmentDigest); + bidderRegistry.unlockFunds(commitment.committer, commitment.commitmentDigest); } /** @@ -420,15 +418,10 @@ contract PreconfManager is CommitmentAlreadySettled(commitmentIndex) ); - uint256 windowToSettle = WindowFromBlockNumber.getWindowFromBlockNumber( - commitment.blockNumber - ); - commitment.isSettled = true; --commitmentsCount[commitment.committer]; - bidderRegistry.retrieveFunds( - windowToSettle, + bidderRegistry.convertFundsToProviderReward( commitment.commitmentDigest, payable(commitment.committer), residualBidPercentAfterDecay From 2cb77a75c1000c522dd37635d957347406086c06 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Tue, 29 Jul 2025 22:18:51 -0700 Subject: [PATCH 004/117] Update DeployCore.s.sol --- contracts/scripts/core/DeployCore.s.sol | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/contracts/scripts/core/DeployCore.s.sol b/contracts/scripts/core/DeployCore.s.sol index d467a0c4d..9f21bbeaa 100644 --- a/contracts/scripts/core/DeployCore.s.sol +++ b/contracts/scripts/core/DeployCore.s.sol @@ -33,7 +33,8 @@ contract DeployCore is Script { uint256 providerPenaltyPercent = 5 * PERCENT_MULTIPLIER; // 5% uint64 commitmentDispatchWindow = 500; uint256 withdrawalDelay = 24 hours * 1000; // 24 hours in milliseconds - uint256 protocolFeePayoutPeriod = 1 hours * 1000; // 1 hour with ms timestamps + uint256 protocolFeePayoutPeriod = 1 hours * 1000; // 1 hour in ms timestamps + uint256 bidderWithdrawalPeriodMs = 10 minutes * 1000; // 10 minutes in ms timestamps address oracleKeystoreAddress = vm.envAddress("ORACLE_KEYSTORE_ADDRESS"); require(oracleKeystoreAddress != address(0), "missing Oracle keystore address"); @@ -53,7 +54,8 @@ contract DeployCore is Script { feePercent, // _feePercent param msg.sender, // _owner param address(blockTracker), // _blockTracker param - protocolFeePayoutPeriod)) // _protocolFeePayoutPeriod param + protocolFeePayoutPeriod, // _protocolFeePayoutPeriod param + bidderWithdrawalPeriodMs)) // _bidderWithdrawalPeriodMs param ); BidderRegistry bidderRegistry = BidderRegistry(payable(bidderRegistryProxy)); console.log("BidderRegistry:", address(bidderRegistry)); From 20c861b977304ca01f9229ad35d62fb8414b215c Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Tue, 29 Jul 2025 23:36:56 -0700 Subject: [PATCH 005/117] builds w/ tests --- contracts/contracts/core/BidderRegistry.sol | 15 +- .../contracts/interfaces/IBidderRegistry.sol | 2 +- contracts/test/core/BidderRegistryTest.sol | 295 +++++++++--------- contracts/test/core/OracleTest.sol | 25 +- contracts/test/core/PreconfManagerTest.sol | 41 +-- contracts/test/core/ProviderRegistryTest.sol | 6 +- 6 files changed, 188 insertions(+), 196 deletions(-) diff --git a/contracts/contracts/core/BidderRegistry.sol b/contracts/contracts/core/BidderRegistry.sol index ed73a8222..d8c3bccf4 100644 --- a/contracts/contracts/core/BidderRegistry.sol +++ b/contracts/contracts/core/BidderRegistry.sol @@ -82,7 +82,7 @@ contract BidderRegistry is * @dev Enables a bidder to deposit for a specific provider. * @param provider The provider for which the deposit is being made. */ - function depositForProvider(address provider) external payable whenNotPaused { + function depositAsBidder(address provider) external payable whenNotPaused { require(msg.value != 0, DepositAmountIsZero()); _depositForProvider(provider, msg.value); } @@ -91,7 +91,7 @@ contract BidderRegistry is * @dev Enables a bidder to deposit eth evenly to multiple providers. * @param providers The providers for which the deposits are being made. */ - function depositEvenlyToProviders(address[] calldata providers) external payable whenNotPaused { + function depositEvenlyAsBidder(address[] calldata providers) external payable whenNotPaused { require(msg.value != 0, DepositAmountIsZero()); uint256 amountToDeposit = msg.value / providers.length; @@ -112,7 +112,7 @@ contract BidderRegistry is * @dev Enables a bidder to request a withdrawal from specific providers. * @param providers Providers to request a withdrawal from. */ - function requestWithdrawals(address[] calldata providers) external nonReentrant whenNotPaused { + function requestWithdrawalsAsBidder(address[] calldata providers) external nonReentrant whenNotPaused { address bidder = msg.sender; uint256 len = providers.length; for (uint256 i = 0; i < len; ++i) { @@ -128,7 +128,7 @@ contract BidderRegistry is * @dev Enables a bidder to withdraw from specific providers. * @param providers Providers to withdraw from. */ - function withdrawFromProviders(address[] calldata providers) external nonReentrant whenNotPaused { + function withdrawAsBidder(address[] calldata providers) external nonReentrant whenNotPaused { address bidder = msg.sender; uint256 totalAmount; @@ -404,6 +404,13 @@ contract BidderRegistry is return deposits[bidder][provider].availableAmount; } + function getEscrowedAmount( + address bidder, + address provider + ) external view returns (uint256) { + return deposits[bidder][provider].escrowedAmount; + } + /// @return protocolFee amount not yet transferred to recipient function getAccumulatedProtocolFee() external view returns (uint256) { return protocolFeeTracker.accumulatedAmount; diff --git a/contracts/contracts/interfaces/IBidderRegistry.sol b/contracts/contracts/interfaces/IBidderRegistry.sol index 56a0af087..896906af1 100644 --- a/contracts/contracts/interfaces/IBidderRegistry.sol +++ b/contracts/contracts/interfaces/IBidderRegistry.sol @@ -135,7 +135,7 @@ interface IBidderRegistry { address provider ) external returns (uint256); - function depositForProvider(address provider) external payable; + function depositAsBidder(address provider) external payable; function convertFundsToProviderReward( bytes32 commitmentDigest, diff --git a/contracts/test/core/BidderRegistryTest.sol b/contracts/test/core/BidderRegistryTest.sol index d5a8e8b3f..e8a145d0b 100644 --- a/contracts/test/core/BidderRegistryTest.sol +++ b/contracts/test/core/BidderRegistryTest.sol @@ -17,11 +17,13 @@ contract BidderRegistryTest is Test { address public bidder; address public feeRecipient; uint256 public feePayoutPeriodMs; + uint256 public bidderWithdrawalPeriodMs; BlockTracker public blockTracker; ProviderRegistry public providerRegistry; - /// @dev Event emitted when a bidder is registered with their staked amount - event BidderRegistered(address indexed bidder, uint256 indexed stakedAmount, uint256 indexed windowNumber); + event BidderDeposited(address indexed bidder, address indexed provider, uint256 indexed depositedAmount); + event WithdrawalRequested(address indexed bidder, address indexed provider, uint256 indexed withdrawalRequestTimestamp); + event BidderWithdrawal(address indexed bidder, address indexed provider, uint256 indexed withdrawalAmount, uint256 escrowedAmount); event FeeTransfer(uint256 amount, address indexed recipient); event ProtocolFeeRecipientUpdated(address indexed newProtocolFeeRecipient); @@ -33,6 +35,7 @@ contract BidderRegistryTest is Test { minStake = 1e18 wei; feeRecipient = vm.addr(9); feePayoutPeriodMs = 10000; + bidderWithdrawalPeriodMs = 5000; address blockTrackerProxy = Upgrades.deployUUPSProxy( "BlockTracker.sol", abi.encodeCall(BlockTracker.initialize, (address(this), address(this))) @@ -41,7 +44,13 @@ contract BidderRegistryTest is Test { address bidderRegistryProxy = Upgrades.deployUUPSProxy( "BidderRegistry.sol", - abi.encodeCall(BidderRegistry.initialize, (feeRecipient, feePercent, address(this), address(blockTracker), feePayoutPeriodMs)) + abi.encodeCall(BidderRegistry.initialize, + (feeRecipient, + feePercent, + address(this), + address(blockTracker), + feePayoutPeriodMs, + bidderWithdrawalPeriodMs)) ); bidderRegistry = BidderRegistry(payable(bidderRegistryProxy)); @@ -70,40 +79,33 @@ contract BidderRegistryTest is Test { assertEq(accumulatedAmount, 0); assertEq(bidderRegistry.feePercent(), feePercent); assertEq(bidderRegistry.preconfManager(), address(0)); + assertEq(bidderRegistry.bidderWithdrawalPeriodMs(), bidderWithdrawalPeriodMs); } function test_BidderStakeAndRegister() public { - uint256 currentWindow = blockTracker.getCurrentWindow(); - uint256 nextWindow = currentWindow + 1; + address provider1 = vm.addr(2); vm.startPrank(bidder); vm.expectEmit(true, false, false, true); - - emit BidderRegistered(bidder, 1 ether, nextWindow); - - bidderRegistry.depositForWindow{value: 1 ether}(nextWindow); - - uint256 bidderStakeStored = bidderRegistry.getDeposit(bidder, nextWindow); + emit BidderDeposited(bidder, provider1, 1 ether); + bidderRegistry.depositAsBidder{value: 1 ether}(provider1); + uint256 bidderStakeStored = bidderRegistry.getDeposit(bidder, provider1); assertEq(bidderStakeStored, 1 ether); - // For the second deposit, calculate the new next window - currentWindow = blockTracker.getCurrentWindow(); - nextWindow = currentWindow + 1; - + address provider2 = vm.addr(3); vm.expectEmit(true, false, false, true); - - emit BidderRegistered(bidder, 2 ether, nextWindow); - - bidderRegistry.depositForWindow{value: 1 ether}(nextWindow); - - uint256 bidderStakeStored2 = bidderRegistry.getDeposit(bidder, nextWindow); + emit BidderDeposited(bidder, provider2, 2 ether); + bidderRegistry.depositAsBidder{value: 2 ether}(provider2); + uint256 bidderStakeStored2 = bidderRegistry.getDeposit(bidder, provider2); assertEq(bidderStakeStored2, 2 ether); } function test_TwoDeposits() public { + address provider1 = vm.addr(2); + address provider2 = vm.addr(3); vm.prank(bidder); - bidderRegistry.depositForWindow{value: 2e18 wei}(2); - bidderRegistry.depositForWindow{value: 1 wei}(2); + bidderRegistry.depositAsBidder{value: 2e18 wei}(provider1); + bidderRegistry.depositAsBidder{value: 1 wei}(provider2); } function test_BidderRegistryReceive() public { @@ -177,48 +179,44 @@ contract BidderRegistryTest is Test { bidderRegistry.setPreconfManager(newPreConfContract); } - function test_shouldRetrieveFunds() public { + function test_ConvertFundsToProviderReward() public { bytes32 commitmentDigest = keccak256("1234"); bidderRegistry.setPreconfManager(address(this)); - uint256 currentWindow = blockTracker.getCurrentWindow(); - uint256 nextWindow = currentWindow + 1; - vm.prank(bidder); - bidderRegistry.depositForWindow{value: 64 ether}(nextWindow); address provider = vm.addr(4); + vm.prank(bidder); + bidderRegistry.depositAsBidder{value: 64 ether}(provider); uint64 blockNumber = uint64(WindowFromBlockNumber.BLOCKS_PER_WINDOW + 2); blockTracker.addBuilderAddress("test", provider); blockTracker.recordL1Block(blockNumber, "test"); - bidderRegistry.openBid(commitmentDigest, 1 ether, bidder, blockNumber); + bidderRegistry.openBid(commitmentDigest, 1 ether, bidder, provider); - bidderRegistry.retrieveFunds(nextWindow, commitmentDigest, payable(provider), bidderRegistry.ONE_HUNDRED_PERCENT()); + bidderRegistry.convertFundsToProviderReward(commitmentDigest, payable(provider), bidderRegistry.ONE_HUNDRED_PERCENT()); uint256 providerAmount = bidderRegistry.providerAmount(provider); uint256 feeRecipientAmount = bidderRegistry.getAccumulatedProtocolFee(); assertEq(providerAmount, 900000000000000000); assertEq(feeRecipientAmount, 100000000000000000); - assertEq(bidderRegistry.lockedFunds(bidder, nextWindow), 63 ether); + assertEq(bidderRegistry.getDeposit(bidder, provider), 63 ether); } - function test_shouldRetrieveFundsWithDecay() public { + function test_ConvertFundsToProviderRewardWithDecay() public { bytes32 commitmentDigest = keccak256("1234"); bidderRegistry.setPreconfManager(address(this)); - uint256 currentWindow = blockTracker.getCurrentWindow(); - uint256 nextWindow = currentWindow + 1; - vm.prank(bidder); - bidderRegistry.depositForWindow{value: 64 ether}(nextWindow); address provider = vm.addr(4); + vm.prank(bidder); + bidderRegistry.depositAsBidder{value: 64 ether}(provider); uint64 blockNumber = uint64(WindowFromBlockNumber.BLOCKS_PER_WINDOW + 2); blockTracker.addBuilderAddress("test", provider); blockTracker.recordL1Block(blockNumber, "test"); - bidderRegistry.openBid(commitmentDigest, 1 ether, bidder, blockNumber); + bidderRegistry.openBid(commitmentDigest, 1 ether, bidder, provider); uint256 bidderBalance = bidder.balance; - bidderRegistry.retrieveFunds(nextWindow, commitmentDigest, payable(provider), 50 * bidderRegistry.PRECISION()); + bidderRegistry.convertFundsToProviderReward(commitmentDigest, payable(provider), 50 * bidderRegistry.PRECISION()); uint256 providerAmount = bidderRegistry.providerAmount(provider); uint256 feeRecipientAmount = bidderRegistry.getAccumulatedProtocolFee(); @@ -226,27 +224,25 @@ contract BidderRegistryTest is Test { assertEq(feeRecipientAmount, 50000000000000000); assertEq(bidder.balance, bidderBalance + 500000000000000000); - assertEq(bidderRegistry.lockedFunds(bidder, nextWindow), 63 ether); + assertEq(bidderRegistry.getDeposit(bidder, provider), 63 ether); } function test_shouldReturnFunds() public { bytes32 commitmentDigest = keccak256("1234"); bidderRegistry.setPreconfManager(address(this)); - uint256 currentWindow = blockTracker.getCurrentWindow(); - uint256 nextWindow = currentWindow + 1; - vm.prank(bidder); - bidderRegistry.depositForWindow{value: 64 ether}(nextWindow); address provider = vm.addr(4); + vm.prank(bidder); + bidderRegistry.depositAsBidder{value: 64 ether}(provider); uint64 blockNumber = uint64(WindowFromBlockNumber.BLOCKS_PER_WINDOW + 2); blockTracker.addBuilderAddress("test", provider); blockTracker.recordL1Block(blockNumber, "test"); uint256 bidderBalance = bidder.balance; - bidderRegistry.openBid(commitmentDigest, 1 ether, bidder, blockNumber); + bidderRegistry.openBid(commitmentDigest, 1 ether, bidder, provider); - bidderRegistry.unlockFunds(nextWindow, commitmentDigest); + bidderRegistry.unlockFunds(bidder, commitmentDigest); uint256 providerAmount = bidderRegistry.providerAmount(provider); uint256 feeRecipientAmount = bidderRegistry.getAccumulatedProtocolFee(); @@ -254,41 +250,36 @@ contract BidderRegistryTest is Test { assertEq(feeRecipientAmount, 0); assertEq(bidder.balance, bidderBalance + 1 ether); - assertEq(bidderRegistry.lockedFunds(bidder, nextWindow), 63 ether); + assertEq(bidderRegistry.getDeposit(bidder, provider), 63 ether); } - function test_RevertWhen_RetrieveFundsNotPreConf() public { + function test_RevertWhen_ConvertFundsToProviderRewardNotPreConf() public { vm.prank(bidder); - uint256 currentWindow = blockTracker.getCurrentWindow(); - uint256 nextWindow = currentWindow + 1; - uint64 blockNumber = 66; - bidderRegistry.depositForWindow{value: 2 ether}(nextWindow); address provider = vm.addr(4); + bidderRegistry.depositAsBidder{value: 2 ether}(provider); bytes32 commitmentDigest = keccak256("1234"); vm.prank(bidderRegistry.preconfManager()); - bidderRegistry.openBid(commitmentDigest, 1 ether, bidder, blockNumber); + bidderRegistry.openBid(commitmentDigest, 1 ether, bidder, provider); vm.prank(vm.addr(1)); uint256 residualBidAfterDecay = bidderRegistry.ONE_HUNDRED_PERCENT(); vm.expectRevert(); - bidderRegistry.retrieveFunds(nextWindow, commitmentDigest, payable(provider), residualBidAfterDecay); + bidderRegistry.convertFundsToProviderReward(commitmentDigest, payable(provider), residualBidAfterDecay); } function test_withdrawProviderAmount() public { bidderRegistry.setPreconfManager(address(this)); - uint256 currentWindow = blockTracker.getCurrentWindow(); - uint256 nextWindow = currentWindow + 1; - vm.prank(bidder); - bidderRegistry.depositForWindow{value: 128 ether}(nextWindow); address provider = vm.addr(4); + vm.prank(bidder); + bidderRegistry.depositAsBidder{value: 128 ether}(provider); uint256 balanceBefore = address(provider).balance; bytes32 commitmentDigest = keccak256("1234"); uint64 blockNumber = uint64(WindowFromBlockNumber.BLOCKS_PER_WINDOW + 2); blockTracker.addBuilderAddress("test", provider); blockTracker.recordL1Block(blockNumber, "test"); - bidderRegistry.openBid(commitmentDigest, 2 ether, bidder, blockNumber); + bidderRegistry.openBid(commitmentDigest, 2 ether, bidder, provider); - bidderRegistry.retrieveFunds(nextWindow, commitmentDigest, payable(provider), bidderRegistry.ONE_HUNDRED_PERCENT()); + bidderRegistry.convertFundsToProviderReward(commitmentDigest, payable(provider), bidderRegistry.ONE_HUNDRED_PERCENT()); bidderRegistry.withdrawProviderAmount(payable(provider)); uint256 balanceAfter = address(provider).balance; assertEq(balanceAfter - balanceBefore, 1800000000000000000); @@ -297,89 +288,107 @@ contract BidderRegistryTest is Test { function test_RevertWhen_WithdrawProviderAmount() public { bidderRegistry.setPreconfManager(address(this)); - uint256 currentWindow = blockTracker.getCurrentWindow(); - uint256 nextWindow = currentWindow + 1; - vm.prank(bidder); - bidderRegistry.depositForWindow{value: 5 ether}(nextWindow); address provider = vm.addr(4); + vm.prank(bidder); + bidderRegistry.depositAsBidder{value: 5 ether}(provider); vm.expectRevert(); bidderRegistry.withdrawProviderAmount(payable(provider)); } - function test_DepositForWindows() public { - uint256[] memory windows = new uint256[](3); - uint256 currentWindow = blockTracker.getCurrentWindow(); - for (uint256 i = 0; i < windows.length; ++i) { - windows[i] = currentWindow + i; - } + function test_DepositAsBidder() public { + address provider1 = vm.addr(2); + address provider2 = vm.addr(3); + address provider3 = vm.addr(4); uint256 depositAmount = 3 ether; vm.startPrank(bidder); vm.expectEmit(true, false, false, true); - for (uint256 i = 0; i < windows.length; ++i) { - emit BidderRegistered(bidder, depositAmount / windows.length, windows[i]); - } + emit BidderDeposited(bidder, provider1, depositAmount / 3); + vm.expectEmit(true, false, false, true); + emit BidderDeposited(bidder, provider2, depositAmount / 3); + vm.expectEmit(true, false, false, true); + emit BidderDeposited(bidder, provider3, depositAmount / 3); + + address[] memory providers = new address[](3); + providers[0] = provider1; + providers[1] = provider2; + providers[2] = provider3; - bidderRegistry.depositForWindows{value: depositAmount}(windows); - for (uint256 i = 0; i < windows.length; ++i) { - uint256 lockedFunds = bidderRegistry.lockedFunds(bidder, windows[i]); - assertEq(lockedFunds, depositAmount / windows.length); + for (uint256 i = 0; i < 3; ++i) { + bidderRegistry.depositAsBidder{value: depositAmount / 3}(providers[i]); - uint256 maxBidPerBlock = bidderRegistry.maxBidPerBlock(bidder, windows[i]); - assertEq(maxBidPerBlock, depositAmount / (windows.length * WindowFromBlockNumber.BLOCKS_PER_WINDOW)); + uint256 lockedFunds = bidderRegistry.getDeposit(bidder, providers[i]); + assertEq(lockedFunds, depositAmount / 3); + + uint256 escrowedFunds = bidderRegistry.getEscrowedAmount(bidder, providers[i]); + assertEq(escrowedFunds, 0); } } - function test_WithdrawFromWindows() public { - uint256[] memory windows = new uint256[](3); - uint256 currentWindow = blockTracker.getCurrentWindow(); - for (uint256 i = 0; i < windows.length; ++i) { - windows[i] = currentWindow + i; - } - uint256 depositAmount = minStake * windows.length; + function test_WithdrawAsBidder() public { + address provider1 = vm.addr(2); + address provider2 = vm.addr(3); + address provider3 = vm.addr(4); + uint256 depositAmount = 3 ether; + + address[] memory providers = new address[](3); + providers[0] = provider1; + providers[1] = provider2; + providers[2] = provider3; vm.startPrank(bidder); vm.expectEmit(true, false, false, true); - for (uint16 i = 0; i < windows.length; ++i) { - emit BidderRegistered(bidder, depositAmount / windows.length, currentWindow + i); - } + emit BidderDeposited(bidder, provider1, depositAmount / 3); + vm.expectEmit(true, false, false, true); + emit BidderDeposited(bidder, provider2, depositAmount / 3); + vm.expectEmit(true, false, false, true); + emit BidderDeposited(bidder, provider3, depositAmount / 3); - bidderRegistry.depositForWindows{value: depositAmount}(windows); + for (uint16 i = 0; i < 3; ++i) { + bidderRegistry.depositAsBidder{value: depositAmount / 3}(providers[i]); - for (uint16 i = 0; i < windows.length; ++i) { - uint256 lockedFunds = bidderRegistry.lockedFunds(bidder, currentWindow + i); - assertEq(lockedFunds, depositAmount / windows.length); + uint256 lockedFunds = bidderRegistry.getDeposit(bidder, providers[i]); + assertEq(lockedFunds, depositAmount / 3); - uint256 maxBid = bidderRegistry.maxBidPerBlock(bidder, currentWindow + i); - assertEq(maxBid, (depositAmount / windows.length) / WindowFromBlockNumber.BLOCKS_PER_WINDOW); + uint256 escrowedFunds = bidderRegistry.getEscrowedAmount(bidder, providers[i]); + assertEq(escrowedFunds, 0); } vm.stopPrank(); uint64 blockNumber = uint64(WindowFromBlockNumber.BLOCKS_PER_WINDOW*3 + 2); blockTracker.recordL1Block(blockNumber, "test"); - vm.startPrank(bidder); - bidderRegistry.withdrawFromWindows(windows); + vm.expectEmit(true, false, false, true); + emit WithdrawalRequested(bidder, provider1, block.timestamp); + vm.expectEmit(true, false, false, true); + emit WithdrawalRequested(bidder, provider2, block.timestamp); + vm.expectEmit(true, false, false, true); + emit WithdrawalRequested(bidder, provider3, block.timestamp); + vm.prank(bidder); + bidderRegistry.requestWithdrawalsAsBidder(providers); - for (uint16 i = 0; i < windows.length; ++i) { - uint256 lockedFunds = bidderRegistry.lockedFunds(bidder, currentWindow + i); - assertEq(lockedFunds, 0); + vm.expectEmit(true, false, false, true); + emit BidderWithdrawal(bidder, provider1, 1 ether, 0); + vm.expectEmit(true, false, false, true); + emit BidderWithdrawal(bidder, provider2, 1 ether, 0); + vm.expectEmit(true, false, false, true); + emit BidderWithdrawal(bidder, provider3, 1 ether, 0); + vm.prank(bidder); + bidderRegistry.withdrawAsBidder(providers); - uint256 maxBid = bidderRegistry.maxBidPerBlock(bidder, currentWindow + i); - assertEq(maxBid, 0); + for (uint16 i = 0; i < 3; ++i) { + uint256 lockedFunds = bidderRegistry.getDeposit(bidder, providers[i]); + assertEq(lockedFunds, 0); - (uint256 startBlock, uint256 endBlock) = WindowFromBlockNumber.getBlockNumbersFromWindow(currentWindow + i); - for (uint256 blockNum = startBlock; blockNum <= endBlock; ++blockNum) { - uint256 usedFunds = bidderRegistry.usedFunds(bidder, uint64(blockNum)); - assertEq(usedFunds, 0); - } + uint256 escrowedFunds = bidderRegistry.getEscrowedAmount(bidder, providers[i]); + assertEq(escrowedFunds, 0); } } - function test_OpenBidtransferExcessBid() public { + // TODO: Need to re-review this one.. + function test_OpenBid_TransferExcessBid() public { bytes32 commitmentDigest = keccak256("commitment"); - uint256 bidAmt = 3 ether; + uint256 bidAmt = 5 ether; address testBidder = vm.addr(2); - uint64 blockNumber = uint64(WindowFromBlockNumber.BLOCKS_PER_WINDOW + 1); // Deal some ETH to the test bidder vm.deal(testBidder, 10 ether); @@ -387,20 +396,18 @@ contract BidderRegistryTest is Test { // Simulate the pre-confirmations contract bidderRegistry.setPreconfManager(address(this)); - // Deposit some funds for the next window - uint256 currentWindow = blockTracker.getCurrentWindow(); - uint256 nextWindow = currentWindow + 1; + address provider = vm.addr(4); vm.prank(testBidder); - bidderRegistry.depositForWindow{value: 4 ether}(nextWindow); + bidderRegistry.depositAsBidder{value: 4 ether}(provider); - // Ensure the used amount is less than the max bid per block - uint256 maxBidAmt = bidderRegistry.maxBidPerBlock(testBidder, nextWindow); - uint256 usedAmount = bidderRegistry.usedFunds(testBidder, blockNumber); + // Ensure the used amount is less than the max + uint256 maxBidAmt = bidderRegistry.getDeposit(testBidder, provider); + uint256 usedAmount = bidderRegistry.getEscrowedAmount(testBidder, provider); uint256 availableAmount = maxBidAmt > usedAmount ? maxBidAmt - usedAmount : 0; // Open a bid that exceeds the available amount vm.prank(address(this)); - bidderRegistry.openBid(commitmentDigest, bidAmt, testBidder, blockNumber); + bidderRegistry.openBid(commitmentDigest, bidAmt, testBidder, provider); // Verify that the excess bid was transferred back to the test bidder uint256 expectedBidAmt = availableAmount; @@ -420,44 +427,42 @@ contract BidderRegistryTest is Test { vm.warp(defaultStartTimestamp + 10000 + 1); // roll past protocol fee payout period bidderRegistry.setPreconfManager(address(this)); - uint256 currentWindow = blockTracker.getCurrentWindow(); - uint256 nextWindow = currentWindow + 1; - vm.prank(bidder); - bidderRegistry.depositForWindow{value: 64 ether}(nextWindow); address provider = vm.addr(4); + vm.prank(bidder); + bidderRegistry.depositAsBidder{value: 64 ether}(provider); uint256 balanceBefore = feeRecipient.balance; bytes32 commitmentDigest = keccak256("1234"); uint64 blockNumber = uint64(WindowFromBlockNumber.BLOCKS_PER_WINDOW + 2); blockTracker.addBuilderAddress("test", provider); blockTracker.recordL1Block(blockNumber, "test"); - bidderRegistry.openBid(commitmentDigest, 1 ether, bidder, blockNumber); + bidderRegistry.openBid(commitmentDigest, 1 ether, bidder, provider); vm.expectEmit(true, true, true, true); emit FeeTransfer(100000000000000000, feeRecipient); - bidderRegistry.retrieveFunds(nextWindow, commitmentDigest, payable(provider), bidderRegistry.ONE_HUNDRED_PERCENT()); + bidderRegistry.convertFundsToProviderReward(commitmentDigest, payable(provider), bidderRegistry.ONE_HUNDRED_PERCENT()); uint256 balanceAfter = feeRecipient.balance; assertEq(balanceAfter - balanceBefore, 100000000000000000); assertEq(bidderRegistry.getAccumulatedProtocolFee(), 0); } + // TODO: Need to re-review this one.. function test_ProtocolFeeAccumulation() public { bidderRegistry.setPreconfManager(address(this)); - uint256 currentWindow = blockTracker.getCurrentWindow(); - uint256 nextWindow = currentWindow + 1; - vm.prank(bidder); - bidderRegistry.depositForWindow{value: 64 ether}(nextWindow); address provider = vm.addr(4); + vm.prank(bidder); + bidderRegistry.depositAsBidder{value: 64 ether}(provider); uint256 balanceBefore = feeRecipient.balance; bytes32 commitmentDigest = keccak256("1234"); uint64 blockNumber = uint64(WindowFromBlockNumber.BLOCKS_PER_WINDOW + 2); blockTracker.addBuilderAddress("test", provider); blockTracker.recordL1Block(blockNumber, "test"); - bidderRegistry.openBid(commitmentDigest, 1 ether, bidder, blockNumber); - bidderRegistry.retrieveFunds(nextWindow, commitmentDigest, payable(provider), bidderRegistry.ONE_HUNDRED_PERCENT()); + bidderRegistry.openBid(commitmentDigest, 1 ether, bidder, provider); + bidderRegistry.convertFundsToProviderReward(commitmentDigest, payable(provider), bidderRegistry.ONE_HUNDRED_PERCENT()); uint256 balanceAfter = feeRecipient.balance; assertEq(balanceAfter - balanceBefore, 0); assertEq(bidderRegistry.getAccumulatedProtocolFee(), 100000000000000000); } + // TODO: Need to re-review this one.. function test_OpenBidWithExcessExploit() public { address aliceBidder = vm.addr(7); address bodBidder = vm.addr(8); @@ -470,13 +475,12 @@ contract BidderRegistryTest is Test { //2) Simulate the pre-confirmations contract bidderRegistry.setPreconfManager(address(this)); - //3) Deposit some funds for the next window - uint256 currentWindow = blockTracker.getCurrentWindow(); - uint256 nextWindow = currentWindow + 1; + //3) Deposit some funds + address provider = vm.addr(4); vm.prank(aliceBidder); - bidderRegistry.depositForWindow{value: 2 ether}(nextWindow); + bidderRegistry.depositAsBidder{value: 2 ether}(provider); vm.prank(bodBidder); - bidderRegistry.depositForWindow{value: 2 ether}(nextWindow); + bidderRegistry.depositAsBidder{value: 2 ether}(provider); // Capture balances before the exploit uint256 aliceBalanceBefore = aliceBidder.balance; @@ -488,7 +492,7 @@ contract BidderRegistryTest is Test { assertEq(bobBalanceBefore, 8 ether, "Bob balance BEFORE"); assertEq(registryBalanceBefore, 4 ether, "BidderRegistry balance BEFORE"); - uint256 maxBid = bidderRegistry.maxBidPerBlock(aliceBidder, nextWindow); + uint256 maxBid = bidderRegistry.getDeposit(aliceBidder, provider); //4) Alice open bids at maxBid multiple times vm.startPrank(address(this)); // First bid works fine. maxBid is depleted from lockedFunds @@ -496,7 +500,7 @@ contract BidderRegistryTest is Test { keccak256("commitment1"), maxBid, aliceBidder, - blockNumber + provider ); // Second bid start the stealing show. maxBid is being refunded (by the excess logic) and lockedFunds is NOT depleted. // This is effectively stealing from poor Bob. @@ -504,14 +508,14 @@ contract BidderRegistryTest is Test { keccak256("commitment2"), maxBid, aliceBidder, - blockNumber + provider ); // Thrid bid continue the stealing show, exactly behaving as the second bid. bidderRegistry.openBid( keccak256("commitment3"), maxBid, aliceBidder, - blockNumber + provider ); // And Alice could do this until she fully drain the bidderRegistry contract, effectively stealing from all the bidders. @@ -521,10 +525,10 @@ contract BidderRegistryTest is Test { blockNumber = uint64(WindowFromBlockNumber.BLOCKS_PER_WINDOW * 2 + 1); blockTracker.recordL1Block(blockNumber, "test"); - uint256[] memory windows = new uint256[](1); - windows[0] = nextWindow; + address[] memory providers = new address[](1); + providers[0] = provider; vm.prank(aliceBidder); - bidderRegistry.withdrawFromWindows(windows); + bidderRegistry.withdrawAsBidder(providers); // Capture balances after the exploit uint256 aliceBalanceAfter = aliceBidder.balance; @@ -537,13 +541,10 @@ contract BidderRegistryTest is Test { assertEq(registryBalanceAfter, 2.2 ether, "BidderRegistry balance AFTER"); } - function test_BidderStakeAndRegisteratZero() public { - uint256 currentWindow = blockTracker.getCurrentWindow(); - uint256 nextWindow = currentWindow + 1; - + function test_RevertWhen_DepositAsBidder_ZeroAmount() public { + address provider = vm.addr(4); vm.startPrank(bidder); - vm.expectRevert(IBidderRegistry.DepositAmountIsZero.selector); - bidderRegistry.depositForWindow{value: 0 ether}(nextWindow); + bidderRegistry.depositAsBidder{value: 0 ether}(provider); } } diff --git a/contracts/test/core/OracleTest.sol b/contracts/test/core/OracleTest.sol index 646a1ac5b..1a2b0cf08 100644 --- a/contracts/test/core/OracleTest.sol +++ b/contracts/test/core/OracleTest.sol @@ -36,6 +36,7 @@ contract OracleTest is Test { hex"bbbbbbbbb1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2"; uint256 public constant withdrawalDelay = 24 hours; // 24 hours uint256 public constant protocolFeePayoutPeriodBlocks = 100; + uint256 public constant bidderWithdrawalPeriodMs = 10000; struct CommitmentParamsSimple { uint64 bid; @@ -145,7 +146,8 @@ contract OracleTest is Test { feePercent, address(this), address(blockTracker), - protocolFeePayoutPeriodBlocks + protocolFeePayoutPeriodBlocks, + bidderWithdrawalPeriodMs ) ) ); @@ -169,8 +171,8 @@ contract OracleTest is Test { vm.deal(ownerInstance, 5 ether); vm.startPrank(ownerInstance); - uint256 window = blockTracker.getCurrentWindow(); - bidderRegistry.depositForWindow{value: 2 ether}(window + 1); + address provider = vm.addr(4); + bidderRegistry.depositAsBidder{value: 2 ether}(provider); address oracleProxy = Upgrades.deployUUPSProxy( "Oracle.sol", @@ -211,8 +213,7 @@ contract OracleTest is Test { vm.deal(bidder, 200000 ether); vm.startPrank(bidder); - uint256 window = blockTracker.getCurrentWindow(); - bidderRegistry.depositForWindow{value: 250 ether}(window + 1); + bidderRegistry.depositAsBidder{value: 250 ether}(provider); vm.stopPrank(); vm.deal(provider, 200000 ether); @@ -270,8 +271,7 @@ contract OracleTest is Test { vm.deal(bidder, 200000 ether); vm.startPrank(bidder); - uint256 window = blockTracker.getCurrentWindow(); - bidderRegistry.depositForWindow{value: 250 ether}(window + 1); + bidderRegistry.depositAsBidder{value: 250 ether}(provider); vm.stopPrank(); vm.deal(provider, 200000 ether); @@ -337,8 +337,7 @@ contract OracleTest is Test { vm.deal(bidder, 200000 ether); vm.startPrank(bidder); - uint256 window = blockTracker.getCurrentWindow(); - bidderRegistry.depositForWindow{value: 250 ether}(window + 1); + bidderRegistry.depositAsBidder{value: 250 ether}(provider); vm.stopPrank(); vm.deal(provider, 200000 ether); @@ -431,11 +430,8 @@ contract OracleTest is Test { (address provider, uint256 providerPk) = makeAddrAndKey("kartik"); vm.deal(bidder, 200000 ether); - uint256 window = WindowFromBlockNumber.getWindowFromBlockNumber( - blockNumber - ); vm.startPrank(bidder); - bidderRegistry.depositForWindow{value: 250 ether}(window); + bidderRegistry.depositAsBidder{value: 250 ether}(provider); vm.stopPrank(); vm.deal(provider, 200000 ether); @@ -577,9 +573,8 @@ contract OracleTest is Test { (address provider, uint256 providerPk) = makeAddrAndKey("kartik"); vm.deal(bidder, 200000 ether); - uint256 window = blockTracker.getCurrentWindow(); vm.startPrank(bidder); - bidderRegistry.depositForWindow{value: 250 ether}(window + 1); + bidderRegistry.depositAsBidder{value: 250 ether}(provider); vm.stopPrank(); vm.deal(provider, 200000 ether); diff --git a/contracts/test/core/PreconfManagerTest.sol b/contracts/test/core/PreconfManagerTest.sol index f17696af1..0df417369 100644 --- a/contracts/test/core/PreconfManagerTest.sol +++ b/contracts/test/core/PreconfManagerTest.sol @@ -54,6 +54,7 @@ contract PreconfManagerTest is Test { hex"bbbbbbbbb1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2"; uint256 public withdrawalDelay; uint256 public protocolFeePayoutPeriodBlocks; + uint256 public bidderWithdrawalPeriodMs; uint256[] zkProof; address public oracleContract; @@ -97,6 +98,7 @@ contract PreconfManagerTest is Test { feeRecipient = vm.addr(9); withdrawalDelay = 24 hours; // 24 hours protocolFeePayoutPeriodBlocks = 100; + bidderWithdrawalPeriodMs = 10000; oracleContract = address(0x6793); address providerRegistryProxy = Upgrades.deployUUPSProxy( "ProviderRegistry.sol", @@ -133,7 +135,8 @@ contract PreconfManagerTest is Test { feePercent, address(this), address(blockTracker), - protocolFeePayoutPeriodBlocks + protocolFeePayoutPeriodBlocks, + bidderWithdrawalPeriodMs ) ) ); @@ -417,7 +420,7 @@ contract PreconfManagerTest is Test { (address bidder, ) = makeAddrAndKey("alice"); vm.deal(bidder, 5 ether); vm.prank(bidder); - bidderRegistry.depositForWindow{value: 2 ether}(1); + bidderRegistry.depositAsBidder{value: 2 ether}(provider); verifyCommitmentNotUsed(_testCommitmentAliceBob); (address committer, ) = makeAddrAndKey("bob"); @@ -655,7 +658,7 @@ contract PreconfManagerTest is Test { _testCommitmentAliceBob.blockNumber ); vm.prank(bidder); - bidderRegistry.depositForWindow{value: 2 ether}(window); + bidderRegistry.depositAsBidder{value: 2 ether}(provider); // Step 1: Verify that the commitment has not been used before verifyCommitmentNotUsed(_testCommitmentAliceBob); // Step 2: Store the commitment @@ -695,9 +698,7 @@ contract PreconfManagerTest is Test { (address bidder, ) = makeAddrAndKey("alice"); vm.deal(bidder, 5 ether); vm.prank(bidder); - uint256 depositWindow = WindowFromBlockNumber - .getWindowFromBlockNumber(_testCommitmentAliceBob.blockNumber); - bidderRegistry.depositForWindow{value: 2 ether}(depositWindow); + bidderRegistry.depositAsBidder{value: 2 ether}(provider); // Step 1: Verify that the commitment has not been used before bytes32 bidHash = verifyCommitmentNotUsed(_testCommitmentAliceBob); @@ -756,7 +757,7 @@ contract PreconfManagerTest is Test { assert(isSettled == true); assertEq( - bidderRegistry.lockedFunds(bidder, depositWindow), + bidderRegistry.getDeposit(bidder, provider), 2 ether - _testCommitmentAliceBob.bidAmt ); assertEq(bidderRegistry.providerAmount(committer), 0 ether); @@ -774,9 +775,7 @@ contract PreconfManagerTest is Test { (address bidder, ) = makeAddrAndKey("alice"); vm.deal(bidder, 5 ether); vm.prank(bidder); - uint256 depositWindow = WindowFromBlockNumber - .getWindowFromBlockNumber(_testCommitmentAliceBob.blockNumber); - bidderRegistry.depositForWindow{value: 2 ether}(depositWindow); + bidderRegistry.depositAsBidder{value: 2 ether}(provider); // Step 1: Verify that the commitment has not been used before bytes32 bidHash = verifyCommitmentNotUsed(_testCommitmentAliceBob); @@ -833,7 +832,7 @@ contract PreconfManagerTest is Test { assert(isSettled == true); // commitmentDigest value is internal to contract and not asserted assertEq( - bidderRegistry.lockedFunds(bidder, depositWindow), + bidderRegistry.getDeposit(bidder, provider), 2 ether - _testCommitmentAliceBob.bidAmt ); } @@ -843,11 +842,9 @@ contract PreconfManagerTest is Test { // Assuming you have a stored commitment { (address bidder, ) = makeAddrAndKey("alice"); - uint256 depositWindow = WindowFromBlockNumber - .getWindowFromBlockNumber(_testCommitmentAliceBob.blockNumber); vm.deal(bidder, 5 ether); vm.prank(bidder); - bidderRegistry.depositForWindow{value: 2 ether}(depositWindow); + bidderRegistry.depositAsBidder{value: 2 ether}(provider); // Step 1: Verify that the commitment has not been used before bytes32 bidHash = verifyCommitmentNotUsed(_testCommitmentAliceBob); @@ -906,7 +903,7 @@ contract PreconfManagerTest is Test { // commitmentDigest value is internal to contract and not asserted assertEq( - bidderRegistry.lockedFunds(bidder, window), + bidderRegistry.getDeposit(bidder, provider), 2 ether - _testCommitmentAliceBob.bidAmt ); assertEq(bidderRegistry.providerAmount(committer), 0 ether); @@ -993,7 +990,7 @@ contract PreconfManagerTest is Test { (address bidder, uint256 bidderPk) = makeAddrAndKey("alice"); vm.deal(bidder, 5 ether); - depositForBidder(bidder, testCommitment.blockNumber); + bidderRegistry.depositAsBidder{value: 2 ether}(provider); (address committer, uint256 committerPk) = makeAddrAndKey("bob"); vm.deal(committer, 11 ether); @@ -1061,18 +1058,6 @@ contract PreconfManagerTest is Test { ); } - function depositForBidder( - address bidder, - uint64 blockNumber - ) internal returns (uint256) { - vm.prank(bidder); - uint256 depositWindow = WindowFromBlockNumber.getWindowFromBlockNumber( - blockNumber - ); - bidderRegistry.depositForWindow{value: 2 ether}(depositWindow); - return depositWindow; - } - function storeFirstCommitment( address committer, TestCommitment memory testCommitment diff --git a/contracts/test/core/ProviderRegistryTest.sol b/contracts/test/core/ProviderRegistryTest.sol index 899fad430..5c44322f9 100644 --- a/contracts/test/core/ProviderRegistryTest.sol +++ b/contracts/test/core/ProviderRegistryTest.sol @@ -27,6 +27,7 @@ contract ProviderRegistryTest is Test { hex"bbbbbbbbb1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2"; bytes[] public validBLSPubkeys = [validBLSPubkey]; uint256 public penaltyFeePayoutPeriodMs; + uint256 public bidderWithdrawalPeriodMs; mapping(address => uint256) public commitmentsCount; // For use in test_RevertWhen_WithdrawStakedAmountWithoutCommitments event ProviderRegistered(address indexed provider, uint256 stakedAmount); event WithdrawalRequested(address indexed provider, uint256 timestamp); @@ -55,6 +56,7 @@ contract ProviderRegistryTest is Test { feeRecipient = vm.addr(9); withdrawalDelay = 24 hours; // 24 hours penaltyFeePayoutPeriodMs = 10000; + bidderWithdrawalPeriodMs = 10000; address providerRegistryProxy = Upgrades.deployUUPSProxy( "ProviderRegistry.sol", abi.encodeCall( @@ -89,7 +91,8 @@ contract ProviderRegistryTest is Test { feePercent, address(this), address(blockTracker), - penaltyFeePayoutPeriodMs + penaltyFeePayoutPeriodMs, + bidderWithdrawalPeriodMs ) ) ); @@ -131,6 +134,7 @@ contract ProviderRegistryTest is Test { ) = bidderRegistry.protocolFeeTracker(); assertEq(recipient, feeRecipient); assertEq(payoutPeriodMs, penaltyFeePayoutPeriodMs); + assertEq(bidderRegistry.bidderWithdrawalPeriodMs(), bidderWithdrawalPeriodMs); assertEq(lastPayoutTimestamp, block.timestamp); assertEq(accumulatedAmount, 0); } From 6033810bad6f79b5eb05cbc592edb825427fe0b3 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Tue, 29 Jul 2025 23:46:37 -0700 Subject: [PATCH 006/117] abi+binding --- contracts-abi/abi/BidderRegistry.abi | 380 +++++--- .../clients/BidderRegistry/BidderRegistry.go | 842 +++++++++++------- 2 files changed, 749 insertions(+), 473 deletions(-) diff --git a/contracts-abi/abi/BidderRegistry.abi b/contracts-abi/abi/BidderRegistry.abi index 88c5a2388..4c7362b9d 100644 --- a/contracts-abi/abi/BidderRegistry.abi +++ b/contracts-abi/abi/BidderRegistry.abi @@ -87,6 +87,19 @@ ], "stateMutability": "view" }, + { + "type": "function", + "name": "bidderWithdrawalPeriodMs", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, { "type": "function", "name": "blockTrackerContract", @@ -102,30 +115,104 @@ }, { "type": "function", - "name": "depositForWindow", + "name": "convertFundsToProviderReward", "inputs": [ { - "name": "window", + "name": "commitmentDigest", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "provider", + "type": "address", + "internalType": "address payable" + }, + { + "name": "residualBidPercentAfterDecay", "type": "uint256", "internalType": "uint256" } ], "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "depositAsBidder", + "inputs": [ + { + "name": "provider", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], "stateMutability": "payable" }, { "type": "function", - "name": "depositForWindows", + "name": "depositEvenlyAsBidder", "inputs": [ { - "name": "windows", - "type": "uint256[]", - "internalType": "uint256[]" + "name": "providers", + "type": "address[]", + "internalType": "address[]" } ], "outputs": [], "stateMutability": "payable" }, + { + "type": "function", + "name": "deposits", + "inputs": [ + { + "name": "bidder", + "type": "address", + "internalType": "address" + }, + { + "name": "provider", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "exists", + "type": "bool", + "internalType": "bool" + }, + { + "name": "availableAmount", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "escrowedAmount", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "withdrawalRequestOccurrence", + "type": "tuple", + "internalType": "struct TimestampOccurrence.Occurrence", + "components": [ + { + "name": "exists", + "type": "bool", + "internalType": "bool" + }, + { + "name": "timestamp", + "type": "uint256", + "internalType": "uint256" + } + ] + } + ], + "stateMutability": "view" + }, { "type": "function", "name": "feePercent", @@ -162,11 +249,35 @@ "internalType": "address" }, { - "name": "window", + "name": "provider", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", "type": "uint256", "internalType": "uint256" } ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getEscrowedAmount", + "inputs": [ + { + "name": "bidder", + "type": "address", + "internalType": "address" + }, + { + "name": "provider", + "type": "address", + "internalType": "address" + } + ], "outputs": [ { "name": "", @@ -223,34 +334,15 @@ "name": "_feePayoutPeriod", "type": "uint256", "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "lockedFunds", - "inputs": [ - { - "name": "", - "type": "address", - "internalType": "address" }, { - "name": "", + "name": "_bidderWithdrawalPeriodMs", "type": "uint256", "internalType": "uint256" } ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" + "outputs": [], + "stateMutability": "nonpayable" }, { "type": "function", @@ -259,30 +351,6 @@ "outputs": [], "stateMutability": "nonpayable" }, - { - "type": "function", - "name": "maxBidPerBlock", - "inputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - }, - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, { "type": "function", "name": "openBid", @@ -303,9 +371,9 @@ "internalType": "address" }, { - "name": "blockNumber", - "type": "uint64", - "internalType": "uint64" + "name": "provider", + "type": "address", + "internalType": "address" } ], "outputs": [ @@ -445,27 +513,12 @@ }, { "type": "function", - "name": "retrieveFunds", + "name": "requestWithdrawalsAsBidder", "inputs": [ { - "name": "windowToSettle", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "commitmentDigest", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "provider", - "type": "address", - "internalType": "address payable" - }, - { - "name": "residualBidPercentAfterDecay", - "type": "uint256", - "internalType": "uint256" + "name": "providers", + "type": "address[]", + "internalType": "address[]" } ], "outputs": [], @@ -554,9 +607,9 @@ "name": "unlockFunds", "inputs": [ { - "name": "window", - "type": "uint256", - "internalType": "uint256" + "name": "provider", + "type": "address", + "internalType": "address" }, { "name": "commitmentDigest", @@ -594,54 +647,12 @@ }, { "type": "function", - "name": "usedFunds", + "name": "withdrawAsBidder", "inputs": [ { - "name": "", - "type": "address", - "internalType": "address" - }, - { - "name": "", - "type": "uint64", - "internalType": "uint64" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "withdrawBidderAmountFromWindow", - "inputs": [ - { - "name": "bidder", - "type": "address", - "internalType": "address payable" - }, - { - "name": "window", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "withdrawFromWindows", - "inputs": [ - { - "name": "windows", - "type": "uint256[]", - "internalType": "uint256[]" + "name": "providers", + "type": "address[]", + "internalType": "address[]" } ], "outputs": [], @@ -662,7 +673,7 @@ }, { "type": "event", - "name": "BidderRegistered", + "name": "BidderDeposited", "inputs": [ { "name": "bidder", @@ -671,13 +682,13 @@ "internalType": "address" }, { - "name": "depositedAmount", - "type": "uint256", + "name": "provider", + "type": "address", "indexed": true, - "internalType": "uint256" + "internalType": "address" }, { - "name": "windowNumber", + "name": "depositedAmount", "type": "uint256", "indexed": true, "internalType": "uint256" @@ -696,15 +707,21 @@ "internalType": "address" }, { - "name": "window", + "name": "provider", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "amountWithdrawn", "type": "uint256", "indexed": true, "internalType": "uint256" }, { - "name": "amount", + "name": "amountEscrowed", "type": "uint256", - "indexed": true, + "indexed": false, "internalType": "uint256" } ], @@ -770,7 +787,7 @@ }, { "type": "event", - "name": "FundsRetrieved", + "name": "FundsRewarded", "inputs": [ { "name": "commitmentDigest", @@ -785,10 +802,10 @@ "internalType": "address" }, { - "name": "window", - "type": "uint256", + "name": "provider", + "type": "address", "indexed": true, - "internalType": "uint256" + "internalType": "address" }, { "name": "amount", @@ -801,7 +818,7 @@ }, { "type": "event", - "name": "FundsRewarded", + "name": "FundsUnlocked", "inputs": [ { "name": "commitmentDigest", @@ -821,12 +838,6 @@ "indexed": true, "internalType": "address" }, - { - "name": "window", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, { "name": "amount", "type": "uint256", @@ -971,6 +982,31 @@ ], "anonymous": false }, + { + "type": "event", + "name": "WithdrawalRequested", + "inputs": [ + { + "name": "bidder", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "provider", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "timestamp", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, { "type": "error", "name": "AddressEmptyCode", @@ -1024,6 +1060,22 @@ "name": "DepositAmountIsZero", "inputs": [] }, + { + "type": "error", + "name": "DepositDoesNotExist", + "inputs": [ + { + "name": "bidder", + "type": "address", + "internalType": "address" + }, + { + "name": "provider", + "type": "address", + "internalType": "address" + } + ] + }, { "type": "error", "name": "ERC1967InvalidImplementation", @@ -1184,20 +1236,52 @@ }, { "type": "error", - "name": "WindowNotSettled", - "inputs": [] + "name": "WithdrawalOccurrenceDoesNotExist", + "inputs": [ + { + "name": "bidder", + "type": "address", + "internalType": "address" + }, + { + "name": "provider", + "type": "address", + "internalType": "address" + } + ] }, { "type": "error", - "name": "WithdrawAfterWindowSettled", + "name": "WithdrawalOccurrenceExists", "inputs": [ { - "name": "window", + "name": "bidder", + "type": "address", + "internalType": "address" + }, + { + "name": "provider", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "WithdrawalPeriodNotElapsed", + "inputs": [ + { + "name": "currentTimestampMs", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "withdrawalTimestampMs", "type": "uint256", "internalType": "uint256" }, { - "name": "currentWindow", + "name": "withdrawalPeriodMs", "type": "uint256", "internalType": "uint256" } diff --git a/contracts-abi/clients/BidderRegistry/BidderRegistry.go b/contracts-abi/clients/BidderRegistry/BidderRegistry.go index f36ddea8c..591264260 100644 --- a/contracts-abi/clients/BidderRegistry/BidderRegistry.go +++ b/contracts-abi/clients/BidderRegistry/BidderRegistry.go @@ -29,9 +29,15 @@ var ( _ = abi.ConvertType ) +// TimestampOccurrenceOccurrence is an auto generated low-level Go binding around an user-defined struct. +type TimestampOccurrenceOccurrence struct { + Exists bool + Timestamp *big.Int +} + // BidderregistryMetaData contains all meta data concerning the Bidderregistry contract. var BidderregistryMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"ONE_HUNDRED_PERCENT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PRECISION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"bidPayment\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"bidAmt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"state\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"blockTrackerContract\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBlockTracker\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositForWindow\",\"inputs\":[{\"name\":\"window\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"depositForWindows\",\"inputs\":[{\"name\":\"windows\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"feePercent\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAccumulatedProtocolFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDeposit\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"window\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProviderAmount\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_protocolFeeRecipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_feePercent\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_blockTracker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_feePayoutPeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lockedFunds\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"manuallyWithdrawProtocolFee\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"maxBidPerBlock\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"openBid\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"bidAmt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"blockNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"preconfManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"protocolFeeTracker\",\"inputs\":[],\"outputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"accumulatedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"lastPayoutTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"payoutTimePeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"providerAmount\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"retrieveFunds\",\"inputs\":[{\"name\":\"windowToSettle\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"addresspayable\"},{\"name\":\"residualBidPercentAfterDecay\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setBlockTrackerContract\",\"inputs\":[{\"name\":\"newBlockTrackerContract\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewFeePayoutPeriod\",\"inputs\":[{\"name\":\"newFeePayoutPeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewFeePercent\",\"inputs\":[{\"name\":\"newFeePercent\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewProtocolFeeRecipient\",\"inputs\":[{\"name\":\"newProtocolFeeRecipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPreconfManager\",\"inputs\":[{\"name\":\"contractAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unlockFunds\",\"inputs\":[{\"name\":\"window\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"usedFunds\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawBidderAmountFromWindow\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"addresspayable\"},{\"name\":\"window\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawFromWindows\",\"inputs\":[{\"name\":\"windows\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawProviderAmount\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BidderRegistered\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"depositedAmount\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"windowNumber\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BidderWithdrawal\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"window\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockTrackerUpdated\",\"inputs\":[{\"name\":\"newBlockTracker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeePayoutPeriodUpdated\",\"inputs\":[{\"name\":\"newFeePayoutPeriod\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeePercentUpdated\",\"inputs\":[{\"name\":\"newFeePercent\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeTransfer\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FundsRetrieved\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"window\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FundsRewarded\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"window\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"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\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PreconfManagerUpdated\",\"inputs\":[{\"name\":\"newPreconfManager\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProtocolFeeRecipientUpdated\",\"inputs\":[{\"name\":\"newProtocolFeeRecipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransferToBidderFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"BidNotPreConfirmed\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"actualState\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"},{\"name\":\"expectedState\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"}]},{\"type\":\"error\",\"name\":\"BidderWithdrawalTransferFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"DepositAmountIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpectedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FeeRecipientIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyBidderCanWithdraw\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"PayoutPeriodMustBePositive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ProviderAmountIsZero\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SenderIsNotPreconfManager\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"preconfManager\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TransferToProviderFailed\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"TransferToRecipientFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"WindowNotSettled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawAfterWindowSettled\",\"inputs\":[{\"name\":\"window\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"currentWindow\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"ONE_HUNDRED_PERCENT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PRECISION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"bidPayment\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"bidAmt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"state\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bidderWithdrawalPeriodMs\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"blockTrackerContract\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBlockTracker\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"convertFundsToProviderReward\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"addresspayable\"},{\"name\":\"residualBidPercentAfterDecay\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositAsBidder\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"depositEvenlyAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"deposits\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"availableAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"escrowedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalRequestOccurrence\",\"type\":\"tuple\",\"internalType\":\"structTimestampOccurrence.Occurrence\",\"components\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"feePercent\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAccumulatedProtocolFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDeposit\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEscrowedAmount\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProviderAmount\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_protocolFeeRecipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_feePercent\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_blockTracker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_feePayoutPeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_bidderWithdrawalPeriodMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"manuallyWithdrawProtocolFee\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"openBid\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"bidAmt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"preconfManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"protocolFeeTracker\",\"inputs\":[],\"outputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"accumulatedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"lastPayoutTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"payoutTimePeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"providerAmount\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"requestWithdrawalsAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setBlockTrackerContract\",\"inputs\":[{\"name\":\"newBlockTrackerContract\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewFeePayoutPeriod\",\"inputs\":[{\"name\":\"newFeePayoutPeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewFeePercent\",\"inputs\":[{\"name\":\"newFeePercent\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewProtocolFeeRecipient\",\"inputs\":[{\"name\":\"newProtocolFeeRecipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPreconfManager\",\"inputs\":[{\"name\":\"contractAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unlockFunds\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"withdrawAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawProviderAmount\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BidderDeposited\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"depositedAmount\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BidderWithdrawal\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amountWithdrawn\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"amountEscrowed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockTrackerUpdated\",\"inputs\":[{\"name\":\"newBlockTracker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeePayoutPeriodUpdated\",\"inputs\":[{\"name\":\"newFeePayoutPeriod\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeePercentUpdated\",\"inputs\":[{\"name\":\"newFeePercent\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeTransfer\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FundsRewarded\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FundsUnlocked\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"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\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PreconfManagerUpdated\",\"inputs\":[{\"name\":\"newPreconfManager\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProtocolFeeRecipientUpdated\",\"inputs\":[{\"name\":\"newProtocolFeeRecipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransferToBidderFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalRequested\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"BidNotPreConfirmed\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"actualState\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"},{\"name\":\"expectedState\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"}]},{\"type\":\"error\",\"name\":\"BidderWithdrawalTransferFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"DepositAmountIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DepositDoesNotExist\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpectedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FeeRecipientIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyBidderCanWithdraw\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"PayoutPeriodMustBePositive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ProviderAmountIsZero\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SenderIsNotPreconfManager\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"preconfManager\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TransferToProviderFailed\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"TransferToRecipientFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"WithdrawalOccurrenceDoesNotExist\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"WithdrawalOccurrenceExists\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"WithdrawalPeriodNotElapsed\",\"inputs\":[{\"name\":\"currentTimestampMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalTimestampMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalPeriodMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]", } // BidderregistryABI is the input ABI used to generate the binding from. @@ -323,6 +329,37 @@ func (_Bidderregistry *BidderregistryCallerSession) BidPayment(arg0 [32]byte) (s return _Bidderregistry.Contract.BidPayment(&_Bidderregistry.CallOpts, arg0) } +// BidderWithdrawalPeriodMs is a free data retrieval call binding the contract method 0x91a61cd9. +// +// Solidity: function bidderWithdrawalPeriodMs() view returns(uint256) +func (_Bidderregistry *BidderregistryCaller) BidderWithdrawalPeriodMs(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _Bidderregistry.contract.Call(opts, &out, "bidderWithdrawalPeriodMs") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// BidderWithdrawalPeriodMs is a free data retrieval call binding the contract method 0x91a61cd9. +// +// Solidity: function bidderWithdrawalPeriodMs() view returns(uint256) +func (_Bidderregistry *BidderregistrySession) BidderWithdrawalPeriodMs() (*big.Int, error) { + return _Bidderregistry.Contract.BidderWithdrawalPeriodMs(&_Bidderregistry.CallOpts) +} + +// BidderWithdrawalPeriodMs is a free data retrieval call binding the contract method 0x91a61cd9. +// +// Solidity: function bidderWithdrawalPeriodMs() view returns(uint256) +func (_Bidderregistry *BidderregistryCallerSession) BidderWithdrawalPeriodMs() (*big.Int, error) { + return _Bidderregistry.Contract.BidderWithdrawalPeriodMs(&_Bidderregistry.CallOpts) +} + // BlockTrackerContract is a free data retrieval call binding the contract method 0x6d82071b. // // Solidity: function blockTrackerContract() view returns(address) @@ -354,6 +391,61 @@ func (_Bidderregistry *BidderregistryCallerSession) BlockTrackerContract() (comm return _Bidderregistry.Contract.BlockTrackerContract(&_Bidderregistry.CallOpts) } +// Deposits is a free data retrieval call binding the contract method 0x8f601f66. +// +// Solidity: function deposits(address bidder, address provider) view returns(bool exists, uint256 availableAmount, uint256 escrowedAmount, (bool,uint256) withdrawalRequestOccurrence) +func (_Bidderregistry *BidderregistryCaller) Deposits(opts *bind.CallOpts, bidder common.Address, provider common.Address) (struct { + Exists bool + AvailableAmount *big.Int + EscrowedAmount *big.Int + WithdrawalRequestOccurrence TimestampOccurrenceOccurrence +}, error) { + var out []interface{} + err := _Bidderregistry.contract.Call(opts, &out, "deposits", bidder, provider) + + outstruct := new(struct { + Exists bool + AvailableAmount *big.Int + EscrowedAmount *big.Int + WithdrawalRequestOccurrence TimestampOccurrenceOccurrence + }) + if err != nil { + return *outstruct, err + } + + outstruct.Exists = *abi.ConvertType(out[0], new(bool)).(*bool) + outstruct.AvailableAmount = *abi.ConvertType(out[1], new(*big.Int)).(**big.Int) + outstruct.EscrowedAmount = *abi.ConvertType(out[2], new(*big.Int)).(**big.Int) + outstruct.WithdrawalRequestOccurrence = *abi.ConvertType(out[3], new(TimestampOccurrenceOccurrence)).(*TimestampOccurrenceOccurrence) + + return *outstruct, err + +} + +// Deposits is a free data retrieval call binding the contract method 0x8f601f66. +// +// Solidity: function deposits(address bidder, address provider) view returns(bool exists, uint256 availableAmount, uint256 escrowedAmount, (bool,uint256) withdrawalRequestOccurrence) +func (_Bidderregistry *BidderregistrySession) Deposits(bidder common.Address, provider common.Address) (struct { + Exists bool + AvailableAmount *big.Int + EscrowedAmount *big.Int + WithdrawalRequestOccurrence TimestampOccurrenceOccurrence +}, error) { + return _Bidderregistry.Contract.Deposits(&_Bidderregistry.CallOpts, bidder, provider) +} + +// Deposits is a free data retrieval call binding the contract method 0x8f601f66. +// +// Solidity: function deposits(address bidder, address provider) view returns(bool exists, uint256 availableAmount, uint256 escrowedAmount, (bool,uint256) withdrawalRequestOccurrence) +func (_Bidderregistry *BidderregistryCallerSession) Deposits(bidder common.Address, provider common.Address) (struct { + Exists bool + AvailableAmount *big.Int + EscrowedAmount *big.Int + WithdrawalRequestOccurrence TimestampOccurrenceOccurrence +}, error) { + return _Bidderregistry.Contract.Deposits(&_Bidderregistry.CallOpts, bidder, provider) +} + // FeePercent is a free data retrieval call binding the contract method 0x7fd6f15c. // // Solidity: function feePercent() view returns(uint256) @@ -416,43 +508,12 @@ func (_Bidderregistry *BidderregistryCallerSession) GetAccumulatedProtocolFee() return _Bidderregistry.Contract.GetAccumulatedProtocolFee(&_Bidderregistry.CallOpts) } -// GetDeposit is a free data retrieval call binding the contract method 0x2726b506. -// -// Solidity: function getDeposit(address bidder, uint256 window) view returns(uint256) -func (_Bidderregistry *BidderregistryCaller) GetDeposit(opts *bind.CallOpts, bidder common.Address, window *big.Int) (*big.Int, error) { - var out []interface{} - err := _Bidderregistry.contract.Call(opts, &out, "getDeposit", bidder, window) - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetDeposit is a free data retrieval call binding the contract method 0x2726b506. -// -// Solidity: function getDeposit(address bidder, uint256 window) view returns(uint256) -func (_Bidderregistry *BidderregistrySession) GetDeposit(bidder common.Address, window *big.Int) (*big.Int, error) { - return _Bidderregistry.Contract.GetDeposit(&_Bidderregistry.CallOpts, bidder, window) -} - -// GetDeposit is a free data retrieval call binding the contract method 0x2726b506. +// GetDeposit is a free data retrieval call binding the contract method 0xc35082a9. // -// Solidity: function getDeposit(address bidder, uint256 window) view returns(uint256) -func (_Bidderregistry *BidderregistryCallerSession) GetDeposit(bidder common.Address, window *big.Int) (*big.Int, error) { - return _Bidderregistry.Contract.GetDeposit(&_Bidderregistry.CallOpts, bidder, window) -} - -// GetProviderAmount is a free data retrieval call binding the contract method 0x0ebe2555. -// -// Solidity: function getProviderAmount(address provider) view returns(uint256) -func (_Bidderregistry *BidderregistryCaller) GetProviderAmount(opts *bind.CallOpts, provider common.Address) (*big.Int, error) { +// Solidity: function getDeposit(address bidder, address provider) view returns(uint256) +func (_Bidderregistry *BidderregistryCaller) GetDeposit(opts *bind.CallOpts, bidder common.Address, provider common.Address) (*big.Int, error) { var out []interface{} - err := _Bidderregistry.contract.Call(opts, &out, "getProviderAmount", provider) + err := _Bidderregistry.contract.Call(opts, &out, "getDeposit", bidder, provider) if err != nil { return *new(*big.Int), err @@ -464,26 +525,26 @@ func (_Bidderregistry *BidderregistryCaller) GetProviderAmount(opts *bind.CallOp } -// GetProviderAmount is a free data retrieval call binding the contract method 0x0ebe2555. +// GetDeposit is a free data retrieval call binding the contract method 0xc35082a9. // -// Solidity: function getProviderAmount(address provider) view returns(uint256) -func (_Bidderregistry *BidderregistrySession) GetProviderAmount(provider common.Address) (*big.Int, error) { - return _Bidderregistry.Contract.GetProviderAmount(&_Bidderregistry.CallOpts, provider) +// Solidity: function getDeposit(address bidder, address provider) view returns(uint256) +func (_Bidderregistry *BidderregistrySession) GetDeposit(bidder common.Address, provider common.Address) (*big.Int, error) { + return _Bidderregistry.Contract.GetDeposit(&_Bidderregistry.CallOpts, bidder, provider) } -// GetProviderAmount is a free data retrieval call binding the contract method 0x0ebe2555. +// GetDeposit is a free data retrieval call binding the contract method 0xc35082a9. // -// Solidity: function getProviderAmount(address provider) view returns(uint256) -func (_Bidderregistry *BidderregistryCallerSession) GetProviderAmount(provider common.Address) (*big.Int, error) { - return _Bidderregistry.Contract.GetProviderAmount(&_Bidderregistry.CallOpts, provider) +// Solidity: function getDeposit(address bidder, address provider) view returns(uint256) +func (_Bidderregistry *BidderregistryCallerSession) GetDeposit(bidder common.Address, provider common.Address) (*big.Int, error) { + return _Bidderregistry.Contract.GetDeposit(&_Bidderregistry.CallOpts, bidder, provider) } -// LockedFunds is a free data retrieval call binding the contract method 0x1355d861. +// GetEscrowedAmount is a free data retrieval call binding the contract method 0xf519c7bb. // -// Solidity: function lockedFunds(address , uint256 ) view returns(uint256) -func (_Bidderregistry *BidderregistryCaller) LockedFunds(opts *bind.CallOpts, arg0 common.Address, arg1 *big.Int) (*big.Int, error) { +// Solidity: function getEscrowedAmount(address bidder, address provider) view returns(uint256) +func (_Bidderregistry *BidderregistryCaller) GetEscrowedAmount(opts *bind.CallOpts, bidder common.Address, provider common.Address) (*big.Int, error) { var out []interface{} - err := _Bidderregistry.contract.Call(opts, &out, "lockedFunds", arg0, arg1) + err := _Bidderregistry.contract.Call(opts, &out, "getEscrowedAmount", bidder, provider) if err != nil { return *new(*big.Int), err @@ -495,26 +556,26 @@ func (_Bidderregistry *BidderregistryCaller) LockedFunds(opts *bind.CallOpts, ar } -// LockedFunds is a free data retrieval call binding the contract method 0x1355d861. +// GetEscrowedAmount is a free data retrieval call binding the contract method 0xf519c7bb. // -// Solidity: function lockedFunds(address , uint256 ) view returns(uint256) -func (_Bidderregistry *BidderregistrySession) LockedFunds(arg0 common.Address, arg1 *big.Int) (*big.Int, error) { - return _Bidderregistry.Contract.LockedFunds(&_Bidderregistry.CallOpts, arg0, arg1) +// Solidity: function getEscrowedAmount(address bidder, address provider) view returns(uint256) +func (_Bidderregistry *BidderregistrySession) GetEscrowedAmount(bidder common.Address, provider common.Address) (*big.Int, error) { + return _Bidderregistry.Contract.GetEscrowedAmount(&_Bidderregistry.CallOpts, bidder, provider) } -// LockedFunds is a free data retrieval call binding the contract method 0x1355d861. +// GetEscrowedAmount is a free data retrieval call binding the contract method 0xf519c7bb. // -// Solidity: function lockedFunds(address , uint256 ) view returns(uint256) -func (_Bidderregistry *BidderregistryCallerSession) LockedFunds(arg0 common.Address, arg1 *big.Int) (*big.Int, error) { - return _Bidderregistry.Contract.LockedFunds(&_Bidderregistry.CallOpts, arg0, arg1) +// Solidity: function getEscrowedAmount(address bidder, address provider) view returns(uint256) +func (_Bidderregistry *BidderregistryCallerSession) GetEscrowedAmount(bidder common.Address, provider common.Address) (*big.Int, error) { + return _Bidderregistry.Contract.GetEscrowedAmount(&_Bidderregistry.CallOpts, bidder, provider) } -// MaxBidPerBlock is a free data retrieval call binding the contract method 0xdcb95894. +// GetProviderAmount is a free data retrieval call binding the contract method 0x0ebe2555. // -// Solidity: function maxBidPerBlock(address , uint256 ) view returns(uint256) -func (_Bidderregistry *BidderregistryCaller) MaxBidPerBlock(opts *bind.CallOpts, arg0 common.Address, arg1 *big.Int) (*big.Int, error) { +// Solidity: function getProviderAmount(address provider) view returns(uint256) +func (_Bidderregistry *BidderregistryCaller) GetProviderAmount(opts *bind.CallOpts, provider common.Address) (*big.Int, error) { var out []interface{} - err := _Bidderregistry.contract.Call(opts, &out, "maxBidPerBlock", arg0, arg1) + err := _Bidderregistry.contract.Call(opts, &out, "getProviderAmount", provider) if err != nil { return *new(*big.Int), err @@ -526,18 +587,18 @@ func (_Bidderregistry *BidderregistryCaller) MaxBidPerBlock(opts *bind.CallOpts, } -// MaxBidPerBlock is a free data retrieval call binding the contract method 0xdcb95894. +// GetProviderAmount is a free data retrieval call binding the contract method 0x0ebe2555. // -// Solidity: function maxBidPerBlock(address , uint256 ) view returns(uint256) -func (_Bidderregistry *BidderregistrySession) MaxBidPerBlock(arg0 common.Address, arg1 *big.Int) (*big.Int, error) { - return _Bidderregistry.Contract.MaxBidPerBlock(&_Bidderregistry.CallOpts, arg0, arg1) +// Solidity: function getProviderAmount(address provider) view returns(uint256) +func (_Bidderregistry *BidderregistrySession) GetProviderAmount(provider common.Address) (*big.Int, error) { + return _Bidderregistry.Contract.GetProviderAmount(&_Bidderregistry.CallOpts, provider) } -// MaxBidPerBlock is a free data retrieval call binding the contract method 0xdcb95894. +// GetProviderAmount is a free data retrieval call binding the contract method 0x0ebe2555. // -// Solidity: function maxBidPerBlock(address , uint256 ) view returns(uint256) -func (_Bidderregistry *BidderregistryCallerSession) MaxBidPerBlock(arg0 common.Address, arg1 *big.Int) (*big.Int, error) { - return _Bidderregistry.Contract.MaxBidPerBlock(&_Bidderregistry.CallOpts, arg0, arg1) +// Solidity: function getProviderAmount(address provider) view returns(uint256) +func (_Bidderregistry *BidderregistryCallerSession) GetProviderAmount(provider common.Address) (*big.Int, error) { + return _Bidderregistry.Contract.GetProviderAmount(&_Bidderregistry.CallOpts, provider) } // Owner is a free data retrieval call binding the contract method 0x8da5cb5b. @@ -781,37 +842,6 @@ func (_Bidderregistry *BidderregistryCallerSession) ProxiableUUID() ([32]byte, e return _Bidderregistry.Contract.ProxiableUUID(&_Bidderregistry.CallOpts) } -// UsedFunds is a free data retrieval call binding the contract method 0x79c14d5f. -// -// Solidity: function usedFunds(address , uint64 ) view returns(uint256) -func (_Bidderregistry *BidderregistryCaller) UsedFunds(opts *bind.CallOpts, arg0 common.Address, arg1 uint64) (*big.Int, error) { - var out []interface{} - err := _Bidderregistry.contract.Call(opts, &out, "usedFunds", arg0, arg1) - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// UsedFunds is a free data retrieval call binding the contract method 0x79c14d5f. -// -// Solidity: function usedFunds(address , uint64 ) view returns(uint256) -func (_Bidderregistry *BidderregistrySession) UsedFunds(arg0 common.Address, arg1 uint64) (*big.Int, error) { - return _Bidderregistry.Contract.UsedFunds(&_Bidderregistry.CallOpts, arg0, arg1) -} - -// UsedFunds is a free data retrieval call binding the contract method 0x79c14d5f. -// -// Solidity: function usedFunds(address , uint64 ) view returns(uint256) -func (_Bidderregistry *BidderregistryCallerSession) UsedFunds(arg0 common.Address, arg1 uint64) (*big.Int, error) { - return _Bidderregistry.Contract.UsedFunds(&_Bidderregistry.CallOpts, arg0, arg1) -} - // AcceptOwnership is a paid mutator transaction binding the contract method 0x79ba5097. // // Solidity: function acceptOwnership() returns() @@ -833,67 +863,88 @@ func (_Bidderregistry *BidderregistryTransactorSession) AcceptOwnership() (*type return _Bidderregistry.Contract.AcceptOwnership(&_Bidderregistry.TransactOpts) } -// DepositForWindow is a paid mutator transaction binding the contract method 0xde7fa558. +// ConvertFundsToProviderReward is a paid mutator transaction binding the contract method 0xde40a6ca. +// +// Solidity: function convertFundsToProviderReward(bytes32 commitmentDigest, address provider, uint256 residualBidPercentAfterDecay) returns() +func (_Bidderregistry *BidderregistryTransactor) ConvertFundsToProviderReward(opts *bind.TransactOpts, commitmentDigest [32]byte, provider common.Address, residualBidPercentAfterDecay *big.Int) (*types.Transaction, error) { + return _Bidderregistry.contract.Transact(opts, "convertFundsToProviderReward", commitmentDigest, provider, residualBidPercentAfterDecay) +} + +// ConvertFundsToProviderReward is a paid mutator transaction binding the contract method 0xde40a6ca. +// +// Solidity: function convertFundsToProviderReward(bytes32 commitmentDigest, address provider, uint256 residualBidPercentAfterDecay) returns() +func (_Bidderregistry *BidderregistrySession) ConvertFundsToProviderReward(commitmentDigest [32]byte, provider common.Address, residualBidPercentAfterDecay *big.Int) (*types.Transaction, error) { + return _Bidderregistry.Contract.ConvertFundsToProviderReward(&_Bidderregistry.TransactOpts, commitmentDigest, provider, residualBidPercentAfterDecay) +} + +// ConvertFundsToProviderReward is a paid mutator transaction binding the contract method 0xde40a6ca. +// +// Solidity: function convertFundsToProviderReward(bytes32 commitmentDigest, address provider, uint256 residualBidPercentAfterDecay) returns() +func (_Bidderregistry *BidderregistryTransactorSession) ConvertFundsToProviderReward(commitmentDigest [32]byte, provider common.Address, residualBidPercentAfterDecay *big.Int) (*types.Transaction, error) { + return _Bidderregistry.Contract.ConvertFundsToProviderReward(&_Bidderregistry.TransactOpts, commitmentDigest, provider, residualBidPercentAfterDecay) +} + +// DepositAsBidder is a paid mutator transaction binding the contract method 0xef9c26a0. // -// Solidity: function depositForWindow(uint256 window) payable returns() -func (_Bidderregistry *BidderregistryTransactor) DepositForWindow(opts *bind.TransactOpts, window *big.Int) (*types.Transaction, error) { - return _Bidderregistry.contract.Transact(opts, "depositForWindow", window) +// Solidity: function depositAsBidder(address provider) payable returns() +func (_Bidderregistry *BidderregistryTransactor) DepositAsBidder(opts *bind.TransactOpts, provider common.Address) (*types.Transaction, error) { + return _Bidderregistry.contract.Transact(opts, "depositAsBidder", provider) } -// DepositForWindow is a paid mutator transaction binding the contract method 0xde7fa558. +// DepositAsBidder is a paid mutator transaction binding the contract method 0xef9c26a0. // -// Solidity: function depositForWindow(uint256 window) payable returns() -func (_Bidderregistry *BidderregistrySession) DepositForWindow(window *big.Int) (*types.Transaction, error) { - return _Bidderregistry.Contract.DepositForWindow(&_Bidderregistry.TransactOpts, window) +// Solidity: function depositAsBidder(address provider) payable returns() +func (_Bidderregistry *BidderregistrySession) DepositAsBidder(provider common.Address) (*types.Transaction, error) { + return _Bidderregistry.Contract.DepositAsBidder(&_Bidderregistry.TransactOpts, provider) } -// DepositForWindow is a paid mutator transaction binding the contract method 0xde7fa558. +// DepositAsBidder is a paid mutator transaction binding the contract method 0xef9c26a0. // -// Solidity: function depositForWindow(uint256 window) payable returns() -func (_Bidderregistry *BidderregistryTransactorSession) DepositForWindow(window *big.Int) (*types.Transaction, error) { - return _Bidderregistry.Contract.DepositForWindow(&_Bidderregistry.TransactOpts, window) +// Solidity: function depositAsBidder(address provider) payable returns() +func (_Bidderregistry *BidderregistryTransactorSession) DepositAsBidder(provider common.Address) (*types.Transaction, error) { + return _Bidderregistry.Contract.DepositAsBidder(&_Bidderregistry.TransactOpts, provider) } -// DepositForWindows is a paid mutator transaction binding the contract method 0x531a2052. +// DepositEvenlyAsBidder is a paid mutator transaction binding the contract method 0x1f405064. // -// Solidity: function depositForWindows(uint256[] windows) payable returns() -func (_Bidderregistry *BidderregistryTransactor) DepositForWindows(opts *bind.TransactOpts, windows []*big.Int) (*types.Transaction, error) { - return _Bidderregistry.contract.Transact(opts, "depositForWindows", windows) +// Solidity: function depositEvenlyAsBidder(address[] providers) payable returns() +func (_Bidderregistry *BidderregistryTransactor) DepositEvenlyAsBidder(opts *bind.TransactOpts, providers []common.Address) (*types.Transaction, error) { + return _Bidderregistry.contract.Transact(opts, "depositEvenlyAsBidder", providers) } -// DepositForWindows is a paid mutator transaction binding the contract method 0x531a2052. +// DepositEvenlyAsBidder is a paid mutator transaction binding the contract method 0x1f405064. // -// Solidity: function depositForWindows(uint256[] windows) payable returns() -func (_Bidderregistry *BidderregistrySession) DepositForWindows(windows []*big.Int) (*types.Transaction, error) { - return _Bidderregistry.Contract.DepositForWindows(&_Bidderregistry.TransactOpts, windows) +// Solidity: function depositEvenlyAsBidder(address[] providers) payable returns() +func (_Bidderregistry *BidderregistrySession) DepositEvenlyAsBidder(providers []common.Address) (*types.Transaction, error) { + return _Bidderregistry.Contract.DepositEvenlyAsBidder(&_Bidderregistry.TransactOpts, providers) } -// DepositForWindows is a paid mutator transaction binding the contract method 0x531a2052. +// DepositEvenlyAsBidder is a paid mutator transaction binding the contract method 0x1f405064. // -// Solidity: function depositForWindows(uint256[] windows) payable returns() -func (_Bidderregistry *BidderregistryTransactorSession) DepositForWindows(windows []*big.Int) (*types.Transaction, error) { - return _Bidderregistry.Contract.DepositForWindows(&_Bidderregistry.TransactOpts, windows) +// Solidity: function depositEvenlyAsBidder(address[] providers) payable returns() +func (_Bidderregistry *BidderregistryTransactorSession) DepositEvenlyAsBidder(providers []common.Address) (*types.Transaction, error) { + return _Bidderregistry.Contract.DepositEvenlyAsBidder(&_Bidderregistry.TransactOpts, providers) } -// Initialize is a paid mutator transaction binding the contract method 0x2a1d0547. +// Initialize is a paid mutator transaction binding the contract method 0x8d3839d2. // -// Solidity: function initialize(address _protocolFeeRecipient, uint256 _feePercent, address _owner, address _blockTracker, uint256 _feePayoutPeriod) returns() -func (_Bidderregistry *BidderregistryTransactor) Initialize(opts *bind.TransactOpts, _protocolFeeRecipient common.Address, _feePercent *big.Int, _owner common.Address, _blockTracker common.Address, _feePayoutPeriod *big.Int) (*types.Transaction, error) { - return _Bidderregistry.contract.Transact(opts, "initialize", _protocolFeeRecipient, _feePercent, _owner, _blockTracker, _feePayoutPeriod) +// Solidity: function initialize(address _protocolFeeRecipient, uint256 _feePercent, address _owner, address _blockTracker, uint256 _feePayoutPeriod, uint256 _bidderWithdrawalPeriodMs) returns() +func (_Bidderregistry *BidderregistryTransactor) Initialize(opts *bind.TransactOpts, _protocolFeeRecipient common.Address, _feePercent *big.Int, _owner common.Address, _blockTracker common.Address, _feePayoutPeriod *big.Int, _bidderWithdrawalPeriodMs *big.Int) (*types.Transaction, error) { + return _Bidderregistry.contract.Transact(opts, "initialize", _protocolFeeRecipient, _feePercent, _owner, _blockTracker, _feePayoutPeriod, _bidderWithdrawalPeriodMs) } -// Initialize is a paid mutator transaction binding the contract method 0x2a1d0547. +// Initialize is a paid mutator transaction binding the contract method 0x8d3839d2. // -// Solidity: function initialize(address _protocolFeeRecipient, uint256 _feePercent, address _owner, address _blockTracker, uint256 _feePayoutPeriod) returns() -func (_Bidderregistry *BidderregistrySession) Initialize(_protocolFeeRecipient common.Address, _feePercent *big.Int, _owner common.Address, _blockTracker common.Address, _feePayoutPeriod *big.Int) (*types.Transaction, error) { - return _Bidderregistry.Contract.Initialize(&_Bidderregistry.TransactOpts, _protocolFeeRecipient, _feePercent, _owner, _blockTracker, _feePayoutPeriod) +// Solidity: function initialize(address _protocolFeeRecipient, uint256 _feePercent, address _owner, address _blockTracker, uint256 _feePayoutPeriod, uint256 _bidderWithdrawalPeriodMs) returns() +func (_Bidderregistry *BidderregistrySession) Initialize(_protocolFeeRecipient common.Address, _feePercent *big.Int, _owner common.Address, _blockTracker common.Address, _feePayoutPeriod *big.Int, _bidderWithdrawalPeriodMs *big.Int) (*types.Transaction, error) { + return _Bidderregistry.Contract.Initialize(&_Bidderregistry.TransactOpts, _protocolFeeRecipient, _feePercent, _owner, _blockTracker, _feePayoutPeriod, _bidderWithdrawalPeriodMs) } -// Initialize is a paid mutator transaction binding the contract method 0x2a1d0547. +// Initialize is a paid mutator transaction binding the contract method 0x8d3839d2. // -// Solidity: function initialize(address _protocolFeeRecipient, uint256 _feePercent, address _owner, address _blockTracker, uint256 _feePayoutPeriod) returns() -func (_Bidderregistry *BidderregistryTransactorSession) Initialize(_protocolFeeRecipient common.Address, _feePercent *big.Int, _owner common.Address, _blockTracker common.Address, _feePayoutPeriod *big.Int) (*types.Transaction, error) { - return _Bidderregistry.Contract.Initialize(&_Bidderregistry.TransactOpts, _protocolFeeRecipient, _feePercent, _owner, _blockTracker, _feePayoutPeriod) +// Solidity: function initialize(address _protocolFeeRecipient, uint256 _feePercent, address _owner, address _blockTracker, uint256 _feePayoutPeriod, uint256 _bidderWithdrawalPeriodMs) returns() +func (_Bidderregistry *BidderregistryTransactorSession) Initialize(_protocolFeeRecipient common.Address, _feePercent *big.Int, _owner common.Address, _blockTracker common.Address, _feePayoutPeriod *big.Int, _bidderWithdrawalPeriodMs *big.Int) (*types.Transaction, error) { + return _Bidderregistry.Contract.Initialize(&_Bidderregistry.TransactOpts, _protocolFeeRecipient, _feePercent, _owner, _blockTracker, _feePayoutPeriod, _bidderWithdrawalPeriodMs) } // ManuallyWithdrawProtocolFee is a paid mutator transaction binding the contract method 0xdbf63530. @@ -917,25 +968,25 @@ func (_Bidderregistry *BidderregistryTransactorSession) ManuallyWithdrawProtocol return _Bidderregistry.Contract.ManuallyWithdrawProtocolFee(&_Bidderregistry.TransactOpts) } -// OpenBid is a paid mutator transaction binding the contract method 0x2a241d75. +// OpenBid is a paid mutator transaction binding the contract method 0xda1c072c. // -// Solidity: function openBid(bytes32 commitmentDigest, uint256 bidAmt, address bidder, uint64 blockNumber) returns(uint256) -func (_Bidderregistry *BidderregistryTransactor) OpenBid(opts *bind.TransactOpts, commitmentDigest [32]byte, bidAmt *big.Int, bidder common.Address, blockNumber uint64) (*types.Transaction, error) { - return _Bidderregistry.contract.Transact(opts, "openBid", commitmentDigest, bidAmt, bidder, blockNumber) +// Solidity: function openBid(bytes32 commitmentDigest, uint256 bidAmt, address bidder, address provider) returns(uint256) +func (_Bidderregistry *BidderregistryTransactor) OpenBid(opts *bind.TransactOpts, commitmentDigest [32]byte, bidAmt *big.Int, bidder common.Address, provider common.Address) (*types.Transaction, error) { + return _Bidderregistry.contract.Transact(opts, "openBid", commitmentDigest, bidAmt, bidder, provider) } -// OpenBid is a paid mutator transaction binding the contract method 0x2a241d75. +// OpenBid is a paid mutator transaction binding the contract method 0xda1c072c. // -// Solidity: function openBid(bytes32 commitmentDigest, uint256 bidAmt, address bidder, uint64 blockNumber) returns(uint256) -func (_Bidderregistry *BidderregistrySession) OpenBid(commitmentDigest [32]byte, bidAmt *big.Int, bidder common.Address, blockNumber uint64) (*types.Transaction, error) { - return _Bidderregistry.Contract.OpenBid(&_Bidderregistry.TransactOpts, commitmentDigest, bidAmt, bidder, blockNumber) +// Solidity: function openBid(bytes32 commitmentDigest, uint256 bidAmt, address bidder, address provider) returns(uint256) +func (_Bidderregistry *BidderregistrySession) OpenBid(commitmentDigest [32]byte, bidAmt *big.Int, bidder common.Address, provider common.Address) (*types.Transaction, error) { + return _Bidderregistry.Contract.OpenBid(&_Bidderregistry.TransactOpts, commitmentDigest, bidAmt, bidder, provider) } -// OpenBid is a paid mutator transaction binding the contract method 0x2a241d75. +// OpenBid is a paid mutator transaction binding the contract method 0xda1c072c. // -// Solidity: function openBid(bytes32 commitmentDigest, uint256 bidAmt, address bidder, uint64 blockNumber) returns(uint256) -func (_Bidderregistry *BidderregistryTransactorSession) OpenBid(commitmentDigest [32]byte, bidAmt *big.Int, bidder common.Address, blockNumber uint64) (*types.Transaction, error) { - return _Bidderregistry.Contract.OpenBid(&_Bidderregistry.TransactOpts, commitmentDigest, bidAmt, bidder, blockNumber) +// Solidity: function openBid(bytes32 commitmentDigest, uint256 bidAmt, address bidder, address provider) returns(uint256) +func (_Bidderregistry *BidderregistryTransactorSession) OpenBid(commitmentDigest [32]byte, bidAmt *big.Int, bidder common.Address, provider common.Address) (*types.Transaction, error) { + return _Bidderregistry.Contract.OpenBid(&_Bidderregistry.TransactOpts, commitmentDigest, bidAmt, bidder, provider) } // Pause is a paid mutator transaction binding the contract method 0x8456cb59. @@ -980,25 +1031,25 @@ func (_Bidderregistry *BidderregistryTransactorSession) RenounceOwnership() (*ty return _Bidderregistry.Contract.RenounceOwnership(&_Bidderregistry.TransactOpts) } -// RetrieveFunds is a paid mutator transaction binding the contract method 0x0c2e5b0e. +// RequestWithdrawalsAsBidder is a paid mutator transaction binding the contract method 0x2c923b17. // -// Solidity: function retrieveFunds(uint256 windowToSettle, bytes32 commitmentDigest, address provider, uint256 residualBidPercentAfterDecay) returns() -func (_Bidderregistry *BidderregistryTransactor) RetrieveFunds(opts *bind.TransactOpts, windowToSettle *big.Int, commitmentDigest [32]byte, provider common.Address, residualBidPercentAfterDecay *big.Int) (*types.Transaction, error) { - return _Bidderregistry.contract.Transact(opts, "retrieveFunds", windowToSettle, commitmentDigest, provider, residualBidPercentAfterDecay) +// Solidity: function requestWithdrawalsAsBidder(address[] providers) returns() +func (_Bidderregistry *BidderregistryTransactor) RequestWithdrawalsAsBidder(opts *bind.TransactOpts, providers []common.Address) (*types.Transaction, error) { + return _Bidderregistry.contract.Transact(opts, "requestWithdrawalsAsBidder", providers) } -// RetrieveFunds is a paid mutator transaction binding the contract method 0x0c2e5b0e. +// RequestWithdrawalsAsBidder is a paid mutator transaction binding the contract method 0x2c923b17. // -// Solidity: function retrieveFunds(uint256 windowToSettle, bytes32 commitmentDigest, address provider, uint256 residualBidPercentAfterDecay) returns() -func (_Bidderregistry *BidderregistrySession) RetrieveFunds(windowToSettle *big.Int, commitmentDigest [32]byte, provider common.Address, residualBidPercentAfterDecay *big.Int) (*types.Transaction, error) { - return _Bidderregistry.Contract.RetrieveFunds(&_Bidderregistry.TransactOpts, windowToSettle, commitmentDigest, provider, residualBidPercentAfterDecay) +// Solidity: function requestWithdrawalsAsBidder(address[] providers) returns() +func (_Bidderregistry *BidderregistrySession) RequestWithdrawalsAsBidder(providers []common.Address) (*types.Transaction, error) { + return _Bidderregistry.Contract.RequestWithdrawalsAsBidder(&_Bidderregistry.TransactOpts, providers) } -// RetrieveFunds is a paid mutator transaction binding the contract method 0x0c2e5b0e. +// RequestWithdrawalsAsBidder is a paid mutator transaction binding the contract method 0x2c923b17. // -// Solidity: function retrieveFunds(uint256 windowToSettle, bytes32 commitmentDigest, address provider, uint256 residualBidPercentAfterDecay) returns() -func (_Bidderregistry *BidderregistryTransactorSession) RetrieveFunds(windowToSettle *big.Int, commitmentDigest [32]byte, provider common.Address, residualBidPercentAfterDecay *big.Int) (*types.Transaction, error) { - return _Bidderregistry.Contract.RetrieveFunds(&_Bidderregistry.TransactOpts, windowToSettle, commitmentDigest, provider, residualBidPercentAfterDecay) +// Solidity: function requestWithdrawalsAsBidder(address[] providers) returns() +func (_Bidderregistry *BidderregistryTransactorSession) RequestWithdrawalsAsBidder(providers []common.Address) (*types.Transaction, error) { + return _Bidderregistry.Contract.RequestWithdrawalsAsBidder(&_Bidderregistry.TransactOpts, providers) } // SetBlockTrackerContract is a paid mutator transaction binding the contract method 0x338f61f5. @@ -1127,25 +1178,25 @@ func (_Bidderregistry *BidderregistryTransactorSession) TransferOwnership(newOwn return _Bidderregistry.Contract.TransferOwnership(&_Bidderregistry.TransactOpts, newOwner) } -// UnlockFunds is a paid mutator transaction binding the contract method 0x432e707b. +// UnlockFunds is a paid mutator transaction binding the contract method 0x147c04e8. // -// Solidity: function unlockFunds(uint256 window, bytes32 commitmentDigest) returns() -func (_Bidderregistry *BidderregistryTransactor) UnlockFunds(opts *bind.TransactOpts, window *big.Int, commitmentDigest [32]byte) (*types.Transaction, error) { - return _Bidderregistry.contract.Transact(opts, "unlockFunds", window, commitmentDigest) +// Solidity: function unlockFunds(address provider, bytes32 commitmentDigest) returns() +func (_Bidderregistry *BidderregistryTransactor) UnlockFunds(opts *bind.TransactOpts, provider common.Address, commitmentDigest [32]byte) (*types.Transaction, error) { + return _Bidderregistry.contract.Transact(opts, "unlockFunds", provider, commitmentDigest) } -// UnlockFunds is a paid mutator transaction binding the contract method 0x432e707b. +// UnlockFunds is a paid mutator transaction binding the contract method 0x147c04e8. // -// Solidity: function unlockFunds(uint256 window, bytes32 commitmentDigest) returns() -func (_Bidderregistry *BidderregistrySession) UnlockFunds(window *big.Int, commitmentDigest [32]byte) (*types.Transaction, error) { - return _Bidderregistry.Contract.UnlockFunds(&_Bidderregistry.TransactOpts, window, commitmentDigest) +// Solidity: function unlockFunds(address provider, bytes32 commitmentDigest) returns() +func (_Bidderregistry *BidderregistrySession) UnlockFunds(provider common.Address, commitmentDigest [32]byte) (*types.Transaction, error) { + return _Bidderregistry.Contract.UnlockFunds(&_Bidderregistry.TransactOpts, provider, commitmentDigest) } -// UnlockFunds is a paid mutator transaction binding the contract method 0x432e707b. +// UnlockFunds is a paid mutator transaction binding the contract method 0x147c04e8. // -// Solidity: function unlockFunds(uint256 window, bytes32 commitmentDigest) returns() -func (_Bidderregistry *BidderregistryTransactorSession) UnlockFunds(window *big.Int, commitmentDigest [32]byte) (*types.Transaction, error) { - return _Bidderregistry.Contract.UnlockFunds(&_Bidderregistry.TransactOpts, window, commitmentDigest) +// Solidity: function unlockFunds(address provider, bytes32 commitmentDigest) returns() +func (_Bidderregistry *BidderregistryTransactorSession) UnlockFunds(provider common.Address, commitmentDigest [32]byte) (*types.Transaction, error) { + return _Bidderregistry.Contract.UnlockFunds(&_Bidderregistry.TransactOpts, provider, commitmentDigest) } // Unpause is a paid mutator transaction binding the contract method 0x3f4ba83a. @@ -1190,46 +1241,25 @@ func (_Bidderregistry *BidderregistryTransactorSession) UpgradeToAndCall(newImpl return _Bidderregistry.Contract.UpgradeToAndCall(&_Bidderregistry.TransactOpts, newImplementation, data) } -// WithdrawBidderAmountFromWindow is a paid mutator transaction binding the contract method 0xa4bf023c. -// -// Solidity: function withdrawBidderAmountFromWindow(address bidder, uint256 window) returns() -func (_Bidderregistry *BidderregistryTransactor) WithdrawBidderAmountFromWindow(opts *bind.TransactOpts, bidder common.Address, window *big.Int) (*types.Transaction, error) { - return _Bidderregistry.contract.Transact(opts, "withdrawBidderAmountFromWindow", bidder, window) -} - -// WithdrawBidderAmountFromWindow is a paid mutator transaction binding the contract method 0xa4bf023c. -// -// Solidity: function withdrawBidderAmountFromWindow(address bidder, uint256 window) returns() -func (_Bidderregistry *BidderregistrySession) WithdrawBidderAmountFromWindow(bidder common.Address, window *big.Int) (*types.Transaction, error) { - return _Bidderregistry.Contract.WithdrawBidderAmountFromWindow(&_Bidderregistry.TransactOpts, bidder, window) -} - -// WithdrawBidderAmountFromWindow is a paid mutator transaction binding the contract method 0xa4bf023c. +// WithdrawAsBidder is a paid mutator transaction binding the contract method 0x5b6dabb2. // -// Solidity: function withdrawBidderAmountFromWindow(address bidder, uint256 window) returns() -func (_Bidderregistry *BidderregistryTransactorSession) WithdrawBidderAmountFromWindow(bidder common.Address, window *big.Int) (*types.Transaction, error) { - return _Bidderregistry.Contract.WithdrawBidderAmountFromWindow(&_Bidderregistry.TransactOpts, bidder, window) +// Solidity: function withdrawAsBidder(address[] providers) returns() +func (_Bidderregistry *BidderregistryTransactor) WithdrawAsBidder(opts *bind.TransactOpts, providers []common.Address) (*types.Transaction, error) { + return _Bidderregistry.contract.Transact(opts, "withdrawAsBidder", providers) } -// WithdrawFromWindows is a paid mutator transaction binding the contract method 0x6745206a. +// WithdrawAsBidder is a paid mutator transaction binding the contract method 0x5b6dabb2. // -// Solidity: function withdrawFromWindows(uint256[] windows) returns() -func (_Bidderregistry *BidderregistryTransactor) WithdrawFromWindows(opts *bind.TransactOpts, windows []*big.Int) (*types.Transaction, error) { - return _Bidderregistry.contract.Transact(opts, "withdrawFromWindows", windows) +// Solidity: function withdrawAsBidder(address[] providers) returns() +func (_Bidderregistry *BidderregistrySession) WithdrawAsBidder(providers []common.Address) (*types.Transaction, error) { + return _Bidderregistry.Contract.WithdrawAsBidder(&_Bidderregistry.TransactOpts, providers) } -// WithdrawFromWindows is a paid mutator transaction binding the contract method 0x6745206a. +// WithdrawAsBidder is a paid mutator transaction binding the contract method 0x5b6dabb2. // -// Solidity: function withdrawFromWindows(uint256[] windows) returns() -func (_Bidderregistry *BidderregistrySession) WithdrawFromWindows(windows []*big.Int) (*types.Transaction, error) { - return _Bidderregistry.Contract.WithdrawFromWindows(&_Bidderregistry.TransactOpts, windows) -} - -// WithdrawFromWindows is a paid mutator transaction binding the contract method 0x6745206a. -// -// Solidity: function withdrawFromWindows(uint256[] windows) returns() -func (_Bidderregistry *BidderregistryTransactorSession) WithdrawFromWindows(windows []*big.Int) (*types.Transaction, error) { - return _Bidderregistry.Contract.WithdrawFromWindows(&_Bidderregistry.TransactOpts, windows) +// Solidity: function withdrawAsBidder(address[] providers) returns() +func (_Bidderregistry *BidderregistryTransactorSession) WithdrawAsBidder(providers []common.Address) (*types.Transaction, error) { + return _Bidderregistry.Contract.WithdrawAsBidder(&_Bidderregistry.TransactOpts, providers) } // WithdrawProviderAmount is a paid mutator transaction binding the contract method 0x9a2dd5ba. @@ -1295,9 +1325,9 @@ func (_Bidderregistry *BidderregistryTransactorSession) Receive() (*types.Transa return _Bidderregistry.Contract.Receive(&_Bidderregistry.TransactOpts) } -// BidderregistryBidderRegisteredIterator is returned from FilterBidderRegistered and is used to iterate over the raw logs and unpacked data for BidderRegistered events raised by the Bidderregistry contract. -type BidderregistryBidderRegisteredIterator struct { - Event *BidderregistryBidderRegistered // Event containing the contract specifics and raw log +// BidderregistryBidderDepositedIterator is returned from FilterBidderDeposited and is used to iterate over the raw logs and unpacked data for BidderDeposited events raised by the Bidderregistry contract. +type BidderregistryBidderDepositedIterator struct { + Event *BidderregistryBidderDeposited // 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 @@ -1311,7 +1341,7 @@ type BidderregistryBidderRegisteredIterator struct { // 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 *BidderregistryBidderRegisteredIterator) Next() bool { +func (it *BidderregistryBidderDepositedIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -1320,7 +1350,7 @@ func (it *BidderregistryBidderRegisteredIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(BidderregistryBidderRegistered) + it.Event = new(BidderregistryBidderDeposited) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1335,7 +1365,7 @@ func (it *BidderregistryBidderRegisteredIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(BidderregistryBidderRegistered) + it.Event = new(BidderregistryBidderDeposited) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1351,69 +1381,69 @@ func (it *BidderregistryBidderRegisteredIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *BidderregistryBidderRegisteredIterator) Error() error { +func (it *BidderregistryBidderDepositedIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *BidderregistryBidderRegisteredIterator) Close() error { +func (it *BidderregistryBidderDepositedIterator) Close() error { it.sub.Unsubscribe() return nil } -// BidderregistryBidderRegistered represents a BidderRegistered event raised by the Bidderregistry contract. -type BidderregistryBidderRegistered struct { +// BidderregistryBidderDeposited represents a BidderDeposited event raised by the Bidderregistry contract. +type BidderregistryBidderDeposited struct { Bidder common.Address + Provider common.Address DepositedAmount *big.Int - WindowNumber *big.Int Raw types.Log // Blockchain specific contextual infos } -// FilterBidderRegistered is a free log retrieval operation binding the contract event 0x2ed10ffb7f7e5289e3bb91b8c3751388cb5d9b7f4533b9f0d59881a99822ddb3. +// FilterBidderDeposited is a free log retrieval operation binding the contract event 0x4d20d1fbd69c0e659804a90e1059acadeedf06a29168dbd3354ebe2da51fe5b7. // -// Solidity: event BidderRegistered(address indexed bidder, uint256 indexed depositedAmount, uint256 indexed windowNumber) -func (_Bidderregistry *BidderregistryFilterer) FilterBidderRegistered(opts *bind.FilterOpts, bidder []common.Address, depositedAmount []*big.Int, windowNumber []*big.Int) (*BidderregistryBidderRegisteredIterator, error) { +// Solidity: event BidderDeposited(address indexed bidder, address indexed provider, uint256 indexed depositedAmount) +func (_Bidderregistry *BidderregistryFilterer) FilterBidderDeposited(opts *bind.FilterOpts, bidder []common.Address, provider []common.Address, depositedAmount []*big.Int) (*BidderregistryBidderDepositedIterator, error) { var bidderRule []interface{} for _, bidderItem := range bidder { bidderRule = append(bidderRule, bidderItem) } + var providerRule []interface{} + for _, providerItem := range provider { + providerRule = append(providerRule, providerItem) + } var depositedAmountRule []interface{} for _, depositedAmountItem := range depositedAmount { depositedAmountRule = append(depositedAmountRule, depositedAmountItem) } - var windowNumberRule []interface{} - for _, windowNumberItem := range windowNumber { - windowNumberRule = append(windowNumberRule, windowNumberItem) - } - logs, sub, err := _Bidderregistry.contract.FilterLogs(opts, "BidderRegistered", bidderRule, depositedAmountRule, windowNumberRule) + logs, sub, err := _Bidderregistry.contract.FilterLogs(opts, "BidderDeposited", bidderRule, providerRule, depositedAmountRule) if err != nil { return nil, err } - return &BidderregistryBidderRegisteredIterator{contract: _Bidderregistry.contract, event: "BidderRegistered", logs: logs, sub: sub}, nil + return &BidderregistryBidderDepositedIterator{contract: _Bidderregistry.contract, event: "BidderDeposited", logs: logs, sub: sub}, nil } -// WatchBidderRegistered is a free log subscription operation binding the contract event 0x2ed10ffb7f7e5289e3bb91b8c3751388cb5d9b7f4533b9f0d59881a99822ddb3. +// WatchBidderDeposited is a free log subscription operation binding the contract event 0x4d20d1fbd69c0e659804a90e1059acadeedf06a29168dbd3354ebe2da51fe5b7. // -// Solidity: event BidderRegistered(address indexed bidder, uint256 indexed depositedAmount, uint256 indexed windowNumber) -func (_Bidderregistry *BidderregistryFilterer) WatchBidderRegistered(opts *bind.WatchOpts, sink chan<- *BidderregistryBidderRegistered, bidder []common.Address, depositedAmount []*big.Int, windowNumber []*big.Int) (event.Subscription, error) { +// Solidity: event BidderDeposited(address indexed bidder, address indexed provider, uint256 indexed depositedAmount) +func (_Bidderregistry *BidderregistryFilterer) WatchBidderDeposited(opts *bind.WatchOpts, sink chan<- *BidderregistryBidderDeposited, bidder []common.Address, provider []common.Address, depositedAmount []*big.Int) (event.Subscription, error) { var bidderRule []interface{} for _, bidderItem := range bidder { bidderRule = append(bidderRule, bidderItem) } + var providerRule []interface{} + for _, providerItem := range provider { + providerRule = append(providerRule, providerItem) + } var depositedAmountRule []interface{} for _, depositedAmountItem := range depositedAmount { depositedAmountRule = append(depositedAmountRule, depositedAmountItem) } - var windowNumberRule []interface{} - for _, windowNumberItem := range windowNumber { - windowNumberRule = append(windowNumberRule, windowNumberItem) - } - logs, sub, err := _Bidderregistry.contract.WatchLogs(opts, "BidderRegistered", bidderRule, depositedAmountRule, windowNumberRule) + logs, sub, err := _Bidderregistry.contract.WatchLogs(opts, "BidderDeposited", bidderRule, providerRule, depositedAmountRule) if err != nil { return nil, err } @@ -1423,8 +1453,8 @@ func (_Bidderregistry *BidderregistryFilterer) WatchBidderRegistered(opts *bind. select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(BidderregistryBidderRegistered) - if err := _Bidderregistry.contract.UnpackLog(event, "BidderRegistered", log); err != nil { + event := new(BidderregistryBidderDeposited) + if err := _Bidderregistry.contract.UnpackLog(event, "BidderDeposited", log); err != nil { return err } event.Raw = log @@ -1445,12 +1475,12 @@ func (_Bidderregistry *BidderregistryFilterer) WatchBidderRegistered(opts *bind. }), nil } -// ParseBidderRegistered is a log parse operation binding the contract event 0x2ed10ffb7f7e5289e3bb91b8c3751388cb5d9b7f4533b9f0d59881a99822ddb3. +// ParseBidderDeposited is a log parse operation binding the contract event 0x4d20d1fbd69c0e659804a90e1059acadeedf06a29168dbd3354ebe2da51fe5b7. // -// Solidity: event BidderRegistered(address indexed bidder, uint256 indexed depositedAmount, uint256 indexed windowNumber) -func (_Bidderregistry *BidderregistryFilterer) ParseBidderRegistered(log types.Log) (*BidderregistryBidderRegistered, error) { - event := new(BidderregistryBidderRegistered) - if err := _Bidderregistry.contract.UnpackLog(event, "BidderRegistered", log); err != nil { +// Solidity: event BidderDeposited(address indexed bidder, address indexed provider, uint256 indexed depositedAmount) +func (_Bidderregistry *BidderregistryFilterer) ParseBidderDeposited(log types.Log) (*BidderregistryBidderDeposited, error) { + event := new(BidderregistryBidderDeposited) + if err := _Bidderregistry.contract.UnpackLog(event, "BidderDeposited", log); err != nil { return nil, err } event.Raw = log @@ -1526,56 +1556,57 @@ func (it *BidderregistryBidderWithdrawalIterator) Close() error { // BidderregistryBidderWithdrawal represents a BidderWithdrawal event raised by the Bidderregistry contract. type BidderregistryBidderWithdrawal struct { - Bidder common.Address - Window *big.Int - Amount *big.Int - Raw types.Log // Blockchain specific contextual infos + Bidder common.Address + Provider common.Address + AmountWithdrawn *big.Int + AmountEscrowed *big.Int + Raw types.Log // Blockchain specific contextual infos } -// FilterBidderWithdrawal is a free log retrieval operation binding the contract event 0x2be239cccec761cb15b4070dda36677f39cb05afba45c7419fe7e27ed2c90b29. +// FilterBidderWithdrawal is a free log retrieval operation binding the contract event 0xd31e0eb19177a3f05b460dd887249c5b3e8e2ca0e48a806c3d3a4a9797522565. // -// Solidity: event BidderWithdrawal(address indexed bidder, uint256 indexed window, uint256 indexed amount) -func (_Bidderregistry *BidderregistryFilterer) FilterBidderWithdrawal(opts *bind.FilterOpts, bidder []common.Address, window []*big.Int, amount []*big.Int) (*BidderregistryBidderWithdrawalIterator, error) { +// Solidity: event BidderWithdrawal(address indexed bidder, address indexed provider, uint256 indexed amountWithdrawn, uint256 amountEscrowed) +func (_Bidderregistry *BidderregistryFilterer) FilterBidderWithdrawal(opts *bind.FilterOpts, bidder []common.Address, provider []common.Address, amountWithdrawn []*big.Int) (*BidderregistryBidderWithdrawalIterator, error) { var bidderRule []interface{} for _, bidderItem := range bidder { bidderRule = append(bidderRule, bidderItem) } - var windowRule []interface{} - for _, windowItem := range window { - windowRule = append(windowRule, windowItem) + var providerRule []interface{} + for _, providerItem := range provider { + providerRule = append(providerRule, providerItem) } - var amountRule []interface{} - for _, amountItem := range amount { - amountRule = append(amountRule, amountItem) + var amountWithdrawnRule []interface{} + for _, amountWithdrawnItem := range amountWithdrawn { + amountWithdrawnRule = append(amountWithdrawnRule, amountWithdrawnItem) } - logs, sub, err := _Bidderregistry.contract.FilterLogs(opts, "BidderWithdrawal", bidderRule, windowRule, amountRule) + logs, sub, err := _Bidderregistry.contract.FilterLogs(opts, "BidderWithdrawal", bidderRule, providerRule, amountWithdrawnRule) if err != nil { return nil, err } return &BidderregistryBidderWithdrawalIterator{contract: _Bidderregistry.contract, event: "BidderWithdrawal", logs: logs, sub: sub}, nil } -// WatchBidderWithdrawal is a free log subscription operation binding the contract event 0x2be239cccec761cb15b4070dda36677f39cb05afba45c7419fe7e27ed2c90b29. +// WatchBidderWithdrawal is a free log subscription operation binding the contract event 0xd31e0eb19177a3f05b460dd887249c5b3e8e2ca0e48a806c3d3a4a9797522565. // -// Solidity: event BidderWithdrawal(address indexed bidder, uint256 indexed window, uint256 indexed amount) -func (_Bidderregistry *BidderregistryFilterer) WatchBidderWithdrawal(opts *bind.WatchOpts, sink chan<- *BidderregistryBidderWithdrawal, bidder []common.Address, window []*big.Int, amount []*big.Int) (event.Subscription, error) { +// Solidity: event BidderWithdrawal(address indexed bidder, address indexed provider, uint256 indexed amountWithdrawn, uint256 amountEscrowed) +func (_Bidderregistry *BidderregistryFilterer) WatchBidderWithdrawal(opts *bind.WatchOpts, sink chan<- *BidderregistryBidderWithdrawal, bidder []common.Address, provider []common.Address, amountWithdrawn []*big.Int) (event.Subscription, error) { var bidderRule []interface{} for _, bidderItem := range bidder { bidderRule = append(bidderRule, bidderItem) } - var windowRule []interface{} - for _, windowItem := range window { - windowRule = append(windowRule, windowItem) + var providerRule []interface{} + for _, providerItem := range provider { + providerRule = append(providerRule, providerItem) } - var amountRule []interface{} - for _, amountItem := range amount { - amountRule = append(amountRule, amountItem) + var amountWithdrawnRule []interface{} + for _, amountWithdrawnItem := range amountWithdrawn { + amountWithdrawnRule = append(amountWithdrawnRule, amountWithdrawnItem) } - logs, sub, err := _Bidderregistry.contract.WatchLogs(opts, "BidderWithdrawal", bidderRule, windowRule, amountRule) + logs, sub, err := _Bidderregistry.contract.WatchLogs(opts, "BidderWithdrawal", bidderRule, providerRule, amountWithdrawnRule) if err != nil { return nil, err } @@ -1607,9 +1638,9 @@ func (_Bidderregistry *BidderregistryFilterer) WatchBidderWithdrawal(opts *bind. }), nil } -// ParseBidderWithdrawal is a log parse operation binding the contract event 0x2be239cccec761cb15b4070dda36677f39cb05afba45c7419fe7e27ed2c90b29. +// ParseBidderWithdrawal is a log parse operation binding the contract event 0xd31e0eb19177a3f05b460dd887249c5b3e8e2ca0e48a806c3d3a4a9797522565. // -// Solidity: event BidderWithdrawal(address indexed bidder, uint256 indexed window, uint256 indexed amount) +// Solidity: event BidderWithdrawal(address indexed bidder, address indexed provider, uint256 indexed amountWithdrawn, uint256 amountEscrowed) func (_Bidderregistry *BidderregistryFilterer) ParseBidderWithdrawal(log types.Log) (*BidderregistryBidderWithdrawal, error) { event := new(BidderregistryBidderWithdrawal) if err := _Bidderregistry.contract.UnpackLog(event, "BidderWithdrawal", log); err != nil { @@ -2196,9 +2227,9 @@ func (_Bidderregistry *BidderregistryFilterer) ParseFeeTransfer(log types.Log) ( return event, nil } -// BidderregistryFundsRetrievedIterator is returned from FilterFundsRetrieved and is used to iterate over the raw logs and unpacked data for FundsRetrieved events raised by the Bidderregistry contract. -type BidderregistryFundsRetrievedIterator struct { - Event *BidderregistryFundsRetrieved // Event containing the contract specifics and raw log +// BidderregistryFundsRewardedIterator is returned from FilterFundsRewarded and is used to iterate over the raw logs and unpacked data for FundsRewarded events raised by the Bidderregistry contract. +type BidderregistryFundsRewardedIterator struct { + Event *BidderregistryFundsRewarded // 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 @@ -2212,7 +2243,7 @@ type BidderregistryFundsRetrievedIterator struct { // 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 *BidderregistryFundsRetrievedIterator) Next() bool { +func (it *BidderregistryFundsRewardedIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -2221,7 +2252,7 @@ func (it *BidderregistryFundsRetrievedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(BidderregistryFundsRetrieved) + it.Event = new(BidderregistryFundsRewarded) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -2236,7 +2267,7 @@ func (it *BidderregistryFundsRetrievedIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(BidderregistryFundsRetrieved) + it.Event = new(BidderregistryFundsRewarded) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -2252,30 +2283,30 @@ func (it *BidderregistryFundsRetrievedIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *BidderregistryFundsRetrievedIterator) Error() error { +func (it *BidderregistryFundsRewardedIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *BidderregistryFundsRetrievedIterator) Close() error { +func (it *BidderregistryFundsRewardedIterator) Close() error { it.sub.Unsubscribe() return nil } -// BidderregistryFundsRetrieved represents a FundsRetrieved event raised by the Bidderregistry contract. -type BidderregistryFundsRetrieved struct { +// BidderregistryFundsRewarded represents a FundsRewarded event raised by the Bidderregistry contract. +type BidderregistryFundsRewarded struct { CommitmentDigest [32]byte Bidder common.Address - Window *big.Int + Provider common.Address Amount *big.Int Raw types.Log // Blockchain specific contextual infos } -// FilterFundsRetrieved is a free log retrieval operation binding the contract event 0x4ee0e06b2d2e4d1f06e75df9f2bad2c919d860fbf843f3b1f12de3264471a102. +// FilterFundsRewarded is a free log retrieval operation binding the contract event 0x8786873b1c0d8aefe1c7141028145afdbf1cf1b37fcb3df9eead17a1424367a4. // -// Solidity: event FundsRetrieved(bytes32 indexed commitmentDigest, address indexed bidder, uint256 indexed window, uint256 amount) -func (_Bidderregistry *BidderregistryFilterer) FilterFundsRetrieved(opts *bind.FilterOpts, commitmentDigest [][32]byte, bidder []common.Address, window []*big.Int) (*BidderregistryFundsRetrievedIterator, error) { +// Solidity: event FundsRewarded(bytes32 indexed commitmentDigest, address indexed bidder, address indexed provider, uint256 amount) +func (_Bidderregistry *BidderregistryFilterer) FilterFundsRewarded(opts *bind.FilterOpts, commitmentDigest [][32]byte, bidder []common.Address, provider []common.Address) (*BidderregistryFundsRewardedIterator, error) { var commitmentDigestRule []interface{} for _, commitmentDigestItem := range commitmentDigest { @@ -2285,22 +2316,22 @@ func (_Bidderregistry *BidderregistryFilterer) FilterFundsRetrieved(opts *bind.F for _, bidderItem := range bidder { bidderRule = append(bidderRule, bidderItem) } - var windowRule []interface{} - for _, windowItem := range window { - windowRule = append(windowRule, windowItem) + var providerRule []interface{} + for _, providerItem := range provider { + providerRule = append(providerRule, providerItem) } - logs, sub, err := _Bidderregistry.contract.FilterLogs(opts, "FundsRetrieved", commitmentDigestRule, bidderRule, windowRule) + logs, sub, err := _Bidderregistry.contract.FilterLogs(opts, "FundsRewarded", commitmentDigestRule, bidderRule, providerRule) if err != nil { return nil, err } - return &BidderregistryFundsRetrievedIterator{contract: _Bidderregistry.contract, event: "FundsRetrieved", logs: logs, sub: sub}, nil + return &BidderregistryFundsRewardedIterator{contract: _Bidderregistry.contract, event: "FundsRewarded", logs: logs, sub: sub}, nil } -// WatchFundsRetrieved is a free log subscription operation binding the contract event 0x4ee0e06b2d2e4d1f06e75df9f2bad2c919d860fbf843f3b1f12de3264471a102. +// WatchFundsRewarded is a free log subscription operation binding the contract event 0x8786873b1c0d8aefe1c7141028145afdbf1cf1b37fcb3df9eead17a1424367a4. // -// Solidity: event FundsRetrieved(bytes32 indexed commitmentDigest, address indexed bidder, uint256 indexed window, uint256 amount) -func (_Bidderregistry *BidderregistryFilterer) WatchFundsRetrieved(opts *bind.WatchOpts, sink chan<- *BidderregistryFundsRetrieved, commitmentDigest [][32]byte, bidder []common.Address, window []*big.Int) (event.Subscription, error) { +// Solidity: event FundsRewarded(bytes32 indexed commitmentDigest, address indexed bidder, address indexed provider, uint256 amount) +func (_Bidderregistry *BidderregistryFilterer) WatchFundsRewarded(opts *bind.WatchOpts, sink chan<- *BidderregistryFundsRewarded, commitmentDigest [][32]byte, bidder []common.Address, provider []common.Address) (event.Subscription, error) { var commitmentDigestRule []interface{} for _, commitmentDigestItem := range commitmentDigest { @@ -2310,12 +2341,12 @@ func (_Bidderregistry *BidderregistryFilterer) WatchFundsRetrieved(opts *bind.Wa for _, bidderItem := range bidder { bidderRule = append(bidderRule, bidderItem) } - var windowRule []interface{} - for _, windowItem := range window { - windowRule = append(windowRule, windowItem) + var providerRule []interface{} + for _, providerItem := range provider { + providerRule = append(providerRule, providerItem) } - logs, sub, err := _Bidderregistry.contract.WatchLogs(opts, "FundsRetrieved", commitmentDigestRule, bidderRule, windowRule) + logs, sub, err := _Bidderregistry.contract.WatchLogs(opts, "FundsRewarded", commitmentDigestRule, bidderRule, providerRule) if err != nil { return nil, err } @@ -2325,8 +2356,8 @@ func (_Bidderregistry *BidderregistryFilterer) WatchFundsRetrieved(opts *bind.Wa select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(BidderregistryFundsRetrieved) - if err := _Bidderregistry.contract.UnpackLog(event, "FundsRetrieved", log); err != nil { + event := new(BidderregistryFundsRewarded) + if err := _Bidderregistry.contract.UnpackLog(event, "FundsRewarded", log); err != nil { return err } event.Raw = log @@ -2347,21 +2378,21 @@ func (_Bidderregistry *BidderregistryFilterer) WatchFundsRetrieved(opts *bind.Wa }), nil } -// ParseFundsRetrieved is a log parse operation binding the contract event 0x4ee0e06b2d2e4d1f06e75df9f2bad2c919d860fbf843f3b1f12de3264471a102. +// ParseFundsRewarded is a log parse operation binding the contract event 0x8786873b1c0d8aefe1c7141028145afdbf1cf1b37fcb3df9eead17a1424367a4. // -// Solidity: event FundsRetrieved(bytes32 indexed commitmentDigest, address indexed bidder, uint256 indexed window, uint256 amount) -func (_Bidderregistry *BidderregistryFilterer) ParseFundsRetrieved(log types.Log) (*BidderregistryFundsRetrieved, error) { - event := new(BidderregistryFundsRetrieved) - if err := _Bidderregistry.contract.UnpackLog(event, "FundsRetrieved", log); err != nil { +// Solidity: event FundsRewarded(bytes32 indexed commitmentDigest, address indexed bidder, address indexed provider, uint256 amount) +func (_Bidderregistry *BidderregistryFilterer) ParseFundsRewarded(log types.Log) (*BidderregistryFundsRewarded, error) { + event := new(BidderregistryFundsRewarded) + if err := _Bidderregistry.contract.UnpackLog(event, "FundsRewarded", log); err != nil { return nil, err } event.Raw = log return event, nil } -// BidderregistryFundsRewardedIterator is returned from FilterFundsRewarded and is used to iterate over the raw logs and unpacked data for FundsRewarded events raised by the Bidderregistry contract. -type BidderregistryFundsRewardedIterator struct { - Event *BidderregistryFundsRewarded // Event containing the contract specifics and raw log +// BidderregistryFundsUnlockedIterator is returned from FilterFundsUnlocked and is used to iterate over the raw logs and unpacked data for FundsUnlocked events raised by the Bidderregistry contract. +type BidderregistryFundsUnlockedIterator struct { + Event *BidderregistryFundsUnlocked // 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 @@ -2375,7 +2406,7 @@ type BidderregistryFundsRewardedIterator struct { // 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 *BidderregistryFundsRewardedIterator) Next() bool { +func (it *BidderregistryFundsUnlockedIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -2384,7 +2415,7 @@ func (it *BidderregistryFundsRewardedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(BidderregistryFundsRewarded) + it.Event = new(BidderregistryFundsUnlocked) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -2399,7 +2430,7 @@ func (it *BidderregistryFundsRewardedIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(BidderregistryFundsRewarded) + it.Event = new(BidderregistryFundsUnlocked) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -2415,31 +2446,30 @@ func (it *BidderregistryFundsRewardedIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *BidderregistryFundsRewardedIterator) Error() error { +func (it *BidderregistryFundsUnlockedIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *BidderregistryFundsRewardedIterator) Close() error { +func (it *BidderregistryFundsUnlockedIterator) Close() error { it.sub.Unsubscribe() return nil } -// BidderregistryFundsRewarded represents a FundsRewarded event raised by the Bidderregistry contract. -type BidderregistryFundsRewarded struct { +// BidderregistryFundsUnlocked represents a FundsUnlocked event raised by the Bidderregistry contract. +type BidderregistryFundsUnlocked struct { CommitmentDigest [32]byte Bidder common.Address Provider common.Address - Window *big.Int Amount *big.Int Raw types.Log // Blockchain specific contextual infos } -// FilterFundsRewarded is a free log retrieval operation binding the contract event 0xd26f9e20ff994b4298fe22216ee15de6c9b7a46164d7a5509f2c4d065d8b408a. +// FilterFundsUnlocked is a free log retrieval operation binding the contract event 0x6e1c6ca1bf1040edd35af10bd76f7d1a379f91f28a726a00239e833db2abf363. // -// Solidity: event FundsRewarded(bytes32 indexed commitmentDigest, address indexed bidder, address indexed provider, uint256 window, uint256 amount) -func (_Bidderregistry *BidderregistryFilterer) FilterFundsRewarded(opts *bind.FilterOpts, commitmentDigest [][32]byte, bidder []common.Address, provider []common.Address) (*BidderregistryFundsRewardedIterator, error) { +// Solidity: event FundsUnlocked(bytes32 indexed commitmentDigest, address indexed bidder, address indexed provider, uint256 amount) +func (_Bidderregistry *BidderregistryFilterer) FilterFundsUnlocked(opts *bind.FilterOpts, commitmentDigest [][32]byte, bidder []common.Address, provider []common.Address) (*BidderregistryFundsUnlockedIterator, error) { var commitmentDigestRule []interface{} for _, commitmentDigestItem := range commitmentDigest { @@ -2454,17 +2484,17 @@ func (_Bidderregistry *BidderregistryFilterer) FilterFundsRewarded(opts *bind.Fi providerRule = append(providerRule, providerItem) } - logs, sub, err := _Bidderregistry.contract.FilterLogs(opts, "FundsRewarded", commitmentDigestRule, bidderRule, providerRule) + logs, sub, err := _Bidderregistry.contract.FilterLogs(opts, "FundsUnlocked", commitmentDigestRule, bidderRule, providerRule) if err != nil { return nil, err } - return &BidderregistryFundsRewardedIterator{contract: _Bidderregistry.contract, event: "FundsRewarded", logs: logs, sub: sub}, nil + return &BidderregistryFundsUnlockedIterator{contract: _Bidderregistry.contract, event: "FundsUnlocked", logs: logs, sub: sub}, nil } -// WatchFundsRewarded is a free log subscription operation binding the contract event 0xd26f9e20ff994b4298fe22216ee15de6c9b7a46164d7a5509f2c4d065d8b408a. +// WatchFundsUnlocked is a free log subscription operation binding the contract event 0x6e1c6ca1bf1040edd35af10bd76f7d1a379f91f28a726a00239e833db2abf363. // -// Solidity: event FundsRewarded(bytes32 indexed commitmentDigest, address indexed bidder, address indexed provider, uint256 window, uint256 amount) -func (_Bidderregistry *BidderregistryFilterer) WatchFundsRewarded(opts *bind.WatchOpts, sink chan<- *BidderregistryFundsRewarded, commitmentDigest [][32]byte, bidder []common.Address, provider []common.Address) (event.Subscription, error) { +// Solidity: event FundsUnlocked(bytes32 indexed commitmentDigest, address indexed bidder, address indexed provider, uint256 amount) +func (_Bidderregistry *BidderregistryFilterer) WatchFundsUnlocked(opts *bind.WatchOpts, sink chan<- *BidderregistryFundsUnlocked, commitmentDigest [][32]byte, bidder []common.Address, provider []common.Address) (event.Subscription, error) { var commitmentDigestRule []interface{} for _, commitmentDigestItem := range commitmentDigest { @@ -2479,7 +2509,7 @@ func (_Bidderregistry *BidderregistryFilterer) WatchFundsRewarded(opts *bind.Wat providerRule = append(providerRule, providerItem) } - logs, sub, err := _Bidderregistry.contract.WatchLogs(opts, "FundsRewarded", commitmentDigestRule, bidderRule, providerRule) + logs, sub, err := _Bidderregistry.contract.WatchLogs(opts, "FundsUnlocked", commitmentDigestRule, bidderRule, providerRule) if err != nil { return nil, err } @@ -2489,8 +2519,8 @@ func (_Bidderregistry *BidderregistryFilterer) WatchFundsRewarded(opts *bind.Wat select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(BidderregistryFundsRewarded) - if err := _Bidderregistry.contract.UnpackLog(event, "FundsRewarded", log); err != nil { + event := new(BidderregistryFundsUnlocked) + if err := _Bidderregistry.contract.UnpackLog(event, "FundsUnlocked", log); err != nil { return err } event.Raw = log @@ -2511,12 +2541,12 @@ func (_Bidderregistry *BidderregistryFilterer) WatchFundsRewarded(opts *bind.Wat }), nil } -// ParseFundsRewarded is a log parse operation binding the contract event 0xd26f9e20ff994b4298fe22216ee15de6c9b7a46164d7a5509f2c4d065d8b408a. +// ParseFundsUnlocked is a log parse operation binding the contract event 0x6e1c6ca1bf1040edd35af10bd76f7d1a379f91f28a726a00239e833db2abf363. // -// Solidity: event FundsRewarded(bytes32 indexed commitmentDigest, address indexed bidder, address indexed provider, uint256 window, uint256 amount) -func (_Bidderregistry *BidderregistryFilterer) ParseFundsRewarded(log types.Log) (*BidderregistryFundsRewarded, error) { - event := new(BidderregistryFundsRewarded) - if err := _Bidderregistry.contract.UnpackLog(event, "FundsRewarded", log); err != nil { +// Solidity: event FundsUnlocked(bytes32 indexed commitmentDigest, address indexed bidder, address indexed provider, uint256 amount) +func (_Bidderregistry *BidderregistryFilterer) ParseFundsUnlocked(log types.Log) (*BidderregistryFundsUnlocked, error) { + event := new(BidderregistryFundsUnlocked) + if err := _Bidderregistry.contract.UnpackLog(event, "FundsUnlocked", log); err != nil { return nil, err } event.Raw = log @@ -3797,3 +3827,165 @@ func (_Bidderregistry *BidderregistryFilterer) ParseUpgraded(log types.Log) (*Bi event.Raw = log return event, nil } + +// BidderregistryWithdrawalRequestedIterator is returned from FilterWithdrawalRequested and is used to iterate over the raw logs and unpacked data for WithdrawalRequested events raised by the Bidderregistry contract. +type BidderregistryWithdrawalRequestedIterator struct { + Event *BidderregistryWithdrawalRequested // 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 *BidderregistryWithdrawalRequestedIterator) 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(BidderregistryWithdrawalRequested) + 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(BidderregistryWithdrawalRequested) + 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 *BidderregistryWithdrawalRequestedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *BidderregistryWithdrawalRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// BidderregistryWithdrawalRequested represents a WithdrawalRequested event raised by the Bidderregistry contract. +type BidderregistryWithdrawalRequested struct { + Bidder common.Address + Provider common.Address + Timestamp *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterWithdrawalRequested is a free log retrieval operation binding the contract event 0x04c56a409d50971e45c5a2d96e5d557d2b0f1d66d40f14b141e4c958b0f39b32. +// +// Solidity: event WithdrawalRequested(address indexed bidder, address indexed provider, uint256 indexed timestamp) +func (_Bidderregistry *BidderregistryFilterer) FilterWithdrawalRequested(opts *bind.FilterOpts, bidder []common.Address, provider []common.Address, timestamp []*big.Int) (*BidderregistryWithdrawalRequestedIterator, error) { + + var bidderRule []interface{} + for _, bidderItem := range bidder { + bidderRule = append(bidderRule, bidderItem) + } + var providerRule []interface{} + for _, providerItem := range provider { + providerRule = append(providerRule, providerItem) + } + var timestampRule []interface{} + for _, timestampItem := range timestamp { + timestampRule = append(timestampRule, timestampItem) + } + + logs, sub, err := _Bidderregistry.contract.FilterLogs(opts, "WithdrawalRequested", bidderRule, providerRule, timestampRule) + if err != nil { + return nil, err + } + return &BidderregistryWithdrawalRequestedIterator{contract: _Bidderregistry.contract, event: "WithdrawalRequested", logs: logs, sub: sub}, nil +} + +// WatchWithdrawalRequested is a free log subscription operation binding the contract event 0x04c56a409d50971e45c5a2d96e5d557d2b0f1d66d40f14b141e4c958b0f39b32. +// +// Solidity: event WithdrawalRequested(address indexed bidder, address indexed provider, uint256 indexed timestamp) +func (_Bidderregistry *BidderregistryFilterer) WatchWithdrawalRequested(opts *bind.WatchOpts, sink chan<- *BidderregistryWithdrawalRequested, bidder []common.Address, provider []common.Address, timestamp []*big.Int) (event.Subscription, error) { + + var bidderRule []interface{} + for _, bidderItem := range bidder { + bidderRule = append(bidderRule, bidderItem) + } + var providerRule []interface{} + for _, providerItem := range provider { + providerRule = append(providerRule, providerItem) + } + var timestampRule []interface{} + for _, timestampItem := range timestamp { + timestampRule = append(timestampRule, timestampItem) + } + + logs, sub, err := _Bidderregistry.contract.WatchLogs(opts, "WithdrawalRequested", bidderRule, providerRule, timestampRule) + 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(BidderregistryWithdrawalRequested) + if err := _Bidderregistry.contract.UnpackLog(event, "WithdrawalRequested", 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 +} + +// ParseWithdrawalRequested is a log parse operation binding the contract event 0x04c56a409d50971e45c5a2d96e5d557d2b0f1d66d40f14b141e4c958b0f39b32. +// +// Solidity: event WithdrawalRequested(address indexed bidder, address indexed provider, uint256 indexed timestamp) +func (_Bidderregistry *BidderregistryFilterer) ParseWithdrawalRequested(log types.Log) (*BidderregistryWithdrawalRequested, error) { + event := new(BidderregistryWithdrawalRequested) + if err := _Bidderregistry.contract.UnpackLog(event, "WithdrawalRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} From 3ae09f33c289ab34da948fe8f631deb8f8ffc675 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 30 Jul 2025 13:24:38 -0700 Subject: [PATCH 007/117] fix bidder reg + tests --- contracts/contracts/core/BidderRegistry.sol | 18 ++-- contracts/test/core/BidderRegistryTest.sol | 100 ++++++++++---------- 2 files changed, 54 insertions(+), 64 deletions(-) diff --git a/contracts/contracts/core/BidderRegistry.sol b/contracts/contracts/core/BidderRegistry.sol index d8c3bccf4..8ffc8b3af 100644 --- a/contracts/contracts/core/BidderRegistry.sol +++ b/contracts/contracts/core/BidderRegistry.sol @@ -84,7 +84,7 @@ contract BidderRegistry is */ function depositAsBidder(address provider) external payable whenNotPaused { require(msg.value != 0, DepositAmountIsZero()); - _depositForProvider(provider, msg.value); + _depositAsBidder(provider, msg.value); } /** @@ -104,7 +104,7 @@ contract BidderRegistry is if (i == len - 1) { amount += remainingAmount; // Add the remainder to the last provider } - _depositForProvider(provider, amount); + _depositAsBidder(provider, amount); } } @@ -256,18 +256,12 @@ contract BidderRegistry is } Deposit storage deposit = deposits[bidder][provider]; - deposit.escrowedAmount += bidAmt; - // Calculate the available amount for this block - uint256 availableAmount = deposit.availableAmount > bidAmt - ? deposit.availableAmount - bidAmt - : 0; - - // Check if bid exceeds the available amount for the block - if (availableAmount < bidAmt) { + // Check if bid exceeds the available amount w.r.t bidder->provider deposit + if (deposit.availableAmount < bidAmt) { // This operation shouldn't happen in normal flow. See provider node's CheckAndDeductDeposit function // which checks if a bidder's deposit for the block covers the bid amount. - bidAmt = availableAmount; + bidAmt = deposit.availableAmount; } if (bidAmt > 0) { @@ -362,7 +356,7 @@ contract BidderRegistry is _unpause(); } - function _depositForProvider(address provider, uint256 amount) internal { + function _depositAsBidder(address provider, uint256 amount) internal { address bidder = msg.sender; Deposit storage deposit = deposits[bidder][provider]; if (deposit.exists) { diff --git a/contracts/test/core/BidderRegistryTest.sol b/contracts/test/core/BidderRegistryTest.sol index e8a145d0b..2ec502b22 100644 --- a/contracts/test/core/BidderRegistryTest.sol +++ b/contracts/test/core/BidderRegistryTest.sol @@ -240,9 +240,15 @@ contract BidderRegistryTest is Test { uint256 bidderBalance = bidder.balance; + assertEq(bidderRegistry.getDeposit(bidder, provider), 64 ether); + assertEq(bidderRegistry.getEscrowedAmount(bidder, provider), 0); + bidderRegistry.openBid(commitmentDigest, 1 ether, bidder, provider); - bidderRegistry.unlockFunds(bidder, commitmentDigest); + assertEq(bidderRegistry.getDeposit(bidder, provider), 63 ether); + assertEq(bidderRegistry.getEscrowedAmount(bidder, provider), 1 ether); + + bidderRegistry.unlockFunds(provider, commitmentDigest); uint256 providerAmount = bidderRegistry.providerAmount(provider); uint256 feeRecipientAmount = bidderRegistry.getAccumulatedProtocolFee(); @@ -301,20 +307,16 @@ contract BidderRegistryTest is Test { address provider3 = vm.addr(4); uint256 depositAmount = 3 ether; - vm.startPrank(bidder); - vm.expectEmit(true, false, false, true); - emit BidderDeposited(bidder, provider1, depositAmount / 3); - vm.expectEmit(true, false, false, true); - emit BidderDeposited(bidder, provider2, depositAmount / 3); - vm.expectEmit(true, false, false, true); - emit BidderDeposited(bidder, provider3, depositAmount / 3); - address[] memory providers = new address[](3); providers[0] = provider1; providers[1] = provider2; providers[2] = provider3; + vm.startPrank(bidder); for (uint256 i = 0; i < 3; ++i) { + + vm.expectEmit(true, false, false, true); + emit BidderDeposited(bidder, providers[i], depositAmount / 3); bidderRegistry.depositAsBidder{value: depositAmount / 3}(providers[i]); uint256 lockedFunds = bidderRegistry.getDeposit(bidder, providers[i]); @@ -337,14 +339,9 @@ contract BidderRegistryTest is Test { providers[2] = provider3; vm.startPrank(bidder); - vm.expectEmit(true, false, false, true); - emit BidderDeposited(bidder, provider1, depositAmount / 3); - vm.expectEmit(true, false, false, true); - emit BidderDeposited(bidder, provider2, depositAmount / 3); - vm.expectEmit(true, false, false, true); - emit BidderDeposited(bidder, provider3, depositAmount / 3); - for (uint16 i = 0; i < 3; ++i) { + vm.expectEmit(true, false, false, true); + emit BidderDeposited(bidder, providers[i], depositAmount / 3); bidderRegistry.depositAsBidder{value: depositAmount / 3}(providers[i]); uint256 lockedFunds = bidderRegistry.getDeposit(bidder, providers[i]); @@ -366,6 +363,8 @@ contract BidderRegistryTest is Test { vm.prank(bidder); bidderRegistry.requestWithdrawalsAsBidder(providers); + vm.warp(block.timestamp + bidderRegistry.bidderWithdrawalPeriodMs() + 1); + vm.expectEmit(true, false, false, true); emit BidderWithdrawal(bidder, provider1, 1 ether, 0); vm.expectEmit(true, false, false, true); @@ -384,38 +383,33 @@ contract BidderRegistryTest is Test { } } - // TODO: Need to re-review this one.. function test_OpenBid_TransferExcessBid() public { bytes32 commitmentDigest = keccak256("commitment"); uint256 bidAmt = 5 ether; address testBidder = vm.addr(2); - // Deal some ETH to the test bidder vm.deal(testBidder, 10 ether); - // Simulate the pre-confirmations contract bidderRegistry.setPreconfManager(address(this)); address provider = vm.addr(4); vm.prank(testBidder); bidderRegistry.depositAsBidder{value: 4 ether}(provider); - // Ensure the used amount is less than the max uint256 maxBidAmt = bidderRegistry.getDeposit(testBidder, provider); uint256 usedAmount = bidderRegistry.getEscrowedAmount(testBidder, provider); uint256 availableAmount = maxBidAmt > usedAmount ? maxBidAmt - usedAmount : 0; - - // Open a bid that exceeds the available amount + + assertEq(availableAmount, 4 ether); + + // open a bid that exceeds the available amount + assertEq(bidAmt, 5 ether); vm.prank(address(this)); bidderRegistry.openBid(commitmentDigest, bidAmt, testBidder, provider); - // Verify that the excess bid was transferred back to the test bidder - uint256 expectedBidAmt = availableAmount; - - // Verify the bid state (address storedBidder, uint256 storedBidAmt, IBidderRegistry.State storedState) = bidderRegistry.bidPayment(commitmentDigest); assertEq(storedBidder, testBidder); - assertEq(storedBidAmt, expectedBidAmt); + assertEq(storedBidAmt, 4 ether); assertEq(uint(storedState), uint(IBidderRegistry.State.PreConfirmed)); } @@ -444,7 +438,6 @@ contract BidderRegistryTest is Test { assertEq(bidderRegistry.getAccumulatedProtocolFee(), 0); } - // TODO: Need to re-review this one.. function test_ProtocolFeeAccumulation() public { bidderRegistry.setPreconfManager(address(this)); address provider = vm.addr(4); @@ -462,83 +455,86 @@ contract BidderRegistryTest is Test { assertEq(bidderRegistry.getAccumulatedProtocolFee(), 100000000000000000); } - // TODO: Need to re-review this one.. + // Regression test for https://cantina.xyz/code/4ee8716d-3e0e-4f59-b90d-aa56bf3b484c/findings/8 function test_OpenBidWithExcessExploit() public { address aliceBidder = vm.addr(7); - address bodBidder = vm.addr(8); + address bobBidder = vm.addr(8); uint64 blockNumber = uint64(WindowFromBlockNumber.BLOCKS_PER_WINDOW + 1); - //1) Deal some ETH to the Alice and Bob vm.deal(aliceBidder, 10 ether); - vm.deal(bodBidder, 10 ether); + vm.deal(bobBidder, 10 ether); - //2) Simulate the pre-confirmations contract bidderRegistry.setPreconfManager(address(this)); - //3) Deposit some funds address provider = vm.addr(4); vm.prank(aliceBidder); bidderRegistry.depositAsBidder{value: 2 ether}(provider); - vm.prank(bodBidder); + vm.prank(bobBidder); bidderRegistry.depositAsBidder{value: 2 ether}(provider); - // Capture balances before the exploit uint256 aliceBalanceBefore = aliceBidder.balance; - uint256 bobBalanceBefore = bodBidder.balance; + uint256 bobBalanceBefore = bobBidder.balance; uint256 registryBalanceBefore = address(bidderRegistry).balance; - // Expected balances before the exploit assertEq(aliceBalanceBefore, 8 ether, "Alice balance BEFORE"); assertEq(bobBalanceBefore, 8 ether, "Bob balance BEFORE"); assertEq(registryBalanceBefore, 4 ether, "BidderRegistry balance BEFORE"); + assertEq(bidderRegistry.getDeposit(aliceBidder, provider), 2 ether); + assertEq(bidderRegistry.getDeposit(bobBidder, provider), 2 ether); + assertEq(bidderRegistry.getEscrowedAmount(aliceBidder, provider), 0); + assertEq(bidderRegistry.getEscrowedAmount(bobBidder, provider), 0); + uint256 maxBid = bidderRegistry.getDeposit(aliceBidder, provider); - //4) Alice open bids at maxBid multiple times vm.startPrank(address(this)); - // First bid works fine. maxBid is depleted from lockedFunds bidderRegistry.openBid( keccak256("commitment1"), maxBid, aliceBidder, provider ); - // Second bid start the stealing show. maxBid is being refunded (by the excess logic) and lockedFunds is NOT depleted. - // This is effectively stealing from poor Bob. + + assertEq(bidderRegistry.getDeposit(aliceBidder, provider), 0); + assertEq(bidderRegistry.getEscrowedAmount(aliceBidder, provider), 2 ether); + assertEq(bidderRegistry.getDeposit(bobBidder, provider), 2 ether); + assertEq(bidderRegistry.getEscrowedAmount(bobBidder, provider), 0); + bidderRegistry.openBid( keccak256("commitment2"), maxBid, aliceBidder, provider ); - // Thrid bid continue the stealing show, exactly behaving as the second bid. bidderRegistry.openBid( keccak256("commitment3"), maxBid, aliceBidder, provider ); - - // And Alice could do this until she fully drain the bidderRegistry contract, effectively stealing from all the bidders. vm.stopPrank(); - //5) Alice withdraw her locked funds (which will be intact minus maxBid as being spent in the first bid) blockNumber = uint64(WindowFromBlockNumber.BLOCKS_PER_WINDOW * 2 + 1); blockTracker.recordL1Block(blockNumber, "test"); - address[] memory providers = new address[](1); providers[0] = provider; vm.prank(aliceBidder); + bidderRegistry.requestWithdrawalsAsBidder(providers); + vm.warp(block.timestamp + bidderRegistry.bidderWithdrawalPeriodMs()+1); + vm.prank(aliceBidder); bidderRegistry.withdrawAsBidder(providers); - // Capture balances after the exploit uint256 aliceBalanceAfter = aliceBidder.balance; - uint256 bobBalanceAfter = bodBidder.balance; + uint256 bobBalanceAfter = bobBidder.balance; uint256 registryBalanceAfter = address(bidderRegistry).balance; - // Expected balances after the exploit - assertEq(aliceBalanceAfter, 9.8 ether, "Alice balance AFTER"); + assertEq(aliceBalanceAfter, 8 ether, "Alice balance AFTER"); assertEq(bobBalanceAfter, 8 ether, "Bob balance AFTER"); - assertEq(registryBalanceAfter, 2.2 ether, "BidderRegistry balance AFTER"); + assertEq(registryBalanceAfter, 4 ether, "BidderRegistry balance AFTER"); + + assertEq(bidderRegistry.getDeposit(aliceBidder, provider), 0); + assertEq(bidderRegistry.getEscrowedAmount(aliceBidder, provider), 2 ether); + assertEq(bidderRegistry.getDeposit(bobBidder, provider), 2 ether); + assertEq(bidderRegistry.getEscrowedAmount(bobBidder, provider), 0 ether); } function test_RevertWhen_DepositAsBidder_ZeroAmount() public { From 97397273940cb390c24a4cab1c06335c00336ae5 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 30 Jul 2025 13:59:30 -0700 Subject: [PATCH 008/117] fix bidder registry + tests more --- contracts/contracts/core/BidderRegistry.sol | 2 +- contracts/test/core/PreconfManagerTest.sol | 26 +++++++++------------ 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/contracts/contracts/core/BidderRegistry.sol b/contracts/contracts/core/BidderRegistry.sol index 8ffc8b3af..b48da2207 100644 --- a/contracts/contracts/core/BidderRegistry.sol +++ b/contracts/contracts/core/BidderRegistry.sol @@ -195,7 +195,7 @@ contract BidderRegistry is } Deposit storage deposit = deposits[bidState.bidder][provider]; - deposit.escrowedAmount -= decayedAmt; + deposit.escrowedAmount -= bidState.bidAmt; bidState.state = State.Withdrawn; bidState.bidAmt = 0; diff --git a/contracts/test/core/PreconfManagerTest.sol b/contracts/test/core/PreconfManagerTest.sol index 0df417369..cfd5bc8ca 100644 --- a/contracts/test/core/PreconfManagerTest.sol +++ b/contracts/test/core/PreconfManagerTest.sol @@ -417,13 +417,13 @@ contract PreconfManagerTest is Test { } function test_StoreCommitment() public { + (address committer, ) = makeAddrAndKey("bob"); (address bidder, ) = makeAddrAndKey("alice"); vm.deal(bidder, 5 ether); vm.prank(bidder); - bidderRegistry.depositAsBidder{value: 2 ether}(provider); + bidderRegistry.depositAsBidder{value: 2 ether}(committer); verifyCommitmentNotUsed(_testCommitmentAliceBob); - (address committer, ) = makeAddrAndKey("bob"); // Step 2: Store the commitment bytes32 unopenedIndex = storeCommitment( @@ -654,9 +654,6 @@ contract PreconfManagerTest is Test { function test_GetCommitment() public { (address bidder, ) = makeAddrAndKey("alice"); vm.deal(bidder, 5 ether); - uint256 window = WindowFromBlockNumber.getWindowFromBlockNumber( - _testCommitmentAliceBob.blockNumber - ); vm.prank(bidder); bidderRegistry.depositAsBidder{value: 2 ether}(provider); // Step 1: Verify that the commitment has not been used before @@ -695,10 +692,11 @@ contract PreconfManagerTest is Test { function test_InitiateSlash() public { // Assuming you have a stored commitment { + (address committer, ) = makeAddrAndKey("bob"); (address bidder, ) = makeAddrAndKey("alice"); vm.deal(bidder, 5 ether); vm.prank(bidder); - bidderRegistry.depositAsBidder{value: 2 ether}(provider); + bidderRegistry.depositAsBidder{value: 2 ether}(committer); // Step 1: Verify that the commitment has not been used before bytes32 bidHash = verifyCommitmentNotUsed(_testCommitmentAliceBob); @@ -713,7 +711,6 @@ contract PreconfManagerTest is Test { (, bool isSettled, , , , , , , , , , , ) = preconfManager .openedCommitments(preConfHash); assert(isSettled == false); - (address committer, ) = makeAddrAndKey("bob"); bytes32 unopenedIndex = storeCommitment( committer, @@ -757,7 +754,7 @@ contract PreconfManagerTest is Test { assert(isSettled == true); assertEq( - bidderRegistry.getDeposit(bidder, provider), + bidderRegistry.getDeposit(bidder, committer), 2 ether - _testCommitmentAliceBob.bidAmt ); assertEq(bidderRegistry.providerAmount(committer), 0 ether); @@ -772,10 +769,11 @@ contract PreconfManagerTest is Test { function test_InitiateReward() public { // Assuming you have a stored commitment { + (address committer, ) = makeAddrAndKey("bob"); (address bidder, ) = makeAddrAndKey("alice"); vm.deal(bidder, 5 ether); vm.prank(bidder); - bidderRegistry.depositAsBidder{value: 2 ether}(provider); + bidderRegistry.depositAsBidder{value: 2 ether}(committer); // Step 1: Verify that the commitment has not been used before bytes32 bidHash = verifyCommitmentNotUsed(_testCommitmentAliceBob); @@ -789,7 +787,6 @@ contract PreconfManagerTest is Test { (, bool isSettled, , , , , , , , , , , ) = preconfManager .openedCommitments(preConfHash); assert(isSettled == false); - (address committer, ) = makeAddrAndKey("bob"); bytes32 unopenedIndex = storeCommitment( committer, @@ -832,7 +829,7 @@ contract PreconfManagerTest is Test { assert(isSettled == true); // commitmentDigest value is internal to contract and not asserted assertEq( - bidderRegistry.getDeposit(bidder, provider), + bidderRegistry.getDeposit(bidder, committer), 2 ether - _testCommitmentAliceBob.bidAmt ); } @@ -841,10 +838,11 @@ contract PreconfManagerTest is Test { function test_InitiateRewardFullyDecayed() public { // Assuming you have a stored commitment { + (address committer, ) = makeAddrAndKey("bob"); (address bidder, ) = makeAddrAndKey("alice"); vm.deal(bidder, 5 ether); vm.prank(bidder); - bidderRegistry.depositAsBidder{value: 2 ether}(provider); + bidderRegistry.depositAsBidder{value: 2 ether}(committer); // Step 1: Verify that the commitment has not been used before bytes32 bidHash = verifyCommitmentNotUsed(_testCommitmentAliceBob); @@ -858,7 +856,6 @@ contract PreconfManagerTest is Test { (, bool isSettled, , , , , , , , , , , ) = preconfManager .openedCommitments(preConfHash); assert(isSettled == false); - (address committer, ) = makeAddrAndKey("bob"); bytes32 unopenedIndex = storeCommitment( committer, @@ -892,7 +889,6 @@ contract PreconfManagerTest is Test { _testCommitmentAliceBob.slashAmt, _testCommitmentAliceBob.zkProof ); - uint256 window = blockTracker.getCurrentWindow(); vm.prank(oracleContract); preconfManager.initiateReward(index, 0); @@ -903,7 +899,7 @@ contract PreconfManagerTest is Test { // commitmentDigest value is internal to contract and not asserted assertEq( - bidderRegistry.getDeposit(bidder, provider), + bidderRegistry.getDeposit(bidder, committer), 2 ether - _testCommitmentAliceBob.bidAmt ); assertEq(bidderRegistry.providerAmount(committer), 0 ether); From b7bba535ec7a87345efba08ed9bbd7637be6903c Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 30 Jul 2025 14:14:47 -0700 Subject: [PATCH 009/117] add TimestampOccurrence.del to withdrawAsBidder --- contracts/contracts/core/BidderRegistry.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/contracts/core/BidderRegistry.sol b/contracts/contracts/core/BidderRegistry.sol index b48da2207..e0a1d2ffd 100644 --- a/contracts/contracts/core/BidderRegistry.sol +++ b/contracts/contracts/core/BidderRegistry.sol @@ -147,6 +147,7 @@ contract BidderRegistry is uint256 availableAmount = deposit.availableAmount; deposit.availableAmount = 0; totalAmount += availableAmount; + TimestampOccurrence.del(deposit.withdrawalRequestOccurrence); emit BidderWithdrawal(msg.sender, provider, availableAmount, deposit.escrowedAmount); } From 9e7ae2f8479fa0b087e77a99b21f3919ee874a89 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 30 Jul 2025 15:11:18 -0700 Subject: [PATCH 010/117] fix: appease linter --- contracts/contracts/core/BidderRegistry.sol | 41 +++++++++++---------- contracts/contracts/core/PreconfManager.sol | 1 - 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/contracts/contracts/core/BidderRegistry.sol b/contracts/contracts/core/BidderRegistry.sol index e0a1d2ffd..5f60394a1 100644 --- a/contracts/contracts/core/BidderRegistry.sol +++ b/contracts/contracts/core/BidderRegistry.sol @@ -8,7 +8,6 @@ import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/Pau import {IBidderRegistry} from "../interfaces/IBidderRegistry.sol"; import {BidderRegistryStorage} from "./BidderRegistryStorage.sol"; import {IBlockTracker} from "../interfaces/IBlockTracker.sol"; -import {WindowFromBlockNumber} from "../utils/WindowFromBlockNumber.sol"; import {FeePayout} from "../utils/FeePayout.sol"; import {TimestampOccurrence} from "../utils/Occurrence.sol"; @@ -357,25 +356,6 @@ contract BidderRegistry is _unpause(); } - function _depositAsBidder(address provider, uint256 amount) internal { - address bidder = msg.sender; - Deposit storage deposit = deposits[bidder][provider]; - if (deposit.exists) { - require(!deposit.withdrawalRequestOccurrence.exists, WithdrawalOccurrenceExists(bidder, provider)); - deposit.availableAmount += amount; - } else { - deposits[bidder][provider] = Deposit({ - exists: true, - availableAmount: amount, - escrowedAmount: 0, - withdrawalRequestOccurrence: TimestampOccurrence.Occurrence({ - exists: false, - timestamp: 0}) - }); - } - emit BidderDeposited(bidder, provider, amount); - } - /** * @dev Get the amount of funds rewarded to a provider for fulfilling commitments * @param provider The address of the provider. @@ -411,6 +391,27 @@ contract BidderRegistry is return protocolFeeTracker.accumulatedAmount; } + function _depositAsBidder(address provider, uint256 amount) internal { + address bidder = msg.sender; + Deposit storage deposit = deposits[bidder][provider]; + if (deposit.exists) { + require(!deposit.withdrawalRequestOccurrence.exists, WithdrawalOccurrenceExists(bidder, provider)); + deposit.availableAmount += amount; + } else { + deposits[bidder][provider] = Deposit({ + exists: true, + availableAmount: amount, + escrowedAmount: 0, + withdrawalRequestOccurrence: TimestampOccurrence.Occurrence({ + exists: false, + timestamp: 0}) + }); + } + emit BidderDeposited(bidder, provider, amount); + } + + + // solhint-disable-next-line no-empty-blocks function _authorizeUpgrade(address) internal override onlyOwner {} } diff --git a/contracts/contracts/core/PreconfManager.sol b/contracts/contracts/core/PreconfManager.sol index 11173da85..4bd1f8118 100644 --- a/contracts/contracts/core/PreconfManager.sol +++ b/contracts/contracts/core/PreconfManager.sol @@ -10,7 +10,6 @@ import {IBidderRegistry} from "../interfaces/IBidderRegistry.sol"; import {IBlockTracker} from "../interfaces/IBlockTracker.sol"; import {IPreconfManager} from "../interfaces/IPreconfManager.sol"; import {PreconfManagerStorage} from "./PreconfManagerStorage.sol"; -import {WindowFromBlockNumber} from "../utils/WindowFromBlockNumber.sol"; import {Errors} from "../utils/Errors.sol"; import {BN128} from "../utils/BN128.sol"; import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; From 2b2b271e18a1a9f745d4a32bd4fe53e2a607cb43 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 30 Jul 2025 20:01:15 -0700 Subject: [PATCH 011/117] todos --- contracts/contracts/utils/WindowFromBlockNumber.sol | 2 ++ p2p/pkg/depositmanager/deposit.go | 1 + 2 files changed, 3 insertions(+) diff --git a/contracts/contracts/utils/WindowFromBlockNumber.sol b/contracts/contracts/utils/WindowFromBlockNumber.sol index f165a93f1..c03f2d17d 100644 --- a/contracts/contracts/utils/WindowFromBlockNumber.sol +++ b/contracts/contracts/utils/WindowFromBlockNumber.sol @@ -7,6 +7,8 @@ pragma solidity 0.8.26; */ library WindowFromBlockNumber { + // TODO: prob delete all this + /// @dev The number of blocks per window. uint256 public constant BLOCKS_PER_WINDOW = 10; diff --git a/p2p/pkg/depositmanager/deposit.go b/p2p/pkg/depositmanager/deposit.go index aadf03a8b..45445c145 100644 --- a/p2p/pkg/depositmanager/deposit.go +++ b/p2p/pkg/depositmanager/deposit.go @@ -150,6 +150,7 @@ func (dm *DepositManager) Start(ctx context.Context) <-chan struct{} { return doneChan } +// TODO: Add check in provider node to see if bidder has requested a withdrawal. func (dm *DepositManager) CheckAndDeductDeposit( ctx context.Context, address common.Address, From 0f738baab0eb9914200e4ca0aea9284d27b1ea77 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 30 Jul 2025 21:15:05 -0700 Subject: [PATCH 012/117] feat: create DepositManager and associated integration --- contracts-abi/abi/BidderRegistry.abi | 26 + contracts-abi/abi/DepositManager.abi | 211 +++ .../clients/BidderRegistry/BidderRegistry.go | 64 +- .../clients/DepositManager/DepositManager.go | 1196 +++++++++++++++++ contracts-abi/script.sh | 4 + contracts/contracts/core/BidderRegistry.sol | 8 + .../contracts/core/BidderRegistryStorage.sol | 6 + contracts/contracts/core/DepositManager.sol | 70 + 8 files changed, 1584 insertions(+), 1 deletion(-) create mode 100644 contracts-abi/abi/DepositManager.abi create mode 100644 contracts-abi/clients/DepositManager/DepositManager.go create mode 100644 contracts/contracts/core/DepositManager.sol diff --git a/contracts-abi/abi/BidderRegistry.abi b/contracts-abi/abi/BidderRegistry.abi index 4c7362b9d..660e4352e 100644 --- a/contracts-abi/abi/BidderRegistry.abi +++ b/contracts-abi/abi/BidderRegistry.abi @@ -162,6 +162,32 @@ "outputs": [], "stateMutability": "payable" }, + { + "type": "function", + "name": "depositManagerHash", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "depositManagerImpl", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, { "type": "function", "name": "deposits", diff --git a/contracts-abi/abi/DepositManager.abi b/contracts-abi/abi/DepositManager.abi new file mode 100644 index 000000000..bb9b0d6f9 --- /dev/null +++ b/contracts-abi/abi/DepositManager.abi @@ -0,0 +1,211 @@ +[ + { + "type": "constructor", + "inputs": [ + { + "name": "_registry", + "type": "address", + "internalType": "address" + }, + { + "name": "_minBalance", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "receive", + "stateMutability": "payable" + }, + { + "type": "function", + "name": "bidderRegistry", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "minBalance", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "setTargetDeposit", + "inputs": [ + { + "name": "provider", + "type": "address", + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "targetDeposits", + "inputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "topUpDeposit", + "inputs": [ + { + "name": "provider", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "CurrentDepositIsSufficient", + "inputs": [ + { + "name": "provider", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "DepositToppedUp", + "inputs": [ + { + "name": "provider", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "NotEnoughEOABalance", + "inputs": [ + { + "name": "balance", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "minBalance", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "TargetDepositDoesNotExist", + "inputs": [ + { + "name": "provider", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "TargetDepositSet", + "inputs": [ + { + "name": "provider", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "TopUpReduced", + "inputs": [ + { + "name": "provider", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "needed", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "available", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "NotThisEOA", + "inputs": [] + } +] diff --git a/contracts-abi/clients/BidderRegistry/BidderRegistry.go b/contracts-abi/clients/BidderRegistry/BidderRegistry.go index 591264260..a5f95a07c 100644 --- a/contracts-abi/clients/BidderRegistry/BidderRegistry.go +++ b/contracts-abi/clients/BidderRegistry/BidderRegistry.go @@ -37,7 +37,7 @@ type TimestampOccurrenceOccurrence struct { // BidderregistryMetaData contains all meta data concerning the Bidderregistry contract. var BidderregistryMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"ONE_HUNDRED_PERCENT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PRECISION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"bidPayment\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"bidAmt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"state\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bidderWithdrawalPeriodMs\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"blockTrackerContract\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBlockTracker\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"convertFundsToProviderReward\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"addresspayable\"},{\"name\":\"residualBidPercentAfterDecay\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositAsBidder\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"depositEvenlyAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"deposits\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"availableAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"escrowedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalRequestOccurrence\",\"type\":\"tuple\",\"internalType\":\"structTimestampOccurrence.Occurrence\",\"components\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"feePercent\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAccumulatedProtocolFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDeposit\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEscrowedAmount\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProviderAmount\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_protocolFeeRecipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_feePercent\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_blockTracker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_feePayoutPeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_bidderWithdrawalPeriodMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"manuallyWithdrawProtocolFee\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"openBid\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"bidAmt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"preconfManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"protocolFeeTracker\",\"inputs\":[],\"outputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"accumulatedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"lastPayoutTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"payoutTimePeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"providerAmount\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"requestWithdrawalsAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setBlockTrackerContract\",\"inputs\":[{\"name\":\"newBlockTrackerContract\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewFeePayoutPeriod\",\"inputs\":[{\"name\":\"newFeePayoutPeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewFeePercent\",\"inputs\":[{\"name\":\"newFeePercent\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewProtocolFeeRecipient\",\"inputs\":[{\"name\":\"newProtocolFeeRecipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPreconfManager\",\"inputs\":[{\"name\":\"contractAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unlockFunds\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"withdrawAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawProviderAmount\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BidderDeposited\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"depositedAmount\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BidderWithdrawal\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amountWithdrawn\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"amountEscrowed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockTrackerUpdated\",\"inputs\":[{\"name\":\"newBlockTracker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeePayoutPeriodUpdated\",\"inputs\":[{\"name\":\"newFeePayoutPeriod\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeePercentUpdated\",\"inputs\":[{\"name\":\"newFeePercent\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeTransfer\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FundsRewarded\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FundsUnlocked\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"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\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PreconfManagerUpdated\",\"inputs\":[{\"name\":\"newPreconfManager\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProtocolFeeRecipientUpdated\",\"inputs\":[{\"name\":\"newProtocolFeeRecipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransferToBidderFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalRequested\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"BidNotPreConfirmed\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"actualState\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"},{\"name\":\"expectedState\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"}]},{\"type\":\"error\",\"name\":\"BidderWithdrawalTransferFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"DepositAmountIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DepositDoesNotExist\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpectedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FeeRecipientIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyBidderCanWithdraw\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"PayoutPeriodMustBePositive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ProviderAmountIsZero\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SenderIsNotPreconfManager\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"preconfManager\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TransferToProviderFailed\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"TransferToRecipientFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"WithdrawalOccurrenceDoesNotExist\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"WithdrawalOccurrenceExists\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"WithdrawalPeriodNotElapsed\",\"inputs\":[{\"name\":\"currentTimestampMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalTimestampMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalPeriodMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"ONE_HUNDRED_PERCENT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PRECISION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"bidPayment\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"bidAmt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"state\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bidderWithdrawalPeriodMs\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"blockTrackerContract\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBlockTracker\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"convertFundsToProviderReward\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"addresspayable\"},{\"name\":\"residualBidPercentAfterDecay\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositAsBidder\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"depositEvenlyAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"depositManagerHash\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositManagerImpl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deposits\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"availableAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"escrowedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalRequestOccurrence\",\"type\":\"tuple\",\"internalType\":\"structTimestampOccurrence.Occurrence\",\"components\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"feePercent\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAccumulatedProtocolFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDeposit\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEscrowedAmount\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProviderAmount\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_protocolFeeRecipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_feePercent\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_blockTracker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_feePayoutPeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_bidderWithdrawalPeriodMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"manuallyWithdrawProtocolFee\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"openBid\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"bidAmt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"preconfManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"protocolFeeTracker\",\"inputs\":[],\"outputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"accumulatedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"lastPayoutTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"payoutTimePeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"providerAmount\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"requestWithdrawalsAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setBlockTrackerContract\",\"inputs\":[{\"name\":\"newBlockTrackerContract\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewFeePayoutPeriod\",\"inputs\":[{\"name\":\"newFeePayoutPeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewFeePercent\",\"inputs\":[{\"name\":\"newFeePercent\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewProtocolFeeRecipient\",\"inputs\":[{\"name\":\"newProtocolFeeRecipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPreconfManager\",\"inputs\":[{\"name\":\"contractAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unlockFunds\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"withdrawAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawProviderAmount\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BidderDeposited\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"depositedAmount\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BidderWithdrawal\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amountWithdrawn\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"amountEscrowed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockTrackerUpdated\",\"inputs\":[{\"name\":\"newBlockTracker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeePayoutPeriodUpdated\",\"inputs\":[{\"name\":\"newFeePayoutPeriod\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeePercentUpdated\",\"inputs\":[{\"name\":\"newFeePercent\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeTransfer\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FundsRewarded\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FundsUnlocked\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"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\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PreconfManagerUpdated\",\"inputs\":[{\"name\":\"newPreconfManager\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProtocolFeeRecipientUpdated\",\"inputs\":[{\"name\":\"newProtocolFeeRecipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransferToBidderFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalRequested\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"BidNotPreConfirmed\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"actualState\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"},{\"name\":\"expectedState\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"}]},{\"type\":\"error\",\"name\":\"BidderWithdrawalTransferFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"DepositAmountIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DepositDoesNotExist\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpectedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FeeRecipientIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyBidderCanWithdraw\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"PayoutPeriodMustBePositive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ProviderAmountIsZero\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SenderIsNotPreconfManager\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"preconfManager\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TransferToProviderFailed\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"TransferToRecipientFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"WithdrawalOccurrenceDoesNotExist\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"WithdrawalOccurrenceExists\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"WithdrawalPeriodNotElapsed\",\"inputs\":[{\"name\":\"currentTimestampMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalTimestampMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalPeriodMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]", } // BidderregistryABI is the input ABI used to generate the binding from. @@ -391,6 +391,68 @@ func (_Bidderregistry *BidderregistryCallerSession) BlockTrackerContract() (comm return _Bidderregistry.Contract.BlockTrackerContract(&_Bidderregistry.CallOpts) } +// DepositManagerHash is a free data retrieval call binding the contract method 0xb21c5195. +// +// Solidity: function depositManagerHash() view returns(bytes32) +func (_Bidderregistry *BidderregistryCaller) DepositManagerHash(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _Bidderregistry.contract.Call(opts, &out, "depositManagerHash") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// DepositManagerHash is a free data retrieval call binding the contract method 0xb21c5195. +// +// Solidity: function depositManagerHash() view returns(bytes32) +func (_Bidderregistry *BidderregistrySession) DepositManagerHash() ([32]byte, error) { + return _Bidderregistry.Contract.DepositManagerHash(&_Bidderregistry.CallOpts) +} + +// DepositManagerHash is a free data retrieval call binding the contract method 0xb21c5195. +// +// Solidity: function depositManagerHash() view returns(bytes32) +func (_Bidderregistry *BidderregistryCallerSession) DepositManagerHash() ([32]byte, error) { + return _Bidderregistry.Contract.DepositManagerHash(&_Bidderregistry.CallOpts) +} + +// DepositManagerImpl is a free data retrieval call binding the contract method 0x4da03772. +// +// Solidity: function depositManagerImpl() view returns(address) +func (_Bidderregistry *BidderregistryCaller) DepositManagerImpl(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Bidderregistry.contract.Call(opts, &out, "depositManagerImpl") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// DepositManagerImpl is a free data retrieval call binding the contract method 0x4da03772. +// +// Solidity: function depositManagerImpl() view returns(address) +func (_Bidderregistry *BidderregistrySession) DepositManagerImpl() (common.Address, error) { + return _Bidderregistry.Contract.DepositManagerImpl(&_Bidderregistry.CallOpts) +} + +// DepositManagerImpl is a free data retrieval call binding the contract method 0x4da03772. +// +// Solidity: function depositManagerImpl() view returns(address) +func (_Bidderregistry *BidderregistryCallerSession) DepositManagerImpl() (common.Address, error) { + return _Bidderregistry.Contract.DepositManagerImpl(&_Bidderregistry.CallOpts) +} + // Deposits is a free data retrieval call binding the contract method 0x8f601f66. // // Solidity: function deposits(address bidder, address provider) view returns(bool exists, uint256 availableAmount, uint256 escrowedAmount, (bool,uint256) withdrawalRequestOccurrence) diff --git a/contracts-abi/clients/DepositManager/DepositManager.go b/contracts-abi/clients/DepositManager/DepositManager.go new file mode 100644 index 000000000..48ad4a7d2 --- /dev/null +++ b/contracts-abi/clients/DepositManager/DepositManager.go @@ -0,0 +1,1196 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package depositmanager + +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 +) + +// DepositmanagerMetaData contains all meta data concerning the Depositmanager contract. +var DepositmanagerMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_registry\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_minBalance\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"bidderRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minBalance\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setTargetDeposit\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"targetDeposits\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"topUpDeposit\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"CurrentDepositIsSufficient\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DepositToppedUp\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NotEnoughEOABalance\",\"inputs\":[{\"name\":\"balance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"minBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TargetDepositDoesNotExist\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TargetDepositSet\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TopUpReduced\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"needed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"NotThisEOA\",\"inputs\":[]}]", +} + +// DepositmanagerABI is the input ABI used to generate the binding from. +// Deprecated: Use DepositmanagerMetaData.ABI instead. +var DepositmanagerABI = DepositmanagerMetaData.ABI + +// Depositmanager is an auto generated Go binding around an Ethereum contract. +type Depositmanager struct { + DepositmanagerCaller // Read-only binding to the contract + DepositmanagerTransactor // Write-only binding to the contract + DepositmanagerFilterer // Log filterer for contract events +} + +// DepositmanagerCaller is an auto generated read-only Go binding around an Ethereum contract. +type DepositmanagerCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// DepositmanagerTransactor is an auto generated write-only Go binding around an Ethereum contract. +type DepositmanagerTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// DepositmanagerFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type DepositmanagerFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// DepositmanagerSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type DepositmanagerSession struct { + Contract *Depositmanager // 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 +} + +// DepositmanagerCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type DepositmanagerCallerSession struct { + Contract *DepositmanagerCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// DepositmanagerTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type DepositmanagerTransactorSession struct { + Contract *DepositmanagerTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// DepositmanagerRaw is an auto generated low-level Go binding around an Ethereum contract. +type DepositmanagerRaw struct { + Contract *Depositmanager // Generic contract binding to access the raw methods on +} + +// DepositmanagerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type DepositmanagerCallerRaw struct { + Contract *DepositmanagerCaller // Generic read-only contract binding to access the raw methods on +} + +// DepositmanagerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type DepositmanagerTransactorRaw struct { + Contract *DepositmanagerTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewDepositmanager creates a new instance of Depositmanager, bound to a specific deployed contract. +func NewDepositmanager(address common.Address, backend bind.ContractBackend) (*Depositmanager, error) { + contract, err := bindDepositmanager(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &Depositmanager{DepositmanagerCaller: DepositmanagerCaller{contract: contract}, DepositmanagerTransactor: DepositmanagerTransactor{contract: contract}, DepositmanagerFilterer: DepositmanagerFilterer{contract: contract}}, nil +} + +// NewDepositmanagerCaller creates a new read-only instance of Depositmanager, bound to a specific deployed contract. +func NewDepositmanagerCaller(address common.Address, caller bind.ContractCaller) (*DepositmanagerCaller, error) { + contract, err := bindDepositmanager(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &DepositmanagerCaller{contract: contract}, nil +} + +// NewDepositmanagerTransactor creates a new write-only instance of Depositmanager, bound to a specific deployed contract. +func NewDepositmanagerTransactor(address common.Address, transactor bind.ContractTransactor) (*DepositmanagerTransactor, error) { + contract, err := bindDepositmanager(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &DepositmanagerTransactor{contract: contract}, nil +} + +// NewDepositmanagerFilterer creates a new log filterer instance of Depositmanager, bound to a specific deployed contract. +func NewDepositmanagerFilterer(address common.Address, filterer bind.ContractFilterer) (*DepositmanagerFilterer, error) { + contract, err := bindDepositmanager(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &DepositmanagerFilterer{contract: contract}, nil +} + +// bindDepositmanager binds a generic wrapper to an already deployed contract. +func bindDepositmanager(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := DepositmanagerMetaData.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 (_Depositmanager *DepositmanagerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Depositmanager.Contract.DepositmanagerCaller.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 (_Depositmanager *DepositmanagerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Depositmanager.Contract.DepositmanagerTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Depositmanager *DepositmanagerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Depositmanager.Contract.DepositmanagerTransactor.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 (_Depositmanager *DepositmanagerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Depositmanager.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 (_Depositmanager *DepositmanagerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Depositmanager.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Depositmanager *DepositmanagerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Depositmanager.Contract.contract.Transact(opts, method, params...) +} + +// BidderRegistry is a free data retrieval call binding the contract method 0x909e54e2. +// +// Solidity: function bidderRegistry() view returns(address) +func (_Depositmanager *DepositmanagerCaller) BidderRegistry(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Depositmanager.contract.Call(opts, &out, "bidderRegistry") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// BidderRegistry is a free data retrieval call binding the contract method 0x909e54e2. +// +// Solidity: function bidderRegistry() view returns(address) +func (_Depositmanager *DepositmanagerSession) BidderRegistry() (common.Address, error) { + return _Depositmanager.Contract.BidderRegistry(&_Depositmanager.CallOpts) +} + +// BidderRegistry is a free data retrieval call binding the contract method 0x909e54e2. +// +// Solidity: function bidderRegistry() view returns(address) +func (_Depositmanager *DepositmanagerCallerSession) BidderRegistry() (common.Address, error) { + return _Depositmanager.Contract.BidderRegistry(&_Depositmanager.CallOpts) +} + +// MinBalance is a free data retrieval call binding the contract method 0xc5bb8758. +// +// Solidity: function minBalance() view returns(uint256) +func (_Depositmanager *DepositmanagerCaller) MinBalance(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _Depositmanager.contract.Call(opts, &out, "minBalance") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// MinBalance is a free data retrieval call binding the contract method 0xc5bb8758. +// +// Solidity: function minBalance() view returns(uint256) +func (_Depositmanager *DepositmanagerSession) MinBalance() (*big.Int, error) { + return _Depositmanager.Contract.MinBalance(&_Depositmanager.CallOpts) +} + +// MinBalance is a free data retrieval call binding the contract method 0xc5bb8758. +// +// Solidity: function minBalance() view returns(uint256) +func (_Depositmanager *DepositmanagerCallerSession) MinBalance() (*big.Int, error) { + return _Depositmanager.Contract.MinBalance(&_Depositmanager.CallOpts) +} + +// TargetDeposits is a free data retrieval call binding the contract method 0x77936281. +// +// Solidity: function targetDeposits(address ) view returns(uint256) +func (_Depositmanager *DepositmanagerCaller) TargetDeposits(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error) { + var out []interface{} + err := _Depositmanager.contract.Call(opts, &out, "targetDeposits", arg0) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// TargetDeposits is a free data retrieval call binding the contract method 0x77936281. +// +// Solidity: function targetDeposits(address ) view returns(uint256) +func (_Depositmanager *DepositmanagerSession) TargetDeposits(arg0 common.Address) (*big.Int, error) { + return _Depositmanager.Contract.TargetDeposits(&_Depositmanager.CallOpts, arg0) +} + +// TargetDeposits is a free data retrieval call binding the contract method 0x77936281. +// +// Solidity: function targetDeposits(address ) view returns(uint256) +func (_Depositmanager *DepositmanagerCallerSession) TargetDeposits(arg0 common.Address) (*big.Int, error) { + return _Depositmanager.Contract.TargetDeposits(&_Depositmanager.CallOpts, arg0) +} + +// SetTargetDeposit is a paid mutator transaction binding the contract method 0x2d902b07. +// +// Solidity: function setTargetDeposit(address provider, uint256 amount) returns() +func (_Depositmanager *DepositmanagerTransactor) SetTargetDeposit(opts *bind.TransactOpts, provider common.Address, amount *big.Int) (*types.Transaction, error) { + return _Depositmanager.contract.Transact(opts, "setTargetDeposit", provider, amount) +} + +// SetTargetDeposit is a paid mutator transaction binding the contract method 0x2d902b07. +// +// Solidity: function setTargetDeposit(address provider, uint256 amount) returns() +func (_Depositmanager *DepositmanagerSession) SetTargetDeposit(provider common.Address, amount *big.Int) (*types.Transaction, error) { + return _Depositmanager.Contract.SetTargetDeposit(&_Depositmanager.TransactOpts, provider, amount) +} + +// SetTargetDeposit is a paid mutator transaction binding the contract method 0x2d902b07. +// +// Solidity: function setTargetDeposit(address provider, uint256 amount) returns() +func (_Depositmanager *DepositmanagerTransactorSession) SetTargetDeposit(provider common.Address, amount *big.Int) (*types.Transaction, error) { + return _Depositmanager.Contract.SetTargetDeposit(&_Depositmanager.TransactOpts, provider, amount) +} + +// TopUpDeposit is a paid mutator transaction binding the contract method 0xbe8c9cc0. +// +// Solidity: function topUpDeposit(address provider) returns() +func (_Depositmanager *DepositmanagerTransactor) TopUpDeposit(opts *bind.TransactOpts, provider common.Address) (*types.Transaction, error) { + return _Depositmanager.contract.Transact(opts, "topUpDeposit", provider) +} + +// TopUpDeposit is a paid mutator transaction binding the contract method 0xbe8c9cc0. +// +// Solidity: function topUpDeposit(address provider) returns() +func (_Depositmanager *DepositmanagerSession) TopUpDeposit(provider common.Address) (*types.Transaction, error) { + return _Depositmanager.Contract.TopUpDeposit(&_Depositmanager.TransactOpts, provider) +} + +// TopUpDeposit is a paid mutator transaction binding the contract method 0xbe8c9cc0. +// +// Solidity: function topUpDeposit(address provider) returns() +func (_Depositmanager *DepositmanagerTransactorSession) TopUpDeposit(provider common.Address) (*types.Transaction, error) { + return _Depositmanager.Contract.TopUpDeposit(&_Depositmanager.TransactOpts, provider) +} + +// Receive is a paid mutator transaction binding the contract receive function. +// +// Solidity: receive() payable returns() +func (_Depositmanager *DepositmanagerTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Depositmanager.contract.RawTransact(opts, nil) // calldata is disallowed for receive function +} + +// Receive is a paid mutator transaction binding the contract receive function. +// +// Solidity: receive() payable returns() +func (_Depositmanager *DepositmanagerSession) Receive() (*types.Transaction, error) { + return _Depositmanager.Contract.Receive(&_Depositmanager.TransactOpts) +} + +// Receive is a paid mutator transaction binding the contract receive function. +// +// Solidity: receive() payable returns() +func (_Depositmanager *DepositmanagerTransactorSession) Receive() (*types.Transaction, error) { + return _Depositmanager.Contract.Receive(&_Depositmanager.TransactOpts) +} + +// DepositmanagerCurrentDepositIsSufficientIterator is returned from FilterCurrentDepositIsSufficient and is used to iterate over the raw logs and unpacked data for CurrentDepositIsSufficient events raised by the Depositmanager contract. +type DepositmanagerCurrentDepositIsSufficientIterator struct { + Event *DepositmanagerCurrentDepositIsSufficient // 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 *DepositmanagerCurrentDepositIsSufficientIterator) 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(DepositmanagerCurrentDepositIsSufficient) + 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(DepositmanagerCurrentDepositIsSufficient) + 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 *DepositmanagerCurrentDepositIsSufficientIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DepositmanagerCurrentDepositIsSufficientIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DepositmanagerCurrentDepositIsSufficient represents a CurrentDepositIsSufficient event raised by the Depositmanager contract. +type DepositmanagerCurrentDepositIsSufficient struct { + Provider common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterCurrentDepositIsSufficient is a free log retrieval operation binding the contract event 0x0e0f63f6b1bf98e6ec4b29579e24f4cca3d903b37990dcf32aa794ea2ce41832. +// +// Solidity: event CurrentDepositIsSufficient(address indexed provider) +func (_Depositmanager *DepositmanagerFilterer) FilterCurrentDepositIsSufficient(opts *bind.FilterOpts, provider []common.Address) (*DepositmanagerCurrentDepositIsSufficientIterator, error) { + + var providerRule []interface{} + for _, providerItem := range provider { + providerRule = append(providerRule, providerItem) + } + + logs, sub, err := _Depositmanager.contract.FilterLogs(opts, "CurrentDepositIsSufficient", providerRule) + if err != nil { + return nil, err + } + return &DepositmanagerCurrentDepositIsSufficientIterator{contract: _Depositmanager.contract, event: "CurrentDepositIsSufficient", logs: logs, sub: sub}, nil +} + +// WatchCurrentDepositIsSufficient is a free log subscription operation binding the contract event 0x0e0f63f6b1bf98e6ec4b29579e24f4cca3d903b37990dcf32aa794ea2ce41832. +// +// Solidity: event CurrentDepositIsSufficient(address indexed provider) +func (_Depositmanager *DepositmanagerFilterer) WatchCurrentDepositIsSufficient(opts *bind.WatchOpts, sink chan<- *DepositmanagerCurrentDepositIsSufficient, provider []common.Address) (event.Subscription, error) { + + var providerRule []interface{} + for _, providerItem := range provider { + providerRule = append(providerRule, providerItem) + } + + logs, sub, err := _Depositmanager.contract.WatchLogs(opts, "CurrentDepositIsSufficient", providerRule) + 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(DepositmanagerCurrentDepositIsSufficient) + if err := _Depositmanager.contract.UnpackLog(event, "CurrentDepositIsSufficient", 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 +} + +// ParseCurrentDepositIsSufficient is a log parse operation binding the contract event 0x0e0f63f6b1bf98e6ec4b29579e24f4cca3d903b37990dcf32aa794ea2ce41832. +// +// Solidity: event CurrentDepositIsSufficient(address indexed provider) +func (_Depositmanager *DepositmanagerFilterer) ParseCurrentDepositIsSufficient(log types.Log) (*DepositmanagerCurrentDepositIsSufficient, error) { + event := new(DepositmanagerCurrentDepositIsSufficient) + if err := _Depositmanager.contract.UnpackLog(event, "CurrentDepositIsSufficient", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// DepositmanagerDepositToppedUpIterator is returned from FilterDepositToppedUp and is used to iterate over the raw logs and unpacked data for DepositToppedUp events raised by the Depositmanager contract. +type DepositmanagerDepositToppedUpIterator struct { + Event *DepositmanagerDepositToppedUp // 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 *DepositmanagerDepositToppedUpIterator) 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(DepositmanagerDepositToppedUp) + 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(DepositmanagerDepositToppedUp) + 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 *DepositmanagerDepositToppedUpIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DepositmanagerDepositToppedUpIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DepositmanagerDepositToppedUp represents a DepositToppedUp event raised by the Depositmanager contract. +type DepositmanagerDepositToppedUp struct { + Provider common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDepositToppedUp is a free log retrieval operation binding the contract event 0xb5f2e468403466e947cb06c78c9b37008f6ff157cbf947e7cc8c675e128222e0. +// +// Solidity: event DepositToppedUp(address indexed provider, uint256 amount) +func (_Depositmanager *DepositmanagerFilterer) FilterDepositToppedUp(opts *bind.FilterOpts, provider []common.Address) (*DepositmanagerDepositToppedUpIterator, error) { + + var providerRule []interface{} + for _, providerItem := range provider { + providerRule = append(providerRule, providerItem) + } + + logs, sub, err := _Depositmanager.contract.FilterLogs(opts, "DepositToppedUp", providerRule) + if err != nil { + return nil, err + } + return &DepositmanagerDepositToppedUpIterator{contract: _Depositmanager.contract, event: "DepositToppedUp", logs: logs, sub: sub}, nil +} + +// WatchDepositToppedUp is a free log subscription operation binding the contract event 0xb5f2e468403466e947cb06c78c9b37008f6ff157cbf947e7cc8c675e128222e0. +// +// Solidity: event DepositToppedUp(address indexed provider, uint256 amount) +func (_Depositmanager *DepositmanagerFilterer) WatchDepositToppedUp(opts *bind.WatchOpts, sink chan<- *DepositmanagerDepositToppedUp, provider []common.Address) (event.Subscription, error) { + + var providerRule []interface{} + for _, providerItem := range provider { + providerRule = append(providerRule, providerItem) + } + + logs, sub, err := _Depositmanager.contract.WatchLogs(opts, "DepositToppedUp", providerRule) + 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(DepositmanagerDepositToppedUp) + if err := _Depositmanager.contract.UnpackLog(event, "DepositToppedUp", 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 +} + +// ParseDepositToppedUp is a log parse operation binding the contract event 0xb5f2e468403466e947cb06c78c9b37008f6ff157cbf947e7cc8c675e128222e0. +// +// Solidity: event DepositToppedUp(address indexed provider, uint256 amount) +func (_Depositmanager *DepositmanagerFilterer) ParseDepositToppedUp(log types.Log) (*DepositmanagerDepositToppedUp, error) { + event := new(DepositmanagerDepositToppedUp) + if err := _Depositmanager.contract.UnpackLog(event, "DepositToppedUp", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// DepositmanagerNotEnoughEOABalanceIterator is returned from FilterNotEnoughEOABalance and is used to iterate over the raw logs and unpacked data for NotEnoughEOABalance events raised by the Depositmanager contract. +type DepositmanagerNotEnoughEOABalanceIterator struct { + Event *DepositmanagerNotEnoughEOABalance // 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 *DepositmanagerNotEnoughEOABalanceIterator) 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(DepositmanagerNotEnoughEOABalance) + 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(DepositmanagerNotEnoughEOABalance) + 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 *DepositmanagerNotEnoughEOABalanceIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DepositmanagerNotEnoughEOABalanceIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DepositmanagerNotEnoughEOABalance represents a NotEnoughEOABalance event raised by the Depositmanager contract. +type DepositmanagerNotEnoughEOABalance struct { + Balance *big.Int + MinBalance *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterNotEnoughEOABalance is a free log retrieval operation binding the contract event 0x41147fb3ac13167049741c456ee1778e9815cc1113d125adccd9a8bfe546ef61. +// +// Solidity: event NotEnoughEOABalance(uint256 balance, uint256 minBalance) +func (_Depositmanager *DepositmanagerFilterer) FilterNotEnoughEOABalance(opts *bind.FilterOpts) (*DepositmanagerNotEnoughEOABalanceIterator, error) { + + logs, sub, err := _Depositmanager.contract.FilterLogs(opts, "NotEnoughEOABalance") + if err != nil { + return nil, err + } + return &DepositmanagerNotEnoughEOABalanceIterator{contract: _Depositmanager.contract, event: "NotEnoughEOABalance", logs: logs, sub: sub}, nil +} + +// WatchNotEnoughEOABalance is a free log subscription operation binding the contract event 0x41147fb3ac13167049741c456ee1778e9815cc1113d125adccd9a8bfe546ef61. +// +// Solidity: event NotEnoughEOABalance(uint256 balance, uint256 minBalance) +func (_Depositmanager *DepositmanagerFilterer) WatchNotEnoughEOABalance(opts *bind.WatchOpts, sink chan<- *DepositmanagerNotEnoughEOABalance) (event.Subscription, error) { + + logs, sub, err := _Depositmanager.contract.WatchLogs(opts, "NotEnoughEOABalance") + 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(DepositmanagerNotEnoughEOABalance) + if err := _Depositmanager.contract.UnpackLog(event, "NotEnoughEOABalance", 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 +} + +// ParseNotEnoughEOABalance is a log parse operation binding the contract event 0x41147fb3ac13167049741c456ee1778e9815cc1113d125adccd9a8bfe546ef61. +// +// Solidity: event NotEnoughEOABalance(uint256 balance, uint256 minBalance) +func (_Depositmanager *DepositmanagerFilterer) ParseNotEnoughEOABalance(log types.Log) (*DepositmanagerNotEnoughEOABalance, error) { + event := new(DepositmanagerNotEnoughEOABalance) + if err := _Depositmanager.contract.UnpackLog(event, "NotEnoughEOABalance", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// DepositmanagerTargetDepositDoesNotExistIterator is returned from FilterTargetDepositDoesNotExist and is used to iterate over the raw logs and unpacked data for TargetDepositDoesNotExist events raised by the Depositmanager contract. +type DepositmanagerTargetDepositDoesNotExistIterator struct { + Event *DepositmanagerTargetDepositDoesNotExist // 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 *DepositmanagerTargetDepositDoesNotExistIterator) 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(DepositmanagerTargetDepositDoesNotExist) + 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(DepositmanagerTargetDepositDoesNotExist) + 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 *DepositmanagerTargetDepositDoesNotExistIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DepositmanagerTargetDepositDoesNotExistIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DepositmanagerTargetDepositDoesNotExist represents a TargetDepositDoesNotExist event raised by the Depositmanager contract. +type DepositmanagerTargetDepositDoesNotExist struct { + Provider common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterTargetDepositDoesNotExist is a free log retrieval operation binding the contract event 0xd4a180e367ae6a1e28aa646fb6a2f3f20346488ec50bd03fb5986e3a9a1f9bfe. +// +// Solidity: event TargetDepositDoesNotExist(address indexed provider) +func (_Depositmanager *DepositmanagerFilterer) FilterTargetDepositDoesNotExist(opts *bind.FilterOpts, provider []common.Address) (*DepositmanagerTargetDepositDoesNotExistIterator, error) { + + var providerRule []interface{} + for _, providerItem := range provider { + providerRule = append(providerRule, providerItem) + } + + logs, sub, err := _Depositmanager.contract.FilterLogs(opts, "TargetDepositDoesNotExist", providerRule) + if err != nil { + return nil, err + } + return &DepositmanagerTargetDepositDoesNotExistIterator{contract: _Depositmanager.contract, event: "TargetDepositDoesNotExist", logs: logs, sub: sub}, nil +} + +// WatchTargetDepositDoesNotExist is a free log subscription operation binding the contract event 0xd4a180e367ae6a1e28aa646fb6a2f3f20346488ec50bd03fb5986e3a9a1f9bfe. +// +// Solidity: event TargetDepositDoesNotExist(address indexed provider) +func (_Depositmanager *DepositmanagerFilterer) WatchTargetDepositDoesNotExist(opts *bind.WatchOpts, sink chan<- *DepositmanagerTargetDepositDoesNotExist, provider []common.Address) (event.Subscription, error) { + + var providerRule []interface{} + for _, providerItem := range provider { + providerRule = append(providerRule, providerItem) + } + + logs, sub, err := _Depositmanager.contract.WatchLogs(opts, "TargetDepositDoesNotExist", providerRule) + 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(DepositmanagerTargetDepositDoesNotExist) + if err := _Depositmanager.contract.UnpackLog(event, "TargetDepositDoesNotExist", 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 +} + +// ParseTargetDepositDoesNotExist is a log parse operation binding the contract event 0xd4a180e367ae6a1e28aa646fb6a2f3f20346488ec50bd03fb5986e3a9a1f9bfe. +// +// Solidity: event TargetDepositDoesNotExist(address indexed provider) +func (_Depositmanager *DepositmanagerFilterer) ParseTargetDepositDoesNotExist(log types.Log) (*DepositmanagerTargetDepositDoesNotExist, error) { + event := new(DepositmanagerTargetDepositDoesNotExist) + if err := _Depositmanager.contract.UnpackLog(event, "TargetDepositDoesNotExist", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// DepositmanagerTargetDepositSetIterator is returned from FilterTargetDepositSet and is used to iterate over the raw logs and unpacked data for TargetDepositSet events raised by the Depositmanager contract. +type DepositmanagerTargetDepositSetIterator struct { + Event *DepositmanagerTargetDepositSet // 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 *DepositmanagerTargetDepositSetIterator) 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(DepositmanagerTargetDepositSet) + 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(DepositmanagerTargetDepositSet) + 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 *DepositmanagerTargetDepositSetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DepositmanagerTargetDepositSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DepositmanagerTargetDepositSet represents a TargetDepositSet event raised by the Depositmanager contract. +type DepositmanagerTargetDepositSet struct { + Provider common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterTargetDepositSet is a free log retrieval operation binding the contract event 0x6cb9e47917968530985729bd0855f1d40e32bfe78c5f738734c4f1f4e7e5e0ba. +// +// Solidity: event TargetDepositSet(address indexed provider, uint256 amount) +func (_Depositmanager *DepositmanagerFilterer) FilterTargetDepositSet(opts *bind.FilterOpts, provider []common.Address) (*DepositmanagerTargetDepositSetIterator, error) { + + var providerRule []interface{} + for _, providerItem := range provider { + providerRule = append(providerRule, providerItem) + } + + logs, sub, err := _Depositmanager.contract.FilterLogs(opts, "TargetDepositSet", providerRule) + if err != nil { + return nil, err + } + return &DepositmanagerTargetDepositSetIterator{contract: _Depositmanager.contract, event: "TargetDepositSet", logs: logs, sub: sub}, nil +} + +// WatchTargetDepositSet is a free log subscription operation binding the contract event 0x6cb9e47917968530985729bd0855f1d40e32bfe78c5f738734c4f1f4e7e5e0ba. +// +// Solidity: event TargetDepositSet(address indexed provider, uint256 amount) +func (_Depositmanager *DepositmanagerFilterer) WatchTargetDepositSet(opts *bind.WatchOpts, sink chan<- *DepositmanagerTargetDepositSet, provider []common.Address) (event.Subscription, error) { + + var providerRule []interface{} + for _, providerItem := range provider { + providerRule = append(providerRule, providerItem) + } + + logs, sub, err := _Depositmanager.contract.WatchLogs(opts, "TargetDepositSet", providerRule) + 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(DepositmanagerTargetDepositSet) + if err := _Depositmanager.contract.UnpackLog(event, "TargetDepositSet", 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 +} + +// ParseTargetDepositSet is a log parse operation binding the contract event 0x6cb9e47917968530985729bd0855f1d40e32bfe78c5f738734c4f1f4e7e5e0ba. +// +// Solidity: event TargetDepositSet(address indexed provider, uint256 amount) +func (_Depositmanager *DepositmanagerFilterer) ParseTargetDepositSet(log types.Log) (*DepositmanagerTargetDepositSet, error) { + event := new(DepositmanagerTargetDepositSet) + if err := _Depositmanager.contract.UnpackLog(event, "TargetDepositSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// DepositmanagerTopUpReducedIterator is returned from FilterTopUpReduced and is used to iterate over the raw logs and unpacked data for TopUpReduced events raised by the Depositmanager contract. +type DepositmanagerTopUpReducedIterator struct { + Event *DepositmanagerTopUpReduced // 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 *DepositmanagerTopUpReducedIterator) 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(DepositmanagerTopUpReduced) + 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(DepositmanagerTopUpReduced) + 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 *DepositmanagerTopUpReducedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DepositmanagerTopUpReducedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DepositmanagerTopUpReduced represents a TopUpReduced event raised by the Depositmanager contract. +type DepositmanagerTopUpReduced struct { + Provider common.Address + Needed *big.Int + Available *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterTopUpReduced is a free log retrieval operation binding the contract event 0x3d3e22cac7f9bc8da17ff9b43a14bbb7b8dd50ec92f62faebf162eb8d832bcc2. +// +// Solidity: event TopUpReduced(address indexed provider, uint256 needed, uint256 available) +func (_Depositmanager *DepositmanagerFilterer) FilterTopUpReduced(opts *bind.FilterOpts, provider []common.Address) (*DepositmanagerTopUpReducedIterator, error) { + + var providerRule []interface{} + for _, providerItem := range provider { + providerRule = append(providerRule, providerItem) + } + + logs, sub, err := _Depositmanager.contract.FilterLogs(opts, "TopUpReduced", providerRule) + if err != nil { + return nil, err + } + return &DepositmanagerTopUpReducedIterator{contract: _Depositmanager.contract, event: "TopUpReduced", logs: logs, sub: sub}, nil +} + +// WatchTopUpReduced is a free log subscription operation binding the contract event 0x3d3e22cac7f9bc8da17ff9b43a14bbb7b8dd50ec92f62faebf162eb8d832bcc2. +// +// Solidity: event TopUpReduced(address indexed provider, uint256 needed, uint256 available) +func (_Depositmanager *DepositmanagerFilterer) WatchTopUpReduced(opts *bind.WatchOpts, sink chan<- *DepositmanagerTopUpReduced, provider []common.Address) (event.Subscription, error) { + + var providerRule []interface{} + for _, providerItem := range provider { + providerRule = append(providerRule, providerItem) + } + + logs, sub, err := _Depositmanager.contract.WatchLogs(opts, "TopUpReduced", providerRule) + 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(DepositmanagerTopUpReduced) + if err := _Depositmanager.contract.UnpackLog(event, "TopUpReduced", 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 +} + +// ParseTopUpReduced is a log parse operation binding the contract event 0x3d3e22cac7f9bc8da17ff9b43a14bbb7b8dd50ec92f62faebf162eb8d832bcc2. +// +// Solidity: event TopUpReduced(address indexed provider, uint256 needed, uint256 available) +func (_Depositmanager *DepositmanagerFilterer) ParseTopUpReduced(log types.Log) (*DepositmanagerTopUpReduced, error) { + event := new(DepositmanagerTopUpReduced) + if err := _Depositmanager.contract.UnpackLog(event, "TopUpReduced", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/contracts-abi/script.sh b/contracts-abi/script.sh index a7a7a5721..71f42e050 100755 --- a/contracts-abi/script.sh +++ b/contracts-abi/script.sh @@ -46,6 +46,8 @@ extract_and_save_abi "$BASE_DIR/out/MevCommitMiddleware.sol/MevCommitMiddleware. extract_and_save_abi "$BASE_DIR/out/RewardManager.sol/RewardManager.json" "$ABI_DIR/RewardManager.abi" +extract_and_save_abi "$BASE_DIR/out/DepositManager.sol/DepositManager.json" "$ABI_DIR/DepositManager.abi" + echo "ABI files extracted successfully." GO_CODE_BASE_DIR="./clients" @@ -111,6 +113,8 @@ generate_go_code "$ABI_DIR/vault.abi" "Vault" "vault" generate_go_code "$ABI_DIR/RewardManager.abi" "RewardManager" "rewardmanager" +generate_go_code "$ABI_DIR/DepositManager.abi" "DepositManager" "depositmanager" + echo "External ABI downloaded and processed successfully." echo "Go code generated successfully in separate folders." diff --git a/contracts/contracts/core/BidderRegistry.sol b/contracts/contracts/core/BidderRegistry.sol index 5f60394a1..cadd888c0 100644 --- a/contracts/contracts/core/BidderRegistry.sol +++ b/contracts/contracts/core/BidderRegistry.sol @@ -10,6 +10,7 @@ import {BidderRegistryStorage} from "./BidderRegistryStorage.sol"; import {IBlockTracker} from "../interfaces/IBlockTracker.sol"; import {FeePayout} from "../utils/FeePayout.sol"; import {TimestampOccurrence} from "../utils/Occurrence.sol"; +import {DepositManager} from "./DepositManager.sol"; /// @title Bidder Registry @@ -72,6 +73,10 @@ contract BidderRegistry is feePercent = _feePercent; blockTrackerContract = IBlockTracker(_blockTracker); bidderWithdrawalPeriodMs = _bidderWithdrawalPeriodMs; + depositManagerImpl = address(new DepositManager(address(this), 0.01 ether)); // TODO: prob want to deploy the contract separately + depositManagerHash = keccak256( + abi.encodePacked(hex"ef0100", depositManagerImpl) + ); __ReentrancyGuard_init(); __Ownable_init(_owner); __Pausable_init(); @@ -267,6 +272,9 @@ contract BidderRegistry is if (bidAmt > 0) { deposit.escrowedAmount += bidAmt; deposit.availableAmount -= bidAmt; + if (bidder.code.length == 23 && bidder.codehash == depositManagerHash) { + DepositManager(payable(bidder)).topUpDeposit(provider); + } } bidState.state = State.PreConfirmed; diff --git a/contracts/contracts/core/BidderRegistryStorage.sol b/contracts/contracts/core/BidderRegistryStorage.sol index 54cd29b5d..95986c3a7 100644 --- a/contracts/contracts/core/BidderRegistryStorage.sol +++ b/contracts/contracts/core/BidderRegistryStorage.sol @@ -37,6 +37,12 @@ abstract contract BidderRegistryStorage { /// @dev Mapping from bidder address to deposits for specific providers mapping(address bidder => mapping(address provider => IBidderRegistry.Deposit deposit)) public deposits; + /// @dev Address of the deposit manager implementation contract + address public depositManagerImpl; + + /// Hash of EIP-7702 stub (0xef0100‖impl) for the deposit manager implementation contract + bytes32 public depositManagerHash; + /// @dev See https://docs.openzeppelin.com/upgrades-plugins/1.x/writing-upgradeable#storage-gaps uint256[48] private __gap; } diff --git a/contracts/contracts/core/DepositManager.sol b/contracts/contracts/core/DepositManager.sol new file mode 100644 index 000000000..0d15dd265 --- /dev/null +++ b/contracts/contracts/core/DepositManager.sol @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: BSL 1.1 +pragma solidity 0.8.26; + +import {IBidderRegistry} from "../interfaces/IBidderRegistry.sol"; + +contract DepositManager { + + mapping(address => uint256) public targetDeposits; + address public immutable bidderRegistry; + uint256 public immutable minBalance; + error NotThisEOA(); + + event TargetDepositSet(address indexed provider, uint256 amount); + event TargetDepositDoesNotExist(address indexed provider); + event NotEnoughEOABalance(uint256 balance, uint256 minBalance); + event TopUpReduced(address indexed provider, uint256 needed, uint256 available); + event CurrentDepositIsSufficient(address indexed provider); + event DepositToppedUp(address indexed provider, uint256 amount); + + constructor(address _registry, uint256 _minBalance) { + bidderRegistry = _registry; + minBalance = _minBalance; + } + + modifier onlyThisEOA() { + require(msg.sender == address(this), NotThisEOA()); + _; + } + + function setTargetDeposit(address provider, uint256 amount) external onlyThisEOA { + targetDeposits[provider] = amount; + emit TargetDepositSet(provider, amount); + } + + /// @notice Top-up deposits if needed, as configured by this EOA. + /// @param provider to top-up the deposit for. + /// @dev This function will be called automatically by external addresses. + function topUpDeposit(address provider) external { + uint256 target = targetDeposits[provider]; + if (target == 0) { + emit TargetDepositDoesNotExist(provider); + return; + } + + uint256 currentDeposit = IBidderRegistry(bidderRegistry).getDeposit(address(this), provider); + if (currentDeposit >= target) { + emit CurrentDepositIsSufficient(provider); + return; + } + uint256 needed = target - currentDeposit; + + uint256 balance = address(this).balance; + if (balance <= minBalance) { + emit NotEnoughEOABalance(balance, minBalance); + return; + } + uint256 available = balance - minBalance; + + if (needed > available) { + emit TopUpReduced(provider, needed, available); + needed = available; + } + IBidderRegistry(bidderRegistry).depositAsBidder{value: needed}(provider); + emit DepositToppedUp(provider, needed); + } + + receive() external payable { + // Eth transfers allowed. + } +} From 3d7a29e2b635dd248ac13e6d06109cde740fc146 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Thu, 31 Jul 2025 16:20:11 -0700 Subject: [PATCH 013/117] deposit manager fixes + test --- contracts/contracts/core/DepositManager.sol | 9 +- contracts/test/core/DepositManagerTest.sol | 130 ++++++++++++++++++++ 2 files changed, 137 insertions(+), 2 deletions(-) create mode 100644 contracts/test/core/DepositManagerTest.sol diff --git a/contracts/contracts/core/DepositManager.sol b/contracts/contracts/core/DepositManager.sol index 0d15dd265..fa7b7d0df 100644 --- a/contracts/contracts/core/DepositManager.sol +++ b/contracts/contracts/core/DepositManager.sol @@ -2,13 +2,14 @@ pragma solidity 0.8.26; import {IBidderRegistry} from "../interfaces/IBidderRegistry.sol"; +import {Errors} from "../utils/Errors.sol"; contract DepositManager { mapping(address => uint256) public targetDeposits; address public immutable bidderRegistry; uint256 public immutable minBalance; - error NotThisEOA(); + error NotThisEOA(address msgSender, address thisAddress); event TargetDepositSet(address indexed provider, uint256 amount); event TargetDepositDoesNotExist(address indexed provider); @@ -23,7 +24,7 @@ contract DepositManager { } modifier onlyThisEOA() { - require(msg.sender == address(this), NotThisEOA()); + require(msg.sender == address(this), NotThisEOA(msg.sender, address(this))); _; } @@ -64,6 +65,10 @@ contract DepositManager { emit DepositToppedUp(provider, needed); } + fallback() external payable { + revert Errors.InvalidFallback(); + } + receive() external payable { // Eth transfers allowed. } diff --git a/contracts/test/core/DepositManagerTest.sol b/contracts/test/core/DepositManagerTest.sol new file mode 100644 index 000000000..ea8784c7f --- /dev/null +++ b/contracts/test/core/DepositManagerTest.sol @@ -0,0 +1,130 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.26; + +import "forge-std/Test.sol"; +import {DepositManager} from "../../contracts/core/DepositManager.sol"; +import {IBidderRegistry} from "../../contracts/interfaces/IBidderRegistry.sol"; +import {BidderRegistry} from "../../contracts/core/BidderRegistry.sol"; +import {Errors} from "../../contracts/utils/Errors.sol"; + +contract DepositManagerTest is Test { + uint256 public constant ALICE_PK = uint256(0xA11CE); + uint256 public constant BOB_PK = uint256(0xB0B); + address public alice = payable(vm.addr(ALICE_PK)); + address public bob = payable(vm.addr(BOB_PK)); + + DepositManager private depositManagerImpl; + + function setUp() public { + depositManagerImpl = new DepositManager(address(new BidderRegistry()), 0.01 ether); + vm.deal(alice, 10 ether); + vm.deal(bob, 10 ether); + vm.signAndAttachDelegation(address(depositManagerImpl), ALICE_PK); + vm.signAndAttachDelegation(address(depositManagerImpl), BOB_PK); + } + + function testCodeAtAddress() public view { + bytes32 expectedCodehash = keccak256(abi.encodePacked(hex"ef0100", address(depositManagerImpl))); + assertEq(alice.codehash, expectedCodehash); + assertEq(alice.code.length, 23); + } + + function testFallbackRevert() public { + bytes memory badData = abi.encodeWithSelector( + DepositManager.setTargetDeposit.selector, + address(0x55555), + 1 ether, + 1 ether, + 1 ether + ); + vm.prank(alice); + (bool success, ) = address(depositManagerImpl).call{value: 1 ether}(badData); + assertFalse(success); + } + + function testReceiveNoRevert() public { + uint256 beforeBalance = alice.balance; + vm.prank(bob); + (bool success, ) = address(alice).call{value: 1 ether}(""); + assertTrue(success); + uint256 afterBalance = alice.balance; + assertEq(afterBalance, beforeBalance + 1 ether, "balance not increased"); + } + + function testSetTargetDeposit() public { + address provider = vm.addr(0x55555); + + uint256 aliceTarget = 1 ether; + uint256 bobTarget = 2 ether; + + vm.expectEmit(true, true, true, true); + emit DepositManager.TargetDepositSet(provider, aliceTarget); + vm.prank(alice); + DepositManager(payable(alice)).setTargetDeposit(provider, aliceTarget); + + uint256 aliceStored = DepositManager(payable(alice)).targetDeposits(provider); + assertEq(aliceStored, aliceTarget, "target deposit not set for alice"); + uint256 bobStored = DepositManager(payable(bob)).targetDeposits(provider); + assertEq(bobStored, 0, "target deposit not set for bob"); + + vm.expectEmit(true, true, true, true); + emit DepositManager.TargetDepositSet(provider, bobTarget); + vm.prank(bob); + DepositManager(payable(bob)).setTargetDeposit(provider, bobTarget); + + aliceStored = DepositManager(payable(alice)).targetDeposits(provider); + assertEq(aliceStored, aliceTarget, "target deposit changed for alice"); + bobStored = DepositManager(payable(bob)).targetDeposits(provider); + assertEq(bobStored, bobTarget, "target deposit not set for bob"); + + uint256 newTarget = 3 ether; + vm.expectRevert(abi.encodeWithSelector(DepositManager.NotThisEOA.selector, bob, alice)); + vm.prank(bob); + DepositManager(payable(alice)).setTargetDeposit(provider, newTarget); + + vm.expectEmit(true, true, true, true); + emit DepositManager.TargetDepositSet(provider, newTarget); + vm.prank(bob); + DepositManager(payable(bob)).setTargetDeposit(provider, newTarget); + bobStored = DepositManager(payable(bob)).targetDeposits(provider); + assertEq(bobStored, newTarget, "target deposit not set for bob"); + + uint256 newTargetForNewProvider = 4 ether; + address newProvider = vm.addr(0x123); + + vm.expectEmit(true, true, true, true); + emit DepositManager.TargetDepositSet(newProvider, newTargetForNewProvider); + vm.prank(alice); + DepositManager(payable(alice)).setTargetDeposit(newProvider, newTargetForNewProvider); + + uint256 aliceStoredForNewProvider = DepositManager(payable(alice)).targetDeposits(newProvider); + assertEq(aliceStoredForNewProvider, newTargetForNewProvider, "target deposit not set for alice"); + aliceStored = DepositManager(payable(alice)).targetDeposits(provider); + assertEq(aliceStored, aliceTarget, "target deposit changed for alice"); + } + + function testSetTargetDeposit_RevertNotThisEOA() public { + address provider = vm.addr(0x55555); + uint256 target = 7 ether; + + vm.expectRevert(abi.encodeWithSelector(DepositManager.NotThisEOA.selector, provider, alice)); + vm.prank(provider); + DepositManager(payable(alice)).setTargetDeposit(provider, target); + + vm.expectRevert(abi.encodeWithSelector(DepositManager.NotThisEOA.selector, alice, bob)); + vm.prank(alice); + DepositManager(payable(bob)).setTargetDeposit(provider, target); + + vm.expectRevert(abi.encodeWithSelector(DepositManager.NotThisEOA.selector, bob, alice)); + vm.prank(bob); + DepositManager(payable(alice)).setTargetDeposit(provider, target); + + vm.expectRevert(abi.encodeWithSelector(DepositManager.NotThisEOA.selector, address(depositManagerImpl), alice)); + vm.prank(address(depositManagerImpl)); + DepositManager(payable(alice)).setTargetDeposit(provider, target); + + vm.expectRevert(abi.encodeWithSelector(DepositManager.NotThisEOA.selector, alice, address(depositManagerImpl))); + vm.prank(alice); + DepositManager(payable(address(depositManagerImpl))).setTargetDeposit(provider, target); + } +} From 9fd056c2a45a4c5c003b048961c89571bb854614 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Thu, 31 Jul 2025 16:26:13 -0700 Subject: [PATCH 014/117] Update DepositManagerTest.sol --- contracts/test/core/DepositManagerTest.sol | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/contracts/test/core/DepositManagerTest.sol b/contracts/test/core/DepositManagerTest.sol index ea8784c7f..b29d085e7 100644 --- a/contracts/test/core/DepositManagerTest.sol +++ b/contracts/test/core/DepositManagerTest.sol @@ -23,10 +23,17 @@ contract DepositManagerTest is Test { vm.signAndAttachDelegation(address(depositManagerImpl), BOB_PK); } - function testCodeAtAddress() public view { + function testCodeAtAddress() public { bytes32 expectedCodehash = keccak256(abi.encodePacked(hex"ef0100", address(depositManagerImpl))); assertEq(alice.codehash, expectedCodehash); assertEq(alice.code.length, 23); + uint256 otherUserPk = uint256(0x1237777777); + address otherUser = payable(vm.addr(otherUserPk)); + assertEq(otherUser.codehash, 0x0000000000000000000000000000000000000000000000000000000000000000); + assertEq(otherUser.code.length, 0); + vm.signAndAttachDelegation(address(depositManagerImpl), otherUserPk); + assertEq(otherUser.codehash, expectedCodehash); + assertEq(otherUser.code.length, 23); } function testFallbackRevert() public { From 7ed17e2e720a52ae5559a71474d39def86d62249 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Tue, 5 Aug 2025 12:26:30 -0700 Subject: [PATCH 015/117] mas tests --- contracts/contracts/core/BidderRegistry.sol | 2 +- contracts/test/core/BidderRegistryTest.sol | 95 ++++++++++++++++++++- p2p/pkg/depositmanager/deposit.go | 1 + 3 files changed, 96 insertions(+), 2 deletions(-) diff --git a/contracts/contracts/core/BidderRegistry.sol b/contracts/contracts/core/BidderRegistry.sol index cadd888c0..80985e6f5 100644 --- a/contracts/contracts/core/BidderRegistry.sol +++ b/contracts/contracts/core/BidderRegistry.sol @@ -265,7 +265,7 @@ contract BidderRegistry is // Check if bid exceeds the available amount w.r.t bidder->provider deposit if (deposit.availableAmount < bidAmt) { // This operation shouldn't happen in normal flow. See provider node's CheckAndDeductDeposit function - // which checks if a bidder's deposit for the block covers the bid amount. + // which checks if a bidder's deposit covers the bid amount. bidAmt = deposit.availableAmount; } diff --git a/contracts/test/core/BidderRegistryTest.sol b/contracts/test/core/BidderRegistryTest.sol index 2ec502b22..3b71ea3a3 100644 --- a/contracts/test/core/BidderRegistryTest.sol +++ b/contracts/test/core/BidderRegistryTest.sol @@ -8,6 +8,7 @@ import {IBidderRegistry} from "../../contracts/interfaces/IBidderRegistry.sol"; import {Upgrades} from "openzeppelin-foundry-upgrades/Upgrades.sol"; import {WindowFromBlockNumber} from "../../contracts/utils/WindowFromBlockNumber.sol"; import {ProviderRegistry} from "../../contracts/core/ProviderRegistry.sol"; +import {DepositManager} from "../../contracts/core/DepositManager.sol"; contract BidderRegistryTest is Test { uint256 public testNumber; @@ -190,8 +191,13 @@ contract BidderRegistryTest is Test { blockTracker.addBuilderAddress("test", provider); blockTracker.recordL1Block(blockNumber, "test"); + uint256 depositBefore = bidderRegistry.getDeposit(bidder, provider); + bidderRegistry.openBid(commitmentDigest, 1 ether, bidder, provider); + uint256 depositAfter = bidderRegistry.getDeposit(bidder, provider); + assertEq(depositAfter, depositBefore-1 ether, "deposit should be reduced by bid amount since no top-up happened"); + bidderRegistry.convertFundsToProviderReward(commitmentDigest, payable(provider), bidderRegistry.ONE_HUNDRED_PERCENT()); uint256 providerAmount = bidderRegistry.providerAmount(provider); uint256 feeRecipientAmount = bidderRegistry.getAccumulatedProtocolFee(); @@ -406,6 +412,9 @@ contract BidderRegistryTest is Test { assertEq(bidAmt, 5 ether); vm.prank(address(this)); bidderRegistry.openBid(commitmentDigest, bidAmt, testBidder, provider); + + uint256 depositAfter = bidderRegistry.getDeposit(testBidder, provider); + assertEq(depositAfter, 0, "remaining deposit should be 0, since no top-up happened"); (address storedBidder, uint256 storedBidAmt, IBidderRegistry.State storedState) = bidderRegistry.bidPayment(commitmentDigest); assertEq(storedBidder, testBidder); @@ -494,7 +503,7 @@ contract BidderRegistryTest is Test { provider ); - assertEq(bidderRegistry.getDeposit(aliceBidder, provider), 0); + assertEq(bidderRegistry.getDeposit(aliceBidder, provider), 0); // no top-up happened assertEq(bidderRegistry.getEscrowedAmount(aliceBidder, provider), 2 ether); assertEq(bidderRegistry.getDeposit(bobBidder, provider), 2 ether); assertEq(bidderRegistry.getEscrowedAmount(bobBidder, provider), 0); @@ -543,4 +552,88 @@ contract BidderRegistryTest is Test { vm.expectRevert(IBidderRegistry.DepositAmountIsZero.selector); bidderRegistry.depositAsBidder{value: 0 ether}(provider); } + + function test_OpenBid_NoTopUp_WrongCodeHash() public { + uint256 alicePK = uint256(0xA11CE); + address alice = payable(vm.addr(alicePK)); + vm.deal(alice, 10 ether); + + IncorrectBidderContract incorrectContract = new IncorrectBidderContract(); + vm.signAndAttachDelegation(address(incorrectContract), alicePK); + + address bob = vm.addr(8); + vm.prank(alice); + bidderRegistry.depositAsBidder{value: 2 ether}(bob); + uint256 depositBefore = bidderRegistry.getDeposit(alice, bob); + vm.prank(bidderRegistry.preconfManager()); + bidderRegistry.openBid(keccak256("commitment"), 1 ether, alice, bob); + + uint256 depositAfter = bidderRegistry.getDeposit(alice, bob); + assertEq(depositAfter, depositBefore-1 ether, "deposit should be reduced by 1 ether, since no top-up happened"); + + assertEq(alice.codehash, keccak256(abi.encodePacked(hex"ef0100", address(incorrectContract)))); + assertEq(alice.code.length, 23); + } + + function test_OpenBid_NoTopUp_TargetDepositDoesNotExist() public { + uint256 alicePK = uint256(0xA11CE); + address alice = payable(vm.addr(alicePK)); + vm.deal(alice, 10 ether); + vm.signAndAttachDelegation(address(bidderRegistry.depositManagerImpl()), alicePK); + + address bob = vm.addr(8); + vm.prank(alice); + bidderRegistry.depositAsBidder{value: 2 ether}(bob); + uint256 depositBefore = bidderRegistry.getDeposit(alice, bob); + vm.expectEmit(true, true, true, true); + emit DepositManager.TargetDepositDoesNotExist(bob); + vm.prank(bidderRegistry.preconfManager()); + bidderRegistry.openBid(keccak256("commitment"), 1 ether, alice, bob); + + uint256 depositAfter = bidderRegistry.getDeposit(alice, bob); + assertEq(depositAfter, depositBefore-1 ether, "deposit should be reduced by 1 ether, since no top-up happened"); + } + + function test_OpenBid_NoTopUp_CurrentDepositIsSufficient() public { + uint256 alicePK = uint256(0xA11CE); + address alice = vm.addr(alicePK); + vm.deal(alice, 10 ether); + vm.signAndAttachDelegation(address(bidderRegistry.depositManagerImpl()), alicePK); + + address bob = vm.addr(8); + + vm.prank(alice); + DepositManager(payable(alice)).setTargetDeposit(bob, 0.5 ether); + + vm.prank(alice); + bidderRegistry.depositAsBidder{value: 2 ether}(bob); + uint256 depositBefore = bidderRegistry.getDeposit(alice, bob); + assertEq(depositBefore, 2 ether, "deposit should be 2 ether"); + + vm.expectEmit(true, true, true, true); + emit DepositManager.CurrentDepositIsSufficient(bob); + vm.prank(bidderRegistry.preconfManager()); + bidderRegistry.openBid(keccak256("commitment"), 1 ether, alice, bob); + + uint256 depositAfter = bidderRegistry.getDeposit(alice, bob); + assertEq(depositAfter, 1 ether, "deposit should be reduced by 1 ether, since no top-up happened"); + assertEq(DepositManager(payable(alice)).targetDeposits(bob), 0.5 ether); + + vm.expectEmit(true, true, true, true); + emit DepositManager.CurrentDepositIsSufficient(bob); + vm.prank(bidderRegistry.preconfManager()); + bidderRegistry.openBid(keccak256("commitment2"), 0.5 ether, alice, bob); + + uint256 depositAfter2 = bidderRegistry.getDeposit(alice, bob); + assertEq(depositAfter2, 0.5 ether, "deposit should be 0.5 ether"); + assertEq(DepositManager(payable(alice)).targetDeposits(bob), 0.5 ether); + } +} + +contract IncorrectBidderContract { + event somethingBadHappened(address provider); + function topUpDeposit(address provider) public { + emit somethingBadHappened(provider); + revert("control flow should not reach here"); + } } diff --git a/p2p/pkg/depositmanager/deposit.go b/p2p/pkg/depositmanager/deposit.go index 45445c145..3e1002f80 100644 --- a/p2p/pkg/depositmanager/deposit.go +++ b/p2p/pkg/depositmanager/deposit.go @@ -151,6 +151,7 @@ func (dm *DepositManager) Start(ctx context.Context) <-chan struct{} { } // TODO: Add check in provider node to see if bidder has requested a withdrawal. +// TODO: Also still check the deposit, now it's just w.r.t a provider and not a block. func (dm *DepositManager) CheckAndDeductDeposit( ctx context.Context, address common.Address, From e19099702ae7314b73747096b359ddb10353f383 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Tue, 5 Aug 2025 13:29:05 -0700 Subject: [PATCH 016/117] Update DepositManager.sol --- contracts/contracts/core/DepositManager.sol | 23 +++++++++++---------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/contracts/contracts/core/DepositManager.sol b/contracts/contracts/core/DepositManager.sol index fa7b7d0df..884bc136a 100644 --- a/contracts/contracts/core/DepositManager.sol +++ b/contracts/contracts/core/DepositManager.sol @@ -13,9 +13,10 @@ contract DepositManager { event TargetDepositSet(address indexed provider, uint256 amount); event TargetDepositDoesNotExist(address indexed provider); - event NotEnoughEOABalance(uint256 balance, uint256 minBalance); - event TopUpReduced(address indexed provider, uint256 needed, uint256 available); - event CurrentDepositIsSufficient(address indexed provider); + event CurrentDepositIsSufficient(address indexed provider, uint256 currentDeposit, uint256 targetDeposit); + event CurrentBalanceAtOrBelowMin(address indexed provider, uint256 currentBalance, uint256 minBalance); + event NotEnoughEOABalance(address indexed provider, uint256 available, uint256 needed); + event TopUpReduced(address indexed provider, uint256 available, uint256 needed); event DepositToppedUp(address indexed provider, uint256 amount); constructor(address _registry, uint256 _minBalance) { @@ -45,20 +46,20 @@ contract DepositManager { uint256 currentDeposit = IBidderRegistry(bidderRegistry).getDeposit(address(this), provider); if (currentDeposit >= target) { - emit CurrentDepositIsSufficient(provider); + emit CurrentDepositIsSufficient(provider, currentDeposit, target); return; } - uint256 needed = target - currentDeposit; + uint256 needed = target - currentDeposit; // No underflow/overflow, target must be greater than current deposit - uint256 balance = address(this).balance; - if (balance <= minBalance) { - emit NotEnoughEOABalance(balance, minBalance); + uint256 currentBalance = address(this).balance; + if (currentBalance <= minBalance) { + emit CurrentBalanceAtOrBelowMin(provider, currentBalance, minBalance); return; } - uint256 available = balance - minBalance; - if (needed > available) { - emit TopUpReduced(provider, needed, available); + uint256 available = currentBalance - minBalance; // No underflow/overflow, currentBalance must be greater than minBalance + if (available < needed) { + emit TopUpReduced(provider, available, needed); needed = available; } IBidderRegistry(bidderRegistry).depositAsBidder{value: needed}(provider); From bd85974fad2501d52381ad535a51196575902317 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Tue, 5 Aug 2025 17:11:51 -0700 Subject: [PATCH 017/117] more tests + more bidder registry changes --- contracts/contracts/core/BidderRegistry.sol | 13 ++++++++++++- contracts/contracts/core/DepositManager.sol | 7 ++++++- contracts/contracts/interfaces/IBidderRegistry.sol | 8 ++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/contracts/contracts/core/BidderRegistry.sol b/contracts/contracts/core/BidderRegistry.sol index 80985e6f5..cd0bbbd14 100644 --- a/contracts/contracts/core/BidderRegistry.sol +++ b/contracts/contracts/core/BidderRegistry.sol @@ -273,7 +273,11 @@ contract BidderRegistry is deposit.escrowedAmount += bidAmt; deposit.availableAmount -= bidAmt; if (bidder.code.length == 23 && bidder.codehash == depositManagerHash) { - DepositManager(payable(bidder)).topUpDeposit(provider); + try DepositManager(payable(bidder)).topUpDeposit(provider) { + } catch { + // Revert shouldn't happen, but is gracefully caught for safety + emit TopUpFailed(bidder, provider); + } } } @@ -394,6 +398,13 @@ contract BidderRegistry is return deposits[bidder][provider].escrowedAmount; } + function withdrawalRequestExists( + address bidder, + address provider + ) external view returns (bool) { + return deposits[bidder][provider].withdrawalRequestOccurrence.exists; + } + /// @return protocolFee amount not yet transferred to recipient function getAccumulatedProtocolFee() external view returns (uint256) { return protocolFeeTracker.accumulatedAmount; diff --git a/contracts/contracts/core/DepositManager.sol b/contracts/contracts/core/DepositManager.sol index 884bc136a..72db37700 100644 --- a/contracts/contracts/core/DepositManager.sol +++ b/contracts/contracts/core/DepositManager.sol @@ -12,10 +12,10 @@ contract DepositManager { error NotThisEOA(address msgSender, address thisAddress); event TargetDepositSet(address indexed provider, uint256 amount); + event WithdrawalRequestExists(address indexed provider); event TargetDepositDoesNotExist(address indexed provider); event CurrentDepositIsSufficient(address indexed provider, uint256 currentDeposit, uint256 targetDeposit); event CurrentBalanceAtOrBelowMin(address indexed provider, uint256 currentBalance, uint256 minBalance); - event NotEnoughEOABalance(address indexed provider, uint256 available, uint256 needed); event TopUpReduced(address indexed provider, uint256 available, uint256 needed); event DepositToppedUp(address indexed provider, uint256 amount); @@ -38,6 +38,11 @@ contract DepositManager { /// @param provider to top-up the deposit for. /// @dev This function will be called automatically by external addresses. function topUpDeposit(address provider) external { + if (IBidderRegistry(bidderRegistry).withdrawalRequestExists(address(this), provider)) { + emit WithdrawalRequestExists(provider); + return; + } + uint256 target = targetDeposits[provider]; if (target == 0) { emit TargetDepositDoesNotExist(provider); diff --git a/contracts/contracts/interfaces/IBidderRegistry.sol b/contracts/contracts/interfaces/IBidderRegistry.sol index 896906af1..f6882830e 100644 --- a/contracts/contracts/interfaces/IBidderRegistry.sol +++ b/contracts/contracts/interfaces/IBidderRegistry.sol @@ -95,6 +95,9 @@ interface IBidderRegistry { /// @dev Event emitted when transfer to bidder fails event TransferToBidderFailed(address bidder, uint256 amount); + /// @dev Event emitted when a bidder's top-up instance fails during openBid + event TopUpFailed(address indexed bidder, address indexed provider); + /// @dev Error emitted when the sender is not the preconfManager error SenderIsNotPreconfManager(address sender, address preconfManager); @@ -149,4 +152,9 @@ interface IBidderRegistry { address bidder, address provider ) external view returns (uint256); + + function withdrawalRequestExists( + address bidder, + address provider + ) external view returns (bool); } From e5cea2ae67d903a86ad6c3ee6555209cec5c6cc2 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Tue, 5 Aug 2025 17:11:56 -0700 Subject: [PATCH 018/117] Update BidderRegistryTest.sol --- contracts/test/core/BidderRegistryTest.sol | 136 ++++++++++++++++++++- 1 file changed, 134 insertions(+), 2 deletions(-) diff --git a/contracts/test/core/BidderRegistryTest.sol b/contracts/test/core/BidderRegistryTest.sol index 3b71ea3a3..dcae8e6af 100644 --- a/contracts/test/core/BidderRegistryTest.sol +++ b/contracts/test/core/BidderRegistryTest.sol @@ -575,6 +575,32 @@ contract BidderRegistryTest is Test { assertEq(alice.code.length, 23); } + function test_OpenBid_NoTopUp_WithdrawalRequestExists() public { + uint256 alicePK = uint256(0xA11CE); + address alice = payable(vm.addr(alicePK)); + vm.deal(alice, 10 ether); + vm.signAndAttachDelegation(address(bidderRegistry.depositManagerImpl()), alicePK); + + address bob = vm.addr(8); + vm.prank(alice); + bidderRegistry.depositAsBidder{value: 2 ether}(bob); + + address[] memory providers = new address[](1); + providers[0] = bob; + vm.prank(alice); + bidderRegistry.requestWithdrawalsAsBidder(providers); + + uint256 depositBefore = bidderRegistry.getDeposit(alice, bob); + vm.expectEmit(true, true, true, true); + emit DepositManager.WithdrawalRequestExists(bob); + vm.prank(bidderRegistry.preconfManager()); + bidderRegistry.openBid(keccak256("commitment"), 1 ether, alice, bob); + + uint256 depositAfter = bidderRegistry.getDeposit(alice, bob); + assertEq(depositAfter, depositBefore-1 ether, "deposit should be reduced by 1 ether, since no top-up happened"); + assertEq(bidderRegistry.getEscrowedAmount(alice, bob), 1 ether); + } + function test_OpenBid_NoTopUp_TargetDepositDoesNotExist() public { uint256 alicePK = uint256(0xA11CE); address alice = payable(vm.addr(alicePK)); @@ -611,7 +637,7 @@ contract BidderRegistryTest is Test { assertEq(depositBefore, 2 ether, "deposit should be 2 ether"); vm.expectEmit(true, true, true, true); - emit DepositManager.CurrentDepositIsSufficient(bob); + emit DepositManager.CurrentDepositIsSufficient(bob, 1 ether, 0.5 ether); vm.prank(bidderRegistry.preconfManager()); bidderRegistry.openBid(keccak256("commitment"), 1 ether, alice, bob); @@ -620,7 +646,7 @@ contract BidderRegistryTest is Test { assertEq(DepositManager(payable(alice)).targetDeposits(bob), 0.5 ether); vm.expectEmit(true, true, true, true); - emit DepositManager.CurrentDepositIsSufficient(bob); + emit DepositManager.CurrentDepositIsSufficient(bob, 0.5 ether, 0.5 ether); vm.prank(bidderRegistry.preconfManager()); bidderRegistry.openBid(keccak256("commitment2"), 0.5 ether, alice, bob); @@ -628,6 +654,112 @@ contract BidderRegistryTest is Test { assertEq(depositAfter2, 0.5 ether, "deposit should be 0.5 ether"); assertEq(DepositManager(payable(alice)).targetDeposits(bob), 0.5 ether); } + + function test_OpenBid_NoTopUp_CurrentBalanceAtOrBelowMin() public { + uint256 alicePK = uint256(0xA11CE); + address alice = vm.addr(alicePK); + vm.deal(alice, 1.01 ether); + vm.signAndAttachDelegation(address(bidderRegistry.depositManagerImpl()), alicePK); + + address bob = vm.addr(8); + vm.prank(alice); + DepositManager(payable(alice)).setTargetDeposit(bob, 1 ether); + + vm.prank(alice); + bidderRegistry.depositAsBidder{value: 1 ether}(bob); + uint256 depositBefore = bidderRegistry.getDeposit(alice, bob); + assertEq(depositBefore, 1 ether, "deposit should be 1 ether"); + + vm.expectEmit(true, true, true, true); + emit DepositManager.CurrentBalanceAtOrBelowMin(bob, 0.01 ether, 0.01 ether); + vm.prank(bidderRegistry.preconfManager()); + bidderRegistry.openBid(keccak256("commitment"), 1 ether, alice, bob); + + uint256 depositAfter = bidderRegistry.getDeposit(alice, bob); + assertEq(depositAfter, 0 ether, "deposit should be 0 ether, since no top-up happened"); + assertEq(bidderRegistry.getEscrowedAmount(alice, bob), 1 ether); + + vm.prank(alice); + bidderRegistry.depositAsBidder{value: 0.001 ether}(bob); + + assertEq(alice.balance, 0.009 ether); + vm.expectEmit(true, true, true, true); + emit DepositManager.CurrentBalanceAtOrBelowMin(bob, 0.009 ether, 0.01 ether); + vm.prank(bidderRegistry.preconfManager()); + bidderRegistry.openBid(keccak256("commitment2"), 0.001 ether, alice, bob); + + uint256 depositAfter2 = bidderRegistry.getDeposit(alice, bob); + assertEq(depositAfter2, 0 ether, "deposit should be 0 ether, since no top-up happened"); + assertEq(bidderRegistry.getEscrowedAmount(alice, bob), 1.001 ether); + } + + function test_OpenBid_TopUpReduced() public { + uint256 alicePK = uint256(0xA11CE); + address alice = vm.addr(alicePK); + vm.deal(alice, 2 ether); + vm.signAndAttachDelegation(address(bidderRegistry.depositManagerImpl()), alicePK); + + address bob = vm.addr(8); + vm.prank(alice); + DepositManager(payable(alice)).setTargetDeposit(bob, 1.5 ether); + + vm.prank(alice); + bidderRegistry.depositAsBidder{value: 1.5 ether}(bob); + uint256 depositBefore = bidderRegistry.getDeposit(alice, bob); + assertEq(depositBefore, 1.5 ether, "deposit should be 1.5 ether"); + assertEq(alice.balance, 0.5 ether, "alice should have 0.5 ether"); + assertEq(DepositManager(payable(alice)).minBalance(), 0.01 ether); + + vm.expectEmit(true, true, true, true); + emit DepositManager.TopUpReduced(bob, 0.49 ether, 1.5 ether); // available = 0.5 - minBalance + vm.expectEmit(true, true, true, true); + emit DepositManager.DepositToppedUp(bob, 0.49 ether); + vm.prank(bidderRegistry.preconfManager()); + bidderRegistry.openBid(keccak256("commitment"), 1.5 ether, alice, bob); + + uint256 depositAfter = bidderRegistry.getDeposit(alice, bob); + assertEq(depositAfter, 0.49 ether, "deposit should be 0.49 ether"); + assertEq(bidderRegistry.getEscrowedAmount(alice, bob), 1.5 ether); + assertEq(DepositManager(payable(alice)).targetDeposits(bob), 1.5 ether); + + vm.deal(alice, 10 ether); + assertEq(alice.balance, 10 ether, "alice should have 10 ether"); + + vm.expectEmit(true, true, true, true); + emit DepositManager.DepositToppedUp(bob, 1.5 ether); // 0.49 - 0.49 + full top-up amount + vm.prank(bidderRegistry.preconfManager()); + bidderRegistry.openBid(keccak256("commitment2"), 0.49 ether, alice, bob); + uint256 depositAfterPart2 = bidderRegistry.getDeposit(alice, bob); + assertEq(depositAfterPart2, 1.5 ether, "deposit after part 2 should be 1.5 ether since that's the full target deposit"); + + assertEq(bidderRegistry.getEscrowedAmount(alice, bob), 1.5 ether + 0.49 ether); + assertEq(alice.balance, 8.50 ether); + } + + function test_OpenBid_NormalTopUp() public { + uint256 alicePK = uint256(0xA11CE); + address alice = vm.addr(alicePK); + vm.deal(alice, 2 ether); + vm.signAndAttachDelegation(address(bidderRegistry.depositManagerImpl()), alicePK); + + address bob = vm.addr(8); + vm.prank(alice); + DepositManager(payable(alice)).setTargetDeposit(bob, 1.5 ether); + + vm.prank(alice); + bidderRegistry.depositAsBidder{value: 1.5 ether}(bob); + + assertEq(alice.balance, 0.5 ether, "alice should have 0.5 ether"); + + vm.expectEmit(true, true, true, true); + emit DepositManager.DepositToppedUp(bob, 0.25 ether); + vm.prank(bidderRegistry.preconfManager()); + bidderRegistry.openBid(keccak256("commitment3"), 0.25 ether, alice, bob); + + uint256 depositAfter = bidderRegistry.getDeposit(alice, bob); + assertEq(depositAfter, 1.5 ether, "deposit should be 1.5 ether"); + assertEq(alice.balance, 0.25 ether, "alice should have 0.25 ether"); + } } contract IncorrectBidderContract { From c9c91bbed8efbf188b596b0db2b1348726ee8b37 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Tue, 5 Aug 2025 18:13:06 -0700 Subject: [PATCH 019/117] set depositManagerImpl outside initializer --- contracts/contracts/core/BidderRegistry.sol | 21 ++++++++++--- .../contracts/interfaces/IBidderRegistry.sol | 6 ++++ contracts/scripts/core/DeployCore.s.sol | 6 ++++ contracts/test/core/BidderRegistryTest.sol | 31 +++++++++++++++++++ contracts/test/core/OracleTest.sol | 5 +++ contracts/test/core/PreconfManagerTest.sol | 5 +++ contracts/test/core/ProviderRegistryTest.sol | 5 +++ 7 files changed, 74 insertions(+), 5 deletions(-) diff --git a/contracts/contracts/core/BidderRegistry.sol b/contracts/contracts/core/BidderRegistry.sol index cd0bbbd14..886061287 100644 --- a/contracts/contracts/core/BidderRegistry.sol +++ b/contracts/contracts/core/BidderRegistry.sol @@ -31,6 +31,11 @@ contract BidderRegistry is _; } + modifier depositManagerIsSet() { + require(depositManagerImpl != address(0), DepositManagerNotSet()); + _; + } + /// @dev See https://docs.openzeppelin.com/upgrades-plugins/1.x/writing-upgradeable#initializing_the_implementation_contract /// @custom:oz-upgrades-unsafe-allow constructor constructor() { @@ -73,10 +78,6 @@ contract BidderRegistry is feePercent = _feePercent; blockTrackerContract = IBlockTracker(_blockTracker); bidderWithdrawalPeriodMs = _bidderWithdrawalPeriodMs; - depositManagerImpl = address(new DepositManager(address(this), 0.01 ether)); // TODO: prob want to deploy the contract separately - depositManagerHash = keccak256( - abi.encodePacked(hex"ef0100", depositManagerImpl) - ); __ReentrancyGuard_init(); __Ownable_init(_owner); __Pausable_init(); @@ -254,7 +255,7 @@ contract BidderRegistry is uint256 bidAmt, address bidder, address provider - ) external onlyPreconfManager whenNotPaused returns (uint256) { + ) external onlyPreconfManager whenNotPaused depositManagerIsSet returns (uint256) { BidState storage bidState = bidPayment[commitmentDigest]; if (bidState.state != State.Undefined) { return bidAmt; @@ -288,6 +289,16 @@ contract BidderRegistry is return bidAmt; } + /** + * @dev Sets the deposit manager implementation address. Can only be called by the owner. + * @param _depositManagerImpl The address of the deposit manager implementation. + */ + function setDepositManagerImpl(address _depositManagerImpl) external onlyOwner { + depositManagerImpl = _depositManagerImpl; + depositManagerHash = keccak256(abi.encodePacked(hex"ef0100", depositManagerImpl)); + emit DepositManagerImplUpdated(depositManagerImpl); + } + /** * @dev Sets the preconfManager contract address. Can only be called by the owner. * @param contractAddress The address of the preconfManager contract. diff --git a/contracts/contracts/interfaces/IBidderRegistry.sol b/contracts/contracts/interfaces/IBidderRegistry.sol index f6882830e..0cee3098c 100644 --- a/contracts/contracts/interfaces/IBidderRegistry.sol +++ b/contracts/contracts/interfaces/IBidderRegistry.sol @@ -77,6 +77,9 @@ interface IBidderRegistry { uint256 amountEscrowed ); + /// @dev Event emitted when the deposit manager implementation is updated + event DepositManagerImplUpdated(address indexed newDepositManagerImpl); + /// @dev Event emitted when the preconfManager is updated event PreconfManagerUpdated(address indexed newPreconfManager); @@ -101,6 +104,9 @@ interface IBidderRegistry { /// @dev Error emitted when the sender is not the preconfManager error SenderIsNotPreconfManager(address sender, address preconfManager); + /// @dev Error emitted when the deposit manager implementation is not set + error DepositManagerNotSet(); + /// @dev Error emitted when the bid is not preconfirmed error BidNotPreConfirmed(bytes32 commitmentDigest, State actualState, State expectedState); diff --git a/contracts/scripts/core/DeployCore.s.sol b/contracts/scripts/core/DeployCore.s.sol index 9f21bbeaa..d5dce7a4c 100644 --- a/contracts/scripts/core/DeployCore.s.sol +++ b/contracts/scripts/core/DeployCore.s.sol @@ -13,6 +13,7 @@ import {Oracle} from "../../contracts/core/Oracle.sol"; import {Upgrades} from "openzeppelin-foundry-upgrades/Upgrades.sol"; import {BlockTracker} from "../../contracts/core/BlockTracker.sol"; import {console} from "forge-std/console.sol"; +import {DepositManager} from "../../contracts/core/DepositManager.sol"; contract DeployCore is Script { @@ -60,6 +61,11 @@ contract DeployCore is Script { BidderRegistry bidderRegistry = BidderRegistry(payable(bidderRegistryProxy)); console.log("BidderRegistry:", address(bidderRegistry)); + uint256 depositManagerMinBalance = 0.01 ether; + DepositManager depositManager = new DepositManager(bidderRegistryProxy, depositManagerMinBalance); + bidderRegistry.setDepositManagerImpl(address(depositManager)); + console.log("Set bidderRegistry.depositManagerImpl to:", address(depositManager)); + address providerRegistryProxy = Upgrades.deployUUPSProxy( "ProviderRegistry.sol", abi.encodeCall(ProviderRegistry.initialize, diff --git a/contracts/test/core/BidderRegistryTest.sol b/contracts/test/core/BidderRegistryTest.sol index dcae8e6af..05097e9f6 100644 --- a/contracts/test/core/BidderRegistryTest.sol +++ b/contracts/test/core/BidderRegistryTest.sol @@ -9,6 +9,7 @@ import {Upgrades} from "openzeppelin-foundry-upgrades/Upgrades.sol"; import {WindowFromBlockNumber} from "../../contracts/utils/WindowFromBlockNumber.sol"; import {ProviderRegistry} from "../../contracts/core/ProviderRegistry.sol"; import {DepositManager} from "../../contracts/core/DepositManager.sol"; +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; contract BidderRegistryTest is Test { uint256 public testNumber; @@ -55,6 +56,10 @@ contract BidderRegistryTest is Test { ); bidderRegistry = BidderRegistry(payable(bidderRegistryProxy)); + uint256 depositManagerMinBalance = 0.01 ether; + DepositManager depositManager = new DepositManager(bidderRegistryProxy, depositManagerMinBalance); + bidderRegistry.setDepositManagerImpl(address(depositManager)); + address providerRegistryProxy = Upgrades.deployUUPSProxy( "ProviderRegistry.sol", abi.encodeCall( @@ -166,6 +171,32 @@ contract BidderRegistryTest is Test { bidderRegistry.setNewFeePercent(uint16(25)); } + function test_SetDepositManagerImpl() public { + address depositManager = vm.addr(3); + vm.expectEmit(true, true, true, true); + emit IBidderRegistry.DepositManagerImplUpdated(depositManager); + vm.prank(address(this)); + bidderRegistry.setDepositManagerImpl(depositManager); + assertEq(bidderRegistry.depositManagerImpl(), depositManager); + assertEq(bidderRegistry.depositManagerHash(), keccak256(abi.encodePacked(hex"ef0100", depositManager))); + } + + function test_RevertWhen_SetDepositManagerImpl() public { + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, vm.addr(888))); + vm.prank(vm.addr(888)); + bidderRegistry.setDepositManagerImpl(vm.addr(3)); + } + + function test_OpenBid_RevertWhen_DepositManagerNotSet() public { + vm.prank(address(this)); + bidderRegistry.setDepositManagerImpl(address(0)); + assertEq(bidderRegistry.depositManagerImpl(), address(0)); + address preconfManager = bidderRegistry.preconfManager(); + vm.expectRevert(abi.encodeWithSelector(IBidderRegistry.DepositManagerNotSet.selector)); + vm.prank(preconfManager); + bidderRegistry.openBid(keccak256("1234"), 1 ether, bidder, vm.addr(4)); + } + function test_SetPreconfManager() public { vm.prank(address(this)); address newPreConfContract = vm.addr(3); diff --git a/contracts/test/core/OracleTest.sol b/contracts/test/core/OracleTest.sol index 1a2b0cf08..7296df7b4 100644 --- a/contracts/test/core/OracleTest.sol +++ b/contracts/test/core/OracleTest.sol @@ -12,6 +12,7 @@ import {WindowFromBlockNumber} from "../../contracts/utils/WindowFromBlockNumber import {ECDSA} from "@openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol"; import {MockBLSVerify} from "../precompiles/BLSVerifyPreCompileMockTest.sol"; import {IPreconfManager} from "../../contracts/interfaces/IPreconfManager.sol"; +import {DepositManager} from "../../contracts/core/DepositManager.sol"; contract OracleTest is Test { using ECDSA for bytes32; @@ -153,6 +154,10 @@ contract OracleTest is Test { ); bidderRegistry = BidderRegistry(payable(proxy3)); + uint256 depositManagerMinBalance = 0.01 ether; + DepositManager depositManager = new DepositManager(address(bidderRegistry), depositManagerMinBalance); + bidderRegistry.setDepositManagerImpl(address(depositManager)); + address proxy4 = Upgrades.deployUUPSProxy( "PreconfManager.sol", abi.encodeCall( diff --git a/contracts/test/core/PreconfManagerTest.sol b/contracts/test/core/PreconfManagerTest.sol index cfd5bc8ca..60f6fd1f3 100644 --- a/contracts/test/core/PreconfManagerTest.sol +++ b/contracts/test/core/PreconfManagerTest.sol @@ -11,6 +11,7 @@ import {Upgrades} from "openzeppelin-foundry-upgrades/Upgrades.sol"; import {WindowFromBlockNumber} from "../../contracts/utils/WindowFromBlockNumber.sol"; import {IProviderRegistry} from "../../contracts/interfaces/IProviderRegistry.sol"; import {MockBLSVerify} from "../precompiles/BLSVerifyPreCompileMockTest.sol"; +import {DepositManager} from "../../contracts/core/DepositManager.sol"; contract PreconfManagerTest is Test { struct TestCommitment { @@ -142,6 +143,10 @@ contract PreconfManagerTest is Test { ); bidderRegistry = BidderRegistry(payable(bidderRegistryProxy)); + uint256 depositManagerMinBalance = 0.01 ether; + DepositManager depositManager = new DepositManager(address(bidderRegistry), depositManagerMinBalance); + bidderRegistry.setDepositManagerImpl(address(depositManager)); + address preconfStoreProxy = Upgrades.deployUUPSProxy( "PreconfManager.sol", abi.encodeCall( diff --git a/contracts/test/core/ProviderRegistryTest.sol b/contracts/test/core/ProviderRegistryTest.sol index 5c44322f9..96c4d75c9 100644 --- a/contracts/test/core/ProviderRegistryTest.sol +++ b/contracts/test/core/ProviderRegistryTest.sol @@ -9,6 +9,7 @@ import {BlockTracker} from "../../contracts/core/BlockTracker.sol"; import {Upgrades} from "openzeppelin-foundry-upgrades/Upgrades.sol"; import {IProviderRegistry} from "../../contracts/interfaces/IProviderRegistry.sol"; import {MockBLSVerify} from "../precompiles/BLSVerifyPreCompileMockTest.sol"; +import {DepositManager} from "../../contracts/core/DepositManager.sol"; contract ProviderRegistryTest is Test { uint256 public testNumber; @@ -98,6 +99,10 @@ contract ProviderRegistryTest is Test { ); bidderRegistry = BidderRegistry(payable(bidderRegistryProxy)); + uint256 depositManagerMinBalance = 0.01 ether; + DepositManager depositManager = new DepositManager(address(bidderRegistry), depositManagerMinBalance); + bidderRegistry.setDepositManagerImpl(address(depositManager)); + address preconfStoreProxy = Upgrades.deployUUPSProxy( "PreconfManager.sol", abi.encodeCall( From 1baca650feb91342cb6f8c44c8c1a98bb248e460 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Tue, 5 Aug 2025 18:18:16 -0700 Subject: [PATCH 020/117] fix hardcoded preconf manager tests which rely on contract addr --- contracts/test/core/PreconfManagerTest.sol | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/test/core/PreconfManagerTest.sol b/contracts/test/core/PreconfManagerTest.sol index 60f6fd1f3..0ca0c5a5e 100644 --- a/contracts/test/core/PreconfManagerTest.sol +++ b/contracts/test/core/PreconfManagerTest.sol @@ -143,10 +143,6 @@ contract PreconfManagerTest is Test { ); bidderRegistry = BidderRegistry(payable(bidderRegistryProxy)); - uint256 depositManagerMinBalance = 0.01 ether; - DepositManager depositManager = new DepositManager(address(bidderRegistry), depositManagerMinBalance); - bidderRegistry.setDepositManagerImpl(address(depositManager)); - address preconfStoreProxy = Upgrades.deployUUPSProxy( "PreconfManager.sol", abi.encodeCall( @@ -163,6 +159,10 @@ contract PreconfManagerTest is Test { ); preconfManager = PreconfManager(payable(preconfStoreProxy)); + uint256 depositManagerMinBalance = 0.01 ether; + DepositManager depositManager = new DepositManager(address(bidderRegistry), depositManagerMinBalance); + bidderRegistry.setDepositManagerImpl(address(depositManager)); + // Sets fake block timestamp vm.warp(500); bidderRegistry.setPreconfManager(address(preconfManager)); From c6ca4bf1d20b67bf0f05114fc30b3deb7946b51e Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Tue, 5 Aug 2025 18:18:26 -0700 Subject: [PATCH 021/117] update abi+bindings --- contracts-abi/abi/BidderRegistry.abi | 74 ++++ contracts-abi/abi/DepositManager.abi | 75 +++- .../clients/BidderRegistry/BidderRegistry.go | 351 ++++++++++++++++- .../clients/DepositManager/DepositManager.go | 360 +++++++++++++----- 4 files changed, 756 insertions(+), 104 deletions(-) diff --git a/contracts-abi/abi/BidderRegistry.abi b/contracts-abi/abi/BidderRegistry.abi index 660e4352e..0ea31f8b8 100644 --- a/contracts-abi/abi/BidderRegistry.abi +++ b/contracts-abi/abi/BidderRegistry.abi @@ -563,6 +563,19 @@ "outputs": [], "stateMutability": "nonpayable" }, + { + "type": "function", + "name": "setDepositManagerImpl", + "inputs": [ + { + "name": "_depositManagerImpl", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, { "type": "function", "name": "setNewFeePayoutPeriod", @@ -697,6 +710,30 @@ "outputs": [], "stateMutability": "nonpayable" }, + { + "type": "function", + "name": "withdrawalRequestExists", + "inputs": [ + { + "name": "bidder", + "type": "address", + "internalType": "address" + }, + { + "name": "provider", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, { "type": "event", "name": "BidderDeposited", @@ -766,6 +803,19 @@ ], "anonymous": false }, + { + "type": "event", + "name": "DepositManagerImplUpdated", + "inputs": [ + { + "name": "newDepositManagerImpl", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, { "type": "event", "name": "FeePayoutPeriodUpdated", @@ -963,6 +1013,25 @@ ], "anonymous": false }, + { + "type": "event", + "name": "TopUpFailed", + "inputs": [ + { + "name": "bidder", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "provider", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, { "type": "event", "name": "TransferToBidderFailed", @@ -1102,6 +1171,11 @@ } ] }, + { + "type": "error", + "name": "DepositManagerNotSet", + "inputs": [] + }, { "type": "error", "name": "ERC1967InvalidImplementation", diff --git a/contracts-abi/abi/DepositManager.abi b/contracts-abi/abi/DepositManager.abi index bb9b0d6f9..44f993a1a 100644 --- a/contracts-abi/abi/DepositManager.abi +++ b/contracts-abi/abi/DepositManager.abi @@ -15,6 +15,10 @@ ], "stateMutability": "nonpayable" }, + { + "type": "fallback", + "stateMutability": "payable" + }, { "type": "receive", "stateMutability": "payable" @@ -97,20 +101,32 @@ }, { "type": "event", - "name": "CurrentDepositIsSufficient", + "name": "CurrentBalanceAtOrBelowMin", "inputs": [ { "name": "provider", "type": "address", "indexed": true, "internalType": "address" + }, + { + "name": "currentBalance", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "minBalance", + "type": "uint256", + "indexed": false, + "internalType": "uint256" } ], "anonymous": false }, { "type": "event", - "name": "DepositToppedUp", + "name": "CurrentDepositIsSufficient", "inputs": [ { "name": "provider", @@ -119,7 +135,13 @@ "internalType": "address" }, { - "name": "amount", + "name": "currentDeposit", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "targetDeposit", "type": "uint256", "indexed": false, "internalType": "uint256" @@ -129,16 +151,16 @@ }, { "type": "event", - "name": "NotEnoughEOABalance", + "name": "DepositToppedUp", "inputs": [ { - "name": "balance", - "type": "uint256", - "indexed": false, - "internalType": "uint256" + "name": "provider", + "type": "address", + "indexed": true, + "internalType": "address" }, { - "name": "minBalance", + "name": "amount", "type": "uint256", "indexed": false, "internalType": "uint256" @@ -189,13 +211,13 @@ "internalType": "address" }, { - "name": "needed", + "name": "available", "type": "uint256", "indexed": false, "internalType": "uint256" }, { - "name": "available", + "name": "needed", "type": "uint256", "indexed": false, "internalType": "uint256" @@ -203,9 +225,38 @@ ], "anonymous": false }, + { + "type": "event", + "name": "WithdrawalRequestExists", + "inputs": [ + { + "name": "provider", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, { "type": "error", - "name": "NotThisEOA", + "name": "InvalidFallback", "inputs": [] + }, + { + "type": "error", + "name": "NotThisEOA", + "inputs": [ + { + "name": "msgSender", + "type": "address", + "internalType": "address" + }, + { + "name": "thisAddress", + "type": "address", + "internalType": "address" + } + ] } ] diff --git a/contracts-abi/clients/BidderRegistry/BidderRegistry.go b/contracts-abi/clients/BidderRegistry/BidderRegistry.go index a5f95a07c..b498a66b0 100644 --- a/contracts-abi/clients/BidderRegistry/BidderRegistry.go +++ b/contracts-abi/clients/BidderRegistry/BidderRegistry.go @@ -37,7 +37,7 @@ type TimestampOccurrenceOccurrence struct { // BidderregistryMetaData contains all meta data concerning the Bidderregistry contract. var BidderregistryMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"ONE_HUNDRED_PERCENT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PRECISION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"bidPayment\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"bidAmt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"state\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bidderWithdrawalPeriodMs\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"blockTrackerContract\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBlockTracker\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"convertFundsToProviderReward\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"addresspayable\"},{\"name\":\"residualBidPercentAfterDecay\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositAsBidder\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"depositEvenlyAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"depositManagerHash\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositManagerImpl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deposits\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"availableAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"escrowedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalRequestOccurrence\",\"type\":\"tuple\",\"internalType\":\"structTimestampOccurrence.Occurrence\",\"components\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"feePercent\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAccumulatedProtocolFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDeposit\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEscrowedAmount\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProviderAmount\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_protocolFeeRecipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_feePercent\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_blockTracker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_feePayoutPeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_bidderWithdrawalPeriodMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"manuallyWithdrawProtocolFee\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"openBid\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"bidAmt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"preconfManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"protocolFeeTracker\",\"inputs\":[],\"outputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"accumulatedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"lastPayoutTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"payoutTimePeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"providerAmount\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"requestWithdrawalsAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setBlockTrackerContract\",\"inputs\":[{\"name\":\"newBlockTrackerContract\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewFeePayoutPeriod\",\"inputs\":[{\"name\":\"newFeePayoutPeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewFeePercent\",\"inputs\":[{\"name\":\"newFeePercent\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewProtocolFeeRecipient\",\"inputs\":[{\"name\":\"newProtocolFeeRecipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPreconfManager\",\"inputs\":[{\"name\":\"contractAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unlockFunds\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"withdrawAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawProviderAmount\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BidderDeposited\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"depositedAmount\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BidderWithdrawal\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amountWithdrawn\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"amountEscrowed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockTrackerUpdated\",\"inputs\":[{\"name\":\"newBlockTracker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeePayoutPeriodUpdated\",\"inputs\":[{\"name\":\"newFeePayoutPeriod\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeePercentUpdated\",\"inputs\":[{\"name\":\"newFeePercent\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeTransfer\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FundsRewarded\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FundsUnlocked\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"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\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PreconfManagerUpdated\",\"inputs\":[{\"name\":\"newPreconfManager\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProtocolFeeRecipientUpdated\",\"inputs\":[{\"name\":\"newProtocolFeeRecipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransferToBidderFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalRequested\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"BidNotPreConfirmed\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"actualState\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"},{\"name\":\"expectedState\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"}]},{\"type\":\"error\",\"name\":\"BidderWithdrawalTransferFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"DepositAmountIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DepositDoesNotExist\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpectedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FeeRecipientIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyBidderCanWithdraw\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"PayoutPeriodMustBePositive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ProviderAmountIsZero\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SenderIsNotPreconfManager\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"preconfManager\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TransferToProviderFailed\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"TransferToRecipientFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"WithdrawalOccurrenceDoesNotExist\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"WithdrawalOccurrenceExists\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"WithdrawalPeriodNotElapsed\",\"inputs\":[{\"name\":\"currentTimestampMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalTimestampMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalPeriodMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"ONE_HUNDRED_PERCENT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PRECISION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"bidPayment\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"bidAmt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"state\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bidderWithdrawalPeriodMs\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"blockTrackerContract\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBlockTracker\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"convertFundsToProviderReward\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"addresspayable\"},{\"name\":\"residualBidPercentAfterDecay\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositAsBidder\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"depositEvenlyAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"depositManagerHash\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositManagerImpl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deposits\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"availableAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"escrowedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalRequestOccurrence\",\"type\":\"tuple\",\"internalType\":\"structTimestampOccurrence.Occurrence\",\"components\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"feePercent\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAccumulatedProtocolFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDeposit\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEscrowedAmount\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProviderAmount\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_protocolFeeRecipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_feePercent\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_blockTracker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_feePayoutPeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_bidderWithdrawalPeriodMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"manuallyWithdrawProtocolFee\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"openBid\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"bidAmt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"preconfManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"protocolFeeTracker\",\"inputs\":[],\"outputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"accumulatedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"lastPayoutTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"payoutTimePeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"providerAmount\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"requestWithdrawalsAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setBlockTrackerContract\",\"inputs\":[{\"name\":\"newBlockTrackerContract\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDepositManagerImpl\",\"inputs\":[{\"name\":\"_depositManagerImpl\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewFeePayoutPeriod\",\"inputs\":[{\"name\":\"newFeePayoutPeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewFeePercent\",\"inputs\":[{\"name\":\"newFeePercent\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewProtocolFeeRecipient\",\"inputs\":[{\"name\":\"newProtocolFeeRecipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPreconfManager\",\"inputs\":[{\"name\":\"contractAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unlockFunds\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"withdrawAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawProviderAmount\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawalRequestExists\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"BidderDeposited\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"depositedAmount\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BidderWithdrawal\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amountWithdrawn\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"amountEscrowed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockTrackerUpdated\",\"inputs\":[{\"name\":\"newBlockTracker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DepositManagerImplUpdated\",\"inputs\":[{\"name\":\"newDepositManagerImpl\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeePayoutPeriodUpdated\",\"inputs\":[{\"name\":\"newFeePayoutPeriod\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeePercentUpdated\",\"inputs\":[{\"name\":\"newFeePercent\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeTransfer\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FundsRewarded\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FundsUnlocked\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"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\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PreconfManagerUpdated\",\"inputs\":[{\"name\":\"newPreconfManager\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProtocolFeeRecipientUpdated\",\"inputs\":[{\"name\":\"newProtocolFeeRecipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TopUpFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransferToBidderFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalRequested\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"BidNotPreConfirmed\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"actualState\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"},{\"name\":\"expectedState\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"}]},{\"type\":\"error\",\"name\":\"BidderWithdrawalTransferFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"DepositAmountIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DepositDoesNotExist\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DepositManagerNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpectedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FeeRecipientIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyBidderCanWithdraw\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"PayoutPeriodMustBePositive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ProviderAmountIsZero\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SenderIsNotPreconfManager\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"preconfManager\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TransferToProviderFailed\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"TransferToRecipientFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"WithdrawalOccurrenceDoesNotExist\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"WithdrawalOccurrenceExists\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"WithdrawalPeriodNotElapsed\",\"inputs\":[{\"name\":\"currentTimestampMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalTimestampMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalPeriodMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]", } // BidderregistryABI is the input ABI used to generate the binding from. @@ -904,6 +904,37 @@ func (_Bidderregistry *BidderregistryCallerSession) ProxiableUUID() ([32]byte, e return _Bidderregistry.Contract.ProxiableUUID(&_Bidderregistry.CallOpts) } +// WithdrawalRequestExists is a free data retrieval call binding the contract method 0xdff5b43b. +// +// Solidity: function withdrawalRequestExists(address bidder, address provider) view returns(bool) +func (_Bidderregistry *BidderregistryCaller) WithdrawalRequestExists(opts *bind.CallOpts, bidder common.Address, provider common.Address) (bool, error) { + var out []interface{} + err := _Bidderregistry.contract.Call(opts, &out, "withdrawalRequestExists", bidder, provider) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// WithdrawalRequestExists is a free data retrieval call binding the contract method 0xdff5b43b. +// +// Solidity: function withdrawalRequestExists(address bidder, address provider) view returns(bool) +func (_Bidderregistry *BidderregistrySession) WithdrawalRequestExists(bidder common.Address, provider common.Address) (bool, error) { + return _Bidderregistry.Contract.WithdrawalRequestExists(&_Bidderregistry.CallOpts, bidder, provider) +} + +// WithdrawalRequestExists is a free data retrieval call binding the contract method 0xdff5b43b. +// +// Solidity: function withdrawalRequestExists(address bidder, address provider) view returns(bool) +func (_Bidderregistry *BidderregistryCallerSession) WithdrawalRequestExists(bidder common.Address, provider common.Address) (bool, error) { + return _Bidderregistry.Contract.WithdrawalRequestExists(&_Bidderregistry.CallOpts, bidder, provider) +} + // AcceptOwnership is a paid mutator transaction binding the contract method 0x79ba5097. // // Solidity: function acceptOwnership() returns() @@ -1135,6 +1166,27 @@ func (_Bidderregistry *BidderregistryTransactorSession) SetBlockTrackerContract( return _Bidderregistry.Contract.SetBlockTrackerContract(&_Bidderregistry.TransactOpts, newBlockTrackerContract) } +// SetDepositManagerImpl is a paid mutator transaction binding the contract method 0xcffec38e. +// +// Solidity: function setDepositManagerImpl(address _depositManagerImpl) returns() +func (_Bidderregistry *BidderregistryTransactor) SetDepositManagerImpl(opts *bind.TransactOpts, _depositManagerImpl common.Address) (*types.Transaction, error) { + return _Bidderregistry.contract.Transact(opts, "setDepositManagerImpl", _depositManagerImpl) +} + +// SetDepositManagerImpl is a paid mutator transaction binding the contract method 0xcffec38e. +// +// Solidity: function setDepositManagerImpl(address _depositManagerImpl) returns() +func (_Bidderregistry *BidderregistrySession) SetDepositManagerImpl(_depositManagerImpl common.Address) (*types.Transaction, error) { + return _Bidderregistry.Contract.SetDepositManagerImpl(&_Bidderregistry.TransactOpts, _depositManagerImpl) +} + +// SetDepositManagerImpl is a paid mutator transaction binding the contract method 0xcffec38e. +// +// Solidity: function setDepositManagerImpl(address _depositManagerImpl) returns() +func (_Bidderregistry *BidderregistryTransactorSession) SetDepositManagerImpl(_depositManagerImpl common.Address) (*types.Transaction, error) { + return _Bidderregistry.Contract.SetDepositManagerImpl(&_Bidderregistry.TransactOpts, _depositManagerImpl) +} + // SetNewFeePayoutPeriod is a paid mutator transaction binding the contract method 0x599a9d31. // // Solidity: function setNewFeePayoutPeriod(uint256 newFeePayoutPeriod) returns() @@ -1856,6 +1908,150 @@ func (_Bidderregistry *BidderregistryFilterer) ParseBlockTrackerUpdated(log type return event, nil } +// BidderregistryDepositManagerImplUpdatedIterator is returned from FilterDepositManagerImplUpdated and is used to iterate over the raw logs and unpacked data for DepositManagerImplUpdated events raised by the Bidderregistry contract. +type BidderregistryDepositManagerImplUpdatedIterator struct { + Event *BidderregistryDepositManagerImplUpdated // 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 *BidderregistryDepositManagerImplUpdatedIterator) 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(BidderregistryDepositManagerImplUpdated) + 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(BidderregistryDepositManagerImplUpdated) + 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 *BidderregistryDepositManagerImplUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *BidderregistryDepositManagerImplUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// BidderregistryDepositManagerImplUpdated represents a DepositManagerImplUpdated event raised by the Bidderregistry contract. +type BidderregistryDepositManagerImplUpdated struct { + NewDepositManagerImpl common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDepositManagerImplUpdated is a free log retrieval operation binding the contract event 0xc7194fb7830fccf1f1c84dee73d818ee5a693971d1ca30c28c04052df33570e7. +// +// Solidity: event DepositManagerImplUpdated(address indexed newDepositManagerImpl) +func (_Bidderregistry *BidderregistryFilterer) FilterDepositManagerImplUpdated(opts *bind.FilterOpts, newDepositManagerImpl []common.Address) (*BidderregistryDepositManagerImplUpdatedIterator, error) { + + var newDepositManagerImplRule []interface{} + for _, newDepositManagerImplItem := range newDepositManagerImpl { + newDepositManagerImplRule = append(newDepositManagerImplRule, newDepositManagerImplItem) + } + + logs, sub, err := _Bidderregistry.contract.FilterLogs(opts, "DepositManagerImplUpdated", newDepositManagerImplRule) + if err != nil { + return nil, err + } + return &BidderregistryDepositManagerImplUpdatedIterator{contract: _Bidderregistry.contract, event: "DepositManagerImplUpdated", logs: logs, sub: sub}, nil +} + +// WatchDepositManagerImplUpdated is a free log subscription operation binding the contract event 0xc7194fb7830fccf1f1c84dee73d818ee5a693971d1ca30c28c04052df33570e7. +// +// Solidity: event DepositManagerImplUpdated(address indexed newDepositManagerImpl) +func (_Bidderregistry *BidderregistryFilterer) WatchDepositManagerImplUpdated(opts *bind.WatchOpts, sink chan<- *BidderregistryDepositManagerImplUpdated, newDepositManagerImpl []common.Address) (event.Subscription, error) { + + var newDepositManagerImplRule []interface{} + for _, newDepositManagerImplItem := range newDepositManagerImpl { + newDepositManagerImplRule = append(newDepositManagerImplRule, newDepositManagerImplItem) + } + + logs, sub, err := _Bidderregistry.contract.WatchLogs(opts, "DepositManagerImplUpdated", newDepositManagerImplRule) + 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(BidderregistryDepositManagerImplUpdated) + if err := _Bidderregistry.contract.UnpackLog(event, "DepositManagerImplUpdated", 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 +} + +// ParseDepositManagerImplUpdated is a log parse operation binding the contract event 0xc7194fb7830fccf1f1c84dee73d818ee5a693971d1ca30c28c04052df33570e7. +// +// Solidity: event DepositManagerImplUpdated(address indexed newDepositManagerImpl) +func (_Bidderregistry *BidderregistryFilterer) ParseDepositManagerImplUpdated(log types.Log) (*BidderregistryDepositManagerImplUpdated, error) { + event := new(BidderregistryDepositManagerImplUpdated) + if err := _Bidderregistry.contract.UnpackLog(event, "DepositManagerImplUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // BidderregistryFeePayoutPeriodUpdatedIterator is returned from FilterFeePayoutPeriodUpdated and is used to iterate over the raw logs and unpacked data for FeePayoutPeriodUpdated events raised by the Bidderregistry contract. type BidderregistryFeePayoutPeriodUpdatedIterator struct { Event *BidderregistryFeePayoutPeriodUpdated // Event containing the contract specifics and raw log @@ -3477,6 +3673,159 @@ func (_Bidderregistry *BidderregistryFilterer) ParseProtocolFeeRecipientUpdated( return event, nil } +// BidderregistryTopUpFailedIterator is returned from FilterTopUpFailed and is used to iterate over the raw logs and unpacked data for TopUpFailed events raised by the Bidderregistry contract. +type BidderregistryTopUpFailedIterator struct { + Event *BidderregistryTopUpFailed // 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 *BidderregistryTopUpFailedIterator) 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(BidderregistryTopUpFailed) + 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(BidderregistryTopUpFailed) + 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 *BidderregistryTopUpFailedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *BidderregistryTopUpFailedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// BidderregistryTopUpFailed represents a TopUpFailed event raised by the Bidderregistry contract. +type BidderregistryTopUpFailed struct { + Bidder common.Address + Provider common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterTopUpFailed is a free log retrieval operation binding the contract event 0x2ad23691e60cea4efb66fd748ceb8e1ef7b274a70be7aa24d6c1c59cbec254bb. +// +// Solidity: event TopUpFailed(address indexed bidder, address indexed provider) +func (_Bidderregistry *BidderregistryFilterer) FilterTopUpFailed(opts *bind.FilterOpts, bidder []common.Address, provider []common.Address) (*BidderregistryTopUpFailedIterator, error) { + + var bidderRule []interface{} + for _, bidderItem := range bidder { + bidderRule = append(bidderRule, bidderItem) + } + var providerRule []interface{} + for _, providerItem := range provider { + providerRule = append(providerRule, providerItem) + } + + logs, sub, err := _Bidderregistry.contract.FilterLogs(opts, "TopUpFailed", bidderRule, providerRule) + if err != nil { + return nil, err + } + return &BidderregistryTopUpFailedIterator{contract: _Bidderregistry.contract, event: "TopUpFailed", logs: logs, sub: sub}, nil +} + +// WatchTopUpFailed is a free log subscription operation binding the contract event 0x2ad23691e60cea4efb66fd748ceb8e1ef7b274a70be7aa24d6c1c59cbec254bb. +// +// Solidity: event TopUpFailed(address indexed bidder, address indexed provider) +func (_Bidderregistry *BidderregistryFilterer) WatchTopUpFailed(opts *bind.WatchOpts, sink chan<- *BidderregistryTopUpFailed, bidder []common.Address, provider []common.Address) (event.Subscription, error) { + + var bidderRule []interface{} + for _, bidderItem := range bidder { + bidderRule = append(bidderRule, bidderItem) + } + var providerRule []interface{} + for _, providerItem := range provider { + providerRule = append(providerRule, providerItem) + } + + logs, sub, err := _Bidderregistry.contract.WatchLogs(opts, "TopUpFailed", bidderRule, providerRule) + 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(BidderregistryTopUpFailed) + if err := _Bidderregistry.contract.UnpackLog(event, "TopUpFailed", 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 +} + +// ParseTopUpFailed is a log parse operation binding the contract event 0x2ad23691e60cea4efb66fd748ceb8e1ef7b274a70be7aa24d6c1c59cbec254bb. +// +// Solidity: event TopUpFailed(address indexed bidder, address indexed provider) +func (_Bidderregistry *BidderregistryFilterer) ParseTopUpFailed(log types.Log) (*BidderregistryTopUpFailed, error) { + event := new(BidderregistryTopUpFailed) + if err := _Bidderregistry.contract.UnpackLog(event, "TopUpFailed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // BidderregistryTransferToBidderFailedIterator is returned from FilterTransferToBidderFailed and is used to iterate over the raw logs and unpacked data for TransferToBidderFailed events raised by the Bidderregistry contract. type BidderregistryTransferToBidderFailedIterator struct { Event *BidderregistryTransferToBidderFailed // Event containing the contract specifics and raw log diff --git a/contracts-abi/clients/DepositManager/DepositManager.go b/contracts-abi/clients/DepositManager/DepositManager.go index 48ad4a7d2..d4232b2ed 100644 --- a/contracts-abi/clients/DepositManager/DepositManager.go +++ b/contracts-abi/clients/DepositManager/DepositManager.go @@ -31,7 +31,7 @@ var ( // DepositmanagerMetaData contains all meta data concerning the Depositmanager contract. var DepositmanagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_registry\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_minBalance\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"bidderRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minBalance\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setTargetDeposit\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"targetDeposits\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"topUpDeposit\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"CurrentDepositIsSufficient\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DepositToppedUp\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NotEnoughEOABalance\",\"inputs\":[{\"name\":\"balance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"minBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TargetDepositDoesNotExist\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TargetDepositSet\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TopUpReduced\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"needed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"NotThisEOA\",\"inputs\":[]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_registry\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_minBalance\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"bidderRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minBalance\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setTargetDeposit\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"targetDeposits\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"topUpDeposit\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"CurrentBalanceAtOrBelowMin\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"currentBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"minBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CurrentDepositIsSufficient\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"currentDeposit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"targetDeposit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DepositToppedUp\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TargetDepositDoesNotExist\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TargetDepositSet\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TopUpReduced\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"available\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"needed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalRequestExists\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidFallback\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotThisEOA\",\"inputs\":[{\"name\":\"msgSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"thisAddress\",\"type\":\"address\",\"internalType\":\"address\"}]}]", } // DepositmanagerABI is the input ABI used to generate the binding from. @@ -315,6 +315,27 @@ func (_Depositmanager *DepositmanagerTransactorSession) TopUpDeposit(provider co return _Depositmanager.Contract.TopUpDeposit(&_Depositmanager.TransactOpts, provider) } +// Fallback is a paid mutator transaction binding the contract fallback function. +// +// Solidity: fallback() payable returns() +func (_Depositmanager *DepositmanagerTransactor) Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) { + return _Depositmanager.contract.RawTransact(opts, calldata) +} + +// Fallback is a paid mutator transaction binding the contract fallback function. +// +// Solidity: fallback() payable returns() +func (_Depositmanager *DepositmanagerSession) Fallback(calldata []byte) (*types.Transaction, error) { + return _Depositmanager.Contract.Fallback(&_Depositmanager.TransactOpts, calldata) +} + +// Fallback is a paid mutator transaction binding the contract fallback function. +// +// Solidity: fallback() payable returns() +func (_Depositmanager *DepositmanagerTransactorSession) Fallback(calldata []byte) (*types.Transaction, error) { + return _Depositmanager.Contract.Fallback(&_Depositmanager.TransactOpts, calldata) +} + // Receive is a paid mutator transaction binding the contract receive function. // // Solidity: receive() payable returns() @@ -336,9 +357,9 @@ func (_Depositmanager *DepositmanagerTransactorSession) Receive() (*types.Transa return _Depositmanager.Contract.Receive(&_Depositmanager.TransactOpts) } -// DepositmanagerCurrentDepositIsSufficientIterator is returned from FilterCurrentDepositIsSufficient and is used to iterate over the raw logs and unpacked data for CurrentDepositIsSufficient events raised by the Depositmanager contract. -type DepositmanagerCurrentDepositIsSufficientIterator struct { - Event *DepositmanagerCurrentDepositIsSufficient // Event containing the contract specifics and raw log +// DepositmanagerCurrentBalanceAtOrBelowMinIterator is returned from FilterCurrentBalanceAtOrBelowMin and is used to iterate over the raw logs and unpacked data for CurrentBalanceAtOrBelowMin events raised by the Depositmanager contract. +type DepositmanagerCurrentBalanceAtOrBelowMinIterator struct { + Event *DepositmanagerCurrentBalanceAtOrBelowMin // 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 @@ -352,7 +373,7 @@ type DepositmanagerCurrentDepositIsSufficientIterator struct { // 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 *DepositmanagerCurrentDepositIsSufficientIterator) Next() bool { +func (it *DepositmanagerCurrentBalanceAtOrBelowMinIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -361,7 +382,7 @@ func (it *DepositmanagerCurrentDepositIsSufficientIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(DepositmanagerCurrentDepositIsSufficient) + it.Event = new(DepositmanagerCurrentBalanceAtOrBelowMin) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -376,7 +397,7 @@ func (it *DepositmanagerCurrentDepositIsSufficientIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(DepositmanagerCurrentDepositIsSufficient) + it.Event = new(DepositmanagerCurrentBalanceAtOrBelowMin) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -392,51 +413,53 @@ func (it *DepositmanagerCurrentDepositIsSufficientIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *DepositmanagerCurrentDepositIsSufficientIterator) Error() error { +func (it *DepositmanagerCurrentBalanceAtOrBelowMinIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *DepositmanagerCurrentDepositIsSufficientIterator) Close() error { +func (it *DepositmanagerCurrentBalanceAtOrBelowMinIterator) Close() error { it.sub.Unsubscribe() return nil } -// DepositmanagerCurrentDepositIsSufficient represents a CurrentDepositIsSufficient event raised by the Depositmanager contract. -type DepositmanagerCurrentDepositIsSufficient struct { - Provider common.Address - Raw types.Log // Blockchain specific contextual infos +// DepositmanagerCurrentBalanceAtOrBelowMin represents a CurrentBalanceAtOrBelowMin event raised by the Depositmanager contract. +type DepositmanagerCurrentBalanceAtOrBelowMin struct { + Provider common.Address + CurrentBalance *big.Int + MinBalance *big.Int + Raw types.Log // Blockchain specific contextual infos } -// FilterCurrentDepositIsSufficient is a free log retrieval operation binding the contract event 0x0e0f63f6b1bf98e6ec4b29579e24f4cca3d903b37990dcf32aa794ea2ce41832. +// FilterCurrentBalanceAtOrBelowMin is a free log retrieval operation binding the contract event 0x2816f654a045f3dc4fc70d7d509c97bd73066bbf09187a84950040cd3ba28079. // -// Solidity: event CurrentDepositIsSufficient(address indexed provider) -func (_Depositmanager *DepositmanagerFilterer) FilterCurrentDepositIsSufficient(opts *bind.FilterOpts, provider []common.Address) (*DepositmanagerCurrentDepositIsSufficientIterator, error) { +// Solidity: event CurrentBalanceAtOrBelowMin(address indexed provider, uint256 currentBalance, uint256 minBalance) +func (_Depositmanager *DepositmanagerFilterer) FilterCurrentBalanceAtOrBelowMin(opts *bind.FilterOpts, provider []common.Address) (*DepositmanagerCurrentBalanceAtOrBelowMinIterator, error) { var providerRule []interface{} for _, providerItem := range provider { providerRule = append(providerRule, providerItem) } - logs, sub, err := _Depositmanager.contract.FilterLogs(opts, "CurrentDepositIsSufficient", providerRule) + logs, sub, err := _Depositmanager.contract.FilterLogs(opts, "CurrentBalanceAtOrBelowMin", providerRule) if err != nil { return nil, err } - return &DepositmanagerCurrentDepositIsSufficientIterator{contract: _Depositmanager.contract, event: "CurrentDepositIsSufficient", logs: logs, sub: sub}, nil + return &DepositmanagerCurrentBalanceAtOrBelowMinIterator{contract: _Depositmanager.contract, event: "CurrentBalanceAtOrBelowMin", logs: logs, sub: sub}, nil } -// WatchCurrentDepositIsSufficient is a free log subscription operation binding the contract event 0x0e0f63f6b1bf98e6ec4b29579e24f4cca3d903b37990dcf32aa794ea2ce41832. +// WatchCurrentBalanceAtOrBelowMin is a free log subscription operation binding the contract event 0x2816f654a045f3dc4fc70d7d509c97bd73066bbf09187a84950040cd3ba28079. // -// Solidity: event CurrentDepositIsSufficient(address indexed provider) -func (_Depositmanager *DepositmanagerFilterer) WatchCurrentDepositIsSufficient(opts *bind.WatchOpts, sink chan<- *DepositmanagerCurrentDepositIsSufficient, provider []common.Address) (event.Subscription, error) { +// Solidity: event CurrentBalanceAtOrBelowMin(address indexed provider, uint256 currentBalance, uint256 minBalance) +func (_Depositmanager *DepositmanagerFilterer) WatchCurrentBalanceAtOrBelowMin(opts *bind.WatchOpts, sink chan<- *DepositmanagerCurrentBalanceAtOrBelowMin, provider []common.Address) (event.Subscription, error) { var providerRule []interface{} for _, providerItem := range provider { providerRule = append(providerRule, providerItem) } - logs, sub, err := _Depositmanager.contract.WatchLogs(opts, "CurrentDepositIsSufficient", providerRule) + logs, sub, err := _Depositmanager.contract.WatchLogs(opts, "CurrentBalanceAtOrBelowMin", providerRule) if err != nil { return nil, err } @@ -446,8 +469,8 @@ func (_Depositmanager *DepositmanagerFilterer) WatchCurrentDepositIsSufficient(o select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(DepositmanagerCurrentDepositIsSufficient) - if err := _Depositmanager.contract.UnpackLog(event, "CurrentDepositIsSufficient", log); err != nil { + event := new(DepositmanagerCurrentBalanceAtOrBelowMin) + if err := _Depositmanager.contract.UnpackLog(event, "CurrentBalanceAtOrBelowMin", log); err != nil { return err } event.Raw = log @@ -468,21 +491,21 @@ func (_Depositmanager *DepositmanagerFilterer) WatchCurrentDepositIsSufficient(o }), nil } -// ParseCurrentDepositIsSufficient is a log parse operation binding the contract event 0x0e0f63f6b1bf98e6ec4b29579e24f4cca3d903b37990dcf32aa794ea2ce41832. +// ParseCurrentBalanceAtOrBelowMin is a log parse operation binding the contract event 0x2816f654a045f3dc4fc70d7d509c97bd73066bbf09187a84950040cd3ba28079. // -// Solidity: event CurrentDepositIsSufficient(address indexed provider) -func (_Depositmanager *DepositmanagerFilterer) ParseCurrentDepositIsSufficient(log types.Log) (*DepositmanagerCurrentDepositIsSufficient, error) { - event := new(DepositmanagerCurrentDepositIsSufficient) - if err := _Depositmanager.contract.UnpackLog(event, "CurrentDepositIsSufficient", log); err != nil { +// Solidity: event CurrentBalanceAtOrBelowMin(address indexed provider, uint256 currentBalance, uint256 minBalance) +func (_Depositmanager *DepositmanagerFilterer) ParseCurrentBalanceAtOrBelowMin(log types.Log) (*DepositmanagerCurrentBalanceAtOrBelowMin, error) { + event := new(DepositmanagerCurrentBalanceAtOrBelowMin) + if err := _Depositmanager.contract.UnpackLog(event, "CurrentBalanceAtOrBelowMin", log); err != nil { return nil, err } event.Raw = log return event, nil } -// DepositmanagerDepositToppedUpIterator is returned from FilterDepositToppedUp and is used to iterate over the raw logs and unpacked data for DepositToppedUp events raised by the Depositmanager contract. -type DepositmanagerDepositToppedUpIterator struct { - Event *DepositmanagerDepositToppedUp // Event containing the contract specifics and raw log +// DepositmanagerCurrentDepositIsSufficientIterator is returned from FilterCurrentDepositIsSufficient and is used to iterate over the raw logs and unpacked data for CurrentDepositIsSufficient events raised by the Depositmanager contract. +type DepositmanagerCurrentDepositIsSufficientIterator struct { + Event *DepositmanagerCurrentDepositIsSufficient // 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 @@ -496,7 +519,7 @@ type DepositmanagerDepositToppedUpIterator struct { // 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 *DepositmanagerDepositToppedUpIterator) Next() bool { +func (it *DepositmanagerCurrentDepositIsSufficientIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -505,7 +528,7 @@ func (it *DepositmanagerDepositToppedUpIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(DepositmanagerDepositToppedUp) + it.Event = new(DepositmanagerCurrentDepositIsSufficient) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -520,7 +543,7 @@ func (it *DepositmanagerDepositToppedUpIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(DepositmanagerDepositToppedUp) + it.Event = new(DepositmanagerCurrentDepositIsSufficient) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -536,52 +559,53 @@ func (it *DepositmanagerDepositToppedUpIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *DepositmanagerDepositToppedUpIterator) Error() error { +func (it *DepositmanagerCurrentDepositIsSufficientIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *DepositmanagerDepositToppedUpIterator) Close() error { +func (it *DepositmanagerCurrentDepositIsSufficientIterator) Close() error { it.sub.Unsubscribe() return nil } -// DepositmanagerDepositToppedUp represents a DepositToppedUp event raised by the Depositmanager contract. -type DepositmanagerDepositToppedUp struct { - Provider common.Address - Amount *big.Int - Raw types.Log // Blockchain specific contextual infos +// DepositmanagerCurrentDepositIsSufficient represents a CurrentDepositIsSufficient event raised by the Depositmanager contract. +type DepositmanagerCurrentDepositIsSufficient struct { + Provider common.Address + CurrentDeposit *big.Int + TargetDeposit *big.Int + Raw types.Log // Blockchain specific contextual infos } -// FilterDepositToppedUp is a free log retrieval operation binding the contract event 0xb5f2e468403466e947cb06c78c9b37008f6ff157cbf947e7cc8c675e128222e0. +// FilterCurrentDepositIsSufficient is a free log retrieval operation binding the contract event 0xf53ce58639471dc76b2e6d62f3421857c3e3223a97849b7a22a6221f6423600b. // -// Solidity: event DepositToppedUp(address indexed provider, uint256 amount) -func (_Depositmanager *DepositmanagerFilterer) FilterDepositToppedUp(opts *bind.FilterOpts, provider []common.Address) (*DepositmanagerDepositToppedUpIterator, error) { +// Solidity: event CurrentDepositIsSufficient(address indexed provider, uint256 currentDeposit, uint256 targetDeposit) +func (_Depositmanager *DepositmanagerFilterer) FilterCurrentDepositIsSufficient(opts *bind.FilterOpts, provider []common.Address) (*DepositmanagerCurrentDepositIsSufficientIterator, error) { var providerRule []interface{} for _, providerItem := range provider { providerRule = append(providerRule, providerItem) } - logs, sub, err := _Depositmanager.contract.FilterLogs(opts, "DepositToppedUp", providerRule) + logs, sub, err := _Depositmanager.contract.FilterLogs(opts, "CurrentDepositIsSufficient", providerRule) if err != nil { return nil, err } - return &DepositmanagerDepositToppedUpIterator{contract: _Depositmanager.contract, event: "DepositToppedUp", logs: logs, sub: sub}, nil + return &DepositmanagerCurrentDepositIsSufficientIterator{contract: _Depositmanager.contract, event: "CurrentDepositIsSufficient", logs: logs, sub: sub}, nil } -// WatchDepositToppedUp is a free log subscription operation binding the contract event 0xb5f2e468403466e947cb06c78c9b37008f6ff157cbf947e7cc8c675e128222e0. +// WatchCurrentDepositIsSufficient is a free log subscription operation binding the contract event 0xf53ce58639471dc76b2e6d62f3421857c3e3223a97849b7a22a6221f6423600b. // -// Solidity: event DepositToppedUp(address indexed provider, uint256 amount) -func (_Depositmanager *DepositmanagerFilterer) WatchDepositToppedUp(opts *bind.WatchOpts, sink chan<- *DepositmanagerDepositToppedUp, provider []common.Address) (event.Subscription, error) { +// Solidity: event CurrentDepositIsSufficient(address indexed provider, uint256 currentDeposit, uint256 targetDeposit) +func (_Depositmanager *DepositmanagerFilterer) WatchCurrentDepositIsSufficient(opts *bind.WatchOpts, sink chan<- *DepositmanagerCurrentDepositIsSufficient, provider []common.Address) (event.Subscription, error) { var providerRule []interface{} for _, providerItem := range provider { providerRule = append(providerRule, providerItem) } - logs, sub, err := _Depositmanager.contract.WatchLogs(opts, "DepositToppedUp", providerRule) + logs, sub, err := _Depositmanager.contract.WatchLogs(opts, "CurrentDepositIsSufficient", providerRule) if err != nil { return nil, err } @@ -591,8 +615,8 @@ func (_Depositmanager *DepositmanagerFilterer) WatchDepositToppedUp(opts *bind.W select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(DepositmanagerDepositToppedUp) - if err := _Depositmanager.contract.UnpackLog(event, "DepositToppedUp", log); err != nil { + event := new(DepositmanagerCurrentDepositIsSufficient) + if err := _Depositmanager.contract.UnpackLog(event, "CurrentDepositIsSufficient", log); err != nil { return err } event.Raw = log @@ -613,21 +637,21 @@ func (_Depositmanager *DepositmanagerFilterer) WatchDepositToppedUp(opts *bind.W }), nil } -// ParseDepositToppedUp is a log parse operation binding the contract event 0xb5f2e468403466e947cb06c78c9b37008f6ff157cbf947e7cc8c675e128222e0. +// ParseCurrentDepositIsSufficient is a log parse operation binding the contract event 0xf53ce58639471dc76b2e6d62f3421857c3e3223a97849b7a22a6221f6423600b. // -// Solidity: event DepositToppedUp(address indexed provider, uint256 amount) -func (_Depositmanager *DepositmanagerFilterer) ParseDepositToppedUp(log types.Log) (*DepositmanagerDepositToppedUp, error) { - event := new(DepositmanagerDepositToppedUp) - if err := _Depositmanager.contract.UnpackLog(event, "DepositToppedUp", log); err != nil { +// Solidity: event CurrentDepositIsSufficient(address indexed provider, uint256 currentDeposit, uint256 targetDeposit) +func (_Depositmanager *DepositmanagerFilterer) ParseCurrentDepositIsSufficient(log types.Log) (*DepositmanagerCurrentDepositIsSufficient, error) { + event := new(DepositmanagerCurrentDepositIsSufficient) + if err := _Depositmanager.contract.UnpackLog(event, "CurrentDepositIsSufficient", log); err != nil { return nil, err } event.Raw = log return event, nil } -// DepositmanagerNotEnoughEOABalanceIterator is returned from FilterNotEnoughEOABalance and is used to iterate over the raw logs and unpacked data for NotEnoughEOABalance events raised by the Depositmanager contract. -type DepositmanagerNotEnoughEOABalanceIterator struct { - Event *DepositmanagerNotEnoughEOABalance // Event containing the contract specifics and raw log +// DepositmanagerDepositToppedUpIterator is returned from FilterDepositToppedUp and is used to iterate over the raw logs and unpacked data for DepositToppedUp events raised by the Depositmanager contract. +type DepositmanagerDepositToppedUpIterator struct { + Event *DepositmanagerDepositToppedUp // 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 @@ -641,7 +665,7 @@ type DepositmanagerNotEnoughEOABalanceIterator struct { // 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 *DepositmanagerNotEnoughEOABalanceIterator) Next() bool { +func (it *DepositmanagerDepositToppedUpIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -650,7 +674,7 @@ func (it *DepositmanagerNotEnoughEOABalanceIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(DepositmanagerNotEnoughEOABalance) + it.Event = new(DepositmanagerDepositToppedUp) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -665,7 +689,7 @@ func (it *DepositmanagerNotEnoughEOABalanceIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(DepositmanagerNotEnoughEOABalance) + it.Event = new(DepositmanagerDepositToppedUp) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -681,42 +705,52 @@ func (it *DepositmanagerNotEnoughEOABalanceIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *DepositmanagerNotEnoughEOABalanceIterator) Error() error { +func (it *DepositmanagerDepositToppedUpIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *DepositmanagerNotEnoughEOABalanceIterator) Close() error { +func (it *DepositmanagerDepositToppedUpIterator) Close() error { it.sub.Unsubscribe() return nil } -// DepositmanagerNotEnoughEOABalance represents a NotEnoughEOABalance event raised by the Depositmanager contract. -type DepositmanagerNotEnoughEOABalance struct { - Balance *big.Int - MinBalance *big.Int - Raw types.Log // Blockchain specific contextual infos +// DepositmanagerDepositToppedUp represents a DepositToppedUp event raised by the Depositmanager contract. +type DepositmanagerDepositToppedUp struct { + Provider common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos } -// FilterNotEnoughEOABalance is a free log retrieval operation binding the contract event 0x41147fb3ac13167049741c456ee1778e9815cc1113d125adccd9a8bfe546ef61. +// FilterDepositToppedUp is a free log retrieval operation binding the contract event 0xb5f2e468403466e947cb06c78c9b37008f6ff157cbf947e7cc8c675e128222e0. // -// Solidity: event NotEnoughEOABalance(uint256 balance, uint256 minBalance) -func (_Depositmanager *DepositmanagerFilterer) FilterNotEnoughEOABalance(opts *bind.FilterOpts) (*DepositmanagerNotEnoughEOABalanceIterator, error) { +// Solidity: event DepositToppedUp(address indexed provider, uint256 amount) +func (_Depositmanager *DepositmanagerFilterer) FilterDepositToppedUp(opts *bind.FilterOpts, provider []common.Address) (*DepositmanagerDepositToppedUpIterator, error) { - logs, sub, err := _Depositmanager.contract.FilterLogs(opts, "NotEnoughEOABalance") + var providerRule []interface{} + for _, providerItem := range provider { + providerRule = append(providerRule, providerItem) + } + + logs, sub, err := _Depositmanager.contract.FilterLogs(opts, "DepositToppedUp", providerRule) if err != nil { return nil, err } - return &DepositmanagerNotEnoughEOABalanceIterator{contract: _Depositmanager.contract, event: "NotEnoughEOABalance", logs: logs, sub: sub}, nil + return &DepositmanagerDepositToppedUpIterator{contract: _Depositmanager.contract, event: "DepositToppedUp", logs: logs, sub: sub}, nil } -// WatchNotEnoughEOABalance is a free log subscription operation binding the contract event 0x41147fb3ac13167049741c456ee1778e9815cc1113d125adccd9a8bfe546ef61. +// WatchDepositToppedUp is a free log subscription operation binding the contract event 0xb5f2e468403466e947cb06c78c9b37008f6ff157cbf947e7cc8c675e128222e0. // -// Solidity: event NotEnoughEOABalance(uint256 balance, uint256 minBalance) -func (_Depositmanager *DepositmanagerFilterer) WatchNotEnoughEOABalance(opts *bind.WatchOpts, sink chan<- *DepositmanagerNotEnoughEOABalance) (event.Subscription, error) { +// Solidity: event DepositToppedUp(address indexed provider, uint256 amount) +func (_Depositmanager *DepositmanagerFilterer) WatchDepositToppedUp(opts *bind.WatchOpts, sink chan<- *DepositmanagerDepositToppedUp, provider []common.Address) (event.Subscription, error) { + + var providerRule []interface{} + for _, providerItem := range provider { + providerRule = append(providerRule, providerItem) + } - logs, sub, err := _Depositmanager.contract.WatchLogs(opts, "NotEnoughEOABalance") + logs, sub, err := _Depositmanager.contract.WatchLogs(opts, "DepositToppedUp", providerRule) if err != nil { return nil, err } @@ -726,8 +760,8 @@ func (_Depositmanager *DepositmanagerFilterer) WatchNotEnoughEOABalance(opts *bi select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(DepositmanagerNotEnoughEOABalance) - if err := _Depositmanager.contract.UnpackLog(event, "NotEnoughEOABalance", log); err != nil { + event := new(DepositmanagerDepositToppedUp) + if err := _Depositmanager.contract.UnpackLog(event, "DepositToppedUp", log); err != nil { return err } event.Raw = log @@ -748,12 +782,12 @@ func (_Depositmanager *DepositmanagerFilterer) WatchNotEnoughEOABalance(opts *bi }), nil } -// ParseNotEnoughEOABalance is a log parse operation binding the contract event 0x41147fb3ac13167049741c456ee1778e9815cc1113d125adccd9a8bfe546ef61. +// ParseDepositToppedUp is a log parse operation binding the contract event 0xb5f2e468403466e947cb06c78c9b37008f6ff157cbf947e7cc8c675e128222e0. // -// Solidity: event NotEnoughEOABalance(uint256 balance, uint256 minBalance) -func (_Depositmanager *DepositmanagerFilterer) ParseNotEnoughEOABalance(log types.Log) (*DepositmanagerNotEnoughEOABalance, error) { - event := new(DepositmanagerNotEnoughEOABalance) - if err := _Depositmanager.contract.UnpackLog(event, "NotEnoughEOABalance", log); err != nil { +// Solidity: event DepositToppedUp(address indexed provider, uint256 amount) +func (_Depositmanager *DepositmanagerFilterer) ParseDepositToppedUp(log types.Log) (*DepositmanagerDepositToppedUp, error) { + event := new(DepositmanagerDepositToppedUp) + if err := _Depositmanager.contract.UnpackLog(event, "DepositToppedUp", log); err != nil { return nil, err } event.Raw = log @@ -1119,14 +1153,14 @@ func (it *DepositmanagerTopUpReducedIterator) Close() error { // DepositmanagerTopUpReduced represents a TopUpReduced event raised by the Depositmanager contract. type DepositmanagerTopUpReduced struct { Provider common.Address - Needed *big.Int Available *big.Int + Needed *big.Int Raw types.Log // Blockchain specific contextual infos } // FilterTopUpReduced is a free log retrieval operation binding the contract event 0x3d3e22cac7f9bc8da17ff9b43a14bbb7b8dd50ec92f62faebf162eb8d832bcc2. // -// Solidity: event TopUpReduced(address indexed provider, uint256 needed, uint256 available) +// Solidity: event TopUpReduced(address indexed provider, uint256 available, uint256 needed) func (_Depositmanager *DepositmanagerFilterer) FilterTopUpReduced(opts *bind.FilterOpts, provider []common.Address) (*DepositmanagerTopUpReducedIterator, error) { var providerRule []interface{} @@ -1143,7 +1177,7 @@ func (_Depositmanager *DepositmanagerFilterer) FilterTopUpReduced(opts *bind.Fil // WatchTopUpReduced is a free log subscription operation binding the contract event 0x3d3e22cac7f9bc8da17ff9b43a14bbb7b8dd50ec92f62faebf162eb8d832bcc2. // -// Solidity: event TopUpReduced(address indexed provider, uint256 needed, uint256 available) +// Solidity: event TopUpReduced(address indexed provider, uint256 available, uint256 needed) func (_Depositmanager *DepositmanagerFilterer) WatchTopUpReduced(opts *bind.WatchOpts, sink chan<- *DepositmanagerTopUpReduced, provider []common.Address) (event.Subscription, error) { var providerRule []interface{} @@ -1185,7 +1219,7 @@ func (_Depositmanager *DepositmanagerFilterer) WatchTopUpReduced(opts *bind.Watc // ParseTopUpReduced is a log parse operation binding the contract event 0x3d3e22cac7f9bc8da17ff9b43a14bbb7b8dd50ec92f62faebf162eb8d832bcc2. // -// Solidity: event TopUpReduced(address indexed provider, uint256 needed, uint256 available) +// Solidity: event TopUpReduced(address indexed provider, uint256 available, uint256 needed) func (_Depositmanager *DepositmanagerFilterer) ParseTopUpReduced(log types.Log) (*DepositmanagerTopUpReduced, error) { event := new(DepositmanagerTopUpReduced) if err := _Depositmanager.contract.UnpackLog(event, "TopUpReduced", log); err != nil { @@ -1194,3 +1228,147 @@ func (_Depositmanager *DepositmanagerFilterer) ParseTopUpReduced(log types.Log) event.Raw = log return event, nil } + +// DepositmanagerWithdrawalRequestExistsIterator is returned from FilterWithdrawalRequestExists and is used to iterate over the raw logs and unpacked data for WithdrawalRequestExists events raised by the Depositmanager contract. +type DepositmanagerWithdrawalRequestExistsIterator struct { + Event *DepositmanagerWithdrawalRequestExists // 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 *DepositmanagerWithdrawalRequestExistsIterator) 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(DepositmanagerWithdrawalRequestExists) + 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(DepositmanagerWithdrawalRequestExists) + 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 *DepositmanagerWithdrawalRequestExistsIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DepositmanagerWithdrawalRequestExistsIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DepositmanagerWithdrawalRequestExists represents a WithdrawalRequestExists event raised by the Depositmanager contract. +type DepositmanagerWithdrawalRequestExists struct { + Provider common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterWithdrawalRequestExists is a free log retrieval operation binding the contract event 0xd172492ccc8c62ae9847c209253d7ecc901a1e00e4752533ae796fe3a606b4c8. +// +// Solidity: event WithdrawalRequestExists(address indexed provider) +func (_Depositmanager *DepositmanagerFilterer) FilterWithdrawalRequestExists(opts *bind.FilterOpts, provider []common.Address) (*DepositmanagerWithdrawalRequestExistsIterator, error) { + + var providerRule []interface{} + for _, providerItem := range provider { + providerRule = append(providerRule, providerItem) + } + + logs, sub, err := _Depositmanager.contract.FilterLogs(opts, "WithdrawalRequestExists", providerRule) + if err != nil { + return nil, err + } + return &DepositmanagerWithdrawalRequestExistsIterator{contract: _Depositmanager.contract, event: "WithdrawalRequestExists", logs: logs, sub: sub}, nil +} + +// WatchWithdrawalRequestExists is a free log subscription operation binding the contract event 0xd172492ccc8c62ae9847c209253d7ecc901a1e00e4752533ae796fe3a606b4c8. +// +// Solidity: event WithdrawalRequestExists(address indexed provider) +func (_Depositmanager *DepositmanagerFilterer) WatchWithdrawalRequestExists(opts *bind.WatchOpts, sink chan<- *DepositmanagerWithdrawalRequestExists, provider []common.Address) (event.Subscription, error) { + + var providerRule []interface{} + for _, providerItem := range provider { + providerRule = append(providerRule, providerItem) + } + + logs, sub, err := _Depositmanager.contract.WatchLogs(opts, "WithdrawalRequestExists", providerRule) + 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(DepositmanagerWithdrawalRequestExists) + if err := _Depositmanager.contract.UnpackLog(event, "WithdrawalRequestExists", 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 +} + +// ParseWithdrawalRequestExists is a log parse operation binding the contract event 0xd172492ccc8c62ae9847c209253d7ecc901a1e00e4752533ae796fe3a606b4c8. +// +// Solidity: event WithdrawalRequestExists(address indexed provider) +func (_Depositmanager *DepositmanagerFilterer) ParseWithdrawalRequestExists(log types.Log) (*DepositmanagerWithdrawalRequestExists, error) { + event := new(DepositmanagerWithdrawalRequestExists) + if err := _Depositmanager.contract.UnpackLog(event, "WithdrawalRequestExists", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} From ec9a6fe79d04e31cf91d620b0bb337425fadd96b Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Tue, 5 Aug 2025 18:21:52 -0700 Subject: [PATCH 022/117] nit --- contracts/contracts/core/PreconfManager.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/contracts/contracts/core/PreconfManager.sol b/contracts/contracts/core/PreconfManager.sol index 4bd1f8118..0d85ea441 100644 --- a/contracts/contracts/core/PreconfManager.sol +++ b/contracts/contracts/core/PreconfManager.sol @@ -18,7 +18,6 @@ import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; /** * @title PreconfManager - A contract for managing preconfirmation commitments and bids. * @notice This contract allows bidders to make precommitments and bids and provides a mechanism for the oracle to verify and process them. - * @notice IBidderRegistry interface has changed, so this contract will need upgrade or redeployment on mainnet. */ contract PreconfManager is IPreconfManager, From fbe15932f5d537c624d56e457db8bb8590a6deef Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Tue, 5 Aug 2025 22:06:56 -0700 Subject: [PATCH 023/117] add BidAmountReduced + test_OpenBid_GracefulTopUpFailure --- contracts/contracts/core/BidderRegistry.sol | 1 + .../contracts/interfaces/IBidderRegistry.sol | 3 ++ contracts/test/core/BidderRegistryTest.sol | 28 +++++++++++++++++++ 3 files changed, 32 insertions(+) diff --git a/contracts/contracts/core/BidderRegistry.sol b/contracts/contracts/core/BidderRegistry.sol index 886061287..e7863fdd2 100644 --- a/contracts/contracts/core/BidderRegistry.sol +++ b/contracts/contracts/core/BidderRegistry.sol @@ -268,6 +268,7 @@ contract BidderRegistry is // This operation shouldn't happen in normal flow. See provider node's CheckAndDeductDeposit function // which checks if a bidder's deposit covers the bid amount. bidAmt = deposit.availableAmount; + emit BidAmountReduced(bidder, provider, bidAmt); } if (bidAmt > 0) { diff --git a/contracts/contracts/interfaces/IBidderRegistry.sol b/contracts/contracts/interfaces/IBidderRegistry.sol index 0cee3098c..0f4655ce9 100644 --- a/contracts/contracts/interfaces/IBidderRegistry.sol +++ b/contracts/contracts/interfaces/IBidderRegistry.sol @@ -101,6 +101,9 @@ interface IBidderRegistry { /// @dev Event emitted when a bidder's top-up instance fails during openBid event TopUpFailed(address indexed bidder, address indexed provider); + /// @dev Event emitted when an opened bid amount is reduced due to the bidder not having enough funds deposited + event BidAmountReduced(address indexed bidder, address indexed provider, uint256 indexed newBidAmt); + /// @dev Error emitted when the sender is not the preconfManager error SenderIsNotPreconfManager(address sender, address preconfManager); diff --git a/contracts/test/core/BidderRegistryTest.sol b/contracts/test/core/BidderRegistryTest.sol index 05097e9f6..0488a23f0 100644 --- a/contracts/test/core/BidderRegistryTest.sol +++ b/contracts/test/core/BidderRegistryTest.sol @@ -791,6 +791,27 @@ contract BidderRegistryTest is Test { assertEq(depositAfter, 1.5 ether, "deposit should be 1.5 ether"); assertEq(alice.balance, 0.25 ether, "alice should have 0.25 ether"); } + + function test_OpenBid_GracefulTopUpFailure() public { + AlwaysRevertsDepositManager alwaysRevertsDepositManager = new AlwaysRevertsDepositManager(); + vm.prank(bidderRegistry.owner()); + bidderRegistry.setDepositManagerImpl(address(alwaysRevertsDepositManager)); + + uint256 alicePK = uint256(0xA11CE); + address alice = vm.addr(alicePK); + vm.deal(alice, 10 ether); + vm.signAndAttachDelegation(address(alwaysRevertsDepositManager), alicePK); + + address provider = vm.addr(4); + + vm.prank(alice); + bidderRegistry.depositAsBidder{value: 1 ether}(provider); + + vm.expectEmit(true, true, true, true); + emit IBidderRegistry.TopUpFailed(alice, provider); + vm.prank(bidderRegistry.preconfManager()); + bidderRegistry.openBid(keccak256("commitment"), 1 ether, alice, provider); + } } contract IncorrectBidderContract { @@ -800,3 +821,10 @@ contract IncorrectBidderContract { revert("control flow should not reach here"); } } + +contract AlwaysRevertsDepositManager { + error RevertErr(address provider); + function topUpDeposit(address provider) public pure { + revert RevertErr(provider); + } +} From 7bda08968c407b799f8353d39824598c612b1341 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 6 Aug 2025 11:24:15 -0700 Subject: [PATCH 024/117] Update BidderRegistry.sol --- contracts/contracts/core/BidderRegistry.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/contracts/core/BidderRegistry.sol b/contracts/contracts/core/BidderRegistry.sol index e7863fdd2..f479469cd 100644 --- a/contracts/contracts/core/BidderRegistry.sol +++ b/contracts/contracts/core/BidderRegistry.sol @@ -255,7 +255,7 @@ contract BidderRegistry is uint256 bidAmt, address bidder, address provider - ) external onlyPreconfManager whenNotPaused depositManagerIsSet returns (uint256) { + ) external onlyPreconfManager whenNotPaused nonReentrant depositManagerIsSet returns (uint256) { BidState storage bidState = bidPayment[commitmentDigest]; if (bidState.state != State.Undefined) { return bidAmt; From 37849d4125d44b46cd6181e2546e2039fbdc66b6 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 6 Aug 2025 12:02:02 -0700 Subject: [PATCH 025/117] mas tests --- contracts/contracts/core/BidderRegistry.sol | 7 ++++--- contracts/contracts/interfaces/IBidderRegistry.sol | 3 +++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/contracts/contracts/core/BidderRegistry.sol b/contracts/contracts/core/BidderRegistry.sol index f479469cd..80ac14415 100644 --- a/contracts/contracts/core/BidderRegistry.sol +++ b/contracts/contracts/core/BidderRegistry.sol @@ -98,11 +98,12 @@ contract BidderRegistry is */ function depositEvenlyAsBidder(address[] calldata providers) external payable whenNotPaused { require(msg.value != 0, DepositAmountIsZero()); + uint256 len = providers.length; + require(len > 0, NoProviders()); - uint256 amountToDeposit = msg.value / providers.length; - uint256 remainingAmount = msg.value % providers.length; // to handle rounding issues + uint256 amountToDeposit = msg.value / len; + uint256 remainingAmount = msg.value % len; // to handle rounding issues - uint256 len = providers.length; for (uint16 i = 0; i < len; ++i) { address provider = providers[i]; uint256 amount = amountToDeposit; diff --git a/contracts/contracts/interfaces/IBidderRegistry.sol b/contracts/contracts/interfaces/IBidderRegistry.sol index 0f4655ce9..bba3c6565 100644 --- a/contracts/contracts/interfaces/IBidderRegistry.sol +++ b/contracts/contracts/interfaces/IBidderRegistry.sol @@ -125,6 +125,9 @@ interface IBidderRegistry { /// @dev Error emitted when the bidder tries to deposit 0 amount error DepositAmountIsZero(); + /// @dev Error emitted when no providers are given as an argument to depositEvenlyAsBidder + error NoProviders(); + /// @dev Error emitted when withdrawal transfer failed error BidderWithdrawalTransferFailed(address bidder, uint256 amount); From 01f9912f8aa155f35f29ec41a4db06e0e6f000f2 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 6 Aug 2025 12:02:20 -0700 Subject: [PATCH 026/117] mas tests --- contracts/test/core/BidderRegistryTest.sol | 97 ++++++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/contracts/test/core/BidderRegistryTest.sol b/contracts/test/core/BidderRegistryTest.sol index 0488a23f0..7c160f0cf 100644 --- a/contracts/test/core/BidderRegistryTest.sol +++ b/contracts/test/core/BidderRegistryTest.sol @@ -10,6 +10,7 @@ import {WindowFromBlockNumber} from "../../contracts/utils/WindowFromBlockNumber import {ProviderRegistry} from "../../contracts/core/ProviderRegistry.sol"; import {DepositManager} from "../../contracts/core/DepositManager.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; +import {TimestampOccurrence} from "../../contracts/utils/Occurrence.sol"; contract BidderRegistryTest is Test { uint256 public testNumber; @@ -812,6 +813,102 @@ contract BidderRegistryTest is Test { vm.prank(bidderRegistry.preconfManager()); bidderRegistry.openBid(keccak256("commitment"), 1 ether, alice, provider); } + + function test_depositEvenlyAsBidder_DepositAmountIsZero() public { + address provider = vm.addr(8); + + vm.expectRevert(IBidderRegistry.DepositAmountIsZero.selector); + address[] memory providers = new address[](1); + providers[0] = provider; + vm.prank(bidder); + bidderRegistry.depositEvenlyAsBidder{value: 0 ether}(providers); + } + + function test_depositEvenlyAsBidder_NoProviders() public { + address[] memory providers = new address[](0); + vm.expectRevert(IBidderRegistry.NoProviders.selector); + vm.prank(bidder); + bidderRegistry.depositEvenlyAsBidder{value: 1 ether}(providers); + } + + function test_depositEvenlyAsBidder_TwoProviders_EvenDistribution() public { + address provider1 = vm.addr(8); + address provider2 = vm.addr(9); + + address[] memory providers = new address[](2); + providers[0] = provider1; + providers[1] = provider2; + + IBidderRegistry.Deposit memory deposit1 = getDepositStruct(bidder, provider1); + IBidderRegistry.Deposit memory deposit2 = getDepositStruct(bidder, provider2); + assertFalse(deposit1.exists, "deposit1 should not exist"); + assertFalse(deposit2.exists, "deposit2 should not exist"); + + vm.expectEmit(true, true, true, true); + emit IBidderRegistry.BidderDeposited(bidder, provider1, 5 ether); + vm.expectEmit(true, true, true, true); + emit IBidderRegistry.BidderDeposited(bidder, provider2, 5 ether); + + vm.deal(bidder, 10 ether); + vm.prank(bidder); + bidderRegistry.depositEvenlyAsBidder{value: 10 ether}(providers); + + deposit1 = getDepositStruct(bidder, provider1); + deposit2 = getDepositStruct(bidder, provider2); + assertTrue(deposit1.exists, "deposit1 should exist"); + assertTrue(deposit2.exists, "deposit2 should exist"); + assertEq(deposit1.availableAmount, 5 ether, "deposit1 should be 5 ether"); + assertEq(deposit2.availableAmount, 5 ether, "deposit2 should be 5 ether"); + assertEq(deposit1.escrowedAmount, 0 ether, "deposit1 should have 0 escrowed amount"); + assertEq(deposit2.escrowedAmount, 0 ether, "deposit2 should have 0 escrowed amount"); + assertFalse(deposit1.withdrawalRequestOccurrence.exists, "deposit1 should have no withdrawal request"); + assertFalse(deposit2.withdrawalRequestOccurrence.exists, "deposit2 should have no withdrawal request"); + + assertEq(bidder.balance, 0 ether, "bidder should have 0 ether left"); + } + + function test_depositEvenlyAsBidder_TwoProviders_NonDivisibleAmount() public { + test_depositEvenlyAsBidder_TwoProviders_EvenDistribution(); + + address provider1 = vm.addr(8); + address provider2 = vm.addr(9); + address[] memory providers = new address[](2); + providers[0] = provider1; + providers[1] = provider2; + + IBidderRegistry.Deposit memory deposit1Before = getDepositStruct(bidder, provider1); + IBidderRegistry.Deposit memory deposit2Before = getDepositStruct(bidder, provider2); + + vm.expectEmit(true, true, true, true); + emit IBidderRegistry.BidderDeposited(bidder, provider1, 1 wei); + vm.expectEmit(true, true, true, true); + emit IBidderRegistry.BidderDeposited(bidder, provider2, 2 wei); + + vm.deal(bidder, 3 wei); + vm.prank(bidder); + bidderRegistry.depositEvenlyAsBidder{value: 3 wei}(providers); + + IBidderRegistry.Deposit memory deposit1After = getDepositStruct(bidder, provider1); + IBidderRegistry.Deposit memory deposit2After = getDepositStruct(bidder, provider2); + + assertTrue(deposit1After.exists, "deposit1 should still exist"); + assertTrue(deposit2After.exists, "deposit2 should still exist"); + assertEq(deposit1After.availableAmount, deposit1Before.availableAmount + 1 wei, "deposit1 should be 1 wei more than before"); + assertEq(deposit2After.availableAmount, deposit2Before.availableAmount + 2 wei, "deposit2 should be 2 wei more than before"); + assertEq(deposit1After.escrowedAmount, deposit1Before.escrowedAmount, "escrowed amount should be the same as before"); + assertEq(deposit2After.escrowedAmount, deposit2Before.escrowedAmount, "escrowed amount should be the same as before"); + assertFalse(deposit1After.withdrawalRequestOccurrence.exists, "deposit1 should still have no withdrawal request"); + assertFalse(deposit2After.withdrawalRequestOccurrence.exists, "deposit2 should still have no withdrawal request"); + } + + function getDepositStruct(address bidderArg, address providerArg) public view returns (IBidderRegistry.Deposit memory deposit) { + (deposit.exists, deposit.availableAmount, deposit.escrowedAmount, deposit.withdrawalRequestOccurrence) = bidderRegistry.deposits(bidderArg, providerArg); + return deposit; + } + + // TODO: Various tests for requestWithdrawalsAsBidder + // TODO: Various tests for withdrawAsBidder + // TODO: Test staking/withdraw cycle for bidder to same provider } contract IncorrectBidderContract { From 6977a73a79abaf98fc92169612ed875701b024b6 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 6 Aug 2025 12:03:36 -0700 Subject: [PATCH 027/117] nit --- contracts/contracts/core/BidderRegistry.sol | 2 -- 1 file changed, 2 deletions(-) diff --git a/contracts/contracts/core/BidderRegistry.sol b/contracts/contracts/core/BidderRegistry.sol index 80ac14415..9ec04827a 100644 --- a/contracts/contracts/core/BidderRegistry.sol +++ b/contracts/contracts/core/BidderRegistry.sol @@ -442,8 +442,6 @@ contract BidderRegistry is emit BidderDeposited(bidder, provider, amount); } - - // solhint-disable-next-line no-empty-blocks function _authorizeUpgrade(address) internal override onlyOwner {} } From a130511838a8d86d0c9b7a576f374e7cff800a92 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 6 Aug 2025 12:43:36 -0700 Subject: [PATCH 028/117] small contract changes + more tests --- contracts/contracts/core/BidderRegistry.sol | 10 ++- .../contracts/interfaces/IBidderRegistry.sol | 8 +- contracts/test/core/BidderRegistryTest.sol | 87 +++++++++++++++++-- 3 files changed, 95 insertions(+), 10 deletions(-) diff --git a/contracts/contracts/core/BidderRegistry.sol b/contracts/contracts/core/BidderRegistry.sol index 9ec04827a..9e2dfc31e 100644 --- a/contracts/contracts/core/BidderRegistry.sol +++ b/contracts/contracts/core/BidderRegistry.sol @@ -121,12 +121,15 @@ contract BidderRegistry is function requestWithdrawalsAsBidder(address[] calldata providers) external nonReentrant whenNotPaused { address bidder = msg.sender; uint256 len = providers.length; + require(len > 0, NoProviders()); + for (uint256 i = 0; i < len; ++i) { address provider = providers[i]; Deposit storage deposit = deposits[bidder][provider]; require(deposit.exists, DepositDoesNotExist(bidder, provider)); TimestampOccurrence.captureOccurrence(deposit.withdrawalRequestOccurrence); - emit WithdrawalRequested(bidder, provider, deposit.withdrawalRequestOccurrence.timestamp); + emit WithdrawalRequested(bidder, provider, deposit.availableAmount, deposit.escrowedAmount, + deposit.withdrawalRequestOccurrence.timestamp); } } @@ -139,6 +142,8 @@ contract BidderRegistry is uint256 totalAmount; uint256 len = providers.length; + require(len > 0, NoProviders()); + for (uint256 i = 0; i < len; ++i) { address provider = providers[i]; Deposit storage deposit = deposits[bidder][provider]; @@ -427,7 +432,8 @@ contract BidderRegistry is address bidder = msg.sender; Deposit storage deposit = deposits[bidder][provider]; if (deposit.exists) { - require(!deposit.withdrawalRequestOccurrence.exists, WithdrawalOccurrenceExists(bidder, provider)); + require(!deposit.withdrawalRequestOccurrence.exists, + WithdrawalOccurrenceExists(bidder, provider, deposit.withdrawalRequestOccurrence.timestamp)); deposit.availableAmount += amount; } else { deposits[bidder][provider] = Deposit({ diff --git a/contracts/contracts/interfaces/IBidderRegistry.sol b/contracts/contracts/interfaces/IBidderRegistry.sol index bba3c6565..f4b4b8e26 100644 --- a/contracts/contracts/interfaces/IBidderRegistry.sol +++ b/contracts/contracts/interfaces/IBidderRegistry.sol @@ -50,6 +50,8 @@ interface IBidderRegistry { event WithdrawalRequested( address indexed bidder, address indexed provider, + uint256 availableAmount, + uint256 escrowedAmount, uint256 indexed timestamp ); @@ -74,7 +76,7 @@ interface IBidderRegistry { address indexed bidder, address indexed provider, uint256 indexed amountWithdrawn, - uint256 amountEscrowed + uint256 amountStillEscrowed ); /// @dev Event emitted when the deposit manager implementation is updated @@ -125,7 +127,7 @@ interface IBidderRegistry { /// @dev Error emitted when the bidder tries to deposit 0 amount error DepositAmountIsZero(); - /// @dev Error emitted when no providers are given as an argument to depositEvenlyAsBidder + /// @dev Error emitted when no providers are given as an argument error NoProviders(); /// @dev Error emitted when withdrawal transfer failed @@ -138,7 +140,7 @@ interface IBidderRegistry { error DepositDoesNotExist(address bidder, address provider); /// @dev Error emitted when a withdrawal occurrence exists - error WithdrawalOccurrenceExists(address bidder, address provider); + error WithdrawalOccurrenceExists(address bidder, address provider, uint256 requestTimestamp); /// @dev Error emitted when a withdrawal occurrence does not exist error WithdrawalOccurrenceDoesNotExist(address bidder, address provider); diff --git a/contracts/test/core/BidderRegistryTest.sol b/contracts/test/core/BidderRegistryTest.sol index 7c160f0cf..c594a5bdc 100644 --- a/contracts/test/core/BidderRegistryTest.sol +++ b/contracts/test/core/BidderRegistryTest.sol @@ -25,7 +25,6 @@ contract BidderRegistryTest is Test { ProviderRegistry public providerRegistry; event BidderDeposited(address indexed bidder, address indexed provider, uint256 indexed depositedAmount); - event WithdrawalRequested(address indexed bidder, address indexed provider, uint256 indexed withdrawalRequestTimestamp); event BidderWithdrawal(address indexed bidder, address indexed provider, uint256 indexed withdrawalAmount, uint256 escrowedAmount); event FeeTransfer(uint256 amount, address indexed recipient); @@ -393,11 +392,11 @@ contract BidderRegistryTest is Test { blockTracker.recordL1Block(blockNumber, "test"); vm.expectEmit(true, false, false, true); - emit WithdrawalRequested(bidder, provider1, block.timestamp); + emit IBidderRegistry.WithdrawalRequested(bidder, provider1, 1 ether, 0, block.timestamp); vm.expectEmit(true, false, false, true); - emit WithdrawalRequested(bidder, provider2, block.timestamp); + emit IBidderRegistry.WithdrawalRequested(bidder, provider2, 1 ether, 0, block.timestamp); vm.expectEmit(true, false, false, true); - emit WithdrawalRequested(bidder, provider3, block.timestamp); + emit IBidderRegistry.WithdrawalRequested(bidder, provider3, 1 ether, 0, block.timestamp); vm.prank(bidder); bidderRegistry.requestWithdrawalsAsBidder(providers); @@ -901,12 +900,90 @@ contract BidderRegistryTest is Test { assertFalse(deposit2After.withdrawalRequestOccurrence.exists, "deposit2 should still have no withdrawal request"); } + function test_requestWithdrawalsAsBidder_NoProviders() public { + address[] memory providers = new address[](0); + vm.expectRevert(IBidderRegistry.NoProviders.selector); + vm.prank(bidder); + bidderRegistry.requestWithdrawalsAsBidder(providers); + } + + function test_requestWithdrawalsAsBidder_DepositDoesNotExist() public { + address provider = vm.addr(8); + address[] memory providers = new address[](1); + providers[0] = provider; + vm.expectRevert(abi.encodeWithSelector(IBidderRegistry.DepositDoesNotExist.selector, bidder, provider)); + vm.prank(bidder); + bidderRegistry.requestWithdrawalsAsBidder(providers); + } + + function test_requestWithdrawalsAsBidder_Success() public { + test_depositEvenlyAsBidder_TwoProviders_NonDivisibleAmount(); + + address provider1 = vm.addr(8); + address provider2 = vm.addr(9); + address[] memory providers = new address[](2); + providers[0] = provider1; + providers[1] = provider2; + + vm.warp(100069); + + IBidderRegistry.Deposit memory deposit1Before = getDepositStruct(bidder, provider1); + IBidderRegistry.Deposit memory deposit2Before = getDepositStruct(bidder, provider2); + assertTrue(deposit1Before.exists, "deposit1 should exist"); + assertTrue(deposit2Before.exists, "deposit2 should exist"); + assertEq(deposit1Before.availableAmount, 5 ether + 1 wei, "deposit1 should be 5 ether + 1 wei"); + assertEq(deposit2Before.availableAmount, 5 ether + 2 wei, "deposit2 should be 5 ether + 2 wei"); + assertEq(deposit1Before.escrowedAmount, 0 wei, "deposit1 should have 0 escrowed amount"); + assertEq(deposit2Before.escrowedAmount, 0 wei, "deposit2 should have 0 escrowed amount"); + assertFalse(deposit1Before.withdrawalRequestOccurrence.exists, "deposit1 should have no withdrawal request"); + assertFalse(deposit2Before.withdrawalRequestOccurrence.exists, "deposit2 should have no withdrawal request"); + + vm.expectEmit(true, true, true, true); + emit IBidderRegistry.WithdrawalRequested(bidder, provider1, 5 ether + 1 wei, 0 wei, 100069); + vm.expectEmit(true, true, true, true); + emit IBidderRegistry.WithdrawalRequested(bidder, provider2, 5 ether + 2 wei, 0 wei, 100069); + vm.prank(bidder); + bidderRegistry.requestWithdrawalsAsBidder(providers); + + IBidderRegistry.Deposit memory deposit1After = getDepositStruct(bidder, provider1); + IBidderRegistry.Deposit memory deposit2After = getDepositStruct(bidder, provider2); + assertTrue(deposit1After.exists, "deposit1 should still exist"); + assertTrue(deposit2After.exists, "deposit2 should still exist"); + assertEq(deposit1After.availableAmount, deposit1Before.availableAmount, "available amount should be the same as before"); + assertEq(deposit2After.availableAmount, deposit2Before.availableAmount, "available amount should be the same as before"); + assertEq(deposit1After.escrowedAmount, deposit1Before.escrowedAmount, "escrowed amount should be the same as before"); + assertEq(deposit2After.escrowedAmount, deposit2Before.escrowedAmount, "escrowed amount should be the same as before"); + assertTrue(deposit1After.withdrawalRequestOccurrence.exists, "deposit1 should have a withdrawal request"); + assertTrue(deposit2After.withdrawalRequestOccurrence.exists, "deposit2 should have a withdrawal request"); + assertEq(deposit1After.withdrawalRequestOccurrence.timestamp, 100069, "withdrawal request timestamp should be 100069"); + assertEq(deposit2After.withdrawalRequestOccurrence.timestamp, 100069, "withdrawal request timestamp should be 100069"); + } + + function test_depositEvenlyAsBidder_WithdrawalOccurrenceExists() public { + test_requestWithdrawalsAsBidder_Success(); + + address provider1 = vm.addr(8); + address provider2 = vm.addr(9); + address[] memory providers = new address[](2); + providers[0] = provider1; + providers[1] = provider2; + + vm.warp(999999999999); + + vm.deal(bidder, 10 ether); + + vm.expectRevert(abi.encodeWithSelector(IBidderRegistry.WithdrawalOccurrenceExists.selector, bidder, provider1, 100069)); + vm.prank(bidder); + bidderRegistry.depositEvenlyAsBidder{value: 10 ether}(providers); + } + + // TODO: function where user does full withdrawal but there's still some escrowed amount left + function getDepositStruct(address bidderArg, address providerArg) public view returns (IBidderRegistry.Deposit memory deposit) { (deposit.exists, deposit.availableAmount, deposit.escrowedAmount, deposit.withdrawalRequestOccurrence) = bidderRegistry.deposits(bidderArg, providerArg); return deposit; } - // TODO: Various tests for requestWithdrawalsAsBidder // TODO: Various tests for withdrawAsBidder // TODO: Test staking/withdraw cycle for bidder to same provider } From e42c3ee03779f6e3b60aaab80472ff1992253277 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 6 Aug 2025 13:36:36 -0700 Subject: [PATCH 029/117] more tests, more changes --- contracts/contracts/core/BidderRegistry.sol | 2 +- .../contracts/interfaces/IBidderRegistry.sol | 4 +- contracts/test/core/BidderRegistryTest.sol | 133 +++++++++++++++++- 3 files changed, 134 insertions(+), 5 deletions(-) diff --git a/contracts/contracts/core/BidderRegistry.sol b/contracts/contracts/core/BidderRegistry.sol index 9e2dfc31e..b59886fb5 100644 --- a/contracts/contracts/core/BidderRegistry.sol +++ b/contracts/contracts/core/BidderRegistry.sol @@ -148,7 +148,7 @@ contract BidderRegistry is address provider = providers[i]; Deposit storage deposit = deposits[bidder][provider]; require(deposit.exists, DepositDoesNotExist(bidder, provider)); - require(deposit.withdrawalRequestOccurrence.exists, WithdrawalOccurrenceDoesNotExist(bidder, provider)); + require(deposit.withdrawalRequestOccurrence.exists, WithdrawalRequestDoesNotExist(bidder, provider)); require(deposit.withdrawalRequestOccurrence.timestamp + bidderWithdrawalPeriodMs < block.timestamp, WithdrawalPeriodNotElapsed(block.timestamp, deposit.withdrawalRequestOccurrence.timestamp, bidderWithdrawalPeriodMs)); diff --git a/contracts/contracts/interfaces/IBidderRegistry.sol b/contracts/contracts/interfaces/IBidderRegistry.sol index f4b4b8e26..062e048f1 100644 --- a/contracts/contracts/interfaces/IBidderRegistry.sol +++ b/contracts/contracts/interfaces/IBidderRegistry.sol @@ -142,8 +142,8 @@ interface IBidderRegistry { /// @dev Error emitted when a withdrawal occurrence exists error WithdrawalOccurrenceExists(address bidder, address provider, uint256 requestTimestamp); - /// @dev Error emitted when a withdrawal occurrence does not exist - error WithdrawalOccurrenceDoesNotExist(address bidder, address provider); + /// @dev Error emitted when a withdrawal request hasn't been made yet + error WithdrawalRequestDoesNotExist(address bidder, address provider); function openBid( bytes32 commitmentDigest, diff --git a/contracts/test/core/BidderRegistryTest.sol b/contracts/test/core/BidderRegistryTest.sol index c594a5bdc..975479f22 100644 --- a/contracts/test/core/BidderRegistryTest.sol +++ b/contracts/test/core/BidderRegistryTest.sol @@ -977,14 +977,143 @@ contract BidderRegistryTest is Test { bidderRegistry.depositEvenlyAsBidder{value: 10 ether}(providers); } - // TODO: function where user does full withdrawal but there's still some escrowed amount left + function test_withdrawAsBidder_NoProviders() public { + address[] memory providers = new address[](0); + vm.expectRevert(IBidderRegistry.NoProviders.selector); + vm.prank(bidder); + bidderRegistry.withdrawAsBidder(providers); + } + + function test_withdrawAsBidder_DepositDoesNotExist() public { + address provider = vm.addr(8); + address[] memory providers = new address[](1); + providers[0] = provider; + vm.expectRevert(abi.encodeWithSelector(IBidderRegistry.DepositDoesNotExist.selector, bidder, provider)); + vm.prank(bidder); + bidderRegistry.withdrawAsBidder(providers); + } + + function test_withdrawAsBidder_WithdrawalRequestDoesNotExist() public { + test_depositEvenlyAsBidder_TwoProviders_NonDivisibleAmount(); + + address provider1 = vm.addr(8); + address provider2 = vm.addr(9); + address[] memory providers = new address[](2); + providers[0] = provider1; + providers[1] = provider2; + + vm.expectRevert(abi.encodeWithSelector(IBidderRegistry.WithdrawalRequestDoesNotExist.selector, bidder, provider1)); + vm.prank(bidder); + bidderRegistry.withdrawAsBidder(providers); + } + + function test_withdrawAsBidder_WithdrawalPeriodNotElapsed() public { + test_requestWithdrawalsAsBidder_Success(); + + address provider1 = vm.addr(8); + address provider2 = vm.addr(9); + address[] memory providers = new address[](2); + providers[0] = provider1; + providers[1] = provider2; + + uint256 currentTs = block.timestamp; + assertEq(currentTs, 100069, "currentTs should be 100069"); + + uint256 requestTs = 100069; + uint256 withdrawalPeriodMs = bidderRegistry.bidderWithdrawalPeriodMs(); + vm.expectRevert(abi.encodeWithSelector(IBidderRegistry.WithdrawalPeriodNotElapsed.selector, + currentTs, requestTs, withdrawalPeriodMs)); + vm.prank(bidder); + bidderRegistry.withdrawAsBidder(providers); + + vm.warp(currentTs + 800); + + vm.expectRevert(abi.encodeWithSelector(IBidderRegistry.WithdrawalPeriodNotElapsed.selector, + 100069 + 800, requestTs, withdrawalPeriodMs)); + vm.prank(bidder); + bidderRegistry.withdrawAsBidder(providers); + + vm.warp(100069 + withdrawalPeriodMs + 1); + + vm.expectEmit(true, true, true, true); + emit IBidderRegistry.BidderWithdrawal(bidder, provider1, 5 ether + 1 wei, 0 wei); + vm.expectEmit(true, true, true, true); + emit IBidderRegistry.BidderWithdrawal(bidder, provider2, 5 ether + 2 wei, 0 wei); + vm.prank(bidder); + bidderRegistry.withdrawAsBidder(providers); + } + + function test_withdrawAsBidder_AssertDepositStateWithEscrowedAmount() public { + test_depositEvenlyAsBidder_TwoProviders_NonDivisibleAmount(); + + address provider1 = vm.addr(8); + address provider2 = vm.addr(9); + address[] memory providers = new address[](2); + providers[0] = provider1; + providers[1] = provider2; + + vm.prank(bidderRegistry.preconfManager()); + bidderRegistry.openBid(keccak256("commitment"), 1 ether, bidder, provider1); + + vm.warp(1777); + + vm.expectEmit(true, true, true, true); + emit IBidderRegistry.WithdrawalRequested(bidder, provider1, 5 ether + 1 wei - 1 ether, 1 ether, 1777); + vm.expectEmit(true, true, true, true); + emit IBidderRegistry.WithdrawalRequested(bidder, provider2, 5 ether + 2 wei, 0, 1777); + vm.prank(bidder); + bidderRegistry.requestWithdrawalsAsBidder(providers); + + vm.warp(1777 + bidderRegistry.bidderWithdrawalPeriodMs() + 1); + + IBidderRegistry.Deposit memory deposit1Before = getDepositStruct(bidder, provider1); + IBidderRegistry.Deposit memory deposit2Before = getDepositStruct(bidder, provider2); + assertTrue(deposit1Before.exists, "deposit1 should exist"); + assertTrue(deposit2Before.exists, "deposit2 should exist"); + assertEq(deposit1Before.availableAmount, 5 ether + 1 wei - 1 ether, "deposit1 should be 5 ether + 1 wei - 1 ether"); + assertEq(deposit2Before.availableAmount, 5 ether + 2 wei, "deposit2 should be 5 ether + 2 wei"); + assertEq(deposit1Before.escrowedAmount, 1 ether, "deposit1 should have 1 ether escrowed amount"); + assertEq(deposit2Before.escrowedAmount, 0 wei, "deposit2 should have 0 ether escrowed amount"); + assertTrue(deposit1Before.withdrawalRequestOccurrence.exists, "deposit1 should have a withdrawal request"); + assertTrue(deposit2Before.withdrawalRequestOccurrence.exists, "deposit2 should have a withdrawal request"); + assertEq(deposit1Before.withdrawalRequestOccurrence.timestamp, 1777, "deposit1 should have a withdrawal request at 1777"); + assertEq(deposit2Before.withdrawalRequestOccurrence.timestamp, 1777, "deposit2 should have a withdrawal request at 1777"); + + uint256 balanceBefore = bidder.balance; + + vm.expectEmit(true, true, true, true); + emit IBidderRegistry.BidderWithdrawal(bidder, provider1, 5 ether + 1 wei - 1 ether, 1 ether); + vm.expectEmit(true, true, true, true); + emit IBidderRegistry.BidderWithdrawal(bidder, provider2, 5 ether + 2 wei, 0); + vm.prank(bidder); + bidderRegistry.withdrawAsBidder(providers); + + IBidderRegistry.Deposit memory deposit1After = getDepositStruct(bidder, provider1); + IBidderRegistry.Deposit memory deposit2After = getDepositStruct(bidder, provider2); + assertTrue(deposit1After.exists, "deposit1 should still exist"); + assertTrue(deposit2After.exists, "deposit2 should still exist"); + assertEq(deposit1After.availableAmount, 0, "deposit1 should have 0 available amount"); + assertEq(deposit2After.availableAmount, 0, "deposit2 should have 0 available amount"); + assertEq(deposit1After.escrowedAmount, deposit1Before.escrowedAmount, "escrowed amount should be the same as before"); + assertEq(deposit1After.escrowedAmount, 1 ether, "still have 1 ether escrowed"); + assertEq(deposit2After.escrowedAmount, deposit2Before.escrowedAmount, "escrowed amount should be the same as before"); + assertEq(deposit2After.escrowedAmount, 0, "deposit2 should have 0 escrowed amount"); + assertFalse(deposit1After.withdrawalRequestOccurrence.exists, "deposit1 should have no withdrawal request"); + assertFalse(deposit2After.withdrawalRequestOccurrence.exists, "deposit2 should have no withdrawal request"); + assertEq(deposit1After.withdrawalRequestOccurrence.timestamp, 0, "request timestamp should be 0"); + assertEq(deposit2After.withdrawalRequestOccurrence.timestamp, 0, "request timestamp should be 0"); + + uint256 balanceAfter = bidder.balance; + assertEq(balanceAfter, balanceBefore + deposit1Before.availableAmount + deposit2Before.availableAmount, + "bidder should have received all available amount"); + assertEq(balanceAfter, 9 ether + 3 wei, "bidder should have received all available amount"); + } function getDepositStruct(address bidderArg, address providerArg) public view returns (IBidderRegistry.Deposit memory deposit) { (deposit.exists, deposit.availableAmount, deposit.escrowedAmount, deposit.withdrawalRequestOccurrence) = bidderRegistry.deposits(bidderArg, providerArg); return deposit; } - // TODO: Various tests for withdrawAsBidder // TODO: Test staking/withdraw cycle for bidder to same provider } From e4bd248481d395e0874ede36a5cfaf049bf2e080 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 6 Aug 2025 13:54:30 -0700 Subject: [PATCH 030/117] test_bidderStakingAndWithdrawCycle --- contracts/test/core/BidderRegistryTest.sol | 38 ++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/contracts/test/core/BidderRegistryTest.sol b/contracts/test/core/BidderRegistryTest.sol index 975479f22..c513dfdd7 100644 --- a/contracts/test/core/BidderRegistryTest.sol +++ b/contracts/test/core/BidderRegistryTest.sol @@ -1109,12 +1109,46 @@ contract BidderRegistryTest is Test { assertEq(balanceAfter, 9 ether + 3 wei, "bidder should have received all available amount"); } + function test_bidderStakingAndWithdrawCycle() public { + test_withdrawAsBidder_AssertDepositStateWithEscrowedAmount(); + + address provider1 = vm.addr(8); + address provider2 = vm.addr(9); + address[] memory providers = new address[](2); + providers[0] = provider1; + providers[1] = provider2; + + IBidderRegistry.Deposit memory deposit1Before = getDepositStruct(bidder, provider1); + IBidderRegistry.Deposit memory deposit2Before = getDepositStruct(bidder, provider2); + + vm.deal(bidder, 25 ether + 1 wei); + + vm.expectEmit(true, true, true, true); + emit IBidderRegistry.BidderDeposited(bidder, provider1, 12.5 ether); + vm.expectEmit(true, true, true, true); + emit IBidderRegistry.BidderDeposited(bidder, provider2, 12.5 ether + 1 wei); + vm.prank(bidder); + bidderRegistry.depositEvenlyAsBidder{value: 25 ether + 1 wei}(providers); + + IBidderRegistry.Deposit memory deposit1After = getDepositStruct(bidder, provider1); + IBidderRegistry.Deposit memory deposit2After = getDepositStruct(bidder, provider2); + assertTrue(deposit1After.exists, "deposit1 should exist"); + assertTrue(deposit2After.exists, "deposit2 should exist"); + assertEq(deposit1After.availableAmount, deposit1Before.availableAmount + 12.5 ether, "deposit1 should have 12.5 ether more than before"); + assertEq(deposit2After.availableAmount, deposit2Before.availableAmount + 12.5 ether + 1 wei, "deposit2 should have 12.5 ether + 1 wei more than before"); + assertEq(deposit1After.escrowedAmount, deposit1Before.escrowedAmount, "deposit1 should have same escrowed amount as before"); + assertEq(deposit2After.escrowedAmount, deposit2Before.escrowedAmount, "deposit2 should have same escrowed amount as before"); + assertFalse(deposit1After.withdrawalRequestOccurrence.exists, "deposit1 should have no withdrawal request"); + assertFalse(deposit2After.withdrawalRequestOccurrence.exists, "deposit2 should have no withdrawal request"); + + vm.prank(bidderRegistry.preconfManager()); + bidderRegistry.openBid(keccak256("commitment"), 1 ether, bidder, provider1); + } + function getDepositStruct(address bidderArg, address providerArg) public view returns (IBidderRegistry.Deposit memory deposit) { (deposit.exists, deposit.availableAmount, deposit.escrowedAmount, deposit.withdrawalRequestOccurrence) = bidderRegistry.deposits(bidderArg, providerArg); return deposit; } - - // TODO: Test staking/withdraw cycle for bidder to same provider } contract IncorrectBidderContract { From 2b59582c8efc92d69c6a4e99f346e7aa176b61e9 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 6 Aug 2025 14:12:08 -0700 Subject: [PATCH 031/117] fix test_shouldReturnFunds --- contracts/test/core/BidderRegistryTest.sol | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/contracts/test/core/BidderRegistryTest.sol b/contracts/test/core/BidderRegistryTest.sol index c513dfdd7..6e24400b1 100644 --- a/contracts/test/core/BidderRegistryTest.sol +++ b/contracts/test/core/BidderRegistryTest.sol @@ -275,25 +275,27 @@ contract BidderRegistryTest is Test { blockTracker.addBuilderAddress("test", provider); blockTracker.recordL1Block(blockNumber, "test"); - uint256 bidderBalance = bidder.balance; - + assertEq(bidder.balance, 1000 ether - 64 ether); assertEq(bidderRegistry.getDeposit(bidder, provider), 64 ether); assertEq(bidderRegistry.getEscrowedAmount(bidder, provider), 0); + assertEq(bidderRegistry.providerAmount(provider), 0); + assertEq(bidderRegistry.getAccumulatedProtocolFee(), 0); bidderRegistry.openBid(commitmentDigest, 1 ether, bidder, provider); + assertEq(bidder.balance, 1000 ether - 64 ether); assertEq(bidderRegistry.getDeposit(bidder, provider), 63 ether); assertEq(bidderRegistry.getEscrowedAmount(bidder, provider), 1 ether); + assertEq(bidderRegistry.providerAmount(provider), 0); + assertEq(bidderRegistry.getAccumulatedProtocolFee(), 0); bidderRegistry.unlockFunds(provider, commitmentDigest); - uint256 providerAmount = bidderRegistry.providerAmount(provider); - uint256 feeRecipientAmount = bidderRegistry.getAccumulatedProtocolFee(); - assertEq(providerAmount, 0); - assertEq(feeRecipientAmount, 0); - - assertEq(bidder.balance, bidderBalance + 1 ether); + assertEq(bidder.balance, 1000 ether - 64 ether + 1 ether); assertEq(bidderRegistry.getDeposit(bidder, provider), 63 ether); + assertEq(bidderRegistry.getEscrowedAmount(bidder, provider), 0); + assertEq(bidderRegistry.providerAmount(provider), 0); + assertEq(bidderRegistry.getAccumulatedProtocolFee(), 0); } function test_RevertWhen_ConvertFundsToProviderRewardNotPreConf() public { From 7a8322f55d1375cbb04507907572e02bdaf8fe0d Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 6 Aug 2025 16:02:24 -0700 Subject: [PATCH 032/117] Update BidderRegistryTest.sol --- contracts/test/core/BidderRegistryTest.sol | 32 +++++++++++++++------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/contracts/test/core/BidderRegistryTest.sol b/contracts/test/core/BidderRegistryTest.sol index 6e24400b1..f5f7fdaef 100644 --- a/contracts/test/core/BidderRegistryTest.sol +++ b/contracts/test/core/BidderRegistryTest.sol @@ -216,26 +216,38 @@ contract BidderRegistryTest is Test { bidderRegistry.setPreconfManager(address(this)); address provider = vm.addr(4); + vm.prank(bidder); + + assertEq(bidder.balance, 1000 ether); + assertEq(bidderRegistry.getDeposit(bidder, provider), 0); + assertEq(bidderRegistry.getEscrowedAmount(bidder, provider), 0); + assertEq(bidderRegistry.providerAmount(provider), 0); + assertEq(bidderRegistry.getAccumulatedProtocolFee(), 0); + vm.prank(bidder); bidderRegistry.depositAsBidder{value: 64 ether}(provider); - uint64 blockNumber = uint64(WindowFromBlockNumber.BLOCKS_PER_WINDOW + 2); - blockTracker.addBuilderAddress("test", provider); - blockTracker.recordL1Block(blockNumber, "test"); - uint256 depositBefore = bidderRegistry.getDeposit(bidder, provider); + assertEq(bidder.balance, 1000 ether - 64 ether); + assertEq(bidderRegistry.getDeposit(bidder, provider), 64 ether); + assertEq(bidderRegistry.getEscrowedAmount(bidder, provider), 0); + assertEq(bidderRegistry.providerAmount(provider), 0); + assertEq(bidderRegistry.getAccumulatedProtocolFee(), 0); bidderRegistry.openBid(commitmentDigest, 1 ether, bidder, provider); - uint256 depositAfter = bidderRegistry.getDeposit(bidder, provider); - assertEq(depositAfter, depositBefore-1 ether, "deposit should be reduced by bid amount since no top-up happened"); + assertEq(bidder.balance, 1000 ether - 64 ether); + assertEq(bidderRegistry.getDeposit(bidder, provider), 63 ether); + assertEq(bidderRegistry.getEscrowedAmount(bidder, provider), 1 ether); + assertEq(bidderRegistry.providerAmount(provider), 0); + assertEq(bidderRegistry.getAccumulatedProtocolFee(), 0); bidderRegistry.convertFundsToProviderReward(commitmentDigest, payable(provider), bidderRegistry.ONE_HUNDRED_PERCENT()); - uint256 providerAmount = bidderRegistry.providerAmount(provider); - uint256 feeRecipientAmount = bidderRegistry.getAccumulatedProtocolFee(); - assertEq(providerAmount, 900000000000000000); - assertEq(feeRecipientAmount, 100000000000000000); + assertEq(bidder.balance, 1000 ether - 64 ether); assertEq(bidderRegistry.getDeposit(bidder, provider), 63 ether); + assertEq(bidderRegistry.getEscrowedAmount(bidder, provider), 0); + assertEq(bidderRegistry.providerAmount(provider), 0.9 ether); + assertEq(bidderRegistry.getAccumulatedProtocolFee(), 0.1 ether); } function test_ConvertFundsToProviderRewardWithDecay() public { From fd4b0d099f2161190f207515dda4486649f165a9 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 6 Aug 2025 16:05:32 -0700 Subject: [PATCH 033/117] abi+bindings --- contracts-abi/abi/BidderRegistry.abi | 79 +++++-- .../clients/BidderRegistry/BidderRegistry.go | 204 ++++++++++++++++-- 2 files changed, 248 insertions(+), 35 deletions(-) diff --git a/contracts-abi/abi/BidderRegistry.abi b/contracts-abi/abi/BidderRegistry.abi index 0ea31f8b8..5925ab008 100644 --- a/contracts-abi/abi/BidderRegistry.abi +++ b/contracts-abi/abi/BidderRegistry.abi @@ -734,6 +734,31 @@ ], "stateMutability": "view" }, + { + "type": "event", + "name": "BidAmountReduced", + "inputs": [ + { + "name": "bidder", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "provider", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newBidAmt", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, { "type": "event", "name": "BidderDeposited", @@ -782,7 +807,7 @@ "internalType": "uint256" }, { - "name": "amountEscrowed", + "name": "amountStillEscrowed", "type": "uint256", "indexed": false, "internalType": "uint256" @@ -1093,6 +1118,18 @@ "indexed": true, "internalType": "address" }, + { + "name": "availableAmount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "escrowedAmount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, { "name": "timestamp", "type": "uint256", @@ -1217,6 +1254,11 @@ "name": "InvalidInitialization", "inputs": [] }, + { + "type": "error", + "name": "NoProviders", + "inputs": [] + }, { "type": "error", "name": "NotInitializing", @@ -1336,7 +1378,7 @@ }, { "type": "error", - "name": "WithdrawalOccurrenceDoesNotExist", + "name": "WithdrawalOccurrenceExists", "inputs": [ { "name": "bidder", @@ -1347,22 +1389,11 @@ "name": "provider", "type": "address", "internalType": "address" - } - ] - }, - { - "type": "error", - "name": "WithdrawalOccurrenceExists", - "inputs": [ - { - "name": "bidder", - "type": "address", - "internalType": "address" }, { - "name": "provider", - "type": "address", - "internalType": "address" + "name": "requestTimestamp", + "type": "uint256", + "internalType": "uint256" } ] }, @@ -1386,5 +1417,21 @@ "internalType": "uint256" } ] + }, + { + "type": "error", + "name": "WithdrawalRequestDoesNotExist", + "inputs": [ + { + "name": "bidder", + "type": "address", + "internalType": "address" + }, + { + "name": "provider", + "type": "address", + "internalType": "address" + } + ] } ] diff --git a/contracts-abi/clients/BidderRegistry/BidderRegistry.go b/contracts-abi/clients/BidderRegistry/BidderRegistry.go index b498a66b0..d6ca46bd6 100644 --- a/contracts-abi/clients/BidderRegistry/BidderRegistry.go +++ b/contracts-abi/clients/BidderRegistry/BidderRegistry.go @@ -37,7 +37,7 @@ type TimestampOccurrenceOccurrence struct { // BidderregistryMetaData contains all meta data concerning the Bidderregistry contract. var BidderregistryMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"ONE_HUNDRED_PERCENT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PRECISION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"bidPayment\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"bidAmt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"state\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bidderWithdrawalPeriodMs\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"blockTrackerContract\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBlockTracker\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"convertFundsToProviderReward\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"addresspayable\"},{\"name\":\"residualBidPercentAfterDecay\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositAsBidder\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"depositEvenlyAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"depositManagerHash\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositManagerImpl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deposits\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"availableAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"escrowedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalRequestOccurrence\",\"type\":\"tuple\",\"internalType\":\"structTimestampOccurrence.Occurrence\",\"components\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"feePercent\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAccumulatedProtocolFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDeposit\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEscrowedAmount\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProviderAmount\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_protocolFeeRecipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_feePercent\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_blockTracker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_feePayoutPeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_bidderWithdrawalPeriodMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"manuallyWithdrawProtocolFee\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"openBid\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"bidAmt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"preconfManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"protocolFeeTracker\",\"inputs\":[],\"outputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"accumulatedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"lastPayoutTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"payoutTimePeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"providerAmount\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"requestWithdrawalsAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setBlockTrackerContract\",\"inputs\":[{\"name\":\"newBlockTrackerContract\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDepositManagerImpl\",\"inputs\":[{\"name\":\"_depositManagerImpl\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewFeePayoutPeriod\",\"inputs\":[{\"name\":\"newFeePayoutPeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewFeePercent\",\"inputs\":[{\"name\":\"newFeePercent\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewProtocolFeeRecipient\",\"inputs\":[{\"name\":\"newProtocolFeeRecipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPreconfManager\",\"inputs\":[{\"name\":\"contractAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unlockFunds\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"withdrawAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawProviderAmount\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawalRequestExists\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"BidderDeposited\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"depositedAmount\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BidderWithdrawal\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amountWithdrawn\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"amountEscrowed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockTrackerUpdated\",\"inputs\":[{\"name\":\"newBlockTracker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DepositManagerImplUpdated\",\"inputs\":[{\"name\":\"newDepositManagerImpl\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeePayoutPeriodUpdated\",\"inputs\":[{\"name\":\"newFeePayoutPeriod\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeePercentUpdated\",\"inputs\":[{\"name\":\"newFeePercent\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeTransfer\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FundsRewarded\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FundsUnlocked\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"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\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PreconfManagerUpdated\",\"inputs\":[{\"name\":\"newPreconfManager\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProtocolFeeRecipientUpdated\",\"inputs\":[{\"name\":\"newProtocolFeeRecipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TopUpFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransferToBidderFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalRequested\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"BidNotPreConfirmed\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"actualState\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"},{\"name\":\"expectedState\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"}]},{\"type\":\"error\",\"name\":\"BidderWithdrawalTransferFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"DepositAmountIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DepositDoesNotExist\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DepositManagerNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpectedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FeeRecipientIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyBidderCanWithdraw\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"PayoutPeriodMustBePositive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ProviderAmountIsZero\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SenderIsNotPreconfManager\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"preconfManager\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TransferToProviderFailed\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"TransferToRecipientFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"WithdrawalOccurrenceDoesNotExist\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"WithdrawalOccurrenceExists\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"WithdrawalPeriodNotElapsed\",\"inputs\":[{\"name\":\"currentTimestampMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalTimestampMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalPeriodMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"ONE_HUNDRED_PERCENT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PRECISION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"bidPayment\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"bidAmt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"state\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bidderWithdrawalPeriodMs\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"blockTrackerContract\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBlockTracker\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"convertFundsToProviderReward\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"addresspayable\"},{\"name\":\"residualBidPercentAfterDecay\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositAsBidder\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"depositEvenlyAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"depositManagerHash\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositManagerImpl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deposits\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"availableAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"escrowedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalRequestOccurrence\",\"type\":\"tuple\",\"internalType\":\"structTimestampOccurrence.Occurrence\",\"components\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"feePercent\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAccumulatedProtocolFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDeposit\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEscrowedAmount\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProviderAmount\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_protocolFeeRecipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_feePercent\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_blockTracker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_feePayoutPeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_bidderWithdrawalPeriodMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"manuallyWithdrawProtocolFee\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"openBid\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"bidAmt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"preconfManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"protocolFeeTracker\",\"inputs\":[],\"outputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"accumulatedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"lastPayoutTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"payoutTimePeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"providerAmount\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"requestWithdrawalsAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setBlockTrackerContract\",\"inputs\":[{\"name\":\"newBlockTrackerContract\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDepositManagerImpl\",\"inputs\":[{\"name\":\"_depositManagerImpl\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewFeePayoutPeriod\",\"inputs\":[{\"name\":\"newFeePayoutPeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewFeePercent\",\"inputs\":[{\"name\":\"newFeePercent\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewProtocolFeeRecipient\",\"inputs\":[{\"name\":\"newProtocolFeeRecipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPreconfManager\",\"inputs\":[{\"name\":\"contractAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unlockFunds\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"withdrawAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawProviderAmount\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawalRequestExists\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"BidAmountReduced\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newBidAmt\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BidderDeposited\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"depositedAmount\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BidderWithdrawal\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amountWithdrawn\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"amountStillEscrowed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockTrackerUpdated\",\"inputs\":[{\"name\":\"newBlockTracker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DepositManagerImplUpdated\",\"inputs\":[{\"name\":\"newDepositManagerImpl\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeePayoutPeriodUpdated\",\"inputs\":[{\"name\":\"newFeePayoutPeriod\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeePercentUpdated\",\"inputs\":[{\"name\":\"newFeePercent\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeTransfer\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FundsRewarded\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FundsUnlocked\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"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\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PreconfManagerUpdated\",\"inputs\":[{\"name\":\"newPreconfManager\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProtocolFeeRecipientUpdated\",\"inputs\":[{\"name\":\"newProtocolFeeRecipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TopUpFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransferToBidderFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalRequested\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"availableAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"escrowedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"BidNotPreConfirmed\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"actualState\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"},{\"name\":\"expectedState\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"}]},{\"type\":\"error\",\"name\":\"BidderWithdrawalTransferFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"DepositAmountIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DepositDoesNotExist\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DepositManagerNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpectedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FeeRecipientIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoProviders\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyBidderCanWithdraw\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"PayoutPeriodMustBePositive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ProviderAmountIsZero\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SenderIsNotPreconfManager\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"preconfManager\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TransferToProviderFailed\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"TransferToRecipientFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"WithdrawalOccurrenceExists\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"requestTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"WithdrawalPeriodNotElapsed\",\"inputs\":[{\"name\":\"currentTimestampMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalTimestampMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalPeriodMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"WithdrawalRequestDoesNotExist\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]}]", } // BidderregistryABI is the input ABI used to generate the binding from. @@ -1439,6 +1439,168 @@ func (_Bidderregistry *BidderregistryTransactorSession) Receive() (*types.Transa return _Bidderregistry.Contract.Receive(&_Bidderregistry.TransactOpts) } +// BidderregistryBidAmountReducedIterator is returned from FilterBidAmountReduced and is used to iterate over the raw logs and unpacked data for BidAmountReduced events raised by the Bidderregistry contract. +type BidderregistryBidAmountReducedIterator struct { + Event *BidderregistryBidAmountReduced // 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 *BidderregistryBidAmountReducedIterator) 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(BidderregistryBidAmountReduced) + 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(BidderregistryBidAmountReduced) + 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 *BidderregistryBidAmountReducedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *BidderregistryBidAmountReducedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// BidderregistryBidAmountReduced represents a BidAmountReduced event raised by the Bidderregistry contract. +type BidderregistryBidAmountReduced struct { + Bidder common.Address + Provider common.Address + NewBidAmt *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBidAmountReduced is a free log retrieval operation binding the contract event 0x25be4840c95b77e8a6875911e60ac4fe35643466fc23a2c0ae33d93d05132dce. +// +// Solidity: event BidAmountReduced(address indexed bidder, address indexed provider, uint256 indexed newBidAmt) +func (_Bidderregistry *BidderregistryFilterer) FilterBidAmountReduced(opts *bind.FilterOpts, bidder []common.Address, provider []common.Address, newBidAmt []*big.Int) (*BidderregistryBidAmountReducedIterator, error) { + + var bidderRule []interface{} + for _, bidderItem := range bidder { + bidderRule = append(bidderRule, bidderItem) + } + var providerRule []interface{} + for _, providerItem := range provider { + providerRule = append(providerRule, providerItem) + } + var newBidAmtRule []interface{} + for _, newBidAmtItem := range newBidAmt { + newBidAmtRule = append(newBidAmtRule, newBidAmtItem) + } + + logs, sub, err := _Bidderregistry.contract.FilterLogs(opts, "BidAmountReduced", bidderRule, providerRule, newBidAmtRule) + if err != nil { + return nil, err + } + return &BidderregistryBidAmountReducedIterator{contract: _Bidderregistry.contract, event: "BidAmountReduced", logs: logs, sub: sub}, nil +} + +// WatchBidAmountReduced is a free log subscription operation binding the contract event 0x25be4840c95b77e8a6875911e60ac4fe35643466fc23a2c0ae33d93d05132dce. +// +// Solidity: event BidAmountReduced(address indexed bidder, address indexed provider, uint256 indexed newBidAmt) +func (_Bidderregistry *BidderregistryFilterer) WatchBidAmountReduced(opts *bind.WatchOpts, sink chan<- *BidderregistryBidAmountReduced, bidder []common.Address, provider []common.Address, newBidAmt []*big.Int) (event.Subscription, error) { + + var bidderRule []interface{} + for _, bidderItem := range bidder { + bidderRule = append(bidderRule, bidderItem) + } + var providerRule []interface{} + for _, providerItem := range provider { + providerRule = append(providerRule, providerItem) + } + var newBidAmtRule []interface{} + for _, newBidAmtItem := range newBidAmt { + newBidAmtRule = append(newBidAmtRule, newBidAmtItem) + } + + logs, sub, err := _Bidderregistry.contract.WatchLogs(opts, "BidAmountReduced", bidderRule, providerRule, newBidAmtRule) + 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(BidderregistryBidAmountReduced) + if err := _Bidderregistry.contract.UnpackLog(event, "BidAmountReduced", 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 +} + +// ParseBidAmountReduced is a log parse operation binding the contract event 0x25be4840c95b77e8a6875911e60ac4fe35643466fc23a2c0ae33d93d05132dce. +// +// Solidity: event BidAmountReduced(address indexed bidder, address indexed provider, uint256 indexed newBidAmt) +func (_Bidderregistry *BidderregistryFilterer) ParseBidAmountReduced(log types.Log) (*BidderregistryBidAmountReduced, error) { + event := new(BidderregistryBidAmountReduced) + if err := _Bidderregistry.contract.UnpackLog(event, "BidAmountReduced", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // BidderregistryBidderDepositedIterator is returned from FilterBidderDeposited and is used to iterate over the raw logs and unpacked data for BidderDeposited events raised by the Bidderregistry contract. type BidderregistryBidderDepositedIterator struct { Event *BidderregistryBidderDeposited // Event containing the contract specifics and raw log @@ -1670,16 +1832,16 @@ func (it *BidderregistryBidderWithdrawalIterator) Close() error { // BidderregistryBidderWithdrawal represents a BidderWithdrawal event raised by the Bidderregistry contract. type BidderregistryBidderWithdrawal struct { - Bidder common.Address - Provider common.Address - AmountWithdrawn *big.Int - AmountEscrowed *big.Int - Raw types.Log // Blockchain specific contextual infos + Bidder common.Address + Provider common.Address + AmountWithdrawn *big.Int + AmountStillEscrowed *big.Int + Raw types.Log // Blockchain specific contextual infos } // FilterBidderWithdrawal is a free log retrieval operation binding the contract event 0xd31e0eb19177a3f05b460dd887249c5b3e8e2ca0e48a806c3d3a4a9797522565. // -// Solidity: event BidderWithdrawal(address indexed bidder, address indexed provider, uint256 indexed amountWithdrawn, uint256 amountEscrowed) +// Solidity: event BidderWithdrawal(address indexed bidder, address indexed provider, uint256 indexed amountWithdrawn, uint256 amountStillEscrowed) func (_Bidderregistry *BidderregistryFilterer) FilterBidderWithdrawal(opts *bind.FilterOpts, bidder []common.Address, provider []common.Address, amountWithdrawn []*big.Int) (*BidderregistryBidderWithdrawalIterator, error) { var bidderRule []interface{} @@ -1704,7 +1866,7 @@ func (_Bidderregistry *BidderregistryFilterer) FilterBidderWithdrawal(opts *bind // WatchBidderWithdrawal is a free log subscription operation binding the contract event 0xd31e0eb19177a3f05b460dd887249c5b3e8e2ca0e48a806c3d3a4a9797522565. // -// Solidity: event BidderWithdrawal(address indexed bidder, address indexed provider, uint256 indexed amountWithdrawn, uint256 amountEscrowed) +// Solidity: event BidderWithdrawal(address indexed bidder, address indexed provider, uint256 indexed amountWithdrawn, uint256 amountStillEscrowed) func (_Bidderregistry *BidderregistryFilterer) WatchBidderWithdrawal(opts *bind.WatchOpts, sink chan<- *BidderregistryBidderWithdrawal, bidder []common.Address, provider []common.Address, amountWithdrawn []*big.Int) (event.Subscription, error) { var bidderRule []interface{} @@ -1754,7 +1916,7 @@ func (_Bidderregistry *BidderregistryFilterer) WatchBidderWithdrawal(opts *bind. // ParseBidderWithdrawal is a log parse operation binding the contract event 0xd31e0eb19177a3f05b460dd887249c5b3e8e2ca0e48a806c3d3a4a9797522565. // -// Solidity: event BidderWithdrawal(address indexed bidder, address indexed provider, uint256 indexed amountWithdrawn, uint256 amountEscrowed) +// Solidity: event BidderWithdrawal(address indexed bidder, address indexed provider, uint256 indexed amountWithdrawn, uint256 amountStillEscrowed) func (_Bidderregistry *BidderregistryFilterer) ParseBidderWithdrawal(log types.Log) (*BidderregistryBidderWithdrawal, error) { event := new(BidderregistryBidderWithdrawal) if err := _Bidderregistry.contract.UnpackLog(event, "BidderWithdrawal", log); err != nil { @@ -4308,15 +4470,17 @@ func (it *BidderregistryWithdrawalRequestedIterator) Close() error { // BidderregistryWithdrawalRequested represents a WithdrawalRequested event raised by the Bidderregistry contract. type BidderregistryWithdrawalRequested struct { - Bidder common.Address - Provider common.Address - Timestamp *big.Int - Raw types.Log // Blockchain specific contextual infos + Bidder common.Address + Provider common.Address + AvailableAmount *big.Int + EscrowedAmount *big.Int + Timestamp *big.Int + Raw types.Log // Blockchain specific contextual infos } -// FilterWithdrawalRequested is a free log retrieval operation binding the contract event 0x04c56a409d50971e45c5a2d96e5d557d2b0f1d66d40f14b141e4c958b0f39b32. +// FilterWithdrawalRequested is a free log retrieval operation binding the contract event 0x3aeb15af61588a39bcfafb19ed853140d195c2a924537afbf9a6d04348e76a69. // -// Solidity: event WithdrawalRequested(address indexed bidder, address indexed provider, uint256 indexed timestamp) +// Solidity: event WithdrawalRequested(address indexed bidder, address indexed provider, uint256 availableAmount, uint256 escrowedAmount, uint256 indexed timestamp) func (_Bidderregistry *BidderregistryFilterer) FilterWithdrawalRequested(opts *bind.FilterOpts, bidder []common.Address, provider []common.Address, timestamp []*big.Int) (*BidderregistryWithdrawalRequestedIterator, error) { var bidderRule []interface{} @@ -4327,6 +4491,7 @@ func (_Bidderregistry *BidderregistryFilterer) FilterWithdrawalRequested(opts *b for _, providerItem := range provider { providerRule = append(providerRule, providerItem) } + var timestampRule []interface{} for _, timestampItem := range timestamp { timestampRule = append(timestampRule, timestampItem) @@ -4339,9 +4504,9 @@ func (_Bidderregistry *BidderregistryFilterer) FilterWithdrawalRequested(opts *b return &BidderregistryWithdrawalRequestedIterator{contract: _Bidderregistry.contract, event: "WithdrawalRequested", logs: logs, sub: sub}, nil } -// WatchWithdrawalRequested is a free log subscription operation binding the contract event 0x04c56a409d50971e45c5a2d96e5d557d2b0f1d66d40f14b141e4c958b0f39b32. +// WatchWithdrawalRequested is a free log subscription operation binding the contract event 0x3aeb15af61588a39bcfafb19ed853140d195c2a924537afbf9a6d04348e76a69. // -// Solidity: event WithdrawalRequested(address indexed bidder, address indexed provider, uint256 indexed timestamp) +// Solidity: event WithdrawalRequested(address indexed bidder, address indexed provider, uint256 availableAmount, uint256 escrowedAmount, uint256 indexed timestamp) func (_Bidderregistry *BidderregistryFilterer) WatchWithdrawalRequested(opts *bind.WatchOpts, sink chan<- *BidderregistryWithdrawalRequested, bidder []common.Address, provider []common.Address, timestamp []*big.Int) (event.Subscription, error) { var bidderRule []interface{} @@ -4352,6 +4517,7 @@ func (_Bidderregistry *BidderregistryFilterer) WatchWithdrawalRequested(opts *bi for _, providerItem := range provider { providerRule = append(providerRule, providerItem) } + var timestampRule []interface{} for _, timestampItem := range timestamp { timestampRule = append(timestampRule, timestampItem) @@ -4389,9 +4555,9 @@ func (_Bidderregistry *BidderregistryFilterer) WatchWithdrawalRequested(opts *bi }), nil } -// ParseWithdrawalRequested is a log parse operation binding the contract event 0x04c56a409d50971e45c5a2d96e5d557d2b0f1d66d40f14b141e4c958b0f39b32. +// ParseWithdrawalRequested is a log parse operation binding the contract event 0x3aeb15af61588a39bcfafb19ed853140d195c2a924537afbf9a6d04348e76a69. // -// Solidity: event WithdrawalRequested(address indexed bidder, address indexed provider, uint256 indexed timestamp) +// Solidity: event WithdrawalRequested(address indexed bidder, address indexed provider, uint256 availableAmount, uint256 escrowedAmount, uint256 indexed timestamp) func (_Bidderregistry *BidderregistryFilterer) ParseWithdrawalRequested(log types.Log) (*BidderregistryWithdrawalRequested, error) { event := new(BidderregistryWithdrawalRequested) if err := _Bidderregistry.contract.UnpackLog(event, "WithdrawalRequested", log); err != nil { From 2bc1370c2f9d1e6ad4a5a601b3930f549b90efeb Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 6 Aug 2025 16:10:24 -0700 Subject: [PATCH 034/117] rm unneeded test setup --- contracts/test/core/BidderRegistryTest.sol | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/contracts/test/core/BidderRegistryTest.sol b/contracts/test/core/BidderRegistryTest.sol index f5f7fdaef..d98e79f13 100644 --- a/contracts/test/core/BidderRegistryTest.sol +++ b/contracts/test/core/BidderRegistryTest.sol @@ -257,9 +257,6 @@ contract BidderRegistryTest is Test { address provider = vm.addr(4); vm.prank(bidder); bidderRegistry.depositAsBidder{value: 64 ether}(provider); - uint64 blockNumber = uint64(WindowFromBlockNumber.BLOCKS_PER_WINDOW + 2); - blockTracker.addBuilderAddress("test", provider); - blockTracker.recordL1Block(blockNumber, "test"); bidderRegistry.openBid(commitmentDigest, 1 ether, bidder, provider); @@ -283,9 +280,6 @@ contract BidderRegistryTest is Test { address provider = vm.addr(4); vm.prank(bidder); bidderRegistry.depositAsBidder{value: 64 ether}(provider); - uint64 blockNumber = uint64(WindowFromBlockNumber.BLOCKS_PER_WINDOW + 2); - blockTracker.addBuilderAddress("test", provider); - blockTracker.recordL1Block(blockNumber, "test"); assertEq(bidder.balance, 1000 ether - 64 ether); assertEq(bidderRegistry.getDeposit(bidder, provider), 64 ether); @@ -330,9 +324,6 @@ contract BidderRegistryTest is Test { bidderRegistry.depositAsBidder{value: 128 ether}(provider); uint256 balanceBefore = address(provider).balance; bytes32 commitmentDigest = keccak256("1234"); - uint64 blockNumber = uint64(WindowFromBlockNumber.BLOCKS_PER_WINDOW + 2); - blockTracker.addBuilderAddress("test", provider); - blockTracker.recordL1Block(blockNumber, "test"); bidderRegistry.openBid(commitmentDigest, 2 ether, bidder, provider); @@ -402,8 +393,6 @@ contract BidderRegistryTest is Test { assertEq(escrowedFunds, 0); } vm.stopPrank(); - uint64 blockNumber = uint64(WindowFromBlockNumber.BLOCKS_PER_WINDOW*3 + 2); - blockTracker.recordL1Block(blockNumber, "test"); vm.expectEmit(true, false, false, true); emit IBidderRegistry.WithdrawalRequested(bidder, provider1, 1 ether, 0, block.timestamp); @@ -480,9 +469,6 @@ contract BidderRegistryTest is Test { bidderRegistry.depositAsBidder{value: 64 ether}(provider); uint256 balanceBefore = feeRecipient.balance; bytes32 commitmentDigest = keccak256("1234"); - uint64 blockNumber = uint64(WindowFromBlockNumber.BLOCKS_PER_WINDOW + 2); - blockTracker.addBuilderAddress("test", provider); - blockTracker.recordL1Block(blockNumber, "test"); bidderRegistry.openBid(commitmentDigest, 1 ether, bidder, provider); vm.expectEmit(true, true, true, true); emit FeeTransfer(100000000000000000, feeRecipient); @@ -499,9 +485,6 @@ contract BidderRegistryTest is Test { bidderRegistry.depositAsBidder{value: 64 ether}(provider); uint256 balanceBefore = feeRecipient.balance; bytes32 commitmentDigest = keccak256("1234"); - uint64 blockNumber = uint64(WindowFromBlockNumber.BLOCKS_PER_WINDOW + 2); - blockTracker.addBuilderAddress("test", provider); - blockTracker.recordL1Block(blockNumber, "test"); bidderRegistry.openBid(commitmentDigest, 1 ether, bidder, provider); bidderRegistry.convertFundsToProviderReward(commitmentDigest, payable(provider), bidderRegistry.ONE_HUNDRED_PERCENT()); uint256 balanceAfter = feeRecipient.balance; @@ -513,7 +496,6 @@ contract BidderRegistryTest is Test { function test_OpenBidWithExcessExploit() public { address aliceBidder = vm.addr(7); address bobBidder = vm.addr(8); - uint64 blockNumber = uint64(WindowFromBlockNumber.BLOCKS_PER_WINDOW + 1); vm.deal(aliceBidder, 10 ether); vm.deal(bobBidder, 10 ether); @@ -567,8 +549,6 @@ contract BidderRegistryTest is Test { ); vm.stopPrank(); - blockNumber = uint64(WindowFromBlockNumber.BLOCKS_PER_WINDOW * 2 + 1); - blockTracker.recordL1Block(blockNumber, "test"); address[] memory providers = new address[](1); providers[0] = provider; vm.prank(aliceBidder); From d59c92e2885d55d372436cf3d0c1e844e490f41e Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 6 Aug 2025 16:41:34 -0700 Subject: [PATCH 035/117] Update events_test.go --- x/contracts/events/events_test.go | 54 +++++++++++++++---------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/x/contracts/events/events_test.go b/x/contracts/events/events_test.go index a7f1ea0d9..d95981658 100644 --- a/x/contracts/events/events_test.go +++ b/x/contracts/events/events_test.go @@ -19,27 +19,27 @@ import ( func TestEventHandler(t *testing.T) { t.Parallel() - b := bidderregistry.BidderregistryBidderRegistered{ + b := bidderregistry.BidderregistryBidderDeposited{ Bidder: common.HexToAddress("0xabcd"), + Provider: common.HexToAddress("0x1234"), DepositedAmount: big.NewInt(1000), - WindowNumber: big.NewInt(1), } errC := make(chan error, 1) evtHdlr := NewEventHandler( - "BidderRegistered", - func(ev *bidderregistry.BidderregistryBidderRegistered) { + "BidderDeposited", + func(ev *bidderregistry.BidderregistryBidderDeposited) { if ev.Bidder.Hex() != b.Bidder.Hex() { errC <- fmt.Errorf("expected bidder %s, got %s", b.Bidder.Hex(), ev.Bidder.Hex()) return } - if ev.DepositedAmount.Cmp(b.DepositedAmount) != 0 { - errC <- fmt.Errorf("expected prepaid amount %d, got %d", b.DepositedAmount, ev.DepositedAmount) + if ev.Provider.Hex() != b.Provider.Hex() { + errC <- fmt.Errorf("expected provider %s, got %s", b.Provider.Hex(), ev.Provider.Hex()) return } - if ev.WindowNumber.Cmp(b.WindowNumber) != 0 { - errC <- fmt.Errorf("expected window number %d, got %d", b.WindowNumber, ev.WindowNumber) + if ev.DepositedAmount.Cmp(b.DepositedAmount) != 0 { + errC <- fmt.Errorf("expected prepaid amount %d, got %d", b.DepositedAmount, ev.DepositedAmount) return } close(errC) @@ -51,7 +51,7 @@ func TestEventHandler(t *testing.T) { t.Fatal(err) } - event := bidderABI.Events["BidderRegistered"] + event := bidderABI.Events["BidderDeposited"] evtHdlr.setTopicAndContract(event.ID, &bidderABI) @@ -61,16 +61,16 @@ func TestEventHandler(t *testing.T) { } bidder := common.HexToHash(b.Bidder.Hex()) + provider := common.HexToHash(b.Provider.Hex()) depositedAmount := common.BigToHash(b.DepositedAmount) - windowNumber := common.BigToHash(b.WindowNumber) // Creating a Log object testLog := types.Log{ Topics: []common.Hash{ event.ID, // The first topic is the hash of the event signature bidder, // The next topics are the indexed event parameters + provider, depositedAmount, - windowNumber, }, Data: buf, } @@ -93,16 +93,16 @@ func TestEventHandler(t *testing.T) { func TestEventManager(t *testing.T) { t.Parallel() - bidders := []bidderregistry.BidderregistryBidderRegistered{ + bidders := []bidderregistry.BidderregistryBidderDeposited{ { Bidder: common.HexToAddress("0xabcd"), + Provider: common.HexToAddress("0x1234"), DepositedAmount: big.NewInt(1000), - WindowNumber: big.NewInt(1), }, { Bidder: common.HexToAddress("0xcdef"), + Provider: common.HexToAddress("0x5678"), DepositedAmount: big.NewInt(2000), - WindowNumber: big.NewInt(2), }, } @@ -113,8 +113,8 @@ func TestEventManager(t *testing.T) { errC := make(chan error, 1) evtHdlr := NewEventHandler( - "BidderRegistered", - func(ev *bidderregistry.BidderregistryBidderRegistered) { + "BidderDeposited", + func(ev *bidderregistry.BidderregistryBidderDeposited) { if count >= len(bidders) { errC <- fmt.Errorf("unexpected event") return @@ -123,12 +123,12 @@ func TestEventManager(t *testing.T) { errC <- fmt.Errorf("expected bidder %s, got %s", bidders[count].Bidder.Hex(), ev.Bidder.Hex()) return } - if ev.DepositedAmount.Cmp(bidders[count].DepositedAmount) != 0 { - errC <- fmt.Errorf("expected prepaid amount %d, got %d", bidders[count].DepositedAmount, ev.DepositedAmount) + if ev.Provider.Hex() != bidders[count].Provider.Hex() { + errC <- fmt.Errorf("expected provider %s, got %s", bidders[count].Provider.Hex(), ev.Provider.Hex()) return } - if ev.WindowNumber.Cmp(bidders[count].WindowNumber) != 0 { - errC <- fmt.Errorf("expected window number %d, got %d", bidders[count].WindowNumber, ev.WindowNumber) + if ev.DepositedAmount.Cmp(bidders[count].DepositedAmount) != 0 { + errC <- fmt.Errorf("expected prepaid amount %d, got %d", bidders[count].DepositedAmount, ev.DepositedAmount) return } count++ @@ -141,12 +141,12 @@ func TestEventManager(t *testing.T) { t.Fatal(err) } - data1, err := bidderABI.Events["BidderRegistered"].Inputs.NonIndexed().Pack() + data1, err := bidderABI.Events["BidderDeposited"].Inputs.NonIndexed().Pack() if err != nil { t.Fatal(err) } - data2, err := bidderABI.Events["BidderRegistered"].Inputs.NonIndexed().Pack() + data2, err := bidderABI.Events["BidderDeposited"].Inputs.NonIndexed().Pack() if err != nil { t.Fatal(err) } @@ -154,27 +154,27 @@ func TestEventManager(t *testing.T) { logs := []types.Log{ { Topics: []common.Hash{ - bidderABI.Events["BidderRegistered"].ID, + bidderABI.Events["BidderDeposited"].ID, common.HexToHash(bidders[0].Bidder.Hex()), + common.HexToHash(bidders[0].Provider.Hex()), common.BigToHash(bidders[0].DepositedAmount), - common.BigToHash(bidders[0].WindowNumber), }, Data: data1, BlockNumber: 1, }, { Topics: []common.Hash{ - bidderABI.Events["BidderRegistered"].ID, + bidderABI.Events["BidderDeposited"].ID, common.HexToHash(bidders[1].Bidder.Hex()), + common.HexToHash(bidders[1].Provider.Hex()), common.BigToHash(bidders[1].DepositedAmount), - common.BigToHash(bidders[1].WindowNumber), }, Data: data2, BlockNumber: 2, }, { Topics: []common.Hash{ - bidderABI.Events["BidderRegistered"].ID, + bidderABI.Events["BidderDeposited"].ID, common.HexToHash("test"), common.BigToHash(big.NewInt(3000)), }, From d5a358018805534ea44668c6a2e2df083ee419a6 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 6 Aug 2025 23:17:28 -0700 Subject: [PATCH 036/117] Update stathandler.go --- tools/dashboard/stathandler.go | 177 ++++++++++++--------------------- 1 file changed, 66 insertions(+), 111 deletions(-) diff --git a/tools/dashboard/stathandler.go b/tools/dashboard/stathandler.go index 349922eeb..99c36089c 100644 --- a/tools/dashboard/stathandler.go +++ b/tools/dashboard/stathandler.go @@ -17,11 +17,10 @@ import ( type statHandler struct { statMu sync.RWMutex lastBlock uint64 - lastWindow uint64 blocksPerWindow uint64 blockStats *lru.Cache[uint64, *BlockStats] providerStakes *lru.Cache[string, *ProviderBalances] - bidderAllowances *lru.Cache[uint64, []*BidderAllowance] + bidderDeposits *lru.Cache[depositKey, []*BidderDeposit] commitments *lru.Cache[[32]byte, *preconf.PreconfmanagerOpenedCommitmentStored] commitmentsByBlock *lru.Cache[uint64, []*preconf.PreconfmanagerOpenedCommitmentStored] totalEncryptedCommitments uint64 @@ -53,9 +52,10 @@ type ProviderBalances struct { SlashesCount uint64 `json:"slashes_count"` } -type BidderAllowance struct { +type BidderDeposit struct { Bidder string `json:"bidder"` - Allowance string `json:"allowance"` + Provider string `json:"provider"` + Amount string `json:"amount"` Refunds string `json:"refunds"` Settled string `json:"settled"` Withdrawn string `json:"withdrawn"` @@ -64,10 +64,9 @@ type BidderAllowance struct { SettledCount uint64 `json:"settled_count"` } -type WindowStats struct { - Window uint64 `json:"window"` - Bidders []*BidderAllowance `json:"bidders"` - Blocks []*BlockStats `json:"blocks"` +type depositKey struct { + bidder string + provider string } type AggregateStats struct { @@ -80,7 +79,6 @@ type AggregateStats struct { type DashboardOut struct { Aggregate *AggregateStats `json:"aggregate"` Providers []*ProviderBalances `json:"providers"` - Windows []*WindowStats `json:"windows"` } func newStatHandler(evtMgr events.EventManager, blocksPerWindow uint64) (*statHandler, error) { @@ -94,7 +92,7 @@ func newStatHandler(evtMgr events.EventManager, blocksPerWindow uint64) (*statHa return nil, err } - bidderAllowances, err := lru.New[uint64, []*BidderAllowance](1000) + bidderDeposits, err := lru.New[depositKey, []*BidderDeposit](1000) if err != nil { return nil, err } @@ -113,7 +111,7 @@ func newStatHandler(evtMgr events.EventManager, blocksPerWindow uint64) (*statHa blocksPerWindow: blocksPerWindow, blockStats: blockStats, providerStakes: providerStakes, - bidderAllowances: bidderAllowances, + bidderDeposits: bidderDeposits, commitments: commitments, commitmentsByBlock: commitmentsByBlock, evtMgr: evtMgr, @@ -147,9 +145,6 @@ func (s *statHandler) configureDashboard() error { if upd.BlockNumber.Uint64() > s.lastBlock { s.lastBlock = upd.BlockNumber.Uint64() } - if upd.Window.Uint64() > s.lastWindow { - s.lastWindow = upd.Window.Uint64() - } }, ), events.NewEventHandler( @@ -198,7 +193,10 @@ func (s *statHandler) configureDashboard() error { } p.OpenedCommitmentsCount++ _ = s.providerStakes.Add(upd.Committer.Hex(), p) - b, ok := s.bidderAllowances.Get(uint64(existing.Window)) + b, ok := s.bidderDeposits.Get(depositKey{ + bidder: upd.Bidder.Hex(), + provider: upd.Committer.Hex(), + }) if !ok { return } @@ -208,7 +206,10 @@ func (s *statHandler) configureDashboard() error { break } } - _ = s.bidderAllowances.Add(uint64(existing.Window), b) + _ = s.bidderDeposits.Add(depositKey{ + bidder: upd.Bidder.Hex(), + provider: upd.Committer.Hex(), + }, b) }, ), events.NewEventHandler( @@ -321,7 +322,10 @@ func (s *statHandler) configureDashboard() error { existing.RewardsCount++ _ = s.providerStakes.Add(upd.Provider.Hex(), existing) - existingBidders, ok := s.bidderAllowances.Get(upd.Window.Uint64()) + existingBidders, ok := s.bidderDeposits.Get(depositKey{ + bidder: upd.Bidder.Hex(), + provider: upd.Provider.Hex(), + }) if !ok { return } @@ -337,18 +341,24 @@ func (s *statHandler) configureDashboard() error { break } } - _ = s.bidderAllowances.Add(upd.Window.Uint64(), existingBidders) + _ = s.bidderDeposits.Add(depositKey{ + bidder: upd.Bidder.Hex(), + provider: upd.Provider.Hex(), + }, existingBidders) }, ), events.NewEventHandler( - "BidderRegistered", - func(upd *bidderregistry.BidderregistryBidderRegistered) { + "BidderDeposited", + func(upd *bidderregistry.BidderregistryBidderDeposited) { s.statMu.Lock() defer s.statMu.Unlock() - existing, ok := s.bidderAllowances.Get(upd.WindowNumber.Uint64()) + existing, ok := s.bidderDeposits.Get(depositKey{ + bidder: upd.Bidder.Hex(), + provider: upd.Provider.Hex(), + }) if !ok { - existing = make([]*BidderAllowance, 0) + existing = make([]*BidderDeposit, 0) } for _, b := range existing { @@ -357,20 +367,27 @@ func (s *statHandler) configureDashboard() error { } } - existing = append(existing, &BidderAllowance{ - Bidder: upd.Bidder.Hex(), - Allowance: upd.DepositedAmount.String(), + existing = append(existing, &BidderDeposit{ + Bidder: upd.Bidder.Hex(), + Provider: upd.Provider.Hex(), + Amount: upd.DepositedAmount.String(), }) - _ = s.bidderAllowances.Add(upd.WindowNumber.Uint64(), existing) + _ = s.bidderDeposits.Add(depositKey{ + bidder: upd.Bidder.Hex(), + provider: upd.Provider.Hex(), + }, existing) }, ), events.NewEventHandler( - "FundsRetrieved", - func(upd *bidderregistry.BidderregistryFundsRetrieved) { + "FundsUnlocked", + func(upd *bidderregistry.BidderregistryFundsUnlocked) { s.statMu.Lock() defer s.statMu.Unlock() - existing, ok := s.bidderAllowances.Get(upd.Window.Uint64()) + existing, ok := s.bidderDeposits.Get(depositKey{ + bidder: upd.Bidder.Hex(), + provider: upd.Provider.Hex(), + }) if !ok { return } @@ -387,7 +404,10 @@ func (s *statHandler) configureDashboard() error { break } } - _ = s.bidderAllowances.Add(upd.Window.Uint64(), existing) + _ = s.bidderDeposits.Add(depositKey{ + bidder: upd.Bidder.Hex(), + provider: upd.Provider.Hex(), + }, existing) }, ), events.NewEventHandler( @@ -396,19 +416,25 @@ func (s *statHandler) configureDashboard() error { s.statMu.Lock() defer s.statMu.Unlock() - existing, ok := s.bidderAllowances.Get(upd.Window.Uint64()) + existing, ok := s.bidderDeposits.Get(depositKey{ + bidder: upd.Bidder.Hex(), + provider: upd.Provider.Hex(), + }) if !ok { return } for idx, b := range existing { if b.Bidder == upd.Bidder.Hex() { - existing[idx].Withdrawn = upd.Amount.String() + existing[idx].Withdrawn = upd.AmountWithdrawn.String() break } } - _ = s.bidderAllowances.Add(upd.Window.Uint64(), existing) + _ = s.bidderDeposits.Add(depositKey{ + bidder: upd.Bidder.Hex(), + provider: upd.Provider.Hex(), + }, existing) }, ), } @@ -438,24 +464,6 @@ func (s *statHandler) close() { } func (s *statHandler) getDashboard(page, limit int) *DashboardOut { - s.statMu.RLock() - start := s.lastWindow - s.statMu.RUnlock() - - if start > uint64(limit*page) { - start = start - uint64(limit*page) - } - - windows := make([]*WindowStats, 0) - - for i := start; i >= 1 && len(windows) <= limit; i-- { - window := s.getWindowStat(i) - if window == nil { - continue - } - windows = append(windows, window) - } - s.statMu.RLock() providers := s.providerStakes.Values() agg := &AggregateStats{ @@ -468,37 +476,10 @@ func (s *statHandler) getDashboard(page, limit int) *DashboardOut { return &DashboardOut{ Providers: providers, - Windows: windows, Aggregate: agg, } } -func (s *statHandler) getWindowStat(window uint64) *WindowStats { - s.statMu.RLock() - defer s.statMu.RUnlock() - - windowStats := new(WindowStats) - windowStats.Window = window - - blockStart := (window-1)*s.blocksPerWindow + 1 - blockEnd := window * s.blocksPerWindow - for i := blockEnd; i >= blockStart; i-- { - stats, ok := s.blockStats.Get(i) - if !ok { - continue - } - windowStats.Blocks = append(windowStats.Blocks, stats) - } - - bidders, ok := s.bidderAllowances.Get(window) - if !ok { - bidders = make([]*BidderAllowance, 0) - } - windowStats.Bidders = bidders - - return windowStats -} - func (s *statHandler) getProviders() []*ProviderBalances { s.statMu.RLock() defer s.statMu.RUnlock() @@ -506,45 +487,19 @@ func (s *statHandler) getProviders() []*ProviderBalances { return s.providerStakes.Values() } -func (s *statHandler) getWindows(page, limit int) []*WindowStats { - s.statMu.RLock() - start := s.lastWindow - s.statMu.RUnlock() - - if start > uint64(limit*page) { - start = start - uint64(limit*page) - } - - windows := make([]*WindowStats, 0) - for i := start; i >= 1 && len(windows) <= limit; i-- { - window := s.getWindowStat(i) - if window == nil { - continue - } - windows = append(windows, window) - } - - return windows -} - -func (s *statHandler) getCurrentBidders() []*BidderAllowance { - s.statMu.RLock() - window := s.lastWindow - s.statMu.RUnlock() - - return s.getBidders(int(window)) -} - -func (s *statHandler) getBidders(window int) []*BidderAllowance { +func (s *statHandler) getBidders(bidder string, provider string) []*BidderDeposit { s.statMu.RLock() defer s.statMu.RUnlock() - windowAllowances, ok := s.bidderAllowances.Get(uint64(window)) + deposits, ok := s.bidderDeposits.Get(depositKey{ + bidder: bidder, + provider: provider, + }) if !ok { - windowAllowances = make([]*BidderAllowance, 0) + deposits = make([]*BidderDeposit, 0) } - return windowAllowances + return deposits } func (s *statHandler) getBlockStats(block uint64) *BlockStats { From 945f6bc580ad128dc209e779e24a8a2d402199ec Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 6 Aug 2025 23:26:06 -0700 Subject: [PATCH 037/117] finalize dashboard changes --- tools/dashboard/main.go | 60 +--------------------------------- tools/dashboard/stathandler.go | 15 ++++----- 2 files changed, 7 insertions(+), 68 deletions(-) diff --git a/tools/dashboard/main.go b/tools/dashboard/main.go index 2ba0fae6a..a95fefc56 100644 --- a/tools/dashboard/main.go +++ b/tools/dashboard/main.go @@ -303,43 +303,6 @@ func registerRoutes(mux *http.ServeMux, statHdlr *statHandler) { w.WriteHeader(http.StatusOK) }) - mux.HandleFunc("GET /windows", func(w http.ResponseWriter, r *http.Request) { - page, limit := parsePagination(r) - - dout := statHdlr.getWindows(page, limit) - if dout == nil { - http.Error(w, "no data", http.StatusNotFound) - return - } - - if err := json.NewEncoder(w).Encode(dout); err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - } - - w.WriteHeader(http.StatusOK) - }) - - mux.HandleFunc("GET /window/{window}", func(w http.ResponseWriter, r *http.Request) { - windowStr := r.PathValue("window") - window, err := strconv.Atoi(windowStr) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - dout := statHdlr.getWindowStat(uint64(window)) - if dout == nil { - http.Error(w, "no data", http.StatusNotFound) - return - } - - if err := json.NewEncoder(w).Encode(dout); err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - } - - w.WriteHeader(http.StatusOK) - }) - mux.HandleFunc("GET /blocks", func(w http.ResponseWriter, r *http.Request) { page, limit := parsePagination(r) @@ -392,28 +355,7 @@ func registerRoutes(mux *http.ServeMux, statHdlr *statHandler) { }) mux.HandleFunc("GET /bidders", func(w http.ResponseWriter, r *http.Request) { - dout := statHdlr.getCurrentBidders() - if dout == nil { - http.Error(w, "no data", http.StatusNotFound) - return - } - - if err := json.NewEncoder(w).Encode(dout); err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - } - - w.WriteHeader(http.StatusOK) - }) - - mux.HandleFunc("GET /bidders/{window}", func(w http.ResponseWriter, r *http.Request) { - windowStr := r.PathValue("window") - window, err := strconv.Atoi(windowStr) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - dout := statHdlr.getBidders(window) + dout := statHdlr.getBidders() if dout == nil { http.Error(w, "no data", http.StatusNotFound) return diff --git a/tools/dashboard/stathandler.go b/tools/dashboard/stathandler.go index 99c36089c..ee236276b 100644 --- a/tools/dashboard/stathandler.go +++ b/tools/dashboard/stathandler.go @@ -487,19 +487,16 @@ func (s *statHandler) getProviders() []*ProviderBalances { return s.providerStakes.Values() } -func (s *statHandler) getBidders(bidder string, provider string) []*BidderDeposit { +func (s *statHandler) getBidders() []*BidderDeposit { s.statMu.RLock() defer s.statMu.RUnlock() - deposits, ok := s.bidderDeposits.Get(depositKey{ - bidder: bidder, - provider: provider, - }) - if !ok { - deposits = make([]*BidderDeposit, 0) - } + all := make([]*BidderDeposit, 0, s.bidderDeposits.Len()) - return deposits + for _, deposits := range s.bidderDeposits.Values() { + all = append(all, deposits...) + } + return all } func (s *statHandler) getBlockStats(block uint64) *BlockStats { From 510ad35fc46ede097dfccc106f46232aed725f96 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Thu, 7 Aug 2025 19:18:21 -0700 Subject: [PATCH 038/117] changes to deposit.go logic (wip) --- p2p/pkg/depositmanager/deposit.go | 206 ++++++++++++--------- p2p/pkg/depositmanager/store/store.go | 109 ++--------- p2p/pkg/depositmanager/store/store_test.go | 118 +++++------- p2p/pkg/preconfirmation/preconfirmation.go | 19 +- 4 files changed, 192 insertions(+), 260 deletions(-) diff --git a/p2p/pkg/depositmanager/deposit.go b/p2p/pkg/depositmanager/deposit.go index 3e1002f80..b64224cb3 100644 --- a/p2p/pkg/depositmanager/deposit.go +++ b/p2p/pkg/depositmanager/deposit.go @@ -9,7 +9,6 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" bidderregistry "github.com/primev/mev-commit/contracts-abi/clients/BidderRegistry" - blocktracker "github.com/primev/mev-commit/contracts-abi/clients/BlockTracker" "github.com/primev/mev-commit/x/contracts/events" "golang.org/x/sync/errgroup" "google.golang.org/grpc/codes" @@ -17,40 +16,25 @@ import ( ) type BidderRegistryContract interface { - GetDeposit(opts *bind.CallOpts, bidder common.Address, window *big.Int) (*big.Int, error) + GetDeposit(opts *bind.CallOpts, bidder common.Address, provider common.Address) (*big.Int, error) + WithdrawalRequestExists(opts *bind.CallOpts, bidder common.Address, provider common.Address) (bool, error) } type Store interface { - GetBalance(bidder common.Address, windowNumber *big.Int) (*big.Int, error) - SetBalance(bidder common.Address, windowNumber *big.Int, balance *big.Int) error - GetBalanceForBlock( - bidder common.Address, - windowNumber *big.Int, - blockNumber int64, - ) (*big.Int, error) - SetBalanceForBlock( - bidder common.Address, - windowNumber *big.Int, - balance *big.Int, - blockNumber int64, - ) error - RefundBalanceForBlock( - bidder common.Address, - windowNumber *big.Int, - amount *big.Int, - blockNumber int64, - ) error - ClearBalances(windowNumber *big.Int) ([]*big.Int, error) + GetBalance(bidder common.Address, provider common.Address) (*big.Int, error) + SetBalance(bidder common.Address, provider common.Address, balance *big.Int) error + DeleteBalance(bidder common.Address, provider common.Address) error + RefundBalanceIfExists(bidder common.Address, provider common.Address, amount *big.Int) error } type DepositManager struct { - store Store - evtMgr events.EventManager - bidderRegistry BidderRegistryContract - blocksPerWindow uint64 - bidderRegs chan *bidderregistry.BidderregistryBidderRegistered - windowChan chan *blocktracker.BlocktrackerNewWindow - logger *slog.Logger + store Store + evtMgr events.EventManager + bidderRegistry BidderRegistryContract + deposits chan *bidderregistry.BidderregistryBidderDeposited + withdrawRequests chan *bidderregistry.BidderregistryWithdrawalRequested + withdrawals chan *bidderregistry.BidderregistryBidderWithdrawal + logger *slog.Logger } func NewDepositManager( @@ -61,13 +45,13 @@ func NewDepositManager( logger *slog.Logger, ) *DepositManager { return &DepositManager{ - store: store, - blocksPerWindow: blocksPerWindow, - bidderRegistry: bidderRegistry, - bidderRegs: make(chan *bidderregistry.BidderregistryBidderRegistered), - windowChan: make(chan *blocktracker.BlocktrackerNewWindow), - evtMgr: evtMgr, - logger: logger, + store: store, + bidderRegistry: bidderRegistry, + deposits: make(chan *bidderregistry.BidderregistryBidderDeposited), + withdrawRequests: make(chan *bidderregistry.BidderregistryWithdrawalRequested), + withdrawals: make(chan *bidderregistry.BidderregistryBidderWithdrawal), + evtMgr: evtMgr, + logger: logger, } } @@ -77,28 +61,39 @@ func (dm *DepositManager) Start(ctx context.Context) <-chan struct{} { eg, egCtx := errgroup.WithContext(ctx) ev1 := events.NewEventHandler( - "NewWindow", - func(window *blocktracker.BlocktrackerNewWindow) { + "BidderDeposited", + func(bidderDeposit *bidderregistry.BidderregistryBidderDeposited) { select { case <-egCtx.Done(): - dm.logger.Info("new window context done") - case dm.windowChan <- window: + dm.logger.Info("bidder deposited context done") + case dm.deposits <- bidderDeposit: } }, ) ev2 := events.NewEventHandler( - "BidderRegistered", - func(bidderReg *bidderregistry.BidderregistryBidderRegistered) { + "WithdrawalRequested", + func(withdrawalRequested *bidderregistry.BidderregistryWithdrawalRequested) { select { case <-egCtx.Done(): - dm.logger.Info("bidder registered context done") - case dm.bidderRegs <- bidderReg: + dm.logger.Info("withdrawal requested context done") + case dm.withdrawRequests <- withdrawalRequested: } }, ) - sub, err := dm.evtMgr.Subscribe(ev1, ev2) + ev3 := events.NewEventHandler( + "BidderWithdrawal", + func(bidderWithdrawal *bidderregistry.BidderregistryBidderWithdrawal) { + select { + case <-egCtx.Done(): + dm.logger.Info("bidder withdrawal context done") + case dm.withdrawals <- bidderWithdrawal: + } + }, + ) + + sub, err := dm.evtMgr.Subscribe(ev1, ev2, ev3) if err != nil { close(doneChan) return doneChan @@ -120,23 +115,52 @@ func (dm *DepositManager) Start(ctx context.Context) <-chan struct{} { for { select { case <-egCtx.Done(): - dm.logger.Info("clear balances set balances context done") + dm.logger.Info("deposit manager context done") return nil - case window := <-dm.windowChan: - windowToClear := new(big.Int).Sub(window.Window, big.NewInt(1)) - windows, err := dm.store.ClearBalances(windowToClear) + + case deposit := <-dm.deposits: + currentBalance, err := dm.store.GetBalance(deposit.Bidder, deposit.Provider) if err != nil { - dm.logger.Error("failed to clear balances", "error", err, "window", windowToClear) + dm.logger.Error("getting balance", "error", err) return err } - dm.logger.Info("cleared balances", "windows", windows) - case bidderReg := <-dm.bidderRegs: - effectiveStake := new(big.Int).Div(bidderReg.DepositedAmount, new(big.Int).SetUint64(dm.blocksPerWindow)) - if err := dm.store.SetBalance(bidderReg.Bidder, bidderReg.WindowNumber, effectiveStake); err != nil { + if currentBalance == nil { + dm.logger.Debug("balance not found in store, using 0", + "bidder", deposit.Bidder, + "provider", deposit.Provider, + ) + currentBalance = big.NewInt(0) + } + newBalance := new(big.Int).Add(currentBalance, deposit.DepositedAmount) + if err := dm.store.SetBalance(deposit.Bidder, deposit.Provider, newBalance); err != nil { dm.logger.Error("setting balance", "error", err) return err } - dm.logger.Info("set balance", "bidder", bidderReg.Bidder, "window", bidderReg.WindowNumber, "amount", effectiveStake) + dm.logger.Info("set balance from bidder deposit event", + "bidder", deposit.Bidder, + "provider", deposit.Provider, + "new balance", newBalance, + ) + + case withdrawalRequest := <-dm.withdrawRequests: + if err := dm.store.DeleteBalance(withdrawalRequest.Bidder, withdrawalRequest.Provider); err != nil { + dm.logger.Error("deleting balance", "error", err) + return err + } + dm.logger.Info("deleted balance from withdrawal request event", + "bidder", withdrawalRequest.Bidder, + "provider", withdrawalRequest.Provider, + ) + + case withdrawal := <-dm.withdrawals: + if err := dm.store.DeleteBalance(withdrawal.Bidder, withdrawal.Provider); err != nil { + dm.logger.Error("deleting balance", "error", err) + return err + } + dm.logger.Info("deleted balance from withdrawal event", + "bidder", withdrawal.Bidder, + "provider", withdrawal.Provider, + ) } } }) @@ -150,13 +174,11 @@ func (dm *DepositManager) Start(ctx context.Context) <-chan struct{} { return doneChan } -// TODO: Add check in provider node to see if bidder has requested a withdrawal. -// TODO: Also still check the deposit, now it's just w.r.t a provider and not a block. func (dm *DepositManager) CheckAndDeductDeposit( ctx context.Context, - address common.Address, + bidderAddr common.Address, + providerAddr common.Address, bidAmountStr string, - blockNumber int64, ) (func() error, error) { bidAmount, ok := new(big.Int).SetString(bidAmountStr, 10) if !ok { @@ -164,38 +186,37 @@ func (dm *DepositManager) CheckAndDeductDeposit( return nil, status.Errorf(codes.InvalidArgument, "failed to parse bid amount") } - windowToCheck := new(big.Int).SetUint64((uint64(blockNumber)-1)/dm.blocksPerWindow + 1) - - balanceForBlock, err := dm.store.GetBalanceForBlock(address, windowToCheck, blockNumber) + balance, err := dm.store.GetBalance(bidderAddr, providerAddr) if err != nil { - dm.logger.Error("getting balance for block", "error", err) - return nil, status.Errorf(codes.Internal, "failed to get balance for block: %v", err) + dm.logger.Error("getting balance", "error", err) + return nil, status.Errorf(codes.Internal, "failed to get balance: %v", err) } - if balanceForBlock != nil { - newBalance := new(big.Int).Sub(balanceForBlock, bidAmount) + if balance != nil { + newBalance := new(big.Int).Sub(balance, bidAmount) if newBalance.Cmp(big.NewInt(0)) < 0 { - dm.logger.Error("insufficient balance", "balance", balanceForBlock.Uint64(), "bidAmount", bidAmount.Uint64()) + dm.logger.Error("insufficient balance", "balance", balance.Uint64(), "bidAmount", bidAmount.Uint64()) return nil, status.Errorf(codes.FailedPrecondition, "insufficient balance") } - if err := dm.store.SetBalanceForBlock(address, windowToCheck, newBalance, blockNumber); err != nil { - dm.logger.Error("setting balance for block", "error", err) - return nil, status.Errorf(codes.Internal, "failed to set balance for block: %v", err) + if err := dm.store.SetBalance(bidderAddr, providerAddr, newBalance); err != nil { + dm.logger.Error("setting balance", "error", err) + return nil, status.Errorf(codes.Internal, "failed to set balance: %v", err) } return func() error { - return dm.store.RefundBalanceForBlock(address, windowToCheck, bidAmount, blockNumber) + return dm.store.RefundBalanceIfExists(bidderAddr, providerAddr, bidAmount) }, nil } - defaultBalance, err := dm.getBalanceForWindow(ctx, address, windowToCheck) + defaultBalance, err := dm.getDefaultBalance(ctx, bidderAddr, providerAddr) if err != nil { return nil, err } if defaultBalance == nil { - dm.logger.Error("bidder balance not found", "address", address.Hex(), "window", windowToCheck) - return nil, status.Errorf(codes.FailedPrecondition, "balance not found for window %s", windowToCheck.String()) + dm.logger.Error("bidder balance not found", "bidder", bidderAddr.Hex(), "provider", providerAddr.Hex()) + return nil, status.Errorf(codes.FailedPrecondition, + "balance not found for bidder %s and provider %s", bidderAddr.Hex(), providerAddr.Hex()) } if defaultBalance.Cmp(bidAmount) < 0 { @@ -204,46 +225,51 @@ func (dm *DepositManager) CheckAndDeductDeposit( } newBalance := new(big.Int).Sub(defaultBalance, bidAmount) - if err := dm.store.SetBalanceForBlock(address, windowToCheck, newBalance, blockNumber); err != nil { + if err := dm.store.SetBalance(bidderAddr, providerAddr, newBalance); err != nil { dm.logger.Error("setting balance for block", "error", err) return nil, status.Errorf(codes.Internal, "failed to set balance for block: %v", err) } return func() error { - return dm.store.RefundBalanceForBlock(address, windowToCheck, bidAmount, blockNumber) + return dm.store.RefundBalanceIfExists(bidderAddr, providerAddr, bidAmount) }, nil } // fallback to contract if balance not found in store -func (dm *DepositManager) getBalanceForWindow( +func (dm *DepositManager) getDefaultBalance( ctx context.Context, - address common.Address, - windowNumber *big.Int, + bidderAddr common.Address, + providerAddr common.Address, ) (*big.Int, error) { - balance, err := dm.store.GetBalance(address, windowNumber) + balance, err := dm.store.GetBalance(bidderAddr, providerAddr) if err != nil { dm.logger.Error("getting balance", "error", err) return nil, status.Errorf(codes.Internal, "failed to get balance: %v", err) } if balance == nil { - dm.logger.Info("balance not found in store", "address", address.Hex(), "window", windowNumber) + dm.logger.Info("balance not found in store", "bidder", bidderAddr.Hex(), "provider", providerAddr.Hex()) balance, err = dm.bidderRegistry.GetDeposit(&bind.CallOpts{ Context: ctx, - }, address, windowNumber) + }, bidderAddr, providerAddr) if err != nil { dm.logger.Error("getting deposit from contract", "error", err) return nil, status.Errorf(codes.Internal, "failed to get deposit: %v", err) } - // The set balance will only set the max amount that can be used in a block for - // the given window. The actual balance will be deducted in the CheckAndDeductDeposit. - // This prevents the need to synchrnoize the balance update from the events. They - // update the same value. - effectiveBalance := new(big.Int).Div(balance, new(big.Int).SetUint64(dm.blocksPerWindow)) - if err := dm.store.SetBalance(address, windowNumber, effectiveBalance); err != nil { - dm.logger.Error("setting balance", "error", err) - return nil, status.Errorf(codes.Internal, "failed to set balance: %v", err) + withdrawalRequest, err := dm.bidderRegistry.WithdrawalRequestExists(&bind.CallOpts{ + Context: ctx, + }, bidderAddr, providerAddr) + if err != nil { + dm.logger.Error("getting withdrawal request from contract", "error", err) + return nil, status.Errorf(codes.Internal, "failed to get withdrawal request: %v", err) + } + + if !withdrawalRequest && balance.Cmp(big.NewInt(0)) > 0 { + if err := dm.store.SetBalance(bidderAddr, providerAddr, balance); err != nil { + dm.logger.Error("setting balance", "error", err) + return nil, status.Errorf(codes.Internal, "failed to set balance: %v", err) + } } } diff --git a/p2p/pkg/depositmanager/store/store.go b/p2p/pkg/depositmanager/store/store.go index 853008afb..a5de60770 100644 --- a/p2p/pkg/depositmanager/store/store.go +++ b/p2p/pkg/depositmanager/store/store.go @@ -4,11 +4,12 @@ import ( "errors" "fmt" "math/big" - "strings" "sync" "github.com/ethereum/go-ethereum/common" "github.com/primev/mev-commit/p2p/pkg/storage" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" ) const ( @@ -16,14 +17,11 @@ const ( ) var ( - balanceKey = func(window *big.Int, bidder common.Address) string { - return fmt.Sprintf("%s%s/%s", balanceNS, window, bidder) + balanceKey = func(bidder common.Address, provider common.Address) string { + return fmt.Sprintf("%s%s/%s", balanceNS, bidder, provider) } - blockBalanceKey = func(window *big.Int, bidder common.Address, blockNumber int64) string { - return fmt.Sprintf("%s%s/%s/%d", balanceNS, window, bidder, blockNumber) - } - balancePrefix = func(window *big.Int) string { - return fmt.Sprintf("%s%s", balanceNS, window) + balancePrefix = func(bidder common.Address) string { + return fmt.Sprintf("%s%s", balanceNS, bidder) } ) @@ -38,80 +36,18 @@ func New(st storage.Storage) *Store { } } -func (s *Store) SetBalance(bidder common.Address, windowNumber, depositedAmount *big.Int) error { +func (s *Store) SetBalance(bidder common.Address, provider common.Address, depositedAmount *big.Int) error { s.mu.Lock() defer s.mu.Unlock() - return s.st.Put(balanceKey(windowNumber, bidder), depositedAmount.Bytes()) -} - -func (s *Store) GetBalance(bidder common.Address, windowNumber *big.Int) (*big.Int, error) { - s.mu.RLock() - defer s.mu.RUnlock() - - val, err := s.st.Get(balanceKey(windowNumber, bidder)) - switch { - case errors.Is(err, storage.ErrKeyNotFound): - return nil, nil - case err != nil: - return nil, err - } - - return new(big.Int).SetBytes(val), nil -} - -func (s *Store) ClearBalances(windowNumber *big.Int) ([]*big.Int, error) { - if windowNumber == nil || windowNumber.Cmp(big.NewInt(0)) == -1 { - return nil, nil - } - - s.mu.RLock() - windows := make([]*big.Int, 0) - err := s.st.WalkPrefix(balanceNS, func(key string, _ []byte) bool { - parts := strings.Split(key, "/") - if len(parts) != 3 { - return false - } - w, ok := new(big.Int).SetString(parts[1], 10) - if !ok { - return false - } - switch w.Cmp(windowNumber) { - case -1: - windows = append(windows, w) - case 0: - windows = append(windows, w) - return true - } - return false - }) - s.mu.RUnlock() - if err != nil { - return nil, err - } - - s.mu.Lock() - for _, w := range windows { - err := s.st.DeletePrefix(balancePrefix(w)) - if err != nil { - s.mu.Unlock() - return nil, err - } - } - s.mu.Unlock() - - return windows, nil + return s.st.Put(balanceKey(bidder, provider), depositedAmount.Bytes()) } -func (s *Store) GetBalanceForBlock( - bidder common.Address, - window *big.Int, - blockNumber int64, -) (*big.Int, error) { +func (s *Store) GetBalance(bidder common.Address, provider common.Address) (*big.Int, error) { s.mu.RLock() defer s.mu.RUnlock() - val, err := s.st.Get(blockBalanceKey(window, bidder, blockNumber)) + val, err := s.st.Get(balanceKey(bidder, provider)) switch { case errors.Is(err, storage.ErrKeyNotFound): return nil, nil @@ -122,45 +58,38 @@ func (s *Store) GetBalanceForBlock( return new(big.Int).SetBytes(val), nil } -func (s *Store) SetBalanceForBlock( - bidder common.Address, - window *big.Int, - amount *big.Int, - blockNumber int64, -) error { +func (s *Store) DeleteBalance(bidder common.Address, provider common.Address) error { s.mu.Lock() defer s.mu.Unlock() - - return s.st.Put(blockBalanceKey(window, bidder, blockNumber), amount.Bytes()) + return s.st.Delete(balanceKey(bidder, provider)) } -func (s *Store) RefundBalanceForBlock( +func (s *Store) RefundBalanceIfExists( bidder common.Address, - window *big.Int, + provider common.Address, amount *big.Int, - blockNumber int64, ) error { s.mu.Lock() defer s.mu.Unlock() - val, err := s.st.Get(blockBalanceKey(window, bidder, blockNumber)) + val, err := s.st.Get(balanceKey(bidder, provider)) switch { case errors.Is(err, storage.ErrKeyNotFound): - return s.st.Put(blockBalanceKey(window, bidder, blockNumber), amount.Bytes()) + return status.Errorf(codes.FailedPrecondition, "balance not found, no refund needed") case err != nil: return err } newAmount := new(big.Int).Add(new(big.Int).SetBytes(val), amount) - return s.st.Put(blockBalanceKey(window, bidder, blockNumber), newAmount.Bytes()) + return s.st.Put(balanceKey(bidder, provider), newAmount.Bytes()) } -func (s *Store) BalanceEntries(windowNumber *big.Int) (int, error) { +func (s *Store) BalanceEntries(bidder common.Address) (int, error) { s.mu.RLock() defer s.mu.RUnlock() entries := 0 - prefix := balancePrefix(windowNumber) + prefix := balancePrefix(bidder) err := s.st.WalkPrefix(prefix, func(key string, val []byte) bool { entries++ return false diff --git a/p2p/pkg/depositmanager/store/store_test.go b/p2p/pkg/depositmanager/store/store_test.go index 6b9749f85..5c11c64b6 100644 --- a/p2p/pkg/depositmanager/store/store_test.go +++ b/p2p/pkg/depositmanager/store/store_test.go @@ -2,6 +2,7 @@ package store_test import ( "math/big" + "strings" "testing" "github.com/ethereum/go-ethereum/common" @@ -14,15 +15,15 @@ func TestStore_SetBalance(t *testing.T) { s := store.New(st) bidder := common.HexToAddress("0x123") - windowNumber := big.NewInt(1) + provider := common.HexToAddress("0x456") depositedAmount := big.NewInt(10) - err := s.SetBalance(bidder, windowNumber, depositedAmount) + err := s.SetBalance(bidder, provider, depositedAmount) if err != nil { t.Fatal(err) } - val, err := s.GetBalance(bidder, windowNumber) + val, err := s.GetBalance(bidder, provider) if err != nil { t.Fatal(err) } @@ -36,15 +37,15 @@ func TestStore_GetBalance(t *testing.T) { s := store.New(st) bidder := common.HexToAddress("0x123") - windowNumber := big.NewInt(1) + provider := common.HexToAddress("0x456") depositedAmount := big.NewInt(10) - err := s.SetBalance(bidder, windowNumber, depositedAmount) + err := s.SetBalance(bidder, provider, depositedAmount) if err != nil { t.Fatal(err) } - val, err := s.GetBalance(bidder, windowNumber) + val, err := s.GetBalance(bidder, provider) if err != nil { t.Fatal(err) } @@ -53,121 +54,90 @@ func TestStore_GetBalance(t *testing.T) { } } -func TestStore_ClearBalances(t *testing.T) { +func TestStore_GetBalance_NoBalance(t *testing.T) { st := inmem.New() s := store.New(st) - windowNumber := big.NewInt(1) - bidder1 := common.HexToAddress("0x123") - bidder2 := common.HexToAddress("0x456") - depositedAmount := big.NewInt(10) - - err := s.SetBalance(bidder1, windowNumber, depositedAmount) - if err != nil { - t.Fatal(err) - } - err = s.SetBalance(bidder2, windowNumber, depositedAmount) - if err != nil { - t.Fatal(err) - } - - windows, err := s.ClearBalances(windowNumber) - if err != nil { - t.Fatal(err) - } - if len(windows) != 1 { - t.Fatalf("expected 1, got %d", len(windows)) - } - - val1, err := s.GetBalance(bidder1, windowNumber) - if err != nil { - t.Fatal(err) - } - if val1 != nil { - t.Fatalf("expected nil, got %s", val1.String()) - } + bidder := common.HexToAddress("0x123") + provider := common.HexToAddress("0x456") - val2, err := s.GetBalance(bidder2, windowNumber) + val, err := s.GetBalance(bidder, provider) if err != nil { t.Fatal(err) } - if val2 != nil { - t.Fatalf("expected nil, got %s", val2.String()) + if val != nil { + t.Fatalf("expected nil, got %s", val.String()) } } -func TestStore_GetBalanceForBlock(t *testing.T) { +func TestStore_RefundBalanceIfExists(t *testing.T) { st := inmem.New() s := store.New(st) bidder := common.HexToAddress("0x123") - windowNumber := big.NewInt(1) - blockNumber := int64(10) + provider := common.HexToAddress("0x456") amount := big.NewInt(20) - err := s.SetBalanceForBlock(bidder, windowNumber, amount, blockNumber) - if err != nil { - t.Fatal(err) + err := s.RefundBalanceIfExists(bidder, provider, amount) + if err == nil { + t.Fatal("expected error, got nil") + } + if !strings.Contains(err.Error(), "balance not found, no refund needed") { + t.Fatalf("expected error containing 'balance not found, no refund needed', got %v", err) } - val, err := s.GetBalanceForBlock(bidder, windowNumber, blockNumber) + err = s.SetBalance(bidder, provider, amount) if err != nil { t.Fatal(err) } - if val.Cmp(amount) != 0 { - t.Fatalf("expected %s, got %s", amount.String(), val.String()) - } -} - -func TestStore_SetBalanceForBlock(t *testing.T) { - st := inmem.New() - s := store.New(st) - bidder := common.HexToAddress("0x123") - windowNumber := big.NewInt(1) - blockNumber := int64(10) - amount := big.NewInt(20) - - err := s.SetBalanceForBlock(bidder, windowNumber, amount, blockNumber) + refundAmount := big.NewInt(5) + err = s.RefundBalanceIfExists(bidder, provider, refundAmount) if err != nil { t.Fatal(err) } - val, err := s.GetBalanceForBlock(bidder, windowNumber, blockNumber) + val, err := s.GetBalance(bidder, provider) if err != nil { t.Fatal(err) } - if val.Cmp(amount) != 0 { - t.Fatalf("expected %s, got %s", amount.String(), val.String()) + expectedAmount := new(big.Int).SetUint64(25) + if val.Cmp(expectedAmount) != 0 { + t.Fatalf("expected %s, got %s", expectedAmount.String(), val.String()) } } -func TestStore_RefundBalanceForBlock(t *testing.T) { +func TestStore_DeleteBalance(t *testing.T) { st := inmem.New() s := store.New(st) bidder := common.HexToAddress("0x123") - windowNumber := big.NewInt(1) - blockNumber := int64(10) - amount := big.NewInt(20) + provider := common.HexToAddress("0x456") + depositedAmount := big.NewInt(10) - err := s.SetBalanceForBlock(bidder, windowNumber, amount, blockNumber) + err := s.SetBalance(bidder, provider, depositedAmount) if err != nil { t.Fatal(err) } - refundAmount := big.NewInt(5) - err = s.RefundBalanceForBlock(bidder, windowNumber, refundAmount, blockNumber) + val, err := s.GetBalance(bidder, provider) if err != nil { t.Fatal(err) } + if val.Cmp(depositedAmount) != 0 { + t.Fatalf("expected %s, got %s", depositedAmount.String(), val.String()) + } - val, err := s.GetBalanceForBlock(bidder, windowNumber, blockNumber) + err = s.DeleteBalance(bidder, provider) if err != nil { t.Fatal(err) } - expectedAmount := new(big.Int).Add(amount, refundAmount) - if val.Cmp(expectedAmount) != 0 { - t.Fatalf("expected %s, got %s", expectedAmount.String(), val.String()) + + val, err = s.GetBalance(bidder, provider) + if err != nil { + t.Fatal(err) + } + if val != nil { + t.Fatalf("expected nil, got %s", val.String()) } } diff --git a/p2p/pkg/preconfirmation/preconfirmation.go b/p2p/pkg/preconfirmation/preconfirmation.go index 04a35b8d6..85c5de565 100644 --- a/p2p/pkg/preconfirmation/preconfirmation.go +++ b/p2p/pkg/preconfirmation/preconfirmation.go @@ -54,9 +54,9 @@ type BidProcessor interface { type DepositManager interface { CheckAndDeductDeposit( ctx context.Context, - ethAddress common.Address, + bidderAddr common.Address, + providerAddr common.Address, bidAmount string, - blockNumber int64, ) (func() error, error) } @@ -273,12 +273,18 @@ func (p *Preconfirmation) handleBid( if err != nil { return err } - ethAddress, err := p.encryptor.VerifyBid(bid) + bidderAddr, err := p.encryptor.VerifyBid(bid) if err != nil { return err } - refund, err := p.depositMgr.CheckAndDeductDeposit(ctx, *ethAddress, bid.BidAmount, bid.BlockNumber) + opts, err := p.optsGetter(ctx) + if err != nil { + return err + } + providerAddr := opts.From + + tryRefund, err := p.depositMgr.CheckAndDeductDeposit(ctx, *bidderAddr, providerAddr, bid.BidAmount) if err != nil { p.logger.Error("checking deposit", "error", err) return err @@ -288,8 +294,9 @@ func (p *Preconfirmation) handleBid( successful := false defer func() { if !successful { - // Refund the deducted amount if the bid process did not succeed - refundErr := refund() + // Refund the deducted amount if the bid process did not succeed and deposit still exists in store. + // If deposit no longer exists, the bidder is in withdrawal process and refund is thrown away + refundErr := tryRefund() if refundErr != nil { p.logger.Error("refunding deposit", "error", refundErr) } From 4794088bf5365c056443ad03b31e1c9c8b40fa6a Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Mon, 11 Aug 2025 20:48:39 -0700 Subject: [PATCH 039/117] Update deposit.go --- p2p/pkg/depositmanager/deposit.go | 63 +++++++++++++++++-------------- 1 file changed, 35 insertions(+), 28 deletions(-) diff --git a/p2p/pkg/depositmanager/deposit.go b/p2p/pkg/depositmanager/deposit.go index b64224cb3..63a26e2f2 100644 --- a/p2p/pkg/depositmanager/deposit.go +++ b/p2p/pkg/depositmanager/deposit.go @@ -125,11 +125,20 @@ func (dm *DepositManager) Start(ctx context.Context) <-chan struct{} { return err } if currentBalance == nil { - dm.logger.Debug("balance not found in store, using 0", + dm.logger.Debug("balance not found in store, using default from contract", "bidder", deposit.Bidder, "provider", deposit.Provider, ) - currentBalance = big.NewInt(0) + blockBeforeDeposit := new(big.Int).SetUint64(deposit.Raw.BlockNumber - 1) + currentBalance, err = dm.getDefaultBalance(egCtx, deposit.Bidder, deposit.Provider, blockBeforeDeposit) + if err != nil { + dm.logger.Error("getting default balance", "error", err) + return err + } + if currentBalance == nil { + dm.logger.Error("No balance found in contract. Assuming zero") + currentBalance = big.NewInt(0) + } } newBalance := new(big.Int).Add(currentBalance, deposit.DepositedAmount) if err := dm.store.SetBalance(deposit.Bidder, deposit.Provider, newBalance); err != nil { @@ -207,8 +216,12 @@ func (dm *DepositManager) CheckAndDeductDeposit( return dm.store.RefundBalanceIfExists(bidderAddr, providerAddr, bidAmount) }, nil } + dm.logger.Info("balance not found in store, defaulting to contract call", + "bidder", bidderAddr.Hex(), + "provider", providerAddr.Hex(), + ) - defaultBalance, err := dm.getDefaultBalance(ctx, bidderAddr, providerAddr) + defaultBalance, err := dm.getDefaultBalance(ctx, bidderAddr, providerAddr, nil) // nil for latest block if err != nil { return nil, err } @@ -240,36 +253,30 @@ func (dm *DepositManager) getDefaultBalance( ctx context.Context, bidderAddr common.Address, providerAddr common.Address, + blockNumber *big.Int, ) (*big.Int, error) { - balance, err := dm.store.GetBalance(bidderAddr, providerAddr) - if err != nil { - dm.logger.Error("getting balance", "error", err) - return nil, status.Errorf(codes.Internal, "failed to get balance: %v", err) + + callOpts := &bind.CallOpts{ + Context: ctx, + BlockNumber: blockNumber, } - if balance == nil { - dm.logger.Info("balance not found in store", "bidder", bidderAddr.Hex(), "provider", providerAddr.Hex()) - balance, err = dm.bidderRegistry.GetDeposit(&bind.CallOpts{ - Context: ctx, - }, bidderAddr, providerAddr) - if err != nil { - dm.logger.Error("getting deposit from contract", "error", err) - return nil, status.Errorf(codes.Internal, "failed to get deposit: %v", err) - } + balance, err := dm.bidderRegistry.GetDeposit(callOpts, bidderAddr, providerAddr) + if err != nil { + dm.logger.Error("getting deposit from contract", "error", err) + return nil, status.Errorf(codes.Internal, "failed to get deposit: %v", err) + } - withdrawalRequest, err := dm.bidderRegistry.WithdrawalRequestExists(&bind.CallOpts{ - Context: ctx, - }, bidderAddr, providerAddr) - if err != nil { - dm.logger.Error("getting withdrawal request from contract", "error", err) - return nil, status.Errorf(codes.Internal, "failed to get withdrawal request: %v", err) - } + withdrawalRequest, err := dm.bidderRegistry.WithdrawalRequestExists(callOpts, bidderAddr, providerAddr) + if err != nil { + dm.logger.Error("getting withdrawal request from contract", "error", err) + return nil, status.Errorf(codes.Internal, "failed to get withdrawal request: %v", err) + } - if !withdrawalRequest && balance.Cmp(big.NewInt(0)) > 0 { - if err := dm.store.SetBalance(bidderAddr, providerAddr, balance); err != nil { - dm.logger.Error("setting balance", "error", err) - return nil, status.Errorf(codes.Internal, "failed to set balance: %v", err) - } + if !withdrawalRequest && balance.Cmp(big.NewInt(0)) > 0 { + if err := dm.store.SetBalance(bidderAddr, providerAddr, balance); err != nil { + dm.logger.Error("setting balance", "error", err) + return nil, status.Errorf(codes.Internal, "failed to set balance: %v", err) } } From a2503a3c18184ffc9aab8e94b92646690437bb52 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Mon, 11 Aug 2025 20:57:17 -0700 Subject: [PATCH 040/117] Update deposit.go --- p2p/pkg/depositmanager/deposit.go | 1 - 1 file changed, 1 deletion(-) diff --git a/p2p/pkg/depositmanager/deposit.go b/p2p/pkg/depositmanager/deposit.go index 63a26e2f2..a7a875659 100644 --- a/p2p/pkg/depositmanager/deposit.go +++ b/p2p/pkg/depositmanager/deposit.go @@ -38,7 +38,6 @@ type DepositManager struct { } func NewDepositManager( - blocksPerWindow uint64, store Store, evtMgr events.EventManager, bidderRegistry BidderRegistryContract, From 38f5d4da964559a9ba3d1f0caf7291e671401b06 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Mon, 11 Aug 2025 21:58:59 -0700 Subject: [PATCH 041/117] Update deposit_test.go --- p2p/pkg/depositmanager/deposit_test.go | 291 ++++++++++++++++++++----- 1 file changed, 232 insertions(+), 59 deletions(-) diff --git a/p2p/pkg/depositmanager/deposit_test.go b/p2p/pkg/depositmanager/deposit_test.go index 27d068029..65575c8f4 100644 --- a/p2p/pkg/depositmanager/deposit_test.go +++ b/p2p/pkg/depositmanager/deposit_test.go @@ -22,15 +22,24 @@ import ( ) type MockBidderRegistryContract struct { - GetDepositFunc func(opts *bind.CallOpts, bidder common.Address, window *big.Int) (*big.Int, error) + GetDepositFunc func(opts *bind.CallOpts, bidder common.Address, provider common.Address) (*big.Int, error) + WithdrawalRequestExistsFunc func(opts *bind.CallOpts, bidder common.Address, provider common.Address) (bool, error) } func (m *MockBidderRegistryContract) GetDeposit( opts *bind.CallOpts, bidder common.Address, - window *big.Int, + provider common.Address, ) (*big.Int, error) { - return m.GetDepositFunc(opts, bidder, window) + return m.GetDepositFunc(opts, bidder, provider) +} + +func (m *MockBidderRegistryContract) WithdrawalRequestExists( + opts *bind.CallOpts, + bidder common.Address, + provider common.Address, +) (bool, error) { + return m.WithdrawalRequestExistsFunc(opts, bidder, provider) } func TestDepositManager(t *testing.T) { @@ -54,35 +63,45 @@ func TestDepositManager(t *testing.T) { GetDepositFunc: func( opts *bind.CallOpts, bidder common.Address, - window *big.Int, + provider common.Address, ) (*big.Int, error) { return big.NewInt(0), nil }, + WithdrawalRequestExistsFunc: func( + opts *bind.CallOpts, + bidder common.Address, + provider common.Address, + ) (bool, error) { + return false, nil + }, } ctx, cancel := context.WithCancel(context.Background()) - dm := depositmanager.NewDepositManager(10, st, evtMgr, bidderRegistry, logger) + dm := depositmanager.NewDepositManager(st, evtMgr, bidderRegistry, logger) done := dm.Start(ctx) // no deposit - _, err = dm.CheckAndDeductDeposit( + refund, err := dm.CheckAndDeductDeposit( context.Background(), common.HexToAddress("0x123"), + common.HexToAddress("0x456"), "10", - 1, ) if err == nil { t.Fatal("expected error") } + if refund != nil { + t.Fatal("expected nil refund") + } - br := &bidderregistry.BidderregistryBidderRegistered{ + br := &bidderregistry.BidderregistryBidderDeposited{ Bidder: common.HexToAddress("0x123"), + Provider: common.HexToAddress("0x456"), DepositedAmount: big.NewInt(100), - WindowNumber: big.NewInt(1), } - err = publishBidderRegistered(evtMgr, &brABI, br) + err = publishBidderDeposited(evtMgr, &brABI, br) if err != nil { t.Fatal(err) } @@ -90,60 +109,177 @@ func TestDepositManager(t *testing.T) { for { if val, err := st.GetBalance( common.HexToAddress("0x123"), - big.NewInt(1), - ); err == nil && val != nil && val.Cmp(big.NewInt(10)) == 0 { + common.HexToAddress("0x456"), + ); err == nil && val != nil && val.Cmp(big.NewInt(100)) == 0 { break } time.Sleep(1 * time.Second) } - for i := int64(1); i <= 10; i++ { - // deduct deposit - refund, err := dm.CheckAndDeductDeposit( - context.Background(), - common.HexToAddress("0x123"), - "10", - i, - ) - if err != nil { - t.Fatal(err) - } + // deduct deposit + refund, err = dm.CheckAndDeductDeposit( + context.Background(), + common.HexToAddress("0x123"), + common.HexToAddress("0x456"), + "100", + ) + if err != nil { + t.Fatal(err) + } - // not enough deposit - _, err = dm.CheckAndDeductDeposit( - context.Background(), + // not enough deposit + _, err = dm.CheckAndDeductDeposit( + context.Background(), + common.HexToAddress("0x123"), + common.HexToAddress("0x456"), + "10", + ) + if err == nil || !strings.Contains(err.Error(), "insufficient balance") { + t.Fatal("expected error for insufficient balance") + } + + err = refund() + if err != nil { + t.Fatal(err) + } + + // deduct deposit after refund + _, err = dm.CheckAndDeductDeposit( + context.Background(), + common.HexToAddress("0x123"), + common.HexToAddress("0x456"), + "10", + ) + if err != nil { + t.Fatal(err) + } + + balance, err := st.GetBalance( + common.HexToAddress("0x123"), + common.HexToAddress("0x456"), + ) + if err != nil { + t.Fatal(err) + } + if balance == nil || balance.Cmp(big.NewInt(90)) != 0 { + t.Fatal("expected balance of 90") + } + + publishBidderWithdrawalRequested(evtMgr, &brABI, &bidderregistry.BidderregistryWithdrawalRequested{ + Bidder: common.HexToAddress("0x123"), + Provider: common.HexToAddress("0x456"), + AvailableAmount: big.NewInt(10), + EscrowedAmount: big.NewInt(10), + Timestamp: big.NewInt(1000), + }) + + for { + if val, err := st.GetBalance( common.HexToAddress("0x123"), - "10", - i, - ) - if err == nil { - t.Fatal("expected error") + common.HexToAddress("0x456"), + ); err == nil && val == nil { + break } + time.Sleep(1 * time.Second) + } - err = refund() + publishBidderWithdrawal(evtMgr, &brABI, &bidderregistry.BidderregistryBidderWithdrawal{ + Bidder: common.HexToAddress("0x123"), + Provider: common.HexToAddress("0x456"), + AmountWithdrawn: big.NewInt(10), + AmountStillEscrowed: big.NewInt(10), + }) + + for { + count, err := st.BalanceEntries(common.HexToAddress("0x123")) if err != nil { t.Fatal(err) } + if count == 0 { + break + } + time.Sleep(1 * time.Second) + } - // deduct deposit after refund - _, err = dm.CheckAndDeductDeposit( - context.Background(), + publishBidderDeposited(evtMgr, &brABI, &bidderregistry.BidderregistryBidderDeposited{ + Bidder: common.HexToAddress("0x123"), + Provider: common.HexToAddress("0x456"), + DepositedAmount: big.NewInt(777), + }) + + for { + if val, err := st.GetBalance( common.HexToAddress("0x123"), - "10", - i, - ) - if err != nil { - t.Fatal(err) + common.HexToAddress("0x456"), + ); err == nil && val != nil && val.Cmp(big.NewInt(777)) == 0 { + break } + time.Sleep(1 * time.Second) } - publishNewWindow(evtMgr, &btABI, big.NewInt(12)) + cancel() + <-done +} + +func TestStartWithBidderAlreadyDeposited(t *testing.T) { + t.Parallel() + + brABI, err := abi.JSON(strings.NewReader(bidderregistry.BidderregistryABI)) + if err != nil { + t.Fatal(err) + } + + btABI, err := abi.JSON(strings.NewReader(blocktracker.BlocktrackerABI)) + if err != nil { + t.Fatal(err) + } + + logger := util.NewTestLogger(io.Discard) + evtMgr := events.NewListener(logger, &btABI, &brABI) + + st := depositstore.New(inmemstorage.New()) + bidderRegistry := &MockBidderRegistryContract{ + GetDepositFunc: func( + opts *bind.CallOpts, + bidder common.Address, + provider common.Address, + ) (*big.Int, error) { + if opts.BlockNumber.Cmp(big.NewInt(15)) != 0 { + t.Fatal("expected block number 15") + } + return big.NewInt(33), nil // Existing deposit + }, + WithdrawalRequestExistsFunc: func( + opts *bind.CallOpts, + bidder common.Address, + provider common.Address, + ) (bool, error) { + if opts.BlockNumber.Cmp(big.NewInt(15)) != 0 { + t.Fatal("expected block number 15") + } + return false, nil + }, + } + + ctx, cancel := context.WithCancel(context.Background()) + + dm := depositmanager.NewDepositManager(st, evtMgr, bidderRegistry, logger) + done := dm.Start(ctx) + + publishBidderDeposited(evtMgr, &brABI, &bidderregistry.BidderregistryBidderDeposited{ + Bidder: common.HexToAddress("0x123"), + Provider: common.HexToAddress("0x456"), + DepositedAmount: big.NewInt(100), + Raw: types.Log{ + BlockNumber: 16, + }, + }) + for { - count, err := st.BalanceEntries(big.NewInt(1)) - if err != nil { - t.Fatal(err) - } - if count == 0 { + if val, err := st.GetBalance( + common.HexToAddress("0x123"), + common.HexToAddress("0x456"), + ); err == nil && val != nil && val.Cmp(big.NewInt(133)) == 0 { break } time.Sleep(1 * time.Second) @@ -153,28 +289,39 @@ func TestDepositManager(t *testing.T) { <-done } -func publishNewWindow( +func publishBidderDeposited( evtMgr events.EventManager, - btABI *abi.ABI, - windowNumber *big.Int, -) { + brABI *abi.ABI, + br *bidderregistry.BidderregistryBidderDeposited, +) error { + event := brABI.Events["BidderDeposited"] + buf, err := event.Inputs.NonIndexed().Pack() + if err != nil { + return err + } + testLog := types.Log{ Topics: []common.Hash{ - btABI.Events["NewWindow"].ID, - common.BigToHash(windowNumber), + event.ID, + common.HexToHash(br.Bidder.Hex()), + common.HexToHash(br.Provider.Hex()), + common.BigToHash(br.DepositedAmount), }, - Data: []byte{}, + Data: buf, + BlockNumber: br.Raw.BlockNumber, } evtMgr.PublishLogEvent(context.Background(), testLog) + + return nil } -func publishBidderRegistered( +func publishBidderWithdrawalRequested( evtMgr events.EventManager, brABI *abi.ABI, - br *bidderregistry.BidderregistryBidderRegistered, + br *bidderregistry.BidderregistryWithdrawalRequested, ) error { - event := brABI.Events["BidderRegistered"] - buf, err := event.Inputs.NonIndexed().Pack() + event := brABI.Events["WithdrawalRequested"] + buf, err := event.Inputs.NonIndexed().Pack(br.AvailableAmount, br.EscrowedAmount) if err != nil { return err } @@ -183,8 +330,34 @@ func publishBidderRegistered( Topics: []common.Hash{ event.ID, common.HexToHash(br.Bidder.Hex()), - common.BigToHash(br.DepositedAmount), - common.BigToHash(br.WindowNumber), + common.HexToHash(br.Provider.Hex()), + common.BigToHash(br.Timestamp), + }, + Data: buf, + BlockNumber: 1, + } + evtMgr.PublishLogEvent(context.Background(), testLog) + + return nil +} + +func publishBidderWithdrawal( + evtMgr events.EventManager, + brABI *abi.ABI, + br *bidderregistry.BidderregistryBidderWithdrawal, +) error { + event := brABI.Events["BidderWithdrawal"] + buf, err := event.Inputs.NonIndexed().Pack(br.AmountWithdrawn) + if err != nil { + return err + } + + testLog := types.Log{ + Topics: []common.Hash{ + event.ID, + common.HexToHash(br.Bidder.Hex()), + common.HexToHash(br.Provider.Hex()), + common.BigToHash(br.AmountWithdrawn), }, Data: buf, } From 6234ffdad56e3d8514505c254c9208bb779363dd Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Mon, 11 Aug 2025 22:12:39 -0700 Subject: [PATCH 042/117] wip --- p2p/pkg/node/node.go | 19 ------------------- p2p/pkg/rpc/bidder/service.go | 2 -- 2 files changed, 21 deletions(-) diff --git a/p2p/pkg/node/node.go b/p2p/pkg/node/node.go index 18b2475e5..e00eac296 100644 --- a/p2p/pkg/node/node.go +++ b/p2p/pkg/node/node.go @@ -505,12 +505,6 @@ func NewNode(opts *Options) (*Node, error) { ) srv.RegisterMetricsCollectors(tracker.Metrics()...) - bpwBigInt, err := blockTrackerSession.GetBlocksPerWindow() - if err != nil { - opts.Logger.Error("failed to get blocks per window", "error", err) - return nil, err - } - l1ContractRPC, err := ethclient.Dial(opts.L1RPCURL) if err != nil { opts.Logger.Error("failed to connect to rpc", "error", err) @@ -565,7 +559,6 @@ func NewNode(opts *Options) (*Node, error) { Startable: validatorAPI, }, ) - blocksPerWindow := bpwBigInt.Uint64() switch opts.PeerType { case p2p.PeerTypeProvider.String(): @@ -583,7 +576,6 @@ func NewNode(opts *Options) (*Node, error) { bidProcessor = providerAPI srv.RegisterMetricsCollectors(providerAPI.Metrics()...) depositMgr = depositmanager.NewDepositManager( - blocksPerWindow, depositmanagerstore.New(store), evtMgr, bidderRegistry, @@ -664,16 +656,6 @@ func NewNode(opts *Options) (*Node, error) { autodepositorStore := autodepositorstore.New(store) - autoDeposit = autodepositor.New( - evtMgr, - bidderRegistry, - blockTrackerSession, - optsGetter, - autodepositorStore, - opts.OracleWindowOffset, - opts.Logger.With("component", "auto_deposit_tracker"), - ) - nd.closers = append( nd.closers, ioCloserFunc(func() error { @@ -687,7 +669,6 @@ func NewNode(opts *Options) (*Node, error) { bidderAPI := bidderapi.NewService( opts.KeySigner.GetAddress(), - blocksPerWindow, preconfProto, bidderRegistry, blockTrackerSession, diff --git a/p2p/pkg/rpc/bidder/service.go b/p2p/pkg/rpc/bidder/service.go index 8965606c0..8665d19ce 100644 --- a/p2p/pkg/rpc/bidder/service.go +++ b/p2p/pkg/rpc/bidder/service.go @@ -44,7 +44,6 @@ type Service struct { func NewService( owner common.Address, - blocksPerWindow uint64, sender PreconfSender, registryContract BidderRegistryContract, blockTrackerContract BlockTrackerContract, @@ -61,7 +60,6 @@ func NewService( ) *Service { return &Service{ owner: owner, - blocksPerWindow: blocksPerWindow, sender: sender, registryContract: registryContract, blockTrackerContract: blockTrackerContract, From 4d4eab001271ea69289850379be45169fc2cc489 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Mon, 11 Aug 2025 23:33:28 -0700 Subject: [PATCH 043/117] rm autodeposit dir --- p2p/pkg/autodepositor/autodepositor.go | 334 -------------------- p2p/pkg/autodepositor/autodepositor_test.go | 331 ------------------- p2p/pkg/autodepositor/store/store.go | 94 ------ p2p/pkg/autodepositor/store/store_test.go | 55 ---- 4 files changed, 814 deletions(-) delete mode 100644 p2p/pkg/autodepositor/autodepositor.go delete mode 100644 p2p/pkg/autodepositor/autodepositor_test.go delete mode 100644 p2p/pkg/autodepositor/store/store.go delete mode 100644 p2p/pkg/autodepositor/store/store_test.go diff --git a/p2p/pkg/autodepositor/autodepositor.go b/p2p/pkg/autodepositor/autodepositor.go deleted file mode 100644 index 52660c76e..000000000 --- a/p2p/pkg/autodepositor/autodepositor.go +++ /dev/null @@ -1,334 +0,0 @@ -package autodepositor - -import ( - "context" - "fmt" - "log/slog" - "math/big" - "slices" - "sync" - "sync/atomic" - - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - blocktracker "github.com/primev/mev-commit/contracts-abi/clients/BlockTracker" - "github.com/primev/mev-commit/x/contracts/events" - "golang.org/x/sync/errgroup" -) - -var ErrNotRunning = fmt.Errorf("auto deposit tracker is not running") - -type OptsGetter func(context.Context) (*bind.TransactOpts, error) - -type BidderRegistryContract interface { - DepositForWindows(opts *bind.TransactOpts, windows []*big.Int) (*types.Transaction, error) - DepositForWindow(opts *bind.TransactOpts, window *big.Int) (*types.Transaction, error) - WithdrawFromWindows(opts *bind.TransactOpts, windows []*big.Int) (*types.Transaction, error) - GetDeposit(opts *bind.CallOpts, bidder common.Address, window *big.Int) (*big.Int, error) -} - -type BlockTrackerContract interface { - GetCurrentWindow() (*big.Int, error) -} - -type DepositStore interface { - // StoreDeposits stores the deposited windows. - StoreDeposits(ctx context.Context, windows []*big.Int) error - // ListDeposits lists the deposited windows upto and including the lastWindow. - // If lastWindow is nil, it lists all deposits. - ListDeposits(ctx context.Context, lastWindow *big.Int) ([]*big.Int, error) - // ClearDeposits clears the deposits for the given windows. - ClearDeposits(ctx context.Context, windows []*big.Int) error - // IsDepositMade checks if the deposit is already made for the given window. - IsDepositMade(ctx context.Context, window *big.Int) bool -} - -type AutoDepositTracker struct { - startMu sync.Mutex - isWorking bool - eventMgr events.EventManager - windowChan chan *blocktracker.BlocktrackerNewWindow - brContract BidderRegistryContract - btContract BlockTrackerContract - store DepositStore - optsGetter OptsGetter - currentOracleWindow atomic.Value - oracleWindowOffset *big.Int - logger *slog.Logger - cancelFunc context.CancelFunc -} - -func New( - evtMgr events.EventManager, - brContract BidderRegistryContract, - btContract BlockTrackerContract, - optsGetter OptsGetter, - store DepositStore, - oracleWindowOffset *big.Int, - logger *slog.Logger, -) *AutoDepositTracker { - return &AutoDepositTracker{ - eventMgr: evtMgr, - brContract: brContract, - btContract: btContract, - optsGetter: optsGetter, - store: store, - oracleWindowOffset: oracleWindowOffset, - windowChan: make(chan *blocktracker.BlocktrackerNewWindow, 1), - logger: logger, - } -} - -func (adt *AutoDepositTracker) Start( - ctx context.Context, - startWindow, amount *big.Int, -) error { - adt.startMu.Lock() - defer adt.startMu.Unlock() - - if adt.isWorking { - return fmt.Errorf("auto deposit tracker is already running") - } - - currentOracleWindow, err := adt.btContract.GetCurrentWindow() - if err != nil { - return fmt.Errorf("failed to get current window: %w", err) - } - adt.currentOracleWindow.Store(currentOracleWindow) - - if startWindow == nil { - startWindow = currentOracleWindow - // adding + N as oracle runs N window behind - startWindow = new(big.Int).Add(startWindow, adt.oracleWindowOffset) - } - - eg, egCtx := errgroup.WithContext(context.Background()) - egCtx, cancel := context.WithCancel(egCtx) - adt.cancelFunc = cancel - - sub, err := adt.initSub(egCtx) - - if err != nil { - return fmt.Errorf("error subscribing to event: %w", err) - } - - err = adt.doInitialDeposit(ctx, startWindow, amount) - if err != nil { - return fmt.Errorf("failed to do initial deposit: %w", err) - } - - adt.startAutodeposit(egCtx, eg, amount, sub) - - started := make(chan struct{}) - go func() { - close(started) - if err := eg.Wait(); err != nil { - adt.logger.Error("error in errgroup", "err", err) - } - adt.startMu.Lock() - adt.isWorking = false - adt.startMu.Unlock() - }() - select { - case <-ctx.Done(): - return ctx.Err() - case <-started: - adt.isWorking = true - } - return nil -} - -func (adt *AutoDepositTracker) doInitialDeposit(ctx context.Context, startWindow, amount *big.Int) error { - nextWindow := new(big.Int).Add(startWindow, big.NewInt(1)) - newDeposits := []*big.Int{startWindow, nextWindow} - - // Check if the deposit is already made. If the nodes was down for a short period - // and the deposits were already made, we should not make the deposit again. - newDeposits = slices.DeleteFunc(newDeposits, func(i *big.Int) bool { - return adt.isDeposited(ctx, i) - }) - - if len(newDeposits) == 0 { - return nil - } - - opts, err := adt.optsGetter(ctx) - if err != nil { - return fmt.Errorf("failed to get transact opts: %w", err) - } - opts.Value = big.NewInt(0).Mul(amount, big.NewInt(int64(len(newDeposits)))) - - // Make initial deposit for the first two windows - _, err = adt.brContract.DepositForWindows(opts, newDeposits) - if err != nil { - return fmt.Errorf("failed to deposit for windows: %w", err) - } - - return adt.store.StoreDeposits(ctx, newDeposits) -} - -func (adt *AutoDepositTracker) initSub(egCtx context.Context) (events.Subscription, error) { - evt := events.NewEventHandler( - "NewWindow", - func(update *blocktracker.BlocktrackerNewWindow) { - adt.logger.Debug( - "new window event", - "window", update.Window, - ) - select { - case <-egCtx.Done(): - case adt.windowChan <- update: - } - }, - ) - - sub, err := adt.eventMgr.Subscribe(evt) - if err != nil { - return nil, fmt.Errorf("error subscribing to event: %w", err) - } - return sub, nil -} - -func (adt *AutoDepositTracker) startAutodeposit(egCtx context.Context, eg *errgroup.Group, amount *big.Int, sub events.Subscription) { - eg.Go(func() error { - for { - select { - case <-egCtx.Done(): - adt.logger.Info("auto deposit tracker context done") - return nil - case err := <-sub.Err(): - return fmt.Errorf("error in autodeposit event subscription: %w", err) - case window := <-adt.windowChan: - adt.currentOracleWindow.Store(window.Window) - withdrawWindows, err := adt.store.ListDeposits(egCtx, new(big.Int).Sub(window.Window, big.NewInt(1))) - switch { - case err != nil: - adt.logger.Error("failed to list deposits", "err", err) - return err - case len(withdrawWindows) == 0: - adt.logger.Info("no deposits to withdraw") - case len(withdrawWindows) > 0: - adt.logger.Info("deposits to withdraw", "windows", withdrawWindows) - opts, err := adt.optsGetter(egCtx) - if err != nil { - return err - } - txn, err := adt.brContract.WithdrawFromWindows(opts, withdrawWindows) - if err != nil { - return err - } - adt.logger.Info("withdraw from windows", "hash", txn.Hash(), "windows", withdrawWindows) - err = adt.store.ClearDeposits(egCtx, withdrawWindows) - if err != nil { - return fmt.Errorf("failed to clear deposits: %w", err) - } - } - - // Make deposit for the next window. The window event is N windows - // behind the current window in progress. - nextWindow := new(big.Int).Add(window.Window, adt.oracleWindowOffset) - nextWindow = new(big.Int).Add(nextWindow, big.NewInt(1)) - if adt.isDeposited(egCtx, nextWindow) { - continue - } - - opts, err := adt.optsGetter(egCtx) - if err != nil { - return err - } - opts.Value = amount - - txn, err := adt.brContract.DepositForWindow(opts, nextWindow) - if err != nil { - return err - } - adt.logger.Info( - "deposited to next window", - "hash", txn.Hash(), - "window", nextWindow, - "amount", amount, - ) - err = adt.store.StoreDeposits(egCtx, []*big.Int{nextWindow}) - if err != nil { - return fmt.Errorf("failed to store deposits: %w", err) - } - } - } - }) -} - -func (adt *AutoDepositTracker) Stop() ([]*big.Int, error) { - adt.startMu.Lock() - defer adt.startMu.Unlock() - - if !adt.isWorking { - return nil, ErrNotRunning - } - if adt.cancelFunc != nil { - adt.cancelFunc() - } - - windowNumbers, err := adt.store.ListDeposits(context.Background(), nil) - if err != nil { - adt.logger.Error("failed to list deposits", "err", err) - } - - adt.isWorking = false - - adt.logger.Info("stop auto deposit tracker", "windowsToWithdraw", windowNumbers) - return windowNumbers, nil -} - -func (adt *AutoDepositTracker) IsWorking() bool { - adt.startMu.Lock() - defer adt.startMu.Unlock() - - return adt.isWorking -} - -func (adt *AutoDepositTracker) GetStatus() (map[uint64]bool, bool, *big.Int) { - adt.startMu.Lock() - isWorking := adt.isWorking - adt.startMu.Unlock() - - windows, err := adt.store.ListDeposits(context.Background(), nil) - if err != nil { - adt.logger.Error("failed to list deposits", "err", err) - } - deposits := make(map[uint64]bool) - for _, w := range windows { - deposits[w.Uint64()] = true - } - - var currentOracleWindow *big.Int - if val := adt.currentOracleWindow.Load(); val != nil { - currentOracleWindow = val.(*big.Int) - } - - return deposits, isWorking, currentOracleWindow -} - -func (adt *AutoDepositTracker) isDeposited(ctx context.Context, window *big.Int) bool { - if adt.store.IsDepositMade(ctx, window) { - return true - } - - opts, err := adt.optsGetter(ctx) - if err != nil { - adt.logger.Error("failed to get transact opts", "err", err) - return false - } - - // fallback to contract call if the local state was not flushed properly - deposit, err := adt.brContract.GetDeposit(&bind.CallOpts{ - Context: ctx, - From: opts.From, - }, opts.From, window) - if err != nil { - adt.logger.Error("failed to get deposit", "err", err) - return false - } - - return deposit.Cmp(big.NewInt(0)) > 0 -} diff --git a/p2p/pkg/autodepositor/autodepositor_test.go b/p2p/pkg/autodepositor/autodepositor_test.go deleted file mode 100644 index 430af89e5..000000000 --- a/p2p/pkg/autodepositor/autodepositor_test.go +++ /dev/null @@ -1,331 +0,0 @@ -package autodepositor_test - -import ( - "context" - "io" - "math/big" - "os" - "strings" - "testing" - "time" - - "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" - bidderregistry "github.com/primev/mev-commit/contracts-abi/clients/BidderRegistry" - blocktracker "github.com/primev/mev-commit/contracts-abi/clients/BlockTracker" - "github.com/primev/mev-commit/p2p/pkg/autodepositor" - "github.com/primev/mev-commit/p2p/pkg/autodepositor/store" - inmemstorage "github.com/primev/mev-commit/p2p/pkg/storage/inmem" - "github.com/primev/mev-commit/x/contracts/events" - "github.com/primev/mev-commit/x/util" -) - -type MockBidderRegistryContract struct { - DepositForWindowsFunc func(opts *bind.TransactOpts, windows []*big.Int) (*types.Transaction, error) - WithdrawFromWindowsFunc func(opts *bind.TransactOpts, windows []*big.Int) (*types.Transaction, error) - DepositForWindowFunc func(opts *bind.TransactOpts, window *big.Int) (*types.Transaction, error) -} - -func (m *MockBidderRegistryContract) DepositForWindows(opts *bind.TransactOpts, windows []*big.Int) (*types.Transaction, error) { - return m.DepositForWindowsFunc(opts, windows) -} - -func (m *MockBidderRegistryContract) DepositForWindow(opts *bind.TransactOpts, window *big.Int) (*types.Transaction, error) { - return m.DepositForWindowFunc(opts, window) -} - -func (m *MockBidderRegistryContract) WithdrawFromWindows(opts *bind.TransactOpts, windows []*big.Int) (*types.Transaction, error) { - return m.WithdrawFromWindowsFunc(opts, windows) -} - -func (m *MockBidderRegistryContract) GetDeposit(opts *bind.CallOpts, bidder common.Address, window *big.Int) (*big.Int, error) { - if opts.Context != nil { - select { - case <-opts.Context.Done(): - return nil, opts.Context.Err() - default: - } - } - return big.NewInt(0), nil -} - -type MockBlockTrackerContract struct { - GetCurrentWindowFunc func() (*big.Int, error) -} - -func (m *MockBlockTrackerContract) GetCurrentWindow() (*big.Int, error) { - return m.GetCurrentWindowFunc() -} - -func TestAutoDepositTracker_Start(t *testing.T) { - t.Parallel() - - // Setup ABIs - brABI, err := abi.JSON(strings.NewReader(bidderregistry.BidderregistryABI)) - if err != nil { - t.Fatal(err) - } - - btABI, err := abi.JSON(strings.NewReader(blocktracker.BlocktrackerABI)) - if err != nil { - t.Fatal(err) - } - - amount := big.NewInt(100) - oracleWindowOffset := big.NewInt(1) - logger := util.NewTestLogger(os.Stdout) - evtMgr := events.NewListener(logger, &btABI, &brABI) - brContract := &MockBidderRegistryContract{ - DepositForWindowsFunc: func(opts *bind.TransactOpts, windows []*big.Int) (*types.Transaction, error) { - return types.NewTransaction(1, common.Address{}, nil, 0, nil, nil), nil - }, - WithdrawFromWindowsFunc: func(opts *bind.TransactOpts, windows []*big.Int) (*types.Transaction, error) { - return types.NewTransaction(1, common.Address{}, nil, 0, nil, nil), nil - }, - DepositForWindowFunc: func(opts *bind.TransactOpts, window *big.Int) (*types.Transaction, error) { - return types.NewTransaction(1, common.Address{}, nil, 0, nil, nil), nil - }, - } - btContract := &MockBlockTrackerContract{ - GetCurrentWindowFunc: func() (*big.Int, error) { - return big.NewInt(1), nil - }, - } - optsGetter := func(ctx context.Context) (*bind.TransactOpts, error) { - return &bind.TransactOpts{}, nil - } - - st := store.New(inmemstorage.New()) - - // Create AutoDepositTracker instance - adt := autodepositor.New(evtMgr, brContract, btContract, optsGetter, st, oracleWindowOffset, logger) - - // Start AutoDepositTracker - ctx := context.Background() - startWindow := big.NewInt(2) - err = adt.Start(ctx, startWindow, amount) - if err != nil { - t.Fatal(err) - } - - assertStatus := func(t *testing.T, working bool, deposits []uint64) { - t.Helper() - - for { - depositsMap, status, _ := adt.GetStatus() - if status != working { - t.Fatalf("expected status to be %v, got %v", working, status) - } - foundAll := true - for _, deposit := range deposits { - if !depositsMap[deposit] { - foundAll = false - break - } - } - if foundAll && len(depositsMap) == len(deposits) { - break - } - time.Sleep(10 * time.Millisecond) - } - } - - assertStatus(t, true, []uint64{2, 3}) - - publishNewWindow(evtMgr, &btABI, big.NewInt(2)) - - assertStatus(t, true, []uint64{2, 3, 4}) - - publishNewWindow(evtMgr, &btABI, big.NewInt(3)) - - assertStatus(t, true, []uint64{3, 4, 5}) - - // Stop AutoDepositTracker - windowNumbers, err := adt.Stop() - if err != nil { - t.Fatal(err) - } - - // Assert window numbers - expectedWindowNumbers := []*big.Int{big.NewInt(3), big.NewInt(4), big.NewInt(5)} - if len(windowNumbers) != len(expectedWindowNumbers) { - t.Fatalf("expected %d window numbers, got %d", len(expectedWindowNumbers), len(windowNumbers)) - } - for i, wn := range windowNumbers { - if wn.Cmp(expectedWindowNumbers[i]) != 0 { - t.Errorf("expected window number %d to be %s, got %s", i, expectedWindowNumbers[i].String(), wn.String()) - } - } - - assertStatus(t, false, []uint64{3, 4, 5}) -} - -func TestAutoDepositTracker_Start_CancelContext(t *testing.T) { - t.Parallel() - - // Setup ABIs - brABI, err := abi.JSON(strings.NewReader(bidderregistry.BidderregistryABI)) - if err != nil { - t.Fatal(err) - } - - btABI, err := abi.JSON(strings.NewReader(blocktracker.BlocktrackerABI)) - if err != nil { - t.Fatal(err) - } - - logger := util.NewTestLogger(io.Discard) - evtMgr := events.NewListener(logger, &btABI, &brABI) - brContract := &MockBidderRegistryContract{ - DepositForWindowsFunc: func(opts *bind.TransactOpts, windows []*big.Int) (*types.Transaction, error) { - return types.NewTransaction(1, common.Address{}, nil, 0, nil, nil), nil - }, - DepositForWindowFunc: func(opts *bind.TransactOpts, window *big.Int) (*types.Transaction, error) { - return types.NewTransaction(1, common.Address{}, nil, 0, nil, nil), nil - }, - } - btContract := &MockBlockTrackerContract{ - GetCurrentWindowFunc: func() (*big.Int, error) { - return big.NewInt(1), nil - }, - } - optsGetter := func(ctx context.Context) (*bind.TransactOpts, error) { - return &bind.TransactOpts{}, nil - } - - oracleWindowOffset := big.NewInt(1) - st := store.New(inmemstorage.New()) - - // Create AutoDepositTracker instance - adt := autodepositor.New(evtMgr, brContract, btContract, optsGetter, st, oracleWindowOffset, logger) - - // Start AutoDepositTracker with a cancelable context - ctx, cancel := context.WithCancel(context.Background()) - startWindow := big.NewInt(1) - amount := big.NewInt(100) - cancel() - err = adt.Start(ctx, startWindow, amount) - if err != context.Canceled { - t.Fatalf("expected context canceled error, got %v", err) - } -} - -func TestAutoDepositTracker_Stop_NotRunning(t *testing.T) { - t.Parallel() - - // Setup ABIs - brABI, err := abi.JSON(strings.NewReader(bidderregistry.BidderregistryABI)) - if err != nil { - t.Fatal(err) - } - - btABI, err := abi.JSON(strings.NewReader(blocktracker.BlocktrackerABI)) - if err != nil { - t.Fatal(err) - } - - logger := util.NewTestLogger(io.Discard) - evtMgr := events.NewListener(logger, &btABI, &brABI) - brContract := &MockBidderRegistryContract{} - btContract := &MockBlockTrackerContract{} - optsGetter := func(ctx context.Context) (*bind.TransactOpts, error) { - return &bind.TransactOpts{}, nil - } - - oracleWindowOffset := big.NewInt(1) - st := store.New(inmemstorage.New()) - - // Create AutoDepositTracker instance - adt := autodepositor.New(evtMgr, brContract, btContract, optsGetter, st, oracleWindowOffset, logger) - - // Stop AutoDepositTracker when not running - _, err = adt.Stop() - if err == nil { - t.Fatal("expected error, got nil") - } -} - -func TestAutoDepositTracker_IsWorking(t *testing.T) { - t.Parallel() - - // Setup ABIs - brABI, err := abi.JSON(strings.NewReader(bidderregistry.BidderregistryABI)) - if err != nil { - t.Fatal(err) - } - - btABI, err := abi.JSON(strings.NewReader(blocktracker.BlocktrackerABI)) - if err != nil { - t.Fatal(err) - } - - logger := util.NewTestLogger(io.Discard) - evtMgr := events.NewListener(logger, &btABI, &brABI) - brContract := &MockBidderRegistryContract{ - DepositForWindowsFunc: func(opts *bind.TransactOpts, windows []*big.Int) (*types.Transaction, error) { - return types.NewTransaction(1, common.Address{}, nil, 0, nil, nil), nil - }, - } - btContract := &MockBlockTrackerContract{ - GetCurrentWindowFunc: func() (*big.Int, error) { - return big.NewInt(1), nil - }, - } - - optsGetter := func(ctx context.Context) (*bind.TransactOpts, error) { - return &bind.TransactOpts{}, nil - } - - oracleWindowOffset := big.NewInt(1) - st := store.New(inmemstorage.New()) - - // Create AutoDepositTracker instance - adt := autodepositor.New(evtMgr, brContract, btContract, optsGetter, st, oracleWindowOffset, logger) - - // Assert initial IsWorking status - if adt.IsWorking() { - t.Fatal("expected IsWorking to be false, got true") - } - - // Start AutoDepositTracker - ctx := context.Background() - startWindow := big.NewInt(1) - amount := big.NewInt(100) - err = adt.Start(ctx, startWindow, amount) - if err != nil { - t.Fatal(err) - } - - // Assert IsWorking status after starting - if !adt.IsWorking() { - t.Fatal("expected IsWorking to be true, got false") - } - - // Stop AutoDepositTracker - _, err = adt.Stop() - if err != nil { - t.Fatal(err) - } - - // Assert IsWorking status after stopping - if adt.IsWorking() { - t.Fatal("expected IsWorking to be false, got true") - } -} - -func publishNewWindow( - evtMgr events.EventManager, - btABI *abi.ABI, - windowNumber *big.Int, -) { - testLog := types.Log{ - Topics: []common.Hash{ - btABI.Events["NewWindow"].ID, - common.BigToHash(windowNumber), - }, - Data: []byte{}, - } - evtMgr.PublishLogEvent(context.Background(), testLog) -} diff --git a/p2p/pkg/autodepositor/store/store.go b/p2p/pkg/autodepositor/store/store.go deleted file mode 100644 index 3a6108fec..000000000 --- a/p2p/pkg/autodepositor/store/store.go +++ /dev/null @@ -1,94 +0,0 @@ -package store - -import ( - "context" - "fmt" - "math/big" - "strings" - "sync" - - "github.com/primev/mev-commit/p2p/pkg/storage" -) - -const ( - // local deposit entries - depositNS = "dep/" -) - -var ( - depositKey = func(window *big.Int) string { - return fmt.Sprintf("%s%s", depositNS, window) - } -) - -type Store struct { - mu sync.RWMutex - st storage.Storage -} - -func New(st storage.Storage) *Store { - return &Store{ - st: st, - } -} - -func (s *Store) StoreDeposits(ctx context.Context, window []*big.Int) error { - s.mu.Lock() - defer s.mu.Unlock() - - for _, w := range window { - err := s.st.Put(depositKey(w), []byte{}) - if err != nil { - return err - } - } - return nil -} - -func (s *Store) ListDeposits(ctx context.Context, till *big.Int) ([]*big.Int, error) { - s.mu.RLock() - defer s.mu.RUnlock() - - deposits := make([]*big.Int, 0) - err := s.st.WalkPrefix(depositNS, func(key string, _ []byte) bool { - parts := strings.Split(key, "/") - if len(parts) != 2 { - return false - } - w, ok := new(big.Int).SetString(parts[1], 10) - if !ok { - return false - } - if till == nil || w.Cmp(till) != 1 { - deposits = append(deposits, w) - } - return false - }) - if err != nil { - return nil, err - } - - return deposits, nil -} - -func (s *Store) ClearDeposits(ctx context.Context, windows []*big.Int) error { - s.mu.Lock() - defer s.mu.Unlock() - - for _, w := range windows { - err := s.st.Delete(depositKey(w)) - if err != nil { - return err - } - } - - return nil -} - -func (s *Store) IsDepositMade(ctx context.Context, window *big.Int) bool { - s.mu.RLock() - defer s.mu.RUnlock() - - _, err := s.st.Get(depositKey(window)) - return err == nil -} diff --git a/p2p/pkg/autodepositor/store/store_test.go b/p2p/pkg/autodepositor/store/store_test.go deleted file mode 100644 index 4e20b2a64..000000000 --- a/p2p/pkg/autodepositor/store/store_test.go +++ /dev/null @@ -1,55 +0,0 @@ -package store_test - -import ( - "context" - "math/big" - "reflect" - "testing" - - "github.com/primev/mev-commit/p2p/pkg/autodepositor/store" - inmem "github.com/primev/mev-commit/p2p/pkg/storage/inmem" -) - -func TestStore(t *testing.T) { - st := inmem.New() - store := store.New(st) - windows := []*big.Int{big.NewInt(1), big.NewInt(2)} - - t.Run("StoreDeposits", func(t *testing.T) { - err := store.StoreDeposits(context.Background(), windows) - if err != nil { - t.Fatalf("StoreDeposits failed: %v", err) - } - - for _, w := range windows { - if !store.IsDepositMade(context.Background(), w) { - t.Errorf("Deposit for window %s was not stored", w) - } - } - }) - - t.Run("ListDeposits", func(t *testing.T) { - deposits, err := store.ListDeposits(context.Background(), big.NewInt(2)) - if err != nil { - t.Fatalf("ListDeposits failed: %v", err) - } - - expectedDeposits := []*big.Int{big.NewInt(1), big.NewInt(2)} - if !reflect.DeepEqual(deposits, expectedDeposits) { - t.Errorf("Expected deposits %+v, got %+v", expectedDeposits, deposits) - } - }) - - t.Run("ClearDeposits", func(t *testing.T) { - err := store.ClearDeposits(context.Background(), windows) - if err != nil { - t.Fatalf("ClearDeposits failed: %v", err) - } - - for _, w := range windows { - if store.IsDepositMade(context.Background(), w) { - t.Errorf("Deposit for window %s was not cleared", w) - } - } - }) -} From e474136bf1627281a66d0a80ccc3c47786b6062a Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Tue, 12 Aug 2025 00:10:16 -0700 Subject: [PATCH 044/117] rm autodeposit code --- p2p/pkg/node/node.go | 30 +--- p2p/pkg/rpc/bidder/service.go | 312 ++++------------------------------ 2 files changed, 38 insertions(+), 304 deletions(-) diff --git a/p2p/pkg/node/node.go b/p2p/pkg/node/node.go index e00eac296..0c7cfe6f9 100644 --- a/p2p/pkg/node/node.go +++ b/p2p/pkg/node/node.go @@ -36,8 +36,6 @@ import ( providerapiv1 "github.com/primev/mev-commit/p2p/gen/go/providerapi/v1" validatorapiv1 "github.com/primev/mev-commit/p2p/gen/go/validatorapi/v1" "github.com/primev/mev-commit/p2p/pkg/apiserver" - "github.com/primev/mev-commit/p2p/pkg/autodepositor" - autodepositorstore "github.com/primev/mev-commit/p2p/pkg/autodepositor/store" "github.com/primev/mev-commit/p2p/pkg/crypto" "github.com/primev/mev-commit/p2p/pkg/depositmanager" depositmanagerstore "github.com/primev/mev-commit/p2p/pkg/depositmanager/store" @@ -425,8 +423,6 @@ func NewNode(opts *Options) (*Node, error) { notificationsapiv1.RegisterNotificationsServer(grpcServer, notificationsRPCService) - var autoDeposit *autodepositor.AutoDepositTracker - if opts.PeerType != p2p.PeerTypeBootnode.String() { validator, err := protovalidate.New() if err != nil { @@ -654,19 +650,6 @@ func NewNode(opts *Options) (*Node, error) { srv.RegisterMetricsCollectors(preconfProto.Metrics()...) - autodepositorStore := autodepositorstore.New(store) - - nd.closers = append( - nd.closers, - ioCloserFunc(func() error { - _, err := autoDeposit.Stop() - if errors.Is(err, autodepositor.ErrNotRunning) { - return nil - } - return err - }), - ) - bidderAPI := bidderapi.NewService( opts.KeySigner.GetAddress(), preconfProto, @@ -676,8 +659,6 @@ func NewNode(opts *Options) (*Node, error) { validator, monitor, optsGetter, - autoDeposit, - autodepositorStore, preconfStore, opts.OracleWindowOffset, opts.BidderBidTimeout, @@ -722,12 +703,9 @@ func NewNode(opts *Options) (*Node, error) { nd.closers = append(nd.closers, channelCloserFunc(closeChan)) } - if opts.AutodepositAmount != nil && autoDeposit != nil { - err = autoDeposit.Start(ctx, nil, opts.AutodepositAmount) - if err != nil { - opts.Logger.Error("failed to start auto deposit tracker", "error", err) - return nil, errors.Join(err, nd.Close()) - } + // TODO: wont just be a single amount, amount is for each provider + if opts.AutodepositAmount != nil { + // "set code" for bidder. } started := make(chan struct{}) @@ -940,7 +918,7 @@ func (noOpBidProcessor) ProcessBid( type noOpDepositManager struct{} -func (noOpDepositManager) CheckAndDeductDeposit(_ context.Context, _ common.Address, _ string, _ int64) (func() error, error) { +func (noOpDepositManager) CheckAndDeductDeposit(_ context.Context, _ common.Address, _ common.Address, _ string) (func() error, error) { return func() error { return nil }, nil } diff --git a/p2p/pkg/rpc/bidder/service.go b/p2p/pkg/rpc/bidder/service.go index 8665d19ce..e6d1d3263 100644 --- a/p2p/pkg/rpc/bidder/service.go +++ b/p2p/pkg/rpc/bidder/service.go @@ -32,8 +32,6 @@ type Service struct { blockTrackerContract BlockTrackerContract watcher TxWatcher optsGetter OptsGetter - autoDepositTracker AutoDepositTracker - store DepositStore cs CommitmentStore oracleWindowOffset *big.Int logger *slog.Logger @@ -51,8 +49,6 @@ func NewService( validator *protovalidate.Validator, watcher TxWatcher, optsGetter OptsGetter, - autoDepositTracker AutoDepositTracker, - store DepositStore, cs CommitmentStore, oracleWindowOffset *big.Int, bidderBidTimeout time.Duration, @@ -69,31 +65,23 @@ func NewService( optsGetter: optsGetter, logger: logger, metrics: newMetrics(), - autoDepositTracker: autoDepositTracker, oracleWindowOffset: oracleWindowOffset, - store: store, validator: validator, bidTimeout: bidderBidTimeout, } } -type AutoDepositTracker interface { - Start(context.Context, *big.Int, *big.Int) error - Stop() ([]*big.Int, error) - IsWorking() bool - GetStatus() (map[uint64]bool, bool, *big.Int) -} - type PreconfSender interface { SendBid(ctx context.Context, bid *preconfirmationv1.Bid) (chan *preconfirmationv1.PreConfirmation, error) } type BidderRegistryContract interface { - DepositForWindow(*bind.TransactOpts, *big.Int) (*types.Transaction, error) - WithdrawBidderAmountFromWindow(*bind.TransactOpts, common.Address, *big.Int) (*types.Transaction, error) - GetDeposit(*bind.CallOpts, common.Address, *big.Int) (*big.Int, error) - WithdrawFromWindows(*bind.TransactOpts, []*big.Int) (*types.Transaction, error) - ParseBidderRegistered(types.Log) (*bidderregistry.BidderregistryBidderRegistered, error) + DepositAsBidder(*bind.TransactOpts, common.Address) (*types.Transaction, error) + RequestWithdrawalsAsBidder(*bind.TransactOpts, []common.Address) (*types.Transaction, error) + WithdrawAsBidder(*bind.TransactOpts, []common.Address) (*types.Transaction, error) + GetDeposit(*bind.CallOpts, common.Address, common.Address) (*big.Int, error) + ParseBidderDeposited(types.Log) (*bidderregistry.BidderregistryBidderDeposited, error) + ParseWithdrawalRequested(types.Log) (*bidderregistry.BidderregistryWithdrawalRequested, error) ParseBidderWithdrawal(types.Log) (*bidderregistry.BidderregistryBidderWithdrawal, error) } @@ -118,15 +106,6 @@ type TxWatcher interface { type OptsGetter func(context.Context) (*bind.TransactOpts, error) -type DepositStore interface { - // StoreDeposits stores the deposited windows. - StoreDeposits(ctx context.Context, windows []*big.Int) error - // ClearDeposits clears the deposits for the given windows. - ClearDeposits(ctx context.Context, windows []*big.Int) error - // IsDepositMade checks if the deposit is already made for the given window. - IsDepositMade(ctx context.Context, window *big.Int) bool -} - func (s *Service) SendBid( bid *bidderapiv1.Bid, srv bidderapiv1.Bidder_SendBidServer, @@ -237,6 +216,7 @@ func (s *Service) SendBid( return nil } +// TODO: update to new semantics, needs provider addr func (s *Service) Deposit( ctx context.Context, r *bidderapiv1.DepositRequest, @@ -247,11 +227,6 @@ func (s *Service) Deposit( return nil, status.Errorf(codes.InvalidArgument, "validating deposit request: %v", err) } - if s.autoDepositTracker.IsWorking() { - s.logger.Error("auto deposit is already running") - return nil, status.Error(codes.FailedPrecondition, "auto deposit is already running, stop and then deposit") - } - currentWindow, err := s.blockTrackerContract.GetCurrentWindow() if err != nil { s.logger.Error("getting current window", "error", err) @@ -277,7 +252,8 @@ func (s *Service) Deposit( } opts.Value = amount - tx, err := s.registryContract.DepositForWindow(opts, windowToDeposit) + providerAddr := common.HexToAddress("0x0000000000000000000000000000000000000000") // TODO: get from request + tx, err := s.registryContract.DepositAsBidder(opts, providerAddr) if err != nil { s.logger.Error("depositing", "error", err) return nil, status.Errorf(codes.Internal, "deposit: %v", err) @@ -294,18 +270,11 @@ func (s *Service) Deposit( return nil, status.Errorf(codes.Internal, "receipt status: %v", receipt.Status) } - err = s.store.StoreDeposits(ctx, []*big.Int{windowToDeposit}) - if err != nil { - s.logger.Error("storing deposits", "error", err) - return nil, status.Errorf(codes.Internal, "storing deposits: %v", err) - } - for _, log := range receipt.Logs { - if registration, err := s.registryContract.ParseBidderRegistered(*log); err == nil { - s.logger.Info("deposit successful", "amount", registration.DepositedAmount, "window", registration.WindowNumber) + if deposited, err := s.registryContract.ParseBidderDeposited(*log); err == nil { + s.logger.Info("deposit successful", "amount", deposited.DepositedAmount.String()) return &bidderapiv1.DepositResponse{ - Amount: registration.DepositedAmount.String(), - WindowNumber: wrapperspb.UInt64(registration.WindowNumber.Uint64()), + Amount: deposited.DepositedAmount.String(), }, nil } } @@ -332,6 +301,7 @@ func (s *Service) calculateWindowToDeposit(ctx context.Context, r *bidderapiv1.D return new(big.Int).SetUint64(currentWindow + s.oracleWindowOffset.Uint64()), nil } +// TODO: update to new semantics, needs provider addr func (s *Service) GetDeposit( ctx context.Context, r *bidderapiv1.GetDepositRequest, @@ -351,10 +321,11 @@ func (s *Service) GetDeposit( } else { window = new(big.Int).SetUint64(r.WindowNumber.Value) } + providerAddr := common.HexToAddress("0x0000000000000000000000000000000000000000") // TODO: get from request stakeAmount, err := s.registryContract.GetDeposit(&bind.CallOpts{ From: s.owner, Context: ctx, - }, s.owner, window) + }, s.owner, providerAddr) if err != nil { s.logger.Error("getting deposit", "error", err) return nil, status.Errorf(codes.Internal, "getting deposit: %v", err) @@ -363,6 +334,14 @@ func (s *Service) GetDeposit( return &bidderapiv1.DepositResponse{Amount: stakeAmount.String(), WindowNumber: wrapperspb.UInt64(window.Uint64())}, nil } +func (s *Service) RequestWithdrawal( + ctx context.Context, + r *bidderapiv1.WithdrawRequest, +) (*bidderapiv1.WithdrawResponse, error) { + // TODO: + return nil, status.Errorf(codes.Unimplemented, "method RequestWithdrawal not implemented") +} + func (s *Service) Withdraw( ctx context.Context, r *bidderapiv1.WithdrawRequest, @@ -373,10 +352,6 @@ func (s *Service) Withdraw( return nil, status.Errorf(codes.InvalidArgument, "validating withdraw request: %v", err) } - if s.autoDepositTracker.IsWorking() { - return nil, status.Error(codes.FailedPrecondition, "auto deposit is already running, stop and then withdraw") - } - var window *big.Int if r.WindowNumber == nil { window, err = s.blockTrackerContract.GetCurrentWindow() @@ -395,7 +370,9 @@ func (s *Service) Withdraw( return nil, status.Errorf(codes.Internal, "getting transact opts: %v", err) } - tx, err := s.registryContract.WithdrawBidderAmountFromWindow(opts, s.owner, window) + providerAddr := common.HexToAddress("0x0000000000000000000000000000000000000000") // TODO: get from request + providers := []common.Address{providerAddr} + tx, err := s.registryContract.WithdrawAsBidder(opts, providers) if err != nil { s.logger.Error("withdrawing deposit", "error", err) return nil, status.Errorf(codes.Internal, "withdrawing deposit: %v", err) @@ -412,18 +389,11 @@ func (s *Service) Withdraw( return nil, status.Errorf(codes.Internal, "receipt status: %v", receipt.Status) } - err = s.store.ClearDeposits(ctx, []*big.Int{window}) - if err != nil { - s.logger.Error("clearing deposits", "error", err) - return nil, status.Errorf(codes.Internal, "clearing deposits: %v", err) - } - for _, log := range receipt.Logs { if withdrawal, err := s.registryContract.ParseBidderWithdrawal(*log); err == nil { - s.logger.Info("withdrawal successful", "amount", withdrawal.Amount.String(), "window", withdrawal.Window.String()) + s.logger.Info("withdrawal successful", "amount", withdrawal.AmountWithdrawn.String()) return &bidderapiv1.WithdrawResponse{ - Amount: withdrawal.Amount.String(), - WindowNumber: wrapperspb.UInt64(withdrawal.Window.Uint64()), + Amount: withdrawal.AmountWithdrawn.String(), }, nil } } @@ -442,238 +412,24 @@ func (s *Service) AutoDeposit( ctx context.Context, r *bidderapiv1.DepositRequest, ) (*bidderapiv1.AutoDepositResponse, error) { - err := s.validator.Validate(r) - if err != nil { - s.logger.Error("auto deposit validation", "error", err) - return nil, status.Errorf(codes.InvalidArgument, "validating auto deposit request: %v", err) - } - - if s.autoDepositTracker.IsWorking() { - s.logger.Error("auto deposit is already running") - return nil, status.Error(codes.FailedPrecondition, "auto deposit is already running") - } - - currentWindow, err := s.blockTrackerContract.GetCurrentWindow() - if err != nil { - s.logger.Error("getting current window", "error", err) - return nil, status.Errorf(codes.Internal, "getting current window: %v", err) - } - - windowToDeposit, err := s.calculateWindowToDeposit(ctx, r, currentWindow.Uint64()) - if err != nil { - s.logger.Error("calculating window to deposit", "error", err) - return nil, status.Errorf(codes.InvalidArgument, "calculating window to deposit: %v", err) - } - - amount, success := big.NewInt(0).SetString(r.Amount, 10) - if !success { - s.logger.Error("parsing amount", "amount", r.Amount) - return nil, status.Errorf(codes.InvalidArgument, "parsing amount: %v", r.Amount) - } - - err = s.autoDepositTracker.Start(ctx, windowToDeposit, amount) - if err != nil { - s.logger.Error("starting auto deposit", "error", err) - return nil, status.Errorf(codes.Internal, "starting auto deposit: %v", err) - } - - s.logger.Info( - "autodeposit enabled", - "window", windowToDeposit, - "amount", amount.String(), - ) - - return &bidderapiv1.AutoDepositResponse{ - StartWindowNumber: wrapperspb.UInt64(windowToDeposit.Uint64()), - AmountPerWindow: amount.String(), - }, nil + // TODO: Set EOA code + return nil, status.Errorf(codes.Unimplemented, "method AutoDeposit not implemented") } func (s *Service) CancelAutoDeposit( ctx context.Context, r *bidderapiv1.CancelAutoDepositRequest, ) (*bidderapiv1.CancelAutoDepositResponse, error) { - if !s.autoDepositTracker.IsWorking() { - s.logger.Error("auto deposit is not running") - return nil, status.Error(codes.FailedPrecondition, "auto deposit is not running") - } - windows, err := s.autoDepositTracker.Stop() - if err != nil { - s.logger.Error("cancel auto deposit", "error", err) - return nil, status.Errorf(codes.FailedPrecondition, "cancel auto deposit: %v", err) - } - if r.Withdraw { - go func() { - ticker := time.NewTicker(5 * time.Second) - defer ticker.Stop() - for range ticker.C { - currentWindow, err := s.blockTrackerContract.GetCurrentWindow() - if err != nil { - s.logger.Error("getting current window", "error", err) - continue - } - doWithdraw := true - for _, w := range windows { - if w.Uint64() >= currentWindow.Uint64() { - doWithdraw = false - break - } - } - if doWithdraw { - opts, err := s.optsGetter(context.Background()) - if err != nil { - s.logger.Error("getting transact opts", "error", err) - continue - } - txn, err := s.registryContract.WithdrawFromWindows(opts, windows) - if err != nil { - s.logger.Error("withdraw from windows", "error", err) - return - } - receipt, err := s.watcher.WaitForReceipt(context.Background(), txn) - if err != nil { - s.logger.Error("waiting for receipt", "error", err) - return - } - if receipt.Status != types.ReceiptStatusSuccessful { - s.logger.Error("receipt status", "status", receipt.Status) - return - } - err = s.store.ClearDeposits(context.Background(), windows) - if err != nil { - s.logger.Error("clearing deposits", "error", err) - } - return - } - s.logger.Info("waiting for windows to be in the past before withdrawing", "currentWindow", currentWindow, "windows", windows) - } - }() - return &bidderapiv1.CancelAutoDepositResponse{}, nil - } - - withdrawWindows := []*wrapperspb.UInt64Value{} - for _, w := range windows { - withdrawWindows = append(withdrawWindows, wrapperspb.UInt64(w.Uint64())) - } - - return &bidderapiv1.CancelAutoDepositResponse{ - WindowNumbers: withdrawWindows, - }, nil -} - -func (s *Service) WithdrawFromWindows( - ctx context.Context, - r *bidderapiv1.WithdrawFromWindowsRequest, -) (*bidderapiv1.WithdrawFromWindowsResponse, error) { - err := s.validator.Validate(r) - if err != nil { - s.logger.Error("validating withdraw from n windows request", "error", err) - return nil, status.Errorf(codes.InvalidArgument, "validating withdraw from n windows request: %v", err) - } - - if s.autoDepositTracker.IsWorking() { - s.logger.Error("auto deposit is already running") - return nil, status.Error(codes.FailedPrecondition, "auto deposit is already running, stop and then withdraw") - } - - opts, err := s.optsGetter(ctx) - if err != nil { - s.logger.Error("getting transact opts", "error", err) - return nil, status.Errorf(codes.Internal, "getting transact opts: %v", err) - } - - windows := make([]*big.Int, len(r.WindowNumbers)) - for i, w := range r.WindowNumbers { - windows[i] = new(big.Int).SetUint64(w.Value) - } - - tx, err := s.registryContract.WithdrawFromWindows(opts, windows) - if err != nil { - s.logger.Error("withdrawing deposit", "error", err) - return nil, status.Errorf(codes.Internal, "withdrawing deposit: %v", err) - } - - receipt, err := s.watcher.WaitForReceipt(ctx, tx) - if err != nil { - s.logger.Error("waiting for receipt", "error", err) - return nil, status.Errorf(codes.Internal, "waiting for receipt: %v", err) - } - - if receipt.Status != types.ReceiptStatusSuccessful { - s.logger.Error("receipt status", "status", receipt.Status) - return nil, status.Errorf(codes.Internal, "receipt status: %v", receipt.Status) - } - - err = s.store.ClearDeposits(ctx, windows) - if err != nil { - s.logger.Error("clearing deposits", "error", err) - return nil, status.Errorf(codes.Internal, "clearing deposits: %v", err) - } - - var amountsAndWindows []*bidderapiv1.WithdrawResponse - for _, log := range receipt.Logs { - if withdrawal, err := s.registryContract.ParseBidderWithdrawal(*log); err == nil { - s.logger.Info("withdrawal successful", "amount", withdrawal.Amount.String(), "window", withdrawal.Window.String()) - amountsAndWindows = append(amountsAndWindows, &bidderapiv1.WithdrawResponse{ - Amount: withdrawal.Amount.String(), - WindowNumber: wrapperspb.UInt64(withdrawal.Window.Uint64()), - }) - } - } - - if len(amountsAndWindows) > 0 { - return &bidderapiv1.WithdrawFromWindowsResponse{ - WithdrawResponses: amountsAndWindows, - }, nil - } - - s.logger.Error( - "withdraw successful but missing log", - "txHash", receipt.TxHash.Hex(), - "window", r.WindowNumbers, - "logs", receipt.Logs, - ) - - return nil, status.Errorf(codes.Internal, "missing log for withdrawal") + // TODO: Unset EOA code + return nil, status.Errorf(codes.Unimplemented, "method CancelAutoDeposit not implemented") } func (s *Service) AutoDepositStatus( ctx context.Context, _ *bidderapiv1.EmptyMessage, ) (*bidderapiv1.AutoDepositStatusResponse, error) { - deposits, isAutodepositEnabled, currentWindow := s.autoDepositTracker.GetStatus() - if currentWindow != nil { - // as oracle working N windows behind the current window, we add + N here - currentWindow = new(big.Int).Add(currentWindow, s.oracleWindowOffset) - } - var autoDeposits []*bidderapiv1.AutoDeposit - for window, ok := range deposits { - if ok { - stakeAmount, err := s.registryContract.GetDeposit(&bind.CallOpts{ - From: s.owner, - Context: ctx, - }, s.owner, new(big.Int).SetUint64(window)) - if err != nil { - s.logger.Error("getting deposit", "error", err) - return nil, status.Errorf(codes.Internal, "getting deposit: %v", err) - } - ad := &bidderapiv1.AutoDeposit{ - WindowNumber: wrapperspb.UInt64(window), - DepositedAmount: stakeAmount.String(), - StartBlockNumber: wrapperspb.UInt64((window-1)*s.blocksPerWindow + 1), - EndBlockNumber: wrapperspb.UInt64(window * s.blocksPerWindow), - } - if currentWindow != nil && currentWindow.Uint64() == window { - ad.IsCurrent = true - } - autoDeposits = append(autoDeposits, ad) - } - } - - return &bidderapiv1.AutoDepositStatusResponse{ - WindowBalances: autoDeposits, - IsAutodepositEnabled: isAutodepositEnabled, - }, nil + // TODO: Query EOA code + return nil, status.Errorf(codes.Unimplemented, "method AutoDepositStatus not implemented") } func (s *Service) ClaimSlashedFunds( From 039ef8887d8b4064ad15a04bcc348912faac5bc9 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Tue, 12 Aug 2025 00:16:03 -0700 Subject: [PATCH 045/117] Update preconfirmation_test.go --- p2p/pkg/preconfirmation/preconfirmation_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/p2p/pkg/preconfirmation/preconfirmation_test.go b/p2p/pkg/preconfirmation/preconfirmation_test.go index 97f98edba..5626eccaa 100644 --- a/p2p/pkg/preconfirmation/preconfirmation_test.go +++ b/p2p/pkg/preconfirmation/preconfirmation_test.go @@ -113,9 +113,9 @@ type testDepositManager struct{} func (t *testDepositManager) CheckAndDeductDeposit( ctx context.Context, - address common.Address, + bidderAddr common.Address, + providerAddr common.Address, bidAmountStr string, - blockNumber int64, ) (func() error, error) { return func() error { return nil }, nil } From 1e53eeea9f841027b73b723f91388f396e63bc39 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Tue, 12 Aug 2025 00:24:30 -0700 Subject: [PATCH 046/117] fix tracker --- p2p/pkg/preconfirmation/tracker/tracker.go | 4 ++-- p2p/pkg/preconfirmation/tracker/tracker_test.go | 13 ++++++------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/p2p/pkg/preconfirmation/tracker/tracker.go b/p2p/pkg/preconfirmation/tracker/tracker.go index fa07178e8..416dfe556 100644 --- a/p2p/pkg/preconfirmation/tracker/tracker.go +++ b/p2p/pkg/preconfirmation/tracker/tracker.go @@ -52,7 +52,7 @@ type Tracker struct { commitments chan *preconfcommstore.PreconfmanagerOpenedCommitmentStored processed chan *oracle.OracleCommitmentProcessed rewards chan *bidderregistry.BidderregistryFundsRewarded - returns chan *bidderregistry.BidderregistryFundsRetrieved + returns chan *bidderregistry.BidderregistryFundsUnlocked statusUpdate chan statusUpdateTask blockOpened chan int64 triggerOpen chan struct{} @@ -127,7 +127,7 @@ func NewTracker( commitments: make(chan *preconfcommstore.PreconfmanagerOpenedCommitmentStored), processed: make(chan *oracle.OracleCommitmentProcessed), rewards: make(chan *bidderregistry.BidderregistryFundsRewarded), - returns: make(chan *bidderregistry.BidderregistryFundsRetrieved), + returns: make(chan *bidderregistry.BidderregistryFundsUnlocked), statusUpdate: make(chan statusUpdateTask), blockOpened: make(chan int64), triggerOpen: make(chan struct{}), diff --git a/p2p/pkg/preconfirmation/tracker/tracker_test.go b/p2p/pkg/preconfirmation/tracker/tracker_test.go index 0cef52801..4243e848f 100644 --- a/p2p/pkg/preconfirmation/tracker/tracker_test.go +++ b/p2p/pkg/preconfirmation/tracker/tracker_test.go @@ -31,6 +31,7 @@ import ( "github.com/primev/mev-commit/x/util" ) +// TODO: need to fix this test. Probably an issue with exactly how events are packed/published at end of file func TestTracker(t *testing.T) { t.Parallel() @@ -360,7 +361,6 @@ func TestTracker(t *testing.T) { evtMgr, &brABI, bidderregistry.BidderregistryFundsRewarded{ - Window: big.NewInt(int64(c.Bid.BlockNumber)), Amount: big.NewInt(900), CommitmentDigest: common.BytesToHash(c.Digest), Bidder: common.HexToAddress("0x1234"), @@ -386,11 +386,11 @@ func TestTracker(t *testing.T) { err = publishReturn( evtMgr, &brABI, - bidderregistry.BidderregistryFundsRetrieved{ - Window: big.NewInt(int64(c.Bid.BlockNumber)), + bidderregistry.BidderregistryFundsUnlocked{ Amount: big.NewInt(900), CommitmentDigest: common.BytesToHash(c.Digest), Bidder: common.HexToAddress("0x1234"), + Provider: common.HexToAddress("0x1234"), }, ) if err != nil { @@ -768,7 +768,6 @@ func publishReward( ) error { event := brABI.Events["FundsRewarded"] buf, err := event.Inputs.NonIndexed().Pack( - r.Window, r.Amount, ) if err != nil { @@ -793,9 +792,9 @@ func publishReward( func publishReturn( evtMgr events.EventManager, brABI *abi.ABI, - r bidderregistry.BidderregistryFundsRetrieved, + r bidderregistry.BidderregistryFundsUnlocked, ) error { - event := brABI.Events["FundsRetrieved"] + event := brABI.Events["FundsUnlocked"] buf, err := event.Inputs.NonIndexed().Pack( r.Amount, ) @@ -809,7 +808,7 @@ func publishReturn( event.ID, // The first topic is the hash of the event signature r.CommitmentDigest, common.HexToHash(r.Bidder.Hex()), - common.BigToHash(r.Window), + common.HexToHash(r.Provider.Hex()), }, Data: buf, } From 55d19ae257ca51b62013c56f0d4d472ce3838f0d Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Tue, 12 Aug 2025 15:13:32 -0700 Subject: [PATCH 047/117] fix tracker test --- p2p/pkg/preconfirmation/tracker/tracker.go | 4 ++-- p2p/pkg/preconfirmation/tracker/tracker_test.go | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/p2p/pkg/preconfirmation/tracker/tracker.go b/p2p/pkg/preconfirmation/tracker/tracker.go index 416dfe556..022fc1a4f 100644 --- a/p2p/pkg/preconfirmation/tracker/tracker.go +++ b/p2p/pkg/preconfirmation/tracker/tracker.go @@ -152,7 +152,7 @@ func (t *Tracker) Start(ctx context.Context) <-chan struct{} { if t.peerType == p2p.PeerTypeBidder { evts = append( evts, - events.NewChannelEventHandler(egCtx, "FundsRetrieved", t.returns), + events.NewChannelEventHandler(egCtx, "FundsUnlocked", t.returns), ) } @@ -331,7 +331,7 @@ func (t *Tracker) Start(ctx context.Context) <-chan struct{} { for { select { case <-egCtx.Done(): - t.logger.Info("handleFundsRetrieved context done") + t.logger.Info("handleFundsUnlocked context done") return nil case err := <-sub.Err(): return fmt.Errorf("event subscription error: %w", err) diff --git a/p2p/pkg/preconfirmation/tracker/tracker_test.go b/p2p/pkg/preconfirmation/tracker/tracker_test.go index 4243e848f..cffaea24f 100644 --- a/p2p/pkg/preconfirmation/tracker/tracker_test.go +++ b/p2p/pkg/preconfirmation/tracker/tracker_test.go @@ -31,7 +31,6 @@ import ( "github.com/primev/mev-commit/x/util" ) -// TODO: need to fix this test. Probably an issue with exactly how events are packed/published at end of file func TestTracker(t *testing.T) { t.Parallel() From e920b3f40c6b8a6fa35376c0a2bf342598823948 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Tue, 12 Aug 2025 19:48:50 -0700 Subject: [PATCH 048/117] feat: new bidder proto + service.go handling --- p2p/gen/go/bidderapi/v1/bidderapi.pb.go | 2003 +++++++---------- p2p/gen/go/bidderapi/v1/bidderapi.pb.gw.go | 282 +-- p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go | 216 +- .../bidderapi/v1/bidderapi.swagger.yaml | 287 +-- p2p/pkg/rpc/bidder/service.go | 254 ++- p2p/rpc/bidderapi/v1/bidderapi.proto | 237 +- 6 files changed, 1189 insertions(+), 2090 deletions(-) diff --git a/p2p/gen/go/bidderapi/v1/bidderapi.pb.go b/p2p/gen/go/bidderapi/v1/bidderapi.pb.go index 644b703a5..c3e9c77ff 100644 --- a/p2p/gen/go/bidderapi/v1/bidderapi.pb.go +++ b/p2p/gen/go/bidderapi/v1/bidderapi.pb.go @@ -29,9 +29,8 @@ type DepositRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Amount string `protobuf:"bytes,1,opt,name=amount,proto3" json:"amount,omitempty"` - WindowNumber *wrapperspb.UInt64Value `protobuf:"bytes,2,opt,name=window_number,json=windowNumber,proto3" json:"window_number,omitempty"` - BlockNumber *wrapperspb.UInt64Value `protobuf:"bytes,3,opt,name=block_number,json=blockNumber,proto3" json:"block_number,omitempty"` + Amount string `protobuf:"bytes,1,opt,name=amount,proto3" json:"amount,omitempty"` + Provider string `protobuf:"bytes,2,opt,name=provider,proto3" json:"provider,omitempty"` } func (x *DepositRequest) Reset() { @@ -73,18 +72,11 @@ func (x *DepositRequest) GetAmount() string { return "" } -func (x *DepositRequest) GetWindowNumber() *wrapperspb.UInt64Value { +func (x *DepositRequest) GetProvider() string { if x != nil { - return x.WindowNumber + return x.Provider } - return nil -} - -func (x *DepositRequest) GetBlockNumber() *wrapperspb.UInt64Value { - if x != nil { - return x.BlockNumber - } - return nil + return "" } type DepositResponse struct { @@ -92,8 +84,8 @@ type DepositResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Amount string `protobuf:"bytes,1,opt,name=amount,proto3" json:"amount,omitempty"` - WindowNumber *wrapperspb.UInt64Value `protobuf:"bytes,2,opt,name=window_number,json=windowNumber,proto3" json:"window_number,omitempty"` + Amount string `protobuf:"bytes,1,opt,name=amount,proto3" json:"amount,omitempty"` + Provider string `protobuf:"bytes,2,opt,name=provider,proto3" json:"provider,omitempty"` } func (x *DepositResponse) Reset() { @@ -135,24 +127,24 @@ func (x *DepositResponse) GetAmount() string { return "" } -func (x *DepositResponse) GetWindowNumber() *wrapperspb.UInt64Value { +func (x *DepositResponse) GetProvider() string { if x != nil { - return x.WindowNumber + return x.Provider } - return nil + return "" } -type AutoDepositResponse struct { +type DepositEvenlyRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - StartWindowNumber *wrapperspb.UInt64Value `protobuf:"bytes,1,opt,name=start_window_number,json=startWindowNumber,proto3" json:"start_window_number,omitempty"` - AmountPerWindow string `protobuf:"bytes,2,opt,name=amount_per_window,json=amountPerWindow,proto3" json:"amount_per_window,omitempty"` + TotalAmount string `protobuf:"bytes,1,opt,name=total_amount,json=totalAmount,proto3" json:"total_amount,omitempty"` + Providers []string `protobuf:"bytes,2,rep,name=providers,proto3" json:"providers,omitempty"` } -func (x *AutoDepositResponse) Reset() { - *x = AutoDepositResponse{} +func (x *DepositEvenlyRequest) Reset() { + *x = DepositEvenlyRequest{} if protoimpl.UnsafeEnabled { mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -160,13 +152,13 @@ func (x *AutoDepositResponse) Reset() { } } -func (x *AutoDepositResponse) String() string { +func (x *DepositEvenlyRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AutoDepositResponse) ProtoMessage() {} +func (*DepositEvenlyRequest) ProtoMessage() {} -func (x *AutoDepositResponse) ProtoReflect() protoreflect.Message { +func (x *DepositEvenlyRequest) ProtoReflect() protoreflect.Message { mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -178,36 +170,36 @@ func (x *AutoDepositResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AutoDepositResponse.ProtoReflect.Descriptor instead. -func (*AutoDepositResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use DepositEvenlyRequest.ProtoReflect.Descriptor instead. +func (*DepositEvenlyRequest) Descriptor() ([]byte, []int) { return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{2} } -func (x *AutoDepositResponse) GetStartWindowNumber() *wrapperspb.UInt64Value { +func (x *DepositEvenlyRequest) GetTotalAmount() string { if x != nil { - return x.StartWindowNumber + return x.TotalAmount } - return nil + return "" } -func (x *AutoDepositResponse) GetAmountPerWindow() string { +func (x *DepositEvenlyRequest) GetProviders() []string { if x != nil { - return x.AmountPerWindow + return x.Providers } - return "" + return nil } -type AutoDepositStatusResponse struct { +type DepositEvenlyResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - WindowBalances []*AutoDeposit `protobuf:"bytes,1,rep,name=window_balances,json=windowBalances,proto3" json:"window_balances,omitempty"` - IsAutodepositEnabled bool `protobuf:"varint,2,opt,name=is_autodeposit_enabled,json=isAutodepositEnabled,proto3" json:"is_autodeposit_enabled,omitempty"` + Providers []string `protobuf:"bytes,1,rep,name=providers,proto3" json:"providers,omitempty"` + Amounts []string `protobuf:"bytes,2,rep,name=amounts,proto3" json:"amounts,omitempty"` } -func (x *AutoDepositStatusResponse) Reset() { - *x = AutoDepositStatusResponse{} +func (x *DepositEvenlyResponse) Reset() { + *x = DepositEvenlyResponse{} if protoimpl.UnsafeEnabled { mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -215,13 +207,13 @@ func (x *AutoDepositStatusResponse) Reset() { } } -func (x *AutoDepositStatusResponse) String() string { +func (x *DepositEvenlyResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AutoDepositStatusResponse) ProtoMessage() {} +func (*DepositEvenlyResponse) ProtoMessage() {} -func (x *AutoDepositStatusResponse) ProtoReflect() protoreflect.Message { +func (x *DepositEvenlyResponse) ProtoReflect() protoreflect.Message { mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -233,35 +225,33 @@ func (x *AutoDepositStatusResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AutoDepositStatusResponse.ProtoReflect.Descriptor instead. -func (*AutoDepositStatusResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use DepositEvenlyResponse.ProtoReflect.Descriptor instead. +func (*DepositEvenlyResponse) Descriptor() ([]byte, []int) { return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{3} } -func (x *AutoDepositStatusResponse) GetWindowBalances() []*AutoDeposit { +func (x *DepositEvenlyResponse) GetProviders() []string { if x != nil { - return x.WindowBalances + return x.Providers } return nil } -func (x *AutoDepositStatusResponse) GetIsAutodepositEnabled() bool { +func (x *DepositEvenlyResponse) GetAmounts() []string { if x != nil { - return x.IsAutodepositEnabled + return x.Amounts } - return false + return nil } -type CancelAutoDepositRequest struct { +type EmptyMessage struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - Withdraw bool `protobuf:"varint,1,opt,name=withdraw,proto3" json:"withdraw,omitempty"` } -func (x *CancelAutoDepositRequest) Reset() { - *x = CancelAutoDepositRequest{} +func (x *EmptyMessage) Reset() { + *x = EmptyMessage{} if protoimpl.UnsafeEnabled { mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -269,13 +259,13 @@ func (x *CancelAutoDepositRequest) Reset() { } } -func (x *CancelAutoDepositRequest) String() string { +func (x *EmptyMessage) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CancelAutoDepositRequest) ProtoMessage() {} +func (*EmptyMessage) ProtoMessage() {} -func (x *CancelAutoDepositRequest) ProtoReflect() protoreflect.Message { +func (x *EmptyMessage) ProtoReflect() protoreflect.Message { mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -287,28 +277,21 @@ func (x *CancelAutoDepositRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CancelAutoDepositRequest.ProtoReflect.Descriptor instead. -func (*CancelAutoDepositRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use EmptyMessage.ProtoReflect.Descriptor instead. +func (*EmptyMessage) Descriptor() ([]byte, []int) { return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{4} } -func (x *CancelAutoDepositRequest) GetWithdraw() bool { - if x != nil { - return x.Withdraw - } - return false -} - -type CancelAutoDepositResponse struct { +type GetDepositRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - WindowNumbers []*wrapperspb.UInt64Value `protobuf:"bytes,1,rep,name=window_numbers,json=windowNumbers,proto3" json:"window_numbers,omitempty"` + Provider string `protobuf:"bytes,1,opt,name=provider,proto3" json:"provider,omitempty"` } -func (x *CancelAutoDepositResponse) Reset() { - *x = CancelAutoDepositResponse{} +func (x *GetDepositRequest) Reset() { + *x = GetDepositRequest{} if protoimpl.UnsafeEnabled { mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -316,13 +299,13 @@ func (x *CancelAutoDepositResponse) Reset() { } } -func (x *CancelAutoDepositResponse) String() string { +func (x *GetDepositRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CancelAutoDepositResponse) ProtoMessage() {} +func (*GetDepositRequest) ProtoMessage() {} -func (x *CancelAutoDepositResponse) ProtoReflect() protoreflect.Message { +func (x *GetDepositRequest) ProtoReflect() protoreflect.Message { mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -334,32 +317,28 @@ func (x *CancelAutoDepositResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CancelAutoDepositResponse.ProtoReflect.Descriptor instead. -func (*CancelAutoDepositResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use GetDepositRequest.ProtoReflect.Descriptor instead. +func (*GetDepositRequest) Descriptor() ([]byte, []int) { return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{5} } -func (x *CancelAutoDepositResponse) GetWindowNumbers() []*wrapperspb.UInt64Value { +func (x *GetDepositRequest) GetProvider() string { if x != nil { - return x.WindowNumbers + return x.Provider } - return nil + return "" } -type AutoDeposit struct { +type RequestWithdrawalsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - DepositedAmount string `protobuf:"bytes,1,opt,name=depositedAmount,proto3" json:"depositedAmount,omitempty"` - WindowNumber *wrapperspb.UInt64Value `protobuf:"bytes,2,opt,name=window_number,json=windowNumber,proto3" json:"window_number,omitempty"` - IsCurrent bool `protobuf:"varint,3,opt,name=is_current,json=isCurrent,proto3" json:"is_current,omitempty"` - StartBlockNumber *wrapperspb.UInt64Value `protobuf:"bytes,4,opt,name=start_block_number,json=startBlockNumber,proto3" json:"start_block_number,omitempty"` - EndBlockNumber *wrapperspb.UInt64Value `protobuf:"bytes,5,opt,name=end_block_number,json=endBlockNumber,proto3" json:"end_block_number,omitempty"` + Providers []string `protobuf:"bytes,1,rep,name=providers,proto3" json:"providers,omitempty"` } -func (x *AutoDeposit) Reset() { - *x = AutoDeposit{} +func (x *RequestWithdrawalsRequest) Reset() { + *x = RequestWithdrawalsRequest{} if protoimpl.UnsafeEnabled { mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -367,13 +346,13 @@ func (x *AutoDeposit) Reset() { } } -func (x *AutoDeposit) String() string { +func (x *RequestWithdrawalsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AutoDeposit) ProtoMessage() {} +func (*RequestWithdrawalsRequest) ProtoMessage() {} -func (x *AutoDeposit) ProtoReflect() protoreflect.Message { +func (x *RequestWithdrawalsRequest) ProtoReflect() protoreflect.Message { mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -385,54 +364,29 @@ func (x *AutoDeposit) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AutoDeposit.ProtoReflect.Descriptor instead. -func (*AutoDeposit) Descriptor() ([]byte, []int) { +// Deprecated: Use RequestWithdrawalsRequest.ProtoReflect.Descriptor instead. +func (*RequestWithdrawalsRequest) Descriptor() ([]byte, []int) { return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{6} } -func (x *AutoDeposit) GetDepositedAmount() string { - if x != nil { - return x.DepositedAmount - } - return "" -} - -func (x *AutoDeposit) GetWindowNumber() *wrapperspb.UInt64Value { - if x != nil { - return x.WindowNumber - } - return nil -} - -func (x *AutoDeposit) GetIsCurrent() bool { - if x != nil { - return x.IsCurrent - } - return false -} - -func (x *AutoDeposit) GetStartBlockNumber() *wrapperspb.UInt64Value { +func (x *RequestWithdrawalsRequest) GetProviders() []string { if x != nil { - return x.StartBlockNumber + return x.Providers } return nil } -func (x *AutoDeposit) GetEndBlockNumber() *wrapperspb.UInt64Value { - if x != nil { - return x.EndBlockNumber - } - return nil -} - -type EmptyMessage struct { +type RequestWithdrawalsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + Providers []string `protobuf:"bytes,1,rep,name=providers,proto3" json:"providers,omitempty"` + Amounts []string `protobuf:"bytes,2,rep,name=amounts,proto3" json:"amounts,omitempty"` } -func (x *EmptyMessage) Reset() { - *x = EmptyMessage{} +func (x *RequestWithdrawalsResponse) Reset() { + *x = RequestWithdrawalsResponse{} if protoimpl.UnsafeEnabled { mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -440,13 +394,13 @@ func (x *EmptyMessage) Reset() { } } -func (x *EmptyMessage) String() string { +func (x *RequestWithdrawalsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*EmptyMessage) ProtoMessage() {} +func (*RequestWithdrawalsResponse) ProtoMessage() {} -func (x *EmptyMessage) ProtoReflect() protoreflect.Message { +func (x *RequestWithdrawalsResponse) ProtoReflect() protoreflect.Message { mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -458,54 +412,21 @@ func (x *EmptyMessage) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use EmptyMessage.ProtoReflect.Descriptor instead. -func (*EmptyMessage) Descriptor() ([]byte, []int) { +// Deprecated: Use RequestWithdrawalsResponse.ProtoReflect.Descriptor instead. +func (*RequestWithdrawalsResponse) Descriptor() ([]byte, []int) { return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{7} } -type GetDepositRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - WindowNumber *wrapperspb.UInt64Value `protobuf:"bytes,1,opt,name=window_number,json=windowNumber,proto3" json:"window_number,omitempty"` -} - -func (x *GetDepositRequest) Reset() { - *x = GetDepositRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetDepositRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetDepositRequest) ProtoMessage() {} - -func (x *GetDepositRequest) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *RequestWithdrawalsResponse) GetProviders() []string { + if x != nil { + return x.Providers } - return mi.MessageOf(x) -} - -// Deprecated: Use GetDepositRequest.ProtoReflect.Descriptor instead. -func (*GetDepositRequest) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{8} + return nil } -func (x *GetDepositRequest) GetWindowNumber() *wrapperspb.UInt64Value { +func (x *RequestWithdrawalsResponse) GetAmounts() []string { if x != nil { - return x.WindowNumber + return x.Amounts } return nil } @@ -515,13 +436,13 @@ type WithdrawRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - WindowNumber *wrapperspb.UInt64Value `protobuf:"bytes,1,opt,name=window_number,json=windowNumber,proto3" json:"window_number,omitempty"` + Providers []string `protobuf:"bytes,1,rep,name=providers,proto3" json:"providers,omitempty"` } func (x *WithdrawRequest) Reset() { *x = WithdrawRequest{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[9] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -534,7 +455,7 @@ func (x *WithdrawRequest) String() string { func (*WithdrawRequest) ProtoMessage() {} func (x *WithdrawRequest) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[9] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -547,12 +468,12 @@ func (x *WithdrawRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WithdrawRequest.ProtoReflect.Descriptor instead. func (*WithdrawRequest) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{9} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{8} } -func (x *WithdrawRequest) GetWindowNumber() *wrapperspb.UInt64Value { +func (x *WithdrawRequest) GetProviders() []string { if x != nil { - return x.WindowNumber + return x.Providers } return nil } @@ -562,14 +483,14 @@ type WithdrawResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Amount string `protobuf:"bytes,1,opt,name=amount,proto3" json:"amount,omitempty"` - WindowNumber *wrapperspb.UInt64Value `protobuf:"bytes,2,opt,name=window_number,json=windowNumber,proto3" json:"window_number,omitempty"` + Amounts []string `protobuf:"bytes,1,rep,name=amounts,proto3" json:"amounts,omitempty"` + Providers []string `protobuf:"bytes,2,rep,name=providers,proto3" json:"providers,omitempty"` } func (x *WithdrawResponse) Reset() { *x = WithdrawResponse{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[10] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -582,7 +503,7 @@ func (x *WithdrawResponse) String() string { func (*WithdrawResponse) ProtoMessage() {} func (x *WithdrawResponse) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[10] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -595,113 +516,19 @@ func (x *WithdrawResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WithdrawResponse.ProtoReflect.Descriptor instead. func (*WithdrawResponse) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{10} -} - -func (x *WithdrawResponse) GetAmount() string { - if x != nil { - return x.Amount - } - return "" -} - -func (x *WithdrawResponse) GetWindowNumber() *wrapperspb.UInt64Value { - if x != nil { - return x.WindowNumber - } - return nil -} - -type WithdrawFromWindowsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - WindowNumbers []*wrapperspb.UInt64Value `protobuf:"bytes,1,rep,name=window_numbers,json=windowNumbers,proto3" json:"window_numbers,omitempty"` -} - -func (x *WithdrawFromWindowsRequest) Reset() { - *x = WithdrawFromWindowsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *WithdrawFromWindowsRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*WithdrawFromWindowsRequest) ProtoMessage() {} - -func (x *WithdrawFromWindowsRequest) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use WithdrawFromWindowsRequest.ProtoReflect.Descriptor instead. -func (*WithdrawFromWindowsRequest) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{11} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{9} } -func (x *WithdrawFromWindowsRequest) GetWindowNumbers() []*wrapperspb.UInt64Value { +func (x *WithdrawResponse) GetAmounts() []string { if x != nil { - return x.WindowNumbers + return x.Amounts } return nil } -type WithdrawFromWindowsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - WithdrawResponses []*WithdrawResponse `protobuf:"bytes,1,rep,name=withdraw_responses,json=withdrawResponses,proto3" json:"withdraw_responses,omitempty"` -} - -func (x *WithdrawFromWindowsResponse) Reset() { - *x = WithdrawFromWindowsResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *WithdrawFromWindowsResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*WithdrawFromWindowsResponse) ProtoMessage() {} - -func (x *WithdrawFromWindowsResponse) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[12] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use WithdrawFromWindowsResponse.ProtoReflect.Descriptor instead. -func (*WithdrawFromWindowsResponse) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{12} -} - -func (x *WithdrawFromWindowsResponse) GetWithdrawResponses() []*WithdrawResponse { +func (x *WithdrawResponse) GetProviders() []string { if x != nil { - return x.WithdrawResponses + return x.Providers } return nil } @@ -724,7 +551,7 @@ type Bid struct { func (x *Bid) Reset() { *x = Bid{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[13] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -737,7 +564,7 @@ func (x *Bid) String() string { func (*Bid) ProtoMessage() {} func (x *Bid) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[13] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -750,7 +577,7 @@ func (x *Bid) ProtoReflect() protoreflect.Message { // Deprecated: Use Bid.ProtoReflect.Descriptor instead. func (*Bid) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{13} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{10} } func (x *Bid) GetTxHashes() []string { @@ -832,7 +659,7 @@ type Commitment struct { func (x *Commitment) Reset() { *x = Commitment{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[14] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -845,7 +672,7 @@ func (x *Commitment) String() string { func (*Commitment) ProtoMessage() {} func (x *Commitment) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[14] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -858,7 +685,7 @@ func (x *Commitment) ProtoReflect() protoreflect.Message { // Deprecated: Use Commitment.ProtoReflect.Descriptor instead. func (*Commitment) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{14} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{11} } func (x *Commitment) GetTxHashes() []string { @@ -965,7 +792,7 @@ type GetBidInfoRequest struct { func (x *GetBidInfoRequest) Reset() { *x = GetBidInfoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[15] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -978,7 +805,7 @@ func (x *GetBidInfoRequest) String() string { func (*GetBidInfoRequest) ProtoMessage() {} func (x *GetBidInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[15] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -991,7 +818,7 @@ func (x *GetBidInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBidInfoRequest.ProtoReflect.Descriptor instead. func (*GetBidInfoRequest) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{15} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{12} } func (x *GetBidInfoRequest) GetBlockNumber() int64 { @@ -1026,7 +853,7 @@ type GetBidInfoResponse struct { func (x *GetBidInfoResponse) Reset() { *x = GetBidInfoResponse{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[16] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1039,7 +866,7 @@ func (x *GetBidInfoResponse) String() string { func (*GetBidInfoResponse) ProtoMessage() {} func (x *GetBidInfoResponse) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[16] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1052,7 +879,7 @@ func (x *GetBidInfoResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBidInfoResponse.ProtoReflect.Descriptor instead. func (*GetBidInfoResponse) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{16} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{13} } func (x *GetBidInfoResponse) GetBlockBidInfo() []*GetBidInfoResponse_BlockBidInfo { @@ -1078,7 +905,7 @@ type GetBidInfoResponse_CommitmentWithStatus struct { func (x *GetBidInfoResponse_CommitmentWithStatus) Reset() { *x = GetBidInfoResponse_CommitmentWithStatus{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[17] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1091,7 +918,7 @@ func (x *GetBidInfoResponse_CommitmentWithStatus) String() string { func (*GetBidInfoResponse_CommitmentWithStatus) ProtoMessage() {} func (x *GetBidInfoResponse_CommitmentWithStatus) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[17] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1104,7 +931,7 @@ func (x *GetBidInfoResponse_CommitmentWithStatus) ProtoReflect() protoreflect.Me // Deprecated: Use GetBidInfoResponse_CommitmentWithStatus.ProtoReflect.Descriptor instead. func (*GetBidInfoResponse_CommitmentWithStatus) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{16, 0} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{13, 0} } func (x *GetBidInfoResponse_CommitmentWithStatus) GetProviderAddress() string { @@ -1168,7 +995,7 @@ type GetBidInfoResponse_BidInfo struct { func (x *GetBidInfoResponse_BidInfo) Reset() { *x = GetBidInfoResponse_BidInfo{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[18] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1181,7 +1008,7 @@ func (x *GetBidInfoResponse_BidInfo) String() string { func (*GetBidInfoResponse_BidInfo) ProtoMessage() {} func (x *GetBidInfoResponse_BidInfo) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[18] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1194,7 +1021,7 @@ func (x *GetBidInfoResponse_BidInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBidInfoResponse_BidInfo.ProtoReflect.Descriptor instead. func (*GetBidInfoResponse_BidInfo) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{16, 1} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{13, 1} } func (x *GetBidInfoResponse_BidInfo) GetTxnHashes() []string { @@ -1272,7 +1099,7 @@ type GetBidInfoResponse_BlockBidInfo struct { func (x *GetBidInfoResponse_BlockBidInfo) Reset() { *x = GetBidInfoResponse_BlockBidInfo{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[19] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1285,7 +1112,7 @@ func (x *GetBidInfoResponse_BlockBidInfo) String() string { func (*GetBidInfoResponse_BlockBidInfo) ProtoMessage() {} func (x *GetBidInfoResponse_BlockBidInfo) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[19] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1298,7 +1125,7 @@ func (x *GetBidInfoResponse_BlockBidInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBidInfoResponse_BlockBidInfo.ProtoReflect.Descriptor instead. func (*GetBidInfoResponse_BlockBidInfo) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{16, 2} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{13, 2} } func (x *GetBidInfoResponse_BlockBidInfo) GetBlockNumber() int64 { @@ -1329,7 +1156,7 @@ var file_bidderapi_v1_bidderapi_proto_rawDesc = []byte{ 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, - 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xcf, 0x06, 0x0a, 0x0e, 0x44, 0x65, 0x70, 0x6f, + 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8c, 0x04, 0x0a, 0x0e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0xaf, 0x01, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x96, 0x01, 0x92, 0x41, 0x45, 0x32, 0x25, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, @@ -1341,615 +1168,169 @@ var file_bidderapi_v1_bidderapi_proto_rawDesc = []byte{ 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x1d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x5b, 0x31, 0x2d, 0x39, 0x5d, 0x5b, 0x30, 0x2d, 0x39, 0x5d, - 0x2a, 0x24, 0x27, 0x29, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x95, 0x02, 0x0a, - 0x0d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x42, 0xd1, 0x01, 0x92, 0x41, 0x65, 0x32, 0x60, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x61, 0x6c, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x20, 0x66, 0x6f, 0x72, 0x20, 0x71, 0x75, 0x65, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x70, - 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x2e, 0x4a, 0x01, 0x31, 0xba, 0x48, 0x66, - 0xba, 0x01, 0x63, 0x0a, 0x0d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x6e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x12, 0x36, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x76, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x20, 0x69, 0x66, 0x20, - 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2e, 0x1a, 0x1a, 0x74, 0x68, 0x69, 0x73, - 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x74, 0x68, 0x69, - 0x73, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x52, 0x0c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x12, 0x9c, 0x02, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, - 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0xda, 0x01, 0x92, 0x41, 0x70, 0x32, - 0x66, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x2e, 0x20, 0x49, 0x66, 0x20, - 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2c, 0x20, 0x63, 0x61, 0x6c, 0x63, 0x75, - 0x6c, 0x61, 0x74, 0x65, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x20, 0x62, 0x61, 0x73, 0x65, - 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x4a, 0x06, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0xba, - 0x48, 0x64, 0xba, 0x01, 0x61, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x12, 0x35, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x76, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x20, 0x69, 0x66, 0x20, - 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2e, 0x1a, 0x1a, 0x74, 0x68, 0x69, 0x73, - 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x74, 0x68, 0x69, - 0x73, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x3a, 0x54, 0x92, 0x41, 0x51, 0x0a, 0x4f, 0x2a, 0x0f, 0x44, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0x33, 0x44, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x62, 0x69, 0x64, 0x73, 0x20, 0x74, 0x6f, - 0x20, 0x62, 0x65, 0x20, 0x69, 0x73, 0x73, 0x75, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x77, 0x65, 0x69, 0x2e, - 0xd2, 0x01, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x82, 0x02, 0x0a, 0x0f, 0x44, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, - 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, - 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x77, 0x69, 0x6e, 0x64, - 0x6f, 0x77, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x3a, 0x93, 0x01, 0x92, 0x41, 0x8f, 0x01, 0x0a, - 0x56, 0x2a, 0x10, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x32, 0x42, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x20, 0x66, 0x6f, 0x72, - 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, - 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x61, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x20, - 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x32, 0x35, 0x7b, 0x22, 0x61, 0x6d, 0x6f, 0x75, 0x6e, - 0x74, 0x22, 0x3a, 0x20, 0x22, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x2c, 0x20, 0x22, 0x77, 0x69, 0x6e, 0x64, - 0x6f, 0x77, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x31, 0x7d, 0x22, 0x9a, - 0x02, 0x0a, 0x13, 0x41, 0x75, 0x74, 0x6f, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, - 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x11, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, - 0x65, 0x72, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x65, 0x72, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, - 0x3a, 0x88, 0x01, 0x92, 0x41, 0x84, 0x01, 0x0a, 0x38, 0x2a, 0x14, 0x41, 0x75, 0x74, 0x6f, 0x44, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, - 0x20, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, - 0x6f, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x2e, 0x32, 0x48, 0x7b, 0x22, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, - 0x77, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x22, 0x31, 0x22, 0x2c, 0x20, - 0x22, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x77, 0x69, 0x6e, 0x64, - 0x6f, 0x77, 0x22, 0x3a, 0x20, 0x22, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x7d, 0x22, 0xdf, 0x03, 0x0a, 0x19, - 0x41, 0x75, 0x74, 0x6f, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0f, 0x77, 0x69, 0x6e, - 0x64, 0x6f, 0x77, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x0e, 0x77, - 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x34, 0x0a, - 0x16, 0x69, 0x73, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x69, - 0x73, 0x41, 0x75, 0x74, 0x6f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x45, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x3a, 0xc7, 0x02, 0x92, 0x41, 0xc3, 0x02, 0x0a, 0x4b, 0x2a, 0x1b, 0x41, 0x75, - 0x74, 0x6f, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x2c, 0x41, 0x75, 0x74, 0x6f, 0x44, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x66, 0x72, - 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x72, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0x32, 0xf3, 0x01, 0x7b, 0x22, 0x77, 0x69, 0x6e, 0x64, - 0x6f, 0x77, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x7b, - 0x22, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x22, 0x3a, 0x20, 0x22, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x2c, 0x20, 0x22, 0x77, 0x69, 0x6e, 0x64, 0x6f, - 0x77, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x31, 0x7d, 0x2c, 0x20, 0x7b, - 0x22, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x22, 0x3a, 0x20, 0x22, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x2c, 0x20, 0x22, 0x77, 0x69, 0x6e, 0x64, 0x6f, - 0x77, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x32, 0x7d, 0x2c, 0x20, 0x7b, - 0x22, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x22, 0x3a, 0x20, 0x22, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x2c, 0x20, 0x22, 0x77, 0x69, 0x6e, 0x64, 0x6f, - 0x77, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x33, 0x7d, 0x5d, 0x2c, 0x20, - 0x22, 0x69, 0x73, 0x41, 0x75, 0x74, 0x6f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x45, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0x7d, 0x22, 0x78, 0x0a, - 0x18, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x41, 0x75, 0x74, 0x6f, 0x44, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x69, 0x74, - 0x68, 0x64, 0x72, 0x61, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x77, 0x69, 0x74, - 0x68, 0x64, 0x72, 0x61, 0x77, 0x3a, 0x40, 0x92, 0x41, 0x3d, 0x0a, 0x3b, 0x2a, 0x19, 0x43, 0x61, - 0x6e, 0x63, 0x65, 0x6c, 0x41, 0x75, 0x74, 0x6f, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x20, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0x1e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x20, 0x74, 0x6f, 0x20, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x20, 0x41, 0x75, 0x74, 0x6f, 0x44, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x2e, 0x22, 0xd7, 0x01, 0x0a, 0x19, 0x43, 0x61, 0x6e, 0x63, - 0x65, 0x6c, 0x41, 0x75, 0x74, 0x6f, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x0e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x77, 0x69, 0x6e, - 0x64, 0x6f, 0x77, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x3a, 0x75, 0x92, 0x41, 0x72, 0x0a, - 0x51, 0x2a, 0x1a, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x41, 0x75, 0x74, 0x6f, 0x44, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x33, 0x43, - 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x41, 0x75, 0x74, 0x6f, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x20, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, - 0x79, 0x2e, 0x32, 0x1d, 0x7b, 0x22, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x31, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x33, 0x5d, - 0x7d, 0x22, 0x8f, 0x04, 0x0a, 0x0b, 0x41, 0x75, 0x74, 0x6f, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x12, 0x4e, 0x0a, 0x0f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x64, 0x41, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x24, 0x92, 0x41, 0x21, 0x32, - 0x1f, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x64, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, - 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x69, 0x6e, 0x20, 0x77, 0x65, 0x69, 0x2e, - 0x52, 0x0f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x66, 0x0a, 0x0d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x6e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, - 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x23, 0x92, 0x41, 0x20, 0x32, 0x1e, 0x57, 0x69, 0x6e, - 0x64, 0x6f, 0x77, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x2e, 0x52, 0x0c, 0x77, 0x69, 0x6e, - 0x64, 0x6f, 0x77, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x52, 0x0a, 0x0a, 0x69, 0x73, 0x5f, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x42, 0x33, 0x92, - 0x41, 0x30, 0x32, 0x2e, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x69, 0x66, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, - 0x77, 0x2e, 0x52, 0x09, 0x69, 0x73, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x7c, 0x0a, - 0x12, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, - 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x30, 0x92, 0x41, 0x2d, 0x32, 0x2b, 0x54, 0x68, - 0x65, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x4c, 0x31, 0x20, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x52, 0x10, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x76, 0x0a, 0x10, 0x65, - 0x6e, 0x64, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x42, 0x2e, 0x92, 0x41, 0x2b, 0x32, 0x29, 0x54, 0x68, 0x65, 0x20, 0x66, 0x69, - 0x6e, 0x61, 0x6c, 0x20, 0x4c, 0x31, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x69, 0x6e, 0x64, - 0x6f, 0x77, 0x2e, 0x52, 0x0e, 0x65, 0x6e, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x22, 0x0e, 0x0a, 0x0c, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x22, 0xa9, 0x02, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x93, 0x02, 0x0a, 0x0d, 0x77, 0x69, - 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, - 0xcf, 0x01, 0x92, 0x41, 0x63, 0x32, 0x61, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, - 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x71, 0x75, 0x65, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x73, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x70, 0x65, 0x63, - 0x69, 0x66, 0x69, 0x65, 0x64, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, - 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x2e, 0xba, 0x48, 0x66, 0xba, 0x01, 0x63, 0x0a, 0x0d, - 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x36, 0x77, - 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6d, 0x75, 0x73, - 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x20, - 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x20, 0x69, 0x66, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, - 0x66, 0x69, 0x65, 0x64, 0x2e, 0x1a, 0x1a, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x6e, - 0x75, 0x6c, 0x6c, 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x20, 0x30, - 0x29, 0x52, 0x0c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, - 0xed, 0x02, 0x0a, 0x0f, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x94, 0x02, 0x0a, 0x0d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, - 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0xd0, 0x01, 0x92, 0x41, 0x64, 0x32, - 0x62, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, - 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x77, 0x69, 0x74, 0x68, - 0x64, 0x72, 0x61, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, - 0x2e, 0x20, 0x49, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, - 0x65, 0x64, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x77, 0x69, 0x6e, - 0x64, 0x6f, 0x77, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, - 0x65, 0x64, 0x2e, 0xba, 0x48, 0x66, 0xba, 0x01, 0x63, 0x0a, 0x0d, 0x77, 0x69, 0x6e, 0x64, 0x6f, - 0x77, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x36, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, - 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, - 0x61, 0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, - 0x65, 0x72, 0x20, 0x69, 0x66, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2e, - 0x1a, 0x1a, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x20, 0x7c, - 0x7c, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x52, 0x0c, 0x77, 0x69, - 0x6e, 0x64, 0x6f, 0x77, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x3a, 0x43, 0x92, 0x41, 0x40, 0x0a, - 0x3e, 0x2a, 0x10, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x20, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x32, 0x2a, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x20, 0x64, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, - 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0x22, - 0xec, 0x01, 0x0a, 0x10, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0d, - 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x0c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x3a, - 0x7d, 0x92, 0x41, 0x7a, 0x0a, 0x40, 0x2a, 0x11, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, - 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x2b, 0x57, 0x69, 0x74, 0x68, 0x64, - 0x72, 0x61, 0x77, 0x6e, 0x20, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x20, 0x66, 0x72, 0x6f, - 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x72, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0x32, 0x36, 0x7b, 0x22, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x22, 0x3a, 0x20, 0x22, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x2c, 0x20, 0x22, 0x77, 0x69, 0x6e, 0x64, 0x6f, - 0x77, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x31, 0x20, 0x7d, 0x22, 0x97, - 0x03, 0x0a, 0x1a, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x46, 0x72, 0x6f, 0x6d, 0x57, - 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0xeb, 0x01, - 0x0a, 0x0e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x42, 0xa5, 0x01, 0x92, 0x41, 0x2a, 0x32, 0x28, 0x57, 0x69, 0x6e, 0x64, - 0x6f, 0x77, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x77, - 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x73, 0x2e, 0xba, 0x48, 0x75, 0xba, 0x01, 0x72, 0x0a, 0x0e, 0x77, 0x69, 0x6e, 0x64, - 0x6f, 0x77, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x3a, 0x77, 0x69, 0x6e, 0x64, - 0x6f, 0x77, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, - 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, - 0x20, 0x6f, 0x66, 0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x20, 0x69, 0x6e, 0x74, - 0x65, 0x67, 0x65, 0x72, 0x73, 0x2e, 0x1a, 0x24, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, - 0x28, 0x72, 0x2c, 0x20, 0x72, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x26, 0x26, 0x20, 0x73, 0x69, - 0x7a, 0x65, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x52, 0x0d, 0x77, 0x69, - 0x6e, 0x64, 0x6f, 0x77, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x3a, 0x8a, 0x01, 0x92, 0x41, - 0x86, 0x01, 0x0a, 0x65, 0x2a, 0x26, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x20, 0x66, - 0x72, 0x6f, 0x6d, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x20, 0x77, 0x69, 0x6e, - 0x64, 0x6f, 0x77, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0x2a, 0x57, 0x69, - 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x20, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x20, 0x66, - 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x72, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0xd2, 0x01, 0x0e, 0x77, 0x69, 0x6e, 0x64, 0x6f, - 0x77, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x32, 0x1d, 0x7b, 0x22, 0x77, 0x69, 0x6e, - 0x64, 0x6f, 0x77, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x31, - 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x33, 0x5d, 0x7d, 0x22, 0x8f, 0x03, 0x0a, 0x1b, 0x57, 0x69, 0x74, - 0x68, 0x64, 0x72, 0x61, 0x77, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x77, 0x69, 0x74, 0x68, - 0x64, 0x72, 0x61, 0x77, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x11, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x3a, 0xa0, 0x02, 0x92, 0x41, 0x9c, 0x02, 0x0a, 0x56, - 0x2a, 0x27, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, - 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, - 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x2b, 0x57, 0x69, 0x74, 0x68, 0x64, - 0x72, 0x61, 0x77, 0x6e, 0x20, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x20, 0x66, 0x72, 0x6f, - 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x72, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0x32, 0xc1, 0x01, 0x7b, 0x22, 0x77, 0x69, 0x74, 0x68, 0x64, - 0x72, 0x61, 0x77, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x2a, 0x24, 0x27, 0x29, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0xce, 0x01, 0x0a, + 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, + 0xb1, 0x01, 0x92, 0x41, 0x4a, 0x32, 0x1a, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, + 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x2e, 0x4a, 0x2c, 0x22, 0x30, 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0xba, + 0x48, 0x61, 0xba, 0x01, 0x5e, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, + 0x2a, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, + 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, + 0x75, 0x6d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x1a, 0x26, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, + 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x34, 0x30, 0x7d, + 0x24, 0x27, 0x29, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x3a, 0x77, 0x92, + 0x41, 0x74, 0x0a, 0x72, 0x2a, 0x0f, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0x4b, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x62, 0x69, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x69, 0x73, + 0x73, 0x75, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, + 0x65, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x77, 0x65, 0x69, 0x2c, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, + 0x66, 0x69, 0x63, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x2e, 0xd2, 0x01, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0xd2, 0x01, 0x08, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x83, 0x02, 0x0a, 0x0f, 0x44, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x3a, 0xbb, + 0x01, 0x92, 0x41, 0xb7, 0x01, 0x0a, 0x58, 0x2a, 0x10, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x44, 0x44, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x72, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x72, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x63, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x32, 0x5b, 0x7b, 0x22, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x22, 0x2c, 0x20, 0x22, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x22, 0x3a, 0x20, 0x31, 0x20, 0x7d, 0x2c, 0x20, 0x7b, 0x22, 0x61, 0x6d, 0x6f, 0x75, 0x6e, - 0x74, 0x22, 0x3a, 0x20, 0x22, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x2c, 0x20, 0x22, 0x77, 0x69, 0x6e, 0x64, - 0x6f, 0x77, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x32, 0x20, 0x7d, 0x2c, - 0x20, 0x7b, 0x22, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x31, 0x30, 0x30, + 0x22, 0x2c, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x22, + 0x30, 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x22, 0x2c, 0x20, 0x22, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x22, 0x3a, 0x20, 0x33, 0x20, 0x7d, 0x20, 0x5d, 0x7d, 0x22, 0xf2, 0x13, 0x0a, 0x03, 0x42, - 0x69, 0x64, 0x12, 0x94, 0x02, 0x0a, 0x09, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0xf6, 0x01, 0x92, 0x41, 0x78, 0x32, 0x64, 0x48, 0x65, - 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, - 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, - 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, - 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x2e, 0x8a, 0x01, 0x0f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, - 0x7b, 0x36, 0x34, 0x7d, 0xba, 0x48, 0x78, 0xba, 0x01, 0x75, 0x0a, 0x09, 0x74, 0x78, 0x5f, 0x68, - 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x36, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, - 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x2e, 0x1a, 0x30, 0x74, - 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, 0x2e, 0x6d, 0x61, 0x74, - 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, - 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x24, 0x27, 0x29, 0x29, 0x52, - 0x08, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0xe0, 0x01, 0x0a, 0x06, 0x61, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0xc7, 0x01, 0x92, 0x41, 0x76, - 0x32, 0x6b, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, - 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, - 0x69, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x61, - 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, 0x06, - 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0xba, 0x48, 0x4b, 0xba, 0x01, 0x48, 0x0a, 0x06, 0x61, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6d, 0x75, 0x73, - 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, - 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x1d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, - 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x5b, 0x31, 0x2d, 0x39, 0x5d, 0x5b, 0x30, 0x2d, 0x39, 0x5d, - 0x2a, 0x24, 0x27, 0x29, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0xb9, 0x01, 0x0a, - 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x03, 0x42, 0x95, 0x01, 0x92, 0x41, 0x47, 0x32, 0x45, 0x4d, 0x61, 0x78, 0x20, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, - 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x2e, - 0xba, 0x48, 0x48, 0xba, 0x01, 0x45, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x12, 0x25, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x0e, 0x75, 0x69, 0x6e, - 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x52, 0x0b, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0xc2, 0x01, 0x0a, 0x15, 0x64, 0x65, 0x63, - 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x42, 0x8d, 0x01, 0x92, 0x41, 0x2d, 0x32, 0x2b, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, - 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0xba, 0x48, 0x5a, 0xba, 0x01, - 0x57, 0x0a, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2e, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x7d, 0x22, 0x81, 0x04, 0x0a, + 0x14, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0xcc, 0x01, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, + 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0xa8, 0x01, 0x92, + 0x41, 0x4b, 0x32, 0x2b, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x64, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x77, 0x65, 0x69, 0x2e, 0x4a, + 0x13, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0xba, 0x48, 0x57, + 0xba, 0x01, 0x54, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x25, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, - 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x0e, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, - 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x52, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0xb8, 0x01, - 0x0a, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x42, 0x87, 0x01, 0x92, 0x41, - 0x2b, 0x32, 0x29, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, - 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x65, 0x6e, - 0x64, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0xba, 0x48, 0x56, 0xba, - 0x01, 0x53, 0x0a, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2c, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, - 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x6d, 0x75, 0x73, - 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, - 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x0e, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, - 0x29, 0x20, 0x3e, 0x20, 0x30, 0x52, 0x11, 0x64, 0x65, 0x63, 0x61, 0x79, 0x45, 0x6e, 0x64, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x8f, 0x02, 0x0a, 0x13, 0x72, 0x65, 0x76, - 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, - 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x42, 0xde, 0x01, 0x92, 0x41, 0x49, 0x32, 0x47, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, - 0x74, 0x78, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, - 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, - 0x76, 0x65, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x62, 0x65, 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, - 0x72, 0x64, 0x65, 0x64, 0x2e, 0xba, 0x48, 0x8e, 0x01, 0xba, 0x01, 0x8a, 0x01, 0x0a, 0x13, 0x72, - 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, - 0x65, 0x73, 0x12, 0x41, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, - 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, - 0x61, 0x6e, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x61, - 0x73, 0x68, 0x65, 0x73, 0x2e, 0x1a, 0x30, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x1d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x5b, 0x31, 0x2d, 0x39, 0x5d, 0x5b, 0x30, + 0x2d, 0x39, 0x5d, 0x2a, 0x24, 0x27, 0x29, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x41, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0xbb, 0x01, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0x9c, 0x01, 0x92, 0x41, 0x1e, 0x32, 0x1c, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, + 0x6d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2e, 0xba, 0x48, 0x78, 0xba, + 0x01, 0x75, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x36, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, + 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, + 0x66, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x65, 0x73, 0x2e, 0x1a, 0x30, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, - 0x36, 0x34, 0x7d, 0x24, 0x27, 0x29, 0x29, 0x52, 0x11, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, - 0x6e, 0x67, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0xa3, 0x02, 0x0a, 0x10, 0x72, - 0x61, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x07, 0x20, 0x03, 0x28, 0x09, 0x42, 0xf7, 0x01, 0x92, 0x41, 0x6e, 0x32, 0x6c, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x52, - 0x4c, 0x50, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x20, 0x72, 0x61, 0x77, 0x20, 0x73, - 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, - 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0xba, 0x48, 0x82, 0x01, 0xba, 0x01, 0x7f, - 0x0a, 0x10, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x3c, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x6e, 0x20, - 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x72, - 0x61, 0x77, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, - 0x1a, 0x2d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, 0x2e, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, - 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x2a, 0x24, 0x27, 0x29, 0x29, 0x52, - 0x0f, 0x72, 0x61, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0xbf, 0x02, 0x0a, 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x9b, 0x02, 0x92, 0x41, 0x9f, 0x01, 0x32, 0x93, - 0x01, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, - 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x73, 0x6c, 0x61, 0x73, - 0x68, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x66, 0x61, - 0x69, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x49, - 0x66, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x63, 0x61, - 0x79, 0x65, 0x64, 0x20, 0x62, 0x69, 0x64, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x69, - 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, - 0x69, 0x6e, 0x67, 0x2e, 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0xba, 0x48, 0x75, - 0xba, 0x01, 0x72, 0x0a, 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x25, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, - 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, - 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3d, - 0x3d, 0x20, 0x27, 0x27, 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, - 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x24, 0x27, - 0x29, 0x20, 0x26, 0x26, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, - 0x3e, 0x3d, 0x20, 0x30, 0x29, 0x52, 0x0b, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x41, 0x6d, 0x6f, 0x75, - 0x6e, 0x74, 0x3a, 0xba, 0x04, 0x92, 0x41, 0xb6, 0x04, 0x0a, 0x95, 0x01, 0x2a, 0x0b, 0x42, 0x69, - 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x40, 0x55, 0x6e, 0x73, 0x69, 0x67, - 0x6e, 0x65, 0x64, 0x20, 0x62, 0x69, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, - 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x73, 0x20, 0x74, 0x6f, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x6d, 0x65, 0x76, 0x2d, 0x63, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0xd2, 0x01, 0x06, 0x61, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0xd2, 0x01, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0xd2, 0x01, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0xd2, 0x01, 0x13, 0x64, 0x65, - 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x32, 0x9b, 0x03, 0x7b, 0x22, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x22, - 0x3a, 0x20, 0x5b, 0x22, 0x66, 0x65, 0x34, 0x63, 0x62, 0x34, 0x37, 0x64, 0x62, 0x33, 0x36, 0x33, - 0x30, 0x35, 0x35, 0x31, 0x62, 0x65, 0x65, 0x64, 0x66, 0x62, 0x64, 0x30, 0x32, 0x61, 0x37, 0x31, - 0x65, 0x63, 0x63, 0x36, 0x39, 0x66, 0x64, 0x35, 0x39, 0x37, 0x35, 0x38, 0x65, 0x32, 0x62, 0x61, - 0x36, 0x39, 0x39, 0x36, 0x30, 0x36, 0x65, 0x32, 0x64, 0x35, 0x63, 0x37, 0x34, 0x32, 0x38, 0x34, - 0x66, 0x66, 0x61, 0x37, 0x22, 0x2c, 0x20, 0x22, 0x37, 0x31, 0x63, 0x31, 0x33, 0x34, 0x38, 0x66, - 0x32, 0x64, 0x37, 0x66, 0x66, 0x37, 0x65, 0x38, 0x31, 0x34, 0x66, 0x39, 0x63, 0x33, 0x36, 0x31, - 0x37, 0x39, 0x38, 0x33, 0x37, 0x30, 0x33, 0x34, 0x33, 0x35, 0x65, 0x61, 0x37, 0x34, 0x34, 0x36, - 0x64, 0x65, 0x34, 0x32, 0x30, 0x61, 0x65, 0x61, 0x63, 0x34, 0x38, 0x38, 0x62, 0x66, 0x31, 0x64, - 0x65, 0x33, 0x35, 0x37, 0x33, 0x37, 0x65, 0x38, 0x22, 0x5d, 0x2c, 0x20, 0x22, 0x61, 0x6d, 0x6f, - 0x75, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x31, 0x32, 0x33, - 0x34, 0x35, 0x36, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3a, 0x20, 0x31, 0x36, - 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x63, 0x61, 0x79, - 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3a, - 0x20, 0x31, 0x36, 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x2c, 0x20, 0x22, 0x72, 0x65, - 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, - 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x66, 0x65, 0x34, 0x63, 0x62, 0x34, 0x37, 0x64, 0x62, 0x33, - 0x36, 0x33, 0x30, 0x35, 0x35, 0x31, 0x62, 0x65, 0x65, 0x64, 0x66, 0x62, 0x64, 0x30, 0x32, 0x61, - 0x37, 0x31, 0x65, 0x63, 0x63, 0x36, 0x39, 0x66, 0x64, 0x35, 0x39, 0x37, 0x35, 0x38, 0x65, 0x32, - 0x62, 0x61, 0x36, 0x39, 0x39, 0x36, 0x30, 0x36, 0x65, 0x32, 0x64, 0x35, 0x63, 0x37, 0x34, 0x32, - 0x38, 0x34, 0x66, 0x66, 0x61, 0x37, 0x22, 0x5d, 0x2c, 0x20, 0x22, 0x73, 0x6c, 0x61, 0x73, 0x68, - 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x35, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x7d, 0x22, - 0xc2, 0x0d, 0x0a, 0x0a, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x95, - 0x01, 0x0a, 0x09, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x42, 0x78, 0x92, 0x41, 0x75, 0x32, 0x61, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x68, 0x61, 0x73, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, - 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x69, 0x6e, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, 0x0f, 0x5b, 0x61, 0x2d, - 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x52, 0x08, 0x74, 0x78, - 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x8f, 0x01, 0x0a, 0x0a, 0x62, 0x69, 0x64, 0x5f, 0x61, - 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x70, 0x92, 0x41, 0x6d, - 0x32, 0x6b, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, - 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, - 0x68, 0x61, 0x73, 0x20, 0x61, 0x67, 0x72, 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x61, - 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x52, 0x09, 0x62, - 0x69, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x6d, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x4a, - 0x92, 0x41, 0x47, 0x32, 0x45, 0x4d, 0x61, 0x78, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, - 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, - 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x2e, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x7b, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x65, 0x69, - 0x76, 0x65, 0x64, 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x4b, 0x92, 0x41, 0x48, 0x32, 0x46, 0x48, 0x65, 0x78, 0x20, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, - 0x66, 0x20, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x62, 0x69, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x73, 0x69, 0x67, 0x6e, - 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, - 0x2e, 0x52, 0x11, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x42, 0x69, 0x64, 0x44, 0x69, - 0x67, 0x65, 0x73, 0x74, 0x12, 0x7d, 0x0a, 0x16, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, - 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x47, 0x92, 0x41, 0x44, 0x32, 0x42, 0x48, 0x65, 0x78, 0x20, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, - 0x66, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x73, - 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x62, 0x69, 0x64, 0x2e, 0x52, 0x14, 0x72, - 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x42, 0x69, 0x64, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x12, 0x62, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, - 0x74, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x35, - 0x92, 0x41, 0x32, 0x32, 0x30, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, - 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x69, 0x67, 0x65, - 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, - 0x74, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x9e, 0x01, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x6b, 0x92, 0x41, 0x68, 0x32, 0x66, 0x48, 0x65, 0x78, - 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, - 0x20, 0x6f, 0x66, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x6f, 0x66, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, - 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x69, 0x6e, - 0x67, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x52, 0x13, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x53, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x10, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x5d, 0x92, 0x41, 0x5a, 0x32, 0x58, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, - 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x2e, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x12, 0x64, 0x0a, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x03, 0x42, 0x30, 0x92, 0x41, 0x2d, 0x32, 0x2b, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x62, 0x69, 0x64, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, - 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x5e, 0x0a, 0x13, 0x64, 0x65, 0x63, - 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x42, 0x2e, 0x92, 0x41, 0x2b, 0x32, 0x29, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x64, 0x65, 0x63, - 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x11, 0x64, 0x65, 0x63, 0x61, 0x79, 0x45, 0x6e, 0x64, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x63, 0x0a, 0x12, 0x64, 0x69, 0x73, - 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x03, 0x42, 0x34, 0x92, 0x41, 0x31, 0x32, 0x2f, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x73, - 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x2e, 0x52, 0x11, 0x64, 0x69, 0x73, - 0x70, 0x61, 0x74, 0x63, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x7c, - 0x0a, 0x13, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, - 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x42, 0x4c, 0x92, 0x41, 0x49, - 0x32, 0x47, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, - 0x20, 0x6f, 0x66, 0x20, 0x74, 0x78, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x74, 0x68, - 0x61, 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x74, - 0x6f, 0x20, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x62, 0x65, 0x20, 0x64, - 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x65, 0x64, 0x2e, 0x52, 0x11, 0x72, 0x65, 0x76, 0x65, 0x72, - 0x74, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x85, 0x01, 0x0a, - 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x62, 0x92, 0x41, 0x5f, 0x32, 0x5d, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, - 0x6c, 0x20, 0x62, 0x65, 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, - 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x69, - 0x66, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x69, - 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x0b, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x41, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x5e, 0x92, 0x41, 0x5b, 0x0a, 0x59, 0x2a, 0x12, 0x43, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, - 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, - 0x64, 0x65, 0x72, 0x20, 0x6d, 0x65, 0x76, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x20, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x22, 0xbe, 0x02, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x9f, 0x01, 0x0a, 0x0c, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x42, 0x7c, 0x92, 0x41, 0x79, 0x32, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, - 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x71, 0x75, 0x65, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x69, 0x64, 0x20, 0x69, - 0x6e, 0x66, 0x6f, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x70, 0x65, 0x63, - 0x69, 0x66, 0x69, 0x65, 0x64, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, - 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x20, 0x61, - 0x72, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x61, - 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x52, - 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x04, - 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x20, 0x92, 0x41, 0x1d, 0x32, - 0x1b, 0x50, 0x61, 0x67, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, - 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x04, 0x70, 0x61, - 0x67, 0x65, 0x12, 0x51, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x05, 0x42, 0x3b, 0x92, 0x41, 0x38, 0x32, 0x36, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, - 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x70, 0x61, 0x67, 0x65, - 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x20, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x69, 0x73, 0x20, 0x35, 0x30, 0x52, 0x05, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0xe0, 0x11, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x97, 0x01, 0x0a, - 0x0e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x69, 0x64, - 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x42, 0x92, 0x41, 0x3f, 0x32, 0x3d, 0x4c, 0x69, 0x73, 0x74, 0x20, - 0x6f, 0x66, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x62, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x66, - 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x69, 0x64, - 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x63, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x52, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x42, - 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0xf4, 0x04, 0x0a, 0x14, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x57, 0x69, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x7e, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x53, 0x92, 0x41, 0x50, 0x32, 0x4e, - 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, - 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x0f, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, - 0x63, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x42, 0x34, 0x92, 0x41, 0x31, - 0x32, 0x2f, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, - 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, - 0x65, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, - 0x2e, 0x52, 0x11, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x12, 0x86, 0x01, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x6e, 0x92, 0x41, 0x6b, 0x32, 0x69, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x20, 0x50, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x73, 0x3a, 0x20, 0x27, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x27, - 0x2c, 0x20, 0x27, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x27, 0x6f, 0x70, 0x65, - 0x6e, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x27, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x27, 0x2c, - 0x20, 0x27, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x27, 0x66, 0x61, 0x69, - 0x6c, 0x65, 0x64, 0x27, 0x2e, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4e, 0x0a, - 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x34, - 0x92, 0x41, 0x31, 0x32, 0x2f, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, - 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x2e, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x48, 0x0a, - 0x07, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2e, - 0x92, 0x41, 0x2b, 0x32, 0x29, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x6d, 0x6f, - 0x75, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x77, 0x65, 0x69, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x07, - 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x54, 0x0a, 0x06, 0x72, 0x65, 0x66, 0x75, 0x6e, - 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3c, 0x92, 0x41, 0x39, 0x32, 0x37, 0x52, 0x65, - 0x66, 0x75, 0x6e, 0x64, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x77, - 0x65, 0x69, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x69, 0x66, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x52, 0x06, 0x72, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x1a, 0xdb, 0x09, - 0x0a, 0x07, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x9a, 0x01, 0x0a, 0x0a, 0x74, 0x78, - 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x7b, + 0x34, 0x30, 0x7d, 0x24, 0x27, 0x29, 0x29, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x73, 0x3a, 0x5c, 0x92, 0x41, 0x59, 0x0a, 0x57, 0x2a, 0x16, 0x44, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x32, 0x3d, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x20, 0x73, 0x6f, 0x6d, 0x65, + 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x20, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x20, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x70, 0x6c, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2e, + 0x22, 0xae, 0x01, 0x0a, 0x15, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, + 0x6c, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x3a, 0x5d, 0x92, 0x41, 0x5a, 0x0a, 0x58, 0x2a, 0x17, 0x44, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x32, 0x3d, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x20, 0x73, 0x6f, 0x6d, + 0x65, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x20, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x20, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, + 0x2e, 0x22, 0x0e, 0x0a, 0x0c, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x22, 0xb6, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0xa0, 0x01, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x83, 0x01, 0x92, 0x41, 0x1c, + 0x32, 0x1a, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, + 0x65, 0x75, 0x6d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0xba, 0x48, 0x61, 0xba, + 0x01, 0x5e, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x2a, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, + 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x20, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x1a, 0x26, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, 0x61, + 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x34, 0x30, 0x7d, 0x24, 0x27, 0x29, + 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0xa3, 0x02, 0x0a, 0x19, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0xbb, 0x01, 0x0a, 0x09, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x9c, 0x01, 0x92, + 0x41, 0x1e, 0x32, 0x1c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x45, 0x74, 0x68, + 0x65, 0x72, 0x65, 0x75, 0x6d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2e, + 0xba, 0x48, 0x78, 0xba, 0x01, 0x75, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x73, 0x12, 0x36, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x20, 0x6d, 0x75, 0x73, + 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72, 0x72, + 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x20, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2e, 0x1a, 0x30, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, + 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, + 0x2d, 0x39, 0x5d, 0x7b, 0x34, 0x30, 0x7d, 0x24, 0x27, 0x29, 0x29, 0x52, 0x09, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x3a, 0x48, 0x92, 0x41, 0x45, 0x0a, 0x43, 0x2a, 0x1a, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, + 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0x25, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x20, 0x66, + 0x72, 0x6f, 0x6d, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x28, 0x73, 0x29, 0x2e, + 0x22, 0x85, 0x02, 0x0a, 0x1a, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, + 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x18, 0x0a, + 0x07, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, + 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x3a, 0xae, 0x01, 0x92, 0x41, 0xaa, 0x01, 0x0a, 0xa7, + 0x01, 0x2a, 0x1b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, + 0x61, 0x77, 0x61, 0x6c, 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x25, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, + 0x61, 0x6c, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x28, 0x73, 0x29, 0x2e, 0x4a, 0x61, 0x7b, 0x22, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x30, 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x22, 0x5d, 0x2c, 0x20, 0x22, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x22, 0x3a, 0x20, + 0x5b, 0x22, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x5d, 0x7d, 0x22, 0x8d, 0x02, 0x0a, 0x0f, 0x57, 0x69, 0x74, + 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0xbb, 0x01, 0x0a, + 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x42, 0x9c, 0x01, 0x92, 0x41, 0x1e, 0x32, 0x1c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x65, 0x73, 0x2e, 0xba, 0x48, 0x78, 0xba, 0x01, 0x75, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x36, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, + 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, + 0x75, 0x6d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2e, 0x1a, 0x30, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, 0x2e, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, + 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x34, 0x30, 0x7d, 0x24, 0x27, 0x29, 0x29, 0x52, + 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x3a, 0x3c, 0x92, 0x41, 0x39, 0x0a, + 0x37, 0x2a, 0x10, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x32, 0x23, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x20, 0x64, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x28, 0x73, 0x29, 0x2e, 0x22, 0xf6, 0x01, 0x0a, 0x10, 0x57, 0x69, 0x74, + 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, + 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x73, 0x3a, 0xa9, 0x01, 0x92, 0x41, 0xa5, 0x01, 0x0a, 0x40, 0x2a, 0x11, + 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x32, 0x2b, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x6e, 0x20, 0x64, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, + 0x64, 0x64, 0x65, 0x72, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0x32, 0x61, + 0x7b, 0x22, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x31, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x22, 0x5d, 0x2c, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x22, + 0x3a, 0x20, 0x5b, 0x22, 0x30, 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x5d, + 0x7d, 0x22, 0xf2, 0x13, 0x0a, 0x03, 0x42, 0x69, 0x64, 0x12, 0x94, 0x02, 0x0a, 0x09, 0x74, 0x78, + 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0xf6, 0x01, 0x92, 0x41, 0x78, 0x32, 0x64, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, @@ -1957,183 +1338,497 @@ var file_bidderapi_v1_bidderapi_proto_rawDesc = []byte{ 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, 0x0f, 0x5b, 0x61, 0x2d, 0x66, - 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x52, 0x09, 0x74, 0x78, 0x6e, - 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x92, 0x01, 0x0a, 0x15, 0x72, 0x65, 0x76, 0x65, 0x72, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x74, 0x78, 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0x5e, 0x92, 0x41, 0x5b, 0x32, 0x47, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x78, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, - 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x76, - 0x65, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x62, 0x65, 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, - 0x64, 0x65, 0x64, 0x2e, 0x8a, 0x01, 0x0f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, - 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x52, 0x13, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x54, 0x78, 0x6e, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x69, 0x0a, 0x0c, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x03, 0x42, 0x46, 0x92, 0x41, 0x43, 0x32, 0x41, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, - 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x2e, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x98, 0x01, 0x0a, 0x0a, 0x62, 0x69, 0x64, 0x5f, 0x61, - 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x79, 0x92, 0x41, 0x76, - 0x32, 0x6b, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, - 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, - 0x69, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x61, - 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, 0x06, - 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x52, 0x09, 0x62, 0x69, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x64, 0x0a, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, - 0x42, 0x30, 0x92, 0x41, 0x2d, 0x32, 0x2b, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0xba, 0x48, 0x78, 0xba, 0x01, + 0x75, 0x0a, 0x09, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x36, 0x74, 0x78, + 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, + 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x61, 0x73, + 0x68, 0x65, 0x73, 0x2e, 0x1a, 0x30, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, + 0x2c, 0x20, 0x72, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, + 0x78, 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, + 0x34, 0x7d, 0x24, 0x27, 0x29, 0x29, 0x52, 0x08, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, + 0x12, 0xe0, 0x01, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x42, 0xc7, 0x01, 0x92, 0x41, 0x76, 0x32, 0x6b, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, + 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x69, 0x6e, + 0x67, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x61, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0xba, 0x48, 0x4b, + 0xba, 0x01, 0x48, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1f, 0x61, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x1d, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x5b, 0x31, 0x2d, + 0x39, 0x5d, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2a, 0x24, 0x27, 0x29, 0x52, 0x06, 0x61, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0xb9, 0x01, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x95, 0x01, 0x92, 0x41, 0x47, + 0x32, 0x45, 0x4d, 0x61, 0x78, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, + 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x2e, 0xba, 0x48, 0x48, 0xba, 0x01, 0x45, 0x0a, 0x0c, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x25, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, + 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, + 0x72, 0x2e, 0x1a, 0x0e, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, + 0x20, 0x30, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, + 0xc2, 0x01, 0x0a, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x42, + 0x8d, 0x01, 0x92, 0x41, 0x2d, 0x32, 0x2b, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, - 0x67, 0x2e, 0x52, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x5e, 0x0a, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, - 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x03, 0x42, 0x2e, 0x92, 0x41, 0x2b, 0x32, 0x29, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, - 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x11, 0x64, 0x65, 0x63, 0x61, 0x79, 0x45, 0x6e, 0x64, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x6a, 0x0a, 0x0a, 0x62, 0x69, 0x64, 0x5f, 0x64, - 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4b, 0x92, 0x41, 0x48, + 0x67, 0x2e, 0xba, 0x48, 0x5a, 0xba, 0x01, 0x57, 0x0a, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, + 0x2e, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, + 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, + 0x0e, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x52, + 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x12, 0xb8, 0x01, 0x0a, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, + 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x03, 0x42, 0x87, 0x01, 0x92, 0x41, 0x2b, 0x32, 0x29, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x62, 0x69, 0x64, 0x20, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, + 0x6e, 0x67, 0x2e, 0xba, 0x48, 0x56, 0xba, 0x01, 0x53, 0x0a, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, + 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2c, + 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x0e, 0x75, 0x69, + 0x6e, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x52, 0x11, 0x64, 0x65, + 0x63, 0x61, 0x79, 0x45, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, + 0x8f, 0x02, 0x0a, 0x13, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, + 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x42, 0xde, 0x01, + 0x92, 0x41, 0x49, 0x32, 0x47, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x72, + 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x78, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, + 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x62, + 0x65, 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x65, 0x64, 0x2e, 0xba, 0x48, 0x8e, 0x01, + 0xba, 0x01, 0x8a, 0x01, 0x0a, 0x13, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, + 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x41, 0x72, 0x65, 0x76, 0x65, 0x72, + 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x6d, + 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, + 0x6f, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x2e, 0x1a, 0x30, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, 0x2e, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, + 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x24, 0x27, 0x29, 0x29, 0x52, 0x11, + 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, + 0x73, 0x12, 0xa3, 0x02, 0x0a, 0x10, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x42, 0xf7, 0x01, 0x92, + 0x41, 0x6e, 0x32, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x72, + 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x52, 0x4c, 0x50, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x64, 0x20, 0x72, 0x61, 0x77, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, + 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, + 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, + 0xba, 0x48, 0x82, 0x01, 0xba, 0x01, 0x7f, 0x0a, 0x10, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x72, 0x61, 0x77, 0x5f, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, + 0x20, 0x62, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x72, 0x61, 0x77, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x1a, 0x2d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, + 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, + 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, + 0x5d, 0x2a, 0x24, 0x27, 0x29, 0x29, 0x52, 0x0f, 0x72, 0x61, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xbf, 0x02, 0x0a, 0x0c, 0x73, 0x6c, 0x61, 0x73, + 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x9b, + 0x02, 0x92, 0x41, 0x9f, 0x01, 0x32, 0x93, 0x01, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, + 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, + 0x62, 0x65, 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x69, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x79, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x2c, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x65, 0x64, 0x20, 0x62, 0x69, 0x64, 0x20, 0x61, + 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x2e, 0x8a, 0x01, 0x06, 0x5b, 0x30, + 0x2d, 0x39, 0x5d, 0x2b, 0xba, 0x48, 0x75, 0xba, 0x01, 0x72, 0x0a, 0x0c, 0x73, 0x6c, 0x61, 0x73, + 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, + 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, + 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, + 0x3b, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x27, 0x20, 0x7c, 0x7c, 0x20, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x5b, + 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x24, 0x27, 0x29, 0x20, 0x26, 0x26, 0x20, 0x75, 0x69, 0x6e, 0x74, + 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x3d, 0x20, 0x30, 0x29, 0x52, 0x0b, 0x73, 0x6c, + 0x61, 0x73, 0x68, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0xba, 0x04, 0x92, 0x41, 0xb6, 0x04, + 0x0a, 0x95, 0x01, 0x2a, 0x0b, 0x42, 0x69, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x32, 0x40, 0x55, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x69, 0x64, 0x20, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x62, 0x69, 0x64, 0x64, + 0x65, 0x72, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, + 0x72, 0x20, 0x6d, 0x65, 0x76, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x20, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0xd2, 0x01, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0xd2, 0x01, 0x0c, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0xd2, 0x01, 0x15, 0x64, 0x65, 0x63, + 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0xd2, 0x01, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x32, 0x9b, 0x03, 0x7b, 0x22, 0x74, 0x78, 0x5f, + 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x66, 0x65, 0x34, 0x63, 0x62, + 0x34, 0x37, 0x64, 0x62, 0x33, 0x36, 0x33, 0x30, 0x35, 0x35, 0x31, 0x62, 0x65, 0x65, 0x64, 0x66, + 0x62, 0x64, 0x30, 0x32, 0x61, 0x37, 0x31, 0x65, 0x63, 0x63, 0x36, 0x39, 0x66, 0x64, 0x35, 0x39, + 0x37, 0x35, 0x38, 0x65, 0x32, 0x62, 0x61, 0x36, 0x39, 0x39, 0x36, 0x30, 0x36, 0x65, 0x32, 0x64, + 0x35, 0x63, 0x37, 0x34, 0x32, 0x38, 0x34, 0x66, 0x66, 0x61, 0x37, 0x22, 0x2c, 0x20, 0x22, 0x37, + 0x31, 0x63, 0x31, 0x33, 0x34, 0x38, 0x66, 0x32, 0x64, 0x37, 0x66, 0x66, 0x37, 0x65, 0x38, 0x31, + 0x34, 0x66, 0x39, 0x63, 0x33, 0x36, 0x31, 0x37, 0x39, 0x38, 0x33, 0x37, 0x30, 0x33, 0x34, 0x33, + 0x35, 0x65, 0x61, 0x37, 0x34, 0x34, 0x36, 0x64, 0x65, 0x34, 0x32, 0x30, 0x61, 0x65, 0x61, 0x63, + 0x34, 0x38, 0x38, 0x62, 0x66, 0x31, 0x64, 0x65, 0x33, 0x35, 0x37, 0x33, 0x37, 0x65, 0x38, 0x22, + 0x5d, 0x2c, 0x20, 0x22, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x31, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x22, 0x3a, 0x20, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x63, + 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x22, 0x3a, 0x20, 0x31, 0x36, 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x2c, + 0x20, 0x22, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3a, 0x20, 0x31, 0x36, 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x2c, 0x20, 0x22, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, + 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x66, 0x65, 0x34, + 0x63, 0x62, 0x34, 0x37, 0x64, 0x62, 0x33, 0x36, 0x33, 0x30, 0x35, 0x35, 0x31, 0x62, 0x65, 0x65, + 0x64, 0x66, 0x62, 0x64, 0x30, 0x32, 0x61, 0x37, 0x31, 0x65, 0x63, 0x63, 0x36, 0x39, 0x66, 0x64, + 0x35, 0x39, 0x37, 0x35, 0x38, 0x65, 0x32, 0x62, 0x61, 0x36, 0x39, 0x39, 0x36, 0x30, 0x36, 0x65, + 0x32, 0x64, 0x35, 0x63, 0x37, 0x34, 0x32, 0x38, 0x34, 0x66, 0x66, 0x61, 0x37, 0x22, 0x5d, 0x2c, + 0x20, 0x22, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x22, 0x35, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x22, 0x7d, 0x22, 0xc2, 0x0d, 0x0a, 0x0a, 0x43, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x95, 0x01, 0x0a, 0x09, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, + 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x78, 0x92, 0x41, 0x75, 0x32, 0x61, + 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, + 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x61, 0x73, 0x68, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, + 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x2e, 0x8a, 0x01, 0x0f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, + 0x36, 0x34, 0x7d, 0x52, 0x08, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x8f, 0x01, + 0x0a, 0x0a, 0x62, 0x69, 0x64, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x70, 0x92, 0x41, 0x6d, 0x32, 0x6b, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, + 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, 0x61, 0x67, 0x72, 0x65, 0x65, + 0x64, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x61, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x2e, 0x52, 0x09, 0x62, 0x69, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x6d, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x4a, 0x92, 0x41, 0x47, 0x32, 0x45, 0x4d, 0x61, 0x78, 0x20, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, + 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, + 0x2e, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x7b, + 0x0a, 0x13, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x64, + 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4b, 0x92, 0x41, 0x48, 0x32, 0x46, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2e, 0x52, 0x09, 0x62, 0x69, 0x64, 0x44, 0x69, 0x67, - 0x65, 0x73, 0x74, 0x12, 0xc7, 0x01, 0x0a, 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0xa3, 0x01, 0x92, 0x41, 0x9f, - 0x01, 0x32, 0x93, 0x01, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, - 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x73, - 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x79, - 0x20, 0x66, 0x61, 0x69, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2e, 0x52, 0x11, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, + 0x65, 0x64, 0x42, 0x69, 0x64, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x7d, 0x0a, 0x16, 0x72, + 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x73, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x47, 0x92, 0x41, 0x44, + 0x32, 0x42, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, + 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x73, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, + 0x62, 0x69, 0x64, 0x2e, 0x52, 0x14, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x42, 0x69, + 0x64, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x62, 0x0a, 0x11, 0x63, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x35, 0x92, 0x41, 0x32, 0x32, 0x30, 0x48, 0x65, 0x78, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, + 0x6f, 0x66, 0x20, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x10, 0x63, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x9e, + 0x01, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x6b, 0x92, + 0x41, 0x68, 0x32, 0x66, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, + 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x13, 0x63, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, + 0x88, 0x01, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x5d, 0x92, 0x41, 0x5a, 0x32, + 0x58, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, + 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x73, + 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x64, 0x0a, 0x15, 0x64, 0x65, + 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x42, 0x30, 0x92, 0x41, 0x2d, 0x32, 0x2b, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, + 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x13, 0x64, 0x65, 0x63, + 0x61, 0x79, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x12, 0x5e, 0x0a, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x42, 0x2e, 0x92, + 0x41, 0x2b, 0x32, 0x29, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, + 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x65, + 0x6e, 0x64, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x11, 0x64, + 0x65, 0x63, 0x61, 0x79, 0x45, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x12, 0x63, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x42, 0x34, 0x92, 0x41, + 0x31, 0x32, 0x2f, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, + 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, + 0x64, 0x2e, 0x52, 0x11, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x7c, 0x0a, 0x13, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, + 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, + 0x28, 0x09, 0x42, 0x4c, 0x92, 0x41, 0x49, 0x32, 0x47, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x78, 0x20, 0x68, 0x61, + 0x73, 0x68, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x20, + 0x6f, 0x72, 0x20, 0x62, 0x65, 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x65, 0x64, 0x2e, + 0x52, 0x11, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x48, 0x61, 0x73, + 0x68, 0x65, 0x73, 0x12, 0x85, 0x01, 0x0a, 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x42, 0x62, 0x92, 0x41, 0x5f, 0x32, + 0x5d, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x73, 0x6c, 0x61, 0x73, + 0x68, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x66, 0x61, + 0x69, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x0b, + 0x73, 0x6c, 0x61, 0x73, 0x68, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x5e, 0x92, 0x41, 0x5b, + 0x0a, 0x59, 0x2a, 0x12, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, + 0x6e, 0x74, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x6d, 0x65, 0x76, 0x2d, 0x63, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x22, 0xbe, 0x02, 0x0a, 0x11, + 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x9f, 0x01, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x42, 0x7c, 0x92, 0x41, 0x79, 0x32, 0x77, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x71, 0x75, 0x65, 0x72, 0x79, 0x69, 0x6e, + 0x67, 0x20, 0x62, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2c, 0x20, 0x61, 0x6c, + 0x6c, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x05, 0x42, 0x20, 0x92, 0x41, 0x1d, 0x32, 0x1b, 0x50, 0x61, 0x67, 0x65, 0x20, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x51, 0x0a, 0x05, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x42, 0x3b, 0x92, 0x41, 0x38, 0x32, 0x36, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x70, + 0x65, 0x72, 0x20, 0x70, 0x61, 0x67, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, + 0x69, 0x73, 0x20, 0x35, 0x30, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0xe0, 0x11, 0x0a, + 0x12, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x97, 0x01, 0x0a, 0x0e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x62, 0x69, + 0x64, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x62, + 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, + 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x42, 0x92, 0x41, 0x3f, + 0x32, 0x3d, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, + 0x62, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x69, 0x6e, 0x67, 0x20, 0x62, 0x69, 0x64, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, + 0x69, 0x72, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x52, + 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0xf4, 0x04, + 0x0a, 0x14, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x57, 0x69, 0x74, 0x68, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x7e, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x53, 0x92, 0x41, 0x50, 0x32, 0x4e, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x73, + 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x63, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, + 0x63, 0x68, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x03, 0x42, 0x34, 0x92, 0x41, 0x31, 0x32, 0x2f, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x70, 0x75, + 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x2e, 0x52, 0x11, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, + 0x63, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x86, 0x01, 0x0a, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x6e, 0x92, 0x41, + 0x6b, 0x32, 0x69, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x20, 0x50, 0x6f, 0x73, + 0x73, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x3a, 0x20, 0x27, 0x70, + 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x27, 0x2c, 0x20, 0x27, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, + 0x27, 0x2c, 0x20, 0x27, 0x6f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x27, 0x73, 0x65, + 0x74, 0x74, 0x6c, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x27, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, + 0x27, 0x2c, 0x20, 0x27, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x27, 0x2e, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x4e, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x34, 0x92, 0x41, 0x31, 0x32, 0x2f, 0x41, 0x64, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x61, + 0x62, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, + 0x65, 0x6e, 0x74, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x52, 0x07, 0x64, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x12, 0x48, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2e, 0x92, 0x41, 0x2b, 0x32, 0x29, 0x50, 0x61, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x77, 0x65, + 0x69, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x54, + 0x0a, 0x06, 0x72, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3c, + 0x92, 0x41, 0x39, 0x32, 0x37, 0x52, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x20, 0x61, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x77, 0x65, 0x69, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x69, 0x66, + 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x52, 0x06, 0x72, 0x65, + 0x66, 0x75, 0x6e, 0x64, 0x1a, 0xdb, 0x09, 0x0a, 0x07, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x9a, 0x01, 0x0a, 0x0a, 0x74, 0x78, 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x7b, 0x92, 0x41, 0x78, 0x32, 0x64, 0x48, 0x65, 0x78, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x2e, 0x20, 0x49, 0x66, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, - 0x65, 0x63, 0x61, 0x79, 0x65, 0x64, 0x20, 0x62, 0x69, 0x64, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, - 0x74, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x6c, - 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x2e, 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, - 0x52, 0x0b, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x57, 0x0a, - 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x09, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x57, - 0x69, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x43, 0x92, 0x41, 0x40, 0x0a, 0x3e, 0x2a, 0x08, 0x42, - 0x69, 0x64, 0x20, 0x49, 0x6e, 0x66, 0x6f, 0x32, 0x32, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x61, 0x20, 0x62, 0x69, 0x64, - 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x74, 0x73, 0x20, 0x63, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x1a, 0xda, 0x01, 0x0a, 0x0c, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x59, 0x0a, 0x0c, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x03, 0x42, 0x36, 0x92, 0x41, 0x33, 0x32, 0x31, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x69, 0x73, 0x20, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x2e, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x6f, 0x0a, 0x04, 0x62, 0x69, 0x64, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x42, - 0x31, 0x92, 0x41, 0x2e, 0x32, 0x2c, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x69, - 0x64, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, - 0x66, 0x69, 0x65, 0x64, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x2e, 0x52, 0x04, 0x62, 0x69, 0x64, 0x73, 0x32, 0xaf, 0x09, 0x0a, 0x06, 0x42, 0x69, 0x64, - 0x64, 0x65, 0x72, 0x12, 0x53, 0x0a, 0x07, 0x53, 0x65, 0x6e, 0x64, 0x42, 0x69, 0x64, 0x12, 0x11, - 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x69, - 0x64, 0x1a, 0x18, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x19, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x13, 0x3a, 0x01, 0x2a, 0x22, 0x0e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, - 0x65, 0x72, 0x2f, 0x62, 0x69, 0x64, 0x30, 0x01, 0x12, 0x6b, 0x0a, 0x07, 0x44, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x12, 0x1c, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x22, 0x1b, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, - 0x64, 0x64, 0x65, 0x72, 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x2f, 0x7b, 0x61, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x7d, 0x12, 0x78, 0x0a, 0x0b, 0x41, 0x75, 0x74, 0x6f, 0x44, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x12, 0x1c, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x22, 0x20, 0x2f, - 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x64, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x2f, 0x7b, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x7d, 0x12, - 0x8c, 0x01, 0x0a, 0x11, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x41, 0x75, 0x74, 0x6f, 0x44, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x26, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x41, 0x75, 0x74, 0x6f, 0x44, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, - 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, - 0x63, 0x65, 0x6c, 0x41, 0x75, 0x74, 0x6f, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1e, - 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x63, 0x61, 0x6e, 0x63, 0x65, - 0x6c, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x80, - 0x01, 0x0a, 0x11, 0x41, 0x75, 0x74, 0x6f, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x1a, 0x27, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x41, 0x75, 0x74, 0x6f, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x20, 0x12, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x61, 0x75, - 0x74, 0x6f, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x97, 0x01, 0x0a, 0x13, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x46, 0x72, - 0x6f, 0x6d, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x12, 0x28, 0x2e, 0x62, 0x69, 0x64, 0x64, - 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, - 0x77, 0x46, 0x72, 0x6f, 0x6d, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x46, 0x72, 0x6f, 0x6d, 0x57, - 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x3a, 0x01, 0x2a, 0x22, 0x20, 0x2f, 0x76, 0x31, 0x2f, 0x62, - 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x66, - 0x72, 0x6f, 0x6d, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x12, 0x6c, 0x0a, 0x0a, 0x47, - 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x1f, 0x2e, 0x62, 0x69, 0x64, 0x64, - 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x62, 0x69, 0x64, + 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, + 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, + 0x8a, 0x01, 0x0f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, + 0x34, 0x7d, 0x52, 0x09, 0x74, 0x78, 0x6e, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x92, 0x01, + 0x0a, 0x15, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x74, 0x78, 0x6e, + 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0x5e, 0x92, + 0x41, 0x5b, 0x32, 0x47, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x72, + 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x78, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, + 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x62, 0x65, + 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x65, 0x64, 0x2e, 0x8a, 0x01, 0x0f, 0x5b, 0x61, + 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x52, 0x13, 0x72, + 0x65, 0x76, 0x65, 0x72, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x6e, 0x48, 0x61, 0x73, 0x68, + 0x65, 0x73, 0x12, 0x69, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x46, 0x92, 0x41, 0x43, 0x32, 0x41, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, + 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x2e, + 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x98, 0x01, + 0x0a, 0x0a, 0x62, 0x69, 0x64, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x79, 0x92, 0x41, 0x76, 0x32, 0x6b, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, + 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x69, 0x6e, + 0x67, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x61, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x52, 0x09, 0x62, + 0x69, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x64, 0x0a, 0x15, 0x64, 0x65, 0x63, 0x61, + 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x42, 0x30, 0x92, 0x41, 0x2d, 0x32, 0x2b, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x20, + 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x5e, + 0x0a, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x42, 0x2e, 0x92, 0x41, 0x2b, + 0x32, 0x29, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, + 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x65, 0x6e, 0x64, + 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x11, 0x64, 0x65, 0x63, + 0x61, 0x79, 0x45, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x6a, + 0x0a, 0x0a, 0x62, 0x69, 0x64, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x4b, 0x92, 0x41, 0x48, 0x32, 0x46, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, + 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, + 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, + 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2e, 0x52, + 0x09, 0x62, 0x69, 0x64, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0xc7, 0x01, 0x0a, 0x0c, 0x73, + 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x09, 0x42, 0xa3, 0x01, 0x92, 0x41, 0x9f, 0x01, 0x32, 0x93, 0x01, 0x41, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, + 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x20, 0x66, 0x72, + 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, + 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x20, 0x74, 0x6f, 0x20, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x7a, 0x65, 0x72, 0x6f, + 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x65, 0x64, 0x20, 0x62, 0x69, + 0x64, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x2e, 0x8a, 0x01, + 0x06, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x52, 0x0b, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x41, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x57, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x62, 0x69, 0x64, 0x64, + 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x57, 0x69, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x43, 0x92, + 0x41, 0x40, 0x0a, 0x3e, 0x2a, 0x08, 0x42, 0x69, 0x64, 0x20, 0x49, 0x6e, 0x66, 0x6f, 0x32, 0x32, + 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x75, + 0x74, 0x20, 0x61, 0x20, 0x62, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, + 0x67, 0x20, 0x69, 0x74, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x1a, 0xda, 0x01, 0x0a, 0x0c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x69, 0x64, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x59, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x42, 0x36, 0x92, 0x41, 0x33, 0x32, 0x31, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x69, + 0x6e, 0x66, 0x6f, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, + 0x2e, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x6f, + 0x0a, 0x04, 0x62, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x62, + 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, + 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x42, + 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x31, 0x92, 0x41, 0x2e, 0x32, 0x2c, 0x4c, 0x69, 0x73, + 0x74, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x69, 0x64, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x52, 0x04, 0x62, 0x69, 0x64, 0x73, 0x32, + 0x9e, 0x06, 0x0a, 0x06, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x12, 0x53, 0x0a, 0x07, 0x53, 0x65, + 0x6e, 0x64, 0x42, 0x69, 0x64, 0x12, 0x11, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x69, 0x64, 0x1a, 0x18, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, + 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, + 0x6e, 0x74, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x3a, 0x01, 0x2a, 0x22, 0x0e, 0x2f, + 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x62, 0x69, 0x64, 0x30, 0x01, 0x12, + 0x6b, 0x0a, 0x07, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x1c, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x18, 0x12, 0x16, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x67, 0x65, - 0x74, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x66, 0x0a, 0x08, 0x57, 0x69, 0x74, - 0x68, 0x64, 0x72, 0x61, 0x77, 0x12, 0x1d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x13, 0x2f, 0x76, - 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, - 0x77, 0x12, 0x70, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, + 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x22, + 0x1b, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x64, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x2f, 0x7b, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x7d, 0x12, 0x92, 0x01, 0x0a, + 0x12, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, + 0x61, 0x6c, 0x73, 0x12, 0x27, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, + 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x62, + 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x3a, 0x01, + 0x2a, 0x22, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, + 0x73, 0x12, 0x6c, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x1f, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x20, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x12, 0x17, 0x2f, 0x76, 0x31, 0x2f, - 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x69, - 0x6e, 0x66, 0x6f, 0x12, 0x75, 0x0a, 0x11, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x53, 0x6c, 0x61, 0x73, - 0x68, 0x65, 0x64, 0x46, 0x75, 0x6e, 0x64, 0x73, 0x12, 0x1a, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, - 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x1a, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1e, 0x2f, 0x76, 0x31, 0x2f, - 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x5f, 0x73, 0x6c, 0x61, - 0x73, 0x68, 0x65, 0x64, 0x5f, 0x66, 0x75, 0x6e, 0x64, 0x73, 0x42, 0xaa, 0x02, 0x92, 0x41, 0x72, - 0x12, 0x70, 0x0a, 0x0a, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x41, 0x50, 0x49, 0x2a, 0x55, - 0x0a, 0x1b, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x20, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x31, 0x2e, 0x31, 0x12, 0x36, 0x68, - 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x65, 0x76, 0x2f, 0x6d, 0x65, 0x76, 0x2d, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x2f, 0x62, 0x6c, 0x6f, 0x62, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x4c, 0x49, - 0x43, 0x45, 0x4e, 0x53, 0x45, 0x32, 0x0b, 0x31, 0x2e, 0x30, 0x2e, 0x30, 0x2d, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x42, 0x0e, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x40, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x65, 0x76, 0x2f, 0x6d, 0x65, 0x76, 0x2d, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x2f, 0x70, 0x32, 0x70, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, - 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x3b, 0x62, 0x69, 0x64, - 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x42, 0x58, 0x58, 0xaa, 0x02, - 0x0c, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0c, - 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x18, 0x42, - 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0d, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, - 0x61, 0x70, 0x69, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, + 0x64, 0x65, 0x72, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, + 0x66, 0x0a, 0x08, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x12, 0x1d, 0x2e, 0x62, 0x69, + 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, + 0x72, 0x61, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x62, 0x69, 0x64, + 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, + 0x61, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x15, 0x22, 0x13, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x77, + 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x12, 0x70, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x42, 0x69, + 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, + 0x12, 0x17, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x67, 0x65, 0x74, + 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x75, 0x0a, 0x11, 0x43, 0x6c, 0x61, + 0x69, 0x6d, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x46, 0x75, 0x6e, 0x64, 0x73, 0x12, 0x1a, + 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, + 0x22, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x63, 0x6c, 0x61, + 0x69, 0x6d, 0x5f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x66, 0x75, 0x6e, 0x64, 0x73, + 0x42, 0xaa, 0x02, 0x92, 0x41, 0x72, 0x12, 0x70, 0x0a, 0x0a, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, + 0x20, 0x41, 0x50, 0x49, 0x2a, 0x55, 0x0a, 0x1b, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, + 0x20, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, + 0x31, 0x2e, 0x31, 0x12, 0x36, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x65, 0x76, 0x2f, 0x6d, + 0x65, 0x76, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x2f, 0x62, 0x6c, 0x6f, 0x62, 0x2f, 0x6d, + 0x61, 0x69, 0x6e, 0x2f, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x32, 0x0b, 0x31, 0x2e, 0x30, + 0x2e, 0x30, 0x2d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x2e, 0x62, 0x69, + 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x42, 0x0e, 0x42, 0x69, 0x64, 0x64, + 0x65, 0x72, 0x61, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x40, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x65, 0x76, 0x2f, + 0x6d, 0x65, 0x76, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x2f, 0x70, 0x32, 0x70, 0x2f, 0x67, + 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2f, + 0x76, 0x31, 0x3b, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x76, 0x31, 0xa2, 0x02, + 0x03, 0x42, 0x58, 0x58, 0xaa, 0x02, 0x0c, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, + 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0c, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x5c, + 0x56, 0x31, 0xe2, 0x02, 0x18, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x5c, 0x56, + 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0d, + 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2148,74 +1843,50 @@ func file_bidderapi_v1_bidderapi_proto_rawDescGZIP() []byte { return file_bidderapi_v1_bidderapi_proto_rawDescData } -var file_bidderapi_v1_bidderapi_proto_msgTypes = make([]protoimpl.MessageInfo, 20) +var file_bidderapi_v1_bidderapi_proto_msgTypes = make([]protoimpl.MessageInfo, 17) var file_bidderapi_v1_bidderapi_proto_goTypes = []interface{}{ (*DepositRequest)(nil), // 0: bidderapi.v1.DepositRequest (*DepositResponse)(nil), // 1: bidderapi.v1.DepositResponse - (*AutoDepositResponse)(nil), // 2: bidderapi.v1.AutoDepositResponse - (*AutoDepositStatusResponse)(nil), // 3: bidderapi.v1.AutoDepositStatusResponse - (*CancelAutoDepositRequest)(nil), // 4: bidderapi.v1.CancelAutoDepositRequest - (*CancelAutoDepositResponse)(nil), // 5: bidderapi.v1.CancelAutoDepositResponse - (*AutoDeposit)(nil), // 6: bidderapi.v1.AutoDeposit - (*EmptyMessage)(nil), // 7: bidderapi.v1.EmptyMessage - (*GetDepositRequest)(nil), // 8: bidderapi.v1.GetDepositRequest - (*WithdrawRequest)(nil), // 9: bidderapi.v1.WithdrawRequest - (*WithdrawResponse)(nil), // 10: bidderapi.v1.WithdrawResponse - (*WithdrawFromWindowsRequest)(nil), // 11: bidderapi.v1.WithdrawFromWindowsRequest - (*WithdrawFromWindowsResponse)(nil), // 12: bidderapi.v1.WithdrawFromWindowsResponse - (*Bid)(nil), // 13: bidderapi.v1.Bid - (*Commitment)(nil), // 14: bidderapi.v1.Commitment - (*GetBidInfoRequest)(nil), // 15: bidderapi.v1.GetBidInfoRequest - (*GetBidInfoResponse)(nil), // 16: bidderapi.v1.GetBidInfoResponse - (*GetBidInfoResponse_CommitmentWithStatus)(nil), // 17: bidderapi.v1.GetBidInfoResponse.CommitmentWithStatus - (*GetBidInfoResponse_BidInfo)(nil), // 18: bidderapi.v1.GetBidInfoResponse.BidInfo - (*GetBidInfoResponse_BlockBidInfo)(nil), // 19: bidderapi.v1.GetBidInfoResponse.BlockBidInfo - (*wrapperspb.UInt64Value)(nil), // 20: google.protobuf.UInt64Value - (*wrapperspb.StringValue)(nil), // 21: google.protobuf.StringValue + (*DepositEvenlyRequest)(nil), // 2: bidderapi.v1.DepositEvenlyRequest + (*DepositEvenlyResponse)(nil), // 3: bidderapi.v1.DepositEvenlyResponse + (*EmptyMessage)(nil), // 4: bidderapi.v1.EmptyMessage + (*GetDepositRequest)(nil), // 5: bidderapi.v1.GetDepositRequest + (*RequestWithdrawalsRequest)(nil), // 6: bidderapi.v1.RequestWithdrawalsRequest + (*RequestWithdrawalsResponse)(nil), // 7: bidderapi.v1.RequestWithdrawalsResponse + (*WithdrawRequest)(nil), // 8: bidderapi.v1.WithdrawRequest + (*WithdrawResponse)(nil), // 9: bidderapi.v1.WithdrawResponse + (*Bid)(nil), // 10: bidderapi.v1.Bid + (*Commitment)(nil), // 11: bidderapi.v1.Commitment + (*GetBidInfoRequest)(nil), // 12: bidderapi.v1.GetBidInfoRequest + (*GetBidInfoResponse)(nil), // 13: bidderapi.v1.GetBidInfoResponse + (*GetBidInfoResponse_CommitmentWithStatus)(nil), // 14: bidderapi.v1.GetBidInfoResponse.CommitmentWithStatus + (*GetBidInfoResponse_BidInfo)(nil), // 15: bidderapi.v1.GetBidInfoResponse.BidInfo + (*GetBidInfoResponse_BlockBidInfo)(nil), // 16: bidderapi.v1.GetBidInfoResponse.BlockBidInfo + (*wrapperspb.StringValue)(nil), // 17: google.protobuf.StringValue } var file_bidderapi_v1_bidderapi_proto_depIdxs = []int32{ - 20, // 0: bidderapi.v1.DepositRequest.window_number:type_name -> google.protobuf.UInt64Value - 20, // 1: bidderapi.v1.DepositRequest.block_number:type_name -> google.protobuf.UInt64Value - 20, // 2: bidderapi.v1.DepositResponse.window_number:type_name -> google.protobuf.UInt64Value - 20, // 3: bidderapi.v1.AutoDepositResponse.start_window_number:type_name -> google.protobuf.UInt64Value - 6, // 4: bidderapi.v1.AutoDepositStatusResponse.window_balances:type_name -> bidderapi.v1.AutoDeposit - 20, // 5: bidderapi.v1.CancelAutoDepositResponse.window_numbers:type_name -> google.protobuf.UInt64Value - 20, // 6: bidderapi.v1.AutoDeposit.window_number:type_name -> google.protobuf.UInt64Value - 20, // 7: bidderapi.v1.AutoDeposit.start_block_number:type_name -> google.protobuf.UInt64Value - 20, // 8: bidderapi.v1.AutoDeposit.end_block_number:type_name -> google.protobuf.UInt64Value - 20, // 9: bidderapi.v1.GetDepositRequest.window_number:type_name -> google.protobuf.UInt64Value - 20, // 10: bidderapi.v1.WithdrawRequest.window_number:type_name -> google.protobuf.UInt64Value - 20, // 11: bidderapi.v1.WithdrawResponse.window_number:type_name -> google.protobuf.UInt64Value - 20, // 12: bidderapi.v1.WithdrawFromWindowsRequest.window_numbers:type_name -> google.protobuf.UInt64Value - 10, // 13: bidderapi.v1.WithdrawFromWindowsResponse.withdraw_responses:type_name -> bidderapi.v1.WithdrawResponse - 19, // 14: bidderapi.v1.GetBidInfoResponse.block_bid_info:type_name -> bidderapi.v1.GetBidInfoResponse.BlockBidInfo - 17, // 15: bidderapi.v1.GetBidInfoResponse.BidInfo.commitments:type_name -> bidderapi.v1.GetBidInfoResponse.CommitmentWithStatus - 18, // 16: bidderapi.v1.GetBidInfoResponse.BlockBidInfo.bids:type_name -> bidderapi.v1.GetBidInfoResponse.BidInfo - 13, // 17: bidderapi.v1.Bidder.SendBid:input_type -> bidderapi.v1.Bid - 0, // 18: bidderapi.v1.Bidder.Deposit:input_type -> bidderapi.v1.DepositRequest - 0, // 19: bidderapi.v1.Bidder.AutoDeposit:input_type -> bidderapi.v1.DepositRequest - 4, // 20: bidderapi.v1.Bidder.CancelAutoDeposit:input_type -> bidderapi.v1.CancelAutoDepositRequest - 7, // 21: bidderapi.v1.Bidder.AutoDepositStatus:input_type -> bidderapi.v1.EmptyMessage - 11, // 22: bidderapi.v1.Bidder.WithdrawFromWindows:input_type -> bidderapi.v1.WithdrawFromWindowsRequest - 8, // 23: bidderapi.v1.Bidder.GetDeposit:input_type -> bidderapi.v1.GetDepositRequest - 9, // 24: bidderapi.v1.Bidder.Withdraw:input_type -> bidderapi.v1.WithdrawRequest - 15, // 25: bidderapi.v1.Bidder.GetBidInfo:input_type -> bidderapi.v1.GetBidInfoRequest - 7, // 26: bidderapi.v1.Bidder.ClaimSlashedFunds:input_type -> bidderapi.v1.EmptyMessage - 14, // 27: bidderapi.v1.Bidder.SendBid:output_type -> bidderapi.v1.Commitment - 1, // 28: bidderapi.v1.Bidder.Deposit:output_type -> bidderapi.v1.DepositResponse - 2, // 29: bidderapi.v1.Bidder.AutoDeposit:output_type -> bidderapi.v1.AutoDepositResponse - 5, // 30: bidderapi.v1.Bidder.CancelAutoDeposit:output_type -> bidderapi.v1.CancelAutoDepositResponse - 3, // 31: bidderapi.v1.Bidder.AutoDepositStatus:output_type -> bidderapi.v1.AutoDepositStatusResponse - 12, // 32: bidderapi.v1.Bidder.WithdrawFromWindows:output_type -> bidderapi.v1.WithdrawFromWindowsResponse - 1, // 33: bidderapi.v1.Bidder.GetDeposit:output_type -> bidderapi.v1.DepositResponse - 10, // 34: bidderapi.v1.Bidder.Withdraw:output_type -> bidderapi.v1.WithdrawResponse - 16, // 35: bidderapi.v1.Bidder.GetBidInfo:output_type -> bidderapi.v1.GetBidInfoResponse - 21, // 36: bidderapi.v1.Bidder.ClaimSlashedFunds:output_type -> google.protobuf.StringValue - 27, // [27:37] is the sub-list for method output_type - 17, // [17:27] is the sub-list for method input_type - 17, // [17:17] is the sub-list for extension type_name - 17, // [17:17] is the sub-list for extension extendee - 0, // [0:17] is the sub-list for field type_name + 16, // 0: bidderapi.v1.GetBidInfoResponse.block_bid_info:type_name -> bidderapi.v1.GetBidInfoResponse.BlockBidInfo + 14, // 1: bidderapi.v1.GetBidInfoResponse.BidInfo.commitments:type_name -> bidderapi.v1.GetBidInfoResponse.CommitmentWithStatus + 15, // 2: bidderapi.v1.GetBidInfoResponse.BlockBidInfo.bids:type_name -> bidderapi.v1.GetBidInfoResponse.BidInfo + 10, // 3: bidderapi.v1.Bidder.SendBid:input_type -> bidderapi.v1.Bid + 0, // 4: bidderapi.v1.Bidder.Deposit:input_type -> bidderapi.v1.DepositRequest + 6, // 5: bidderapi.v1.Bidder.RequestWithdrawals:input_type -> bidderapi.v1.RequestWithdrawalsRequest + 5, // 6: bidderapi.v1.Bidder.GetDeposit:input_type -> bidderapi.v1.GetDepositRequest + 8, // 7: bidderapi.v1.Bidder.Withdraw:input_type -> bidderapi.v1.WithdrawRequest + 12, // 8: bidderapi.v1.Bidder.GetBidInfo:input_type -> bidderapi.v1.GetBidInfoRequest + 4, // 9: bidderapi.v1.Bidder.ClaimSlashedFunds:input_type -> bidderapi.v1.EmptyMessage + 11, // 10: bidderapi.v1.Bidder.SendBid:output_type -> bidderapi.v1.Commitment + 1, // 11: bidderapi.v1.Bidder.Deposit:output_type -> bidderapi.v1.DepositResponse + 7, // 12: bidderapi.v1.Bidder.RequestWithdrawals:output_type -> bidderapi.v1.RequestWithdrawalsResponse + 1, // 13: bidderapi.v1.Bidder.GetDeposit:output_type -> bidderapi.v1.DepositResponse + 9, // 14: bidderapi.v1.Bidder.Withdraw:output_type -> bidderapi.v1.WithdrawResponse + 13, // 15: bidderapi.v1.Bidder.GetBidInfo:output_type -> bidderapi.v1.GetBidInfoResponse + 17, // 16: bidderapi.v1.Bidder.ClaimSlashedFunds:output_type -> google.protobuf.StringValue + 10, // [10:17] is the sub-list for method output_type + 3, // [3:10] is the sub-list for method input_type + 3, // [3:3] is the sub-list for extension type_name + 3, // [3:3] is the sub-list for extension extendee + 0, // [0:3] is the sub-list for field type_name } func init() { file_bidderapi_v1_bidderapi_proto_init() } @@ -2249,7 +1920,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AutoDepositResponse); i { + switch v := v.(*DepositEvenlyRequest); i { case 0: return &v.state case 1: @@ -2261,7 +1932,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AutoDepositStatusResponse); i { + switch v := v.(*DepositEvenlyResponse); i { case 0: return &v.state case 1: @@ -2273,7 +1944,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CancelAutoDepositRequest); i { + switch v := v.(*EmptyMessage); i { case 0: return &v.state case 1: @@ -2285,7 +1956,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CancelAutoDepositResponse); i { + switch v := v.(*GetDepositRequest); i { case 0: return &v.state case 1: @@ -2297,7 +1968,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AutoDeposit); i { + switch v := v.(*RequestWithdrawalsRequest); i { case 0: return &v.state case 1: @@ -2309,7 +1980,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EmptyMessage); i { + switch v := v.(*RequestWithdrawalsResponse); i { case 0: return &v.state case 1: @@ -2321,18 +1992,6 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetDepositRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bidderapi_v1_bidderapi_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WithdrawRequest); i { case 0: return &v.state @@ -2344,7 +2003,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { return nil } } - file_bidderapi_v1_bidderapi_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_bidderapi_v1_bidderapi_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WithdrawResponse); i { case 0: return &v.state @@ -2356,31 +2015,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { return nil } } - file_bidderapi_v1_bidderapi_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WithdrawFromWindowsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bidderapi_v1_bidderapi_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WithdrawFromWindowsResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bidderapi_v1_bidderapi_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_bidderapi_v1_bidderapi_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Bid); i { case 0: return &v.state @@ -2392,7 +2027,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { return nil } } - file_bidderapi_v1_bidderapi_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + file_bidderapi_v1_bidderapi_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Commitment); i { case 0: return &v.state @@ -2404,7 +2039,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { return nil } } - file_bidderapi_v1_bidderapi_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + file_bidderapi_v1_bidderapi_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetBidInfoRequest); i { case 0: return &v.state @@ -2416,7 +2051,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { return nil } } - file_bidderapi_v1_bidderapi_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + file_bidderapi_v1_bidderapi_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetBidInfoResponse); i { case 0: return &v.state @@ -2428,7 +2063,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { return nil } } - file_bidderapi_v1_bidderapi_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + file_bidderapi_v1_bidderapi_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetBidInfoResponse_CommitmentWithStatus); i { case 0: return &v.state @@ -2440,7 +2075,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { return nil } } - file_bidderapi_v1_bidderapi_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + file_bidderapi_v1_bidderapi_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetBidInfoResponse_BidInfo); i { case 0: return &v.state @@ -2452,7 +2087,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { return nil } } - file_bidderapi_v1_bidderapi_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + file_bidderapi_v1_bidderapi_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetBidInfoResponse_BlockBidInfo); i { case 0: return &v.state @@ -2471,7 +2106,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_bidderapi_v1_bidderapi_proto_rawDesc, NumEnums: 0, - NumMessages: 20, + NumMessages: 17, NumExtensions: 0, NumServices: 1, }, diff --git a/p2p/gen/go/bidderapi/v1/bidderapi.pb.gw.go b/p2p/gen/go/bidderapi/v1/bidderapi.pb.gw.go index e594b1fc8..7dd2b1b88 100644 --- a/p2p/gen/go/bidderapi/v1/bidderapi.pb.gw.go +++ b/p2p/gen/go/bidderapi/v1/bidderapi.pb.gw.go @@ -111,118 +111,9 @@ func local_request_Bidder_Deposit_0(ctx context.Context, marshaler runtime.Marsh return msg, metadata, err } -var filter_Bidder_AutoDeposit_0 = &utilities.DoubleArray{Encoding: map[string]int{"amount": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} - -func request_Bidder_AutoDeposit_0(ctx context.Context, marshaler runtime.Marshaler, client BidderClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var ( - protoReq DepositRequest - metadata runtime.ServerMetadata - err error - ) - if req.Body != nil { - _, _ = io.Copy(io.Discard, req.Body) - } - val, ok := pathParams["amount"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "amount") - } - protoReq.Amount, err = runtime.String(val) - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "amount", err) - } - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Bidder_AutoDeposit_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - msg, err := client.AutoDeposit(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err -} - -func local_request_Bidder_AutoDeposit_0(ctx context.Context, marshaler runtime.Marshaler, server BidderServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var ( - protoReq DepositRequest - metadata runtime.ServerMetadata - err error - ) - val, ok := pathParams["amount"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "amount") - } - protoReq.Amount, err = runtime.String(val) - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "amount", err) - } - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Bidder_AutoDeposit_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - msg, err := server.AutoDeposit(ctx, &protoReq) - return msg, metadata, err -} - -var filter_Bidder_CancelAutoDeposit_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} - -func request_Bidder_CancelAutoDeposit_0(ctx context.Context, marshaler runtime.Marshaler, client BidderClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var ( - protoReq CancelAutoDepositRequest - metadata runtime.ServerMetadata - ) - if req.Body != nil { - _, _ = io.Copy(io.Discard, req.Body) - } - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Bidder_CancelAutoDeposit_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - msg, err := client.CancelAutoDeposit(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err -} - -func local_request_Bidder_CancelAutoDeposit_0(ctx context.Context, marshaler runtime.Marshaler, server BidderServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var ( - protoReq CancelAutoDepositRequest - metadata runtime.ServerMetadata - ) - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Bidder_CancelAutoDeposit_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - msg, err := server.CancelAutoDeposit(ctx, &protoReq) - return msg, metadata, err -} - -func request_Bidder_AutoDepositStatus_0(ctx context.Context, marshaler runtime.Marshaler, client BidderClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var ( - protoReq EmptyMessage - metadata runtime.ServerMetadata - ) - if req.Body != nil { - _, _ = io.Copy(io.Discard, req.Body) - } - msg, err := client.AutoDepositStatus(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err -} - -func local_request_Bidder_AutoDepositStatus_0(ctx context.Context, marshaler runtime.Marshaler, server BidderServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var ( - protoReq EmptyMessage - metadata runtime.ServerMetadata - ) - msg, err := server.AutoDepositStatus(ctx, &protoReq) - return msg, metadata, err -} - -func request_Bidder_WithdrawFromWindows_0(ctx context.Context, marshaler runtime.Marshaler, client BidderClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func request_Bidder_RequestWithdrawals_0(ctx context.Context, marshaler runtime.Marshaler, client BidderClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var ( - protoReq WithdrawFromWindowsRequest + protoReq RequestWithdrawalsRequest metadata runtime.ServerMetadata ) if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { @@ -231,19 +122,19 @@ func request_Bidder_WithdrawFromWindows_0(ctx context.Context, marshaler runtime if req.Body != nil { _, _ = io.Copy(io.Discard, req.Body) } - msg, err := client.WithdrawFromWindows(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.RequestWithdrawals(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_Bidder_WithdrawFromWindows_0(ctx context.Context, marshaler runtime.Marshaler, server BidderServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func local_request_Bidder_RequestWithdrawals_0(ctx context.Context, marshaler runtime.Marshaler, server BidderServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var ( - protoReq WithdrawFromWindowsRequest + protoReq RequestWithdrawalsRequest metadata runtime.ServerMetadata ) if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.WithdrawFromWindows(ctx, &protoReq) + msg, err := server.RequestWithdrawals(ctx, &protoReq) return msg, metadata, err } @@ -405,85 +296,25 @@ func RegisterBidderHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser } forward_Bidder_Deposit_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle(http.MethodPost, pattern_Bidder_AutoDeposit_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/bidderapi.v1.Bidder/AutoDeposit", runtime.WithHTTPPathPattern("/v1/bidder/auto_deposit/{amount}")) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Bidder_AutoDeposit_0(annotatedContext, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) - if err != nil { - runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) - return - } - forward_Bidder_AutoDeposit_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - mux.Handle(http.MethodPost, pattern_Bidder_CancelAutoDeposit_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/bidderapi.v1.Bidder/CancelAutoDeposit", runtime.WithHTTPPathPattern("/v1/bidder/cancel_auto_deposit")) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Bidder_CancelAutoDeposit_0(annotatedContext, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) - if err != nil { - runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) - return - } - forward_Bidder_CancelAutoDeposit_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - mux.Handle(http.MethodGet, pattern_Bidder_AutoDepositStatus_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/bidderapi.v1.Bidder/AutoDepositStatus", runtime.WithHTTPPathPattern("/v1/bidder/auto_deposit_status")) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Bidder_AutoDepositStatus_0(annotatedContext, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) - if err != nil { - runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) - return - } - forward_Bidder_AutoDepositStatus_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - mux.Handle(http.MethodPost, pattern_Bidder_WithdrawFromWindows_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Bidder_RequestWithdrawals_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/bidderapi.v1.Bidder/WithdrawFromWindows", runtime.WithHTTPPathPattern("/v1/bidder/withdraw_from_windows")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/bidderapi.v1.Bidder/RequestWithdrawals", runtime.WithHTTPPathPattern("/v1/bidder/request_withdrawals")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_Bidder_WithdrawFromWindows_0(annotatedContext, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_Bidder_RequestWithdrawals_0(annotatedContext, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) if err != nil { runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Bidder_WithdrawFromWindows_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Bidder_RequestWithdrawals_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) mux.Handle(http.MethodGet, pattern_Bidder_GetDeposit_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) @@ -639,73 +470,22 @@ func RegisterBidderHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli } forward_Bidder_Deposit_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle(http.MethodPost, pattern_Bidder_AutoDeposit_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/bidderapi.v1.Bidder/AutoDeposit", runtime.WithHTTPPathPattern("/v1/bidder/auto_deposit/{amount}")) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Bidder_AutoDeposit_0(annotatedContext, inboundMarshaler, client, req, pathParams) - annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) - if err != nil { - runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) - return - } - forward_Bidder_AutoDeposit_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - mux.Handle(http.MethodPost, pattern_Bidder_CancelAutoDeposit_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/bidderapi.v1.Bidder/CancelAutoDeposit", runtime.WithHTTPPathPattern("/v1/bidder/cancel_auto_deposit")) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Bidder_CancelAutoDeposit_0(annotatedContext, inboundMarshaler, client, req, pathParams) - annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) - if err != nil { - runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) - return - } - forward_Bidder_CancelAutoDeposit_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - mux.Handle(http.MethodGet, pattern_Bidder_AutoDepositStatus_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/bidderapi.v1.Bidder/AutoDepositStatus", runtime.WithHTTPPathPattern("/v1/bidder/auto_deposit_status")) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Bidder_AutoDepositStatus_0(annotatedContext, inboundMarshaler, client, req, pathParams) - annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) - if err != nil { - runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) - return - } - forward_Bidder_AutoDepositStatus_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - mux.Handle(http.MethodPost, pattern_Bidder_WithdrawFromWindows_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Bidder_RequestWithdrawals_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/bidderapi.v1.Bidder/WithdrawFromWindows", runtime.WithHTTPPathPattern("/v1/bidder/withdraw_from_windows")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/bidderapi.v1.Bidder/RequestWithdrawals", runtime.WithHTTPPathPattern("/v1/bidder/request_withdrawals")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_Bidder_WithdrawFromWindows_0(annotatedContext, inboundMarshaler, client, req, pathParams) + resp, md, err := request_Bidder_RequestWithdrawals_0(annotatedContext, inboundMarshaler, client, req, pathParams) annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) if err != nil { runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Bidder_WithdrawFromWindows_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Bidder_RequestWithdrawals_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) mux.Handle(http.MethodGet, pattern_Bidder_GetDeposit_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) @@ -779,27 +559,21 @@ func RegisterBidderHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli } var ( - pattern_Bidder_SendBid_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "bid"}, "")) - pattern_Bidder_Deposit_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v1", "bidder", "deposit", "amount"}, "")) - pattern_Bidder_AutoDeposit_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v1", "bidder", "auto_deposit", "amount"}, "")) - pattern_Bidder_CancelAutoDeposit_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "cancel_auto_deposit"}, "")) - pattern_Bidder_AutoDepositStatus_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "auto_deposit_status"}, "")) - pattern_Bidder_WithdrawFromWindows_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "withdraw_from_windows"}, "")) - pattern_Bidder_GetDeposit_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "get_deposit"}, "")) - pattern_Bidder_Withdraw_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "withdraw"}, "")) - pattern_Bidder_GetBidInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "get_bid_info"}, "")) - pattern_Bidder_ClaimSlashedFunds_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "claim_slashed_funds"}, "")) + pattern_Bidder_SendBid_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "bid"}, "")) + pattern_Bidder_Deposit_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v1", "bidder", "deposit", "amount"}, "")) + pattern_Bidder_RequestWithdrawals_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "request_withdrawals"}, "")) + pattern_Bidder_GetDeposit_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "get_deposit"}, "")) + pattern_Bidder_Withdraw_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "withdraw"}, "")) + pattern_Bidder_GetBidInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "get_bid_info"}, "")) + pattern_Bidder_ClaimSlashedFunds_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "claim_slashed_funds"}, "")) ) var ( - forward_Bidder_SendBid_0 = runtime.ForwardResponseStream - forward_Bidder_Deposit_0 = runtime.ForwardResponseMessage - forward_Bidder_AutoDeposit_0 = runtime.ForwardResponseMessage - forward_Bidder_CancelAutoDeposit_0 = runtime.ForwardResponseMessage - forward_Bidder_AutoDepositStatus_0 = runtime.ForwardResponseMessage - forward_Bidder_WithdrawFromWindows_0 = runtime.ForwardResponseMessage - forward_Bidder_GetDeposit_0 = runtime.ForwardResponseMessage - forward_Bidder_Withdraw_0 = runtime.ForwardResponseMessage - forward_Bidder_GetBidInfo_0 = runtime.ForwardResponseMessage - forward_Bidder_ClaimSlashedFunds_0 = runtime.ForwardResponseMessage + forward_Bidder_SendBid_0 = runtime.ForwardResponseStream + forward_Bidder_Deposit_0 = runtime.ForwardResponseMessage + forward_Bidder_RequestWithdrawals_0 = runtime.ForwardResponseMessage + forward_Bidder_GetDeposit_0 = runtime.ForwardResponseMessage + forward_Bidder_Withdraw_0 = runtime.ForwardResponseMessage + forward_Bidder_GetBidInfo_0 = runtime.ForwardResponseMessage + forward_Bidder_ClaimSlashedFunds_0 = runtime.ForwardResponseMessage ) diff --git a/p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go b/p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go index 91fbc1f6c..09dd26697 100644 --- a/p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go +++ b/p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go @@ -20,16 +20,13 @@ import ( const _ = grpc.SupportPackageIsVersion9 const ( - Bidder_SendBid_FullMethodName = "/bidderapi.v1.Bidder/SendBid" - Bidder_Deposit_FullMethodName = "/bidderapi.v1.Bidder/Deposit" - Bidder_AutoDeposit_FullMethodName = "/bidderapi.v1.Bidder/AutoDeposit" - Bidder_CancelAutoDeposit_FullMethodName = "/bidderapi.v1.Bidder/CancelAutoDeposit" - Bidder_AutoDepositStatus_FullMethodName = "/bidderapi.v1.Bidder/AutoDepositStatus" - Bidder_WithdrawFromWindows_FullMethodName = "/bidderapi.v1.Bidder/WithdrawFromWindows" - Bidder_GetDeposit_FullMethodName = "/bidderapi.v1.Bidder/GetDeposit" - Bidder_Withdraw_FullMethodName = "/bidderapi.v1.Bidder/Withdraw" - Bidder_GetBidInfo_FullMethodName = "/bidderapi.v1.Bidder/GetBidInfo" - Bidder_ClaimSlashedFunds_FullMethodName = "/bidderapi.v1.Bidder/ClaimSlashedFunds" + Bidder_SendBid_FullMethodName = "/bidderapi.v1.Bidder/SendBid" + Bidder_Deposit_FullMethodName = "/bidderapi.v1.Bidder/Deposit" + Bidder_RequestWithdrawals_FullMethodName = "/bidderapi.v1.Bidder/RequestWithdrawals" + Bidder_GetDeposit_FullMethodName = "/bidderapi.v1.Bidder/GetDeposit" + Bidder_Withdraw_FullMethodName = "/bidderapi.v1.Bidder/Withdraw" + Bidder_GetBidInfo_FullMethodName = "/bidderapi.v1.Bidder/GetBidInfo" + Bidder_ClaimSlashedFunds_FullMethodName = "/bidderapi.v1.Bidder/ClaimSlashedFunds" ) // BidderClient is the client API for Bidder service. @@ -46,42 +43,19 @@ type BidderClient interface { SendBid(ctx context.Context, in *Bid, opts ...grpc.CallOption) (grpc.ServerStreamingClient[Commitment], error) // Deposit // - // Deposit is called by the bidder node to add deposit in the bidder registry. The bidder can deposit - // funds in a particular window by specifying the window number. If the window number is not specified, - // the current block number is used to calculate the window number. If the block number is specified, - // the window number is calculated based on the block number. If AutoDeposit is enabled, the deposit - // API returns error. + // Deposit is called by the bidder node to add deposit in the bidder registry, specific to a provider. Deposit(ctx context.Context, in *DepositRequest, opts ...grpc.CallOption) (*DepositResponse, error) - // AutoDeposit + // RequestWithdrawals // - // AutoDeposit is called by the bidder node to add a recurring deposit in the bidder registry. The bidder - // can specify the amount of ETH to be deposited in each window. The bidder can also specify the start window - // number for the deposit. If the start window number is not specified, the current block number is used to - // calculate the window number. If the block number is specified, the window number is calculated based on - // the block number. Once it is enabled, the node will automatically deposit the specified amount in each window - // as well as withdraw the deposit from the previous window. - AutoDeposit(ctx context.Context, in *DepositRequest, opts ...grpc.CallOption) (*AutoDepositResponse, error) - // CancelAutoDeposit - // - // CancelAutoDeposit is called by the bidder node to cancel the auto deposit. The bidder can specify if it - // wants to withdraw the deposit from the current deposited windows. If the withdraw flag is set to true, the API will - // wait till we can withdraw the deposit from the latest deposited window. - CancelAutoDeposit(ctx context.Context, in *CancelAutoDepositRequest, opts ...grpc.CallOption) (*CancelAutoDepositResponse, error) - // AutoDepositStatus - // - // AutoDepositStatus is called by the bidder node to get the status of the auto deposit. - AutoDepositStatus(ctx context.Context, in *EmptyMessage, opts ...grpc.CallOption) (*AutoDepositStatusResponse, error) - // WithdrawFromWindows - // - // WithdrawFromWindows is called by the bidder node to withdraw funds from multiple windows. - WithdrawFromWindows(ctx context.Context, in *WithdrawFromWindowsRequest, opts ...grpc.CallOption) (*WithdrawFromWindowsResponse, error) + // RequestWithdrawals is called by the bidder node to request withdrawals from provider(s) + RequestWithdrawals(ctx context.Context, in *RequestWithdrawalsRequest, opts ...grpc.CallOption) (*RequestWithdrawalsResponse, error) // GetDeposit // - // GetDeposit is called by the bidder to get its deposit in the bidder registry. + // GetDeposit is called by the bidder to get its deposit specific to a provider in the bidder registry. GetDeposit(ctx context.Context, in *GetDepositRequest, opts ...grpc.CallOption) (*DepositResponse, error) // Withdraw // - // Withdraw is called by the bidder to withdraw deposit from the bidder registry. + // Withdraw is called by the bidder to withdraw their deposit to a provider. Withdraw(ctx context.Context, in *WithdrawRequest, opts ...grpc.CallOption) (*WithdrawResponse, error) // GetBidInfo // @@ -132,40 +106,10 @@ func (c *bidderClient) Deposit(ctx context.Context, in *DepositRequest, opts ... return out, nil } -func (c *bidderClient) AutoDeposit(ctx context.Context, in *DepositRequest, opts ...grpc.CallOption) (*AutoDepositResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(AutoDepositResponse) - err := c.cc.Invoke(ctx, Bidder_AutoDeposit_FullMethodName, in, out, cOpts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *bidderClient) CancelAutoDeposit(ctx context.Context, in *CancelAutoDepositRequest, opts ...grpc.CallOption) (*CancelAutoDepositResponse, error) { +func (c *bidderClient) RequestWithdrawals(ctx context.Context, in *RequestWithdrawalsRequest, opts ...grpc.CallOption) (*RequestWithdrawalsResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(CancelAutoDepositResponse) - err := c.cc.Invoke(ctx, Bidder_CancelAutoDeposit_FullMethodName, in, out, cOpts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *bidderClient) AutoDepositStatus(ctx context.Context, in *EmptyMessage, opts ...grpc.CallOption) (*AutoDepositStatusResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(AutoDepositStatusResponse) - err := c.cc.Invoke(ctx, Bidder_AutoDepositStatus_FullMethodName, in, out, cOpts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *bidderClient) WithdrawFromWindows(ctx context.Context, in *WithdrawFromWindowsRequest, opts ...grpc.CallOption) (*WithdrawFromWindowsResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(WithdrawFromWindowsResponse) - err := c.cc.Invoke(ctx, Bidder_WithdrawFromWindows_FullMethodName, in, out, cOpts...) + out := new(RequestWithdrawalsResponse) + err := c.cc.Invoke(ctx, Bidder_RequestWithdrawals_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -226,42 +170,19 @@ type BidderServer interface { SendBid(*Bid, grpc.ServerStreamingServer[Commitment]) error // Deposit // - // Deposit is called by the bidder node to add deposit in the bidder registry. The bidder can deposit - // funds in a particular window by specifying the window number. If the window number is not specified, - // the current block number is used to calculate the window number. If the block number is specified, - // the window number is calculated based on the block number. If AutoDeposit is enabled, the deposit - // API returns error. + // Deposit is called by the bidder node to add deposit in the bidder registry, specific to a provider. Deposit(context.Context, *DepositRequest) (*DepositResponse, error) - // AutoDeposit - // - // AutoDeposit is called by the bidder node to add a recurring deposit in the bidder registry. The bidder - // can specify the amount of ETH to be deposited in each window. The bidder can also specify the start window - // number for the deposit. If the start window number is not specified, the current block number is used to - // calculate the window number. If the block number is specified, the window number is calculated based on - // the block number. Once it is enabled, the node will automatically deposit the specified amount in each window - // as well as withdraw the deposit from the previous window. - AutoDeposit(context.Context, *DepositRequest) (*AutoDepositResponse, error) - // CancelAutoDeposit + // RequestWithdrawals // - // CancelAutoDeposit is called by the bidder node to cancel the auto deposit. The bidder can specify if it - // wants to withdraw the deposit from the current deposited windows. If the withdraw flag is set to true, the API will - // wait till we can withdraw the deposit from the latest deposited window. - CancelAutoDeposit(context.Context, *CancelAutoDepositRequest) (*CancelAutoDepositResponse, error) - // AutoDepositStatus - // - // AutoDepositStatus is called by the bidder node to get the status of the auto deposit. - AutoDepositStatus(context.Context, *EmptyMessage) (*AutoDepositStatusResponse, error) - // WithdrawFromWindows - // - // WithdrawFromWindows is called by the bidder node to withdraw funds from multiple windows. - WithdrawFromWindows(context.Context, *WithdrawFromWindowsRequest) (*WithdrawFromWindowsResponse, error) + // RequestWithdrawals is called by the bidder node to request withdrawals from provider(s) + RequestWithdrawals(context.Context, *RequestWithdrawalsRequest) (*RequestWithdrawalsResponse, error) // GetDeposit // - // GetDeposit is called by the bidder to get its deposit in the bidder registry. + // GetDeposit is called by the bidder to get its deposit specific to a provider in the bidder registry. GetDeposit(context.Context, *GetDepositRequest) (*DepositResponse, error) // Withdraw // - // Withdraw is called by the bidder to withdraw deposit from the bidder registry. + // Withdraw is called by the bidder to withdraw their deposit to a provider. Withdraw(context.Context, *WithdrawRequest) (*WithdrawResponse, error) // GetBidInfo // @@ -289,17 +210,8 @@ func (UnimplementedBidderServer) SendBid(*Bid, grpc.ServerStreamingServer[Commit func (UnimplementedBidderServer) Deposit(context.Context, *DepositRequest) (*DepositResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Deposit not implemented") } -func (UnimplementedBidderServer) AutoDeposit(context.Context, *DepositRequest) (*AutoDepositResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method AutoDeposit not implemented") -} -func (UnimplementedBidderServer) CancelAutoDeposit(context.Context, *CancelAutoDepositRequest) (*CancelAutoDepositResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method CancelAutoDeposit not implemented") -} -func (UnimplementedBidderServer) AutoDepositStatus(context.Context, *EmptyMessage) (*AutoDepositStatusResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method AutoDepositStatus not implemented") -} -func (UnimplementedBidderServer) WithdrawFromWindows(context.Context, *WithdrawFromWindowsRequest) (*WithdrawFromWindowsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method WithdrawFromWindows not implemented") +func (UnimplementedBidderServer) RequestWithdrawals(context.Context, *RequestWithdrawalsRequest) (*RequestWithdrawalsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RequestWithdrawals not implemented") } func (UnimplementedBidderServer) GetDeposit(context.Context, *GetDepositRequest) (*DepositResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetDeposit not implemented") @@ -363,74 +275,20 @@ func _Bidder_Deposit_Handler(srv interface{}, ctx context.Context, dec func(inte return interceptor(ctx, in, info, handler) } -func _Bidder_AutoDeposit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DepositRequest) +func _Bidder_RequestWithdrawals_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RequestWithdrawalsRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(BidderServer).AutoDeposit(ctx, in) + return srv.(BidderServer).RequestWithdrawals(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: Bidder_AutoDeposit_FullMethodName, + FullMethod: Bidder_RequestWithdrawals_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(BidderServer).AutoDeposit(ctx, req.(*DepositRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Bidder_CancelAutoDeposit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CancelAutoDepositRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(BidderServer).CancelAutoDeposit(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: Bidder_CancelAutoDeposit_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(BidderServer).CancelAutoDeposit(ctx, req.(*CancelAutoDepositRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Bidder_AutoDepositStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(EmptyMessage) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(BidderServer).AutoDepositStatus(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: Bidder_AutoDepositStatus_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(BidderServer).AutoDepositStatus(ctx, req.(*EmptyMessage)) - } - return interceptor(ctx, in, info, handler) -} - -func _Bidder_WithdrawFromWindows_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(WithdrawFromWindowsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(BidderServer).WithdrawFromWindows(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: Bidder_WithdrawFromWindows_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(BidderServer).WithdrawFromWindows(ctx, req.(*WithdrawFromWindowsRequest)) + return srv.(BidderServer).RequestWithdrawals(ctx, req.(*RequestWithdrawalsRequest)) } return interceptor(ctx, in, info, handler) } @@ -519,20 +377,8 @@ var Bidder_ServiceDesc = grpc.ServiceDesc{ Handler: _Bidder_Deposit_Handler, }, { - MethodName: "AutoDeposit", - Handler: _Bidder_AutoDeposit_Handler, - }, - { - MethodName: "CancelAutoDeposit", - Handler: _Bidder_CancelAutoDeposit_Handler, - }, - { - MethodName: "AutoDepositStatus", - Handler: _Bidder_AutoDepositStatus_Handler, - }, - { - MethodName: "WithdrawFromWindows", - Handler: _Bidder_WithdrawFromWindows_Handler, + MethodName: "RequestWithdrawals", + Handler: _Bidder_RequestWithdrawals_Handler, }, { MethodName: "GetDeposit", diff --git a/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml b/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml index 131c67841..0131c7ff5 100644 --- a/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml +++ b/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml @@ -10,58 +10,6 @@ consumes: produces: - application/json paths: - /v1/bidder/auto_deposit/{amount}: - post: - summary: AutoDeposit - description: |- - AutoDeposit is called by the bidder node to add a recurring deposit in the bidder registry. The bidder - can specify the amount of ETH to be deposited in each window. The bidder can also specify the start window - number for the deposit. If the start window number is not specified, the current block number is used to - calculate the window number. If the block number is specified, the window number is calculated based on - the block number. Once it is enabled, the node will automatically deposit the specified amount in each window - as well as withdraw the deposit from the previous window. - operationId: Bidder_AutoDeposit - responses: - "200": - description: A successful response. - schema: - $ref: '#/definitions/v1AutoDepositResponse' - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/googlerpcStatus' - parameters: - - name: amount - description: Amount of ETH to be deposited in wei. - in: path - required: true - type: string - - name: windowNumber - description: Optional window number for querying deposit. If not specified, the current block number is used. - in: query - required: false - type: string - format: uint64 - - name: blockNumber - description: Optional block number for querying deposit. If specified, calculate window based on this block number. - in: query - required: false - type: string - format: uint64 - /v1/bidder/auto_deposit_status: - get: - summary: AutoDepositStatus - description: AutoDepositStatus is called by the bidder node to get the status of the auto deposit. - operationId: Bidder_AutoDepositStatus - responses: - "200": - description: A successful response. - schema: - $ref: '#/definitions/v1AutoDepositStatusResponse' - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/googlerpcStatus' /v1/bidder/bid: post: summary: SendBid @@ -89,28 +37,6 @@ paths: required: true schema: $ref: '#/definitions/bidderapiv1Bid' - /v1/bidder/cancel_auto_deposit: - post: - summary: CancelAutoDeposit - description: |- - CancelAutoDeposit is called by the bidder node to cancel the auto deposit. The bidder can specify if it - wants to withdraw the deposit from the current deposited windows. If the withdraw flag is set to true, the API will - wait till we can withdraw the deposit from the latest deposited window. - operationId: Bidder_CancelAutoDeposit - responses: - "200": - description: A successful response. - schema: - $ref: '#/definitions/v1CancelAutoDepositResponse' - default: - description: An unexpected error response. - schema: - $ref: '#/definitions/googlerpcStatus' - parameters: - - name: withdraw - in: query - required: false - type: boolean /v1/bidder/claim_slashed_funds: post: summary: ClaimSlashedFunds @@ -130,12 +56,7 @@ paths: /v1/bidder/deposit/{amount}: post: summary: Deposit - description: |- - Deposit is called by the bidder node to add deposit in the bidder registry. The bidder can deposit - funds in a particular window by specifying the window number. If the window number is not specified, - the current block number is used to calculate the window number. If the block number is specified, - the window number is calculated based on the block number. If AutoDeposit is enabled, the deposit - API returns error. + description: Deposit is called by the bidder node to add deposit in the bidder registry, specific to a provider. operationId: Bidder_Deposit responses: "200": @@ -152,18 +73,11 @@ paths: in: path required: true type: string - - name: windowNumber - description: Optional window number for querying deposit. If not specified, the current block number is used. + - name: provider + description: Provider Ethereum address. in: query - required: false - type: string - format: uint64 - - name: blockNumber - description: Optional block number for querying deposit. If specified, calculate window based on this block number. - in: query - required: false + required: true type: string - format: uint64 /v1/bidder/get_bid_info: get: summary: GetBidInfo @@ -202,7 +116,7 @@ paths: /v1/bidder/get_deposit: get: summary: GetDeposit - description: GetDeposit is called by the bidder to get its deposit in the bidder registry. + description: GetDeposit is called by the bidder to get its deposit specific to a provider in the bidder registry. operationId: Bidder_GetDeposit responses: "200": @@ -214,54 +128,55 @@ paths: schema: $ref: '#/definitions/googlerpcStatus' parameters: - - name: windowNumber - description: Optional window number for querying deposits. If not specified, the current block number is used. + - name: provider + description: Provider Ethereum address. in: query required: false type: string - format: uint64 - /v1/bidder/withdraw: + /v1/bidder/request_withdrawals: post: - summary: Withdraw - description: Withdraw is called by the bidder to withdraw deposit from the bidder registry. - operationId: Bidder_Withdraw + summary: RequestWithdrawals + description: RequestWithdrawals is called by the bidder node to request withdrawals from provider(s) + operationId: Bidder_RequestWithdrawals responses: "200": description: A successful response. schema: - $ref: '#/definitions/v1WithdrawResponse' + $ref: '#/definitions/v1RequestWithdrawalsResponse' default: description: An unexpected error response. schema: $ref: '#/definitions/googlerpcStatus' parameters: - - name: windowNumber - description: Optional window number for withdrawing deposits. If not specified, the last window number is used. - in: query - required: false - type: string - format: uint64 - /v1/bidder/withdraw_from_windows: + - name: body + description: Request withdrawals from provider(s). + in: body + required: true + schema: + $ref: '#/definitions/v1RequestWithdrawalsRequest' + /v1/bidder/withdraw: post: - summary: WithdrawFromWindows - description: WithdrawFromWindows is called by the bidder node to withdraw funds from multiple windows. - operationId: Bidder_WithdrawFromWindows + summary: Withdraw + description: Withdraw is called by the bidder to withdraw their deposit to a provider. + operationId: Bidder_Withdraw responses: "200": description: A successful response. schema: - $ref: '#/definitions/v1WithdrawFromWindowsResponse' + $ref: '#/definitions/v1WithdrawResponse' default: description: An unexpected error response. schema: $ref: '#/definitions/googlerpcStatus' parameters: - - name: body - description: Withdraw deposit from the bidder registry. - in: body - required: true - schema: - $ref: '#/definitions/v1WithdrawFromWindowsRequest' + - name: providers + description: Provider Ethereum addresses. + in: query + required: false + type: array + items: + type: string + collectionFormat: multi definitions: GetBidInfoResponseBidInfo: type: object @@ -343,27 +258,6 @@ definitions: refund: type: string description: Refund amount in wei for the commitment, if applicable. - bidderapiv1AutoDeposit: - type: object - properties: - depositedAmount: - type: string - description: Deposited amount of ETH in wei. - windowNumber: - type: string - format: uint64 - description: Window number for the deposit. - isCurrent: - type: boolean - description: Indicates if the window is the current window. - startBlockNumber: - type: string - format: uint64 - description: The initial L1 block number for the window. - endBlockNumber: - type: string - format: uint64 - description: The final L1 block number for the window. bidderapiv1Bid: type: object example: @@ -493,67 +387,17 @@ definitions: '@type': type: string additionalProperties: {} - v1AutoDepositResponse: - type: object - example: - amount_per_window: "1000000000000000000" - start_window_number: "1" - properties: - startWindowNumber: - type: string - format: uint64 - amountPerWindow: - type: string - description: Response on AutoDeposit request. - title: AutoDeposit response - v1AutoDepositStatusResponse: - type: object - example: - isAutodepositEnabled: true - window_balances: - - depositedAmount: "1000000000000000000" - window_number: 1 - - depositedAmount: "1000000000000000000" - window_number: 2 - - depositedAmount: "1000000000000000000" - window_number: 3 - properties: - windowBalances: - type: array - items: - type: object - $ref: '#/definitions/bidderapiv1AutoDeposit' - isAutodepositEnabled: - type: boolean - description: AutoDeposit status from the bidder registry. - title: AutoDeposit status response - v1CancelAutoDepositResponse: - type: object - example: - window_numbers: - - 1 - - 2 - - 3 - properties: - windowNumbers: - type: array - items: - type: string - format: uint64 - description: CancelAutoDeposit deposit from the bidder registry. - title: CancelAutoDeposit response v1DepositResponse: type: object example: amount: "1000000000000000000" - window_number: 1 + provider: "0x0000000000000000000000000000000000000000" properties: amount: type: string - windowNumber: + provider: type: string - format: uint64 - description: Deposit for bidder in the bidder registry for a particular window. + description: Deposit for bidder in the bidder registry for a particular provider. title: Deposit response v1GetBidInfoResponse: type: object @@ -564,52 +408,49 @@ definitions: type: object $ref: '#/definitions/GetBidInfoResponseBlockBidInfo' description: List of block bid info containing bids and their commitments. - v1WithdrawFromWindowsRequest: + v1RequestWithdrawalsRequest: type: object - example: - window_numbers: - - 1 - - 2 - - 3 properties: - windowNumbers: + providers: type: array items: type: string - format: uint64 - description: Window numbers for withdrawing deposits. - description: Withdraw deposit from the bidder registry. - title: Withdraw from multiple windows request - required: - - windowNumbers - v1WithdrawFromWindowsResponse: + description: Provider Ethereum addresses. + description: Request withdrawals from provider(s). + title: RequestWithdrawals request + v1RequestWithdrawalsResponse: type: object example: - withdraw_responses: - - amount: "1000000000000000000" - window_number: 1 - - amount: "1000000000000000000" - window_number: 2 - - amount: "1000000000000000000" - window_number: 3 + amounts: + - "1000000000000000000" + providers: + - "0x0000000000000000000000000000000000000000" properties: - withdrawResponses: + providers: type: array items: - type: object - $ref: '#/definitions/v1WithdrawResponse' - description: Withdrawn deposit from the bidder registry. - title: Withdraw from multiple windows response + type: string + amounts: + type: array + items: + type: string + description: Request withdrawals from provider(s). + title: RequestWithdrawals response v1WithdrawResponse: type: object example: - amount: "1000000000000000000" - window_number: 1 + amounts: + - "1000000000000000000" + providers: + - "0x0000000000000000000000000000000000000000" properties: - amount: - type: string - windowNumber: - type: string - format: uint64 + amounts: + type: array + items: + type: string + providers: + type: array + items: + type: string description: Withdrawn deposit from the bidder registry. title: Withdraw response diff --git a/p2p/pkg/rpc/bidder/service.go b/p2p/pkg/rpc/bidder/service.go index e6d1d3263..f30d08f95 100644 --- a/p2p/pkg/rpc/bidder/service.go +++ b/p2p/pkg/rpc/bidder/service.go @@ -25,7 +25,6 @@ import ( type Service struct { bidderapiv1.UnimplementedBidderServer owner common.Address - blocksPerWindow uint64 sender PreconfSender registryContract BidderRegistryContract providerRegistry ProviderRegistryContract @@ -77,6 +76,7 @@ type PreconfSender interface { type BidderRegistryContract interface { DepositAsBidder(*bind.TransactOpts, common.Address) (*types.Transaction, error) + DepositEvenlyAsBidder(*bind.TransactOpts, []common.Address) (*types.Transaction, error) RequestWithdrawalsAsBidder(*bind.TransactOpts, []common.Address) (*types.Transaction, error) WithdrawAsBidder(*bind.TransactOpts, []common.Address) (*types.Transaction, error) GetDeposit(*bind.CallOpts, common.Address, common.Address) (*big.Int, error) @@ -216,7 +216,6 @@ func (s *Service) SendBid( return nil } -// TODO: update to new semantics, needs provider addr func (s *Service) Deposit( ctx context.Context, r *bidderapiv1.DepositRequest, @@ -227,24 +226,17 @@ func (s *Service) Deposit( return nil, status.Errorf(codes.InvalidArgument, "validating deposit request: %v", err) } - currentWindow, err := s.blockTrackerContract.GetCurrentWindow() - if err != nil { - s.logger.Error("getting current window", "error", err) - return nil, status.Errorf(codes.Internal, "getting current window: %v", err) - } - - windowToDeposit, err := s.calculateWindowToDeposit(ctx, r, currentWindow.Uint64()) - if err != nil { - s.logger.Error("calculating window to deposit", "error", err) - return nil, status.Errorf(codes.InvalidArgument, "calculating window to deposit: %v", err) - } - amount, success := big.NewInt(0).SetString(r.Amount, 10) if !success { s.logger.Error("parsing amount", "amount", r.Amount) return nil, status.Errorf(codes.InvalidArgument, "parsing amount: %v", r.Amount) } + if amount.Cmp(big.NewInt(0)) <= 0 { + s.logger.Error("amount must be positive", "amount", r.Amount) + return nil, status.Errorf(codes.InvalidArgument, "amount must be positive: %v", r.Amount) + } + opts, err := s.optsGetter(ctx) if err != nil { s.logger.Error("getting transact opts", "error", err) @@ -252,7 +244,7 @@ func (s *Service) Deposit( } opts.Value = amount - providerAddr := common.HexToAddress("0x0000000000000000000000000000000000000000") // TODO: get from request + providerAddr := common.HexToAddress(r.Provider) tx, err := s.registryContract.DepositAsBidder(opts, providerAddr) if err != nil { s.logger.Error("depositing", "error", err) @@ -282,47 +274,99 @@ func (s *Service) Deposit( s.logger.Error( "deposit successful but missing log", "txHash", receipt.TxHash.Hex(), - "window", windowToDeposit, "logs", receipt.Logs, ) return nil, status.Errorf(codes.Internal, "missing log for deposit") } -func (s *Service) calculateWindowToDeposit(ctx context.Context, r *bidderapiv1.DepositRequest, currentWindow uint64) (*big.Int, error) { - if r.WindowNumber != nil { - // Directly use the specified window number if available. - return new(big.Int).SetUint64(r.WindowNumber.Value), nil - } else if r.BlockNumber != nil { - return new(big.Int).SetUint64((r.BlockNumber.Value-1)/s.blocksPerWindow + 1), nil +func (s *Service) DepositEvenly( + ctx context.Context, + r *bidderapiv1.DepositEvenlyRequest, +) (*bidderapiv1.DepositEvenlyResponse, error) { + err := s.validator.Validate(r) + if err != nil { + s.logger.Error("deposit evenly validation", "error", err) + return nil, status.Errorf(codes.InvalidArgument, "validating deposit evenly request: %v", err) } - // Default to N window ahead of the current window if no specific block or window is given. - // This is for the case where the oracle works N windows behind the current window. - return new(big.Int).SetUint64(currentWindow + s.oracleWindowOffset.Uint64()), nil + + opts, err := s.optsGetter(ctx) + if err != nil { + s.logger.Error("getting transact opts", "error", err) + return nil, status.Errorf(codes.Internal, "getting transact opts: %v", err) + } + + totalAmount, success := big.NewInt(0).SetString(r.TotalAmount, 10) + if !success { + s.logger.Error("parsing total amount", "total amount", r.TotalAmount) + return nil, status.Errorf(codes.InvalidArgument, "parsing total amount: %v", r.TotalAmount) + } + + if totalAmount.Cmp(big.NewInt(0)) <= 0 { + s.logger.Error("total amount must be positive", "total amount", r.TotalAmount) + return nil, status.Errorf(codes.InvalidArgument, "total amount must be positive: %v", r.TotalAmount) + } + + providers := make([]common.Address, len(r.Providers)) + for i, provider := range r.Providers { + providers[i] = common.HexToAddress(provider) + } + + opts.Value = totalAmount + + tx, err := s.registryContract.DepositEvenlyAsBidder(opts, providers) + if err != nil { + s.logger.Error("depositing", "error", err) + return nil, status.Errorf(codes.Internal, "deposit: %v", err) + } + + receipt, err := s.watcher.WaitForReceipt(ctx, tx) + if err != nil { + s.logger.Error("waiting for receipt", "error", err) + return nil, status.Errorf(codes.Internal, "waiting for receipt: %v", err) + } + + if receipt.Status != types.ReceiptStatusSuccessful { + s.logger.Error("receipt status", "status", receipt.Status) + return nil, status.Errorf(codes.Internal, "receipt status: %v", receipt.Status) + } + + expectedLogs := len(r.Providers) + receivedLogs := 0 + + response := &bidderapiv1.DepositEvenlyResponse{} + for _, log := range receipt.Logs { + if deposited, err := s.registryContract.ParseBidderDeposited(*log); err == nil { + receivedLogs++ + response.Providers = append(response.Providers, common.Bytes2Hex(deposited.Provider.Bytes())) + response.Amounts = append(response.Amounts, deposited.DepositedAmount.String()) + } + if receivedLogs == expectedLogs { + return response, nil + } + } + + s.logger.Error( + "deposit evenly successful but missing log", + "txHash", receipt.TxHash.Hex(), + "logs", receipt.Logs, + ) + + return nil, status.Errorf(codes.Internal, "missing log for deposit evenly") } -// TODO: update to new semantics, needs provider addr func (s *Service) GetDeposit( ctx context.Context, r *bidderapiv1.GetDepositRequest, ) (*bidderapiv1.DepositResponse, error) { - var ( - window *big.Int - err error - ) - if r.WindowNumber == nil { - window, err = s.blockTrackerContract.GetCurrentWindow() - if err != nil { - s.logger.Error("getting current window", "error", err) - return nil, status.Errorf(codes.Internal, "getting current window: %v", err) - } - // as oracle working N windows behind the current window, we add + N here - window = new(big.Int).Add(window, s.oracleWindowOffset) - } else { - window = new(big.Int).SetUint64(r.WindowNumber.Value) + err := s.validator.Validate(r) + if err != nil { + s.logger.Error("get deposit validation", "error", err) + return nil, status.Errorf(codes.InvalidArgument, "validating get deposit request: %v", err) } - providerAddr := common.HexToAddress("0x0000000000000000000000000000000000000000") // TODO: get from request - stakeAmount, err := s.registryContract.GetDeposit(&bind.CallOpts{ + + providerAddr := common.HexToAddress(r.Provider) + deposit, err := s.registryContract.GetDeposit(&bind.CallOpts{ From: s.owner, Context: ctx, }, s.owner, providerAddr) @@ -331,15 +375,69 @@ func (s *Service) GetDeposit( return nil, status.Errorf(codes.Internal, "getting deposit: %v", err) } - return &bidderapiv1.DepositResponse{Amount: stakeAmount.String(), WindowNumber: wrapperspb.UInt64(window.Uint64())}, nil + return &bidderapiv1.DepositResponse{Amount: deposit.String(), Provider: r.Provider}, nil } -func (s *Service) RequestWithdrawal( +func (s *Service) RequestWithdrawals( ctx context.Context, - r *bidderapiv1.WithdrawRequest, -) (*bidderapiv1.WithdrawResponse, error) { - // TODO: - return nil, status.Errorf(codes.Unimplemented, "method RequestWithdrawal not implemented") + r *bidderapiv1.RequestWithdrawalsRequest, +) (*bidderapiv1.RequestWithdrawalsResponse, error) { + err := s.validator.Validate(r) + if err != nil { + s.logger.Error("request withdrawals validation", "error", err) + return nil, status.Errorf(codes.InvalidArgument, "validating request withdrawals request: %v", err) + } + + opts, err := s.optsGetter(ctx) + if err != nil { + s.logger.Error("getting transact opts", "error", err) + return nil, status.Errorf(codes.Internal, "getting transact opts: %v", err) + } + + providers := make([]common.Address, len(r.Providers)) + for i, provider := range r.Providers { + providers[i] = common.HexToAddress(provider) + } + + tx, err := s.registryContract.RequestWithdrawalsAsBidder(opts, providers) + if err != nil { + s.logger.Error("requesting withdrawals", "error", err) + return nil, status.Errorf(codes.Internal, "requesting withdrawals: %v", err) + } + + receipt, err := s.watcher.WaitForReceipt(ctx, tx) + if err != nil { + s.logger.Error("waiting for receipt", "error", err) + return nil, status.Errorf(codes.Internal, "waiting for receipt: %v", err) + } + + if receipt.Status != types.ReceiptStatusSuccessful { + s.logger.Error("receipt status", "status", receipt.Status) + return nil, status.Errorf(codes.Internal, "receipt status: %v", receipt.Status) + } + + expectedLogs := len(r.Providers) + receivedLogs := 0 + + response := &bidderapiv1.RequestWithdrawalsResponse{} + for _, log := range receipt.Logs { + if withdrawal, err := s.registryContract.ParseWithdrawalRequested(*log); err == nil { + receivedLogs++ + response.Providers = append(response.Providers, common.Bytes2Hex(withdrawal.Provider.Bytes())) + response.Amounts = append(response.Amounts, withdrawal.AvailableAmount.String()) + } + if receivedLogs == expectedLogs { + return response, nil + } + } + + s.logger.Error( + "request withdrawals successful but missing log", + "txHash", receipt.TxHash.Hex(), + "logs", receipt.Logs, + ) + + return nil, status.Errorf(codes.Internal, "missing log for request withdrawals") } func (s *Service) Withdraw( @@ -352,26 +450,17 @@ func (s *Service) Withdraw( return nil, status.Errorf(codes.InvalidArgument, "validating withdraw request: %v", err) } - var window *big.Int - if r.WindowNumber == nil { - window, err = s.blockTrackerContract.GetCurrentWindow() - if err != nil { - s.logger.Error("getting current window", "error", err) - return nil, status.Errorf(codes.Internal, "getting current window: %v", err) - } - window = new(big.Int).Sub(window, big.NewInt(1)) - } else { - window = new(big.Int).SetUint64(r.WindowNumber.Value) - } - opts, err := s.optsGetter(ctx) if err != nil { s.logger.Error("getting transact opts", "error", err) return nil, status.Errorf(codes.Internal, "getting transact opts: %v", err) } - providerAddr := common.HexToAddress("0x0000000000000000000000000000000000000000") // TODO: get from request - providers := []common.Address{providerAddr} + providers := make([]common.Address, len(r.Providers)) + for i, provider := range r.Providers { + providers[i] = common.HexToAddress(provider) + } + tx, err := s.registryContract.WithdrawAsBidder(opts, providers) if err != nil { s.logger.Error("withdrawing deposit", "error", err) @@ -389,47 +478,28 @@ func (s *Service) Withdraw( return nil, status.Errorf(codes.Internal, "receipt status: %v", receipt.Status) } + expectedLogs := len(r.Providers) + receivedLogs := 0 + + response := &bidderapiv1.WithdrawResponse{} for _, log := range receipt.Logs { if withdrawal, err := s.registryContract.ParseBidderWithdrawal(*log); err == nil { - s.logger.Info("withdrawal successful", "amount", withdrawal.AmountWithdrawn.String()) - return &bidderapiv1.WithdrawResponse{ - Amount: withdrawal.AmountWithdrawn.String(), - }, nil + receivedLogs++ + response.Amounts = append(response.Amounts, withdrawal.AmountWithdrawn.String()) + response.Providers = append(response.Providers, common.Bytes2Hex(withdrawal.Provider.Bytes())) + } + if receivedLogs == expectedLogs { + return response, nil } } s.logger.Error( "withdraw successful but missing log", "txHash", receipt.TxHash.Hex(), - "window", window.Uint64(), "logs", receipt.Logs, ) - return nil, status.Errorf(codes.Internal, "missing log for withdrawal") -} - -func (s *Service) AutoDeposit( - ctx context.Context, - r *bidderapiv1.DepositRequest, -) (*bidderapiv1.AutoDepositResponse, error) { - // TODO: Set EOA code - return nil, status.Errorf(codes.Unimplemented, "method AutoDeposit not implemented") -} - -func (s *Service) CancelAutoDeposit( - ctx context.Context, - r *bidderapiv1.CancelAutoDepositRequest, -) (*bidderapiv1.CancelAutoDepositResponse, error) { - // TODO: Unset EOA code - return nil, status.Errorf(codes.Unimplemented, "method CancelAutoDeposit not implemented") -} - -func (s *Service) AutoDepositStatus( - ctx context.Context, - _ *bidderapiv1.EmptyMessage, -) (*bidderapiv1.AutoDepositStatusResponse, error) { - // TODO: Query EOA code - return nil, status.Errorf(codes.Unimplemented, "method AutoDepositStatus not implemented") + return nil, status.Errorf(codes.Internal, "missing log for withdraw") } func (s *Service) ClaimSlashedFunds( diff --git a/p2p/rpc/bidderapi/v1/bidderapi.proto b/p2p/rpc/bidderapi/v1/bidderapi.proto index 46b87124c..8383037af 100644 --- a/p2p/rpc/bidderapi/v1/bidderapi.proto +++ b/p2p/rpc/bidderapi/v1/bidderapi.proto @@ -35,67 +35,37 @@ service Bidder { // Deposit // - // Deposit is called by the bidder node to add deposit in the bidder registry. The bidder can deposit - // funds in a particular window by specifying the window number. If the window number is not specified, - // the current block number is used to calculate the window number. If the block number is specified, - // the window number is calculated based on the block number. If AutoDeposit is enabled, the deposit - // API returns error. + // Deposit is called by the bidder node to add deposit in the bidder registry, specific to a provider. rpc Deposit(DepositRequest) returns (DepositResponse) { option (google.api.http) = {post: "/v1/bidder/deposit/{amount}"}; } - // AutoDeposit + // RequestWithdrawals // - // AutoDeposit is called by the bidder node to add a recurring deposit in the bidder registry. The bidder - // can specify the amount of ETH to be deposited in each window. The bidder can also specify the start window - // number for the deposit. If the start window number is not specified, the current block number is used to - // calculate the window number. If the block number is specified, the window number is calculated based on - // the block number. Once it is enabled, the node will automatically deposit the specified amount in each window - // as well as withdraw the deposit from the previous window. - rpc AutoDeposit(DepositRequest) returns (AutoDepositResponse) { - option (google.api.http) = {post: "/v1/bidder/auto_deposit/{amount}"}; - } - - // CancelAutoDeposit - // - // CancelAutoDeposit is called by the bidder node to cancel the auto deposit. The bidder can specify if it - // wants to withdraw the deposit from the current deposited windows. If the withdraw flag is set to true, the API will - // wait till we can withdraw the deposit from the latest deposited window. - rpc CancelAutoDeposit(CancelAutoDepositRequest) returns (CancelAutoDepositResponse) { - option (google.api.http) = {post: "/v1/bidder/cancel_auto_deposit"}; - } - - // AutoDepositStatus - // - // AutoDepositStatus is called by the bidder node to get the status of the auto deposit. - rpc AutoDepositStatus(EmptyMessage) returns (AutoDepositStatusResponse) { - option (google.api.http) = {get: "/v1/bidder/auto_deposit_status"}; - } - - // WithdrawFromWindows - // - // WithdrawFromWindows is called by the bidder node to withdraw funds from multiple windows. - rpc WithdrawFromWindows(WithdrawFromWindowsRequest) returns (WithdrawFromWindowsResponse) { + // RequestWithdrawals is called by the bidder node to request withdrawals from provider(s) + rpc RequestWithdrawals(RequestWithdrawalsRequest) returns (RequestWithdrawalsResponse) { option (google.api.http) = { - post: "/v1/bidder/withdraw_from_windows" + post: "/v1/bidder/request_withdrawals" body: "*" }; } // GetDeposit // - // GetDeposit is called by the bidder to get its deposit in the bidder registry. + // GetDeposit is called by the bidder to get its deposit specific to a provider in the bidder registry. rpc GetDeposit(GetDepositRequest) returns (DepositResponse) { option (google.api.http) = { get: "/v1/bidder/get_deposit" }; } + // Withdraw // - // Withdraw is called by the bidder to withdraw deposit from the bidder registry. + // Withdraw is called by the bidder to withdraw their deposit to a provider. rpc Withdraw(WithdrawRequest) returns (WithdrawResponse) { option (google.api.http) = {post: "/v1/bidder/withdraw"}; } + // GetBidInfo // // GetBidInfo is called by the bidder to get the bid information. If block number is not specified, @@ -103,6 +73,7 @@ service Bidder { rpc GetBidInfo(GetBidInfoRequest) returns (GetBidInfoResponse) { option (google.api.http) = {get: "/v1/bidder/get_bid_info"}; } + // ClaimSlashedFunds // // ClaimSlashedFunds is called by the bidder to claim slashed funds from the provider. The response @@ -116,8 +87,8 @@ message DepositRequest { option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { json_schema: { title: "Deposit request" - description: "Deposit for bids to be issued by the bidder in wei." - required: ["amount"] + description: "Deposit for bids to be issued by the bidder in wei, specific to a provider." + required: ["amount", "provider"] } }; string amount = 1 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { @@ -129,171 +100,132 @@ message DepositRequest { message: "amount must be a valid integer.", expression: "this.matches('^[1-9][0-9]*$')" }]; - google.protobuf.UInt64Value window_number = 2 [ - (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { - description: "Optional window number for querying deposit. If not specified, the current block number is used.", - example: "1" - }, (buf.validate.field).cel = { - id: "window_number", - message: "window_number must be a positive integer if specified.", - expression: "this == null || (this > 0)" - }]; - google.protobuf.UInt64Value block_number = 3 [ - (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { - description: "Optional block number for querying deposit. If specified, calculate window based on this block number.", - example: "123456" - }, (buf.validate.field).cel = { - id: "block_number", - message: "block_number must be a positive integer if specified.", - expression: "this == null || (this > 0)" - }]; + string provider = 2 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "Provider Ethereum address.", + example: "\"0x0000000000000000000000000000000000000000\"" + }, (buf.validate.field).cel = { + id: "provider", + message: "provider must be a valid Ethereum address.", + expression: "this.matches('^(0x)?[a-fA-F0-9]{40}$')" + }]; }; message DepositResponse { option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { json_schema: { title: "Deposit response" - description: "Deposit for bidder in the bidder registry for a particular window." + description: "Deposit for bidder in the bidder registry for a particular provider." } - example: "{\"amount\": \"1000000000000000000\", \"window_number\": 1}" + example: "{\"amount\": \"1000000000000000000\", \"provider\": \"0x0000000000000000000000000000000000000000\"}" }; string amount = 1; - google.protobuf.UInt64Value window_number = 2; + string provider = 2; }; -message AutoDepositResponse { +message DepositEvenlyRequest { option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { json_schema: { - title: "AutoDeposit response" - description: "Response on AutoDeposit request." + title: "Deposit evenly request" + description: "Deposits some amount of ETH evenly across multiple providers." } - example: "{\"start_window_number\": \"1\", \"amount_per_window\": \"1000000000000000000\"}" }; - google.protobuf.UInt64Value start_window_number = 1; - string amount_per_window = 2; -}; - -message AutoDepositStatusResponse { - option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { - json_schema: { - title: "AutoDeposit status response" - description: "AutoDeposit status from the bidder registry." - } - example: "{\"window_balances\": [{\"depositedAmount\": \"1000000000000000000\", \"window_number\": 1}, {\"depositedAmount\": \"1000000000000000000\", \"window_number\": 2}, {\"depositedAmount\": \"1000000000000000000\", \"window_number\": 3}], \"isAutodepositEnabled\": true}" - }; - repeated AutoDeposit window_balances = 1; - bool is_autodeposit_enabled = 2; -}; - -message CancelAutoDepositRequest { - option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { - json_schema: { - title: "CancelAutoDeposit request" - description: "Request to cancel AutoDeposit." - } - }; - bool withdraw = 1; -}; + string total_amount = 1 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "Total amount of ETH to be deposited in wei.", + pattern: "[0-9]+", + example: "1000000000000000000" + }, (buf.validate.field).cel = { + id: "total_amount", + message: "total_amount must be a valid integer.", + expression: "this.matches('^[1-9][0-9]*$')" + }]; + repeated string providers = 2 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { description: "Provider Ethereum addresses." }, + (buf.validate.field).cel = { + id: "providers", + message: "providers must be a valid array of Ethereum addresses.", + expression: "this.all(r, r.matches('^(0x)?[a-fA-F0-9]{40}$'))" + }]; +} -message CancelAutoDepositResponse { +message DepositEvenlyResponse { option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { json_schema: { - title: "CancelAutoDeposit response" - description: "CancelAutoDeposit deposit from the bidder registry." + title: "Deposit evenly response" + description: "Deposits some amount of ETH evenly across multiple providers." } - example: "{\"window_numbers\": [1, 2, 3]}" }; - repeated google.protobuf.UInt64Value window_numbers = 1; -}; - -message AutoDeposit { - string depositedAmount = 1 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { - description: "Deposited amount of ETH in wei." - }]; - google.protobuf.UInt64Value window_number = 2 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { - description: "Window number for the deposit." - }]; - bool is_current = 3 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { - description: "Indicates if the window is the current window." - }]; - google.protobuf.UInt64Value start_block_number = 4 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { - description: "The initial L1 block number for the window." - }]; - google.protobuf.UInt64Value end_block_number = 5 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { - description: "The final L1 block number for the window." - }]; + repeated string providers = 1; + repeated string amounts = 2; } message EmptyMessage {}; message GetDepositRequest { - google.protobuf.UInt64Value window_number = 1 [ + string provider = 1 [ (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { - description: "Optional window number for querying deposits. If not specified, the current block number is used." + description: "Provider Ethereum address." }, (buf.validate.field).cel = { - id: "window_number", - message: "window_number must be a positive integer if specified.", - expression: "this == null || (this > 0)" + id: "provider", + message: "provider must be a valid Ethereum address.", + expression: "this.matches('^(0x)?[a-fA-F0-9]{40}$')" }]; } -message WithdrawRequest { +message RequestWithdrawalsRequest { option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { json_schema: { - title: "Withdraw request" - description: "Withdraw deposit from the bidder registry." + title: "RequestWithdrawals request" + description: "Request withdrawals from provider(s)." } }; - google.protobuf.UInt64Value window_number = 1 [ - (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { - description: "Optional window number for withdrawing deposits. If not specified, the last window number is used." - }, (buf.validate.field).cel = { - id: "window_number", - message: "window_number must be a positive integer if specified.", - expression: "this == null || (this > 0)" - }]; -}; + repeated string providers = 1 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { description: "Provider Ethereum addresses." }, + (buf.validate.field).cel = { + id: "providers", + message: "providers must be a valid array of Ethereum addresses.", + expression: "this.all(r, r.matches('^(0x)?[a-fA-F0-9]{40}$'))" + }]; +} -message WithdrawResponse { +message RequestWithdrawalsResponse { option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { json_schema: { - title: "Withdraw response" - description: "Withdrawn deposit from the bidder registry." + title: "RequestWithdrawals response" + description: "Request withdrawals from provider(s)." + example: "{\"providers\": [\"0x0000000000000000000000000000000000000000\"], \"amounts\": [\"1000000000000000000\"]}" } - example: "{\"amount\": \"1000000000000000000\", \"window_number\": 1 }" }; - string amount = 1; - google.protobuf.UInt64Value window_number = 2; -}; + repeated string providers = 1; + repeated string amounts = 2; +} -message WithdrawFromWindowsRequest { +message WithdrawRequest { option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { json_schema: { - title: "Withdraw from multiple windows request" - description: "Withdraw deposit from the bidder registry." - required: ["window_numbers"] + title: "Withdraw request" + description: "Withdraw deposits from provider(s)." } - example: "{\"window_numbers\": [1, 2, 3]}" }; - repeated google.protobuf.UInt64Value window_numbers = 1 [ + repeated string providers = 1 [ (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { - description: "Window numbers for withdrawing deposits." + description: "Provider Ethereum addresses." }, (buf.validate.field).cel = { - id: "window_numbers", - message: "window_numbers must be a valid array of positive integers.", - expression: "this.all(r, r > 0) && size(this) > 0" + id: "providers", + message: "providers must be a valid array of Ethereum addresses.", + expression: "this.all(r, r.matches('^(0x)?[a-fA-F0-9]{40}$'))" }]; }; -message WithdrawFromWindowsResponse { +message WithdrawResponse { option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { json_schema: { - title: "Withdraw from multiple windows response" + title: "Withdraw response" description: "Withdrawn deposit from the bidder registry." } - example: "{\"withdraw_responses\": [{\"amount\": \"1000000000000000000\", \"window_number\": 1 }, {\"amount\": \"1000000000000000000\", \"window_number\": 2 }, {\"amount\": \"1000000000000000000\", \"window_number\": 3 } ]}" + example: "{\"amounts\": [\"1000000000000000000\"], \"providers\": [\"0x0000000000000000000000000000000000000000\"]}" }; - repeated WithdrawResponse withdraw_responses = 1; + repeated string amounts = 1; + repeated string providers = 2; }; message Bid { @@ -498,3 +430,4 @@ message GetBidInfoResponse { description: "List of block bid info containing bids and their commitments." }]; }; + From e1397db424b9730fc46d355724341a46690fcf8c Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Tue, 12 Aug 2025 23:21:19 -0700 Subject: [PATCH 049/117] builds --- p2p/integrationtest/real-bidder/main.go | 35 ++++++++++++---------- tools/bidder-bot/service/service.go | 40 +++++++++++++------------ 2 files changed, 40 insertions(+), 35 deletions(-) diff --git a/p2p/integrationtest/real-bidder/main.go b/p2p/integrationtest/real-bidder/main.go index 2bc784853..25b069ceb 100644 --- a/p2p/integrationtest/real-bidder/main.go +++ b/p2p/integrationtest/real-bidder/main.go @@ -187,22 +187,25 @@ func main() { return } - status, err := bidderClient.AutoDepositStatus(context.Background(), &pb.EmptyMessage{}) - if err != nil { - logger.Error("failed to get auto deposit status", "err", err) - return - } - - if !status.IsAutodepositEnabled { - resp, err := bidderClient.AutoDeposit(context.Background(), &pb.DepositRequest{ - Amount: minDeposit.String(), - }) - if err != nil { - logger.Error("failed to auto deposit", "err", err) - return - } - logger.Info("auto deposit", "amount", resp.AmountPerWindow, "window", resp.StartWindowNumber) - } + // TODO: set code to deposit manager here, set min deposit for every provider + fmt.Println("min deposit", minDeposit) + + // status, err := bidderClient.AutoDepositStatus(context.Background(), &pb.EmptyMessage{}) + // if err != nil { + // logger.Error("failed to get auto deposit status", "err", err) + // return + // } + + // if !status.IsAutodepositEnabled { + // resp, err := bidderClient.AutoDeposit(context.Background(), &pb.DepositRequest{ + // Amount: minDeposit.String(), + // }) + // if err != nil { + // logger.Error("failed to auto deposit", "err", err) + // return + // } + // logger.Info("auto deposit", "amount", resp.AmountPerWindow, "window", resp.StartWindowNumber) + // } type blockWithTxns struct { blockNum int64 diff --git a/tools/bidder-bot/service/service.go b/tools/bidder-bot/service/service.go index 2a478a9c0..223b08ab0 100644 --- a/tools/bidder-bot/service/service.go +++ b/tools/bidder-bot/service/service.go @@ -177,25 +177,27 @@ func New(config *Config) (*Service, error) { config.Logger.Info("balance checking disabled") } - status, err := bidderCli.AutoDepositStatus(context.Background(), &bidderapiv1.EmptyMessage{}) - if err != nil { - return nil, err - } - config.Logger.Info("got auto deposit status", "enabled", status.IsAutodepositEnabled) - - if !status.IsAutodepositEnabled { - config.Logger.Info("enabling auto deposit") - resp, err := bidderCli.AutoDeposit( - context.Background(), - &bidderapiv1.DepositRequest{ - Amount: config.AutoDepositAmount.String(), - }, - ) - if err != nil { - return nil, err - } - config.Logger.Debug("auto deposit enabled", "amount", resp.AmountPerWindow, "window", resp.StartWindowNumber) - } + // TODO: set code to deposit manager here, set min deposit for every provider + + // status, err := bidderCli.AutoDepositStatus(context.Background(), &bidderapiv1.EmptyMessage{}) + // if err != nil { + // return nil, err + // } + // config.Logger.Info("got auto deposit status", "enabled", status.IsAutodepositEnabled) + + // if !status.IsAutodepositEnabled { + // config.Logger.Info("enabling auto deposit") + // resp, err := bidderCli.AutoDeposit( + // context.Background(), + // &bidderapiv1.DepositRequest{ + // Amount: config.AutoDepositAmount.String(), + // }, + // ) + // if err != nil { + // return nil, err + // } + // config.Logger.Debug("auto deposit enabled", "amount", resp.AmountPerWindow, "window", resp.StartWindowNumber) + // } healthChecker := health.New() From d2a4774a78e38a59ba736085646bc38a4969b1e5 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Tue, 12 Aug 2025 23:23:12 -0700 Subject: [PATCH 050/117] more builds --- tools/bidder-emulator/bidder.go | 28 ++++++++++---------- tools/instant-bridge/service/service.go | 34 +++++++++++++------------ tools/preconf-rpc/service/service.go | 34 +++++++++++++------------ 3 files changed, 51 insertions(+), 45 deletions(-) diff --git a/tools/bidder-emulator/bidder.go b/tools/bidder-emulator/bidder.go index e3044a924..5bee0dda4 100644 --- a/tools/bidder-emulator/bidder.go +++ b/tools/bidder-emulator/bidder.go @@ -47,19 +47,21 @@ func newBidder(rpcURL string, depositAmount string) (*bidder, error) { } func (b *bidder) setup(depositAmount string) error { - status, err := b.client.AutoDepositStatus(context.Background(), &pb.EmptyMessage{}) - if err != nil { - return fmt.Errorf("failed to get auto deposit status: %w", err) - } - - if !status.IsAutodepositEnabled { - _, err := b.client.AutoDeposit(context.Background(), &pb.DepositRequest{ - Amount: depositAmount, - }) - if err != nil { - return fmt.Errorf("failed to auto deposit: %w", err) - } - } + // TODO: set code to deposit manager here, set min deposit for every provider + + // status, err := b.client.AutoDepositStatus(context.Background(), &pb.EmptyMessage{}) + // if err != nil { + // return fmt.Errorf("failed to get auto deposit status: %w", err) + // } + + // if !status.IsAutodepositEnabled { + // _, err := b.client.AutoDeposit(context.Background(), &pb.DepositRequest{ + // Amount: depositAmount, + // }) + // if err != nil { + // return fmt.Errorf("failed to auto deposit: %w", err) + // } + // } return nil } diff --git a/tools/instant-bridge/service/service.go b/tools/instant-bridge/service/service.go index 6b96a952f..536747613 100644 --- a/tools/instant-bridge/service/service.go +++ b/tools/instant-bridge/service/service.go @@ -88,22 +88,24 @@ func New(config *Config) (*Service, error) { topologyCli := debugapiv1.NewDebugServiceClient(conn) notificationsCli := notificationsapiv1.NewNotificationsClient(conn) - status, err := bidderCli.AutoDepositStatus(context.Background(), &bidderapiv1.EmptyMessage{}) - if err != nil { - return nil, err - } - - if !status.IsAutodepositEnabled { - _, err := bidderCli.AutoDeposit( - context.Background(), - &bidderapiv1.DepositRequest{ - Amount: config.AutoDepositAmount.String(), - }, - ) - if err != nil { - return nil, err - } - } + // TODO: set code to deposit manager here, set min deposit for every provider + + // status, err := bidderCli.AutoDepositStatus(context.Background(), &bidderapiv1.EmptyMessage{}) + // if err != nil { + // return nil, err + // } + // + // if !status.IsAutodepositEnabled { + // _, err := bidderCli.AutoDeposit( + // context.Background(), + // &bidderapiv1.DepositRequest{ + // Amount: config.AutoDepositAmount.String(), + // }, + // ) + // if err != nil { + // return nil, err + // } + // } bridgeConfig := transfer.BridgeConfig{ Signer: config.Signer, diff --git a/tools/preconf-rpc/service/service.go b/tools/preconf-rpc/service/service.go index 926ae43d5..40c167804 100644 --- a/tools/preconf-rpc/service/service.go +++ b/tools/preconf-rpc/service/service.go @@ -106,22 +106,24 @@ func New(config *Config) (*Service, error) { topologyCli := debugapiv1.NewDebugServiceClient(conn) notificationsCli := notificationsapiv1.NewNotificationsClient(conn) - status, err := bidderCli.AutoDepositStatus(context.Background(), &bidderapiv1.EmptyMessage{}) - if err != nil { - return nil, err - } - - if !status.IsAutodepositEnabled { - _, err := bidderCli.AutoDeposit( - context.Background(), - &bidderapiv1.DepositRequest{ - Amount: config.AutoDepositAmount.String(), - }, - ) - if err != nil { - return nil, err - } - } + // TODO: set code to deposit manager here, set min deposit for every provider + + // status, err := bidderCli.AutoDepositStatus(context.Background(), &bidderapiv1.EmptyMessage{}) + // if err != nil { + // return nil, err + // } + + // if !status.IsAutodepositEnabled { + // _, err := bidderCli.AutoDeposit( + // context.Background(), + // &bidderapiv1.DepositRequest{ + // Amount: config.AutoDepositAmount.String(), + // }, + // ) + // if err != nil { + // return nil, err + // } + // } bridgeConfig := transfer.BridgeConfig{ Signer: config.Signer, From 05b31b261cea92724671f72371aab2f438dcdc85 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Tue, 12 Aug 2025 23:31:30 -0700 Subject: [PATCH 051/117] todos --- p2p/cmd/main.go | 2 ++ p2p/pkg/node/node.go | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/p2p/cmd/main.go b/p2p/cmd/main.go index 2c44b4e65..8aa0873a2 100644 --- a/p2p/cmd/main.go +++ b/p2p/cmd/main.go @@ -299,6 +299,8 @@ var ( Category: categoryContracts, }) + // TODO: These flags will be reused when https://github.com/primev/mev-commit/issues is solved + optionAutodepositAmount = altsrc.NewStringFlag(&cli.StringFlag{ Name: "autodeposit-amount", Usage: "Amount to auto deposit in each window in wei", diff --git a/p2p/pkg/node/node.go b/p2p/pkg/node/node.go index 0c7cfe6f9..dafba4a9c 100644 --- a/p2p/pkg/node/node.go +++ b/p2p/pkg/node/node.go @@ -703,9 +703,9 @@ func NewNode(opts *Options) (*Node, error) { nd.closers = append(nd.closers, channelCloserFunc(closeChan)) } - // TODO: wont just be a single amount, amount is for each provider + // TODO: Need amount for each provider, configured via json or yml if opts.AutodepositAmount != nil { - // "set code" for bidder. + // TODO: "set code" for bidder and set target amounts for each provider, also deposit to each provider. } started := make(chan struct{}) From 0eba4f2669a49512b6a038d27c6c22b97bd0c40a Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 13 Aug 2025 00:23:43 -0700 Subject: [PATCH 052/117] api updates --- p2p/cmd/main.go | 3 - p2p/gen/go/bidderapi/v1/bidderapi.pb.go | 156 ++++++++++-------- p2p/gen/go/bidderapi/v1/bidderapi.pb.gw.go | 74 +++++++++ p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go | 44 +++++ .../bidderapi/v1/bidderapi.swagger.yaml | 42 +++++ p2p/pkg/node/node.go | 2 - p2p/pkg/rpc/bidder/service.go | 3 - p2p/rpc/bidderapi/v1/bidderapi.proto | 7 + 8 files changed, 250 insertions(+), 81 deletions(-) diff --git a/p2p/cmd/main.go b/p2p/cmd/main.go index 8aa0873a2..4155191f1 100644 --- a/p2p/cmd/main.go +++ b/p2p/cmd/main.go @@ -40,8 +40,6 @@ const ( defaultSecret = "secret" defaultKeystore = "keystore" defaultDataDir = "db" - - defaultOracleWindowOffset = 1 ) const ( @@ -702,7 +700,6 @@ func launchNodeWithConfig(c *cli.Context) (err error) { DefaultGasLimit: uint64(c.Int(optionGasLimit.Name)), DefaultGasTipCap: gasTipCap, DefaultGasFeeCap: gasFeeCap, - OracleWindowOffset: big.NewInt(defaultOracleWindowOffset), BeaconAPIURL: c.String(optionBeaconAPIURL.Name), L1RPCURL: c.String(optionL1RPCURL.Name), LaggardMode: big.NewInt(int64(c.Int(optionLaggardMode.Name))), diff --git a/p2p/gen/go/bidderapi/v1/bidderapi.pb.go b/p2p/gen/go/bidderapi/v1/bidderapi.pb.go index c3e9c77ff..11e9cc899 100644 --- a/p2p/gen/go/bidderapi/v1/bidderapi.pb.go +++ b/p2p/gen/go/bidderapi/v1/bidderapi.pb.go @@ -1759,7 +1759,7 @@ var file_bidderapi_v1_bidderapi_proto_rawDesc = []byte{ 0x74, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x69, 0x64, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x52, 0x04, 0x62, 0x69, 0x64, 0x73, 0x32, - 0x9e, 0x06, 0x0a, 0x06, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x12, 0x53, 0x0a, 0x07, 0x53, 0x65, + 0x9b, 0x07, 0x0a, 0x06, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x12, 0x53, 0x0a, 0x07, 0x53, 0x65, 0x6e, 0x64, 0x42, 0x69, 0x64, 0x12, 0x11, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x69, 0x64, 0x1a, 0x18, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, @@ -1771,64 +1771,72 @@ var file_bidderapi_v1_bidderapi_proto_rawDesc = []byte{ 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x22, 0x1b, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x64, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x2f, 0x7b, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x7d, 0x12, 0x92, 0x01, 0x0a, - 0x12, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, - 0x61, 0x6c, 0x73, 0x12, 0x27, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, - 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x62, - 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x3a, 0x01, - 0x2a, 0x22, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, - 0x73, 0x12, 0x6c, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, - 0x1f, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, - 0x64, 0x65, 0x72, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, - 0x66, 0x0a, 0x08, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x12, 0x1d, 0x2e, 0x62, 0x69, - 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, - 0x72, 0x61, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x62, 0x69, 0x64, - 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, - 0x61, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x15, 0x22, 0x13, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x77, - 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x12, 0x70, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x42, 0x69, - 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, - 0x12, 0x17, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x67, 0x65, 0x74, - 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x75, 0x0a, 0x11, 0x43, 0x6c, 0x61, - 0x69, 0x6d, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x46, 0x75, 0x6e, 0x64, 0x73, 0x12, 0x1a, - 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, - 0x22, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x63, 0x6c, 0x61, - 0x69, 0x6d, 0x5f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x66, 0x75, 0x6e, 0x64, 0x73, - 0x42, 0xaa, 0x02, 0x92, 0x41, 0x72, 0x12, 0x70, 0x0a, 0x0a, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, - 0x20, 0x41, 0x50, 0x49, 0x2a, 0x55, 0x0a, 0x1b, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, - 0x20, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, - 0x31, 0x2e, 0x31, 0x12, 0x36, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x65, 0x76, 0x2f, 0x6d, - 0x65, 0x76, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x2f, 0x62, 0x6c, 0x6f, 0x62, 0x2f, 0x6d, - 0x61, 0x69, 0x6e, 0x2f, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x32, 0x0b, 0x31, 0x2e, 0x30, - 0x2e, 0x30, 0x2d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x2e, 0x62, 0x69, - 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x42, 0x0e, 0x42, 0x69, 0x64, 0x64, - 0x65, 0x72, 0x61, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x40, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x65, 0x76, 0x2f, - 0x6d, 0x65, 0x76, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x2f, 0x70, 0x32, 0x70, 0x2f, 0x67, - 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2f, - 0x76, 0x31, 0x3b, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x76, 0x31, 0xa2, 0x02, - 0x03, 0x42, 0x58, 0x58, 0xaa, 0x02, 0x0c, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, - 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0c, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x5c, - 0x56, 0x31, 0xe2, 0x02, 0x18, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x5c, 0x56, - 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0d, - 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x69, 0x74, 0x2f, 0x7b, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x7d, 0x12, 0x7b, 0x0a, 0x0d, + 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x12, 0x22, 0x2e, + 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x23, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x19, + 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x12, 0x92, 0x01, 0x0a, 0x12, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, + 0x12, 0x27, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, + 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x62, 0x69, 0x64, 0x64, + 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x3a, 0x01, 0x2a, 0x22, 0x1e, + 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x12, 0x6c, + 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x1f, 0x2e, 0x62, + 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x44, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, + 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, + 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x66, 0x0a, 0x08, + 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x12, 0x1d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, + 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, + 0x13, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x77, 0x69, 0x74, 0x68, + 0x64, 0x72, 0x61, 0x77, 0x12, 0x70, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x1f, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x12, 0x17, 0x2f, + 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x62, 0x69, + 0x64, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x75, 0x0a, 0x11, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x53, + 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x46, 0x75, 0x6e, 0x64, 0x73, 0x12, 0x1a, 0x2e, 0x62, 0x69, + 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1e, 0x2f, + 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x5f, + 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x66, 0x75, 0x6e, 0x64, 0x73, 0x42, 0xaa, 0x02, + 0x92, 0x41, 0x72, 0x12, 0x70, 0x0a, 0x0a, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x41, 0x50, + 0x49, 0x2a, 0x55, 0x0a, 0x1b, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x20, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x31, 0x2e, 0x31, + 0x12, 0x36, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x65, 0x76, 0x2f, 0x6d, 0x65, 0x76, 0x2d, + 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x2f, 0x62, 0x6c, 0x6f, 0x62, 0x2f, 0x6d, 0x61, 0x69, 0x6e, + 0x2f, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x32, 0x0b, 0x31, 0x2e, 0x30, 0x2e, 0x30, 0x2d, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, + 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x42, 0x0e, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, + 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x40, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x65, 0x76, 0x2f, 0x6d, 0x65, 0x76, + 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x2f, 0x70, 0x32, 0x70, 0x2f, 0x67, 0x65, 0x6e, 0x2f, + 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x3b, + 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x42, 0x58, + 0x58, 0xaa, 0x02, 0x0c, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x31, + 0xca, 0x02, 0x0c, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x5c, 0x56, 0x31, 0xe2, + 0x02, 0x18, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x5c, 0x56, 0x31, 0x5c, 0x47, + 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0d, 0x42, 0x69, 0x64, + 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( @@ -1870,20 +1878,22 @@ var file_bidderapi_v1_bidderapi_proto_depIdxs = []int32{ 15, // 2: bidderapi.v1.GetBidInfoResponse.BlockBidInfo.bids:type_name -> bidderapi.v1.GetBidInfoResponse.BidInfo 10, // 3: bidderapi.v1.Bidder.SendBid:input_type -> bidderapi.v1.Bid 0, // 4: bidderapi.v1.Bidder.Deposit:input_type -> bidderapi.v1.DepositRequest - 6, // 5: bidderapi.v1.Bidder.RequestWithdrawals:input_type -> bidderapi.v1.RequestWithdrawalsRequest - 5, // 6: bidderapi.v1.Bidder.GetDeposit:input_type -> bidderapi.v1.GetDepositRequest - 8, // 7: bidderapi.v1.Bidder.Withdraw:input_type -> bidderapi.v1.WithdrawRequest - 12, // 8: bidderapi.v1.Bidder.GetBidInfo:input_type -> bidderapi.v1.GetBidInfoRequest - 4, // 9: bidderapi.v1.Bidder.ClaimSlashedFunds:input_type -> bidderapi.v1.EmptyMessage - 11, // 10: bidderapi.v1.Bidder.SendBid:output_type -> bidderapi.v1.Commitment - 1, // 11: bidderapi.v1.Bidder.Deposit:output_type -> bidderapi.v1.DepositResponse - 7, // 12: bidderapi.v1.Bidder.RequestWithdrawals:output_type -> bidderapi.v1.RequestWithdrawalsResponse - 1, // 13: bidderapi.v1.Bidder.GetDeposit:output_type -> bidderapi.v1.DepositResponse - 9, // 14: bidderapi.v1.Bidder.Withdraw:output_type -> bidderapi.v1.WithdrawResponse - 13, // 15: bidderapi.v1.Bidder.GetBidInfo:output_type -> bidderapi.v1.GetBidInfoResponse - 17, // 16: bidderapi.v1.Bidder.ClaimSlashedFunds:output_type -> google.protobuf.StringValue - 10, // [10:17] is the sub-list for method output_type - 3, // [3:10] is the sub-list for method input_type + 2, // 5: bidderapi.v1.Bidder.DepositEvenly:input_type -> bidderapi.v1.DepositEvenlyRequest + 6, // 6: bidderapi.v1.Bidder.RequestWithdrawals:input_type -> bidderapi.v1.RequestWithdrawalsRequest + 5, // 7: bidderapi.v1.Bidder.GetDeposit:input_type -> bidderapi.v1.GetDepositRequest + 8, // 8: bidderapi.v1.Bidder.Withdraw:input_type -> bidderapi.v1.WithdrawRequest + 12, // 9: bidderapi.v1.Bidder.GetBidInfo:input_type -> bidderapi.v1.GetBidInfoRequest + 4, // 10: bidderapi.v1.Bidder.ClaimSlashedFunds:input_type -> bidderapi.v1.EmptyMessage + 11, // 11: bidderapi.v1.Bidder.SendBid:output_type -> bidderapi.v1.Commitment + 1, // 12: bidderapi.v1.Bidder.Deposit:output_type -> bidderapi.v1.DepositResponse + 3, // 13: bidderapi.v1.Bidder.DepositEvenly:output_type -> bidderapi.v1.DepositEvenlyResponse + 7, // 14: bidderapi.v1.Bidder.RequestWithdrawals:output_type -> bidderapi.v1.RequestWithdrawalsResponse + 1, // 15: bidderapi.v1.Bidder.GetDeposit:output_type -> bidderapi.v1.DepositResponse + 9, // 16: bidderapi.v1.Bidder.Withdraw:output_type -> bidderapi.v1.WithdrawResponse + 13, // 17: bidderapi.v1.Bidder.GetBidInfo:output_type -> bidderapi.v1.GetBidInfoResponse + 17, // 18: bidderapi.v1.Bidder.ClaimSlashedFunds:output_type -> google.protobuf.StringValue + 11, // [11:19] is the sub-list for method output_type + 3, // [3:11] is the sub-list for method input_type 3, // [3:3] is the sub-list for extension type_name 3, // [3:3] is the sub-list for extension extendee 0, // [0:3] is the sub-list for field type_name diff --git a/p2p/gen/go/bidderapi/v1/bidderapi.pb.gw.go b/p2p/gen/go/bidderapi/v1/bidderapi.pb.gw.go index 7dd2b1b88..b45daf456 100644 --- a/p2p/gen/go/bidderapi/v1/bidderapi.pb.gw.go +++ b/p2p/gen/go/bidderapi/v1/bidderapi.pb.gw.go @@ -111,6 +111,41 @@ func local_request_Bidder_Deposit_0(ctx context.Context, marshaler runtime.Marsh return msg, metadata, err } +var filter_Bidder_DepositEvenly_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} + +func request_Bidder_DepositEvenly_0(ctx context.Context, marshaler runtime.Marshaler, client BidderClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DepositEvenlyRequest + metadata runtime.ServerMetadata + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Bidder_DepositEvenly_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.DepositEvenly(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_Bidder_DepositEvenly_0(ctx context.Context, marshaler runtime.Marshaler, server BidderServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DepositEvenlyRequest + metadata runtime.ServerMetadata + ) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Bidder_DepositEvenly_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.DepositEvenly(ctx, &protoReq) + return msg, metadata, err +} + func request_Bidder_RequestWithdrawals_0(ctx context.Context, marshaler runtime.Marshaler, client BidderClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var ( protoReq RequestWithdrawalsRequest @@ -296,6 +331,26 @@ func RegisterBidderHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser } forward_Bidder_Deposit_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) + mux.Handle(http.MethodPost, pattern_Bidder_DepositEvenly_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/bidderapi.v1.Bidder/DepositEvenly", runtime.WithHTTPPathPattern("/v1/bidder/deposit_evenly")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Bidder_DepositEvenly_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_Bidder_DepositEvenly_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle(http.MethodPost, pattern_Bidder_RequestWithdrawals_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -470,6 +525,23 @@ func RegisterBidderHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli } forward_Bidder_Deposit_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) + mux.Handle(http.MethodPost, pattern_Bidder_DepositEvenly_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/bidderapi.v1.Bidder/DepositEvenly", runtime.WithHTTPPathPattern("/v1/bidder/deposit_evenly")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Bidder_DepositEvenly_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_Bidder_DepositEvenly_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle(http.MethodPost, pattern_Bidder_RequestWithdrawals_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -561,6 +633,7 @@ func RegisterBidderHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli var ( pattern_Bidder_SendBid_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "bid"}, "")) pattern_Bidder_Deposit_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v1", "bidder", "deposit", "amount"}, "")) + pattern_Bidder_DepositEvenly_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "deposit_evenly"}, "")) pattern_Bidder_RequestWithdrawals_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "request_withdrawals"}, "")) pattern_Bidder_GetDeposit_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "get_deposit"}, "")) pattern_Bidder_Withdraw_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "withdraw"}, "")) @@ -571,6 +644,7 @@ var ( var ( forward_Bidder_SendBid_0 = runtime.ForwardResponseStream forward_Bidder_Deposit_0 = runtime.ForwardResponseMessage + forward_Bidder_DepositEvenly_0 = runtime.ForwardResponseMessage forward_Bidder_RequestWithdrawals_0 = runtime.ForwardResponseMessage forward_Bidder_GetDeposit_0 = runtime.ForwardResponseMessage forward_Bidder_Withdraw_0 = runtime.ForwardResponseMessage diff --git a/p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go b/p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go index 09dd26697..bd3fae38a 100644 --- a/p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go +++ b/p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go @@ -22,6 +22,7 @@ const _ = grpc.SupportPackageIsVersion9 const ( Bidder_SendBid_FullMethodName = "/bidderapi.v1.Bidder/SendBid" Bidder_Deposit_FullMethodName = "/bidderapi.v1.Bidder/Deposit" + Bidder_DepositEvenly_FullMethodName = "/bidderapi.v1.Bidder/DepositEvenly" Bidder_RequestWithdrawals_FullMethodName = "/bidderapi.v1.Bidder/RequestWithdrawals" Bidder_GetDeposit_FullMethodName = "/bidderapi.v1.Bidder/GetDeposit" Bidder_Withdraw_FullMethodName = "/bidderapi.v1.Bidder/Withdraw" @@ -45,6 +46,10 @@ type BidderClient interface { // // Deposit is called by the bidder node to add deposit in the bidder registry, specific to a provider. Deposit(ctx context.Context, in *DepositRequest, opts ...grpc.CallOption) (*DepositResponse, error) + // DepositEvenly + // + // DepositEvenly is called by the bidder node to deposit a total amount evenly across multiple providers. + DepositEvenly(ctx context.Context, in *DepositEvenlyRequest, opts ...grpc.CallOption) (*DepositEvenlyResponse, error) // RequestWithdrawals // // RequestWithdrawals is called by the bidder node to request withdrawals from provider(s) @@ -106,6 +111,16 @@ func (c *bidderClient) Deposit(ctx context.Context, in *DepositRequest, opts ... return out, nil } +func (c *bidderClient) DepositEvenly(ctx context.Context, in *DepositEvenlyRequest, opts ...grpc.CallOption) (*DepositEvenlyResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DepositEvenlyResponse) + err := c.cc.Invoke(ctx, Bidder_DepositEvenly_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *bidderClient) RequestWithdrawals(ctx context.Context, in *RequestWithdrawalsRequest, opts ...grpc.CallOption) (*RequestWithdrawalsResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(RequestWithdrawalsResponse) @@ -172,6 +187,10 @@ type BidderServer interface { // // Deposit is called by the bidder node to add deposit in the bidder registry, specific to a provider. Deposit(context.Context, *DepositRequest) (*DepositResponse, error) + // DepositEvenly + // + // DepositEvenly is called by the bidder node to deposit a total amount evenly across multiple providers. + DepositEvenly(context.Context, *DepositEvenlyRequest) (*DepositEvenlyResponse, error) // RequestWithdrawals // // RequestWithdrawals is called by the bidder node to request withdrawals from provider(s) @@ -210,6 +229,9 @@ func (UnimplementedBidderServer) SendBid(*Bid, grpc.ServerStreamingServer[Commit func (UnimplementedBidderServer) Deposit(context.Context, *DepositRequest) (*DepositResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Deposit not implemented") } +func (UnimplementedBidderServer) DepositEvenly(context.Context, *DepositEvenlyRequest) (*DepositEvenlyResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DepositEvenly not implemented") +} func (UnimplementedBidderServer) RequestWithdrawals(context.Context, *RequestWithdrawalsRequest) (*RequestWithdrawalsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method RequestWithdrawals not implemented") } @@ -275,6 +297,24 @@ func _Bidder_Deposit_Handler(srv interface{}, ctx context.Context, dec func(inte return interceptor(ctx, in, info, handler) } +func _Bidder_DepositEvenly_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DepositEvenlyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BidderServer).DepositEvenly(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Bidder_DepositEvenly_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BidderServer).DepositEvenly(ctx, req.(*DepositEvenlyRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Bidder_RequestWithdrawals_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(RequestWithdrawalsRequest) if err := dec(in); err != nil { @@ -376,6 +416,10 @@ var Bidder_ServiceDesc = grpc.ServiceDesc{ MethodName: "Deposit", Handler: _Bidder_Deposit_Handler, }, + { + MethodName: "DepositEvenly", + Handler: _Bidder_DepositEvenly_Handler, + }, { MethodName: "RequestWithdrawals", Handler: _Bidder_RequestWithdrawals_Handler, diff --git a/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml b/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml index 0131c7ff5..115d7b0de 100644 --- a/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml +++ b/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml @@ -78,6 +78,35 @@ paths: in: query required: true type: string + /v1/bidder/deposit_evenly: + post: + summary: DepositEvenly + description: DepositEvenly is called by the bidder node to deposit a total amount evenly across multiple providers. + operationId: Bidder_DepositEvenly + responses: + "200": + description: A successful response. + schema: + $ref: '#/definitions/v1DepositEvenlyResponse' + default: + description: An unexpected error response. + schema: + $ref: '#/definitions/googlerpcStatus' + parameters: + - name: totalAmount + description: Total amount of ETH to be deposited in wei. + in: query + required: false + type: string + pattern: '[0-9]+' + - name: providers + description: Provider Ethereum addresses. + in: query + required: false + type: array + items: + type: string + collectionFormat: multi /v1/bidder/get_bid_info: get: summary: GetBidInfo @@ -387,6 +416,19 @@ definitions: '@type': type: string additionalProperties: {} + v1DepositEvenlyResponse: + type: object + properties: + providers: + type: array + items: + type: string + amounts: + type: array + items: + type: string + description: Deposits some amount of ETH evenly across multiple providers. + title: Deposit evenly response v1DepositResponse: type: object example: diff --git a/p2p/pkg/node/node.go b/p2p/pkg/node/node.go index dafba4a9c..ea1a5641f 100644 --- a/p2p/pkg/node/node.go +++ b/p2p/pkg/node/node.go @@ -122,7 +122,6 @@ type Options struct { DefaultGasLimit uint64 DefaultGasTipCap *big.Int DefaultGasFeeCap *big.Int - OracleWindowOffset *big.Int BeaconAPIURL string L1RPCURL string LaggardMode *big.Int @@ -660,7 +659,6 @@ func NewNode(opts *Options) (*Node, error) { monitor, optsGetter, preconfStore, - opts.OracleWindowOffset, opts.BidderBidTimeout, opts.Logger.With("component", "bidderapi"), ) diff --git a/p2p/pkg/rpc/bidder/service.go b/p2p/pkg/rpc/bidder/service.go index f30d08f95..01d4ed313 100644 --- a/p2p/pkg/rpc/bidder/service.go +++ b/p2p/pkg/rpc/bidder/service.go @@ -32,7 +32,6 @@ type Service struct { watcher TxWatcher optsGetter OptsGetter cs CommitmentStore - oracleWindowOffset *big.Int logger *slog.Logger metrics *metrics validator *protovalidate.Validator @@ -49,7 +48,6 @@ func NewService( watcher TxWatcher, optsGetter OptsGetter, cs CommitmentStore, - oracleWindowOffset *big.Int, bidderBidTimeout time.Duration, logger *slog.Logger, ) *Service { @@ -64,7 +62,6 @@ func NewService( optsGetter: optsGetter, logger: logger, metrics: newMetrics(), - oracleWindowOffset: oracleWindowOffset, validator: validator, bidTimeout: bidderBidTimeout, } diff --git a/p2p/rpc/bidderapi/v1/bidderapi.proto b/p2p/rpc/bidderapi/v1/bidderapi.proto index 8383037af..d0b9d6d90 100644 --- a/p2p/rpc/bidderapi/v1/bidderapi.proto +++ b/p2p/rpc/bidderapi/v1/bidderapi.proto @@ -40,6 +40,13 @@ service Bidder { option (google.api.http) = {post: "/v1/bidder/deposit/{amount}"}; } + // DepositEvenly + // + // DepositEvenly is called by the bidder node to deposit a total amount evenly across multiple providers. + rpc DepositEvenly(DepositEvenlyRequest) returns (DepositEvenlyResponse) { + option (google.api.http) = {post: "/v1/bidder/deposit_evenly"}; + } + // RequestWithdrawals // // RequestWithdrawals is called by the bidder node to request withdrawals from provider(s) From 2ff98368e283edff8ac00750c49beea643214750 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 13 Aug 2025 00:30:34 -0700 Subject: [PATCH 053/117] Update service_test.go --- p2p/pkg/rpc/bidder/service_test.go | 313 +++++++++++++---------------- 1 file changed, 135 insertions(+), 178 deletions(-) diff --git a/p2p/pkg/rpc/bidder/service_test.go b/p2p/pkg/rpc/bidder/service_test.go index 34acdd62e..f607e6ac7 100644 --- a/p2p/pkg/rpc/bidder/service_test.go +++ b/p2p/pkg/rpc/bidder/service_test.go @@ -9,7 +9,6 @@ import ( "net" "os" "strings" - "sync" "testing" "time" @@ -21,15 +20,12 @@ import ( providerregistry "github.com/primev/mev-commit/contracts-abi/clients/ProviderRegistry" bidderapiv1 "github.com/primev/mev-commit/p2p/gen/go/bidderapi/v1" preconfpb "github.com/primev/mev-commit/p2p/gen/go/preconfirmation/v1" - autodepositorstore "github.com/primev/mev-commit/p2p/pkg/autodepositor/store" preconfstore "github.com/primev/mev-commit/p2p/pkg/preconfirmation/store" bidderapi "github.com/primev/mev-commit/p2p/pkg/rpc/bidder" - inmemstorage "github.com/primev/mev-commit/p2p/pkg/storage/inmem" "github.com/primev/mev-commit/x/util" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/test/bufconn" - "google.golang.org/protobuf/types/known/wrapperspb" ) const ( @@ -84,110 +80,103 @@ func (s *testSender) SendBid( } type testRegistryContract struct { - deposit *big.Int + deposit *big.Int + perAmount *big.Int + watcher *testTxWatcher } -func (t *testRegistryContract) DepositForWindow(opts *bind.TransactOpts, _ *big.Int) (*types.Transaction, error) { - t.deposit = opts.Value +func (t *testRegistryContract) DepositAsBidder(opts *bind.TransactOpts, _ common.Address) (*types.Transaction, error) { + if opts != nil && opts.Value != nil { + t.perAmount = new(big.Int).Set(opts.Value) + } + if t.watcher != nil { + t.watcher.logs = 1 + } return types.NewTransaction(1, common.Address{}, nil, 0, nil, nil), nil } -func (t *testRegistryContract) DepositForWindows(opts *bind.TransactOpts, _ []*big.Int) (*types.Transaction, error) { - t.deposit = opts.Value +func (t *testRegistryContract) DepositEvenlyAsBidder(opts *bind.TransactOpts, providers []common.Address) (*types.Transaction, error) { + if opts != nil && opts.Value != nil && len(providers) > 0 { + t.perAmount = new(big.Int).Div(new(big.Int).Set(opts.Value), big.NewInt(int64(len(providers)))) + } + if t.watcher != nil { + t.watcher.logs = len(providers) + } return types.NewTransaction(1, common.Address{}, nil, 0, nil, nil), nil } -func (t *testRegistryContract) WithdrawBidderAmountFromWindow( - opts *bind.TransactOpts, - address common.Address, - window *big.Int, -) (*types.Transaction, error) { - return types.NewTransaction(2, common.Address{}, nil, 0, nil, nil), nil -} - -func (t *testRegistryContract) GetDeposit(_ *bind.CallOpts, _ common.Address, _ *big.Int) (*big.Int, error) { - return t.deposit, nil -} - -func (t *testRegistryContract) ParseBidderRegistered(_ types.Log) (*bidderregistry.BidderregistryBidderRegistered, error) { - return &bidderregistry.BidderregistryBidderRegistered{ - DepositedAmount: t.deposit, - WindowNumber: big.NewInt(1), - }, nil -} - -func (t *testRegistryContract) ParseBidderWithdrawal(_ types.Log) (*bidderregistry.BidderregistryBidderWithdrawal, error) { - return &bidderregistry.BidderregistryBidderWithdrawal{ - Amount: t.deposit, - Window: big.NewInt(1), - }, nil -} - -func (t *testRegistryContract) WithdrawFromWindows(opts *bind.TransactOpts, windows []*big.Int) (*types.Transaction, error) { +func (t *testRegistryContract) RequestWithdrawalsAsBidder(_ *bind.TransactOpts, providers []common.Address) (*types.Transaction, error) { + if t.watcher != nil { + t.watcher.logs = len(providers) + } return types.NewTransaction(1, common.Address{}, nil, 0, nil, nil), nil } -type testAutoDepositTracker struct { - mtx sync.Mutex - deposits map[uint64]bool - isWorking bool +func (t *testRegistryContract) WithdrawAsBidder(_ *bind.TransactOpts, providers []common.Address) (*types.Transaction, error) { + if t.watcher != nil { + t.watcher.logs = len(providers) + } + return types.NewTransaction(1, common.Address{}, nil, 0, nil, nil), nil } -func (t *testAutoDepositTracker) Start(ctx context.Context, startWindow, amount *big.Int) error { - t.mtx.Lock() - defer t.mtx.Unlock() - - t.isWorking = true - t.deposits[startWindow.Uint64()] = true - t.deposits[big.NewInt(0).Add(startWindow, big.NewInt(1)).Uint64()] = true - return nil +func (t *testRegistryContract) GetDeposit(_ *bind.CallOpts, _ common.Address, _ common.Address) (*big.Int, error) { + return t.deposit, nil } -func (t *testAutoDepositTracker) IsWorking() bool { - t.mtx.Lock() - defer t.mtx.Unlock() - - return t.isWorking +func (t *testRegistryContract) ParseBidderDeposited(_ types.Log) (*bidderregistry.BidderregistryBidderDeposited, error) { + amt := t.perAmount + if amt == nil { + amt = t.deposit + } + return &bidderregistry.BidderregistryBidderDeposited{ + DepositedAmount: amt, + Bidder: common.Address{}, + Provider: common.Address{}, + }, nil } -func (t *testAutoDepositTracker) GetStatus() (map[uint64]bool, bool, *big.Int) { - t.mtx.Lock() - defer t.mtx.Unlock() - - return t.deposits, t.isWorking, big.NewInt(1) +func (t *testRegistryContract) ParseWithdrawalRequested(_ types.Log) (*bidderregistry.BidderregistryWithdrawalRequested, error) { + amt := t.perAmount + if amt == nil { + amt = t.deposit + } + return &bidderregistry.BidderregistryWithdrawalRequested{ + AvailableAmount: amt, + Provider: common.Address{}, + }, nil } -func (t *testAutoDepositTracker) Stop() ([]*big.Int, error) { - t.mtx.Lock() - defer t.mtx.Unlock() - - t.isWorking = false - var windowNumbers []*big.Int - for k := range t.deposits { - windowNumbers = append(windowNumbers, big.NewInt(int64(k))) - delete(t.deposits, k) +func (t *testRegistryContract) ParseBidderWithdrawal(_ types.Log) (*bidderregistry.BidderregistryBidderWithdrawal, error) { + amt := t.perAmount + if amt == nil { + amt = t.deposit } - return windowNumbers, nil + return &bidderregistry.BidderregistryBidderWithdrawal{ + AmountWithdrawn: amt, + Provider: common.Address{}, + }, nil } type testTxWatcher struct { - nonce int + logs int } func (t *testTxWatcher) WaitForReceipt(_ context.Context, tx *types.Transaction) (*types.Receipt, error) { - t.nonce++ - if tx.Nonce() != uint64(t.nonce) { - return nil, errors.New("nonce mismatch") + n := t.logs + if n <= 0 { + n = 1 + } + logs := make([]*types.Log, n) + for i := 0; i < n; i++ { + logs[i] = &types.Log{ + Address: common.Address{}, + Topics: []common.Hash{}, + Data: []byte{}, + } } return &types.Receipt{ Status: 1, - Logs: []*types.Log{ - { - Address: common.Address{}, - Topics: []common.Hash{}, - Data: []byte{}, - }, - }, + Logs: logs, }, nil } @@ -252,36 +241,31 @@ func startServerWithStore(t *testing.T, cs *testStore) bidderapiv1.BidderClient } owner := common.HexToAddress("0x00001") + watcher := &testTxWatcher{} registryContract := &testRegistryContract{ deposit: big.NewInt(1000000000000000000), + watcher: watcher, } providerRegistry := &testProviderRegistry{ claim: big.NewInt(1000000000000000000), } sender := &testSender{noOfPreconfs: 2} blockTrackerContract := &testBlockTrackerContract{lastBlockNumber: blocksPerWindow + 1, blocksPerWindow: blocksPerWindow, blockNumberToWinner: make(map[uint64]common.Address)} - testAutoDepositTracker := &testAutoDepositTracker{deposits: make(map[uint64]bool)} - oracleWindowOffset := big.NewInt(1) - store := autodepositorstore.New(inmemstorage.New()) srvImpl := bidderapi.NewService( owner, - blockTrackerContract.blocksPerWindow, sender, registryContract, blockTrackerContract, providerRegistry, validator, - &testTxWatcher{}, + watcher, func(ctx context.Context) (*bind.TransactOpts, error) { return &bind.TransactOpts{ From: owner, Context: ctx, }, nil }, - testAutoDepositTracker, - store, cs, - oracleWindowOffset, 15*time.Second, logger, ) @@ -331,29 +315,42 @@ func TestDepositHandling(t *testing.T) { t.Run("deposit", func(t *testing.T) { type testCase struct { - amount string - err string + amount string + provider string + err string } for _, tc := range []testCase{ { - amount: "", - err: "amount must be a valid integer", + amount: "", + provider: "0x9323e8B917ED544c26039A4D0Cccd8E3083e5647", + err: "amount must be a valid integer", + }, + { + amount: "0000000000000000000", + provider: "0x9323e8B917ED544c26039A4D0Cccd8E3083e5647", + err: "amount must be a valid integer", }, { - amount: "0000000000000000000", - err: "amount must be a valid integer", + amount: "asdf", + provider: "0x9323e8B917ED544c26039A4D0Cccd8E3083e5647", + err: "amount must be a valid integer", }, { - amount: "asdf", - err: "amount must be a valid integer", + amount: "1000000000000000000", + provider: "0x9323e8B917ED544c26039A4D0Cccd8E3083e5647", + err: "", }, { - amount: "1000000000000000000", - err: "", + amount: "1000000000000000000", + provider: "string", + err: "provider must be a valid Ethereum address", }, } { - deposit, err := client.Deposit(context.Background(), &bidderapiv1.DepositRequest{Amount: tc.amount}) + deposit, err := client.Deposit(context.Background(), &bidderapiv1.DepositRequest{ + Amount: tc.amount, + Provider: tc.provider, + }) if tc.err != "" { if err == nil || !strings.Contains(err.Error(), tc.err) { t.Fatalf("expected error depositing") @@ -370,7 +367,9 @@ func TestDepositHandling(t *testing.T) { }) t.Run("get deposit", func(t *testing.T) { - deposit, err := client.GetDeposit(context.Background(), &bidderapiv1.GetDepositRequest{WindowNumber: wrapperspb.UInt64(1)}) + deposit, err := client.GetDeposit(context.Background(), &bidderapiv1.GetDepositRequest{ + Provider: "0x353ff5537cc2fe78C8632c41Bb848735C2982c45", + }) if err != nil { t.Fatalf("error getting deposit: %v", err) } @@ -379,107 +378,65 @@ func TestDepositHandling(t *testing.T) { } }) - t.Run("withdraw", func(t *testing.T) { - resp, err := client.Withdraw(context.Background(), &bidderapiv1.WithdrawRequest{WindowNumber: wrapperspb.UInt64(1)}) + t.Run("deposit evenly", func(t *testing.T) { + deposit, err := client.DepositEvenly(context.Background(), &bidderapiv1.DepositEvenlyRequest{ + TotalAmount: "1000000000000000000", + Providers: []string{"0x8F644015Aa59984BF849259375d9135A89a940e7", "0x353ff5537cc2fe78C8632c41Bb848735C2982c45"}, + }) if err != nil { - t.Fatalf("error withdrawing: %v", err) + t.Fatalf("error depositing evenly: %v", err) } - - if resp.Amount != "1000000000000000000" { - t.Fatalf("expected amount to be 1000000000000000000, got %v", resp.Amount) + if len(deposit.Providers) != 2 { + t.Fatalf("expected 2 providers, got %v", len(deposit.Providers)) } - - if resp.WindowNumber.Value != 1 { - t.Fatalf("expected window number to be 1, got %v", resp.WindowNumber) + if deposit.Amounts[0] != "500000000000000000" { + t.Fatalf("expected amount to be 500000000000000000, got %v", deposit.Amounts[0]) + } + if deposit.Amounts[1] != "500000000000000000" { + t.Fatalf("expected amount to be 500000000000000000, got %v", deposit.Amounts[1]) } }) -} -func TestAutoDepositHandling(t *testing.T) { - t.Parallel() - - client := startServer(t) - - t.Run("autodeposit", func(t *testing.T) { - deposit, err := client.AutoDeposit(context.Background(), &bidderapiv1.DepositRequest{ - Amount: "1000000000000000000", - WindowNumber: wrapperspb.UInt64(1), + t.Run("request withdrawals", func(t *testing.T) { + resp, err := client.RequestWithdrawals(context.Background(), &bidderapiv1.RequestWithdrawalsRequest{ + Providers: []string{"0x8F644015Aa59984BF849259375d9135A89a940e7", "0x353ff5537cc2fe78C8632c41Bb848735C2982c45"}, }) if err != nil { - t.Fatalf("error depositing: %v", err) - } - if deposit.StartWindowNumber.Value != 1 { - t.Fatalf("expected start window number to be 1, got %v", deposit.StartWindowNumber) + t.Fatalf("error requesting withdrawals: %v", err) } - if deposit.AmountPerWindow != "1000000000000000000" { - t.Fatalf("expected amount per window to be 1000000000000000000, got %v", deposit.AmountPerWindow) - } - }) - - t.Run("get status", func(t *testing.T) { - status, err := client.AutoDepositStatus(context.Background(), &bidderapiv1.EmptyMessage{}) - if err != nil { - t.Fatalf("error getting deposit: %v", err) + if len(resp.Providers) != 2 { + t.Fatalf("expected 2 providers, got %v", len(resp.Providers)) } - if status.IsAutodepositEnabled != true { - t.Fatalf("expected is autodeposit enabled to be true, got %v", status.IsAutodepositEnabled) + if len(resp.Amounts) != 2 { + t.Fatalf("expected 2 amounts, got %v", len(resp.Amounts)) } - if len(status.WindowBalances) != 2 { - t.Fatalf("expected 2 deposits, got %v", len(status.WindowBalances)) + if resp.Amounts[0] != "500000000000000000" { + t.Fatalf("expected amount to be 500000000000000000, got %v", resp.Amounts[0]) } - for _, v := range status.WindowBalances { - if v.WindowNumber.Value != 1 && v.WindowNumber.Value != 2 { - t.Fatalf("unexpected window number, got %v", v.WindowNumber) - } - if v.DepositedAmount != "1000000000000000000" { - t.Fatalf("expected amount to be 1000000000000000000, got %v", v) - } - if v.WindowNumber.Value == 1 && v.StartBlockNumber.Value != 1 && v.EndBlockNumber.Value != blocksPerWindow && !v.IsCurrent { - t.Fatalf("expected correct values for window 1, got %v", v) - } - if v.WindowNumber.Value == 2 && v.StartBlockNumber.Value != blocksPerWindow+1 && v.EndBlockNumber.Value != blocksPerWindow*2 && v.IsCurrent { - t.Fatalf("expected correct values for window 2, got %v", v) - } + if resp.Amounts[1] != "500000000000000000" { + t.Fatalf("expected amount to be 500000000000000000, got %v", resp.Amounts[1]) } }) - t.Run("stop autodeposit", func(t *testing.T) { - resp, err := client.CancelAutoDeposit(context.Background(), &bidderapiv1.CancelAutoDepositRequest{ - Withdraw: true, + t.Run("withdraw", func(t *testing.T) { + resp, err := client.Withdraw(context.Background(), &bidderapiv1.WithdrawRequest{ + Providers: []string{"0x8F644015Aa59984BF849259375d9135A89a940e7", "0x353ff5537cc2fe78C8632c41Bb848735C2982c45"}, }) if err != nil { - t.Fatalf("error stopping autodeposit: %v", err) - } - if len(resp.WindowNumbers) != 0 { - t.Fatalf("expected 0 window numbers, got %v", len(resp.WindowNumbers)) + t.Fatalf("error withdrawing: %v", err) } - }) - t.Run("stop no withdraw", func(t *testing.T) { - _, err := client.AutoDeposit(context.Background(), &bidderapiv1.DepositRequest{ - WindowNumber: wrapperspb.UInt64(5), - Amount: "1000000000000000000", - }) - if err != nil { - t.Fatalf("error getting deposit: %v", err) + if len(resp.Providers) != 2 { + t.Fatalf("expected 2 providers, got %v", len(resp.Providers)) } - - resp, err := client.CancelAutoDeposit(context.Background(), &bidderapiv1.CancelAutoDepositRequest{}) - if err != nil { - t.Fatalf("error stopping autodeposit: %v", err) + if len(resp.Amounts) != 2 { + t.Fatalf("expected 2 amounts, got %v", len(resp.Amounts)) } - if len(resp.WindowNumbers) != 2 { - t.Fatalf("expected 2 window numbers, got %v", len(resp.WindowNumbers)) + if resp.Amounts[0] != "500000000000000000" { + t.Fatalf("expected amount to be 500000000000000000, got %v", resp.Amounts[0]) } - - windows := make([]*wrapperspb.UInt64Value, 2) - copy(windows, resp.WindowNumbers) - - _, err = client.WithdrawFromWindows(context.Background(), &bidderapiv1.WithdrawFromWindowsRequest{ - WindowNumbers: windows, - }) - if err != nil { - t.Fatalf("error withdrawing: %v", err) + if resp.Amounts[1] != "500000000000000000" { + t.Fatalf("expected amount to be 500000000000000000, got %v", resp.Amounts[1]) } }) } From 748f0cce223174fa126360c22f330c677605602f Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 13 Aug 2025 00:48:46 -0700 Subject: [PATCH 054/117] appease linter for deposit manager --- contracts/contracts/core/DepositManager.sol | 44 +++++++++++---------- contracts/test/core/BidderRegistryTest.sol | 2 +- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/contracts/contracts/core/DepositManager.sol b/contracts/contracts/core/DepositManager.sol index 72db37700..2d92dc0b8 100644 --- a/contracts/contracts/core/DepositManager.sol +++ b/contracts/contracts/core/DepositManager.sol @@ -6,10 +6,10 @@ import {Errors} from "../utils/Errors.sol"; contract DepositManager { + address public immutable BIDDER_REGISTRY; + uint256 public immutable MIN_BALANCE; + mapping(address => uint256) public targetDeposits; - address public immutable bidderRegistry; - uint256 public immutable minBalance; - error NotThisEOA(address msgSender, address thisAddress); event TargetDepositSet(address indexed provider, uint256 amount); event WithdrawalRequestExists(address indexed provider); @@ -19,16 +19,26 @@ contract DepositManager { event TopUpReduced(address indexed provider, uint256 available, uint256 needed); event DepositToppedUp(address indexed provider, uint256 amount); - constructor(address _registry, uint256 _minBalance) { - bidderRegistry = _registry; - minBalance = _minBalance; - } + error NotThisEOA(address msgSender, address thisAddress); modifier onlyThisEOA() { require(msg.sender == address(this), NotThisEOA(msg.sender, address(this))); _; } + constructor(address _registry, uint256 _minBalance) { + BIDDER_REGISTRY = _registry; + MIN_BALANCE = _minBalance; + } + + receive() external payable { + // Eth transfers allowed. + } + + fallback() external payable { + revert Errors.InvalidFallback(); + } + function setTargetDeposit(address provider, uint256 amount) external onlyThisEOA { targetDeposits[provider] = amount; emit TargetDepositSet(provider, amount); @@ -38,7 +48,7 @@ contract DepositManager { /// @param provider to top-up the deposit for. /// @dev This function will be called automatically by external addresses. function topUpDeposit(address provider) external { - if (IBidderRegistry(bidderRegistry).withdrawalRequestExists(address(this), provider)) { + if (IBidderRegistry(BIDDER_REGISTRY).withdrawalRequestExists(address(this), provider)) { emit WithdrawalRequestExists(provider); return; } @@ -49,7 +59,7 @@ contract DepositManager { return; } - uint256 currentDeposit = IBidderRegistry(bidderRegistry).getDeposit(address(this), provider); + uint256 currentDeposit = IBidderRegistry(BIDDER_REGISTRY).getDeposit(address(this), provider); if (currentDeposit >= target) { emit CurrentDepositIsSufficient(provider, currentDeposit, target); return; @@ -57,25 +67,17 @@ contract DepositManager { uint256 needed = target - currentDeposit; // No underflow/overflow, target must be greater than current deposit uint256 currentBalance = address(this).balance; - if (currentBalance <= minBalance) { - emit CurrentBalanceAtOrBelowMin(provider, currentBalance, minBalance); + if (currentBalance <= MIN_BALANCE) { + emit CurrentBalanceAtOrBelowMin(provider, currentBalance, MIN_BALANCE); return; } - uint256 available = currentBalance - minBalance; // No underflow/overflow, currentBalance must be greater than minBalance + uint256 available = currentBalance - MIN_BALANCE; // No underflow/overflow, currentBalance must be greater than minBalance if (available < needed) { emit TopUpReduced(provider, available, needed); needed = available; } - IBidderRegistry(bidderRegistry).depositAsBidder{value: needed}(provider); + IBidderRegistry(BIDDER_REGISTRY).depositAsBidder{value: needed}(provider); emit DepositToppedUp(provider, needed); } - - fallback() external payable { - revert Errors.InvalidFallback(); - } - - receive() external payable { - // Eth transfers allowed. - } } diff --git a/contracts/test/core/BidderRegistryTest.sol b/contracts/test/core/BidderRegistryTest.sol index d98e79f13..f41e9526b 100644 --- a/contracts/test/core/BidderRegistryTest.sol +++ b/contracts/test/core/BidderRegistryTest.sol @@ -733,7 +733,7 @@ contract BidderRegistryTest is Test { uint256 depositBefore = bidderRegistry.getDeposit(alice, bob); assertEq(depositBefore, 1.5 ether, "deposit should be 1.5 ether"); assertEq(alice.balance, 0.5 ether, "alice should have 0.5 ether"); - assertEq(DepositManager(payable(alice)).minBalance(), 0.01 ether); + assertEq(DepositManager(payable(alice)).MIN_BALANCE(), 0.01 ether); vm.expectEmit(true, true, true, true); emit DepositManager.TopUpReduced(bob, 0.49 ether, 1.5 ether); // available = 0.5 - minBalance From 626458aaea019f0128e57c14552e742c9f27c638 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 13 Aug 2025 01:02:42 -0700 Subject: [PATCH 055/117] abi+binding --- contracts-abi/abi/DepositManager.abi | 4 +- .../clients/DepositManager/DepositManager.go | 50 +++++++++---------- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/contracts-abi/abi/DepositManager.abi b/contracts-abi/abi/DepositManager.abi index 44f993a1a..5945a9351 100644 --- a/contracts-abi/abi/DepositManager.abi +++ b/contracts-abi/abi/DepositManager.abi @@ -25,7 +25,7 @@ }, { "type": "function", - "name": "bidderRegistry", + "name": "BIDDER_REGISTRY", "inputs": [], "outputs": [ { @@ -38,7 +38,7 @@ }, { "type": "function", - "name": "minBalance", + "name": "MIN_BALANCE", "inputs": [], "outputs": [ { diff --git a/contracts-abi/clients/DepositManager/DepositManager.go b/contracts-abi/clients/DepositManager/DepositManager.go index d4232b2ed..2f256ddda 100644 --- a/contracts-abi/clients/DepositManager/DepositManager.go +++ b/contracts-abi/clients/DepositManager/DepositManager.go @@ -31,7 +31,7 @@ var ( // DepositmanagerMetaData contains all meta data concerning the Depositmanager contract. var DepositmanagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_registry\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_minBalance\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"bidderRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minBalance\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setTargetDeposit\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"targetDeposits\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"topUpDeposit\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"CurrentBalanceAtOrBelowMin\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"currentBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"minBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CurrentDepositIsSufficient\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"currentDeposit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"targetDeposit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DepositToppedUp\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TargetDepositDoesNotExist\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TargetDepositSet\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TopUpReduced\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"available\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"needed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalRequestExists\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidFallback\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotThisEOA\",\"inputs\":[{\"name\":\"msgSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"thisAddress\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_registry\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_minBalance\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"BIDDER_REGISTRY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MIN_BALANCE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setTargetDeposit\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"targetDeposits\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"topUpDeposit\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"CurrentBalanceAtOrBelowMin\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"currentBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"minBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CurrentDepositIsSufficient\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"currentDeposit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"targetDeposit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DepositToppedUp\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TargetDepositDoesNotExist\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TargetDepositSet\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TopUpReduced\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"available\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"needed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalRequestExists\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidFallback\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotThisEOA\",\"inputs\":[{\"name\":\"msgSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"thisAddress\",\"type\":\"address\",\"internalType\":\"address\"}]}]", } // DepositmanagerABI is the input ABI used to generate the binding from. @@ -180,12 +180,12 @@ func (_Depositmanager *DepositmanagerTransactorRaw) Transact(opts *bind.Transact return _Depositmanager.Contract.contract.Transact(opts, method, params...) } -// BidderRegistry is a free data retrieval call binding the contract method 0x909e54e2. +// BIDDERREGISTRY is a free data retrieval call binding the contract method 0xbf524608. // -// Solidity: function bidderRegistry() view returns(address) -func (_Depositmanager *DepositmanagerCaller) BidderRegistry(opts *bind.CallOpts) (common.Address, error) { +// Solidity: function BIDDER_REGISTRY() view returns(address) +func (_Depositmanager *DepositmanagerCaller) BIDDERREGISTRY(opts *bind.CallOpts) (common.Address, error) { var out []interface{} - err := _Depositmanager.contract.Call(opts, &out, "bidderRegistry") + err := _Depositmanager.contract.Call(opts, &out, "BIDDER_REGISTRY") if err != nil { return *new(common.Address), err @@ -197,26 +197,26 @@ func (_Depositmanager *DepositmanagerCaller) BidderRegistry(opts *bind.CallOpts) } -// BidderRegistry is a free data retrieval call binding the contract method 0x909e54e2. +// BIDDERREGISTRY is a free data retrieval call binding the contract method 0xbf524608. // -// Solidity: function bidderRegistry() view returns(address) -func (_Depositmanager *DepositmanagerSession) BidderRegistry() (common.Address, error) { - return _Depositmanager.Contract.BidderRegistry(&_Depositmanager.CallOpts) +// Solidity: function BIDDER_REGISTRY() view returns(address) +func (_Depositmanager *DepositmanagerSession) BIDDERREGISTRY() (common.Address, error) { + return _Depositmanager.Contract.BIDDERREGISTRY(&_Depositmanager.CallOpts) } -// BidderRegistry is a free data retrieval call binding the contract method 0x909e54e2. +// BIDDERREGISTRY is a free data retrieval call binding the contract method 0xbf524608. // -// Solidity: function bidderRegistry() view returns(address) -func (_Depositmanager *DepositmanagerCallerSession) BidderRegistry() (common.Address, error) { - return _Depositmanager.Contract.BidderRegistry(&_Depositmanager.CallOpts) +// Solidity: function BIDDER_REGISTRY() view returns(address) +func (_Depositmanager *DepositmanagerCallerSession) BIDDERREGISTRY() (common.Address, error) { + return _Depositmanager.Contract.BIDDERREGISTRY(&_Depositmanager.CallOpts) } -// MinBalance is a free data retrieval call binding the contract method 0xc5bb8758. +// MINBALANCE is a free data retrieval call binding the contract method 0x867378c5. // -// Solidity: function minBalance() view returns(uint256) -func (_Depositmanager *DepositmanagerCaller) MinBalance(opts *bind.CallOpts) (*big.Int, error) { +// Solidity: function MIN_BALANCE() view returns(uint256) +func (_Depositmanager *DepositmanagerCaller) MINBALANCE(opts *bind.CallOpts) (*big.Int, error) { var out []interface{} - err := _Depositmanager.contract.Call(opts, &out, "minBalance") + err := _Depositmanager.contract.Call(opts, &out, "MIN_BALANCE") if err != nil { return *new(*big.Int), err @@ -228,18 +228,18 @@ func (_Depositmanager *DepositmanagerCaller) MinBalance(opts *bind.CallOpts) (*b } -// MinBalance is a free data retrieval call binding the contract method 0xc5bb8758. +// MINBALANCE is a free data retrieval call binding the contract method 0x867378c5. // -// Solidity: function minBalance() view returns(uint256) -func (_Depositmanager *DepositmanagerSession) MinBalance() (*big.Int, error) { - return _Depositmanager.Contract.MinBalance(&_Depositmanager.CallOpts) +// Solidity: function MIN_BALANCE() view returns(uint256) +func (_Depositmanager *DepositmanagerSession) MINBALANCE() (*big.Int, error) { + return _Depositmanager.Contract.MINBALANCE(&_Depositmanager.CallOpts) } -// MinBalance is a free data retrieval call binding the contract method 0xc5bb8758. +// MINBALANCE is a free data retrieval call binding the contract method 0x867378c5. // -// Solidity: function minBalance() view returns(uint256) -func (_Depositmanager *DepositmanagerCallerSession) MinBalance() (*big.Int, error) { - return _Depositmanager.Contract.MinBalance(&_Depositmanager.CallOpts) +// Solidity: function MIN_BALANCE() view returns(uint256) +func (_Depositmanager *DepositmanagerCallerSession) MINBALANCE() (*big.Int, error) { + return _Depositmanager.Contract.MINBALANCE(&_Depositmanager.CallOpts) } // TargetDeposits is a free data retrieval call binding the contract method 0x77936281. From 247721c075d6a54ff6a31e6140496adc4420d0a9 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 13 Aug 2025 18:07:49 -0700 Subject: [PATCH 056/117] introduce setcode helper --- p2p/pkg/node/node.go | 9 +++ p2p/pkg/rpc/bidder/service.go | 31 ++++++++++ p2p/pkg/setcode/setcode.go | 106 ++++++++++++++++++++++++++++++++++ 3 files changed, 146 insertions(+) create mode 100644 p2p/pkg/setcode/setcode.go diff --git a/p2p/pkg/node/node.go b/p2p/pkg/node/node.go index ea1a5641f..bd1649cfa 100644 --- a/p2p/pkg/node/node.go +++ b/p2p/pkg/node/node.go @@ -54,6 +54,7 @@ import ( notificationsapi "github.com/primev/mev-commit/p2p/pkg/rpc/notifications" providerapi "github.com/primev/mev-commit/p2p/pkg/rpc/provider" validatorapi "github.com/primev/mev-commit/p2p/pkg/rpc/validator" + "github.com/primev/mev-commit/p2p/pkg/setcode" "github.com/primev/mev-commit/p2p/pkg/signer" "github.com/primev/mev-commit/p2p/pkg/stakemanager" "github.com/primev/mev-commit/p2p/pkg/storage" @@ -649,6 +650,13 @@ func NewNode(opts *Options) (*Node, error) { srv.RegisterMetricsCollectors(preconfProto.Metrics()...) + setCodeHelper := setcode.NewSetCodeHelper( + opts.Logger.With("component", "setcode_helper"), + opts.KeySigner, + contractsBackend, + chainID, + ) + bidderAPI := bidderapi.NewService( opts.KeySigner.GetAddress(), preconfProto, @@ -661,6 +669,7 @@ func NewNode(opts *Options) (*Node, error) { preconfStore, opts.BidderBidTimeout, opts.Logger.With("component", "bidderapi"), + setCodeHelper, ) bidderapiv1.RegisterBidderServer(grpcServer, bidderAPI) diff --git a/p2p/pkg/rpc/bidder/service.go b/p2p/pkg/rpc/bidder/service.go index 01d4ed313..41d97261e 100644 --- a/p2p/pkg/rpc/bidder/service.go +++ b/p2p/pkg/rpc/bidder/service.go @@ -17,6 +17,7 @@ import ( bidderapiv1 "github.com/primev/mev-commit/p2p/gen/go/bidderapi/v1" preconfirmationv1 "github.com/primev/mev-commit/p2p/gen/go/preconfirmation/v1" preconfstore "github.com/primev/mev-commit/p2p/pkg/preconfirmation/store" + "github.com/primev/mev-commit/p2p/pkg/setcode" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "google.golang.org/protobuf/types/known/wrapperspb" @@ -36,6 +37,7 @@ type Service struct { metrics *metrics validator *protovalidate.Validator bidTimeout time.Duration + setCodeHelper *setcode.SetCodeHelper } func NewService( @@ -50,6 +52,7 @@ func NewService( cs CommitmentStore, bidderBidTimeout time.Duration, logger *slog.Logger, + setCodeHelper *setcode.SetCodeHelper, ) *Service { return &Service{ owner: owner, @@ -64,6 +67,7 @@ func NewService( metrics: newMetrics(), validator: validator, bidTimeout: bidderBidTimeout, + setCodeHelper: setCodeHelper, } } @@ -499,6 +503,33 @@ func (s *Service) Withdraw( return nil, status.Errorf(codes.Internal, "missing log for withdraw") } +func (s *Service) EnableAutoDeposit(ctx context.Context) error { + opts, err := s.optsGetter(ctx) + if err != nil { + s.logger.Error("getting transact opts", "error", err) + return status.Errorf(codes.Internal, "getting transact opts: %v", err) + } + + tx, err := s.setCodeHelper.SetCode(ctx, opts, s.owner) + if err != nil { + s.logger.Error("setting code", "error", err) + return status.Errorf(codes.Internal, "setting code: %v", err) + } + + receipt, err := s.watcher.WaitForReceipt(ctx, tx) + if err != nil { + s.logger.Error("waiting for receipt", "error", err) + return status.Errorf(codes.Internal, "waiting for receipt: %v", err) + } + + if receipt.Status != types.ReceiptStatusSuccessful { + s.logger.Error("receipt status", "status", receipt.Status) + return status.Errorf(codes.Internal, "receipt status: %v", receipt.Status) + } + + return nil +} + func (s *Service) ClaimSlashedFunds( ctx context.Context, _ *bidderapiv1.EmptyMessage, diff --git a/p2p/pkg/setcode/setcode.go b/p2p/pkg/setcode/setcode.go new file mode 100644 index 000000000..528d09a62 --- /dev/null +++ b/p2p/pkg/setcode/setcode.go @@ -0,0 +1,106 @@ +package setcode + +import ( + "context" + "fmt" + "log/slog" + "math/big" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/holiman/uint256" + "github.com/primev/mev-commit/x/keysigner" +) + +type SetCodeHelper struct { + logger *slog.Logger + signer keysigner.KeySigner + backend bind.ContractBackend + chainID *big.Int +} + +func NewSetCodeHelper( + logger *slog.Logger, + signer keysigner.KeySigner, + backend bind.ContractBackend, + chainID *big.Int, +) *SetCodeHelper { + return &SetCodeHelper{ + logger: logger, + signer: signer, + backend: backend, + chainID: chainID, + } +} + +func (s *SetCodeHelper) SetCode( + ctx context.Context, + opts *bind.TransactOpts, + to common.Address, +) (*types.Transaction, error) { + + if opts.GasTipCap == nil { + return nil, fmt.Errorf("gas tip cap is required") + } + if opts.GasFeeCap == nil { + return nil, fmt.Errorf("gas fee cap is required") + } + if opts.GasLimit == 0 { + return nil, fmt.Errorf("gas limit is required") + } + + // TODO: Create our own SetCodeAuthorization signing library compatible with KeySigner. + // For now we use geth's EIP-7702 library that only supports ecdsa.PrivateKey + pk, err := s.signer.GetPrivateKey() + if err != nil { + s.logger.Error("error getting private key from keysigner", "error", err) + return nil, err + } + defer s.signer.ZeroPrivateKey(pk) + + nonce, err := s.backend.PendingNonceAt(ctx, s.signer.GetAddress()) + if err != nil { + s.logger.Error("error getting pending nonce", "error", err) + return nil, err + } + + auth := types.SetCodeAuthorization{ + Address: to, + Nonce: nonce, + ChainID: *uint256.MustFromBig(s.chainID), + } + + signedAuth, err := types.SignSetCode(pk, auth) + if err != nil { + s.logger.Error("error signing set code authorization", "error", err) + return nil, err + } + + txdata := &types.SetCodeTx{ + ChainID: uint256.MustFromBig(s.chainID), + Nonce: nonce, + GasTipCap: uint256.MustFromBig(opts.GasTipCap), + GasFeeCap: uint256.MustFromBig(opts.GasFeeCap), + Gas: opts.GasLimit, + To: common.Address{}, + Value: uint256.NewInt(0), + Data: nil, + AccessList: nil, + AuthList: []types.SetCodeAuthorization{signedAuth}, + } + + signer := types.NewPragueSigner(s.chainID) + signedTx, err := types.SignNewTx(pk, signer, txdata) + if err != nil { + s.logger.Error("error signing transaction", "error", err) + return nil, err + } + err = s.backend.SendTransaction(ctx, signedTx) + if err != nil { + s.logger.Error("error sending transaction", "error", err) + return nil, err + } + + return signedTx, nil +} From 91fea0b379d39408c4897e0ab1ba214d32a663f8 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 13 Aug 2025 18:10:53 -0700 Subject: [PATCH 057/117] Update service_test.go --- p2p/pkg/rpc/bidder/service_test.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/p2p/pkg/rpc/bidder/service_test.go b/p2p/pkg/rpc/bidder/service_test.go index f607e6ac7..021f2f1d7 100644 --- a/p2p/pkg/rpc/bidder/service_test.go +++ b/p2p/pkg/rpc/bidder/service_test.go @@ -226,6 +226,13 @@ func (t *testStore) GetCommitments(blockNum int64) ([]*preconfstore.Commitment, return cmts, nil } +type testSetCodeHelper struct { +} + +func (t *testSetCodeHelper) SetCode(ctx context.Context, opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { + return types.NewTransaction(1, common.Address{}, nil, 0, nil, nil), nil +} + func startServer(t *testing.T) bidderapiv1.BidderClient { cs := &testStore{} return startServerWithStore(t, cs) @@ -251,6 +258,7 @@ func startServerWithStore(t *testing.T, cs *testStore) bidderapiv1.BidderClient } sender := &testSender{noOfPreconfs: 2} blockTrackerContract := &testBlockTrackerContract{lastBlockNumber: blocksPerWindow + 1, blocksPerWindow: blocksPerWindow, blockNumberToWinner: make(map[uint64]common.Address)} + setCodeHelper := &testSetCodeHelper{} srvImpl := bidderapi.NewService( owner, sender, @@ -268,6 +276,7 @@ func startServerWithStore(t *testing.T, cs *testStore) bidderapiv1.BidderClient cs, 15*time.Second, logger, + setCodeHelper, ) baseServer := grpc.NewServer() From 2ba894e57381dd34781c981f78af29543440d588 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 13 Aug 2025 19:36:48 -0700 Subject: [PATCH 058/117] fix setcode and add test --- p2p/pkg/rpc/bidder/service.go | 14 ++- p2p/pkg/setcode/setcode.go | 2 +- p2p/pkg/setcode/setcode_test.go | 176 ++++++++++++++++++++++++++++++++ 3 files changed, 188 insertions(+), 4 deletions(-) create mode 100644 p2p/pkg/setcode/setcode_test.go diff --git a/p2p/pkg/rpc/bidder/service.go b/p2p/pkg/rpc/bidder/service.go index 41d97261e..122a635a4 100644 --- a/p2p/pkg/rpc/bidder/service.go +++ b/p2p/pkg/rpc/bidder/service.go @@ -17,7 +17,6 @@ import ( bidderapiv1 "github.com/primev/mev-commit/p2p/gen/go/bidderapi/v1" preconfirmationv1 "github.com/primev/mev-commit/p2p/gen/go/preconfirmation/v1" preconfstore "github.com/primev/mev-commit/p2p/pkg/preconfirmation/store" - "github.com/primev/mev-commit/p2p/pkg/setcode" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "google.golang.org/protobuf/types/known/wrapperspb" @@ -37,7 +36,7 @@ type Service struct { metrics *metrics validator *protovalidate.Validator bidTimeout time.Duration - setCodeHelper *setcode.SetCodeHelper + setCodeHelper SetCodeHelper } func NewService( @@ -52,7 +51,7 @@ func NewService( cs CommitmentStore, bidderBidTimeout time.Duration, logger *slog.Logger, - setCodeHelper *setcode.SetCodeHelper, + setCodeHelper SetCodeHelper, ) *Service { return &Service{ owner: owner, @@ -105,6 +104,10 @@ type TxWatcher interface { WaitForReceipt(context.Context, *types.Transaction) (*types.Receipt, error) } +type SetCodeHelper interface { + SetCode(ctx context.Context, opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) +} + type OptsGetter func(context.Context) (*bind.TransactOpts, error) func (s *Service) SendBid( @@ -503,6 +506,9 @@ func (s *Service) Withdraw( return nil, status.Errorf(codes.Internal, "missing log for withdraw") } +// TODO: bring all the old apis back cause you figured it out here... +// make sure auto deposit api is EXACT same as before as drop-in + func (s *Service) EnableAutoDeposit(ctx context.Context) error { opts, err := s.optsGetter(ctx) if err != nil { @@ -530,6 +536,8 @@ func (s *Service) EnableAutoDeposit(ctx context.Context) error { return nil } +// TODO: api/handling for a bidder removing set code auth + func (s *Service) ClaimSlashedFunds( ctx context.Context, _ *bidderapiv1.EmptyMessage, diff --git a/p2p/pkg/setcode/setcode.go b/p2p/pkg/setcode/setcode.go index 528d09a62..f1874ca6f 100644 --- a/p2p/pkg/setcode/setcode.go +++ b/p2p/pkg/setcode/setcode.go @@ -67,7 +67,7 @@ func (s *SetCodeHelper) SetCode( auth := types.SetCodeAuthorization{ Address: to, - Nonce: nonce, + Nonce: nonce + 1, // Auth nonce should be 1 more than nonce for setcode tx ChainID: *uint256.MustFromBig(s.chainID), } diff --git a/p2p/pkg/setcode/setcode_test.go b/p2p/pkg/setcode/setcode_test.go new file mode 100644 index 000000000..fbcb7d8d0 --- /dev/null +++ b/p2p/pkg/setcode/setcode_test.go @@ -0,0 +1,176 @@ +package setcode_test + +import ( + "context" + "encoding/hex" + "fmt" + "io" + "log/slog" + "math/big" + "os" + "testing" + + "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/crypto" + "github.com/ethereum/go-ethereum/ethclient/simulated" + "github.com/primev/mev-commit/p2p/pkg/setcode" + "github.com/primev/mev-commit/x/keysigner" +) + +func TestSetCode(t *testing.T) { + + priv, err := crypto.GenerateKey() + if err != nil { + t.Fatalf("failed to generate key: %v", err) + } + ks, err := keysigner.NewPrivateKeySignerFromHex(hex.EncodeToString(crypto.FromECDSA(priv))) + if err != nil { + t.Fatalf("failed to create keysigner: %v", err) + } + sender := ks.GetAddress() + genesisAlloc := types.GenesisAlloc{ + sender: {Balance: big.NewInt(0).Mul(big.NewInt(1e18), big.NewInt(100))}, // 100 ETH + } + sim := simulated.NewBackend(genesisAlloc) + defer sim.Close() + + tx := types.NewTransaction(0, sender, big.NewInt(1e18), 21000, big.NewInt(1e9), nil) + tx, err = ks.SignTx(tx, big.NewInt(1337)) + if err != nil { + t.Fatalf("failed to sign tx: %v", err) + } + err = sim.Client().SendTransaction(context.Background(), tx) + if err != nil { + t.Fatalf("failed to send tx: %v", err) + } + nonce, err := sim.Client().PendingNonceAt(context.Background(), sender) + if err != nil { + t.Fatalf("failed to get pending nonce: %v", err) + } + if nonce != 1 { + t.Fatalf("nonce is not incremented: %v", nonce) + } + + _ = sim.Commit() + + code, err := sim.Client().CodeAt(context.Background(), sender, nil) + if err != nil { + t.Fatalf("failed to get code: %v", err) + } + if len(code) != 0 { + t.Fatalf("code is not empty before setcode: %v", code) + } + + contractAddr, err := deployMinimalContract( + context.Background(), + sim.Client(), + ks, + big.NewInt(1337), + ) + if err != nil { + t.Fatalf("failed to deploy minimal contract: %v", err) + } + + nonce, err = sim.Client().PendingNonceAt(context.Background(), sender) + if err != nil { + t.Fatalf("failed to get pending nonce: %v", err) + } + if nonce != 2 { + t.Fatalf("nonce is not incremented: %v", nonce) + } + + _ = sim.Commit() + + testLogger := newTestLogger(t, os.Stdout) + setCodeHelper := setcode.NewSetCodeHelper(testLogger, ks, sim.Client(), big.NewInt(1337)) + + opts, err := ks.GetAuth(big.NewInt(1337)) + if err != nil { + t.Fatalf("failed to get auth: %v", err) + } + opts.GasFeeCap = big.NewInt(1e9) + opts.GasTipCap = big.NewInt(1e9) + opts.GasLimit = 2000000 + + tx, err = setCodeHelper.SetCode(context.Background(), opts, contractAddr) + if err != nil { + t.Fatalf("failed to set code: %v", err) + } + + _ = sim.Commit() + + receipt, err := bind.WaitMined(context.Background(), sim.Client(), tx) + if err != nil { + t.Fatalf("failed to wait for receipt: %v", err) + } + + if receipt.Status != types.ReceiptStatusSuccessful { + t.Fatalf("tx failed: %v", receipt.Status) + } + + nonce, err = sim.Client().PendingNonceAt(context.Background(), sender) + if err != nil { + t.Fatalf("failed to get pending nonce: %v", err) + } + // Nonce incremented twice, the setcode tx and the auth itself + if nonce != 4 { + t.Fatalf("nonce is not incremented: %v", nonce) + } + + code, err = sim.Client().CodeAt(context.Background(), sender, nil) + if err != nil { + t.Fatalf("failed to get code: %v", err) + } + if len(code) == 0 { + t.Fatalf("code is empty") + } + + codehash := crypto.Keccak256Hash(code) + expectedCodehash := crypto.Keccak256Hash(common.FromHex("0xef0100"), contractAddr.Bytes()) + if codehash != expectedCodehash { + t.Fatalf("codehash is not correct. Actual: %v, Expected: %v", codehash, expectedCodehash) + } +} + +func newTestLogger(t *testing.T, w io.Writer) *slog.Logger { + t.Helper() + testLogger := slog.NewTextHandler(w, &slog.HandlerOptions{ + Level: slog.LevelDebug, + }) + return slog.New(testLogger) +} + +func deployMinimalContract( + ctx context.Context, + backend bind.ContractBackend, + ks keysigner.KeySigner, + chainID *big.Int, +) (common.Address, error) { + from := ks.GetAddress() + nonce, err := backend.PendingNonceAt(ctx, from) + if err != nil { + return common.Address{}, fmt.Errorf("get nonce: %w", err) + } + initcode := common.FromHex("0x6001600c60003960016000f300") + tx := types.NewTx(&types.DynamicFeeTx{ + ChainID: chainID, + Nonce: nonce, + GasTipCap: big.NewInt(1e9), + GasFeeCap: big.NewInt(1e9), + Gas: 200_000, + To: nil, + Value: big.NewInt(0), + Data: initcode, + }) + signed, err := ks.SignTx(tx, chainID) + if err != nil { + return common.Address{}, fmt.Errorf("sign tx: %w", err) + } + if err := backend.SendTransaction(ctx, signed); err != nil { + return common.Address{}, fmt.Errorf("send tx: %w", err) + } + contractAddr := crypto.CreateAddress(from, nonce) + return contractAddr, nil +} From d96827dac8a45e1658dbe77be39dd2c1cd949058 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 13 Aug 2025 23:10:02 -0700 Subject: [PATCH 059/117] add setTargetDeposits --- contracts-abi/abi/DepositManager.abi | 18 +++++++++++++++ .../clients/DepositManager/DepositManager.go | 23 ++++++++++++++++++- contracts/contracts/core/DepositManager.sol | 11 +++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/contracts-abi/abi/DepositManager.abi b/contracts-abi/abi/DepositManager.abi index 5945a9351..9f1b17a7e 100644 --- a/contracts-abi/abi/DepositManager.abi +++ b/contracts-abi/abi/DepositManager.abi @@ -67,6 +67,24 @@ "outputs": [], "stateMutability": "nonpayable" }, + { + "type": "function", + "name": "setTargetDeposits", + "inputs": [ + { + "name": "providers", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "amounts", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, { "type": "function", "name": "targetDeposits", diff --git a/contracts-abi/clients/DepositManager/DepositManager.go b/contracts-abi/clients/DepositManager/DepositManager.go index 2f256ddda..38fcc8baf 100644 --- a/contracts-abi/clients/DepositManager/DepositManager.go +++ b/contracts-abi/clients/DepositManager/DepositManager.go @@ -31,7 +31,7 @@ var ( // DepositmanagerMetaData contains all meta data concerning the Depositmanager contract. var DepositmanagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_registry\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_minBalance\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"BIDDER_REGISTRY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MIN_BALANCE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setTargetDeposit\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"targetDeposits\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"topUpDeposit\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"CurrentBalanceAtOrBelowMin\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"currentBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"minBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CurrentDepositIsSufficient\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"currentDeposit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"targetDeposit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DepositToppedUp\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TargetDepositDoesNotExist\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TargetDepositSet\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TopUpReduced\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"available\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"needed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalRequestExists\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidFallback\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotThisEOA\",\"inputs\":[{\"name\":\"msgSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"thisAddress\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_registry\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_minBalance\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"BIDDER_REGISTRY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MIN_BALANCE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setTargetDeposit\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setTargetDeposits\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"targetDeposits\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"topUpDeposit\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"CurrentBalanceAtOrBelowMin\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"currentBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"minBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CurrentDepositIsSufficient\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"currentDeposit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"targetDeposit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DepositToppedUp\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TargetDepositDoesNotExist\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TargetDepositSet\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TopUpReduced\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"available\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"needed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalRequestExists\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidFallback\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotThisEOA\",\"inputs\":[{\"name\":\"msgSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"thisAddress\",\"type\":\"address\",\"internalType\":\"address\"}]}]", } // DepositmanagerABI is the input ABI used to generate the binding from. @@ -294,6 +294,27 @@ func (_Depositmanager *DepositmanagerTransactorSession) SetTargetDeposit(provide return _Depositmanager.Contract.SetTargetDeposit(&_Depositmanager.TransactOpts, provider, amount) } +// SetTargetDeposits is a paid mutator transaction binding the contract method 0x5b79493e. +// +// Solidity: function setTargetDeposits(address[] providers, uint256[] amounts) returns() +func (_Depositmanager *DepositmanagerTransactor) SetTargetDeposits(opts *bind.TransactOpts, providers []common.Address, amounts []*big.Int) (*types.Transaction, error) { + return _Depositmanager.contract.Transact(opts, "setTargetDeposits", providers, amounts) +} + +// SetTargetDeposits is a paid mutator transaction binding the contract method 0x5b79493e. +// +// Solidity: function setTargetDeposits(address[] providers, uint256[] amounts) returns() +func (_Depositmanager *DepositmanagerSession) SetTargetDeposits(providers []common.Address, amounts []*big.Int) (*types.Transaction, error) { + return _Depositmanager.Contract.SetTargetDeposits(&_Depositmanager.TransactOpts, providers, amounts) +} + +// SetTargetDeposits is a paid mutator transaction binding the contract method 0x5b79493e. +// +// Solidity: function setTargetDeposits(address[] providers, uint256[] amounts) returns() +func (_Depositmanager *DepositmanagerTransactorSession) SetTargetDeposits(providers []common.Address, amounts []*big.Int) (*types.Transaction, error) { + return _Depositmanager.Contract.SetTargetDeposits(&_Depositmanager.TransactOpts, providers, amounts) +} + // TopUpDeposit is a paid mutator transaction binding the contract method 0xbe8c9cc0. // // Solidity: function topUpDeposit(address provider) returns() diff --git a/contracts/contracts/core/DepositManager.sol b/contracts/contracts/core/DepositManager.sol index 2d92dc0b8..db0aaf5e6 100644 --- a/contracts/contracts/core/DepositManager.sol +++ b/contracts/contracts/core/DepositManager.sol @@ -39,6 +39,17 @@ contract DepositManager { revert Errors.InvalidFallback(); } + function setTargetDeposits( + address[] calldata providers, + uint256[] calldata amounts + ) external onlyThisEOA { + uint256 length = providers.length; + for (uint256 i = 0; i < length; i++) { + targetDeposits[providers[i]] = amounts[i]; + emit TargetDepositSet(providers[i], amounts[i]); + } + } + function setTargetDeposit(address provider, uint256 amount) external onlyThisEOA { targetDeposits[provider] = amount; emit TargetDepositSet(provider, amount); From dbf99b013bc93d9e301823c7ac55544aaaa19877 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 13 Aug 2025 23:27:18 -0700 Subject: [PATCH 060/117] new deposit manager api --- p2p/cmd/main.go | 29 +- p2p/gen/go/bidderapi/v1/bidderapi.pb.go | 1736 +++++++++++------ p2p/gen/go/bidderapi/v1/bidderapi.pb.gw.go | 226 ++- p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go | 152 +- .../bidderapi/v1/bidderapi.swagger.yaml | 83 + p2p/pkg/node/node.go | 30 +- p2p/pkg/rpc/bidder/service.go | 113 +- p2p/rpc/bidderapi/v1/bidderapi.proto | 87 + 8 files changed, 1773 insertions(+), 683 deletions(-) diff --git a/p2p/cmd/main.go b/p2p/cmd/main.go index 4155191f1..c7fe8f0b4 100644 --- a/p2p/cmd/main.go +++ b/p2p/cmd/main.go @@ -297,23 +297,6 @@ var ( Category: categoryContracts, }) - // TODO: These flags will be reused when https://github.com/primev/mev-commit/issues is solved - - optionAutodepositAmount = altsrc.NewStringFlag(&cli.StringFlag{ - Name: "autodeposit-amount", - Usage: "Amount to auto deposit in each window in wei", - EnvVars: []string{"MEV_COMMIT_AUTODEPOSIT_AMOUNT"}, - Category: categoryBidder, - }) - - optionAutodepositEnabled = altsrc.NewBoolFlag(&cli.BoolFlag{ - Name: "autodeposit-enabled", - Usage: "Enable auto deposit", - EnvVars: []string{"MEV_COMMIT_AUTODEPOSIT_ENABLED"}, - Value: false, - Category: categoryBidder, - }) - optionSettlementRPCEndpoint = altsrc.NewStringFlag(&cli.StringFlag{ Name: "settlement-rpc-endpoint", Usage: "RPC endpoint of the settlement layer", @@ -504,8 +487,6 @@ func main() { optionBlockTrackerAddr, optionValidatorRouterAddr, optionOracleAddr, - optionAutodepositAmount, - optionAutodepositEnabled, optionSettlementRPCEndpoint, optionSettlementWSRPCEndpoint, optionNATAddr, @@ -603,15 +584,8 @@ func launchNodeWithConfig(c *cli.Context) (err error) { } var ( - autodepositAmount *big.Int - ok bool + ok bool ) - if c.String(optionAutodepositAmount.Name) != "" && c.Bool(optionAutodepositEnabled.Name) { - autodepositAmount, ok = new(big.Int).SetString(c.String(optionAutodepositAmount.Name), 10) - if !ok { - return fmt.Errorf("failed to parse autodeposit amount %q", c.String(optionAutodepositAmount.Name)) - } - } crtFile := c.String(optionServerTLSCert.Name) keyFile := c.String(optionServerTLSPrivateKey.Name) if (crtFile == "") != (keyFile == "") { @@ -690,7 +664,6 @@ func launchNodeWithConfig(c *cli.Context) (err error) { BlockTrackerContract: c.String(optionBlockTrackerAddr.Name), ValidatorRouterContract: c.String(optionValidatorRouterAddr.Name), OracleContract: c.String(optionOracleAddr.Name), - AutodepositAmount: autodepositAmount, RPCEndpoint: c.String(optionSettlementRPCEndpoint.Name), WSRPCEndpoint: c.String(optionSettlementWSRPCEndpoint.Name), NatAddr: natAddr, diff --git a/p2p/gen/go/bidderapi/v1/bidderapi.pb.go b/p2p/gen/go/bidderapi/v1/bidderapi.pb.go index 11e9cc899..3bf4113ec 100644 --- a/p2p/gen/go/bidderapi/v1/bidderapi.pb.go +++ b/p2p/gen/go/bidderapi/v1/bidderapi.pb.go @@ -244,6 +244,333 @@ func (x *DepositEvenlyResponse) GetAmounts() []string { return nil } +type EnableDepositManagerRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *EnableDepositManagerRequest) Reset() { + *x = EnableDepositManagerRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EnableDepositManagerRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnableDepositManagerRequest) ProtoMessage() {} + +func (x *EnableDepositManagerRequest) ProtoReflect() protoreflect.Message { + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EnableDepositManagerRequest.ProtoReflect.Descriptor instead. +func (*EnableDepositManagerRequest) Descriptor() ([]byte, []int) { + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{4} +} + +type EnableDepositManagerResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` +} + +func (x *EnableDepositManagerResponse) Reset() { + *x = EnableDepositManagerResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EnableDepositManagerResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnableDepositManagerResponse) ProtoMessage() {} + +func (x *EnableDepositManagerResponse) ProtoReflect() protoreflect.Message { + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EnableDepositManagerResponse.ProtoReflect.Descriptor instead. +func (*EnableDepositManagerResponse) Descriptor() ([]byte, []int) { + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{5} +} + +func (x *EnableDepositManagerResponse) GetSuccess() bool { + if x != nil { + return x.Success + } + return false +} + +type TargetDeposit struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Provider string `protobuf:"bytes,1,opt,name=provider,proto3" json:"provider,omitempty"` + TargetDeposit uint64 `protobuf:"varint,2,opt,name=target_deposit,json=targetDeposit,proto3" json:"target_deposit,omitempty"` +} + +func (x *TargetDeposit) Reset() { + *x = TargetDeposit{} + if protoimpl.UnsafeEnabled { + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TargetDeposit) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TargetDeposit) ProtoMessage() {} + +func (x *TargetDeposit) ProtoReflect() protoreflect.Message { + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TargetDeposit.ProtoReflect.Descriptor instead. +func (*TargetDeposit) Descriptor() ([]byte, []int) { + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{6} +} + +func (x *TargetDeposit) GetProvider() string { + if x != nil { + return x.Provider + } + return "" +} + +func (x *TargetDeposit) GetTargetDeposit() uint64 { + if x != nil { + return x.TargetDeposit + } + return 0 +} + +type SetTargetDepositsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TargetDeposits []*TargetDeposit `protobuf:"bytes,1,rep,name=target_deposits,json=targetDeposits,proto3" json:"target_deposits,omitempty"` +} + +func (x *SetTargetDepositsRequest) Reset() { + *x = SetTargetDepositsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SetTargetDepositsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetTargetDepositsRequest) ProtoMessage() {} + +func (x *SetTargetDepositsRequest) ProtoReflect() protoreflect.Message { + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SetTargetDepositsRequest.ProtoReflect.Descriptor instead. +func (*SetTargetDepositsRequest) Descriptor() ([]byte, []int) { + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{7} +} + +func (x *SetTargetDepositsRequest) GetTargetDeposits() []*TargetDeposit { + if x != nil { + return x.TargetDeposits + } + return nil +} + +type SetTargetDepositsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SuccessfullySetDeposits []*TargetDeposit `protobuf:"bytes,1,rep,name=successfully_set_deposits,json=successfullySetDeposits,proto3" json:"successfully_set_deposits,omitempty"` +} + +func (x *SetTargetDepositsResponse) Reset() { + *x = SetTargetDepositsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SetTargetDepositsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetTargetDepositsResponse) ProtoMessage() {} + +func (x *SetTargetDepositsResponse) ProtoReflect() protoreflect.Message { + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SetTargetDepositsResponse.ProtoReflect.Descriptor instead. +func (*SetTargetDepositsResponse) Descriptor() ([]byte, []int) { + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{8} +} + +func (x *SetTargetDepositsResponse) GetSuccessfullySetDeposits() []*TargetDeposit { + if x != nil { + return x.SuccessfullySetDeposits + } + return nil +} + +type DepositManagerStatusRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *DepositManagerStatusRequest) Reset() { + *x = DepositManagerStatusRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DepositManagerStatusRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DepositManagerStatusRequest) ProtoMessage() {} + +func (x *DepositManagerStatusRequest) ProtoReflect() protoreflect.Message { + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DepositManagerStatusRequest.ProtoReflect.Descriptor instead. +func (*DepositManagerStatusRequest) Descriptor() ([]byte, []int) { + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{9} +} + +type DepositManagerStatusResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` + TargetDeposits []*TargetDeposit `protobuf:"bytes,2,rep,name=target_deposits,json=targetDeposits,proto3" json:"target_deposits,omitempty"` +} + +func (x *DepositManagerStatusResponse) Reset() { + *x = DepositManagerStatusResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DepositManagerStatusResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DepositManagerStatusResponse) ProtoMessage() {} + +func (x *DepositManagerStatusResponse) ProtoReflect() protoreflect.Message { + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DepositManagerStatusResponse.ProtoReflect.Descriptor instead. +func (*DepositManagerStatusResponse) Descriptor() ([]byte, []int) { + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{10} +} + +func (x *DepositManagerStatusResponse) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *DepositManagerStatusResponse) GetTargetDeposits() []*TargetDeposit { + if x != nil { + return x.TargetDeposits + } + return nil +} + type EmptyMessage struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -253,7 +580,7 @@ type EmptyMessage struct { func (x *EmptyMessage) Reset() { *x = EmptyMessage{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[4] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -266,7 +593,7 @@ func (x *EmptyMessage) String() string { func (*EmptyMessage) ProtoMessage() {} func (x *EmptyMessage) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[4] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -279,7 +606,7 @@ func (x *EmptyMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use EmptyMessage.ProtoReflect.Descriptor instead. func (*EmptyMessage) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{4} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{11} } type GetDepositRequest struct { @@ -293,7 +620,7 @@ type GetDepositRequest struct { func (x *GetDepositRequest) Reset() { *x = GetDepositRequest{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[5] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -306,7 +633,7 @@ func (x *GetDepositRequest) String() string { func (*GetDepositRequest) ProtoMessage() {} func (x *GetDepositRequest) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[5] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -319,7 +646,7 @@ func (x *GetDepositRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetDepositRequest.ProtoReflect.Descriptor instead. func (*GetDepositRequest) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{5} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{12} } func (x *GetDepositRequest) GetProvider() string { @@ -340,7 +667,7 @@ type RequestWithdrawalsRequest struct { func (x *RequestWithdrawalsRequest) Reset() { *x = RequestWithdrawalsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[6] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -353,7 +680,7 @@ func (x *RequestWithdrawalsRequest) String() string { func (*RequestWithdrawalsRequest) ProtoMessage() {} func (x *RequestWithdrawalsRequest) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[6] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -366,7 +693,7 @@ func (x *RequestWithdrawalsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RequestWithdrawalsRequest.ProtoReflect.Descriptor instead. func (*RequestWithdrawalsRequest) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{6} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{13} } func (x *RequestWithdrawalsRequest) GetProviders() []string { @@ -388,7 +715,7 @@ type RequestWithdrawalsResponse struct { func (x *RequestWithdrawalsResponse) Reset() { *x = RequestWithdrawalsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[7] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -401,7 +728,7 @@ func (x *RequestWithdrawalsResponse) String() string { func (*RequestWithdrawalsResponse) ProtoMessage() {} func (x *RequestWithdrawalsResponse) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[7] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -414,7 +741,7 @@ func (x *RequestWithdrawalsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RequestWithdrawalsResponse.ProtoReflect.Descriptor instead. func (*RequestWithdrawalsResponse) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{7} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{14} } func (x *RequestWithdrawalsResponse) GetProviders() []string { @@ -442,7 +769,7 @@ type WithdrawRequest struct { func (x *WithdrawRequest) Reset() { *x = WithdrawRequest{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[8] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -455,7 +782,7 @@ func (x *WithdrawRequest) String() string { func (*WithdrawRequest) ProtoMessage() {} func (x *WithdrawRequest) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[8] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -468,7 +795,7 @@ func (x *WithdrawRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WithdrawRequest.ProtoReflect.Descriptor instead. func (*WithdrawRequest) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{8} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{15} } func (x *WithdrawRequest) GetProviders() []string { @@ -490,7 +817,7 @@ type WithdrawResponse struct { func (x *WithdrawResponse) Reset() { *x = WithdrawResponse{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[9] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -503,7 +830,7 @@ func (x *WithdrawResponse) String() string { func (*WithdrawResponse) ProtoMessage() {} func (x *WithdrawResponse) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[9] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -516,7 +843,7 @@ func (x *WithdrawResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WithdrawResponse.ProtoReflect.Descriptor instead. func (*WithdrawResponse) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{9} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{16} } func (x *WithdrawResponse) GetAmounts() []string { @@ -551,7 +878,7 @@ type Bid struct { func (x *Bid) Reset() { *x = Bid{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[10] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -564,7 +891,7 @@ func (x *Bid) String() string { func (*Bid) ProtoMessage() {} func (x *Bid) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[10] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -577,7 +904,7 @@ func (x *Bid) ProtoReflect() protoreflect.Message { // Deprecated: Use Bid.ProtoReflect.Descriptor instead. func (*Bid) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{10} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{17} } func (x *Bid) GetTxHashes() []string { @@ -659,7 +986,7 @@ type Commitment struct { func (x *Commitment) Reset() { *x = Commitment{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[11] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -672,7 +999,7 @@ func (x *Commitment) String() string { func (*Commitment) ProtoMessage() {} func (x *Commitment) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[11] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -685,7 +1012,7 @@ func (x *Commitment) ProtoReflect() protoreflect.Message { // Deprecated: Use Commitment.ProtoReflect.Descriptor instead. func (*Commitment) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{11} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{18} } func (x *Commitment) GetTxHashes() []string { @@ -792,7 +1119,7 @@ type GetBidInfoRequest struct { func (x *GetBidInfoRequest) Reset() { *x = GetBidInfoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[12] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -805,7 +1132,7 @@ func (x *GetBidInfoRequest) String() string { func (*GetBidInfoRequest) ProtoMessage() {} func (x *GetBidInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[12] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -818,7 +1145,7 @@ func (x *GetBidInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBidInfoRequest.ProtoReflect.Descriptor instead. func (*GetBidInfoRequest) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{12} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{19} } func (x *GetBidInfoRequest) GetBlockNumber() int64 { @@ -853,7 +1180,7 @@ type GetBidInfoResponse struct { func (x *GetBidInfoResponse) Reset() { *x = GetBidInfoResponse{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[13] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -866,7 +1193,7 @@ func (x *GetBidInfoResponse) String() string { func (*GetBidInfoResponse) ProtoMessage() {} func (x *GetBidInfoResponse) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[13] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -879,7 +1206,7 @@ func (x *GetBidInfoResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBidInfoResponse.ProtoReflect.Descriptor instead. func (*GetBidInfoResponse) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{13} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{20} } func (x *GetBidInfoResponse) GetBlockBidInfo() []*GetBidInfoResponse_BlockBidInfo { @@ -905,7 +1232,7 @@ type GetBidInfoResponse_CommitmentWithStatus struct { func (x *GetBidInfoResponse_CommitmentWithStatus) Reset() { *x = GetBidInfoResponse_CommitmentWithStatus{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[14] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -918,7 +1245,7 @@ func (x *GetBidInfoResponse_CommitmentWithStatus) String() string { func (*GetBidInfoResponse_CommitmentWithStatus) ProtoMessage() {} func (x *GetBidInfoResponse_CommitmentWithStatus) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[14] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -931,7 +1258,7 @@ func (x *GetBidInfoResponse_CommitmentWithStatus) ProtoReflect() protoreflect.Me // Deprecated: Use GetBidInfoResponse_CommitmentWithStatus.ProtoReflect.Descriptor instead. func (*GetBidInfoResponse_CommitmentWithStatus) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{13, 0} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{20, 0} } func (x *GetBidInfoResponse_CommitmentWithStatus) GetProviderAddress() string { @@ -995,7 +1322,7 @@ type GetBidInfoResponse_BidInfo struct { func (x *GetBidInfoResponse_BidInfo) Reset() { *x = GetBidInfoResponse_BidInfo{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[15] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1008,7 +1335,7 @@ func (x *GetBidInfoResponse_BidInfo) String() string { func (*GetBidInfoResponse_BidInfo) ProtoMessage() {} func (x *GetBidInfoResponse_BidInfo) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[15] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1021,7 +1348,7 @@ func (x *GetBidInfoResponse_BidInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBidInfoResponse_BidInfo.ProtoReflect.Descriptor instead. func (*GetBidInfoResponse_BidInfo) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{13, 1} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{20, 1} } func (x *GetBidInfoResponse_BidInfo) GetTxnHashes() []string { @@ -1099,7 +1426,7 @@ type GetBidInfoResponse_BlockBidInfo struct { func (x *GetBidInfoResponse_BlockBidInfo) Reset() { *x = GetBidInfoResponse_BlockBidInfo{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[16] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1112,7 +1439,7 @@ func (x *GetBidInfoResponse_BlockBidInfo) String() string { func (*GetBidInfoResponse_BlockBidInfo) ProtoMessage() {} func (x *GetBidInfoResponse_BlockBidInfo) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[16] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1125,7 +1452,7 @@ func (x *GetBidInfoResponse_BlockBidInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBidInfoResponse_BlockBidInfo.ProtoReflect.Descriptor instead. func (*GetBidInfoResponse_BlockBidInfo) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{13, 2} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{20, 2} } func (x *GetBidInfoResponse_BlockBidInfo) GetBlockNumber() int64 { @@ -1249,537 +1576,628 @@ var file_bidderapi_v1_bidderapi_proto_rawDesc = []byte{ 0x65, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x20, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, - 0x2e, 0x22, 0x0e, 0x0a, 0x0c, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x22, 0xb6, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0xa0, 0x01, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x83, 0x01, 0x92, 0x41, 0x1c, - 0x32, 0x1a, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, - 0x65, 0x75, 0x6d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0xba, 0x48, 0x61, 0xba, - 0x01, 0x5e, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x2a, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, - 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x20, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x1a, 0x26, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, 0x61, - 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x34, 0x30, 0x7d, 0x24, 0x27, 0x29, - 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0xa3, 0x02, 0x0a, 0x19, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0xbb, 0x01, 0x0a, 0x09, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x9c, 0x01, 0x92, - 0x41, 0x1e, 0x32, 0x1c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x45, 0x74, 0x68, - 0x65, 0x72, 0x65, 0x75, 0x6d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2e, - 0xba, 0x48, 0x78, 0xba, 0x01, 0x75, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x73, 0x12, 0x36, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x20, 0x6d, 0x75, 0x73, - 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72, 0x72, - 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x20, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2e, 0x1a, 0x30, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, - 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, - 0x2d, 0x39, 0x5d, 0x7b, 0x34, 0x30, 0x7d, 0x24, 0x27, 0x29, 0x29, 0x52, 0x09, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x3a, 0x48, 0x92, 0x41, 0x45, 0x0a, 0x43, 0x2a, 0x1a, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, - 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0x25, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x2e, 0x22, 0x61, 0x0a, 0x1b, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x3a, 0x42, 0x92, 0x41, 0x3f, 0x0a, 0x3d, 0x2a, 0x1c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x44, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0x1d, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x22, 0x7e, 0x0a, 0x1c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x3a, 0x44, + 0x92, 0x41, 0x41, 0x0a, 0x3f, 0x2a, 0x1d, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x1e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x2e, 0x22, 0x52, 0x0a, 0x0d, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x22, 0xb6, 0x01, 0x0a, 0x18, 0x53, 0x65, 0x74, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x44, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, + 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x0e, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x3a, 0x54, 0x92, 0x41, 0x51, + 0x0a, 0x4f, 0x2a, 0x25, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0x26, 0x4f, 0x76, 0x65, 0x72, 0x72, + 0x69, 0x64, 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x22, 0xce, 0x01, 0x0a, 0x19, 0x53, 0x65, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x57, 0x0a, 0x19, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x5f, + 0x73, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, + 0x17, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x53, 0x65, 0x74, + 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x3a, 0x58, 0x92, 0x41, 0x55, 0x0a, 0x53, 0x2a, + 0x27, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x28, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, + 0x64, 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x2e, 0x22, 0x61, 0x0a, 0x1b, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x3a, 0x42, 0x92, 0x41, 0x3f, 0x0a, 0x3d, 0x2a, 0x1c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0x1d, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x22, 0xc4, 0x01, 0x0a, 0x1c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x12, 0x44, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x62, 0x69, 0x64, 0x64, + 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x3a, 0x44, 0x92, 0x41, 0x41, 0x0a, 0x3f, 0x2a, 0x1d, 0x44, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x1e, 0x44, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x22, 0x0e, 0x0a, 0x0c, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xb6, 0x01, 0x0a, + 0x11, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0xa0, 0x01, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x83, 0x01, 0x92, 0x41, 0x1c, 0x32, 0x1a, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x20, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0xba, 0x48, 0x61, 0xba, 0x01, 0x5e, 0x0a, 0x08, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x2a, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x2e, 0x1a, 0x26, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, + 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, + 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x34, 0x30, 0x7d, 0x24, 0x27, 0x29, 0x52, 0x08, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0xa3, 0x02, 0x0a, 0x19, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0xbb, 0x01, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x9c, 0x01, 0x92, 0x41, 0x1e, 0x32, 0x1c, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, + 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2e, 0xba, 0x48, 0x78, 0xba, 0x01, + 0x75, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x36, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, + 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, + 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x65, 0x73, 0x2e, 0x1a, 0x30, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, + 0x2c, 0x20, 0x72, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, + 0x78, 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x34, + 0x30, 0x7d, 0x24, 0x27, 0x29, 0x29, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x73, 0x3a, 0x48, 0x92, 0x41, 0x45, 0x0a, 0x43, 0x2a, 0x1a, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x20, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x32, 0x25, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x77, 0x69, + 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x28, 0x73, 0x29, 0x2e, 0x22, 0x85, 0x02, 0x0a, 0x1a, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, + 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x3a, 0xae, 0x01, 0x92, 0x41, 0xaa, 0x01, 0x0a, 0xa7, 0x01, 0x2a, 0x1b, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, + 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x25, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x28, 0x73, 0x29, 0x2e, - 0x22, 0x85, 0x02, 0x0a, 0x1a, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, - 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x18, 0x0a, - 0x07, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, - 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x3a, 0xae, 0x01, 0x92, 0x41, 0xaa, 0x01, 0x0a, 0xa7, - 0x01, 0x2a, 0x1b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, - 0x61, 0x77, 0x61, 0x6c, 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x25, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, - 0x61, 0x6c, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x28, 0x73, 0x29, 0x2e, 0x4a, 0x61, 0x7b, 0x22, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x30, 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x4a, 0x61, 0x7b, 0x22, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, + 0x5b, 0x22, 0x30, 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x5d, 0x2c, 0x20, + 0x22, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x22, 0x5d, 0x2c, 0x20, 0x22, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x22, 0x3a, 0x20, - 0x5b, 0x22, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x5d, 0x7d, 0x22, 0x8d, 0x02, 0x0a, 0x0f, 0x57, 0x69, 0x74, - 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0xbb, 0x01, 0x0a, - 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x42, 0x9c, 0x01, 0x92, 0x41, 0x1e, 0x32, 0x1c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x65, 0x73, 0x2e, 0xba, 0x48, 0x78, 0xba, 0x01, 0x75, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x36, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, - 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, - 0x75, 0x6d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2e, 0x1a, 0x30, 0x74, - 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, 0x2e, 0x6d, 0x61, 0x74, - 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, - 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x34, 0x30, 0x7d, 0x24, 0x27, 0x29, 0x29, 0x52, - 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x3a, 0x3c, 0x92, 0x41, 0x39, 0x0a, - 0x37, 0x2a, 0x10, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x20, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x32, 0x23, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x20, 0x64, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x28, 0x73, 0x29, 0x2e, 0x22, 0xf6, 0x01, 0x0a, 0x10, 0x57, 0x69, 0x74, - 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, - 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x73, 0x3a, 0xa9, 0x01, 0x92, 0x41, 0xa5, 0x01, 0x0a, 0x40, 0x2a, 0x11, - 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x32, 0x2b, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x6e, 0x20, 0x64, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, - 0x64, 0x64, 0x65, 0x72, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0x32, 0x61, - 0x7b, 0x22, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x31, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x22, 0x5d, 0x2c, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x22, - 0x3a, 0x20, 0x5b, 0x22, 0x30, 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x22, 0x5d, 0x7d, 0x22, 0x8d, 0x02, 0x0a, 0x0f, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0xbb, 0x01, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x9c, 0x01, 0x92, 0x41, + 0x1e, 0x32, 0x1c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x45, 0x74, 0x68, 0x65, + 0x72, 0x65, 0x75, 0x6d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2e, 0xba, + 0x48, 0x78, 0xba, 0x01, 0x75, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, + 0x12, 0x36, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, + 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72, 0x72, 0x61, + 0x79, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x20, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2e, 0x1a, 0x30, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, + 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, + 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, + 0x39, 0x5d, 0x7b, 0x34, 0x30, 0x7d, 0x24, 0x27, 0x29, 0x29, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x73, 0x3a, 0x3c, 0x92, 0x41, 0x39, 0x0a, 0x37, 0x2a, 0x10, 0x57, 0x69, + 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0x23, + 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x20, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x28, + 0x73, 0x29, 0x2e, 0x22, 0xf6, 0x01, 0x0a, 0x10, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, + 0x3a, 0xa9, 0x01, 0x92, 0x41, 0xa5, 0x01, 0x0a, 0x40, 0x2a, 0x11, 0x57, 0x69, 0x74, 0x68, 0x64, + 0x72, 0x61, 0x77, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x2b, 0x57, 0x69, + 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x6e, 0x20, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, + 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0x32, 0x61, 0x7b, 0x22, 0x61, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x5d, 0x2c, 0x20, + 0x22, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x30, + 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x5d, - 0x7d, 0x22, 0xf2, 0x13, 0x0a, 0x03, 0x42, 0x69, 0x64, 0x12, 0x94, 0x02, 0x0a, 0x09, 0x74, 0x78, - 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0xf6, 0x01, - 0x92, 0x41, 0x78, 0x32, 0x64, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, - 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, - 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, 0x0f, 0x5b, 0x61, 0x2d, 0x66, - 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0xba, 0x48, 0x78, 0xba, 0x01, - 0x75, 0x0a, 0x09, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x36, 0x74, 0x78, - 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, - 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, - 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x61, 0x73, - 0x68, 0x65, 0x73, 0x2e, 0x1a, 0x30, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, - 0x2c, 0x20, 0x72, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, - 0x78, 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, - 0x34, 0x7d, 0x24, 0x27, 0x29, 0x29, 0x52, 0x08, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, - 0x12, 0xe0, 0x01, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x42, 0xc7, 0x01, 0x92, 0x41, 0x76, 0x32, 0x6b, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, - 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x69, 0x6e, - 0x67, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x61, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0xba, 0x48, 0x4b, - 0xba, 0x01, 0x48, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1f, 0x61, 0x6d, 0x6f, - 0x75, 0x6e, 0x74, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x1d, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x5b, 0x31, 0x2d, - 0x39, 0x5d, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2a, 0x24, 0x27, 0x29, 0x52, 0x06, 0x61, 0x6d, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0xb9, 0x01, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x95, 0x01, 0x92, 0x41, 0x47, - 0x32, 0x45, 0x4d, 0x61, 0x78, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, - 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x2e, 0xba, 0x48, 0x48, 0xba, 0x01, 0x45, 0x0a, 0x0c, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x25, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, - 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, - 0x72, 0x2e, 0x1a, 0x0e, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, - 0x20, 0x30, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, - 0xc2, 0x01, 0x0a, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x42, - 0x8d, 0x01, 0x92, 0x41, 0x2d, 0x32, 0x2b, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, - 0x64, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, - 0x67, 0x2e, 0xba, 0x48, 0x5a, 0xba, 0x01, 0x57, 0x0a, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, - 0x2e, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, - 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, - 0x0e, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x52, - 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x12, 0xb8, 0x01, 0x0a, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, - 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x03, 0x42, 0x87, 0x01, 0x92, 0x41, 0x2b, 0x32, 0x29, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x62, 0x69, 0x64, 0x20, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, - 0x6e, 0x67, 0x2e, 0xba, 0x48, 0x56, 0xba, 0x01, 0x53, 0x0a, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, - 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2c, - 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x0e, 0x75, 0x69, - 0x6e, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x52, 0x11, 0x64, 0x65, - 0x63, 0x61, 0x79, 0x45, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, - 0x8f, 0x02, 0x0a, 0x13, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, - 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x42, 0xde, 0x01, - 0x92, 0x41, 0x49, 0x32, 0x47, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x72, - 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x78, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, - 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, - 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x62, - 0x65, 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x65, 0x64, 0x2e, 0xba, 0x48, 0x8e, 0x01, - 0xba, 0x01, 0x8a, 0x01, 0x0a, 0x13, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, - 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x41, 0x72, 0x65, 0x76, 0x65, 0x72, - 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x6d, - 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, - 0x6f, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x2e, 0x1a, 0x30, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, 0x2e, 0x6d, 0x61, 0x74, 0x63, - 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, - 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x24, 0x27, 0x29, 0x29, 0x52, 0x11, - 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, - 0x73, 0x12, 0xa3, 0x02, 0x0a, 0x10, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x42, 0xf7, 0x01, 0x92, - 0x41, 0x6e, 0x32, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x72, - 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x52, 0x4c, 0x50, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x64, 0x20, 0x72, 0x61, 0x77, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, - 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, - 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, - 0xba, 0x48, 0x82, 0x01, 0xba, 0x01, 0x7f, 0x0a, 0x10, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x72, 0x61, 0x77, 0x5f, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, - 0x20, 0x62, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x72, 0x61, 0x77, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x1a, 0x2d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x5d, 0x7d, 0x22, 0xf2, 0x13, 0x0a, + 0x03, 0x42, 0x69, 0x64, 0x12, 0x94, 0x02, 0x0a, 0x09, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0xf6, 0x01, 0x92, 0x41, 0x78, 0x32, 0x64, + 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, + 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, + 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, 0x0f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, + 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0xba, 0x48, 0x78, 0xba, 0x01, 0x75, 0x0a, 0x09, 0x74, 0x78, + 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x36, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, + 0x65, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x2e, 0x1a, + 0x30, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, 0x2e, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, 0x61, + 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x24, 0x27, 0x29, + 0x29, 0x52, 0x08, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0xe0, 0x01, 0x0a, 0x06, + 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0xc7, 0x01, 0x92, + 0x41, 0x76, 0x32, 0x6b, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, + 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, + 0x72, 0x20, 0x69, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, + 0x70, 0x61, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, + 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x8a, + 0x01, 0x06, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0xba, 0x48, 0x4b, 0xba, 0x01, 0x48, 0x0a, 0x06, + 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6d, + 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x1d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x5b, 0x31, 0x2d, 0x39, 0x5d, 0x5b, 0x30, 0x2d, + 0x39, 0x5d, 0x2a, 0x24, 0x27, 0x29, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0xb9, + 0x01, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x95, 0x01, 0x92, 0x41, 0x47, 0x32, 0x45, 0x4d, 0x61, 0x78, + 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, + 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, + 0x6e, 0x2e, 0xba, 0x48, 0x48, 0xba, 0x01, 0x45, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x25, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x0e, 0x75, + 0x69, 0x6e, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x52, 0x0b, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0xc2, 0x01, 0x0a, 0x15, 0x64, + 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x42, 0x8d, 0x01, 0x92, 0x41, 0x2d, + 0x32, 0x2b, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, + 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0xba, 0x48, 0x5a, + 0xba, 0x01, 0x57, 0x0a, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2e, 0x64, 0x65, 0x63, 0x61, + 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x0e, 0x75, 0x69, 0x6e, 0x74, + 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x52, 0x13, 0x64, 0x65, 0x63, 0x61, + 0x79, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, + 0xb8, 0x01, 0x0a, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x42, 0x87, 0x01, + 0x92, 0x41, 0x2b, 0x32, 0x29, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, + 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, + 0x65, 0x6e, 0x64, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0xba, 0x48, + 0x56, 0xba, 0x01, 0x53, 0x0a, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2c, 0x64, 0x65, 0x63, 0x61, 0x79, + 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x6d, + 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x0e, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x52, 0x11, 0x64, 0x65, 0x63, 0x61, 0x79, 0x45, 0x6e, + 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x8f, 0x02, 0x0a, 0x13, 0x72, + 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, + 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x42, 0xde, 0x01, 0x92, 0x41, 0x49, 0x32, 0x47, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x78, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, + 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x62, 0x65, 0x20, 0x64, 0x69, 0x73, + 0x63, 0x61, 0x72, 0x64, 0x65, 0x64, 0x2e, 0xba, 0x48, 0x8e, 0x01, 0xba, 0x01, 0x8a, 0x01, 0x0a, + 0x13, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, + 0x73, 0x68, 0x65, 0x73, 0x12, 0x41, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, + 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, + 0x65, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x2e, 0x1a, 0x30, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, - 0x5d, 0x2a, 0x24, 0x27, 0x29, 0x29, 0x52, 0x0f, 0x72, 0x61, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xbf, 0x02, 0x0a, 0x0c, 0x73, 0x6c, 0x61, 0x73, - 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x9b, - 0x02, 0x92, 0x41, 0x9f, 0x01, 0x32, 0x93, 0x01, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, - 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, - 0x62, 0x65, 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x69, 0x66, 0x20, - 0x74, 0x68, 0x65, 0x79, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x2c, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x65, 0x64, 0x20, 0x62, 0x69, 0x64, 0x20, 0x61, - 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x2e, 0x8a, 0x01, 0x06, 0x5b, 0x30, - 0x2d, 0x39, 0x5d, 0x2b, 0xba, 0x48, 0x75, 0xba, 0x01, 0x72, 0x0a, 0x0c, 0x73, 0x6c, 0x61, 0x73, - 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, - 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, - 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, - 0x3b, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x27, 0x20, 0x7c, 0x7c, 0x20, 0x28, - 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x5b, - 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x24, 0x27, 0x29, 0x20, 0x26, 0x26, 0x20, 0x75, 0x69, 0x6e, 0x74, - 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x3d, 0x20, 0x30, 0x29, 0x52, 0x0b, 0x73, 0x6c, - 0x61, 0x73, 0x68, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0xba, 0x04, 0x92, 0x41, 0xb6, 0x04, - 0x0a, 0x95, 0x01, 0x2a, 0x0b, 0x42, 0x69, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x32, 0x40, 0x55, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x69, 0x64, 0x20, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x62, 0x69, 0x64, 0x64, - 0x65, 0x72, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, - 0x72, 0x20, 0x6d, 0x65, 0x76, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x20, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0xd2, 0x01, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0xd2, 0x01, 0x0c, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0xd2, 0x01, 0x15, 0x64, 0x65, 0x63, - 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0xd2, 0x01, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x32, 0x9b, 0x03, 0x7b, 0x22, 0x74, 0x78, 0x5f, - 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x66, 0x65, 0x34, 0x63, 0x62, - 0x34, 0x37, 0x64, 0x62, 0x33, 0x36, 0x33, 0x30, 0x35, 0x35, 0x31, 0x62, 0x65, 0x65, 0x64, 0x66, - 0x62, 0x64, 0x30, 0x32, 0x61, 0x37, 0x31, 0x65, 0x63, 0x63, 0x36, 0x39, 0x66, 0x64, 0x35, 0x39, - 0x37, 0x35, 0x38, 0x65, 0x32, 0x62, 0x61, 0x36, 0x39, 0x39, 0x36, 0x30, 0x36, 0x65, 0x32, 0x64, - 0x35, 0x63, 0x37, 0x34, 0x32, 0x38, 0x34, 0x66, 0x66, 0x61, 0x37, 0x22, 0x2c, 0x20, 0x22, 0x37, - 0x31, 0x63, 0x31, 0x33, 0x34, 0x38, 0x66, 0x32, 0x64, 0x37, 0x66, 0x66, 0x37, 0x65, 0x38, 0x31, - 0x34, 0x66, 0x39, 0x63, 0x33, 0x36, 0x31, 0x37, 0x39, 0x38, 0x33, 0x37, 0x30, 0x33, 0x34, 0x33, - 0x35, 0x65, 0x61, 0x37, 0x34, 0x34, 0x36, 0x64, 0x65, 0x34, 0x32, 0x30, 0x61, 0x65, 0x61, 0x63, - 0x34, 0x38, 0x38, 0x62, 0x66, 0x31, 0x64, 0x65, 0x33, 0x35, 0x37, 0x33, 0x37, 0x65, 0x38, 0x22, - 0x5d, 0x2c, 0x20, 0x22, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x31, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x22, 0x3a, 0x20, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x63, - 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x22, 0x3a, 0x20, 0x31, 0x36, 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x2c, - 0x20, 0x22, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3a, 0x20, 0x31, 0x36, 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x2c, 0x20, 0x22, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, - 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x66, 0x65, 0x34, - 0x63, 0x62, 0x34, 0x37, 0x64, 0x62, 0x33, 0x36, 0x33, 0x30, 0x35, 0x35, 0x31, 0x62, 0x65, 0x65, - 0x64, 0x66, 0x62, 0x64, 0x30, 0x32, 0x61, 0x37, 0x31, 0x65, 0x63, 0x63, 0x36, 0x39, 0x66, 0x64, - 0x35, 0x39, 0x37, 0x35, 0x38, 0x65, 0x32, 0x62, 0x61, 0x36, 0x39, 0x39, 0x36, 0x30, 0x36, 0x65, - 0x32, 0x64, 0x35, 0x63, 0x37, 0x34, 0x32, 0x38, 0x34, 0x66, 0x66, 0x61, 0x37, 0x22, 0x5d, 0x2c, - 0x20, 0x22, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3a, - 0x20, 0x22, 0x35, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x22, 0x7d, 0x22, 0xc2, 0x0d, 0x0a, 0x0a, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x95, 0x01, 0x0a, 0x09, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, - 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x78, 0x92, 0x41, 0x75, 0x32, 0x61, - 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, - 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x61, 0x73, 0x68, 0x20, - 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, - 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x2e, 0x8a, 0x01, 0x0f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, - 0x36, 0x34, 0x7d, 0x52, 0x08, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x8f, 0x01, - 0x0a, 0x0a, 0x62, 0x69, 0x64, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x70, 0x92, 0x41, 0x6d, 0x32, 0x6b, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, - 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, 0x61, 0x67, 0x72, 0x65, 0x65, - 0x64, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x61, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x2e, 0x52, 0x09, 0x62, 0x69, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x6d, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x4a, 0x92, 0x41, 0x47, 0x32, 0x45, 0x4d, 0x61, 0x78, 0x20, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, + 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x24, 0x27, 0x29, 0x29, 0x52, 0x11, 0x72, 0x65, 0x76, 0x65, 0x72, + 0x74, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0xa3, 0x02, 0x0a, + 0x10, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x42, 0xf7, 0x01, 0x92, 0x41, 0x6e, 0x32, 0x6c, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, + 0x20, 0x52, 0x4c, 0x50, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x20, 0x72, 0x61, 0x77, + 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, - 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, - 0x2e, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x7b, - 0x0a, 0x13, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x64, - 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4b, 0x92, 0x41, 0x48, - 0x32, 0x46, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, - 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x20, - 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2e, 0x52, 0x11, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, - 0x65, 0x64, 0x42, 0x69, 0x64, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x7d, 0x0a, 0x16, 0x72, - 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x73, 0x69, 0x67, 0x6e, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x47, 0x92, 0x41, 0x44, - 0x32, 0x42, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, - 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, - 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x73, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, - 0x62, 0x69, 0x64, 0x2e, 0x52, 0x14, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x42, 0x69, - 0x64, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x62, 0x0a, 0x11, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x35, 0x92, 0x41, 0x32, 0x32, 0x30, 0x48, 0x65, 0x78, 0x20, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, - 0x6f, 0x66, 0x20, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x10, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x9e, - 0x01, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x6b, 0x92, - 0x41, 0x68, 0x32, 0x66, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, - 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x13, 0x63, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, - 0x88, 0x01, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x5d, 0x92, 0x41, 0x5a, 0x32, - 0x58, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, - 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x73, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x64, 0x0a, 0x15, 0x64, 0x65, - 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x42, 0x30, 0x92, 0x41, 0x2d, 0x32, 0x2b, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, - 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x13, 0x64, 0x65, 0x63, - 0x61, 0x79, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x12, 0x5e, 0x0a, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x42, 0x2e, 0x92, - 0x41, 0x2b, 0x32, 0x29, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, - 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x65, - 0x6e, 0x64, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x11, 0x64, - 0x65, 0x63, 0x61, 0x79, 0x45, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x12, 0x63, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x42, 0x34, 0x92, 0x41, - 0x31, 0x32, 0x2f, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, - 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, - 0x64, 0x2e, 0x52, 0x11, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x7c, 0x0a, 0x13, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, - 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, - 0x28, 0x09, 0x42, 0x4c, 0x92, 0x41, 0x49, 0x32, 0x47, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, - 0x6c, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x78, 0x20, 0x68, 0x61, - 0x73, 0x68, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, - 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x20, - 0x6f, 0x72, 0x20, 0x62, 0x65, 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x65, 0x64, 0x2e, - 0x52, 0x11, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x48, 0x61, 0x73, - 0x68, 0x65, 0x73, 0x12, 0x85, 0x01, 0x0a, 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x42, 0x62, 0x92, 0x41, 0x5f, 0x32, - 0x5d, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, - 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x73, 0x6c, 0x61, 0x73, - 0x68, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x66, 0x61, - 0x69, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x0b, - 0x73, 0x6c, 0x61, 0x73, 0x68, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x5e, 0x92, 0x41, 0x5b, - 0x0a, 0x59, 0x2a, 0x12, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, - 0x6e, 0x74, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x6d, 0x65, 0x76, 0x2d, 0x63, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x22, 0xbe, 0x02, 0x0a, 0x11, - 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x9f, 0x01, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x42, 0x7c, 0x92, 0x41, 0x79, 0x32, 0x77, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x71, 0x75, 0x65, 0x72, 0x79, 0x69, 0x6e, - 0x67, 0x20, 0x62, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x6e, - 0x6f, 0x74, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2c, 0x20, 0x61, 0x6c, - 0x6c, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, - 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x05, 0x42, 0x20, 0x92, 0x41, 0x1d, 0x32, 0x1b, 0x50, 0x61, 0x67, 0x65, 0x20, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x51, 0x0a, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x42, 0x3b, 0x92, 0x41, 0x38, 0x32, 0x36, 0x4e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x70, - 0x65, 0x72, 0x20, 0x70, 0x61, 0x67, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x67, 0x69, - 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, - 0x69, 0x73, 0x20, 0x35, 0x30, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0xe0, 0x11, 0x0a, - 0x12, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x97, 0x01, 0x0a, 0x0e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x62, 0x69, - 0x64, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x62, - 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, - 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x42, 0x92, 0x41, 0x3f, - 0x32, 0x3d, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, - 0x62, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x69, 0x6e, 0x67, 0x20, 0x62, 0x69, 0x64, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, - 0x69, 0x72, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x52, - 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0xf4, 0x04, - 0x0a, 0x14, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x57, 0x69, 0x74, 0x68, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x7e, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x53, 0x92, 0x41, 0x50, 0x32, 0x4e, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x73, - 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x63, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, - 0x63, 0x68, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x42, 0x34, 0x92, 0x41, 0x31, 0x32, 0x2f, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x70, 0x75, - 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x2e, 0x52, 0x11, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, - 0x63, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x86, 0x01, 0x0a, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x6e, 0x92, 0x41, - 0x6b, 0x32, 0x69, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x20, 0x50, 0x6f, 0x73, - 0x73, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x3a, 0x20, 0x27, 0x70, - 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x27, 0x2c, 0x20, 0x27, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, - 0x27, 0x2c, 0x20, 0x27, 0x6f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x27, 0x73, 0x65, - 0x74, 0x74, 0x6c, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x27, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, - 0x27, 0x2c, 0x20, 0x27, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x27, 0x2e, 0x52, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x4e, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x34, 0x92, 0x41, 0x31, 0x32, 0x2f, 0x41, 0x64, 0x64, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x61, - 0x62, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, - 0x65, 0x6e, 0x74, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x52, 0x07, 0x64, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x12, 0x48, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2e, 0x92, 0x41, 0x2b, 0x32, 0x29, 0x50, 0x61, 0x79, 0x6d, - 0x65, 0x6e, 0x74, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x77, 0x65, - 0x69, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x54, - 0x0a, 0x06, 0x72, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3c, - 0x92, 0x41, 0x39, 0x32, 0x37, 0x52, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x20, 0x61, 0x6d, 0x6f, 0x75, - 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x77, 0x65, 0x69, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x69, 0x66, - 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x52, 0x06, 0x72, 0x65, - 0x66, 0x75, 0x6e, 0x64, 0x1a, 0xdb, 0x09, 0x0a, 0x07, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x9a, 0x01, 0x0a, 0x0a, 0x74, 0x78, 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x7b, 0x92, 0x41, 0x78, 0x32, 0x64, 0x48, 0x65, 0x78, 0x20, + 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0xba, 0x48, 0x82, 0x01, 0xba, + 0x01, 0x7f, 0x0a, 0x10, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, + 0x6e, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x20, 0x72, 0x61, 0x77, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x1a, 0x2d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, + 0x72, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, + 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x2a, 0x24, 0x27, 0x29, + 0x29, 0x52, 0x0f, 0x72, 0x61, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0xbf, 0x02, 0x0a, 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x9b, 0x02, 0x92, 0x41, 0x9f, 0x01, + 0x32, 0x93, 0x01, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x73, 0x6c, + 0x61, 0x73, 0x68, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, + 0x66, 0x61, 0x69, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x20, 0x49, 0x66, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, + 0x63, 0x61, 0x79, 0x65, 0x64, 0x20, 0x62, 0x69, 0x64, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x6c, 0x61, + 0x73, 0x68, 0x69, 0x6e, 0x67, 0x2e, 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0xba, + 0x48, 0x75, 0xba, 0x01, 0x72, 0x0a, 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x25, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x3b, 0x74, 0x68, 0x69, 0x73, + 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x27, 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, + 0x24, 0x27, 0x29, 0x20, 0x26, 0x26, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x29, 0x20, 0x3e, 0x3d, 0x20, 0x30, 0x29, 0x52, 0x0b, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x41, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0xba, 0x04, 0x92, 0x41, 0xb6, 0x04, 0x0a, 0x95, 0x01, 0x2a, 0x0b, + 0x42, 0x69, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x40, 0x55, 0x6e, 0x73, + 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x69, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x73, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x6d, 0x65, 0x76, + 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0xd2, 0x01, 0x06, + 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0xd2, 0x01, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0xd2, 0x01, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0xd2, 0x01, 0x13, + 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x32, 0x9b, 0x03, 0x7b, 0x22, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x66, 0x65, 0x34, 0x63, 0x62, 0x34, 0x37, 0x64, 0x62, 0x33, + 0x36, 0x33, 0x30, 0x35, 0x35, 0x31, 0x62, 0x65, 0x65, 0x64, 0x66, 0x62, 0x64, 0x30, 0x32, 0x61, + 0x37, 0x31, 0x65, 0x63, 0x63, 0x36, 0x39, 0x66, 0x64, 0x35, 0x39, 0x37, 0x35, 0x38, 0x65, 0x32, + 0x62, 0x61, 0x36, 0x39, 0x39, 0x36, 0x30, 0x36, 0x65, 0x32, 0x64, 0x35, 0x63, 0x37, 0x34, 0x32, + 0x38, 0x34, 0x66, 0x66, 0x61, 0x37, 0x22, 0x2c, 0x20, 0x22, 0x37, 0x31, 0x63, 0x31, 0x33, 0x34, + 0x38, 0x66, 0x32, 0x64, 0x37, 0x66, 0x66, 0x37, 0x65, 0x38, 0x31, 0x34, 0x66, 0x39, 0x63, 0x33, + 0x36, 0x31, 0x37, 0x39, 0x38, 0x33, 0x37, 0x30, 0x33, 0x34, 0x33, 0x35, 0x65, 0x61, 0x37, 0x34, + 0x34, 0x36, 0x64, 0x65, 0x34, 0x32, 0x30, 0x61, 0x65, 0x61, 0x63, 0x34, 0x38, 0x38, 0x62, 0x66, + 0x31, 0x64, 0x65, 0x33, 0x35, 0x37, 0x33, 0x37, 0x65, 0x38, 0x22, 0x5d, 0x2c, 0x20, 0x22, 0x61, + 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x2c, 0x20, 0x22, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x31, + 0x32, 0x33, 0x34, 0x35, 0x36, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3a, 0x20, + 0x31, 0x36, 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x63, + 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x22, 0x3a, 0x20, 0x31, 0x36, 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x2c, 0x20, 0x22, + 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, + 0x68, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x66, 0x65, 0x34, 0x63, 0x62, 0x34, 0x37, 0x64, + 0x62, 0x33, 0x36, 0x33, 0x30, 0x35, 0x35, 0x31, 0x62, 0x65, 0x65, 0x64, 0x66, 0x62, 0x64, 0x30, + 0x32, 0x61, 0x37, 0x31, 0x65, 0x63, 0x63, 0x36, 0x39, 0x66, 0x64, 0x35, 0x39, 0x37, 0x35, 0x38, + 0x65, 0x32, 0x62, 0x61, 0x36, 0x39, 0x39, 0x36, 0x30, 0x36, 0x65, 0x32, 0x64, 0x35, 0x63, 0x37, + 0x34, 0x32, 0x38, 0x34, 0x66, 0x66, 0x61, 0x37, 0x22, 0x5d, 0x2c, 0x20, 0x22, 0x73, 0x6c, 0x61, + 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x35, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, + 0x7d, 0x22, 0xc2, 0x0d, 0x0a, 0x0a, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, + 0x12, 0x95, 0x01, 0x0a, 0x09, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x09, 0x42, 0x78, 0x92, 0x41, 0x75, 0x32, 0x61, 0x48, 0x65, 0x78, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x61, 0x73, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, + 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, 0x0f, 0x5b, + 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x52, 0x08, + 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x8f, 0x01, 0x0a, 0x0a, 0x62, 0x69, 0x64, + 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x70, 0x92, + 0x41, 0x6d, 0x32, 0x6b, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, + 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, + 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, 0x61, 0x67, 0x72, 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, + 0x70, 0x61, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, + 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x52, + 0x09, 0x62, 0x69, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x6d, 0x0a, 0x0c, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, + 0x42, 0x4a, 0x92, 0x41, 0x47, 0x32, 0x45, 0x4d, 0x61, 0x78, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, + 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x2e, 0x52, 0x0b, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x7b, 0x0a, 0x13, 0x72, 0x65, 0x63, + 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4b, 0x92, 0x41, 0x48, 0x32, 0x46, 0x48, 0x65, 0x78, + 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, + 0x20, 0x6f, 0x66, 0x20, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x73, 0x69, + 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, + 0x65, 0x72, 0x2e, 0x52, 0x11, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x42, 0x69, 0x64, + 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x7d, 0x0a, 0x16, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, + 0x65, 0x64, 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x47, 0x92, 0x41, 0x44, 0x32, 0x42, 0x48, 0x65, 0x78, + 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, + 0x20, 0x6f, 0x66, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x20, 0x73, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x62, 0x69, 0x64, 0x2e, 0x52, + 0x14, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x42, 0x69, 0x64, 0x53, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x62, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, + 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x35, 0x92, 0x41, 0x32, 0x32, 0x30, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x69, + 0x67, 0x65, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, + 0x65, 0x6e, 0x74, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x9e, 0x01, 0x0a, 0x14, 0x63, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x6b, 0x92, 0x41, 0x68, 0x32, 0x66, 0x48, + 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, + 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, + 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, + 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x13, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, + 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x10, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x5d, 0x92, 0x41, 0x5a, 0x32, 0x58, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, - 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x6f, 0x66, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, - 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, - 0x8a, 0x01, 0x0f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, - 0x34, 0x7d, 0x52, 0x09, 0x74, 0x78, 0x6e, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x92, 0x01, - 0x0a, 0x15, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x74, 0x78, 0x6e, - 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0x5e, 0x92, - 0x41, 0x5b, 0x32, 0x47, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x72, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x2e, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x64, 0x0a, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x03, 0x42, 0x30, 0x92, 0x41, 0x2d, 0x32, 0x2b, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x20, 0x64, 0x65, 0x63, + 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x5e, 0x0a, 0x13, 0x64, + 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x42, 0x2e, 0x92, 0x41, 0x2b, 0x32, 0x29, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, + 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x64, + 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x11, 0x64, 0x65, 0x63, 0x61, 0x79, 0x45, + 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x63, 0x0a, 0x12, 0x64, + 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x42, 0x34, 0x92, 0x41, 0x31, 0x32, 0x2f, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, + 0x69, 0x73, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x2e, 0x52, 0x11, 0x64, + 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x12, 0x7c, 0x0a, 0x13, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, + 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x42, 0x4c, 0x92, + 0x41, 0x49, 0x32, 0x47, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x78, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x62, 0x65, - 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x65, 0x64, 0x2e, 0x8a, 0x01, 0x0f, 0x5b, 0x61, - 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x52, 0x13, 0x72, - 0x65, 0x76, 0x65, 0x72, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x6e, 0x48, 0x61, 0x73, 0x68, - 0x65, 0x73, 0x12, 0x69, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x46, 0x92, 0x41, 0x43, 0x32, 0x41, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, - 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x2e, - 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x98, 0x01, - 0x0a, 0x0a, 0x62, 0x69, 0x64, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x79, 0x92, 0x41, 0x76, 0x32, 0x6b, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, - 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x69, 0x6e, - 0x67, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x61, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x52, 0x09, 0x62, - 0x69, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x64, 0x0a, 0x15, 0x64, 0x65, 0x63, 0x61, - 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x42, 0x30, 0x92, 0x41, 0x2d, 0x32, 0x2b, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x20, - 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x5e, - 0x0a, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x42, 0x2e, 0x92, 0x41, 0x2b, - 0x32, 0x29, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, - 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x65, 0x6e, 0x64, - 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x11, 0x64, 0x65, 0x63, - 0x61, 0x79, 0x45, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x6a, - 0x0a, 0x0a, 0x62, 0x69, 0x64, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x4b, 0x92, 0x41, 0x48, 0x32, 0x46, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, - 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, - 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, - 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2e, 0x52, - 0x09, 0x62, 0x69, 0x64, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0xc7, 0x01, 0x0a, 0x0c, 0x73, - 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x09, 0x42, 0xa3, 0x01, 0x92, 0x41, 0x9f, 0x01, 0x32, 0x93, 0x01, 0x41, 0x6d, 0x6f, 0x75, 0x6e, - 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, - 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x20, 0x66, 0x72, - 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, - 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x20, 0x74, 0x6f, 0x20, + 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x65, 0x64, 0x2e, 0x52, 0x11, 0x72, 0x65, 0x76, + 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x85, + 0x01, 0x0a, 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x0d, 0x20, 0x01, 0x28, 0x09, 0x42, 0x62, 0x92, 0x41, 0x5f, 0x32, 0x5d, 0x41, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, + 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x20, 0x66, + 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x20, 0x74, 0x6f, + 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x0b, 0x73, 0x6c, 0x61, 0x73, 0x68, + 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x5e, 0x92, 0x41, 0x5b, 0x0a, 0x59, 0x2a, 0x12, 0x43, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x32, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, + 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x6d, 0x65, 0x76, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x22, 0xbe, 0x02, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x42, 0x69, + 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x9f, 0x01, 0x0a, + 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x42, 0x7c, 0x92, 0x41, 0x79, 0x32, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x71, 0x75, 0x65, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x69, 0x64, + 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x70, + 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6b, 0x6e, 0x6f, + 0x77, 0x6e, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, + 0x20, 0x61, 0x72, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, + 0x20, 0x61, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x2e, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x34, + 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x20, 0x92, 0x41, + 0x1d, 0x32, 0x1b, 0x50, 0x61, 0x67, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x04, + 0x70, 0x61, 0x67, 0x65, 0x12, 0x51, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x05, 0x42, 0x3b, 0x92, 0x41, 0x38, 0x32, 0x36, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x70, 0x61, + 0x67, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x20, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x69, 0x73, 0x20, 0x35, 0x30, + 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0xe0, 0x11, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x42, + 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x97, + 0x01, 0x0a, 0x0e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x69, 0x6e, 0x66, + 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, + 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x42, 0x92, 0x41, 0x3f, 0x32, 0x3d, 0x4c, 0x69, 0x73, + 0x74, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x62, 0x69, 0x64, 0x20, 0x69, + 0x6e, 0x66, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x62, + 0x69, 0x64, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x63, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x52, 0x0c, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0xf4, 0x04, 0x0a, 0x14, 0x43, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x57, 0x69, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x7e, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x53, 0x92, 0x41, 0x50, + 0x32, 0x4e, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, + 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x12, 0x63, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x42, 0x34, 0x92, + 0x41, 0x31, 0x32, 0x2f, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, + 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, + 0x65, 0x64, 0x2e, 0x52, 0x11, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x86, 0x01, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x6e, 0x92, 0x41, 0x6b, 0x32, 0x69, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x20, 0x50, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x3a, 0x20, 0x27, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x27, 0x2c, 0x20, 0x27, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x27, 0x6f, + 0x70, 0x65, 0x6e, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x27, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x64, + 0x27, 0x2c, 0x20, 0x27, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x27, 0x66, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x27, 0x2e, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x4e, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x34, 0x92, 0x41, 0x31, 0x32, 0x2f, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, + 0x48, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x2e, 0x92, 0x41, 0x2b, 0x32, 0x29, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x61, + 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x77, 0x65, 0x69, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x52, 0x07, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x54, 0x0a, 0x06, 0x72, 0x65, 0x66, + 0x75, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3c, 0x92, 0x41, 0x39, 0x32, 0x37, + 0x52, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x69, 0x6e, + 0x20, 0x77, 0x65, 0x69, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x69, 0x66, 0x20, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x52, 0x06, 0x72, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x1a, + 0xdb, 0x09, 0x0a, 0x07, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x9a, 0x01, 0x0a, 0x0a, + 0x74, 0x78, 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x42, 0x7b, 0x92, 0x41, 0x78, 0x32, 0x64, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, + 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, 0x0f, 0x5b, 0x61, + 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x52, 0x09, 0x74, + 0x78, 0x6e, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x92, 0x01, 0x0a, 0x15, 0x72, 0x65, 0x76, + 0x65, 0x72, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x74, 0x78, 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x68, + 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0x5e, 0x92, 0x41, 0x5b, 0x32, 0x47, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x78, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, + 0x65, 0x76, 0x65, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x62, 0x65, 0x20, 0x64, 0x69, 0x73, 0x63, + 0x61, 0x72, 0x64, 0x65, 0x64, 0x2e, 0x8a, 0x01, 0x0f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, + 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x52, 0x13, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x6e, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x69, 0x0a, + 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x42, 0x46, 0x92, 0x41, 0x43, 0x32, 0x41, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x20, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x7a, 0x65, 0x72, 0x6f, - 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x65, 0x64, 0x20, 0x62, 0x69, - 0x64, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, - 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x2e, 0x8a, 0x01, - 0x06, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x52, 0x0b, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x41, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x57, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x62, 0x69, 0x64, 0x64, - 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x57, 0x69, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x43, 0x92, - 0x41, 0x40, 0x0a, 0x3e, 0x2a, 0x08, 0x42, 0x69, 0x64, 0x20, 0x49, 0x6e, 0x66, 0x6f, 0x32, 0x32, - 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x75, - 0x74, 0x20, 0x61, 0x20, 0x62, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, - 0x67, 0x20, 0x69, 0x74, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x2e, 0x1a, 0xda, 0x01, 0x0a, 0x0c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x69, 0x64, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x59, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x42, 0x36, 0x92, 0x41, 0x33, 0x32, 0x31, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, - 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x69, - 0x6e, 0x66, 0x6f, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, - 0x2e, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x6f, - 0x0a, 0x04, 0x62, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x62, - 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, - 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x42, - 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x31, 0x92, 0x41, 0x2e, 0x32, 0x2c, 0x4c, 0x69, 0x73, - 0x74, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x69, 0x64, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x52, 0x04, 0x62, 0x69, 0x64, 0x73, 0x32, - 0x9b, 0x07, 0x0a, 0x06, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x12, 0x53, 0x0a, 0x07, 0x53, 0x65, - 0x6e, 0x64, 0x42, 0x69, 0x64, 0x12, 0x11, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x69, 0x64, 0x1a, 0x18, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, - 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, - 0x6e, 0x74, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x3a, 0x01, 0x2a, 0x22, 0x0e, 0x2f, - 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x62, 0x69, 0x64, 0x30, 0x01, 0x12, - 0x6b, 0x0a, 0x07, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x1c, 0x2e, 0x62, 0x69, 0x64, - 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, - 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x22, - 0x1b, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x64, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x2f, 0x7b, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x7d, 0x12, 0x7b, 0x0a, 0x0d, - 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x12, 0x22, 0x2e, - 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x23, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x19, - 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x12, 0x92, 0x01, 0x0a, 0x12, 0x52, 0x65, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x2e, 0x52, 0x0b, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x98, 0x01, 0x0a, 0x0a, 0x62, 0x69, 0x64, + 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x79, 0x92, + 0x41, 0x76, 0x32, 0x6b, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, + 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, + 0x72, 0x20, 0x69, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, + 0x70, 0x61, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, + 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x8a, + 0x01, 0x06, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x52, 0x09, 0x62, 0x69, 0x64, 0x41, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x64, 0x0a, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x03, 0x42, 0x30, 0x92, 0x41, 0x2d, 0x32, 0x2b, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x62, 0x69, 0x64, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, + 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x5e, 0x0a, 0x13, 0x64, 0x65, 0x63, + 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x42, 0x2e, 0x92, 0x41, 0x2b, 0x32, 0x29, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x64, 0x65, 0x63, + 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x11, 0x64, 0x65, 0x63, 0x61, 0x79, 0x45, 0x6e, 0x64, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x6a, 0x0a, 0x0a, 0x62, 0x69, 0x64, + 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4b, 0x92, + 0x41, 0x48, 0x32, 0x46, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, + 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x69, 0x67, 0x65, 0x73, + 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2e, 0x52, 0x09, 0x62, 0x69, 0x64, 0x44, + 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0xc7, 0x01, 0x0a, 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, + 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0xa3, 0x01, 0x92, + 0x41, 0x9f, 0x01, 0x32, 0x93, 0x01, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, + 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x79, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x2c, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x65, 0x64, 0x20, 0x62, 0x69, 0x64, 0x20, 0x61, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x2e, 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, 0x39, + 0x5d, 0x2b, 0x52, 0x0b, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x57, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x09, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, + 0x74, 0x57, 0x69, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0b, 0x63, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x43, 0x92, 0x41, 0x40, 0x0a, 0x3e, 0x2a, + 0x08, 0x42, 0x69, 0x64, 0x20, 0x49, 0x6e, 0x66, 0x6f, 0x32, 0x32, 0x49, 0x6e, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x61, 0x20, 0x62, + 0x69, 0x64, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x74, 0x73, + 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x1a, 0xda, 0x01, + 0x0a, 0x0c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x59, + 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x03, 0x42, 0x36, 0x92, 0x41, 0x33, 0x32, 0x31, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x77, 0x68, 0x69, 0x63, + 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x69, + 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x2e, 0x52, 0x0b, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x6f, 0x0a, 0x04, 0x62, 0x69, 0x64, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, + 0x6f, 0x42, 0x31, 0x92, 0x41, 0x2e, 0x32, 0x2c, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x62, 0x69, 0x64, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x70, 0x65, + 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x2e, 0x52, 0x04, 0x62, 0x69, 0x64, 0x73, 0x32, 0xe0, 0x0a, 0x0a, 0x06, 0x42, + 0x69, 0x64, 0x64, 0x65, 0x72, 0x12, 0x53, 0x0a, 0x07, 0x53, 0x65, 0x6e, 0x64, 0x42, 0x69, 0x64, + 0x12, 0x11, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x42, 0x69, 0x64, 0x1a, 0x18, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x19, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x3a, 0x01, 0x2a, 0x22, 0x0e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, + 0x64, 0x64, 0x65, 0x72, 0x2f, 0x62, 0x69, 0x64, 0x30, 0x01, 0x12, 0x6b, 0x0a, 0x07, 0x44, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x1c, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x22, 0x1b, 0x2f, 0x76, 0x31, 0x2f, + 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x2f, 0x7b, + 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x7d, 0x12, 0x7b, 0x0a, 0x0d, 0x44, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x12, 0x22, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, + 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x45, + 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x62, + 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x19, 0x2f, 0x76, 0x31, 0x2f, 0x62, + 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x65, 0x76, + 0x65, 0x6e, 0x6c, 0x79, 0x12, 0x98, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x44, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x12, 0x29, 0x2e, + 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, + 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x22, 0x21, 0x2f, 0x76, + 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, + 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x12, + 0x8c, 0x01, 0x0a, 0x11, 0x53, 0x65, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, 0x26, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, + 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1e, + 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x73, 0x65, 0x74, 0x5f, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, 0x98, + 0x01, 0x0a, 0x14, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x29, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x12, 0x21, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, + 0x65, 0x72, 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x92, 0x01, 0x0a, 0x12, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x12, 0x27, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, @@ -1851,52 +2269,68 @@ func file_bidderapi_v1_bidderapi_proto_rawDescGZIP() []byte { return file_bidderapi_v1_bidderapi_proto_rawDescData } -var file_bidderapi_v1_bidderapi_proto_msgTypes = make([]protoimpl.MessageInfo, 17) +var file_bidderapi_v1_bidderapi_proto_msgTypes = make([]protoimpl.MessageInfo, 24) var file_bidderapi_v1_bidderapi_proto_goTypes = []interface{}{ (*DepositRequest)(nil), // 0: bidderapi.v1.DepositRequest (*DepositResponse)(nil), // 1: bidderapi.v1.DepositResponse (*DepositEvenlyRequest)(nil), // 2: bidderapi.v1.DepositEvenlyRequest (*DepositEvenlyResponse)(nil), // 3: bidderapi.v1.DepositEvenlyResponse - (*EmptyMessage)(nil), // 4: bidderapi.v1.EmptyMessage - (*GetDepositRequest)(nil), // 5: bidderapi.v1.GetDepositRequest - (*RequestWithdrawalsRequest)(nil), // 6: bidderapi.v1.RequestWithdrawalsRequest - (*RequestWithdrawalsResponse)(nil), // 7: bidderapi.v1.RequestWithdrawalsResponse - (*WithdrawRequest)(nil), // 8: bidderapi.v1.WithdrawRequest - (*WithdrawResponse)(nil), // 9: bidderapi.v1.WithdrawResponse - (*Bid)(nil), // 10: bidderapi.v1.Bid - (*Commitment)(nil), // 11: bidderapi.v1.Commitment - (*GetBidInfoRequest)(nil), // 12: bidderapi.v1.GetBidInfoRequest - (*GetBidInfoResponse)(nil), // 13: bidderapi.v1.GetBidInfoResponse - (*GetBidInfoResponse_CommitmentWithStatus)(nil), // 14: bidderapi.v1.GetBidInfoResponse.CommitmentWithStatus - (*GetBidInfoResponse_BidInfo)(nil), // 15: bidderapi.v1.GetBidInfoResponse.BidInfo - (*GetBidInfoResponse_BlockBidInfo)(nil), // 16: bidderapi.v1.GetBidInfoResponse.BlockBidInfo - (*wrapperspb.StringValue)(nil), // 17: google.protobuf.StringValue + (*EnableDepositManagerRequest)(nil), // 4: bidderapi.v1.EnableDepositManagerRequest + (*EnableDepositManagerResponse)(nil), // 5: bidderapi.v1.EnableDepositManagerResponse + (*TargetDeposit)(nil), // 6: bidderapi.v1.TargetDeposit + (*SetTargetDepositsRequest)(nil), // 7: bidderapi.v1.SetTargetDepositsRequest + (*SetTargetDepositsResponse)(nil), // 8: bidderapi.v1.SetTargetDepositsResponse + (*DepositManagerStatusRequest)(nil), // 9: bidderapi.v1.DepositManagerStatusRequest + (*DepositManagerStatusResponse)(nil), // 10: bidderapi.v1.DepositManagerStatusResponse + (*EmptyMessage)(nil), // 11: bidderapi.v1.EmptyMessage + (*GetDepositRequest)(nil), // 12: bidderapi.v1.GetDepositRequest + (*RequestWithdrawalsRequest)(nil), // 13: bidderapi.v1.RequestWithdrawalsRequest + (*RequestWithdrawalsResponse)(nil), // 14: bidderapi.v1.RequestWithdrawalsResponse + (*WithdrawRequest)(nil), // 15: bidderapi.v1.WithdrawRequest + (*WithdrawResponse)(nil), // 16: bidderapi.v1.WithdrawResponse + (*Bid)(nil), // 17: bidderapi.v1.Bid + (*Commitment)(nil), // 18: bidderapi.v1.Commitment + (*GetBidInfoRequest)(nil), // 19: bidderapi.v1.GetBidInfoRequest + (*GetBidInfoResponse)(nil), // 20: bidderapi.v1.GetBidInfoResponse + (*GetBidInfoResponse_CommitmentWithStatus)(nil), // 21: bidderapi.v1.GetBidInfoResponse.CommitmentWithStatus + (*GetBidInfoResponse_BidInfo)(nil), // 22: bidderapi.v1.GetBidInfoResponse.BidInfo + (*GetBidInfoResponse_BlockBidInfo)(nil), // 23: bidderapi.v1.GetBidInfoResponse.BlockBidInfo + (*wrapperspb.StringValue)(nil), // 24: google.protobuf.StringValue } var file_bidderapi_v1_bidderapi_proto_depIdxs = []int32{ - 16, // 0: bidderapi.v1.GetBidInfoResponse.block_bid_info:type_name -> bidderapi.v1.GetBidInfoResponse.BlockBidInfo - 14, // 1: bidderapi.v1.GetBidInfoResponse.BidInfo.commitments:type_name -> bidderapi.v1.GetBidInfoResponse.CommitmentWithStatus - 15, // 2: bidderapi.v1.GetBidInfoResponse.BlockBidInfo.bids:type_name -> bidderapi.v1.GetBidInfoResponse.BidInfo - 10, // 3: bidderapi.v1.Bidder.SendBid:input_type -> bidderapi.v1.Bid - 0, // 4: bidderapi.v1.Bidder.Deposit:input_type -> bidderapi.v1.DepositRequest - 2, // 5: bidderapi.v1.Bidder.DepositEvenly:input_type -> bidderapi.v1.DepositEvenlyRequest - 6, // 6: bidderapi.v1.Bidder.RequestWithdrawals:input_type -> bidderapi.v1.RequestWithdrawalsRequest - 5, // 7: bidderapi.v1.Bidder.GetDeposit:input_type -> bidderapi.v1.GetDepositRequest - 8, // 8: bidderapi.v1.Bidder.Withdraw:input_type -> bidderapi.v1.WithdrawRequest - 12, // 9: bidderapi.v1.Bidder.GetBidInfo:input_type -> bidderapi.v1.GetBidInfoRequest - 4, // 10: bidderapi.v1.Bidder.ClaimSlashedFunds:input_type -> bidderapi.v1.EmptyMessage - 11, // 11: bidderapi.v1.Bidder.SendBid:output_type -> bidderapi.v1.Commitment - 1, // 12: bidderapi.v1.Bidder.Deposit:output_type -> bidderapi.v1.DepositResponse - 3, // 13: bidderapi.v1.Bidder.DepositEvenly:output_type -> bidderapi.v1.DepositEvenlyResponse - 7, // 14: bidderapi.v1.Bidder.RequestWithdrawals:output_type -> bidderapi.v1.RequestWithdrawalsResponse - 1, // 15: bidderapi.v1.Bidder.GetDeposit:output_type -> bidderapi.v1.DepositResponse - 9, // 16: bidderapi.v1.Bidder.Withdraw:output_type -> bidderapi.v1.WithdrawResponse - 13, // 17: bidderapi.v1.Bidder.GetBidInfo:output_type -> bidderapi.v1.GetBidInfoResponse - 17, // 18: bidderapi.v1.Bidder.ClaimSlashedFunds:output_type -> google.protobuf.StringValue - 11, // [11:19] is the sub-list for method output_type - 3, // [3:11] is the sub-list for method input_type - 3, // [3:3] is the sub-list for extension type_name - 3, // [3:3] is the sub-list for extension extendee - 0, // [0:3] is the sub-list for field type_name + 6, // 0: bidderapi.v1.SetTargetDepositsRequest.target_deposits:type_name -> bidderapi.v1.TargetDeposit + 6, // 1: bidderapi.v1.SetTargetDepositsResponse.successfully_set_deposits:type_name -> bidderapi.v1.TargetDeposit + 6, // 2: bidderapi.v1.DepositManagerStatusResponse.target_deposits:type_name -> bidderapi.v1.TargetDeposit + 23, // 3: bidderapi.v1.GetBidInfoResponse.block_bid_info:type_name -> bidderapi.v1.GetBidInfoResponse.BlockBidInfo + 21, // 4: bidderapi.v1.GetBidInfoResponse.BidInfo.commitments:type_name -> bidderapi.v1.GetBidInfoResponse.CommitmentWithStatus + 22, // 5: bidderapi.v1.GetBidInfoResponse.BlockBidInfo.bids:type_name -> bidderapi.v1.GetBidInfoResponse.BidInfo + 17, // 6: bidderapi.v1.Bidder.SendBid:input_type -> bidderapi.v1.Bid + 0, // 7: bidderapi.v1.Bidder.Deposit:input_type -> bidderapi.v1.DepositRequest + 2, // 8: bidderapi.v1.Bidder.DepositEvenly:input_type -> bidderapi.v1.DepositEvenlyRequest + 4, // 9: bidderapi.v1.Bidder.EnableDepositManager:input_type -> bidderapi.v1.EnableDepositManagerRequest + 7, // 10: bidderapi.v1.Bidder.SetTargetDeposits:input_type -> bidderapi.v1.SetTargetDepositsRequest + 9, // 11: bidderapi.v1.Bidder.DepositManagerStatus:input_type -> bidderapi.v1.DepositManagerStatusRequest + 13, // 12: bidderapi.v1.Bidder.RequestWithdrawals:input_type -> bidderapi.v1.RequestWithdrawalsRequest + 12, // 13: bidderapi.v1.Bidder.GetDeposit:input_type -> bidderapi.v1.GetDepositRequest + 15, // 14: bidderapi.v1.Bidder.Withdraw:input_type -> bidderapi.v1.WithdrawRequest + 19, // 15: bidderapi.v1.Bidder.GetBidInfo:input_type -> bidderapi.v1.GetBidInfoRequest + 11, // 16: bidderapi.v1.Bidder.ClaimSlashedFunds:input_type -> bidderapi.v1.EmptyMessage + 18, // 17: bidderapi.v1.Bidder.SendBid:output_type -> bidderapi.v1.Commitment + 1, // 18: bidderapi.v1.Bidder.Deposit:output_type -> bidderapi.v1.DepositResponse + 3, // 19: bidderapi.v1.Bidder.DepositEvenly:output_type -> bidderapi.v1.DepositEvenlyResponse + 5, // 20: bidderapi.v1.Bidder.EnableDepositManager:output_type -> bidderapi.v1.EnableDepositManagerResponse + 8, // 21: bidderapi.v1.Bidder.SetTargetDeposits:output_type -> bidderapi.v1.SetTargetDepositsResponse + 10, // 22: bidderapi.v1.Bidder.DepositManagerStatus:output_type -> bidderapi.v1.DepositManagerStatusResponse + 14, // 23: bidderapi.v1.Bidder.RequestWithdrawals:output_type -> bidderapi.v1.RequestWithdrawalsResponse + 1, // 24: bidderapi.v1.Bidder.GetDeposit:output_type -> bidderapi.v1.DepositResponse + 16, // 25: bidderapi.v1.Bidder.Withdraw:output_type -> bidderapi.v1.WithdrawResponse + 20, // 26: bidderapi.v1.Bidder.GetBidInfo:output_type -> bidderapi.v1.GetBidInfoResponse + 24, // 27: bidderapi.v1.Bidder.ClaimSlashedFunds:output_type -> google.protobuf.StringValue + 17, // [17:28] is the sub-list for method output_type + 6, // [6:17] is the sub-list for method input_type + 6, // [6:6] is the sub-list for extension type_name + 6, // [6:6] is the sub-list for extension extendee + 0, // [0:6] is the sub-list for field type_name } func init() { file_bidderapi_v1_bidderapi_proto_init() } @@ -1954,7 +2388,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EmptyMessage); i { + switch v := v.(*EnableDepositManagerRequest); i { case 0: return &v.state case 1: @@ -1966,7 +2400,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetDepositRequest); i { + switch v := v.(*EnableDepositManagerResponse); i { case 0: return &v.state case 1: @@ -1978,7 +2412,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RequestWithdrawalsRequest); i { + switch v := v.(*TargetDeposit); i { case 0: return &v.state case 1: @@ -1990,7 +2424,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RequestWithdrawalsResponse); i { + switch v := v.(*SetTargetDepositsRequest); i { case 0: return &v.state case 1: @@ -2002,7 +2436,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WithdrawRequest); i { + switch v := v.(*SetTargetDepositsResponse); i { case 0: return &v.state case 1: @@ -2014,7 +2448,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WithdrawResponse); i { + switch v := v.(*DepositManagerStatusRequest); i { case 0: return &v.state case 1: @@ -2026,7 +2460,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Bid); i { + switch v := v.(*DepositManagerStatusResponse); i { case 0: return &v.state case 1: @@ -2038,7 +2472,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Commitment); i { + switch v := v.(*EmptyMessage); i { case 0: return &v.state case 1: @@ -2050,7 +2484,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBidInfoRequest); i { + switch v := v.(*GetDepositRequest); i { case 0: return &v.state case 1: @@ -2062,7 +2496,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBidInfoResponse); i { + switch v := v.(*RequestWithdrawalsRequest); i { case 0: return &v.state case 1: @@ -2074,7 +2508,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBidInfoResponse_CommitmentWithStatus); i { + switch v := v.(*RequestWithdrawalsResponse); i { case 0: return &v.state case 1: @@ -2086,7 +2520,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBidInfoResponse_BidInfo); i { + switch v := v.(*WithdrawRequest); i { case 0: return &v.state case 1: @@ -2098,6 +2532,90 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WithdrawResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_bidderapi_v1_bidderapi_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Bid); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_bidderapi_v1_bidderapi_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Commitment); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_bidderapi_v1_bidderapi_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetBidInfoRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_bidderapi_v1_bidderapi_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetBidInfoResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_bidderapi_v1_bidderapi_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetBidInfoResponse_CommitmentWithStatus); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_bidderapi_v1_bidderapi_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetBidInfoResponse_BidInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_bidderapi_v1_bidderapi_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetBidInfoResponse_BlockBidInfo); i { case 0: return &v.state @@ -2116,7 +2634,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_bidderapi_v1_bidderapi_proto_rawDesc, NumEnums: 0, - NumMessages: 17, + NumMessages: 24, NumExtensions: 0, NumServices: 1, }, diff --git a/p2p/gen/go/bidderapi/v1/bidderapi.pb.gw.go b/p2p/gen/go/bidderapi/v1/bidderapi.pb.gw.go index b45daf456..a8d659891 100644 --- a/p2p/gen/go/bidderapi/v1/bidderapi.pb.gw.go +++ b/p2p/gen/go/bidderapi/v1/bidderapi.pb.gw.go @@ -146,6 +146,83 @@ func local_request_Bidder_DepositEvenly_0(ctx context.Context, marshaler runtime return msg, metadata, err } +func request_Bidder_EnableDepositManager_0(ctx context.Context, marshaler runtime.Marshaler, client BidderClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq EnableDepositManagerRequest + metadata runtime.ServerMetadata + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + msg, err := client.EnableDepositManager(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_Bidder_EnableDepositManager_0(ctx context.Context, marshaler runtime.Marshaler, server BidderServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq EnableDepositManagerRequest + metadata runtime.ServerMetadata + ) + msg, err := server.EnableDepositManager(ctx, &protoReq) + return msg, metadata, err +} + +var filter_Bidder_SetTargetDeposits_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} + +func request_Bidder_SetTargetDeposits_0(ctx context.Context, marshaler runtime.Marshaler, client BidderClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq SetTargetDepositsRequest + metadata runtime.ServerMetadata + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Bidder_SetTargetDeposits_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.SetTargetDeposits(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_Bidder_SetTargetDeposits_0(ctx context.Context, marshaler runtime.Marshaler, server BidderServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq SetTargetDepositsRequest + metadata runtime.ServerMetadata + ) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Bidder_SetTargetDeposits_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.SetTargetDeposits(ctx, &protoReq) + return msg, metadata, err +} + +func request_Bidder_DepositManagerStatus_0(ctx context.Context, marshaler runtime.Marshaler, client BidderClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DepositManagerStatusRequest + metadata runtime.ServerMetadata + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + msg, err := client.DepositManagerStatus(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_Bidder_DepositManagerStatus_0(ctx context.Context, marshaler runtime.Marshaler, server BidderServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DepositManagerStatusRequest + metadata runtime.ServerMetadata + ) + msg, err := server.DepositManagerStatus(ctx, &protoReq) + return msg, metadata, err +} + func request_Bidder_RequestWithdrawals_0(ctx context.Context, marshaler runtime.Marshaler, client BidderClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var ( protoReq RequestWithdrawalsRequest @@ -351,6 +428,66 @@ func RegisterBidderHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser } forward_Bidder_DepositEvenly_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) + mux.Handle(http.MethodPost, pattern_Bidder_EnableDepositManager_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/bidderapi.v1.Bidder/EnableDepositManager", runtime.WithHTTPPathPattern("/v1/bidder/enable_deposit_manager")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Bidder_EnableDepositManager_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_Bidder_EnableDepositManager_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_Bidder_SetTargetDeposits_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/bidderapi.v1.Bidder/SetTargetDeposits", runtime.WithHTTPPathPattern("/v1/bidder/set_target_deposits")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Bidder_SetTargetDeposits_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_Bidder_SetTargetDeposits_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_Bidder_DepositManagerStatus_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/bidderapi.v1.Bidder/DepositManagerStatus", runtime.WithHTTPPathPattern("/v1/bidder/deposit_manager_status")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Bidder_DepositManagerStatus_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_Bidder_DepositManagerStatus_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle(http.MethodPost, pattern_Bidder_RequestWithdrawals_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -542,6 +679,57 @@ func RegisterBidderHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli } forward_Bidder_DepositEvenly_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) + mux.Handle(http.MethodPost, pattern_Bidder_EnableDepositManager_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/bidderapi.v1.Bidder/EnableDepositManager", runtime.WithHTTPPathPattern("/v1/bidder/enable_deposit_manager")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Bidder_EnableDepositManager_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_Bidder_EnableDepositManager_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_Bidder_SetTargetDeposits_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/bidderapi.v1.Bidder/SetTargetDeposits", runtime.WithHTTPPathPattern("/v1/bidder/set_target_deposits")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Bidder_SetTargetDeposits_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_Bidder_SetTargetDeposits_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_Bidder_DepositManagerStatus_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/bidderapi.v1.Bidder/DepositManagerStatus", runtime.WithHTTPPathPattern("/v1/bidder/deposit_manager_status")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Bidder_DepositManagerStatus_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_Bidder_DepositManagerStatus_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle(http.MethodPost, pattern_Bidder_RequestWithdrawals_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -631,23 +819,29 @@ func RegisterBidderHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli } var ( - pattern_Bidder_SendBid_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "bid"}, "")) - pattern_Bidder_Deposit_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v1", "bidder", "deposit", "amount"}, "")) - pattern_Bidder_DepositEvenly_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "deposit_evenly"}, "")) - pattern_Bidder_RequestWithdrawals_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "request_withdrawals"}, "")) - pattern_Bidder_GetDeposit_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "get_deposit"}, "")) - pattern_Bidder_Withdraw_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "withdraw"}, "")) - pattern_Bidder_GetBidInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "get_bid_info"}, "")) - pattern_Bidder_ClaimSlashedFunds_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "claim_slashed_funds"}, "")) + pattern_Bidder_SendBid_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "bid"}, "")) + pattern_Bidder_Deposit_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v1", "bidder", "deposit", "amount"}, "")) + pattern_Bidder_DepositEvenly_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "deposit_evenly"}, "")) + pattern_Bidder_EnableDepositManager_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "enable_deposit_manager"}, "")) + pattern_Bidder_SetTargetDeposits_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "set_target_deposits"}, "")) + pattern_Bidder_DepositManagerStatus_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "deposit_manager_status"}, "")) + pattern_Bidder_RequestWithdrawals_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "request_withdrawals"}, "")) + pattern_Bidder_GetDeposit_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "get_deposit"}, "")) + pattern_Bidder_Withdraw_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "withdraw"}, "")) + pattern_Bidder_GetBidInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "get_bid_info"}, "")) + pattern_Bidder_ClaimSlashedFunds_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "claim_slashed_funds"}, "")) ) var ( - forward_Bidder_SendBid_0 = runtime.ForwardResponseStream - forward_Bidder_Deposit_0 = runtime.ForwardResponseMessage - forward_Bidder_DepositEvenly_0 = runtime.ForwardResponseMessage - forward_Bidder_RequestWithdrawals_0 = runtime.ForwardResponseMessage - forward_Bidder_GetDeposit_0 = runtime.ForwardResponseMessage - forward_Bidder_Withdraw_0 = runtime.ForwardResponseMessage - forward_Bidder_GetBidInfo_0 = runtime.ForwardResponseMessage - forward_Bidder_ClaimSlashedFunds_0 = runtime.ForwardResponseMessage + forward_Bidder_SendBid_0 = runtime.ForwardResponseStream + forward_Bidder_Deposit_0 = runtime.ForwardResponseMessage + forward_Bidder_DepositEvenly_0 = runtime.ForwardResponseMessage + forward_Bidder_EnableDepositManager_0 = runtime.ForwardResponseMessage + forward_Bidder_SetTargetDeposits_0 = runtime.ForwardResponseMessage + forward_Bidder_DepositManagerStatus_0 = runtime.ForwardResponseMessage + forward_Bidder_RequestWithdrawals_0 = runtime.ForwardResponseMessage + forward_Bidder_GetDeposit_0 = runtime.ForwardResponseMessage + forward_Bidder_Withdraw_0 = runtime.ForwardResponseMessage + forward_Bidder_GetBidInfo_0 = runtime.ForwardResponseMessage + forward_Bidder_ClaimSlashedFunds_0 = runtime.ForwardResponseMessage ) diff --git a/p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go b/p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go index bd3fae38a..5671ed68e 100644 --- a/p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go +++ b/p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go @@ -20,14 +20,17 @@ import ( const _ = grpc.SupportPackageIsVersion9 const ( - Bidder_SendBid_FullMethodName = "/bidderapi.v1.Bidder/SendBid" - Bidder_Deposit_FullMethodName = "/bidderapi.v1.Bidder/Deposit" - Bidder_DepositEvenly_FullMethodName = "/bidderapi.v1.Bidder/DepositEvenly" - Bidder_RequestWithdrawals_FullMethodName = "/bidderapi.v1.Bidder/RequestWithdrawals" - Bidder_GetDeposit_FullMethodName = "/bidderapi.v1.Bidder/GetDeposit" - Bidder_Withdraw_FullMethodName = "/bidderapi.v1.Bidder/Withdraw" - Bidder_GetBidInfo_FullMethodName = "/bidderapi.v1.Bidder/GetBidInfo" - Bidder_ClaimSlashedFunds_FullMethodName = "/bidderapi.v1.Bidder/ClaimSlashedFunds" + Bidder_SendBid_FullMethodName = "/bidderapi.v1.Bidder/SendBid" + Bidder_Deposit_FullMethodName = "/bidderapi.v1.Bidder/Deposit" + Bidder_DepositEvenly_FullMethodName = "/bidderapi.v1.Bidder/DepositEvenly" + Bidder_EnableDepositManager_FullMethodName = "/bidderapi.v1.Bidder/EnableDepositManager" + Bidder_SetTargetDeposits_FullMethodName = "/bidderapi.v1.Bidder/SetTargetDeposits" + Bidder_DepositManagerStatus_FullMethodName = "/bidderapi.v1.Bidder/DepositManagerStatus" + Bidder_RequestWithdrawals_FullMethodName = "/bidderapi.v1.Bidder/RequestWithdrawals" + Bidder_GetDeposit_FullMethodName = "/bidderapi.v1.Bidder/GetDeposit" + Bidder_Withdraw_FullMethodName = "/bidderapi.v1.Bidder/Withdraw" + Bidder_GetBidInfo_FullMethodName = "/bidderapi.v1.Bidder/GetBidInfo" + Bidder_ClaimSlashedFunds_FullMethodName = "/bidderapi.v1.Bidder/ClaimSlashedFunds" ) // BidderClient is the client API for Bidder service. @@ -50,6 +53,20 @@ type BidderClient interface { // // DepositEvenly is called by the bidder node to deposit a total amount evenly across multiple providers. DepositEvenly(ctx context.Context, in *DepositEvenlyRequest, opts ...grpc.CallOption) (*DepositEvenlyResponse, error) + // EnableDepositManager + // + // EnableDepositManager is called by the bidder node to enable the deposit manager via eip 7702. + EnableDepositManager(ctx context.Context, in *EnableDepositManagerRequest, opts ...grpc.CallOption) (*EnableDepositManagerResponse, error) + // SetTargetDeposits + // + // SetTargetDeposits is called by the bidder node to set target deposits per provider + // within the deposit manager. + SetTargetDeposits(ctx context.Context, in *SetTargetDepositsRequest, opts ...grpc.CallOption) (*SetTargetDepositsResponse, error) + // DepositManagerStatus + // + // DepositManagerStatus is called by the bidder node to query whether the bidder + // has enabled the deposit manager via eip 7702. + DepositManagerStatus(ctx context.Context, in *DepositManagerStatusRequest, opts ...grpc.CallOption) (*DepositManagerStatusResponse, error) // RequestWithdrawals // // RequestWithdrawals is called by the bidder node to request withdrawals from provider(s) @@ -121,6 +138,36 @@ func (c *bidderClient) DepositEvenly(ctx context.Context, in *DepositEvenlyReque return out, nil } +func (c *bidderClient) EnableDepositManager(ctx context.Context, in *EnableDepositManagerRequest, opts ...grpc.CallOption) (*EnableDepositManagerResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(EnableDepositManagerResponse) + err := c.cc.Invoke(ctx, Bidder_EnableDepositManager_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *bidderClient) SetTargetDeposits(ctx context.Context, in *SetTargetDepositsRequest, opts ...grpc.CallOption) (*SetTargetDepositsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(SetTargetDepositsResponse) + err := c.cc.Invoke(ctx, Bidder_SetTargetDeposits_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *bidderClient) DepositManagerStatus(ctx context.Context, in *DepositManagerStatusRequest, opts ...grpc.CallOption) (*DepositManagerStatusResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DepositManagerStatusResponse) + err := c.cc.Invoke(ctx, Bidder_DepositManagerStatus_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *bidderClient) RequestWithdrawals(ctx context.Context, in *RequestWithdrawalsRequest, opts ...grpc.CallOption) (*RequestWithdrawalsResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(RequestWithdrawalsResponse) @@ -191,6 +238,20 @@ type BidderServer interface { // // DepositEvenly is called by the bidder node to deposit a total amount evenly across multiple providers. DepositEvenly(context.Context, *DepositEvenlyRequest) (*DepositEvenlyResponse, error) + // EnableDepositManager + // + // EnableDepositManager is called by the bidder node to enable the deposit manager via eip 7702. + EnableDepositManager(context.Context, *EnableDepositManagerRequest) (*EnableDepositManagerResponse, error) + // SetTargetDeposits + // + // SetTargetDeposits is called by the bidder node to set target deposits per provider + // within the deposit manager. + SetTargetDeposits(context.Context, *SetTargetDepositsRequest) (*SetTargetDepositsResponse, error) + // DepositManagerStatus + // + // DepositManagerStatus is called by the bidder node to query whether the bidder + // has enabled the deposit manager via eip 7702. + DepositManagerStatus(context.Context, *DepositManagerStatusRequest) (*DepositManagerStatusResponse, error) // RequestWithdrawals // // RequestWithdrawals is called by the bidder node to request withdrawals from provider(s) @@ -232,6 +293,15 @@ func (UnimplementedBidderServer) Deposit(context.Context, *DepositRequest) (*Dep func (UnimplementedBidderServer) DepositEvenly(context.Context, *DepositEvenlyRequest) (*DepositEvenlyResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DepositEvenly not implemented") } +func (UnimplementedBidderServer) EnableDepositManager(context.Context, *EnableDepositManagerRequest) (*EnableDepositManagerResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method EnableDepositManager not implemented") +} +func (UnimplementedBidderServer) SetTargetDeposits(context.Context, *SetTargetDepositsRequest) (*SetTargetDepositsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetTargetDeposits not implemented") +} +func (UnimplementedBidderServer) DepositManagerStatus(context.Context, *DepositManagerStatusRequest) (*DepositManagerStatusResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DepositManagerStatus not implemented") +} func (UnimplementedBidderServer) RequestWithdrawals(context.Context, *RequestWithdrawalsRequest) (*RequestWithdrawalsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method RequestWithdrawals not implemented") } @@ -315,6 +385,60 @@ func _Bidder_DepositEvenly_Handler(srv interface{}, ctx context.Context, dec fun return interceptor(ctx, in, info, handler) } +func _Bidder_EnableDepositManager_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(EnableDepositManagerRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BidderServer).EnableDepositManager(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Bidder_EnableDepositManager_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BidderServer).EnableDepositManager(ctx, req.(*EnableDepositManagerRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Bidder_SetTargetDeposits_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetTargetDepositsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BidderServer).SetTargetDeposits(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Bidder_SetTargetDeposits_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BidderServer).SetTargetDeposits(ctx, req.(*SetTargetDepositsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Bidder_DepositManagerStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DepositManagerStatusRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BidderServer).DepositManagerStatus(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Bidder_DepositManagerStatus_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BidderServer).DepositManagerStatus(ctx, req.(*DepositManagerStatusRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Bidder_RequestWithdrawals_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(RequestWithdrawalsRequest) if err := dec(in); err != nil { @@ -420,6 +544,18 @@ var Bidder_ServiceDesc = grpc.ServiceDesc{ MethodName: "DepositEvenly", Handler: _Bidder_DepositEvenly_Handler, }, + { + MethodName: "EnableDepositManager", + Handler: _Bidder_EnableDepositManager_Handler, + }, + { + MethodName: "SetTargetDeposits", + Handler: _Bidder_SetTargetDeposits_Handler, + }, + { + MethodName: "DepositManagerStatus", + Handler: _Bidder_DepositManagerStatus_Handler, + }, { MethodName: "RequestWithdrawals", Handler: _Bidder_RequestWithdrawals_Handler, diff --git a/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml b/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml index 115d7b0de..78003f060 100644 --- a/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml +++ b/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml @@ -107,6 +107,36 @@ paths: items: type: string collectionFormat: multi + /v1/bidder/deposit_manager_status: + get: + summary: DepositManagerStatus + description: |- + DepositManagerStatus is called by the bidder node to query whether the bidder + has enabled the deposit manager via eip 7702. + operationId: Bidder_DepositManagerStatus + responses: + "200": + description: A successful response. + schema: + $ref: '#/definitions/v1DepositManagerStatusResponse' + default: + description: An unexpected error response. + schema: + $ref: '#/definitions/googlerpcStatus' + /v1/bidder/enable_deposit_manager: + post: + summary: EnableDepositManager + description: EnableDepositManager is called by the bidder node to enable the deposit manager via eip 7702. + operationId: Bidder_EnableDepositManager + responses: + "200": + description: A successful response. + schema: + $ref: '#/definitions/v1EnableDepositManagerResponse' + default: + description: An unexpected error response. + schema: + $ref: '#/definitions/googlerpcStatus' /v1/bidder/get_bid_info: get: summary: GetBidInfo @@ -183,6 +213,22 @@ paths: required: true schema: $ref: '#/definitions/v1RequestWithdrawalsRequest' + /v1/bidder/set_target_deposits: + post: + summary: SetTargetDeposits + description: |- + SetTargetDeposits is called by the bidder node to set target deposits per provider + within the deposit manager. + operationId: Bidder_SetTargetDeposits + responses: + "200": + description: A successful response. + schema: + $ref: '#/definitions/v1SetTargetDepositsResponse' + default: + description: An unexpected error response. + schema: + $ref: '#/definitions/googlerpcStatus' /v1/bidder/withdraw: post: summary: Withdraw @@ -429,6 +475,18 @@ definitions: type: string description: Deposits some amount of ETH evenly across multiple providers. title: Deposit evenly response + v1DepositManagerStatusResponse: + type: object + properties: + enabled: + type: boolean + targetDeposits: + type: array + items: + type: object + $ref: '#/definitions/v1TargetDeposit' + description: DepositManagerStatus response. + title: DepositManagerStatus response v1DepositResponse: type: object example: @@ -441,6 +499,13 @@ definitions: type: string description: Deposit for bidder in the bidder registry for a particular provider. title: Deposit response + v1EnableDepositManagerResponse: + type: object + properties: + success: + type: boolean + description: EnableDepositManager response. + title: EnableDepositManager response v1GetBidInfoResponse: type: object properties: @@ -478,6 +543,24 @@ definitions: type: string description: Request withdrawals from provider(s). title: RequestWithdrawals response + v1SetTargetDepositsResponse: + type: object + properties: + successfullySetDeposits: + type: array + items: + type: object + $ref: '#/definitions/v1TargetDeposit' + description: OverrideTargetDepositsResponse response. + title: OverrideTargetDepositsResponse response + v1TargetDeposit: + type: object + properties: + provider: + type: string + targetDeposit: + type: string + format: uint64 v1WithdrawResponse: type: object example: diff --git a/p2p/pkg/node/node.go b/p2p/pkg/node/node.go index bd1649cfa..1e7babe3c 100644 --- a/p2p/pkg/node/node.go +++ b/p2p/pkg/node/node.go @@ -24,6 +24,7 @@ import ( "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" bidderregistry "github.com/primev/mev-commit/contracts-abi/clients/BidderRegistry" blocktracker "github.com/primev/mev-commit/contracts-abi/clients/BlockTracker" + depositmanagercontract "github.com/primev/mev-commit/contracts-abi/clients/DepositManager" oracle "github.com/primev/mev-commit/contracts-abi/clients/Oracle" preconf "github.com/primev/mev-commit/contracts-abi/clients/PreconfManager" providerregistry "github.com/primev/mev-commit/contracts-abi/clients/ProviderRegistry" @@ -113,7 +114,6 @@ type Options struct { BidderRegistryContract string OracleContract string ValidatorRouterContract string - AutodepositAmount *big.Int RPCEndpoint string WSRPCEndpoint string NatAddr string @@ -286,17 +286,17 @@ func NewNode(opts *Options) (*Node, error) { ) srv.RegisterMetricsCollectors(monitor.Metrics()...) - contractsBackend := transactor.NewMetricsWrapper( + backend := transactor.NewMetricsWrapper( transactor.NewTransactor( contractRPC, monitor, ), ) - srv.RegisterMetricsCollectors(contractsBackend.Metrics()...) + srv.RegisterMetricsCollectors(backend.Metrics()...) providerRegistry, err := providerregistry.NewProviderregistry( common.HexToAddress(opts.ProviderRegistryContract), - contractsBackend, + backend, ) if err != nil { opts.Logger.Error("failed to instantiate provider registry contract", "error", err) @@ -305,13 +305,22 @@ func NewNode(opts *Options) (*Node, error) { bidderRegistry, err := bidderregistry.NewBidderregistry( common.HexToAddress(opts.BidderRegistryContract), - contractsBackend, + backend, ) if err != nil { opts.Logger.Error("failed to instantiate bidder registry contract", "error", err) return nil, err } + depositManagerContract, err := depositmanagercontract.NewDepositmanager( + opts.KeySigner.GetAddress(), // Bind contract to this EOA account (EIP-7702 will be used here) + backend, + ) + if err != nil { + opts.Logger.Error("creating deposit manager", "error", err) + return nil, err + } + optsGetter := func(ctx context.Context) (*bind.TransactOpts, error) { tOpts, err := opts.KeySigner.GetAuthWithCtx(ctx, chainID) if err == nil { @@ -453,7 +462,7 @@ func NewNode(opts *Options) (*Node, error) { commitmentDA, err := preconf.NewPreconfmanager( common.HexToAddress(opts.PreconfContract), - contractsBackend, + backend, ) if err != nil { opts.Logger.Error("failed to instantiate preconf commitment store contract", "error", err) @@ -653,7 +662,7 @@ func NewNode(opts *Options) (*Node, error) { setCodeHelper := setcode.NewSetCodeHelper( opts.Logger.With("component", "setcode_helper"), opts.KeySigner, - contractsBackend, + backend, chainID, ) @@ -670,6 +679,8 @@ func NewNode(opts *Options) (*Node, error) { opts.BidderBidTimeout, opts.Logger.With("component", "bidderapi"), setCodeHelper, + depositManagerContract, + backend, ) bidderapiv1.RegisterBidderServer(grpcServer, bidderAPI) @@ -710,11 +721,6 @@ func NewNode(opts *Options) (*Node, error) { nd.closers = append(nd.closers, channelCloserFunc(closeChan)) } - // TODO: Need amount for each provider, configured via json or yml - if opts.AutodepositAmount != nil { - // TODO: "set code" for bidder and set target amounts for each provider, also deposit to each provider. - } - started := make(chan struct{}) go func() { // signal that the server has started diff --git a/p2p/pkg/rpc/bidder/service.go b/p2p/pkg/rpc/bidder/service.go index 122a635a4..efd0823a1 100644 --- a/p2p/pkg/rpc/bidder/service.go +++ b/p2p/pkg/rpc/bidder/service.go @@ -12,7 +12,9 @@ import ( "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/crypto" bidderregistry "github.com/primev/mev-commit/contracts-abi/clients/BidderRegistry" + depositmanager "github.com/primev/mev-commit/contracts-abi/clients/DepositManager" providerregistry "github.com/primev/mev-commit/contracts-abi/clients/ProviderRegistry" bidderapiv1 "github.com/primev/mev-commit/p2p/gen/go/bidderapi/v1" preconfirmationv1 "github.com/primev/mev-commit/p2p/gen/go/preconfirmation/v1" @@ -37,6 +39,8 @@ type Service struct { validator *protovalidate.Validator bidTimeout time.Duration setCodeHelper SetCodeHelper + depositManager DepositManagerContract + backend Backend } func NewService( @@ -52,6 +56,8 @@ func NewService( bidderBidTimeout time.Duration, logger *slog.Logger, setCodeHelper SetCodeHelper, + depositManager DepositManagerContract, + backend Backend, ) *Service { return &Service{ owner: owner, @@ -67,6 +73,8 @@ func NewService( validator: validator, bidTimeout: bidderBidTimeout, setCodeHelper: setCodeHelper, + depositManager: depositManager, + backend: backend, } } @@ -108,6 +116,15 @@ type SetCodeHelper interface { SetCode(ctx context.Context, opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) } +type DepositManagerContract interface { + SetTargetDeposits(opts *bind.TransactOpts, providers []common.Address, amounts []*big.Int) (*types.Transaction, error) + ParseTargetDepositSet(types.Log) (*depositmanager.DepositmanagerTargetDepositSet, error) +} + +type Backend interface { + CodeAt(ctx context.Context, contract common.Address, blockNumber *big.Int) ([]byte, error) +} + type OptsGetter func(context.Context) (*bind.TransactOpts, error) func (s *Service) SendBid( @@ -506,34 +523,110 @@ func (s *Service) Withdraw( return nil, status.Errorf(codes.Internal, "missing log for withdraw") } -// TODO: bring all the old apis back cause you figured it out here... -// make sure auto deposit api is EXACT same as before as drop-in - -func (s *Service) EnableAutoDeposit(ctx context.Context) error { +func (s *Service) EnableDepositManager( + ctx context.Context, + r *bidderapiv1.EnableDepositManagerRequest, +) (*bidderapiv1.EnableDepositManagerResponse, error) { opts, err := s.optsGetter(ctx) if err != nil { s.logger.Error("getting transact opts", "error", err) - return status.Errorf(codes.Internal, "getting transact opts: %v", err) + return nil, status.Errorf(codes.Internal, "getting transact opts: %v", err) } - tx, err := s.setCodeHelper.SetCode(ctx, opts, s.owner) + // TODO: Config param for deposit manager + depositManagerAddr := common.HexToAddress("0x0000000000000000000000000000000000000000") + + tx, err := s.setCodeHelper.SetCode(ctx, opts, depositManagerAddr) if err != nil { s.logger.Error("setting code", "error", err) - return status.Errorf(codes.Internal, "setting code: %v", err) + return nil, status.Errorf(codes.Internal, "setting code: %v", err) } receipt, err := s.watcher.WaitForReceipt(ctx, tx) if err != nil { s.logger.Error("waiting for receipt", "error", err) - return status.Errorf(codes.Internal, "waiting for receipt: %v", err) + return nil, status.Errorf(codes.Internal, "waiting for receipt: %v", err) } if receipt.Status != types.ReceiptStatusSuccessful { s.logger.Error("receipt status", "status", receipt.Status) - return status.Errorf(codes.Internal, "receipt status: %v", receipt.Status) + return nil, status.Errorf(codes.Internal, "receipt status: %v", receipt.Status) } - return nil + return &bidderapiv1.EnableDepositManagerResponse{Success: true}, nil +} + +func (s *Service) SetTargetDeposits( + ctx context.Context, + r *bidderapiv1.SetTargetDepositsRequest, +) (*bidderapiv1.SetTargetDepositsResponse, error) { + opts, err := s.optsGetter(ctx) + if err != nil { + s.logger.Error("getting transact opts", "error", err) + return nil, status.Errorf(codes.Internal, "getting transact opts: %v", err) + } + + providers := make([]common.Address, len(r.TargetDeposits)) + amounts := make([]*big.Int, len(r.TargetDeposits)) + for i, targetDeposit := range r.TargetDeposits { + providers[i] = common.HexToAddress(targetDeposit.Provider) + amounts[i] = big.NewInt(int64(targetDeposit.TargetDeposit)) + } + tx, err := s.depositManager.SetTargetDeposits(opts, providers, amounts) + if err != nil { + s.logger.Error("setting target deposits", "error", err) + return nil, status.Errorf(codes.Internal, "setting target deposits: %v", err) + } + + receipt, err := s.watcher.WaitForReceipt(ctx, tx) + if err != nil { + s.logger.Error("waiting for receipt", "error", err) + return nil, status.Errorf(codes.Internal, "waiting for receipt: %v", err) + } + + if receipt.Status != types.ReceiptStatusSuccessful { + s.logger.Error("receipt status", "status", receipt.Status) + return nil, status.Errorf(codes.Internal, "receipt status: %v", receipt.Status) + } + + response := &bidderapiv1.SetTargetDepositsResponse{} + for _, log := range receipt.Logs { + if targetDeposit, err := s.depositManager.ParseTargetDepositSet(*log); err == nil { + response.SuccessfullySetDeposits = append(response.SuccessfullySetDeposits, &bidderapiv1.TargetDeposit{ + Provider: common.Bytes2Hex(targetDeposit.Provider.Bytes()), + TargetDeposit: targetDeposit.Amount.Uint64(), + }) + } + } + + return response, nil +} + +func (s *Service) DepositManagerStatus( + ctx context.Context, + _ *bidderapiv1.DepositManagerStatusRequest, +) (*bidderapiv1.DepositManagerStatusResponse, error) { + code, err := s.backend.CodeAt(ctx, s.owner, nil) + if err != nil { + s.logger.Error("getting code", "error", err) + return nil, status.Errorf(codes.Internal, "getting code: %v", err) + } + if len(code) == 0 { + s.logger.Info("deposit manager not enabled") + return &bidderapiv1.DepositManagerStatusResponse{Enabled: false}, nil + } + + // TODO: Config param for deposit manager + depositManagerAddr := common.HexToAddress("0x0000000000000000000000000000000000000000") + + codehash := crypto.Keccak256Hash(code) + expectedCodehash := crypto.Keccak256Hash(common.FromHex("0xef0100"), depositManagerAddr.Bytes()) + if codehash != expectedCodehash { + s.logger.Error("codehash is not correct", "actual", codehash, "expected", expectedCodehash) + return nil, status.Errorf(codes.Internal, "codehash is not correct") + } + + return &bidderapiv1.DepositManagerStatusResponse{Enabled: true}, nil } // TODO: api/handling for a bidder removing set code auth diff --git a/p2p/rpc/bidderapi/v1/bidderapi.proto b/p2p/rpc/bidderapi/v1/bidderapi.proto index d0b9d6d90..97f692f52 100644 --- a/p2p/rpc/bidderapi/v1/bidderapi.proto +++ b/p2p/rpc/bidderapi/v1/bidderapi.proto @@ -47,6 +47,29 @@ service Bidder { option (google.api.http) = {post: "/v1/bidder/deposit_evenly"}; } + // EnableDepositManager + // + // EnableDepositManager is called by the bidder node to enable the deposit manager via eip 7702. + rpc EnableDepositManager(EnableDepositManagerRequest) returns (EnableDepositManagerResponse) { + option (google.api.http) = {post: "/v1/bidder/enable_deposit_manager"}; + } + + // SetTargetDeposits + // + // SetTargetDeposits is called by the bidder node to set target deposits per provider + // within the deposit manager. + rpc SetTargetDeposits(SetTargetDepositsRequest) returns (SetTargetDepositsResponse) { + option (google.api.http) = {post: "/v1/bidder/set_target_deposits"}; + } + + // DepositManagerStatus + // + // DepositManagerStatus is called by the bidder node to query whether the bidder + // has enabled the deposit manager via eip 7702. + rpc DepositManagerStatus(DepositManagerStatusRequest) returns (DepositManagerStatusResponse) { + option (google.api.http) = {get: "/v1/bidder/deposit_manager_status"}; + } + // RequestWithdrawals // // RequestWithdrawals is called by the bidder node to request withdrawals from provider(s) @@ -165,6 +188,70 @@ message DepositEvenlyResponse { repeated string amounts = 2; } +message EnableDepositManagerRequest { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { + json_schema: { + title: "EnableDepositManager request" + description: "EnableDepositManager request." + } + }; +} + +message EnableDepositManagerResponse { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { + json_schema: { + title: "EnableDepositManager response" + description: "EnableDepositManager response." + } + }; + bool success = 1; +} + +message TargetDeposit { + string provider = 1; + uint64 target_deposit = 2; +} + +message SetTargetDepositsRequest { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { + json_schema: { + title: "OverrideTargetDepositsRequest request" + description: "OverrideTargetDepositsRequest request." + } + }; + repeated TargetDeposit target_deposits = 1; +} + +message SetTargetDepositsResponse { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { + json_schema: { + title: "OverrideTargetDepositsResponse response" + description: "OverrideTargetDepositsResponse response." + } + }; + repeated TargetDeposit successfully_set_deposits = 1; +} + +message DepositManagerStatusRequest { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { + json_schema: { + title: "DepositManagerStatus request" + description: "DepositManagerStatus request." + } + }; +} + +message DepositManagerStatusResponse { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { + json_schema: { + title: "DepositManagerStatus response" + description: "DepositManagerStatus response." + } + }; + bool enabled = 1; + repeated TargetDeposit target_deposits = 2; +} + message EmptyMessage {}; message GetDepositRequest { From 9e7c8974f0af3e41e60a049fbe2b3f659d1307dc Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 13 Aug 2025 23:29:34 -0700 Subject: [PATCH 061/117] Update service_test.go --- p2p/pkg/rpc/bidder/service_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/p2p/pkg/rpc/bidder/service_test.go b/p2p/pkg/rpc/bidder/service_test.go index 021f2f1d7..6bc004478 100644 --- a/p2p/pkg/rpc/bidder/service_test.go +++ b/p2p/pkg/rpc/bidder/service_test.go @@ -277,6 +277,8 @@ func startServerWithStore(t *testing.T, cs *testStore) bidderapiv1.BidderClient 15*time.Second, logger, setCodeHelper, + nil, // TODO: Make deposit manager non-nil and test relevant functions from service.go + nil, // TODO: Make backend non-nil and test relevant functions from service.go ) baseServer := grpc.NewServer() From 87598e86e2ca873153f8d4faaf00d84c97568e9c Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 13 Aug 2025 23:34:26 -0700 Subject: [PATCH 062/117] comment e2e tests --- testing/pkg/tests/deposit/deposit.go | 491 +++++++++++++-------------- testing/pkg/tests/preconf/preconf.go | 18 +- testing/pkg/tests/testcase.go | 5 +- 3 files changed, 250 insertions(+), 264 deletions(-) diff --git a/testing/pkg/tests/deposit/deposit.go b/testing/pkg/tests/deposit/deposit.go index 64e5e83f5..4ba84c2f6 100644 --- a/testing/pkg/tests/deposit/deposit.go +++ b/testing/pkg/tests/deposit/deposit.go @@ -1,259 +1,246 @@ package deposit -import ( - "context" - "fmt" - "math/big" - "sync/atomic" - - "github.com/ethereum/go-ethereum/common" - bidderregistry "github.com/primev/mev-commit/contracts-abi/clients/BidderRegistry" - blocktracker "github.com/primev/mev-commit/contracts-abi/clients/BlockTracker" - bidderapiv1 "github.com/primev/mev-commit/p2p/gen/go/bidderapi/v1" - "github.com/primev/mev-commit/testing/pkg/orchestrator" - "github.com/primev/mev-commit/x/contracts/events" - "golang.org/x/sync/errgroup" -) - const ( noOfWindows = 2 withdraw = true ) -func RunAutoDeposit(ctx context.Context, cluster orchestrator.Orchestrator, _ any) error { - bidders := cluster.Bidders() - logger := cluster.Logger().With("test", "autodeposit") - - deposits := make(chan *bidderregistry.BidderregistryBidderRegistered) - withdrawals := make(chan *bidderregistry.BidderregistryBidderWithdrawal) - window := make(chan *blocktracker.BlocktrackerNewWindow) - - // Listen for deposits and withdrawals - sub, err := cluster.Events().Subscribe( - events.NewEventHandler( - "BidderRegistered", - func(r *bidderregistry.BidderregistryBidderRegistered) { - deposits <- r - }, - ), - events.NewEventHandler( - "BidderWithdrawal", - func(r *bidderregistry.BidderregistryBidderWithdrawal) { - withdrawals <- r - }, - ), - events.NewEventHandler( - "NewWindow", - func(w *blocktracker.BlocktrackerNewWindow) { - window <- w - }, - ), - ) - if err != nil { - return err - } - - defer sub.Unsubscribe() - - var start atomic.Value - depositsRcvd := make(map[common.Address][]*bidderregistry.BidderregistryBidderRegistered) - withdrawalsRcvd := make(map[common.Address][]*bidderregistry.BidderregistryBidderWithdrawal) - - eg := errgroup.Group{} - egCtx, egCancel := context.WithCancel(ctx) - defer egCancel() - - eg.Go(func() error { - logger.Info("Starting test... waiting for new window") - for { - select { - case <-egCtx.Done(): - return nil - case r := <-deposits: - logger.Info("Received deposit", "bidder", r.Bidder) - depositsRcvd[r.Bidder] = append(depositsRcvd[r.Bidder], r) - case r := <-withdrawals: - logger.Info("Received withdrawal", "bidder", r.Bidder) - withdrawalsRcvd[r.Bidder] = append(withdrawalsRcvd[r.Bidder], r) - case w := <-window: - logger.Info("Received new window", "window", w.Window) - switch { - case start.Load() == nil: - for _, bidder := range bidders { - resp, err := bidder.BidderAPI().AutoDeposit(egCtx, &bidderapiv1.DepositRequest{ - Amount: "1000000000000000000", - }) - if err != nil { - return err - } - logger.Info( - "Auto deposit", - "bidder", bidder.EthAddress(), - "window", w.Window, - "response", resp, - ) - } - start.Store(new(big.Int).Add(w.Window, big.NewInt(1))) - logger.Info("Autodeposit", "start", start.Load()) - case new(big.Int).Sub(w.Window, start.Load().(*big.Int)).Cmp(big.NewInt(noOfWindows)) == 0: - logger.Info("Finish autodeposit checker", "window", w.Window) - return nil - } - } - } - }) - - if err := eg.Wait(); err != nil { - return err - } - - // ensure we have deposits from start window and withdrawals from start window - for _, bidder := range bidders { - depositsForBidder := depositsRcvd[common.HexToAddress(bidder.EthAddress())] - withdrawalsForBidder := withdrawalsRcvd[common.HexToAddress(bidder.EthAddress())] - - for i, deposit := range depositsForBidder { - expWindow := new(big.Int).Add(start.Load().(*big.Int), big.NewInt(int64(i))) - if deposit.WindowNumber.Cmp(expWindow) != 0 { - logger.Error( - "Deposit received in wrong window", - "bidder", bidder.EthAddress(), - "expected", expWindow, - "received", deposit.WindowNumber, - ) - return fmt.Errorf("deposit received in wrong window") - } - } - - for i, withdrawal := range withdrawalsForBidder { - expWindow := new(big.Int).Add(start.Load().(*big.Int), big.NewInt(int64(i))) - if withdrawal.Window.Cmp(expWindow) != 0 { - logger.Error( - "Withdrawal received in wrong window", - "bidder", bidder.EthAddress(), - "expected", expWindow, - "received", withdrawal.Window, - ) - return fmt.Errorf("withdrawal received in wrong window") - } - } - } - - return nil -} - -func RunCancelAutoDeposit(ctx context.Context, cluster orchestrator.Orchestrator, _ any) error { - bidders := cluster.Bidders() - logger := cluster.Logger().With("test", "cancel_autodeposit") - - deposits := make(chan *bidderregistry.BidderregistryBidderRegistered) - withdrawals := make(chan *bidderregistry.BidderregistryBidderWithdrawal) - window := make(chan *blocktracker.BlocktrackerNewWindow) - - // Listen for deposits and withdrawals - sub, err := cluster.Events().Subscribe( - events.NewEventHandler( - "BidderRegistered", - func(r *bidderregistry.BidderregistryBidderRegistered) { - deposits <- r - }, - ), - events.NewEventHandler( - "BidderWithdrawal", - func(r *bidderregistry.BidderregistryBidderWithdrawal) { - withdrawals <- r - }, - ), - events.NewEventHandler( - "NewWindow", - func(w *blocktracker.BlocktrackerNewWindow) { - window <- w - }, - ), - ) - if err != nil { - return err - } - - defer sub.Unsubscribe() - - var stop, end atomic.Value - depositsRcvd := make(map[common.Address][]*bidderregistry.BidderregistryBidderRegistered) - withdrawalsRcvd := make(map[common.Address][]*bidderregistry.BidderregistryBidderWithdrawal) - - eg, ctx := errgroup.WithContext(ctx) - egCtx, egCancel := context.WithCancel(ctx) - defer egCancel() - - eg.Go(func() error { - logger.Info("Starting test... waiting for new window") - for { - select { - case <-egCtx.Done(): - return nil - case r := <-deposits: - logger.Info("Received deposit", "bidder", r.Bidder) - depositsRcvd[r.Bidder] = append(depositsRcvd[r.Bidder], r) - if stop.Load() == nil { - for _, bidder := range bidders { - resp, err := bidder.BidderAPI().CancelAutoDeposit(egCtx, &bidderapiv1.CancelAutoDepositRequest{ - Withdraw: withdraw, - }) - if err != nil { - return err - } - logger.Info( - "Cancelled auto deposit", - "bidder", bidder.EthAddress(), - "window", r.WindowNumber, - "response", resp, - ) - } - stop.Store(new(big.Int).Add(r.WindowNumber, big.NewInt(1))) - end.Store(new(big.Int).Add(r.WindowNumber, big.NewInt(2))) - } - case r := <-withdrawals: - logger.Info("Received withdrawal", "bidder", r.Bidder) - withdrawalsRcvd[r.Bidder] = append(withdrawalsRcvd[r.Bidder], r) - case w := <-window: - logger.Info("Received new window", "window", w.Window) - if end.Load() != nil && w.Window.Cmp(end.Load().(*big.Int)) == 0 { - logger.Info("Finished test", "window", w.Window) - return nil - } - } - } - }) - - if err := eg.Wait(); err != nil { - return err - } - - for _, bidder := range bidders { - depositsForBidder := depositsRcvd[common.HexToAddress(bidder.EthAddress())] - withdrawalsForBidder := withdrawalsRcvd[common.HexToAddress(bidder.EthAddress())] - - if depositsForBidder[len(depositsForBidder)-1].WindowNumber.Cmp(stop.Load().(*big.Int)) == 1 { - logger.Error( - "Last deposit received after stop window", - "bidder", bidder.EthAddress(), - "stop", stop.Load(), - "received", depositsForBidder[len(depositsForBidder)-1].WindowNumber, - ) - return fmt.Errorf("deposit received after stop window") - } - - // last withdrawal should be 1 less than the stop window - if withdrawalsForBidder[len(withdrawalsForBidder)-1].Window.Cmp(stop.Load().(*big.Int)) != -1 { - logger.Error( - "Last withdrawal received after stop window", - "bidder", bidder.EthAddress(), - "stop", stop.Load(), - "received", withdrawalsForBidder[len(withdrawalsForBidder)-1].Window, - ) - return fmt.Errorf("withdrawal received after stop window") - } - } - - return nil -} +// TODO: Adjust this file to test new bidder semantics + +// func RunAutoDeposit(ctx context.Context, cluster orchestrator.Orchestrator, _ any) error { +// bidders := cluster.Bidders() +// logger := cluster.Logger().With("test", "autodeposit") + +// deposits := make(chan *bidderregistry.BidderregistryBidderRegistered) +// withdrawals := make(chan *bidderregistry.BidderregistryBidderWithdrawal) +// window := make(chan *blocktracker.BlocktrackerNewWindow) + +// // Listen for deposits and withdrawals +// sub, err := cluster.Events().Subscribe( +// events.NewEventHandler( +// "BidderRegistered", +// func(r *bidderregistry.BidderregistryBidderRegistered) { +// deposits <- r +// }, +// ), +// events.NewEventHandler( +// "BidderWithdrawal", +// func(r *bidderregistry.BidderregistryBidderWithdrawal) { +// withdrawals <- r +// }, +// ), +// events.NewEventHandler( +// "NewWindow", +// func(w *blocktracker.BlocktrackerNewWindow) { +// window <- w +// }, +// ), +// ) +// if err != nil { +// return err +// } + +// defer sub.Unsubscribe() + +// var start atomic.Value +// depositsRcvd := make(map[common.Address][]*bidderregistry.BidderregistryBidderRegistered) +// withdrawalsRcvd := make(map[common.Address][]*bidderregistry.BidderregistryBidderWithdrawal) + +// eg := errgroup.Group{} +// egCtx, egCancel := context.WithCancel(ctx) +// defer egCancel() + +// eg.Go(func() error { +// logger.Info("Starting test... waiting for new window") +// for { +// select { +// case <-egCtx.Done(): +// return nil +// case r := <-deposits: +// logger.Info("Received deposit", "bidder", r.Bidder) +// depositsRcvd[r.Bidder] = append(depositsRcvd[r.Bidder], r) +// case r := <-withdrawals: +// logger.Info("Received withdrawal", "bidder", r.Bidder) +// withdrawalsRcvd[r.Bidder] = append(withdrawalsRcvd[r.Bidder], r) +// case w := <-window: +// logger.Info("Received new window", "window", w.Window) +// switch { +// case start.Load() == nil: +// for _, bidder := range bidders { +// resp, err := bidder.BidderAPI().AutoDeposit(egCtx, &bidderapiv1.DepositRequest{ +// Amount: "1000000000000000000", +// }) +// if err != nil { +// return err +// } +// logger.Info( +// "Auto deposit", +// "bidder", bidder.EthAddress(), +// "window", w.Window, +// "response", resp, +// ) +// } +// start.Store(new(big.Int).Add(w.Window, big.NewInt(1))) +// logger.Info("Autodeposit", "start", start.Load()) +// case new(big.Int).Sub(w.Window, start.Load().(*big.Int)).Cmp(big.NewInt(noOfWindows)) == 0: +// logger.Info("Finish autodeposit checker", "window", w.Window) +// return nil +// } +// } +// } +// }) + +// if err := eg.Wait(); err != nil { +// return err +// } + +// // ensure we have deposits from start window and withdrawals from start window +// for _, bidder := range bidders { +// depositsForBidder := depositsRcvd[common.HexToAddress(bidder.EthAddress())] +// withdrawalsForBidder := withdrawalsRcvd[common.HexToAddress(bidder.EthAddress())] + +// for i, deposit := range depositsForBidder { +// expWindow := new(big.Int).Add(start.Load().(*big.Int), big.NewInt(int64(i))) +// if deposit.WindowNumber.Cmp(expWindow) != 0 { +// logger.Error( +// "Deposit received in wrong window", +// "bidder", bidder.EthAddress(), +// "expected", expWindow, +// "received", deposit.WindowNumber, +// ) +// return fmt.Errorf("deposit received in wrong window") +// } +// } + +// for i, withdrawal := range withdrawalsForBidder { +// expWindow := new(big.Int).Add(start.Load().(*big.Int), big.NewInt(int64(i))) +// if withdrawal.Window.Cmp(expWindow) != 0 { +// logger.Error( +// "Withdrawal received in wrong window", +// "bidder", bidder.EthAddress(), +// "expected", expWindow, +// "received", withdrawal.Window, +// ) +// return fmt.Errorf("withdrawal received in wrong window") +// } +// } +// } + +// return nil +// } + +// func RunCancelAutoDeposit(ctx context.Context, cluster orchestrator.Orchestrator, _ any) error { +// bidders := cluster.Bidders() +// logger := cluster.Logger().With("test", "cancel_autodeposit") + +// deposits := make(chan *bidderregistry.BidderregistryBidderRegistered) +// withdrawals := make(chan *bidderregistry.BidderregistryBidderWithdrawal) +// window := make(chan *blocktracker.BlocktrackerNewWindow) + +// // Listen for deposits and withdrawals +// sub, err := cluster.Events().Subscribe( +// events.NewEventHandler( +// "BidderRegistered", +// func(r *bidderregistry.BidderregistryBidderRegistered) { +// deposits <- r +// }, +// ), +// events.NewEventHandler( +// "BidderWithdrawal", +// func(r *bidderregistry.BidderregistryBidderWithdrawal) { +// withdrawals <- r +// }, +// ), +// events.NewEventHandler( +// "NewWindow", +// func(w *blocktracker.BlocktrackerNewWindow) { +// window <- w +// }, +// ), +// ) +// if err != nil { +// return err +// } + +// defer sub.Unsubscribe() + +// var stop, end atomic.Value +// depositsRcvd := make(map[common.Address][]*bidderregistry.BidderregistryBidderRegistered) +// withdrawalsRcvd := make(map[common.Address][]*bidderregistry.BidderregistryBidderWithdrawal) + +// eg, ctx := errgroup.WithContext(ctx) +// egCtx, egCancel := context.WithCancel(ctx) +// defer egCancel() + +// eg.Go(func() error { +// logger.Info("Starting test... waiting for new window") +// for { +// select { +// case <-egCtx.Done(): +// return nil +// case r := <-deposits: +// logger.Info("Received deposit", "bidder", r.Bidder) +// depositsRcvd[r.Bidder] = append(depositsRcvd[r.Bidder], r) +// if stop.Load() == nil { +// for _, bidder := range bidders { +// resp, err := bidder.BidderAPI().CancelAutoDeposit(egCtx, &bidderapiv1.CancelAutoDepositRequest{ +// Withdraw: withdraw, +// }) +// if err != nil { +// return err +// } +// logger.Info( +// "Cancelled auto deposit", +// "bidder", bidder.EthAddress(), +// "window", r.WindowNumber, +// "response", resp, +// ) +// } +// stop.Store(new(big.Int).Add(r.WindowNumber, big.NewInt(1))) +// end.Store(new(big.Int).Add(r.WindowNumber, big.NewInt(2))) +// } +// case r := <-withdrawals: +// logger.Info("Received withdrawal", "bidder", r.Bidder) +// withdrawalsRcvd[r.Bidder] = append(withdrawalsRcvd[r.Bidder], r) +// case w := <-window: +// logger.Info("Received new window", "window", w.Window) +// if end.Load() != nil && w.Window.Cmp(end.Load().(*big.Int)) == 0 { +// logger.Info("Finished test", "window", w.Window) +// return nil +// } +// } +// } +// }) + +// if err := eg.Wait(); err != nil { +// return err +// } + +// for _, bidder := range bidders { +// depositsForBidder := depositsRcvd[common.HexToAddress(bidder.EthAddress())] +// withdrawalsForBidder := withdrawalsRcvd[common.HexToAddress(bidder.EthAddress())] + +// if depositsForBidder[len(depositsForBidder)-1].WindowNumber.Cmp(stop.Load().(*big.Int)) == 1 { +// logger.Error( +// "Last deposit received after stop window", +// "bidder", bidder.EthAddress(), +// "stop", stop.Load(), +// "received", depositsForBidder[len(depositsForBidder)-1].WindowNumber, +// ) +// return fmt.Errorf("deposit received after stop window") +// } + +// // last withdrawal should be 1 less than the stop window +// if withdrawalsForBidder[len(withdrawalsForBidder)-1].Window.Cmp(stop.Load().(*big.Int)) != -1 { +// logger.Error( +// "Last withdrawal received after stop window", +// "bidder", bidder.EthAddress(), +// "stop", stop.Load(), +// "received", withdrawalsForBidder[len(withdrawalsForBidder)-1].Window, +// ) +// return fmt.Errorf("withdrawal received after stop window") +// } +// } + +// return nil +// } diff --git a/testing/pkg/tests/preconf/preconf.go b/testing/pkg/tests/preconf/preconf.go index 4e5fd3f4f..699372229 100644 --- a/testing/pkg/tests/preconf/preconf.go +++ b/testing/pkg/tests/preconf/preconf.go @@ -53,8 +53,8 @@ var ( return fmt.Sprintf("settle/%s", cmtIdx) } - fundsRetrievedKey = func(cmtDigest []byte) string { - return fmt.Sprintf("fr/%s", string(cmtDigest)) + fundsUnlockedKey = func(cmtDigest []byte) string { + return fmt.Sprintf("fu/%s", string(cmtDigest)) } fundsRewardedKey = func(cmtDigest []byte) string { @@ -124,10 +124,10 @@ func RunPreconf(ctx context.Context, cluster orchestrator.Orchestrator, _ any) e }, ), events.NewEventHandler( - "FundsRetrieved", - func(c *bidderregistry.BidderregistryFundsRetrieved) { - logger.Info("Retrieved funds", "digest", hex.EncodeToString(c.CommitmentDigest[:])) - store.Insert(fundsRetrievedKey(c.CommitmentDigest[:]), c) + "FundsUnlocked", + func(c *bidderregistry.BidderregistryFundsUnlocked) { + logger.Info("Unlocked funds", "digest", hex.EncodeToString(c.CommitmentDigest[:])) + store.Insert(fundsUnlockedKey(c.CommitmentDigest[:]), c) }, ), events.NewEventHandler( @@ -402,10 +402,10 @@ DONE: logger.Error("Provider should be slashed", "entry", entry) return fmt.Errorf("provider should be slashed") } - _, ok := store.Get(fundsRetrievedKey(cmtDigest)) + _, ok := store.Get(fundsUnlockedKey(cmtDigest)) if !ok { - logger.Error("Funds not retrieved", "entry", entry) - return fmt.Errorf("funds not retrieved") + logger.Error("Funds not unlocked", "entry", entry) + return fmt.Errorf("funds not unlocked") } bidderPortion := new(big.Int).Add(residualBidAmt, slashAmount) diff --git a/testing/pkg/tests/testcase.go b/testing/pkg/tests/testcase.go index d5b240f2e..1f8d72e1a 100644 --- a/testing/pkg/tests/testcase.go +++ b/testing/pkg/tests/testcase.go @@ -6,7 +6,6 @@ import ( "github.com/primev/mev-commit/testing/pkg/orchestrator" "github.com/primev/mev-commit/testing/pkg/tests/bridge" "github.com/primev/mev-commit/testing/pkg/tests/connectivity" - "github.com/primev/mev-commit/testing/pkg/tests/deposit" "github.com/primev/mev-commit/testing/pkg/tests/preconf" "github.com/primev/mev-commit/testing/pkg/tests/staking" ) @@ -23,7 +22,7 @@ var TestCases = []TestEntry{ {"staking", staking.Run}, {"staking_add_deposit", staking.RunAddDeposit}, {"connectivity", connectivity.Run}, - {"autodeposit", deposit.RunAutoDeposit}, + // {"autodeposit", deposit.RunAutoDeposit}, {"preconf", preconf.RunPreconf}, - {"cancelAutodeposit", deposit.RunCancelAutoDeposit}, + // {"cancelAutodeposit", deposit.RunCancelAutoDeposit}, } From 2ca8cc1da5f27a3264247e7f8e0794a42733b84d Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 13 Aug 2025 23:43:28 -0700 Subject: [PATCH 063/117] go work sync --- p2p/go.mod | 19 ++++++++++++++++++- p2p/go.sum | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 1 deletion(-) diff --git a/p2p/go.mod b/p2p/go.mod index 0425eabf9..6fbe7f03b 100644 --- a/p2p/go.mod +++ b/p2p/go.mod @@ -18,6 +18,7 @@ require ( github.com/google/go-cmp v0.6.0 github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 github.com/hashicorp/golang-lru/v2 v2.0.7 + github.com/holiman/uint256 v1.3.2 github.com/libp2p/go-libp2p v0.35.3 github.com/libp2p/go-msgio v0.3.0 github.com/multiformats/go-multiaddr v0.12.4 @@ -44,6 +45,7 @@ require ( github.com/DataDog/zstd v1.5.5 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect github.com/StackExchange/wmi v1.2.1 // indirect + github.com/VictoriaMetrics/fastcache v1.12.2 // indirect github.com/antlr4-go/antlr/v4 v4.13.0 // indirect github.com/benbjohnson/clock v1.3.5 // indirect github.com/beorn7/perks v1.0.1 // indirect @@ -77,14 +79,18 @@ require ( github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect + github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang-jwt/jwt/v4 v4.5.1 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/cel-go v0.20.0 // indirect github.com/google/gopacket v1.1.19 // indirect github.com/google/pprof v0.0.0-20240207164012-fb44976bdcd5 // indirect github.com/google/uuid v1.6.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect - github.com/holiman/uint256 v1.3.2 // indirect + github.com/hashicorp/go-bexpr v0.1.10 // indirect + github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 // indirect + github.com/holiman/bloomfilter/v2 v2.0.3 // indirect github.com/huin/goupnp v1.3.0 // indirect github.com/ipfs/go-cid v0.4.1 // indirect github.com/ipfs/go-log/v2 v2.5.1 // indirect @@ -103,11 +109,15 @@ require ( github.com/libp2p/go-reuseport v0.4.0 // indirect github.com/libp2p/go-yamux/v4 v4.0.1 // indirect github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect + github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect github.com/miekg/dns v1.1.58 // indirect github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect github.com/minio/sha256-simd v1.0.1 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mitchellh/pointerstructure v1.2.0 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/mr-tron/base58 v1.2.0 // indirect github.com/multiformats/go-base32 v0.1.0 // indirect @@ -119,6 +129,7 @@ require ( github.com/multiformats/go-multistream v0.5.0 // indirect github.com/multiformats/go-varint v0.0.7 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/onsi/ginkgo/v2 v2.15.0 // indirect github.com/opencontainers/runtime-spec v1.2.0 // indirect github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect @@ -135,7 +146,9 @@ require ( github.com/pion/sdp/v3 v3.0.9 // indirect github.com/pion/srtp/v2 v2.0.18 // indirect github.com/pion/stun v0.6.1 // indirect + github.com/pion/stun/v2 v2.0.0 // indirect github.com/pion/transport/v2 v2.2.5 // indirect + github.com/pion/transport/v3 v3.0.2 // indirect github.com/pion/turn/v2 v2.1.6 // indirect github.com/pion/webrtc/v3 v3.2.40 // indirect github.com/pkg/errors v0.9.1 // indirect @@ -147,12 +160,15 @@ require ( github.com/quic-go/quic-go v0.44.0 // indirect github.com/quic-go/webtransport-go v0.8.0 // indirect github.com/raulk/go-watchdog v1.3.0 // indirect + github.com/rivo/uniseg v0.4.7 // indirect github.com/rogpeppe/go-internal v1.12.0 // indirect + github.com/rs/cors v1.8.3 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/stoewer/go-strcase v1.3.0 // indirect github.com/supranational/blst v0.3.14 // indirect + github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect github.com/tklauser/go-sysconf v0.3.13 // indirect github.com/tklauser/numcpus v0.7.0 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect @@ -175,6 +191,7 @@ require ( golang.org/x/sys v0.30.0 // indirect golang.org/x/text v0.22.0 // indirect golang.org/x/tools v0.29.0 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect lukechampine.com/blake3 v1.2.1 // indirect rsc.io/tmplfunc v0.0.3 // indirect diff --git a/p2p/go.sum b/p2p/go.sum index 45ed1d317..c0a4a212d 100644 --- a/p2p/go.sum +++ b/p2p/go.sum @@ -22,6 +22,8 @@ github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDO github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI= github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g= @@ -44,6 +46,7 @@ github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK3 github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= @@ -125,6 +128,7 @@ github.com/flynn/noise v1.1.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwU github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= @@ -164,15 +168,25 @@ github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/cel-go v0.20.0 h1:h4n6DOCppEMpWERzllyNkntl7JrDyxoE543KWS6BLpc= github.com/google/cel-go v0.20.0/go.mod h1:kWcIzTsPX0zmQ+H3TirHstLLf9ep5QTsZBN9u4dOYLg= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= @@ -212,6 +226,7 @@ github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZ github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.3.2 h1:a9EgMPSC1AAaj1SZL5zIQD3WbwTuHrMGOerLjGmM/TA= github.com/holiman/uint256 v1.3.2/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/influxdata/influxdb-client-go/v2 v2.4.0 h1:HGBfZYStlx3Kqvsv1h2pJixbCl/jhnFtxpKFAv9Tu5k= @@ -280,8 +295,10 @@ github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= @@ -299,6 +316,7 @@ github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8Rv github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= @@ -339,10 +357,20 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= +github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.15.0 h1:79HwNRBAZHOEwrczrgSOPy+eFTTlIGELKy5as+ClttY= github.com/onsi/ginkgo/v2 v2.15.0/go.mod h1:HlxMHtYF57y6Dpf+mc5529KKmSq9h2FpCF+/ZkwUxKM= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= @@ -430,6 +458,7 @@ github.com/quic-go/webtransport-go v0.8.0 h1:HxSrwun11U+LlmwpgM1kEqIqH90IT4N8auv github.com/quic-go/webtransport-go v0.8.0/go.mod h1:N99tjprW432Ut5ONql/aUhSLT0YVSlwHohQsuac9WaM= github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk= github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= @@ -597,6 +626,8 @@ golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= @@ -636,10 +667,16 @@ golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -649,6 +686,7 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -657,6 +695,7 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= @@ -674,6 +713,7 @@ golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= @@ -729,6 +769,12 @@ google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= @@ -738,12 +784,17 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From 6a7e6dae6aec6966ca1eb0f127860d0e6b2f0718 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 13 Aug 2025 23:51:15 -0700 Subject: [PATCH 064/117] appease linter --- p2p/pkg/depositmanager/deposit_test.go | 15 ++++++++++++--- p2p/pkg/setcode/setcode_test.go | 6 +++++- testing/pkg/tests/deposit/deposit.go | 4 ++-- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/p2p/pkg/depositmanager/deposit_test.go b/p2p/pkg/depositmanager/deposit_test.go index 65575c8f4..af5e98f8c 100644 --- a/p2p/pkg/depositmanager/deposit_test.go +++ b/p2p/pkg/depositmanager/deposit_test.go @@ -165,13 +165,16 @@ func TestDepositManager(t *testing.T) { t.Fatal("expected balance of 90") } - publishBidderWithdrawalRequested(evtMgr, &brABI, &bidderregistry.BidderregistryWithdrawalRequested{ + err = publishBidderWithdrawalRequested(evtMgr, &brABI, &bidderregistry.BidderregistryWithdrawalRequested{ Bidder: common.HexToAddress("0x123"), Provider: common.HexToAddress("0x456"), AvailableAmount: big.NewInt(10), EscrowedAmount: big.NewInt(10), Timestamp: big.NewInt(1000), }) + if err != nil { + t.Fatal(err) + } for { if val, err := st.GetBalance( @@ -183,12 +186,15 @@ func TestDepositManager(t *testing.T) { time.Sleep(1 * time.Second) } - publishBidderWithdrawal(evtMgr, &brABI, &bidderregistry.BidderregistryBidderWithdrawal{ + err = publishBidderWithdrawal(evtMgr, &brABI, &bidderregistry.BidderregistryBidderWithdrawal{ Bidder: common.HexToAddress("0x123"), Provider: common.HexToAddress("0x456"), AmountWithdrawn: big.NewInt(10), AmountStillEscrowed: big.NewInt(10), }) + if err != nil { + t.Fatal(err) + } for { count, err := st.BalanceEntries(common.HexToAddress("0x123")) @@ -201,11 +207,14 @@ func TestDepositManager(t *testing.T) { time.Sleep(1 * time.Second) } - publishBidderDeposited(evtMgr, &brABI, &bidderregistry.BidderregistryBidderDeposited{ + err = publishBidderDeposited(evtMgr, &brABI, &bidderregistry.BidderregistryBidderDeposited{ Bidder: common.HexToAddress("0x123"), Provider: common.HexToAddress("0x456"), DepositedAmount: big.NewInt(777), }) + if err != nil { + t.Fatal(err) + } for { if val, err := st.GetBalance( diff --git a/p2p/pkg/setcode/setcode_test.go b/p2p/pkg/setcode/setcode_test.go index fbcb7d8d0..eeb3704a5 100644 --- a/p2p/pkg/setcode/setcode_test.go +++ b/p2p/pkg/setcode/setcode_test.go @@ -34,7 +34,11 @@ func TestSetCode(t *testing.T) { sender: {Balance: big.NewInt(0).Mul(big.NewInt(1e18), big.NewInt(100))}, // 100 ETH } sim := simulated.NewBackend(genesisAlloc) - defer sim.Close() + defer func() { + if err := sim.Close(); err != nil { + t.Fatalf("failed to close simulated backend: %v", err) + } + }() tx := types.NewTransaction(0, sender, big.NewInt(1e18), 21000, big.NewInt(1e9), nil) tx, err = ks.SignTx(tx, big.NewInt(1337)) diff --git a/testing/pkg/tests/deposit/deposit.go b/testing/pkg/tests/deposit/deposit.go index 4ba84c2f6..1d4eca1d2 100644 --- a/testing/pkg/tests/deposit/deposit.go +++ b/testing/pkg/tests/deposit/deposit.go @@ -1,8 +1,8 @@ package deposit const ( - noOfWindows = 2 - withdraw = true +// noOfWindows = 2 +// withdraw = true ) // TODO: Adjust this file to test new bidder semantics From a902d0bdd554cab2daa54fa235c5b37803c0bd1f Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 13 Aug 2025 23:57:23 -0700 Subject: [PATCH 065/117] Update deposit_test.go --- p2p/pkg/depositmanager/deposit_test.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/p2p/pkg/depositmanager/deposit_test.go b/p2p/pkg/depositmanager/deposit_test.go index af5e98f8c..cc8e8c1fc 100644 --- a/p2p/pkg/depositmanager/deposit_test.go +++ b/p2p/pkg/depositmanager/deposit_test.go @@ -275,7 +275,7 @@ func TestStartWithBidderAlreadyDeposited(t *testing.T) { dm := depositmanager.NewDepositManager(st, evtMgr, bidderRegistry, logger) done := dm.Start(ctx) - publishBidderDeposited(evtMgr, &brABI, &bidderregistry.BidderregistryBidderDeposited{ + err = publishBidderDeposited(evtMgr, &brABI, &bidderregistry.BidderregistryBidderDeposited{ Bidder: common.HexToAddress("0x123"), Provider: common.HexToAddress("0x456"), DepositedAmount: big.NewInt(100), @@ -283,6 +283,9 @@ func TestStartWithBidderAlreadyDeposited(t *testing.T) { BlockNumber: 16, }, }) + if err != nil { + t.Fatal(err) + } for { if val, err := st.GetBalance( From b50f264e8b85dcc97b55a4d0a78ec100f78dd9a0 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Thu, 14 Aug 2025 00:06:41 -0700 Subject: [PATCH 066/117] Update DepositManager.sol --- contracts/contracts/core/DepositManager.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/contracts/core/DepositManager.sol b/contracts/contracts/core/DepositManager.sol index db0aaf5e6..475a40021 100644 --- a/contracts/contracts/core/DepositManager.sol +++ b/contracts/contracts/core/DepositManager.sol @@ -44,7 +44,7 @@ contract DepositManager { uint256[] calldata amounts ) external onlyThisEOA { uint256 length = providers.length; - for (uint256 i = 0; i < length; i++) { + for (uint256 i = 0; i < length; ++i) { targetDeposits[providers[i]] = amounts[i]; emit TargetDepositSet(providers[i], amounts[i]); } From 11d1c2beea5398682c7a10cb353ec0d3d5a36967 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Tue, 19 Aug 2025 11:10:59 -0700 Subject: [PATCH 067/117] nit --- contracts/contracts/core/DepositManager.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/contracts/core/DepositManager.sol b/contracts/contracts/core/DepositManager.sol index 475a40021..6383746fa 100644 --- a/contracts/contracts/core/DepositManager.sol +++ b/contracts/contracts/core/DepositManager.sol @@ -26,8 +26,8 @@ contract DepositManager { _; } - constructor(address _registry, uint256 _minBalance) { - BIDDER_REGISTRY = _registry; + constructor(address _bidderRegistry, uint256 _minBalance) { + BIDDER_REGISTRY = _bidderRegistry; MIN_BALANCE = _minBalance; } From 1948fd0b2494af4c4cc27e0d9fcdc33987972e5a Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Tue, 19 Aug 2025 11:32:30 -0700 Subject: [PATCH 068/117] more nit --- contracts/contracts/core/BidderRegistry.sol | 43 ++++++++++--------- .../contracts/interfaces/IBidderRegistry.sol | 2 +- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/contracts/contracts/core/BidderRegistry.sol b/contracts/contracts/core/BidderRegistry.sol index b59886fb5..5245b69ed 100644 --- a/contracts/contracts/core/BidderRegistry.sol +++ b/contracts/contracts/core/BidderRegistry.sol @@ -181,8 +181,13 @@ contract BidderRegistry is ) external nonReentrant onlyPreconfManager whenNotPaused { BidState storage bidState = bidPayment[commitmentDigest]; require(bidState.state == State.PreConfirmed, BidNotPreConfirmed(commitmentDigest, bidState.state, State.PreConfirmed)); - - uint256 decayedAmt = (bidState.bidAmt * + + address bidder = bidState.bidder; + uint256 bidAmt = bidState.bidAmt; + bidState.state = State.Settled; + bidState.bidAmt = 0; + + uint256 decayedAmt = (bidAmt * residualBidPercentAfterDecay) / ONE_HUNDRED_PERCENT; uint256 feeAmt = (decayedAmt * feePercent) / @@ -197,24 +202,21 @@ contract BidderRegistry is providerAmount[provider] += amtMinusFeeAndDecay; // Transfer non-rewarded funds back to the bidder wallet - uint256 fundsToReturn = bidState.bidAmt - decayedAmt; + uint256 fundsToReturn = bidAmt - decayedAmt; if (fundsToReturn > 0) { - if (!payable(bidState.bidder).send(fundsToReturn)) { + if (!payable(bidder).send(fundsToReturn)) { // edge case, when bidder is rejecting transfer - emit TransferToBidderFailed(bidState.bidder, fundsToReturn); - deposits[bidState.bidder][provider].availableAmount += fundsToReturn; + emit TransferToBidderFailed(bidder, fundsToReturn); + deposits[bidder][provider].availableAmount += fundsToReturn; } } - Deposit storage deposit = deposits[bidState.bidder][provider]; - deposit.escrowedAmount -= bidState.bidAmt; - - bidState.state = State.Withdrawn; - bidState.bidAmt = 0; + Deposit storage deposit = deposits[bidder][provider]; + deposit.escrowedAmount -= bidAmt; emit FundsRewarded( commitmentDigest, - bidState.bidder, + bidder, provider, decayedAmt ); @@ -234,19 +236,20 @@ contract BidderRegistry is BidState storage bidState = bidPayment[commitmentDigest]; require(bidState.state == State.PreConfirmed, BidNotPreConfirmed(commitmentDigest, bidState.state, State.PreConfirmed)); - uint256 amt = bidState.bidAmt; - bidState.state = State.Withdrawn; + address bidder = bidState.bidder; + uint256 bidAmt = bidState.bidAmt; + bidState.state = State.Settled; bidState.bidAmt = 0; - Deposit storage deposit = deposits[bidState.bidder][provider]; - deposit.escrowedAmount -= amt; + Deposit storage deposit = deposits[bidder][provider]; + deposit.escrowedAmount -= bidAmt; - if (!payable(bidState.bidder).send(amt)) { - emit TransferToBidderFailed(bidState.bidder, amt); - deposit.availableAmount += amt; + if (!payable(bidder).send(bidAmt)) { + emit TransferToBidderFailed(bidder, bidAmt); + deposit.availableAmount += bidAmt; } - emit FundsUnlocked(commitmentDigest, bidState.bidder, provider, amt); + emit FundsUnlocked(commitmentDigest, bidder, provider, bidAmt); } /** diff --git a/contracts/contracts/interfaces/IBidderRegistry.sol b/contracts/contracts/interfaces/IBidderRegistry.sol index 062e048f1..2c53a27ea 100644 --- a/contracts/contracts/interfaces/IBidderRegistry.sol +++ b/contracts/contracts/interfaces/IBidderRegistry.sol @@ -7,7 +7,7 @@ interface IBidderRegistry { enum State { Undefined, PreConfirmed, - Withdrawn + Settled } struct OpenedCommitment { From 40539c55d43bbcc691a9072f793b67939b6d44fa Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Tue, 19 Aug 2025 11:47:57 -0700 Subject: [PATCH 069/117] nit --- contracts/contracts/core/BidderRegistry.sol | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/contracts/core/BidderRegistry.sol b/contracts/contracts/core/BidderRegistry.sol index 5245b69ed..8718095db 100644 --- a/contracts/contracts/core/BidderRegistry.sol +++ b/contracts/contracts/core/BidderRegistry.sol @@ -187,6 +187,9 @@ contract BidderRegistry is bidState.state = State.Settled; bidState.bidAmt = 0; + Deposit storage deposit = deposits[bidder][provider]; + deposit.escrowedAmount -= bidAmt; + uint256 decayedAmt = (bidAmt * residualBidPercentAfterDecay) / ONE_HUNDRED_PERCENT; @@ -207,13 +210,10 @@ contract BidderRegistry is if (!payable(bidder).send(fundsToReturn)) { // edge case, when bidder is rejecting transfer emit TransferToBidderFailed(bidder, fundsToReturn); - deposits[bidder][provider].availableAmount += fundsToReturn; + deposit.availableAmount += fundsToReturn; } } - Deposit storage deposit = deposits[bidder][provider]; - deposit.escrowedAmount -= bidAmt; - emit FundsRewarded( commitmentDigest, bidder, From be0690ac09e2f98d425c8c85697eb918b588b210 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Tue, 19 Aug 2025 13:52:55 -0700 Subject: [PATCH 070/117] Update main.go --- p2p/integrationtest/real-bidder/main.go | 81 +++++++++++++++++++------ 1 file changed, 64 insertions(+), 17 deletions(-) diff --git a/p2p/integrationtest/real-bidder/main.go b/p2p/integrationtest/real-bidder/main.go index 25b069ceb..8d730fa0b 100644 --- a/p2p/integrationtest/real-bidder/main.go +++ b/p2p/integrationtest/real-bidder/main.go @@ -20,6 +20,7 @@ import ( "github.com/ethereum/go-ethereum/ethclient" "github.com/go-logr/logr" pb "github.com/primev/mev-commit/p2p/gen/go/bidderapi/v1" + debugapiv1 "github.com/primev/mev-commit/p2p/gen/go/debugapi/v1" "github.com/primev/mev-commit/x/util" "github.com/primev/mev-commit/x/util/otelutil" "github.com/prometheus/client_golang/prometheus" @@ -187,25 +188,71 @@ func main() { return } - // TODO: set code to deposit manager here, set min deposit for every provider + var providerAddress string + debugClient := debugapiv1.NewDebugServiceClient(conn) + retries := 10 + for range retries { + ctx, cancel := context.WithTimeout(context.Background(), time.Second) + topology, err := debugClient.GetTopology(ctx, &debugapiv1.EmptyMessage{}) + cancel() + if err != nil { + logger.Error("failed to get topology", "err", err) + continue + } + if f, ok := topology.Topology.Fields["connected_providers"]; ok { + vals := f.GetListValue().GetValues() + if len(vals) > 0 { + providerAddress = vals[0].GetStringValue() + break + } + } + time.Sleep(time.Second) + } + + if providerAddress == "" { + logger.Error("no connected provider found") + return + } + fmt.Println("min deposit", minDeposit) - // status, err := bidderClient.AutoDepositStatus(context.Background(), &pb.EmptyMessage{}) - // if err != nil { - // logger.Error("failed to get auto deposit status", "err", err) - // return - // } - - // if !status.IsAutodepositEnabled { - // resp, err := bidderClient.AutoDeposit(context.Background(), &pb.DepositRequest{ - // Amount: minDeposit.String(), - // }) - // if err != nil { - // logger.Error("failed to auto deposit", "err", err) - // return - // } - // logger.Info("auto deposit", "amount", resp.AmountPerWindow, "window", resp.StartWindowNumber) - // } + status, err := bidderClient.DepositManagerStatus(context.Background(), &pb.DepositManagerStatusRequest{}) + if err != nil { + logger.Error("failed to get auto deposit status", "err", err) + return + } + + if !status.Enabled { + resp, err := bidderClient.EnableDepositManager(context.Background(), &pb.EnableDepositManagerRequest{}) + if err != nil { + logger.Error("failed to enable deposit manager", "err", err) + return + } + if !resp.Success { + logger.Error("failed to enable deposit manager") + return + } + logger.Info("deposit manager enabled") + } + + resp, err := bidderClient.SetTargetDeposits(context.Background(), &pb.SetTargetDepositsRequest{ + TargetDeposits: []*pb.TargetDeposit{ + { + TargetDeposit: minDeposit.Uint64(), + Provider: providerAddress, + }, + }, + }) + if err != nil { + logger.Error("failed to set target deposits", "err", err) + return + } + + if len(resp.SuccessfullySetDeposits) == 0 { + logger.Error("failed to set target deposits") + return + } + logger.Info("target deposits set", "amount", resp.SuccessfullySetDeposits[0].TargetDeposit) type blockWithTxns struct { blockNum int64 From 2e8958e44091042b989286f7f6e41cd5cccd4ef5 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Tue, 19 Aug 2025 15:02:02 -0700 Subject: [PATCH 071/117] GetValidProviders api --- contracts-abi/abi/DepositManager.abi | 2 +- contracts-abi/abi/ProviderRegistry.abi | 19 + .../clients/DepositManager/DepositManager.go | 2 +- .../ProviderRegistry/ProviderRegistry.go | 33 +- contracts/contracts/core/ProviderRegistry.sol | 14 + p2p/gen/go/bidderapi/v1/bidderapi.pb.go | 1208 +++++++++-------- p2p/gen/go/bidderapi/v1/bidderapi.pb.gw.go | 60 + p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go | 54 + .../bidderapi/v1/bidderapi.swagger.yaml | 29 + p2p/pkg/node/node.go | 1 + p2p/pkg/rpc/bidder/service.go | 82 +- p2p/pkg/rpc/bidder/service_test.go | 10 +- p2p/rpc/bidderapi/v1/bidderapi.proto | 31 + 13 files changed, 1003 insertions(+), 542 deletions(-) diff --git a/contracts-abi/abi/DepositManager.abi b/contracts-abi/abi/DepositManager.abi index 9f1b17a7e..b841d2e49 100644 --- a/contracts-abi/abi/DepositManager.abi +++ b/contracts-abi/abi/DepositManager.abi @@ -3,7 +3,7 @@ "type": "constructor", "inputs": [ { - "name": "_registry", + "name": "_bidderRegistry", "type": "address", "internalType": "address" }, diff --git a/contracts-abi/abi/ProviderRegistry.abi b/contracts-abi/abi/ProviderRegistry.abi index 6792e9958..86450f792 100644 --- a/contracts-abi/abi/ProviderRegistry.abi +++ b/contracts-abi/abi/ProviderRegistry.abi @@ -12,6 +12,25 @@ "type": "receive", "stateMutability": "payable" }, + { + "type": "function", + "name": "AreProvidersValid", + "inputs": [ + { + "name": "providers", + "type": "address[]", + "internalType": "address[]" + } + ], + "outputs": [ + { + "name": "", + "type": "bool[]", + "internalType": "bool[]" + } + ], + "stateMutability": "view" + }, { "type": "function", "name": "ONE_HUNDRED_PERCENT", diff --git a/contracts-abi/clients/DepositManager/DepositManager.go b/contracts-abi/clients/DepositManager/DepositManager.go index 38fcc8baf..b0a14ef23 100644 --- a/contracts-abi/clients/DepositManager/DepositManager.go +++ b/contracts-abi/clients/DepositManager/DepositManager.go @@ -31,7 +31,7 @@ var ( // DepositmanagerMetaData contains all meta data concerning the Depositmanager contract. var DepositmanagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_registry\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_minBalance\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"BIDDER_REGISTRY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MIN_BALANCE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setTargetDeposit\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setTargetDeposits\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"targetDeposits\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"topUpDeposit\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"CurrentBalanceAtOrBelowMin\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"currentBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"minBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CurrentDepositIsSufficient\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"currentDeposit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"targetDeposit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DepositToppedUp\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TargetDepositDoesNotExist\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TargetDepositSet\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TopUpReduced\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"available\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"needed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalRequestExists\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidFallback\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotThisEOA\",\"inputs\":[{\"name\":\"msgSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"thisAddress\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_bidderRegistry\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_minBalance\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"BIDDER_REGISTRY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MIN_BALANCE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setTargetDeposit\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setTargetDeposits\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"targetDeposits\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"topUpDeposit\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"CurrentBalanceAtOrBelowMin\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"currentBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"minBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CurrentDepositIsSufficient\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"currentDeposit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"targetDeposit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DepositToppedUp\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TargetDepositDoesNotExist\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TargetDepositSet\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TopUpReduced\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"available\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"needed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalRequestExists\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidFallback\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotThisEOA\",\"inputs\":[{\"name\":\"msgSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"thisAddress\",\"type\":\"address\",\"internalType\":\"address\"}]}]", } // DepositmanagerABI is the input ABI used to generate the binding from. diff --git a/contracts-abi/clients/ProviderRegistry/ProviderRegistry.go b/contracts-abi/clients/ProviderRegistry/ProviderRegistry.go index baadf2f7d..92cd6c0d3 100644 --- a/contracts-abi/clients/ProviderRegistry/ProviderRegistry.go +++ b/contracts-abi/clients/ProviderRegistry/ProviderRegistry.go @@ -31,7 +31,7 @@ var ( // ProviderregistryMetaData contains all meta data concerning the Providerregistry contract. var ProviderregistryMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"ONE_HUNDRED_PERCENT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PRECISION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addVerifiedBLSKey\",\"inputs\":[{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"bidderSlashedAmount\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"blockBuilderBLSKeyToAddress\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegateRegisterAndStake\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"delegateStake\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"eoaToBlsPubkeys\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"feePercent\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAccumulatedPenaltyFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBLSKeys\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEoaFromBLSKey\",\"inputs\":[{\"name\":\"blsKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProviderStake\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_minStake\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_penaltyFeeRecipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_feePercent\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_withdrawalDelay\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_penaltyFeePayoutPeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isProviderValid\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"manuallyWithdrawPenaltyFee\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"minStake\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"overrideAddBLSKey\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"penaltyFeeTracker\",\"inputs\":[],\"outputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"accumulatedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"lastPayoutTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"payoutTimePeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"preconfManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"providerRegistered\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"providerStakes\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerAndStake\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setFeePayoutPeriod\",\"inputs\":[{\"name\":\"_feePayoutPeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setMinStake\",\"inputs\":[{\"name\":\"_minStake\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewFeePercent\",\"inputs\":[{\"name\":\"newFeePercent\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewPenaltyFeeRecipient\",\"inputs\":[{\"name\":\"newFeeRecipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPreconfManager\",\"inputs\":[{\"name\":\"contractAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setWithdrawalDelay\",\"inputs\":[{\"name\":\"_withdrawalDelay\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slash\",\"inputs\":[{\"name\":\"amt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"slashAmt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"addresspayable\"},{\"name\":\"residualBidPercentAfterDecay\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unstake\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"verifySignature\",\"inputs\":[{\"name\":\"pubKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"message\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSlashedAmount\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawalDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawalRequests\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"BLSKeyAdded\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BidderWithdrawSlashedAmount\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeePayoutPeriodUpdated\",\"inputs\":[{\"name\":\"newFeePayoutPeriod\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeePercentUpdated\",\"inputs\":[{\"name\":\"newFeePercent\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeTransfer\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FundsDeposited\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FundsSlashed\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InsufficientFundsToSlash\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"providerStake\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"residualAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"penaltyFee\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"slashAmt\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MinStakeUpdated\",\"inputs\":[{\"name\":\"newMinStake\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"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\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PenaltyFeeRecipientUpdated\",\"inputs\":[{\"name\":\"newPenaltyFeeRecipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PreconfManagerUpdated\",\"inputs\":[{\"name\":\"newPreconfManager\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProviderRegistered\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"stakedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransferToBidderFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unstake\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Withdraw\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalDelayUpdated\",\"inputs\":[{\"name\":\"newWithdrawalDelay\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AtLeastOneBLSKeyRequired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BLSSignatureInvalid\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BidderAmountIsZero\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"BidderWithdrawalTransferFailed\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"DelayNotPassed\",\"inputs\":[{\"name\":\"withdrawalRequestTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalDelay\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"currentBlockTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpectedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FeeRecipientIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientStake\",\"inputs\":[{\"name\":\"stake\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minStake\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expectedLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidFallback\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidReceive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoStakeToWithdraw\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"NoUnstakeRequest\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotPreconfContract\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"preconfManager\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"PayoutPeriodMustBePositive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PendingWithdrawalRequest\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"PreconfManagerNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ProviderAlreadyRegistered\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ProviderCommitmentsPending\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"numPending\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ProviderNotRegistered\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"PublicKeyLengthInvalid\",\"inputs\":[{\"name\":\"exp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"got\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureLengthInvalid\",\"inputs\":[{\"name\":\"exp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"got\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"StakeTransferFailed\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"TransferToRecipientFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"UnstakeRequestExists\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"AreProvidersValid\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ONE_HUNDRED_PERCENT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PRECISION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addVerifiedBLSKey\",\"inputs\":[{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"bidderSlashedAmount\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"blockBuilderBLSKeyToAddress\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegateRegisterAndStake\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"delegateStake\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"eoaToBlsPubkeys\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"feePercent\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAccumulatedPenaltyFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBLSKeys\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEoaFromBLSKey\",\"inputs\":[{\"name\":\"blsKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProviderStake\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_minStake\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_penaltyFeeRecipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_feePercent\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_withdrawalDelay\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_penaltyFeePayoutPeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isProviderValid\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"manuallyWithdrawPenaltyFee\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"minStake\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"overrideAddBLSKey\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"penaltyFeeTracker\",\"inputs\":[],\"outputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"accumulatedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"lastPayoutTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"payoutTimePeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"preconfManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"providerRegistered\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"providerStakes\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerAndStake\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setFeePayoutPeriod\",\"inputs\":[{\"name\":\"_feePayoutPeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setMinStake\",\"inputs\":[{\"name\":\"_minStake\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewFeePercent\",\"inputs\":[{\"name\":\"newFeePercent\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewPenaltyFeeRecipient\",\"inputs\":[{\"name\":\"newFeeRecipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPreconfManager\",\"inputs\":[{\"name\":\"contractAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setWithdrawalDelay\",\"inputs\":[{\"name\":\"_withdrawalDelay\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slash\",\"inputs\":[{\"name\":\"amt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"slashAmt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"addresspayable\"},{\"name\":\"residualBidPercentAfterDecay\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unstake\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"verifySignature\",\"inputs\":[{\"name\":\"pubKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"message\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSlashedAmount\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawalDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawalRequests\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"BLSKeyAdded\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BidderWithdrawSlashedAmount\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeePayoutPeriodUpdated\",\"inputs\":[{\"name\":\"newFeePayoutPeriod\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeePercentUpdated\",\"inputs\":[{\"name\":\"newFeePercent\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeTransfer\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FundsDeposited\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FundsSlashed\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InsufficientFundsToSlash\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"providerStake\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"residualAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"penaltyFee\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"slashAmt\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MinStakeUpdated\",\"inputs\":[{\"name\":\"newMinStake\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"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\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PenaltyFeeRecipientUpdated\",\"inputs\":[{\"name\":\"newPenaltyFeeRecipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PreconfManagerUpdated\",\"inputs\":[{\"name\":\"newPreconfManager\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProviderRegistered\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"stakedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransferToBidderFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unstake\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Withdraw\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalDelayUpdated\",\"inputs\":[{\"name\":\"newWithdrawalDelay\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AtLeastOneBLSKeyRequired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BLSSignatureInvalid\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BidderAmountIsZero\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"BidderWithdrawalTransferFailed\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"DelayNotPassed\",\"inputs\":[{\"name\":\"withdrawalRequestTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalDelay\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"currentBlockTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpectedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FeeRecipientIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientStake\",\"inputs\":[{\"name\":\"stake\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minStake\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expectedLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidFallback\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidReceive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoStakeToWithdraw\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"NoUnstakeRequest\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotPreconfContract\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"preconfManager\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"PayoutPeriodMustBePositive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PendingWithdrawalRequest\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"PreconfManagerNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ProviderAlreadyRegistered\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ProviderCommitmentsPending\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"numPending\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ProviderNotRegistered\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"PublicKeyLengthInvalid\",\"inputs\":[{\"name\":\"exp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"got\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureLengthInvalid\",\"inputs\":[{\"name\":\"exp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"got\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"StakeTransferFailed\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"TransferToRecipientFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"UnstakeRequestExists\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]}]", } // ProviderregistryABI is the input ABI used to generate the binding from. @@ -180,6 +180,37 @@ func (_Providerregistry *ProviderregistryTransactorRaw) Transact(opts *bind.Tran return _Providerregistry.Contract.contract.Transact(opts, method, params...) } +// AreProvidersValid is a free data retrieval call binding the contract method 0xd27cb513. +// +// Solidity: function AreProvidersValid(address[] providers) view returns(bool[]) +func (_Providerregistry *ProviderregistryCaller) AreProvidersValid(opts *bind.CallOpts, providers []common.Address) ([]bool, error) { + var out []interface{} + err := _Providerregistry.contract.Call(opts, &out, "AreProvidersValid", providers) + + if err != nil { + return *new([]bool), err + } + + out0 := *abi.ConvertType(out[0], new([]bool)).(*[]bool) + + return out0, err + +} + +// AreProvidersValid is a free data retrieval call binding the contract method 0xd27cb513. +// +// Solidity: function AreProvidersValid(address[] providers) view returns(bool[]) +func (_Providerregistry *ProviderregistrySession) AreProvidersValid(providers []common.Address) ([]bool, error) { + return _Providerregistry.Contract.AreProvidersValid(&_Providerregistry.CallOpts, providers) +} + +// AreProvidersValid is a free data retrieval call binding the contract method 0xd27cb513. +// +// Solidity: function AreProvidersValid(address[] providers) view returns(bool[]) +func (_Providerregistry *ProviderregistryCallerSession) AreProvidersValid(providers []common.Address) ([]bool, error) { + return _Providerregistry.Contract.AreProvidersValid(&_Providerregistry.CallOpts, providers) +} + // ONEHUNDREDPERCENT is a free data retrieval call binding the contract method 0xdd0081c7. // // Solidity: function ONE_HUNDRED_PERCENT() view returns(uint256) diff --git a/contracts/contracts/core/ProviderRegistry.sol b/contracts/contracts/core/ProviderRegistry.sol index a3b7ff0f3..2e6b74e49 100644 --- a/contracts/contracts/core/ProviderRegistry.sol +++ b/contracts/contracts/core/ProviderRegistry.sol @@ -408,6 +408,20 @@ contract ProviderRegistry is ); } + /// @dev View function checking if a provider is valid, returning booleans and never reverting + function AreProvidersValid(address[] calldata providers) public view returns (bool[] memory) { + bool[] memory validProviders = new bool[](providers.length); + for (uint256 i = 0; i < providers.length; i++) { + address provider = providers[i]; + bool isRegistered = providerRegistered[provider]; + bool hasStake = providerStakes[provider] >= minStake; + bool noPendingWithdrawal = withdrawalRequests[provider] == 0; + bool hasBLSKey = eoaToBlsPubkeys[provider].length > 0; + validProviders[i] = isRegistered && hasStake && noPendingWithdrawal && hasBLSKey; + } + return validProviders; + } + /** * @dev Verifies a BLS signature using the precompile * @param pubKey The public key (48 bytes G1 point) diff --git a/p2p/gen/go/bidderapi/v1/bidderapi.pb.go b/p2p/gen/go/bidderapi/v1/bidderapi.pb.go index 3bf4113ec..29f1076fe 100644 --- a/p2p/gen/go/bidderapi/v1/bidderapi.pb.go +++ b/p2p/gen/go/bidderapi/v1/bidderapi.pb.go @@ -860,6 +860,91 @@ func (x *WithdrawResponse) GetProviders() []string { return nil } +type GetValidProvidersRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *GetValidProvidersRequest) Reset() { + *x = GetValidProvidersRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetValidProvidersRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetValidProvidersRequest) ProtoMessage() {} + +func (x *GetValidProvidersRequest) ProtoReflect() protoreflect.Message { + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetValidProvidersRequest.ProtoReflect.Descriptor instead. +func (*GetValidProvidersRequest) Descriptor() ([]byte, []int) { + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{17} +} + +type GetValidProvidersResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ValidProviders []string `protobuf:"bytes,1,rep,name=valid_providers,json=validProviders,proto3" json:"valid_providers,omitempty"` +} + +func (x *GetValidProvidersResponse) Reset() { + *x = GetValidProvidersResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetValidProvidersResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetValidProvidersResponse) ProtoMessage() {} + +func (x *GetValidProvidersResponse) ProtoReflect() protoreflect.Message { + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetValidProvidersResponse.ProtoReflect.Descriptor instead. +func (*GetValidProvidersResponse) Descriptor() ([]byte, []int) { + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{18} +} + +func (x *GetValidProvidersResponse) GetValidProviders() []string { + if x != nil { + return x.ValidProviders + } + return nil +} + type Bid struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -878,7 +963,7 @@ type Bid struct { func (x *Bid) Reset() { *x = Bid{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[17] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -891,7 +976,7 @@ func (x *Bid) String() string { func (*Bid) ProtoMessage() {} func (x *Bid) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[17] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -904,7 +989,7 @@ func (x *Bid) ProtoReflect() protoreflect.Message { // Deprecated: Use Bid.ProtoReflect.Descriptor instead. func (*Bid) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{17} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{19} } func (x *Bid) GetTxHashes() []string { @@ -986,7 +1071,7 @@ type Commitment struct { func (x *Commitment) Reset() { *x = Commitment{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[18] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -999,7 +1084,7 @@ func (x *Commitment) String() string { func (*Commitment) ProtoMessage() {} func (x *Commitment) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[18] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1012,7 +1097,7 @@ func (x *Commitment) ProtoReflect() protoreflect.Message { // Deprecated: Use Commitment.ProtoReflect.Descriptor instead. func (*Commitment) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{18} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{20} } func (x *Commitment) GetTxHashes() []string { @@ -1119,7 +1204,7 @@ type GetBidInfoRequest struct { func (x *GetBidInfoRequest) Reset() { *x = GetBidInfoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[19] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1132,7 +1217,7 @@ func (x *GetBidInfoRequest) String() string { func (*GetBidInfoRequest) ProtoMessage() {} func (x *GetBidInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[19] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1145,7 +1230,7 @@ func (x *GetBidInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBidInfoRequest.ProtoReflect.Descriptor instead. func (*GetBidInfoRequest) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{19} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{21} } func (x *GetBidInfoRequest) GetBlockNumber() int64 { @@ -1180,7 +1265,7 @@ type GetBidInfoResponse struct { func (x *GetBidInfoResponse) Reset() { *x = GetBidInfoResponse{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[20] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1193,7 +1278,7 @@ func (x *GetBidInfoResponse) String() string { func (*GetBidInfoResponse) ProtoMessage() {} func (x *GetBidInfoResponse) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[20] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1206,7 +1291,7 @@ func (x *GetBidInfoResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBidInfoResponse.ProtoReflect.Descriptor instead. func (*GetBidInfoResponse) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{20} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{22} } func (x *GetBidInfoResponse) GetBlockBidInfo() []*GetBidInfoResponse_BlockBidInfo { @@ -1232,7 +1317,7 @@ type GetBidInfoResponse_CommitmentWithStatus struct { func (x *GetBidInfoResponse_CommitmentWithStatus) Reset() { *x = GetBidInfoResponse_CommitmentWithStatus{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[21] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1245,7 +1330,7 @@ func (x *GetBidInfoResponse_CommitmentWithStatus) String() string { func (*GetBidInfoResponse_CommitmentWithStatus) ProtoMessage() {} func (x *GetBidInfoResponse_CommitmentWithStatus) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[21] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1258,7 +1343,7 @@ func (x *GetBidInfoResponse_CommitmentWithStatus) ProtoReflect() protoreflect.Me // Deprecated: Use GetBidInfoResponse_CommitmentWithStatus.ProtoReflect.Descriptor instead. func (*GetBidInfoResponse_CommitmentWithStatus) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{20, 0} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{22, 0} } func (x *GetBidInfoResponse_CommitmentWithStatus) GetProviderAddress() string { @@ -1322,7 +1407,7 @@ type GetBidInfoResponse_BidInfo struct { func (x *GetBidInfoResponse_BidInfo) Reset() { *x = GetBidInfoResponse_BidInfo{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[22] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1335,7 +1420,7 @@ func (x *GetBidInfoResponse_BidInfo) String() string { func (*GetBidInfoResponse_BidInfo) ProtoMessage() {} func (x *GetBidInfoResponse_BidInfo) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[22] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1348,7 +1433,7 @@ func (x *GetBidInfoResponse_BidInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBidInfoResponse_BidInfo.ProtoReflect.Descriptor instead. func (*GetBidInfoResponse_BidInfo) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{20, 1} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{22, 1} } func (x *GetBidInfoResponse_BidInfo) GetTxnHashes() []string { @@ -1426,7 +1511,7 @@ type GetBidInfoResponse_BlockBidInfo struct { func (x *GetBidInfoResponse_BlockBidInfo) Reset() { *x = GetBidInfoResponse_BlockBidInfo{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[23] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1439,7 +1524,7 @@ func (x *GetBidInfoResponse_BlockBidInfo) String() string { func (*GetBidInfoResponse_BlockBidInfo) ProtoMessage() {} func (x *GetBidInfoResponse_BlockBidInfo) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[23] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1452,7 +1537,7 @@ func (x *GetBidInfoResponse_BlockBidInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBidInfoResponse_BlockBidInfo.ProtoReflect.Descriptor instead. func (*GetBidInfoResponse_BlockBidInfo) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{20, 2} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{22, 2} } func (x *GetBidInfoResponse_BlockBidInfo) GetBlockNumber() int64 { @@ -1718,495 +1803,518 @@ var file_bidderapi_v1_bidderapi_proto_rawDesc = []byte{ 0x22, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x30, 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x5d, 0x7d, 0x22, 0xf2, 0x13, 0x0a, - 0x03, 0x42, 0x69, 0x64, 0x12, 0x94, 0x02, 0x0a, 0x09, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0xf6, 0x01, 0x92, 0x41, 0x78, 0x32, 0x64, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x5d, 0x7d, 0x22, 0x58, 0x0a, 0x18, + 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x3a, 0x3c, 0x92, 0x41, 0x39, 0x0a, 0x37, 0x2a, + 0x19, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0x1a, 0x47, 0x65, 0x74, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x22, 0x84, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x3a, 0x3e, 0x92, + 0x41, 0x3b, 0x0a, 0x39, 0x2a, 0x1a, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x32, 0x1b, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x22, 0xf2, 0x13, + 0x0a, 0x03, 0x42, 0x69, 0x64, 0x12, 0x94, 0x02, 0x0a, 0x09, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, + 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0xf6, 0x01, 0x92, 0x41, 0x78, 0x32, + 0x64, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, + 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x61, 0x73, 0x68, + 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, 0x0f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, + 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0xba, 0x48, 0x78, 0xba, 0x01, 0x75, 0x0a, 0x09, 0x74, + 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x36, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, + 0x68, 0x65, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x2e, + 0x1a, 0x30, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, 0x2e, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, + 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x24, 0x27, + 0x29, 0x29, 0x52, 0x08, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0xe0, 0x01, 0x0a, + 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0xc7, 0x01, + 0x92, 0x41, 0x76, 0x32, 0x6b, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, + 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, + 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, + 0x20, 0x70, 0x61, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, + 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, + 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0xba, 0x48, 0x4b, 0xba, 0x01, 0x48, 0x0a, + 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, + 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x1d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x5b, 0x31, 0x2d, 0x39, 0x5d, 0x5b, 0x30, + 0x2d, 0x39, 0x5d, 0x2a, 0x24, 0x27, 0x29, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0xb9, 0x01, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x95, 0x01, 0x92, 0x41, 0x47, 0x32, 0x45, 0x4d, 0x61, + 0x78, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, + 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x69, 0x6e, 0x2e, 0xba, 0x48, 0x48, 0xba, 0x01, 0x45, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x25, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x0e, + 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x52, 0x0b, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0xc2, 0x01, 0x0a, 0x15, + 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x42, 0x8d, 0x01, 0x92, 0x41, + 0x2d, 0x32, 0x2b, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, + 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0xba, 0x48, + 0x5a, 0xba, 0x01, 0x57, 0x0a, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2e, 0x64, 0x65, 0x63, + 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x0e, 0x75, 0x69, 0x6e, + 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x52, 0x13, 0x64, 0x65, 0x63, + 0x61, 0x79, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x12, 0xb8, 0x01, 0x0a, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x42, 0x87, + 0x01, 0x92, 0x41, 0x2b, 0x32, 0x29, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, + 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, + 0x20, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0xba, + 0x48, 0x56, 0xba, 0x01, 0x53, 0x0a, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2c, 0x64, 0x65, 0x63, 0x61, + 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, + 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x0e, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x52, 0x11, 0x64, 0x65, 0x63, 0x61, 0x79, 0x45, + 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x8f, 0x02, 0x0a, 0x13, + 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, + 0x68, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x42, 0xde, 0x01, 0x92, 0x41, 0x49, 0x32, + 0x47, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x78, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x74, 0x6f, + 0x20, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x62, 0x65, 0x20, 0x64, 0x69, + 0x73, 0x63, 0x61, 0x72, 0x64, 0x65, 0x64, 0x2e, 0xba, 0x48, 0x8e, 0x01, 0xba, 0x01, 0x8a, 0x01, + 0x0a, 0x13, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, + 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x41, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, + 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, + 0x62, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x2e, 0x1a, 0x30, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, + 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, + 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, + 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x24, 0x27, 0x29, 0x29, 0x52, 0x11, 0x72, 0x65, 0x76, 0x65, + 0x72, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0xa3, 0x02, + 0x0a, 0x10, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x42, 0xf7, 0x01, 0x92, 0x41, 0x6e, 0x32, 0x6c, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, + 0x66, 0x20, 0x52, 0x4c, 0x50, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x20, 0x72, 0x61, + 0x77, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, + 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0xba, 0x48, 0x82, 0x01, + 0xba, 0x01, 0x7f, 0x0a, 0x10, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, + 0x61, 0x6e, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x20, 0x72, 0x61, 0x77, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x1a, 0x2d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, + 0x20, 0x72, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, + 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x2a, 0x24, 0x27, + 0x29, 0x29, 0x52, 0x0f, 0x72, 0x61, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0xbf, 0x02, 0x0a, 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x9b, 0x02, 0x92, 0x41, 0x9f, + 0x01, 0x32, 0x93, 0x01, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, + 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x73, + 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x79, + 0x20, 0x66, 0x61, 0x69, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x20, 0x49, 0x66, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, + 0x65, 0x63, 0x61, 0x79, 0x65, 0x64, 0x20, 0x62, 0x69, 0x64, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x6c, + 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x2e, 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, + 0xba, 0x48, 0x75, 0xba, 0x01, 0x72, 0x0a, 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x3b, 0x74, 0x68, 0x69, + 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x27, 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x5b, 0x30, 0x2d, 0x39, 0x5d, + 0x2b, 0x24, 0x27, 0x29, 0x20, 0x26, 0x26, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x29, 0x20, 0x3e, 0x3d, 0x20, 0x30, 0x29, 0x52, 0x0b, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x41, + 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0xba, 0x04, 0x92, 0x41, 0xb6, 0x04, 0x0a, 0x95, 0x01, 0x2a, + 0x0b, 0x42, 0x69, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x40, 0x55, 0x6e, + 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x69, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x73, 0x20, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x6d, 0x65, + 0x76, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0xd2, 0x01, + 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0xd2, 0x01, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0xd2, 0x01, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0xd2, 0x01, + 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x32, 0x9b, 0x03, 0x7b, 0x22, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, + 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x66, 0x65, 0x34, 0x63, 0x62, 0x34, 0x37, 0x64, 0x62, + 0x33, 0x36, 0x33, 0x30, 0x35, 0x35, 0x31, 0x62, 0x65, 0x65, 0x64, 0x66, 0x62, 0x64, 0x30, 0x32, + 0x61, 0x37, 0x31, 0x65, 0x63, 0x63, 0x36, 0x39, 0x66, 0x64, 0x35, 0x39, 0x37, 0x35, 0x38, 0x65, + 0x32, 0x62, 0x61, 0x36, 0x39, 0x39, 0x36, 0x30, 0x36, 0x65, 0x32, 0x64, 0x35, 0x63, 0x37, 0x34, + 0x32, 0x38, 0x34, 0x66, 0x66, 0x61, 0x37, 0x22, 0x2c, 0x20, 0x22, 0x37, 0x31, 0x63, 0x31, 0x33, + 0x34, 0x38, 0x66, 0x32, 0x64, 0x37, 0x66, 0x66, 0x37, 0x65, 0x38, 0x31, 0x34, 0x66, 0x39, 0x63, + 0x33, 0x36, 0x31, 0x37, 0x39, 0x38, 0x33, 0x37, 0x30, 0x33, 0x34, 0x33, 0x35, 0x65, 0x61, 0x37, + 0x34, 0x34, 0x36, 0x64, 0x65, 0x34, 0x32, 0x30, 0x61, 0x65, 0x61, 0x63, 0x34, 0x38, 0x38, 0x62, + 0x66, 0x31, 0x64, 0x65, 0x33, 0x35, 0x37, 0x33, 0x37, 0x65, 0x38, 0x22, 0x5d, 0x2c, 0x20, 0x22, + 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x2c, 0x20, + 0x22, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x3a, 0x20, + 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3a, + 0x20, 0x31, 0x36, 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x2c, 0x20, 0x22, 0x64, 0x65, + 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x22, 0x3a, 0x20, 0x31, 0x36, 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x2c, 0x20, + 0x22, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, + 0x73, 0x68, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x66, 0x65, 0x34, 0x63, 0x62, 0x34, 0x37, + 0x64, 0x62, 0x33, 0x36, 0x33, 0x30, 0x35, 0x35, 0x31, 0x62, 0x65, 0x65, 0x64, 0x66, 0x62, 0x64, + 0x30, 0x32, 0x61, 0x37, 0x31, 0x65, 0x63, 0x63, 0x36, 0x39, 0x66, 0x64, 0x35, 0x39, 0x37, 0x35, + 0x38, 0x65, 0x32, 0x62, 0x61, 0x36, 0x39, 0x39, 0x36, 0x30, 0x36, 0x65, 0x32, 0x64, 0x35, 0x63, + 0x37, 0x34, 0x32, 0x38, 0x34, 0x66, 0x66, 0x61, 0x37, 0x22, 0x5d, 0x2c, 0x20, 0x22, 0x73, 0x6c, + 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x35, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x22, 0x7d, 0x22, 0xc2, 0x0d, 0x0a, 0x0a, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x95, 0x01, 0x0a, 0x09, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x78, 0x92, 0x41, 0x75, 0x32, 0x61, 0x48, 0x65, 0x78, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x61, 0x73, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, + 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, + 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, 0x0f, + 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x52, + 0x08, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x8f, 0x01, 0x0a, 0x0a, 0x62, 0x69, + 0x64, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x70, + 0x92, 0x41, 0x6d, 0x32, 0x6b, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, + 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, + 0x65, 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, 0x61, 0x67, 0x72, 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, + 0x20, 0x70, 0x61, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, + 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, + 0x52, 0x09, 0x62, 0x69, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x6d, 0x0a, 0x0c, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x03, 0x42, 0x4a, 0x92, 0x41, 0x47, 0x32, 0x45, 0x4d, 0x61, 0x78, 0x20, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, + 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x2e, 0x52, 0x0b, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x7b, 0x0a, 0x13, 0x72, 0x65, + 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4b, 0x92, 0x41, 0x48, 0x32, 0x46, 0x48, 0x65, + 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, + 0x67, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x73, + 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, + 0x64, 0x65, 0x72, 0x2e, 0x52, 0x11, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x42, 0x69, + 0x64, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x7d, 0x0a, 0x16, 0x72, 0x65, 0x63, 0x65, 0x69, + 0x76, 0x65, 0x64, 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x47, 0x92, 0x41, 0x44, 0x32, 0x42, 0x48, 0x65, + 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, + 0x67, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x73, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x62, 0x69, 0x64, 0x2e, + 0x52, 0x14, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x42, 0x69, 0x64, 0x53, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x62, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x35, 0x92, 0x41, 0x32, 0x32, 0x30, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x64, + 0x69, 0x67, 0x65, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x9e, 0x01, 0x0a, 0x14, 0x63, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x6b, 0x92, 0x41, 0x68, 0x32, 0x66, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, - 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, - 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, - 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, - 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, 0x0f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, - 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0xba, 0x48, 0x78, 0xba, 0x01, 0x75, 0x0a, 0x09, 0x74, 0x78, - 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x36, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, - 0x65, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x2e, 0x1a, - 0x30, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, 0x2e, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, 0x61, - 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x24, 0x27, 0x29, - 0x29, 0x52, 0x08, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0xe0, 0x01, 0x0a, 0x06, - 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0xc7, 0x01, 0x92, - 0x41, 0x76, 0x32, 0x6b, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, - 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, - 0x72, 0x20, 0x69, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, - 0x70, 0x61, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, - 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x8a, - 0x01, 0x06, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0xba, 0x48, 0x4b, 0xba, 0x01, 0x48, 0x0a, 0x06, - 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6d, - 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x69, - 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x1d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, - 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x5b, 0x31, 0x2d, 0x39, 0x5d, 0x5b, 0x30, 0x2d, - 0x39, 0x5d, 0x2a, 0x24, 0x27, 0x29, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0xb9, - 0x01, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x95, 0x01, 0x92, 0x41, 0x47, 0x32, 0x45, 0x4d, 0x61, 0x78, - 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x74, 0x68, + 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, + 0x6e, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, + 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x13, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, + 0x6e, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x10, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x5d, 0x92, 0x41, 0x5a, 0x32, 0x58, 0x48, 0x65, 0x78, + 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x2e, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x64, 0x0a, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x03, 0x42, 0x30, 0x92, 0x41, 0x2d, 0x32, 0x2b, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x20, 0x64, 0x65, + 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x5e, 0x0a, 0x13, + 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x42, 0x2e, 0x92, 0x41, 0x2b, 0x32, 0x29, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, + 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x65, 0x6e, 0x64, 0x73, 0x20, + 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x11, 0x64, 0x65, 0x63, 0x61, 0x79, + 0x45, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x63, 0x0a, 0x12, + 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x42, 0x34, 0x92, 0x41, 0x31, 0x32, 0x2f, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, + 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, + 0x20, 0x69, 0x73, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x2e, 0x52, 0x11, + 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x12, 0x7c, 0x0a, 0x13, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, + 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x42, 0x4c, + 0x92, 0x41, 0x49, 0x32, 0x47, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x72, + 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x78, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, + 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x62, + 0x65, 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x65, 0x64, 0x2e, 0x52, 0x11, 0x72, 0x65, + 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, + 0x85, 0x01, 0x0a, 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x42, 0x62, 0x92, 0x41, 0x5f, 0x32, 0x5d, 0x41, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x20, 0x74, + 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x0b, 0x73, 0x6c, 0x61, 0x73, + 0x68, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x5e, 0x92, 0x41, 0x5b, 0x0a, 0x59, 0x2a, 0x12, + 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x32, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x6d, 0x65, 0x76, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x22, 0xbe, 0x02, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x42, + 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x9f, 0x01, + 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x03, 0x42, 0x7c, 0x92, 0x41, 0x79, 0x32, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x71, 0x75, 0x65, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x69, + 0x64, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, + 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6b, 0x6e, + 0x6f, 0x77, 0x6e, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x69, + 0x6e, 0x20, 0x61, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x2e, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, + 0x34, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x20, 0x92, + 0x41, 0x1d, 0x32, 0x1b, 0x50, 0x61, 0x67, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, + 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x51, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x05, 0x42, 0x3b, 0x92, 0x41, 0x38, 0x32, 0x36, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x70, + 0x61, 0x67, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x20, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x69, 0x73, 0x20, 0x35, + 0x30, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0xe0, 0x11, 0x0a, 0x12, 0x47, 0x65, 0x74, + 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x97, 0x01, 0x0a, 0x0e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x69, 0x6e, + 0x66, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, + 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x42, 0x92, 0x41, 0x3f, 0x32, 0x3d, 0x4c, 0x69, + 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x62, 0x69, 0x64, 0x20, + 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, + 0x62, 0x69, 0x64, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x63, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x52, 0x0c, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0xf4, 0x04, 0x0a, 0x14, 0x43, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x57, 0x69, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x7e, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x53, 0x92, 0x41, + 0x50, 0x32, 0x4e, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, + 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, + 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x12, 0x63, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x42, 0x34, + 0x92, 0x41, 0x31, 0x32, 0x2f, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, + 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, + 0x68, 0x65, 0x64, 0x2e, 0x52, 0x11, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x86, 0x01, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x6e, 0x92, 0x41, 0x6b, 0x32, 0x69, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x20, 0x50, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, + 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x3a, 0x20, 0x27, 0x70, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x27, 0x2c, 0x20, 0x27, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x27, + 0x6f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x27, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, + 0x64, 0x27, 0x2c, 0x20, 0x27, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x27, + 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x27, 0x2e, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x4e, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x34, 0x92, 0x41, 0x31, 0x32, 0x2f, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x12, 0x48, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x2e, 0x92, 0x41, 0x2b, 0x32, 0x29, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x20, + 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x77, 0x65, 0x69, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x54, 0x0a, 0x06, 0x72, 0x65, + 0x66, 0x75, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3c, 0x92, 0x41, 0x39, 0x32, + 0x37, 0x52, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x69, + 0x6e, 0x20, 0x77, 0x65, 0x69, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x69, 0x66, 0x20, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x52, 0x06, 0x72, 0x65, 0x66, 0x75, 0x6e, 0x64, + 0x1a, 0xdb, 0x09, 0x0a, 0x07, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x9a, 0x01, 0x0a, + 0x0a, 0x74, 0x78, 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x42, 0x7b, 0x92, 0x41, 0x78, 0x32, 0x64, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, - 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, - 0x6e, 0x2e, 0xba, 0x48, 0x48, 0xba, 0x01, 0x45, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x25, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x0e, 0x75, - 0x69, 0x6e, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x52, 0x0b, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0xc2, 0x01, 0x0a, 0x15, 0x64, - 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x42, 0x8d, 0x01, 0x92, 0x41, 0x2d, - 0x32, 0x2b, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, - 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0xba, 0x48, 0x5a, - 0xba, 0x01, 0x57, 0x0a, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2e, 0x64, 0x65, 0x63, 0x61, - 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x0e, 0x75, 0x69, 0x6e, 0x74, - 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x52, 0x13, 0x64, 0x65, 0x63, 0x61, - 0x79, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, - 0xb8, 0x01, 0x0a, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x42, 0x87, 0x01, - 0x92, 0x41, 0x2b, 0x32, 0x29, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, - 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, - 0x65, 0x6e, 0x64, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0xba, 0x48, - 0x56, 0xba, 0x01, 0x53, 0x0a, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2c, 0x64, 0x65, 0x63, 0x61, 0x79, - 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x6d, - 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x69, - 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x0e, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x68, - 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x52, 0x11, 0x64, 0x65, 0x63, 0x61, 0x79, 0x45, 0x6e, - 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x8f, 0x02, 0x0a, 0x13, 0x72, - 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, - 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x42, 0xde, 0x01, 0x92, 0x41, 0x49, 0x32, 0x47, + 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, 0x0f, 0x5b, + 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x52, 0x09, + 0x74, 0x78, 0x6e, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x92, 0x01, 0x0a, 0x15, 0x72, 0x65, + 0x76, 0x65, 0x72, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x74, 0x78, 0x6e, 0x5f, 0x68, 0x61, 0x73, + 0x68, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0x5e, 0x92, 0x41, 0x5b, 0x32, 0x47, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x78, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x62, 0x65, 0x20, 0x64, 0x69, 0x73, - 0x63, 0x61, 0x72, 0x64, 0x65, 0x64, 0x2e, 0xba, 0x48, 0x8e, 0x01, 0xba, 0x01, 0x8a, 0x01, 0x0a, - 0x13, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, - 0x73, 0x68, 0x65, 0x73, 0x12, 0x41, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, - 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, - 0x65, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x2e, 0x1a, 0x30, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, - 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, - 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, - 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x24, 0x27, 0x29, 0x29, 0x52, 0x11, 0x72, 0x65, 0x76, 0x65, 0x72, - 0x74, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0xa3, 0x02, 0x0a, - 0x10, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x42, 0xf7, 0x01, 0x92, 0x41, 0x6e, 0x32, 0x6c, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, - 0x20, 0x52, 0x4c, 0x50, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x20, 0x72, 0x61, 0x77, - 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x20, 0x74, 0x68, 0x61, - 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, - 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x69, 0x6e, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0xba, 0x48, 0x82, 0x01, 0xba, - 0x01, 0x7f, 0x0a, 0x10, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, - 0x6e, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x20, 0x72, 0x61, 0x77, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2e, 0x1a, 0x2d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, - 0x72, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, - 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x2a, 0x24, 0x27, 0x29, - 0x29, 0x52, 0x0f, 0x72, 0x61, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0xbf, 0x02, 0x0a, 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x9b, 0x02, 0x92, 0x41, 0x9f, 0x01, - 0x32, 0x93, 0x01, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, - 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x73, 0x6c, - 0x61, 0x73, 0x68, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, - 0x66, 0x61, 0x69, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x20, 0x49, 0x66, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, - 0x63, 0x61, 0x79, 0x65, 0x64, 0x20, 0x62, 0x69, 0x64, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x6c, 0x61, - 0x73, 0x68, 0x69, 0x6e, 0x67, 0x2e, 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0xba, - 0x48, 0x75, 0xba, 0x01, 0x72, 0x0a, 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x25, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, - 0x74, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x3b, 0x74, 0x68, 0x69, 0x73, - 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x27, 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, - 0x24, 0x27, 0x29, 0x20, 0x26, 0x26, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, - 0x29, 0x20, 0x3e, 0x3d, 0x20, 0x30, 0x29, 0x52, 0x0b, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x41, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0xba, 0x04, 0x92, 0x41, 0xb6, 0x04, 0x0a, 0x95, 0x01, 0x2a, 0x0b, - 0x42, 0x69, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x40, 0x55, 0x6e, 0x73, - 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x69, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x73, 0x20, 0x74, - 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x6d, 0x65, 0x76, - 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0xd2, 0x01, 0x06, - 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0xd2, 0x01, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0xd2, 0x01, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0xd2, 0x01, 0x13, - 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x32, 0x9b, 0x03, 0x7b, 0x22, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, - 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x66, 0x65, 0x34, 0x63, 0x62, 0x34, 0x37, 0x64, 0x62, 0x33, - 0x36, 0x33, 0x30, 0x35, 0x35, 0x31, 0x62, 0x65, 0x65, 0x64, 0x66, 0x62, 0x64, 0x30, 0x32, 0x61, - 0x37, 0x31, 0x65, 0x63, 0x63, 0x36, 0x39, 0x66, 0x64, 0x35, 0x39, 0x37, 0x35, 0x38, 0x65, 0x32, - 0x62, 0x61, 0x36, 0x39, 0x39, 0x36, 0x30, 0x36, 0x65, 0x32, 0x64, 0x35, 0x63, 0x37, 0x34, 0x32, - 0x38, 0x34, 0x66, 0x66, 0x61, 0x37, 0x22, 0x2c, 0x20, 0x22, 0x37, 0x31, 0x63, 0x31, 0x33, 0x34, - 0x38, 0x66, 0x32, 0x64, 0x37, 0x66, 0x66, 0x37, 0x65, 0x38, 0x31, 0x34, 0x66, 0x39, 0x63, 0x33, - 0x36, 0x31, 0x37, 0x39, 0x38, 0x33, 0x37, 0x30, 0x33, 0x34, 0x33, 0x35, 0x65, 0x61, 0x37, 0x34, - 0x34, 0x36, 0x64, 0x65, 0x34, 0x32, 0x30, 0x61, 0x65, 0x61, 0x63, 0x34, 0x38, 0x38, 0x62, 0x66, - 0x31, 0x64, 0x65, 0x33, 0x35, 0x37, 0x33, 0x37, 0x65, 0x38, 0x22, 0x5d, 0x2c, 0x20, 0x22, 0x61, - 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x2c, 0x20, 0x22, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x31, - 0x32, 0x33, 0x34, 0x35, 0x36, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3a, 0x20, - 0x31, 0x36, 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x63, - 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x22, 0x3a, 0x20, 0x31, 0x36, 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x2c, 0x20, 0x22, - 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, - 0x68, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x66, 0x65, 0x34, 0x63, 0x62, 0x34, 0x37, 0x64, - 0x62, 0x33, 0x36, 0x33, 0x30, 0x35, 0x35, 0x31, 0x62, 0x65, 0x65, 0x64, 0x66, 0x62, 0x64, 0x30, - 0x32, 0x61, 0x37, 0x31, 0x65, 0x63, 0x63, 0x36, 0x39, 0x66, 0x64, 0x35, 0x39, 0x37, 0x35, 0x38, - 0x65, 0x32, 0x62, 0x61, 0x36, 0x39, 0x39, 0x36, 0x30, 0x36, 0x65, 0x32, 0x64, 0x35, 0x63, 0x37, - 0x34, 0x32, 0x38, 0x34, 0x66, 0x66, 0x61, 0x37, 0x22, 0x5d, 0x2c, 0x20, 0x22, 0x73, 0x6c, 0x61, - 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x35, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, - 0x7d, 0x22, 0xc2, 0x0d, 0x0a, 0x0a, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x95, 0x01, 0x0a, 0x09, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x09, 0x42, 0x78, 0x92, 0x41, 0x75, 0x32, 0x61, 0x48, 0x65, 0x78, 0x20, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, - 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x61, 0x73, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, - 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, - 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x69, - 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, 0x0f, 0x5b, - 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x52, 0x08, - 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x8f, 0x01, 0x0a, 0x0a, 0x62, 0x69, 0x64, - 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x70, 0x92, - 0x41, 0x6d, 0x32, 0x6b, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, - 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, - 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, 0x61, 0x67, 0x72, 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, - 0x70, 0x61, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, - 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x52, - 0x09, 0x62, 0x69, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x6d, 0x0a, 0x0c, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, - 0x42, 0x4a, 0x92, 0x41, 0x47, 0x32, 0x45, 0x4d, 0x61, 0x78, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x63, 0x61, 0x72, 0x64, 0x65, 0x64, 0x2e, 0x8a, 0x01, 0x0f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, + 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x52, 0x13, 0x72, 0x65, 0x76, 0x65, 0x72, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x6e, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x69, + 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x03, 0x42, 0x46, 0x92, 0x41, 0x43, 0x32, 0x41, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x2e, 0x52, 0x0b, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x7b, 0x0a, 0x13, 0x72, 0x65, 0x63, - 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4b, 0x92, 0x41, 0x48, 0x32, 0x46, 0x48, 0x65, 0x78, - 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, - 0x20, 0x6f, 0x66, 0x20, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x73, 0x69, - 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, - 0x65, 0x72, 0x2e, 0x52, 0x11, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x42, 0x69, 0x64, - 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x7d, 0x0a, 0x16, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, - 0x65, 0x64, 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x47, 0x92, 0x41, 0x44, 0x32, 0x42, 0x48, 0x65, 0x78, - 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, - 0x20, 0x6f, 0x66, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x6f, 0x66, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, - 0x20, 0x73, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x62, 0x69, 0x64, 0x2e, 0x52, - 0x14, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x42, 0x69, 0x64, 0x53, 0x69, 0x67, 0x6e, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x62, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, - 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x35, 0x92, 0x41, 0x32, 0x32, 0x30, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x69, - 0x67, 0x65, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, - 0x65, 0x6e, 0x74, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x9e, 0x01, 0x0a, 0x14, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x6b, 0x92, 0x41, 0x68, 0x32, 0x66, 0x48, - 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, - 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, - 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, - 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, - 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x13, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x10, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x5d, 0x92, 0x41, 0x5a, 0x32, 0x58, 0x48, 0x65, 0x78, 0x20, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, - 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6f, - 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x74, - 0x68, 0x61, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x2e, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x64, 0x0a, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x03, 0x42, 0x30, 0x92, 0x41, 0x2d, 0x32, 0x2b, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x20, 0x64, 0x65, 0x63, - 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x5e, 0x0a, 0x13, 0x64, - 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x42, 0x2e, 0x92, 0x41, 0x2b, 0x32, 0x29, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, - 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x64, - 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x11, 0x64, 0x65, 0x63, 0x61, 0x79, 0x45, - 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x63, 0x0a, 0x12, 0x64, - 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x42, 0x34, 0x92, 0x41, 0x31, 0x32, 0x2f, 0x54, 0x69, + 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x98, 0x01, 0x0a, 0x0a, 0x62, 0x69, + 0x64, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x79, + 0x92, 0x41, 0x76, 0x32, 0x6b, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, + 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, + 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, + 0x20, 0x70, 0x61, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, + 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, + 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x52, 0x09, 0x62, 0x69, 0x64, 0x41, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x64, 0x0a, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x03, 0x42, 0x30, 0x92, 0x41, 0x2d, 0x32, 0x2b, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x62, 0x69, 0x64, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, + 0x79, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x5e, 0x0a, 0x13, 0x64, 0x65, + 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x42, 0x2e, 0x92, 0x41, 0x2b, 0x32, 0x29, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, - 0x69, 0x73, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x2e, 0x52, 0x11, 0x64, - 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x12, 0x7c, 0x0a, 0x13, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, - 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x42, 0x4c, 0x92, - 0x41, 0x49, 0x32, 0x47, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x72, - 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x78, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, - 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, - 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x62, 0x65, - 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x65, 0x64, 0x2e, 0x52, 0x11, 0x72, 0x65, 0x76, - 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x85, - 0x01, 0x0a, 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x0d, 0x20, 0x01, 0x28, 0x09, 0x42, 0x62, 0x92, 0x41, 0x5f, 0x32, 0x5d, 0x41, 0x6d, 0x6f, 0x75, - 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, - 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x20, 0x66, - 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x20, 0x74, 0x6f, - 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x0b, 0x73, 0x6c, 0x61, 0x73, 0x68, - 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x5e, 0x92, 0x41, 0x5b, 0x0a, 0x59, 0x2a, 0x12, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x32, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, - 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x6d, 0x65, 0x76, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x22, 0xbe, 0x02, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x42, 0x69, - 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x9f, 0x01, 0x0a, - 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x03, 0x42, 0x7c, 0x92, 0x41, 0x79, 0x32, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x61, 0x6c, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, - 0x66, 0x6f, 0x72, 0x20, 0x71, 0x75, 0x65, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x69, 0x64, - 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x70, - 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6b, 0x6e, 0x6f, - 0x77, 0x6e, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, - 0x20, 0x61, 0x72, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, - 0x20, 0x61, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, - 0x2e, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x34, - 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x20, 0x92, 0x41, - 0x1d, 0x32, 0x1b, 0x50, 0x61, 0x67, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x04, - 0x70, 0x61, 0x67, 0x65, 0x12, 0x51, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x05, 0x42, 0x3b, 0x92, 0x41, 0x38, 0x32, 0x36, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x70, 0x61, - 0x67, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x2e, 0x20, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x69, 0x73, 0x20, 0x35, 0x30, - 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0xe0, 0x11, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x42, - 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x97, - 0x01, 0x0a, 0x0e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x69, 0x6e, 0x66, - 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, - 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x42, 0x92, 0x41, 0x3f, 0x32, 0x3d, 0x4c, 0x69, 0x73, - 0x74, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x62, 0x69, 0x64, 0x20, 0x69, - 0x6e, 0x66, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x62, - 0x69, 0x64, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x52, 0x0c, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0xf4, 0x04, 0x0a, 0x14, 0x43, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x57, 0x69, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x7e, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x53, 0x92, 0x41, 0x50, - 0x32, 0x4e, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, - 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x12, 0x63, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x42, 0x34, 0x92, - 0x41, 0x31, 0x32, 0x2f, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, - 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, - 0x65, 0x64, 0x2e, 0x52, 0x11, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x86, 0x01, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x6e, 0x92, 0x41, 0x6b, 0x32, 0x69, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x20, 0x50, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, - 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x3a, 0x20, 0x27, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, - 0x67, 0x27, 0x2c, 0x20, 0x27, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x27, 0x6f, - 0x70, 0x65, 0x6e, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x27, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x64, - 0x27, 0x2c, 0x20, 0x27, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x27, 0x66, - 0x61, 0x69, 0x6c, 0x65, 0x64, 0x27, 0x2e, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x4e, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x34, 0x92, 0x41, 0x31, 0x32, 0x2f, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, - 0x6c, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, - 0x48, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x2e, 0x92, 0x41, 0x2b, 0x32, 0x29, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x61, - 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x77, 0x65, 0x69, 0x20, 0x66, 0x6f, 0x72, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x52, 0x07, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x54, 0x0a, 0x06, 0x72, 0x65, 0x66, - 0x75, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3c, 0x92, 0x41, 0x39, 0x32, 0x37, - 0x52, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x69, 0x6e, - 0x20, 0x77, 0x65, 0x69, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x69, 0x66, 0x20, 0x61, 0x70, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x52, 0x06, 0x72, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x1a, - 0xdb, 0x09, 0x0a, 0x07, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x9a, 0x01, 0x0a, 0x0a, - 0x74, 0x78, 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x42, 0x7b, 0x92, 0x41, 0x78, 0x32, 0x64, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x61, - 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, - 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x69, 0x6e, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, 0x0f, 0x5b, 0x61, - 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x52, 0x09, 0x74, - 0x78, 0x6e, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x92, 0x01, 0x0a, 0x15, 0x72, 0x65, 0x76, - 0x65, 0x72, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x74, 0x78, 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x68, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0x5e, 0x92, 0x41, 0x5b, 0x32, 0x47, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, - 0x20, 0x74, 0x78, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, - 0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, - 0x65, 0x76, 0x65, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x62, 0x65, 0x20, 0x64, 0x69, 0x73, 0x63, - 0x61, 0x72, 0x64, 0x65, 0x64, 0x2e, 0x8a, 0x01, 0x0f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, - 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x52, 0x13, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x6e, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x69, 0x0a, - 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x03, 0x42, 0x46, 0x92, 0x41, 0x43, 0x32, 0x41, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x20, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x2e, 0x52, 0x0b, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x98, 0x01, 0x0a, 0x0a, 0x62, 0x69, 0x64, - 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x79, 0x92, - 0x41, 0x76, 0x32, 0x6b, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, - 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, - 0x72, 0x20, 0x69, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, - 0x70, 0x61, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, - 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x8a, - 0x01, 0x06, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x52, 0x09, 0x62, 0x69, 0x64, 0x41, 0x6d, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x64, 0x0a, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x03, 0x42, 0x30, 0x92, 0x41, 0x2d, 0x32, 0x2b, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x62, 0x69, 0x64, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, - 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x5e, 0x0a, 0x13, 0x64, 0x65, 0x63, - 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x42, 0x2e, 0x92, 0x41, 0x2b, 0x32, 0x29, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x64, 0x65, 0x63, - 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x11, 0x64, 0x65, 0x63, 0x61, 0x79, 0x45, 0x6e, 0x64, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x6a, 0x0a, 0x0a, 0x62, 0x69, 0x64, - 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4b, 0x92, - 0x41, 0x48, 0x32, 0x46, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, - 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x69, 0x67, 0x65, 0x73, - 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2e, 0x52, 0x09, 0x62, 0x69, 0x64, 0x44, - 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0xc7, 0x01, 0x0a, 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, - 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0xa3, 0x01, 0x92, - 0x41, 0x9f, 0x01, 0x32, 0x93, 0x01, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, - 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, - 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, - 0x65, 0x79, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x2c, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x65, 0x64, 0x20, 0x62, 0x69, 0x64, 0x20, 0x61, 0x6d, 0x6f, - 0x75, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, - 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x2e, 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, 0x39, - 0x5d, 0x2b, 0x52, 0x0b, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x57, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x09, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, - 0x74, 0x57, 0x69, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0b, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x43, 0x92, 0x41, 0x40, 0x0a, 0x3e, 0x2a, - 0x08, 0x42, 0x69, 0x64, 0x20, 0x49, 0x6e, 0x66, 0x6f, 0x32, 0x32, 0x49, 0x6e, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x61, 0x20, 0x62, - 0x69, 0x64, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x74, 0x73, - 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x1a, 0xda, 0x01, - 0x0a, 0x0c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x59, - 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x03, 0x42, 0x36, 0x92, 0x41, 0x33, 0x32, 0x31, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x77, 0x68, 0x69, 0x63, - 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x69, - 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x2e, 0x52, 0x0b, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x6f, 0x0a, 0x04, 0x62, 0x69, 0x64, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, - 0x6f, 0x42, 0x31, 0x92, 0x41, 0x2e, 0x32, 0x2c, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, - 0x62, 0x69, 0x64, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x70, 0x65, - 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x2e, 0x52, 0x04, 0x62, 0x69, 0x64, 0x73, 0x32, 0xe0, 0x0a, 0x0a, 0x06, 0x42, - 0x69, 0x64, 0x64, 0x65, 0x72, 0x12, 0x53, 0x0a, 0x07, 0x53, 0x65, 0x6e, 0x64, 0x42, 0x69, 0x64, - 0x12, 0x11, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x42, 0x69, 0x64, 0x1a, 0x18, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x19, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x3a, 0x01, 0x2a, 0x22, 0x0e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, - 0x64, 0x64, 0x65, 0x72, 0x2f, 0x62, 0x69, 0x64, 0x30, 0x01, 0x12, 0x6b, 0x0a, 0x07, 0x44, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x1c, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x22, 0x1b, 0x2f, 0x76, 0x31, 0x2f, - 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x2f, 0x7b, - 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x7d, 0x12, 0x7b, 0x0a, 0x0d, 0x44, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x12, 0x22, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, - 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x45, - 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x62, - 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x19, 0x2f, 0x76, 0x31, 0x2f, 0x62, - 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x65, 0x76, - 0x65, 0x6e, 0x6c, 0x79, 0x12, 0x98, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x44, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x12, 0x29, 0x2e, - 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, - 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x22, 0x21, 0x2f, 0x76, - 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, - 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x12, - 0x8c, 0x01, 0x0a, 0x11, 0x53, 0x65, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, 0x26, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, - 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1e, - 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x73, 0x65, 0x74, 0x5f, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, 0x98, - 0x01, 0x0a, 0x14, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x29, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x12, 0x21, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, - 0x65, 0x72, 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x92, 0x01, 0x0a, 0x12, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, - 0x12, 0x27, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, - 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x62, 0x69, 0x64, 0x64, - 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x3a, 0x01, 0x2a, 0x22, 0x1e, - 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x12, 0x6c, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x64, 0x65, + 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x11, 0x64, 0x65, 0x63, 0x61, 0x79, 0x45, 0x6e, + 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x6a, 0x0a, 0x0a, 0x62, 0x69, + 0x64, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4b, + 0x92, 0x41, 0x48, 0x32, 0x46, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, + 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x69, 0x67, 0x65, + 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2e, 0x52, 0x09, 0x62, 0x69, 0x64, + 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0xc7, 0x01, 0x0a, 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, + 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0xa3, 0x01, + 0x92, 0x41, 0x9f, 0x01, 0x32, 0x93, 0x01, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, + 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, + 0x65, 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x79, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x2c, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x65, 0x64, 0x20, 0x62, 0x69, 0x64, 0x20, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x2e, 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, + 0x39, 0x5d, 0x2b, 0x52, 0x0b, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x57, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, + 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, + 0x6e, 0x74, 0x57, 0x69, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0b, 0x63, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x43, 0x92, 0x41, 0x40, 0x0a, 0x3e, + 0x2a, 0x08, 0x42, 0x69, 0x64, 0x20, 0x49, 0x6e, 0x66, 0x6f, 0x32, 0x32, 0x49, 0x6e, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x61, 0x20, + 0x62, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x74, + 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x1a, 0xda, + 0x01, 0x0a, 0x0c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x59, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x03, 0x42, 0x36, 0x92, 0x41, 0x33, 0x32, 0x31, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x77, 0x68, 0x69, + 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x20, + 0x69, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x2e, 0x52, 0x0b, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x6f, 0x0a, 0x04, 0x62, 0x69, + 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, + 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x42, 0x69, 0x64, 0x49, 0x6e, + 0x66, 0x6f, 0x42, 0x31, 0x92, 0x41, 0x2e, 0x32, 0x2c, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, + 0x20, 0x62, 0x69, 0x64, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x70, + 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x52, 0x04, 0x62, 0x69, 0x64, 0x73, 0x32, 0xef, 0x0b, 0x0a, 0x06, + 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x12, 0x53, 0x0a, 0x07, 0x53, 0x65, 0x6e, 0x64, 0x42, 0x69, + 0x64, 0x12, 0x11, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x42, 0x69, 0x64, 0x1a, 0x18, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x19, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x3a, 0x01, 0x2a, 0x22, 0x0e, 0x2f, 0x76, 0x31, 0x2f, 0x62, + 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x62, 0x69, 0x64, 0x30, 0x01, 0x12, 0x6b, 0x0a, 0x07, 0x44, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x1c, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x22, 0x1b, 0x2f, 0x76, 0x31, + 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x2f, + 0x7b, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x7d, 0x12, 0x7b, 0x0a, 0x0d, 0x44, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x12, 0x22, 0x2e, 0x62, 0x69, 0x64, 0x64, + 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x45, 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, + 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x19, 0x2f, 0x76, 0x31, 0x2f, + 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x65, + 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x12, 0x98, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x12, 0x29, + 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x62, 0x69, 0x64, 0x64, + 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x44, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x22, 0x21, 0x2f, + 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, + 0x12, 0x8c, 0x01, 0x0a, 0x11, 0x53, 0x65, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, 0x26, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, + 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, + 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, + 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x73, 0x65, 0x74, 0x5f, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, + 0x98, 0x01, 0x0a, 0x14, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x29, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, + 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x12, 0x21, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, + 0x64, 0x65, 0x72, 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x92, 0x01, 0x0a, 0x12, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, + 0x73, 0x12, 0x27, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, + 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x62, 0x69, 0x64, + 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x3a, 0x01, 0x2a, 0x22, + 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x12, + 0x8c, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x26, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, + 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, + 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x6c, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x1f, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, @@ -2269,7 +2377,7 @@ func file_bidderapi_v1_bidderapi_proto_rawDescGZIP() []byte { return file_bidderapi_v1_bidderapi_proto_rawDescData } -var file_bidderapi_v1_bidderapi_proto_msgTypes = make([]protoimpl.MessageInfo, 24) +var file_bidderapi_v1_bidderapi_proto_msgTypes = make([]protoimpl.MessageInfo, 26) var file_bidderapi_v1_bidderapi_proto_goTypes = []interface{}{ (*DepositRequest)(nil), // 0: bidderapi.v1.DepositRequest (*DepositResponse)(nil), // 1: bidderapi.v1.DepositResponse @@ -2288,46 +2396,50 @@ var file_bidderapi_v1_bidderapi_proto_goTypes = []interface{}{ (*RequestWithdrawalsResponse)(nil), // 14: bidderapi.v1.RequestWithdrawalsResponse (*WithdrawRequest)(nil), // 15: bidderapi.v1.WithdrawRequest (*WithdrawResponse)(nil), // 16: bidderapi.v1.WithdrawResponse - (*Bid)(nil), // 17: bidderapi.v1.Bid - (*Commitment)(nil), // 18: bidderapi.v1.Commitment - (*GetBidInfoRequest)(nil), // 19: bidderapi.v1.GetBidInfoRequest - (*GetBidInfoResponse)(nil), // 20: bidderapi.v1.GetBidInfoResponse - (*GetBidInfoResponse_CommitmentWithStatus)(nil), // 21: bidderapi.v1.GetBidInfoResponse.CommitmentWithStatus - (*GetBidInfoResponse_BidInfo)(nil), // 22: bidderapi.v1.GetBidInfoResponse.BidInfo - (*GetBidInfoResponse_BlockBidInfo)(nil), // 23: bidderapi.v1.GetBidInfoResponse.BlockBidInfo - (*wrapperspb.StringValue)(nil), // 24: google.protobuf.StringValue + (*GetValidProvidersRequest)(nil), // 17: bidderapi.v1.GetValidProvidersRequest + (*GetValidProvidersResponse)(nil), // 18: bidderapi.v1.GetValidProvidersResponse + (*Bid)(nil), // 19: bidderapi.v1.Bid + (*Commitment)(nil), // 20: bidderapi.v1.Commitment + (*GetBidInfoRequest)(nil), // 21: bidderapi.v1.GetBidInfoRequest + (*GetBidInfoResponse)(nil), // 22: bidderapi.v1.GetBidInfoResponse + (*GetBidInfoResponse_CommitmentWithStatus)(nil), // 23: bidderapi.v1.GetBidInfoResponse.CommitmentWithStatus + (*GetBidInfoResponse_BidInfo)(nil), // 24: bidderapi.v1.GetBidInfoResponse.BidInfo + (*GetBidInfoResponse_BlockBidInfo)(nil), // 25: bidderapi.v1.GetBidInfoResponse.BlockBidInfo + (*wrapperspb.StringValue)(nil), // 26: google.protobuf.StringValue } var file_bidderapi_v1_bidderapi_proto_depIdxs = []int32{ 6, // 0: bidderapi.v1.SetTargetDepositsRequest.target_deposits:type_name -> bidderapi.v1.TargetDeposit 6, // 1: bidderapi.v1.SetTargetDepositsResponse.successfully_set_deposits:type_name -> bidderapi.v1.TargetDeposit 6, // 2: bidderapi.v1.DepositManagerStatusResponse.target_deposits:type_name -> bidderapi.v1.TargetDeposit - 23, // 3: bidderapi.v1.GetBidInfoResponse.block_bid_info:type_name -> bidderapi.v1.GetBidInfoResponse.BlockBidInfo - 21, // 4: bidderapi.v1.GetBidInfoResponse.BidInfo.commitments:type_name -> bidderapi.v1.GetBidInfoResponse.CommitmentWithStatus - 22, // 5: bidderapi.v1.GetBidInfoResponse.BlockBidInfo.bids:type_name -> bidderapi.v1.GetBidInfoResponse.BidInfo - 17, // 6: bidderapi.v1.Bidder.SendBid:input_type -> bidderapi.v1.Bid + 25, // 3: bidderapi.v1.GetBidInfoResponse.block_bid_info:type_name -> bidderapi.v1.GetBidInfoResponse.BlockBidInfo + 23, // 4: bidderapi.v1.GetBidInfoResponse.BidInfo.commitments:type_name -> bidderapi.v1.GetBidInfoResponse.CommitmentWithStatus + 24, // 5: bidderapi.v1.GetBidInfoResponse.BlockBidInfo.bids:type_name -> bidderapi.v1.GetBidInfoResponse.BidInfo + 19, // 6: bidderapi.v1.Bidder.SendBid:input_type -> bidderapi.v1.Bid 0, // 7: bidderapi.v1.Bidder.Deposit:input_type -> bidderapi.v1.DepositRequest 2, // 8: bidderapi.v1.Bidder.DepositEvenly:input_type -> bidderapi.v1.DepositEvenlyRequest 4, // 9: bidderapi.v1.Bidder.EnableDepositManager:input_type -> bidderapi.v1.EnableDepositManagerRequest 7, // 10: bidderapi.v1.Bidder.SetTargetDeposits:input_type -> bidderapi.v1.SetTargetDepositsRequest 9, // 11: bidderapi.v1.Bidder.DepositManagerStatus:input_type -> bidderapi.v1.DepositManagerStatusRequest 13, // 12: bidderapi.v1.Bidder.RequestWithdrawals:input_type -> bidderapi.v1.RequestWithdrawalsRequest - 12, // 13: bidderapi.v1.Bidder.GetDeposit:input_type -> bidderapi.v1.GetDepositRequest - 15, // 14: bidderapi.v1.Bidder.Withdraw:input_type -> bidderapi.v1.WithdrawRequest - 19, // 15: bidderapi.v1.Bidder.GetBidInfo:input_type -> bidderapi.v1.GetBidInfoRequest - 11, // 16: bidderapi.v1.Bidder.ClaimSlashedFunds:input_type -> bidderapi.v1.EmptyMessage - 18, // 17: bidderapi.v1.Bidder.SendBid:output_type -> bidderapi.v1.Commitment - 1, // 18: bidderapi.v1.Bidder.Deposit:output_type -> bidderapi.v1.DepositResponse - 3, // 19: bidderapi.v1.Bidder.DepositEvenly:output_type -> bidderapi.v1.DepositEvenlyResponse - 5, // 20: bidderapi.v1.Bidder.EnableDepositManager:output_type -> bidderapi.v1.EnableDepositManagerResponse - 8, // 21: bidderapi.v1.Bidder.SetTargetDeposits:output_type -> bidderapi.v1.SetTargetDepositsResponse - 10, // 22: bidderapi.v1.Bidder.DepositManagerStatus:output_type -> bidderapi.v1.DepositManagerStatusResponse - 14, // 23: bidderapi.v1.Bidder.RequestWithdrawals:output_type -> bidderapi.v1.RequestWithdrawalsResponse - 1, // 24: bidderapi.v1.Bidder.GetDeposit:output_type -> bidderapi.v1.DepositResponse - 16, // 25: bidderapi.v1.Bidder.Withdraw:output_type -> bidderapi.v1.WithdrawResponse - 20, // 26: bidderapi.v1.Bidder.GetBidInfo:output_type -> bidderapi.v1.GetBidInfoResponse - 24, // 27: bidderapi.v1.Bidder.ClaimSlashedFunds:output_type -> google.protobuf.StringValue - 17, // [17:28] is the sub-list for method output_type - 6, // [6:17] is the sub-list for method input_type + 17, // 13: bidderapi.v1.Bidder.GetValidProviders:input_type -> bidderapi.v1.GetValidProvidersRequest + 12, // 14: bidderapi.v1.Bidder.GetDeposit:input_type -> bidderapi.v1.GetDepositRequest + 15, // 15: bidderapi.v1.Bidder.Withdraw:input_type -> bidderapi.v1.WithdrawRequest + 21, // 16: bidderapi.v1.Bidder.GetBidInfo:input_type -> bidderapi.v1.GetBidInfoRequest + 11, // 17: bidderapi.v1.Bidder.ClaimSlashedFunds:input_type -> bidderapi.v1.EmptyMessage + 20, // 18: bidderapi.v1.Bidder.SendBid:output_type -> bidderapi.v1.Commitment + 1, // 19: bidderapi.v1.Bidder.Deposit:output_type -> bidderapi.v1.DepositResponse + 3, // 20: bidderapi.v1.Bidder.DepositEvenly:output_type -> bidderapi.v1.DepositEvenlyResponse + 5, // 21: bidderapi.v1.Bidder.EnableDepositManager:output_type -> bidderapi.v1.EnableDepositManagerResponse + 8, // 22: bidderapi.v1.Bidder.SetTargetDeposits:output_type -> bidderapi.v1.SetTargetDepositsResponse + 10, // 23: bidderapi.v1.Bidder.DepositManagerStatus:output_type -> bidderapi.v1.DepositManagerStatusResponse + 14, // 24: bidderapi.v1.Bidder.RequestWithdrawals:output_type -> bidderapi.v1.RequestWithdrawalsResponse + 18, // 25: bidderapi.v1.Bidder.GetValidProviders:output_type -> bidderapi.v1.GetValidProvidersResponse + 1, // 26: bidderapi.v1.Bidder.GetDeposit:output_type -> bidderapi.v1.DepositResponse + 16, // 27: bidderapi.v1.Bidder.Withdraw:output_type -> bidderapi.v1.WithdrawResponse + 22, // 28: bidderapi.v1.Bidder.GetBidInfo:output_type -> bidderapi.v1.GetBidInfoResponse + 26, // 29: bidderapi.v1.Bidder.ClaimSlashedFunds:output_type -> google.protobuf.StringValue + 18, // [18:30] is the sub-list for method output_type + 6, // [6:18] is the sub-list for method input_type 6, // [6:6] is the sub-list for extension type_name 6, // [6:6] is the sub-list for extension extendee 0, // [0:6] is the sub-list for field type_name @@ -2544,7 +2656,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Bid); i { + switch v := v.(*GetValidProvidersRequest); i { case 0: return &v.state case 1: @@ -2556,7 +2668,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Commitment); i { + switch v := v.(*GetValidProvidersResponse); i { case 0: return &v.state case 1: @@ -2568,7 +2680,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBidInfoRequest); i { + switch v := v.(*Bid); i { case 0: return &v.state case 1: @@ -2580,7 +2692,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBidInfoResponse); i { + switch v := v.(*Commitment); i { case 0: return &v.state case 1: @@ -2592,7 +2704,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBidInfoResponse_CommitmentWithStatus); i { + switch v := v.(*GetBidInfoRequest); i { case 0: return &v.state case 1: @@ -2604,7 +2716,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBidInfoResponse_BidInfo); i { + switch v := v.(*GetBidInfoResponse); i { case 0: return &v.state case 1: @@ -2616,6 +2728,30 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetBidInfoResponse_CommitmentWithStatus); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_bidderapi_v1_bidderapi_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetBidInfoResponse_BidInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_bidderapi_v1_bidderapi_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetBidInfoResponse_BlockBidInfo); i { case 0: return &v.state @@ -2634,7 +2770,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_bidderapi_v1_bidderapi_proto_rawDesc, NumEnums: 0, - NumMessages: 24, + NumMessages: 26, NumExtensions: 0, NumServices: 1, }, diff --git a/p2p/gen/go/bidderapi/v1/bidderapi.pb.gw.go b/p2p/gen/go/bidderapi/v1/bidderapi.pb.gw.go index a8d659891..b539f75b7 100644 --- a/p2p/gen/go/bidderapi/v1/bidderapi.pb.gw.go +++ b/p2p/gen/go/bidderapi/v1/bidderapi.pb.gw.go @@ -250,6 +250,27 @@ func local_request_Bidder_RequestWithdrawals_0(ctx context.Context, marshaler ru return msg, metadata, err } +func request_Bidder_GetValidProviders_0(ctx context.Context, marshaler runtime.Marshaler, client BidderClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetValidProvidersRequest + metadata runtime.ServerMetadata + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + msg, err := client.GetValidProviders(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_Bidder_GetValidProviders_0(ctx context.Context, marshaler runtime.Marshaler, server BidderServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetValidProvidersRequest + metadata runtime.ServerMetadata + ) + msg, err := server.GetValidProviders(ctx, &protoReq) + return msg, metadata, err +} + var filter_Bidder_GetDeposit_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_Bidder_GetDeposit_0(ctx context.Context, marshaler runtime.Marshaler, client BidderClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -508,6 +529,26 @@ func RegisterBidderHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser } forward_Bidder_RequestWithdrawals_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) + mux.Handle(http.MethodGet, pattern_Bidder_GetValidProviders_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/bidderapi.v1.Bidder/GetValidProviders", runtime.WithHTTPPathPattern("/v1/bidder/get_valid_providers")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Bidder_GetValidProviders_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_Bidder_GetValidProviders_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle(http.MethodGet, pattern_Bidder_GetDeposit_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -747,6 +788,23 @@ func RegisterBidderHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli } forward_Bidder_RequestWithdrawals_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) + mux.Handle(http.MethodGet, pattern_Bidder_GetValidProviders_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/bidderapi.v1.Bidder/GetValidProviders", runtime.WithHTTPPathPattern("/v1/bidder/get_valid_providers")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Bidder_GetValidProviders_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_Bidder_GetValidProviders_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle(http.MethodGet, pattern_Bidder_GetDeposit_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -826,6 +884,7 @@ var ( pattern_Bidder_SetTargetDeposits_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "set_target_deposits"}, "")) pattern_Bidder_DepositManagerStatus_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "deposit_manager_status"}, "")) pattern_Bidder_RequestWithdrawals_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "request_withdrawals"}, "")) + pattern_Bidder_GetValidProviders_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "get_valid_providers"}, "")) pattern_Bidder_GetDeposit_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "get_deposit"}, "")) pattern_Bidder_Withdraw_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "withdraw"}, "")) pattern_Bidder_GetBidInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "get_bid_info"}, "")) @@ -840,6 +899,7 @@ var ( forward_Bidder_SetTargetDeposits_0 = runtime.ForwardResponseMessage forward_Bidder_DepositManagerStatus_0 = runtime.ForwardResponseMessage forward_Bidder_RequestWithdrawals_0 = runtime.ForwardResponseMessage + forward_Bidder_GetValidProviders_0 = runtime.ForwardResponseMessage forward_Bidder_GetDeposit_0 = runtime.ForwardResponseMessage forward_Bidder_Withdraw_0 = runtime.ForwardResponseMessage forward_Bidder_GetBidInfo_0 = runtime.ForwardResponseMessage diff --git a/p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go b/p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go index 5671ed68e..fb5d27cfd 100644 --- a/p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go +++ b/p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go @@ -27,6 +27,7 @@ const ( Bidder_SetTargetDeposits_FullMethodName = "/bidderapi.v1.Bidder/SetTargetDeposits" Bidder_DepositManagerStatus_FullMethodName = "/bidderapi.v1.Bidder/DepositManagerStatus" Bidder_RequestWithdrawals_FullMethodName = "/bidderapi.v1.Bidder/RequestWithdrawals" + Bidder_GetValidProviders_FullMethodName = "/bidderapi.v1.Bidder/GetValidProviders" Bidder_GetDeposit_FullMethodName = "/bidderapi.v1.Bidder/GetDeposit" Bidder_Withdraw_FullMethodName = "/bidderapi.v1.Bidder/Withdraw" Bidder_GetBidInfo_FullMethodName = "/bidderapi.v1.Bidder/GetBidInfo" @@ -71,6 +72,15 @@ type BidderClient interface { // // RequestWithdrawals is called by the bidder node to request withdrawals from provider(s) RequestWithdrawals(ctx context.Context, in *RequestWithdrawalsRequest, opts ...grpc.CallOption) (*RequestWithdrawalsResponse, error) + // GetValidProviders + // + // GetValidProviders is called by the bidder node to get a list of all valid providers. + // Each provider returned by this RPC must be connected to the bidder node via p2p and: + // - Be "registered" in the provider registry + // - Have deposit >= minStake in provider registry + // - Have no pending withdrawal request with provider registry + // - Have at least one BLS key registered with provider registry + GetValidProviders(ctx context.Context, in *GetValidProvidersRequest, opts ...grpc.CallOption) (*GetValidProvidersResponse, error) // GetDeposit // // GetDeposit is called by the bidder to get its deposit specific to a provider in the bidder registry. @@ -178,6 +188,16 @@ func (c *bidderClient) RequestWithdrawals(ctx context.Context, in *RequestWithdr return out, nil } +func (c *bidderClient) GetValidProviders(ctx context.Context, in *GetValidProvidersRequest, opts ...grpc.CallOption) (*GetValidProvidersResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetValidProvidersResponse) + err := c.cc.Invoke(ctx, Bidder_GetValidProviders_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *bidderClient) GetDeposit(ctx context.Context, in *GetDepositRequest, opts ...grpc.CallOption) (*DepositResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(DepositResponse) @@ -256,6 +276,15 @@ type BidderServer interface { // // RequestWithdrawals is called by the bidder node to request withdrawals from provider(s) RequestWithdrawals(context.Context, *RequestWithdrawalsRequest) (*RequestWithdrawalsResponse, error) + // GetValidProviders + // + // GetValidProviders is called by the bidder node to get a list of all valid providers. + // Each provider returned by this RPC must be connected to the bidder node via p2p and: + // - Be "registered" in the provider registry + // - Have deposit >= minStake in provider registry + // - Have no pending withdrawal request with provider registry + // - Have at least one BLS key registered with provider registry + GetValidProviders(context.Context, *GetValidProvidersRequest) (*GetValidProvidersResponse, error) // GetDeposit // // GetDeposit is called by the bidder to get its deposit specific to a provider in the bidder registry. @@ -305,6 +334,9 @@ func (UnimplementedBidderServer) DepositManagerStatus(context.Context, *DepositM func (UnimplementedBidderServer) RequestWithdrawals(context.Context, *RequestWithdrawalsRequest) (*RequestWithdrawalsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method RequestWithdrawals not implemented") } +func (UnimplementedBidderServer) GetValidProviders(context.Context, *GetValidProvidersRequest) (*GetValidProvidersResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetValidProviders not implemented") +} func (UnimplementedBidderServer) GetDeposit(context.Context, *GetDepositRequest) (*DepositResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetDeposit not implemented") } @@ -457,6 +489,24 @@ func _Bidder_RequestWithdrawals_Handler(srv interface{}, ctx context.Context, de return interceptor(ctx, in, info, handler) } +func _Bidder_GetValidProviders_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetValidProvidersRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BidderServer).GetValidProviders(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Bidder_GetValidProviders_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BidderServer).GetValidProviders(ctx, req.(*GetValidProvidersRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Bidder_GetDeposit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetDepositRequest) if err := dec(in); err != nil { @@ -560,6 +610,10 @@ var Bidder_ServiceDesc = grpc.ServiceDesc{ MethodName: "RequestWithdrawals", Handler: _Bidder_RequestWithdrawals_Handler, }, + { + MethodName: "GetValidProviders", + Handler: _Bidder_GetValidProviders_Handler, + }, { MethodName: "GetDeposit", Handler: _Bidder_GetDeposit_Handler, diff --git a/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml b/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml index 78003f060..dd6832a62 100644 --- a/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml +++ b/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml @@ -192,6 +192,26 @@ paths: in: query required: false type: string + /v1/bidder/get_valid_providers: + get: + summary: GetValidProviders + description: |- + GetValidProviders is called by the bidder node to get a list of all valid providers. + Each provider returned by this RPC must be connected to the bidder node via p2p and: + - Be "registered" in the provider registry + - Have deposit >= minStake in provider registry + - Have no pending withdrawal request with provider registry + - Have at least one BLS key registered with provider registry + operationId: Bidder_GetValidProviders + responses: + "200": + description: A successful response. + schema: + $ref: '#/definitions/v1GetValidProvidersResponse' + default: + description: An unexpected error response. + schema: + $ref: '#/definitions/googlerpcStatus' /v1/bidder/request_withdrawals: post: summary: RequestWithdrawals @@ -515,6 +535,15 @@ definitions: type: object $ref: '#/definitions/GetBidInfoResponseBlockBidInfo' description: List of block bid info containing bids and their commitments. + v1GetValidProvidersResponse: + type: object + properties: + validProviders: + type: array + items: + type: string + description: GetValidProviders response. + title: GetValidProviders response v1RequestWithdrawalsRequest: type: object properties: diff --git a/p2p/pkg/node/node.go b/p2p/pkg/node/node.go index 1e7babe3c..99a45b3c7 100644 --- a/p2p/pkg/node/node.go +++ b/p2p/pkg/node/node.go @@ -681,6 +681,7 @@ func NewNode(opts *Options) (*Node, error) { setCodeHelper, depositManagerContract, backend, + topo, ) bidderapiv1.RegisterBidderServer(grpcServer, bidderAPI) diff --git a/p2p/pkg/rpc/bidder/service.go b/p2p/pkg/rpc/bidder/service.go index efd0823a1..57a3473da 100644 --- a/p2p/pkg/rpc/bidder/service.go +++ b/p2p/pkg/rpc/bidder/service.go @@ -18,7 +18,9 @@ import ( providerregistry "github.com/primev/mev-commit/contracts-abi/clients/ProviderRegistry" bidderapiv1 "github.com/primev/mev-commit/p2p/gen/go/bidderapi/v1" preconfirmationv1 "github.com/primev/mev-commit/p2p/gen/go/preconfirmation/v1" + "github.com/primev/mev-commit/p2p/pkg/p2p" preconfstore "github.com/primev/mev-commit/p2p/pkg/preconfirmation/store" + "github.com/primev/mev-commit/p2p/pkg/topology" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "google.golang.org/protobuf/types/known/wrapperspb" @@ -41,6 +43,7 @@ type Service struct { setCodeHelper SetCodeHelper depositManager DepositManagerContract backend Backend + topology *topology.Topology } func NewService( @@ -58,6 +61,7 @@ func NewService( setCodeHelper SetCodeHelper, depositManager DepositManagerContract, backend Backend, + topology *topology.Topology, ) *Service { return &Service{ owner: owner, @@ -75,6 +79,7 @@ func NewService( setCodeHelper: setCodeHelper, depositManager: depositManager, backend: backend, + topology: topology, } } @@ -97,6 +102,7 @@ type ProviderRegistryContract interface { BidderSlashedAmount(*bind.CallOpts, common.Address) (*big.Int, error) WithdrawSlashedAmount(*bind.TransactOpts) (*types.Transaction, error) ParseBidderWithdrawSlashedAmount(log types.Log) (*providerregistry.ProviderregistryBidderWithdrawSlashedAmount, error) + AreProvidersValid(*bind.CallOpts, []common.Address) ([]bool, error) } type CommitmentStore interface { @@ -527,12 +533,29 @@ func (s *Service) EnableDepositManager( ctx context.Context, r *bidderapiv1.EnableDepositManagerRequest, ) (*bidderapiv1.EnableDepositManagerResponse, error) { + err := s.validator.Validate(r) + if err != nil { + s.logger.Error("enable deposit manager validation", "error", err) + return nil, status.Errorf(codes.InvalidArgument, "validating enable deposit manager request: %v", err) + } + opts, err := s.optsGetter(ctx) if err != nil { s.logger.Error("getting transact opts", "error", err) return nil, status.Errorf(codes.Internal, "getting transact opts: %v", err) } + depositManagerEnabled, err := s.DepositManagerStatus(ctx, &bidderapiv1.DepositManagerStatusRequest{}) + if err != nil { + s.logger.Error("checking deposit manager status", "error", err) + return nil, status.Errorf(codes.Internal, "checking deposit manager status: %v", err) + } + + if depositManagerEnabled.Enabled { + s.logger.Error("EnableDepositManager failed: deposit manager is already enabled") + return nil, status.Errorf(codes.FailedPrecondition, "EnableDepositManager failed: deposit manager is already enabled") + } + // TODO: Config param for deposit manager depositManagerAddr := common.HexToAddress("0x0000000000000000000000000000000000000000") @@ -560,12 +583,29 @@ func (s *Service) SetTargetDeposits( ctx context.Context, r *bidderapiv1.SetTargetDepositsRequest, ) (*bidderapiv1.SetTargetDepositsResponse, error) { + err := s.validator.Validate(r) + if err != nil { + s.logger.Error("set target deposits validation", "error", err) + return nil, status.Errorf(codes.InvalidArgument, "validating set target deposits request: %v", err) + } + opts, err := s.optsGetter(ctx) if err != nil { s.logger.Error("getting transact opts", "error", err) return nil, status.Errorf(codes.Internal, "getting transact opts: %v", err) } + depositManagerEnabled, err := s.DepositManagerStatus(ctx, &bidderapiv1.DepositManagerStatusRequest{}) + if err != nil { + s.logger.Error("checking deposit manager status", "error", err) + return nil, status.Errorf(codes.Internal, "checking deposit manager status: %v", err) + } + + if !depositManagerEnabled.Enabled { + s.logger.Error("SetTargetDeposits failed: deposit manager is not enabled") + return nil, status.Errorf(codes.FailedPrecondition, "SetTargetDeposits failed: deposit manager is not enabled") + } + providers := make([]common.Address, len(r.TargetDeposits)) amounts := make([]*big.Int, len(r.TargetDeposits)) for i, targetDeposit := range r.TargetDeposits { @@ -604,8 +644,14 @@ func (s *Service) SetTargetDeposits( func (s *Service) DepositManagerStatus( ctx context.Context, - _ *bidderapiv1.DepositManagerStatusRequest, + r *bidderapiv1.DepositManagerStatusRequest, ) (*bidderapiv1.DepositManagerStatusResponse, error) { + err := s.validator.Validate(r) + if err != nil { + s.logger.Error("deposit manager status validation", "error", err) + return nil, status.Errorf(codes.InvalidArgument, "validating deposit manager status request: %v", err) + } + code, err := s.backend.CodeAt(ctx, s.owner, nil) if err != nil { s.logger.Error("getting code", "error", err) @@ -631,6 +677,40 @@ func (s *Service) DepositManagerStatus( // TODO: api/handling for a bidder removing set code auth +func (s *Service) GetValidProviders( + ctx context.Context, + r *bidderapiv1.GetValidProvidersRequest, +) (*bidderapiv1.GetValidProvidersResponse, error) { + err := s.validator.Validate(r) + if err != nil { + s.logger.Error("get valid providers validation", "error", err) + return nil, status.Errorf(codes.InvalidArgument, "validating get valid providers request: %v", err) + } + + connectedProviders := s.topology.GetPeers(topology.Query{Type: p2p.PeerTypeProvider}) + providerAddrs := make([]common.Address, len(connectedProviders)) + for i, provider := range connectedProviders { + providerAddrs[i] = provider.EthAddress + } + + validProviders := make([]string, 0) + areValid, err := s.providerRegistry.AreProvidersValid(&bind.CallOpts{ + Context: ctx, + }, providerAddrs) + if err != nil { + s.logger.Error("checking if providers are valid", "error", err) + return nil, status.Errorf(codes.Internal, "checking if providers are valid: %v", err) + } + + for i, isValid := range areValid { + if isValid { + validProviders = append(validProviders, connectedProviders[i].EthAddress.Hex()) + } + } + + return &bidderapiv1.GetValidProvidersResponse{ValidProviders: validProviders}, nil +} + func (s *Service) ClaimSlashedFunds( ctx context.Context, _ *bidderapiv1.EmptyMessage, diff --git a/p2p/pkg/rpc/bidder/service_test.go b/p2p/pkg/rpc/bidder/service_test.go index 6bc004478..725841130 100644 --- a/p2p/pkg/rpc/bidder/service_test.go +++ b/p2p/pkg/rpc/bidder/service_test.go @@ -22,6 +22,7 @@ import ( preconfpb "github.com/primev/mev-commit/p2p/gen/go/preconfirmation/v1" preconfstore "github.com/primev/mev-commit/p2p/pkg/preconfirmation/store" bidderapi "github.com/primev/mev-commit/p2p/pkg/rpc/bidder" + "github.com/primev/mev-commit/p2p/pkg/topology" "github.com/primev/mev-commit/x/util" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" @@ -216,6 +217,10 @@ func (t *testProviderRegistry) ParseBidderWithdrawSlashedAmount(_log types.Log) }, nil } +func (t *testProviderRegistry) AreProvidersValid(_ *bind.CallOpts, _ []common.Address) ([]bool, error) { + return []bool{true}, nil +} + func (t *testStore) GetCommitments(blockNum int64) ([]*preconfstore.Commitment, error) { cmts := make([]*preconfstore.Commitment, 0) for _, c := range t.commitments { @@ -277,8 +282,9 @@ func startServerWithStore(t *testing.T, cs *testStore) bidderapiv1.BidderClient 15*time.Second, logger, setCodeHelper, - nil, // TODO: Make deposit manager non-nil and test relevant functions from service.go - nil, // TODO: Make backend non-nil and test relevant functions from service.go + nil, // TODO: Make deposit manager non-nil and test relevant functions from service.go + nil, // TODO: Make backend non-nil and test relevant functions from service.go + &topology.Topology{}, // TODO: Make topology non-nil and test relevant functions from service.go ) baseServer := grpc.NewServer() diff --git a/p2p/rpc/bidderapi/v1/bidderapi.proto b/p2p/rpc/bidderapi/v1/bidderapi.proto index 97f692f52..89e2fd4ec 100644 --- a/p2p/rpc/bidderapi/v1/bidderapi.proto +++ b/p2p/rpc/bidderapi/v1/bidderapi.proto @@ -80,6 +80,18 @@ service Bidder { }; } + // GetValidProviders + // + // GetValidProviders is called by the bidder node to get a list of all valid providers. + // Each provider returned by this RPC must be connected to the bidder node via p2p and: + // - Be "registered" in the provider registry + // - Have deposit >= minStake in provider registry + // - Have no pending withdrawal request with provider registry + // - Have at least one BLS key registered with provider registry + rpc GetValidProviders(GetValidProvidersRequest) returns (GetValidProvidersResponse) { + option (google.api.http) = {get: "/v1/bidder/get_valid_providers"}; + } + // GetDeposit // // GetDeposit is called by the bidder to get its deposit specific to a provider in the bidder registry. @@ -322,6 +334,25 @@ message WithdrawResponse { repeated string providers = 2; }; +message GetValidProvidersRequest { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { + json_schema: { + title: "GetValidProviders request" + description: "GetValidProviders request." + } + }; +} + +message GetValidProvidersResponse { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { + json_schema: { + title: "GetValidProviders response" + description: "GetValidProviders response." + } + }; + repeated string valid_providers = 1; +} + message Bid { option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { json_schema: { From c44934aba9a5513c6e0216da510242fe59bc1cc9 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Tue, 19 Aug 2025 15:48:29 -0700 Subject: [PATCH 072/117] fix client code --- p2p/integrationtest/real-bidder/main.go | 51 +++++++++------------ tools/bidder-bot/service/service.go | 61 ++++++++++++++++--------- tools/bidder-emulator/bidder.go | 60 ++++++++++++++++++------ tools/instant-bridge/service/service.go | 58 +++++++++++++++-------- tools/preconf-rpc/service/service.go | 58 +++++++++++++++-------- 5 files changed, 186 insertions(+), 102 deletions(-) diff --git a/p2p/integrationtest/real-bidder/main.go b/p2p/integrationtest/real-bidder/main.go index 8d730fa0b..831af92b4 100644 --- a/p2p/integrationtest/real-bidder/main.go +++ b/p2p/integrationtest/real-bidder/main.go @@ -20,7 +20,6 @@ import ( "github.com/ethereum/go-ethereum/ethclient" "github.com/go-logr/logr" pb "github.com/primev/mev-commit/p2p/gen/go/bidderapi/v1" - debugapiv1 "github.com/primev/mev-commit/p2p/gen/go/debugapi/v1" "github.com/primev/mev-commit/x/util" "github.com/primev/mev-commit/x/util/otelutil" "github.com/prometheus/client_golang/prometheus" @@ -188,34 +187,6 @@ func main() { return } - var providerAddress string - debugClient := debugapiv1.NewDebugServiceClient(conn) - retries := 10 - for range retries { - ctx, cancel := context.WithTimeout(context.Background(), time.Second) - topology, err := debugClient.GetTopology(ctx, &debugapiv1.EmptyMessage{}) - cancel() - if err != nil { - logger.Error("failed to get topology", "err", err) - continue - } - if f, ok := topology.Topology.Fields["connected_providers"]; ok { - vals := f.GetListValue().GetValues() - if len(vals) > 0 { - providerAddress = vals[0].GetStringValue() - break - } - } - time.Sleep(time.Second) - } - - if providerAddress == "" { - logger.Error("no connected provider found") - return - } - - fmt.Println("min deposit", minDeposit) - status, err := bidderClient.DepositManagerStatus(context.Background(), &pb.DepositManagerStatusRequest{}) if err != nil { logger.Error("failed to get auto deposit status", "err", err) @@ -232,7 +203,27 @@ func main() { logger.Error("failed to enable deposit manager") return } - logger.Info("deposit manager enabled") + } + logger.Info("deposit manager enabled") + + var providerAddress string + retries := 10 + for range retries { + resp, err := bidderClient.GetValidProviders(context.Background(), &pb.GetValidProvidersRequest{}) + if err != nil { + logger.Error("failed to get valid providers", "err", err) + continue + } + if len(resp.ValidProviders) > 0 { + providerAddress = resp.ValidProviders[0] + break + } + time.Sleep(time.Second) + } + + if providerAddress == "" { + logger.Error("no connected and valid provider found") + return } resp, err := bidderClient.SetTargetDeposits(context.Background(), &pb.SetTargetDepositsRequest{ diff --git a/tools/bidder-bot/service/service.go b/tools/bidder-bot/service/service.go index 223b08ab0..e81dedc31 100644 --- a/tools/bidder-bot/service/service.go +++ b/tools/bidder-bot/service/service.go @@ -177,27 +177,46 @@ func New(config *Config) (*Service, error) { config.Logger.Info("balance checking disabled") } - // TODO: set code to deposit manager here, set min deposit for every provider - - // status, err := bidderCli.AutoDepositStatus(context.Background(), &bidderapiv1.EmptyMessage{}) - // if err != nil { - // return nil, err - // } - // config.Logger.Info("got auto deposit status", "enabled", status.IsAutodepositEnabled) - - // if !status.IsAutodepositEnabled { - // config.Logger.Info("enabling auto deposit") - // resp, err := bidderCli.AutoDeposit( - // context.Background(), - // &bidderapiv1.DepositRequest{ - // Amount: config.AutoDepositAmount.String(), - // }, - // ) - // if err != nil { - // return nil, err - // } - // config.Logger.Debug("auto deposit enabled", "amount", resp.AmountPerWindow, "window", resp.StartWindowNumber) - // } + status, err := bidderCli.DepositManagerStatus(context.Background(), &bidderapiv1.DepositManagerStatusRequest{}) + if err != nil { + return nil, err + } + if !status.Enabled { + resp, err := bidderCli.EnableDepositManager(context.Background(), &bidderapiv1.EnableDepositManagerRequest{}) + if err != nil { + return nil, err + } + if !resp.Success { + return nil, errors.New("failed to enable deposit manager") + } + } + config.Logger.Info("deposit manager enabled") + + validProviders, err := bidderCli.GetValidProviders(context.Background(), &bidderapiv1.GetValidProvidersRequest{}) + if err != nil { + return nil, err + } + if len(validProviders.ValidProviders) == 0 { + return nil, errors.New("no connected and valid providers found") + } + + targetDeposits := make([]*bidderapiv1.TargetDeposit, len(validProviders.ValidProviders)) + for i, provider := range validProviders.ValidProviders { + targetDeposits[i] = &bidderapiv1.TargetDeposit{ + Provider: provider, + TargetDeposit: config.AutoDepositAmount.Uint64(), + } + } + + resp, err := bidderCli.SetTargetDeposits(context.Background(), &bidderapiv1.SetTargetDepositsRequest{ + TargetDeposits: targetDeposits, + }) + if err != nil { + return nil, err + } + if len(resp.SuccessfullySetDeposits) != len(targetDeposits) { + return nil, errors.New("failed to set target deposits") + } healthChecker := health.New() diff --git a/tools/bidder-emulator/bidder.go b/tools/bidder-emulator/bidder.go index 5bee0dda4..883f07a07 100644 --- a/tools/bidder-emulator/bidder.go +++ b/tools/bidder-emulator/bidder.go @@ -47,21 +47,51 @@ func newBidder(rpcURL string, depositAmount string) (*bidder, error) { } func (b *bidder) setup(depositAmount string) error { - // TODO: set code to deposit manager here, set min deposit for every provider - - // status, err := b.client.AutoDepositStatus(context.Background(), &pb.EmptyMessage{}) - // if err != nil { - // return fmt.Errorf("failed to get auto deposit status: %w", err) - // } - - // if !status.IsAutodepositEnabled { - // _, err := b.client.AutoDeposit(context.Background(), &pb.DepositRequest{ - // Amount: depositAmount, - // }) - // if err != nil { - // return fmt.Errorf("failed to auto deposit: %w", err) - // } - // } + depositAmountInt, ok := new(big.Int).SetString(depositAmount, 10) + if !ok { + return fmt.Errorf("failed to parse deposit amount") + } + + status, err := b.client.DepositManagerStatus(context.Background(), &pb.DepositManagerStatusRequest{}) + if err != nil { + return fmt.Errorf("failed to get deposit manager status: %w", err) + } + if !status.Enabled { + resp, err := b.client.EnableDepositManager(context.Background(), &pb.EnableDepositManagerRequest{}) + if err != nil { + return fmt.Errorf("failed to enable deposit manager: %w", err) + } + if !resp.Success { + return fmt.Errorf("failed to enable deposit manager") + } + } + + validProviders, err := b.client.GetValidProviders(context.Background(), &pb.GetValidProvidersRequest{}) + if err != nil { + return fmt.Errorf("failed to get valid providers: %w", err) + } + if len(validProviders.ValidProviders) == 0 { + return fmt.Errorf("no valid providers found") + } + + targetDeposits := make([]*pb.TargetDeposit, len(validProviders.ValidProviders)) + for i, provider := range validProviders.ValidProviders { + targetDeposits[i] = &pb.TargetDeposit{ + Provider: provider, + TargetDeposit: depositAmountInt.Uint64(), + } + } + + resp, err := b.client.SetTargetDeposits(context.Background(), &pb.SetTargetDepositsRequest{ + TargetDeposits: targetDeposits, + }) + if err != nil { + return fmt.Errorf("failed to set target deposits: %w", err) + } + if len(resp.SuccessfullySetDeposits) != len(targetDeposits) { + return fmt.Errorf("failed to set target deposits") + } + return nil } diff --git a/tools/instant-bridge/service/service.go b/tools/instant-bridge/service/service.go index 536747613..be97de58b 100644 --- a/tools/instant-bridge/service/service.go +++ b/tools/instant-bridge/service/service.go @@ -88,24 +88,46 @@ func New(config *Config) (*Service, error) { topologyCli := debugapiv1.NewDebugServiceClient(conn) notificationsCli := notificationsapiv1.NewNotificationsClient(conn) - // TODO: set code to deposit manager here, set min deposit for every provider - - // status, err := bidderCli.AutoDepositStatus(context.Background(), &bidderapiv1.EmptyMessage{}) - // if err != nil { - // return nil, err - // } - // - // if !status.IsAutodepositEnabled { - // _, err := bidderCli.AutoDeposit( - // context.Background(), - // &bidderapiv1.DepositRequest{ - // Amount: config.AutoDepositAmount.String(), - // }, - // ) - // if err != nil { - // return nil, err - // } - // } + status, err := bidderCli.DepositManagerStatus(context.Background(), &bidderapiv1.DepositManagerStatusRequest{}) + if err != nil { + return nil, err + } + if !status.Enabled { + resp, err := bidderCli.EnableDepositManager(context.Background(), &bidderapiv1.EnableDepositManagerRequest{}) + if err != nil { + return nil, err + } + if !resp.Success { + return nil, errors.New("failed to enable deposit manager") + } + } + config.Logger.Info("deposit manager enabled") + + validProviders, err := bidderCli.GetValidProviders(context.Background(), &bidderapiv1.GetValidProvidersRequest{}) + if err != nil { + return nil, err + } + if len(validProviders.ValidProviders) == 0 { + return nil, errors.New("no connected and valid providers found") + } + + targetDeposits := make([]*bidderapiv1.TargetDeposit, len(validProviders.ValidProviders)) + for i, provider := range validProviders.ValidProviders { + targetDeposits[i] = &bidderapiv1.TargetDeposit{ + Provider: provider, + TargetDeposit: config.AutoDepositAmount.Uint64(), + } + } + + resp, err := bidderCli.SetTargetDeposits(context.Background(), &bidderapiv1.SetTargetDepositsRequest{ + TargetDeposits: targetDeposits, + }) + if err != nil { + return nil, err + } + if len(resp.SuccessfullySetDeposits) != len(targetDeposits) { + return nil, errors.New("failed to set target deposits") + } bridgeConfig := transfer.BridgeConfig{ Signer: config.Signer, diff --git a/tools/preconf-rpc/service/service.go b/tools/preconf-rpc/service/service.go index 40c167804..1905a60c0 100644 --- a/tools/preconf-rpc/service/service.go +++ b/tools/preconf-rpc/service/service.go @@ -106,24 +106,46 @@ func New(config *Config) (*Service, error) { topologyCli := debugapiv1.NewDebugServiceClient(conn) notificationsCli := notificationsapiv1.NewNotificationsClient(conn) - // TODO: set code to deposit manager here, set min deposit for every provider - - // status, err := bidderCli.AutoDepositStatus(context.Background(), &bidderapiv1.EmptyMessage{}) - // if err != nil { - // return nil, err - // } - - // if !status.IsAutodepositEnabled { - // _, err := bidderCli.AutoDeposit( - // context.Background(), - // &bidderapiv1.DepositRequest{ - // Amount: config.AutoDepositAmount.String(), - // }, - // ) - // if err != nil { - // return nil, err - // } - // } + status, err := bidderCli.DepositManagerStatus(context.Background(), &bidderapiv1.DepositManagerStatusRequest{}) + if err != nil { + return nil, fmt.Errorf("failed to get deposit manager status: %w", err) + } + if !status.Enabled { + resp, err := bidderCli.EnableDepositManager(context.Background(), &bidderapiv1.EnableDepositManagerRequest{}) + if err != nil { + return nil, fmt.Errorf("failed to enable deposit manager: %w", err) + } + if !resp.Success { + return nil, fmt.Errorf("failed to enable deposit manager") + } + } + config.Logger.Info("deposit manager enabled") + + validProviders, err := bidderCli.GetValidProviders(context.Background(), &bidderapiv1.GetValidProvidersRequest{}) + if err != nil { + return nil, fmt.Errorf("failed to get valid providers: %w", err) + } + if len(validProviders.ValidProviders) == 0 { + return nil, fmt.Errorf("no valid providers found") + } + + targetDeposits := make([]*bidderapiv1.TargetDeposit, len(validProviders.ValidProviders)) + for i, provider := range validProviders.ValidProviders { + targetDeposits[i] = &bidderapiv1.TargetDeposit{ + Provider: provider, + TargetDeposit: config.AutoDepositAmount.Uint64(), + } + } + + resp, err := bidderCli.SetTargetDeposits(context.Background(), &bidderapiv1.SetTargetDepositsRequest{ + TargetDeposits: targetDeposits, + }) + if err != nil { + return nil, fmt.Errorf("failed to set target deposits: %w", err) + } + if len(resp.SuccessfullySetDeposits) != len(targetDeposits) { + return nil, fmt.Errorf("failed to set target deposits") + } bridgeConfig := transfer.BridgeConfig{ Signer: config.Signer, From d10001e8cf56222e08107caa84c2ce2cdc9892e7 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Tue, 19 Aug 2025 15:51:52 -0700 Subject: [PATCH 073/117] Update WindowFromBlockNumber.sol --- contracts/contracts/utils/WindowFromBlockNumber.sol | 2 -- 1 file changed, 2 deletions(-) diff --git a/contracts/contracts/utils/WindowFromBlockNumber.sol b/contracts/contracts/utils/WindowFromBlockNumber.sol index c03f2d17d..f165a93f1 100644 --- a/contracts/contracts/utils/WindowFromBlockNumber.sol +++ b/contracts/contracts/utils/WindowFromBlockNumber.sol @@ -7,8 +7,6 @@ pragma solidity 0.8.26; */ library WindowFromBlockNumber { - // TODO: prob delete all this - /// @dev The number of blocks per window. uint256 public constant BLOCKS_PER_WINDOW = 10; From ab3ebd01c5473d7177d48ba55bfbcb6d47d02507 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Tue, 19 Aug 2025 16:20:10 -0700 Subject: [PATCH 074/117] top up deposits within SetTargetDeposits api --- contracts-abi/abi/DepositManager.abi | 13 + contracts-abi/abi/ProviderRegistry.abi | 38 +- .../clients/DepositManager/DepositManager.go | 23 +- .../ProviderRegistry/ProviderRegistry.go | 64 +- contracts/contracts/core/DepositManager.sol | 11 + contracts/contracts/core/ProviderRegistry.sol | 5 +- p2p/gen/go/bidderapi/v1/bidderapi.pb.go | 1300 +++++++++-------- p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go | 6 +- .../bidderapi/v1/bidderapi.swagger.yaml | 7 +- p2p/pkg/rpc/bidder/service.go | 23 + p2p/rpc/bidderapi/v1/bidderapi.proto | 4 +- 11 files changed, 792 insertions(+), 702 deletions(-) diff --git a/contracts-abi/abi/DepositManager.abi b/contracts-abi/abi/DepositManager.abi index b841d2e49..86b591864 100644 --- a/contracts-abi/abi/DepositManager.abi +++ b/contracts-abi/abi/DepositManager.abi @@ -117,6 +117,19 @@ "outputs": [], "stateMutability": "nonpayable" }, + { + "type": "function", + "name": "topUpDeposits", + "inputs": [ + { + "name": "providers", + "type": "address[]", + "internalType": "address[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, { "type": "event", "name": "CurrentBalanceAtOrBelowMin", diff --git a/contracts-abi/abi/ProviderRegistry.abi b/contracts-abi/abi/ProviderRegistry.abi index 86450f792..60113ff9d 100644 --- a/contracts-abi/abi/ProviderRegistry.abi +++ b/contracts-abi/abi/ProviderRegistry.abi @@ -12,25 +12,6 @@ "type": "receive", "stateMutability": "payable" }, - { - "type": "function", - "name": "AreProvidersValid", - "inputs": [ - { - "name": "providers", - "type": "address[]", - "internalType": "address[]" - } - ], - "outputs": [ - { - "name": "", - "type": "bool[]", - "internalType": "bool[]" - } - ], - "stateMutability": "view" - }, { "type": "function", "name": "ONE_HUNDRED_PERCENT", @@ -95,6 +76,25 @@ "outputs": [], "stateMutability": "nonpayable" }, + { + "type": "function", + "name": "areProvidersValid", + "inputs": [ + { + "name": "providers", + "type": "address[]", + "internalType": "address[]" + } + ], + "outputs": [ + { + "name": "", + "type": "bool[]", + "internalType": "bool[]" + } + ], + "stateMutability": "view" + }, { "type": "function", "name": "bidderSlashedAmount", diff --git a/contracts-abi/clients/DepositManager/DepositManager.go b/contracts-abi/clients/DepositManager/DepositManager.go index b0a14ef23..62c0ef614 100644 --- a/contracts-abi/clients/DepositManager/DepositManager.go +++ b/contracts-abi/clients/DepositManager/DepositManager.go @@ -31,7 +31,7 @@ var ( // DepositmanagerMetaData contains all meta data concerning the Depositmanager contract. var DepositmanagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_bidderRegistry\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_minBalance\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"BIDDER_REGISTRY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MIN_BALANCE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setTargetDeposit\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setTargetDeposits\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"targetDeposits\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"topUpDeposit\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"CurrentBalanceAtOrBelowMin\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"currentBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"minBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CurrentDepositIsSufficient\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"currentDeposit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"targetDeposit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DepositToppedUp\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TargetDepositDoesNotExist\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TargetDepositSet\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TopUpReduced\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"available\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"needed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalRequestExists\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidFallback\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotThisEOA\",\"inputs\":[{\"name\":\"msgSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"thisAddress\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_bidderRegistry\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_minBalance\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"BIDDER_REGISTRY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MIN_BALANCE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setTargetDeposit\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setTargetDeposits\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"targetDeposits\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"topUpDeposit\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"topUpDeposits\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"CurrentBalanceAtOrBelowMin\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"currentBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"minBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CurrentDepositIsSufficient\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"currentDeposit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"targetDeposit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DepositToppedUp\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TargetDepositDoesNotExist\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TargetDepositSet\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TopUpReduced\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"available\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"needed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalRequestExists\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidFallback\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotThisEOA\",\"inputs\":[{\"name\":\"msgSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"thisAddress\",\"type\":\"address\",\"internalType\":\"address\"}]}]", } // DepositmanagerABI is the input ABI used to generate the binding from. @@ -336,6 +336,27 @@ func (_Depositmanager *DepositmanagerTransactorSession) TopUpDeposit(provider co return _Depositmanager.Contract.TopUpDeposit(&_Depositmanager.TransactOpts, provider) } +// TopUpDeposits is a paid mutator transaction binding the contract method 0x07b49cd9. +// +// Solidity: function topUpDeposits(address[] providers) returns() +func (_Depositmanager *DepositmanagerTransactor) TopUpDeposits(opts *bind.TransactOpts, providers []common.Address) (*types.Transaction, error) { + return _Depositmanager.contract.Transact(opts, "topUpDeposits", providers) +} + +// TopUpDeposits is a paid mutator transaction binding the contract method 0x07b49cd9. +// +// Solidity: function topUpDeposits(address[] providers) returns() +func (_Depositmanager *DepositmanagerSession) TopUpDeposits(providers []common.Address) (*types.Transaction, error) { + return _Depositmanager.Contract.TopUpDeposits(&_Depositmanager.TransactOpts, providers) +} + +// TopUpDeposits is a paid mutator transaction binding the contract method 0x07b49cd9. +// +// Solidity: function topUpDeposits(address[] providers) returns() +func (_Depositmanager *DepositmanagerTransactorSession) TopUpDeposits(providers []common.Address) (*types.Transaction, error) { + return _Depositmanager.Contract.TopUpDeposits(&_Depositmanager.TransactOpts, providers) +} + // Fallback is a paid mutator transaction binding the contract fallback function. // // Solidity: fallback() payable returns() diff --git a/contracts-abi/clients/ProviderRegistry/ProviderRegistry.go b/contracts-abi/clients/ProviderRegistry/ProviderRegistry.go index 92cd6c0d3..158bbf90a 100644 --- a/contracts-abi/clients/ProviderRegistry/ProviderRegistry.go +++ b/contracts-abi/clients/ProviderRegistry/ProviderRegistry.go @@ -31,7 +31,7 @@ var ( // ProviderregistryMetaData contains all meta data concerning the Providerregistry contract. var ProviderregistryMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"AreProvidersValid\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ONE_HUNDRED_PERCENT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PRECISION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addVerifiedBLSKey\",\"inputs\":[{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"bidderSlashedAmount\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"blockBuilderBLSKeyToAddress\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegateRegisterAndStake\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"delegateStake\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"eoaToBlsPubkeys\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"feePercent\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAccumulatedPenaltyFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBLSKeys\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEoaFromBLSKey\",\"inputs\":[{\"name\":\"blsKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProviderStake\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_minStake\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_penaltyFeeRecipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_feePercent\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_withdrawalDelay\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_penaltyFeePayoutPeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isProviderValid\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"manuallyWithdrawPenaltyFee\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"minStake\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"overrideAddBLSKey\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"penaltyFeeTracker\",\"inputs\":[],\"outputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"accumulatedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"lastPayoutTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"payoutTimePeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"preconfManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"providerRegistered\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"providerStakes\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerAndStake\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setFeePayoutPeriod\",\"inputs\":[{\"name\":\"_feePayoutPeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setMinStake\",\"inputs\":[{\"name\":\"_minStake\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewFeePercent\",\"inputs\":[{\"name\":\"newFeePercent\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewPenaltyFeeRecipient\",\"inputs\":[{\"name\":\"newFeeRecipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPreconfManager\",\"inputs\":[{\"name\":\"contractAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setWithdrawalDelay\",\"inputs\":[{\"name\":\"_withdrawalDelay\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slash\",\"inputs\":[{\"name\":\"amt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"slashAmt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"addresspayable\"},{\"name\":\"residualBidPercentAfterDecay\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unstake\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"verifySignature\",\"inputs\":[{\"name\":\"pubKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"message\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSlashedAmount\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawalDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawalRequests\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"BLSKeyAdded\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BidderWithdrawSlashedAmount\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeePayoutPeriodUpdated\",\"inputs\":[{\"name\":\"newFeePayoutPeriod\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeePercentUpdated\",\"inputs\":[{\"name\":\"newFeePercent\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeTransfer\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FundsDeposited\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FundsSlashed\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InsufficientFundsToSlash\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"providerStake\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"residualAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"penaltyFee\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"slashAmt\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MinStakeUpdated\",\"inputs\":[{\"name\":\"newMinStake\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"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\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PenaltyFeeRecipientUpdated\",\"inputs\":[{\"name\":\"newPenaltyFeeRecipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PreconfManagerUpdated\",\"inputs\":[{\"name\":\"newPreconfManager\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProviderRegistered\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"stakedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransferToBidderFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unstake\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Withdraw\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalDelayUpdated\",\"inputs\":[{\"name\":\"newWithdrawalDelay\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AtLeastOneBLSKeyRequired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BLSSignatureInvalid\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BidderAmountIsZero\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"BidderWithdrawalTransferFailed\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"DelayNotPassed\",\"inputs\":[{\"name\":\"withdrawalRequestTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalDelay\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"currentBlockTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpectedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FeeRecipientIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientStake\",\"inputs\":[{\"name\":\"stake\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minStake\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expectedLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidFallback\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidReceive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoStakeToWithdraw\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"NoUnstakeRequest\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotPreconfContract\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"preconfManager\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"PayoutPeriodMustBePositive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PendingWithdrawalRequest\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"PreconfManagerNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ProviderAlreadyRegistered\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ProviderCommitmentsPending\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"numPending\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ProviderNotRegistered\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"PublicKeyLengthInvalid\",\"inputs\":[{\"name\":\"exp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"got\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureLengthInvalid\",\"inputs\":[{\"name\":\"exp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"got\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"StakeTransferFailed\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"TransferToRecipientFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"UnstakeRequestExists\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"ONE_HUNDRED_PERCENT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PRECISION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addVerifiedBLSKey\",\"inputs\":[{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"areProvidersValid\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bidderSlashedAmount\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"blockBuilderBLSKeyToAddress\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegateRegisterAndStake\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"delegateStake\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"eoaToBlsPubkeys\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"feePercent\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAccumulatedPenaltyFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBLSKeys\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEoaFromBLSKey\",\"inputs\":[{\"name\":\"blsKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProviderStake\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_minStake\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_penaltyFeeRecipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_feePercent\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_withdrawalDelay\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_penaltyFeePayoutPeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isProviderValid\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"manuallyWithdrawPenaltyFee\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"minStake\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"overrideAddBLSKey\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"penaltyFeeTracker\",\"inputs\":[],\"outputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"accumulatedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"lastPayoutTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"payoutTimePeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"preconfManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"providerRegistered\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"providerStakes\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerAndStake\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setFeePayoutPeriod\",\"inputs\":[{\"name\":\"_feePayoutPeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setMinStake\",\"inputs\":[{\"name\":\"_minStake\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewFeePercent\",\"inputs\":[{\"name\":\"newFeePercent\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewPenaltyFeeRecipient\",\"inputs\":[{\"name\":\"newFeeRecipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPreconfManager\",\"inputs\":[{\"name\":\"contractAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setWithdrawalDelay\",\"inputs\":[{\"name\":\"_withdrawalDelay\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slash\",\"inputs\":[{\"name\":\"amt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"slashAmt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"addresspayable\"},{\"name\":\"residualBidPercentAfterDecay\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unstake\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"verifySignature\",\"inputs\":[{\"name\":\"pubKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"message\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSlashedAmount\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawalDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawalRequests\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"BLSKeyAdded\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BidderWithdrawSlashedAmount\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeePayoutPeriodUpdated\",\"inputs\":[{\"name\":\"newFeePayoutPeriod\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeePercentUpdated\",\"inputs\":[{\"name\":\"newFeePercent\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeTransfer\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FundsDeposited\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FundsSlashed\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InsufficientFundsToSlash\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"providerStake\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"residualAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"penaltyFee\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"slashAmt\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MinStakeUpdated\",\"inputs\":[{\"name\":\"newMinStake\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"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\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PenaltyFeeRecipientUpdated\",\"inputs\":[{\"name\":\"newPenaltyFeeRecipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PreconfManagerUpdated\",\"inputs\":[{\"name\":\"newPreconfManager\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProviderRegistered\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"stakedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransferToBidderFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unstake\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Withdraw\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalDelayUpdated\",\"inputs\":[{\"name\":\"newWithdrawalDelay\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AtLeastOneBLSKeyRequired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BLSSignatureInvalid\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BidderAmountIsZero\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"BidderWithdrawalTransferFailed\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"DelayNotPassed\",\"inputs\":[{\"name\":\"withdrawalRequestTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalDelay\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"currentBlockTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpectedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FeeRecipientIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientStake\",\"inputs\":[{\"name\":\"stake\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minStake\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expectedLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidFallback\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidReceive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoStakeToWithdraw\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"NoUnstakeRequest\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotPreconfContract\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"preconfManager\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"PayoutPeriodMustBePositive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PendingWithdrawalRequest\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"PreconfManagerNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ProviderAlreadyRegistered\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ProviderCommitmentsPending\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"numPending\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ProviderNotRegistered\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"PublicKeyLengthInvalid\",\"inputs\":[{\"name\":\"exp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"got\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureLengthInvalid\",\"inputs\":[{\"name\":\"exp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"got\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"StakeTransferFailed\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"TransferToRecipientFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"UnstakeRequestExists\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]}]", } // ProviderregistryABI is the input ABI used to generate the binding from. @@ -180,37 +180,6 @@ func (_Providerregistry *ProviderregistryTransactorRaw) Transact(opts *bind.Tran return _Providerregistry.Contract.contract.Transact(opts, method, params...) } -// AreProvidersValid is a free data retrieval call binding the contract method 0xd27cb513. -// -// Solidity: function AreProvidersValid(address[] providers) view returns(bool[]) -func (_Providerregistry *ProviderregistryCaller) AreProvidersValid(opts *bind.CallOpts, providers []common.Address) ([]bool, error) { - var out []interface{} - err := _Providerregistry.contract.Call(opts, &out, "AreProvidersValid", providers) - - if err != nil { - return *new([]bool), err - } - - out0 := *abi.ConvertType(out[0], new([]bool)).(*[]bool) - - return out0, err - -} - -// AreProvidersValid is a free data retrieval call binding the contract method 0xd27cb513. -// -// Solidity: function AreProvidersValid(address[] providers) view returns(bool[]) -func (_Providerregistry *ProviderregistrySession) AreProvidersValid(providers []common.Address) ([]bool, error) { - return _Providerregistry.Contract.AreProvidersValid(&_Providerregistry.CallOpts, providers) -} - -// AreProvidersValid is a free data retrieval call binding the contract method 0xd27cb513. -// -// Solidity: function AreProvidersValid(address[] providers) view returns(bool[]) -func (_Providerregistry *ProviderregistryCallerSession) AreProvidersValid(providers []common.Address) ([]bool, error) { - return _Providerregistry.Contract.AreProvidersValid(&_Providerregistry.CallOpts, providers) -} - // ONEHUNDREDPERCENT is a free data retrieval call binding the contract method 0xdd0081c7. // // Solidity: function ONE_HUNDRED_PERCENT() view returns(uint256) @@ -304,6 +273,37 @@ func (_Providerregistry *ProviderregistryCallerSession) UPGRADEINTERFACEVERSION( return _Providerregistry.Contract.UPGRADEINTERFACEVERSION(&_Providerregistry.CallOpts) } +// AreProvidersValid is a free data retrieval call binding the contract method 0x8dc4ce17. +// +// Solidity: function areProvidersValid(address[] providers) view returns(bool[]) +func (_Providerregistry *ProviderregistryCaller) AreProvidersValid(opts *bind.CallOpts, providers []common.Address) ([]bool, error) { + var out []interface{} + err := _Providerregistry.contract.Call(opts, &out, "areProvidersValid", providers) + + if err != nil { + return *new([]bool), err + } + + out0 := *abi.ConvertType(out[0], new([]bool)).(*[]bool) + + return out0, err + +} + +// AreProvidersValid is a free data retrieval call binding the contract method 0x8dc4ce17. +// +// Solidity: function areProvidersValid(address[] providers) view returns(bool[]) +func (_Providerregistry *ProviderregistrySession) AreProvidersValid(providers []common.Address) ([]bool, error) { + return _Providerregistry.Contract.AreProvidersValid(&_Providerregistry.CallOpts, providers) +} + +// AreProvidersValid is a free data retrieval call binding the contract method 0x8dc4ce17. +// +// Solidity: function areProvidersValid(address[] providers) view returns(bool[]) +func (_Providerregistry *ProviderregistryCallerSession) AreProvidersValid(providers []common.Address) ([]bool, error) { + return _Providerregistry.Contract.AreProvidersValid(&_Providerregistry.CallOpts, providers) +} + // BidderSlashedAmount is a free data retrieval call binding the contract method 0x3ab6fc1a. // // Solidity: function bidderSlashedAmount(address ) view returns(uint256) diff --git a/contracts/contracts/core/DepositManager.sol b/contracts/contracts/core/DepositManager.sol index 6383746fa..4a603bc8e 100644 --- a/contracts/contracts/core/DepositManager.sol +++ b/contracts/contracts/core/DepositManager.sol @@ -55,10 +55,21 @@ contract DepositManager { emit TargetDepositSet(provider, amount); } + function topUpDeposits(address[] calldata providers) external { + uint256 length = providers.length; + for (uint256 i = 0; i < length; ++i) { + _topUpDeposit(providers[i]); + } + } + /// @notice Top-up deposits if needed, as configured by this EOA. /// @param provider to top-up the deposit for. /// @dev This function will be called automatically by external addresses. function topUpDeposit(address provider) external { + _topUpDeposit(provider); + } + + function _topUpDeposit(address provider) internal { if (IBidderRegistry(BIDDER_REGISTRY).withdrawalRequestExists(address(this), provider)) { emit WithdrawalRequestExists(provider); return; diff --git a/contracts/contracts/core/ProviderRegistry.sol b/contracts/contracts/core/ProviderRegistry.sol index 2e6b74e49..31c562c84 100644 --- a/contracts/contracts/core/ProviderRegistry.sol +++ b/contracts/contracts/core/ProviderRegistry.sol @@ -409,9 +409,10 @@ contract ProviderRegistry is } /// @dev View function checking if a provider is valid, returning booleans and never reverting - function AreProvidersValid(address[] calldata providers) public view returns (bool[] memory) { + function areProvidersValid(address[] calldata providers) public view returns (bool[] memory) { bool[] memory validProviders = new bool[](providers.length); - for (uint256 i = 0; i < providers.length; i++) { + uint256 length = providers.length; + for (uint256 i = 0; i < length; ++i) { address provider = providers[i]; bool isRegistered = providerRegistered[provider]; bool hasStake = providerStakes[provider] >= minStake; diff --git a/p2p/gen/go/bidderapi/v1/bidderapi.pb.go b/p2p/gen/go/bidderapi/v1/bidderapi.pb.go index 29f1076fe..05e677511 100644 --- a/p2p/gen/go/bidderapi/v1/bidderapi.pb.go +++ b/p2p/gen/go/bidderapi/v1/bidderapi.pb.go @@ -436,7 +436,8 @@ type SetTargetDepositsResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - SuccessfullySetDeposits []*TargetDeposit `protobuf:"bytes,1,rep,name=successfully_set_deposits,json=successfullySetDeposits,proto3" json:"successfully_set_deposits,omitempty"` + SuccessfullySetDeposits []*TargetDeposit `protobuf:"bytes,1,rep,name=successfully_set_deposits,json=successfullySetDeposits,proto3" json:"successfully_set_deposits,omitempty"` + SuccessfullyToppedUpProviders []string `protobuf:"bytes,2,rep,name=successfully_topped_up_providers,json=successfullyToppedUpProviders,proto3" json:"successfully_topped_up_providers,omitempty"` } func (x *SetTargetDepositsResponse) Reset() { @@ -478,6 +479,13 @@ func (x *SetTargetDepositsResponse) GetSuccessfullySetDeposits() []*TargetDeposi return nil } +func (x *SetTargetDepositsResponse) GetSuccessfullyToppedUpProviders() []string { + if x != nil { + return x.SuccessfullyToppedUpProviders + } + return nil +} + type DepositManagerStatusRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1692,134 +1700,477 @@ var file_bidderapi_v1_bidderapi_proto_rawDesc = []byte{ 0x74, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0x26, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x2e, 0x22, 0xce, 0x01, 0x0a, 0x19, 0x53, 0x65, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, + 0x2e, 0x22, 0x97, 0x02, 0x0a, 0x19, 0x53, 0x65, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x57, 0x0a, 0x19, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x17, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x53, 0x65, 0x74, - 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x3a, 0x58, 0x92, 0x41, 0x55, 0x0a, 0x53, 0x2a, - 0x27, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, - 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x28, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, + 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, 0x47, 0x0a, 0x20, 0x73, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x5f, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x5f, + 0x75, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x1d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x6c, 0x79, + 0x54, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x55, 0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x73, 0x3a, 0x58, 0x92, 0x41, 0x55, 0x0a, 0x53, 0x2a, 0x27, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2e, 0x22, 0x61, 0x0a, 0x1b, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x3a, 0x42, 0x92, 0x41, 0x3f, 0x0a, 0x3d, 0x2a, 0x1c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0x1d, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x2e, 0x22, 0xc4, 0x01, 0x0a, 0x1c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x12, 0x44, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x62, 0x69, 0x64, 0x64, - 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x3a, 0x44, 0x92, 0x41, 0x41, 0x0a, 0x3f, 0x2a, 0x1d, 0x44, + 0x65, 0x32, 0x28, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x22, 0x61, 0x0a, 0x1b, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x1e, 0x44, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x22, 0x0e, 0x0a, 0x0c, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xb6, 0x01, 0x0a, - 0x11, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0xa0, 0x01, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x83, 0x01, 0x92, 0x41, 0x1c, 0x32, 0x1a, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x20, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0xba, 0x48, 0x61, 0xba, 0x01, 0x5e, 0x0a, 0x08, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x2a, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x2e, 0x1a, 0x26, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, - 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, - 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x34, 0x30, 0x7d, 0x24, 0x27, 0x29, 0x52, 0x08, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0xa3, 0x02, 0x0a, 0x19, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0xbb, 0x01, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x9c, 0x01, 0x92, 0x41, 0x1e, 0x32, 0x1c, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, - 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2e, 0xba, 0x48, 0x78, 0xba, 0x01, - 0x75, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x36, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, - 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x3a, 0x42, 0x92, 0x41, 0x3f, 0x0a, + 0x3d, 0x2a, 0x1c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, + 0x1d, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x22, 0xc4, + 0x01, 0x0a, 0x1c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x44, 0x0a, 0x0f, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, + 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x3a, + 0x44, 0x92, 0x41, 0x41, 0x0a, 0x3f, 0x2a, 0x1d, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x1e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x22, 0x0e, 0x0a, 0x0c, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xb6, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0xa0, 0x01, 0x0a, 0x08, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x83, + 0x01, 0x92, 0x41, 0x1c, 0x32, 0x1a, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x45, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, + 0xba, 0x48, 0x61, 0xba, 0x01, 0x5e, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x12, 0x2a, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, + 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, + 0x65, 0x75, 0x6d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x1a, 0x26, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, + 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x34, 0x30, + 0x7d, 0x24, 0x27, 0x29, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0xa3, + 0x02, 0x0a, 0x19, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, + 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0xbb, 0x01, 0x0a, + 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x42, 0x9c, 0x01, 0x92, 0x41, 0x1e, 0x32, 0x1c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x65, 0x73, 0x2e, 0x1a, 0x30, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, - 0x2c, 0x20, 0x72, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, - 0x78, 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x34, - 0x30, 0x7d, 0x24, 0x27, 0x29, 0x29, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x73, 0x3a, 0x48, 0x92, 0x41, 0x45, 0x0a, 0x43, 0x2a, 0x1a, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x20, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x32, 0x25, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x77, 0x69, - 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x28, 0x73, 0x29, 0x2e, 0x22, 0x85, 0x02, 0x0a, 0x1a, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, - 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6d, 0x6f, 0x75, - 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x61, 0x6d, 0x6f, 0x75, 0x6e, - 0x74, 0x73, 0x3a, 0xae, 0x01, 0x92, 0x41, 0xaa, 0x01, 0x0a, 0xa7, 0x01, 0x2a, 0x1b, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, - 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x25, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x20, 0x66, - 0x72, 0x6f, 0x6d, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x28, 0x73, 0x29, 0x2e, - 0x4a, 0x61, 0x7b, 0x22, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, - 0x5b, 0x22, 0x30, 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x73, 0x65, 0x73, 0x2e, 0xba, 0x48, 0x78, 0xba, 0x01, 0x75, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x36, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, + 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, + 0x75, 0x6d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2e, 0x1a, 0x30, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, 0x2e, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, + 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x34, 0x30, 0x7d, 0x24, 0x27, 0x29, 0x29, 0x52, + 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x3a, 0x48, 0x92, 0x41, 0x45, 0x0a, + 0x43, 0x2a, 0x1a, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, + 0x61, 0x77, 0x61, 0x6c, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0x25, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, + 0x6c, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x28, 0x73, 0x29, 0x2e, 0x22, 0x85, 0x02, 0x0a, 0x1a, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x07, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x3a, 0xae, 0x01, 0x92, 0x41, + 0xaa, 0x01, 0x0a, 0xa7, 0x01, 0x2a, 0x1b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, + 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x32, 0x25, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, + 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x28, 0x73, 0x29, 0x2e, 0x4a, 0x61, 0x7b, 0x22, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x30, 0x78, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x5d, 0x2c, 0x20, - 0x22, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x31, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x5d, 0x2c, 0x20, 0x22, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x5d, 0x7d, 0x22, 0x8d, 0x02, 0x0a, + 0x0f, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0xbb, 0x01, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x09, 0x42, 0x9c, 0x01, 0x92, 0x41, 0x1e, 0x32, 0x1c, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x20, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2e, 0xba, 0x48, 0x78, 0xba, 0x01, 0x75, 0x0a, 0x09, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x36, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x74, + 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, + 0x2e, 0x1a, 0x30, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, + 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, + 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x34, 0x30, 0x7d, 0x24, + 0x27, 0x29, 0x29, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x3a, 0x3c, + 0x92, 0x41, 0x39, 0x0a, 0x37, 0x2a, 0x10, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0x23, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, + 0x77, 0x20, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x28, 0x73, 0x29, 0x2e, 0x22, 0xf6, 0x01, 0x0a, + 0x10, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x07, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x3a, 0xa9, 0x01, 0x92, 0x41, 0xa5, 0x01, + 0x0a, 0x40, 0x2a, 0x11, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x20, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x2b, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x6e, + 0x20, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, + 0x79, 0x2e, 0x32, 0x61, 0x7b, 0x22, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x22, 0x3a, 0x20, + 0x5b, 0x22, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x5d, 0x2c, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x30, 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x22, 0x5d, 0x7d, 0x22, 0x8d, 0x02, 0x0a, 0x0f, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0xbb, 0x01, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x9c, 0x01, 0x92, 0x41, - 0x1e, 0x32, 0x1c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x45, 0x74, 0x68, 0x65, - 0x72, 0x65, 0x75, 0x6d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2e, 0xba, - 0x48, 0x78, 0xba, 0x01, 0x75, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, - 0x12, 0x36, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, - 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72, 0x72, 0x61, - 0x79, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x20, 0x61, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2e, 0x1a, 0x30, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, - 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, - 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, - 0x39, 0x5d, 0x7b, 0x34, 0x30, 0x7d, 0x24, 0x27, 0x29, 0x29, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x73, 0x3a, 0x3c, 0x92, 0x41, 0x39, 0x0a, 0x37, 0x2a, 0x10, 0x57, 0x69, - 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0x23, - 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x20, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x28, - 0x73, 0x29, 0x2e, 0x22, 0xf6, 0x01, 0x0a, 0x10, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6d, 0x6f, 0x75, - 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x61, 0x6d, 0x6f, 0x75, 0x6e, - 0x74, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, - 0x3a, 0xa9, 0x01, 0x92, 0x41, 0xa5, 0x01, 0x0a, 0x40, 0x2a, 0x11, 0x57, 0x69, 0x74, 0x68, 0x64, - 0x72, 0x61, 0x77, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x2b, 0x57, 0x69, - 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x6e, 0x20, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x20, - 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, - 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0x32, 0x61, 0x7b, 0x22, 0x61, 0x6d, 0x6f, - 0x75, 0x6e, 0x74, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x5d, 0x2c, 0x20, - 0x22, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x30, - 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x5d, 0x7d, 0x22, 0x58, 0x0a, 0x18, - 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x3a, 0x3c, 0x92, 0x41, 0x39, 0x0a, 0x37, 0x2a, - 0x19, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0x1a, 0x47, 0x65, 0x74, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x20, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x22, 0x84, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x3a, 0x3e, 0x92, - 0x41, 0x3b, 0x0a, 0x39, 0x2a, 0x1a, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x32, 0x1b, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x22, 0xf2, 0x13, - 0x0a, 0x03, 0x42, 0x69, 0x64, 0x12, 0x94, 0x02, 0x0a, 0x09, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, - 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0xf6, 0x01, 0x92, 0x41, 0x78, 0x32, + 0x30, 0x30, 0x22, 0x5d, 0x7d, 0x22, 0x58, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x3a, 0x3c, 0x92, 0x41, 0x39, 0x0a, 0x37, 0x2a, 0x19, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x32, 0x1a, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x22, + 0x84, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, + 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x3a, 0x3e, 0x92, 0x41, 0x3b, 0x0a, 0x39, 0x2a, 0x1a, 0x47, + 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, + 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x1b, 0x47, 0x65, 0x74, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x20, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x22, 0xf2, 0x13, 0x0a, 0x03, 0x42, 0x69, 0x64, 0x12, 0x94, + 0x02, 0x0a, 0x09, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x42, 0xf6, 0x01, 0x92, 0x41, 0x78, 0x32, 0x64, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, + 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, + 0x0f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, + 0xba, 0x48, 0x78, 0xba, 0x01, 0x75, 0x0a, 0x09, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, + 0x73, 0x12, 0x36, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x6d, 0x75, 0x73, + 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72, 0x72, + 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x2e, 0x1a, 0x30, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, + 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, + 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x24, 0x27, 0x29, 0x29, 0x52, 0x08, 0x74, 0x78, 0x48, + 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0xe0, 0x01, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0xc7, 0x01, 0x92, 0x41, 0x76, 0x32, 0x6b, 0x41, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x77, + 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x61, 0x79, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, 0x39, + 0x5d, 0x2b, 0xba, 0x48, 0x4b, 0xba, 0x01, 0x48, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x1f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, + 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, + 0x2e, 0x1a, 0x1d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, + 0x27, 0x5e, 0x5b, 0x31, 0x2d, 0x39, 0x5d, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2a, 0x24, 0x27, 0x29, + 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0xb9, 0x01, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, + 0x95, 0x01, 0x92, 0x41, 0x47, 0x32, 0x45, 0x4d, 0x61, 0x78, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, + 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x2e, 0xba, 0x48, 0x48, 0xba, + 0x01, 0x45, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x12, 0x25, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6d, + 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x0e, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x12, 0xc2, 0x01, 0x0a, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x03, 0x42, 0x8d, 0x01, 0x92, 0x41, 0x2d, 0x32, 0x2b, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x20, 0x64, 0x65, + 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0xba, 0x48, 0x5a, 0xba, 0x01, 0x57, 0x0a, 0x15, 0x64, + 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2e, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x6d, 0x75, 0x73, 0x74, + 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x0e, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, + 0x20, 0x3e, 0x20, 0x30, 0x52, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0xb8, 0x01, 0x0a, 0x13, 0x64, 0x65, + 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x42, 0x87, 0x01, 0x92, 0x41, 0x2b, 0x32, 0x29, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, + 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x64, + 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0xba, 0x48, 0x56, 0xba, 0x01, 0x53, 0x0a, 0x13, + 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x12, 0x2c, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, + 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, + 0x2e, 0x1a, 0x0e, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, + 0x30, 0x52, 0x11, 0x64, 0x65, 0x63, 0x61, 0x79, 0x45, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x12, 0x8f, 0x02, 0x0a, 0x13, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, + 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x09, 0x42, 0xde, 0x01, 0x92, 0x41, 0x49, 0x32, 0x47, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x78, 0x20, 0x68, + 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, + 0x20, 0x6f, 0x72, 0x20, 0x62, 0x65, 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x65, 0x64, + 0x2e, 0xba, 0x48, 0x8e, 0x01, 0xba, 0x01, 0x8a, 0x01, 0x0a, 0x13, 0x72, 0x65, 0x76, 0x65, 0x72, + 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x41, + 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, + 0x68, 0x65, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x61, + 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, + 0x2e, 0x1a, 0x30, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, + 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, + 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x24, + 0x27, 0x29, 0x29, 0x52, 0x11, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x78, + 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0xa3, 0x02, 0x0a, 0x10, 0x72, 0x61, 0x77, 0x5f, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, + 0x09, 0x42, 0xf7, 0x01, 0x92, 0x41, 0x6e, 0x32, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x52, 0x4c, 0x50, 0x20, 0x65, + 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x20, 0x72, 0x61, 0x77, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, + 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0xba, 0x48, 0x82, 0x01, 0xba, 0x01, 0x7f, 0x0a, 0x10, 0x72, 0x61, + 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, + 0x72, 0x61, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x72, 0x72, 0x61, + 0x79, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x72, 0x61, 0x77, 0x20, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x1a, 0x2d, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, 0x2e, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, + 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x2a, 0x24, 0x27, 0x29, 0x29, 0x52, 0x0f, 0x72, 0x61, 0x77, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xbf, 0x02, 0x0a, + 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x9b, 0x02, 0x92, 0x41, 0x9f, 0x01, 0x32, 0x93, 0x01, 0x41, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x20, 0x74, + 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x7a, 0x65, + 0x72, 0x6f, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x65, 0x64, 0x20, + 0x62, 0x69, 0x64, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, + 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x2e, + 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0xba, 0x48, 0x75, 0xba, 0x01, 0x72, 0x0a, + 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x73, + 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6d, 0x75, 0x73, 0x74, + 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x27, + 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, + 0x73, 0x28, 0x27, 0x5e, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x24, 0x27, 0x29, 0x20, 0x26, 0x26, + 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x3d, 0x20, 0x30, + 0x29, 0x52, 0x0b, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0xba, + 0x04, 0x92, 0x41, 0xb6, 0x04, 0x0a, 0x95, 0x01, 0x2a, 0x0b, 0x42, 0x69, 0x64, 0x20, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x40, 0x55, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, + 0x62, 0x69, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, + 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x6d, 0x65, 0x76, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0xd2, 0x01, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0xd2, 0x01, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0xd2, + 0x01, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0xd2, 0x01, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, + 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x32, 0x9b, 0x03, + 0x7b, 0x22, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, + 0x66, 0x65, 0x34, 0x63, 0x62, 0x34, 0x37, 0x64, 0x62, 0x33, 0x36, 0x33, 0x30, 0x35, 0x35, 0x31, + 0x62, 0x65, 0x65, 0x64, 0x66, 0x62, 0x64, 0x30, 0x32, 0x61, 0x37, 0x31, 0x65, 0x63, 0x63, 0x36, + 0x39, 0x66, 0x64, 0x35, 0x39, 0x37, 0x35, 0x38, 0x65, 0x32, 0x62, 0x61, 0x36, 0x39, 0x39, 0x36, + 0x30, 0x36, 0x65, 0x32, 0x64, 0x35, 0x63, 0x37, 0x34, 0x32, 0x38, 0x34, 0x66, 0x66, 0x61, 0x37, + 0x22, 0x2c, 0x20, 0x22, 0x37, 0x31, 0x63, 0x31, 0x33, 0x34, 0x38, 0x66, 0x32, 0x64, 0x37, 0x66, + 0x66, 0x37, 0x65, 0x38, 0x31, 0x34, 0x66, 0x39, 0x63, 0x33, 0x36, 0x31, 0x37, 0x39, 0x38, 0x33, + 0x37, 0x30, 0x33, 0x34, 0x33, 0x35, 0x65, 0x61, 0x37, 0x34, 0x34, 0x36, 0x64, 0x65, 0x34, 0x32, + 0x30, 0x61, 0x65, 0x61, 0x63, 0x34, 0x38, 0x38, 0x62, 0x66, 0x31, 0x64, 0x65, 0x33, 0x35, 0x37, + 0x33, 0x37, 0x65, 0x38, 0x22, 0x5d, 0x2c, 0x20, 0x22, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, + 0x3a, 0x20, 0x22, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x2c, + 0x20, 0x22, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3a, 0x20, 0x31, 0x36, 0x33, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3a, 0x20, 0x31, 0x36, 0x33, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x2c, 0x20, 0x22, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, + 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x5b, 0x22, 0x66, 0x65, 0x34, 0x63, 0x62, 0x34, 0x37, 0x64, 0x62, 0x33, 0x36, 0x33, 0x30, 0x35, + 0x35, 0x31, 0x62, 0x65, 0x65, 0x64, 0x66, 0x62, 0x64, 0x30, 0x32, 0x61, 0x37, 0x31, 0x65, 0x63, + 0x63, 0x36, 0x39, 0x66, 0x64, 0x35, 0x39, 0x37, 0x35, 0x38, 0x65, 0x32, 0x62, 0x61, 0x36, 0x39, + 0x39, 0x36, 0x30, 0x36, 0x65, 0x32, 0x64, 0x35, 0x63, 0x37, 0x34, 0x32, 0x38, 0x34, 0x66, 0x66, + 0x61, 0x37, 0x22, 0x5d, 0x2c, 0x20, 0x22, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x35, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x7d, 0x22, 0xc2, 0x0d, 0x0a, 0x0a, + 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x95, 0x01, 0x0a, 0x09, 0x74, + 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x78, + 0x92, 0x41, 0x75, 0x32, 0x61, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, + 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x68, 0x61, 0x73, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, + 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, 0x0f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, + 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x52, 0x08, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, + 0x65, 0x73, 0x12, 0x8f, 0x01, 0x0a, 0x0a, 0x62, 0x69, 0x64, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x70, 0x92, 0x41, 0x6d, 0x32, 0x6b, 0x41, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, + 0x61, 0x67, 0x72, 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x61, 0x79, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x52, 0x09, 0x62, 0x69, 0x64, 0x41, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x6d, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x4a, 0x92, 0x41, 0x47, 0x32, + 0x45, 0x4d, 0x61, 0x78, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, + 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x2e, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x12, 0x7b, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, + 0x62, 0x69, 0x64, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x4b, 0x92, 0x41, 0x48, 0x32, 0x46, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x69, + 0x67, 0x65, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, + 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2e, 0x52, 0x11, 0x72, + 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x42, 0x69, 0x64, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, + 0x12, 0x7d, 0x0a, 0x16, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x62, 0x69, 0x64, + 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x47, 0x92, 0x41, 0x44, 0x32, 0x42, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, + 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x73, 0x65, 0x6e, 0x74, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x62, 0x69, 0x64, 0x2e, 0x52, 0x14, 0x72, 0x65, 0x63, 0x65, 0x69, + 0x76, 0x65, 0x64, 0x42, 0x69, 0x64, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, + 0x62, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x69, + 0x67, 0x65, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x35, 0x92, 0x41, 0x32, 0x32, + 0x30, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, + 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x52, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x67, + 0x65, 0x73, 0x74, 0x12, 0x9e, 0x01, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, + 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x6b, 0x92, 0x41, 0x68, 0x32, 0x66, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, + 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, + 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, + 0x13, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x5d, 0x92, 0x41, 0x5a, 0x32, 0x58, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x73, 0x69, + 0x67, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, + 0x65, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x52, 0x0f, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, + 0x64, 0x0a, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x42, 0x30, + 0x92, 0x41, 0x2d, 0x32, 0x2b, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, + 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, + 0x52, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x5e, 0x0a, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, + 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x03, 0x42, 0x2e, 0x92, 0x41, 0x2b, 0x32, 0x29, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x62, 0x69, 0x64, 0x20, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, + 0x67, 0x2e, 0x52, 0x11, 0x64, 0x65, 0x63, 0x61, 0x79, 0x45, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x63, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, + 0x68, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x03, 0x42, 0x34, 0x92, 0x41, 0x31, 0x32, 0x2f, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x2e, 0x52, 0x11, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, + 0x68, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x7c, 0x0a, 0x13, 0x72, 0x65, + 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, + 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x42, 0x4c, 0x92, 0x41, 0x49, 0x32, 0x47, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x78, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, + 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, + 0x76, 0x65, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x62, 0x65, 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, + 0x72, 0x64, 0x65, 0x64, 0x2e, 0x52, 0x11, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, + 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x85, 0x01, 0x0a, 0x0c, 0x73, 0x6c, 0x61, + 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x62, 0x92, 0x41, 0x5f, 0x32, 0x5d, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, + 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x79, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x52, 0x0b, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x3a, 0x5e, 0x92, 0x41, 0x5b, 0x0a, 0x59, 0x2a, 0x12, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, + 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x43, 0x43, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, + 0x6d, 0x65, 0x76, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x22, 0xbe, 0x02, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x9f, 0x01, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x42, 0x7c, 0x92, + 0x41, 0x79, 0x32, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, + 0x20, 0x49, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, + 0x64, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x73, 0x63, 0x65, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x52, 0x0b, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x20, 0x92, 0x41, 0x1d, 0x32, 0x1b, 0x50, 0x61, 0x67, + 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x51, + 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x42, 0x3b, 0x92, + 0x41, 0x38, 0x32, 0x36, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x70, 0x61, 0x67, 0x65, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x20, 0x69, 0x73, 0x20, 0x35, 0x30, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x22, 0xe0, 0x11, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x97, 0x01, 0x0a, 0x0e, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, + 0x42, 0x42, 0x92, 0x41, 0x3f, 0x32, 0x3d, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x62, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x69, 0x64, 0x73, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x52, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x69, 0x64, 0x49, 0x6e, + 0x66, 0x6f, 0x1a, 0xf4, 0x04, 0x0a, 0x14, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, + 0x74, 0x57, 0x69, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x7e, 0x0a, 0x10, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x53, 0x92, 0x41, 0x50, 0x32, 0x4e, 0x48, 0x65, 0x78, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x63, 0x0a, 0x12, 0x64, + 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x42, 0x34, 0x92, 0x41, 0x31, 0x32, 0x2f, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, + 0x69, 0x73, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x2e, 0x52, 0x11, 0x64, + 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x12, 0x86, 0x01, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x6e, 0x92, 0x41, 0x6b, 0x32, 0x69, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x20, 0x50, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x3a, 0x20, 0x27, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x27, 0x2c, 0x20, 0x27, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x27, 0x6f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x27, + 0x2c, 0x20, 0x27, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x27, 0x73, 0x6c, + 0x61, 0x73, 0x68, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x27, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x27, + 0x2e, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4e, 0x0a, 0x07, 0x64, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x34, 0x92, 0x41, 0x31, 0x32, + 0x2f, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x73, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, + 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x48, 0x0a, 0x07, 0x70, 0x61, 0x79, + 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2e, 0x92, 0x41, 0x2b, 0x32, + 0x29, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, + 0x69, 0x6e, 0x20, 0x77, 0x65, 0x69, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x54, 0x0a, 0x06, 0x72, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x3c, 0x92, 0x41, 0x39, 0x32, 0x37, 0x52, 0x65, 0x66, 0x75, 0x6e, 0x64, + 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x77, 0x65, 0x69, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, + 0x74, 0x2c, 0x20, 0x69, 0x66, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x52, 0x06, 0x72, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x1a, 0xdb, 0x09, 0x0a, 0x07, 0x42, 0x69, + 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x9a, 0x01, 0x0a, 0x0a, 0x74, 0x78, 0x6e, 0x5f, 0x68, 0x61, + 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x7b, 0x92, 0x41, 0x78, 0x32, 0x64, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, @@ -1827,542 +2178,203 @@ var file_bidderapi_v1_bidderapi_proto_rawDesc = []byte{ 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, 0x0f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, - 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0xba, 0x48, 0x78, 0xba, 0x01, 0x75, 0x0a, 0x09, 0x74, - 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x36, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, - 0x68, 0x65, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x2e, - 0x1a, 0x30, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, 0x2e, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, - 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x24, 0x27, - 0x29, 0x29, 0x52, 0x08, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0xe0, 0x01, 0x0a, - 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0xc7, 0x01, - 0x92, 0x41, 0x76, 0x32, 0x6b, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, - 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, - 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, - 0x20, 0x70, 0x61, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, - 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, - 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0xba, 0x48, 0x4b, 0xba, 0x01, 0x48, 0x0a, - 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, - 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, - 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x1d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x5b, 0x31, 0x2d, 0x39, 0x5d, 0x5b, 0x30, - 0x2d, 0x39, 0x5d, 0x2a, 0x24, 0x27, 0x29, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0xb9, 0x01, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x95, 0x01, 0x92, 0x41, 0x47, 0x32, 0x45, 0x4d, 0x61, - 0x78, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x74, - 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, - 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x69, 0x6e, 0x2e, 0xba, 0x48, 0x48, 0xba, 0x01, 0x45, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x25, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x0e, - 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x52, 0x0b, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0xc2, 0x01, 0x0a, 0x15, - 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x42, 0x8d, 0x01, 0x92, 0x41, + 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x52, 0x09, 0x74, 0x78, 0x6e, 0x48, 0x61, 0x73, 0x68, + 0x65, 0x73, 0x12, 0x92, 0x01, 0x0a, 0x15, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x74, 0x78, 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x42, 0x5e, 0x92, 0x41, 0x5b, 0x32, 0x47, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x78, 0x20, 0x68, 0x61, + 0x73, 0x68, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x20, + 0x6f, 0x72, 0x20, 0x62, 0x65, 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x65, 0x64, 0x2e, + 0x8a, 0x01, 0x0f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, + 0x34, 0x7d, 0x52, 0x13, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, + 0x6e, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x69, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x46, 0x92, + 0x41, 0x43, 0x32, 0x41, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, + 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x69, 0x6e, 0x2e, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x12, 0x98, 0x01, 0x0a, 0x0a, 0x62, 0x69, 0x64, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x79, 0x92, 0x41, 0x76, 0x32, 0x6b, 0x41, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x77, + 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x61, 0x79, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, 0x39, + 0x5d, 0x2b, 0x52, 0x09, 0x62, 0x69, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x64, 0x0a, + 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x42, 0x30, 0x92, 0x41, 0x2d, 0x32, 0x2b, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0xba, 0x48, - 0x5a, 0xba, 0x01, 0x57, 0x0a, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2e, 0x64, 0x65, 0x63, - 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x0e, 0x75, 0x69, 0x6e, - 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x52, 0x13, 0x64, 0x65, 0x63, - 0x61, 0x79, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x12, 0xb8, 0x01, 0x0a, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x42, 0x87, - 0x01, 0x92, 0x41, 0x2b, 0x32, 0x29, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, - 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, - 0x20, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0xba, - 0x48, 0x56, 0xba, 0x01, 0x53, 0x0a, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2c, 0x64, 0x65, 0x63, 0x61, - 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, - 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, - 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x0e, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, - 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x52, 0x11, 0x64, 0x65, 0x63, 0x61, 0x79, 0x45, - 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x8f, 0x02, 0x0a, 0x13, - 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, - 0x68, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x42, 0xde, 0x01, 0x92, 0x41, 0x49, 0x32, - 0x47, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, - 0x6f, 0x66, 0x20, 0x74, 0x78, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, - 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x74, 0x6f, - 0x20, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x62, 0x65, 0x20, 0x64, 0x69, - 0x73, 0x63, 0x61, 0x72, 0x64, 0x65, 0x64, 0x2e, 0xba, 0x48, 0x8e, 0x01, 0xba, 0x01, 0x8a, 0x01, - 0x0a, 0x13, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, - 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x41, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, - 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, - 0x62, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x2e, 0x1a, 0x30, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, - 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, - 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, - 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x24, 0x27, 0x29, 0x29, 0x52, 0x11, 0x72, 0x65, 0x76, 0x65, - 0x72, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0xa3, 0x02, - 0x0a, 0x10, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x42, 0xf7, 0x01, 0x92, 0x41, 0x6e, 0x32, 0x6c, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, - 0x66, 0x20, 0x52, 0x4c, 0x50, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x20, 0x72, 0x61, - 0x77, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x20, 0x74, 0x68, - 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, - 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x69, - 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0xba, 0x48, 0x82, 0x01, - 0xba, 0x01, 0x7f, 0x0a, 0x10, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, - 0x61, 0x6e, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x20, 0x72, 0x61, 0x77, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2e, 0x1a, 0x2d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, - 0x20, 0x72, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, - 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x2a, 0x24, 0x27, - 0x29, 0x29, 0x52, 0x0f, 0x72, 0x61, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0xbf, 0x02, 0x0a, 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x9b, 0x02, 0x92, 0x41, 0x9f, - 0x01, 0x32, 0x93, 0x01, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, - 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x73, - 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x79, - 0x20, 0x66, 0x61, 0x69, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x2e, 0x20, 0x49, 0x66, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, - 0x65, 0x63, 0x61, 0x79, 0x65, 0x64, 0x20, 0x62, 0x69, 0x64, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, - 0x74, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x6c, - 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x2e, 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, - 0xba, 0x48, 0x75, 0xba, 0x01, 0x72, 0x0a, 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, - 0x6e, 0x74, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x3b, 0x74, 0x68, 0x69, - 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x27, 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, - 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x5b, 0x30, 0x2d, 0x39, 0x5d, - 0x2b, 0x24, 0x27, 0x29, 0x20, 0x26, 0x26, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x68, 0x69, - 0x73, 0x29, 0x20, 0x3e, 0x3d, 0x20, 0x30, 0x29, 0x52, 0x0b, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x41, - 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0xba, 0x04, 0x92, 0x41, 0xb6, 0x04, 0x0a, 0x95, 0x01, 0x2a, - 0x0b, 0x42, 0x69, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x40, 0x55, 0x6e, - 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x69, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x73, 0x20, - 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x6d, 0x65, - 0x76, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0xd2, 0x01, - 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0xd2, 0x01, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0xd2, 0x01, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0xd2, 0x01, - 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x32, 0x9b, 0x03, 0x7b, 0x22, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, - 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x66, 0x65, 0x34, 0x63, 0x62, 0x34, 0x37, 0x64, 0x62, - 0x33, 0x36, 0x33, 0x30, 0x35, 0x35, 0x31, 0x62, 0x65, 0x65, 0x64, 0x66, 0x62, 0x64, 0x30, 0x32, - 0x61, 0x37, 0x31, 0x65, 0x63, 0x63, 0x36, 0x39, 0x66, 0x64, 0x35, 0x39, 0x37, 0x35, 0x38, 0x65, - 0x32, 0x62, 0x61, 0x36, 0x39, 0x39, 0x36, 0x30, 0x36, 0x65, 0x32, 0x64, 0x35, 0x63, 0x37, 0x34, - 0x32, 0x38, 0x34, 0x66, 0x66, 0x61, 0x37, 0x22, 0x2c, 0x20, 0x22, 0x37, 0x31, 0x63, 0x31, 0x33, - 0x34, 0x38, 0x66, 0x32, 0x64, 0x37, 0x66, 0x66, 0x37, 0x65, 0x38, 0x31, 0x34, 0x66, 0x39, 0x63, - 0x33, 0x36, 0x31, 0x37, 0x39, 0x38, 0x33, 0x37, 0x30, 0x33, 0x34, 0x33, 0x35, 0x65, 0x61, 0x37, - 0x34, 0x34, 0x36, 0x64, 0x65, 0x34, 0x32, 0x30, 0x61, 0x65, 0x61, 0x63, 0x34, 0x38, 0x38, 0x62, - 0x66, 0x31, 0x64, 0x65, 0x33, 0x35, 0x37, 0x33, 0x37, 0x65, 0x38, 0x22, 0x5d, 0x2c, 0x20, 0x22, - 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x2c, 0x20, - 0x22, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x3a, 0x20, - 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3a, - 0x20, 0x31, 0x36, 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x2c, 0x20, 0x22, 0x64, 0x65, - 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x22, 0x3a, 0x20, 0x31, 0x36, 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x2c, 0x20, - 0x22, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, - 0x73, 0x68, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x66, 0x65, 0x34, 0x63, 0x62, 0x34, 0x37, - 0x64, 0x62, 0x33, 0x36, 0x33, 0x30, 0x35, 0x35, 0x31, 0x62, 0x65, 0x65, 0x64, 0x66, 0x62, 0x64, - 0x30, 0x32, 0x61, 0x37, 0x31, 0x65, 0x63, 0x63, 0x36, 0x39, 0x66, 0x64, 0x35, 0x39, 0x37, 0x35, - 0x38, 0x65, 0x32, 0x62, 0x61, 0x36, 0x39, 0x39, 0x36, 0x30, 0x36, 0x65, 0x32, 0x64, 0x35, 0x63, - 0x37, 0x34, 0x32, 0x38, 0x34, 0x66, 0x66, 0x61, 0x37, 0x22, 0x5d, 0x2c, 0x20, 0x22, 0x73, 0x6c, - 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x35, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x22, 0x7d, 0x22, 0xc2, 0x0d, 0x0a, 0x0a, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x95, 0x01, 0x0a, 0x09, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x78, 0x92, 0x41, 0x75, 0x32, 0x61, 0x48, 0x65, 0x78, 0x20, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, - 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x61, 0x73, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, - 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, - 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, - 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, 0x0f, - 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x52, - 0x08, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x8f, 0x01, 0x0a, 0x0a, 0x62, 0x69, - 0x64, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x70, - 0x92, 0x41, 0x6d, 0x32, 0x6b, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, - 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, - 0x65, 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, 0x61, 0x67, 0x72, 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, - 0x20, 0x70, 0x61, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, - 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, - 0x52, 0x09, 0x62, 0x69, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x6d, 0x0a, 0x0c, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x03, 0x42, 0x4a, 0x92, 0x41, 0x47, 0x32, 0x45, 0x4d, 0x61, 0x78, 0x20, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, - 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x2e, 0x52, 0x0b, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x7b, 0x0a, 0x13, 0x72, 0x65, - 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4b, 0x92, 0x41, 0x48, 0x32, 0x46, 0x48, 0x65, + 0x61, 0x72, 0x74, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x13, + 0x64, 0x65, 0x63, 0x61, 0x79, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x12, 0x5e, 0x0a, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, + 0x42, 0x2e, 0x92, 0x41, 0x2b, 0x32, 0x29, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, + 0x64, 0x20, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, + 0x52, 0x11, 0x64, 0x65, 0x63, 0x61, 0x79, 0x45, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x12, 0x6a, 0x0a, 0x0a, 0x62, 0x69, 0x64, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, + 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4b, 0x92, 0x41, 0x48, 0x32, 0x46, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, - 0x64, 0x65, 0x72, 0x2e, 0x52, 0x11, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x42, 0x69, - 0x64, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x7d, 0x0a, 0x16, 0x72, 0x65, 0x63, 0x65, 0x69, - 0x76, 0x65, 0x64, 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x47, 0x92, 0x41, 0x44, 0x32, 0x42, 0x48, 0x65, - 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, - 0x67, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x6f, - 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, - 0x74, 0x20, 0x73, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x62, 0x69, 0x64, 0x2e, - 0x52, 0x14, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x42, 0x69, 0x64, 0x53, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x62, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x35, 0x92, 0x41, 0x32, 0x32, 0x30, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x64, - 0x69, 0x67, 0x65, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x9e, 0x01, 0x0a, 0x14, 0x63, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x6b, 0x92, 0x41, 0x68, 0x32, 0x66, - 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, - 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, - 0x6e, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, - 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x13, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, - 0x6e, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x10, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x5d, 0x92, 0x41, 0x5a, 0x32, 0x58, 0x48, 0x65, 0x78, - 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, - 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, - 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, - 0x74, 0x68, 0x61, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x2e, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x64, 0x0a, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x03, 0x42, 0x30, 0x92, 0x41, 0x2d, 0x32, 0x2b, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x20, 0x64, 0x65, - 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x5e, 0x0a, 0x13, - 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x42, 0x2e, 0x92, 0x41, 0x2b, 0x32, 0x29, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, - 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x65, 0x6e, 0x64, 0x73, 0x20, - 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x11, 0x64, 0x65, 0x63, 0x61, 0x79, - 0x45, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x63, 0x0a, 0x12, - 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x42, 0x34, 0x92, 0x41, 0x31, 0x32, 0x2f, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, - 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, - 0x20, 0x69, 0x73, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x2e, 0x52, 0x11, - 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x12, 0x7c, 0x0a, 0x13, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, - 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x42, 0x4c, - 0x92, 0x41, 0x49, 0x32, 0x47, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x72, - 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x78, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, - 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, - 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x62, - 0x65, 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x65, 0x64, 0x2e, 0x52, 0x11, 0x72, 0x65, - 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, - 0x85, 0x01, 0x0a, 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x42, 0x62, 0x92, 0x41, 0x5f, 0x32, 0x5d, 0x41, 0x6d, 0x6f, - 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, - 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x20, - 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x20, 0x74, - 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x0b, 0x73, 0x6c, 0x61, 0x73, - 0x68, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x5e, 0x92, 0x41, 0x5b, 0x0a, 0x59, 0x2a, 0x12, - 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x32, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x6d, 0x65, 0x76, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x22, 0xbe, 0x02, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x42, - 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x9f, 0x01, - 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x03, 0x42, 0x7c, 0x92, 0x41, 0x79, 0x32, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x61, 0x6c, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x20, 0x66, 0x6f, 0x72, 0x20, 0x71, 0x75, 0x65, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x69, - 0x64, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, - 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6b, 0x6e, - 0x6f, 0x77, 0x6e, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x69, - 0x6e, 0x20, 0x61, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x64, 0x65, - 0x72, 0x2e, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, - 0x34, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x20, 0x92, - 0x41, 0x1d, 0x32, 0x1b, 0x50, 0x61, 0x67, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, - 0x66, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, - 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x51, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x05, 0x42, 0x3b, 0x92, 0x41, 0x38, 0x32, 0x36, 0x4e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x70, - 0x61, 0x67, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x20, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x69, 0x73, 0x20, 0x35, - 0x30, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0xe0, 0x11, 0x0a, 0x12, 0x47, 0x65, 0x74, - 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x97, 0x01, 0x0a, 0x0e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x69, 0x6e, - 0x66, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, - 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x42, 0x92, 0x41, 0x3f, 0x32, 0x3d, 0x4c, 0x69, - 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x62, 0x69, 0x64, 0x20, - 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, - 0x62, 0x69, 0x64, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x63, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x52, 0x0c, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0xf4, 0x04, 0x0a, 0x14, 0x43, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x57, 0x69, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x7e, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x53, 0x92, 0x41, - 0x50, 0x32, 0x4e, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, - 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, - 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x12, 0x63, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x42, 0x34, - 0x92, 0x41, 0x31, 0x32, 0x2f, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, - 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, - 0x68, 0x65, 0x64, 0x2e, 0x52, 0x11, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x86, 0x01, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x6e, 0x92, 0x41, 0x6b, 0x32, 0x69, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x20, 0x50, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, - 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x3a, 0x20, 0x27, 0x70, 0x65, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x27, 0x2c, 0x20, 0x27, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x27, - 0x6f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x27, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, - 0x64, 0x27, 0x2c, 0x20, 0x27, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x27, - 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x27, 0x2e, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x4e, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x34, 0x92, 0x41, 0x31, 0x32, 0x2f, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x61, 0x6c, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x12, 0x48, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x2e, 0x92, 0x41, 0x2b, 0x32, 0x29, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x20, - 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x77, 0x65, 0x69, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x54, 0x0a, 0x06, 0x72, 0x65, - 0x66, 0x75, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3c, 0x92, 0x41, 0x39, 0x32, - 0x37, 0x52, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x69, - 0x6e, 0x20, 0x77, 0x65, 0x69, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x69, 0x66, 0x20, 0x61, 0x70, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x52, 0x06, 0x72, 0x65, 0x66, 0x75, 0x6e, 0x64, - 0x1a, 0xdb, 0x09, 0x0a, 0x07, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x9a, 0x01, 0x0a, - 0x0a, 0x74, 0x78, 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x42, 0x7b, 0x92, 0x41, 0x78, 0x32, 0x64, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x68, - 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, - 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x69, - 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, 0x0f, 0x5b, - 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x52, 0x09, - 0x74, 0x78, 0x6e, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x92, 0x01, 0x0a, 0x15, 0x72, 0x65, - 0x76, 0x65, 0x72, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x74, 0x78, 0x6e, 0x5f, 0x68, 0x61, 0x73, - 0x68, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0x5e, 0x92, 0x41, 0x5b, 0x32, 0x47, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, - 0x66, 0x20, 0x74, 0x78, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, - 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, - 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x62, 0x65, 0x20, 0x64, 0x69, 0x73, - 0x63, 0x61, 0x72, 0x64, 0x65, 0x64, 0x2e, 0x8a, 0x01, 0x0f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, - 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x52, 0x13, 0x72, 0x65, 0x76, 0x65, 0x72, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x6e, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x69, - 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x03, 0x42, 0x46, 0x92, 0x41, 0x43, 0x32, 0x41, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, - 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x2e, 0x52, 0x0b, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x98, 0x01, 0x0a, 0x0a, 0x62, 0x69, - 0x64, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x79, - 0x92, 0x41, 0x76, 0x32, 0x6b, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, - 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, - 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, - 0x20, 0x70, 0x61, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, - 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, - 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x52, 0x09, 0x62, 0x69, 0x64, 0x41, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x64, 0x0a, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x03, 0x42, 0x30, 0x92, 0x41, 0x2d, 0x32, 0x2b, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x62, 0x69, 0x64, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, - 0x79, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x5e, 0x0a, 0x13, 0x64, 0x65, - 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x42, 0x2e, 0x92, 0x41, 0x2b, 0x32, 0x29, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x64, 0x65, - 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x11, 0x64, 0x65, 0x63, 0x61, 0x79, 0x45, 0x6e, - 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x6a, 0x0a, 0x0a, 0x62, 0x69, - 0x64, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4b, - 0x92, 0x41, 0x48, 0x32, 0x46, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, - 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x69, 0x67, 0x65, - 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2e, 0x52, 0x09, 0x62, 0x69, 0x64, - 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0xc7, 0x01, 0x0a, 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, - 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0xa3, 0x01, - 0x92, 0x41, 0x9f, 0x01, 0x32, 0x93, 0x01, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, - 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, - 0x65, 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x79, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x2c, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x65, 0x64, 0x20, 0x62, 0x69, 0x64, 0x20, 0x61, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, - 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x2e, 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, - 0x39, 0x5d, 0x2b, 0x52, 0x0b, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x57, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, - 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, - 0x6e, 0x74, 0x57, 0x69, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0b, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x43, 0x92, 0x41, 0x40, 0x0a, 0x3e, - 0x2a, 0x08, 0x42, 0x69, 0x64, 0x20, 0x49, 0x6e, 0x66, 0x6f, 0x32, 0x32, 0x49, 0x6e, 0x66, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x61, 0x20, - 0x62, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x74, - 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x1a, 0xda, - 0x01, 0x0a, 0x0c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x59, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x03, 0x42, 0x36, 0x92, 0x41, 0x33, 0x32, 0x31, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x77, 0x68, 0x69, - 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x20, - 0x69, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x2e, 0x52, 0x0b, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x6f, 0x0a, 0x04, 0x62, 0x69, - 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, - 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x42, 0x69, 0x64, 0x49, 0x6e, - 0x66, 0x6f, 0x42, 0x31, 0x92, 0x41, 0x2e, 0x32, 0x2c, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, - 0x20, 0x62, 0x69, 0x64, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x70, - 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x52, 0x04, 0x62, 0x69, 0x64, 0x73, 0x32, 0xef, 0x0b, 0x0a, 0x06, - 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x12, 0x53, 0x0a, 0x07, 0x53, 0x65, 0x6e, 0x64, 0x42, 0x69, - 0x64, 0x12, 0x11, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x42, 0x69, 0x64, 0x1a, 0x18, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x19, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x3a, 0x01, 0x2a, 0x22, 0x0e, 0x2f, 0x76, 0x31, 0x2f, 0x62, - 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x62, 0x69, 0x64, 0x30, 0x01, 0x12, 0x6b, 0x0a, 0x07, 0x44, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x1c, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x22, 0x1b, 0x2f, 0x76, 0x31, - 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x2f, - 0x7b, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x7d, 0x12, 0x7b, 0x0a, 0x0d, 0x44, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x12, 0x22, 0x2e, 0x62, 0x69, 0x64, 0x64, - 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x45, 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, - 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x19, 0x2f, 0x76, 0x31, 0x2f, - 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x65, - 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x12, 0x98, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x12, 0x29, - 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x62, 0x69, 0x64, 0x64, - 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x44, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x22, 0x21, 0x2f, - 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, - 0x12, 0x8c, 0x01, 0x0a, 0x11, 0x53, 0x65, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, 0x26, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, - 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, - 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, - 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x73, 0x65, 0x74, 0x5f, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, - 0x98, 0x01, 0x0a, 0x14, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x29, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, - 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x12, 0x21, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, - 0x64, 0x65, 0x72, 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x92, 0x01, 0x0a, 0x12, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, - 0x73, 0x12, 0x27, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, - 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x62, 0x69, 0x64, - 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x3a, 0x01, 0x2a, 0x22, - 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x12, - 0x8c, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x26, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, - 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, - 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x6c, - 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x1f, 0x2e, 0x62, - 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x44, + 0x64, 0x65, 0x72, 0x2e, 0x52, 0x09, 0x62, 0x69, 0x64, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, + 0xc7, 0x01, 0x0a, 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0xa3, 0x01, 0x92, 0x41, 0x9f, 0x01, 0x32, 0x93, 0x01, + 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, + 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x66, 0x61, 0x69, + 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x49, 0x66, + 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, + 0x65, 0x64, 0x20, 0x62, 0x69, 0x64, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x69, 0x73, + 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, + 0x6e, 0x67, 0x2e, 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x52, 0x0b, 0x73, 0x6c, + 0x61, 0x73, 0x68, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x57, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, + 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x57, 0x69, 0x74, 0x68, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x3a, 0x43, 0x92, 0x41, 0x40, 0x0a, 0x3e, 0x2a, 0x08, 0x42, 0x69, 0x64, 0x20, 0x49, + 0x6e, 0x66, 0x6f, 0x32, 0x32, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x61, 0x20, 0x62, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x74, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x1a, 0xda, 0x01, 0x0a, 0x0c, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x59, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x42, 0x36, + 0x92, 0x41, 0x33, 0x32, 0x31, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x62, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x65, 0x64, 0x2e, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x12, 0x6f, 0x0a, 0x04, 0x62, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x28, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x2e, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x31, 0x92, 0x41, 0x2e, + 0x32, 0x2c, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x69, 0x64, 0x73, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, + 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x52, 0x04, + 0x62, 0x69, 0x64, 0x73, 0x32, 0xef, 0x0b, 0x0a, 0x06, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x12, + 0x53, 0x0a, 0x07, 0x53, 0x65, 0x6e, 0x64, 0x42, 0x69, 0x64, 0x12, 0x11, 0x2e, 0x62, 0x69, 0x64, + 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x69, 0x64, 0x1a, 0x18, 0x2e, + 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x3a, + 0x01, 0x2a, 0x22, 0x0e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x62, + 0x69, 0x64, 0x30, 0x01, 0x12, 0x6b, 0x0a, 0x07, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, + 0x1c, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, - 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x66, 0x0a, 0x08, - 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x12, 0x1d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, - 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, - 0x13, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x77, 0x69, 0x74, 0x68, - 0x64, 0x72, 0x61, 0x77, 0x12, 0x70, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x1f, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x12, 0x17, 0x2f, - 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x62, 0x69, - 0x64, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x75, 0x0a, 0x11, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x53, - 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x46, 0x75, 0x6e, 0x64, 0x73, 0x12, 0x1a, 0x2e, 0x62, 0x69, - 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1e, 0x2f, - 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x5f, - 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x66, 0x75, 0x6e, 0x64, 0x73, 0x42, 0xaa, 0x02, - 0x92, 0x41, 0x72, 0x12, 0x70, 0x0a, 0x0a, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x41, 0x50, - 0x49, 0x2a, 0x55, 0x0a, 0x1b, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x20, 0x53, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x31, 0x2e, 0x31, - 0x12, 0x36, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x65, 0x76, 0x2f, 0x6d, 0x65, 0x76, 0x2d, - 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x2f, 0x62, 0x6c, 0x6f, 0x62, 0x2f, 0x6d, 0x61, 0x69, 0x6e, - 0x2f, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x32, 0x0b, 0x31, 0x2e, 0x30, 0x2e, 0x30, 0x2d, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, - 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x42, 0x0e, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, - 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x40, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x65, 0x76, 0x2f, 0x6d, 0x65, 0x76, - 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x2f, 0x70, 0x32, 0x70, 0x2f, 0x67, 0x65, 0x6e, 0x2f, - 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x3b, - 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x42, 0x58, - 0x58, 0xaa, 0x02, 0x0c, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x31, - 0xca, 0x02, 0x0c, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x5c, 0x56, 0x31, 0xe2, - 0x02, 0x18, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x5c, 0x56, 0x31, 0x5c, 0x47, - 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0d, 0x42, 0x69, 0x64, - 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x1d, 0x22, 0x1b, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, + 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x2f, 0x7b, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x7d, 0x12, 0x7b, 0x0a, 0x0d, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, + 0x6c, 0x79, 0x12, 0x22, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x45, 0x76, 0x65, + 0x6e, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x21, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x1b, 0x22, 0x19, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, + 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x12, 0x98, + 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x12, 0x29, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x22, 0x21, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, + 0x65, 0x72, 0x2f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x12, 0x8c, 0x01, 0x0a, 0x11, 0x53, 0x65, + 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, + 0x26, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x65, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, + 0x64, 0x64, 0x65, 0x72, 0x2f, 0x73, 0x65, 0x74, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, + 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, 0x98, 0x01, 0x0a, 0x14, 0x44, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x29, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x62, + 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, + 0x12, 0x21, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x64, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x92, 0x01, 0x0a, 0x12, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, + 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x12, 0x27, 0x2e, 0x62, 0x69, 0x64, + 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, + 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x3a, 0x01, 0x2a, 0x22, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, + 0x64, 0x64, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x77, 0x69, 0x74, + 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x12, 0x8c, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x26, + 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, + 0x64, 0x65, 0x72, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x6c, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x44, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x1f, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, + 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x66, 0x0a, 0x08, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, + 0x77, 0x12, 0x1d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x13, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, + 0x64, 0x64, 0x65, 0x72, 0x2f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x12, 0x70, 0x0a, + 0x0a, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x2e, 0x62, 0x69, + 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, + 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x62, + 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, + 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x12, 0x17, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, + 0x65, 0x72, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x12, + 0x75, 0x0a, 0x11, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x46, + 0x75, 0x6e, 0x64, 0x73, 0x12, 0x1a, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x1a, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, + 0x65, 0x72, 0x2f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x5f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, + 0x5f, 0x66, 0x75, 0x6e, 0x64, 0x73, 0x42, 0xaa, 0x02, 0x92, 0x41, 0x72, 0x12, 0x70, 0x0a, 0x0a, + 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x41, 0x50, 0x49, 0x2a, 0x55, 0x0a, 0x1b, 0x42, 0x75, + 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x20, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x4c, 0x69, + 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x31, 0x2e, 0x31, 0x12, 0x36, 0x68, 0x74, 0x74, 0x70, 0x73, + 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, + 0x69, 0x6d, 0x65, 0x76, 0x2f, 0x6d, 0x65, 0x76, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x2f, + 0x62, 0x6c, 0x6f, 0x62, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, + 0x45, 0x32, 0x0b, 0x31, 0x2e, 0x30, 0x2e, 0x30, 0x2d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x0a, 0x10, + 0x63, 0x6f, 0x6d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x42, 0x0e, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x50, 0x01, 0x5a, 0x40, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, + 0x72, 0x69, 0x6d, 0x65, 0x76, 0x2f, 0x6d, 0x65, 0x76, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x2f, 0x70, 0x32, 0x70, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x64, 0x64, + 0x65, 0x72, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x3b, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, + 0x70, 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x42, 0x58, 0x58, 0xaa, 0x02, 0x0c, 0x42, 0x69, 0x64, + 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0c, 0x42, 0x69, 0x64, 0x64, + 0x65, 0x72, 0x61, 0x70, 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x18, 0x42, 0x69, 0x64, 0x64, 0x65, + 0x72, 0x61, 0x70, 0x69, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0xea, 0x02, 0x0d, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x3a, + 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go b/p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go index fb5d27cfd..bf155f0d5 100644 --- a/p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go +++ b/p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go @@ -61,7 +61,8 @@ type BidderClient interface { // SetTargetDeposits // // SetTargetDeposits is called by the bidder node to set target deposits per provider - // within the deposit manager. + // within the deposit manager. During this call, the bidder node will also attempt to top-up + // deposits for each new target deposit. SetTargetDeposits(ctx context.Context, in *SetTargetDepositsRequest, opts ...grpc.CallOption) (*SetTargetDepositsResponse, error) // DepositManagerStatus // @@ -265,7 +266,8 @@ type BidderServer interface { // SetTargetDeposits // // SetTargetDeposits is called by the bidder node to set target deposits per provider - // within the deposit manager. + // within the deposit manager. During this call, the bidder node will also attempt to top-up + // deposits for each new target deposit. SetTargetDeposits(context.Context, *SetTargetDepositsRequest) (*SetTargetDepositsResponse, error) // DepositManagerStatus // diff --git a/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml b/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml index dd6832a62..0bac8aef0 100644 --- a/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml +++ b/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml @@ -238,7 +238,8 @@ paths: summary: SetTargetDeposits description: |- SetTargetDeposits is called by the bidder node to set target deposits per provider - within the deposit manager. + within the deposit manager. During this call, the bidder node will also attempt to top-up + deposits for each new target deposit. operationId: Bidder_SetTargetDeposits responses: "200": @@ -580,6 +581,10 @@ definitions: items: type: object $ref: '#/definitions/v1TargetDeposit' + successfullyToppedUpProviders: + type: array + items: + type: string description: OverrideTargetDepositsResponse response. title: OverrideTargetDepositsResponse response v1TargetDeposit: diff --git a/p2p/pkg/rpc/bidder/service.go b/p2p/pkg/rpc/bidder/service.go index 57a3473da..52505a91b 100644 --- a/p2p/pkg/rpc/bidder/service.go +++ b/p2p/pkg/rpc/bidder/service.go @@ -124,7 +124,9 @@ type SetCodeHelper interface { type DepositManagerContract interface { SetTargetDeposits(opts *bind.TransactOpts, providers []common.Address, amounts []*big.Int) (*types.Transaction, error) + TopUpDeposits(opts *bind.TransactOpts, providers []common.Address) (*types.Transaction, error) ParseTargetDepositSet(types.Log) (*depositmanager.DepositmanagerTargetDepositSet, error) + ParseDepositToppedUp(types.Log) (*depositmanager.DepositmanagerDepositToppedUp, error) } type Backend interface { @@ -639,6 +641,27 @@ func (s *Service) SetTargetDeposits( } } + tx, err = s.depositManager.TopUpDeposits(opts, providers) + if err != nil { + s.logger.Error("topping up deposits", "error", err) + return nil, status.Errorf(codes.Internal, "topping up deposits: %v", err) + } + + receipt, err = s.watcher.WaitForReceipt(ctx, tx) + if err != nil { + s.logger.Error("waiting for receipt", "error", err) + return nil, status.Errorf(codes.Internal, "waiting for receipt: %v", err) + } + + for _, log := range receipt.Logs { + if depositToppedUp, err := s.depositManager.ParseDepositToppedUp(*log); err == nil { + response.SuccessfullyToppedUpProviders = append( + response.SuccessfullyToppedUpProviders, + depositToppedUp.Provider.Hex(), + ) + } + } + return response, nil } diff --git a/p2p/rpc/bidderapi/v1/bidderapi.proto b/p2p/rpc/bidderapi/v1/bidderapi.proto index 89e2fd4ec..52e90c1a0 100644 --- a/p2p/rpc/bidderapi/v1/bidderapi.proto +++ b/p2p/rpc/bidderapi/v1/bidderapi.proto @@ -57,7 +57,8 @@ service Bidder { // SetTargetDeposits // // SetTargetDeposits is called by the bidder node to set target deposits per provider - // within the deposit manager. + // within the deposit manager. During this call, the bidder node will also attempt to top-up + // deposits for each new target deposit. rpc SetTargetDeposits(SetTargetDepositsRequest) returns (SetTargetDepositsResponse) { option (google.api.http) = {post: "/v1/bidder/set_target_deposits"}; } @@ -242,6 +243,7 @@ message SetTargetDepositsResponse { } }; repeated TargetDeposit successfully_set_deposits = 1; + repeated string successfully_topped_up_providers = 2; } message DepositManagerStatusRequest { From 0c4949fccaed6f5865c10367ae095e34632443b7 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Tue, 19 Aug 2025 19:49:31 -0700 Subject: [PATCH 075/117] deposit-manager-contract p2p node param --- p2p/cmd/main.go | 15 ++++++ p2p/pkg/node/node.go | 7 +++ p2p/pkg/rpc/bidder/service.go | 77 ++++++++++++++---------------- p2p/pkg/rpc/bidder/service_test.go | 1 + 4 files changed, 60 insertions(+), 40 deletions(-) diff --git a/p2p/cmd/main.go b/p2p/cmd/main.go index c7fe8f0b4..43dd252b9 100644 --- a/p2p/cmd/main.go +++ b/p2p/cmd/main.go @@ -297,6 +297,19 @@ var ( Category: categoryContracts, }) + optionDepositManagerImplAddr = altsrc.NewStringFlag(&cli.StringFlag{ + Name: "deposit-manager-contract", + Usage: "Address of the deposit manager implementation for bidders", + EnvVars: []string{"MEV_COMMIT_DEPOSIT_MANAGER_IMPL_ADDR"}, + Action: func(ctx *cli.Context, s string) error { + if s != "" && !common.IsHexAddress(s) { + return fmt.Errorf("invalid deposit manager implementation address: %s", s) + } + return nil + }, + Category: categoryContracts, + }) + optionSettlementRPCEndpoint = altsrc.NewStringFlag(&cli.StringFlag{ Name: "settlement-rpc-endpoint", Usage: "RPC endpoint of the settlement layer", @@ -487,6 +500,7 @@ func main() { optionBlockTrackerAddr, optionValidatorRouterAddr, optionOracleAddr, + optionDepositManagerImplAddr, optionSettlementRPCEndpoint, optionSettlementWSRPCEndpoint, optionNATAddr, @@ -663,6 +677,7 @@ func launchNodeWithConfig(c *cli.Context) (err error) { BidderRegistryContract: c.String(optionBidderRegistryAddr.Name), BlockTrackerContract: c.String(optionBlockTrackerAddr.Name), ValidatorRouterContract: c.String(optionValidatorRouterAddr.Name), + DepositManagerImplAddr: c.String(optionDepositManagerImplAddr.Name), OracleContract: c.String(optionOracleAddr.Name), RPCEndpoint: c.String(optionSettlementRPCEndpoint.Name), WSRPCEndpoint: c.String(optionSettlementWSRPCEndpoint.Name), diff --git a/p2p/pkg/node/node.go b/p2p/pkg/node/node.go index 99a45b3c7..8040ccb63 100644 --- a/p2p/pkg/node/node.go +++ b/p2p/pkg/node/node.go @@ -114,6 +114,7 @@ type Options struct { BidderRegistryContract string OracleContract string ValidatorRouterContract string + DepositManagerImplAddr string RPCEndpoint string WSRPCEndpoint string NatAddr string @@ -666,6 +667,11 @@ func NewNode(opts *Options) (*Node, error) { chainID, ) + if opts.DepositManagerImplAddr == "" { + opts.Logger.Error("deposit manager implementation address is not set") + return nil, errors.New("deposit manager implementation address is not set") + } + bidderAPI := bidderapi.NewService( opts.KeySigner.GetAddress(), preconfProto, @@ -682,6 +688,7 @@ func NewNode(opts *Options) (*Node, error) { depositManagerContract, backend, topo, + common.HexToAddress(opts.DepositManagerImplAddr), ) bidderapiv1.RegisterBidderServer(grpcServer, bidderAPI) diff --git a/p2p/pkg/rpc/bidder/service.go b/p2p/pkg/rpc/bidder/service.go index 52505a91b..536b7c567 100644 --- a/p2p/pkg/rpc/bidder/service.go +++ b/p2p/pkg/rpc/bidder/service.go @@ -28,22 +28,23 @@ import ( type Service struct { bidderapiv1.UnimplementedBidderServer - owner common.Address - sender PreconfSender - registryContract BidderRegistryContract - providerRegistry ProviderRegistryContract - blockTrackerContract BlockTrackerContract - watcher TxWatcher - optsGetter OptsGetter - cs CommitmentStore - logger *slog.Logger - metrics *metrics - validator *protovalidate.Validator - bidTimeout time.Duration - setCodeHelper SetCodeHelper - depositManager DepositManagerContract - backend Backend - topology *topology.Topology + owner common.Address + sender PreconfSender + registryContract BidderRegistryContract + providerRegistry ProviderRegistryContract + blockTrackerContract BlockTrackerContract + watcher TxWatcher + optsGetter OptsGetter + cs CommitmentStore + logger *slog.Logger + metrics *metrics + validator *protovalidate.Validator + bidTimeout time.Duration + setCodeHelper SetCodeHelper + depositManager DepositManagerContract + backend Backend + topology *topology.Topology + depositManagerImplAddr common.Address } func NewService( @@ -62,24 +63,26 @@ func NewService( depositManager DepositManagerContract, backend Backend, topology *topology.Topology, + depositManagerImplAddr common.Address, ) *Service { return &Service{ - owner: owner, - sender: sender, - registryContract: registryContract, - blockTrackerContract: blockTrackerContract, - providerRegistry: providerRegistry, - cs: cs, - watcher: watcher, - optsGetter: optsGetter, - logger: logger, - metrics: newMetrics(), - validator: validator, - bidTimeout: bidderBidTimeout, - setCodeHelper: setCodeHelper, - depositManager: depositManager, - backend: backend, - topology: topology, + owner: owner, + sender: sender, + registryContract: registryContract, + blockTrackerContract: blockTrackerContract, + providerRegistry: providerRegistry, + cs: cs, + watcher: watcher, + optsGetter: optsGetter, + logger: logger, + metrics: newMetrics(), + validator: validator, + bidTimeout: bidderBidTimeout, + setCodeHelper: setCodeHelper, + depositManager: depositManager, + backend: backend, + topology: topology, + depositManagerImplAddr: depositManagerImplAddr, } } @@ -558,10 +561,7 @@ func (s *Service) EnableDepositManager( return nil, status.Errorf(codes.FailedPrecondition, "EnableDepositManager failed: deposit manager is already enabled") } - // TODO: Config param for deposit manager - depositManagerAddr := common.HexToAddress("0x0000000000000000000000000000000000000000") - - tx, err := s.setCodeHelper.SetCode(ctx, opts, depositManagerAddr) + tx, err := s.setCodeHelper.SetCode(ctx, opts, s.depositManagerImplAddr) if err != nil { s.logger.Error("setting code", "error", err) return nil, status.Errorf(codes.Internal, "setting code: %v", err) @@ -685,11 +685,8 @@ func (s *Service) DepositManagerStatus( return &bidderapiv1.DepositManagerStatusResponse{Enabled: false}, nil } - // TODO: Config param for deposit manager - depositManagerAddr := common.HexToAddress("0x0000000000000000000000000000000000000000") - codehash := crypto.Keccak256Hash(code) - expectedCodehash := crypto.Keccak256Hash(common.FromHex("0xef0100"), depositManagerAddr.Bytes()) + expectedCodehash := crypto.Keccak256Hash(common.FromHex("0xef0100"), s.depositManagerImplAddr.Bytes()) if codehash != expectedCodehash { s.logger.Error("codehash is not correct", "actual", codehash, "expected", expectedCodehash) return nil, status.Errorf(codes.Internal, "codehash is not correct") diff --git a/p2p/pkg/rpc/bidder/service_test.go b/p2p/pkg/rpc/bidder/service_test.go index 725841130..6c62596e7 100644 --- a/p2p/pkg/rpc/bidder/service_test.go +++ b/p2p/pkg/rpc/bidder/service_test.go @@ -285,6 +285,7 @@ func startServerWithStore(t *testing.T, cs *testStore) bidderapiv1.BidderClient nil, // TODO: Make deposit manager non-nil and test relevant functions from service.go nil, // TODO: Make backend non-nil and test relevant functions from service.go &topology.Topology{}, // TODO: Make topology non-nil and test relevant functions from service.go + common.HexToAddress("0x0000000000000000000000000000000000000000"), // TODO: Make deposit manager impl address non-nil and test relevant functions from service.go ) baseServer := grpc.NewServer() From 4eee944eb278c90bf135be634fb4f056b41c14dc Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Tue, 19 Aug 2025 20:04:22 -0700 Subject: [PATCH 076/117] enable deposit manager flag --- p2p/cmd/main.go | 10 ++++++++++ p2p/pkg/node/node.go | 9 +++++++++ 2 files changed, 19 insertions(+) diff --git a/p2p/cmd/main.go b/p2p/cmd/main.go index 43dd252b9..31e97aace 100644 --- a/p2p/cmd/main.go +++ b/p2p/cmd/main.go @@ -310,6 +310,14 @@ var ( Category: categoryContracts, }) + optionEnableDepositManager = altsrc.NewBoolFlag(&cli.BoolFlag{ + Name: "enable-deposit-manager", + Usage: "Whether the deposit manager should be enabled", + EnvVars: []string{"MEV_COMMIT_ENABLE_DEPOSIT_MANAGER"}, + Value: false, + Category: categoryBidder, + }) + optionSettlementRPCEndpoint = altsrc.NewStringFlag(&cli.StringFlag{ Name: "settlement-rpc-endpoint", Usage: "RPC endpoint of the settlement layer", @@ -501,6 +509,7 @@ func main() { optionValidatorRouterAddr, optionOracleAddr, optionDepositManagerImplAddr, + optionEnableDepositManager, optionSettlementRPCEndpoint, optionSettlementWSRPCEndpoint, optionNATAddr, @@ -678,6 +687,7 @@ func launchNodeWithConfig(c *cli.Context) (err error) { BlockTrackerContract: c.String(optionBlockTrackerAddr.Name), ValidatorRouterContract: c.String(optionValidatorRouterAddr.Name), DepositManagerImplAddr: c.String(optionDepositManagerImplAddr.Name), + EnableDepositManager: c.Bool(optionEnableDepositManager.Name), OracleContract: c.String(optionOracleAddr.Name), RPCEndpoint: c.String(optionSettlementRPCEndpoint.Name), WSRPCEndpoint: c.String(optionSettlementWSRPCEndpoint.Name), diff --git a/p2p/pkg/node/node.go b/p2p/pkg/node/node.go index 8040ccb63..f47858ae5 100644 --- a/p2p/pkg/node/node.go +++ b/p2p/pkg/node/node.go @@ -115,6 +115,7 @@ type Options struct { OracleContract string ValidatorRouterContract string DepositManagerImplAddr string + EnableDepositManager bool RPCEndpoint string WSRPCEndpoint string NatAddr string @@ -692,6 +693,14 @@ func NewNode(opts *Options) (*Node, error) { ) bidderapiv1.RegisterBidderServer(grpcServer, bidderAPI) + if opts.EnableDepositManager { + resp, err := bidderAPI.EnableDepositManager(context.Background(), &bidderapiv1.EnableDepositManagerRequest{}) + if err != nil || !resp.Success { + opts.Logger.Warn("failed to enable deposit manager", "error", err) + } + opts.Logger.Info("deposit manager enabled") + } + keyexchange := keyexchange.New( topo, p2pSvc, From c7f3859677dc28fd1ab2d9d35e3c3ce611fbe76e Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Tue, 19 Aug 2025 20:12:25 -0700 Subject: [PATCH 077/117] get deposit manager addr from bidder registry --- p2p/cmd/main.go | 15 --------------- p2p/pkg/node/node.go | 10 +++++++--- 2 files changed, 7 insertions(+), 18 deletions(-) diff --git a/p2p/cmd/main.go b/p2p/cmd/main.go index 31e97aace..373834243 100644 --- a/p2p/cmd/main.go +++ b/p2p/cmd/main.go @@ -297,19 +297,6 @@ var ( Category: categoryContracts, }) - optionDepositManagerImplAddr = altsrc.NewStringFlag(&cli.StringFlag{ - Name: "deposit-manager-contract", - Usage: "Address of the deposit manager implementation for bidders", - EnvVars: []string{"MEV_COMMIT_DEPOSIT_MANAGER_IMPL_ADDR"}, - Action: func(ctx *cli.Context, s string) error { - if s != "" && !common.IsHexAddress(s) { - return fmt.Errorf("invalid deposit manager implementation address: %s", s) - } - return nil - }, - Category: categoryContracts, - }) - optionEnableDepositManager = altsrc.NewBoolFlag(&cli.BoolFlag{ Name: "enable-deposit-manager", Usage: "Whether the deposit manager should be enabled", @@ -508,7 +495,6 @@ func main() { optionBlockTrackerAddr, optionValidatorRouterAddr, optionOracleAddr, - optionDepositManagerImplAddr, optionEnableDepositManager, optionSettlementRPCEndpoint, optionSettlementWSRPCEndpoint, @@ -686,7 +672,6 @@ func launchNodeWithConfig(c *cli.Context) (err error) { BidderRegistryContract: c.String(optionBidderRegistryAddr.Name), BlockTrackerContract: c.String(optionBlockTrackerAddr.Name), ValidatorRouterContract: c.String(optionValidatorRouterAddr.Name), - DepositManagerImplAddr: c.String(optionDepositManagerImplAddr.Name), EnableDepositManager: c.Bool(optionEnableDepositManager.Name), OracleContract: c.String(optionOracleAddr.Name), RPCEndpoint: c.String(optionSettlementRPCEndpoint.Name), diff --git a/p2p/pkg/node/node.go b/p2p/pkg/node/node.go index f47858ae5..2faaccabb 100644 --- a/p2p/pkg/node/node.go +++ b/p2p/pkg/node/node.go @@ -114,7 +114,6 @@ type Options struct { BidderRegistryContract string OracleContract string ValidatorRouterContract string - DepositManagerImplAddr string EnableDepositManager bool RPCEndpoint string WSRPCEndpoint string @@ -668,7 +667,12 @@ func NewNode(opts *Options) (*Node, error) { chainID, ) - if opts.DepositManagerImplAddr == "" { + depositManagerImplAddr, err := bidderRegistry.DepositManagerImpl(nil) + if err != nil { + opts.Logger.Error("failed to get deposit manager implementation address", "error", err) + return nil, err + } + if depositManagerImplAddr == (common.Address{}) { opts.Logger.Error("deposit manager implementation address is not set") return nil, errors.New("deposit manager implementation address is not set") } @@ -689,7 +693,7 @@ func NewNode(opts *Options) (*Node, error) { depositManagerContract, backend, topo, - common.HexToAddress(opts.DepositManagerImplAddr), + depositManagerImplAddr, ) bidderapiv1.RegisterBidderServer(grpcServer, bidderAPI) From 61d15abbd9d1c8520f5266059cb2eb0a682637d7 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 20 Aug 2025 14:28:49 -0700 Subject: [PATCH 078/117] rm unneeded window related logic --- contracts-abi/abi/BlockTracker.abi | 26 -------- .../clients/BlockTracker/BlockTracker.go | 64 +------------------ contracts/contracts/core/BlockTracker.sol | 20 +----- .../contracts/interfaces/IBlockTracker.sol | 8 --- .../contracts/utils/WindowFromBlockNumber.sol | 32 ---------- contracts/test/core/BidderRegistryTest.sol | 1 - contracts/test/core/OracleTest.sol | 17 ++--- contracts/test/core/PreconfManagerTest.sol | 1 - p2p/pkg/node/node.go | 17 ----- p2p/pkg/rpc/bidder/service.go | 3 - p2p/pkg/rpc/bidder/service_test.go | 12 ---- 11 files changed, 6 insertions(+), 195 deletions(-) delete mode 100644 contracts/contracts/utils/WindowFromBlockNumber.sol diff --git a/contracts-abi/abi/BlockTracker.abi b/contracts-abi/abi/BlockTracker.abi index b91e3c2f7..ce495a334 100644 --- a/contracts-abi/abi/BlockTracker.abi +++ b/contracts-abi/abi/BlockTracker.abi @@ -120,19 +120,6 @@ ], "stateMutability": "view" }, - { - "type": "function", - "name": "getBlocksPerWindow", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "pure" - }, { "type": "function", "name": "getBuilder", @@ -152,19 +139,6 @@ ], "stateMutability": "view" }, - { - "type": "function", - "name": "getCurrentWindow", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, { "type": "function", "name": "initialize", diff --git a/contracts-abi/clients/BlockTracker/BlockTracker.go b/contracts-abi/clients/BlockTracker/BlockTracker.go index 4f44ccc52..ad5b4cbba 100644 --- a/contracts-abi/clients/BlockTracker/BlockTracker.go +++ b/contracts-abi/clients/BlockTracker/BlockTracker.go @@ -31,7 +31,7 @@ var ( // BlocktrackerMetaData contains all meta data concerning the Blocktracker contract. var BlocktrackerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addBuilderAddress\",\"inputs\":[{\"name\":\"builderName\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"builderAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"blockBuilderNameToAddress\",\"inputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"blockWinners\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentWindow\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBlockWinner\",\"inputs\":[{\"name\":\"blockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBlocksPerWindow\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getBuilder\",\"inputs\":[{\"name\":\"builderNameGraffiti\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentWindow\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"oracleAccount_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"owner_\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"oracleAccount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"providerRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIProviderRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordL1Block\",\"inputs\":[{\"name\":\"_blockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_winnerBLSKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOracleAccount\",\"inputs\":[{\"name\":\"newOracleAccount\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setProviderRegistry\",\"inputs\":[{\"name\":\"newProviderRegistry\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"BuilderAddressAdded\",\"inputs\":[{\"name\":\"builderName\",\"type\":\"string\",\"indexed\":true,\"internalType\":\"string\"},{\"name\":\"builderAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewL1Block\",\"inputs\":[{\"name\":\"blockNumber\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"winner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"window\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewWindow\",\"inputs\":[{\"name\":\"window\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OracleAccountSet\",\"inputs\":[{\"name\":\"oldOracleAccount\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOracleAccount\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"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\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProviderRegistrySet\",\"inputs\":[{\"name\":\"oldProviderRegistry\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newProviderRegistry\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"BlockNumberIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpectedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidFallback\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidReceive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotOracleAccount\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"oracleAccount\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addBuilderAddress\",\"inputs\":[{\"name\":\"builderName\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"builderAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"blockBuilderNameToAddress\",\"inputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"blockWinners\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentWindow\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBlockWinner\",\"inputs\":[{\"name\":\"blockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBuilder\",\"inputs\":[{\"name\":\"builderNameGraffiti\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"oracleAccount_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"owner_\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"oracleAccount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"providerRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIProviderRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordL1Block\",\"inputs\":[{\"name\":\"_blockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_winnerBLSKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOracleAccount\",\"inputs\":[{\"name\":\"newOracleAccount\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setProviderRegistry\",\"inputs\":[{\"name\":\"newProviderRegistry\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"BuilderAddressAdded\",\"inputs\":[{\"name\":\"builderName\",\"type\":\"string\",\"indexed\":true,\"internalType\":\"string\"},{\"name\":\"builderAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewL1Block\",\"inputs\":[{\"name\":\"blockNumber\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"winner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"window\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewWindow\",\"inputs\":[{\"name\":\"window\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OracleAccountSet\",\"inputs\":[{\"name\":\"oldOracleAccount\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOracleAccount\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"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\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProviderRegistrySet\",\"inputs\":[{\"name\":\"oldProviderRegistry\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newProviderRegistry\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"BlockNumberIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpectedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidFallback\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidReceive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotOracleAccount\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"oracleAccount\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", } // BlocktrackerABI is the input ABI used to generate the binding from. @@ -335,37 +335,6 @@ func (_Blocktracker *BlocktrackerCallerSession) GetBlockWinner(blockNumber *big. return _Blocktracker.Contract.GetBlockWinner(&_Blocktracker.CallOpts, blockNumber) } -// GetBlocksPerWindow is a free data retrieval call binding the contract method 0x8711a019. -// -// Solidity: function getBlocksPerWindow() pure returns(uint256) -func (_Blocktracker *BlocktrackerCaller) GetBlocksPerWindow(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _Blocktracker.contract.Call(opts, &out, "getBlocksPerWindow") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetBlocksPerWindow is a free data retrieval call binding the contract method 0x8711a019. -// -// Solidity: function getBlocksPerWindow() pure returns(uint256) -func (_Blocktracker *BlocktrackerSession) GetBlocksPerWindow() (*big.Int, error) { - return _Blocktracker.Contract.GetBlocksPerWindow(&_Blocktracker.CallOpts) -} - -// GetBlocksPerWindow is a free data retrieval call binding the contract method 0x8711a019. -// -// Solidity: function getBlocksPerWindow() pure returns(uint256) -func (_Blocktracker *BlocktrackerCallerSession) GetBlocksPerWindow() (*big.Int, error) { - return _Blocktracker.Contract.GetBlocksPerWindow(&_Blocktracker.CallOpts) -} - // GetBuilder is a free data retrieval call binding the contract method 0x237ba8fb. // // Solidity: function getBuilder(string builderNameGraffiti) view returns(address) @@ -397,37 +366,6 @@ func (_Blocktracker *BlocktrackerCallerSession) GetBuilder(builderNameGraffiti s return _Blocktracker.Contract.GetBuilder(&_Blocktracker.CallOpts, builderNameGraffiti) } -// GetCurrentWindow is a free data retrieval call binding the contract method 0x0f67e7d5. -// -// Solidity: function getCurrentWindow() view returns(uint256) -func (_Blocktracker *BlocktrackerCaller) GetCurrentWindow(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _Blocktracker.contract.Call(opts, &out, "getCurrentWindow") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetCurrentWindow is a free data retrieval call binding the contract method 0x0f67e7d5. -// -// Solidity: function getCurrentWindow() view returns(uint256) -func (_Blocktracker *BlocktrackerSession) GetCurrentWindow() (*big.Int, error) { - return _Blocktracker.Contract.GetCurrentWindow(&_Blocktracker.CallOpts) -} - -// GetCurrentWindow is a free data retrieval call binding the contract method 0x0f67e7d5. -// -// Solidity: function getCurrentWindow() view returns(uint256) -func (_Blocktracker *BlocktrackerCallerSession) GetCurrentWindow() (*big.Int, error) { - return _Blocktracker.Contract.GetCurrentWindow(&_Blocktracker.CallOpts) -} - // OracleAccount is a free data retrieval call binding the contract method 0xe7c59736. // // Solidity: function oracleAccount() view returns(address) diff --git a/contracts/contracts/core/BlockTracker.sol b/contracts/contracts/core/BlockTracker.sol index b555732e9..5a8a3177e 100644 --- a/contracts/contracts/core/BlockTracker.sol +++ b/contracts/contracts/core/BlockTracker.sol @@ -9,7 +9,6 @@ import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/U import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; import {IBlockTracker} from "../interfaces/IBlockTracker.sol"; import {Errors} from "../utils/Errors.sol"; -import {WindowFromBlockNumber} from "../utils/WindowFromBlockNumber.sol"; /** * @title BlockTracker @@ -81,7 +80,7 @@ contract BlockTracker is IBlockTracker, BlockTrackerStorage, ) external onlyOracle whenNotPaused { address _winner = providerRegistry.getEoaFromBLSKey(_winnerBLSKey); _recordBlockWinner(_blockNumber, _winner); - uint256 newWindow = (_blockNumber - 1) / WindowFromBlockNumber.BLOCKS_PER_WINDOW + 1; + uint256 newWindow = (_blockNumber - 1) / 10 + 1; if (newWindow > currentWindow) { // We've entered a new window currentWindow = newWindow; @@ -111,15 +110,6 @@ contract BlockTracker is IBlockTracker, BlockTrackerStorage, _unpause(); } - /** - * @dev Retrieves the current window number. - * @return currentWindow The current window number. - */ - // TODO: Remove this and related. - function getCurrentWindow() external view returns (uint256) { - return currentWindow; - } - /** * @dev Function to get the winner of a specific block. * @param blockNumber The number of the block. @@ -140,14 +130,6 @@ contract BlockTracker is IBlockTracker, BlockTrackerStorage, return blockBuilderNameToAddress[builderNameGraffiti]; } - /** - * @dev Returns the number of blocks per window. - * @return The number of blocks per window. - */ - function getBlocksPerWindow() external pure returns (uint256) { - return WindowFromBlockNumber.BLOCKS_PER_WINDOW; - } - /** * @dev Internal function to set the oracle account. * @param newOracleAccount The new address of the oracle account. diff --git a/contracts/contracts/interfaces/IBlockTracker.sol b/contracts/contracts/interfaces/IBlockTracker.sol index d03457075..3b315a031 100644 --- a/contracts/contracts/interfaces/IBlockTracker.sol +++ b/contracts/contracts/interfaces/IBlockTracker.sol @@ -42,16 +42,8 @@ interface IBlockTracker { /// @return The Ethereum address of the builder. function getBuilder(string calldata builderNameGrafiti) external view returns (address); - /// @notice Gets the current window number. - /// @return The current window number. - function getCurrentWindow() external view returns (uint256); - /// @notice Retrieves the winner of a specific L1 block. /// @param _blockNumber The block number of the L1 block. /// @return The address of the winner of the L1 block. function getBlockWinner(uint256 _blockNumber) external view returns (address); - - /// @notice Retrieves the number of blocks per window. - /// @return The number of blocks per window. - function getBlocksPerWindow() external pure returns (uint256); } diff --git a/contracts/contracts/utils/WindowFromBlockNumber.sol b/contracts/contracts/utils/WindowFromBlockNumber.sol deleted file mode 100644 index f165a93f1..000000000 --- a/contracts/contracts/utils/WindowFromBlockNumber.sol +++ /dev/null @@ -1,32 +0,0 @@ -// SPDX-License-Identifier: BSL 1.1 -pragma solidity 0.8.26; - -/** - * @title WindowFromBlockNumber - * @dev A library that calculates the window number for a given block number. - */ -library WindowFromBlockNumber { - - /// @dev The number of blocks per window. - uint256 public constant BLOCKS_PER_WINDOW = 10; - - /** - * @dev Retrieves the window number for a given block number. - * @param blockNumber The block number. - * @return The window number. - */ - function getWindowFromBlockNumber(uint256 blockNumber) internal pure returns (uint256) { - return (blockNumber - 1) / BLOCKS_PER_WINDOW + 1; - } - - /** - * @dev Retrieves the start and end block numbers for a given window. - * @param window The window number. - * @return startBlock The starting block number of the window. - * @return endBlock The ending block number of the window. - */ - function getBlockNumbersFromWindow(uint256 window) internal pure returns (uint256 startBlock, uint256 endBlock) { - startBlock = (window - 1) * BLOCKS_PER_WINDOW + 1; - endBlock = window * BLOCKS_PER_WINDOW; - } -} \ No newline at end of file diff --git a/contracts/test/core/BidderRegistryTest.sol b/contracts/test/core/BidderRegistryTest.sol index f41e9526b..ee95ce377 100644 --- a/contracts/test/core/BidderRegistryTest.sol +++ b/contracts/test/core/BidderRegistryTest.sol @@ -6,7 +6,6 @@ import {BidderRegistry} from "../../contracts/core/BidderRegistry.sol"; import {BlockTracker} from "../../contracts/core/BlockTracker.sol"; import {IBidderRegistry} from "../../contracts/interfaces/IBidderRegistry.sol"; import {Upgrades} from "openzeppelin-foundry-upgrades/Upgrades.sol"; -import {WindowFromBlockNumber} from "../../contracts/utils/WindowFromBlockNumber.sol"; import {ProviderRegistry} from "../../contracts/core/ProviderRegistry.sol"; import {DepositManager} from "../../contracts/core/DepositManager.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; diff --git a/contracts/test/core/OracleTest.sol b/contracts/test/core/OracleTest.sol index 7296df7b4..259c7a7ba 100644 --- a/contracts/test/core/OracleTest.sol +++ b/contracts/test/core/OracleTest.sol @@ -8,7 +8,6 @@ import {ProviderRegistry} from "../../contracts/core/ProviderRegistry.sol"; import {BidderRegistry} from "../../contracts/core/BidderRegistry.sol"; import {BlockTracker} from "../../contracts/core/BlockTracker.sol"; import {Upgrades} from "openzeppelin-foundry-upgrades/Upgrades.sol"; -import {WindowFromBlockNumber} from "../../contracts/utils/WindowFromBlockNumber.sol"; import {ECDSA} from "@openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol"; import {MockBLSVerify} from "../precompiles/BLSVerifyPreCompileMockTest.sol"; import {IPreconfManager} from "../../contracts/interfaces/IPreconfManager.sol"; @@ -208,9 +207,7 @@ contract OracleTest is Test { memory txn = "0x6d9c53ad81249775f8c082b11ac293b2e19194ff791bd1c4fd37683310e90d08"; string memory revertingTxHashes = "0x6d9c53ad81249775f8c082b11ac293b2e19194ff791bd1c4fd37683310e90d12"; - uint64 blockNumber = uint64( - WindowFromBlockNumber.BLOCKS_PER_WINDOW + 2 - ); + uint64 blockNumber = 12; uint64 bid = 2; uint256 slashAmt = 0; (address bidder, uint256 bidderPk) = makeAddrAndKey("alice"); @@ -266,9 +263,7 @@ contract OracleTest is Test { memory txn = "0x6d9c53ad81249775f8c082b11ac293b2e19194ff791bd1c4fd37683310e90d08"; string memory revertingTxHashes = "0x6d9c53ad81249775f8c082b11ac293b2e19194ff791bd1c4fd37683310e90d12"; - uint64 blockNumber = uint64( - WindowFromBlockNumber.BLOCKS_PER_WINDOW + 2 - ); + uint64 blockNumber = 12; uint64 bid = 200; uint256 slashAmt = 0; (address bidder, uint256 bidderPk) = makeAddrAndKey("alice"); @@ -330,9 +325,7 @@ contract OracleTest is Test { memory txn2 = "0x6d9c53ad81249775f8c082b11ac293b2e19194ff791bd1c4fd37683310e90d09"; string memory revertingTxHashes = "0x6d9c53ad81249775f8c082b11ac293b2e19194ff791bd1c4fd37683310e90d12"; - uint64 blockNumber = uint64( - WindowFromBlockNumber.BLOCKS_PER_WINDOW + 2 - ); + uint64 blockNumber = 12; uint64 bid = 100; uint256 slashAmt = 0; (address bidder, uint256 bidderPk) = makeAddrAndKey("alice"); @@ -569,9 +562,7 @@ contract OracleTest is Test { ] = "0x6d9c53ad81249775f8c082b11ac293b2e19194ff791bd1c4fd37683310e90d11"; string memory revertingTxHashes = "0x6d9c53ad81249775f8c082b11ac293b2e19194ff791bd1c4fd37683310e90d12"; - uint64 blockNumber = uint64( - WindowFromBlockNumber.BLOCKS_PER_WINDOW + 2 - ); + uint64 blockNumber = 12; uint64 bid = 5; uint256 slashAmt = 0; (address bidder, uint256 bidderPk) = makeAddrAndKey("alice"); diff --git a/contracts/test/core/PreconfManagerTest.sol b/contracts/test/core/PreconfManagerTest.sol index 0ca0c5a5e..357506295 100644 --- a/contracts/test/core/PreconfManagerTest.sol +++ b/contracts/test/core/PreconfManagerTest.sol @@ -8,7 +8,6 @@ import {ProviderRegistry} from "../../contracts/core/ProviderRegistry.sol"; import {BidderRegistry} from "../../contracts/core/BidderRegistry.sol"; import {BlockTracker} from "../../contracts/core/BlockTracker.sol"; import {Upgrades} from "openzeppelin-foundry-upgrades/Upgrades.sol"; -import {WindowFromBlockNumber} from "../../contracts/utils/WindowFromBlockNumber.sol"; import {IProviderRegistry} from "../../contracts/interfaces/IProviderRegistry.sol"; import {MockBLSVerify} from "../precompiles/BLSVerifyPreCompileMockTest.sol"; import {DepositManager} from "../../contracts/core/DepositManager.sol"; diff --git a/p2p/pkg/node/node.go b/p2p/pkg/node/node.go index 2faaccabb..f08ff4810 100644 --- a/p2p/pkg/node/node.go +++ b/p2p/pkg/node/node.go @@ -445,22 +445,6 @@ func NewNode(opts *Options) (*Node, error) { depositMgr preconfirmation.DepositManager = noOpDepositManager{} ) - blockTrackerCaller, err := blocktracker.NewBlocktrackerCaller( - common.HexToAddress(opts.BlockTrackerContract), - contractRPC, - ) - if err != nil { - opts.Logger.Error("failed to instantiate block tracker contract", "error", err) - return nil, err - } - - blockTrackerSession := &blocktracker.BlocktrackerCallerSession{ - Contract: blockTrackerCaller, - CallOpts: bind.CallOpts{ - From: opts.KeySigner.GetAddress(), - }, - } - commitmentDA, err := preconf.NewPreconfmanager( common.HexToAddress(opts.PreconfContract), backend, @@ -681,7 +665,6 @@ func NewNode(opts *Options) (*Node, error) { opts.KeySigner.GetAddress(), preconfProto, bidderRegistry, - blockTrackerSession, providerRegistry, validator, monitor, diff --git a/p2p/pkg/rpc/bidder/service.go b/p2p/pkg/rpc/bidder/service.go index 536b7c567..1ba72c979 100644 --- a/p2p/pkg/rpc/bidder/service.go +++ b/p2p/pkg/rpc/bidder/service.go @@ -32,7 +32,6 @@ type Service struct { sender PreconfSender registryContract BidderRegistryContract providerRegistry ProviderRegistryContract - blockTrackerContract BlockTrackerContract watcher TxWatcher optsGetter OptsGetter cs CommitmentStore @@ -51,7 +50,6 @@ func NewService( owner common.Address, sender PreconfSender, registryContract BidderRegistryContract, - blockTrackerContract BlockTrackerContract, providerRegistry ProviderRegistryContract, validator *protovalidate.Validator, watcher TxWatcher, @@ -69,7 +67,6 @@ func NewService( owner: owner, sender: sender, registryContract: registryContract, - blockTrackerContract: blockTrackerContract, providerRegistry: providerRegistry, cs: cs, watcher: watcher, diff --git a/p2p/pkg/rpc/bidder/service_test.go b/p2p/pkg/rpc/bidder/service_test.go index 6c62596e7..eb6fcd55a 100644 --- a/p2p/pkg/rpc/bidder/service_test.go +++ b/p2p/pkg/rpc/bidder/service_test.go @@ -181,16 +181,6 @@ func (t *testTxWatcher) WaitForReceipt(_ context.Context, tx *types.Transaction) }, nil } -type testBlockTrackerContract struct { - blockNumberToWinner map[uint64]common.Address - lastBlockNumber uint64 - blocksPerWindow uint64 -} - -func (btc *testBlockTrackerContract) GetCurrentWindow() (*big.Int, error) { - return big.NewInt(int64(btc.lastBlockNumber / btc.blocksPerWindow)), nil -} - type testStore struct { commitments []*preconfstore.Commitment } @@ -262,13 +252,11 @@ func startServerWithStore(t *testing.T, cs *testStore) bidderapiv1.BidderClient claim: big.NewInt(1000000000000000000), } sender := &testSender{noOfPreconfs: 2} - blockTrackerContract := &testBlockTrackerContract{lastBlockNumber: blocksPerWindow + 1, blocksPerWindow: blocksPerWindow, blockNumberToWinner: make(map[uint64]common.Address)} setCodeHelper := &testSetCodeHelper{} srvImpl := bidderapi.NewService( owner, sender, registryContract, - blockTrackerContract, providerRegistry, validator, watcher, From 9f342d0cf0564b245f5e5dd24f28322532353199 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 20 Aug 2025 14:47:14 -0700 Subject: [PATCH 079/117] GetAllDeposits api --- p2p/gen/go/bidderapi/v1/bidderapi.pb.go | 1633 ++++++++++------- p2p/gen/go/bidderapi/v1/bidderapi.pb.gw.go | 60 + p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go | 46 + .../bidderapi/v1/bidderapi.swagger.yaml | 35 + p2p/pkg/node/node.go | 2 +- p2p/pkg/rpc/bidder/service.go | 47 + p2p/pkg/rpc/bidder/service_test.go | 4 + p2p/rpc/bidderapi/v1/bidderapi.proto | 33 + 8 files changed, 1152 insertions(+), 708 deletions(-) diff --git a/p2p/gen/go/bidderapi/v1/bidderapi.pb.go b/p2p/gen/go/bidderapi/v1/bidderapi.pb.go index 05e677511..2cc09d771 100644 --- a/p2p/gen/go/bidderapi/v1/bidderapi.pb.go +++ b/p2p/gen/go/bidderapi/v1/bidderapi.pb.go @@ -664,6 +664,154 @@ func (x *GetDepositRequest) GetProvider() string { return "" } +type GetAllDepositsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *GetAllDepositsRequest) Reset() { + *x = GetAllDepositsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetAllDepositsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetAllDepositsRequest) ProtoMessage() {} + +func (x *GetAllDepositsRequest) ProtoReflect() protoreflect.Message { + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetAllDepositsRequest.ProtoReflect.Descriptor instead. +func (*GetAllDepositsRequest) Descriptor() ([]byte, []int) { + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{13} +} + +type DepositInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Provider string `protobuf:"bytes,1,opt,name=provider,proto3" json:"provider,omitempty"` + Amount string `protobuf:"bytes,2,opt,name=amount,proto3" json:"amount,omitempty"` +} + +func (x *DepositInfo) Reset() { + *x = DepositInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DepositInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DepositInfo) ProtoMessage() {} + +func (x *DepositInfo) ProtoReflect() protoreflect.Message { + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DepositInfo.ProtoReflect.Descriptor instead. +func (*DepositInfo) Descriptor() ([]byte, []int) { + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{14} +} + +func (x *DepositInfo) GetProvider() string { + if x != nil { + return x.Provider + } + return "" +} + +func (x *DepositInfo) GetAmount() string { + if x != nil { + return x.Amount + } + return "" +} + +type GetAllDepositsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Deposits []*DepositInfo `protobuf:"bytes,1,rep,name=deposits,proto3" json:"deposits,omitempty"` + BidderBalance string `protobuf:"bytes,2,opt,name=bidder_balance,json=bidderBalance,proto3" json:"bidder_balance,omitempty"` +} + +func (x *GetAllDepositsResponse) Reset() { + *x = GetAllDepositsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetAllDepositsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetAllDepositsResponse) ProtoMessage() {} + +func (x *GetAllDepositsResponse) ProtoReflect() protoreflect.Message { + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetAllDepositsResponse.ProtoReflect.Descriptor instead. +func (*GetAllDepositsResponse) Descriptor() ([]byte, []int) { + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{15} +} + +func (x *GetAllDepositsResponse) GetDeposits() []*DepositInfo { + if x != nil { + return x.Deposits + } + return nil +} + +func (x *GetAllDepositsResponse) GetBidderBalance() string { + if x != nil { + return x.BidderBalance + } + return "" +} + type RequestWithdrawalsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -675,7 +823,7 @@ type RequestWithdrawalsRequest struct { func (x *RequestWithdrawalsRequest) Reset() { *x = RequestWithdrawalsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[13] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -688,7 +836,7 @@ func (x *RequestWithdrawalsRequest) String() string { func (*RequestWithdrawalsRequest) ProtoMessage() {} func (x *RequestWithdrawalsRequest) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[13] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -701,7 +849,7 @@ func (x *RequestWithdrawalsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RequestWithdrawalsRequest.ProtoReflect.Descriptor instead. func (*RequestWithdrawalsRequest) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{13} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{16} } func (x *RequestWithdrawalsRequest) GetProviders() []string { @@ -723,7 +871,7 @@ type RequestWithdrawalsResponse struct { func (x *RequestWithdrawalsResponse) Reset() { *x = RequestWithdrawalsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[14] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -736,7 +884,7 @@ func (x *RequestWithdrawalsResponse) String() string { func (*RequestWithdrawalsResponse) ProtoMessage() {} func (x *RequestWithdrawalsResponse) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[14] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -749,7 +897,7 @@ func (x *RequestWithdrawalsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RequestWithdrawalsResponse.ProtoReflect.Descriptor instead. func (*RequestWithdrawalsResponse) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{14} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{17} } func (x *RequestWithdrawalsResponse) GetProviders() []string { @@ -777,7 +925,7 @@ type WithdrawRequest struct { func (x *WithdrawRequest) Reset() { *x = WithdrawRequest{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[15] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -790,7 +938,7 @@ func (x *WithdrawRequest) String() string { func (*WithdrawRequest) ProtoMessage() {} func (x *WithdrawRequest) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[15] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -803,7 +951,7 @@ func (x *WithdrawRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WithdrawRequest.ProtoReflect.Descriptor instead. func (*WithdrawRequest) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{15} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{18} } func (x *WithdrawRequest) GetProviders() []string { @@ -825,7 +973,7 @@ type WithdrawResponse struct { func (x *WithdrawResponse) Reset() { *x = WithdrawResponse{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[16] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -838,7 +986,7 @@ func (x *WithdrawResponse) String() string { func (*WithdrawResponse) ProtoMessage() {} func (x *WithdrawResponse) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[16] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -851,7 +999,7 @@ func (x *WithdrawResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WithdrawResponse.ProtoReflect.Descriptor instead. func (*WithdrawResponse) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{16} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{19} } func (x *WithdrawResponse) GetAmounts() []string { @@ -877,7 +1025,7 @@ type GetValidProvidersRequest struct { func (x *GetValidProvidersRequest) Reset() { *x = GetValidProvidersRequest{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[17] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -890,7 +1038,7 @@ func (x *GetValidProvidersRequest) String() string { func (*GetValidProvidersRequest) ProtoMessage() {} func (x *GetValidProvidersRequest) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[17] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -903,7 +1051,7 @@ func (x *GetValidProvidersRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetValidProvidersRequest.ProtoReflect.Descriptor instead. func (*GetValidProvidersRequest) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{17} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{20} } type GetValidProvidersResponse struct { @@ -917,7 +1065,7 @@ type GetValidProvidersResponse struct { func (x *GetValidProvidersResponse) Reset() { *x = GetValidProvidersResponse{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[18] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -930,7 +1078,7 @@ func (x *GetValidProvidersResponse) String() string { func (*GetValidProvidersResponse) ProtoMessage() {} func (x *GetValidProvidersResponse) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[18] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -943,7 +1091,7 @@ func (x *GetValidProvidersResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetValidProvidersResponse.ProtoReflect.Descriptor instead. func (*GetValidProvidersResponse) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{18} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{21} } func (x *GetValidProvidersResponse) GetValidProviders() []string { @@ -971,7 +1119,7 @@ type Bid struct { func (x *Bid) Reset() { *x = Bid{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[19] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -984,7 +1132,7 @@ func (x *Bid) String() string { func (*Bid) ProtoMessage() {} func (x *Bid) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[19] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -997,7 +1145,7 @@ func (x *Bid) ProtoReflect() protoreflect.Message { // Deprecated: Use Bid.ProtoReflect.Descriptor instead. func (*Bid) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{19} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{22} } func (x *Bid) GetTxHashes() []string { @@ -1079,7 +1227,7 @@ type Commitment struct { func (x *Commitment) Reset() { *x = Commitment{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[20] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1092,7 +1240,7 @@ func (x *Commitment) String() string { func (*Commitment) ProtoMessage() {} func (x *Commitment) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[20] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1105,7 +1253,7 @@ func (x *Commitment) ProtoReflect() protoreflect.Message { // Deprecated: Use Commitment.ProtoReflect.Descriptor instead. func (*Commitment) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{20} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{23} } func (x *Commitment) GetTxHashes() []string { @@ -1212,7 +1360,7 @@ type GetBidInfoRequest struct { func (x *GetBidInfoRequest) Reset() { *x = GetBidInfoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[21] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1225,7 +1373,7 @@ func (x *GetBidInfoRequest) String() string { func (*GetBidInfoRequest) ProtoMessage() {} func (x *GetBidInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[21] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1238,7 +1386,7 @@ func (x *GetBidInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBidInfoRequest.ProtoReflect.Descriptor instead. func (*GetBidInfoRequest) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{21} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{24} } func (x *GetBidInfoRequest) GetBlockNumber() int64 { @@ -1273,7 +1421,7 @@ type GetBidInfoResponse struct { func (x *GetBidInfoResponse) Reset() { *x = GetBidInfoResponse{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[22] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1286,7 +1434,7 @@ func (x *GetBidInfoResponse) String() string { func (*GetBidInfoResponse) ProtoMessage() {} func (x *GetBidInfoResponse) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[22] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1299,7 +1447,7 @@ func (x *GetBidInfoResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBidInfoResponse.ProtoReflect.Descriptor instead. func (*GetBidInfoResponse) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{22} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{25} } func (x *GetBidInfoResponse) GetBlockBidInfo() []*GetBidInfoResponse_BlockBidInfo { @@ -1325,7 +1473,7 @@ type GetBidInfoResponse_CommitmentWithStatus struct { func (x *GetBidInfoResponse_CommitmentWithStatus) Reset() { *x = GetBidInfoResponse_CommitmentWithStatus{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[23] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1338,7 +1486,7 @@ func (x *GetBidInfoResponse_CommitmentWithStatus) String() string { func (*GetBidInfoResponse_CommitmentWithStatus) ProtoMessage() {} func (x *GetBidInfoResponse_CommitmentWithStatus) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[23] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1351,7 +1499,7 @@ func (x *GetBidInfoResponse_CommitmentWithStatus) ProtoReflect() protoreflect.Me // Deprecated: Use GetBidInfoResponse_CommitmentWithStatus.ProtoReflect.Descriptor instead. func (*GetBidInfoResponse_CommitmentWithStatus) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{22, 0} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{25, 0} } func (x *GetBidInfoResponse_CommitmentWithStatus) GetProviderAddress() string { @@ -1415,7 +1563,7 @@ type GetBidInfoResponse_BidInfo struct { func (x *GetBidInfoResponse_BidInfo) Reset() { *x = GetBidInfoResponse_BidInfo{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[24] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1428,7 +1576,7 @@ func (x *GetBidInfoResponse_BidInfo) String() string { func (*GetBidInfoResponse_BidInfo) ProtoMessage() {} func (x *GetBidInfoResponse_BidInfo) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[24] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1441,7 +1589,7 @@ func (x *GetBidInfoResponse_BidInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBidInfoResponse_BidInfo.ProtoReflect.Descriptor instead. func (*GetBidInfoResponse_BidInfo) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{22, 1} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{25, 1} } func (x *GetBidInfoResponse_BidInfo) GetTxnHashes() []string { @@ -1519,7 +1667,7 @@ type GetBidInfoResponse_BlockBidInfo struct { func (x *GetBidInfoResponse_BlockBidInfo) Reset() { *x = GetBidInfoResponse_BlockBidInfo{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[25] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1532,7 +1680,7 @@ func (x *GetBidInfoResponse_BlockBidInfo) String() string { func (*GetBidInfoResponse_BlockBidInfo) ProtoMessage() {} func (x *GetBidInfoResponse_BlockBidInfo) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[25] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1545,7 +1693,7 @@ func (x *GetBidInfoResponse_BlockBidInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBidInfoResponse_BlockBidInfo.ProtoReflect.Descriptor instead. func (*GetBidInfoResponse_BlockBidInfo) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{22, 2} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{25, 2} } func (x *GetBidInfoResponse_BlockBidInfo) GetBlockNumber() int64 { @@ -1748,429 +1896,111 @@ var file_bidderapi_v1_bidderapi_proto_rawDesc = []byte{ 0x65, 0x75, 0x6d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x1a, 0x26, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x34, 0x30, - 0x7d, 0x24, 0x27, 0x29, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0xa3, - 0x02, 0x0a, 0x19, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, - 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0xbb, 0x01, 0x0a, - 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x42, 0x9c, 0x01, 0x92, 0x41, 0x1e, 0x32, 0x1c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x7d, 0x24, 0x27, 0x29, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x4f, + 0x0a, 0x15, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x3a, 0x36, 0x92, 0x41, 0x33, 0x0a, 0x31, 0x2a, 0x16, + 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0x17, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x44, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x22, + 0x41, 0x0a, 0x0b, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, + 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x22, 0xb0, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x44, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, + 0x08, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x64, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x5f, 0x62, + 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x62, 0x69, + 0x64, 0x64, 0x65, 0x72, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x3a, 0x38, 0x92, 0x41, 0x35, + 0x0a, 0x33, 0x2a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x18, 0x47, 0x65, 0x74, + 0x41, 0x6c, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x22, 0xa3, 0x02, 0x0a, 0x19, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0xbb, 0x01, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x9c, 0x01, 0x92, 0x41, 0x1e, 0x32, 0x1c, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, + 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2e, 0xba, 0x48, 0x78, 0xba, 0x01, + 0x75, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x36, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, + 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x65, 0x73, 0x2e, 0xba, 0x48, 0x78, 0xba, 0x01, 0x75, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x36, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, - 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, - 0x75, 0x6d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2e, 0x1a, 0x30, 0x74, - 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, 0x2e, 0x6d, 0x61, 0x74, - 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, - 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x34, 0x30, 0x7d, 0x24, 0x27, 0x29, 0x29, 0x52, - 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x3a, 0x48, 0x92, 0x41, 0x45, 0x0a, - 0x43, 0x2a, 0x1a, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, - 0x61, 0x77, 0x61, 0x6c, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0x25, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, - 0x6c, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x28, 0x73, 0x29, 0x2e, 0x22, 0x85, 0x02, 0x0a, 0x1a, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x07, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x3a, 0xae, 0x01, 0x92, 0x41, - 0xaa, 0x01, 0x0a, 0xa7, 0x01, 0x2a, 0x1b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, - 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x32, 0x25, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, - 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x28, 0x73, 0x29, 0x2e, 0x4a, 0x61, 0x7b, 0x22, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x30, 0x78, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x73, 0x65, 0x73, 0x2e, 0x1a, 0x30, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, + 0x2c, 0x20, 0x72, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, + 0x78, 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x34, + 0x30, 0x7d, 0x24, 0x27, 0x29, 0x29, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x73, 0x3a, 0x48, 0x92, 0x41, 0x45, 0x0a, 0x43, 0x2a, 0x1a, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x20, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x32, 0x25, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x77, 0x69, + 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x28, 0x73, 0x29, 0x2e, 0x22, 0x85, 0x02, 0x0a, 0x1a, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, + 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x3a, 0xae, 0x01, 0x92, 0x41, 0xaa, 0x01, 0x0a, 0xa7, 0x01, 0x2a, 0x1b, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, + 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x25, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x20, 0x66, + 0x72, 0x6f, 0x6d, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x28, 0x73, 0x29, 0x2e, + 0x4a, 0x61, 0x7b, 0x22, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, + 0x5b, 0x22, 0x30, 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x5d, 0x2c, 0x20, 0x22, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x5d, 0x7d, 0x22, 0x8d, 0x02, 0x0a, - 0x0f, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0xbb, 0x01, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x09, 0x42, 0x9c, 0x01, 0x92, 0x41, 0x1e, 0x32, 0x1c, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x20, 0x61, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2e, 0xba, 0x48, 0x78, 0xba, 0x01, 0x75, 0x0a, 0x09, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x36, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x74, - 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, - 0x2e, 0x1a, 0x30, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, - 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, - 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x34, 0x30, 0x7d, 0x24, - 0x27, 0x29, 0x29, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x3a, 0x3c, - 0x92, 0x41, 0x39, 0x0a, 0x37, 0x2a, 0x10, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x20, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0x23, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, - 0x77, 0x20, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x28, 0x73, 0x29, 0x2e, 0x22, 0xf6, 0x01, 0x0a, - 0x10, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x07, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x3a, 0xa9, 0x01, 0x92, 0x41, 0xa5, 0x01, - 0x0a, 0x40, 0x2a, 0x11, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x20, 0x72, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x2b, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x6e, - 0x20, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, - 0x79, 0x2e, 0x32, 0x61, 0x7b, 0x22, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x22, 0x3a, 0x20, - 0x5b, 0x22, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x5d, 0x2c, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x30, 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x5d, 0x2c, 0x20, + 0x22, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x22, 0x5d, 0x7d, 0x22, 0x8d, 0x02, 0x0a, 0x0f, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0xbb, 0x01, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x9c, 0x01, 0x92, 0x41, + 0x1e, 0x32, 0x1c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x45, 0x74, 0x68, 0x65, + 0x72, 0x65, 0x75, 0x6d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2e, 0xba, + 0x48, 0x78, 0xba, 0x01, 0x75, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, + 0x12, 0x36, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, + 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72, 0x72, 0x61, + 0x79, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x20, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2e, 0x1a, 0x30, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, + 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, + 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, + 0x39, 0x5d, 0x7b, 0x34, 0x30, 0x7d, 0x24, 0x27, 0x29, 0x29, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x73, 0x3a, 0x3c, 0x92, 0x41, 0x39, 0x0a, 0x37, 0x2a, 0x10, 0x57, 0x69, + 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0x23, + 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x20, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x28, + 0x73, 0x29, 0x2e, 0x22, 0xf6, 0x01, 0x0a, 0x10, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, + 0x3a, 0xa9, 0x01, 0x92, 0x41, 0xa5, 0x01, 0x0a, 0x40, 0x2a, 0x11, 0x57, 0x69, 0x74, 0x68, 0x64, + 0x72, 0x61, 0x77, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x2b, 0x57, 0x69, + 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x6e, 0x20, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, + 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0x32, 0x61, 0x7b, 0x22, 0x61, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x5d, 0x2c, 0x20, + 0x22, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x30, + 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x22, 0x5d, 0x7d, 0x22, 0x58, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x3a, 0x3c, 0x92, 0x41, 0x39, 0x0a, 0x37, 0x2a, 0x19, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x32, 0x1a, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x22, - 0x84, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, - 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x3a, 0x3e, 0x92, 0x41, 0x3b, 0x0a, 0x39, 0x2a, 0x1a, 0x47, - 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, - 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x1b, 0x47, 0x65, 0x74, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x20, 0x72, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x22, 0xf2, 0x13, 0x0a, 0x03, 0x42, 0x69, 0x64, 0x12, 0x94, - 0x02, 0x0a, 0x09, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x42, 0xf6, 0x01, 0x92, 0x41, 0x78, 0x32, 0x64, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, - 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, - 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, - 0x0f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, - 0xba, 0x48, 0x78, 0xba, 0x01, 0x75, 0x0a, 0x09, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, - 0x73, 0x12, 0x36, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x6d, 0x75, 0x73, - 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72, 0x72, - 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x2e, 0x1a, 0x30, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, - 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, - 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x24, 0x27, 0x29, 0x29, 0x52, 0x08, 0x74, 0x78, 0x48, - 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0xe0, 0x01, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0xc7, 0x01, 0x92, 0x41, 0x76, 0x32, 0x6b, 0x41, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x77, - 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x61, 0x79, 0x20, 0x74, 0x6f, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, 0x39, - 0x5d, 0x2b, 0xba, 0x48, 0x4b, 0xba, 0x01, 0x48, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x1f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, - 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, - 0x2e, 0x1a, 0x1d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, - 0x27, 0x5e, 0x5b, 0x31, 0x2d, 0x39, 0x5d, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2a, 0x24, 0x27, 0x29, - 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0xb9, 0x01, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, - 0x95, 0x01, 0x92, 0x41, 0x47, 0x32, 0x45, 0x4d, 0x61, 0x78, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, - 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x2e, 0xba, 0x48, 0x48, 0xba, - 0x01, 0x45, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x12, 0x25, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6d, - 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x69, - 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x0e, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x68, - 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x12, 0xc2, 0x01, 0x0a, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x03, 0x42, 0x8d, 0x01, 0x92, 0x41, 0x2d, 0x32, 0x2b, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x20, 0x64, 0x65, - 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0xba, 0x48, 0x5a, 0xba, 0x01, 0x57, 0x0a, 0x15, 0x64, - 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2e, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x6d, 0x75, 0x73, 0x74, - 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, - 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x0e, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, - 0x20, 0x3e, 0x20, 0x30, 0x52, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0xb8, 0x01, 0x0a, 0x13, 0x64, 0x65, - 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x42, 0x87, 0x01, 0x92, 0x41, 0x2b, 0x32, 0x29, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, - 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x64, - 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0xba, 0x48, 0x56, 0xba, 0x01, 0x53, 0x0a, 0x13, - 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x12, 0x2c, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, - 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, - 0x2e, 0x1a, 0x0e, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, - 0x30, 0x52, 0x11, 0x64, 0x65, 0x63, 0x61, 0x79, 0x45, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x12, 0x8f, 0x02, 0x0a, 0x13, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, - 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, - 0x28, 0x09, 0x42, 0xde, 0x01, 0x92, 0x41, 0x49, 0x32, 0x47, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x61, 0x6c, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x78, 0x20, 0x68, - 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, - 0x20, 0x6f, 0x72, 0x20, 0x62, 0x65, 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x65, 0x64, - 0x2e, 0xba, 0x48, 0x8e, 0x01, 0xba, 0x01, 0x8a, 0x01, 0x0a, 0x13, 0x72, 0x65, 0x76, 0x65, 0x72, - 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x41, - 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, - 0x68, 0x65, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x61, - 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, - 0x2e, 0x1a, 0x30, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, - 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, - 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x24, - 0x27, 0x29, 0x29, 0x52, 0x11, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x78, - 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0xa3, 0x02, 0x0a, 0x10, 0x72, 0x61, 0x77, 0x5f, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, - 0x09, 0x42, 0xf7, 0x01, 0x92, 0x41, 0x6e, 0x32, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, - 0x6c, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x52, 0x4c, 0x50, 0x20, 0x65, - 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x20, 0x72, 0x61, 0x77, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, - 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, - 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0xba, 0x48, 0x82, 0x01, 0xba, 0x01, 0x7f, 0x0a, 0x10, 0x72, 0x61, - 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, - 0x72, 0x61, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x72, 0x72, 0x61, - 0x79, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x72, 0x61, 0x77, 0x20, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x1a, 0x2d, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, 0x2e, 0x6d, 0x61, 0x74, 0x63, - 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, - 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x2a, 0x24, 0x27, 0x29, 0x29, 0x52, 0x0f, 0x72, 0x61, 0x77, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xbf, 0x02, 0x0a, - 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x9b, 0x02, 0x92, 0x41, 0x9f, 0x01, 0x32, 0x93, 0x01, 0x41, 0x6d, 0x6f, - 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, - 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x20, - 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x20, 0x74, - 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x7a, 0x65, - 0x72, 0x6f, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x65, 0x64, 0x20, - 0x62, 0x69, 0x64, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, - 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x2e, - 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0xba, 0x48, 0x75, 0xba, 0x01, 0x72, 0x0a, - 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x73, - 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6d, 0x75, 0x73, 0x74, - 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, - 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x27, - 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, - 0x73, 0x28, 0x27, 0x5e, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x24, 0x27, 0x29, 0x20, 0x26, 0x26, - 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x3d, 0x20, 0x30, - 0x29, 0x52, 0x0b, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0xba, - 0x04, 0x92, 0x41, 0xb6, 0x04, 0x0a, 0x95, 0x01, 0x2a, 0x0b, 0x42, 0x69, 0x64, 0x20, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x40, 0x55, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, - 0x62, 0x69, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, - 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x6d, 0x65, 0x76, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0xd2, 0x01, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0xd2, 0x01, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0xd2, - 0x01, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0xd2, 0x01, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, - 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x32, 0x9b, 0x03, - 0x7b, 0x22, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, - 0x66, 0x65, 0x34, 0x63, 0x62, 0x34, 0x37, 0x64, 0x62, 0x33, 0x36, 0x33, 0x30, 0x35, 0x35, 0x31, - 0x62, 0x65, 0x65, 0x64, 0x66, 0x62, 0x64, 0x30, 0x32, 0x61, 0x37, 0x31, 0x65, 0x63, 0x63, 0x36, - 0x39, 0x66, 0x64, 0x35, 0x39, 0x37, 0x35, 0x38, 0x65, 0x32, 0x62, 0x61, 0x36, 0x39, 0x39, 0x36, - 0x30, 0x36, 0x65, 0x32, 0x64, 0x35, 0x63, 0x37, 0x34, 0x32, 0x38, 0x34, 0x66, 0x66, 0x61, 0x37, - 0x22, 0x2c, 0x20, 0x22, 0x37, 0x31, 0x63, 0x31, 0x33, 0x34, 0x38, 0x66, 0x32, 0x64, 0x37, 0x66, - 0x66, 0x37, 0x65, 0x38, 0x31, 0x34, 0x66, 0x39, 0x63, 0x33, 0x36, 0x31, 0x37, 0x39, 0x38, 0x33, - 0x37, 0x30, 0x33, 0x34, 0x33, 0x35, 0x65, 0x61, 0x37, 0x34, 0x34, 0x36, 0x64, 0x65, 0x34, 0x32, - 0x30, 0x61, 0x65, 0x61, 0x63, 0x34, 0x38, 0x38, 0x62, 0x66, 0x31, 0x64, 0x65, 0x33, 0x35, 0x37, - 0x33, 0x37, 0x65, 0x38, 0x22, 0x5d, 0x2c, 0x20, 0x22, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, - 0x3a, 0x20, 0x22, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x2c, - 0x20, 0x22, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3a, 0x20, 0x31, 0x36, 0x33, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3a, 0x20, 0x31, 0x36, 0x33, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x2c, 0x20, 0x22, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, - 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x22, 0x3a, 0x20, - 0x5b, 0x22, 0x66, 0x65, 0x34, 0x63, 0x62, 0x34, 0x37, 0x64, 0x62, 0x33, 0x36, 0x33, 0x30, 0x35, - 0x35, 0x31, 0x62, 0x65, 0x65, 0x64, 0x66, 0x62, 0x64, 0x30, 0x32, 0x61, 0x37, 0x31, 0x65, 0x63, - 0x63, 0x36, 0x39, 0x66, 0x64, 0x35, 0x39, 0x37, 0x35, 0x38, 0x65, 0x32, 0x62, 0x61, 0x36, 0x39, - 0x39, 0x36, 0x30, 0x36, 0x65, 0x32, 0x64, 0x35, 0x63, 0x37, 0x34, 0x32, 0x38, 0x34, 0x66, 0x66, - 0x61, 0x37, 0x22, 0x5d, 0x2c, 0x20, 0x22, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, - 0x75, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x35, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x7d, 0x22, 0xc2, 0x0d, 0x0a, 0x0a, - 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x95, 0x01, 0x0a, 0x09, 0x74, - 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x78, - 0x92, 0x41, 0x75, 0x32, 0x61, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, - 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x68, 0x61, 0x73, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, - 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, 0x0f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, - 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x52, 0x08, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, - 0x65, 0x73, 0x12, 0x8f, 0x01, 0x0a, 0x0a, 0x62, 0x69, 0x64, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x70, 0x92, 0x41, 0x6d, 0x32, 0x6b, 0x41, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, - 0x61, 0x67, 0x72, 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x61, 0x79, 0x20, 0x74, 0x6f, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x52, 0x09, 0x62, 0x69, 0x64, 0x41, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x6d, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x4a, 0x92, 0x41, 0x47, 0x32, - 0x45, 0x4d, 0x61, 0x78, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, - 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x2e, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x12, 0x7b, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, - 0x62, 0x69, 0x64, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x4b, 0x92, 0x41, 0x48, 0x32, 0x46, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x69, - 0x67, 0x65, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, - 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2e, 0x52, 0x11, 0x72, - 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x42, 0x69, 0x64, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, - 0x12, 0x7d, 0x0a, 0x16, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x62, 0x69, 0x64, - 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x47, 0x92, 0x41, 0x44, 0x32, 0x42, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, - 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x73, 0x65, 0x6e, 0x74, 0x20, - 0x74, 0x68, 0x69, 0x73, 0x20, 0x62, 0x69, 0x64, 0x2e, 0x52, 0x14, 0x72, 0x65, 0x63, 0x65, 0x69, - 0x76, 0x65, 0x64, 0x42, 0x69, 0x64, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, - 0x62, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x69, - 0x67, 0x65, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x35, 0x92, 0x41, 0x32, 0x32, - 0x30, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, - 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x20, 0x6f, - 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x52, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x67, - 0x65, 0x73, 0x74, 0x12, 0x9e, 0x01, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, - 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x6b, 0x92, 0x41, 0x68, 0x32, 0x66, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, - 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, - 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, - 0x69, 0x73, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, - 0x13, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x5d, 0x92, 0x41, 0x5a, 0x32, 0x58, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x73, 0x69, - 0x67, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, - 0x65, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x52, 0x0f, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, - 0x64, 0x0a, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x42, 0x30, - 0x92, 0x41, 0x2d, 0x32, 0x2b, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, - 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, - 0x52, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x5e, 0x0a, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, - 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x03, 0x42, 0x2e, 0x92, 0x41, 0x2b, 0x32, 0x29, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x62, 0x69, 0x64, 0x20, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, - 0x67, 0x2e, 0x52, 0x11, 0x64, 0x65, 0x63, 0x61, 0x79, 0x45, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x63, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, - 0x68, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x03, 0x42, 0x34, 0x92, 0x41, 0x31, 0x32, 0x2f, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x70, 0x75, 0x62, - 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x2e, 0x52, 0x11, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, - 0x68, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x7c, 0x0a, 0x13, 0x72, 0x65, - 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, - 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x42, 0x4c, 0x92, 0x41, 0x49, 0x32, 0x47, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, - 0x74, 0x78, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, - 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, - 0x76, 0x65, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x62, 0x65, 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, - 0x72, 0x64, 0x65, 0x64, 0x2e, 0x52, 0x11, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, - 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x85, 0x01, 0x0a, 0x0c, 0x73, 0x6c, 0x61, - 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x62, 0x92, 0x41, 0x5f, 0x32, 0x5d, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, - 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, - 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, - 0x65, 0x79, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x52, 0x0b, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x3a, 0x5e, 0x92, 0x41, 0x5b, 0x0a, 0x59, 0x2a, 0x12, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, - 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x43, 0x43, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, - 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, - 0x6d, 0x65, 0x76, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x22, 0xbe, 0x02, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x9f, 0x01, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x42, 0x7c, 0x92, - 0x41, 0x79, 0x32, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, - 0x20, 0x49, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, - 0x64, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x73, 0x63, 0x65, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x52, 0x0b, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x20, 0x92, 0x41, 0x1d, 0x32, 0x1b, 0x50, 0x61, 0x67, - 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x67, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x51, - 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x42, 0x3b, 0x92, - 0x41, 0x38, 0x32, 0x36, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, - 0x65, 0x6d, 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x70, 0x61, 0x67, 0x65, 0x20, 0x66, 0x6f, 0x72, - 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x20, 0x69, 0x73, 0x20, 0x35, 0x30, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x22, 0xe0, 0x11, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x97, 0x01, 0x0a, 0x0e, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, - 0x42, 0x42, 0x92, 0x41, 0x3f, 0x32, 0x3d, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x62, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x69, 0x64, 0x73, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x2e, 0x52, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x69, 0x64, 0x49, 0x6e, - 0x66, 0x6f, 0x1a, 0xf4, 0x04, 0x0a, 0x14, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, - 0x74, 0x57, 0x69, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x7e, 0x0a, 0x10, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x53, 0x92, 0x41, 0x50, 0x32, 0x4e, 0x48, 0x65, 0x78, 0x20, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, - 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6f, - 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x74, - 0x68, 0x61, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x63, 0x0a, 0x12, 0x64, - 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x42, 0x34, 0x92, 0x41, 0x31, 0x32, 0x2f, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, - 0x69, 0x73, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x2e, 0x52, 0x11, 0x64, - 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x12, 0x86, 0x01, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x6e, 0x92, 0x41, 0x6b, 0x32, 0x69, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x6f, - 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x20, 0x50, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x3a, 0x20, 0x27, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x27, 0x2c, 0x20, 0x27, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x27, 0x6f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x27, - 0x2c, 0x20, 0x27, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x27, 0x73, 0x6c, - 0x61, 0x73, 0x68, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x27, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x27, - 0x2e, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4e, 0x0a, 0x07, 0x64, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x34, 0x92, 0x41, 0x31, 0x32, - 0x2f, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, - 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x48, 0x0a, 0x07, 0x70, 0x61, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2e, 0x92, 0x41, 0x2b, 0x32, - 0x29, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, - 0x69, 0x6e, 0x20, 0x77, 0x65, 0x69, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x54, 0x0a, 0x06, 0x72, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x3c, 0x92, 0x41, 0x39, 0x32, 0x37, 0x52, 0x65, 0x66, 0x75, 0x6e, 0x64, - 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x77, 0x65, 0x69, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, - 0x74, 0x2c, 0x20, 0x69, 0x66, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x62, 0x6c, 0x65, - 0x2e, 0x52, 0x06, 0x72, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x1a, 0xdb, 0x09, 0x0a, 0x07, 0x42, 0x69, - 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x9a, 0x01, 0x0a, 0x0a, 0x74, 0x78, 0x6e, 0x5f, 0x68, 0x61, - 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x7b, 0x92, 0x41, 0x78, 0x32, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x5d, 0x7d, 0x22, 0x58, 0x0a, 0x18, + 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x3a, 0x3c, 0x92, 0x41, 0x39, 0x0a, 0x37, 0x2a, + 0x19, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0x1a, 0x47, 0x65, 0x74, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x22, 0x84, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x3a, 0x3e, 0x92, + 0x41, 0x3b, 0x0a, 0x39, 0x2a, 0x1a, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x32, 0x1b, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x22, 0xf2, 0x13, + 0x0a, 0x03, 0x42, 0x69, 0x64, 0x12, 0x94, 0x02, 0x0a, 0x09, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, + 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0xf6, 0x01, 0x92, 0x41, 0x78, 0x32, 0x64, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, @@ -2178,203 +2008,550 @@ var file_bidderapi_v1_bidderapi_proto_rawDesc = []byte{ 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, 0x0f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, - 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x52, 0x09, 0x74, 0x78, 0x6e, 0x48, 0x61, 0x73, 0x68, - 0x65, 0x73, 0x12, 0x92, 0x01, 0x0a, 0x15, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x5f, 0x74, 0x78, 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x09, 0x42, 0x5e, 0x92, 0x41, 0x5b, 0x32, 0x47, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, - 0x6c, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x78, 0x20, 0x68, 0x61, - 0x73, 0x68, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, - 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x20, - 0x6f, 0x72, 0x20, 0x62, 0x65, 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x65, 0x64, 0x2e, - 0x8a, 0x01, 0x0f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, - 0x34, 0x7d, 0x52, 0x13, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, - 0x6e, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x69, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x46, 0x92, - 0x41, 0x43, 0x32, 0x41, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, - 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x69, 0x6e, 0x2e, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x12, 0x98, 0x01, 0x0a, 0x0a, 0x62, 0x69, 0x64, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x79, 0x92, 0x41, 0x76, 0x32, 0x6b, 0x41, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x77, - 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x61, 0x79, 0x20, 0x74, 0x6f, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, 0x39, - 0x5d, 0x2b, 0x52, 0x09, 0x62, 0x69, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x64, 0x0a, - 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x42, 0x30, 0x92, 0x41, + 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0xba, 0x48, 0x78, 0xba, 0x01, 0x75, 0x0a, 0x09, 0x74, + 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x36, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, + 0x68, 0x65, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x2e, + 0x1a, 0x30, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, 0x2e, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, + 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x24, 0x27, + 0x29, 0x29, 0x52, 0x08, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0xe0, 0x01, 0x0a, + 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0xc7, 0x01, + 0x92, 0x41, 0x76, 0x32, 0x6b, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, + 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, + 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, + 0x20, 0x70, 0x61, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, + 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, + 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0xba, 0x48, 0x4b, 0xba, 0x01, 0x48, 0x0a, + 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, + 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x1d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x5b, 0x31, 0x2d, 0x39, 0x5d, 0x5b, 0x30, + 0x2d, 0x39, 0x5d, 0x2a, 0x24, 0x27, 0x29, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0xb9, 0x01, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x95, 0x01, 0x92, 0x41, 0x47, 0x32, 0x45, 0x4d, 0x61, + 0x78, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, + 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x69, 0x6e, 0x2e, 0xba, 0x48, 0x48, 0xba, 0x01, 0x45, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x25, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x0e, + 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x52, 0x0b, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0xc2, 0x01, 0x0a, 0x15, + 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x42, 0x8d, 0x01, 0x92, 0x41, 0x2d, 0x32, 0x2b, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x13, - 0x64, 0x65, 0x63, 0x61, 0x79, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x12, 0x5e, 0x0a, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, - 0x42, 0x2e, 0x92, 0x41, 0x2b, 0x32, 0x29, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, - 0x64, 0x20, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, - 0x52, 0x11, 0x64, 0x65, 0x63, 0x61, 0x79, 0x45, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x12, 0x6a, 0x0a, 0x0a, 0x62, 0x69, 0x64, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, - 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4b, 0x92, 0x41, 0x48, 0x32, 0x46, 0x48, 0x65, + 0x61, 0x72, 0x74, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0xba, 0x48, + 0x5a, 0xba, 0x01, 0x57, 0x0a, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2e, 0x64, 0x65, 0x63, + 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x0e, 0x75, 0x69, 0x6e, + 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x52, 0x13, 0x64, 0x65, 0x63, + 0x61, 0x79, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x12, 0xb8, 0x01, 0x0a, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x42, 0x87, + 0x01, 0x92, 0x41, 0x2b, 0x32, 0x29, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, + 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, + 0x20, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0xba, + 0x48, 0x56, 0xba, 0x01, 0x53, 0x0a, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2c, 0x64, 0x65, 0x63, 0x61, + 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, + 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x0e, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x52, 0x11, 0x64, 0x65, 0x63, 0x61, 0x79, 0x45, + 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x8f, 0x02, 0x0a, 0x13, + 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, + 0x68, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x42, 0xde, 0x01, 0x92, 0x41, 0x49, 0x32, + 0x47, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x78, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x74, 0x6f, + 0x20, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x62, 0x65, 0x20, 0x64, 0x69, + 0x73, 0x63, 0x61, 0x72, 0x64, 0x65, 0x64, 0x2e, 0xba, 0x48, 0x8e, 0x01, 0xba, 0x01, 0x8a, 0x01, + 0x0a, 0x13, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, + 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x41, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, + 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, + 0x62, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x2e, 0x1a, 0x30, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, + 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, + 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, + 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x24, 0x27, 0x29, 0x29, 0x52, 0x11, 0x72, 0x65, 0x76, 0x65, + 0x72, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0xa3, 0x02, + 0x0a, 0x10, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x42, 0xf7, 0x01, 0x92, 0x41, 0x6e, 0x32, 0x6c, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, + 0x66, 0x20, 0x52, 0x4c, 0x50, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x20, 0x72, 0x61, + 0x77, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, + 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0xba, 0x48, 0x82, 0x01, + 0xba, 0x01, 0x7f, 0x0a, 0x10, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, + 0x61, 0x6e, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x20, 0x72, 0x61, 0x77, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x1a, 0x2d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, + 0x20, 0x72, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, + 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x2a, 0x24, 0x27, + 0x29, 0x29, 0x52, 0x0f, 0x72, 0x61, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0xbf, 0x02, 0x0a, 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x9b, 0x02, 0x92, 0x41, 0x9f, + 0x01, 0x32, 0x93, 0x01, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, + 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x73, + 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x79, + 0x20, 0x66, 0x61, 0x69, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x20, 0x49, 0x66, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, + 0x65, 0x63, 0x61, 0x79, 0x65, 0x64, 0x20, 0x62, 0x69, 0x64, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x6c, + 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x2e, 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, + 0xba, 0x48, 0x75, 0xba, 0x01, 0x72, 0x0a, 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x3b, 0x74, 0x68, 0x69, + 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x27, 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x5b, 0x30, 0x2d, 0x39, 0x5d, + 0x2b, 0x24, 0x27, 0x29, 0x20, 0x26, 0x26, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x29, 0x20, 0x3e, 0x3d, 0x20, 0x30, 0x29, 0x52, 0x0b, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x41, + 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0xba, 0x04, 0x92, 0x41, 0xb6, 0x04, 0x0a, 0x95, 0x01, 0x2a, + 0x0b, 0x42, 0x69, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x40, 0x55, 0x6e, + 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x69, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x73, 0x20, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x6d, 0x65, + 0x76, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0xd2, 0x01, + 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0xd2, 0x01, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0xd2, 0x01, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0xd2, 0x01, + 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x32, 0x9b, 0x03, 0x7b, 0x22, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, + 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x66, 0x65, 0x34, 0x63, 0x62, 0x34, 0x37, 0x64, 0x62, + 0x33, 0x36, 0x33, 0x30, 0x35, 0x35, 0x31, 0x62, 0x65, 0x65, 0x64, 0x66, 0x62, 0x64, 0x30, 0x32, + 0x61, 0x37, 0x31, 0x65, 0x63, 0x63, 0x36, 0x39, 0x66, 0x64, 0x35, 0x39, 0x37, 0x35, 0x38, 0x65, + 0x32, 0x62, 0x61, 0x36, 0x39, 0x39, 0x36, 0x30, 0x36, 0x65, 0x32, 0x64, 0x35, 0x63, 0x37, 0x34, + 0x32, 0x38, 0x34, 0x66, 0x66, 0x61, 0x37, 0x22, 0x2c, 0x20, 0x22, 0x37, 0x31, 0x63, 0x31, 0x33, + 0x34, 0x38, 0x66, 0x32, 0x64, 0x37, 0x66, 0x66, 0x37, 0x65, 0x38, 0x31, 0x34, 0x66, 0x39, 0x63, + 0x33, 0x36, 0x31, 0x37, 0x39, 0x38, 0x33, 0x37, 0x30, 0x33, 0x34, 0x33, 0x35, 0x65, 0x61, 0x37, + 0x34, 0x34, 0x36, 0x64, 0x65, 0x34, 0x32, 0x30, 0x61, 0x65, 0x61, 0x63, 0x34, 0x38, 0x38, 0x62, + 0x66, 0x31, 0x64, 0x65, 0x33, 0x35, 0x37, 0x33, 0x37, 0x65, 0x38, 0x22, 0x5d, 0x2c, 0x20, 0x22, + 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x2c, 0x20, + 0x22, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x3a, 0x20, + 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3a, + 0x20, 0x31, 0x36, 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x2c, 0x20, 0x22, 0x64, 0x65, + 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x22, 0x3a, 0x20, 0x31, 0x36, 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x2c, 0x20, + 0x22, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, + 0x73, 0x68, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x66, 0x65, 0x34, 0x63, 0x62, 0x34, 0x37, + 0x64, 0x62, 0x33, 0x36, 0x33, 0x30, 0x35, 0x35, 0x31, 0x62, 0x65, 0x65, 0x64, 0x66, 0x62, 0x64, + 0x30, 0x32, 0x61, 0x37, 0x31, 0x65, 0x63, 0x63, 0x36, 0x39, 0x66, 0x64, 0x35, 0x39, 0x37, 0x35, + 0x38, 0x65, 0x32, 0x62, 0x61, 0x36, 0x39, 0x39, 0x36, 0x30, 0x36, 0x65, 0x32, 0x64, 0x35, 0x63, + 0x37, 0x34, 0x32, 0x38, 0x34, 0x66, 0x66, 0x61, 0x37, 0x22, 0x5d, 0x2c, 0x20, 0x22, 0x73, 0x6c, + 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x35, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x22, 0x7d, 0x22, 0xc2, 0x0d, 0x0a, 0x0a, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x95, 0x01, 0x0a, 0x09, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x78, 0x92, 0x41, 0x75, 0x32, 0x61, 0x48, 0x65, 0x78, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x61, 0x73, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, + 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, + 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, 0x0f, + 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x52, + 0x08, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x8f, 0x01, 0x0a, 0x0a, 0x62, 0x69, + 0x64, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x70, + 0x92, 0x41, 0x6d, 0x32, 0x6b, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, + 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, + 0x65, 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, 0x61, 0x67, 0x72, 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, + 0x20, 0x70, 0x61, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, + 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, + 0x52, 0x09, 0x62, 0x69, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x6d, 0x0a, 0x0c, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x03, 0x42, 0x4a, 0x92, 0x41, 0x47, 0x32, 0x45, 0x4d, 0x61, 0x78, 0x20, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, + 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x2e, 0x52, 0x0b, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x7b, 0x0a, 0x13, 0x72, 0x65, + 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4b, 0x92, 0x41, 0x48, 0x32, 0x46, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, - 0x64, 0x65, 0x72, 0x2e, 0x52, 0x09, 0x62, 0x69, 0x64, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, - 0xc7, 0x01, 0x0a, 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0xa3, 0x01, 0x92, 0x41, 0x9f, 0x01, 0x32, 0x93, 0x01, - 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, - 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, - 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x66, 0x61, 0x69, - 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x49, 0x66, - 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, - 0x65, 0x64, 0x20, 0x62, 0x69, 0x64, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x69, 0x73, - 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, - 0x6e, 0x67, 0x2e, 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x52, 0x0b, 0x73, 0x6c, - 0x61, 0x73, 0x68, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x57, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, - 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x57, 0x69, 0x74, 0x68, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x3a, 0x43, 0x92, 0x41, 0x40, 0x0a, 0x3e, 0x2a, 0x08, 0x42, 0x69, 0x64, 0x20, 0x49, - 0x6e, 0x66, 0x6f, 0x32, 0x32, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x61, 0x20, 0x62, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x74, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x1a, 0xda, 0x01, 0x0a, 0x0c, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x59, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x42, 0x36, - 0x92, 0x41, 0x33, 0x32, 0x31, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x62, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x65, 0x64, 0x2e, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x12, 0x6f, 0x0a, 0x04, 0x62, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x28, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2e, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x31, 0x92, 0x41, 0x2e, - 0x32, 0x2c, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x69, 0x64, 0x73, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, - 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x52, 0x04, - 0x62, 0x69, 0x64, 0x73, 0x32, 0xef, 0x0b, 0x0a, 0x06, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x12, - 0x53, 0x0a, 0x07, 0x53, 0x65, 0x6e, 0x64, 0x42, 0x69, 0x64, 0x12, 0x11, 0x2e, 0x62, 0x69, 0x64, - 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x69, 0x64, 0x1a, 0x18, 0x2e, - 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x3a, - 0x01, 0x2a, 0x22, 0x0e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x62, - 0x69, 0x64, 0x30, 0x01, 0x12, 0x6b, 0x0a, 0x07, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, - 0x1c, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, + 0x64, 0x65, 0x72, 0x2e, 0x52, 0x11, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x42, 0x69, + 0x64, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x7d, 0x0a, 0x16, 0x72, 0x65, 0x63, 0x65, 0x69, + 0x76, 0x65, 0x64, 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x47, 0x92, 0x41, 0x44, 0x32, 0x42, 0x48, 0x65, + 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, + 0x67, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x73, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x62, 0x69, 0x64, 0x2e, + 0x52, 0x14, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x42, 0x69, 0x64, 0x53, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x62, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x35, 0x92, 0x41, 0x32, 0x32, 0x30, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x64, + 0x69, 0x67, 0x65, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x9e, 0x01, 0x0a, 0x14, 0x63, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x6b, 0x92, 0x41, 0x68, 0x32, 0x66, + 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, + 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, + 0x6e, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, + 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x13, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, + 0x6e, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x10, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x5d, 0x92, 0x41, 0x5a, 0x32, 0x58, 0x48, 0x65, 0x78, + 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x2e, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x64, 0x0a, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x03, 0x42, 0x30, 0x92, 0x41, 0x2d, 0x32, 0x2b, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x20, 0x64, 0x65, + 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x5e, 0x0a, 0x13, + 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x42, 0x2e, 0x92, 0x41, 0x2b, 0x32, 0x29, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, + 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x65, 0x6e, 0x64, 0x73, 0x20, + 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x11, 0x64, 0x65, 0x63, 0x61, 0x79, + 0x45, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x63, 0x0a, 0x12, + 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x42, 0x34, 0x92, 0x41, 0x31, 0x32, 0x2f, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, + 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, + 0x20, 0x69, 0x73, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x2e, 0x52, 0x11, + 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x12, 0x7c, 0x0a, 0x13, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, + 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x42, 0x4c, + 0x92, 0x41, 0x49, 0x32, 0x47, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x72, + 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x78, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, + 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x62, + 0x65, 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x65, 0x64, 0x2e, 0x52, 0x11, 0x72, 0x65, + 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, + 0x85, 0x01, 0x0a, 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x42, 0x62, 0x92, 0x41, 0x5f, 0x32, 0x5d, 0x41, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x20, 0x74, + 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x0b, 0x73, 0x6c, 0x61, 0x73, + 0x68, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x5e, 0x92, 0x41, 0x5b, 0x0a, 0x59, 0x2a, 0x12, + 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x32, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x6d, 0x65, 0x76, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x22, 0xbe, 0x02, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x42, + 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x9f, 0x01, + 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x03, 0x42, 0x7c, 0x92, 0x41, 0x79, 0x32, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x71, 0x75, 0x65, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x69, + 0x64, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, + 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6b, 0x6e, + 0x6f, 0x77, 0x6e, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x69, + 0x6e, 0x20, 0x61, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x2e, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, + 0x34, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x20, 0x92, + 0x41, 0x1d, 0x32, 0x1b, 0x50, 0x61, 0x67, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, + 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x51, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x05, 0x42, 0x3b, 0x92, 0x41, 0x38, 0x32, 0x36, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x70, + 0x61, 0x67, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x20, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x69, 0x73, 0x20, 0x35, + 0x30, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0xe0, 0x11, 0x0a, 0x12, 0x47, 0x65, 0x74, + 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x97, 0x01, 0x0a, 0x0e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x69, 0x6e, + 0x66, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, + 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x42, 0x92, 0x41, 0x3f, 0x32, 0x3d, 0x4c, 0x69, + 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x62, 0x69, 0x64, 0x20, + 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, + 0x62, 0x69, 0x64, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x63, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x52, 0x0c, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0xf4, 0x04, 0x0a, 0x14, 0x43, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x57, 0x69, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x7e, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x53, 0x92, 0x41, + 0x50, 0x32, 0x4e, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, + 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, + 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x12, 0x63, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x42, 0x34, + 0x92, 0x41, 0x31, 0x32, 0x2f, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, + 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, + 0x68, 0x65, 0x64, 0x2e, 0x52, 0x11, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x86, 0x01, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x6e, 0x92, 0x41, 0x6b, 0x32, 0x69, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x20, 0x50, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, + 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x3a, 0x20, 0x27, 0x70, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x27, 0x2c, 0x20, 0x27, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x27, + 0x6f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x27, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, + 0x64, 0x27, 0x2c, 0x20, 0x27, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x27, + 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x27, 0x2e, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x4e, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x34, 0x92, 0x41, 0x31, 0x32, 0x2f, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x12, 0x48, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x2e, 0x92, 0x41, 0x2b, 0x32, 0x29, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x20, + 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x77, 0x65, 0x69, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x54, 0x0a, 0x06, 0x72, 0x65, + 0x66, 0x75, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3c, 0x92, 0x41, 0x39, 0x32, + 0x37, 0x52, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x69, + 0x6e, 0x20, 0x77, 0x65, 0x69, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x69, 0x66, 0x20, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x52, 0x06, 0x72, 0x65, 0x66, 0x75, 0x6e, 0x64, + 0x1a, 0xdb, 0x09, 0x0a, 0x07, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x9a, 0x01, 0x0a, + 0x0a, 0x74, 0x78, 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x42, 0x7b, 0x92, 0x41, 0x78, 0x32, 0x64, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, + 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, 0x0f, 0x5b, + 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x52, 0x09, + 0x74, 0x78, 0x6e, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x92, 0x01, 0x0a, 0x15, 0x72, 0x65, + 0x76, 0x65, 0x72, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x74, 0x78, 0x6e, 0x5f, 0x68, 0x61, 0x73, + 0x68, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0x5e, 0x92, 0x41, 0x5b, 0x32, 0x47, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x78, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, + 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x62, 0x65, 0x20, 0x64, 0x69, 0x73, + 0x63, 0x61, 0x72, 0x64, 0x65, 0x64, 0x2e, 0x8a, 0x01, 0x0f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, + 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x52, 0x13, 0x72, 0x65, 0x76, 0x65, 0x72, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x6e, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x69, + 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x03, 0x42, 0x46, 0x92, 0x41, 0x43, 0x32, 0x41, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, + 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x2e, 0x52, 0x0b, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x98, 0x01, 0x0a, 0x0a, 0x62, 0x69, + 0x64, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x79, + 0x92, 0x41, 0x76, 0x32, 0x6b, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, + 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, + 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, + 0x20, 0x70, 0x61, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, + 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, + 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x52, 0x09, 0x62, 0x69, 0x64, 0x41, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x64, 0x0a, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x03, 0x42, 0x30, 0x92, 0x41, 0x2d, 0x32, 0x2b, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x62, 0x69, 0x64, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, + 0x79, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x5e, 0x0a, 0x13, 0x64, 0x65, + 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x42, 0x2e, 0x92, 0x41, 0x2b, 0x32, 0x29, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x64, 0x65, + 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x11, 0x64, 0x65, 0x63, 0x61, 0x79, 0x45, 0x6e, + 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x6a, 0x0a, 0x0a, 0x62, 0x69, + 0x64, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4b, + 0x92, 0x41, 0x48, 0x32, 0x46, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, + 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x69, 0x67, 0x65, + 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2e, 0x52, 0x09, 0x62, 0x69, 0x64, + 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0xc7, 0x01, 0x0a, 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, + 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0xa3, 0x01, + 0x92, 0x41, 0x9f, 0x01, 0x32, 0x93, 0x01, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, + 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, + 0x65, 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x79, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x2c, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x65, 0x64, 0x20, 0x62, 0x69, 0x64, 0x20, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x2e, 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, + 0x39, 0x5d, 0x2b, 0x52, 0x0b, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x57, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, + 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, + 0x6e, 0x74, 0x57, 0x69, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0b, 0x63, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x43, 0x92, 0x41, 0x40, 0x0a, 0x3e, + 0x2a, 0x08, 0x42, 0x69, 0x64, 0x20, 0x49, 0x6e, 0x66, 0x6f, 0x32, 0x32, 0x49, 0x6e, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x61, 0x20, + 0x62, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x74, + 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x1a, 0xda, + 0x01, 0x0a, 0x0c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x59, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x03, 0x42, 0x36, 0x92, 0x41, 0x33, 0x32, 0x31, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x77, 0x68, 0x69, + 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x20, + 0x69, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x2e, 0x52, 0x0b, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x6f, 0x0a, 0x04, 0x62, 0x69, + 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, + 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x42, 0x69, 0x64, 0x49, 0x6e, + 0x66, 0x6f, 0x42, 0x31, 0x92, 0x41, 0x2e, 0x32, 0x2c, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, + 0x20, 0x62, 0x69, 0x64, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x70, + 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x52, 0x04, 0x62, 0x69, 0x64, 0x73, 0x32, 0xf2, 0x0c, 0x0a, 0x06, + 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x12, 0x53, 0x0a, 0x07, 0x53, 0x65, 0x6e, 0x64, 0x42, 0x69, + 0x64, 0x12, 0x11, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x42, 0x69, 0x64, 0x1a, 0x18, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x19, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x3a, 0x01, 0x2a, 0x22, 0x0e, 0x2f, 0x76, 0x31, 0x2f, 0x62, + 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x62, 0x69, 0x64, 0x30, 0x01, 0x12, 0x6b, 0x0a, 0x07, 0x44, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x1c, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x22, 0x1b, 0x2f, 0x76, 0x31, + 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x2f, + 0x7b, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x7d, 0x12, 0x7b, 0x0a, 0x0d, 0x44, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x12, 0x22, 0x2e, 0x62, 0x69, 0x64, 0x64, + 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x45, 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x1d, 0x22, 0x1b, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, - 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x2f, 0x7b, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x7d, 0x12, 0x7b, 0x0a, 0x0d, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, - 0x6c, 0x79, 0x12, 0x22, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x45, 0x76, 0x65, - 0x6e, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x21, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x1b, 0x22, 0x19, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, - 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x12, 0x98, - 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x12, 0x29, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x22, 0x21, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, - 0x65, 0x72, 0x2f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x12, 0x8c, 0x01, 0x0a, 0x11, 0x53, 0x65, - 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, - 0x26, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, - 0x65, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, - 0x64, 0x64, 0x65, 0x72, 0x2f, 0x73, 0x65, 0x74, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, - 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, 0x98, 0x01, 0x0a, 0x14, 0x44, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x29, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x62, - 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, - 0x12, 0x21, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x64, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x92, 0x01, 0x0a, 0x12, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, - 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x12, 0x27, 0x2e, 0x62, 0x69, 0x64, + 0x6f, 0x73, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x19, 0x2f, 0x76, 0x31, 0x2f, + 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x65, + 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x12, 0x98, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x12, 0x29, + 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x62, 0x69, 0x64, 0x64, + 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x44, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x22, 0x21, 0x2f, + 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, + 0x12, 0x8c, 0x01, 0x0a, 0x11, 0x53, 0x65, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, 0x26, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, + 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, + 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, + 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x73, 0x65, 0x74, 0x5f, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, + 0x98, 0x01, 0x0a, 0x14, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x29, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, + 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x12, 0x21, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, + 0x64, 0x65, 0x72, 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x92, 0x01, 0x0a, 0x12, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, + 0x73, 0x12, 0x27, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, + 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, - 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x3a, 0x01, 0x2a, 0x22, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, - 0x64, 0x64, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x77, 0x69, 0x74, - 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x12, 0x8c, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x26, - 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, - 0x64, 0x65, 0x72, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x6c, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x44, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x1f, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, - 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x66, 0x0a, 0x08, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, - 0x77, 0x12, 0x1d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1e, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x13, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, - 0x64, 0x64, 0x65, 0x72, 0x2f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x12, 0x70, 0x0a, - 0x0a, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x2e, 0x62, 0x69, - 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, - 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x62, - 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, - 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x12, 0x17, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, - 0x65, 0x72, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x12, - 0x75, 0x0a, 0x11, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x46, - 0x75, 0x6e, 0x64, 0x73, 0x12, 0x1a, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x1a, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, - 0x65, 0x72, 0x2f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x5f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, - 0x5f, 0x66, 0x75, 0x6e, 0x64, 0x73, 0x42, 0xaa, 0x02, 0x92, 0x41, 0x72, 0x12, 0x70, 0x0a, 0x0a, - 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x41, 0x50, 0x49, 0x2a, 0x55, 0x0a, 0x1b, 0x42, 0x75, - 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x20, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x4c, 0x69, - 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x31, 0x2e, 0x31, 0x12, 0x36, 0x68, 0x74, 0x74, 0x70, 0x73, - 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, - 0x69, 0x6d, 0x65, 0x76, 0x2f, 0x6d, 0x65, 0x76, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x2f, - 0x62, 0x6c, 0x6f, 0x62, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, - 0x45, 0x32, 0x0b, 0x31, 0x2e, 0x30, 0x2e, 0x30, 0x2d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x0a, 0x10, - 0x63, 0x6f, 0x6d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x42, 0x0e, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x50, 0x01, 0x5a, 0x40, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, - 0x72, 0x69, 0x6d, 0x65, 0x76, 0x2f, 0x6d, 0x65, 0x76, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x2f, 0x70, 0x32, 0x70, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x64, 0x64, - 0x65, 0x72, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x3b, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, - 0x70, 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x42, 0x58, 0x58, 0xaa, 0x02, 0x0c, 0x42, 0x69, 0x64, - 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0c, 0x42, 0x69, 0x64, 0x64, - 0x65, 0x72, 0x61, 0x70, 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x18, 0x42, 0x69, 0x64, 0x64, 0x65, - 0x72, 0x61, 0x70, 0x69, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0xea, 0x02, 0x0d, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x3a, - 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x3a, 0x01, 0x2a, 0x22, + 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x12, + 0x8c, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x26, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, + 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, + 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x6c, + 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x1f, 0x2e, 0x62, + 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x44, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, + 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, + 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x80, 0x01, 0x0a, + 0x0e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, + 0x23, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x1d, 0x12, 0x1b, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x67, + 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x6c, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, + 0x66, 0x0a, 0x08, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x12, 0x1d, 0x2e, 0x62, 0x69, + 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, + 0x72, 0x61, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x62, 0x69, 0x64, + 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, + 0x61, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x15, 0x22, 0x13, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x77, + 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x12, 0x70, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x42, 0x69, + 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, + 0x12, 0x17, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x67, 0x65, 0x74, + 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x75, 0x0a, 0x11, 0x43, 0x6c, 0x61, + 0x69, 0x6d, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x46, 0x75, 0x6e, 0x64, 0x73, 0x12, 0x1a, + 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, + 0x22, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x63, 0x6c, 0x61, + 0x69, 0x6d, 0x5f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x66, 0x75, 0x6e, 0x64, 0x73, + 0x42, 0xaa, 0x02, 0x92, 0x41, 0x72, 0x12, 0x70, 0x0a, 0x0a, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, + 0x20, 0x41, 0x50, 0x49, 0x2a, 0x55, 0x0a, 0x1b, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, + 0x20, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, + 0x31, 0x2e, 0x31, 0x12, 0x36, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x65, 0x76, 0x2f, 0x6d, + 0x65, 0x76, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x2f, 0x62, 0x6c, 0x6f, 0x62, 0x2f, 0x6d, + 0x61, 0x69, 0x6e, 0x2f, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x32, 0x0b, 0x31, 0x2e, 0x30, + 0x2e, 0x30, 0x2d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x2e, 0x62, 0x69, + 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x42, 0x0e, 0x42, 0x69, 0x64, 0x64, + 0x65, 0x72, 0x61, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x40, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x65, 0x76, 0x2f, + 0x6d, 0x65, 0x76, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x2f, 0x70, 0x32, 0x70, 0x2f, 0x67, + 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2f, + 0x76, 0x31, 0x3b, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x76, 0x31, 0xa2, 0x02, + 0x03, 0x42, 0x58, 0x58, 0xaa, 0x02, 0x0c, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, + 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0c, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x5c, + 0x56, 0x31, 0xe2, 0x02, 0x18, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x5c, 0x56, + 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0d, + 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2389,7 +2566,7 @@ func file_bidderapi_v1_bidderapi_proto_rawDescGZIP() []byte { return file_bidderapi_v1_bidderapi_proto_rawDescData } -var file_bidderapi_v1_bidderapi_proto_msgTypes = make([]protoimpl.MessageInfo, 26) +var file_bidderapi_v1_bidderapi_proto_msgTypes = make([]protoimpl.MessageInfo, 29) var file_bidderapi_v1_bidderapi_proto_goTypes = []interface{}{ (*DepositRequest)(nil), // 0: bidderapi.v1.DepositRequest (*DepositResponse)(nil), // 1: bidderapi.v1.DepositResponse @@ -2404,57 +2581,63 @@ var file_bidderapi_v1_bidderapi_proto_goTypes = []interface{}{ (*DepositManagerStatusResponse)(nil), // 10: bidderapi.v1.DepositManagerStatusResponse (*EmptyMessage)(nil), // 11: bidderapi.v1.EmptyMessage (*GetDepositRequest)(nil), // 12: bidderapi.v1.GetDepositRequest - (*RequestWithdrawalsRequest)(nil), // 13: bidderapi.v1.RequestWithdrawalsRequest - (*RequestWithdrawalsResponse)(nil), // 14: bidderapi.v1.RequestWithdrawalsResponse - (*WithdrawRequest)(nil), // 15: bidderapi.v1.WithdrawRequest - (*WithdrawResponse)(nil), // 16: bidderapi.v1.WithdrawResponse - (*GetValidProvidersRequest)(nil), // 17: bidderapi.v1.GetValidProvidersRequest - (*GetValidProvidersResponse)(nil), // 18: bidderapi.v1.GetValidProvidersResponse - (*Bid)(nil), // 19: bidderapi.v1.Bid - (*Commitment)(nil), // 20: bidderapi.v1.Commitment - (*GetBidInfoRequest)(nil), // 21: bidderapi.v1.GetBidInfoRequest - (*GetBidInfoResponse)(nil), // 22: bidderapi.v1.GetBidInfoResponse - (*GetBidInfoResponse_CommitmentWithStatus)(nil), // 23: bidderapi.v1.GetBidInfoResponse.CommitmentWithStatus - (*GetBidInfoResponse_BidInfo)(nil), // 24: bidderapi.v1.GetBidInfoResponse.BidInfo - (*GetBidInfoResponse_BlockBidInfo)(nil), // 25: bidderapi.v1.GetBidInfoResponse.BlockBidInfo - (*wrapperspb.StringValue)(nil), // 26: google.protobuf.StringValue + (*GetAllDepositsRequest)(nil), // 13: bidderapi.v1.GetAllDepositsRequest + (*DepositInfo)(nil), // 14: bidderapi.v1.DepositInfo + (*GetAllDepositsResponse)(nil), // 15: bidderapi.v1.GetAllDepositsResponse + (*RequestWithdrawalsRequest)(nil), // 16: bidderapi.v1.RequestWithdrawalsRequest + (*RequestWithdrawalsResponse)(nil), // 17: bidderapi.v1.RequestWithdrawalsResponse + (*WithdrawRequest)(nil), // 18: bidderapi.v1.WithdrawRequest + (*WithdrawResponse)(nil), // 19: bidderapi.v1.WithdrawResponse + (*GetValidProvidersRequest)(nil), // 20: bidderapi.v1.GetValidProvidersRequest + (*GetValidProvidersResponse)(nil), // 21: bidderapi.v1.GetValidProvidersResponse + (*Bid)(nil), // 22: bidderapi.v1.Bid + (*Commitment)(nil), // 23: bidderapi.v1.Commitment + (*GetBidInfoRequest)(nil), // 24: bidderapi.v1.GetBidInfoRequest + (*GetBidInfoResponse)(nil), // 25: bidderapi.v1.GetBidInfoResponse + (*GetBidInfoResponse_CommitmentWithStatus)(nil), // 26: bidderapi.v1.GetBidInfoResponse.CommitmentWithStatus + (*GetBidInfoResponse_BidInfo)(nil), // 27: bidderapi.v1.GetBidInfoResponse.BidInfo + (*GetBidInfoResponse_BlockBidInfo)(nil), // 28: bidderapi.v1.GetBidInfoResponse.BlockBidInfo + (*wrapperspb.StringValue)(nil), // 29: google.protobuf.StringValue } var file_bidderapi_v1_bidderapi_proto_depIdxs = []int32{ 6, // 0: bidderapi.v1.SetTargetDepositsRequest.target_deposits:type_name -> bidderapi.v1.TargetDeposit 6, // 1: bidderapi.v1.SetTargetDepositsResponse.successfully_set_deposits:type_name -> bidderapi.v1.TargetDeposit 6, // 2: bidderapi.v1.DepositManagerStatusResponse.target_deposits:type_name -> bidderapi.v1.TargetDeposit - 25, // 3: bidderapi.v1.GetBidInfoResponse.block_bid_info:type_name -> bidderapi.v1.GetBidInfoResponse.BlockBidInfo - 23, // 4: bidderapi.v1.GetBidInfoResponse.BidInfo.commitments:type_name -> bidderapi.v1.GetBidInfoResponse.CommitmentWithStatus - 24, // 5: bidderapi.v1.GetBidInfoResponse.BlockBidInfo.bids:type_name -> bidderapi.v1.GetBidInfoResponse.BidInfo - 19, // 6: bidderapi.v1.Bidder.SendBid:input_type -> bidderapi.v1.Bid - 0, // 7: bidderapi.v1.Bidder.Deposit:input_type -> bidderapi.v1.DepositRequest - 2, // 8: bidderapi.v1.Bidder.DepositEvenly:input_type -> bidderapi.v1.DepositEvenlyRequest - 4, // 9: bidderapi.v1.Bidder.EnableDepositManager:input_type -> bidderapi.v1.EnableDepositManagerRequest - 7, // 10: bidderapi.v1.Bidder.SetTargetDeposits:input_type -> bidderapi.v1.SetTargetDepositsRequest - 9, // 11: bidderapi.v1.Bidder.DepositManagerStatus:input_type -> bidderapi.v1.DepositManagerStatusRequest - 13, // 12: bidderapi.v1.Bidder.RequestWithdrawals:input_type -> bidderapi.v1.RequestWithdrawalsRequest - 17, // 13: bidderapi.v1.Bidder.GetValidProviders:input_type -> bidderapi.v1.GetValidProvidersRequest - 12, // 14: bidderapi.v1.Bidder.GetDeposit:input_type -> bidderapi.v1.GetDepositRequest - 15, // 15: bidderapi.v1.Bidder.Withdraw:input_type -> bidderapi.v1.WithdrawRequest - 21, // 16: bidderapi.v1.Bidder.GetBidInfo:input_type -> bidderapi.v1.GetBidInfoRequest - 11, // 17: bidderapi.v1.Bidder.ClaimSlashedFunds:input_type -> bidderapi.v1.EmptyMessage - 20, // 18: bidderapi.v1.Bidder.SendBid:output_type -> bidderapi.v1.Commitment - 1, // 19: bidderapi.v1.Bidder.Deposit:output_type -> bidderapi.v1.DepositResponse - 3, // 20: bidderapi.v1.Bidder.DepositEvenly:output_type -> bidderapi.v1.DepositEvenlyResponse - 5, // 21: bidderapi.v1.Bidder.EnableDepositManager:output_type -> bidderapi.v1.EnableDepositManagerResponse - 8, // 22: bidderapi.v1.Bidder.SetTargetDeposits:output_type -> bidderapi.v1.SetTargetDepositsResponse - 10, // 23: bidderapi.v1.Bidder.DepositManagerStatus:output_type -> bidderapi.v1.DepositManagerStatusResponse - 14, // 24: bidderapi.v1.Bidder.RequestWithdrawals:output_type -> bidderapi.v1.RequestWithdrawalsResponse - 18, // 25: bidderapi.v1.Bidder.GetValidProviders:output_type -> bidderapi.v1.GetValidProvidersResponse - 1, // 26: bidderapi.v1.Bidder.GetDeposit:output_type -> bidderapi.v1.DepositResponse - 16, // 27: bidderapi.v1.Bidder.Withdraw:output_type -> bidderapi.v1.WithdrawResponse - 22, // 28: bidderapi.v1.Bidder.GetBidInfo:output_type -> bidderapi.v1.GetBidInfoResponse - 26, // 29: bidderapi.v1.Bidder.ClaimSlashedFunds:output_type -> google.protobuf.StringValue - 18, // [18:30] is the sub-list for method output_type - 6, // [6:18] is the sub-list for method input_type - 6, // [6:6] is the sub-list for extension type_name - 6, // [6:6] is the sub-list for extension extendee - 0, // [0:6] is the sub-list for field type_name + 14, // 3: bidderapi.v1.GetAllDepositsResponse.deposits:type_name -> bidderapi.v1.DepositInfo + 28, // 4: bidderapi.v1.GetBidInfoResponse.block_bid_info:type_name -> bidderapi.v1.GetBidInfoResponse.BlockBidInfo + 26, // 5: bidderapi.v1.GetBidInfoResponse.BidInfo.commitments:type_name -> bidderapi.v1.GetBidInfoResponse.CommitmentWithStatus + 27, // 6: bidderapi.v1.GetBidInfoResponse.BlockBidInfo.bids:type_name -> bidderapi.v1.GetBidInfoResponse.BidInfo + 22, // 7: bidderapi.v1.Bidder.SendBid:input_type -> bidderapi.v1.Bid + 0, // 8: bidderapi.v1.Bidder.Deposit:input_type -> bidderapi.v1.DepositRequest + 2, // 9: bidderapi.v1.Bidder.DepositEvenly:input_type -> bidderapi.v1.DepositEvenlyRequest + 4, // 10: bidderapi.v1.Bidder.EnableDepositManager:input_type -> bidderapi.v1.EnableDepositManagerRequest + 7, // 11: bidderapi.v1.Bidder.SetTargetDeposits:input_type -> bidderapi.v1.SetTargetDepositsRequest + 9, // 12: bidderapi.v1.Bidder.DepositManagerStatus:input_type -> bidderapi.v1.DepositManagerStatusRequest + 16, // 13: bidderapi.v1.Bidder.RequestWithdrawals:input_type -> bidderapi.v1.RequestWithdrawalsRequest + 20, // 14: bidderapi.v1.Bidder.GetValidProviders:input_type -> bidderapi.v1.GetValidProvidersRequest + 12, // 15: bidderapi.v1.Bidder.GetDeposit:input_type -> bidderapi.v1.GetDepositRequest + 13, // 16: bidderapi.v1.Bidder.GetAllDeposits:input_type -> bidderapi.v1.GetAllDepositsRequest + 18, // 17: bidderapi.v1.Bidder.Withdraw:input_type -> bidderapi.v1.WithdrawRequest + 24, // 18: bidderapi.v1.Bidder.GetBidInfo:input_type -> bidderapi.v1.GetBidInfoRequest + 11, // 19: bidderapi.v1.Bidder.ClaimSlashedFunds:input_type -> bidderapi.v1.EmptyMessage + 23, // 20: bidderapi.v1.Bidder.SendBid:output_type -> bidderapi.v1.Commitment + 1, // 21: bidderapi.v1.Bidder.Deposit:output_type -> bidderapi.v1.DepositResponse + 3, // 22: bidderapi.v1.Bidder.DepositEvenly:output_type -> bidderapi.v1.DepositEvenlyResponse + 5, // 23: bidderapi.v1.Bidder.EnableDepositManager:output_type -> bidderapi.v1.EnableDepositManagerResponse + 8, // 24: bidderapi.v1.Bidder.SetTargetDeposits:output_type -> bidderapi.v1.SetTargetDepositsResponse + 10, // 25: bidderapi.v1.Bidder.DepositManagerStatus:output_type -> bidderapi.v1.DepositManagerStatusResponse + 17, // 26: bidderapi.v1.Bidder.RequestWithdrawals:output_type -> bidderapi.v1.RequestWithdrawalsResponse + 21, // 27: bidderapi.v1.Bidder.GetValidProviders:output_type -> bidderapi.v1.GetValidProvidersResponse + 1, // 28: bidderapi.v1.Bidder.GetDeposit:output_type -> bidderapi.v1.DepositResponse + 15, // 29: bidderapi.v1.Bidder.GetAllDeposits:output_type -> bidderapi.v1.GetAllDepositsResponse + 19, // 30: bidderapi.v1.Bidder.Withdraw:output_type -> bidderapi.v1.WithdrawResponse + 25, // 31: bidderapi.v1.Bidder.GetBidInfo:output_type -> bidderapi.v1.GetBidInfoResponse + 29, // 32: bidderapi.v1.Bidder.ClaimSlashedFunds:output_type -> google.protobuf.StringValue + 20, // [20:33] is the sub-list for method output_type + 7, // [7:20] is the sub-list for method input_type + 7, // [7:7] is the sub-list for extension type_name + 7, // [7:7] is the sub-list for extension extendee + 0, // [0:7] is the sub-list for field type_name } func init() { file_bidderapi_v1_bidderapi_proto_init() } @@ -2620,7 +2803,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RequestWithdrawalsRequest); i { + switch v := v.(*GetAllDepositsRequest); i { case 0: return &v.state case 1: @@ -2632,7 +2815,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RequestWithdrawalsResponse); i { + switch v := v.(*DepositInfo); i { case 0: return &v.state case 1: @@ -2644,7 +2827,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WithdrawRequest); i { + switch v := v.(*GetAllDepositsResponse); i { case 0: return &v.state case 1: @@ -2656,7 +2839,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WithdrawResponse); i { + switch v := v.(*RequestWithdrawalsRequest); i { case 0: return &v.state case 1: @@ -2668,7 +2851,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetValidProvidersRequest); i { + switch v := v.(*RequestWithdrawalsResponse); i { case 0: return &v.state case 1: @@ -2680,7 +2863,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetValidProvidersResponse); i { + switch v := v.(*WithdrawRequest); i { case 0: return &v.state case 1: @@ -2692,7 +2875,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Bid); i { + switch v := v.(*WithdrawResponse); i { case 0: return &v.state case 1: @@ -2704,7 +2887,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Commitment); i { + switch v := v.(*GetValidProvidersRequest); i { case 0: return &v.state case 1: @@ -2716,7 +2899,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBidInfoRequest); i { + switch v := v.(*GetValidProvidersResponse); i { case 0: return &v.state case 1: @@ -2728,7 +2911,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBidInfoResponse); i { + switch v := v.(*Bid); i { case 0: return &v.state case 1: @@ -2740,7 +2923,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBidInfoResponse_CommitmentWithStatus); i { + switch v := v.(*Commitment); i { case 0: return &v.state case 1: @@ -2752,7 +2935,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBidInfoResponse_BidInfo); i { + switch v := v.(*GetBidInfoRequest); i { case 0: return &v.state case 1: @@ -2764,6 +2947,42 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetBidInfoResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_bidderapi_v1_bidderapi_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetBidInfoResponse_CommitmentWithStatus); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_bidderapi_v1_bidderapi_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetBidInfoResponse_BidInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_bidderapi_v1_bidderapi_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetBidInfoResponse_BlockBidInfo); i { case 0: return &v.state @@ -2782,7 +3001,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_bidderapi_v1_bidderapi_proto_rawDesc, NumEnums: 0, - NumMessages: 26, + NumMessages: 29, NumExtensions: 0, NumServices: 1, }, diff --git a/p2p/gen/go/bidderapi/v1/bidderapi.pb.gw.go b/p2p/gen/go/bidderapi/v1/bidderapi.pb.gw.go index b539f75b7..b6d21c068 100644 --- a/p2p/gen/go/bidderapi/v1/bidderapi.pb.gw.go +++ b/p2p/gen/go/bidderapi/v1/bidderapi.pb.gw.go @@ -306,6 +306,27 @@ func local_request_Bidder_GetDeposit_0(ctx context.Context, marshaler runtime.Ma return msg, metadata, err } +func request_Bidder_GetAllDeposits_0(ctx context.Context, marshaler runtime.Marshaler, client BidderClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetAllDepositsRequest + metadata runtime.ServerMetadata + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + msg, err := client.GetAllDeposits(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_Bidder_GetAllDeposits_0(ctx context.Context, marshaler runtime.Marshaler, server BidderServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetAllDepositsRequest + metadata runtime.ServerMetadata + ) + msg, err := server.GetAllDeposits(ctx, &protoReq) + return msg, metadata, err +} + var filter_Bidder_Withdraw_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_Bidder_Withdraw_0(ctx context.Context, marshaler runtime.Marshaler, client BidderClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -569,6 +590,26 @@ func RegisterBidderHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser } forward_Bidder_GetDeposit_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) + mux.Handle(http.MethodGet, pattern_Bidder_GetAllDeposits_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/bidderapi.v1.Bidder/GetAllDeposits", runtime.WithHTTPPathPattern("/v1/bidder/get_all_deposits")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Bidder_GetAllDeposits_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_Bidder_GetAllDeposits_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle(http.MethodPost, pattern_Bidder_Withdraw_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -822,6 +863,23 @@ func RegisterBidderHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli } forward_Bidder_GetDeposit_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) + mux.Handle(http.MethodGet, pattern_Bidder_GetAllDeposits_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/bidderapi.v1.Bidder/GetAllDeposits", runtime.WithHTTPPathPattern("/v1/bidder/get_all_deposits")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Bidder_GetAllDeposits_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_Bidder_GetAllDeposits_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle(http.MethodPost, pattern_Bidder_Withdraw_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -886,6 +944,7 @@ var ( pattern_Bidder_RequestWithdrawals_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "request_withdrawals"}, "")) pattern_Bidder_GetValidProviders_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "get_valid_providers"}, "")) pattern_Bidder_GetDeposit_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "get_deposit"}, "")) + pattern_Bidder_GetAllDeposits_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "get_all_deposits"}, "")) pattern_Bidder_Withdraw_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "withdraw"}, "")) pattern_Bidder_GetBidInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "get_bid_info"}, "")) pattern_Bidder_ClaimSlashedFunds_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "claim_slashed_funds"}, "")) @@ -901,6 +960,7 @@ var ( forward_Bidder_RequestWithdrawals_0 = runtime.ForwardResponseMessage forward_Bidder_GetValidProviders_0 = runtime.ForwardResponseMessage forward_Bidder_GetDeposit_0 = runtime.ForwardResponseMessage + forward_Bidder_GetAllDeposits_0 = runtime.ForwardResponseMessage forward_Bidder_Withdraw_0 = runtime.ForwardResponseMessage forward_Bidder_GetBidInfo_0 = runtime.ForwardResponseMessage forward_Bidder_ClaimSlashedFunds_0 = runtime.ForwardResponseMessage diff --git a/p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go b/p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go index bf155f0d5..b1e4f6d0c 100644 --- a/p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go +++ b/p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go @@ -29,6 +29,7 @@ const ( Bidder_RequestWithdrawals_FullMethodName = "/bidderapi.v1.Bidder/RequestWithdrawals" Bidder_GetValidProviders_FullMethodName = "/bidderapi.v1.Bidder/GetValidProviders" Bidder_GetDeposit_FullMethodName = "/bidderapi.v1.Bidder/GetDeposit" + Bidder_GetAllDeposits_FullMethodName = "/bidderapi.v1.Bidder/GetAllDeposits" Bidder_Withdraw_FullMethodName = "/bidderapi.v1.Bidder/Withdraw" Bidder_GetBidInfo_FullMethodName = "/bidderapi.v1.Bidder/GetBidInfo" Bidder_ClaimSlashedFunds_FullMethodName = "/bidderapi.v1.Bidder/ClaimSlashedFunds" @@ -86,6 +87,11 @@ type BidderClient interface { // // GetDeposit is called by the bidder to get its deposit specific to a provider in the bidder registry. GetDeposit(ctx context.Context, in *GetDepositRequest, opts ...grpc.CallOption) (*DepositResponse, error) + // GetAllDeposits + // + // GetAllDeposits is called by the bidder to get all its deposits in the bidder registry, + // and the balance of the bidder EOA itself. + GetAllDeposits(ctx context.Context, in *GetAllDepositsRequest, opts ...grpc.CallOption) (*GetAllDepositsResponse, error) // Withdraw // // Withdraw is called by the bidder to withdraw their deposit to a provider. @@ -209,6 +215,16 @@ func (c *bidderClient) GetDeposit(ctx context.Context, in *GetDepositRequest, op return out, nil } +func (c *bidderClient) GetAllDeposits(ctx context.Context, in *GetAllDepositsRequest, opts ...grpc.CallOption) (*GetAllDepositsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetAllDepositsResponse) + err := c.cc.Invoke(ctx, Bidder_GetAllDeposits_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *bidderClient) Withdraw(ctx context.Context, in *WithdrawRequest, opts ...grpc.CallOption) (*WithdrawResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(WithdrawResponse) @@ -291,6 +307,11 @@ type BidderServer interface { // // GetDeposit is called by the bidder to get its deposit specific to a provider in the bidder registry. GetDeposit(context.Context, *GetDepositRequest) (*DepositResponse, error) + // GetAllDeposits + // + // GetAllDeposits is called by the bidder to get all its deposits in the bidder registry, + // and the balance of the bidder EOA itself. + GetAllDeposits(context.Context, *GetAllDepositsRequest) (*GetAllDepositsResponse, error) // Withdraw // // Withdraw is called by the bidder to withdraw their deposit to a provider. @@ -342,6 +363,9 @@ func (UnimplementedBidderServer) GetValidProviders(context.Context, *GetValidPro func (UnimplementedBidderServer) GetDeposit(context.Context, *GetDepositRequest) (*DepositResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetDeposit not implemented") } +func (UnimplementedBidderServer) GetAllDeposits(context.Context, *GetAllDepositsRequest) (*GetAllDepositsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetAllDeposits not implemented") +} func (UnimplementedBidderServer) Withdraw(context.Context, *WithdrawRequest) (*WithdrawResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Withdraw not implemented") } @@ -527,6 +551,24 @@ func _Bidder_GetDeposit_Handler(srv interface{}, ctx context.Context, dec func(i return interceptor(ctx, in, info, handler) } +func _Bidder_GetAllDeposits_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetAllDepositsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BidderServer).GetAllDeposits(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Bidder_GetAllDeposits_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BidderServer).GetAllDeposits(ctx, req.(*GetAllDepositsRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Bidder_Withdraw_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(WithdrawRequest) if err := dec(in); err != nil { @@ -620,6 +662,10 @@ var Bidder_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetDeposit", Handler: _Bidder_GetDeposit_Handler, }, + { + MethodName: "GetAllDeposits", + Handler: _Bidder_GetAllDeposits_Handler, + }, { MethodName: "Withdraw", Handler: _Bidder_Withdraw_Handler, diff --git a/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml b/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml index 0bac8aef0..2a9a7394f 100644 --- a/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml +++ b/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml @@ -137,6 +137,22 @@ paths: description: An unexpected error response. schema: $ref: '#/definitions/googlerpcStatus' + /v1/bidder/get_all_deposits: + get: + summary: GetAllDeposits + description: |- + GetAllDeposits is called by the bidder to get all its deposits in the bidder registry, + and the balance of the bidder EOA itself. + operationId: Bidder_GetAllDeposits + responses: + "200": + description: A successful response. + schema: + $ref: '#/definitions/v1GetAllDepositsResponse' + default: + description: An unexpected error response. + schema: + $ref: '#/definitions/googlerpcStatus' /v1/bidder/get_bid_info: get: summary: GetBidInfo @@ -496,6 +512,13 @@ definitions: type: string description: Deposits some amount of ETH evenly across multiple providers. title: Deposit evenly response + v1DepositInfo: + type: object + properties: + provider: + type: string + amount: + type: string v1DepositManagerStatusResponse: type: object properties: @@ -527,6 +550,18 @@ definitions: type: boolean description: EnableDepositManager response. title: EnableDepositManager response + v1GetAllDepositsResponse: + type: object + properties: + deposits: + type: array + items: + type: object + $ref: '#/definitions/v1DepositInfo' + bidderBalance: + type: string + description: GetAllDeposits response. + title: GetAllDeposits response v1GetBidInfoResponse: type: object properties: diff --git a/p2p/pkg/node/node.go b/p2p/pkg/node/node.go index f08ff4810..676af6f8f 100644 --- a/p2p/pkg/node/node.go +++ b/p2p/pkg/node/node.go @@ -674,7 +674,7 @@ func NewNode(opts *Options) (*Node, error) { opts.Logger.With("component", "bidderapi"), setCodeHelper, depositManagerContract, - backend, + contractRPC, topo, depositManagerImplAddr, ) diff --git a/p2p/pkg/rpc/bidder/service.go b/p2p/pkg/rpc/bidder/service.go index 1ba72c979..be6b06ac4 100644 --- a/p2p/pkg/rpc/bidder/service.go +++ b/p2p/pkg/rpc/bidder/service.go @@ -96,6 +96,7 @@ type BidderRegistryContract interface { ParseBidderDeposited(types.Log) (*bidderregistry.BidderregistryBidderDeposited, error) ParseWithdrawalRequested(types.Log) (*bidderregistry.BidderregistryWithdrawalRequested, error) ParseBidderWithdrawal(types.Log) (*bidderregistry.BidderregistryBidderWithdrawal, error) + FilterBidderDeposited(opts *bind.FilterOpts, bidder []common.Address, provider []common.Address, depositedAmount []*big.Int) (*bidderregistry.BidderregistryBidderDepositedIterator, error) } type ProviderRegistryContract interface { @@ -131,6 +132,7 @@ type DepositManagerContract interface { type Backend interface { CodeAt(ctx context.Context, contract common.Address, blockNumber *big.Int) ([]byte, error) + BalanceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (*big.Int, error) } type OptsGetter func(context.Context) (*bind.TransactOpts, error) @@ -407,6 +409,51 @@ func (s *Service) GetDeposit( return &bidderapiv1.DepositResponse{Amount: deposit.String(), Provider: r.Provider}, nil } +func (s *Service) GetAllDeposits( + ctx context.Context, + r *bidderapiv1.GetAllDepositsRequest, +) (*bidderapiv1.GetAllDepositsResponse, error) { + err := s.validator.Validate(r) + if err != nil { + s.logger.Error("get all deposits validation", "error", err) + return nil, status.Errorf(codes.InvalidArgument, "validating get all deposits request: %v", err) + } + + deposits, err := s.registryContract.FilterBidderDeposited( + &bind.FilterOpts{ + Context: ctx, + Start: 0, + End: nil, + }, + []common.Address{s.owner}, // This bidder + []common.Address{}, // all providers + []*big.Int{}, // all amounts + ) + if err != nil { + s.logger.Error("filtering bidder deposited", "error", err) + return nil, status.Errorf(codes.Internal, "filtering bidder deposited: %v", err) + } + + response := &bidderapiv1.GetAllDepositsResponse{} + + for deposits.Next() { + deposit := deposits.Event + response.Deposits = append(response.Deposits, &bidderapiv1.DepositInfo{ + Provider: common.Bytes2Hex(deposit.Provider.Bytes()), + Amount: deposit.DepositedAmount.String(), + }) + } + + balance, err := s.backend.BalanceAt(ctx, s.owner, nil) + if err != nil { + s.logger.Error("getting bidder balance", "error", err) + return nil, status.Errorf(codes.Internal, "getting bidder balance: %v", err) + } + response.BidderBalance = balance.String() + + return response, nil +} + func (s *Service) RequestWithdrawals( ctx context.Context, r *bidderapiv1.RequestWithdrawalsRequest, diff --git a/p2p/pkg/rpc/bidder/service_test.go b/p2p/pkg/rpc/bidder/service_test.go index eb6fcd55a..828ad2013 100644 --- a/p2p/pkg/rpc/bidder/service_test.go +++ b/p2p/pkg/rpc/bidder/service_test.go @@ -158,6 +158,10 @@ func (t *testRegistryContract) ParseBidderWithdrawal(_ types.Log) (*bidderregist }, nil } +func (t *testRegistryContract) FilterBidderDeposited(_ *bind.FilterOpts, _ []common.Address, _ []common.Address, _ []*big.Int) (*bidderregistry.BidderregistryBidderDepositedIterator, error) { + return nil, nil +} + type testTxWatcher struct { logs int } diff --git a/p2p/rpc/bidderapi/v1/bidderapi.proto b/p2p/rpc/bidderapi/v1/bidderapi.proto index 52e90c1a0..8cf088791 100644 --- a/p2p/rpc/bidderapi/v1/bidderapi.proto +++ b/p2p/rpc/bidderapi/v1/bidderapi.proto @@ -102,6 +102,14 @@ service Bidder { }; } + // GetAllDeposits + // + // GetAllDeposits is called by the bidder to get all its deposits in the bidder registry, + // and the balance of the bidder EOA itself. + rpc GetAllDeposits(GetAllDepositsRequest) returns (GetAllDepositsResponse) { + option (google.api.http) = {get: "/v1/bidder/get_all_deposits"}; + } + // Withdraw // // Withdraw is called by the bidder to withdraw their deposit to a provider. @@ -279,6 +287,31 @@ message GetDepositRequest { }]; } +message GetAllDepositsRequest { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { + json_schema: { + title: "GetAllDeposits request" + description: "GetAllDeposits request." + } + }; +} + +message DepositInfo { + string provider = 1; + string amount = 2; +} + +message GetAllDepositsResponse { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { + json_schema: { + title: "GetAllDeposits response" + description: "GetAllDeposits response." + } + }; + repeated DepositInfo deposits = 1; + string bidder_balance = 2; +} + message RequestWithdrawalsRequest { option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { json_schema: { From e1ded49f6898b0e900ae9c590ec61d43028cf143 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 20 Aug 2025 22:14:52 -0700 Subject: [PATCH 080/117] SetTargetDeposits failed: no target deposits provided --- p2p/pkg/rpc/bidder/service.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/p2p/pkg/rpc/bidder/service.go b/p2p/pkg/rpc/bidder/service.go index be6b06ac4..a9c126dc2 100644 --- a/p2p/pkg/rpc/bidder/service.go +++ b/p2p/pkg/rpc/bidder/service.go @@ -652,6 +652,11 @@ func (s *Service) SetTargetDeposits( return nil, status.Errorf(codes.FailedPrecondition, "SetTargetDeposits failed: deposit manager is not enabled") } + if len(r.TargetDeposits) == 0 { + s.logger.Error("SetTargetDeposits failed: no target deposits provided") + return nil, status.Errorf(codes.InvalidArgument, "SetTargetDeposits failed: no target deposits provided") + } + providers := make([]common.Address, len(r.TargetDeposits)) amounts := make([]*big.Int, len(r.TargetDeposits)) for i, targetDeposit := range r.TargetDeposits { From 860e9c16525c9d4e0fb64d4c46743f318e10f915 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 20 Aug 2025 22:23:44 -0700 Subject: [PATCH 081/117] json body --- p2p/gen/go/bidderapi/v1/bidderapi.pb.go | 178 +++++++++--------- p2p/gen/go/bidderapi/v1/bidderapi.pb.gw.go | 32 +--- .../bidderapi/v1/bidderapi.swagger.yaml | 41 +++- p2p/rpc/bidderapi/v1/bidderapi.proto | 10 +- 4 files changed, 138 insertions(+), 123 deletions(-) diff --git a/p2p/gen/go/bidderapi/v1/bidderapi.pb.go b/p2p/gen/go/bidderapi/v1/bidderapi.pb.go index 2cc09d771..13aec4ec1 100644 --- a/p2p/gen/go/bidderapi/v1/bidderapi.pb.go +++ b/p2p/gen/go/bidderapi/v1/bidderapi.pb.go @@ -2428,7 +2428,7 @@ var file_bidderapi_v1_bidderapi_proto_rawDesc = []byte{ 0x66, 0x6f, 0x42, 0x31, 0x92, 0x41, 0x2e, 0x32, 0x2c, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x69, 0x64, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x52, 0x04, 0x62, 0x69, 0x64, 0x73, 0x32, 0xf2, 0x0c, 0x0a, 0x06, + 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x52, 0x04, 0x62, 0x69, 0x64, 0x73, 0x32, 0xf8, 0x0c, 0x0a, 0x06, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x12, 0x53, 0x0a, 0x07, 0x53, 0x65, 0x6e, 0x64, 0x42, 0x69, 0x64, 0x12, 0x11, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x69, 0x64, 0x1a, 0x18, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, @@ -2459,99 +2459,99 @@ var file_bidderapi_v1_bidderapi_proto_rawDesc = []byte{ 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x22, 0x21, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, - 0x12, 0x8c, 0x01, 0x0a, 0x11, 0x53, 0x65, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, + 0x12, 0x8f, 0x01, 0x0a, 0x11, 0x53, 0x65, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, 0x26, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, - 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x73, 0x65, 0x74, 0x5f, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, - 0x98, 0x01, 0x0a, 0x14, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x29, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, - 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x12, 0x21, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, - 0x64, 0x65, 0x72, 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x92, 0x01, 0x0a, 0x12, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, - 0x73, 0x12, 0x27, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, - 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x62, 0x69, 0x64, - 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x3a, 0x01, 0x2a, 0x22, - 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x12, - 0x8c, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x26, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, - 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, - 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x6c, - 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x1f, 0x2e, 0x62, - 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x44, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, - 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, - 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x80, 0x01, 0x0a, - 0x0e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, - 0x23, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x1d, 0x12, 0x1b, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x67, - 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x6c, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, - 0x66, 0x0a, 0x08, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x12, 0x1d, 0x2e, 0x62, 0x69, - 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, - 0x72, 0x61, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x62, 0x69, 0x64, - 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, - 0x61, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x15, 0x22, 0x13, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x77, - 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x12, 0x70, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x42, 0x69, - 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, - 0x12, 0x17, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x67, 0x65, 0x74, - 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x75, 0x0a, 0x11, 0x43, 0x6c, 0x61, - 0x69, 0x6d, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x46, 0x75, 0x6e, 0x64, 0x73, 0x12, 0x1a, - 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, - 0x22, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x63, 0x6c, 0x61, - 0x69, 0x6d, 0x5f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x66, 0x75, 0x6e, 0x64, 0x73, - 0x42, 0xaa, 0x02, 0x92, 0x41, 0x72, 0x12, 0x70, 0x0a, 0x0a, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, - 0x20, 0x41, 0x50, 0x49, 0x2a, 0x55, 0x0a, 0x1b, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, - 0x20, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, - 0x31, 0x2e, 0x31, 0x12, 0x36, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x65, 0x76, 0x2f, 0x6d, - 0x65, 0x76, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x2f, 0x62, 0x6c, 0x6f, 0x62, 0x2f, 0x6d, - 0x61, 0x69, 0x6e, 0x2f, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x32, 0x0b, 0x31, 0x2e, 0x30, - 0x2e, 0x30, 0x2d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x2e, 0x62, 0x69, - 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x42, 0x0e, 0x42, 0x69, 0x64, 0x64, - 0x65, 0x72, 0x61, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x40, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x65, 0x76, 0x2f, - 0x6d, 0x65, 0x76, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x2f, 0x70, 0x32, 0x70, 0x2f, 0x67, - 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2f, - 0x76, 0x31, 0x3b, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x76, 0x31, 0xa2, 0x02, - 0x03, 0x42, 0x58, 0x58, 0xaa, 0x02, 0x0c, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, - 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0c, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x5c, - 0x56, 0x31, 0xe2, 0x02, 0x18, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x5c, 0x56, - 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0d, - 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x3a, + 0x01, 0x2a, 0x22, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x73, + 0x65, 0x74, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x73, 0x12, 0x98, 0x01, 0x0a, 0x14, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x29, 0x2e, 0x62, 0x69, + 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x12, 0x21, 0x2f, 0x76, 0x31, 0x2f, + 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x92, 0x01, + 0x0a, 0x12, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, + 0x77, 0x61, 0x6c, 0x73, 0x12, 0x27, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, + 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, + 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x3a, + 0x01, 0x2a, 0x22, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, + 0x6c, 0x73, 0x12, 0x8c, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x26, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, + 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x27, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x20, 0x12, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x67, 0x65, + 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x73, 0x12, 0x6c, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, + 0x1f, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, + 0x64, 0x65, 0x72, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, + 0x80, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x73, 0x12, 0x23, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x44, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x12, 0x1b, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, + 0x72, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x6c, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x73, 0x12, 0x69, 0x0a, 0x08, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x12, 0x1d, + 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x69, + 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, + 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x69, 0x74, + 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x22, 0x13, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, + 0x64, 0x64, 0x65, 0x72, 0x2f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x12, 0x70, 0x0a, + 0x0a, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x2e, 0x62, 0x69, + 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, + 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x62, + 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, + 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x12, 0x17, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, + 0x65, 0x72, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x12, + 0x75, 0x0a, 0x11, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x46, + 0x75, 0x6e, 0x64, 0x73, 0x12, 0x1a, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x1a, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, + 0x65, 0x72, 0x2f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x5f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, + 0x5f, 0x66, 0x75, 0x6e, 0x64, 0x73, 0x42, 0xaa, 0x02, 0x92, 0x41, 0x72, 0x12, 0x70, 0x0a, 0x0a, + 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x41, 0x50, 0x49, 0x2a, 0x55, 0x0a, 0x1b, 0x42, 0x75, + 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x20, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x4c, 0x69, + 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x31, 0x2e, 0x31, 0x12, 0x36, 0x68, 0x74, 0x74, 0x70, 0x73, + 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, + 0x69, 0x6d, 0x65, 0x76, 0x2f, 0x6d, 0x65, 0x76, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x2f, + 0x62, 0x6c, 0x6f, 0x62, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, + 0x45, 0x32, 0x0b, 0x31, 0x2e, 0x30, 0x2e, 0x30, 0x2d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x0a, 0x10, + 0x63, 0x6f, 0x6d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x42, 0x0e, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x50, 0x01, 0x5a, 0x40, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, + 0x72, 0x69, 0x6d, 0x65, 0x76, 0x2f, 0x6d, 0x65, 0x76, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x2f, 0x70, 0x32, 0x70, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x64, 0x64, + 0x65, 0x72, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x3b, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, + 0x70, 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x42, 0x58, 0x58, 0xaa, 0x02, 0x0c, 0x42, 0x69, 0x64, + 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0c, 0x42, 0x69, 0x64, 0x64, + 0x65, 0x72, 0x61, 0x70, 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x18, 0x42, 0x69, 0x64, 0x64, 0x65, + 0x72, 0x61, 0x70, 0x69, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0xea, 0x02, 0x0d, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x3a, + 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/p2p/gen/go/bidderapi/v1/bidderapi.pb.gw.go b/p2p/gen/go/bidderapi/v1/bidderapi.pb.gw.go index b6d21c068..7497f9fdc 100644 --- a/p2p/gen/go/bidderapi/v1/bidderapi.pb.gw.go +++ b/p2p/gen/go/bidderapi/v1/bidderapi.pb.gw.go @@ -167,21 +167,16 @@ func local_request_Bidder_EnableDepositManager_0(ctx context.Context, marshaler return msg, metadata, err } -var filter_Bidder_SetTargetDeposits_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} - func request_Bidder_SetTargetDeposits_0(ctx context.Context, marshaler runtime.Marshaler, client BidderClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var ( protoReq SetTargetDepositsRequest metadata runtime.ServerMetadata ) - if req.Body != nil { - _, _ = io.Copy(io.Discard, req.Body) - } - if err := req.ParseForm(); err != nil { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Bidder_SetTargetDeposits_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) } msg, err := client.SetTargetDeposits(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err @@ -192,10 +187,7 @@ func local_request_Bidder_SetTargetDeposits_0(ctx context.Context, marshaler run protoReq SetTargetDepositsRequest metadata runtime.ServerMetadata ) - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Bidder_SetTargetDeposits_0); err != nil { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } msg, err := server.SetTargetDeposits(ctx, &protoReq) @@ -327,21 +319,16 @@ func local_request_Bidder_GetAllDeposits_0(ctx context.Context, marshaler runtim return msg, metadata, err } -var filter_Bidder_Withdraw_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} - func request_Bidder_Withdraw_0(ctx context.Context, marshaler runtime.Marshaler, client BidderClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var ( protoReq WithdrawRequest metadata runtime.ServerMetadata ) - if req.Body != nil { - _, _ = io.Copy(io.Discard, req.Body) - } - if err := req.ParseForm(); err != nil { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Bidder_Withdraw_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) } msg, err := client.Withdraw(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err @@ -352,10 +339,7 @@ func local_request_Bidder_Withdraw_0(ctx context.Context, marshaler runtime.Mars protoReq WithdrawRequest metadata runtime.ServerMetadata ) - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Bidder_Withdraw_0); err != nil { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } msg, err := server.Withdraw(ctx, &protoReq) diff --git a/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml b/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml index 2a9a7394f..4f323ac41 100644 --- a/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml +++ b/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml @@ -266,6 +266,13 @@ paths: description: An unexpected error response. schema: $ref: '#/definitions/googlerpcStatus' + parameters: + - name: body + description: OverrideTargetDepositsRequest request. + in: body + required: true + schema: + $ref: '#/definitions/v1SetTargetDepositsRequest' /v1/bidder/withdraw: post: summary: Withdraw @@ -281,14 +288,12 @@ paths: schema: $ref: '#/definitions/googlerpcStatus' parameters: - - name: providers - description: Provider Ethereum addresses. - in: query - required: false - type: array - items: - type: string - collectionFormat: multi + - name: body + description: Withdraw deposits from provider(s). + in: body + required: true + schema: + $ref: '#/definitions/v1WithdrawRequest' definitions: GetBidInfoResponseBidInfo: type: object @@ -608,6 +613,16 @@ definitions: type: string description: Request withdrawals from provider(s). title: RequestWithdrawals response + v1SetTargetDepositsRequest: + type: object + properties: + targetDeposits: + type: array + items: + type: object + $ref: '#/definitions/v1TargetDeposit' + description: OverrideTargetDepositsRequest request. + title: OverrideTargetDepositsRequest request v1SetTargetDepositsResponse: type: object properties: @@ -630,6 +645,16 @@ definitions: targetDeposit: type: string format: uint64 + v1WithdrawRequest: + type: object + properties: + providers: + type: array + items: + type: string + description: Provider Ethereum addresses. + description: Withdraw deposits from provider(s). + title: Withdraw request v1WithdrawResponse: type: object example: diff --git a/p2p/rpc/bidderapi/v1/bidderapi.proto b/p2p/rpc/bidderapi/v1/bidderapi.proto index 8cf088791..e168f7cb4 100644 --- a/p2p/rpc/bidderapi/v1/bidderapi.proto +++ b/p2p/rpc/bidderapi/v1/bidderapi.proto @@ -60,7 +60,10 @@ service Bidder { // within the deposit manager. During this call, the bidder node will also attempt to top-up // deposits for each new target deposit. rpc SetTargetDeposits(SetTargetDepositsRequest) returns (SetTargetDepositsResponse) { - option (google.api.http) = {post: "/v1/bidder/set_target_deposits"}; + option (google.api.http) = { + post: "/v1/bidder/set_target_deposits" + body: "*" + }; } // DepositManagerStatus @@ -114,7 +117,10 @@ service Bidder { // // Withdraw is called by the bidder to withdraw their deposit to a provider. rpc Withdraw(WithdrawRequest) returns (WithdrawResponse) { - option (google.api.http) = {post: "/v1/bidder/withdraw"}; + option (google.api.http) = { + post: "/v1/bidder/withdraw" + body: "*" + }; } // GetBidInfo From 7aa66ad0c079722cebb4a60379408506a92888b7 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 20 Aug 2025 22:33:54 -0700 Subject: [PATCH 082/117] target_deposit is now string --- p2p/gen/go/bidderapi/v1/bidderapi.pb.go | 8 ++++---- p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml | 1 - p2p/integrationtest/real-bidder/main.go | 2 +- p2p/pkg/rpc/bidder/service.go | 5 +++-- p2p/rpc/bidderapi/v1/bidderapi.proto | 2 +- tools/bidder-bot/service/service.go | 2 +- tools/bidder-emulator/bidder.go | 2 +- tools/instant-bridge/service/service.go | 2 +- tools/preconf-rpc/service/service.go | 2 +- 9 files changed, 13 insertions(+), 13 deletions(-) diff --git a/p2p/gen/go/bidderapi/v1/bidderapi.pb.go b/p2p/gen/go/bidderapi/v1/bidderapi.pb.go index 13aec4ec1..a630475c1 100644 --- a/p2p/gen/go/bidderapi/v1/bidderapi.pb.go +++ b/p2p/gen/go/bidderapi/v1/bidderapi.pb.go @@ -335,7 +335,7 @@ type TargetDeposit struct { unknownFields protoimpl.UnknownFields Provider string `protobuf:"bytes,1,opt,name=provider,proto3" json:"provider,omitempty"` - TargetDeposit uint64 `protobuf:"varint,2,opt,name=target_deposit,json=targetDeposit,proto3" json:"target_deposit,omitempty"` + TargetDeposit string `protobuf:"bytes,2,opt,name=target_deposit,json=targetDeposit,proto3" json:"target_deposit,omitempty"` } func (x *TargetDeposit) Reset() { @@ -377,11 +377,11 @@ func (x *TargetDeposit) GetProvider() string { return "" } -func (x *TargetDeposit) GetTargetDeposit() uint64 { +func (x *TargetDeposit) GetTargetDeposit() string { if x != nil { return x.TargetDeposit } - return 0 + return "" } type SetTargetDepositsRequest struct { @@ -1835,7 +1835,7 @@ var file_bidderapi_v1_bidderapi_proto_rawDesc = []byte{ 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x73, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x22, 0xb6, 0x01, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x44, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, diff --git a/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml b/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml index 4f323ac41..c22a28899 100644 --- a/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml +++ b/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml @@ -644,7 +644,6 @@ definitions: type: string targetDeposit: type: string - format: uint64 v1WithdrawRequest: type: object properties: diff --git a/p2p/integrationtest/real-bidder/main.go b/p2p/integrationtest/real-bidder/main.go index 831af92b4..1c97daa9a 100644 --- a/p2p/integrationtest/real-bidder/main.go +++ b/p2p/integrationtest/real-bidder/main.go @@ -229,7 +229,7 @@ func main() { resp, err := bidderClient.SetTargetDeposits(context.Background(), &pb.SetTargetDepositsRequest{ TargetDeposits: []*pb.TargetDeposit{ { - TargetDeposit: minDeposit.Uint64(), + TargetDeposit: minDeposit.String(), Provider: providerAddress, }, }, diff --git a/p2p/pkg/rpc/bidder/service.go b/p2p/pkg/rpc/bidder/service.go index a9c126dc2..edce47cce 100644 --- a/p2p/pkg/rpc/bidder/service.go +++ b/p2p/pkg/rpc/bidder/service.go @@ -661,7 +661,8 @@ func (s *Service) SetTargetDeposits( amounts := make([]*big.Int, len(r.TargetDeposits)) for i, targetDeposit := range r.TargetDeposits { providers[i] = common.HexToAddress(targetDeposit.Provider) - amounts[i] = big.NewInt(int64(targetDeposit.TargetDeposit)) + amounts[i] = big.NewInt(0) + amounts[i].SetString(targetDeposit.TargetDeposit, 10) } tx, err := s.depositManager.SetTargetDeposits(opts, providers, amounts) if err != nil { @@ -685,7 +686,7 @@ func (s *Service) SetTargetDeposits( if targetDeposit, err := s.depositManager.ParseTargetDepositSet(*log); err == nil { response.SuccessfullySetDeposits = append(response.SuccessfullySetDeposits, &bidderapiv1.TargetDeposit{ Provider: common.Bytes2Hex(targetDeposit.Provider.Bytes()), - TargetDeposit: targetDeposit.Amount.Uint64(), + TargetDeposit: targetDeposit.Amount.String(), }) } } diff --git a/p2p/rpc/bidderapi/v1/bidderapi.proto b/p2p/rpc/bidderapi/v1/bidderapi.proto index e168f7cb4..0ced36a6d 100644 --- a/p2p/rpc/bidderapi/v1/bidderapi.proto +++ b/p2p/rpc/bidderapi/v1/bidderapi.proto @@ -236,7 +236,7 @@ message EnableDepositManagerResponse { message TargetDeposit { string provider = 1; - uint64 target_deposit = 2; + string target_deposit = 2; } message SetTargetDepositsRequest { diff --git a/tools/bidder-bot/service/service.go b/tools/bidder-bot/service/service.go index e81dedc31..0c90b40ba 100644 --- a/tools/bidder-bot/service/service.go +++ b/tools/bidder-bot/service/service.go @@ -204,7 +204,7 @@ func New(config *Config) (*Service, error) { for i, provider := range validProviders.ValidProviders { targetDeposits[i] = &bidderapiv1.TargetDeposit{ Provider: provider, - TargetDeposit: config.AutoDepositAmount.Uint64(), + TargetDeposit: config.AutoDepositAmount.String(), } } diff --git a/tools/bidder-emulator/bidder.go b/tools/bidder-emulator/bidder.go index 883f07a07..e7e685f18 100644 --- a/tools/bidder-emulator/bidder.go +++ b/tools/bidder-emulator/bidder.go @@ -78,7 +78,7 @@ func (b *bidder) setup(depositAmount string) error { for i, provider := range validProviders.ValidProviders { targetDeposits[i] = &pb.TargetDeposit{ Provider: provider, - TargetDeposit: depositAmountInt.Uint64(), + TargetDeposit: depositAmountInt.String(), } } diff --git a/tools/instant-bridge/service/service.go b/tools/instant-bridge/service/service.go index be97de58b..db33b9380 100644 --- a/tools/instant-bridge/service/service.go +++ b/tools/instant-bridge/service/service.go @@ -115,7 +115,7 @@ func New(config *Config) (*Service, error) { for i, provider := range validProviders.ValidProviders { targetDeposits[i] = &bidderapiv1.TargetDeposit{ Provider: provider, - TargetDeposit: config.AutoDepositAmount.Uint64(), + TargetDeposit: config.AutoDepositAmount.String(), } } diff --git a/tools/preconf-rpc/service/service.go b/tools/preconf-rpc/service/service.go index 1905a60c0..cbb189595 100644 --- a/tools/preconf-rpc/service/service.go +++ b/tools/preconf-rpc/service/service.go @@ -133,7 +133,7 @@ func New(config *Config) (*Service, error) { for i, provider := range validProviders.ValidProviders { targetDeposits[i] = &bidderapiv1.TargetDeposit{ Provider: provider, - TargetDeposit: config.AutoDepositAmount.Uint64(), + TargetDeposit: config.AutoDepositAmount.String(), } } From 4e6c6aba0857bbfce19995de438d7354669fd47f Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 20 Aug 2025 22:46:59 -0700 Subject: [PATCH 083/117] dedup GetAllDepositsResponse --- p2p/pkg/rpc/bidder/service.go | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/p2p/pkg/rpc/bidder/service.go b/p2p/pkg/rpc/bidder/service.go index edce47cce..8056ba720 100644 --- a/p2p/pkg/rpc/bidder/service.go +++ b/p2p/pkg/rpc/bidder/service.go @@ -434,13 +434,31 @@ func (s *Service) GetAllDeposits( return nil, status.Errorf(codes.Internal, "filtering bidder deposited: %v", err) } - response := &bidderapiv1.GetAllDepositsResponse{} - + providersToQuery := make(map[common.Address]bool) for deposits.Next() { - deposit := deposits.Event + providersToQuery[deposits.Event.Provider] = true + } + if err := deposits.Error(); err != nil { + s.logger.Error("error iterating over deposits", "error", err) + return nil, status.Errorf(codes.Internal, "error iterating over deposits: %v", err) + } + + response := &bidderapiv1.GetAllDepositsResponse{} + for provider := range providersToQuery { + deposit, err := s.registryContract.GetDeposit(&bind.CallOpts{ + From: s.owner, + Context: ctx, + }, s.owner, provider) + if err != nil { + s.logger.Error("getting deposit", "error", err) + return nil, status.Errorf(codes.Internal, "getting deposit: %v", err) + } + if deposit.Cmp(big.NewInt(0)) == 0 { + continue + } response.Deposits = append(response.Deposits, &bidderapiv1.DepositInfo{ - Provider: common.Bytes2Hex(deposit.Provider.Bytes()), - Amount: deposit.DepositedAmount.String(), + Provider: provider.Hex(), + Amount: deposit.String(), }) } From c6d88e0586ad30fb459baed9cc52c0da47d8b000 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Fri, 22 Aug 2025 16:56:59 -0700 Subject: [PATCH 084/117] automatically set target deposits --- p2p/cmd/main.go | 27 +++++++++++++++++++++++---- p2p/pkg/node/node.go | 38 +++++++++++++++++++++++++++++++++++--- 2 files changed, 58 insertions(+), 7 deletions(-) diff --git a/p2p/cmd/main.go b/p2p/cmd/main.go index 373834243..5df2f345b 100644 --- a/p2p/cmd/main.go +++ b/p2p/cmd/main.go @@ -297,10 +297,19 @@ var ( Category: categoryContracts, }) + optionTargetDepositAmount = altsrc.NewStringFlag(&cli.StringFlag{ + Name: "target-deposit-amount", + Usage: "Target deposit amount that'll be set for every valid provider", + // Backwards compatible with prev "auto deposit" feature + EnvVars: []string{"MEV_COMMIT_TARGET_DEPOSIT_AMOUNT", "MEV_COMMIT_AUTODEPOSIT_AMOUNT"}, + Category: categoryBidder, + }) + optionEnableDepositManager = altsrc.NewBoolFlag(&cli.BoolFlag{ - Name: "enable-deposit-manager", - Usage: "Whether the deposit manager should be enabled", - EnvVars: []string{"MEV_COMMIT_ENABLE_DEPOSIT_MANAGER"}, + Name: "enable-deposit-manager", + Usage: "Whether the deposit manager should be enabled", + // Backwards compatible with prev "auto deposit" feature + EnvVars: []string{"MEV_COMMIT_ENABLE_DEPOSIT_MANAGER", "MEV_COMMIT_AUTODEPOSIT_ENABLED"}, Value: false, Category: categoryBidder, }) @@ -496,6 +505,7 @@ func main() { optionValidatorRouterAddr, optionOracleAddr, optionEnableDepositManager, + optionTargetDepositAmount, optionSettlementRPCEndpoint, optionSettlementWSRPCEndpoint, optionNATAddr, @@ -593,8 +603,16 @@ func launchNodeWithConfig(c *cli.Context) (err error) { } var ( - ok bool + targetDepositAmount *big.Int + ok bool ) + if c.String(optionTargetDepositAmount.Name) != "" && c.Bool(optionEnableDepositManager.Name) { + targetDepositAmount, ok = new(big.Int).SetString(c.String(optionTargetDepositAmount.Name), 10) + if !ok { + return fmt.Errorf("failed to parse target deposit amount %q", c.String(optionTargetDepositAmount.Name)) + } + } + crtFile := c.String(optionServerTLSCert.Name) keyFile := c.String(optionServerTLSPrivateKey.Name) if (crtFile == "") != (keyFile == "") { @@ -673,6 +691,7 @@ func launchNodeWithConfig(c *cli.Context) (err error) { BlockTrackerContract: c.String(optionBlockTrackerAddr.Name), ValidatorRouterContract: c.String(optionValidatorRouterAddr.Name), EnableDepositManager: c.Bool(optionEnableDepositManager.Name), + TargetDepositAmount: targetDepositAmount, OracleContract: c.String(optionOracleAddr.Name), RPCEndpoint: c.String(optionSettlementRPCEndpoint.Name), WSRPCEndpoint: c.String(optionSettlementWSRPCEndpoint.Name), diff --git a/p2p/pkg/node/node.go b/p2p/pkg/node/node.go index 676af6f8f..cbc7c7d70 100644 --- a/p2p/pkg/node/node.go +++ b/p2p/pkg/node/node.go @@ -115,6 +115,7 @@ type Options struct { OracleContract string ValidatorRouterContract string EnableDepositManager bool + TargetDepositAmount *big.Int RPCEndpoint string WSRPCEndpoint string NatAddr string @@ -681,11 +682,42 @@ func NewNode(opts *Options) (*Node, error) { bidderapiv1.RegisterBidderServer(grpcServer, bidderAPI) if opts.EnableDepositManager { - resp, err := bidderAPI.EnableDepositManager(context.Background(), &bidderapiv1.EnableDepositManagerRequest{}) - if err != nil || !resp.Success { + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + enableDepositMngrResp, err := bidderAPI.EnableDepositManager(ctx, &bidderapiv1.EnableDepositManagerRequest{}) + if err != nil || !enableDepositMngrResp.Success { opts.Logger.Warn("failed to enable deposit manager", "error", err) + } else { + opts.Logger.Info("deposit manager enabled") + } + if opts.TargetDepositAmount != nil { + providers, err := bidderAPI.GetValidProviders(ctx, &bidderapiv1.GetValidProvidersRequest{}) + if err != nil { + opts.Logger.Warn("failed to get valid providers", "error", err) + } + opts.Logger.Info("valid providers who'll be deposited to", "providers", providers.ValidProviders) + setTargetDepositsReq := &bidderapiv1.SetTargetDepositsRequest{} + for _, provider := range providers.ValidProviders { + setTargetDepositsReq.TargetDeposits = append(setTargetDepositsReq.TargetDeposits, + &bidderapiv1.TargetDeposit{ + Provider: provider, + TargetDeposit: opts.TargetDepositAmount.String(), + }, + ) + } + + setTargetDepositsResp, err := bidderAPI.SetTargetDeposits(ctx, setTargetDepositsReq) + if err != nil { + opts.Logger.Warn("failed to set target deposit amount", "error", err) + } else { + if len(setTargetDepositsResp.SuccessfullySetDeposits) < len(providers.ValidProviders) { + opts.Logger.Warn("failed to set target deposit amount for all valid providers", "error", err) + } else { + opts.Logger.Info("target deposit amount set for all valid providers", "amount", opts.TargetDepositAmount) + } + opts.Logger.Info("successfully topped up providers", "providers", setTargetDepositsResp.SuccessfullyToppedUpProviders) + } } - opts.Logger.Info("deposit manager enabled") } keyexchange := keyexchange.New( From 4c6bf47314102cf17b7e1b60675096e63429d378 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Fri, 22 Aug 2025 17:13:14 -0700 Subject: [PATCH 085/117] separate func --- p2p/pkg/node/node.go | 75 +++++++++++++++++++++++--------------------- 1 file changed, 40 insertions(+), 35 deletions(-) diff --git a/p2p/pkg/node/node.go b/p2p/pkg/node/node.go index cbc7c7d70..ce52551e2 100644 --- a/p2p/pkg/node/node.go +++ b/p2p/pkg/node/node.go @@ -682,41 +682,9 @@ func NewNode(opts *Options) (*Node, error) { bidderapiv1.RegisterBidderServer(grpcServer, bidderAPI) if opts.EnableDepositManager { - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - enableDepositMngrResp, err := bidderAPI.EnableDepositManager(ctx, &bidderapiv1.EnableDepositManagerRequest{}) - if err != nil || !enableDepositMngrResp.Success { - opts.Logger.Warn("failed to enable deposit manager", "error", err) - } else { - opts.Logger.Info("deposit manager enabled") - } - if opts.TargetDepositAmount != nil { - providers, err := bidderAPI.GetValidProviders(ctx, &bidderapiv1.GetValidProvidersRequest{}) - if err != nil { - opts.Logger.Warn("failed to get valid providers", "error", err) - } - opts.Logger.Info("valid providers who'll be deposited to", "providers", providers.ValidProviders) - setTargetDepositsReq := &bidderapiv1.SetTargetDepositsRequest{} - for _, provider := range providers.ValidProviders { - setTargetDepositsReq.TargetDeposits = append(setTargetDepositsReq.TargetDeposits, - &bidderapiv1.TargetDeposit{ - Provider: provider, - TargetDeposit: opts.TargetDepositAmount.String(), - }, - ) - } - - setTargetDepositsResp, err := bidderAPI.SetTargetDeposits(ctx, setTargetDepositsReq) - if err != nil { - opts.Logger.Warn("failed to set target deposit amount", "error", err) - } else { - if len(setTargetDepositsResp.SuccessfullySetDeposits) < len(providers.ValidProviders) { - opts.Logger.Warn("failed to set target deposit amount for all valid providers", "error", err) - } else { - opts.Logger.Info("target deposit amount set for all valid providers", "amount", opts.TargetDepositAmount) - } - opts.Logger.Info("successfully topped up providers", "providers", setTargetDepositsResp.SuccessfullyToppedUpProviders) - } + err = handleEnableDepositManager(bidderAPI, opts) + if err != nil { + opts.Logger.Error("failed to handle enable deposit manager flag", "error", err) } } @@ -1030,3 +998,40 @@ func setDefault(field *string, defaultValue string) { *field = defaultValue } } + +func handleEnableDepositManager(bidderAPI *bidderapi.Service, opts *Options) error { + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + enableDepositMngrResp, err := bidderAPI.EnableDepositManager(ctx, &bidderapiv1.EnableDepositManagerRequest{}) + if err != nil || !enableDepositMngrResp.Success { + return fmt.Errorf("failed to enable deposit manager: %w", err) + } + opts.Logger.Info("deposit manager enabled") + if opts.TargetDepositAmount != nil { + providers, err := bidderAPI.GetValidProviders(ctx, &bidderapiv1.GetValidProvidersRequest{}) + if err != nil { + return fmt.Errorf("failed to get valid providers: %w", err) + } + opts.Logger.Info("valid providers who'll be deposited to", "providers", providers.ValidProviders) + setTargetDepositsReq := &bidderapiv1.SetTargetDepositsRequest{} + for _, provider := range providers.ValidProviders { + setTargetDepositsReq.TargetDeposits = append(setTargetDepositsReq.TargetDeposits, + &bidderapiv1.TargetDeposit{ + Provider: provider, + TargetDeposit: opts.TargetDepositAmount.String(), + }, + ) + } + + setTargetDepositsResp, err := bidderAPI.SetTargetDeposits(ctx, setTargetDepositsReq) + if err != nil { + return fmt.Errorf("failed to set target deposit amount: %w", err) + } + if len(setTargetDepositsResp.SuccessfullySetDeposits) < len(providers.ValidProviders) { + return fmt.Errorf("failed to set target deposit amount for all valid providers: %w", err) + } + opts.Logger.Info("target deposit amount set for all valid providers", "amount", opts.TargetDepositAmount) + opts.Logger.Info("successfully topped up providers", "providers", setTargetDepositsResp.SuccessfullyToppedUpProviders) + } + return nil +} From 8e4f0c23e09bb7bfc7f57fef8353c9e5b56c447f Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Fri, 22 Aug 2025 17:19:10 -0700 Subject: [PATCH 086/117] Update node.go --- p2p/pkg/node/node.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/p2p/pkg/node/node.go b/p2p/pkg/node/node.go index ce52551e2..f474dd150 100644 --- a/p2p/pkg/node/node.go +++ b/p2p/pkg/node/node.go @@ -1003,7 +1003,11 @@ func handleEnableDepositManager(bidderAPI *bidderapi.Service, opts *Options) err ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() enableDepositMngrResp, err := bidderAPI.EnableDepositManager(ctx, &bidderapiv1.EnableDepositManagerRequest{}) - if err != nil || !enableDepositMngrResp.Success { + if err != nil && !strings.Contains(err.Error(), + "EnableDepositManager failed: deposit manager is already enabled") { + return fmt.Errorf("failed to enable deposit manager: %w", err) + } + if !enableDepositMngrResp.Success { return fmt.Errorf("failed to enable deposit manager: %w", err) } opts.Logger.Info("deposit manager enabled") From 86a70d0d4e6ce06d77405dd6707227da14aa2402 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Fri, 22 Aug 2025 17:24:42 -0700 Subject: [PATCH 087/117] Update node.go --- p2p/pkg/node/node.go | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/p2p/pkg/node/node.go b/p2p/pkg/node/node.go index f474dd150..8c11ec236 100644 --- a/p2p/pkg/node/node.go +++ b/p2p/pkg/node/node.go @@ -1003,14 +1003,18 @@ func handleEnableDepositManager(bidderAPI *bidderapi.Service, opts *Options) err ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() enableDepositMngrResp, err := bidderAPI.EnableDepositManager(ctx, &bidderapiv1.EnableDepositManagerRequest{}) - if err != nil && !strings.Contains(err.Error(), - "EnableDepositManager failed: deposit manager is already enabled") { - return fmt.Errorf("failed to enable deposit manager: %w", err) - } - if !enableDepositMngrResp.Success { - return fmt.Errorf("failed to enable deposit manager: %w", err) + if err != nil { + if strings.Contains(err.Error(), "EnableDepositManager failed: deposit manager is already enabled") { + opts.Logger.Info("deposit manager already enabled") + } else { + return fmt.Errorf("failed to enable deposit manager: %w", err) + } + } else { + if enableDepositMngrResp == nil || !enableDepositMngrResp.Success { + return fmt.Errorf("failed to enable deposit manager") + } + opts.Logger.Info("deposit manager enabled") } - opts.Logger.Info("deposit manager enabled") if opts.TargetDepositAmount != nil { providers, err := bidderAPI.GetValidProviders(ctx, &bidderapiv1.GetValidProvidersRequest{}) if err != nil { From c10ddc200a882797757a66ce72ac65a8a1d9af6b Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Fri, 22 Aug 2025 17:43:48 -0700 Subject: [PATCH 088/117] Update node.go --- p2p/pkg/node/node.go | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/p2p/pkg/node/node.go b/p2p/pkg/node/node.go index 8c11ec236..9ad6e9ca3 100644 --- a/p2p/pkg/node/node.go +++ b/p2p/pkg/node/node.go @@ -434,6 +434,8 @@ func NewNode(opts *Options) (*Node, error) { notificationsapiv1.RegisterNotificationsServer(grpcServer, notificationsRPCService) + var bidderAPI *bidderapi.Service + if opts.PeerType != p2p.PeerTypeBootnode.String() { validator, err := protovalidate.New() if err != nil { @@ -662,7 +664,7 @@ func NewNode(opts *Options) (*Node, error) { return nil, errors.New("deposit manager implementation address is not set") } - bidderAPI := bidderapi.NewService( + bidderAPI = bidderapi.NewService( opts.KeySigner.GetAddress(), preconfProto, bidderRegistry, @@ -681,13 +683,6 @@ func NewNode(opts *Options) (*Node, error) { ) bidderapiv1.RegisterBidderServer(grpcServer, bidderAPI) - if opts.EnableDepositManager { - err = handleEnableDepositManager(bidderAPI, opts) - if err != nil { - opts.Logger.Error("failed to handle enable deposit manager flag", "error", err) - } - } - keyexchange := keyexchange.New( topo, p2pSvc, @@ -725,6 +720,13 @@ func NewNode(opts *Options) (*Node, error) { nd.closers = append(nd.closers, channelCloserFunc(closeChan)) } + if bidderAPI != nil && opts.EnableDepositManager { + err = handleEnableDepositManager(bidderAPI, opts) + if err != nil { + opts.Logger.Error("failed to handle enable deposit manager flag", "error", err) + } + } + started := make(chan struct{}) go func() { // signal that the server has started From ed5142c3fe41946cb61ad1f6613e45671b3baf4f Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Mon, 25 Aug 2025 16:52:05 -0700 Subject: [PATCH 089/117] handle zeroed params in service.go --- p2p/pkg/rpc/bidder/service.go | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/p2p/pkg/rpc/bidder/service.go b/p2p/pkg/rpc/bidder/service.go index 8056ba720..ea4428bd2 100644 --- a/p2p/pkg/rpc/bidder/service.go +++ b/p2p/pkg/rpc/bidder/service.go @@ -276,6 +276,12 @@ func (s *Service) Deposit( opts.Value = amount providerAddr := common.HexToAddress(r.Provider) + zeroAddress := common.Address{} + if providerAddr == zeroAddress { + s.logger.Error("provider address is zero address") + return nil, status.Errorf(codes.InvalidArgument, "provider address is zero address") + } + tx, err := s.registryContract.DepositAsBidder(opts, providerAddr) if err != nil { s.logger.Error("depositing", "error", err) @@ -338,7 +344,13 @@ func (s *Service) DepositEvenly( return nil, status.Errorf(codes.InvalidArgument, "total amount must be positive: %v", r.TotalAmount) } - providers := make([]common.Address, len(r.Providers)) + lenProviders := len(r.Providers) + if lenProviders == 0 { + s.logger.Error("at least one provider is required") + return nil, status.Errorf(codes.InvalidArgument, "at least one provider is required") + } + + providers := make([]common.Address, lenProviders) for i, provider := range r.Providers { providers[i] = common.HexToAddress(provider) } @@ -488,7 +500,13 @@ func (s *Service) RequestWithdrawals( return nil, status.Errorf(codes.Internal, "getting transact opts: %v", err) } - providers := make([]common.Address, len(r.Providers)) + lenProviders := len(r.Providers) + if lenProviders == 0 { + s.logger.Error("at least one provider is required") + return nil, status.Errorf(codes.InvalidArgument, "at least one provider is required") + } + + providers := make([]common.Address, lenProviders) for i, provider := range r.Providers { providers[i] = common.HexToAddress(provider) } @@ -550,7 +568,13 @@ func (s *Service) Withdraw( return nil, status.Errorf(codes.Internal, "getting transact opts: %v", err) } - providers := make([]common.Address, len(r.Providers)) + lenProviders := len(r.Providers) + if lenProviders == 0 { + s.logger.Error("at least one provider is required") + return nil, status.Errorf(codes.InvalidArgument, "at least one provider is required") + } + + providers := make([]common.Address, lenProviders) for i, provider := range r.Providers { providers[i] = common.HexToAddress(provider) } From 94fbfad72708452fc6d5b8365362488cd7a54545 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Mon, 25 Aug 2025 17:10:52 -0700 Subject: [PATCH 090/117] DisableDepositManager api --- p2p/gen/go/bidderapi/v1/bidderapi.pb.go | 1830 +++++++++-------- p2p/gen/go/bidderapi/v1/bidderapi.pb.gw.go | 112 +- p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go | 72 +- .../bidderapi/v1/bidderapi.swagger.yaml | 21 + p2p/pkg/rpc/bidder/service.go | 50 +- p2p/pkg/setcode/setcode_test.go | 24 + p2p/rpc/bidderapi/v1/bidderapi.proto | 27 + 7 files changed, 1249 insertions(+), 887 deletions(-) diff --git a/p2p/gen/go/bidderapi/v1/bidderapi.pb.go b/p2p/gen/go/bidderapi/v1/bidderapi.pb.go index a630475c1..632d8c2cb 100644 --- a/p2p/gen/go/bidderapi/v1/bidderapi.pb.go +++ b/p2p/gen/go/bidderapi/v1/bidderapi.pb.go @@ -329,6 +329,91 @@ func (x *EnableDepositManagerResponse) GetSuccess() bool { return false } +type DisableDepositManagerRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *DisableDepositManagerRequest) Reset() { + *x = DisableDepositManagerRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DisableDepositManagerRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DisableDepositManagerRequest) ProtoMessage() {} + +func (x *DisableDepositManagerRequest) ProtoReflect() protoreflect.Message { + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DisableDepositManagerRequest.ProtoReflect.Descriptor instead. +func (*DisableDepositManagerRequest) Descriptor() ([]byte, []int) { + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{6} +} + +type DisableDepositManagerResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` +} + +func (x *DisableDepositManagerResponse) Reset() { + *x = DisableDepositManagerResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DisableDepositManagerResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DisableDepositManagerResponse) ProtoMessage() {} + +func (x *DisableDepositManagerResponse) ProtoReflect() protoreflect.Message { + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DisableDepositManagerResponse.ProtoReflect.Descriptor instead. +func (*DisableDepositManagerResponse) Descriptor() ([]byte, []int) { + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{7} +} + +func (x *DisableDepositManagerResponse) GetSuccess() bool { + if x != nil { + return x.Success + } + return false +} + type TargetDeposit struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -341,7 +426,7 @@ type TargetDeposit struct { func (x *TargetDeposit) Reset() { *x = TargetDeposit{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[6] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -354,7 +439,7 @@ func (x *TargetDeposit) String() string { func (*TargetDeposit) ProtoMessage() {} func (x *TargetDeposit) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[6] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -367,7 +452,7 @@ func (x *TargetDeposit) ProtoReflect() protoreflect.Message { // Deprecated: Use TargetDeposit.ProtoReflect.Descriptor instead. func (*TargetDeposit) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{6} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{8} } func (x *TargetDeposit) GetProvider() string { @@ -395,7 +480,7 @@ type SetTargetDepositsRequest struct { func (x *SetTargetDepositsRequest) Reset() { *x = SetTargetDepositsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[7] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -408,7 +493,7 @@ func (x *SetTargetDepositsRequest) String() string { func (*SetTargetDepositsRequest) ProtoMessage() {} func (x *SetTargetDepositsRequest) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[7] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -421,7 +506,7 @@ func (x *SetTargetDepositsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetTargetDepositsRequest.ProtoReflect.Descriptor instead. func (*SetTargetDepositsRequest) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{7} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{9} } func (x *SetTargetDepositsRequest) GetTargetDeposits() []*TargetDeposit { @@ -443,7 +528,7 @@ type SetTargetDepositsResponse struct { func (x *SetTargetDepositsResponse) Reset() { *x = SetTargetDepositsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[8] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -456,7 +541,7 @@ func (x *SetTargetDepositsResponse) String() string { func (*SetTargetDepositsResponse) ProtoMessage() {} func (x *SetTargetDepositsResponse) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[8] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -469,7 +554,7 @@ func (x *SetTargetDepositsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetTargetDepositsResponse.ProtoReflect.Descriptor instead. func (*SetTargetDepositsResponse) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{8} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{10} } func (x *SetTargetDepositsResponse) GetSuccessfullySetDeposits() []*TargetDeposit { @@ -495,7 +580,7 @@ type DepositManagerStatusRequest struct { func (x *DepositManagerStatusRequest) Reset() { *x = DepositManagerStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[9] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -508,7 +593,7 @@ func (x *DepositManagerStatusRequest) String() string { func (*DepositManagerStatusRequest) ProtoMessage() {} func (x *DepositManagerStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[9] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -521,7 +606,7 @@ func (x *DepositManagerStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DepositManagerStatusRequest.ProtoReflect.Descriptor instead. func (*DepositManagerStatusRequest) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{9} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{11} } type DepositManagerStatusResponse struct { @@ -536,7 +621,7 @@ type DepositManagerStatusResponse struct { func (x *DepositManagerStatusResponse) Reset() { *x = DepositManagerStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[10] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -549,7 +634,7 @@ func (x *DepositManagerStatusResponse) String() string { func (*DepositManagerStatusResponse) ProtoMessage() {} func (x *DepositManagerStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[10] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -562,7 +647,7 @@ func (x *DepositManagerStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DepositManagerStatusResponse.ProtoReflect.Descriptor instead. func (*DepositManagerStatusResponse) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{10} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{12} } func (x *DepositManagerStatusResponse) GetEnabled() bool { @@ -588,7 +673,7 @@ type EmptyMessage struct { func (x *EmptyMessage) Reset() { *x = EmptyMessage{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[11] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -601,7 +686,7 @@ func (x *EmptyMessage) String() string { func (*EmptyMessage) ProtoMessage() {} func (x *EmptyMessage) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[11] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -614,7 +699,7 @@ func (x *EmptyMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use EmptyMessage.ProtoReflect.Descriptor instead. func (*EmptyMessage) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{11} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{13} } type GetDepositRequest struct { @@ -628,7 +713,7 @@ type GetDepositRequest struct { func (x *GetDepositRequest) Reset() { *x = GetDepositRequest{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[12] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -641,7 +726,7 @@ func (x *GetDepositRequest) String() string { func (*GetDepositRequest) ProtoMessage() {} func (x *GetDepositRequest) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[12] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -654,7 +739,7 @@ func (x *GetDepositRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetDepositRequest.ProtoReflect.Descriptor instead. func (*GetDepositRequest) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{12} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{14} } func (x *GetDepositRequest) GetProvider() string { @@ -673,7 +758,7 @@ type GetAllDepositsRequest struct { func (x *GetAllDepositsRequest) Reset() { *x = GetAllDepositsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[13] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -686,7 +771,7 @@ func (x *GetAllDepositsRequest) String() string { func (*GetAllDepositsRequest) ProtoMessage() {} func (x *GetAllDepositsRequest) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[13] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -699,7 +784,7 @@ func (x *GetAllDepositsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAllDepositsRequest.ProtoReflect.Descriptor instead. func (*GetAllDepositsRequest) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{13} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{15} } type DepositInfo struct { @@ -714,7 +799,7 @@ type DepositInfo struct { func (x *DepositInfo) Reset() { *x = DepositInfo{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[14] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -727,7 +812,7 @@ func (x *DepositInfo) String() string { func (*DepositInfo) ProtoMessage() {} func (x *DepositInfo) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[14] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -740,7 +825,7 @@ func (x *DepositInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use DepositInfo.ProtoReflect.Descriptor instead. func (*DepositInfo) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{14} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{16} } func (x *DepositInfo) GetProvider() string { @@ -769,7 +854,7 @@ type GetAllDepositsResponse struct { func (x *GetAllDepositsResponse) Reset() { *x = GetAllDepositsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[15] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -782,7 +867,7 @@ func (x *GetAllDepositsResponse) String() string { func (*GetAllDepositsResponse) ProtoMessage() {} func (x *GetAllDepositsResponse) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[15] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -795,7 +880,7 @@ func (x *GetAllDepositsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAllDepositsResponse.ProtoReflect.Descriptor instead. func (*GetAllDepositsResponse) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{15} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{17} } func (x *GetAllDepositsResponse) GetDeposits() []*DepositInfo { @@ -823,7 +908,7 @@ type RequestWithdrawalsRequest struct { func (x *RequestWithdrawalsRequest) Reset() { *x = RequestWithdrawalsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[16] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -836,7 +921,7 @@ func (x *RequestWithdrawalsRequest) String() string { func (*RequestWithdrawalsRequest) ProtoMessage() {} func (x *RequestWithdrawalsRequest) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[16] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -849,7 +934,7 @@ func (x *RequestWithdrawalsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RequestWithdrawalsRequest.ProtoReflect.Descriptor instead. func (*RequestWithdrawalsRequest) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{16} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{18} } func (x *RequestWithdrawalsRequest) GetProviders() []string { @@ -871,7 +956,7 @@ type RequestWithdrawalsResponse struct { func (x *RequestWithdrawalsResponse) Reset() { *x = RequestWithdrawalsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[17] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -884,7 +969,7 @@ func (x *RequestWithdrawalsResponse) String() string { func (*RequestWithdrawalsResponse) ProtoMessage() {} func (x *RequestWithdrawalsResponse) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[17] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -897,7 +982,7 @@ func (x *RequestWithdrawalsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RequestWithdrawalsResponse.ProtoReflect.Descriptor instead. func (*RequestWithdrawalsResponse) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{17} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{19} } func (x *RequestWithdrawalsResponse) GetProviders() []string { @@ -925,7 +1010,7 @@ type WithdrawRequest struct { func (x *WithdrawRequest) Reset() { *x = WithdrawRequest{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[18] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -938,7 +1023,7 @@ func (x *WithdrawRequest) String() string { func (*WithdrawRequest) ProtoMessage() {} func (x *WithdrawRequest) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[18] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -951,7 +1036,7 @@ func (x *WithdrawRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WithdrawRequest.ProtoReflect.Descriptor instead. func (*WithdrawRequest) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{18} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{20} } func (x *WithdrawRequest) GetProviders() []string { @@ -973,7 +1058,7 @@ type WithdrawResponse struct { func (x *WithdrawResponse) Reset() { *x = WithdrawResponse{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[19] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -986,7 +1071,7 @@ func (x *WithdrawResponse) String() string { func (*WithdrawResponse) ProtoMessage() {} func (x *WithdrawResponse) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[19] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -999,7 +1084,7 @@ func (x *WithdrawResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WithdrawResponse.ProtoReflect.Descriptor instead. func (*WithdrawResponse) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{19} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{21} } func (x *WithdrawResponse) GetAmounts() []string { @@ -1025,7 +1110,7 @@ type GetValidProvidersRequest struct { func (x *GetValidProvidersRequest) Reset() { *x = GetValidProvidersRequest{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[20] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1038,7 +1123,7 @@ func (x *GetValidProvidersRequest) String() string { func (*GetValidProvidersRequest) ProtoMessage() {} func (x *GetValidProvidersRequest) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[20] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1051,7 +1136,7 @@ func (x *GetValidProvidersRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetValidProvidersRequest.ProtoReflect.Descriptor instead. func (*GetValidProvidersRequest) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{20} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{22} } type GetValidProvidersResponse struct { @@ -1065,7 +1150,7 @@ type GetValidProvidersResponse struct { func (x *GetValidProvidersResponse) Reset() { *x = GetValidProvidersResponse{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[21] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1078,7 +1163,7 @@ func (x *GetValidProvidersResponse) String() string { func (*GetValidProvidersResponse) ProtoMessage() {} func (x *GetValidProvidersResponse) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[21] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1091,7 +1176,7 @@ func (x *GetValidProvidersResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetValidProvidersResponse.ProtoReflect.Descriptor instead. func (*GetValidProvidersResponse) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{21} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{23} } func (x *GetValidProvidersResponse) GetValidProviders() []string { @@ -1119,7 +1204,7 @@ type Bid struct { func (x *Bid) Reset() { *x = Bid{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[22] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1132,7 +1217,7 @@ func (x *Bid) String() string { func (*Bid) ProtoMessage() {} func (x *Bid) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[22] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1145,7 +1230,7 @@ func (x *Bid) ProtoReflect() protoreflect.Message { // Deprecated: Use Bid.ProtoReflect.Descriptor instead. func (*Bid) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{22} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{24} } func (x *Bid) GetTxHashes() []string { @@ -1227,7 +1312,7 @@ type Commitment struct { func (x *Commitment) Reset() { *x = Commitment{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[23] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1240,7 +1325,7 @@ func (x *Commitment) String() string { func (*Commitment) ProtoMessage() {} func (x *Commitment) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[23] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1253,7 +1338,7 @@ func (x *Commitment) ProtoReflect() protoreflect.Message { // Deprecated: Use Commitment.ProtoReflect.Descriptor instead. func (*Commitment) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{23} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{25} } func (x *Commitment) GetTxHashes() []string { @@ -1360,7 +1445,7 @@ type GetBidInfoRequest struct { func (x *GetBidInfoRequest) Reset() { *x = GetBidInfoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[24] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1373,7 +1458,7 @@ func (x *GetBidInfoRequest) String() string { func (*GetBidInfoRequest) ProtoMessage() {} func (x *GetBidInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[24] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1386,7 +1471,7 @@ func (x *GetBidInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBidInfoRequest.ProtoReflect.Descriptor instead. func (*GetBidInfoRequest) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{24} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{26} } func (x *GetBidInfoRequest) GetBlockNumber() int64 { @@ -1421,7 +1506,7 @@ type GetBidInfoResponse struct { func (x *GetBidInfoResponse) Reset() { *x = GetBidInfoResponse{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[25] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1434,7 +1519,7 @@ func (x *GetBidInfoResponse) String() string { func (*GetBidInfoResponse) ProtoMessage() {} func (x *GetBidInfoResponse) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[25] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1447,7 +1532,7 @@ func (x *GetBidInfoResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBidInfoResponse.ProtoReflect.Descriptor instead. func (*GetBidInfoResponse) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{25} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{27} } func (x *GetBidInfoResponse) GetBlockBidInfo() []*GetBidInfoResponse_BlockBidInfo { @@ -1473,7 +1558,7 @@ type GetBidInfoResponse_CommitmentWithStatus struct { func (x *GetBidInfoResponse_CommitmentWithStatus) Reset() { *x = GetBidInfoResponse_CommitmentWithStatus{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[26] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1486,7 +1571,7 @@ func (x *GetBidInfoResponse_CommitmentWithStatus) String() string { func (*GetBidInfoResponse_CommitmentWithStatus) ProtoMessage() {} func (x *GetBidInfoResponse_CommitmentWithStatus) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[26] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1499,7 +1584,7 @@ func (x *GetBidInfoResponse_CommitmentWithStatus) ProtoReflect() protoreflect.Me // Deprecated: Use GetBidInfoResponse_CommitmentWithStatus.ProtoReflect.Descriptor instead. func (*GetBidInfoResponse_CommitmentWithStatus) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{25, 0} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{27, 0} } func (x *GetBidInfoResponse_CommitmentWithStatus) GetProviderAddress() string { @@ -1563,7 +1648,7 @@ type GetBidInfoResponse_BidInfo struct { func (x *GetBidInfoResponse_BidInfo) Reset() { *x = GetBidInfoResponse_BidInfo{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[27] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1576,7 +1661,7 @@ func (x *GetBidInfoResponse_BidInfo) String() string { func (*GetBidInfoResponse_BidInfo) ProtoMessage() {} func (x *GetBidInfoResponse_BidInfo) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[27] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1589,7 +1674,7 @@ func (x *GetBidInfoResponse_BidInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBidInfoResponse_BidInfo.ProtoReflect.Descriptor instead. func (*GetBidInfoResponse_BidInfo) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{25, 1} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{27, 1} } func (x *GetBidInfoResponse_BidInfo) GetTxnHashes() []string { @@ -1667,7 +1752,7 @@ type GetBidInfoResponse_BlockBidInfo struct { func (x *GetBidInfoResponse_BlockBidInfo) Reset() { *x = GetBidInfoResponse_BlockBidInfo{} if protoimpl.UnsafeEnabled { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[28] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1680,7 +1765,7 @@ func (x *GetBidInfoResponse_BlockBidInfo) String() string { func (*GetBidInfoResponse_BlockBidInfo) ProtoMessage() {} func (x *GetBidInfoResponse_BlockBidInfo) ProtoReflect() protoreflect.Message { - mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[28] + mi := &file_bidderapi_v1_bidderapi_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1693,7 +1778,7 @@ func (x *GetBidInfoResponse_BlockBidInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBidInfoResponse_BlockBidInfo.ProtoReflect.Descriptor instead. func (*GetBidInfoResponse_BlockBidInfo) Descriptor() ([]byte, []int) { - return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{25, 2} + return file_bidderapi_v1_bidderapi_proto_rawDescGZIP(), []int{27, 2} } func (x *GetBidInfoResponse_BlockBidInfo) GetBlockNumber() int64 { @@ -1831,727 +1916,752 @@ var file_bidderapi_v1_bidderapi_proto_rawDesc = []byte{ 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x1e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2e, 0x22, 0x52, 0x0a, 0x0d, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x22, 0xb6, 0x01, 0x0a, 0x18, 0x53, 0x65, 0x74, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x44, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, - 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, - 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x0e, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x3a, 0x54, 0x92, 0x41, 0x51, - 0x0a, 0x4f, 0x2a, 0x25, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x54, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0x26, 0x4f, 0x76, 0x65, 0x72, 0x72, - 0x69, 0x64, 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x2e, 0x22, 0x97, 0x02, 0x0a, 0x19, 0x53, 0x65, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x57, 0x0a, 0x19, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x5f, - 0x73, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, - 0x17, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x53, 0x65, 0x74, - 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, 0x47, 0x0a, 0x20, 0x73, 0x75, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x5f, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x5f, - 0x75, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x1d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x6c, 0x79, - 0x54, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x55, 0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x73, 0x3a, 0x58, 0x92, 0x41, 0x55, 0x0a, 0x53, 0x2a, 0x27, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, - 0x64, 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x32, 0x28, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x22, 0x61, 0x0a, 0x1b, 0x44, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x3a, 0x42, 0x92, 0x41, 0x3f, 0x0a, - 0x3d, 0x2a, 0x1c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, - 0x1d, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x22, 0xc4, - 0x01, 0x0a, 0x1c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x44, 0x0a, 0x0f, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, - 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x3a, - 0x44, 0x92, 0x41, 0x41, 0x0a, 0x3f, 0x2a, 0x1d, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x72, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x1e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x22, 0x0e, 0x0a, 0x0c, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xb6, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0xa0, 0x01, 0x0a, 0x08, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x83, - 0x01, 0x92, 0x41, 0x1c, 0x32, 0x1a, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x45, - 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, - 0xba, 0x48, 0x61, 0xba, 0x01, 0x5e, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x12, 0x2a, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, - 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, - 0x65, 0x75, 0x6d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x1a, 0x26, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, - 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x34, 0x30, - 0x7d, 0x24, 0x27, 0x29, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x4f, - 0x0a, 0x15, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x3a, 0x36, 0x92, 0x41, 0x33, 0x0a, 0x31, 0x2a, 0x16, - 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x20, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0x17, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x44, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x22, - 0x41, 0x0a, 0x0b, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, - 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, - 0x6e, 0x74, 0x22, 0xb0, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x44, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, - 0x08, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x64, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x5f, 0x62, - 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x62, 0x69, - 0x64, 0x64, 0x65, 0x72, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x3a, 0x38, 0x92, 0x41, 0x35, - 0x0a, 0x33, 0x2a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x18, 0x47, 0x65, 0x74, - 0x41, 0x6c, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x22, 0xa3, 0x02, 0x0a, 0x19, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0xbb, 0x01, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x9c, 0x01, 0x92, 0x41, 0x1e, 0x32, 0x1c, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, - 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2e, 0xba, 0x48, 0x78, 0xba, 0x01, - 0x75, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x36, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, - 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, - 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x65, 0x73, 0x2e, 0x1a, 0x30, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, - 0x2c, 0x20, 0x72, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, - 0x78, 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x34, - 0x30, 0x7d, 0x24, 0x27, 0x29, 0x29, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x73, 0x3a, 0x48, 0x92, 0x41, 0x45, 0x0a, 0x43, 0x2a, 0x1a, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x20, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x32, 0x25, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x77, 0x69, - 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x28, 0x73, 0x29, 0x2e, 0x22, 0x85, 0x02, 0x0a, 0x1a, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, - 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6d, 0x6f, 0x75, - 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x61, 0x6d, 0x6f, 0x75, 0x6e, - 0x74, 0x73, 0x3a, 0xae, 0x01, 0x92, 0x41, 0xaa, 0x01, 0x0a, 0xa7, 0x01, 0x2a, 0x1b, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, - 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x25, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x20, 0x66, - 0x72, 0x6f, 0x6d, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x28, 0x73, 0x29, 0x2e, - 0x4a, 0x61, 0x7b, 0x22, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, - 0x5b, 0x22, 0x30, 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x6e, 0x73, 0x65, 0x2e, 0x22, 0x64, 0x0a, 0x1c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x44, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x3a, 0x44, 0x92, 0x41, 0x41, 0x0a, 0x3f, 0x2a, 0x1d, 0x44, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x72, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0x1e, 0x44, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x72, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x22, 0x81, 0x01, 0x0a, 0x1d, 0x44, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x3a, 0x46, 0x92, 0x41, 0x43, 0x0a, 0x41, 0x2a, 0x1e, 0x44, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x72, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x1f, 0x44, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x72, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x22, 0x52, + 0x0a, 0x0d, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x22, 0xb6, 0x01, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x44, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, + 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x73, 0x3a, 0x54, 0x92, 0x41, 0x51, 0x0a, 0x4f, 0x2a, 0x25, 0x4f, 0x76, + 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x32, 0x26, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x22, 0x97, 0x02, 0x0a, 0x19, + 0x53, 0x65, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x57, 0x0a, 0x19, 0x73, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x64, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x62, + 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x17, 0x73, 0x75, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x53, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x73, 0x12, 0x47, 0x0a, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, + 0x6c, 0x79, 0x5f, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x75, 0x70, 0x5f, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x1d, 0x73, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x54, 0x6f, 0x70, 0x70, 0x65, 0x64, + 0x55, 0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x3a, 0x58, 0x92, 0x41, 0x55, + 0x0a, 0x53, 0x2a, 0x27, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x28, 0x4f, 0x76, 0x65, + 0x72, 0x72, 0x69, 0x64, 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x22, 0x61, 0x0a, 0x1b, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x3a, 0x42, 0x92, 0x41, 0x3f, 0x0a, 0x3d, 0x2a, 0x1c, 0x44, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0x1d, 0x44, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x22, 0xc4, 0x01, 0x0a, 0x1c, 0x44, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x12, 0x44, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x62, + 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x3a, 0x44, 0x92, 0x41, 0x41, 0x0a, 0x3f, + 0x2a, 0x1d, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, + 0x1e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x22, + 0x0e, 0x0a, 0x0c, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, + 0xb6, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0xa0, 0x01, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x83, 0x01, 0x92, 0x41, 0x1c, 0x32, 0x1a, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, + 0x6d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0xba, 0x48, 0x61, 0xba, 0x01, 0x5e, + 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x2a, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x20, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x1a, 0x26, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, + 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x34, 0x30, 0x7d, 0x24, 0x27, 0x29, 0x52, 0x08, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x4f, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x41, + 0x6c, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x3a, 0x36, 0x92, 0x41, 0x33, 0x0a, 0x31, 0x2a, 0x16, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, + 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x32, 0x17, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x22, 0x41, 0x0a, 0x0b, 0x44, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xb0, 0x01, 0x0a, + 0x16, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x64, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x62, 0x69, 0x64, 0x64, + 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, 0x25, + 0x0a, 0x0e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x42, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x3a, 0x38, 0x92, 0x41, 0x35, 0x0a, 0x33, 0x2a, 0x17, 0x47, 0x65, + 0x74, 0x41, 0x6c, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x20, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x18, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x44, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x22, + 0xa3, 0x02, 0x0a, 0x19, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, + 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0xbb, 0x01, + 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x42, 0x9c, 0x01, 0x92, 0x41, 0x1e, 0x32, 0x1c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x65, 0x73, 0x2e, 0xba, 0x48, 0x78, 0xba, 0x01, 0x75, 0x0a, 0x09, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x36, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, + 0x65, 0x75, 0x6d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2e, 0x1a, 0x30, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, 0x2e, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, 0x61, 0x2d, + 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x34, 0x30, 0x7d, 0x24, 0x27, 0x29, 0x29, + 0x52, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x3a, 0x48, 0x92, 0x41, 0x45, + 0x0a, 0x43, 0x2a, 0x1a, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, + 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0x25, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, + 0x61, 0x6c, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x28, 0x73, 0x29, 0x2e, 0x22, 0x85, 0x02, 0x0a, 0x1a, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x07, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x3a, 0xae, 0x01, 0x92, + 0x41, 0xaa, 0x01, 0x0a, 0xa7, 0x01, 0x2a, 0x1b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, + 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x32, 0x25, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x28, 0x73, 0x29, 0x2e, 0x4a, 0x61, 0x7b, 0x22, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x30, 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x5d, 0x2c, 0x20, - 0x22, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x22, 0x5d, 0x7d, 0x22, 0x8d, 0x02, 0x0a, 0x0f, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0xbb, 0x01, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x9c, 0x01, 0x92, 0x41, - 0x1e, 0x32, 0x1c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x45, 0x74, 0x68, 0x65, - 0x72, 0x65, 0x75, 0x6d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2e, 0xba, - 0x48, 0x78, 0xba, 0x01, 0x75, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, - 0x12, 0x36, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, - 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72, 0x72, 0x61, - 0x79, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x20, 0x61, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2e, 0x1a, 0x30, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, - 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, - 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, - 0x39, 0x5d, 0x7b, 0x34, 0x30, 0x7d, 0x24, 0x27, 0x29, 0x29, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x73, 0x3a, 0x3c, 0x92, 0x41, 0x39, 0x0a, 0x37, 0x2a, 0x10, 0x57, 0x69, - 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0x23, - 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x20, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x28, - 0x73, 0x29, 0x2e, 0x22, 0xf6, 0x01, 0x0a, 0x10, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6d, 0x6f, 0x75, - 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x61, 0x6d, 0x6f, 0x75, 0x6e, - 0x74, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, - 0x3a, 0xa9, 0x01, 0x92, 0x41, 0xa5, 0x01, 0x0a, 0x40, 0x2a, 0x11, 0x57, 0x69, 0x74, 0x68, 0x64, - 0x72, 0x61, 0x77, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x2b, 0x57, 0x69, - 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x6e, 0x20, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x20, - 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, - 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0x32, 0x61, 0x7b, 0x22, 0x61, 0x6d, 0x6f, - 0x75, 0x6e, 0x74, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x5d, 0x2c, 0x20, - 0x22, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x30, - 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x5d, 0x2c, 0x20, 0x22, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x5d, 0x7d, 0x22, 0x8d, 0x02, + 0x0a, 0x0f, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0xbb, 0x01, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x9c, 0x01, 0x92, 0x41, 0x1e, 0x32, 0x1c, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x20, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2e, 0xba, 0x48, 0x78, 0xba, 0x01, 0x75, 0x0a, + 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x36, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x45, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, + 0x73, 0x2e, 0x1a, 0x30, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, + 0x72, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, + 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x34, 0x30, 0x7d, + 0x24, 0x27, 0x29, 0x29, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x3a, + 0x3c, 0x92, 0x41, 0x39, 0x0a, 0x37, 0x2a, 0x10, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0x23, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, + 0x61, 0x77, 0x20, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, + 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x28, 0x73, 0x29, 0x2e, 0x22, 0xf6, 0x01, + 0x0a, 0x10, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x07, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x1c, 0x0a, 0x09, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x3a, 0xa9, 0x01, 0x92, 0x41, 0xa5, + 0x01, 0x0a, 0x40, 0x2a, 0x11, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x20, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x2b, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, + 0x6e, 0x20, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x72, 0x79, 0x2e, 0x32, 0x61, 0x7b, 0x22, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x22, 0x3a, + 0x20, 0x5b, 0x22, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x5d, 0x2c, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x30, 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x5d, 0x7d, 0x22, 0x58, 0x0a, 0x18, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x22, 0x5d, 0x7d, 0x22, 0x58, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x3a, 0x3c, 0x92, 0x41, 0x39, 0x0a, 0x37, 0x2a, 0x19, 0x47, 0x65, 0x74, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x20, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x32, 0x1a, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, + 0x22, 0x84, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, + 0x0a, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x3a, 0x3e, 0x92, 0x41, 0x3b, 0x0a, 0x39, 0x2a, 0x1a, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x3a, 0x3c, 0x92, 0x41, 0x39, 0x0a, 0x37, 0x2a, - 0x19, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0x1a, 0x47, 0x65, 0x74, 0x56, + 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x1b, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x20, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x22, 0x84, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x3a, 0x3e, 0x92, - 0x41, 0x3b, 0x0a, 0x39, 0x2a, 0x1a, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x32, 0x1b, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x22, 0xf2, 0x13, - 0x0a, 0x03, 0x42, 0x69, 0x64, 0x12, 0x94, 0x02, 0x0a, 0x09, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, - 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0xf6, 0x01, 0x92, 0x41, 0x78, 0x32, - 0x64, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, - 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x61, 0x73, 0x68, - 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, 0x0f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, - 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0xba, 0x48, 0x78, 0xba, 0x01, 0x75, 0x0a, 0x09, 0x74, - 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x36, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, - 0x68, 0x65, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x2e, - 0x1a, 0x30, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, 0x2e, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, - 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x24, 0x27, - 0x29, 0x29, 0x52, 0x08, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0xe0, 0x01, 0x0a, - 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0xc7, 0x01, - 0x92, 0x41, 0x76, 0x32, 0x6b, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, - 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, - 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, - 0x20, 0x70, 0x61, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, - 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, - 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0xba, 0x48, 0x4b, 0xba, 0x01, 0x48, 0x0a, - 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, - 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, - 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x1d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x5b, 0x31, 0x2d, 0x39, 0x5d, 0x5b, 0x30, - 0x2d, 0x39, 0x5d, 0x2a, 0x24, 0x27, 0x29, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0xb9, 0x01, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x95, 0x01, 0x92, 0x41, 0x47, 0x32, 0x45, 0x4d, 0x61, - 0x78, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x74, - 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, - 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x69, 0x6e, 0x2e, 0xba, 0x48, 0x48, 0xba, 0x01, 0x45, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x25, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x0e, - 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x52, 0x0b, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0xc2, 0x01, 0x0a, 0x15, - 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x42, 0x8d, 0x01, 0x92, 0x41, - 0x2d, 0x32, 0x2b, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, - 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0xba, 0x48, - 0x5a, 0xba, 0x01, 0x57, 0x0a, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2e, 0x64, 0x65, 0x63, - 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x0e, 0x75, 0x69, 0x6e, - 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x52, 0x13, 0x64, 0x65, 0x63, - 0x61, 0x79, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x12, 0xb8, 0x01, 0x0a, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x42, 0x87, - 0x01, 0x92, 0x41, 0x2b, 0x32, 0x29, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, - 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, - 0x20, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0xba, - 0x48, 0x56, 0xba, 0x01, 0x53, 0x0a, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2c, 0x64, 0x65, 0x63, 0x61, - 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x22, 0xf2, 0x13, 0x0a, 0x03, 0x42, 0x69, 0x64, 0x12, + 0x94, 0x02, 0x0a, 0x09, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x42, 0xf6, 0x01, 0x92, 0x41, 0x78, 0x32, 0x64, 0x48, 0x65, 0x78, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, + 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x8a, + 0x01, 0x0f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, + 0x7d, 0xba, 0x48, 0x78, 0xba, 0x01, 0x75, 0x0a, 0x09, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, + 0x65, 0x73, 0x12, 0x36, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x6d, 0x75, + 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x61, 0x72, + 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x2e, 0x1a, 0x30, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, + 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, + 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x24, 0x27, 0x29, 0x29, 0x52, 0x08, 0x74, 0x78, + 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0xe0, 0x01, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0xc7, 0x01, 0x92, 0x41, 0x76, 0x32, 0x6b, 0x41, + 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, + 0x77, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x61, 0x79, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, + 0x39, 0x5d, 0x2b, 0xba, 0x48, 0x4b, 0xba, 0x01, 0x48, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x1f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, + 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, + 0x72, 0x2e, 0x1a, 0x1d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, + 0x28, 0x27, 0x5e, 0x5b, 0x31, 0x2d, 0x39, 0x5d, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2a, 0x24, 0x27, + 0x29, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0xb9, 0x01, 0x0a, 0x0c, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, + 0x42, 0x95, 0x01, 0x92, 0x41, 0x47, 0x32, 0x45, 0x4d, 0x61, 0x78, 0x20, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, + 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x2e, 0xba, 0x48, 0x48, + 0xba, 0x01, 0x45, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x12, 0x25, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x0e, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, - 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x52, 0x11, 0x64, 0x65, 0x63, 0x61, 0x79, 0x45, - 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x8f, 0x02, 0x0a, 0x13, - 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, - 0x68, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x42, 0xde, 0x01, 0x92, 0x41, 0x49, 0x32, - 0x47, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, - 0x6f, 0x66, 0x20, 0x74, 0x78, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, - 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x74, 0x6f, - 0x20, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x62, 0x65, 0x20, 0x64, 0x69, - 0x73, 0x63, 0x61, 0x72, 0x64, 0x65, 0x64, 0x2e, 0xba, 0x48, 0x8e, 0x01, 0xba, 0x01, 0x8a, 0x01, - 0x0a, 0x13, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, - 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x41, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, - 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, - 0x62, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x2e, 0x1a, 0x30, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, - 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, - 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, - 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x24, 0x27, 0x29, 0x29, 0x52, 0x11, 0x72, 0x65, 0x76, 0x65, - 0x72, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0xa3, 0x02, - 0x0a, 0x10, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x42, 0xf7, 0x01, 0x92, 0x41, 0x6e, 0x32, 0x6c, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, - 0x66, 0x20, 0x52, 0x4c, 0x50, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x20, 0x72, 0x61, - 0x77, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x20, 0x74, 0x68, - 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, - 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x69, - 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0xba, 0x48, 0x82, 0x01, - 0xba, 0x01, 0x7f, 0x0a, 0x10, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, - 0x61, 0x6e, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x20, 0x72, 0x61, 0x77, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2e, 0x1a, 0x2d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, - 0x20, 0x72, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, - 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x2a, 0x24, 0x27, - 0x29, 0x29, 0x52, 0x0f, 0x72, 0x61, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0xbf, 0x02, 0x0a, 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x9b, 0x02, 0x92, 0x41, 0x9f, - 0x01, 0x32, 0x93, 0x01, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, - 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x73, - 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x79, - 0x20, 0x66, 0x61, 0x69, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x2e, 0x20, 0x49, 0x66, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, - 0x65, 0x63, 0x61, 0x79, 0x65, 0x64, 0x20, 0x62, 0x69, 0x64, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, - 0x74, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x6c, - 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x2e, 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, - 0xba, 0x48, 0x75, 0xba, 0x01, 0x72, 0x0a, 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, - 0x6e, 0x74, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x3b, 0x74, 0x68, 0x69, - 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x27, 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, - 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x5b, 0x30, 0x2d, 0x39, 0x5d, - 0x2b, 0x24, 0x27, 0x29, 0x20, 0x26, 0x26, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x68, 0x69, - 0x73, 0x29, 0x20, 0x3e, 0x3d, 0x20, 0x30, 0x29, 0x52, 0x0b, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x41, - 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0xba, 0x04, 0x92, 0x41, 0xb6, 0x04, 0x0a, 0x95, 0x01, 0x2a, - 0x0b, 0x42, 0x69, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x40, 0x55, 0x6e, - 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x69, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x73, 0x20, - 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x6d, 0x65, - 0x76, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0xd2, 0x01, - 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0xd2, 0x01, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0xd2, 0x01, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0xd2, 0x01, + 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0xc2, 0x01, 0x0a, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x03, 0x42, 0x8d, 0x01, 0x92, 0x41, 0x2d, 0x32, 0x2b, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x20, 0x64, + 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0xba, 0x48, 0x5a, 0xba, 0x01, 0x57, 0x0a, 0x15, + 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2e, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x6d, 0x75, 0x73, + 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x0e, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x29, 0x20, 0x3e, 0x20, 0x30, 0x52, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0xb8, 0x01, 0x0a, 0x13, 0x64, + 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x42, 0x87, 0x01, 0x92, 0x41, 0x2b, 0x32, 0x29, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, + 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x65, 0x6e, 0x64, 0x73, 0x20, + 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0xba, 0x48, 0x56, 0xba, 0x01, 0x53, 0x0a, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x32, 0x9b, 0x03, 0x7b, 0x22, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, - 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x66, 0x65, 0x34, 0x63, 0x62, 0x34, 0x37, 0x64, 0x62, - 0x33, 0x36, 0x33, 0x30, 0x35, 0x35, 0x31, 0x62, 0x65, 0x65, 0x64, 0x66, 0x62, 0x64, 0x30, 0x32, - 0x61, 0x37, 0x31, 0x65, 0x63, 0x63, 0x36, 0x39, 0x66, 0x64, 0x35, 0x39, 0x37, 0x35, 0x38, 0x65, - 0x32, 0x62, 0x61, 0x36, 0x39, 0x39, 0x36, 0x30, 0x36, 0x65, 0x32, 0x64, 0x35, 0x63, 0x37, 0x34, - 0x32, 0x38, 0x34, 0x66, 0x66, 0x61, 0x37, 0x22, 0x2c, 0x20, 0x22, 0x37, 0x31, 0x63, 0x31, 0x33, - 0x34, 0x38, 0x66, 0x32, 0x64, 0x37, 0x66, 0x66, 0x37, 0x65, 0x38, 0x31, 0x34, 0x66, 0x39, 0x63, - 0x33, 0x36, 0x31, 0x37, 0x39, 0x38, 0x33, 0x37, 0x30, 0x33, 0x34, 0x33, 0x35, 0x65, 0x61, 0x37, - 0x34, 0x34, 0x36, 0x64, 0x65, 0x34, 0x32, 0x30, 0x61, 0x65, 0x61, 0x63, 0x34, 0x38, 0x38, 0x62, - 0x66, 0x31, 0x64, 0x65, 0x33, 0x35, 0x37, 0x33, 0x37, 0x65, 0x38, 0x22, 0x5d, 0x2c, 0x20, 0x22, - 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x2c, 0x20, - 0x22, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x3a, 0x20, - 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3a, - 0x20, 0x31, 0x36, 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x2c, 0x20, 0x22, 0x64, 0x65, - 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x22, 0x3a, 0x20, 0x31, 0x36, 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x2c, 0x20, - 0x22, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, - 0x73, 0x68, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x66, 0x65, 0x34, 0x63, 0x62, 0x34, 0x37, - 0x64, 0x62, 0x33, 0x36, 0x33, 0x30, 0x35, 0x35, 0x31, 0x62, 0x65, 0x65, 0x64, 0x66, 0x62, 0x64, - 0x30, 0x32, 0x61, 0x37, 0x31, 0x65, 0x63, 0x63, 0x36, 0x39, 0x66, 0x64, 0x35, 0x39, 0x37, 0x35, - 0x38, 0x65, 0x32, 0x62, 0x61, 0x36, 0x39, 0x39, 0x36, 0x30, 0x36, 0x65, 0x32, 0x64, 0x35, 0x63, - 0x37, 0x34, 0x32, 0x38, 0x34, 0x66, 0x66, 0x61, 0x37, 0x22, 0x5d, 0x2c, 0x20, 0x22, 0x73, 0x6c, - 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x35, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x22, 0x7d, 0x22, 0xc2, 0x0d, 0x0a, 0x0a, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x95, 0x01, 0x0a, 0x09, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x78, 0x92, 0x41, 0x75, 0x32, 0x61, 0x48, 0x65, 0x78, 0x20, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, - 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x61, 0x73, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, - 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, - 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, - 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, 0x0f, - 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x52, - 0x08, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x8f, 0x01, 0x0a, 0x0a, 0x62, 0x69, - 0x64, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x70, - 0x92, 0x41, 0x6d, 0x32, 0x6b, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, - 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, - 0x65, 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, 0x61, 0x67, 0x72, 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, - 0x20, 0x70, 0x61, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, - 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, - 0x52, 0x09, 0x62, 0x69, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x6d, 0x0a, 0x0c, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x03, 0x42, 0x4a, 0x92, 0x41, 0x47, 0x32, 0x45, 0x4d, 0x61, 0x78, 0x20, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, + 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2c, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, + 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, + 0x72, 0x2e, 0x1a, 0x0e, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, + 0x20, 0x30, 0x52, 0x11, 0x64, 0x65, 0x63, 0x61, 0x79, 0x45, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x8f, 0x02, 0x0a, 0x13, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, + 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x09, 0x42, 0xde, 0x01, 0x92, 0x41, 0x49, 0x32, 0x47, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x78, 0x20, + 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x76, 0x65, 0x72, + 0x74, 0x20, 0x6f, 0x72, 0x20, 0x62, 0x65, 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x65, + 0x64, 0x2e, 0xba, 0x48, 0x8e, 0x01, 0xba, 0x01, 0x8a, 0x01, 0x0a, 0x13, 0x72, 0x65, 0x76, 0x65, + 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, + 0x41, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, + 0x73, 0x68, 0x65, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x6e, 0x20, + 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, + 0x73, 0x2e, 0x1a, 0x30, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, + 0x72, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, + 0x3f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, + 0x24, 0x27, 0x29, 0x29, 0x52, 0x11, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x54, + 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0xa3, 0x02, 0x0a, 0x10, 0x72, 0x61, 0x77, 0x5f, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, + 0x28, 0x09, 0x42, 0xf7, 0x01, 0x92, 0x41, 0x6e, 0x32, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x52, 0x4c, 0x50, 0x20, + 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x20, 0x72, 0x61, 0x77, 0x20, 0x73, 0x69, 0x67, 0x6e, + 0x65, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, + 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, + 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0xba, 0x48, 0x82, 0x01, 0xba, 0x01, 0x7f, 0x0a, 0x10, 0x72, + 0x61, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x3c, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x72, 0x72, + 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x72, 0x61, 0x77, 0x20, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x1a, 0x2d, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x20, 0x72, 0x2e, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x28, 0x30, 0x78, 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x66, + 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x2a, 0x24, 0x27, 0x29, 0x29, 0x52, 0x0f, 0x72, 0x61, + 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xbf, 0x02, + 0x0a, 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x9b, 0x02, 0x92, 0x41, 0x9f, 0x01, 0x32, 0x93, 0x01, 0x41, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, + 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x20, + 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x7a, + 0x65, 0x72, 0x6f, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x65, 0x64, + 0x20, 0x62, 0x69, 0x64, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x75, + 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, + 0x2e, 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0xba, 0x48, 0x75, 0xba, 0x01, 0x72, + 0x0a, 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, + 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6d, 0x75, 0x73, + 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x65, 0x72, 0x2e, 0x1a, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x27, + 0x27, 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, + 0x65, 0x73, 0x28, 0x27, 0x5e, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x24, 0x27, 0x29, 0x20, 0x26, + 0x26, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x3d, 0x20, + 0x30, 0x29, 0x52, 0x0b, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x3a, + 0xba, 0x04, 0x92, 0x41, 0xb6, 0x04, 0x0a, 0x95, 0x01, 0x2a, 0x0b, 0x42, 0x69, 0x64, 0x20, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x40, 0x55, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, + 0x20, 0x62, 0x69, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x66, 0x72, 0x6f, + 0x6d, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x6d, 0x65, 0x76, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0xd2, 0x01, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0xd2, 0x01, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0xd2, 0x01, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0xd2, 0x01, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, + 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x32, 0x9b, + 0x03, 0x7b, 0x22, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, + 0x22, 0x66, 0x65, 0x34, 0x63, 0x62, 0x34, 0x37, 0x64, 0x62, 0x33, 0x36, 0x33, 0x30, 0x35, 0x35, + 0x31, 0x62, 0x65, 0x65, 0x64, 0x66, 0x62, 0x64, 0x30, 0x32, 0x61, 0x37, 0x31, 0x65, 0x63, 0x63, + 0x36, 0x39, 0x66, 0x64, 0x35, 0x39, 0x37, 0x35, 0x38, 0x65, 0x32, 0x62, 0x61, 0x36, 0x39, 0x39, + 0x36, 0x30, 0x36, 0x65, 0x32, 0x64, 0x35, 0x63, 0x37, 0x34, 0x32, 0x38, 0x34, 0x66, 0x66, 0x61, + 0x37, 0x22, 0x2c, 0x20, 0x22, 0x37, 0x31, 0x63, 0x31, 0x33, 0x34, 0x38, 0x66, 0x32, 0x64, 0x37, + 0x66, 0x66, 0x37, 0x65, 0x38, 0x31, 0x34, 0x66, 0x39, 0x63, 0x33, 0x36, 0x31, 0x37, 0x39, 0x38, + 0x33, 0x37, 0x30, 0x33, 0x34, 0x33, 0x35, 0x65, 0x61, 0x37, 0x34, 0x34, 0x36, 0x64, 0x65, 0x34, + 0x32, 0x30, 0x61, 0x65, 0x61, 0x63, 0x34, 0x38, 0x38, 0x62, 0x66, 0x31, 0x64, 0x65, 0x33, 0x35, + 0x37, 0x33, 0x37, 0x65, 0x38, 0x22, 0x5d, 0x2c, 0x20, 0x22, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x22, 0x3a, 0x20, 0x22, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, + 0x2c, 0x20, 0x22, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3a, 0x20, 0x31, 0x36, 0x33, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, + 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3a, 0x20, 0x31, 0x36, + 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x2c, 0x20, 0x22, 0x72, 0x65, 0x76, 0x65, 0x72, + 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x22, 0x3a, + 0x20, 0x5b, 0x22, 0x66, 0x65, 0x34, 0x63, 0x62, 0x34, 0x37, 0x64, 0x62, 0x33, 0x36, 0x33, 0x30, + 0x35, 0x35, 0x31, 0x62, 0x65, 0x65, 0x64, 0x66, 0x62, 0x64, 0x30, 0x32, 0x61, 0x37, 0x31, 0x65, + 0x63, 0x63, 0x36, 0x39, 0x66, 0x64, 0x35, 0x39, 0x37, 0x35, 0x38, 0x65, 0x32, 0x62, 0x61, 0x36, + 0x39, 0x39, 0x36, 0x30, 0x36, 0x65, 0x32, 0x64, 0x35, 0x63, 0x37, 0x34, 0x32, 0x38, 0x34, 0x66, + 0x66, 0x61, 0x37, 0x22, 0x5d, 0x2c, 0x20, 0x22, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x35, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x7d, 0x22, 0xc2, 0x0d, 0x0a, + 0x0a, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x95, 0x01, 0x0a, 0x09, + 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, + 0x78, 0x92, 0x41, 0x75, 0x32, 0x61, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x68, 0x61, 0x73, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, - 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x2e, 0x52, 0x0b, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x7b, 0x0a, 0x13, 0x72, 0x65, - 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4b, 0x92, 0x41, 0x48, 0x32, 0x46, 0x48, 0x65, - 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, - 0x67, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x73, - 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, - 0x64, 0x65, 0x72, 0x2e, 0x52, 0x11, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x42, 0x69, - 0x64, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x7d, 0x0a, 0x16, 0x72, 0x65, 0x63, 0x65, 0x69, - 0x76, 0x65, 0x64, 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x47, 0x92, 0x41, 0x44, 0x32, 0x42, 0x48, 0x65, - 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, - 0x67, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x6f, - 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, - 0x74, 0x20, 0x73, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x62, 0x69, 0x64, 0x2e, - 0x52, 0x14, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x42, 0x69, 0x64, 0x53, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x62, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x35, 0x92, 0x41, 0x32, 0x32, 0x30, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, 0x0f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, + 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x52, 0x08, 0x74, 0x78, 0x48, 0x61, 0x73, + 0x68, 0x65, 0x73, 0x12, 0x8f, 0x01, 0x0a, 0x0a, 0x62, 0x69, 0x64, 0x5f, 0x61, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x70, 0x92, 0x41, 0x6d, 0x32, 0x6b, 0x41, + 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x68, 0x61, 0x73, + 0x20, 0x61, 0x67, 0x72, 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x61, 0x79, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x52, 0x09, 0x62, 0x69, 0x64, 0x41, + 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x6d, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x4a, 0x92, 0x41, 0x47, + 0x32, 0x45, 0x4d, 0x61, 0x78, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, + 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x2e, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x12, 0x7b, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, + 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x4b, 0x92, 0x41, 0x48, 0x32, 0x46, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x64, - 0x69, 0x67, 0x65, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x9e, 0x01, 0x0a, 0x14, 0x63, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x6b, 0x92, 0x41, 0x68, 0x32, 0x66, - 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, - 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, - 0x6e, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, - 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x13, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, - 0x6e, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x10, + 0x69, 0x67, 0x65, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, + 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, + 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2e, 0x52, 0x11, + 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x42, 0x69, 0x64, 0x44, 0x69, 0x67, 0x65, 0x73, + 0x74, 0x12, 0x7d, 0x0a, 0x16, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x62, 0x69, + 0x64, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x47, 0x92, 0x41, 0x44, 0x32, 0x42, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x73, + 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x73, 0x65, 0x6e, 0x74, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x62, 0x69, 0x64, 0x2e, 0x52, 0x14, 0x72, 0x65, 0x63, 0x65, + 0x69, 0x76, 0x65, 0x64, 0x42, 0x69, 0x64, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x12, 0x62, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x64, + 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x35, 0x92, 0x41, 0x32, + 0x32, 0x30, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, + 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x52, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x69, + 0x67, 0x65, 0x73, 0x74, 0x12, 0x9e, 0x01, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, + 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x6b, 0x92, 0x41, 0x68, 0x32, 0x66, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, + 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x67, + 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x52, 0x13, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x5d, 0x92, 0x41, 0x5a, 0x32, 0x58, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x73, + 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x52, + 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x12, 0x64, 0x0a, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x42, + 0x30, 0x92, 0x41, 0x2d, 0x32, 0x2b, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, + 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, + 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, + 0x2e, 0x52, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x5e, 0x0a, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, + 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x03, 0x42, 0x2e, 0x92, 0x41, 0x2b, 0x32, 0x29, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x62, 0x69, 0x64, 0x20, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, + 0x6e, 0x67, 0x2e, 0x52, 0x11, 0x64, 0x65, 0x63, 0x61, 0x79, 0x45, 0x6e, 0x64, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x63, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, + 0x63, 0x68, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x03, 0x42, 0x34, 0x92, 0x41, 0x31, 0x32, 0x2f, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x70, 0x75, + 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x2e, 0x52, 0x11, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, + 0x63, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x7c, 0x0a, 0x13, 0x72, + 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, + 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x42, 0x4c, 0x92, 0x41, 0x49, 0x32, 0x47, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x78, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, + 0x65, 0x76, 0x65, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x62, 0x65, 0x20, 0x64, 0x69, 0x73, 0x63, + 0x61, 0x72, 0x64, 0x65, 0x64, 0x2e, 0x52, 0x11, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, + 0x67, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x85, 0x01, 0x0a, 0x0c, 0x73, 0x6c, + 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x62, 0x92, 0x41, 0x5f, 0x32, 0x5d, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, + 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, + 0x65, 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x79, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x0b, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x41, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x3a, 0x5e, 0x92, 0x41, 0x5b, 0x0a, 0x59, 0x2a, 0x12, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x43, 0x43, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, + 0x20, 0x6d, 0x65, 0x76, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x20, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x22, 0xbe, 0x02, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x9f, 0x01, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x42, 0x7c, + 0x92, 0x41, 0x79, 0x32, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x66, 0x6f, + 0x2e, 0x20, 0x49, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, + 0x65, 0x64, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x73, 0x63, 0x65, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x52, 0x0b, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x04, 0x70, 0x61, 0x67, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x20, 0x92, 0x41, 0x1d, 0x32, 0x1b, 0x50, 0x61, + 0x67, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x61, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, + 0x51, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x42, 0x3b, + 0x92, 0x41, 0x38, 0x32, 0x36, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x70, 0x61, 0x67, 0x65, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x69, 0x73, 0x20, 0x35, 0x30, 0x52, 0x05, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x22, 0xe0, 0x11, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x97, 0x01, 0x0a, 0x0e, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, + 0x6f, 0x42, 0x42, 0x92, 0x41, 0x3f, 0x32, 0x3d, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x62, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x69, 0x64, 0x73, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x52, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x69, 0x64, 0x49, + 0x6e, 0x66, 0x6f, 0x1a, 0xf4, 0x04, 0x0a, 0x14, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, + 0x6e, 0x74, 0x57, 0x69, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x7e, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x5d, 0x92, 0x41, 0x5a, 0x32, 0x58, 0x48, 0x65, 0x78, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x53, 0x92, 0x41, 0x50, 0x32, 0x4e, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x2e, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x64, 0x0a, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x03, 0x42, 0x30, 0x92, 0x41, 0x2d, 0x32, 0x2b, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x20, 0x64, 0x65, - 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x5e, 0x0a, 0x13, - 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x42, 0x2e, 0x92, 0x41, 0x2b, 0x32, 0x29, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, - 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x65, 0x6e, 0x64, 0x73, 0x20, - 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x11, 0x64, 0x65, 0x63, 0x61, 0x79, - 0x45, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x63, 0x0a, 0x12, + 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x0f, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x63, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x42, 0x34, 0x92, 0x41, 0x31, 0x32, 0x2f, 0x54, + 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x42, 0x34, 0x92, 0x41, 0x31, 0x32, 0x2f, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x2e, 0x52, 0x11, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x12, 0x7c, 0x0a, 0x13, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, - 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x42, 0x4c, - 0x92, 0x41, 0x49, 0x32, 0x47, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x72, - 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x78, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, - 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, - 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x62, - 0x65, 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x65, 0x64, 0x2e, 0x52, 0x11, 0x72, 0x65, - 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, - 0x85, 0x01, 0x0a, 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x42, 0x62, 0x92, 0x41, 0x5f, 0x32, 0x5d, 0x41, 0x6d, 0x6f, - 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, - 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x20, - 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x20, 0x74, - 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x0b, 0x73, 0x6c, 0x61, 0x73, - 0x68, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x5e, 0x92, 0x41, 0x5b, 0x0a, 0x59, 0x2a, 0x12, - 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x32, 0x43, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x6d, 0x65, 0x76, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x22, 0xbe, 0x02, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x42, - 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x9f, 0x01, - 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x03, 0x42, 0x7c, 0x92, 0x41, 0x79, 0x32, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x61, 0x6c, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x20, 0x66, 0x6f, 0x72, 0x20, 0x71, 0x75, 0x65, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x69, - 0x64, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, - 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6b, 0x6e, - 0x6f, 0x77, 0x6e, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x69, - 0x6e, 0x20, 0x61, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x64, 0x65, - 0x72, 0x2e, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, - 0x34, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x20, 0x92, - 0x41, 0x1d, 0x32, 0x1b, 0x50, 0x61, 0x67, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, - 0x66, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, - 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x51, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x05, 0x42, 0x3b, 0x92, 0x41, 0x38, 0x32, 0x36, 0x4e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x70, - 0x61, 0x67, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x20, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x69, 0x73, 0x20, 0x35, - 0x30, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0xe0, 0x11, 0x0a, 0x12, 0x47, 0x65, 0x74, - 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x97, 0x01, 0x0a, 0x0e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x69, 0x6e, - 0x66, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, - 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x42, 0x92, 0x41, 0x3f, 0x32, 0x3d, 0x4c, 0x69, - 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x62, 0x69, 0x64, 0x20, - 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, - 0x62, 0x69, 0x64, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x63, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x52, 0x0c, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0xf4, 0x04, 0x0a, 0x14, 0x43, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x57, 0x69, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x7e, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x53, 0x92, 0x41, - 0x50, 0x32, 0x4e, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, - 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, - 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x12, 0x63, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x42, 0x34, - 0x92, 0x41, 0x31, 0x32, 0x2f, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, - 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, - 0x68, 0x65, 0x64, 0x2e, 0x52, 0x11, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x86, 0x01, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x6e, 0x92, 0x41, 0x6b, 0x32, 0x69, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x20, 0x50, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, - 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x3a, 0x20, 0x27, 0x70, 0x65, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x27, 0x2c, 0x20, 0x27, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x27, - 0x6f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x27, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, - 0x64, 0x27, 0x2c, 0x20, 0x27, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x27, - 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x27, 0x2e, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x4e, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x34, 0x92, 0x41, 0x31, 0x32, 0x2f, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x61, 0x6c, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x12, 0x48, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x2e, 0x92, 0x41, 0x2b, 0x32, 0x29, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x20, - 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x77, 0x65, 0x69, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x54, 0x0a, 0x06, 0x72, 0x65, - 0x66, 0x75, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3c, 0x92, 0x41, 0x39, 0x32, - 0x37, 0x52, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x69, - 0x6e, 0x20, 0x77, 0x65, 0x69, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x69, 0x66, 0x20, 0x61, 0x70, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x52, 0x06, 0x72, 0x65, 0x66, 0x75, 0x6e, 0x64, - 0x1a, 0xdb, 0x09, 0x0a, 0x07, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x9a, 0x01, 0x0a, - 0x0a, 0x74, 0x78, 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x42, 0x7b, 0x92, 0x41, 0x78, 0x32, 0x64, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x68, - 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, - 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x69, - 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, 0x0f, 0x5b, - 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x52, 0x09, - 0x74, 0x78, 0x6e, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x92, 0x01, 0x0a, 0x15, 0x72, 0x65, - 0x76, 0x65, 0x72, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x74, 0x78, 0x6e, 0x5f, 0x68, 0x61, 0x73, - 0x68, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0x5e, 0x92, 0x41, 0x5b, 0x32, 0x47, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, - 0x66, 0x20, 0x74, 0x78, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, - 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, - 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x62, 0x65, 0x20, 0x64, 0x69, 0x73, - 0x63, 0x61, 0x72, 0x64, 0x65, 0x64, 0x2e, 0x8a, 0x01, 0x0f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, - 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x52, 0x13, 0x72, 0x65, 0x76, 0x65, 0x72, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x6e, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x69, - 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x03, 0x42, 0x46, 0x92, 0x41, 0x43, 0x32, 0x41, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x70, 0x12, 0x86, 0x01, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x6e, 0x92, 0x41, 0x6b, 0x32, 0x69, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x20, 0x50, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x3a, 0x20, 0x27, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x27, 0x2c, 0x20, 0x27, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x27, 0x6f, 0x70, 0x65, 0x6e, 0x65, 0x64, + 0x27, 0x2c, 0x20, 0x27, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x27, 0x73, + 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x27, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, + 0x27, 0x2e, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4e, 0x0a, 0x07, 0x64, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x34, 0x92, 0x41, 0x31, + 0x32, 0x2f, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x2e, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x48, 0x0a, 0x07, 0x70, 0x61, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2e, 0x92, 0x41, 0x2b, + 0x32, 0x29, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x20, 0x69, 0x6e, 0x20, 0x77, 0x65, 0x69, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x07, 0x70, 0x61, 0x79, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x54, 0x0a, 0x06, 0x72, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x3c, 0x92, 0x41, 0x39, 0x32, 0x37, 0x52, 0x65, 0x66, 0x75, 0x6e, + 0x64, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x77, 0x65, 0x69, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, + 0x6e, 0x74, 0x2c, 0x20, 0x69, 0x66, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x52, 0x06, 0x72, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x1a, 0xdb, 0x09, 0x0a, 0x07, 0x42, + 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x9a, 0x01, 0x0a, 0x0a, 0x74, 0x78, 0x6e, 0x5f, 0x68, + 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x7b, 0x92, 0x41, 0x78, + 0x32, 0x64, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, + 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x61, 0x73, + 0x68, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, - 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x2e, 0x52, 0x0b, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x98, 0x01, 0x0a, 0x0a, 0x62, 0x69, - 0x64, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x79, - 0x92, 0x41, 0x76, 0x32, 0x6b, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, - 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, - 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, - 0x20, 0x70, 0x61, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, - 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, - 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x52, 0x09, 0x62, 0x69, 0x64, 0x41, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x64, 0x0a, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x03, 0x42, 0x30, 0x92, 0x41, 0x2d, 0x32, 0x2b, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x62, 0x69, 0x64, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, - 0x79, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x5e, 0x0a, 0x13, 0x64, 0x65, - 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x42, 0x2e, 0x92, 0x41, 0x2b, 0x32, 0x29, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x64, 0x65, - 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x11, 0x64, 0x65, 0x63, 0x61, 0x79, 0x45, 0x6e, - 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x6a, 0x0a, 0x0a, 0x62, 0x69, - 0x64, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4b, - 0x92, 0x41, 0x48, 0x32, 0x46, 0x48, 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, - 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x69, 0x67, 0x65, - 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2e, 0x52, 0x09, 0x62, 0x69, 0x64, - 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0xc7, 0x01, 0x0a, 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, - 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0xa3, 0x01, - 0x92, 0x41, 0x9f, 0x01, 0x32, 0x93, 0x01, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, - 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, - 0x65, 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x79, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x2c, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x65, 0x64, 0x20, 0x62, 0x69, 0x64, 0x20, 0x61, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, - 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x2e, 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, - 0x39, 0x5d, 0x2b, 0x52, 0x0b, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x57, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, - 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, - 0x6e, 0x74, 0x57, 0x69, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0b, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x43, 0x92, 0x41, 0x40, 0x0a, 0x3e, - 0x2a, 0x08, 0x42, 0x69, 0x64, 0x20, 0x49, 0x6e, 0x66, 0x6f, 0x32, 0x32, 0x49, 0x6e, 0x66, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x61, 0x20, - 0x62, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x74, - 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x1a, 0xda, - 0x01, 0x0a, 0x0c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x59, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x03, 0x42, 0x36, 0x92, 0x41, 0x33, 0x32, 0x31, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x77, 0x68, 0x69, - 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x20, - 0x69, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x2e, 0x52, 0x0b, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x6f, 0x0a, 0x04, 0x62, 0x69, - 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, - 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x42, 0x69, 0x64, 0x49, 0x6e, - 0x66, 0x6f, 0x42, 0x31, 0x92, 0x41, 0x2e, 0x32, 0x2c, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, - 0x20, 0x62, 0x69, 0x64, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x70, - 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x52, 0x04, 0x62, 0x69, 0x64, 0x73, 0x32, 0xf8, 0x0c, 0x0a, 0x06, - 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x12, 0x53, 0x0a, 0x07, 0x53, 0x65, 0x6e, 0x64, 0x42, 0x69, - 0x64, 0x12, 0x11, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x42, 0x69, 0x64, 0x1a, 0x18, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x19, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x3a, 0x01, 0x2a, 0x22, 0x0e, 0x2f, 0x76, 0x31, 0x2f, 0x62, - 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x62, 0x69, 0x64, 0x30, 0x01, 0x12, 0x6b, 0x0a, 0x07, 0x44, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x1c, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x22, 0x1b, 0x2f, 0x76, 0x31, - 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x2f, - 0x7b, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x7d, 0x12, 0x7b, 0x0a, 0x0d, 0x44, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x12, 0x22, 0x2e, 0x62, 0x69, 0x64, 0x64, - 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x45, 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, - 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x19, 0x2f, 0x76, 0x31, 0x2f, - 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x65, - 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x12, 0x98, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x12, 0x29, - 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x62, 0x69, 0x64, 0x64, - 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x44, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x22, 0x21, 0x2f, - 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, - 0x12, 0x8f, 0x01, 0x0a, 0x11, 0x53, 0x65, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, 0x26, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, - 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, - 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x3a, - 0x01, 0x2a, 0x22, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x73, - 0x65, 0x74, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x73, 0x12, 0x98, 0x01, 0x0a, 0x14, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x29, 0x2e, 0x62, 0x69, - 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x12, 0x21, 0x2f, 0x76, 0x31, 0x2f, - 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x6d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x92, 0x01, - 0x0a, 0x12, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, - 0x77, 0x61, 0x6c, 0x73, 0x12, 0x27, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, - 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, + 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, 0x0f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, + 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x36, 0x34, 0x7d, 0x52, 0x09, 0x74, 0x78, 0x6e, 0x48, 0x61, 0x73, + 0x68, 0x65, 0x73, 0x12, 0x92, 0x01, 0x0a, 0x15, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x74, 0x78, 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x09, 0x42, 0x5e, 0x92, 0x41, 0x5b, 0x32, 0x47, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x78, 0x20, 0x68, + 0x61, 0x73, 0x68, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, + 0x20, 0x6f, 0x72, 0x20, 0x62, 0x65, 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x65, 0x64, + 0x2e, 0x8a, 0x01, 0x0f, 0x5b, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x30, 0x2d, 0x39, 0x5d, 0x7b, + 0x36, 0x34, 0x7d, 0x52, 0x13, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x54, + 0x78, 0x6e, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x69, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x46, + 0x92, 0x41, 0x43, 0x32, 0x41, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, + 0x72, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x2e, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x12, 0x98, 0x01, 0x0a, 0x0a, 0x62, 0x69, 0x64, 0x5f, 0x61, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x79, 0x92, 0x41, 0x76, 0x32, 0x6b, 0x41, + 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, + 0x77, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x61, 0x79, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, + 0x39, 0x5d, 0x2b, 0x52, 0x09, 0x62, 0x69, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x64, + 0x0a, 0x15, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x42, 0x30, 0x92, + 0x41, 0x2d, 0x32, 0x2b, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x74, + 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0x52, + 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x12, 0x5e, 0x0a, 0x13, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x65, 0x6e, + 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x03, 0x42, 0x2e, 0x92, 0x41, 0x2b, 0x32, 0x29, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, + 0x69, 0x64, 0x20, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x64, 0x65, 0x63, 0x61, 0x79, 0x69, 0x6e, 0x67, + 0x2e, 0x52, 0x11, 0x64, 0x65, 0x63, 0x61, 0x79, 0x45, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x12, 0x6a, 0x0a, 0x0a, 0x62, 0x69, 0x64, 0x5f, 0x64, 0x69, 0x67, 0x65, + 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4b, 0x92, 0x41, 0x48, 0x32, 0x46, 0x48, + 0x65, 0x78, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, + 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, + 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, + 0x64, 0x64, 0x65, 0x72, 0x2e, 0x52, 0x09, 0x62, 0x69, 0x64, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, + 0x12, 0xc7, 0x01, 0x0a, 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0xa3, 0x01, 0x92, 0x41, 0x9f, 0x01, 0x32, 0x93, + 0x01, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x54, 0x48, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x73, 0x6c, 0x61, 0x73, + 0x68, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x66, 0x61, + 0x69, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x49, + 0x66, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x63, 0x61, + 0x79, 0x65, 0x64, 0x20, 0x62, 0x69, 0x64, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x69, + 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, + 0x69, 0x6e, 0x67, 0x2e, 0x8a, 0x01, 0x06, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x52, 0x0b, 0x73, + 0x6c, 0x61, 0x73, 0x68, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x57, 0x0a, 0x0b, 0x63, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x35, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x57, 0x69, 0x74, 0x68, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x3a, 0x43, 0x92, 0x41, 0x40, 0x0a, 0x3e, 0x2a, 0x08, 0x42, 0x69, 0x64, 0x20, + 0x49, 0x6e, 0x66, 0x6f, 0x32, 0x32, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x61, 0x20, 0x62, 0x69, 0x64, 0x20, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x74, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x1a, 0xda, 0x01, 0x0a, 0x0c, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x59, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x42, + 0x36, 0x92, 0x41, 0x33, 0x32, 0x31, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x62, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x2e, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x12, 0x6f, 0x0a, 0x04, 0x62, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x31, 0x92, 0x41, + 0x2e, 0x32, 0x2c, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x69, 0x64, 0x73, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, + 0x64, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x52, + 0x04, 0x62, 0x69, 0x64, 0x73, 0x32, 0x97, 0x0e, 0x0a, 0x06, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, + 0x12, 0x53, 0x0a, 0x07, 0x53, 0x65, 0x6e, 0x64, 0x42, 0x69, 0x64, 0x12, 0x11, 0x2e, 0x62, 0x69, + 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x69, 0x64, 0x1a, 0x18, + 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, + 0x3a, 0x01, 0x2a, 0x22, 0x0e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, + 0x62, 0x69, 0x64, 0x30, 0x01, 0x12, 0x6b, 0x0a, 0x07, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x12, 0x1c, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, + 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x22, 0x1b, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, + 0x72, 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x2f, 0x7b, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x7d, 0x12, 0x7b, 0x0a, 0x0d, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x45, 0x76, 0x65, + 0x6e, 0x6c, 0x79, 0x12, 0x22, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x6c, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x45, 0x76, + 0x65, 0x6e, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x21, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x19, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, + 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x6c, 0x79, 0x12, + 0x98, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x12, 0x29, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, + 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x22, 0x21, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, + 0x64, 0x65, 0x72, 0x2f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x12, 0x9c, 0x01, 0x0a, 0x15, 0x44, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x72, 0x12, 0x2a, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2b, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x22, 0x22, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, + 0x72, 0x2f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x12, 0x8f, 0x01, 0x0a, 0x11, 0x53, 0x65, + 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, + 0x26, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x65, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x3a, 0x01, 0x2a, 0x22, 0x1e, 0x2f, 0x76, 0x31, + 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x73, 0x65, 0x74, 0x5f, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, 0x98, 0x01, 0x0a, 0x14, + 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x29, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2a, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x23, 0x12, 0x21, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, + 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x92, 0x01, 0x0a, 0x12, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x12, 0x27, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x3a, - 0x01, 0x2a, 0x22, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, - 0x6c, 0x73, 0x12, 0x8c, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x26, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, - 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x27, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x57, 0x69, 0x74, + 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x3a, 0x01, 0x2a, 0x22, 0x1e, 0x2f, 0x76, 0x31, + 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, + 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x12, 0x8c, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x20, 0x12, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x67, 0x65, - 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x73, 0x12, 0x6c, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, - 0x1f, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, - 0x64, 0x65, 0x72, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, - 0x80, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x73, 0x12, 0x23, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x44, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x12, 0x1b, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, - 0x72, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x6c, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x73, 0x12, 0x69, 0x0a, 0x08, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x12, 0x1d, - 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x69, - 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, - 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x69, 0x74, - 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x22, 0x13, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, - 0x64, 0x64, 0x65, 0x72, 0x2f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x12, 0x70, 0x0a, - 0x0a, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x2e, 0x62, 0x69, - 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, - 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x62, - 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, - 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x12, 0x17, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, - 0x65, 0x72, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x12, - 0x75, 0x0a, 0x11, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x46, - 0x75, 0x6e, 0x64, 0x73, 0x12, 0x1a, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x1a, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, - 0x65, 0x72, 0x2f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x5f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, - 0x5f, 0x66, 0x75, 0x6e, 0x64, 0x73, 0x42, 0xaa, 0x02, 0x92, 0x41, 0x72, 0x12, 0x70, 0x0a, 0x0a, - 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, 0x41, 0x50, 0x49, 0x2a, 0x55, 0x0a, 0x1b, 0x42, 0x75, - 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x20, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x4c, 0x69, - 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x31, 0x2e, 0x31, 0x12, 0x36, 0x68, 0x74, 0x74, 0x70, 0x73, - 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, - 0x69, 0x6d, 0x65, 0x76, 0x2f, 0x6d, 0x65, 0x76, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x2f, - 0x62, 0x6c, 0x6f, 0x62, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, - 0x45, 0x32, 0x0b, 0x31, 0x2e, 0x30, 0x2e, 0x30, 0x2d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x0a, 0x10, - 0x63, 0x6f, 0x6d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x42, 0x0e, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x50, 0x01, 0x5a, 0x40, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, - 0x72, 0x69, 0x6d, 0x65, 0x76, 0x2f, 0x6d, 0x65, 0x76, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x2f, 0x70, 0x32, 0x70, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x64, 0x64, - 0x65, 0x72, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x3b, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, - 0x70, 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x42, 0x58, 0x58, 0xaa, 0x02, 0x0c, 0x42, 0x69, 0x64, - 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0c, 0x42, 0x69, 0x64, 0x64, - 0x65, 0x72, 0x61, 0x70, 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x18, 0x42, 0x69, 0x64, 0x64, 0x65, - 0x72, 0x61, 0x70, 0x69, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0xea, 0x02, 0x0d, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x3a, - 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x12, 0x26, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x62, 0x69, 0x64, 0x64, + 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x76, 0x31, 0x2f, + 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x6c, 0x0a, 0x0a, 0x47, 0x65, + 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x1f, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, + 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x62, 0x69, 0x64, 0x64, + 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, + 0x12, 0x16, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x67, 0x65, 0x74, + 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x80, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, + 0x41, 0x6c, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, 0x23, 0x2e, 0x62, 0x69, + 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, + 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x24, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x12, 0x1b, + 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x61, + 0x6c, 0x6c, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, 0x69, 0x0a, 0x08, 0x57, + 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x12, 0x1d, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, + 0x2a, 0x22, 0x13, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x77, 0x69, + 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x12, 0x70, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x12, + 0x17, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x67, 0x65, 0x74, 0x5f, + 0x62, 0x69, 0x64, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x75, 0x0a, 0x11, 0x43, 0x6c, 0x61, 0x69, + 0x6d, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x46, 0x75, 0x6e, 0x64, 0x73, 0x12, 0x1a, 0x2e, + 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, + 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x2f, 0x63, 0x6c, 0x61, 0x69, + 0x6d, 0x5f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x66, 0x75, 0x6e, 0x64, 0x73, 0x42, + 0xaa, 0x02, 0x92, 0x41, 0x72, 0x12, 0x70, 0x0a, 0x0a, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x20, + 0x41, 0x50, 0x49, 0x2a, 0x55, 0x0a, 0x1b, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x20, + 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x31, + 0x2e, 0x31, 0x12, 0x36, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x65, 0x76, 0x2f, 0x6d, 0x65, + 0x76, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x2f, 0x62, 0x6c, 0x6f, 0x62, 0x2f, 0x6d, 0x61, + 0x69, 0x6e, 0x2f, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x32, 0x0b, 0x31, 0x2e, 0x30, 0x2e, + 0x30, 0x2d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x2e, 0x62, 0x69, 0x64, + 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x42, 0x0e, 0x42, 0x69, 0x64, 0x64, 0x65, + 0x72, 0x61, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x40, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x65, 0x76, 0x2f, 0x6d, + 0x65, 0x76, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x2f, 0x70, 0x32, 0x70, 0x2f, 0x67, 0x65, + 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2f, 0x76, + 0x31, 0x3b, 0x62, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, + 0x42, 0x58, 0x58, 0xaa, 0x02, 0x0c, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, + 0x56, 0x31, 0xca, 0x02, 0x0c, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x5c, 0x56, + 0x31, 0xe2, 0x02, 0x18, 0x42, 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x5c, 0x56, 0x31, + 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0d, 0x42, + 0x69, 0x64, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2566,7 +2676,7 @@ func file_bidderapi_v1_bidderapi_proto_rawDescGZIP() []byte { return file_bidderapi_v1_bidderapi_proto_rawDescData } -var file_bidderapi_v1_bidderapi_proto_msgTypes = make([]protoimpl.MessageInfo, 29) +var file_bidderapi_v1_bidderapi_proto_msgTypes = make([]protoimpl.MessageInfo, 31) var file_bidderapi_v1_bidderapi_proto_goTypes = []interface{}{ (*DepositRequest)(nil), // 0: bidderapi.v1.DepositRequest (*DepositResponse)(nil), // 1: bidderapi.v1.DepositResponse @@ -2574,67 +2684,71 @@ var file_bidderapi_v1_bidderapi_proto_goTypes = []interface{}{ (*DepositEvenlyResponse)(nil), // 3: bidderapi.v1.DepositEvenlyResponse (*EnableDepositManagerRequest)(nil), // 4: bidderapi.v1.EnableDepositManagerRequest (*EnableDepositManagerResponse)(nil), // 5: bidderapi.v1.EnableDepositManagerResponse - (*TargetDeposit)(nil), // 6: bidderapi.v1.TargetDeposit - (*SetTargetDepositsRequest)(nil), // 7: bidderapi.v1.SetTargetDepositsRequest - (*SetTargetDepositsResponse)(nil), // 8: bidderapi.v1.SetTargetDepositsResponse - (*DepositManagerStatusRequest)(nil), // 9: bidderapi.v1.DepositManagerStatusRequest - (*DepositManagerStatusResponse)(nil), // 10: bidderapi.v1.DepositManagerStatusResponse - (*EmptyMessage)(nil), // 11: bidderapi.v1.EmptyMessage - (*GetDepositRequest)(nil), // 12: bidderapi.v1.GetDepositRequest - (*GetAllDepositsRequest)(nil), // 13: bidderapi.v1.GetAllDepositsRequest - (*DepositInfo)(nil), // 14: bidderapi.v1.DepositInfo - (*GetAllDepositsResponse)(nil), // 15: bidderapi.v1.GetAllDepositsResponse - (*RequestWithdrawalsRequest)(nil), // 16: bidderapi.v1.RequestWithdrawalsRequest - (*RequestWithdrawalsResponse)(nil), // 17: bidderapi.v1.RequestWithdrawalsResponse - (*WithdrawRequest)(nil), // 18: bidderapi.v1.WithdrawRequest - (*WithdrawResponse)(nil), // 19: bidderapi.v1.WithdrawResponse - (*GetValidProvidersRequest)(nil), // 20: bidderapi.v1.GetValidProvidersRequest - (*GetValidProvidersResponse)(nil), // 21: bidderapi.v1.GetValidProvidersResponse - (*Bid)(nil), // 22: bidderapi.v1.Bid - (*Commitment)(nil), // 23: bidderapi.v1.Commitment - (*GetBidInfoRequest)(nil), // 24: bidderapi.v1.GetBidInfoRequest - (*GetBidInfoResponse)(nil), // 25: bidderapi.v1.GetBidInfoResponse - (*GetBidInfoResponse_CommitmentWithStatus)(nil), // 26: bidderapi.v1.GetBidInfoResponse.CommitmentWithStatus - (*GetBidInfoResponse_BidInfo)(nil), // 27: bidderapi.v1.GetBidInfoResponse.BidInfo - (*GetBidInfoResponse_BlockBidInfo)(nil), // 28: bidderapi.v1.GetBidInfoResponse.BlockBidInfo - (*wrapperspb.StringValue)(nil), // 29: google.protobuf.StringValue + (*DisableDepositManagerRequest)(nil), // 6: bidderapi.v1.DisableDepositManagerRequest + (*DisableDepositManagerResponse)(nil), // 7: bidderapi.v1.DisableDepositManagerResponse + (*TargetDeposit)(nil), // 8: bidderapi.v1.TargetDeposit + (*SetTargetDepositsRequest)(nil), // 9: bidderapi.v1.SetTargetDepositsRequest + (*SetTargetDepositsResponse)(nil), // 10: bidderapi.v1.SetTargetDepositsResponse + (*DepositManagerStatusRequest)(nil), // 11: bidderapi.v1.DepositManagerStatusRequest + (*DepositManagerStatusResponse)(nil), // 12: bidderapi.v1.DepositManagerStatusResponse + (*EmptyMessage)(nil), // 13: bidderapi.v1.EmptyMessage + (*GetDepositRequest)(nil), // 14: bidderapi.v1.GetDepositRequest + (*GetAllDepositsRequest)(nil), // 15: bidderapi.v1.GetAllDepositsRequest + (*DepositInfo)(nil), // 16: bidderapi.v1.DepositInfo + (*GetAllDepositsResponse)(nil), // 17: bidderapi.v1.GetAllDepositsResponse + (*RequestWithdrawalsRequest)(nil), // 18: bidderapi.v1.RequestWithdrawalsRequest + (*RequestWithdrawalsResponse)(nil), // 19: bidderapi.v1.RequestWithdrawalsResponse + (*WithdrawRequest)(nil), // 20: bidderapi.v1.WithdrawRequest + (*WithdrawResponse)(nil), // 21: bidderapi.v1.WithdrawResponse + (*GetValidProvidersRequest)(nil), // 22: bidderapi.v1.GetValidProvidersRequest + (*GetValidProvidersResponse)(nil), // 23: bidderapi.v1.GetValidProvidersResponse + (*Bid)(nil), // 24: bidderapi.v1.Bid + (*Commitment)(nil), // 25: bidderapi.v1.Commitment + (*GetBidInfoRequest)(nil), // 26: bidderapi.v1.GetBidInfoRequest + (*GetBidInfoResponse)(nil), // 27: bidderapi.v1.GetBidInfoResponse + (*GetBidInfoResponse_CommitmentWithStatus)(nil), // 28: bidderapi.v1.GetBidInfoResponse.CommitmentWithStatus + (*GetBidInfoResponse_BidInfo)(nil), // 29: bidderapi.v1.GetBidInfoResponse.BidInfo + (*GetBidInfoResponse_BlockBidInfo)(nil), // 30: bidderapi.v1.GetBidInfoResponse.BlockBidInfo + (*wrapperspb.StringValue)(nil), // 31: google.protobuf.StringValue } var file_bidderapi_v1_bidderapi_proto_depIdxs = []int32{ - 6, // 0: bidderapi.v1.SetTargetDepositsRequest.target_deposits:type_name -> bidderapi.v1.TargetDeposit - 6, // 1: bidderapi.v1.SetTargetDepositsResponse.successfully_set_deposits:type_name -> bidderapi.v1.TargetDeposit - 6, // 2: bidderapi.v1.DepositManagerStatusResponse.target_deposits:type_name -> bidderapi.v1.TargetDeposit - 14, // 3: bidderapi.v1.GetAllDepositsResponse.deposits:type_name -> bidderapi.v1.DepositInfo - 28, // 4: bidderapi.v1.GetBidInfoResponse.block_bid_info:type_name -> bidderapi.v1.GetBidInfoResponse.BlockBidInfo - 26, // 5: bidderapi.v1.GetBidInfoResponse.BidInfo.commitments:type_name -> bidderapi.v1.GetBidInfoResponse.CommitmentWithStatus - 27, // 6: bidderapi.v1.GetBidInfoResponse.BlockBidInfo.bids:type_name -> bidderapi.v1.GetBidInfoResponse.BidInfo - 22, // 7: bidderapi.v1.Bidder.SendBid:input_type -> bidderapi.v1.Bid + 8, // 0: bidderapi.v1.SetTargetDepositsRequest.target_deposits:type_name -> bidderapi.v1.TargetDeposit + 8, // 1: bidderapi.v1.SetTargetDepositsResponse.successfully_set_deposits:type_name -> bidderapi.v1.TargetDeposit + 8, // 2: bidderapi.v1.DepositManagerStatusResponse.target_deposits:type_name -> bidderapi.v1.TargetDeposit + 16, // 3: bidderapi.v1.GetAllDepositsResponse.deposits:type_name -> bidderapi.v1.DepositInfo + 30, // 4: bidderapi.v1.GetBidInfoResponse.block_bid_info:type_name -> bidderapi.v1.GetBidInfoResponse.BlockBidInfo + 28, // 5: bidderapi.v1.GetBidInfoResponse.BidInfo.commitments:type_name -> bidderapi.v1.GetBidInfoResponse.CommitmentWithStatus + 29, // 6: bidderapi.v1.GetBidInfoResponse.BlockBidInfo.bids:type_name -> bidderapi.v1.GetBidInfoResponse.BidInfo + 24, // 7: bidderapi.v1.Bidder.SendBid:input_type -> bidderapi.v1.Bid 0, // 8: bidderapi.v1.Bidder.Deposit:input_type -> bidderapi.v1.DepositRequest 2, // 9: bidderapi.v1.Bidder.DepositEvenly:input_type -> bidderapi.v1.DepositEvenlyRequest 4, // 10: bidderapi.v1.Bidder.EnableDepositManager:input_type -> bidderapi.v1.EnableDepositManagerRequest - 7, // 11: bidderapi.v1.Bidder.SetTargetDeposits:input_type -> bidderapi.v1.SetTargetDepositsRequest - 9, // 12: bidderapi.v1.Bidder.DepositManagerStatus:input_type -> bidderapi.v1.DepositManagerStatusRequest - 16, // 13: bidderapi.v1.Bidder.RequestWithdrawals:input_type -> bidderapi.v1.RequestWithdrawalsRequest - 20, // 14: bidderapi.v1.Bidder.GetValidProviders:input_type -> bidderapi.v1.GetValidProvidersRequest - 12, // 15: bidderapi.v1.Bidder.GetDeposit:input_type -> bidderapi.v1.GetDepositRequest - 13, // 16: bidderapi.v1.Bidder.GetAllDeposits:input_type -> bidderapi.v1.GetAllDepositsRequest - 18, // 17: bidderapi.v1.Bidder.Withdraw:input_type -> bidderapi.v1.WithdrawRequest - 24, // 18: bidderapi.v1.Bidder.GetBidInfo:input_type -> bidderapi.v1.GetBidInfoRequest - 11, // 19: bidderapi.v1.Bidder.ClaimSlashedFunds:input_type -> bidderapi.v1.EmptyMessage - 23, // 20: bidderapi.v1.Bidder.SendBid:output_type -> bidderapi.v1.Commitment - 1, // 21: bidderapi.v1.Bidder.Deposit:output_type -> bidderapi.v1.DepositResponse - 3, // 22: bidderapi.v1.Bidder.DepositEvenly:output_type -> bidderapi.v1.DepositEvenlyResponse - 5, // 23: bidderapi.v1.Bidder.EnableDepositManager:output_type -> bidderapi.v1.EnableDepositManagerResponse - 8, // 24: bidderapi.v1.Bidder.SetTargetDeposits:output_type -> bidderapi.v1.SetTargetDepositsResponse - 10, // 25: bidderapi.v1.Bidder.DepositManagerStatus:output_type -> bidderapi.v1.DepositManagerStatusResponse - 17, // 26: bidderapi.v1.Bidder.RequestWithdrawals:output_type -> bidderapi.v1.RequestWithdrawalsResponse - 21, // 27: bidderapi.v1.Bidder.GetValidProviders:output_type -> bidderapi.v1.GetValidProvidersResponse - 1, // 28: bidderapi.v1.Bidder.GetDeposit:output_type -> bidderapi.v1.DepositResponse - 15, // 29: bidderapi.v1.Bidder.GetAllDeposits:output_type -> bidderapi.v1.GetAllDepositsResponse - 19, // 30: bidderapi.v1.Bidder.Withdraw:output_type -> bidderapi.v1.WithdrawResponse - 25, // 31: bidderapi.v1.Bidder.GetBidInfo:output_type -> bidderapi.v1.GetBidInfoResponse - 29, // 32: bidderapi.v1.Bidder.ClaimSlashedFunds:output_type -> google.protobuf.StringValue - 20, // [20:33] is the sub-list for method output_type - 7, // [7:20] is the sub-list for method input_type + 6, // 11: bidderapi.v1.Bidder.DisableDepositManager:input_type -> bidderapi.v1.DisableDepositManagerRequest + 9, // 12: bidderapi.v1.Bidder.SetTargetDeposits:input_type -> bidderapi.v1.SetTargetDepositsRequest + 11, // 13: bidderapi.v1.Bidder.DepositManagerStatus:input_type -> bidderapi.v1.DepositManagerStatusRequest + 18, // 14: bidderapi.v1.Bidder.RequestWithdrawals:input_type -> bidderapi.v1.RequestWithdrawalsRequest + 22, // 15: bidderapi.v1.Bidder.GetValidProviders:input_type -> bidderapi.v1.GetValidProvidersRequest + 14, // 16: bidderapi.v1.Bidder.GetDeposit:input_type -> bidderapi.v1.GetDepositRequest + 15, // 17: bidderapi.v1.Bidder.GetAllDeposits:input_type -> bidderapi.v1.GetAllDepositsRequest + 20, // 18: bidderapi.v1.Bidder.Withdraw:input_type -> bidderapi.v1.WithdrawRequest + 26, // 19: bidderapi.v1.Bidder.GetBidInfo:input_type -> bidderapi.v1.GetBidInfoRequest + 13, // 20: bidderapi.v1.Bidder.ClaimSlashedFunds:input_type -> bidderapi.v1.EmptyMessage + 25, // 21: bidderapi.v1.Bidder.SendBid:output_type -> bidderapi.v1.Commitment + 1, // 22: bidderapi.v1.Bidder.Deposit:output_type -> bidderapi.v1.DepositResponse + 3, // 23: bidderapi.v1.Bidder.DepositEvenly:output_type -> bidderapi.v1.DepositEvenlyResponse + 5, // 24: bidderapi.v1.Bidder.EnableDepositManager:output_type -> bidderapi.v1.EnableDepositManagerResponse + 7, // 25: bidderapi.v1.Bidder.DisableDepositManager:output_type -> bidderapi.v1.DisableDepositManagerResponse + 10, // 26: bidderapi.v1.Bidder.SetTargetDeposits:output_type -> bidderapi.v1.SetTargetDepositsResponse + 12, // 27: bidderapi.v1.Bidder.DepositManagerStatus:output_type -> bidderapi.v1.DepositManagerStatusResponse + 19, // 28: bidderapi.v1.Bidder.RequestWithdrawals:output_type -> bidderapi.v1.RequestWithdrawalsResponse + 23, // 29: bidderapi.v1.Bidder.GetValidProviders:output_type -> bidderapi.v1.GetValidProvidersResponse + 1, // 30: bidderapi.v1.Bidder.GetDeposit:output_type -> bidderapi.v1.DepositResponse + 17, // 31: bidderapi.v1.Bidder.GetAllDeposits:output_type -> bidderapi.v1.GetAllDepositsResponse + 21, // 32: bidderapi.v1.Bidder.Withdraw:output_type -> bidderapi.v1.WithdrawResponse + 27, // 33: bidderapi.v1.Bidder.GetBidInfo:output_type -> bidderapi.v1.GetBidInfoResponse + 31, // 34: bidderapi.v1.Bidder.ClaimSlashedFunds:output_type -> google.protobuf.StringValue + 21, // [21:35] is the sub-list for method output_type + 7, // [7:21] is the sub-list for method input_type 7, // [7:7] is the sub-list for extension type_name 7, // [7:7] is the sub-list for extension extendee 0, // [0:7] is the sub-list for field type_name @@ -2719,7 +2833,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TargetDeposit); i { + switch v := v.(*DisableDepositManagerRequest); i { case 0: return &v.state case 1: @@ -2731,7 +2845,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetTargetDepositsRequest); i { + switch v := v.(*DisableDepositManagerResponse); i { case 0: return &v.state case 1: @@ -2743,7 +2857,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetTargetDepositsResponse); i { + switch v := v.(*TargetDeposit); i { case 0: return &v.state case 1: @@ -2755,7 +2869,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DepositManagerStatusRequest); i { + switch v := v.(*SetTargetDepositsRequest); i { case 0: return &v.state case 1: @@ -2767,7 +2881,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DepositManagerStatusResponse); i { + switch v := v.(*SetTargetDepositsResponse); i { case 0: return &v.state case 1: @@ -2779,7 +2893,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EmptyMessage); i { + switch v := v.(*DepositManagerStatusRequest); i { case 0: return &v.state case 1: @@ -2791,7 +2905,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetDepositRequest); i { + switch v := v.(*DepositManagerStatusResponse); i { case 0: return &v.state case 1: @@ -2803,7 +2917,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetAllDepositsRequest); i { + switch v := v.(*EmptyMessage); i { case 0: return &v.state case 1: @@ -2815,7 +2929,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DepositInfo); i { + switch v := v.(*GetDepositRequest); i { case 0: return &v.state case 1: @@ -2827,7 +2941,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetAllDepositsResponse); i { + switch v := v.(*GetAllDepositsRequest); i { case 0: return &v.state case 1: @@ -2839,7 +2953,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RequestWithdrawalsRequest); i { + switch v := v.(*DepositInfo); i { case 0: return &v.state case 1: @@ -2851,7 +2965,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RequestWithdrawalsResponse); i { + switch v := v.(*GetAllDepositsResponse); i { case 0: return &v.state case 1: @@ -2863,7 +2977,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WithdrawRequest); i { + switch v := v.(*RequestWithdrawalsRequest); i { case 0: return &v.state case 1: @@ -2875,7 +2989,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WithdrawResponse); i { + switch v := v.(*RequestWithdrawalsResponse); i { case 0: return &v.state case 1: @@ -2887,7 +3001,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetValidProvidersRequest); i { + switch v := v.(*WithdrawRequest); i { case 0: return &v.state case 1: @@ -2899,7 +3013,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetValidProvidersResponse); i { + switch v := v.(*WithdrawResponse); i { case 0: return &v.state case 1: @@ -2911,7 +3025,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Bid); i { + switch v := v.(*GetValidProvidersRequest); i { case 0: return &v.state case 1: @@ -2923,7 +3037,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Commitment); i { + switch v := v.(*GetValidProvidersResponse); i { case 0: return &v.state case 1: @@ -2935,7 +3049,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBidInfoRequest); i { + switch v := v.(*Bid); i { case 0: return &v.state case 1: @@ -2947,7 +3061,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBidInfoResponse); i { + switch v := v.(*Commitment); i { case 0: return &v.state case 1: @@ -2959,7 +3073,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBidInfoResponse_CommitmentWithStatus); i { + switch v := v.(*GetBidInfoRequest); i { case 0: return &v.state case 1: @@ -2971,7 +3085,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBidInfoResponse_BidInfo); i { + switch v := v.(*GetBidInfoResponse); i { case 0: return &v.state case 1: @@ -2983,6 +3097,30 @@ func file_bidderapi_v1_bidderapi_proto_init() { } } file_bidderapi_v1_bidderapi_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetBidInfoResponse_CommitmentWithStatus); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_bidderapi_v1_bidderapi_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetBidInfoResponse_BidInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_bidderapi_v1_bidderapi_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetBidInfoResponse_BlockBidInfo); i { case 0: return &v.state @@ -3001,7 +3139,7 @@ func file_bidderapi_v1_bidderapi_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_bidderapi_v1_bidderapi_proto_rawDesc, NumEnums: 0, - NumMessages: 29, + NumMessages: 31, NumExtensions: 0, NumServices: 1, }, diff --git a/p2p/gen/go/bidderapi/v1/bidderapi.pb.gw.go b/p2p/gen/go/bidderapi/v1/bidderapi.pb.gw.go index 7497f9fdc..152a919f1 100644 --- a/p2p/gen/go/bidderapi/v1/bidderapi.pb.gw.go +++ b/p2p/gen/go/bidderapi/v1/bidderapi.pb.gw.go @@ -167,6 +167,27 @@ func local_request_Bidder_EnableDepositManager_0(ctx context.Context, marshaler return msg, metadata, err } +func request_Bidder_DisableDepositManager_0(ctx context.Context, marshaler runtime.Marshaler, client BidderClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DisableDepositManagerRequest + metadata runtime.ServerMetadata + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + msg, err := client.DisableDepositManager(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_Bidder_DisableDepositManager_0(ctx context.Context, marshaler runtime.Marshaler, server BidderServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DisableDepositManagerRequest + metadata runtime.ServerMetadata + ) + msg, err := server.DisableDepositManager(ctx, &protoReq) + return msg, metadata, err +} + func request_Bidder_SetTargetDeposits_0(ctx context.Context, marshaler runtime.Marshaler, client BidderClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var ( protoReq SetTargetDepositsRequest @@ -474,6 +495,26 @@ func RegisterBidderHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser } forward_Bidder_EnableDepositManager_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) + mux.Handle(http.MethodPost, pattern_Bidder_DisableDepositManager_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/bidderapi.v1.Bidder/DisableDepositManager", runtime.WithHTTPPathPattern("/v1/bidder/disable_deposit_manager")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Bidder_DisableDepositManager_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_Bidder_DisableDepositManager_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle(http.MethodPost, pattern_Bidder_SetTargetDeposits_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -762,6 +803,23 @@ func RegisterBidderHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli } forward_Bidder_EnableDepositManager_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) + mux.Handle(http.MethodPost, pattern_Bidder_DisableDepositManager_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/bidderapi.v1.Bidder/DisableDepositManager", runtime.WithHTTPPathPattern("/v1/bidder/disable_deposit_manager")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Bidder_DisableDepositManager_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_Bidder_DisableDepositManager_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle(http.MethodPost, pattern_Bidder_SetTargetDeposits_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -919,33 +977,35 @@ func RegisterBidderHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli } var ( - pattern_Bidder_SendBid_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "bid"}, "")) - pattern_Bidder_Deposit_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v1", "bidder", "deposit", "amount"}, "")) - pattern_Bidder_DepositEvenly_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "deposit_evenly"}, "")) - pattern_Bidder_EnableDepositManager_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "enable_deposit_manager"}, "")) - pattern_Bidder_SetTargetDeposits_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "set_target_deposits"}, "")) - pattern_Bidder_DepositManagerStatus_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "deposit_manager_status"}, "")) - pattern_Bidder_RequestWithdrawals_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "request_withdrawals"}, "")) - pattern_Bidder_GetValidProviders_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "get_valid_providers"}, "")) - pattern_Bidder_GetDeposit_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "get_deposit"}, "")) - pattern_Bidder_GetAllDeposits_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "get_all_deposits"}, "")) - pattern_Bidder_Withdraw_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "withdraw"}, "")) - pattern_Bidder_GetBidInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "get_bid_info"}, "")) - pattern_Bidder_ClaimSlashedFunds_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "claim_slashed_funds"}, "")) + pattern_Bidder_SendBid_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "bid"}, "")) + pattern_Bidder_Deposit_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v1", "bidder", "deposit", "amount"}, "")) + pattern_Bidder_DepositEvenly_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "deposit_evenly"}, "")) + pattern_Bidder_EnableDepositManager_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "enable_deposit_manager"}, "")) + pattern_Bidder_DisableDepositManager_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "disable_deposit_manager"}, "")) + pattern_Bidder_SetTargetDeposits_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "set_target_deposits"}, "")) + pattern_Bidder_DepositManagerStatus_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "deposit_manager_status"}, "")) + pattern_Bidder_RequestWithdrawals_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "request_withdrawals"}, "")) + pattern_Bidder_GetValidProviders_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "get_valid_providers"}, "")) + pattern_Bidder_GetDeposit_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "get_deposit"}, "")) + pattern_Bidder_GetAllDeposits_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "get_all_deposits"}, "")) + pattern_Bidder_Withdraw_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "withdraw"}, "")) + pattern_Bidder_GetBidInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "get_bid_info"}, "")) + pattern_Bidder_ClaimSlashedFunds_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "bidder", "claim_slashed_funds"}, "")) ) var ( - forward_Bidder_SendBid_0 = runtime.ForwardResponseStream - forward_Bidder_Deposit_0 = runtime.ForwardResponseMessage - forward_Bidder_DepositEvenly_0 = runtime.ForwardResponseMessage - forward_Bidder_EnableDepositManager_0 = runtime.ForwardResponseMessage - forward_Bidder_SetTargetDeposits_0 = runtime.ForwardResponseMessage - forward_Bidder_DepositManagerStatus_0 = runtime.ForwardResponseMessage - forward_Bidder_RequestWithdrawals_0 = runtime.ForwardResponseMessage - forward_Bidder_GetValidProviders_0 = runtime.ForwardResponseMessage - forward_Bidder_GetDeposit_0 = runtime.ForwardResponseMessage - forward_Bidder_GetAllDeposits_0 = runtime.ForwardResponseMessage - forward_Bidder_Withdraw_0 = runtime.ForwardResponseMessage - forward_Bidder_GetBidInfo_0 = runtime.ForwardResponseMessage - forward_Bidder_ClaimSlashedFunds_0 = runtime.ForwardResponseMessage + forward_Bidder_SendBid_0 = runtime.ForwardResponseStream + forward_Bidder_Deposit_0 = runtime.ForwardResponseMessage + forward_Bidder_DepositEvenly_0 = runtime.ForwardResponseMessage + forward_Bidder_EnableDepositManager_0 = runtime.ForwardResponseMessage + forward_Bidder_DisableDepositManager_0 = runtime.ForwardResponseMessage + forward_Bidder_SetTargetDeposits_0 = runtime.ForwardResponseMessage + forward_Bidder_DepositManagerStatus_0 = runtime.ForwardResponseMessage + forward_Bidder_RequestWithdrawals_0 = runtime.ForwardResponseMessage + forward_Bidder_GetValidProviders_0 = runtime.ForwardResponseMessage + forward_Bidder_GetDeposit_0 = runtime.ForwardResponseMessage + forward_Bidder_GetAllDeposits_0 = runtime.ForwardResponseMessage + forward_Bidder_Withdraw_0 = runtime.ForwardResponseMessage + forward_Bidder_GetBidInfo_0 = runtime.ForwardResponseMessage + forward_Bidder_ClaimSlashedFunds_0 = runtime.ForwardResponseMessage ) diff --git a/p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go b/p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go index b1e4f6d0c..47f217358 100644 --- a/p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go +++ b/p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go @@ -20,19 +20,20 @@ import ( const _ = grpc.SupportPackageIsVersion9 const ( - Bidder_SendBid_FullMethodName = "/bidderapi.v1.Bidder/SendBid" - Bidder_Deposit_FullMethodName = "/bidderapi.v1.Bidder/Deposit" - Bidder_DepositEvenly_FullMethodName = "/bidderapi.v1.Bidder/DepositEvenly" - Bidder_EnableDepositManager_FullMethodName = "/bidderapi.v1.Bidder/EnableDepositManager" - Bidder_SetTargetDeposits_FullMethodName = "/bidderapi.v1.Bidder/SetTargetDeposits" - Bidder_DepositManagerStatus_FullMethodName = "/bidderapi.v1.Bidder/DepositManagerStatus" - Bidder_RequestWithdrawals_FullMethodName = "/bidderapi.v1.Bidder/RequestWithdrawals" - Bidder_GetValidProviders_FullMethodName = "/bidderapi.v1.Bidder/GetValidProviders" - Bidder_GetDeposit_FullMethodName = "/bidderapi.v1.Bidder/GetDeposit" - Bidder_GetAllDeposits_FullMethodName = "/bidderapi.v1.Bidder/GetAllDeposits" - Bidder_Withdraw_FullMethodName = "/bidderapi.v1.Bidder/Withdraw" - Bidder_GetBidInfo_FullMethodName = "/bidderapi.v1.Bidder/GetBidInfo" - Bidder_ClaimSlashedFunds_FullMethodName = "/bidderapi.v1.Bidder/ClaimSlashedFunds" + Bidder_SendBid_FullMethodName = "/bidderapi.v1.Bidder/SendBid" + Bidder_Deposit_FullMethodName = "/bidderapi.v1.Bidder/Deposit" + Bidder_DepositEvenly_FullMethodName = "/bidderapi.v1.Bidder/DepositEvenly" + Bidder_EnableDepositManager_FullMethodName = "/bidderapi.v1.Bidder/EnableDepositManager" + Bidder_DisableDepositManager_FullMethodName = "/bidderapi.v1.Bidder/DisableDepositManager" + Bidder_SetTargetDeposits_FullMethodName = "/bidderapi.v1.Bidder/SetTargetDeposits" + Bidder_DepositManagerStatus_FullMethodName = "/bidderapi.v1.Bidder/DepositManagerStatus" + Bidder_RequestWithdrawals_FullMethodName = "/bidderapi.v1.Bidder/RequestWithdrawals" + Bidder_GetValidProviders_FullMethodName = "/bidderapi.v1.Bidder/GetValidProviders" + Bidder_GetDeposit_FullMethodName = "/bidderapi.v1.Bidder/GetDeposit" + Bidder_GetAllDeposits_FullMethodName = "/bidderapi.v1.Bidder/GetAllDeposits" + Bidder_Withdraw_FullMethodName = "/bidderapi.v1.Bidder/Withdraw" + Bidder_GetBidInfo_FullMethodName = "/bidderapi.v1.Bidder/GetBidInfo" + Bidder_ClaimSlashedFunds_FullMethodName = "/bidderapi.v1.Bidder/ClaimSlashedFunds" ) // BidderClient is the client API for Bidder service. @@ -59,6 +60,11 @@ type BidderClient interface { // // EnableDepositManager is called by the bidder node to enable the deposit manager via eip 7702. EnableDepositManager(ctx context.Context, in *EnableDepositManagerRequest, opts ...grpc.CallOption) (*EnableDepositManagerResponse, error) + // DisableDepositManager + // + // DisableDepositManager is called by the bidder node to disable the deposit manager + // by setting the bidder EOA's code to zero address. + DisableDepositManager(ctx context.Context, in *DisableDepositManagerRequest, opts ...grpc.CallOption) (*DisableDepositManagerResponse, error) // SetTargetDeposits // // SetTargetDeposits is called by the bidder node to set target deposits per provider @@ -165,6 +171,16 @@ func (c *bidderClient) EnableDepositManager(ctx context.Context, in *EnableDepos return out, nil } +func (c *bidderClient) DisableDepositManager(ctx context.Context, in *DisableDepositManagerRequest, opts ...grpc.CallOption) (*DisableDepositManagerResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DisableDepositManagerResponse) + err := c.cc.Invoke(ctx, Bidder_DisableDepositManager_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *bidderClient) SetTargetDeposits(ctx context.Context, in *SetTargetDepositsRequest, opts ...grpc.CallOption) (*SetTargetDepositsResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(SetTargetDepositsResponse) @@ -279,6 +295,11 @@ type BidderServer interface { // // EnableDepositManager is called by the bidder node to enable the deposit manager via eip 7702. EnableDepositManager(context.Context, *EnableDepositManagerRequest) (*EnableDepositManagerResponse, error) + // DisableDepositManager + // + // DisableDepositManager is called by the bidder node to disable the deposit manager + // by setting the bidder EOA's code to zero address. + DisableDepositManager(context.Context, *DisableDepositManagerRequest) (*DisableDepositManagerResponse, error) // SetTargetDeposits // // SetTargetDeposits is called by the bidder node to set target deposits per provider @@ -348,6 +369,9 @@ func (UnimplementedBidderServer) DepositEvenly(context.Context, *DepositEvenlyRe func (UnimplementedBidderServer) EnableDepositManager(context.Context, *EnableDepositManagerRequest) (*EnableDepositManagerResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method EnableDepositManager not implemented") } +func (UnimplementedBidderServer) DisableDepositManager(context.Context, *DisableDepositManagerRequest) (*DisableDepositManagerResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DisableDepositManager not implemented") +} func (UnimplementedBidderServer) SetTargetDeposits(context.Context, *SetTargetDepositsRequest) (*SetTargetDepositsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method SetTargetDeposits not implemented") } @@ -461,6 +485,24 @@ func _Bidder_EnableDepositManager_Handler(srv interface{}, ctx context.Context, return interceptor(ctx, in, info, handler) } +func _Bidder_DisableDepositManager_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DisableDepositManagerRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BidderServer).DisableDepositManager(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Bidder_DisableDepositManager_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BidderServer).DisableDepositManager(ctx, req.(*DisableDepositManagerRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Bidder_SetTargetDeposits_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(SetTargetDepositsRequest) if err := dec(in); err != nil { @@ -642,6 +684,10 @@ var Bidder_ServiceDesc = grpc.ServiceDesc{ MethodName: "EnableDepositManager", Handler: _Bidder_EnableDepositManager_Handler, }, + { + MethodName: "DisableDepositManager", + Handler: _Bidder_DisableDepositManager_Handler, + }, { MethodName: "SetTargetDeposits", Handler: _Bidder_SetTargetDeposits_Handler, diff --git a/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml b/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml index c22a28899..d89688b10 100644 --- a/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml +++ b/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml @@ -123,6 +123,20 @@ paths: description: An unexpected error response. schema: $ref: '#/definitions/googlerpcStatus' + /v1/bidder/disable_deposit_manager: + post: + summary: DisableDepositManager + description: "DisableDepositManager is called by the bidder node to disable the deposit manager \nby setting the bidder EOA's code to zero address." + operationId: Bidder_DisableDepositManager + responses: + "200": + description: A successful response. + schema: + $ref: '#/definitions/v1DisableDepositManagerResponse' + default: + description: An unexpected error response. + schema: + $ref: '#/definitions/googlerpcStatus' /v1/bidder/enable_deposit_manager: post: summary: EnableDepositManager @@ -548,6 +562,13 @@ definitions: type: string description: Deposit for bidder in the bidder registry for a particular provider. title: Deposit response + v1DisableDepositManagerResponse: + type: object + properties: + success: + type: boolean + description: DisableDepositManager response. + title: DisableDepositManager response v1EnableDepositManagerResponse: type: object properties: diff --git a/p2p/pkg/rpc/bidder/service.go b/p2p/pkg/rpc/bidder/service.go index ea4428bd2..edd0d82b2 100644 --- a/p2p/pkg/rpc/bidder/service.go +++ b/p2p/pkg/rpc/bidder/service.go @@ -667,6 +667,54 @@ func (s *Service) EnableDepositManager( return &bidderapiv1.EnableDepositManagerResponse{Success: true}, nil } +func (s *Service) DisableDepositManager( + ctx context.Context, + r *bidderapiv1.DisableDepositManagerRequest, +) (*bidderapiv1.DisableDepositManagerResponse, error) { + err := s.validator.Validate(r) + if err != nil { + s.logger.Error("disable deposit manager validation", "error", err) + return nil, status.Errorf(codes.InvalidArgument, "validating disable deposit manager request: %v", err) + } + + opts, err := s.optsGetter(ctx) + if err != nil { + s.logger.Error("getting transact opts", "error", err) + return nil, status.Errorf(codes.Internal, "getting transact opts: %v", err) + } + + depositManagerEnabled, err := s.DepositManagerStatus(ctx, &bidderapiv1.DepositManagerStatusRequest{}) + if err != nil { + s.logger.Error("checking deposit manager status", "error", err) + return nil, status.Errorf(codes.Internal, "checking deposit manager status: %v", err) + } + + if !depositManagerEnabled.Enabled { + s.logger.Error("DisableDepositManager failed: deposit manager is already disabled") + return nil, status.Errorf(codes.FailedPrecondition, "DisableDepositManager failed: deposit manager is already disabled") + } + + zeroAddr := common.Address{} + tx, err := s.setCodeHelper.SetCode(ctx, opts, zeroAddr) + if err != nil { + s.logger.Error("setting code", "error", err) + return nil, status.Errorf(codes.Internal, "setting code: %v", err) + } + + receipt, err := s.watcher.WaitForReceipt(ctx, tx) + if err != nil { + s.logger.Error("waiting for receipt", "error", err) + return nil, status.Errorf(codes.Internal, "waiting for receipt: %v", err) + } + + if receipt.Status != types.ReceiptStatusSuccessful { + s.logger.Error("receipt status", "status", receipt.Status) + return nil, status.Errorf(codes.Internal, "receipt status: %v", receipt.Status) + } + + return &bidderapiv1.DisableDepositManagerResponse{Success: true}, nil +} + func (s *Service) SetTargetDeposits( ctx context.Context, r *bidderapiv1.SetTargetDepositsRequest, @@ -787,8 +835,6 @@ func (s *Service) DepositManagerStatus( return &bidderapiv1.DepositManagerStatusResponse{Enabled: true}, nil } -// TODO: api/handling for a bidder removing set code auth - func (s *Service) GetValidProviders( ctx context.Context, r *bidderapiv1.GetValidProvidersRequest, diff --git a/p2p/pkg/setcode/setcode_test.go b/p2p/pkg/setcode/setcode_test.go index eeb3704a5..36331b272 100644 --- a/p2p/pkg/setcode/setcode_test.go +++ b/p2p/pkg/setcode/setcode_test.go @@ -136,6 +136,30 @@ func TestSetCode(t *testing.T) { if codehash != expectedCodehash { t.Fatalf("codehash is not correct. Actual: %v, Expected: %v", codehash, expectedCodehash) } + + zeroAddr := common.Address{} + tx, err = setCodeHelper.SetCode(context.Background(), opts, zeroAddr) + if err != nil { + t.Fatalf("failed to set code: %v", err) + } + + _ = sim.Commit() + + receipt, err = bind.WaitMined(context.Background(), sim.Client(), tx) + if err != nil { + t.Fatalf("failed to wait for receipt: %v", err) + } + if receipt.Status != types.ReceiptStatusSuccessful { + t.Fatalf("tx failed: %v", receipt.Status) + } + + code, err = sim.Client().CodeAt(context.Background(), sender, nil) + if err != nil { + t.Fatalf("failed to get code: %v", err) + } + if len(code) != 0 { + t.Fatalf("code is not empty after setcode to zero address: %v", code) + } } func newTestLogger(t *testing.T, w io.Writer) *slog.Logger { diff --git a/p2p/rpc/bidderapi/v1/bidderapi.proto b/p2p/rpc/bidderapi/v1/bidderapi.proto index 0ced36a6d..a217add96 100644 --- a/p2p/rpc/bidderapi/v1/bidderapi.proto +++ b/p2p/rpc/bidderapi/v1/bidderapi.proto @@ -54,6 +54,14 @@ service Bidder { option (google.api.http) = {post: "/v1/bidder/enable_deposit_manager"}; } + // DisableDepositManager + // + // DisableDepositManager is called by the bidder node to disable the deposit manager + // by setting the bidder EOA's code to zero address. + rpc DisableDepositManager(DisableDepositManagerRequest) returns (DisableDepositManagerResponse) { + option (google.api.http) = {post: "/v1/bidder/disable_deposit_manager"}; + } + // SetTargetDeposits // // SetTargetDeposits is called by the bidder node to set target deposits per provider @@ -234,6 +242,25 @@ message EnableDepositManagerResponse { bool success = 1; } +message DisableDepositManagerRequest { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { + json_schema: { + title: "DisableDepositManager request" + description: "DisableDepositManager request." + } + }; +} + +message DisableDepositManagerResponse { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { + json_schema: { + title: "DisableDepositManager response" + description: "DisableDepositManager response." + } + }; + bool success = 1; +} + message TargetDeposit { string provider = 1; string target_deposit = 2; From 0c5d1a8279865da587a77b854b8dfe7e997dd7d9 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Mon, 25 Aug 2025 17:31:15 -0700 Subject: [PATCH 091/117] service.go nits --- p2p/pkg/rpc/bidder/service.go | 9 +++++++-- p2p/pkg/rpc/bidder/service_test.go | 8 ++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/p2p/pkg/rpc/bidder/service.go b/p2p/pkg/rpc/bidder/service.go index edd0d82b2..86cd1494d 100644 --- a/p2p/pkg/rpc/bidder/service.go +++ b/p2p/pkg/rpc/bidder/service.go @@ -438,13 +438,14 @@ func (s *Service) GetAllDeposits( End: nil, }, []common.Address{s.owner}, // This bidder - []common.Address{}, // all providers - []*big.Int{}, // all amounts + nil, // all providers + nil, // all amounts ) if err != nil { s.logger.Error("filtering bidder deposited", "error", err) return nil, status.Errorf(codes.Internal, "filtering bidder deposited: %v", err) } + defer deposits.Close() providersToQuery := make(map[common.Address]bool) for deposits.Next() { @@ -846,6 +847,10 @@ func (s *Service) GetValidProviders( } connectedProviders := s.topology.GetPeers(topology.Query{Type: p2p.PeerTypeProvider}) + if len(connectedProviders) == 0 { + return &bidderapiv1.GetValidProvidersResponse{ValidProviders: []string{}}, nil + } + providerAddrs := make([]common.Address, len(connectedProviders)) for i, provider := range connectedProviders { providerAddrs[i] = provider.EthAddress diff --git a/p2p/pkg/rpc/bidder/service_test.go b/p2p/pkg/rpc/bidder/service_test.go index 828ad2013..c1e50e808 100644 --- a/p2p/pkg/rpc/bidder/service_test.go +++ b/p2p/pkg/rpc/bidder/service_test.go @@ -274,10 +274,10 @@ func startServerWithStore(t *testing.T, cs *testStore) bidderapiv1.BidderClient 15*time.Second, logger, setCodeHelper, - nil, // TODO: Make deposit manager non-nil and test relevant functions from service.go - nil, // TODO: Make backend non-nil and test relevant functions from service.go - &topology.Topology{}, // TODO: Make topology non-nil and test relevant functions from service.go - common.HexToAddress("0x0000000000000000000000000000000000000000"), // TODO: Make deposit manager impl address non-nil and test relevant functions from service.go + nil, + nil, + &topology.Topology{}, + common.HexToAddress("0x0000000000000000000000000000000000000000"), ) baseServer := grpc.NewServer() From 761282d69601cc0800757edc823e0927770c8675 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Mon, 25 Aug 2025 17:32:27 -0700 Subject: [PATCH 092/117] Update BlockTrackerStorage.sol --- contracts/contracts/core/BlockTrackerStorage.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/contracts/contracts/core/BlockTrackerStorage.sol b/contracts/contracts/core/BlockTrackerStorage.sol index 91f49c9b0..ccd5286ea 100644 --- a/contracts/contracts/core/BlockTrackerStorage.sol +++ b/contracts/contracts/core/BlockTrackerStorage.sol @@ -7,7 +7,6 @@ abstract contract BlockTrackerStorage { /// @dev Permissioned address of the oracle account. address public oracleAccount; - // TODO: Remove this and associated update logic. uint256 public currentWindow; // Mapping from block number to the winner's address From 3d53cf19df7586ae7d4d41e431c8aaa2d359827a Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Mon, 25 Aug 2025 17:42:08 -0700 Subject: [PATCH 093/117] Update BlockTracker.sol --- contracts/contracts/core/BlockTracker.sol | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/contracts/contracts/core/BlockTracker.sol b/contracts/contracts/core/BlockTracker.sol index 5a8a3177e..5e373de0b 100644 --- a/contracts/contracts/core/BlockTracker.sol +++ b/contracts/contracts/core/BlockTracker.sol @@ -110,6 +110,14 @@ contract BlockTracker is IBlockTracker, BlockTrackerStorage, _unpause(); } + /** + * @dev Retrieves the current window number. + * @return currentWindow The current window number. + */ + function getCurrentWindow() external view returns (uint256) { + return currentWindow; + } + /** * @dev Function to get the winner of a specific block. * @param blockNumber The number of the block. From 026a047f6af154141cfa6f367460742f1b27636e Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Mon, 25 Aug 2025 17:43:05 -0700 Subject: [PATCH 094/117] Update IBlockTracker.sol --- contracts/contracts/interfaces/IBlockTracker.sol | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/contracts/contracts/interfaces/IBlockTracker.sol b/contracts/contracts/interfaces/IBlockTracker.sol index 3b315a031..f7e5c7e23 100644 --- a/contracts/contracts/interfaces/IBlockTracker.sol +++ b/contracts/contracts/interfaces/IBlockTracker.sol @@ -42,6 +42,10 @@ interface IBlockTracker { /// @return The Ethereum address of the builder. function getBuilder(string calldata builderNameGrafiti) external view returns (address); + /// @notice Gets the current window number. + /// @return The current window number. + function getCurrentWindow() external view returns (uint256); + /// @notice Retrieves the winner of a specific L1 block. /// @param _blockNumber The block number of the L1 block. /// @return The address of the winner of the L1 block. From 6d759b029c25c38c31ecf3be4399684ee5c045bb Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Mon, 25 Aug 2025 17:50:14 -0700 Subject: [PATCH 095/117] nits --- contracts/test/core/DepositManagerTest.sol | 2 +- p2p/pkg/rpc/bidder/service.go | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/contracts/test/core/DepositManagerTest.sol b/contracts/test/core/DepositManagerTest.sol index b29d085e7..0f6548248 100644 --- a/contracts/test/core/DepositManagerTest.sol +++ b/contracts/test/core/DepositManagerTest.sol @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: UNLICENSED +// SPDX-License-Identifier: BSL 1.1 pragma solidity 0.8.26; import "forge-std/Test.sol"; diff --git a/p2p/pkg/rpc/bidder/service.go b/p2p/pkg/rpc/bidder/service.go index 86cd1494d..9247f6236 100644 --- a/p2p/pkg/rpc/bidder/service.go +++ b/p2p/pkg/rpc/bidder/service.go @@ -445,7 +445,11 @@ func (s *Service) GetAllDeposits( s.logger.Error("filtering bidder deposited", "error", err) return nil, status.Errorf(codes.Internal, "filtering bidder deposited: %v", err) } - defer deposits.Close() + defer func() { + if err := deposits.Close(); err != nil { + s.logger.Error("closing deposits", "error", err) + } + }() providersToQuery := make(map[common.Address]bool) for deposits.Next() { From 8695f394b1c5934d7730d66237951dd5be632731 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Mon, 25 Aug 2025 17:54:45 -0700 Subject: [PATCH 096/117] Update setcode.go --- p2p/pkg/setcode/setcode.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/p2p/pkg/setcode/setcode.go b/p2p/pkg/setcode/setcode.go index f1874ca6f..5b0d77f51 100644 --- a/p2p/pkg/setcode/setcode.go +++ b/p2p/pkg/setcode/setcode.go @@ -50,8 +50,6 @@ func (s *SetCodeHelper) SetCode( return nil, fmt.Errorf("gas limit is required") } - // TODO: Create our own SetCodeAuthorization signing library compatible with KeySigner. - // For now we use geth's EIP-7702 library that only supports ecdsa.PrivateKey pk, err := s.signer.GetPrivateKey() if err != nil { s.logger.Error("error getting private key from keysigner", "error", err) From ad4025d075cd28e79c76b91101698eded0270e36 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Mon, 25 Aug 2025 18:01:05 -0700 Subject: [PATCH 097/117] rm autodeposit integration test --- testing/pkg/tests/deposit/deposit.go | 246 --------------------------- testing/pkg/tests/testcase.go | 2 - 2 files changed, 248 deletions(-) delete mode 100644 testing/pkg/tests/deposit/deposit.go diff --git a/testing/pkg/tests/deposit/deposit.go b/testing/pkg/tests/deposit/deposit.go deleted file mode 100644 index 1d4eca1d2..000000000 --- a/testing/pkg/tests/deposit/deposit.go +++ /dev/null @@ -1,246 +0,0 @@ -package deposit - -const ( -// noOfWindows = 2 -// withdraw = true -) - -// TODO: Adjust this file to test new bidder semantics - -// func RunAutoDeposit(ctx context.Context, cluster orchestrator.Orchestrator, _ any) error { -// bidders := cluster.Bidders() -// logger := cluster.Logger().With("test", "autodeposit") - -// deposits := make(chan *bidderregistry.BidderregistryBidderRegistered) -// withdrawals := make(chan *bidderregistry.BidderregistryBidderWithdrawal) -// window := make(chan *blocktracker.BlocktrackerNewWindow) - -// // Listen for deposits and withdrawals -// sub, err := cluster.Events().Subscribe( -// events.NewEventHandler( -// "BidderRegistered", -// func(r *bidderregistry.BidderregistryBidderRegistered) { -// deposits <- r -// }, -// ), -// events.NewEventHandler( -// "BidderWithdrawal", -// func(r *bidderregistry.BidderregistryBidderWithdrawal) { -// withdrawals <- r -// }, -// ), -// events.NewEventHandler( -// "NewWindow", -// func(w *blocktracker.BlocktrackerNewWindow) { -// window <- w -// }, -// ), -// ) -// if err != nil { -// return err -// } - -// defer sub.Unsubscribe() - -// var start atomic.Value -// depositsRcvd := make(map[common.Address][]*bidderregistry.BidderregistryBidderRegistered) -// withdrawalsRcvd := make(map[common.Address][]*bidderregistry.BidderregistryBidderWithdrawal) - -// eg := errgroup.Group{} -// egCtx, egCancel := context.WithCancel(ctx) -// defer egCancel() - -// eg.Go(func() error { -// logger.Info("Starting test... waiting for new window") -// for { -// select { -// case <-egCtx.Done(): -// return nil -// case r := <-deposits: -// logger.Info("Received deposit", "bidder", r.Bidder) -// depositsRcvd[r.Bidder] = append(depositsRcvd[r.Bidder], r) -// case r := <-withdrawals: -// logger.Info("Received withdrawal", "bidder", r.Bidder) -// withdrawalsRcvd[r.Bidder] = append(withdrawalsRcvd[r.Bidder], r) -// case w := <-window: -// logger.Info("Received new window", "window", w.Window) -// switch { -// case start.Load() == nil: -// for _, bidder := range bidders { -// resp, err := bidder.BidderAPI().AutoDeposit(egCtx, &bidderapiv1.DepositRequest{ -// Amount: "1000000000000000000", -// }) -// if err != nil { -// return err -// } -// logger.Info( -// "Auto deposit", -// "bidder", bidder.EthAddress(), -// "window", w.Window, -// "response", resp, -// ) -// } -// start.Store(new(big.Int).Add(w.Window, big.NewInt(1))) -// logger.Info("Autodeposit", "start", start.Load()) -// case new(big.Int).Sub(w.Window, start.Load().(*big.Int)).Cmp(big.NewInt(noOfWindows)) == 0: -// logger.Info("Finish autodeposit checker", "window", w.Window) -// return nil -// } -// } -// } -// }) - -// if err := eg.Wait(); err != nil { -// return err -// } - -// // ensure we have deposits from start window and withdrawals from start window -// for _, bidder := range bidders { -// depositsForBidder := depositsRcvd[common.HexToAddress(bidder.EthAddress())] -// withdrawalsForBidder := withdrawalsRcvd[common.HexToAddress(bidder.EthAddress())] - -// for i, deposit := range depositsForBidder { -// expWindow := new(big.Int).Add(start.Load().(*big.Int), big.NewInt(int64(i))) -// if deposit.WindowNumber.Cmp(expWindow) != 0 { -// logger.Error( -// "Deposit received in wrong window", -// "bidder", bidder.EthAddress(), -// "expected", expWindow, -// "received", deposit.WindowNumber, -// ) -// return fmt.Errorf("deposit received in wrong window") -// } -// } - -// for i, withdrawal := range withdrawalsForBidder { -// expWindow := new(big.Int).Add(start.Load().(*big.Int), big.NewInt(int64(i))) -// if withdrawal.Window.Cmp(expWindow) != 0 { -// logger.Error( -// "Withdrawal received in wrong window", -// "bidder", bidder.EthAddress(), -// "expected", expWindow, -// "received", withdrawal.Window, -// ) -// return fmt.Errorf("withdrawal received in wrong window") -// } -// } -// } - -// return nil -// } - -// func RunCancelAutoDeposit(ctx context.Context, cluster orchestrator.Orchestrator, _ any) error { -// bidders := cluster.Bidders() -// logger := cluster.Logger().With("test", "cancel_autodeposit") - -// deposits := make(chan *bidderregistry.BidderregistryBidderRegistered) -// withdrawals := make(chan *bidderregistry.BidderregistryBidderWithdrawal) -// window := make(chan *blocktracker.BlocktrackerNewWindow) - -// // Listen for deposits and withdrawals -// sub, err := cluster.Events().Subscribe( -// events.NewEventHandler( -// "BidderRegistered", -// func(r *bidderregistry.BidderregistryBidderRegistered) { -// deposits <- r -// }, -// ), -// events.NewEventHandler( -// "BidderWithdrawal", -// func(r *bidderregistry.BidderregistryBidderWithdrawal) { -// withdrawals <- r -// }, -// ), -// events.NewEventHandler( -// "NewWindow", -// func(w *blocktracker.BlocktrackerNewWindow) { -// window <- w -// }, -// ), -// ) -// if err != nil { -// return err -// } - -// defer sub.Unsubscribe() - -// var stop, end atomic.Value -// depositsRcvd := make(map[common.Address][]*bidderregistry.BidderregistryBidderRegistered) -// withdrawalsRcvd := make(map[common.Address][]*bidderregistry.BidderregistryBidderWithdrawal) - -// eg, ctx := errgroup.WithContext(ctx) -// egCtx, egCancel := context.WithCancel(ctx) -// defer egCancel() - -// eg.Go(func() error { -// logger.Info("Starting test... waiting for new window") -// for { -// select { -// case <-egCtx.Done(): -// return nil -// case r := <-deposits: -// logger.Info("Received deposit", "bidder", r.Bidder) -// depositsRcvd[r.Bidder] = append(depositsRcvd[r.Bidder], r) -// if stop.Load() == nil { -// for _, bidder := range bidders { -// resp, err := bidder.BidderAPI().CancelAutoDeposit(egCtx, &bidderapiv1.CancelAutoDepositRequest{ -// Withdraw: withdraw, -// }) -// if err != nil { -// return err -// } -// logger.Info( -// "Cancelled auto deposit", -// "bidder", bidder.EthAddress(), -// "window", r.WindowNumber, -// "response", resp, -// ) -// } -// stop.Store(new(big.Int).Add(r.WindowNumber, big.NewInt(1))) -// end.Store(new(big.Int).Add(r.WindowNumber, big.NewInt(2))) -// } -// case r := <-withdrawals: -// logger.Info("Received withdrawal", "bidder", r.Bidder) -// withdrawalsRcvd[r.Bidder] = append(withdrawalsRcvd[r.Bidder], r) -// case w := <-window: -// logger.Info("Received new window", "window", w.Window) -// if end.Load() != nil && w.Window.Cmp(end.Load().(*big.Int)) == 0 { -// logger.Info("Finished test", "window", w.Window) -// return nil -// } -// } -// } -// }) - -// if err := eg.Wait(); err != nil { -// return err -// } - -// for _, bidder := range bidders { -// depositsForBidder := depositsRcvd[common.HexToAddress(bidder.EthAddress())] -// withdrawalsForBidder := withdrawalsRcvd[common.HexToAddress(bidder.EthAddress())] - -// if depositsForBidder[len(depositsForBidder)-1].WindowNumber.Cmp(stop.Load().(*big.Int)) == 1 { -// logger.Error( -// "Last deposit received after stop window", -// "bidder", bidder.EthAddress(), -// "stop", stop.Load(), -// "received", depositsForBidder[len(depositsForBidder)-1].WindowNumber, -// ) -// return fmt.Errorf("deposit received after stop window") -// } - -// // last withdrawal should be 1 less than the stop window -// if withdrawalsForBidder[len(withdrawalsForBidder)-1].Window.Cmp(stop.Load().(*big.Int)) != -1 { -// logger.Error( -// "Last withdrawal received after stop window", -// "bidder", bidder.EthAddress(), -// "stop", stop.Load(), -// "received", withdrawalsForBidder[len(withdrawalsForBidder)-1].Window, -// ) -// return fmt.Errorf("withdrawal received after stop window") -// } -// } - -// return nil -// } diff --git a/testing/pkg/tests/testcase.go b/testing/pkg/tests/testcase.go index 1f8d72e1a..79a304f4a 100644 --- a/testing/pkg/tests/testcase.go +++ b/testing/pkg/tests/testcase.go @@ -22,7 +22,5 @@ var TestCases = []TestEntry{ {"staking", staking.Run}, {"staking_add_deposit", staking.RunAddDeposit}, {"connectivity", connectivity.Run}, - // {"autodeposit", deposit.RunAutoDeposit}, {"preconf", preconf.RunPreconf}, - // {"cancelAutodeposit", deposit.RunCancelAutoDeposit}, } From 1dbcb3bf8e250f42d82b98ef18fc705423ca7677 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Mon, 25 Aug 2025 19:12:59 -0700 Subject: [PATCH 098/117] contract nits --- contracts-abi/abi/BidderRegistry.abi | 37 +++++++++++++++++++ contracts-abi/abi/BlockTracker.abi | 13 +++++++ .../clients/BidderRegistry/BidderRegistry.go | 2 +- .../clients/BlockTracker/BlockTracker.go | 33 ++++++++++++++++- contracts/contracts/core/BidderRegistry.sol | 6 ++- .../contracts/interfaces/IBidderRegistry.sol | 9 +++++ contracts/test/core/BidderRegistryTest.sol | 2 +- contracts/test/core/PreconfManagerTest.sol | 2 + 8 files changed, 100 insertions(+), 4 deletions(-) diff --git a/contracts-abi/abi/BidderRegistry.abi b/contracts-abi/abi/BidderRegistry.abi index 5925ab008..1d39ff283 100644 --- a/contracts-abi/abi/BidderRegistry.abi +++ b/contracts-abi/abi/BidderRegistry.abi @@ -1187,6 +1187,22 @@ } ] }, + { + "type": "error", + "name": "DepositAmountIsLessThanProviders", + "inputs": [ + { + "name": "depositAmount", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "numProviders", + "type": "uint256", + "internalType": "uint256" + } + ] + }, { "type": "error", "name": "DepositAmountIsZero", @@ -1318,6 +1334,11 @@ } ] }, + { + "type": "error", + "name": "ProviderIsZeroAddress", + "inputs": [] + }, { "type": "error", "name": "ReentrancyGuardReentrantCall", @@ -1418,6 +1439,22 @@ } ] }, + { + "type": "error", + "name": "WithdrawalRequestAlreadyExists", + "inputs": [ + { + "name": "bidder", + "type": "address", + "internalType": "address" + }, + { + "name": "provider", + "type": "address", + "internalType": "address" + } + ] + }, { "type": "error", "name": "WithdrawalRequestDoesNotExist", diff --git a/contracts-abi/abi/BlockTracker.abi b/contracts-abi/abi/BlockTracker.abi index ce495a334..62fb323fa 100644 --- a/contracts-abi/abi/BlockTracker.abi +++ b/contracts-abi/abi/BlockTracker.abi @@ -139,6 +139,19 @@ ], "stateMutability": "view" }, + { + "type": "function", + "name": "getCurrentWindow", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, { "type": "function", "name": "initialize", diff --git a/contracts-abi/clients/BidderRegistry/BidderRegistry.go b/contracts-abi/clients/BidderRegistry/BidderRegistry.go index d6ca46bd6..8e39ca1b1 100644 --- a/contracts-abi/clients/BidderRegistry/BidderRegistry.go +++ b/contracts-abi/clients/BidderRegistry/BidderRegistry.go @@ -37,7 +37,7 @@ type TimestampOccurrenceOccurrence struct { // BidderregistryMetaData contains all meta data concerning the Bidderregistry contract. var BidderregistryMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"ONE_HUNDRED_PERCENT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PRECISION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"bidPayment\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"bidAmt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"state\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bidderWithdrawalPeriodMs\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"blockTrackerContract\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBlockTracker\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"convertFundsToProviderReward\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"addresspayable\"},{\"name\":\"residualBidPercentAfterDecay\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositAsBidder\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"depositEvenlyAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"depositManagerHash\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositManagerImpl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deposits\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"availableAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"escrowedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalRequestOccurrence\",\"type\":\"tuple\",\"internalType\":\"structTimestampOccurrence.Occurrence\",\"components\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"feePercent\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAccumulatedProtocolFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDeposit\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEscrowedAmount\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProviderAmount\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_protocolFeeRecipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_feePercent\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_blockTracker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_feePayoutPeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_bidderWithdrawalPeriodMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"manuallyWithdrawProtocolFee\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"openBid\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"bidAmt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"preconfManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"protocolFeeTracker\",\"inputs\":[],\"outputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"accumulatedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"lastPayoutTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"payoutTimePeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"providerAmount\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"requestWithdrawalsAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setBlockTrackerContract\",\"inputs\":[{\"name\":\"newBlockTrackerContract\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDepositManagerImpl\",\"inputs\":[{\"name\":\"_depositManagerImpl\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewFeePayoutPeriod\",\"inputs\":[{\"name\":\"newFeePayoutPeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewFeePercent\",\"inputs\":[{\"name\":\"newFeePercent\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewProtocolFeeRecipient\",\"inputs\":[{\"name\":\"newProtocolFeeRecipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPreconfManager\",\"inputs\":[{\"name\":\"contractAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unlockFunds\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"withdrawAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawProviderAmount\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawalRequestExists\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"BidAmountReduced\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newBidAmt\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BidderDeposited\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"depositedAmount\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BidderWithdrawal\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amountWithdrawn\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"amountStillEscrowed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockTrackerUpdated\",\"inputs\":[{\"name\":\"newBlockTracker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DepositManagerImplUpdated\",\"inputs\":[{\"name\":\"newDepositManagerImpl\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeePayoutPeriodUpdated\",\"inputs\":[{\"name\":\"newFeePayoutPeriod\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeePercentUpdated\",\"inputs\":[{\"name\":\"newFeePercent\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeTransfer\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FundsRewarded\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FundsUnlocked\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"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\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PreconfManagerUpdated\",\"inputs\":[{\"name\":\"newPreconfManager\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProtocolFeeRecipientUpdated\",\"inputs\":[{\"name\":\"newProtocolFeeRecipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TopUpFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransferToBidderFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalRequested\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"availableAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"escrowedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"BidNotPreConfirmed\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"actualState\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"},{\"name\":\"expectedState\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"}]},{\"type\":\"error\",\"name\":\"BidderWithdrawalTransferFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"DepositAmountIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DepositDoesNotExist\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DepositManagerNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpectedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FeeRecipientIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoProviders\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyBidderCanWithdraw\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"PayoutPeriodMustBePositive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ProviderAmountIsZero\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SenderIsNotPreconfManager\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"preconfManager\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TransferToProviderFailed\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"TransferToRecipientFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"WithdrawalOccurrenceExists\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"requestTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"WithdrawalPeriodNotElapsed\",\"inputs\":[{\"name\":\"currentTimestampMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalTimestampMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalPeriodMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"WithdrawalRequestDoesNotExist\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"ONE_HUNDRED_PERCENT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PRECISION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"bidPayment\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"bidAmt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"state\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bidderWithdrawalPeriodMs\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"blockTrackerContract\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBlockTracker\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"convertFundsToProviderReward\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"addresspayable\"},{\"name\":\"residualBidPercentAfterDecay\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositAsBidder\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"depositEvenlyAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"depositManagerHash\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositManagerImpl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deposits\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"availableAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"escrowedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalRequestOccurrence\",\"type\":\"tuple\",\"internalType\":\"structTimestampOccurrence.Occurrence\",\"components\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"feePercent\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAccumulatedProtocolFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDeposit\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEscrowedAmount\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProviderAmount\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_protocolFeeRecipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_feePercent\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_blockTracker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_feePayoutPeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_bidderWithdrawalPeriodMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"manuallyWithdrawProtocolFee\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"openBid\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"bidAmt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"preconfManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"protocolFeeTracker\",\"inputs\":[],\"outputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"accumulatedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"lastPayoutTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"payoutTimePeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"providerAmount\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"requestWithdrawalsAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setBlockTrackerContract\",\"inputs\":[{\"name\":\"newBlockTrackerContract\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDepositManagerImpl\",\"inputs\":[{\"name\":\"_depositManagerImpl\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewFeePayoutPeriod\",\"inputs\":[{\"name\":\"newFeePayoutPeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewFeePercent\",\"inputs\":[{\"name\":\"newFeePercent\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewProtocolFeeRecipient\",\"inputs\":[{\"name\":\"newProtocolFeeRecipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPreconfManager\",\"inputs\":[{\"name\":\"contractAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unlockFunds\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"withdrawAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawProviderAmount\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawalRequestExists\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"BidAmountReduced\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newBidAmt\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BidderDeposited\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"depositedAmount\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BidderWithdrawal\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amountWithdrawn\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"amountStillEscrowed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockTrackerUpdated\",\"inputs\":[{\"name\":\"newBlockTracker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DepositManagerImplUpdated\",\"inputs\":[{\"name\":\"newDepositManagerImpl\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeePayoutPeriodUpdated\",\"inputs\":[{\"name\":\"newFeePayoutPeriod\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeePercentUpdated\",\"inputs\":[{\"name\":\"newFeePercent\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeTransfer\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FundsRewarded\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FundsUnlocked\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"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\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PreconfManagerUpdated\",\"inputs\":[{\"name\":\"newPreconfManager\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProtocolFeeRecipientUpdated\",\"inputs\":[{\"name\":\"newProtocolFeeRecipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TopUpFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransferToBidderFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalRequested\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"availableAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"escrowedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"BidNotPreConfirmed\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"actualState\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"},{\"name\":\"expectedState\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"}]},{\"type\":\"error\",\"name\":\"BidderWithdrawalTransferFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"DepositAmountIsLessThanProviders\",\"inputs\":[{\"name\":\"depositAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"numProviders\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"DepositAmountIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DepositDoesNotExist\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DepositManagerNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpectedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FeeRecipientIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoProviders\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyBidderCanWithdraw\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"PayoutPeriodMustBePositive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ProviderAmountIsZero\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ProviderIsZeroAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SenderIsNotPreconfManager\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"preconfManager\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TransferToProviderFailed\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"TransferToRecipientFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"WithdrawalOccurrenceExists\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"requestTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"WithdrawalPeriodNotElapsed\",\"inputs\":[{\"name\":\"currentTimestampMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalTimestampMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalPeriodMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"WithdrawalRequestAlreadyExists\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"WithdrawalRequestDoesNotExist\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]}]", } // BidderregistryABI is the input ABI used to generate the binding from. diff --git a/contracts-abi/clients/BlockTracker/BlockTracker.go b/contracts-abi/clients/BlockTracker/BlockTracker.go index ad5b4cbba..99ca6b320 100644 --- a/contracts-abi/clients/BlockTracker/BlockTracker.go +++ b/contracts-abi/clients/BlockTracker/BlockTracker.go @@ -31,7 +31,7 @@ var ( // BlocktrackerMetaData contains all meta data concerning the Blocktracker contract. var BlocktrackerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addBuilderAddress\",\"inputs\":[{\"name\":\"builderName\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"builderAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"blockBuilderNameToAddress\",\"inputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"blockWinners\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentWindow\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBlockWinner\",\"inputs\":[{\"name\":\"blockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBuilder\",\"inputs\":[{\"name\":\"builderNameGraffiti\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"oracleAccount_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"owner_\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"oracleAccount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"providerRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIProviderRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordL1Block\",\"inputs\":[{\"name\":\"_blockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_winnerBLSKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOracleAccount\",\"inputs\":[{\"name\":\"newOracleAccount\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setProviderRegistry\",\"inputs\":[{\"name\":\"newProviderRegistry\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"BuilderAddressAdded\",\"inputs\":[{\"name\":\"builderName\",\"type\":\"string\",\"indexed\":true,\"internalType\":\"string\"},{\"name\":\"builderAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewL1Block\",\"inputs\":[{\"name\":\"blockNumber\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"winner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"window\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewWindow\",\"inputs\":[{\"name\":\"window\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OracleAccountSet\",\"inputs\":[{\"name\":\"oldOracleAccount\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOracleAccount\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"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\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProviderRegistrySet\",\"inputs\":[{\"name\":\"oldProviderRegistry\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newProviderRegistry\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"BlockNumberIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpectedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidFallback\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidReceive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotOracleAccount\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"oracleAccount\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addBuilderAddress\",\"inputs\":[{\"name\":\"builderName\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"builderAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"blockBuilderNameToAddress\",\"inputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"blockWinners\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentWindow\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBlockWinner\",\"inputs\":[{\"name\":\"blockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBuilder\",\"inputs\":[{\"name\":\"builderNameGraffiti\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentWindow\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"oracleAccount_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"owner_\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"oracleAccount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"providerRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIProviderRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordL1Block\",\"inputs\":[{\"name\":\"_blockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_winnerBLSKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOracleAccount\",\"inputs\":[{\"name\":\"newOracleAccount\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setProviderRegistry\",\"inputs\":[{\"name\":\"newProviderRegistry\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"BuilderAddressAdded\",\"inputs\":[{\"name\":\"builderName\",\"type\":\"string\",\"indexed\":true,\"internalType\":\"string\"},{\"name\":\"builderAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewL1Block\",\"inputs\":[{\"name\":\"blockNumber\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"winner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"window\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewWindow\",\"inputs\":[{\"name\":\"window\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OracleAccountSet\",\"inputs\":[{\"name\":\"oldOracleAccount\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOracleAccount\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"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\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProviderRegistrySet\",\"inputs\":[{\"name\":\"oldProviderRegistry\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newProviderRegistry\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"BlockNumberIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpectedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidFallback\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidReceive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotOracleAccount\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"oracleAccount\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", } // BlocktrackerABI is the input ABI used to generate the binding from. @@ -366,6 +366,37 @@ func (_Blocktracker *BlocktrackerCallerSession) GetBuilder(builderNameGraffiti s return _Blocktracker.Contract.GetBuilder(&_Blocktracker.CallOpts, builderNameGraffiti) } +// GetCurrentWindow is a free data retrieval call binding the contract method 0x0f67e7d5. +// +// Solidity: function getCurrentWindow() view returns(uint256) +func (_Blocktracker *BlocktrackerCaller) GetCurrentWindow(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _Blocktracker.contract.Call(opts, &out, "getCurrentWindow") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetCurrentWindow is a free data retrieval call binding the contract method 0x0f67e7d5. +// +// Solidity: function getCurrentWindow() view returns(uint256) +func (_Blocktracker *BlocktrackerSession) GetCurrentWindow() (*big.Int, error) { + return _Blocktracker.Contract.GetCurrentWindow(&_Blocktracker.CallOpts) +} + +// GetCurrentWindow is a free data retrieval call binding the contract method 0x0f67e7d5. +// +// Solidity: function getCurrentWindow() view returns(uint256) +func (_Blocktracker *BlocktrackerCallerSession) GetCurrentWindow() (*big.Int, error) { + return _Blocktracker.Contract.GetCurrentWindow(&_Blocktracker.CallOpts) +} + // OracleAccount is a free data retrieval call binding the contract method 0xe7c59736. // // Solidity: function oracleAccount() view returns(address) diff --git a/contracts/contracts/core/BidderRegistry.sol b/contracts/contracts/core/BidderRegistry.sol index 8718095db..b9655417c 100644 --- a/contracts/contracts/core/BidderRegistry.sol +++ b/contracts/contracts/core/BidderRegistry.sol @@ -80,6 +80,7 @@ contract BidderRegistry is bidderWithdrawalPeriodMs = _bidderWithdrawalPeriodMs; __ReentrancyGuard_init(); __Ownable_init(_owner); + __UUPSUpgradeable_init(); __Pausable_init(); } @@ -89,6 +90,7 @@ contract BidderRegistry is */ function depositAsBidder(address provider) external payable whenNotPaused { require(msg.value != 0, DepositAmountIsZero()); + require(provider != address(0), ProviderIsZeroAddress()); _depositAsBidder(provider, msg.value); } @@ -97,15 +99,16 @@ contract BidderRegistry is * @param providers The providers for which the deposits are being made. */ function depositEvenlyAsBidder(address[] calldata providers) external payable whenNotPaused { - require(msg.value != 0, DepositAmountIsZero()); uint256 len = providers.length; require(len > 0, NoProviders()); + require(msg.value >= len, DepositAmountIsLessThanProviders(msg.value, len)); uint256 amountToDeposit = msg.value / len; uint256 remainingAmount = msg.value % len; // to handle rounding issues for (uint16 i = 0; i < len; ++i) { address provider = providers[i]; + require(provider != address(0), ProviderIsZeroAddress()); uint256 amount = amountToDeposit; if (i == len - 1) { amount += remainingAmount; // Add the remainder to the last provider @@ -127,6 +130,7 @@ contract BidderRegistry is address provider = providers[i]; Deposit storage deposit = deposits[bidder][provider]; require(deposit.exists, DepositDoesNotExist(bidder, provider)); + require(!deposit.withdrawalRequestOccurrence.exists, WithdrawalRequestAlreadyExists(bidder, provider)); TimestampOccurrence.captureOccurrence(deposit.withdrawalRequestOccurrence); emit WithdrawalRequested(bidder, provider, deposit.availableAmount, deposit.escrowedAmount, deposit.withdrawalRequestOccurrence.timestamp); diff --git a/contracts/contracts/interfaces/IBidderRegistry.sol b/contracts/contracts/interfaces/IBidderRegistry.sol index 2c53a27ea..88d597fc9 100644 --- a/contracts/contracts/interfaces/IBidderRegistry.sol +++ b/contracts/contracts/interfaces/IBidderRegistry.sol @@ -127,6 +127,12 @@ interface IBidderRegistry { /// @dev Error emitted when the bidder tries to deposit 0 amount error DepositAmountIsZero(); + /// @dev Error emitted when the provider is a zero address + error ProviderIsZeroAddress(); + + /// @dev Error emitted when the deposit amount is less than the number of providers + error DepositAmountIsLessThanProviders(uint256 depositAmount, uint256 numProviders); + /// @dev Error emitted when no providers are given as an argument error NoProviders(); @@ -145,6 +151,9 @@ interface IBidderRegistry { /// @dev Error emitted when a withdrawal request hasn't been made yet error WithdrawalRequestDoesNotExist(address bidder, address provider); + /// @dev Error emitted when a withdrawal request already exists + error WithdrawalRequestAlreadyExists(address bidder, address provider); + function openBid( bytes32 commitmentDigest, uint256 bidAmt, diff --git a/contracts/test/core/BidderRegistryTest.sol b/contracts/test/core/BidderRegistryTest.sol index ee95ce377..e2a841fdf 100644 --- a/contracts/test/core/BidderRegistryTest.sol +++ b/contracts/test/core/BidderRegistryTest.sol @@ -809,7 +809,7 @@ contract BidderRegistryTest is Test { function test_depositEvenlyAsBidder_DepositAmountIsZero() public { address provider = vm.addr(8); - vm.expectRevert(IBidderRegistry.DepositAmountIsZero.selector); + vm.expectRevert(abi.encodeWithSelector(IBidderRegistry.DepositAmountIsLessThanProviders.selector, 0 ether, 1)); address[] memory providers = new address[](1); providers[0] = provider; vm.prank(bidder); diff --git a/contracts/test/core/PreconfManagerTest.sol b/contracts/test/core/PreconfManagerTest.sol index 357506295..dfb603c9f 100644 --- a/contracts/test/core/PreconfManagerTest.sol +++ b/contracts/test/core/PreconfManagerTest.sol @@ -165,6 +165,8 @@ contract PreconfManagerTest is Test { // Sets fake block timestamp vm.warp(500); bidderRegistry.setPreconfManager(address(preconfManager)); + + provider = vm.addr(10); } function test_GetBidHash1() public { From 244511ae2cee409c481ee04b3a44fdbd71f13dbc Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Mon, 25 Aug 2025 22:24:30 -0700 Subject: [PATCH 099/117] Update orchestrator.go --- testing/pkg/orchestrator/orchestrator.go | 39 ++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/testing/pkg/orchestrator/orchestrator.go b/testing/pkg/orchestrator/orchestrator.go index 5994bf8f2..0fccba5d8 100644 --- a/testing/pkg/orchestrator/orchestrator.go +++ b/testing/pkg/orchestrator/orchestrator.go @@ -7,7 +7,9 @@ import ( "fmt" "io" "log/slog" + "math/big" "strings" + "time" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" @@ -227,6 +229,34 @@ func (o *orchestrator) Close() error { return errs } +func (o *orchestrator) setupBidderDeposits() error { + perProviderAmount := new(big.Int) + perProviderAmount.SetString("1000000000000000000", 10) // 1 ETH + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + + if len(o.providers) == 0 || len(o.bidders) == 0 { + return nil + } + providerAddrs := make([]string, 0, len(o.providers)) + for _, p := range o.providers { + providerAddrs = append(providerAddrs, p.EthAddress()) + } + total := new(big.Int).Mul(perProviderAmount, big.NewInt(int64(len(providerAddrs)))) + + for _, b := range o.bidders { + _, err := b.BidderAPI().DepositEvenly(ctx, &bidderapiv1.DepositEvenlyRequest{ + Providers: providerAddrs, + TotalAmount: total.String(), + }) + if err != nil { + o.logger.Error("failed bidder deposit", "bidder", b.EthAddress(), "error", err) + return fmt.Errorf("deposit for bidder %s: %w", b.EthAddress(), err) + } + } + return nil +} + func createNodes[T any](logger *slog.Logger, rpcAddrs []string) ([]T, error) { nodes := make([]T, 0, len(rpcAddrs)) for _, rpcAddr := range rpcAddrs { @@ -297,7 +327,7 @@ func NewOrchestrator(opts Options) (Orchestrator, error) { ctx, cancel := context.WithCancel(context.Background()) stopped := evtPublisher.Start(ctx, contractAddrs...) - return &orchestrator{ + orc := &orchestrator{ providers: providers, bidders: bidders, bootnodes: bootnodes, @@ -306,7 +336,12 @@ func NewOrchestrator(opts Options) (Orchestrator, error) { logger: opts.Logger, pubCancel: cancel, pubStopped: stopped, - }, nil + } + + if err := orc.setupBidderDeposits(); err != nil { + return nil, err + } + return orc, nil } func getContractABIs(opts Options) (map[common.Address]*abi.ABI, error) { From 5395943a5a052822f96208a7b981fcd88e45ca69 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Tue, 26 Aug 2025 12:55:56 -0700 Subject: [PATCH 100/117] use events for GetValidProviders --- p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go | 4 +-- .../bidderapi/v1/bidderapi.swagger.yaml | 2 +- p2p/pkg/rpc/bidder/service.go | 35 +++++++++++++------ p2p/rpc/bidderapi/v1/bidderapi.proto | 2 +- 4 files changed, 29 insertions(+), 14 deletions(-) diff --git a/p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go b/p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go index 47f217358..1462cf44c 100644 --- a/p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go +++ b/p2p/gen/go/bidderapi/v1/bidderapi_grpc.pb.go @@ -83,7 +83,7 @@ type BidderClient interface { // GetValidProviders // // GetValidProviders is called by the bidder node to get a list of all valid providers. - // Each provider returned by this RPC must be connected to the bidder node via p2p and: + // Each provider returned by this RPC must: // - Be "registered" in the provider registry // - Have deposit >= minStake in provider registry // - Have no pending withdrawal request with provider registry @@ -318,7 +318,7 @@ type BidderServer interface { // GetValidProviders // // GetValidProviders is called by the bidder node to get a list of all valid providers. - // Each provider returned by this RPC must be connected to the bidder node via p2p and: + // Each provider returned by this RPC must: // - Be "registered" in the provider registry // - Have deposit >= minStake in provider registry // - Have no pending withdrawal request with provider registry diff --git a/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml b/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml index d89688b10..c218be870 100644 --- a/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml +++ b/p2p/gen/openapi/bidderapi/v1/bidderapi.swagger.yaml @@ -227,7 +227,7 @@ paths: summary: GetValidProviders description: |- GetValidProviders is called by the bidder node to get a list of all valid providers. - Each provider returned by this RPC must be connected to the bidder node via p2p and: + Each provider returned by this RPC must: - Be "registered" in the provider registry - Have deposit >= minStake in provider registry - Have no pending withdrawal request with provider registry diff --git a/p2p/pkg/rpc/bidder/service.go b/p2p/pkg/rpc/bidder/service.go index 9247f6236..2c2f47e6f 100644 --- a/p2p/pkg/rpc/bidder/service.go +++ b/p2p/pkg/rpc/bidder/service.go @@ -18,7 +18,6 @@ import ( providerregistry "github.com/primev/mev-commit/contracts-abi/clients/ProviderRegistry" bidderapiv1 "github.com/primev/mev-commit/p2p/gen/go/bidderapi/v1" preconfirmationv1 "github.com/primev/mev-commit/p2p/gen/go/preconfirmation/v1" - "github.com/primev/mev-commit/p2p/pkg/p2p" preconfstore "github.com/primev/mev-commit/p2p/pkg/preconfirmation/store" "github.com/primev/mev-commit/p2p/pkg/topology" "google.golang.org/grpc/codes" @@ -103,6 +102,7 @@ type ProviderRegistryContract interface { BidderSlashedAmount(*bind.CallOpts, common.Address) (*big.Int, error) WithdrawSlashedAmount(*bind.TransactOpts) (*types.Transaction, error) ParseBidderWithdrawSlashedAmount(log types.Log) (*providerregistry.ProviderregistryBidderWithdrawSlashedAmount, error) + FilterProviderRegistered(opts *bind.FilterOpts, provider []common.Address) (*providerregistry.ProviderregistryProviderRegisteredIterator, error) AreProvidersValid(*bind.CallOpts, []common.Address) ([]bool, error) } @@ -850,28 +850,43 @@ func (s *Service) GetValidProviders( return nil, status.Errorf(codes.InvalidArgument, "validating get valid providers request: %v", err) } - connectedProviders := s.topology.GetPeers(topology.Query{Type: p2p.PeerTypeProvider}) - if len(connectedProviders) == 0 { - return &bidderapiv1.GetValidProvidersResponse{ValidProviders: []string{}}, nil + filterOpts := &bind.FilterOpts{Start: 0, End: nil, Context: ctx} + iter, err := s.providerRegistry.FilterProviderRegistered( + filterOpts, + nil, // all providers + ) + if err != nil { + s.logger.Error("filtering provider registered events", "error", err) + return nil, status.Errorf(codes.Internal, "filtering provider registered events: %v", err) + } + defer func() { + if err := iter.Close(); err != nil { + s.logger.Error("closing iterator", "error", err) + } + }() + + providersWithRegEvent := make(map[common.Address]bool) // map for deduplication + for iter.Next() { + providersWithRegEvent[iter.Event.Provider] = true } - providerAddrs := make([]common.Address, len(connectedProviders)) - for i, provider := range connectedProviders { - providerAddrs[i] = provider.EthAddress + providersToCheck := make([]common.Address, 0, len(providersWithRegEvent)) + for provider := range providersWithRegEvent { + providersToCheck = append(providersToCheck, provider) } - validProviders := make([]string, 0) areValid, err := s.providerRegistry.AreProvidersValid(&bind.CallOpts{ Context: ctx, - }, providerAddrs) + }, providersToCheck) if err != nil { s.logger.Error("checking if providers are valid", "error", err) return nil, status.Errorf(codes.Internal, "checking if providers are valid: %v", err) } + validProviders := make([]string, 0, len(providersToCheck)) for i, isValid := range areValid { if isValid { - validProviders = append(validProviders, connectedProviders[i].EthAddress.Hex()) + validProviders = append(validProviders, providersToCheck[i].Hex()) } } diff --git a/p2p/rpc/bidderapi/v1/bidderapi.proto b/p2p/rpc/bidderapi/v1/bidderapi.proto index a217add96..86063a5e7 100644 --- a/p2p/rpc/bidderapi/v1/bidderapi.proto +++ b/p2p/rpc/bidderapi/v1/bidderapi.proto @@ -95,7 +95,7 @@ service Bidder { // GetValidProviders // // GetValidProviders is called by the bidder node to get a list of all valid providers. - // Each provider returned by this RPC must be connected to the bidder node via p2p and: + // Each provider returned by this RPC must: // - Be "registered" in the provider registry // - Have deposit >= minStake in provider registry // - Have no pending withdrawal request with provider registry From 42b96b461465aea2df2cce856f64f7d353db2b0f Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Tue, 26 Aug 2025 13:54:18 -0700 Subject: [PATCH 101/117] Update service_test.go --- p2p/pkg/rpc/bidder/service_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/p2p/pkg/rpc/bidder/service_test.go b/p2p/pkg/rpc/bidder/service_test.go index c1e50e808..bd669f4ab 100644 --- a/p2p/pkg/rpc/bidder/service_test.go +++ b/p2p/pkg/rpc/bidder/service_test.go @@ -211,6 +211,10 @@ func (t *testProviderRegistry) ParseBidderWithdrawSlashedAmount(_log types.Log) }, nil } +func (t *testProviderRegistry) FilterProviderRegistered(_ *bind.FilterOpts, _ []common.Address) (*providerregistry.ProviderregistryProviderRegisteredIterator, error) { + return nil, nil +} + func (t *testProviderRegistry) AreProvidersValid(_ *bind.CallOpts, _ []common.Address) ([]bool, error) { return []bool{true}, nil } From e1ad736ca0c5d23f2eb6adcaf3a197e148f15616 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Tue, 26 Aug 2025 16:02:24 -0700 Subject: [PATCH 102/117] fix: deposit api now returns relevant provider --- p2p/pkg/rpc/bidder/service.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/p2p/pkg/rpc/bidder/service.go b/p2p/pkg/rpc/bidder/service.go index 2c2f47e6f..034f54ae2 100644 --- a/p2p/pkg/rpc/bidder/service.go +++ b/p2p/pkg/rpc/bidder/service.go @@ -303,7 +303,8 @@ func (s *Service) Deposit( if deposited, err := s.registryContract.ParseBidderDeposited(*log); err == nil { s.logger.Info("deposit successful", "amount", deposited.DepositedAmount.String()) return &bidderapiv1.DepositResponse{ - Amount: deposited.DepositedAmount.String(), + Amount: deposited.DepositedAmount.String(), + Provider: deposited.Provider.Hex(), }, nil } } From 5d6b90d50617ec7baa672a59ea5c7f20517663c4 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Tue, 26 Aug 2025 17:46:41 -0700 Subject: [PATCH 103/117] fix: populate TargetDeposits in DepositManagerStatus api --- p2p/pkg/rpc/bidder/service.go | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/p2p/pkg/rpc/bidder/service.go b/p2p/pkg/rpc/bidder/service.go index 034f54ae2..dd1720cd4 100644 --- a/p2p/pkg/rpc/bidder/service.go +++ b/p2p/pkg/rpc/bidder/service.go @@ -128,6 +128,7 @@ type DepositManagerContract interface { TopUpDeposits(opts *bind.TransactOpts, providers []common.Address) (*types.Transaction, error) ParseTargetDepositSet(types.Log) (*depositmanager.DepositmanagerTargetDepositSet, error) ParseDepositToppedUp(types.Log) (*depositmanager.DepositmanagerDepositToppedUp, error) + FilterTargetDepositSet(opts *bind.FilterOpts, providers []common.Address) (*depositmanager.DepositmanagerTargetDepositSetIterator, error) } type Backend interface { @@ -838,7 +839,34 @@ func (s *Service) DepositManagerStatus( return nil, status.Errorf(codes.Internal, "codehash is not correct") } - return &bidderapiv1.DepositManagerStatusResponse{Enabled: true}, nil + filterOpts := &bind.FilterOpts{ + Start: 0, + End: nil, + Context: ctx, + } + iterator, err := s.depositManager.FilterTargetDepositSet(filterOpts, nil) // all providers + if err != nil { + s.logger.Error("filtering target deposits", "error", err) + return nil, status.Errorf(codes.Internal, "filtering target deposits: %v", err) + } + defer func() { + if iterator.Close() != nil { + s.logger.Error("closing iterator", "error", iterator.Close()) + } + }() + + resp := &bidderapiv1.DepositManagerStatusResponse{ + Enabled: true, + TargetDeposits: make([]*bidderapiv1.TargetDeposit, 0), + } + for iterator.Next() { + resp.TargetDeposits = append(resp.TargetDeposits, &bidderapiv1.TargetDeposit{ + Provider: iterator.Event.Provider.Hex(), + TargetDeposit: iterator.Event.Amount.String(), + }) + } + + return resp, nil } func (s *Service) GetValidProviders( From 06064e7a29eda579b21e7e40ed6d5bfea9e95074 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Wed, 27 Aug 2025 15:56:24 -0700 Subject: [PATCH 104/117] retry GetValidProviders in bidder emulator --- tools/bidder-emulator/bidder.go | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/tools/bidder-emulator/bidder.go b/tools/bidder-emulator/bidder.go index e7e685f18..b19f3c9a7 100644 --- a/tools/bidder-emulator/bidder.go +++ b/tools/bidder-emulator/bidder.go @@ -66,12 +66,25 @@ func (b *bidder) setup(depositAmount string) error { } } - validProviders, err := b.client.GetValidProviders(context.Background(), &pb.GetValidProvidersRequest{}) - if err != nil { - return fmt.Errorf("failed to get valid providers: %w", err) - } - if len(validProviders.ValidProviders) == 0 { - return fmt.Errorf("no valid providers found") + const maxAttempts = 10 + var validProviders *pb.GetValidProvidersResponse + for attempt := 1; attempt <= maxAttempts; attempt++ { + + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + resp, err := b.client.GetValidProviders(ctx, &pb.GetValidProvidersRequest{}) + cancel() + if err == nil && len(resp.ValidProviders) > 0 { + validProviders = resp + break + } + + if attempt == maxAttempts { + if err != nil { + return fmt.Errorf("error getting valid providers after %d attempts: %w", attempt, err) + } + return fmt.Errorf("no valid providers found after %d attempts", attempt) + } + time.Sleep(30 * time.Second) } targetDeposits := make([]*pb.TargetDeposit, len(validProviders.ValidProviders)) From a42caa80f92a3ade61b27aae59ad01c27a033692 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Thu, 28 Aug 2025 13:21:38 -0700 Subject: [PATCH 105/117] fix: rm topology dep from bidder service struct --- p2p/pkg/node/node.go | 1 - p2p/pkg/rpc/bidder/service.go | 4 ---- p2p/pkg/rpc/bidder/service_test.go | 2 -- 3 files changed, 7 deletions(-) diff --git a/p2p/pkg/node/node.go b/p2p/pkg/node/node.go index 9ad6e9ca3..218e9aa9e 100644 --- a/p2p/pkg/node/node.go +++ b/p2p/pkg/node/node.go @@ -678,7 +678,6 @@ func NewNode(opts *Options) (*Node, error) { setCodeHelper, depositManagerContract, contractRPC, - topo, depositManagerImplAddr, ) bidderapiv1.RegisterBidderServer(grpcServer, bidderAPI) diff --git a/p2p/pkg/rpc/bidder/service.go b/p2p/pkg/rpc/bidder/service.go index dd1720cd4..8a4b2d2c0 100644 --- a/p2p/pkg/rpc/bidder/service.go +++ b/p2p/pkg/rpc/bidder/service.go @@ -19,7 +19,6 @@ import ( bidderapiv1 "github.com/primev/mev-commit/p2p/gen/go/bidderapi/v1" preconfirmationv1 "github.com/primev/mev-commit/p2p/gen/go/preconfirmation/v1" preconfstore "github.com/primev/mev-commit/p2p/pkg/preconfirmation/store" - "github.com/primev/mev-commit/p2p/pkg/topology" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "google.golang.org/protobuf/types/known/wrapperspb" @@ -41,7 +40,6 @@ type Service struct { setCodeHelper SetCodeHelper depositManager DepositManagerContract backend Backend - topology *topology.Topology depositManagerImplAddr common.Address } @@ -59,7 +57,6 @@ func NewService( setCodeHelper SetCodeHelper, depositManager DepositManagerContract, backend Backend, - topology *topology.Topology, depositManagerImplAddr common.Address, ) *Service { return &Service{ @@ -77,7 +74,6 @@ func NewService( setCodeHelper: setCodeHelper, depositManager: depositManager, backend: backend, - topology: topology, depositManagerImplAddr: depositManagerImplAddr, } } diff --git a/p2p/pkg/rpc/bidder/service_test.go b/p2p/pkg/rpc/bidder/service_test.go index bd669f4ab..18a004a16 100644 --- a/p2p/pkg/rpc/bidder/service_test.go +++ b/p2p/pkg/rpc/bidder/service_test.go @@ -22,7 +22,6 @@ import ( preconfpb "github.com/primev/mev-commit/p2p/gen/go/preconfirmation/v1" preconfstore "github.com/primev/mev-commit/p2p/pkg/preconfirmation/store" bidderapi "github.com/primev/mev-commit/p2p/pkg/rpc/bidder" - "github.com/primev/mev-commit/p2p/pkg/topology" "github.com/primev/mev-commit/x/util" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" @@ -280,7 +279,6 @@ func startServerWithStore(t *testing.T, cs *testStore) bidderapiv1.BidderClient setCodeHelper, nil, nil, - &topology.Topology{}, common.HexToAddress("0x0000000000000000000000000000000000000000"), ) From 8f5f95e54babcf3f9b1470e310592009978c00f5 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Thu, 28 Aug 2025 14:20:52 -0700 Subject: [PATCH 106/117] fix: consolidate bidder reg calls in deposit.go --- contracts-abi/abi/BidderRegistry.abi | 24 +++++++++++++ .../clients/BidderRegistry/BidderRegistry.go | 33 ++++++++++++++++- contracts/contracts/core/BidderRegistry.sol | 11 ++++++ p2p/pkg/depositmanager/deposit.go | 13 ++----- p2p/pkg/depositmanager/deposit_test.go | 36 +++---------------- 5 files changed, 75 insertions(+), 42 deletions(-) diff --git a/contracts-abi/abi/BidderRegistry.abi b/contracts-abi/abi/BidderRegistry.abi index 1d39ff283..35f3aaa2d 100644 --- a/contracts-abi/abi/BidderRegistry.abi +++ b/contracts-abi/abi/BidderRegistry.abi @@ -289,6 +289,30 @@ ], "stateMutability": "view" }, + { + "type": "function", + "name": "getDepositConsideringWithdrawalRequest", + "inputs": [ + { + "name": "bidder", + "type": "address", + "internalType": "address" + }, + { + "name": "provider", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, { "type": "function", "name": "getEscrowedAmount", diff --git a/contracts-abi/clients/BidderRegistry/BidderRegistry.go b/contracts-abi/clients/BidderRegistry/BidderRegistry.go index 8e39ca1b1..31024ec11 100644 --- a/contracts-abi/clients/BidderRegistry/BidderRegistry.go +++ b/contracts-abi/clients/BidderRegistry/BidderRegistry.go @@ -37,7 +37,7 @@ type TimestampOccurrenceOccurrence struct { // BidderregistryMetaData contains all meta data concerning the Bidderregistry contract. var BidderregistryMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"ONE_HUNDRED_PERCENT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PRECISION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"bidPayment\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"bidAmt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"state\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bidderWithdrawalPeriodMs\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"blockTrackerContract\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBlockTracker\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"convertFundsToProviderReward\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"addresspayable\"},{\"name\":\"residualBidPercentAfterDecay\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositAsBidder\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"depositEvenlyAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"depositManagerHash\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositManagerImpl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deposits\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"availableAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"escrowedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalRequestOccurrence\",\"type\":\"tuple\",\"internalType\":\"structTimestampOccurrence.Occurrence\",\"components\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"feePercent\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAccumulatedProtocolFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDeposit\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEscrowedAmount\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProviderAmount\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_protocolFeeRecipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_feePercent\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_blockTracker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_feePayoutPeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_bidderWithdrawalPeriodMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"manuallyWithdrawProtocolFee\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"openBid\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"bidAmt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"preconfManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"protocolFeeTracker\",\"inputs\":[],\"outputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"accumulatedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"lastPayoutTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"payoutTimePeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"providerAmount\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"requestWithdrawalsAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setBlockTrackerContract\",\"inputs\":[{\"name\":\"newBlockTrackerContract\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDepositManagerImpl\",\"inputs\":[{\"name\":\"_depositManagerImpl\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewFeePayoutPeriod\",\"inputs\":[{\"name\":\"newFeePayoutPeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewFeePercent\",\"inputs\":[{\"name\":\"newFeePercent\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewProtocolFeeRecipient\",\"inputs\":[{\"name\":\"newProtocolFeeRecipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPreconfManager\",\"inputs\":[{\"name\":\"contractAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unlockFunds\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"withdrawAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawProviderAmount\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawalRequestExists\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"BidAmountReduced\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newBidAmt\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BidderDeposited\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"depositedAmount\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BidderWithdrawal\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amountWithdrawn\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"amountStillEscrowed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockTrackerUpdated\",\"inputs\":[{\"name\":\"newBlockTracker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DepositManagerImplUpdated\",\"inputs\":[{\"name\":\"newDepositManagerImpl\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeePayoutPeriodUpdated\",\"inputs\":[{\"name\":\"newFeePayoutPeriod\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeePercentUpdated\",\"inputs\":[{\"name\":\"newFeePercent\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeTransfer\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FundsRewarded\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FundsUnlocked\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"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\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PreconfManagerUpdated\",\"inputs\":[{\"name\":\"newPreconfManager\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProtocolFeeRecipientUpdated\",\"inputs\":[{\"name\":\"newProtocolFeeRecipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TopUpFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransferToBidderFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalRequested\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"availableAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"escrowedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"BidNotPreConfirmed\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"actualState\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"},{\"name\":\"expectedState\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"}]},{\"type\":\"error\",\"name\":\"BidderWithdrawalTransferFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"DepositAmountIsLessThanProviders\",\"inputs\":[{\"name\":\"depositAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"numProviders\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"DepositAmountIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DepositDoesNotExist\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DepositManagerNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpectedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FeeRecipientIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoProviders\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyBidderCanWithdraw\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"PayoutPeriodMustBePositive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ProviderAmountIsZero\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ProviderIsZeroAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SenderIsNotPreconfManager\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"preconfManager\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TransferToProviderFailed\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"TransferToRecipientFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"WithdrawalOccurrenceExists\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"requestTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"WithdrawalPeriodNotElapsed\",\"inputs\":[{\"name\":\"currentTimestampMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalTimestampMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalPeriodMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"WithdrawalRequestAlreadyExists\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"WithdrawalRequestDoesNotExist\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"ONE_HUNDRED_PERCENT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PRECISION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"bidPayment\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"bidAmt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"state\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bidderWithdrawalPeriodMs\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"blockTrackerContract\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBlockTracker\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"convertFundsToProviderReward\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"addresspayable\"},{\"name\":\"residualBidPercentAfterDecay\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositAsBidder\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"depositEvenlyAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"depositManagerHash\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositManagerImpl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deposits\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"availableAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"escrowedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalRequestOccurrence\",\"type\":\"tuple\",\"internalType\":\"structTimestampOccurrence.Occurrence\",\"components\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"feePercent\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAccumulatedProtocolFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDeposit\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDepositConsideringWithdrawalRequest\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEscrowedAmount\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProviderAmount\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_protocolFeeRecipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_feePercent\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_blockTracker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_feePayoutPeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_bidderWithdrawalPeriodMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"manuallyWithdrawProtocolFee\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"openBid\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"bidAmt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"preconfManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"protocolFeeTracker\",\"inputs\":[],\"outputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"accumulatedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"lastPayoutTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"payoutTimePeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"providerAmount\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"requestWithdrawalsAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setBlockTrackerContract\",\"inputs\":[{\"name\":\"newBlockTrackerContract\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDepositManagerImpl\",\"inputs\":[{\"name\":\"_depositManagerImpl\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewFeePayoutPeriod\",\"inputs\":[{\"name\":\"newFeePayoutPeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewFeePercent\",\"inputs\":[{\"name\":\"newFeePercent\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewProtocolFeeRecipient\",\"inputs\":[{\"name\":\"newProtocolFeeRecipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPreconfManager\",\"inputs\":[{\"name\":\"contractAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unlockFunds\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"withdrawAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawProviderAmount\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawalRequestExists\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"BidAmountReduced\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newBidAmt\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BidderDeposited\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"depositedAmount\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BidderWithdrawal\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amountWithdrawn\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"amountStillEscrowed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockTrackerUpdated\",\"inputs\":[{\"name\":\"newBlockTracker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DepositManagerImplUpdated\",\"inputs\":[{\"name\":\"newDepositManagerImpl\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeePayoutPeriodUpdated\",\"inputs\":[{\"name\":\"newFeePayoutPeriod\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeePercentUpdated\",\"inputs\":[{\"name\":\"newFeePercent\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeTransfer\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FundsRewarded\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FundsUnlocked\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"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\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PreconfManagerUpdated\",\"inputs\":[{\"name\":\"newPreconfManager\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProtocolFeeRecipientUpdated\",\"inputs\":[{\"name\":\"newProtocolFeeRecipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TopUpFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransferToBidderFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalRequested\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"availableAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"escrowedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"BidNotPreConfirmed\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"actualState\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"},{\"name\":\"expectedState\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"}]},{\"type\":\"error\",\"name\":\"BidderWithdrawalTransferFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"DepositAmountIsLessThanProviders\",\"inputs\":[{\"name\":\"depositAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"numProviders\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"DepositAmountIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DepositDoesNotExist\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DepositManagerNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpectedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FeeRecipientIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoProviders\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyBidderCanWithdraw\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"PayoutPeriodMustBePositive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ProviderAmountIsZero\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ProviderIsZeroAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SenderIsNotPreconfManager\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"preconfManager\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TransferToProviderFailed\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"TransferToRecipientFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"WithdrawalOccurrenceExists\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"requestTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"WithdrawalPeriodNotElapsed\",\"inputs\":[{\"name\":\"currentTimestampMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalTimestampMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalPeriodMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"WithdrawalRequestAlreadyExists\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"WithdrawalRequestDoesNotExist\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]}]", } // BidderregistryABI is the input ABI used to generate the binding from. @@ -601,6 +601,37 @@ func (_Bidderregistry *BidderregistryCallerSession) GetDeposit(bidder common.Add return _Bidderregistry.Contract.GetDeposit(&_Bidderregistry.CallOpts, bidder, provider) } +// GetDepositConsideringWithdrawalRequest is a free data retrieval call binding the contract method 0x9a0cb706. +// +// Solidity: function getDepositConsideringWithdrawalRequest(address bidder, address provider) view returns(uint256) +func (_Bidderregistry *BidderregistryCaller) GetDepositConsideringWithdrawalRequest(opts *bind.CallOpts, bidder common.Address, provider common.Address) (*big.Int, error) { + var out []interface{} + err := _Bidderregistry.contract.Call(opts, &out, "getDepositConsideringWithdrawalRequest", bidder, provider) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetDepositConsideringWithdrawalRequest is a free data retrieval call binding the contract method 0x9a0cb706. +// +// Solidity: function getDepositConsideringWithdrawalRequest(address bidder, address provider) view returns(uint256) +func (_Bidderregistry *BidderregistrySession) GetDepositConsideringWithdrawalRequest(bidder common.Address, provider common.Address) (*big.Int, error) { + return _Bidderregistry.Contract.GetDepositConsideringWithdrawalRequest(&_Bidderregistry.CallOpts, bidder, provider) +} + +// GetDepositConsideringWithdrawalRequest is a free data retrieval call binding the contract method 0x9a0cb706. +// +// Solidity: function getDepositConsideringWithdrawalRequest(address bidder, address provider) view returns(uint256) +func (_Bidderregistry *BidderregistryCallerSession) GetDepositConsideringWithdrawalRequest(bidder common.Address, provider common.Address) (*big.Int, error) { + return _Bidderregistry.Contract.GetDepositConsideringWithdrawalRequest(&_Bidderregistry.CallOpts, bidder, provider) +} + // GetEscrowedAmount is a free data retrieval call binding the contract method 0xf519c7bb. // // Solidity: function getEscrowedAmount(address bidder, address provider) view returns(uint256) diff --git a/contracts/contracts/core/BidderRegistry.sol b/contracts/contracts/core/BidderRegistry.sol index b9655417c..e442a5bf7 100644 --- a/contracts/contracts/core/BidderRegistry.sol +++ b/contracts/contracts/core/BidderRegistry.sol @@ -416,6 +416,17 @@ contract BidderRegistry is return deposits[bidder][provider].availableAmount; } + function getDepositConsideringWithdrawalRequest( + address bidder, + address provider + ) external view returns (uint256) { + Deposit storage deposit = deposits[bidder][provider]; + if (!deposit.exists || deposit.withdrawalRequestOccurrence.exists) { + return 0; + } + return deposit.availableAmount; + } + function getEscrowedAmount( address bidder, address provider diff --git a/p2p/pkg/depositmanager/deposit.go b/p2p/pkg/depositmanager/deposit.go index a7a875659..91af23e4d 100644 --- a/p2p/pkg/depositmanager/deposit.go +++ b/p2p/pkg/depositmanager/deposit.go @@ -16,8 +16,7 @@ import ( ) type BidderRegistryContract interface { - GetDeposit(opts *bind.CallOpts, bidder common.Address, provider common.Address) (*big.Int, error) - WithdrawalRequestExists(opts *bind.CallOpts, bidder common.Address, provider common.Address) (bool, error) + GetDepositConsideringWithdrawalRequest(opts *bind.CallOpts, bidder common.Address, provider common.Address) (*big.Int, error) } type Store interface { @@ -260,19 +259,13 @@ func (dm *DepositManager) getDefaultBalance( BlockNumber: blockNumber, } - balance, err := dm.bidderRegistry.GetDeposit(callOpts, bidderAddr, providerAddr) + balance, err := dm.bidderRegistry.GetDepositConsideringWithdrawalRequest(callOpts, bidderAddr, providerAddr) if err != nil { dm.logger.Error("getting deposit from contract", "error", err) return nil, status.Errorf(codes.Internal, "failed to get deposit: %v", err) } - withdrawalRequest, err := dm.bidderRegistry.WithdrawalRequestExists(callOpts, bidderAddr, providerAddr) - if err != nil { - dm.logger.Error("getting withdrawal request from contract", "error", err) - return nil, status.Errorf(codes.Internal, "failed to get withdrawal request: %v", err) - } - - if !withdrawalRequest && balance.Cmp(big.NewInt(0)) > 0 { + if balance.Cmp(big.NewInt(0)) > 0 { if err := dm.store.SetBalance(bidderAddr, providerAddr, balance); err != nil { dm.logger.Error("setting balance", "error", err) return nil, status.Errorf(codes.Internal, "failed to set balance: %v", err) diff --git a/p2p/pkg/depositmanager/deposit_test.go b/p2p/pkg/depositmanager/deposit_test.go index cc8e8c1fc..f1d8d1be9 100644 --- a/p2p/pkg/depositmanager/deposit_test.go +++ b/p2p/pkg/depositmanager/deposit_test.go @@ -22,24 +22,15 @@ import ( ) type MockBidderRegistryContract struct { - GetDepositFunc func(opts *bind.CallOpts, bidder common.Address, provider common.Address) (*big.Int, error) - WithdrawalRequestExistsFunc func(opts *bind.CallOpts, bidder common.Address, provider common.Address) (bool, error) + GetDepositConsideringWithdrawalRequestFunc func(opts *bind.CallOpts, bidder common.Address, provider common.Address) (*big.Int, error) } -func (m *MockBidderRegistryContract) GetDeposit( +func (m *MockBidderRegistryContract) GetDepositConsideringWithdrawalRequest( opts *bind.CallOpts, bidder common.Address, provider common.Address, ) (*big.Int, error) { - return m.GetDepositFunc(opts, bidder, provider) -} - -func (m *MockBidderRegistryContract) WithdrawalRequestExists( - opts *bind.CallOpts, - bidder common.Address, - provider common.Address, -) (bool, error) { - return m.WithdrawalRequestExistsFunc(opts, bidder, provider) + return m.GetDepositConsideringWithdrawalRequestFunc(opts, bidder, provider) } func TestDepositManager(t *testing.T) { @@ -60,20 +51,13 @@ func TestDepositManager(t *testing.T) { st := depositstore.New(inmemstorage.New()) bidderRegistry := &MockBidderRegistryContract{ - GetDepositFunc: func( + GetDepositConsideringWithdrawalRequestFunc: func( opts *bind.CallOpts, bidder common.Address, provider common.Address, ) (*big.Int, error) { return big.NewInt(0), nil }, - WithdrawalRequestExistsFunc: func( - opts *bind.CallOpts, - bidder common.Address, - provider common.Address, - ) (bool, error) { - return false, nil - }, } ctx, cancel := context.WithCancel(context.Background()) @@ -248,7 +232,7 @@ func TestStartWithBidderAlreadyDeposited(t *testing.T) { st := depositstore.New(inmemstorage.New()) bidderRegistry := &MockBidderRegistryContract{ - GetDepositFunc: func( + GetDepositConsideringWithdrawalRequestFunc: func( opts *bind.CallOpts, bidder common.Address, provider common.Address, @@ -258,16 +242,6 @@ func TestStartWithBidderAlreadyDeposited(t *testing.T) { } return big.NewInt(33), nil // Existing deposit }, - WithdrawalRequestExistsFunc: func( - opts *bind.CallOpts, - bidder common.Address, - provider common.Address, - ) (bool, error) { - if opts.BlockNumber.Cmp(big.NewInt(15)) != 0 { - t.Fatal("expected block number 15") - } - return false, nil - }, } ctx, cancel := context.WithCancel(context.Background()) From 3c4a51a144faf25c5e3b1ec8d7f561109305e1a0 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Thu, 28 Aug 2025 14:32:20 -0700 Subject: [PATCH 107/117] nit test fix --- p2p/pkg/depositmanager/deposit_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/p2p/pkg/depositmanager/deposit_test.go b/p2p/pkg/depositmanager/deposit_test.go index f1d8d1be9..a31347484 100644 --- a/p2p/pkg/depositmanager/deposit_test.go +++ b/p2p/pkg/depositmanager/deposit_test.go @@ -333,7 +333,7 @@ func publishBidderWithdrawal( br *bidderregistry.BidderregistryBidderWithdrawal, ) error { event := brABI.Events["BidderWithdrawal"] - buf, err := event.Inputs.NonIndexed().Pack(br.AmountWithdrawn) + buf, err := event.Inputs.NonIndexed().Pack(br.AmountStillEscrowed) if err != nil { return err } From e5c7205295224d3bb1dd14eec5c0d3711c3e8b8b Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Thu, 28 Aug 2025 15:23:12 -0700 Subject: [PATCH 108/117] fix: dashboard --- tools/dashboard/main.go | 2 +- tools/dashboard/stathandler.go | 20 ++++++++++++-------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/tools/dashboard/main.go b/tools/dashboard/main.go index a95fefc56..93b675c99 100644 --- a/tools/dashboard/main.go +++ b/tools/dashboard/main.go @@ -192,7 +192,7 @@ func main() { evtMgr, ) - statHdlr, err := newStatHandler(evtMgr, 10) + statHdlr, err := newStatHandler(evtMgr) if err != nil { return err } diff --git a/tools/dashboard/stathandler.go b/tools/dashboard/stathandler.go index ee236276b..5e3e7a112 100644 --- a/tools/dashboard/stathandler.go +++ b/tools/dashboard/stathandler.go @@ -17,7 +17,6 @@ import ( type statHandler struct { statMu sync.RWMutex lastBlock uint64 - blocksPerWindow uint64 blockStats *lru.Cache[uint64, *BlockStats] providerStakes *lru.Cache[string, *ProviderBalances] bidderDeposits *lru.Cache[depositKey, []*BidderDeposit] @@ -35,7 +34,6 @@ type statHandler struct { type BlockStats struct { Number uint64 `json:"number"` Winner string `json:"winner"` - Window int64 `json:"window"` TotalOpenedCommitments int `json:"total_opened_commitments"` TotalRewards int `json:"total_rewards"` TotalSlashes int `json:"total_slashes"` @@ -79,9 +77,11 @@ type AggregateStats struct { type DashboardOut struct { Aggregate *AggregateStats `json:"aggregate"` Providers []*ProviderBalances `json:"providers"` + Blocks []*BlockStats `json:"blocks"` + Bidders []*BidderDeposit `json:"bidders"` } -func newStatHandler(evtMgr events.EventManager, blocksPerWindow uint64) (*statHandler, error) { +func newStatHandler(evtMgr events.EventManager) (*statHandler, error) { blockStats, err := lru.New[uint64, *BlockStats](10000) if err != nil { return nil, err @@ -108,7 +108,6 @@ func newStatHandler(evtMgr events.EventManager, blocksPerWindow uint64) (*statHa } st := &statHandler{ - blocksPerWindow: blocksPerWindow, blockStats: blockStats, providerStakes: providerStakes, bidderDeposits: bidderDeposits, @@ -140,7 +139,6 @@ func (s *statHandler) configureDashboard() error { } existing.Winner = upd.Winner.Hex() - existing.Window = upd.Window.Int64() _ = s.blockStats.Add(upd.BlockNumber.Uint64(), existing) if upd.BlockNumber.Uint64() > s.lastBlock { s.lastBlock = upd.BlockNumber.Uint64() @@ -465,7 +463,6 @@ func (s *statHandler) close() { func (s *statHandler) getDashboard(page, limit int) *DashboardOut { s.statMu.RLock() - providers := s.providerStakes.Values() agg := &AggregateStats{ TotalEncryptedCommitments: s.totalEncryptedCommitments, TotalOpenedCommitments: s.totalOpenedCommitments, @@ -474,9 +471,15 @@ func (s *statHandler) getDashboard(page, limit int) *DashboardOut { } s.statMu.RUnlock() + providers := s.getProviders() + blocks := s.getBlocks(page, limit) + bidders := s.getBidders() + return &DashboardOut{ - Providers: providers, Aggregate: agg, + Providers: providers, + Blocks: blocks, + Bidders: bidders, } } @@ -513,8 +516,9 @@ func (s *statHandler) getBlockStats(block uint64) *BlockStats { func (s *statHandler) getBlocks(page, limit int) []*BlockStats { s.statMu.RLock() + defer s.statMu.RUnlock() + start := s.lastBlock - s.statMu.RUnlock() if start > uint64(limit*page) { start = start - uint64(limit*page) From 4b4152262deb7b68b20b77a0a5bc963456a94f7d Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Thu, 28 Aug 2025 23:02:47 -0700 Subject: [PATCH 109/117] chore: remove all deprecated instances of deposit windows --- contracts-abi/abi/BlockTracker.abi | 45 ---- .../clients/BlockTracker/BlockTracker.go | 237 +----------------- contracts/contracts/core/BlockTracker.sol | 17 +- .../contracts/core/BlockTrackerStorage.sol | 2 - .../contracts/interfaces/IBlockTracker.sol | 11 +- contracts/test/core/OracleTest.sol | 5 - contracts/test/core/PreconfManagerTest.sol | 2 +- oracle/pkg/l1Listener/l1Listener.go | 4 +- oracle/pkg/l1Listener/l1Listener_test.go | 14 +- oracle/pkg/store/store.go | 18 +- oracle/pkg/store/store_test.go | 9 +- oracle/pkg/updater/updater.go | 32 +-- oracle/pkg/updater/updater_test.go | 77 +----- p2p/pkg/preconfirmation/tracker/tracker.go | 1 - .../preconfirmation/tracker/tracker_test.go | 5 - 15 files changed, 29 insertions(+), 450 deletions(-) diff --git a/contracts-abi/abi/BlockTracker.abi b/contracts-abi/abi/BlockTracker.abi index 62fb323fa..4b73f9f63 100644 --- a/contracts-abi/abi/BlockTracker.abi +++ b/contracts-abi/abi/BlockTracker.abi @@ -88,19 +88,6 @@ ], "stateMutability": "view" }, - { - "type": "function", - "name": "currentWindow", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, { "type": "function", "name": "getBlockWinner", @@ -139,19 +126,6 @@ ], "stateMutability": "view" }, - { - "type": "function", - "name": "getCurrentWindow", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, { "type": "function", "name": "initialize", @@ -391,25 +365,6 @@ "type": "address", "indexed": true, "internalType": "address" - }, - { - "name": "window", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "NewWindow", - "inputs": [ - { - "name": "window", - "type": "uint256", - "indexed": true, - "internalType": "uint256" } ], "anonymous": false diff --git a/contracts-abi/clients/BlockTracker/BlockTracker.go b/contracts-abi/clients/BlockTracker/BlockTracker.go index 99ca6b320..73b198900 100644 --- a/contracts-abi/clients/BlockTracker/BlockTracker.go +++ b/contracts-abi/clients/BlockTracker/BlockTracker.go @@ -31,7 +31,7 @@ var ( // BlocktrackerMetaData contains all meta data concerning the Blocktracker contract. var BlocktrackerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addBuilderAddress\",\"inputs\":[{\"name\":\"builderName\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"builderAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"blockBuilderNameToAddress\",\"inputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"blockWinners\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentWindow\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBlockWinner\",\"inputs\":[{\"name\":\"blockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBuilder\",\"inputs\":[{\"name\":\"builderNameGraffiti\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentWindow\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"oracleAccount_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"owner_\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"oracleAccount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"providerRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIProviderRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordL1Block\",\"inputs\":[{\"name\":\"_blockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_winnerBLSKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOracleAccount\",\"inputs\":[{\"name\":\"newOracleAccount\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setProviderRegistry\",\"inputs\":[{\"name\":\"newProviderRegistry\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"BuilderAddressAdded\",\"inputs\":[{\"name\":\"builderName\",\"type\":\"string\",\"indexed\":true,\"internalType\":\"string\"},{\"name\":\"builderAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewL1Block\",\"inputs\":[{\"name\":\"blockNumber\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"winner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"window\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewWindow\",\"inputs\":[{\"name\":\"window\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OracleAccountSet\",\"inputs\":[{\"name\":\"oldOracleAccount\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOracleAccount\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"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\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProviderRegistrySet\",\"inputs\":[{\"name\":\"oldProviderRegistry\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newProviderRegistry\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"BlockNumberIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpectedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidFallback\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidReceive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotOracleAccount\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"oracleAccount\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addBuilderAddress\",\"inputs\":[{\"name\":\"builderName\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"builderAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"blockBuilderNameToAddress\",\"inputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"blockWinners\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBlockWinner\",\"inputs\":[{\"name\":\"blockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBuilder\",\"inputs\":[{\"name\":\"builderNameGraffiti\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"oracleAccount_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"owner_\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"oracleAccount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"providerRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIProviderRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordL1Block\",\"inputs\":[{\"name\":\"_blockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_winnerBLSKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOracleAccount\",\"inputs\":[{\"name\":\"newOracleAccount\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setProviderRegistry\",\"inputs\":[{\"name\":\"newProviderRegistry\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"BuilderAddressAdded\",\"inputs\":[{\"name\":\"builderName\",\"type\":\"string\",\"indexed\":true,\"internalType\":\"string\"},{\"name\":\"builderAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewL1Block\",\"inputs\":[{\"name\":\"blockNumber\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"winner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OracleAccountSet\",\"inputs\":[{\"name\":\"oldOracleAccount\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOracleAccount\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"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\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProviderRegistrySet\",\"inputs\":[{\"name\":\"oldProviderRegistry\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newProviderRegistry\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"BlockNumberIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpectedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidFallback\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidReceive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotOracleAccount\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"oracleAccount\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", } // BlocktrackerABI is the input ABI used to generate the binding from. @@ -273,37 +273,6 @@ func (_Blocktracker *BlocktrackerCallerSession) BlockWinners(arg0 *big.Int) (com return _Blocktracker.Contract.BlockWinners(&_Blocktracker.CallOpts, arg0) } -// CurrentWindow is a free data retrieval call binding the contract method 0xba0bafb4. -// -// Solidity: function currentWindow() view returns(uint256) -func (_Blocktracker *BlocktrackerCaller) CurrentWindow(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _Blocktracker.contract.Call(opts, &out, "currentWindow") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// CurrentWindow is a free data retrieval call binding the contract method 0xba0bafb4. -// -// Solidity: function currentWindow() view returns(uint256) -func (_Blocktracker *BlocktrackerSession) CurrentWindow() (*big.Int, error) { - return _Blocktracker.Contract.CurrentWindow(&_Blocktracker.CallOpts) -} - -// CurrentWindow is a free data retrieval call binding the contract method 0xba0bafb4. -// -// Solidity: function currentWindow() view returns(uint256) -func (_Blocktracker *BlocktrackerCallerSession) CurrentWindow() (*big.Int, error) { - return _Blocktracker.Contract.CurrentWindow(&_Blocktracker.CallOpts) -} - // GetBlockWinner is a free data retrieval call binding the contract method 0x6753ab34. // // Solidity: function getBlockWinner(uint256 blockNumber) view returns(address) @@ -366,37 +335,6 @@ func (_Blocktracker *BlocktrackerCallerSession) GetBuilder(builderNameGraffiti s return _Blocktracker.Contract.GetBuilder(&_Blocktracker.CallOpts, builderNameGraffiti) } -// GetCurrentWindow is a free data retrieval call binding the contract method 0x0f67e7d5. -// -// Solidity: function getCurrentWindow() view returns(uint256) -func (_Blocktracker *BlocktrackerCaller) GetCurrentWindow(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _Blocktracker.contract.Call(opts, &out, "getCurrentWindow") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetCurrentWindow is a free data retrieval call binding the contract method 0x0f67e7d5. -// -// Solidity: function getCurrentWindow() view returns(uint256) -func (_Blocktracker *BlocktrackerSession) GetCurrentWindow() (*big.Int, error) { - return _Blocktracker.Contract.GetCurrentWindow(&_Blocktracker.CallOpts) -} - -// GetCurrentWindow is a free data retrieval call binding the contract method 0x0f67e7d5. -// -// Solidity: function getCurrentWindow() view returns(uint256) -func (_Blocktracker *BlocktrackerCallerSession) GetCurrentWindow() (*big.Int, error) { - return _Blocktracker.Contract.GetCurrentWindow(&_Blocktracker.CallOpts) -} - // OracleAccount is a free data retrieval call binding the contract method 0xe7c59736. // // Solidity: function oracleAccount() view returns(address) @@ -1214,14 +1152,13 @@ func (it *BlocktrackerNewL1BlockIterator) Close() error { type BlocktrackerNewL1Block struct { BlockNumber *big.Int Winner common.Address - Window *big.Int Raw types.Log // Blockchain specific contextual infos } -// FilterNewL1Block is a free log retrieval operation binding the contract event 0x8323d3e5d25db513e1a772870aaa45e9b069a13d49879d72e70638b5c1c18cb7. +// FilterNewL1Block is a free log retrieval operation binding the contract event 0x2fa9ac702e37c10159294633f20ab8f1e33e7d01607be3603ec0aa3676969d7b. // -// Solidity: event NewL1Block(uint256 indexed blockNumber, address indexed winner, uint256 indexed window) -func (_Blocktracker *BlocktrackerFilterer) FilterNewL1Block(opts *bind.FilterOpts, blockNumber []*big.Int, winner []common.Address, window []*big.Int) (*BlocktrackerNewL1BlockIterator, error) { +// Solidity: event NewL1Block(uint256 indexed blockNumber, address indexed winner) +func (_Blocktracker *BlocktrackerFilterer) FilterNewL1Block(opts *bind.FilterOpts, blockNumber []*big.Int, winner []common.Address) (*BlocktrackerNewL1BlockIterator, error) { var blockNumberRule []interface{} for _, blockNumberItem := range blockNumber { @@ -1231,22 +1168,18 @@ func (_Blocktracker *BlocktrackerFilterer) FilterNewL1Block(opts *bind.FilterOpt for _, winnerItem := range winner { winnerRule = append(winnerRule, winnerItem) } - var windowRule []interface{} - for _, windowItem := range window { - windowRule = append(windowRule, windowItem) - } - logs, sub, err := _Blocktracker.contract.FilterLogs(opts, "NewL1Block", blockNumberRule, winnerRule, windowRule) + logs, sub, err := _Blocktracker.contract.FilterLogs(opts, "NewL1Block", blockNumberRule, winnerRule) if err != nil { return nil, err } return &BlocktrackerNewL1BlockIterator{contract: _Blocktracker.contract, event: "NewL1Block", logs: logs, sub: sub}, nil } -// WatchNewL1Block is a free log subscription operation binding the contract event 0x8323d3e5d25db513e1a772870aaa45e9b069a13d49879d72e70638b5c1c18cb7. +// WatchNewL1Block is a free log subscription operation binding the contract event 0x2fa9ac702e37c10159294633f20ab8f1e33e7d01607be3603ec0aa3676969d7b. // -// Solidity: event NewL1Block(uint256 indexed blockNumber, address indexed winner, uint256 indexed window) -func (_Blocktracker *BlocktrackerFilterer) WatchNewL1Block(opts *bind.WatchOpts, sink chan<- *BlocktrackerNewL1Block, blockNumber []*big.Int, winner []common.Address, window []*big.Int) (event.Subscription, error) { +// Solidity: event NewL1Block(uint256 indexed blockNumber, address indexed winner) +func (_Blocktracker *BlocktrackerFilterer) WatchNewL1Block(opts *bind.WatchOpts, sink chan<- *BlocktrackerNewL1Block, blockNumber []*big.Int, winner []common.Address) (event.Subscription, error) { var blockNumberRule []interface{} for _, blockNumberItem := range blockNumber { @@ -1256,12 +1189,8 @@ func (_Blocktracker *BlocktrackerFilterer) WatchNewL1Block(opts *bind.WatchOpts, for _, winnerItem := range winner { winnerRule = append(winnerRule, winnerItem) } - var windowRule []interface{} - for _, windowItem := range window { - windowRule = append(windowRule, windowItem) - } - logs, sub, err := _Blocktracker.contract.WatchLogs(opts, "NewL1Block", blockNumberRule, winnerRule, windowRule) + logs, sub, err := _Blocktracker.contract.WatchLogs(opts, "NewL1Block", blockNumberRule, winnerRule) if err != nil { return nil, err } @@ -1293,9 +1222,9 @@ func (_Blocktracker *BlocktrackerFilterer) WatchNewL1Block(opts *bind.WatchOpts, }), nil } -// ParseNewL1Block is a log parse operation binding the contract event 0x8323d3e5d25db513e1a772870aaa45e9b069a13d49879d72e70638b5c1c18cb7. +// ParseNewL1Block is a log parse operation binding the contract event 0x2fa9ac702e37c10159294633f20ab8f1e33e7d01607be3603ec0aa3676969d7b. // -// Solidity: event NewL1Block(uint256 indexed blockNumber, address indexed winner, uint256 indexed window) +// Solidity: event NewL1Block(uint256 indexed blockNumber, address indexed winner) func (_Blocktracker *BlocktrackerFilterer) ParseNewL1Block(log types.Log) (*BlocktrackerNewL1Block, error) { event := new(BlocktrackerNewL1Block) if err := _Blocktracker.contract.UnpackLog(event, "NewL1Block", log); err != nil { @@ -1305,150 +1234,6 @@ func (_Blocktracker *BlocktrackerFilterer) ParseNewL1Block(log types.Log) (*Bloc return event, nil } -// BlocktrackerNewWindowIterator is returned from FilterNewWindow and is used to iterate over the raw logs and unpacked data for NewWindow events raised by the Blocktracker contract. -type BlocktrackerNewWindowIterator struct { - Event *BlocktrackerNewWindow // 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 *BlocktrackerNewWindowIterator) 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(BlocktrackerNewWindow) - 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(BlocktrackerNewWindow) - 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 *BlocktrackerNewWindowIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *BlocktrackerNewWindowIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// BlocktrackerNewWindow represents a NewWindow event raised by the Blocktracker contract. -type BlocktrackerNewWindow struct { - Window *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterNewWindow is a free log retrieval operation binding the contract event 0x6553ddbc9c04d825543b5b531877439a6abdb68d5825c39f2dd3798e54118870. -// -// Solidity: event NewWindow(uint256 indexed window) -func (_Blocktracker *BlocktrackerFilterer) FilterNewWindow(opts *bind.FilterOpts, window []*big.Int) (*BlocktrackerNewWindowIterator, error) { - - var windowRule []interface{} - for _, windowItem := range window { - windowRule = append(windowRule, windowItem) - } - - logs, sub, err := _Blocktracker.contract.FilterLogs(opts, "NewWindow", windowRule) - if err != nil { - return nil, err - } - return &BlocktrackerNewWindowIterator{contract: _Blocktracker.contract, event: "NewWindow", logs: logs, sub: sub}, nil -} - -// WatchNewWindow is a free log subscription operation binding the contract event 0x6553ddbc9c04d825543b5b531877439a6abdb68d5825c39f2dd3798e54118870. -// -// Solidity: event NewWindow(uint256 indexed window) -func (_Blocktracker *BlocktrackerFilterer) WatchNewWindow(opts *bind.WatchOpts, sink chan<- *BlocktrackerNewWindow, window []*big.Int) (event.Subscription, error) { - - var windowRule []interface{} - for _, windowItem := range window { - windowRule = append(windowRule, windowItem) - } - - logs, sub, err := _Blocktracker.contract.WatchLogs(opts, "NewWindow", windowRule) - 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(BlocktrackerNewWindow) - if err := _Blocktracker.contract.UnpackLog(event, "NewWindow", 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 -} - -// ParseNewWindow is a log parse operation binding the contract event 0x6553ddbc9c04d825543b5b531877439a6abdb68d5825c39f2dd3798e54118870. -// -// Solidity: event NewWindow(uint256 indexed window) -func (_Blocktracker *BlocktrackerFilterer) ParseNewWindow(log types.Log) (*BlocktrackerNewWindow, error) { - event := new(BlocktrackerNewWindow) - if err := _Blocktracker.contract.UnpackLog(event, "NewWindow", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - // BlocktrackerOracleAccountSetIterator is returned from FilterOracleAccountSet and is used to iterate over the raw logs and unpacked data for OracleAccountSet events raised by the Blocktracker contract. type BlocktrackerOracleAccountSetIterator struct { Event *BlocktrackerOracleAccountSet // Event containing the contract specifics and raw log diff --git a/contracts/contracts/core/BlockTracker.sol b/contracts/contracts/core/BlockTracker.sol index 5e373de0b..c541485c0 100644 --- a/contracts/contracts/core/BlockTracker.sol +++ b/contracts/contracts/core/BlockTracker.sol @@ -50,7 +50,6 @@ contract BlockTracker is IBlockTracker, BlockTrackerStorage, * @param owner_ Address of the contract owner. */ function initialize(address oracleAccount_, address owner_) external initializer { - currentWindow = 1; _setOracleAccount(oracleAccount_); __Ownable_init(owner_); __Pausable_init(); @@ -80,13 +79,7 @@ contract BlockTracker is IBlockTracker, BlockTrackerStorage, ) external onlyOracle whenNotPaused { address _winner = providerRegistry.getEoaFromBLSKey(_winnerBLSKey); _recordBlockWinner(_blockNumber, _winner); - uint256 newWindow = (_blockNumber - 1) / 10 + 1; - if (newWindow > currentWindow) { - // We've entered a new window - currentWindow = newWindow; - emit NewWindow(currentWindow); - } - emit NewL1Block(_blockNumber, _winner, currentWindow); + emit NewL1Block(_blockNumber, _winner); } /// @dev Allows the owner to set the provider registry. @@ -110,14 +103,6 @@ contract BlockTracker is IBlockTracker, BlockTrackerStorage, _unpause(); } - /** - * @dev Retrieves the current window number. - * @return currentWindow The current window number. - */ - function getCurrentWindow() external view returns (uint256) { - return currentWindow; - } - /** * @dev Function to get the winner of a specific block. * @param blockNumber The number of the block. diff --git a/contracts/contracts/core/BlockTrackerStorage.sol b/contracts/contracts/core/BlockTrackerStorage.sol index ccd5286ea..022666ad0 100644 --- a/contracts/contracts/core/BlockTrackerStorage.sol +++ b/contracts/contracts/core/BlockTrackerStorage.sol @@ -7,8 +7,6 @@ abstract contract BlockTrackerStorage { /// @dev Permissioned address of the oracle account. address public oracleAccount; - uint256 public currentWindow; - // Mapping from block number to the winner's address mapping(uint256 => address) public blockWinners; diff --git a/contracts/contracts/interfaces/IBlockTracker.sol b/contracts/contracts/interfaces/IBlockTracker.sol index f7e5c7e23..21f76e0a0 100644 --- a/contracts/contracts/interfaces/IBlockTracker.sol +++ b/contracts/contracts/interfaces/IBlockTracker.sol @@ -7,14 +7,9 @@ interface IBlockTracker { /// @dev Event emitted when a new L1 block is tracked. event NewL1Block( uint256 indexed blockNumber, - address indexed winner, - uint256 indexed window + address indexed winner ); - /// @notice Emitted when entering a new window. - /// @param window The new window number. - event NewWindow(uint256 indexed window); - /// @dev Event emitted when the oracle account is set. event OracleAccountSet(address indexed oldOracleAccount, address indexed newOracleAccount); @@ -42,10 +37,6 @@ interface IBlockTracker { /// @return The Ethereum address of the builder. function getBuilder(string calldata builderNameGrafiti) external view returns (address); - /// @notice Gets the current window number. - /// @return The current window number. - function getCurrentWindow() external view returns (uint256); - /// @notice Retrieves the winner of a specific L1 block. /// @param _blockNumber The block number of the L1 block. /// @return The address of the winner of the L1 block. diff --git a/contracts/test/core/OracleTest.sol b/contracts/test/core/OracleTest.sol index 259c7a7ba..6ac48f8e2 100644 --- a/contracts/test/core/OracleTest.sol +++ b/contracts/test/core/OracleTest.sol @@ -74,11 +74,6 @@ contract OracleTest is Test { string blockBuilderName ); event CommitmentProcessed(bytes32 indexed commitmentIndex, bool isSlash); - event FundsRetrieved( - bytes32 indexed commitmentDigest, - uint256 window, - uint256 amount - ); function setUp() public { address BLS_VERIFY_ADDRESS = address(0xf0); diff --git a/contracts/test/core/PreconfManagerTest.sol b/contracts/test/core/PreconfManagerTest.sol index dfb603c9f..10869580d 100644 --- a/contracts/test/core/PreconfManagerTest.sol +++ b/contracts/test/core/PreconfManagerTest.sol @@ -447,7 +447,7 @@ contract PreconfManagerTest is Test { _testCommitmentAliceBob.zkProof ); - // Step 3: Move to the next window + // Step 3: Record the block blockTracker.recordL1Block(2, validBLSPubkey2); // Step 4: Open the commitment diff --git a/oracle/pkg/l1Listener/l1Listener.go b/oracle/pkg/l1Listener/l1Listener.go index d47ebf7c2..24cb8192f 100644 --- a/oracle/pkg/l1Listener/l1Listener.go +++ b/oracle/pkg/l1Listener/l1Listener.go @@ -31,7 +31,7 @@ type L1Recorder interface { } type WinnerRegister interface { - RegisterWinner(ctx context.Context, blockNum int64, winner []byte, window int64) error + RegisterWinner(ctx context.Context, blockNum int64, winner []byte) error LastWinnerBlock() (int64, error) } @@ -101,13 +101,11 @@ func (l *L1Listener) Start(ctx context.Context) <-chan struct{} { "new L1 block event", "block", update.BlockNumber, "winner", update.Winner.String(), - "window", update.Window, ) err := l.winnerRegister.RegisterWinner( ctx, update.BlockNumber.Int64(), update.Winner.Bytes(), - update.Window.Int64(), ) if err != nil { l.logger.Error( diff --git a/oracle/pkg/l1Listener/l1Listener_test.go b/oracle/pkg/l1Listener/l1Listener_test.go index 0caacfca8..5b32230e4 100644 --- a/oracle/pkg/l1Listener/l1Listener_test.go +++ b/oracle/pkg/l1Listener/l1Listener_test.go @@ -108,7 +108,6 @@ func TestL1Listener(t *testing.T) { eventManager, big.NewInt(int64(i)), addr, - big.NewInt(int64(i)), ) if err != nil { t.Error(err) @@ -125,9 +124,6 @@ func TestL1Listener(t *testing.T) { if !bytes.Equal(winner.winner, addr.Bytes()) { t.Fatal("wrong winner") } - if winner.window != int64(i) { - t.Fatal("wrong window") - } } } @@ -162,15 +158,14 @@ func (t *testRelayQuerier) Query(ctx context.Context, blockNumber int64, blockHa type winnerObj struct { blockNum int64 winner []byte - window int64 } type testRegister struct { winners chan winnerObj } -func (t *testRegister) RegisterWinner(_ context.Context, blockNum int64, winner []byte, window int64) error { - t.winners <- winnerObj{blockNum: blockNum, winner: winner, window: window} +func (t *testRegister) RegisterWinner(_ context.Context, blockNum int64, winner []byte) error { + t.winners <- winnerObj{blockNum: blockNum, winner: winner} return nil } @@ -234,14 +229,12 @@ func publishLog( eventManager events.EventManager, blockNum *big.Int, winner common.Address, - window *big.Int, ) { - eventSignature := []byte("NewL1Block(uint256,address,uint256)") + eventSignature := []byte("NewL1Block(uint256,address)") hashEventSignature := crypto.Keccak256Hash(eventSignature) blockNumber := common.BigToHash(blockNum) winnerHash := common.HexToHash(winner.Hex()) - windowNumber := common.BigToHash(window) // Creating a Log object testLog := types.Log{ @@ -249,7 +242,6 @@ func publishLog( hashEventSignature, // The first topic is the hash of the event signature blockNumber, // The next topics are the indexed event parameters winnerHash, - windowNumber, }, // Since there are no non-indexed parameters, Data is empty Data: []byte{}, diff --git a/oracle/pkg/store/store.go b/oracle/pkg/store/store.go index bb7202cb3..0c671cfdf 100644 --- a/oracle/pkg/store/store.go +++ b/oracle/pkg/store/store.go @@ -33,8 +33,7 @@ CREATE TABLE IF NOT EXISTS settlements ( chainhash TEXT, nonce BIGINT, settled BOOLEAN, - decay_percentage BIGINT, - settlement_window BIGINT + decay_percentage BIGINT );` var encryptedCommitmentsTable = ` @@ -49,8 +48,7 @@ CREATE TABLE IF NOT EXISTS encrypted_commitments ( var winnersTable = ` CREATE TABLE IF NOT EXISTS winners ( block_number BIGINT PRIMARY KEY, - builder_address TEXT, - settlement_window BIGINT + builder_address TEXT );` var transactionsTable = ` @@ -97,14 +95,13 @@ func (s *Store) RegisterWinner( ctx context.Context, blockNum int64, winner []byte, - window int64, ) error { - insertStr := "INSERT INTO winners (block_number, builder_address, settlement_window) VALUES ($1, $2, $3)" + insertStr := "INSERT INTO winners (block_number, builder_address) VALUES ($1, $2)" // Convert winner to base64 string for storage winnerBase64 := base64.StdEncoding.EncodeToString(winner) - _, err := s.db.ExecContext(ctx, insertStr, blockNum, winnerBase64, window) + _, err := s.db.ExecContext(ctx, insertStr, blockNum, winnerBase64) if err != nil { return err } @@ -119,9 +116,9 @@ func (s *Store) GetWinner( var winnerBase64 string err := s.db.QueryRowContext( ctx, - "SELECT builder_address, settlement_window FROM winners WHERE block_number = $1", + "SELECT builder_address FROM winners WHERE block_number = $1", blockNum, - ).Scan(&winnerBase64, &winner.Window) + ).Scan(&winnerBase64) if err != nil { return winner, err } @@ -207,7 +204,6 @@ func (s *Store) AddSettlement( bidID []byte, settlementType updater.SettlementType, decayPercentage int64, - window int64, postingTxnHash []byte, postingTxnNonce uint64, ) error { @@ -223,7 +219,6 @@ func (s *Store) AddSettlement( "chainhash", "nonce", "decay_percentage", - "settlement_window", } // Convert byte slices to base64 strings for storage @@ -244,7 +239,6 @@ func (s *Store) AddSettlement( postingTxnHashBase64, postingTxnNonce, decayPercentage, - window, } placeholder := make([]string, len(values)) for i := range columns { diff --git a/oracle/pkg/store/store_test.go b/oracle/pkg/store/store_test.go index c823d4f6b..f7feeceec 100644 --- a/oracle/pkg/store/store_test.go +++ b/oracle/pkg/store/store_test.go @@ -19,7 +19,6 @@ import ( type blockWinner struct { BlockNumber int64 Winner []byte - Window int64 } type testSettlement struct { @@ -88,12 +87,10 @@ func TestStore(t *testing.T) { winners := []blockWinner{ { - Window: 1, Winner: common.HexToAddress("0x01").Bytes(), BlockNumber: 1, }, { - Window: 2, Winner: common.HexToAddress("0x02").Bytes(), BlockNumber: 2, }, @@ -183,7 +180,7 @@ func TestStore(t *testing.T) { } for _, winner := range winners { - err = st.RegisterWinner(context.Background(), winner.BlockNumber, winner.Winner, winner.Window) + err = st.RegisterWinner(context.Background(), winner.BlockNumber, winner.Winner) if err != nil { t.Fatalf("Failed to register winner: %s", err) } @@ -248,8 +245,7 @@ func TestStore(t *testing.T) { t.Fatalf("Failed to create store: %s", err) } - for i, settlement := range settlements { - window := int64(i/3) + 1 + for _, settlement := range settlements { err = st.AddSettlement( context.Background(), settlement.CommitmentIdx, @@ -260,7 +256,6 @@ func TestStore(t *testing.T) { settlement.BidID, settlement.Type, settlement.DecayPercentage, - window, settlement.ChainHash, settlement.Nonce, ) diff --git a/oracle/pkg/updater/updater.go b/oracle/pkg/updater/updater.go index 7af116382..d5cc57dcc 100644 --- a/oracle/pkg/updater/updater.go +++ b/oracle/pkg/updater/updater.go @@ -9,7 +9,6 @@ import ( "math/big" "strings" "sync" - "sync/atomic" "time" "github.com/ethereum/go-ethereum/common" @@ -17,7 +16,6 @@ import ( "github.com/ethereum/go-ethereum/log" lru "github.com/hashicorp/golang-lru/v2" "github.com/lib/pq" - blocktracker "github.com/primev/mev-commit/contracts-abi/clients/BlockTracker" preconf "github.com/primev/mev-commit/contracts-abi/clients/PreconfManager" "github.com/primev/mev-commit/x/contracts/events" "github.com/primev/mev-commit/x/contracts/txmonitor" @@ -47,7 +45,6 @@ var ( type Winner struct { Winner []byte - Window int64 } type Settlement struct { @@ -82,7 +79,6 @@ type WinnerRegister interface { bidID []byte, settlementType SettlementType, decayPercentage int64, - window int64, postingTxnHash []byte, nonce uint64, ) error @@ -111,7 +107,6 @@ type Updater struct { l1BlockCache *lru.Cache[uint64, map[string]TxMetadata] unopenedCmts chan *preconf.PreconfmanagerUnopenedCommitmentStored openedCmts chan *preconf.PreconfmanagerOpenedCommitmentStored - currentWindow atomic.Int64 metrics *metrics receiptBatcher txmonitor.BatchReceiptGetter } @@ -171,14 +166,7 @@ func (u *Updater) Start(ctx context.Context) <-chan struct{} { }, ) - ev3 := events.NewEventHandler( - "NewWindow", - func(update *blocktracker.BlocktrackerNewWindow) { - u.currentWindow.Store(update.Window.Int64()) - }, - ) - - sub, err := u.evtMgr.Subscribe(ev1, ev2, ev3) + sub, err := u.evtMgr.Subscribe(ev1, ev2) if err != nil { u.logger.Error("failed to subscribe to events", "error", err) close(doneChan) @@ -311,18 +299,6 @@ func (u *Updater) handleOpenedCommitment( return err } - if u.currentWindow.Load() > 2 && winner.Window < u.currentWindow.Load()-2 { - u.logger.Info( - "commitment is too old", - "commitmentIdx", common.Bytes2Hex(update.CommitmentIndex[:]), - "winner", winner.Winner, - "window", winner.Window, - "currentWindow", u.currentWindow.Load(), - ) - u.metrics.CommitmentsTooOldCount.Inc() - return nil - } - if common.BytesToAddress(winner.Winner).Cmp(update.Committer) != 0 { // The winner is not the committer of the commitment u.logger.Info( @@ -385,7 +361,6 @@ func (u *Updater) handleOpenedCommitment( update, SettlementTypeSlash, residualPercentage, - winner.Window, ) } } @@ -395,7 +370,6 @@ func (u *Updater) handleOpenedCommitment( update, SettlementTypeReward, residualPercentage, - winner.Window, ) } @@ -404,7 +378,6 @@ func (u *Updater) settle( update *preconf.PreconfmanagerOpenedCommitmentStored, settlementType SettlementType, residualPercentage *big.Int, - window int64, ) error { commitmentPostingTxn, err := u.oracle.ProcessBuilderCommitmentForBlockNumber( update.CommitmentIndex, @@ -436,7 +409,6 @@ func (u *Updater) settle( update, settlementType, residualPercentage.Int64(), - window, commitmentPostingTxn.Hash().Bytes(), commitmentPostingTxn.Nonce(), ) @@ -447,7 +419,6 @@ func (u *Updater) addSettlement( update *preconf.PreconfmanagerOpenedCommitmentStored, settlementType SettlementType, decayPercentage int64, - window int64, postingTxnHash []byte, nonce uint64, ) error { @@ -461,7 +432,6 @@ func (u *Updater) addSettlement( update.CommitmentDigest[:], settlementType, decayPercentage, - window, postingTxnHash, nonce, ) diff --git a/oracle/pkg/updater/updater_test.go b/oracle/pkg/updater/updater_test.go index cff14edfb..a2571bbb3 100644 --- a/oracle/pkg/updater/updater_test.go +++ b/oracle/pkg/updater/updater_test.go @@ -187,7 +187,6 @@ func TestUpdater(t *testing.T) { blockNum: 5, winner: updater.Winner{ Winner: builderAddr.Bytes(), - Window: 1, }, }, }, @@ -246,11 +245,6 @@ func TestUpdater(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) done := updtr.Start(ctx) - w := blocktracker.BlocktrackerNewWindow{ - Window: big.NewInt(1), - } - publishNewWindow(evtMgr, &btABI, w) - for _, ec := range unopenedCommitments { if err := publishUnopenedCommitment(evtMgr, &pcABI, ec); err != nil { t.Fatal(err) @@ -333,9 +327,6 @@ func TestUpdater(t *testing.T) { if settlement.decayPercentage != 50*updater.PRECISION { t.Fatal("wrong decay percentage") } - if settlement.window != 1 { - t.Fatal("wrong window") - } } } @@ -346,6 +337,7 @@ func TestUpdater(t *testing.T) { t.Fatal("timeout") } } + func TestUpdaterRevertedTxns(t *testing.T) { t.Parallel() @@ -451,7 +443,6 @@ func TestUpdaterRevertedTxns(t *testing.T) { blockNum: 5, winner: updater.Winner{ Winner: builderAddr.Bytes(), - Window: 1, }, }, }, @@ -516,11 +507,6 @@ func TestUpdaterRevertedTxns(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) done := updtr.Start(ctx) - w := blocktracker.BlocktrackerNewWindow{ - Window: big.NewInt(1), - } - publishNewWindow(evtMgr, &btABI, w) - for _, ec := range unopenedCommitments { if err := publishUnopenedCommitment(evtMgr, &pcABI, ec); err != nil { t.Fatal(err) @@ -603,9 +589,6 @@ func TestUpdaterRevertedTxns(t *testing.T) { if settlement.decayPercentage != 50*updater.PRECISION { t.Fatal("wrong decay percentage") } - if settlement.window != 1 { - t.Fatal("wrong window") - } } } @@ -722,7 +705,6 @@ func TestUpdaterRevertedTxnsWithRevertingHashes(t *testing.T) { blockNum: 5, winner: updater.Winner{ Winner: builderAddr.Bytes(), - Window: 1, }, }, }, @@ -787,11 +769,6 @@ func TestUpdaterRevertedTxnsWithRevertingHashes(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) done := updtr.Start(ctx) - w := blocktracker.BlocktrackerNewWindow{ - Window: big.NewInt(1), - } - publishNewWindow(evtMgr, &btABI, w) - for _, ec := range unopenedCommitments { if err := publishUnopenedCommitment(evtMgr, &pcABI, ec); err != nil { t.Fatal(err) @@ -874,9 +851,6 @@ func TestUpdaterRevertedTxnsWithRevertingHashes(t *testing.T) { if settlement.decayPercentage != 50*updater.PRECISION { t.Fatal("wrong decay percentage") } - if settlement.window != 1 { - t.Fatal("wrong window") - } } } @@ -887,6 +861,7 @@ func TestUpdaterRevertedTxnsWithRevertingHashes(t *testing.T) { t.Fatal("timeout") } } + func TestUpdaterBundlesFailure(t *testing.T) { t.Parallel() @@ -947,7 +922,6 @@ func TestUpdaterBundlesFailure(t *testing.T) { blockNum: 5, winner: updater.Winner{ Winner: builderAddr.Bytes(), - Window: 1, }, }, }, @@ -1005,11 +979,6 @@ func TestUpdaterBundlesFailure(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) done := updtr.Start(ctx) - w := blocktracker.BlocktrackerNewWindow{ - Window: big.NewInt(1), - } - publishNewWindow(evtMgr, &btABI, w) - for _, c := range commitments { if err := publishOpenedCommitment(evtMgr, &pcABI, c); err != nil { t.Fatal(err) @@ -1061,9 +1030,6 @@ func TestUpdaterBundlesFailure(t *testing.T) { if settlement.decayPercentage != 50*updater.PRECISION { t.Fatal("wrong decay percentage") } - if settlement.window != 1 { - t.Fatal("wrong window") - } } } @@ -1141,18 +1107,10 @@ func TestUpdaterIgnoreCommitments(t *testing.T) { register := &testWinnerRegister{ winners: []testWinner{ - { - blockNum: 5, - winner: updater.Winner{ - Winner: builderAddr.Bytes(), - Window: 1, - }, - }, { blockNum: 10, winner: updater.Winner{ Winner: builderAddr.Bytes(), - Window: 5, }, }, }, @@ -1213,11 +1171,6 @@ func TestUpdaterIgnoreCommitments(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) done := updtr.Start(ctx) - w := blocktracker.BlocktrackerNewWindow{ - Window: big.NewInt(5), - } - publishNewWindow(evtMgr, &btABI, w) - for i, c := range commitments { if err := publishOpenedCommitment(evtMgr, &pcABI, c); err != nil { t.Fatal(err) @@ -1278,9 +1231,6 @@ func TestUpdaterIgnoreCommitments(t *testing.T) { if settlement.decayPercentage != 50*updater.PRECISION { t.Fatal("wrong decay percentage") } - if settlement.window != 5 { - t.Fatal("wrong window") - } } } @@ -1462,7 +1412,6 @@ type testSettlement struct { amount *big.Int settlementType updater.SettlementType decayPercentage int64 - window int64 chainhash []byte nonce uint64 } @@ -1519,7 +1468,6 @@ func (t *testWinnerRegister) AddSettlement( _ []byte, settlementType updater.SettlementType, decayPercentage int64, - window int64, chainhash []byte, nonce uint64, ) error { @@ -1535,7 +1483,6 @@ func (t *testWinnerRegister) AddSettlement( builder: builder, settlementType: settlementType, decayPercentage: decayPercentage, - window: window, chainhash: chainhash, nonce: nonce, } @@ -1672,23 +1619,3 @@ func publishOpenedCommitment( evtMgr.PublishLogEvent(context.Background(), testLog) return nil } - -func publishNewWindow( - evtMgr events.EventManager, - btABI *abi.ABI, - w blocktracker.BlocktrackerNewWindow, -) { - event := btABI.Events["NewWindow"] - - // Creating a Log object - testLog := types.Log{ - Topics: []common.Hash{ - event.ID, // The first topic is the hash of the event signature - common.BigToHash(w.Window), // The next topics are the indexed event parameters - }, - // Non-indexed parameters are stored in the Data field - Data: nil, - } - - evtMgr.PublishLogEvent(context.Background(), testLog) -} diff --git a/p2p/pkg/preconfirmation/tracker/tracker.go b/p2p/pkg/preconfirmation/tracker/tracker.go index 022fc1a4f..32fd5bb76 100644 --- a/p2p/pkg/preconfirmation/tracker/tracker.go +++ b/p2p/pkg/preconfirmation/tracker/tracker.go @@ -402,7 +402,6 @@ func (t *Tracker) handleNewL1Block( "new L1 Block event received", "blockNumber", newL1Block.BlockNumber, "winner", newL1Block.Winner, - "window", newL1Block.Window, ) return t.store.AddWinner(&store.BlockWinner{ diff --git a/p2p/pkg/preconfirmation/tracker/tracker_test.go b/p2p/pkg/preconfirmation/tracker/tracker_test.go index cffaea24f..70d001acc 100644 --- a/p2p/pkg/preconfirmation/tracker/tracker_test.go +++ b/p2p/pkg/preconfirmation/tracker/tracker_test.go @@ -210,7 +210,6 @@ func TestTracker(t *testing.T) { publishNewWinner(evtMgr, &btABI, blocktracker.BlocktrackerNewL1Block{ BlockNumber: big.NewInt(int64(i)), Winner: winnerProvider, - Window: big.NewInt(1), }) } @@ -271,12 +270,10 @@ func TestTracker(t *testing.T) { publishNewWinner(evtMgr, &btABI, blocktracker.BlocktrackerNewL1Block{ BlockNumber: big.NewInt(6), Winner: winnerProvider, - Window: big.NewInt(1), }) publishNewWinner(evtMgr, &btABI, blocktracker.BlocktrackerNewL1Block{ BlockNumber: big.NewInt(7), Winner: winnerProvider, - Window: big.NewInt(1), }) opened = []*store.Commitment{ @@ -446,7 +443,6 @@ func TestTracker(t *testing.T) { publishNewWinner(evtMgr, &btABI, blocktracker.BlocktrackerNewL1Block{ BlockNumber: big.NewInt(10012), Winner: winnerProvider, - Window: big.NewInt(1001), }) start = time.Now() @@ -723,7 +719,6 @@ func publishNewWinner( event.ID, // The first topic is the hash of the event signature common.BigToHash(w.BlockNumber), // The next topics are the indexed event parameters common.HexToHash(w.Winner.Hex()), - common.BigToHash(w.Window), }, // Non-indexed parameters are stored in the Data field Data: nil, From 04bb2eaf7b3cfc11e4cb2035f99c3c936850dc95 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Fri, 29 Aug 2025 18:38:33 -0700 Subject: [PATCH 110/117] perf: use deposit.NewAvailableAmount in deposit.go --- contracts-abi/abi/BidderRegistry.abi | 6 ++++ .../clients/BidderRegistry/BidderRegistry.go | 23 ++++++------ contracts/contracts/core/BidderRegistry.sol | 2 +- .../contracts/interfaces/IBidderRegistry.sol | 3 +- contracts/test/core/BidderRegistryTest.sol | 24 +++++++------ p2p/pkg/depositmanager/deposit.go | 35 ++++++++----------- p2p/pkg/depositmanager/deposit_test.go | 14 +++++--- 7 files changed, 59 insertions(+), 48 deletions(-) diff --git a/contracts-abi/abi/BidderRegistry.abi b/contracts-abi/abi/BidderRegistry.abi index 35f3aaa2d..2804c5778 100644 --- a/contracts-abi/abi/BidderRegistry.abi +++ b/contracts-abi/abi/BidderRegistry.abi @@ -804,6 +804,12 @@ "type": "uint256", "indexed": true, "internalType": "uint256" + }, + { + "name": "newAvailableAmount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" } ], "anonymous": false diff --git a/contracts-abi/clients/BidderRegistry/BidderRegistry.go b/contracts-abi/clients/BidderRegistry/BidderRegistry.go index 31024ec11..b494c8699 100644 --- a/contracts-abi/clients/BidderRegistry/BidderRegistry.go +++ b/contracts-abi/clients/BidderRegistry/BidderRegistry.go @@ -37,7 +37,7 @@ type TimestampOccurrenceOccurrence struct { // BidderregistryMetaData contains all meta data concerning the Bidderregistry contract. var BidderregistryMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"ONE_HUNDRED_PERCENT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PRECISION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"bidPayment\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"bidAmt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"state\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bidderWithdrawalPeriodMs\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"blockTrackerContract\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBlockTracker\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"convertFundsToProviderReward\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"addresspayable\"},{\"name\":\"residualBidPercentAfterDecay\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositAsBidder\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"depositEvenlyAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"depositManagerHash\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositManagerImpl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deposits\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"availableAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"escrowedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalRequestOccurrence\",\"type\":\"tuple\",\"internalType\":\"structTimestampOccurrence.Occurrence\",\"components\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"feePercent\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAccumulatedProtocolFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDeposit\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDepositConsideringWithdrawalRequest\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEscrowedAmount\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProviderAmount\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_protocolFeeRecipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_feePercent\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_blockTracker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_feePayoutPeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_bidderWithdrawalPeriodMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"manuallyWithdrawProtocolFee\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"openBid\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"bidAmt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"preconfManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"protocolFeeTracker\",\"inputs\":[],\"outputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"accumulatedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"lastPayoutTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"payoutTimePeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"providerAmount\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"requestWithdrawalsAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setBlockTrackerContract\",\"inputs\":[{\"name\":\"newBlockTrackerContract\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDepositManagerImpl\",\"inputs\":[{\"name\":\"_depositManagerImpl\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewFeePayoutPeriod\",\"inputs\":[{\"name\":\"newFeePayoutPeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewFeePercent\",\"inputs\":[{\"name\":\"newFeePercent\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewProtocolFeeRecipient\",\"inputs\":[{\"name\":\"newProtocolFeeRecipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPreconfManager\",\"inputs\":[{\"name\":\"contractAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unlockFunds\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"withdrawAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawProviderAmount\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawalRequestExists\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"BidAmountReduced\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newBidAmt\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BidderDeposited\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"depositedAmount\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BidderWithdrawal\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amountWithdrawn\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"amountStillEscrowed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockTrackerUpdated\",\"inputs\":[{\"name\":\"newBlockTracker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DepositManagerImplUpdated\",\"inputs\":[{\"name\":\"newDepositManagerImpl\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeePayoutPeriodUpdated\",\"inputs\":[{\"name\":\"newFeePayoutPeriod\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeePercentUpdated\",\"inputs\":[{\"name\":\"newFeePercent\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeTransfer\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FundsRewarded\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FundsUnlocked\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"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\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PreconfManagerUpdated\",\"inputs\":[{\"name\":\"newPreconfManager\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProtocolFeeRecipientUpdated\",\"inputs\":[{\"name\":\"newProtocolFeeRecipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TopUpFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransferToBidderFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalRequested\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"availableAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"escrowedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"BidNotPreConfirmed\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"actualState\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"},{\"name\":\"expectedState\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"}]},{\"type\":\"error\",\"name\":\"BidderWithdrawalTransferFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"DepositAmountIsLessThanProviders\",\"inputs\":[{\"name\":\"depositAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"numProviders\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"DepositAmountIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DepositDoesNotExist\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DepositManagerNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpectedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FeeRecipientIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoProviders\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyBidderCanWithdraw\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"PayoutPeriodMustBePositive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ProviderAmountIsZero\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ProviderIsZeroAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SenderIsNotPreconfManager\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"preconfManager\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TransferToProviderFailed\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"TransferToRecipientFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"WithdrawalOccurrenceExists\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"requestTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"WithdrawalPeriodNotElapsed\",\"inputs\":[{\"name\":\"currentTimestampMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalTimestampMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalPeriodMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"WithdrawalRequestAlreadyExists\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"WithdrawalRequestDoesNotExist\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"ONE_HUNDRED_PERCENT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PRECISION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"bidPayment\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"bidAmt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"state\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bidderWithdrawalPeriodMs\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"blockTrackerContract\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBlockTracker\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"convertFundsToProviderReward\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"addresspayable\"},{\"name\":\"residualBidPercentAfterDecay\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositAsBidder\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"depositEvenlyAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"depositManagerHash\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositManagerImpl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deposits\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"availableAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"escrowedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalRequestOccurrence\",\"type\":\"tuple\",\"internalType\":\"structTimestampOccurrence.Occurrence\",\"components\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"feePercent\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAccumulatedProtocolFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDeposit\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDepositConsideringWithdrawalRequest\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEscrowedAmount\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProviderAmount\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_protocolFeeRecipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_feePercent\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_blockTracker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_feePayoutPeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_bidderWithdrawalPeriodMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"manuallyWithdrawProtocolFee\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"openBid\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"bidAmt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"preconfManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"protocolFeeTracker\",\"inputs\":[],\"outputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"accumulatedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"lastPayoutTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"payoutTimePeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"providerAmount\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"requestWithdrawalsAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setBlockTrackerContract\",\"inputs\":[{\"name\":\"newBlockTrackerContract\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDepositManagerImpl\",\"inputs\":[{\"name\":\"_depositManagerImpl\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewFeePayoutPeriod\",\"inputs\":[{\"name\":\"newFeePayoutPeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewFeePercent\",\"inputs\":[{\"name\":\"newFeePercent\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNewProtocolFeeRecipient\",\"inputs\":[{\"name\":\"newProtocolFeeRecipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPreconfManager\",\"inputs\":[{\"name\":\"contractAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unlockFunds\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"withdrawAsBidder\",\"inputs\":[{\"name\":\"providers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawProviderAmount\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawalRequestExists\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"BidAmountReduced\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newBidAmt\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BidderDeposited\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"depositedAmount\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"newAvailableAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BidderWithdrawal\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amountWithdrawn\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"amountStillEscrowed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockTrackerUpdated\",\"inputs\":[{\"name\":\"newBlockTracker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DepositManagerImplUpdated\",\"inputs\":[{\"name\":\"newDepositManagerImpl\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeePayoutPeriodUpdated\",\"inputs\":[{\"name\":\"newFeePayoutPeriod\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeePercentUpdated\",\"inputs\":[{\"name\":\"newFeePercent\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeTransfer\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FundsRewarded\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FundsUnlocked\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"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\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PreconfManagerUpdated\",\"inputs\":[{\"name\":\"newPreconfManager\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProtocolFeeRecipientUpdated\",\"inputs\":[{\"name\":\"newProtocolFeeRecipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TopUpFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransferToBidderFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalRequested\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"availableAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"escrowedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"BidNotPreConfirmed\",\"inputs\":[{\"name\":\"commitmentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"actualState\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"},{\"name\":\"expectedState\",\"type\":\"uint8\",\"internalType\":\"enumIBidderRegistry.State\"}]},{\"type\":\"error\",\"name\":\"BidderWithdrawalTransferFailed\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"DepositAmountIsLessThanProviders\",\"inputs\":[{\"name\":\"depositAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"numProviders\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"DepositAmountIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DepositDoesNotExist\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DepositManagerNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpectedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FeeRecipientIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoProviders\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyBidderCanWithdraw\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"PayoutPeriodMustBePositive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ProviderAmountIsZero\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ProviderIsZeroAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SenderIsNotPreconfManager\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"preconfManager\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TransferToProviderFailed\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"TransferToRecipientFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"WithdrawalOccurrenceExists\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"requestTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"WithdrawalPeriodNotElapsed\",\"inputs\":[{\"name\":\"currentTimestampMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalTimestampMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"withdrawalPeriodMs\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"WithdrawalRequestAlreadyExists\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"WithdrawalRequestDoesNotExist\",\"inputs\":[{\"name\":\"bidder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"provider\",\"type\":\"address\",\"internalType\":\"address\"}]}]", } // BidderregistryABI is the input ABI used to generate the binding from. @@ -1701,15 +1701,16 @@ func (it *BidderregistryBidderDepositedIterator) Close() error { // BidderregistryBidderDeposited represents a BidderDeposited event raised by the Bidderregistry contract. type BidderregistryBidderDeposited struct { - Bidder common.Address - Provider common.Address - DepositedAmount *big.Int - Raw types.Log // Blockchain specific contextual infos + Bidder common.Address + Provider common.Address + DepositedAmount *big.Int + NewAvailableAmount *big.Int + Raw types.Log // Blockchain specific contextual infos } -// FilterBidderDeposited is a free log retrieval operation binding the contract event 0x4d20d1fbd69c0e659804a90e1059acadeedf06a29168dbd3354ebe2da51fe5b7. +// FilterBidderDeposited is a free log retrieval operation binding the contract event 0x1776fcfbda205cf573c261f45edd9729e9c163e18c632259c4ada3b990ceeacb. // -// Solidity: event BidderDeposited(address indexed bidder, address indexed provider, uint256 indexed depositedAmount) +// Solidity: event BidderDeposited(address indexed bidder, address indexed provider, uint256 indexed depositedAmount, uint256 newAvailableAmount) func (_Bidderregistry *BidderregistryFilterer) FilterBidderDeposited(opts *bind.FilterOpts, bidder []common.Address, provider []common.Address, depositedAmount []*big.Int) (*BidderregistryBidderDepositedIterator, error) { var bidderRule []interface{} @@ -1732,9 +1733,9 @@ func (_Bidderregistry *BidderregistryFilterer) FilterBidderDeposited(opts *bind. return &BidderregistryBidderDepositedIterator{contract: _Bidderregistry.contract, event: "BidderDeposited", logs: logs, sub: sub}, nil } -// WatchBidderDeposited is a free log subscription operation binding the contract event 0x4d20d1fbd69c0e659804a90e1059acadeedf06a29168dbd3354ebe2da51fe5b7. +// WatchBidderDeposited is a free log subscription operation binding the contract event 0x1776fcfbda205cf573c261f45edd9729e9c163e18c632259c4ada3b990ceeacb. // -// Solidity: event BidderDeposited(address indexed bidder, address indexed provider, uint256 indexed depositedAmount) +// Solidity: event BidderDeposited(address indexed bidder, address indexed provider, uint256 indexed depositedAmount, uint256 newAvailableAmount) func (_Bidderregistry *BidderregistryFilterer) WatchBidderDeposited(opts *bind.WatchOpts, sink chan<- *BidderregistryBidderDeposited, bidder []common.Address, provider []common.Address, depositedAmount []*big.Int) (event.Subscription, error) { var bidderRule []interface{} @@ -1782,9 +1783,9 @@ func (_Bidderregistry *BidderregistryFilterer) WatchBidderDeposited(opts *bind.W }), nil } -// ParseBidderDeposited is a log parse operation binding the contract event 0x4d20d1fbd69c0e659804a90e1059acadeedf06a29168dbd3354ebe2da51fe5b7. +// ParseBidderDeposited is a log parse operation binding the contract event 0x1776fcfbda205cf573c261f45edd9729e9c163e18c632259c4ada3b990ceeacb. // -// Solidity: event BidderDeposited(address indexed bidder, address indexed provider, uint256 indexed depositedAmount) +// Solidity: event BidderDeposited(address indexed bidder, address indexed provider, uint256 indexed depositedAmount, uint256 newAvailableAmount) func (_Bidderregistry *BidderregistryFilterer) ParseBidderDeposited(log types.Log) (*BidderregistryBidderDeposited, error) { event := new(BidderregistryBidderDeposited) if err := _Bidderregistry.contract.UnpackLog(event, "BidderDeposited", log); err != nil { diff --git a/contracts/contracts/core/BidderRegistry.sol b/contracts/contracts/core/BidderRegistry.sol index e442a5bf7..4e92a10a2 100644 --- a/contracts/contracts/core/BidderRegistry.sol +++ b/contracts/contracts/core/BidderRegistry.sol @@ -463,7 +463,7 @@ contract BidderRegistry is timestamp: 0}) }); } - emit BidderDeposited(bidder, provider, amount); + emit BidderDeposited(bidder, provider, amount, deposit.availableAmount); } // solhint-disable-next-line no-empty-blocks diff --git a/contracts/contracts/interfaces/IBidderRegistry.sol b/contracts/contracts/interfaces/IBidderRegistry.sol index 88d597fc9..5a33ad07b 100644 --- a/contracts/contracts/interfaces/IBidderRegistry.sol +++ b/contracts/contracts/interfaces/IBidderRegistry.sol @@ -43,7 +43,8 @@ interface IBidderRegistry { event BidderDeposited( address indexed bidder, address indexed provider, - uint256 indexed depositedAmount + uint256 indexed depositedAmount, + uint256 newAvailableAmount ); /// @dev Event emitted when a bidder requests a withdrawal from a specific provider diff --git a/contracts/test/core/BidderRegistryTest.sol b/contracts/test/core/BidderRegistryTest.sol index e2a841fdf..db44b084d 100644 --- a/contracts/test/core/BidderRegistryTest.sol +++ b/contracts/test/core/BidderRegistryTest.sol @@ -23,7 +23,7 @@ contract BidderRegistryTest is Test { BlockTracker public blockTracker; ProviderRegistry public providerRegistry; - event BidderDeposited(address indexed bidder, address indexed provider, uint256 indexed depositedAmount); + event BidderDeposited(address indexed bidder, address indexed provider, uint256 indexed depositedAmount, uint256 newAvailableAmount); event BidderWithdrawal(address indexed bidder, address indexed provider, uint256 indexed withdrawalAmount, uint256 escrowedAmount); event FeeTransfer(uint256 amount, address indexed recipient); @@ -92,14 +92,14 @@ contract BidderRegistryTest is Test { vm.startPrank(bidder); vm.expectEmit(true, false, false, true); - emit BidderDeposited(bidder, provider1, 1 ether); + emit BidderDeposited(bidder, provider1, 1 ether, 1 ether); bidderRegistry.depositAsBidder{value: 1 ether}(provider1); uint256 bidderStakeStored = bidderRegistry.getDeposit(bidder, provider1); assertEq(bidderStakeStored, 1 ether); address provider2 = vm.addr(3); vm.expectEmit(true, false, false, true); - emit BidderDeposited(bidder, provider2, 2 ether); + emit BidderDeposited(bidder, provider2, 2 ether, 2 ether); bidderRegistry.depositAsBidder{value: 2 ether}(provider2); uint256 bidderStakeStored2 = bidderRegistry.getDeposit(bidder, provider2); assertEq(bidderStakeStored2, 2 ether); @@ -357,7 +357,7 @@ contract BidderRegistryTest is Test { for (uint256 i = 0; i < 3; ++i) { vm.expectEmit(true, false, false, true); - emit BidderDeposited(bidder, providers[i], depositAmount / 3); + emit BidderDeposited(bidder, providers[i], depositAmount / 3, depositAmount / 3); bidderRegistry.depositAsBidder{value: depositAmount / 3}(providers[i]); uint256 lockedFunds = bidderRegistry.getDeposit(bidder, providers[i]); @@ -382,7 +382,7 @@ contract BidderRegistryTest is Test { vm.startPrank(bidder); for (uint16 i = 0; i < 3; ++i) { vm.expectEmit(true, false, false, true); - emit BidderDeposited(bidder, providers[i], depositAmount / 3); + emit BidderDeposited(bidder, providers[i], depositAmount / 3, depositAmount / 3); bidderRegistry.depositAsBidder{value: depositAmount / 3}(providers[i]); uint256 lockedFunds = bidderRegistry.getDeposit(bidder, providers[i]); @@ -837,9 +837,9 @@ contract BidderRegistryTest is Test { assertFalse(deposit2.exists, "deposit2 should not exist"); vm.expectEmit(true, true, true, true); - emit IBidderRegistry.BidderDeposited(bidder, provider1, 5 ether); + emit IBidderRegistry.BidderDeposited(bidder, provider1, 5 ether, 5 ether); vm.expectEmit(true, true, true, true); - emit IBidderRegistry.BidderDeposited(bidder, provider2, 5 ether); + emit IBidderRegistry.BidderDeposited(bidder, provider2, 5 ether, 5 ether); vm.deal(bidder, 10 ether); vm.prank(bidder); @@ -872,9 +872,9 @@ contract BidderRegistryTest is Test { IBidderRegistry.Deposit memory deposit2Before = getDepositStruct(bidder, provider2); vm.expectEmit(true, true, true, true); - emit IBidderRegistry.BidderDeposited(bidder, provider1, 1 wei); + emit IBidderRegistry.BidderDeposited(bidder, provider1, 1 wei, deposit1Before.availableAmount + 1 wei); vm.expectEmit(true, true, true, true); - emit IBidderRegistry.BidderDeposited(bidder, provider2, 2 wei); + emit IBidderRegistry.BidderDeposited(bidder, provider2, 2 wei, deposit2Before.availableAmount + 2 wei); vm.deal(bidder, 3 wei); vm.prank(bidder); @@ -1117,9 +1117,11 @@ contract BidderRegistryTest is Test { vm.deal(bidder, 25 ether + 1 wei); vm.expectEmit(true, true, true, true); - emit IBidderRegistry.BidderDeposited(bidder, provider1, 12.5 ether); + emit IBidderRegistry.BidderDeposited(bidder, provider1, 12.5 ether, + deposit1Before.availableAmount + 12.5 ether); vm.expectEmit(true, true, true, true); - emit IBidderRegistry.BidderDeposited(bidder, provider2, 12.5 ether + 1 wei); + emit IBidderRegistry.BidderDeposited(bidder, provider2, 12.5 ether + 1 wei, + deposit2Before.availableAmount + 12.5 ether + 1 wei); vm.prank(bidder); bidderRegistry.depositEvenlyAsBidder{value: 25 ether + 1 wei}(providers); diff --git a/p2p/pkg/depositmanager/deposit.go b/p2p/pkg/depositmanager/deposit.go index 91af23e4d..fc19960e1 100644 --- a/p2p/pkg/depositmanager/deposit.go +++ b/p2p/pkg/depositmanager/deposit.go @@ -123,32 +123,27 @@ func (dm *DepositManager) Start(ctx context.Context) <-chan struct{} { return err } if currentBalance == nil { - dm.logger.Debug("balance not found in store, using default from contract", + if err := dm.store.SetBalance(deposit.Bidder, deposit.Provider, deposit.NewAvailableAmount); err != nil { + dm.logger.Error("setting balance", "error", err) + return err + } + dm.logger.Info("current balance not found in store, stored new available amount from event", "bidder", deposit.Bidder, "provider", deposit.Provider, + "new balance", deposit.NewAvailableAmount, ) - blockBeforeDeposit := new(big.Int).SetUint64(deposit.Raw.BlockNumber - 1) - currentBalance, err = dm.getDefaultBalance(egCtx, deposit.Bidder, deposit.Provider, blockBeforeDeposit) - if err != nil { - dm.logger.Error("getting default balance", "error", err) + } else { + newBalance := new(big.Int).Add(currentBalance, deposit.DepositedAmount) + if err := dm.store.SetBalance(deposit.Bidder, deposit.Provider, newBalance); err != nil { + dm.logger.Error("setting balance", "error", err) return err } - if currentBalance == nil { - dm.logger.Error("No balance found in contract. Assuming zero") - currentBalance = big.NewInt(0) - } - } - newBalance := new(big.Int).Add(currentBalance, deposit.DepositedAmount) - if err := dm.store.SetBalance(deposit.Bidder, deposit.Provider, newBalance); err != nil { - dm.logger.Error("setting balance", "error", err) - return err + dm.logger.Info("set balance from bidder deposit event", + "bidder", deposit.Bidder, + "provider", deposit.Provider, + "new balance", newBalance, + ) } - dm.logger.Info("set balance from bidder deposit event", - "bidder", deposit.Bidder, - "provider", deposit.Provider, - "new balance", newBalance, - ) - case withdrawalRequest := <-dm.withdrawRequests: if err := dm.store.DeleteBalance(withdrawalRequest.Bidder, withdrawalRequest.Provider); err != nil { dm.logger.Error("deleting balance", "error", err) diff --git a/p2p/pkg/depositmanager/deposit_test.go b/p2p/pkg/depositmanager/deposit_test.go index a31347484..ac39a55a5 100644 --- a/p2p/pkg/depositmanager/deposit_test.go +++ b/p2p/pkg/depositmanager/deposit_test.go @@ -250,9 +250,10 @@ func TestStartWithBidderAlreadyDeposited(t *testing.T) { done := dm.Start(ctx) err = publishBidderDeposited(evtMgr, &brABI, &bidderregistry.BidderregistryBidderDeposited{ - Bidder: common.HexToAddress("0x123"), - Provider: common.HexToAddress("0x456"), - DepositedAmount: big.NewInt(100), + Bidder: common.HexToAddress("0x123"), + Provider: common.HexToAddress("0x456"), + DepositedAmount: big.NewInt(100), + NewAvailableAmount: big.NewInt(133), Raw: types.Log{ BlockNumber: 16, }, @@ -281,7 +282,12 @@ func publishBidderDeposited( br *bidderregistry.BidderregistryBidderDeposited, ) error { event := brABI.Events["BidderDeposited"] - buf, err := event.Inputs.NonIndexed().Pack() + + newAvail := br.NewAvailableAmount + if newAvail == nil { + newAvail = big.NewInt(0) + } + buf, err := event.Inputs.NonIndexed().Pack(newAvail) if err != nil { return err } From 264a6e983af8b1f5857b493f5a91944b54815a7f Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Fri, 29 Aug 2025 19:03:12 -0700 Subject: [PATCH 111/117] fix: TestDepositManager --- p2p/pkg/depositmanager/deposit_test.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/p2p/pkg/depositmanager/deposit_test.go b/p2p/pkg/depositmanager/deposit_test.go index ac39a55a5..3d2e5d0b2 100644 --- a/p2p/pkg/depositmanager/deposit_test.go +++ b/p2p/pkg/depositmanager/deposit_test.go @@ -80,9 +80,10 @@ func TestDepositManager(t *testing.T) { } br := &bidderregistry.BidderregistryBidderDeposited{ - Bidder: common.HexToAddress("0x123"), - Provider: common.HexToAddress("0x456"), - DepositedAmount: big.NewInt(100), + Bidder: common.HexToAddress("0x123"), + Provider: common.HexToAddress("0x456"), + DepositedAmount: big.NewInt(100), + NewAvailableAmount: big.NewInt(100), } err = publishBidderDeposited(evtMgr, &brABI, br) @@ -192,9 +193,10 @@ func TestDepositManager(t *testing.T) { } err = publishBidderDeposited(evtMgr, &brABI, &bidderregistry.BidderregistryBidderDeposited{ - Bidder: common.HexToAddress("0x123"), - Provider: common.HexToAddress("0x456"), - DepositedAmount: big.NewInt(777), + Bidder: common.HexToAddress("0x123"), + Provider: common.HexToAddress("0x456"), + DepositedAmount: big.NewInt(777), + NewAvailableAmount: big.NewInt(777), }) if err != nil { t.Fatal(err) From 463d65b9b80ac4dfec1d00ad61e040cac4ec9abf Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Fri, 29 Aug 2025 19:23:07 -0700 Subject: [PATCH 112/117] fix: TestEventHandler + TestEventManager --- x/contracts/events/events_test.go | 35 ++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/x/contracts/events/events_test.go b/x/contracts/events/events_test.go index d95981658..d15d15f39 100644 --- a/x/contracts/events/events_test.go +++ b/x/contracts/events/events_test.go @@ -20,9 +20,10 @@ func TestEventHandler(t *testing.T) { t.Parallel() b := bidderregistry.BidderregistryBidderDeposited{ - Bidder: common.HexToAddress("0xabcd"), - Provider: common.HexToAddress("0x1234"), - DepositedAmount: big.NewInt(1000), + Bidder: common.HexToAddress("0xabcd"), + Provider: common.HexToAddress("0x1234"), + DepositedAmount: big.NewInt(1000), + NewAvailableAmount: big.NewInt(1000), } errC := make(chan error, 1) @@ -42,6 +43,10 @@ func TestEventHandler(t *testing.T) { errC <- fmt.Errorf("expected prepaid amount %d, got %d", b.DepositedAmount, ev.DepositedAmount) return } + if ev.NewAvailableAmount.Cmp(b.NewAvailableAmount) != 0 { + errC <- fmt.Errorf("expected new available amount %d, got %d", b.NewAvailableAmount, ev.NewAvailableAmount) + return + } close(errC) }, ) @@ -55,7 +60,7 @@ func TestEventHandler(t *testing.T) { evtHdlr.setTopicAndContract(event.ID, &bidderABI) - buf, err := event.Inputs.NonIndexed().Pack() + buf, err := event.Inputs.NonIndexed().Pack(b.NewAvailableAmount) if err != nil { t.Fatal(err) } @@ -95,14 +100,16 @@ func TestEventManager(t *testing.T) { bidders := []bidderregistry.BidderregistryBidderDeposited{ { - Bidder: common.HexToAddress("0xabcd"), - Provider: common.HexToAddress("0x1234"), - DepositedAmount: big.NewInt(1000), + Bidder: common.HexToAddress("0xabcd"), + Provider: common.HexToAddress("0x1234"), + DepositedAmount: big.NewInt(1000), + NewAvailableAmount: big.NewInt(1000), }, { - Bidder: common.HexToAddress("0xcdef"), - Provider: common.HexToAddress("0x5678"), - DepositedAmount: big.NewInt(2000), + Bidder: common.HexToAddress("0xcdef"), + Provider: common.HexToAddress("0x5678"), + DepositedAmount: big.NewInt(2000), + NewAvailableAmount: big.NewInt(2000), }, } @@ -131,6 +138,10 @@ func TestEventManager(t *testing.T) { errC <- fmt.Errorf("expected prepaid amount %d, got %d", bidders[count].DepositedAmount, ev.DepositedAmount) return } + if ev.NewAvailableAmount.Cmp(bidders[count].NewAvailableAmount) != 0 { + errC <- fmt.Errorf("expected new available amount %d, got %d", bidders[count].NewAvailableAmount, ev.NewAvailableAmount) + return + } count++ handlerTriggered <- count }, @@ -141,12 +152,12 @@ func TestEventManager(t *testing.T) { t.Fatal(err) } - data1, err := bidderABI.Events["BidderDeposited"].Inputs.NonIndexed().Pack() + data1, err := bidderABI.Events["BidderDeposited"].Inputs.NonIndexed().Pack(bidders[0].NewAvailableAmount) if err != nil { t.Fatal(err) } - data2, err := bidderABI.Events["BidderDeposited"].Inputs.NonIndexed().Pack() + data2, err := bidderABI.Events["BidderDeposited"].Inputs.NonIndexed().Pack(bidders[1].NewAvailableAmount) if err != nil { t.Fatal(err) } From beacd72ead6fe9bdbb23a632726943058027ce05 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Sat, 30 Aug 2025 12:47:27 -0700 Subject: [PATCH 113/117] perf: only cache deposits relevant to own provider --- p2p/pkg/depositmanager/deposit.go | 43 ++++++---- p2p/pkg/depositmanager/deposit_test.go | 104 ++++++++++++++++++++++++- p2p/pkg/node/node.go | 1 + 3 files changed, 132 insertions(+), 16 deletions(-) diff --git a/p2p/pkg/depositmanager/deposit.go b/p2p/pkg/depositmanager/deposit.go index fc19960e1..4ea43d730 100644 --- a/p2p/pkg/depositmanager/deposit.go +++ b/p2p/pkg/depositmanager/deposit.go @@ -27,29 +27,32 @@ type Store interface { } type DepositManager struct { - store Store - evtMgr events.EventManager - bidderRegistry BidderRegistryContract - deposits chan *bidderregistry.BidderregistryBidderDeposited - withdrawRequests chan *bidderregistry.BidderregistryWithdrawalRequested - withdrawals chan *bidderregistry.BidderregistryBidderWithdrawal - logger *slog.Logger + store Store + evtMgr events.EventManager + bidderRegistry BidderRegistryContract + deposits chan *bidderregistry.BidderregistryBidderDeposited + withdrawRequests chan *bidderregistry.BidderregistryWithdrawalRequested + withdrawals chan *bidderregistry.BidderregistryBidderWithdrawal + thisProviderAddress common.Address + logger *slog.Logger } func NewDepositManager( store Store, evtMgr events.EventManager, bidderRegistry BidderRegistryContract, + thisProviderAddress common.Address, logger *slog.Logger, ) *DepositManager { return &DepositManager{ - store: store, - bidderRegistry: bidderRegistry, - deposits: make(chan *bidderregistry.BidderregistryBidderDeposited), - withdrawRequests: make(chan *bidderregistry.BidderregistryWithdrawalRequested), - withdrawals: make(chan *bidderregistry.BidderregistryBidderWithdrawal), - evtMgr: evtMgr, - logger: logger, + store: store, + bidderRegistry: bidderRegistry, + deposits: make(chan *bidderregistry.BidderregistryBidderDeposited), + withdrawRequests: make(chan *bidderregistry.BidderregistryWithdrawalRequested), + withdrawals: make(chan *bidderregistry.BidderregistryBidderWithdrawal), + evtMgr: evtMgr, + thisProviderAddress: thisProviderAddress, + logger: logger, } } @@ -117,6 +120,10 @@ func (dm *DepositManager) Start(ctx context.Context) <-chan struct{} { return nil case deposit := <-dm.deposits: + if deposit.Provider != dm.thisProviderAddress { + dm.logger.Debug("ignoring deposit event for different provider", "provider", deposit.Provider) + continue + } currentBalance, err := dm.store.GetBalance(deposit.Bidder, deposit.Provider) if err != nil { dm.logger.Error("getting balance", "error", err) @@ -145,6 +152,10 @@ func (dm *DepositManager) Start(ctx context.Context) <-chan struct{} { ) } case withdrawalRequest := <-dm.withdrawRequests: + if withdrawalRequest.Provider != dm.thisProviderAddress { + dm.logger.Debug("ignoring withdrawal request event for different provider", "provider", withdrawalRequest.Provider) + continue + } if err := dm.store.DeleteBalance(withdrawalRequest.Bidder, withdrawalRequest.Provider); err != nil { dm.logger.Error("deleting balance", "error", err) return err @@ -155,6 +166,10 @@ func (dm *DepositManager) Start(ctx context.Context) <-chan struct{} { ) case withdrawal := <-dm.withdrawals: + if withdrawal.Provider != dm.thisProviderAddress { + dm.logger.Debug("ignoring withdrawal event for different provider", "provider", withdrawal.Provider) + continue + } if err := dm.store.DeleteBalance(withdrawal.Bidder, withdrawal.Provider); err != nil { dm.logger.Error("deleting balance", "error", err) return err diff --git a/p2p/pkg/depositmanager/deposit_test.go b/p2p/pkg/depositmanager/deposit_test.go index 3d2e5d0b2..6585940f7 100644 --- a/p2p/pkg/depositmanager/deposit_test.go +++ b/p2p/pkg/depositmanager/deposit_test.go @@ -1,6 +1,7 @@ package depositmanager_test import ( + "bytes" "context" "io" "math/big" @@ -62,7 +63,9 @@ func TestDepositManager(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) - dm := depositmanager.NewDepositManager(st, evtMgr, bidderRegistry, logger) + providerAddress := common.HexToAddress("0x456") + + dm := depositmanager.NewDepositManager(st, evtMgr, bidderRegistry, providerAddress, logger) done := dm.Start(ctx) // no deposit @@ -248,7 +251,9 @@ func TestStartWithBidderAlreadyDeposited(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) - dm := depositmanager.NewDepositManager(st, evtMgr, bidderRegistry, logger) + providerAddress := common.HexToAddress("0x456") + + dm := depositmanager.NewDepositManager(st, evtMgr, bidderRegistry, providerAddress, logger) done := dm.Start(ctx) err = publishBidderDeposited(evtMgr, &brABI, &bidderregistry.BidderregistryBidderDeposited{ @@ -278,6 +283,101 @@ func TestStartWithBidderAlreadyDeposited(t *testing.T) { <-done } +func TestOtherProvidersEventsAreIgnored(t *testing.T) { + t.Parallel() + + brABI, err := abi.JSON(strings.NewReader(bidderregistry.BidderregistryABI)) + if err != nil { + t.Fatal(err) + } + + btABI, err := abi.JSON(strings.NewReader(blocktracker.BlocktrackerABI)) + if err != nil { + t.Fatal(err) + } + + var logBuf bytes.Buffer + logger := util.NewTestLogger(&logBuf) + evtMgr := events.NewListener(logger, &btABI, &brABI) + + st := depositstore.New(inmemstorage.New()) + bidderRegistry := &MockBidderRegistryContract{ + GetDepositConsideringWithdrawalRequestFunc: func( + opts *bind.CallOpts, + bidder common.Address, + provider common.Address, + ) (*big.Int, error) { + return big.NewInt(0), nil + }, + } + + ctx, cancel := context.WithCancel(context.Background()) + + providerAddress := common.HexToAddress("0x456") + + dm := depositmanager.NewDepositManager(st, evtMgr, bidderRegistry, providerAddress, logger) + done := dm.Start(ctx) + + differentProvider := common.HexToAddress("0x789") + + err = publishBidderDeposited(evtMgr, &brABI, &bidderregistry.BidderregistryBidderDeposited{ + Bidder: common.HexToAddress("0x123"), + Provider: differentProvider, + DepositedAmount: big.NewInt(100), + }) + if err != nil { + t.Fatal(err) + } + + err = publishBidderWithdrawalRequested(evtMgr, &brABI, &bidderregistry.BidderregistryWithdrawalRequested{ + Bidder: common.HexToAddress("0x123"), + Provider: differentProvider, + AvailableAmount: big.NewInt(100), + EscrowedAmount: big.NewInt(100), + Timestamp: big.NewInt(1000), + }) + if err != nil { + t.Fatal(err) + } + + err = publishBidderWithdrawal(evtMgr, &brABI, &bidderregistry.BidderregistryBidderWithdrawal{ + Bidder: common.HexToAddress("0x123"), + Provider: differentProvider, + AmountWithdrawn: big.NewInt(100), + AmountStillEscrowed: big.NewInt(100), + }) + if err != nil { + t.Fatal(err) + } + + type seen struct { + deposit bool + withdrawalRequest bool + withdrawal bool + } + haveSeen := seen{} + + deadline := time.Now().Add(5 * time.Second) + for time.Now().Before(deadline) { + if strings.Contains(logBuf.String(), "ignoring deposit event for different provider") { + haveSeen.deposit = true + } + if strings.Contains(logBuf.String(), "ignoring withdrawal request event for different provider") { + haveSeen.withdrawalRequest = true + } + if strings.Contains(logBuf.String(), "ignoring withdrawal event for different provider") { + haveSeen.withdrawal = true + } + time.Sleep(1 * time.Second) + } + if !haveSeen.deposit || !haveSeen.withdrawalRequest || !haveSeen.withdrawal { + t.Fatal("expected all events to be seen, but got ", haveSeen) + } + + cancel() + <-done +} + func publishBidderDeposited( evtMgr events.EventManager, brABI *abi.ABI, diff --git a/p2p/pkg/node/node.go b/p2p/pkg/node/node.go index 218e9aa9e..062346354 100644 --- a/p2p/pkg/node/node.go +++ b/p2p/pkg/node/node.go @@ -572,6 +572,7 @@ func NewNode(opts *Options) (*Node, error) { depositmanagerstore.New(store), evtMgr, bidderRegistry, + opts.KeySigner.GetAddress(), opts.Logger.With("component", "depositmanager"), ) startables = append( From ae097ef7552f67a5a7f81a2e4a5cb62f71e360ea Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Sat, 30 Aug 2025 13:15:59 -0700 Subject: [PATCH 114/117] Update deposit_test.go --- p2p/pkg/depositmanager/deposit_test.go | 32 +++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/p2p/pkg/depositmanager/deposit_test.go b/p2p/pkg/depositmanager/deposit_test.go index 6585940f7..4495d6ea6 100644 --- a/p2p/pkg/depositmanager/deposit_test.go +++ b/p2p/pkg/depositmanager/deposit_test.go @@ -6,6 +6,7 @@ import ( "io" "math/big" "strings" + "sync" "testing" "time" @@ -296,7 +297,7 @@ func TestOtherProvidersEventsAreIgnored(t *testing.T) { t.Fatal(err) } - var logBuf bytes.Buffer + var logBuf SafeBuffer logger := util.NewTestLogger(&logBuf) evtMgr := events.NewListener(logger, &btABI, &brABI) @@ -378,6 +379,35 @@ func TestOtherProvidersEventsAreIgnored(t *testing.T) { <-done } +type SafeBuffer struct { + mu sync.RWMutex + buf bytes.Buffer +} + +func (b *SafeBuffer) Write(p []byte) (int, error) { + b.mu.Lock() + defer b.mu.Unlock() + return b.buf.Write(p) +} + +func (b *SafeBuffer) String() string { + b.mu.RLock() + defer b.mu.RUnlock() + return b.buf.String() +} + +func (b *SafeBuffer) Reset() { + b.mu.Lock() + defer b.mu.Unlock() + b.buf.Reset() +} + +func (b *SafeBuffer) Bytes() []byte { + b.mu.RLock() + defer b.mu.RUnlock() + return append([]byte(nil), b.buf.Bytes()...) +} + func publishBidderDeposited( evtMgr events.EventManager, brABI *abi.ABI, From bf45d45772b771fd4ebefbb53dbbdf5136a3f919 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Sat, 30 Aug 2025 13:17:48 -0700 Subject: [PATCH 115/117] Update deposit_test.go --- p2p/pkg/depositmanager/deposit_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/p2p/pkg/depositmanager/deposit_test.go b/p2p/pkg/depositmanager/deposit_test.go index 4495d6ea6..ca592044a 100644 --- a/p2p/pkg/depositmanager/deposit_test.go +++ b/p2p/pkg/depositmanager/deposit_test.go @@ -297,8 +297,8 @@ func TestOtherProvidersEventsAreIgnored(t *testing.T) { t.Fatal(err) } - var logBuf SafeBuffer - logger := util.NewTestLogger(&logBuf) + logBuf := &SafeBuffer{} + logger := util.NewTestLogger(logBuf) evtMgr := events.NewListener(logger, &btABI, &brABI) st := depositstore.New(inmemstorage.New()) From 6f38683ee7c9446bd099ad0f3cac9d2524fbaa50 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Sun, 31 Aug 2025 00:09:09 -0700 Subject: [PATCH 116/117] fix: provider side deposit cache (#767) --- p2p/pkg/depositmanager/deposit.go | 77 +++++++--- p2p/pkg/depositmanager/deposit_test.go | 16 +- p2p/pkg/depositmanager/store/store.go | 21 ++- p2p/pkg/depositmanager/store/store_test.go | 33 ++-- p2p/pkg/node/node.go | 22 +-- p2p/pkg/node/store.go | 52 +++++++ p2p/pkg/node/store_test.go | 63 ++++++++ p2p/pkg/notifications/notifications.go | 2 + p2p/pkg/preconfirmation/preconfirmation.go | 17 ++- .../preconfirmation/preconfirmation_test.go | 1 - p2p/pkg/preconfirmation/store/store.go | 10 +- p2p/pkg/preconfirmation/tracker/tracker.go | 19 +++ .../preconfirmation/tracker/tracker_test.go | 143 ++++++++++++++++++ 13 files changed, 383 insertions(+), 93 deletions(-) create mode 100644 p2p/pkg/node/store.go create mode 100644 p2p/pkg/node/store_test.go diff --git a/p2p/pkg/depositmanager/deposit.go b/p2p/pkg/depositmanager/deposit.go index 4ea43d730..8404b10ea 100644 --- a/p2p/pkg/depositmanager/deposit.go +++ b/p2p/pkg/depositmanager/deposit.go @@ -9,6 +9,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" bidderregistry "github.com/primev/mev-commit/contracts-abi/clients/BidderRegistry" + "github.com/primev/mev-commit/p2p/pkg/notifications" "github.com/primev/mev-commit/x/contracts/events" "golang.org/x/sync/errgroup" "google.golang.org/grpc/codes" @@ -20,15 +21,16 @@ type BidderRegistryContract interface { } type Store interface { - GetBalance(bidder common.Address, provider common.Address) (*big.Int, error) - SetBalance(bidder common.Address, provider common.Address, balance *big.Int) error - DeleteBalance(bidder common.Address, provider common.Address) error - RefundBalanceIfExists(bidder common.Address, provider common.Address, amount *big.Int) error + GetBalance(bidder common.Address) (*big.Int, error) + SetBalance(bidder common.Address, balance *big.Int) error + DeleteBalance(bidder common.Address) error + RefundBalanceIfExists(bidder common.Address, amount *big.Int) error } type DepositManager struct { store Store evtMgr events.EventManager + notifiee notifications.Notifiee bidderRegistry BidderRegistryContract deposits chan *bidderregistry.BidderregistryBidderDeposited withdrawRequests chan *bidderregistry.BidderregistryWithdrawalRequested @@ -40,12 +42,14 @@ type DepositManager struct { func NewDepositManager( store Store, evtMgr events.EventManager, + notifiee notifications.Notifiee, bidderRegistry BidderRegistryContract, thisProviderAddress common.Address, logger *slog.Logger, ) *DepositManager { return &DepositManager{ store: store, + notifiee: notifiee, bidderRegistry: bidderRegistry, deposits: make(chan *bidderregistry.BidderregistryBidderDeposited), withdrawRequests: make(chan *bidderregistry.BidderregistryWithdrawalRequested), @@ -61,6 +65,11 @@ func (dm *DepositManager) Start(ctx context.Context) <-chan struct{} { eg, egCtx := errgroup.WithContext(ctx) + notifCh := dm.notifiee.Subscribe( + notifications.TopicCommitmentStoreFailed, + notifications.TopicOtherProviderWonBlock, + ) + ev1 := events.NewEventHandler( "BidderDeposited", func(bidderDeposit *bidderregistry.BidderregistryBidderDeposited) { @@ -103,6 +112,11 @@ func (dm *DepositManager) Start(ctx context.Context) <-chan struct{} { eg.Go(func() error { defer sub.Unsubscribe() + defer func() { + unsubDone := dm.notifiee.Unsubscribe(notifCh) + <-unsubDone + }() + select { case <-egCtx.Done(): dm.logger.Info("event subscription context done") @@ -119,18 +133,42 @@ func (dm *DepositManager) Start(ctx context.Context) <-chan struct{} { dm.logger.Info("deposit manager context done") return nil + case n := <-notifCh: + topic := n.Topic() + if topic != notifications.TopicOtherProviderWonBlock && topic != notifications.TopicCommitmentStoreFailed { + dm.logger.Debug("ignoring notification for topic", "topic", topic) + continue + } + + val := n.Value() + bidderHex := val["bidder"].(string) + bidAmount := val["bidAmount"].(string) + + bidder := common.HexToAddress(bidderHex) + bidAmountInt, ok := new(big.Int).SetString(bidAmount, 10) + if !ok { + dm.logger.Error("failed to parse bid amount", "bidAmount", bidAmount) + continue + } + + if err := dm.store.RefundBalanceIfExists(bidder, bidAmountInt); err != nil { + dm.logger.Error("refunding balance", "error", err) + return err + } + dm.logger.Info("refunded balance from notification", "bidder", bidder, "bidAmount", bidAmountInt) + case deposit := <-dm.deposits: if deposit.Provider != dm.thisProviderAddress { dm.logger.Debug("ignoring deposit event for different provider", "provider", deposit.Provider) continue } - currentBalance, err := dm.store.GetBalance(deposit.Bidder, deposit.Provider) + currentBalance, err := dm.store.GetBalance(deposit.Bidder) if err != nil { dm.logger.Error("getting balance", "error", err) return err } if currentBalance == nil { - if err := dm.store.SetBalance(deposit.Bidder, deposit.Provider, deposit.NewAvailableAmount); err != nil { + if err := dm.store.SetBalance(deposit.Bidder, deposit.NewAvailableAmount); err != nil { dm.logger.Error("setting balance", "error", err) return err } @@ -141,7 +179,7 @@ func (dm *DepositManager) Start(ctx context.Context) <-chan struct{} { ) } else { newBalance := new(big.Int).Add(currentBalance, deposit.DepositedAmount) - if err := dm.store.SetBalance(deposit.Bidder, deposit.Provider, newBalance); err != nil { + if err := dm.store.SetBalance(deposit.Bidder, newBalance); err != nil { dm.logger.Error("setting balance", "error", err) return err } @@ -156,7 +194,7 @@ func (dm *DepositManager) Start(ctx context.Context) <-chan struct{} { dm.logger.Debug("ignoring withdrawal request event for different provider", "provider", withdrawalRequest.Provider) continue } - if err := dm.store.DeleteBalance(withdrawalRequest.Bidder, withdrawalRequest.Provider); err != nil { + if err := dm.store.DeleteBalance(withdrawalRequest.Bidder); err != nil { dm.logger.Error("deleting balance", "error", err) return err } @@ -170,7 +208,7 @@ func (dm *DepositManager) Start(ctx context.Context) <-chan struct{} { dm.logger.Debug("ignoring withdrawal event for different provider", "provider", withdrawal.Provider) continue } - if err := dm.store.DeleteBalance(withdrawal.Bidder, withdrawal.Provider); err != nil { + if err := dm.store.DeleteBalance(withdrawal.Bidder); err != nil { dm.logger.Error("deleting balance", "error", err) return err } @@ -194,7 +232,6 @@ func (dm *DepositManager) Start(ctx context.Context) <-chan struct{} { func (dm *DepositManager) CheckAndDeductDeposit( ctx context.Context, bidderAddr common.Address, - providerAddr common.Address, bidAmountStr string, ) (func() error, error) { bidAmount, ok := new(big.Int).SetString(bidAmountStr, 10) @@ -203,7 +240,7 @@ func (dm *DepositManager) CheckAndDeductDeposit( return nil, status.Errorf(codes.InvalidArgument, "failed to parse bid amount") } - balance, err := dm.store.GetBalance(bidderAddr, providerAddr) + balance, err := dm.store.GetBalance(bidderAddr) if err != nil { dm.logger.Error("getting balance", "error", err) return nil, status.Errorf(codes.Internal, "failed to get balance: %v", err) @@ -216,28 +253,28 @@ func (dm *DepositManager) CheckAndDeductDeposit( return nil, status.Errorf(codes.FailedPrecondition, "insufficient balance") } - if err := dm.store.SetBalance(bidderAddr, providerAddr, newBalance); err != nil { + if err := dm.store.SetBalance(bidderAddr, newBalance); err != nil { dm.logger.Error("setting balance", "error", err) return nil, status.Errorf(codes.Internal, "failed to set balance: %v", err) } return func() error { - return dm.store.RefundBalanceIfExists(bidderAddr, providerAddr, bidAmount) + return dm.store.RefundBalanceIfExists(bidderAddr, bidAmount) }, nil } dm.logger.Info("balance not found in store, defaulting to contract call", "bidder", bidderAddr.Hex(), - "provider", providerAddr.Hex(), + "provider", dm.thisProviderAddress.Hex(), ) - defaultBalance, err := dm.getDefaultBalance(ctx, bidderAddr, providerAddr, nil) // nil for latest block + defaultBalance, err := dm.getDefaultBalance(ctx, bidderAddr, dm.thisProviderAddress, nil) // nil for latest block if err != nil { return nil, err } if defaultBalance == nil { - dm.logger.Error("bidder balance not found", "bidder", bidderAddr.Hex(), "provider", providerAddr.Hex()) + dm.logger.Error("bidder balance not found", "bidder", bidderAddr.Hex(), "provider", dm.thisProviderAddress.Hex()) return nil, status.Errorf(codes.FailedPrecondition, - "balance not found for bidder %s and provider %s", bidderAddr.Hex(), providerAddr.Hex()) + "balance not found for bidder %s and provider %s", bidderAddr.Hex(), dm.thisProviderAddress.Hex()) } if defaultBalance.Cmp(bidAmount) < 0 { @@ -246,13 +283,13 @@ func (dm *DepositManager) CheckAndDeductDeposit( } newBalance := new(big.Int).Sub(defaultBalance, bidAmount) - if err := dm.store.SetBalance(bidderAddr, providerAddr, newBalance); err != nil { + if err := dm.store.SetBalance(bidderAddr, newBalance); err != nil { dm.logger.Error("setting balance for block", "error", err) return nil, status.Errorf(codes.Internal, "failed to set balance for block: %v", err) } return func() error { - return dm.store.RefundBalanceIfExists(bidderAddr, providerAddr, bidAmount) + return dm.store.RefundBalanceIfExists(bidderAddr, bidAmount) }, nil } @@ -276,7 +313,7 @@ func (dm *DepositManager) getDefaultBalance( } if balance.Cmp(big.NewInt(0)) > 0 { - if err := dm.store.SetBalance(bidderAddr, providerAddr, balance); err != nil { + if err := dm.store.SetBalance(bidderAddr, balance); err != nil { dm.logger.Error("setting balance", "error", err) return nil, status.Errorf(codes.Internal, "failed to set balance: %v", err) } diff --git a/p2p/pkg/depositmanager/deposit_test.go b/p2p/pkg/depositmanager/deposit_test.go index ca592044a..4dff9707d 100644 --- a/p2p/pkg/depositmanager/deposit_test.go +++ b/p2p/pkg/depositmanager/deposit_test.go @@ -18,6 +18,7 @@ import ( blocktracker "github.com/primev/mev-commit/contracts-abi/clients/BlockTracker" "github.com/primev/mev-commit/p2p/pkg/depositmanager" depositstore "github.com/primev/mev-commit/p2p/pkg/depositmanager/store" + "github.com/primev/mev-commit/p2p/pkg/notifications" inmemstorage "github.com/primev/mev-commit/p2p/pkg/storage/inmem" "github.com/primev/mev-commit/x/contracts/events" "github.com/primev/mev-commit/x/util" @@ -66,14 +67,13 @@ func TestDepositManager(t *testing.T) { providerAddress := common.HexToAddress("0x456") - dm := depositmanager.NewDepositManager(st, evtMgr, bidderRegistry, providerAddress, logger) + dm := depositmanager.NewDepositManager(st, evtMgr, notifications.New(10), bidderRegistry, providerAddress, logger) done := dm.Start(ctx) // no deposit refund, err := dm.CheckAndDeductDeposit( context.Background(), common.HexToAddress("0x123"), - common.HexToAddress("0x456"), "10", ) if err == nil { @@ -98,7 +98,6 @@ func TestDepositManager(t *testing.T) { for { if val, err := st.GetBalance( common.HexToAddress("0x123"), - common.HexToAddress("0x456"), ); err == nil && val != nil && val.Cmp(big.NewInt(100)) == 0 { break } @@ -109,7 +108,6 @@ func TestDepositManager(t *testing.T) { refund, err = dm.CheckAndDeductDeposit( context.Background(), common.HexToAddress("0x123"), - common.HexToAddress("0x456"), "100", ) if err != nil { @@ -120,7 +118,6 @@ func TestDepositManager(t *testing.T) { _, err = dm.CheckAndDeductDeposit( context.Background(), common.HexToAddress("0x123"), - common.HexToAddress("0x456"), "10", ) if err == nil || !strings.Contains(err.Error(), "insufficient balance") { @@ -136,7 +133,6 @@ func TestDepositManager(t *testing.T) { _, err = dm.CheckAndDeductDeposit( context.Background(), common.HexToAddress("0x123"), - common.HexToAddress("0x456"), "10", ) if err != nil { @@ -145,7 +141,6 @@ func TestDepositManager(t *testing.T) { balance, err := st.GetBalance( common.HexToAddress("0x123"), - common.HexToAddress("0x456"), ) if err != nil { t.Fatal(err) @@ -168,7 +163,6 @@ func TestDepositManager(t *testing.T) { for { if val, err := st.GetBalance( common.HexToAddress("0x123"), - common.HexToAddress("0x456"), ); err == nil && val == nil { break } @@ -209,7 +203,6 @@ func TestDepositManager(t *testing.T) { for { if val, err := st.GetBalance( common.HexToAddress("0x123"), - common.HexToAddress("0x456"), ); err == nil && val != nil && val.Cmp(big.NewInt(777)) == 0 { break } @@ -254,7 +247,7 @@ func TestStartWithBidderAlreadyDeposited(t *testing.T) { providerAddress := common.HexToAddress("0x456") - dm := depositmanager.NewDepositManager(st, evtMgr, bidderRegistry, providerAddress, logger) + dm := depositmanager.NewDepositManager(st, evtMgr, notifications.New(10), bidderRegistry, providerAddress, logger) done := dm.Start(ctx) err = publishBidderDeposited(evtMgr, &brABI, &bidderregistry.BidderregistryBidderDeposited{ @@ -273,7 +266,6 @@ func TestStartWithBidderAlreadyDeposited(t *testing.T) { for { if val, err := st.GetBalance( common.HexToAddress("0x123"), - common.HexToAddress("0x456"), ); err == nil && val != nil && val.Cmp(big.NewInt(133)) == 0 { break } @@ -316,7 +308,7 @@ func TestOtherProvidersEventsAreIgnored(t *testing.T) { providerAddress := common.HexToAddress("0x456") - dm := depositmanager.NewDepositManager(st, evtMgr, bidderRegistry, providerAddress, logger) + dm := depositmanager.NewDepositManager(st, evtMgr, notifications.New(10), bidderRegistry, providerAddress, logger) done := dm.Start(ctx) differentProvider := common.HexToAddress("0x789") diff --git a/p2p/pkg/depositmanager/store/store.go b/p2p/pkg/depositmanager/store/store.go index a5de60770..d06782d78 100644 --- a/p2p/pkg/depositmanager/store/store.go +++ b/p2p/pkg/depositmanager/store/store.go @@ -17,8 +17,8 @@ const ( ) var ( - balanceKey = func(bidder common.Address, provider common.Address) string { - return fmt.Sprintf("%s%s/%s", balanceNS, bidder, provider) + balanceKey = func(bidder common.Address) string { + return fmt.Sprintf("%s%s", balanceNS, bidder) } balancePrefix = func(bidder common.Address) string { return fmt.Sprintf("%s%s", balanceNS, bidder) @@ -36,18 +36,18 @@ func New(st storage.Storage) *Store { } } -func (s *Store) SetBalance(bidder common.Address, provider common.Address, depositedAmount *big.Int) error { +func (s *Store) SetBalance(bidder common.Address, depositedAmount *big.Int) error { s.mu.Lock() defer s.mu.Unlock() - return s.st.Put(balanceKey(bidder, provider), depositedAmount.Bytes()) + return s.st.Put(balanceKey(bidder), depositedAmount.Bytes()) } -func (s *Store) GetBalance(bidder common.Address, provider common.Address) (*big.Int, error) { +func (s *Store) GetBalance(bidder common.Address) (*big.Int, error) { s.mu.RLock() defer s.mu.RUnlock() - val, err := s.st.Get(balanceKey(bidder, provider)) + val, err := s.st.Get(balanceKey(bidder)) switch { case errors.Is(err, storage.ErrKeyNotFound): return nil, nil @@ -58,21 +58,20 @@ func (s *Store) GetBalance(bidder common.Address, provider common.Address) (*big return new(big.Int).SetBytes(val), nil } -func (s *Store) DeleteBalance(bidder common.Address, provider common.Address) error { +func (s *Store) DeleteBalance(bidder common.Address) error { s.mu.Lock() defer s.mu.Unlock() - return s.st.Delete(balanceKey(bidder, provider)) + return s.st.Delete(balanceKey(bidder)) } func (s *Store) RefundBalanceIfExists( bidder common.Address, - provider common.Address, amount *big.Int, ) error { s.mu.Lock() defer s.mu.Unlock() - val, err := s.st.Get(balanceKey(bidder, provider)) + val, err := s.st.Get(balanceKey(bidder)) switch { case errors.Is(err, storage.ErrKeyNotFound): return status.Errorf(codes.FailedPrecondition, "balance not found, no refund needed") @@ -81,7 +80,7 @@ func (s *Store) RefundBalanceIfExists( } newAmount := new(big.Int).Add(new(big.Int).SetBytes(val), amount) - return s.st.Put(balanceKey(bidder, provider), newAmount.Bytes()) + return s.st.Put(balanceKey(bidder), newAmount.Bytes()) } func (s *Store) BalanceEntries(bidder common.Address) (int, error) { diff --git a/p2p/pkg/depositmanager/store/store_test.go b/p2p/pkg/depositmanager/store/store_test.go index 5c11c64b6..ed3253159 100644 --- a/p2p/pkg/depositmanager/store/store_test.go +++ b/p2p/pkg/depositmanager/store/store_test.go @@ -15,15 +15,14 @@ func TestStore_SetBalance(t *testing.T) { s := store.New(st) bidder := common.HexToAddress("0x123") - provider := common.HexToAddress("0x456") depositedAmount := big.NewInt(10) - err := s.SetBalance(bidder, provider, depositedAmount) + err := s.SetBalance(bidder, depositedAmount) if err != nil { t.Fatal(err) } - val, err := s.GetBalance(bidder, provider) + val, err := s.GetBalance(bidder) if err != nil { t.Fatal(err) } @@ -37,15 +36,14 @@ func TestStore_GetBalance(t *testing.T) { s := store.New(st) bidder := common.HexToAddress("0x123") - provider := common.HexToAddress("0x456") depositedAmount := big.NewInt(10) - err := s.SetBalance(bidder, provider, depositedAmount) + err := s.SetBalance(bidder, depositedAmount) if err != nil { t.Fatal(err) } - val, err := s.GetBalance(bidder, provider) + val, err := s.GetBalance(bidder) if err != nil { t.Fatal(err) } @@ -59,9 +57,8 @@ func TestStore_GetBalance_NoBalance(t *testing.T) { s := store.New(st) bidder := common.HexToAddress("0x123") - provider := common.HexToAddress("0x456") - val, err := s.GetBalance(bidder, provider) + val, err := s.GetBalance(bidder) if err != nil { t.Fatal(err) } @@ -75,10 +72,9 @@ func TestStore_RefundBalanceIfExists(t *testing.T) { s := store.New(st) bidder := common.HexToAddress("0x123") - provider := common.HexToAddress("0x456") amount := big.NewInt(20) - err := s.RefundBalanceIfExists(bidder, provider, amount) + err := s.RefundBalanceIfExists(bidder, amount) if err == nil { t.Fatal("expected error, got nil") } @@ -86,18 +82,18 @@ func TestStore_RefundBalanceIfExists(t *testing.T) { t.Fatalf("expected error containing 'balance not found, no refund needed', got %v", err) } - err = s.SetBalance(bidder, provider, amount) + err = s.SetBalance(bidder, amount) if err != nil { t.Fatal(err) } - refundAmount := big.NewInt(5) - err = s.RefundBalanceIfExists(bidder, provider, refundAmount) + increaseAmount := big.NewInt(5) + err = s.RefundBalanceIfExists(bidder, increaseAmount) if err != nil { t.Fatal(err) } - val, err := s.GetBalance(bidder, provider) + val, err := s.GetBalance(bidder) if err != nil { t.Fatal(err) } @@ -112,15 +108,14 @@ func TestStore_DeleteBalance(t *testing.T) { s := store.New(st) bidder := common.HexToAddress("0x123") - provider := common.HexToAddress("0x456") depositedAmount := big.NewInt(10) - err := s.SetBalance(bidder, provider, depositedAmount) + err := s.SetBalance(bidder, depositedAmount) if err != nil { t.Fatal(err) } - val, err := s.GetBalance(bidder, provider) + val, err := s.GetBalance(bidder) if err != nil { t.Fatal(err) } @@ -128,12 +123,12 @@ func TestStore_DeleteBalance(t *testing.T) { t.Fatalf("expected %s, got %s", depositedAmount.String(), val.String()) } - err = s.DeleteBalance(bidder, provider) + err = s.DeleteBalance(bidder) if err != nil { t.Fatal(err) } - val, err = s.GetBalance(bidder, provider) + val, err = s.GetBalance(bidder) if err != nil { t.Fatal(err) } diff --git a/p2p/pkg/node/node.go b/p2p/pkg/node/node.go index 062346354..2da591e6c 100644 --- a/p2p/pkg/node/node.go +++ b/p2p/pkg/node/node.go @@ -11,7 +11,6 @@ import ( "net" "net/http" "strings" - "sync/atomic" "time" "github.com/bufbuild/protovalidate-go" @@ -167,8 +166,6 @@ func NewNode(opts *Options) (*Node, error) { } } - progressstore := &progressStore{contractRPC: contractRPC} - chainID, err := contractRPC.ChainID(context.Background()) if err != nil { opts.Logger.Error("failed to get chain ID", "error", err) @@ -219,6 +216,8 @@ func NewNode(opts *Options) (*Node, error) { } nd.closers = append(nd.closers, store) + progressstore := NewDurableProgressStore(store, contractRPC) + contracts, err := getContractABIs(opts) if err != nil { opts.Logger.Error("failed to get contract ABIs", "error", err) @@ -571,6 +570,7 @@ func NewNode(opts *Options) (*Node, error) { depositMgr = depositmanager.NewDepositManager( depositmanagerstore.New(store), evtMgr, + notificationsSvc, bidderRegistry, opts.KeySigner.GetAddress(), opts.Logger.With("component", "depositmanager"), @@ -937,7 +937,7 @@ func (noOpBidProcessor) ProcessBid( type noOpDepositManager struct{} -func (noOpDepositManager) CheckAndDeductDeposit(_ context.Context, _ common.Address, _ common.Address, _ string) (func() error, error) { +func (noOpDepositManager) CheckAndDeductDeposit(_ context.Context, _ common.Address, _ string) (func() error, error) { return func() error { return nil }, nil } @@ -981,20 +981,6 @@ func (f StartableFunc) Start(ctx context.Context) <-chan struct{} { return f(ctx) } -type progressStore struct { - contractRPC *ethclient.Client - lastBlock atomic.Uint64 -} - -func (p *progressStore) LastBlock() (uint64, error) { - return p.contractRPC.BlockNumber(context.Background()) -} - -func (p *progressStore) SetLastBlock(block uint64) error { - p.lastBlock.Store(block) - return nil -} - func setDefault(field *string, defaultValue string) { if *field == "" { *field = defaultValue diff --git a/p2p/pkg/node/store.go b/p2p/pkg/node/store.go new file mode 100644 index 000000000..e689d556b --- /dev/null +++ b/p2p/pkg/node/store.go @@ -0,0 +1,52 @@ +package node + +import ( + "context" + "encoding/binary" + "errors" + "fmt" + + "github.com/primev/mev-commit/p2p/pkg/storage" +) + +const ( + progressNS = "p2progress/" + progressLastBlockKey = progressNS + "last_block" +) + +type DurableProgressStore struct { + contractRPC ContractRPC + kv storage.Storage +} + +type ContractRPC interface { + BlockNumber(ctx context.Context) (uint64, error) +} + +func NewDurableProgressStore(kv storage.Storage, contractRPC ContractRPC) *DurableProgressStore { + return &DurableProgressStore{ + contractRPC: contractRPC, + kv: kv, + } +} + +func (p *DurableProgressStore) LastBlock() (uint64, error) { + buf, err := p.kv.Get(progressLastBlockKey) + switch { + case err == nil: + if len(buf) != 8 { + return 0, fmt.Errorf("invalid %q length: got %d, want 8", progressLastBlockKey, len(buf)) + } + return binary.BigEndian.Uint64(buf), nil + case errors.Is(err, storage.ErrKeyNotFound): + return p.contractRPC.BlockNumber(context.Background()) + default: + return 0, err + } +} + +func (p *DurableProgressStore) SetLastBlock(block uint64) error { + var b [8]byte + binary.BigEndian.PutUint64(b[:], block) + return p.kv.Put(progressLastBlockKey, b[:]) +} diff --git a/p2p/pkg/node/store_test.go b/p2p/pkg/node/store_test.go new file mode 100644 index 000000000..376c0f7c3 --- /dev/null +++ b/p2p/pkg/node/store_test.go @@ -0,0 +1,63 @@ +package node + +import ( + "context" + "encoding/binary" + "testing" + + inmem "github.com/primev/mev-commit/p2p/pkg/storage/inmem" +) + +type mockContractRPC struct { + blockNumber uint64 +} + +func (m *mockContractRPC) BlockNumber(ctx context.Context) (uint64, error) { + return m.blockNumber, nil +} + +func TestDurableProgressStore_LastBlock_FallbackToRPCWhenUnset(t *testing.T) { + kv := inmem.New() + mockRPC := &mockContractRPC{blockNumber: 12345} + + ps := NewDurableProgressStore(kv, mockRPC) + + got, err := ps.LastBlock() + if err != nil { + t.Fatalf("LastBlock: %v", err) + } + if got != 12345 { + t.Fatalf("LastBlock fallback mismatch: got %d want %d", got, 12345) + } +} + +func TestDurableProgressStore_SetAndGet(t *testing.T) { + kv := inmem.New() + mockRPC := &mockContractRPC{blockNumber: 0} + + ps := NewDurableProgressStore(kv, mockRPC) + + want := uint64(9876543210) + if err := ps.SetLastBlock(want); err != nil { + t.Fatalf("SetLastBlock: %v", err) + } + + got, err := ps.LastBlock() + if err != nil { + t.Fatalf("LastBlock: %v", err) + } + if got != uint64(9876543210) { + t.Fatalf("LastBlock persisted mismatch: got %d want %d", got, want) + } + + raw, err := kv.Get(progressLastBlockKey) + if err != nil { + t.Fatalf("kv.Get: %v", err) + } + if len(raw) != 8 { + t.Fatalf("stored length mismatch: got %d want 8", len(raw)) + } + if binary.BigEndian.Uint64(raw) != uint64(9876543210) { + t.Fatalf("stored value mismatch: got %d want %d", binary.BigEndian.Uint64(raw), want) + } +} diff --git a/p2p/pkg/notifications/notifications.go b/p2p/pkg/notifications/notifications.go index 023be5c16..33ad22445 100644 --- a/p2p/pkg/notifications/notifications.go +++ b/p2p/pkg/notifications/notifications.go @@ -17,6 +17,7 @@ const ( TopicProviderDeregistered Topic = "provider_deregistered" TopicCommitmentStoreFailed Topic = "commitment_store_failed" TopicCommitmentOpenFailed Topic = "commitment_open_failed" + TopicOtherProviderWonBlock Topic = "other_provider_won_block" ) var validTopic = map[Topic]struct{}{ @@ -30,6 +31,7 @@ var validTopic = map[Topic]struct{}{ TopicProviderDeregistered: {}, TopicCommitmentStoreFailed: {}, TopicCommitmentOpenFailed: {}, + TopicOtherProviderWonBlock: {}, } func IsTopicValid(topic Topic) bool { diff --git a/p2p/pkg/preconfirmation/preconfirmation.go b/p2p/pkg/preconfirmation/preconfirmation.go index 85c5de565..d6d1c2b21 100644 --- a/p2p/pkg/preconfirmation/preconfirmation.go +++ b/p2p/pkg/preconfirmation/preconfirmation.go @@ -4,6 +4,7 @@ import ( "context" "errors" "log/slog" + "math/big" "sync" "time" @@ -55,7 +56,6 @@ type DepositManager interface { CheckAndDeductDeposit( ctx context.Context, bidderAddr common.Address, - providerAddr common.Address, bidAmount string, ) (func() error, error) } @@ -278,13 +278,7 @@ func (p *Preconfirmation) handleBid( return err } - opts, err := p.optsGetter(ctx) - if err != nil { - return err - } - providerAddr := opts.From - - tryRefund, err := p.depositMgr.CheckAndDeductDeposit(ctx, *bidderAddr, providerAddr, bid.BidAmount) + tryRefund, err := p.depositMgr.CheckAndDeductDeposit(ctx, *bidderAddr, bid.BidAmount) if err != nil { p.logger.Error("checking deposit", "error", err) return err @@ -352,9 +346,16 @@ func (p *Preconfirmation) handleBid( return status.Errorf(codes.Internal, "failed to store commitments: %v", err) } + bidAmount, ok := new(big.Int).SetString(bid.BidAmount, 10) + if !ok { + return status.Errorf(codes.Internal, "failed to parse bid amount: %v", bid.BidAmount) + } + encryptedAndDecryptedPreconfirmation := &store.Commitment{ EncryptedPreConfirmation: encryptedPreConfirmation, PreConfirmation: preConfirmation, + BidderAddress: bidderAddr, + BidAmount: bidAmount, } if err := p.tracker.TrackCommitment(ctx, encryptedAndDecryptedPreconfirmation, txn); err != nil { diff --git a/p2p/pkg/preconfirmation/preconfirmation_test.go b/p2p/pkg/preconfirmation/preconfirmation_test.go index 5626eccaa..c98c3094f 100644 --- a/p2p/pkg/preconfirmation/preconfirmation_test.go +++ b/p2p/pkg/preconfirmation/preconfirmation_test.go @@ -114,7 +114,6 @@ type testDepositManager struct{} func (t *testDepositManager) CheckAndDeductDeposit( ctx context.Context, bidderAddr common.Address, - providerAddr common.Address, bidAmountStr string, ) (func() error, error) { return func() error { return nil }, nil diff --git a/p2p/pkg/preconfirmation/store/store.go b/p2p/pkg/preconfirmation/store/store.go index 03dd69c54..3107c9edf 100644 --- a/p2p/pkg/preconfirmation/store/store.go +++ b/p2p/pkg/preconfirmation/store/store.go @@ -84,10 +84,12 @@ const ( type Commitment struct { *preconfpb.EncryptedPreConfirmation *preconfpb.PreConfirmation - Status CommitmentStatus - Details string - Payment string - Refund string + Status CommitmentStatus + Details string + Payment string + Refund string + BidderAddress *common.Address + BidAmount *big.Int } type BlockWinner struct { diff --git a/p2p/pkg/preconfirmation/tracker/tracker.go b/p2p/pkg/preconfirmation/tracker/tracker.go index 32fd5bb76..fe8e984c6 100644 --- a/p2p/pkg/preconfirmation/tracker/tracker.go +++ b/p2p/pkg/preconfirmation/tracker/tracker.go @@ -477,6 +477,12 @@ func (t *Tracker) statusUpdater( "txnHash": task.commitment.Bid.TxHash, "error": r.Err.Error(), } + if task.commitment.BidderAddress != nil { + notificationPayload["bidder"] = common.Bytes2Hex(task.commitment.BidderAddress[:]) + } + if task.commitment.BidAmount != nil { + notificationPayload["bidAmount"] = task.commitment.BidAmount.String() + } switch task.onSuccess { case store.CommitmentStatusStored: t.notifier.Notify( @@ -538,6 +544,19 @@ func (t *Tracker) openCommitments( "providerAddress", commitment.ProviderAddress, "winner", newL1Block.Winner, ) + notificationPayload := map[string]any{ + "commitmentDigest": hex.EncodeToString(commitment.Commitment[:]), + } + if commitment.BidderAddress != nil { + notificationPayload["bidder"] = common.Bytes2Hex(commitment.BidderAddress[:]) + } + if commitment.BidAmount != nil { + notificationPayload["bidAmount"] = commitment.BidAmount.String() + } + t.notifier.Notify(notifications.NewNotification( + notifications.TopicOtherProviderWonBlock, + notificationPayload, + )) continue } startTime := time.Now() diff --git a/p2p/pkg/preconfirmation/tracker/tracker_test.go b/p2p/pkg/preconfirmation/tracker/tracker_test.go index 70d001acc..b3cec5391 100644 --- a/p2p/pkg/preconfirmation/tracker/tracker_test.go +++ b/p2p/pkg/preconfirmation/tracker/tracker_test.go @@ -565,6 +565,149 @@ func TestTrackerIgnoreOldBlocks(t *testing.T) { <-doneChan } +func TestOtherProviderWonBlockNotification(t *testing.T) { + t.Parallel() + + pcABI, err := abi.JSON(strings.NewReader(preconf.PreconfmanagerABI)) + if err != nil { + t.Fatal(err) + } + btABI, err := abi.JSON(strings.NewReader(blocktracker.BlocktrackerABI)) + if err != nil { + t.Fatal(err) + } + brABI, err := abi.JSON(strings.NewReader(bidderregistry.BidderregistryABI)) + if err != nil { + t.Fatal(err) + } + orABI, err := abi.JSON(strings.NewReader(oracle.OracleABI)) + if err != nil { + t.Fatal(err) + } + + evtMgr := events.NewListener( + util.NewTestLogger(os.Stdout), + &btABI, + &pcABI, + &brABI, + &orABI, + ) + + st := store.New(inmemstorage.New()) + + contract := &testPreconfContract{ + openedCommitments: make(chan openedCommitment, 1), + } + + watcher := &mockWatcher{} + notifier := &mockNotifier{ + evt: make(chan *notifications.Notification, 1), + } + + sk, pk, err := crypto.GenerateKeyPairBN254() + if err != nil { + t.Fatal(err) + } + + tracker := preconftracker.NewTracker( + big.NewInt(5), + p2p.PeerTypeProvider, + common.HexToAddress("0x1234"), + evtMgr, + st, + contract, + watcher, + notifier, + pk, + sk, + func(context.Context) (*bind.TransactOpts, error) { + return &bind.TransactOpts{ + From: common.HexToAddress("0x1234"), + }, nil + }, + util.NewTestLogger(os.Stdout), + ) + + ctx, cancel := context.WithCancel(context.Background()) + doneChan := tracker.Start(ctx) + defer func() { + cancel() + select { + case <-doneChan: + case <-time.After(2 * time.Second): + } + }() + + winnerProvider := common.HexToAddress("0x1111") + loserProvider := common.HexToAddress("0x2222") + bidderAddr := common.HexToAddress("0x3333") + + digest := common.HexToHash("0xabc") + cmt := &store.Commitment{ + EncryptedPreConfirmation: &preconfpb.EncryptedPreConfirmation{ + Commitment: digest.Bytes(), + Signature: []byte("sig"), + }, + PreConfirmation: &preconfpb.PreConfirmation{ + Bid: &preconfpb.Bid{ + TxHash: common.HexToHash("0xdeadbeef").String(), + BidAmount: "100", + SlashAmount: "0", + BlockNumber: 1, + DecayStartTimestamp: 1, + DecayEndTimestamp: 2, + Digest: digest.Bytes(), + Signature: []byte("bidsig"), + }, + Digest: digest.Bytes(), + Signature: []byte("pcs"), + ProviderAddress: loserProvider.Bytes(), + SharedSecret: []byte("shared"), + }, + BidderAddress: &bidderAddr, + BidAmount: big.NewInt(100), + } + + if err := tracker.TrackCommitment(context.Background(), cmt, nil); err != nil { + t.Fatal(err) + } + + if err := publishUnopenedCommitment(evtMgr, &pcABI, preconf.PreconfmanagerUnopenedCommitmentStored{ + Committer: loserProvider, + CommitmentIndex: common.HexToHash("0x01"), + CommitmentDigest: digest, + CommitmentSignature: cmt.EncryptedPreConfirmation.Signature, + DispatchTimestamp: uint64(1), + }); err != nil { + t.Fatal(err) + } + cmt.CommitmentIndex = common.HexToHash("0x01").Bytes() + + publishNewWinner(evtMgr, &btABI, blocktracker.BlocktrackerNewL1Block{ + BlockNumber: big.NewInt(1), + Winner: winnerProvider, // Different than commitment provider + }) + + select { + case n := <-notifier.evt: + if n.Topic() != notifications.TopicOtherProviderWonBlock { + t.Fatalf("expected topic %s, got %s", notifications.TopicOtherProviderWonBlock, n.Topic()) + } + val := n.Value() + if val == nil { + t.Fatal("expected non-nil notification payload") + } + if got, ok := val["bidder"].(string); !ok || got != common.Bytes2Hex(bidderAddr[:]) { + t.Fatalf("expected bidder %s, got %v", common.Bytes2Hex(bidderAddr[:]), val["bidder"]) + } + if got, ok := val["bidAmount"].(string); !ok || got != "100" { + t.Fatalf("expected bidAmount 100, got %v", val["bidAmount"]) + } + case <-time.After(5 * time.Second): + t.Fatal("timeout waiting for TopicOtherProviderWonBlock notification") + } +} + type openedCommitment struct { encryptedCommitmentIndex [32]byte bid *big.Int From 7a17945304f1f37f1efdda3a4c8434ed2bd1fe2f Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Sun, 31 Aug 2025 00:38:13 -0700 Subject: [PATCH 117/117] fix: tracker --- p2p/pkg/preconfirmation/tracker/tracker.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/p2p/pkg/preconfirmation/tracker/tracker.go b/p2p/pkg/preconfirmation/tracker/tracker.go index fe8e984c6..0a152d28e 100644 --- a/p2p/pkg/preconfirmation/tracker/tracker.go +++ b/p2p/pkg/preconfirmation/tracker/tracker.go @@ -544,6 +544,9 @@ func (t *Tracker) openCommitments( "providerAddress", commitment.ProviderAddress, "winner", newL1Block.Winner, ) + if t.peerType != p2p.PeerTypeProvider { + continue + } notificationPayload := map[string]any{ "commitmentDigest": hex.EncodeToString(commitment.Commitment[:]), }