diff --git a/contracts/src/v0.8/functions/dev/1_0_0/FunctionsBilling.sol b/contracts/src/v0.8/functions/dev/1_0_0/FunctionsBilling.sol index 1072a3d8ea3..da28d2d09d7 100644 --- a/contracts/src/v0.8/functions/dev/1_0_0/FunctionsBilling.sol +++ b/contracts/src/v0.8/functions/dev/1_0_0/FunctionsBilling.sol @@ -194,8 +194,8 @@ abstract contract FunctionsBilling is HasRouter, IFunctionsBilling { * @inheritdoc IFunctionsBilling */ function getAdminFee() public view override returns (uint96) { - IFunctionsRouter.Config memory config = _getRouter().getConfig(); - return config.adminFee; + (, uint96 adminFee, , ) = _getRouter().getConfig(); + return adminFee; } function getFeedData() public view returns (int256) { @@ -288,10 +288,10 @@ abstract contract FunctionsBilling is HasRouter, IFunctionsBilling { billing.adminFee ); IFunctionsSubscriptions subscriptions = IFunctionsSubscriptions(address(_getRouter())); - (uint96 balance, uint96 blockedBalance, , , ) = subscriptions.getSubscription(billing.subscriptionId); + IFunctionsSubscriptions.Subscription memory subscription = subscriptions.getSubscription(billing.subscriptionId); (, uint64 initiatedRequests, ) = subscriptions.getConsumer(billing.client, billing.subscriptionId); - if (balance - blockedBalance < estimatedCost) { + if (subscription.balance - subscription.blockedBalance < estimatedCost) { revert InsufficientBalance(); } @@ -364,7 +364,7 @@ abstract contract FunctionsBilling is HasRouter, IFunctionsBilling { ); // The Functions Router will perform the callback to the client contract - (uint8 result, uint96 callbackCostJuels) = _getRouter().fulfill( + (FulfillResult resultCode, uint96 callbackCostJuels) = _getRouter().fulfill( response, err, uint96(juelsPerGas), @@ -373,8 +373,7 @@ abstract contract FunctionsBilling is HasRouter, IFunctionsBilling { commitment ); - FulfillResult fulfillResult = FulfillResult(result); - if (fulfillResult == FulfillResult.USER_SUCCESS || fulfillResult == FulfillResult.USER_ERROR) { + if (resultCode == FulfillResult.USER_SUCCESS || resultCode == FulfillResult.USER_ERROR) { delete s_requestCommitments[requestId]; // Reimburse the transmitter for the fulfillment gas cost s_withdrawableTokens[msg.sender] = gasOverheadJuels + callbackCostJuels; @@ -383,7 +382,7 @@ abstract contract FunctionsBilling is HasRouter, IFunctionsBilling { s_feePool += commitment.donFee; } - return fulfillResult; + return resultCode; } // ================================================================ diff --git a/contracts/src/v0.8/functions/dev/1_0_0/FunctionsClient.sol b/contracts/src/v0.8/functions/dev/1_0_0/FunctionsClient.sol index 9d18ef6a9e5..cd9da840838 100644 --- a/contracts/src/v0.8/functions/dev/1_0_0/FunctionsClient.sol +++ b/contracts/src/v0.8/functions/dev/1_0_0/FunctionsClient.sol @@ -67,29 +67,10 @@ abstract contract FunctionsClient is IFunctionsClient { /** * @inheritdoc IFunctionsClient */ - function handleOracleFulfillment( - bytes32 requestId, - bytes memory response, - bytes memory err - ) external override onlyRouter { - fulfillRequest(requestId, response, err); - } - - /** - * @notice Gets the stored address of the router contract - * @return The address of the router contract - */ - function getRouter() internal view returns (address) { - return address(s_router); - } - - /** - * @dev Reverts if the request is not from the Router - */ - modifier onlyRouter() { + function handleOracleFulfillment(bytes32 requestId, bytes memory response, bytes memory err) external override { if (msg.sender != address(s_router)) { revert OnlyRouterCanFufill(); } - _; + fulfillRequest(requestId, response, err); } } diff --git a/contracts/src/v0.8/functions/dev/1_0_0/FunctionsRouter.sol b/contracts/src/v0.8/functions/dev/1_0_0/FunctionsRouter.sol index 54ac1e73573..114b725878b 100644 --- a/contracts/src/v0.8/functions/dev/1_0_0/FunctionsRouter.sol +++ b/contracts/src/v0.8/functions/dev/1_0_0/FunctionsRouter.sol @@ -2,6 +2,7 @@ pragma solidity ^0.8.19; import {RouterBase, ITypeAndVersion} from "./RouterBase.sol"; +import {FulfillResult} from "./interfaces/FulfillResultCodes.sol"; import {IFunctionsRouter} from "./interfaces/IFunctionsRouter.sol"; import {IFunctionsCoordinator} from "./interfaces/IFunctionsCoordinator.sol"; import {FunctionsSubscriptions} from "./FunctionsSubscriptions.sol"; @@ -33,12 +34,17 @@ contract FunctionsRouter is RouterBase, IFunctionsRouter, FunctionsSubscriptions uint64 indexed subscriptionId, uint96 totalCostJuels, address transmitter, - uint8 resultCode, + FulfillResult resultCode, bytes response, bytes returnData ); - event RequestNotProcessed(bytes32 indexed requestId, address coordinator, address transmitter, uint8 resultCode); + event RequestNotProcessed( + bytes32 indexed requestId, + address coordinator, + address transmitter, + FulfillResult resultCode + ); error OnlyCallableFromCoordinator(); error SenderMustAcceptTermsOfService(address sender); @@ -53,7 +59,7 @@ contract FunctionsRouter is RouterBase, IFunctionsRouter, FunctionsSubscriptions // Identifier for the route to the Terms of Service Allow List bytes32 private constant ALLOW_LIST_ID = keccak256("Functions Terms of Service Allow List"); - uint8 private constant GAS_FLAG_INDEX = 0; + uint8 private constant MAX_CALLBACK_GAS_LIMIT_FLAGS_INDEX = 0; // ================================================================ // | Configuration state | @@ -91,8 +97,13 @@ contract FunctionsRouter is RouterBase, IFunctionsRouter, FunctionsSubscriptions /** * @inheritdoc IFunctionsRouter */ - function getConfig() external view override returns (Config memory) { - return s_config; + function getConfig() external view override returns (uint16, uint96, bytes4, uint32[] memory) { + return ( + s_config.maxConsumersPerSubscription, + s_config.adminFee, + s_config.handleOracleFulfillmentSelector, + s_config.maxCallbackGasLimits + ); } // ================================================================ @@ -105,13 +116,13 @@ contract FunctionsRouter is RouterBase, IFunctionsRouter, FunctionsSubscriptions */ function _updateConfig(bytes memory config) internal override { ( - uint16 maxConsumers, + uint16 maxConsumersPerSubscription, uint96 adminFee, bytes4 handleOracleFulfillmentSelector, uint32[] memory maxCallbackGasLimits ) = abi.decode(config, (uint16, uint96, bytes4, uint32[])); s_config = Config({ - maxConsumers: maxConsumers, + maxConsumersPerSubscription: maxConsumersPerSubscription, adminFee: adminFee, handleOracleFulfillmentSelector: handleOracleFulfillmentSelector, maxCallbackGasLimits: maxCallbackGasLimits @@ -123,43 +134,67 @@ contract FunctionsRouter is RouterBase, IFunctionsRouter, FunctionsSubscriptions // | Request methods | // ================================================================ + /** + * @inheritdoc IFunctionsRouter + */ + function sendRequest( + uint64 subscriptionId, + bytes calldata data, + uint16 dataVersion, + uint32 callbackGasLimit, + bytes32 donId + ) external override returns (bytes32) { + IFunctionsCoordinator coordinator = IFunctionsCoordinator(getContractById(donId)); + return _sendRequest(donId, coordinator, subscriptionId, data, dataVersion, callbackGasLimit); + } + + /** + * @inheritdoc IFunctionsRouter + */ + function sendRequestToProposed( + uint64 subscriptionId, + bytes calldata data, + uint16 dataVersion, + uint32 callbackGasLimit, + bytes32 donId + ) external override returns (bytes32) { + IFunctionsCoordinator coordinator = IFunctionsCoordinator(getProposedContractById(donId)); + return _sendRequest(donId, coordinator, subscriptionId, data, dataVersion, callbackGasLimit); + } + function _sendRequest( bytes32 donId, - bool useProposed, + IFunctionsCoordinator coordinator, uint64 subscriptionId, bytes memory data, uint16 dataVersion, uint32 callbackGasLimit - ) private returns (bytes32 requestId) { + ) private returns (bytes32) { _whenNotPaused(); _isValidSubscription(subscriptionId); _isValidConsumer(msg.sender, subscriptionId); isValidCallbackGasLimit(subscriptionId, callbackGasLimit); - address coordinatorAddress = _getContractById(donId, useProposed); - // Forward request to DON - IFunctionsRequest.Commitment memory commitment = IFunctionsCoordinator(coordinatorAddress).sendRequest( - IFunctionsCoordinator.Request( - msg.sender, - s_subscriptions[subscriptionId].owner, - data, - subscriptionId, - dataVersion, - _getFlags(subscriptionId), - callbackGasLimit, - s_config.adminFee - ) + IFunctionsRequest.Commitment memory commitment = coordinator.sendRequest( + IFunctionsCoordinator.Request({ + requestingContract: msg.sender, + subscriptionOwner: s_subscriptions[subscriptionId].owner, + data: data, + subscriptionId: subscriptionId, + dataVersion: dataVersion, + flags: getFlags(subscriptionId), + callbackGasLimit: callbackGasLimit, + adminFee: s_config.adminFee + }) ); - _markRequestInFlight(msg.sender, subscriptionId, commitment.estimatedTotalCostJuels); - // Store a commitment about the request s_requestCommitments[commitment.requestId] = keccak256( abi.encode( IFunctionsRequest.Commitment({ adminFee: s_config.adminFee, - coordinator: coordinatorAddress, + coordinator: address(coordinator), client: msg.sender, subscriptionId: subscriptionId, callbackGasLimit: callbackGasLimit, @@ -173,49 +208,21 @@ contract FunctionsRouter is RouterBase, IFunctionsRouter, FunctionsSubscriptions ) ); - emit RequestStart( - commitment.requestId, - donId, - subscriptionId, - s_subscriptions[subscriptionId].owner, - msg.sender, - tx.origin, - data, - dataVersion, - callbackGasLimit - ); - - return commitment.requestId; - } + _markRequestInFlight(msg.sender, subscriptionId, commitment.estimatedTotalCostJuels); - function _validateProposedContracts( - bytes32 donId, - bytes calldata data - ) internal override returns (bytes memory output) { - (uint64 subscriptionId, bytes memory reqData, uint16 reqDataVersion, uint32 callbackGasLimit) = abi.decode( - data, - (uint64, bytes, uint16, uint32) - ); - bytes32 requestId = _sendRequest(donId, true, subscriptionId, reqData, reqDataVersion, callbackGasLimit); - // Convert to bytes as a more generic return - output = new bytes(32); - // Bounded by 32 - for (uint256 i; i < 32; ++i) { - output[i] = requestId[i]; - } - } + emit RequestStart({ + requestId: commitment.requestId, + donId: donId, + subscriptionId: subscriptionId, + subscriptionOwner: s_subscriptions[subscriptionId].owner, + requestingContract: msg.sender, + requestInitiator: tx.origin, + data: data, + dataVersion: dataVersion, + callbackGasLimit: callbackGasLimit + }); - /** - * @inheritdoc IFunctionsRouter - */ - function sendRequest( - uint64 subscriptionId, - bytes calldata data, - uint16 dataVersion, - uint32 callbackGasLimit, - bytes32 donId - ) external override returns (bytes32) { - return _sendRequest(donId, false, subscriptionId, data, dataVersion, callbackGasLimit); + return commitment.requestId; } /** @@ -225,10 +232,10 @@ contract FunctionsRouter is RouterBase, IFunctionsRouter, FunctionsSubscriptions bytes memory response, bytes memory err, uint96 juelsPerGas, - uint96 costWithoutFulfillment, + uint96 costWithoutCallback, address transmitter, IFunctionsRequest.Commitment memory commitment - ) external override returns (uint8 resultCode, uint96 callbackGasCostJuels) { + ) external override returns (FulfillResult resultCode, uint96 callbackGasCostJuels) { _whenNotPaused(); if (msg.sender != commitment.coordinator) { @@ -236,47 +243,42 @@ contract FunctionsRouter is RouterBase, IFunctionsRouter, FunctionsSubscriptions } if (s_requestCommitments[commitment.requestId] == bytes32(0)) { - resultCode = uint8(FulfillResult.INVALID_REQUEST_ID); + resultCode = FulfillResult.INVALID_REQUEST_ID; emit RequestNotProcessed(commitment.requestId, commitment.coordinator, transmitter, resultCode); return (resultCode, callbackGasCostJuels); } if (keccak256(abi.encode(commitment)) != s_requestCommitments[commitment.requestId]) { - resultCode = uint8(FulfillResult.INVALID_COMMITMENT); + resultCode = FulfillResult.INVALID_COMMITMENT; emit RequestNotProcessed(commitment.requestId, commitment.coordinator, transmitter, resultCode); return (resultCode, callbackGasCostJuels); } // Check that the transmitter has supplied enough gas for the callback to succeed if (gasleft() < commitment.callbackGasLimit + commitment.gasOverheadAfterCallback) { - resultCode = uint8(FulfillResult.INSUFFICIENT_GAS_PROVIDED); + resultCode = FulfillResult.INSUFFICIENT_GAS_PROVIDED; emit RequestNotProcessed(commitment.requestId, commitment.coordinator, transmitter, resultCode); return (resultCode, callbackGasCostJuels); } - // Check that the subscription can still afford - if ( - commitment.adminFee + costWithoutFulfillment + (juelsPerGas * SafeCast.toUint96(commitment.callbackGasLimit)) > - s_subscriptions[commitment.subscriptionId].balance - ) { - resultCode = uint8(FulfillResult.SUBSCRIPTION_BALANCE_INVARIANT_VIOLATION); - delete s_requestCommitments[commitment.requestId]; - emit RequestNotProcessed(commitment.requestId, commitment.coordinator, transmitter, resultCode); - return (resultCode, callbackGasCostJuels); - } + { + uint96 callbackCost = juelsPerGas * SafeCast.toUint96(commitment.callbackGasLimit); + uint96 totalCostJuels = commitment.adminFee + costWithoutCallback + callbackCost; - // Check that the cost has not exceeded the quoted cost - if ( - commitment.adminFee + costWithoutFulfillment + (juelsPerGas * SafeCast.toUint96(commitment.callbackGasLimit)) > - commitment.estimatedTotalCostJuels - ) { - resultCode = uint8(FulfillResult.COST_EXCEEDS_COMMITMENT); - emit RequestNotProcessed(commitment.requestId, commitment.coordinator, transmitter, resultCode); - return (resultCode, callbackGasCostJuels); - } + // Check that the subscription can still afford + if (totalCostJuels > s_subscriptions[commitment.subscriptionId].balance) { + resultCode = FulfillResult.SUBSCRIPTION_BALANCE_INVARIANT_VIOLATION; + emit RequestNotProcessed(commitment.requestId, commitment.coordinator, transmitter, resultCode); + return (resultCode, callbackGasCostJuels); + } - // If checks pass, continue as default, 0 = USER_SUCCESS; - resultCode = 0; + // Check that the cost has not exceeded the quoted cost + if (totalCostJuels > commitment.estimatedTotalCostJuels) { + resultCode = FulfillResult.COST_EXCEEDS_COMMITMENT; + emit RequestNotProcessed(commitment.requestId, commitment.coordinator, transmitter, resultCode); + return (resultCode, callbackGasCostJuels); + } + } delete s_requestCommitments[commitment.requestId]; @@ -287,9 +289,7 @@ contract FunctionsRouter is RouterBase, IFunctionsRouter, FunctionsSubscriptions commitment.callbackGasLimit, commitment.client ); - resultCode = result.success - ? 0 // FulfillResult.USER_SUCCESS - : 1; // FulfillResult.USER_ERROR + resultCode = result.success ? FulfillResult.USER_SUCCESS : FulfillResult.USER_ERROR; Receipt memory receipt = _pay( commitment.subscriptionId, @@ -297,20 +297,19 @@ contract FunctionsRouter is RouterBase, IFunctionsRouter, FunctionsSubscriptions commitment.client, commitment.adminFee, juelsPerGas, - result.gasUsed, - costWithoutFulfillment + SafeCast.toUint96(result.gasUsed), + costWithoutCallback ); - // resultCode must be 0 or 1 here - emit RequestProcessed( - commitment.requestId, - commitment.subscriptionId, - receipt.totalCostJuels, - transmitter, - resultCode, - result.success ? response : err, - result.returnData - ); + emit RequestProcessed({ + requestId: commitment.requestId, + subscriptionId: commitment.subscriptionId, + totalCostJuels: receipt.totalCostJuels, + transmitter: transmitter, + resultCode: resultCode, + response: result.success ? response : err, + returnData: result.returnData + }); return (resultCode, receipt.callbackGasCostJuels); } @@ -388,7 +387,7 @@ contract FunctionsRouter is RouterBase, IFunctionsRouter, FunctionsSubscriptions * @inheritdoc IFunctionsRouter */ function isValidCallbackGasLimit(uint64 subscriptionId, uint32 callbackGasLimit) public view { - uint8 index = uint8(_getFlags(subscriptionId)[GAS_FLAG_INDEX]); + uint8 index = uint8(getFlags(subscriptionId)[MAX_CALLBACK_GAS_LIMIT_FLAGS_INDEX]); if (index >= s_config.maxCallbackGasLimits.length) { revert InvalidGasFlagValue(index); } @@ -398,7 +397,7 @@ contract FunctionsRouter is RouterBase, IFunctionsRouter, FunctionsSubscriptions } function _getMaxConsumers() internal view override returns (uint16) { - return s_config.maxConsumers; + return s_config.maxConsumersPerSubscription; } // ================================================================ @@ -414,7 +413,7 @@ contract FunctionsRouter is RouterBase, IFunctionsRouter, FunctionsSubscriptions } function _onlySenderThatAcceptedToS() internal view override { - if (!IAccessController(_getContractById(ALLOW_LIST_ID, false)).hasAccess(msg.sender, new bytes(0))) { + if (!IAccessController(getContractById(ALLOW_LIST_ID)).hasAccess(msg.sender, new bytes(0))) { revert SenderMustAcceptTermsOfService(msg.sender); } } diff --git a/contracts/src/v0.8/functions/dev/1_0_0/FunctionsSubscriptions.sol b/contracts/src/v0.8/functions/dev/1_0_0/FunctionsSubscriptions.sol index c1c6743e0b3..9c1863aaa9f 100644 --- a/contracts/src/v0.8/functions/dev/1_0_0/FunctionsSubscriptions.sol +++ b/contracts/src/v0.8/functions/dev/1_0_0/FunctionsSubscriptions.sol @@ -15,10 +15,6 @@ import {SafeCast} from "../../../vendor/openzeppelin-solidity/v4.8.0/contracts/u * @dev THIS CONTRACT HAS NOT GONE THROUGH ANY SECURITY REVIEW. DO NOT USE IN PROD. */ abstract contract FunctionsSubscriptions is IFunctionsSubscriptions, ERC677ReceiverInterface { - // Reentrancy guard - bool internal s_reentrancyLock; - error Reentrant(); - // ================================================================ // | Subscription state | // ================================================================ @@ -49,14 +45,14 @@ abstract contract FunctionsSubscriptions is IFunctionsSubscriptions, ERC677Recei error TooManyConsumers(); error InsufficientBalance(); - error InvalidConsumer(uint64 subscriptionId, address consumer); + error InvalidConsumer(); error ConsumerRequestsInFlight(); error InvalidSubscription(); error OnlyCallableFromLink(); error InvalidCalldata(); error MustBeSubscriptionOwner(); error PendingRequestExists(); - error MustBeRequestedOwner(address proposedOwner); + error MustBeProposedOwner(); error BalanceInvariantViolated(uint256 internalBalance, uint256 externalBalance); // Should never happen event FundsRecovered(address to, uint256 amount); @@ -103,21 +99,10 @@ abstract contract FunctionsSubscriptions is IFunctionsSubscriptions, ERC677Recei /** * @inheritdoc IFunctionsSubscriptions */ - function getSubscription( - uint64 subscriptionId - ) - external - view - override - returns (uint96 balance, uint96 blockedBalance, address owner, address requestedOwner, address[] memory consumers) - { + function getSubscription(uint64 subscriptionId) external view override returns (Subscription memory) { _isValidSubscription(subscriptionId); - balance = s_subscriptions[subscriptionId].balance; - blockedBalance = s_subscriptions[subscriptionId].blockedBalance; - owner = s_subscriptions[subscriptionId].owner; - requestedOwner = s_subscriptions[subscriptionId].requestedOwner; - consumers = s_subscriptions[subscriptionId].consumers; + return s_subscriptions[subscriptionId]; } /** @@ -144,7 +129,7 @@ abstract contract FunctionsSubscriptions is IFunctionsSubscriptions, ERC677Recei function _isValidConsumer(address client, uint64 subscriptionId) internal view { if (!s_consumers[client][subscriptionId].allowed) { - revert InvalidConsumer(subscriptionId, client); + revert InvalidConsumer(); } } @@ -173,10 +158,10 @@ abstract contract FunctionsSubscriptions is IFunctionsSubscriptions, ERC677Recei address client, uint96 adminFee, uint96 juelsPerGas, - uint256 gasUsed, + uint96 gasUsed, uint96 costWithoutCallbackJuels ) internal returns (Receipt memory receipt) { - uint96 callbackGasCostJuels = juelsPerGas * SafeCast.toUint96(gasUsed); + uint96 callbackGasCostJuels = juelsPerGas * gasUsed; uint96 totalCostJuels = costWithoutCallbackJuels + adminFee + callbackGasCostJuels; receipt = Receipt(callbackGasCostJuels, totalCostJuels); @@ -204,11 +189,8 @@ abstract contract FunctionsSubscriptions is IFunctionsSubscriptions, ERC677Recei */ function ownerCancelSubscription(uint64 subscriptionId) external override { _onlyRouterOwner(); - address owner = s_subscriptions[subscriptionId].owner; - if (owner == address(0)) { - revert InvalidSubscription(); - } - _cancelSubscriptionHelper(subscriptionId, owner); + _isValidSubscription(subscriptionId); + _cancelSubscriptionHelper(subscriptionId, s_subscriptions[subscriptionId].owner); } /** @@ -343,7 +325,7 @@ abstract contract FunctionsSubscriptions is IFunctionsSubscriptions, ERC677Recei address previousOwner = s_subscriptions[subscriptionId].owner; address nextOwner = s_subscriptions[subscriptionId].requestedOwner; if (nextOwner != msg.sender) { - revert MustBeRequestedOwner(nextOwner); + revert MustBeProposedOwner(); } s_subscriptions[subscriptionId].owner = msg.sender; s_subscriptions[subscriptionId].requestedOwner = address(0); @@ -359,7 +341,7 @@ abstract contract FunctionsSubscriptions is IFunctionsSubscriptions, ERC677Recei _onlySenderThatAcceptedToS(); Consumer memory consumerData = s_consumers[consumer][subscriptionId]; if (!consumerData.allowed) { - revert InvalidConsumer(subscriptionId, consumer); + revert InvalidConsumer(); } if (consumerData.initiatedRequests != consumerData.completedRequests) { revert ConsumerRequestsInFlight(); @@ -460,15 +442,11 @@ abstract contract FunctionsSubscriptions is IFunctionsSubscriptions, ERC677Recei s_subscriptions[subscriptionId].flags = flags; } - function _getFlags(uint64 subscriptionId) internal view returns (bytes32) { - return s_subscriptions[subscriptionId].flags; - } - /** * @inheritdoc IFunctionsSubscriptions */ - function getFlags(uint64 subscriptionId) external view returns (bytes32) { - return _getFlags(subscriptionId); + function getFlags(uint64 subscriptionId) public view returns (bytes32) { + return s_subscriptions[subscriptionId].flags; } function _getMaxConsumers() internal view virtual returns (uint16); @@ -496,7 +474,6 @@ abstract contract FunctionsSubscriptions is IFunctionsSubscriptions, ERC677Recei } IFunctionsBilling coordinator = IFunctionsBilling(request.coordinator); - coordinator.deleteCommitment(requestId); // Release blocked balance s_subscriptions[request.subscriptionId].blockedBalance -= request.estimatedTotalCostJuels; diff --git a/contracts/src/v0.8/functions/dev/1_0_0/HasRouter.sol b/contracts/src/v0.8/functions/dev/1_0_0/HasRouter.sol index 4f01d0eff5c..4b5f4295421 100644 --- a/contracts/src/v0.8/functions/dev/1_0_0/HasRouter.sol +++ b/contracts/src/v0.8/functions/dev/1_0_0/HasRouter.sol @@ -7,8 +7,6 @@ import {ITypeAndVersion} from "../../../shared/interfaces/ITypeAndVersion.sol"; import {IOwnableFunctionsRouter} from "./interfaces/IOwnableFunctionsRouter.sol"; abstract contract HasRouter is ITypeAndVersion, IConfigurable { - bytes32 internal s_configHash; - IOwnableFunctionsRouter internal immutable s_router; error RouterMustBeSet(); @@ -24,20 +22,12 @@ abstract contract HasRouter is ITypeAndVersion, IConfigurable { } s_router = IOwnableFunctionsRouter(router); _updateConfig(config); - s_configHash = keccak256(config); } function _getRouter() internal view returns (IOwnableFunctionsRouter router) { return s_router; } - /** - * @inheritdoc IConfigurable - */ - function getConfigHash() external view override returns (bytes32 config) { - return s_configHash; - } - /** * @dev Must be implemented by inheriting contract * Use to set configuration state @@ -50,7 +40,6 @@ abstract contract HasRouter is ITypeAndVersion, IConfigurable { */ function updateConfig(bytes memory config) public override onlyRouter { _updateConfig(config); - s_configHash = keccak256(config); } /** diff --git a/contracts/src/v0.8/functions/dev/1_0_0/RouterBase.sol b/contracts/src/v0.8/functions/dev/1_0_0/RouterBase.sol index f4a1f5ad22d..a5c0a9f9842 100644 --- a/contracts/src/v0.8/functions/dev/1_0_0/RouterBase.sol +++ b/contracts/src/v0.8/functions/dev/1_0_0/RouterBase.sol @@ -38,29 +38,23 @@ abstract contract RouterBase is IRouterBase, Pausable, ITypeAndVersion, Confirme uint256 timelockEndBlock ); - event ContractUpdated( - bytes32 proposedContractSetId, - address proposedContractSetFromAddress, - address proposedContractSetToAddress - ); + event ContractUpdated(bytes32 id, address from, address to); struct ConfigProposal { - bytes32 fromHash; bytes to; uint256 timelockEndBlock; } mapping(bytes32 id => ConfigProposal) private s_proposedConfig; - event ConfigProposed(bytes32 id, bytes32 fromHash, bytes toBytes); - event ConfigUpdated(bytes32 id, bytes32 fromHash, bytes toBytes); + event ConfigProposed(bytes32 id, bytes toBytes); + event ConfigUpdated(bytes32 id, bytes toBytes); error InvalidProposal(); error IdentifierIsReserved(bytes32 id); + error AlreadyApplied(); // ================================================================ // | Config state | // ================================================================ - bytes32 internal s_configHash; - error InvalidConfigData(); TimeLockProposal internal s_timelockProposal; @@ -100,43 +94,34 @@ abstract contract RouterBase is IRouterBase, Pausable, ITypeAndVersion, Confirme // Set the initial configuration for the Router s_route[ROUTER_ID] = address(this); _updateConfig(selfConfig); - s_configHash = keccak256(selfConfig); } // ================================================================ // | Route methods | // ================================================================ - function _getContractById(bytes32 id, bool useProposed) internal view returns (address) { - if (!useProposed) { - address currentImplementation = s_route[id]; - if (currentImplementation != address(0)) { - return currentImplementation; - } - } else { - // Iterations will not exceed MAX_PROPOSAL_SET_LENGTH - for (uint256 i = 0; i < s_proposedContractSet.ids.length; ++i) { - if (id == s_proposedContractSet.ids[i]) { - // NOTE: proposals can be used immediately - return s_proposedContractSet.to[i]; - } - } - } - revert RouteNotFound(id); - } - /** * @inheritdoc IRouterBase */ - function getContractById(bytes32 id) external view override returns (address routeDestination) { - routeDestination = _getContractById(id, false); + function getContractById(bytes32 id) public view override returns (address) { + address currentImplementation = s_route[id]; + if (currentImplementation != address(0)) { + return currentImplementation; + } + revert RouteNotFound(id); } /** * @inheritdoc IRouterBase */ - function getContractById(bytes32 id, bool useProposed) external view override returns (address routeDestination) { - routeDestination = _getContractById(id, useProposed); + function getProposedContractById(bytes32 id) public view override returns (address) { + // Iterations will not exceed MAX_PROPOSAL_SET_LENGTH + for (uint8 i = 0; i < s_proposedContractSet.ids.length; ++i) { + if (id == s_proposedContractSet.ids[i]) { + return s_proposedContractSet.to[i]; + } + } + revert RouteNotFound(id); } // ================================================================ @@ -179,32 +164,23 @@ abstract contract RouterBase is IRouterBase, Pausable, ITypeAndVersion, Confirme uint256 timelockEndBlock = block.number + s_timelockBlocks; - s_proposedContractSet = ContractProposalSet(proposedContractSetIds, proposedContractSetAddresses, timelockEndBlock); + s_proposedContractSet = ContractProposalSet({ + ids: proposedContractSetIds, + to: proposedContractSetAddresses, + timelockEndBlock: timelockEndBlock + }); // Iterations will not exceed MAX_PROPOSAL_SET_LENGTH for (uint256 i = 0; i < proposedContractSetIds.length; ++i) { - emit ContractProposed( - proposedContractSetIds[i], - s_route[proposedContractSetIds[i]], - proposedContractSetAddresses[i], - timelockEndBlock - ); + emit ContractProposed({ + proposedContractSetId: proposedContractSetIds[i], + proposedContractSetFromAddress: s_route[proposedContractSetIds[i]], + proposedContractSetToAddress: proposedContractSetAddresses[i], + timelockEndBlock: timelockEndBlock + }); } } - /** - * @inheritdoc IRouterBase - */ - function validateProposedContracts(bytes32 id, bytes calldata data) external override returns (bytes memory) { - return _validateProposedContracts(id, data); - } - - /** - * @dev Must be implemented by the inheriting contract - * Use to test an end to end request through the system - */ - function _validateProposedContracts(bytes32 id, bytes calldata data) internal virtual returns (bytes memory); - /** * @inheritdoc IRouterBase */ @@ -218,20 +194,15 @@ abstract contract RouterBase is IRouterBase, Pausable, ITypeAndVersion, Confirme address from = s_route[id]; address to = s_proposedContractSet.to[i]; s_route[id] = to; - emit ContractUpdated(id, from, to); + emit ContractUpdated({id: id, from: from, to: to}); } + + delete s_proposedContractSet; } // ================================================================ // | Config Proposal methods | // ================================================================ - /** - * @notice Get the hash of the Router's current configuration - * @return config hash of config bytes - */ - function getConfigHash() external view returns (bytes32 config) { - return s_configHash; - } /** * @dev Must be implemented by inheriting contract @@ -242,19 +213,29 @@ abstract contract RouterBase is IRouterBase, Pausable, ITypeAndVersion, Confirme /** * @inheritdoc IRouterBase */ - function proposeConfigUpdate(bytes32 id, bytes calldata config) external override onlyOwner { - address implAddr = _getContractById(id, false); - bytes32 currentConfigHash; - if (implAddr == address(this)) { - currentConfigHash = s_configHash; - } else { - currentConfigHash = IConfigurable(implAddr).getConfigHash(); - } - if (currentConfigHash == keccak256(config)) { - revert InvalidProposal(); + function proposeConfigUpdateSelf(bytes calldata config) external override onlyOwner { + s_proposedConfig[ROUTER_ID] = ConfigProposal({to: config, timelockEndBlock: block.number + s_timelockBlocks}); + emit ConfigProposed({id: ROUTER_ID, toBytes: config}); + } + + /** + * @inheritdoc IRouterBase + */ + function updateConfigSelf() external override onlyOwner { + ConfigProposal memory proposal = s_proposedConfig[ROUTER_ID]; + if (block.number < proposal.timelockEndBlock) { + revert TimelockInEffect(); } - s_proposedConfig[id] = ConfigProposal(currentConfigHash, config, block.number + s_timelockBlocks); - emit ConfigProposed(id, currentConfigHash, config); + _updateConfig(proposal.to); + emit ConfigUpdated({id: ROUTER_ID, toBytes: proposal.to}); + } + + /** + * @inheritdoc IRouterBase + */ + function proposeConfigUpdate(bytes32 id, bytes calldata config) external override onlyOwner { + s_proposedConfig[id] = ConfigProposal({to: config, timelockEndBlock: block.number + s_timelockBlocks}); + emit ConfigProposed({id: id, toBytes: config}); } /** @@ -262,18 +243,14 @@ abstract contract RouterBase is IRouterBase, Pausable, ITypeAndVersion, Confirme */ function updateConfig(bytes32 id) external override onlyOwner { ConfigProposal memory proposal = s_proposedConfig[id]; + if (block.number < proposal.timelockEndBlock) { revert TimelockInEffect(); } - if (id == ROUTER_ID) { - _updateConfig(proposal.to); - s_configHash = keccak256(proposal.to); - } else { - try IConfigurable(_getContractById(id, false)).updateConfig(proposal.to) {} catch { - revert InvalidConfigData(); - } - } - emit ConfigUpdated(id, proposal.fromHash, proposal.to); + + IConfigurable(getContractById(id)).updateConfig(proposal.to); + + emit ConfigUpdated({id: id, toBytes: proposal.to}); } // ================================================================ @@ -290,7 +267,11 @@ abstract contract RouterBase is IRouterBase, Pausable, ITypeAndVersion, Confirme if (blocks > s_maximumTimelockBlocks) { revert ProposedTimelockAboveMaximum(); } - s_timelockProposal = TimeLockProposal(s_timelockBlocks, blocks, uint224(block.number + s_timelockBlocks)); + s_timelockProposal = TimeLockProposal({ + from: s_timelockBlocks, + to: blocks, + timelockEndBlock: uint224(block.number + s_timelockBlocks) + }); } /** @@ -300,6 +281,9 @@ abstract contract RouterBase is IRouterBase, Pausable, ITypeAndVersion, Confirme if (block.number < s_timelockProposal.timelockEndBlock) { revert TimelockInEffect(); } + if (s_timelockBlocks == s_timelockProposal.to) { + revert AlreadyApplied(); + } s_timelockBlocks = s_timelockProposal.to; } diff --git a/contracts/src/v0.8/functions/dev/1_0_0/accessControl/TermsOfServiceAllowList.sol b/contracts/src/v0.8/functions/dev/1_0_0/accessControl/TermsOfServiceAllowList.sol index ec966b7730f..f5a5d1fadb2 100644 --- a/contracts/src/v0.8/functions/dev/1_0_0/accessControl/TermsOfServiceAllowList.sol +++ b/contracts/src/v0.8/functions/dev/1_0_0/accessControl/TermsOfServiceAllowList.sol @@ -70,17 +70,10 @@ contract TermsOfServiceAllowList is HasRouter, ITermsOfServiceAllowList, IAccess /** * @inheritdoc ITermsOfServiceAllowList */ - function getMessageHash(address acceptor, address recipient) public pure override returns (bytes32) { + function getMessage(address acceptor, address recipient) public pure override returns (bytes32) { return keccak256(abi.encodePacked(acceptor, recipient)); } - /** - * @inheritdoc ITermsOfServiceAllowList - */ - function getEthSignedMessageHash(bytes32 messageHash) public pure override returns (bytes32) { - return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", messageHash)); - } - /** * @inheritdoc ITermsOfServiceAllowList */ @@ -90,7 +83,10 @@ contract TermsOfServiceAllowList is HasRouter, ITermsOfServiceAllowList, IAccess } // Validate that the signature is correct and the correct data has been signed - if (ecrecover(getEthSignedMessageHash(getMessageHash(acceptor, recipient)), v, r, s) != s_config.signerPublicKey) { + bytes32 prefixedMessage = keccak256( + abi.encodePacked("\x19Ethereum Signed Message:\n32", getMessage(acceptor, recipient)) + ); + if (ecrecover(prefixedMessage, v, r, s) != s_config.signerPublicKey) { revert InvalidSignature(); } diff --git a/contracts/src/v0.8/functions/dev/1_0_0/accessControl/interfaces/ITermsOfServiceAllowList.sol b/contracts/src/v0.8/functions/dev/1_0_0/accessControl/interfaces/ITermsOfServiceAllowList.sol index e9388335e01..dd662f02b56 100644 --- a/contracts/src/v0.8/functions/dev/1_0_0/accessControl/interfaces/ITermsOfServiceAllowList.sol +++ b/contracts/src/v0.8/functions/dev/1_0_0/accessControl/interfaces/ITermsOfServiceAllowList.sol @@ -12,14 +12,7 @@ interface ITermsOfServiceAllowList { * @param recipient - The recipient address that the acceptor is taking responsibility for * @return Hash of the message data */ - function getMessageHash(address acceptor, address recipient) external pure returns (bytes32); - - /** - * @notice Wrap a bytes32 message as an ethereum signed message - * @param messageHash - Message hash produced from "getMessageHash" - * @return Hash of the message data packed as "\x19Ethereum Signed Message\n" + len(msg) + msg - */ - function getEthSignedMessageHash(bytes32 messageHash) external pure returns (bytes32); + function getMessage(address acceptor, address recipient) external pure returns (bytes32); /** * @notice Check if the address is blocked for usage diff --git a/contracts/src/v0.8/functions/dev/1_0_0/interfaces/IConfigurable.sol b/contracts/src/v0.8/functions/dev/1_0_0/interfaces/IConfigurable.sol index 4aebd575498..6953bf37b09 100644 --- a/contracts/src/v0.8/functions/dev/1_0_0/interfaces/IConfigurable.sol +++ b/contracts/src/v0.8/functions/dev/1_0_0/interfaces/IConfigurable.sol @@ -5,12 +5,6 @@ pragma solidity ^0.8.19; * @title Configurable contract interface. */ interface IConfigurable { - /** - * @notice Get the hash of the current configuration - * @return config hash of config bytes - */ - function getConfigHash() external returns (bytes32 config); - /** * @notice Set the contract's configuration * @param config bytes containing config data diff --git a/contracts/src/v0.8/functions/dev/1_0_0/interfaces/IFunctionsRouter.sol b/contracts/src/v0.8/functions/dev/1_0_0/interfaces/IFunctionsRouter.sol index 76cd29722df..aa7868ba56f 100644 --- a/contracts/src/v0.8/functions/dev/1_0_0/interfaces/IFunctionsRouter.sol +++ b/contracts/src/v0.8/functions/dev/1_0_0/interfaces/IFunctionsRouter.sol @@ -2,6 +2,7 @@ pragma solidity ^0.8.19; import {IRouterBase} from "./IRouterBase.sol"; +import {FulfillResult} from "./FulfillResultCodes.sol"; import {IFunctionsRequest} from "./IFunctionsRequest.sol"; /** @@ -13,7 +14,7 @@ interface IFunctionsRouter is IRouterBase { // This bound ensures we are able to loop over all subscription consumers as needed, // without exceeding gas limits. // Should a user require more consumers, they can use multiple subscriptions. - uint16 maxConsumers; + uint16 maxConsumersPerSubscription; // Flat fee (in Juels of LINK) that will be paid to the Router owner for operation of the network uint96 adminFee; // The function selector that is used when calling back to the Client contract @@ -31,9 +32,8 @@ interface IFunctionsRouter is IRouterBase { /** * @notice The router configuration - * @return config - the router configuration */ - function getConfig() external view returns (Config memory); + function getConfig() external view returns (uint16, uint96, bytes4, uint32[] memory); /** * @notice Sends a request (encoded as data) using the provided subscriptionId @@ -53,6 +53,24 @@ interface IFunctionsRouter is IRouterBase { bytes32 donId ) external returns (bytes32); + /** + * @notice Sends a request (encoded as data) to the proposed contracts + * @param subscriptionId A unique subscription ID allocated by billing system, + * a client can make requests from different contracts referencing the same subscription + * @param data Encoded Chainlink Functions request data, use FunctionsClient API to encode a request + * @param dataVersion Gas limit for the fulfillment callback + * @param callbackGasLimit Gas limit for the fulfillment callback + * @param donId An identifier used to determine which route to send the request along + * @return requestId A unique request identifier + */ + function sendRequestToProposed( + uint64 subscriptionId, + bytes calldata data, + uint16 dataVersion, + uint32 callbackGasLimit, + bytes32 donId + ) external returns (bytes32); + /** * @notice Fulfill the request by: * - calling back the data that the Oracle returned to the client contract @@ -74,7 +92,7 @@ interface IFunctionsRouter is IRouterBase { uint96 costWithoutFulfillment, address transmitter, IFunctionsRequest.Commitment memory commitment - ) external returns (uint8, uint96); + ) external returns (FulfillResult, uint96); /** * @notice Validate requested gas limit is below the subscription max. diff --git a/contracts/src/v0.8/functions/dev/1_0_0/interfaces/IFunctionsSubscriptions.sol b/contracts/src/v0.8/functions/dev/1_0_0/interfaces/IFunctionsSubscriptions.sol index 7a8aaf5685f..93d16f70488 100644 --- a/contracts/src/v0.8/functions/dev/1_0_0/interfaces/IFunctionsSubscriptions.sol +++ b/contracts/src/v0.8/functions/dev/1_0_0/interfaces/IFunctionsSubscriptions.sol @@ -32,18 +32,9 @@ interface IFunctionsSubscriptions { /** * @notice Get details about a subscription. * @param subscriptionId - ID of the subscription - * @return balance - LINK balance of the subscription in juels. - * @return blockedBalance - amount of LINK balance of the subscription in juels that is blocked for an in flight request. - * @return owner - owner of the subscription. - * @return requestedOwner - proposed owner to move ownership of the subscription to. - * @return consumers - list of consumer address which are able to use this subscription. + * @return subscription - list of consumer address which are able to use this subscription. */ - function getSubscription( - uint64 subscriptionId - ) - external - view - returns (uint96 balance, uint96 blockedBalance, address owner, address requestedOwner, address[] memory consumers); + function getSubscription(uint64 subscriptionId) external view returns (Subscription memory); /** * @notice Get details about a consumer of a subscription. diff --git a/contracts/src/v0.8/functions/dev/1_0_0/interfaces/IRouterBase.sol b/contracts/src/v0.8/functions/dev/1_0_0/interfaces/IRouterBase.sol index 7e6d6f0c3dd..aaae944264b 100644 --- a/contracts/src/v0.8/functions/dev/1_0_0/interfaces/IRouterBase.sol +++ b/contracts/src/v0.8/functions/dev/1_0_0/interfaces/IRouterBase.sol @@ -17,7 +17,7 @@ interface IRouterBase { * @param id A bytes32 identifier for the route * @return contract The current or proposed contract address */ - function getContractById(bytes32 id, bool useProposed) external view returns (address); + function getProposedContractById(bytes32 id) external view returns (address); /** * @notice Return the latest proprosal set @@ -34,16 +34,24 @@ interface IRouterBase { function proposeContractsUpdate(bytes32[] memory proposalSetIds, address[] memory proposalSetAddresses) external; /** - * @notice Tests a proposal for the ability to make a successful upgrade + * @notice Updates the current contract routes to the proposed contracts + * @dev Only callable once timelock has passed + * @dev Only callable by owner */ - function validateProposedContracts(bytes32 id, bytes calldata data) external returns (bytes memory); + function updateContracts() external; /** - * @notice Updates the current contract routes to the proposed contracts + * @notice Proposes new configuration data for the Router contract itself + * @dev Only callable by owner + */ + function proposeConfigUpdateSelf(bytes calldata config) external; + + /** + * @notice Updates configuration data for the Router contract itself * @dev Only callable once timelock has passed * @dev Only callable by owner */ - function updateContracts() external; + function updateConfigSelf() external; /** * @notice Proposes new configuration data for the current (not proposed) contract diff --git a/contracts/src/v0.8/functions/tests/1_0_0/FunctionsRouter.t.sol b/contracts/src/v0.8/functions/tests/1_0_0/FunctionsRouter.t.sol index 21cdd8342ea..fe9fd46930f 100644 --- a/contracts/src/v0.8/functions/tests/1_0_0/FunctionsRouter.t.sol +++ b/contracts/src/v0.8/functions/tests/1_0_0/FunctionsRouter.t.sol @@ -17,7 +17,7 @@ contract FunctionsRouterSetup is BaseTest { uint16 internal s_timelockBlocks = 0; uint16 internal s_maximumTimelockBlocks = 20; - uint16 internal s_maxConsumers = 100; + uint16 internal s_maxConsumersPerSubscription = 100; uint96 internal s_adminFee = 561724823; bytes4 internal s_handleOracleFulfillmentSelector = 0x0ca76175; @@ -39,7 +39,7 @@ contract FunctionsRouterSetup is BaseTest { // First create the struct to get some type safety IFunctionsRouter.Config memory routerConfig = IFunctionsRouter.Config({ - maxConsumers: s_maxConsumers, + maxConsumersPerSubscription: s_maxConsumersPerSubscription, adminFee: s_adminFee, handleOracleFulfillmentSelector: s_handleOracleFulfillmentSelector, maxCallbackGasLimits: maxCallbackGasLimits @@ -47,7 +47,7 @@ contract FunctionsRouterSetup is BaseTest { return abi.encode( - routerConfig.maxConsumers, + routerConfig.maxConsumersPerSubscription, routerConfig.adminFee, routerConfig.handleOracleFulfillmentSelector, routerConfig.maxCallbackGasLimits diff --git a/contracts/src/v0.8/functions/tests/1_0_0/testhelpers/FunctionsClientTestHelper.sol b/contracts/src/v0.8/functions/tests/1_0_0/testhelpers/FunctionsClientTestHelper.sol index 8bd6236c778..50ee1a77840 100644 --- a/contracts/src/v0.8/functions/tests/1_0_0/testhelpers/FunctionsClientTestHelper.sol +++ b/contracts/src/v0.8/functions/tests/1_0_0/testhelpers/FunctionsClientTestHelper.sol @@ -42,11 +42,12 @@ contract FunctionsClientTestHelper is FunctionsClient { uint32 callbackGasLimit = 20_000; request.initializeRequestForInlineJavaScript(sourceCode); bytes memory requestData = Functions.encodeCBOR(request); - requestId = bytes32( - s_router.validateProposedContracts( - donId, - abi.encode(subscriptionId, requestData, Functions.REQUEST_DATA_VERSION, callbackGasLimit) - ) + requestId = s_router.sendRequestToProposed( + subscriptionId, + requestData, + Functions.REQUEST_DATA_VERSION, + callbackGasLimit, + donId ); emit RequestSent(requestId); emit SendRequestInvoked(requestId, sourceCode, subscriptionId); diff --git a/contracts/test/v0.8/functions/v1/FunctionsRouter.test.ts b/contracts/test/v0.8/functions/v1/FunctionsRouter.test.ts index b954aeced3a..4f1031ee7d8 100644 --- a/contracts/test/v0.8/functions/v1/FunctionsRouter.test.ts +++ b/contracts/test/v0.8/functions/v1/FunctionsRouter.test.ts @@ -21,14 +21,12 @@ describe('Functions Router - Request lifecycle', () => { }) it('#config', async () => { const config = await contracts.router.getConfig() - expect(config.maxConsumers).to.be.equal( - functionsRouterConfig.maxConsumers, - ) - expect(config.adminFee).to.be.equal(functionsRouterConfig.adminFee) - expect(config.handleOracleFulfillmentSelector).to.be.equal( + expect(config[0]).to.be.equal(functionsRouterConfig.maxConsumers) + expect(config[1]).to.be.equal(functionsRouterConfig.adminFee) + expect(config[2]).to.be.equal( functionsRouterConfig.handleOracleFulfillmentSelector, ) - expect(config.maxCallbackGasLimits.toString()).to.be.equal( + expect(config[3].toString()).to.be.equal( functionsRouterConfig.maxCallbackGasLimits.toString(), ) }) diff --git a/contracts/test/v0.8/functions/v1/FunctionsSubscriptions.test.ts b/contracts/test/v0.8/functions/v1/FunctionsSubscriptions.test.ts index 0f088129d70..8cf513297e6 100644 --- a/contracts/test/v0.8/functions/v1/FunctionsSubscriptions.test.ts +++ b/contracts/test/v0.8/functions/v1/FunctionsSubscriptions.test.ts @@ -129,7 +129,7 @@ describe('Functions Router - Subscriptions', () => { contracts.router .connect(roles.subOwner) .acceptSubscriptionOwnerTransfer(1203123123), - ).to.be.revertedWith(`MustBeRequestedOwner`) + ).to.be.revertedWith(`MustBeProposedOwner`) }) it('must be requested owner to accept', async function () { await expect( @@ -141,7 +141,7 @@ describe('Functions Router - Subscriptions', () => { contracts.router .connect(roles.subOwner) .acceptSubscriptionOwnerTransfer(subId), - ).to.be.revertedWith(`MustBeRequestedOwner("${roles.strangerAddress}")`) + ).to.be.revertedWith(`MustBeProposedOwner`) }) it('requested owner can accept', async function () { await acceptTermsOfService( @@ -773,13 +773,13 @@ describe('Functions Router - Subscriptions', () => { // Accept ToS for client contract const acceptorAddress = roles.subOwnerAddress const recipientAddress = contracts.client.address - const messageHash = await contracts.accessControl.getMessageHash( + const message = await contracts.accessControl.getMessage( acceptorAddress, recipientAddress, ) const wallet = new ethers.Wallet(accessControlMockPrivateKey) const flatSignature = await wallet.signMessage( - ethers.utils.arrayify(messageHash), + ethers.utils.arrayify(message), ) const { r, s, v } = ethers.utils.splitSignature(flatSignature) await contracts.client diff --git a/contracts/test/v0.8/functions/v1/GasGolf.test.ts b/contracts/test/v0.8/functions/v1/GasGolf.test.ts index c7d9db434da..0a89562db9a 100644 --- a/contracts/test/v0.8/functions/v1/GasGolf.test.ts +++ b/contracts/test/v0.8/functions/v1/GasGolf.test.ts @@ -31,13 +31,13 @@ after(() => { describe('Gas Golf', () => { it('taking a swing', async () => { // User signs Terms of Service - const messageHash = await contracts.accessControl.getMessageHash( + const message = await contracts.accessControl.getMessage( roles.consumerAddress, roles.consumerAddress, ) const wallet = new ethers.Wallet(accessControlMockPrivateKey) const flatSignature = await wallet.signMessage( - ethers.utils.arrayify(messageHash), + ethers.utils.arrayify(message), ) const { r, s, v } = ethers.utils.splitSignature(flatSignature) const acceptTermsOfServiceTx = await contracts.accessControl diff --git a/contracts/test/v0.8/functions/v1/RouterBase.test.ts b/contracts/test/v0.8/functions/v1/RouterBase.test.ts index 55c554413ee..4797dd61af4 100644 --- a/contracts/test/v0.8/functions/v1/RouterBase.test.ts +++ b/contracts/test/v0.8/functions/v1/RouterBase.test.ts @@ -60,28 +60,27 @@ describe('FunctionsRouter - Base', () => { }) it('Owner can update config of the Router', async () => { - const beforeConfigHash = await contracts.router.getConfigHash() + const beforeConfig = await contracts.router.getConfig() await expect( - contracts.router.proposeConfigUpdate( - ids.routerId, + contracts.router.proposeConfigUpdateSelf( ethers.utils.defaultAbiCoder.encode( ['uint16', 'uint96', 'bytes4', 'uint32[]'], [2000, 1, 0x0ca76175, [300_000, 500_000]], ), ), ).to.emit(contracts.router, 'ConfigProposed') - await expect(contracts.router.updateConfig(ids.routerId)).to.emit( + await expect(contracts.router.updateConfigSelf()).to.emit( contracts.router, 'ConfigUpdated', ) - const afterConfigHash = await contracts.router.getConfigHash() - expect(beforeConfigHash).to.not.equal(afterConfigHash) + const afterConfig = await contracts.router.getConfig() + expect(beforeConfig).to.not.equal(afterConfig) }) it('Config of a contract on a route can be updated', async () => { - const beforeConfigHash = await contracts.coordinator.getConfigHash() + const beforeConfig = await contracts.coordinator.getConfig() await expect( contracts.router.proposeConfigUpdate( @@ -112,18 +111,18 @@ describe('FunctionsRouter - Base', () => { 'ConfigUpdated', ) - const afterConfigHash = await contracts.router.getConfigHash() - expect(beforeConfigHash).to.not.equal(afterConfigHash) + const afterConfig = await contracts.router.getConfig() + expect(beforeConfig).to.not.equal(afterConfig) }) it('returns the config set on the Router', async () => { const config = await contracts.router.connect(roles.stranger).getConfig() - expect(config.maxConsumers).to.equal(functionsRouterConfig.maxConsumers) - expect(config.adminFee).to.equal(functionsRouterConfig.adminFee) - expect(config.handleOracleFulfillmentSelector).to.equal( + expect(config[0]).to.equal(functionsRouterConfig.maxConsumers) + expect(config[1]).to.equal(functionsRouterConfig.adminFee) + expect(config[2]).to.equal( functionsRouterConfig.handleOracleFulfillmentSelector, ) - expect(config.maxCallbackGasLimits.toString()).to.equal( + expect(config[3].toString()).to.equal( functionsRouterConfig.maxCallbackGasLimits.toString(), ) }) diff --git a/contracts/test/v0.8/functions/v1/TermsOfServiceAllowList.test.ts b/contracts/test/v0.8/functions/v1/TermsOfServiceAllowList.test.ts index 47329fbcbdf..261196d1b36 100644 --- a/contracts/test/v0.8/functions/v1/TermsOfServiceAllowList.test.ts +++ b/contracts/test/v0.8/functions/v1/TermsOfServiceAllowList.test.ts @@ -19,12 +19,12 @@ beforeEach(async () => { describe('ToS Access Control', () => { describe('Accepting', () => { it('can only be done with a valid signature', async () => { - const messageHash = await contracts.accessControl.getMessageHash( + const message = await contracts.accessControl.getMessage( roles.strangerAddress, roles.strangerAddress, ) const flatSignature = await roles.stranger.signMessage( - ethers.utils.arrayify(messageHash), + ethers.utils.arrayify(message), ) const { r, s, v } = ethers.utils.splitSignature(flatSignature) await expect( @@ -61,13 +61,13 @@ describe('ToS Access Control', () => { it('can be done by Contract Accounts if recipient themself', async () => { const acceptorAddress = roles.consumerAddress const recipientAddress = contracts.client.address - const messageHash = await contracts.accessControl.getMessageHash( + const message = await contracts.accessControl.getMessage( acceptorAddress, recipientAddress, ) const wallet = new ethers.Wallet(accessControlMockPrivateKey) const flatSignature = await wallet.signMessage( - ethers.utils.arrayify(messageHash), + ethers.utils.arrayify(message), ) const { r, s, v } = ethers.utils.splitSignature(flatSignature) await contracts.client @@ -81,15 +81,15 @@ describe('ToS Access Control', () => { it('cannot be done by Contract Accounts that if they are not the recipient', async () => { const acceptorAddress = roles.consumerAddress const recipientAddress = contracts.coordinator.address - const messageHash = await contracts.accessControl.getMessageHash( + const message = await contracts.accessControl.getMessage( acceptorAddress, recipientAddress, ) const wallet = new ethers.Wallet(accessControlMockPrivateKey) const flatSignature = await wallet.signMessage( - ethers.utils.arrayify(messageHash), + ethers.utils.arrayify(message), ) - let { r, s, v } = ethers.utils.splitSignature(flatSignature) + const { r, s, v } = ethers.utils.splitSignature(flatSignature) await expect( contracts.client .connect(roles.consumer) diff --git a/contracts/test/v0.8/functions/v1/utils.ts b/contracts/test/v0.8/functions/v1/utils.ts index ad3a01b9bd3..8eddd04029a 100644 --- a/contracts/test/v0.8/functions/v1/utils.ts +++ b/contracts/test/v0.8/functions/v1/utils.ts @@ -161,14 +161,12 @@ export async function acceptTermsOfService( recipientAddress: string, ) { const acceptorAddress = await acceptor.getAddress() - const messageHash = await accessControl.getMessageHash( + const message = await accessControl.getMessage( acceptorAddress, recipientAddress, ) const wallet = new ethers.Wallet(accessControlMockPrivateKey) - const flatSignature = await wallet.signMessage( - ethers.utils.arrayify(messageHash), - ) + const flatSignature = await wallet.signMessage(ethers.utils.arrayify(message)) const { r, s, v } = ethers.utils.splitSignature(flatSignature) return accessControl .connect(acceptor) diff --git a/core/gethwrappers/functions/generated/functions_allow_list/functions_allow_list.go b/core/gethwrappers/functions/generated/functions_allow_list/functions_allow_list.go index 39732cfdc4d..02f71ba6926 100644 --- a/core/gethwrappers/functions/generated/functions_allow_list/functions_allow_list.go +++ b/core/gethwrappers/functions/generated/functions_allow_list/functions_allow_list.go @@ -31,8 +31,8 @@ var ( ) var TermsOfServiceAllowListMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InvalidSignature\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidUsage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByRouter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByRouterOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RecipientIsBlocked\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RouterMustBeSet\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"acceptor\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"}],\"name\":\"acceptTermsOfService\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"blockSender\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllAllowedSenders\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConfigHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"config\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageHash\",\"type\":\"bytes32\"}],\"name\":\"getEthSignedMessageHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"acceptor\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"getMessageHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"hasAccess\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"isBlockedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"unblockSender\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"name\":\"updateConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60a06040523480156200001157600080fd5b50604051620011e2380380620011e2833981016040819052620000349162000156565b81816001600160a01b0382166200005e57604051632530e88560e11b815260040160405180910390fd5b6001600160a01b03821660805262000076816200008b565b80516020909101206000555062000284915050565b60008082806020019051810190620000a4919062000241565b6040805180820182528315158082526001600160a01b0384166020928301819052600480546001600160a81b031916610100600160a81b031984161761010090920291909117905591519182529294509092507f22aa8545955b447cb49ea37e67de742e750839c633ded8c9b5b09614843b229f910160405180910390a1505050565b6001600160a01b03811681146200013d57600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200016a57600080fd5b8251620001778162000127565b602084810151919350906001600160401b03808211156200019757600080fd5b818601915086601f830112620001ac57600080fd5b815181811115620001c157620001c162000140565b604051601f8201601f19908116603f01168101908382118183101715620001ec57620001ec62000140565b8160405282815289868487010111156200020557600080fd5b600093505b828410156200022957848401860151818501870152928501926200020a565b60008684830101528096505050505050509250929050565b600080604083850312156200025557600080fd5b825180151581146200026657600080fd5b6020840151909250620002798162000127565b809150509250929050565b608051610f34620002ae600039600081816103ee015281816105c8015261072e0152610f346000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063817ef62e116100815780639883c10d1161005b5780639883c10d14610193578063a5e1d61d1461019b578063fa540801146101ae57600080fd5b8063817ef62e1461015857806382184c7b1461016d5780638cc6acce1461018057600080fd5b806347663acb116100b257806347663acb146101015780636b14daf81461011457806380e8a1511461013757600080fd5b8063181f5a77146100ce5780633908c4d4146100ec575b600080fd5b6100d661020f565b6040516100e39190610ad0565b60405180910390f35b6100ff6100fa366004610b61565b61022b565b005b6100ff61010f366004610bc6565b6103ec565b610127610122366004610be3565b61052d565b60405190151581526020016100e3565b61014a610145366004610c68565b610557565b6040519081526020016100e3565b6101606105b5565b6040516100e39190610ca1565b6100ff61017b366004610bc6565b6105c6565b6100ff61018e366004610d2a565b610716565b60005461014a565b6101276101a9366004610bc6565b61079b565b61014a6101bc366004610df9565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b6040518060600160405280602c8152602001610efc602c913981565b73ffffffffffffffffffffffffffffffffffffffff841660009081526003602052604090205460ff161561028b576040517f62b7a34d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600454610100900473ffffffffffffffffffffffffffffffffffffffff1660016102b86101bc8888610557565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015610306573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff161461035d576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff85161415806103a257503373ffffffffffffffffffffffffffffffffffffffff8616148015906103a25750333b155b156103d9576040517f381cfcbd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e46001856107dc565b505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610459573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061047d9190610e12565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146104e1576040517fa0f0a44600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff16600090815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60045460009060ff1661054257506001610550565b61054d6001856107fe565b90505b9392505050565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b1660348201526000906048016040516020818303038152906040528051906020012090505b92915050565b60606105c1600161082d565b905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610633573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106579190610e12565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106bb576040517fa0f0a44600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106c660018261083a565b5073ffffffffffffffffffffffffffffffffffffffff16600090815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610785576040517fc41a5b0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61078e8161085c565b8051602090910120600055565b60045460009060ff166107b057506000919050565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205460ff1690565b60006105508373ffffffffffffffffffffffffffffffffffffffff8416610932565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610550565b6060600061055083610981565b60006105508373ffffffffffffffffffffffffffffffffffffffff84166109dd565b600080828060200190518101906108739190610e2f565b60408051808201825283151580825273ffffffffffffffffffffffffffffffffffffffff84166020928301819052600480547fffffffffffffffffffffff000000000000000000000000000000000000000000167fffffffffffffffffffffff0000000000000000000000000000000000000000ff84161761010090920291909117905591519182529294509092507f22aa8545955b447cb49ea37e67de742e750839c633ded8c9b5b09614843b229f910160405180910390a1505050565b6000818152600183016020526040812054610979575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105af565b5060006105af565b6060816000018054806020026020016040519081016040528092919081815260200182805480156109d157602002820191906000526020600020905b8154815260200190600101908083116109bd575b50505050509050919050565b60008181526001830160205260408120548015610ac6576000610a01600183610e63565b8554909150600090610a1590600190610e63565b9050818114610a7a576000866000018281548110610a3557610a35610e9d565b9060005260206000200154905080876000018481548110610a5857610a58610e9d565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610a8b57610a8b610ecc565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506105af565b60009150506105af565b600060208083528351808285015260005b81811015610afd57858101830151858201604001528201610ae1565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b73ffffffffffffffffffffffffffffffffffffffff81168114610b5e57600080fd5b50565b600080600080600060a08688031215610b7957600080fd5b8535610b8481610b3c565b94506020860135610b9481610b3c565b93506040860135925060608601359150608086013560ff81168114610bb857600080fd5b809150509295509295909350565b600060208284031215610bd857600080fd5b813561055081610b3c565b600080600060408486031215610bf857600080fd5b8335610c0381610b3c565b9250602084013567ffffffffffffffff80821115610c2057600080fd5b818601915086601f830112610c3457600080fd5b813581811115610c4357600080fd5b876020828501011115610c5557600080fd5b6020830194508093505050509250925092565b60008060408385031215610c7b57600080fd5b8235610c8681610b3c565b91506020830135610c9681610b3c565b809150509250929050565b6020808252825182820181905260009190848201906040850190845b81811015610cef57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101610cbd565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610d3c57600080fd5b813567ffffffffffffffff80821115610d5457600080fd5b818401915084601f830112610d6857600080fd5b813581811115610d7a57610d7a610cfb565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610dc057610dc0610cfb565b81604052828152876020848701011115610dd957600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610e0b57600080fd5b5035919050565b600060208284031215610e2457600080fd5b815161055081610b3c565b60008060408385031215610e4257600080fd5b82518015158114610e5257600080fd5b6020840151909250610c9681610b3c565b818103818111156105af577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe46756e6374696f6e73205465726d73206f66205365727669636520416c6c6f77204c6973742076312e302e30a164736f6c6343000813000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InvalidSignature\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidUsage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByRouter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByRouterOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RecipientIsBlocked\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RouterMustBeSet\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"acceptor\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"}],\"name\":\"acceptTermsOfService\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"blockSender\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllAllowedSenders\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"acceptor\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"getMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"hasAccess\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"isBlockedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"unblockSender\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"name\":\"updateConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x60a06040523480156200001157600080fd5b506040516200118e3803806200118e83398101604081905262000034916200014b565b81816001600160a01b0382166200005e57604051632530e88560e11b815260040160405180910390fd5b6001600160a01b038216608052620000768162000080565b5050505062000279565b6000808280602001905181019062000099919062000236565b6040805180820182528315158082526001600160a01b0384166020928301819052600380546001600160a81b031916610100600160a81b031984161761010090920291909117905591519182529294509092507f22aa8545955b447cb49ea37e67de742e750839c633ded8c9b5b09614843b229f910160405180910390a1505050565b6001600160a01b03811681146200013257600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200015f57600080fd5b82516200016c816200011c565b602084810151919350906001600160401b03808211156200018c57600080fd5b818601915086601f830112620001a157600080fd5b815181811115620001b657620001b662000135565b604051601f8201601f19908116603f01168101908382118183101715620001e157620001e162000135565b816040528281528986848701011115620001fa57600080fd5b600093505b828410156200021e5784840186015181850187015292850192620001ff565b60008684830101528096505050505050509250929050565b600080604083850312156200024a57600080fd5b825180151581146200025b57600080fd5b60208401519092506200026e816200011c565b809150509250929050565b608051610eeb620002a3600039600081816103cb0152818161054701526106ad0152610eeb6000f3fe608060405234801561001057600080fd5b50600436106100a35760003560e01c8063817ef62e116100765780638cc6acce1161005b5780638cc6acce14610139578063a39b06e31461014c578063a5e1d61d1461016d57600080fd5b8063817ef62e1461011157806382184c7b1461012657600080fd5b8063181f5a77146100a85780633908c4d4146100c657806347663acb146100db5780636b14daf8146100ee575b600080fd5b6100b0610180565b6040516100bd9190610aa3565b60405180910390f35b6100d96100d4366004610b31565b61019c565b005b6100d96100e9366004610b96565b6103c9565b6101016100fc366004610bb3565b61050a565b60405190151581526020016100bd565b610119610534565b6040516100bd9190610c38565b6100d9610134366004610b96565b610545565b6100d9610147366004610cc1565b610695565b61015f61015a366004610d90565b610710565b6040519081526020016100bd565b61010161017b366004610b96565b61076e565b6040518060600160405280602c8152602001610eb3602c913981565b73ffffffffffffffffffffffffffffffffffffffff841660009081526002602052604090205460ff16156101fc576040517f62b7a34d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006102088686610710565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c810191909152605c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815282825280516020918201206003546000855291840180845281905260ff8616928401929092526060830187905260808301869052909250610100900473ffffffffffffffffffffffffffffffffffffffff169060019060a0016020604051602081039080840390855afa1580156102e2573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff1614610339576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff861614158061037e57503373ffffffffffffffffffffffffffffffffffffffff87161480159061037e5750333b155b156103b5576040517f381cfcbd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103c06000866107af565b50505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610436573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061045a9190610dc9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146104be576040517fa0f0a44600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60035460009060ff1661051f5750600161052d565b61052a6000856107d1565b90505b9392505050565b60606105406000610800565b905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b81526004016020604051808303816000875af11580156105b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d69190610dc9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461063a576040517fa0f0a44600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61064560008261080d565b5073ffffffffffffffffffffffffffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610704576040517fc41a5b0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61070d8161082f565b50565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b1660348201526000906048016040516020818303038152906040528051906020012090505b92915050565b60035460009060ff1661078357506000919050565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205460ff1690565b600061052d8373ffffffffffffffffffffffffffffffffffffffff8416610905565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600183016020526040812054151561052d565b6060600061052d83610954565b600061052d8373ffffffffffffffffffffffffffffffffffffffff84166109b0565b600080828060200190518101906108469190610de6565b60408051808201825283151580825273ffffffffffffffffffffffffffffffffffffffff84166020928301819052600380547fffffffffffffffffffffff000000000000000000000000000000000000000000167fffffffffffffffffffffff0000000000000000000000000000000000000000ff84161761010090920291909117905591519182529294509092507f22aa8545955b447cb49ea37e67de742e750839c633ded8c9b5b09614843b229f910160405180910390a1505050565b600081815260018301602052604081205461094c57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610768565b506000610768565b6060816000018054806020026020016040519081016040528092919081815260200182805480156109a457602002820191906000526020600020905b815481526020019060010190808311610990575b50505050509050919050565b60008181526001830160205260408120548015610a995760006109d4600183610e1a565b85549091506000906109e890600190610e1a565b9050818114610a4d576000866000018281548110610a0857610a08610e54565b9060005260206000200154905080876000018481548110610a2b57610a2b610e54565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610a5e57610a5e610e83565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610768565b6000915050610768565b600060208083528351808285015260005b81811015610ad057858101830151858201604001528201610ab4565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461070d57600080fd5b600080600080600060a08688031215610b4957600080fd5b8535610b5481610b0f565b94506020860135610b6481610b0f565b93506040860135925060608601359150608086013560ff81168114610b8857600080fd5b809150509295509295909350565b600060208284031215610ba857600080fd5b813561052d81610b0f565b600080600060408486031215610bc857600080fd5b8335610bd381610b0f565b9250602084013567ffffffffffffffff80821115610bf057600080fd5b818601915086601f830112610c0457600080fd5b813581811115610c1357600080fd5b876020828501011115610c2557600080fd5b6020830194508093505050509250925092565b6020808252825182820181905260009190848201906040850190845b81811015610c8657835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101610c54565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610cd357600080fd5b813567ffffffffffffffff80821115610ceb57600080fd5b818401915084601f830112610cff57600080fd5b813581811115610d1157610d11610c92565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610d5757610d57610c92565b81604052828152876020848701011115610d7057600080fd5b826020860160208301376000928101602001929092525095945050505050565b60008060408385031215610da357600080fd5b8235610dae81610b0f565b91506020830135610dbe81610b0f565b809150509250929050565b600060208284031215610ddb57600080fd5b815161052d81610b0f565b60008060408385031215610df957600080fd5b82518015158114610e0957600080fd5b6020840151909250610dbe81610b0f565b81810381811115610768577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe46756e6374696f6e73205465726d73206f66205365727669636520416c6c6f77204c6973742076312e302e30a164736f6c6343000813000a", } var TermsOfServiceAllowListABI = TermsOfServiceAllowListMetaData.ABI @@ -193,9 +193,9 @@ func (_TermsOfServiceAllowList *TermsOfServiceAllowListCallerSession) GetAllAllo return _TermsOfServiceAllowList.Contract.GetAllAllowedSenders(&_TermsOfServiceAllowList.CallOpts) } -func (_TermsOfServiceAllowList *TermsOfServiceAllowListCaller) GetConfigHash(opts *bind.CallOpts) ([32]byte, error) { +func (_TermsOfServiceAllowList *TermsOfServiceAllowListCaller) GetMessage(opts *bind.CallOpts, acceptor common.Address, recipient common.Address) ([32]byte, error) { var out []interface{} - err := _TermsOfServiceAllowList.contract.Call(opts, &out, "getConfigHash") + err := _TermsOfServiceAllowList.contract.Call(opts, &out, "getMessage", acceptor, recipient) if err != nil { return *new([32]byte), err @@ -207,56 +207,12 @@ func (_TermsOfServiceAllowList *TermsOfServiceAllowListCaller) GetConfigHash(opt } -func (_TermsOfServiceAllowList *TermsOfServiceAllowListSession) GetConfigHash() ([32]byte, error) { - return _TermsOfServiceAllowList.Contract.GetConfigHash(&_TermsOfServiceAllowList.CallOpts) +func (_TermsOfServiceAllowList *TermsOfServiceAllowListSession) GetMessage(acceptor common.Address, recipient common.Address) ([32]byte, error) { + return _TermsOfServiceAllowList.Contract.GetMessage(&_TermsOfServiceAllowList.CallOpts, acceptor, recipient) } -func (_TermsOfServiceAllowList *TermsOfServiceAllowListCallerSession) GetConfigHash() ([32]byte, error) { - return _TermsOfServiceAllowList.Contract.GetConfigHash(&_TermsOfServiceAllowList.CallOpts) -} - -func (_TermsOfServiceAllowList *TermsOfServiceAllowListCaller) GetEthSignedMessageHash(opts *bind.CallOpts, messageHash [32]byte) ([32]byte, error) { - var out []interface{} - err := _TermsOfServiceAllowList.contract.Call(opts, &out, "getEthSignedMessageHash", messageHash) - - if err != nil { - return *new([32]byte), err - } - - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) - - return out0, err - -} - -func (_TermsOfServiceAllowList *TermsOfServiceAllowListSession) GetEthSignedMessageHash(messageHash [32]byte) ([32]byte, error) { - return _TermsOfServiceAllowList.Contract.GetEthSignedMessageHash(&_TermsOfServiceAllowList.CallOpts, messageHash) -} - -func (_TermsOfServiceAllowList *TermsOfServiceAllowListCallerSession) GetEthSignedMessageHash(messageHash [32]byte) ([32]byte, error) { - return _TermsOfServiceAllowList.Contract.GetEthSignedMessageHash(&_TermsOfServiceAllowList.CallOpts, messageHash) -} - -func (_TermsOfServiceAllowList *TermsOfServiceAllowListCaller) GetMessageHash(opts *bind.CallOpts, acceptor common.Address, recipient common.Address) ([32]byte, error) { - var out []interface{} - err := _TermsOfServiceAllowList.contract.Call(opts, &out, "getMessageHash", acceptor, recipient) - - if err != nil { - return *new([32]byte), err - } - - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) - - return out0, err - -} - -func (_TermsOfServiceAllowList *TermsOfServiceAllowListSession) GetMessageHash(acceptor common.Address, recipient common.Address) ([32]byte, error) { - return _TermsOfServiceAllowList.Contract.GetMessageHash(&_TermsOfServiceAllowList.CallOpts, acceptor, recipient) -} - -func (_TermsOfServiceAllowList *TermsOfServiceAllowListCallerSession) GetMessageHash(acceptor common.Address, recipient common.Address) ([32]byte, error) { - return _TermsOfServiceAllowList.Contract.GetMessageHash(&_TermsOfServiceAllowList.CallOpts, acceptor, recipient) +func (_TermsOfServiceAllowList *TermsOfServiceAllowListCallerSession) GetMessage(acceptor common.Address, recipient common.Address) ([32]byte, error) { + return _TermsOfServiceAllowList.Contract.GetMessage(&_TermsOfServiceAllowList.CallOpts, acceptor, recipient) } func (_TermsOfServiceAllowList *TermsOfServiceAllowListCaller) HasAccess(opts *bind.CallOpts, user common.Address, arg1 []byte) (bool, error) { @@ -511,11 +467,7 @@ func (_TermsOfServiceAllowList *TermsOfServiceAllowList) Address() common.Addres type TermsOfServiceAllowListInterface interface { GetAllAllowedSenders(opts *bind.CallOpts) ([]common.Address, error) - GetConfigHash(opts *bind.CallOpts) ([32]byte, error) - - GetEthSignedMessageHash(opts *bind.CallOpts, messageHash [32]byte) ([32]byte, error) - - GetMessageHash(opts *bind.CallOpts, acceptor common.Address, recipient common.Address) ([32]byte, error) + GetMessage(opts *bind.CallOpts, acceptor common.Address, recipient common.Address) ([32]byte, error) HasAccess(opts *bind.CallOpts, user common.Address, arg1 []byte) (bool, error) diff --git a/core/gethwrappers/functions/generated/functions_coordinator/functions_coordinator.go b/core/gethwrappers/functions/generated/functions_coordinator/functions_coordinator.go index fe3daaf8e1d..c76a387bf8f 100644 --- a/core/gethwrappers/functions/generated/functions_coordinator/functions_coordinator.go +++ b/core/gethwrappers/functions/generated/functions_coordinator/functions_coordinator.go @@ -64,8 +64,8 @@ type IFunctionsRequestCommitment struct { } var FunctionsCoordinatorMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"linkToNativeFeed\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"EmptyPublicKey\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyRequestData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentReportData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCalldata\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"linkWei\",\"type\":\"int256\"}],\"name\":\"InvalidLinkWeiPrice\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSubscription\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"MustBeSubOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoTransmittersSet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByRouter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByRouterOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PaymentTooLarge\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReportInvalid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RouterMustBeSet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedPublicKeyChange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedSender\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedRequestDataVersion\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"}],\"name\":\"CommitmentDeleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"maxCallbackGasLimit\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"feedStalenessSeconds\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"gasOverheadBeforeCallback\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"gasOverheadAfterCallback\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"requestTimeoutSeconds\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint80\",\"name\":\"donFee\",\"type\":\"uint80\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"maxSupportedRequestDataVersion\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fulfillmentGasPriceOverEstimationBP\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"int256\",\"name\":\"fallbackNativePerUnitLink\",\"type\":\"int256\"}],\"name\":\"ConfigChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"previousConfigBlockNumber\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"configCount\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"onchainConfig\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"requestingContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"requestInitiator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"subscriptionOwner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"dataVersion\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"flags\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"callbackGasLimit\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"commitment\",\"type\":\"bytes\"}],\"name\":\"OracleRequest\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"}],\"name\":\"OracleResponse\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"name\":\"Transmitted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"}],\"name\":\"deleteCommitment\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"node\",\"type\":\"address\"}],\"name\":\"deleteNodePublicKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"gasPrice\",\"type\":\"uint256\"}],\"name\":\"estimateCost\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAdminFee\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllNodePublicKeys\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"},{\"internalType\":\"bytes[]\",\"name\":\"\",\"type\":\"bytes[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConfig\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"maxCallbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"feedStalenessSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasOverheadBeforeCallback\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasOverheadAfterCallback\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"requestTimeoutSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint80\",\"name\":\"donFee\",\"type\":\"uint80\"},{\"internalType\":\"uint16\",\"name\":\"maxSupportedRequestDataVersion\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"fulfillmentGasPriceOverEstimationBP\",\"type\":\"uint256\"},{\"internalType\":\"int256\",\"name\":\"fallbackNativePerUnitLink\",\"type\":\"int256\"},{\"internalType\":\"address\",\"name\":\"linkPriceFeed\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConfigHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"config\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"client\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"expectedGasPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint96\",\"name\":\"adminFee\",\"type\":\"uint96\"}],\"internalType\":\"structIFunctionsBilling.RequestBilling\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"getDONFee\",\"outputs\":[{\"internalType\":\"uint80\",\"name\":\"\",\"type\":\"uint80\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDONPublicKey\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFeedData\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getThresholdPublicKey\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDetails\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDigestAndEpoch\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"scanLogs\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"amount\",\"type\":\"uint96\"}],\"name\":\"oracleWithdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"requestingContract\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"subscriptionOwner\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"internalType\":\"uint16\",\"name\":\"dataVersion\",\"type\":\"uint16\"},{\"internalType\":\"bytes32\",\"name\":\"flags\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint96\",\"name\":\"adminFee\",\"type\":\"uint96\"}],\"internalType\":\"structIFunctionsCoordinator.Request\",\"name\":\"request\",\"type\":\"tuple\"}],\"name\":\"sendRequest\",\"outputs\":[{\"components\":[{\"internalType\":\"uint96\",\"name\":\"adminFee\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"coordinator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"client\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint96\",\"name\":\"estimatedTotalCostJuels\",\"type\":\"uint96\"},{\"internalType\":\"uint40\",\"name\":\"timeoutTimestamp\",\"type\":\"uint40\"},{\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"},{\"internalType\":\"uint80\",\"name\":\"donFee\",\"type\":\"uint80\"},{\"internalType\":\"uint40\",\"name\":\"gasOverheadBeforeCallback\",\"type\":\"uint40\"},{\"internalType\":\"uint40\",\"name\":\"gasOverheadAfterCallback\",\"type\":\"uint40\"}],\"internalType\":\"structIFunctionsRequest.Commitment\",\"name\":\"commitment\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"_transmitters\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"_f\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"_onchainConfig\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"_offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"_offchainConfig\",\"type\":\"bytes\"}],\"name\":\"setConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"donPublicKey\",\"type\":\"bytes\"}],\"name\":\"setDONPublicKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"node\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"publicKey\",\"type\":\"bytes\"}],\"name\":\"setNodePublicKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"thresholdPublicKey\",\"type\":\"bytes\"}],\"name\":\"setThresholdPublicKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"rs\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"ss\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32\",\"name\":\"rawVs\",\"type\":\"bytes32\"}],\"name\":\"transmit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"transmitters\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"name\":\"updateConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60c06040523480156200001157600080fd5b5060405162005adb38038062005adb833981016040819052620000349162000462565b828282828260013380600081620000925760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c557620000c58162000154565b50505015156080526001600160a01b038216620000f557604051632530e88560e11b815260040160405180910390fd5b6001600160a01b03821660a0526200010d81620001ff565b805160209091012060075550600d80546001600160a01b039092166c01000000000000000000000000026001600160601b0390921691909117905550620006349350505050565b336001600160a01b03821603620001ae5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000089565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008060008060008060008060008980602001905181019062000223919062000572565b985098509850985098509850985098509850600081136200025b576040516321ea67b360e11b81526004810182905260240162000089565b604080516101208101825263ffffffff808c168083528b8216602084018190528b83168486018190528b841660608601819052938b16608086018190526001600160501b038b1660a0870181905261ffff8b1660c0880181905260e088018b905261010090970189905260098054600160f01b9098026001600160f01b03600160a01b909302600160a01b600160f01b0319600160801b90950294909416600160801b600160f01b03196c0100000000000000000000000090990263ffffffff60601b196801000000000000000090970296909616600160401b600160801b03196401000000009098026001600160401b0319909b169098179990991795909516959095179290921794909416949094179290921792909216179055600a839055600b829055517f3332571032ee658b30d567e63b2443e9d921162625e0f3fe86968a586c1a090f906200041b908b908b908b908b908b908b908b908b908b9063ffffffff998a1681529789166020890152958816604088015293871660608701529190951660808501526001600160501b039490941660a084015261ffff9390931660c083015260e08201929092526101008101919091526101200190565b60405180910390a150505050505050505050565b80516001600160a01b03811681146200044757600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b6000806000606084860312156200047857600080fd5b62000483846200042f565b602085810151919450906001600160401b0380821115620004a357600080fd5b818701915087601f830112620004b857600080fd5b815181811115620004cd57620004cd6200044c565b604051601f8201601f19908116603f01168101908382118183101715620004f857620004f86200044c565b816040528281528a868487010111156200051157600080fd5b600093505b8284101562000535578484018601518185018701529285019262000516565b600086848301015280975050505050505062000554604085016200042f565b90509250925092565b805163ffffffff811681146200044757600080fd5b60008060008060008060008060006101208a8c0312156200059257600080fd5b6200059d8a6200055d565b9850620005ad60208b016200055d565b9750620005bd60408b016200055d565b9650620005cd60608b016200055d565b9550620005dd60808b016200055d565b60a08b01519095506001600160501b0381168114620005fb57600080fd5b60c08b015190945061ffff811681146200061457600080fd5b8093505060e08a015191506101008a015190509295985092959850929598565b60805160a0516154506200068b6000396000818161069101528181610ac801528181610eeb01528181610fc9015281816118cb01528181611b650152818161313d015261399a0152600061129c01526154506000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c806385b214cf116100ee578063b1dc65a411610097578063d227d24511610071578063d227d24514610526578063d328a91e14610539578063e3d0e71214610541578063f2fde38b1461055457600080fd5b8063b1dc65a4146103f5578063bdd7e88014610408578063c3f909d41461042857600080fd5b80639883c10d116100c85780639883c10d146103bb578063af1296d3146103cd578063afcb95d7146103d557600080fd5b806385b214cf1461035d5780638cc6acce146103805780638da5cb5b1461039357600080fd5b806366316d8d1161015b578063807560311161013557806380756031146102c057806381411834146102d357806381f1b938146102e857806381ff7048146102f057600080fd5b806366316d8d1461029257806379ba5097146102a55780637f15e166146102ad57600080fd5b806326ceabac1161018c57806326ceabac146102445780632a905ccc14610257578063533989871461027c57600080fd5b8063083a5466146101b35780630e7ada39146101c8578063181f5a77146101fb575b600080fd5b6101c66101c1366004613c2d565b610567565b005b6101db6101d6366004613e5a565b6105bc565b60405169ffffffffffffffffffff90911681526020015b60405180910390f35b6102376040518060400160405280601c81526020017f46756e6374696f6e7320436f6f7264696e61746f722076312e302e300000000081525081565b6040516101f29190613f8f565b6101c6610252366004613fa9565b6105ea565b61025f61068c565b6040516bffffffffffffffffffffffff90911681526020016101f2565b61028461074a565b6040516101f2929190614017565b6101c66102a03660046140a7565b6109ce565b6101c6610b88565b6101c66102bb366004613c2d565b610c8a565b6101c66102ce3660046140e0565b610cda565b6102db610d91565b6040516101f29190614135565b610237610e00565b61033a60015460025463ffffffff74010000000000000000000000000000000000000000830481169378010000000000000000000000000000000000000000000000009093041691565b6040805163ffffffff9485168152939092166020840152908201526060016101f2565b61037061036b366004614148565b610ed1565b60405190151581526020016101f2565b6101c661038e366004614161565b610fb1565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101f2565b6007545b6040519081526020016101f2565b6103bf611036565b6040805160018152600060208201819052918101919091526060016101f2565b6101c66104033660046141e3565b611129565b61041b61041636600461429a565b61185a565b6040516101f291906143fc565b600954600a54600b54600d546040805163ffffffff80871682526401000000008704811660208301526801000000000000000087048116928201929092526c01000000000000000000000000808704831660608301527001000000000000000000000000000000008704909216608082015274010000000000000000000000000000000000000000860469ffffffffffffffffffff1660a08201527e0100000000000000000000000000000000000000000000000000000000000090950461ffff1660c086015260e08501939093526101008401919091520473ffffffffffffffffffffffffffffffffffffffff16610120820152610140016101f2565b61025f61053436600461440b565b611b61565b610237611d2d565b6101c661054f36600461452d565b611d84565b6101c6610562366004613fa9565b6127a8565b61056f6127b9565b60008190036105aa576040517f4f42be3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60106105b782848361469b565b505050565b60095474010000000000000000000000000000000000000000900469ffffffffffffffffffff165b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633148061062557503373ffffffffffffffffffffffffffffffffffffffff8216145b61065b576040517fed6dd19b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600f6020526040812061068991613b72565b50565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c3f909d46040518163ffffffff1660e01b8152600401600060405180830381865afa1580156106fa573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261074091908101906147dc565b6020015192915050565b606080600060068054806020026020016040519081016040528092919081815260200182805480156107b257602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610787575b505050505090506000815167ffffffffffffffff8111156107d5576107d5613c6f565b60405190808252806020026020018201604052801561080857816020015b60608152602001906001900390816107f35790505b50905060005b82518110156109c457600f600084838151811061082d5761082d614906565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805461087a906145fa565b90506000036108b5576040517f4f42be3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f60008483815181106108cb576108cb614906565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054610918906145fa565b80601f0160208091040260200160405190810160405280929190818152602001828054610944906145fa565b80156109915780601f1061096657610100808354040283529160200191610991565b820191906000526020600020905b81548152906001019060200180831161097457829003601f168201915b50505050508282815181106109a8576109a8614906565b6020026020010181905250806109bd90614964565b905061080e565b5090939092509050565b6109d661283c565b806bffffffffffffffffffffffff16600003610a0c5750336000908152600c60205260409020546bffffffffffffffffffffffff165b336000908152600c60205260409020546bffffffffffffffffffffffff80831691161015610a66576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600c602052604081208054839290610a939084906bffffffffffffffffffffffff1661499c565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055506000610aea7f000000000000000000000000000000000000000000000000000000000000000090565b6040517f66316d8d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301526bffffffffffffffffffffffff85166024830152919250908216906366316d8d90604401600060405180830381600087803b158015610b6b57600080fd5b505af1158015610b7f573d6000803e3d6000fd5b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610c0e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610c926127b9565b6000819003610ccd576040517f4f42be3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e6105b782848361469b565b60005473ffffffffffffffffffffffffffffffffffffffff16331480610d255750610d04336129cd565b8015610d2557503373ffffffffffffffffffffffffffffffffffffffff8416145b610d5b576040517fed6dd19b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600f60205260409020610d8b82848361469b565b50505050565b60606006805480602002602001604051908101604052809291908181526020018280548015610df657602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610dcb575b5050505050905090565b606060108054610e0f906145fa565b9050600003610e4a576040517f4f42be3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60108054610e57906145fa565b80601f0160208091040260200160405190810160405280929190818152602001828054610e83906145fa565b8015610df65780601f10610ea557610100808354040283529160200191610df6565b820191906000526020600020905b815481529060010190602001808311610eb357509395945050505050565b60003373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610f42576040517fc41a5b0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260086020526040902054610f5d57506000919050565b60008281526008602052604080822091909155517f8a4b97add3359bd6bcf5e82874363670eb5ad0f7615abddbd0ed0a3a98f0f41690610fa09084815260200190565b60405180910390a15060015b919050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614611020576040517fc41a5b0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61102981612ab6565b8051602090910120600755565b600954600d54604080517ffeaf968c0000000000000000000000000000000000000000000000000000000081529051600093640100000000900463ffffffff169283151592859283926c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff169163feaf968c9160048083019260a09291908290030181865afa1580156110d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f491906149e2565b50935050925050828015611116575061110d8142614a32565b8463ffffffff16105b1561112157600b5491505b509392505050565b60005a604080516020601f8b018190048102820181019092528981529192508a3591818c01359161117f91849163ffffffff851691908e908e9081908401838280828437600092019190915250612dbf92505050565b6111b5576040517f0be3632800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805183815262ffffff600884901c1660208201527fb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62910160405180910390a16040805160608101825260025480825260035460ff8082166020850152610100909104169282019290925290831461128a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f636f6e666967446967657374206d69736d6174636800000000000000000000006044820152606401610c05565b6112988b8b8b8b8b8b612dc8565b60007f0000000000000000000000000000000000000000000000000000000000000000156112f5576002826020015183604001516112d69190614a45565b6112e09190614a8d565b6112eb906001614a45565b60ff16905061130b565b6020820151611305906001614a45565b60ff1690505b888114611374576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f77726f6e67206e756d626572206f66207369676e6174757265730000000000006044820152606401610c05565b8887146113dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f7369676e617475726573206f7574206f6620726567697374726174696f6e00006044820152606401610c05565b3360009081526004602090815260408083208151808301909252805460ff8082168452929391929184019161010090910416600281111561142057611420614aaf565b600281111561143157611431614aaf565b905250905060028160200151600281111561144e5761144e614aaf565b14801561149557506006816000015160ff168154811061147057611470614906565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1633145b6114fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f756e617574686f72697a6564207472616e736d697474657200000000000000006044820152606401610c05565b5050505050611508613bac565b6000808a8a60405161151b929190614ade565b604051908190038120611532918e90602001614aee565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120838301909252600080845290830152915060005b8981101561183c57600060018489846020811061159b5761159b614906565b6115a891901a601b614a45565b8e8e868181106115ba576115ba614906565b905060200201358d8d878181106115d3576115d3614906565b9050602002013560405160008152602001604052604051611610949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015611632573d6000803e3d6000fd5b5050604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081015173ffffffffffffffffffffffffffffffffffffffff811660009081526004602090815290849020838501909452835460ff808216855292965092945084019161010090041660028111156116b2576116b2614aaf565b60028111156116c3576116c3614aaf565b90525092506001836020015160028111156116e0576116e0614aaf565b14611747576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f61646472657373206e6f7420617574686f72697a656420746f207369676e00006044820152606401610c05565b8251600090879060ff16601f811061176157611761614906565b602002015173ffffffffffffffffffffffffffffffffffffffff16146117e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f6e6f6e2d756e69717565207369676e61747572650000000000000000000000006044820152606401610c05565b8086846000015160ff16601f81106117fd576117fd614906565b73ffffffffffffffffffffffffffffffffffffffff9092166020929092020152611828600186614a45565b9450508061183590614964565b905061157c565b50505061184d833383858e8e612e76565b5050505050505050505050565b6040805161016081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101919091523373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614611922576040517fc41a5b0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61192f6040830183614b02565b9050600003611969576040517ec1cfc000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006040518060a001604052808460600160208101906119899190614b67565b67ffffffffffffffff1681526020908101906119a790860186613fa9565b73ffffffffffffffffffffffffffffffffffffffff1681526020016119d260e0860160c08701614b84565b63ffffffff1681523a60208201526040016119f4610100860160e08701614ba1565b6bffffffffffffffffffffffff1690529050611a61611a166040850185614b02565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611a5b9250505060a0860160808701614bbe565b83613044565b9150611a706020840184613fa9565b73ffffffffffffffffffffffffffffffffffffffff168260e001517fd88ef982f3624222a23ef83ed2192cbdfba8e1e474a6cb1d315736d08479d2e332866060016020810190611ac09190614b67565b611ad06040890160208a01613fa9565b611add60408a018a614b02565b611aed60a08c0160808d01614bbe565b60a08c0135611b0260e08e0160c08f01614b84565b8c604051602001611b1391906143fc565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611b53999897969594939291614bdb565b60405180910390a350919050565b60007f00000000000000000000000000000000000000000000000000000000000000006040517f10fc49c100000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8816600482015263ffffffff8516602482015273ffffffffffffffffffffffffffffffffffffffff91909116906310fc49c19060440160006040518083038186803b158015611c0157600080fd5b505afa158015611c15573d6000803e3d6000fd5b50505050620f4240821115611c56576040517f8129bbcd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611c6061068c565b905060006040518060a001604052808967ffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018663ffffffff168152602001858152602001836bffffffffffffffffffffffff1681525090506000611d0488888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508692506105bc915050565b69ffffffffffffffffffff169050611d1e86868386613539565b93505050505b95945050505050565b6060600e8054611d3c906145fa565b9050600003611d77576040517f4f42be3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e8054610e57906145fa565b855185518560ff16601f831115611df7576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f746f6f206d616e79207369676e657273000000000000000000000000000000006044820152606401610c05565b80600003611e61576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f66206d75737420626520706f73697469766500000000000000000000000000006044820152606401610c05565b818314611eef576040517f89a61989000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f6f7261636c6520616464726573736573206f7574206f6620726567697374726160448201527f74696f6e000000000000000000000000000000000000000000000000000000006064820152608401610c05565b611efa816003614c9f565b8311611f62576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661756c74792d6f7261636c65206620746f6f206869676800000000000000006044820152606401610c05565b611f6a6127b9565b6040805160c0810182528a8152602081018a905260ff89169181018290526060810188905267ffffffffffffffff8716608082015260a0810186905290611fb190886136a9565b6005541561216657600554600090611fcb90600190614a32565b9050600060058281548110611fe257611fe2614906565b60009182526020822001546006805473ffffffffffffffffffffffffffffffffffffffff9092169350908490811061201c5761201c614906565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff85811684526004909252604080842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009081169091559290911680845292208054909116905560058054919250908061209c5761209c614cb6565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055019055600680548061210557612105614cb6565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905501905550611fb1915050565b60005b8151518110156125cd576000600460008460000151848151811061218f5761218f614906565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002054610100900460ff1660028111156121d9576121d9614aaf565b14612240576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f7265706561746564207369676e657220616464726573730000000000000000006044820152606401610c05565b6040805180820190915260ff8216815260016020820152825180516004916000918590811061227157612271614906565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff168252818101929092526040016000208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117835592840151919283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000161761010083600281111561231257612312614aaf565b0217905550600091506123229050565b600460008460200151848151811061233c5761233c614906565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002054610100900460ff16600281111561238657612386614aaf565b146123ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f7265706561746564207472616e736d69747465722061646472657373000000006044820152606401610c05565b6040805180820190915260ff82168152602081016002815250600460008460200151848151811061242057612420614906565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff168252818101929092526040016000208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117835592840151919283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016176101008360028111156124c1576124c1614aaf565b0217905550508251805160059250839081106124df576124df614906565b602090810291909101810151825460018101845560009384529282902090920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909316929092179091558201518051600691908390811061255b5761255b614906565b60209081029190910181015182546001810184556000938452919092200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055806125c581614964565b915050612169565b506040810151600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff909216919091179055600180547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff8116780100000000000000000000000000000000000000000000000063ffffffff438116820292909217808555920481169291829160149161268591849174010000000000000000000000000000000000000000900416614ce5565b92506101000a81548163ffffffff021916908363ffffffff1602179055506126e44630600160149054906101000a900463ffffffff1663ffffffff16856000015186602001518760400151886060015189608001518a60a001516136c6565b600281905582518051600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010060ff9093169290920291909117905560015460208501516040808701516060880151608089015160a08a015193517f1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e059861279b988b9891977401000000000000000000000000000000000000000090920463ffffffff16969095919491939192614d02565b60405180910390a161184d565b6127b06127b9565b61068981613771565b60005473ffffffffffffffffffffffffffffffffffffffff16331461283a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610c05565b565b6000612846610d91565b90508051600003612883576040517f30274b3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600d546000916128a2916bffffffffffffffffffffffff16614d88565b905060005b825181101561296e5781600c60008584815181106128c7576128c7614906565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a90046bffffffffffffffffffffffff1661292f9190614db3565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508061296790614964565b90506128a7565b50815161297b9082614dd8565b600d805460009061299b9084906bffffffffffffffffffffffff1661499c565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055505050565b6000806006805480602002602001604051908101604052809291908181526020018280548015612a3357602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311612a08575b5050505050905060005b8151811015612aac578373ffffffffffffffffffffffffffffffffffffffff16828281518110612a6f57612a6f614906565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603612a9c575060019392505050565b612aa581614964565b9050612a3d565b5060009392505050565b600080600080600080600080600089806020019051810190612ad89190614e08565b98509850985098509850985098509850985060008113612b27576040517f43d4cf6600000000000000000000000000000000000000000000000000000000815260048101829052602401610c05565b604080516101208101825263ffffffff808c168083528b8216602084018190528b83168486018190528b841660608601819052938b166080860181905269ffffffffffffffffffff8b1660a0870181905261ffff8b1660c0880181905260e088018b9052610100909701899052600980547e010000000000000000000000000000000000000000000000000000000000009098027dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff740100000000000000000000000000000000000000009093027fffff00000000000000000000ffffffffffffffffffffffffffffffffffffffff700100000000000000000000000000000000909502949094167fffff0000000000000000000000000000ffffffffffffffffffffffffffffffff6c010000000000000000000000009099027fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff68010000000000000000909702969096167fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6401000000009098027fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000909b169098179990991795909516959095179290921794909416949094179290921792909216179055600a839055600b829055517f3332571032ee658b30d567e63b2443e9d921162625e0f3fe86968a586c1a090f90612dab908b908b908b908b908b908b908b908b908b9063ffffffff998a16815297891660208901529588166040880152938716606087015291909516608085015269ffffffffffffffffffff9490941660a084015261ffff9390931660c083015260e08201929092526101008101919091526101200190565b60405180910390a150505050505050505050565b60019392505050565b6000612dd5826020614c9f565b612de0856020614c9f565b612dec88610144614eb4565b612df69190614eb4565b612e009190614eb4565b612e0b906000614eb4565b9050368114610b7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f63616c6c64617461206c656e677468206d69736d6174636800000000000000006044820152606401610c05565b606080808080612e8886880188614fa2565b8451949950929750909550935091501580612ea557508351855114155b80612eb257508251855114155b80612ebf57508151855114155b80612ecc57508051855114155b15612f03576040517f0be3632800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8551811015613036576000612f9b878381518110612f2657612f26614906565b6020026020010151878481518110612f4057612f40614906565b6020026020010151878581518110612f5a57612f5a614906565b6020026020010151878681518110612f7457612f74614906565b6020026020010151878781518110612f8e57612f8e614906565b6020026020010151613866565b90506000816006811115612fb157612fb1614aaf565b1480612fce57506001816006811115612fcc57612fcc614aaf565b145b1561302557868281518110612fe557612fe5614906565b60209081029190910181015160405133815290917fc708e0440951fd63499c0f7a73819b469ee5dd3ecc356c0ab4eb7f18389009d9910160405180910390a25b5061302f81614964565b9050612f06565b505050505050505050505050565b6040805161016081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081019190915260095461ffff7e0100000000000000000000000000000000000000000000000000000000000090910481169084161115613103576040517fdada758700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061310f85846105bc565b90506000613137846040015185606001518469ffffffffffffffffffff168760800151613539565b905060007f000000000000000000000000000000000000000000000000000000000000000085516040517fa47c769600000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152909150600090819073ffffffffffffffffffffffffffffffffffffffff84169063a47c769690602401600060405180830381865afa1580156131db573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052613221919081019061507f565b505050602089015189516040517f674603d000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff928316600482015267ffffffffffffffff90911660248201529294509092506000919085169063674603d090604401606060405180830381865afa1580156132b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132d69190615176565b509150506bffffffffffffffffffffffff85166132f3838561499c565b6bffffffffffffffffffffffff161015613339576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006133b8308a602001518b6000015185600161335691906151c8565b6040805173ffffffffffffffffffffffffffffffffffffffff958616602080830191909152949095168582015267ffffffffffffffff928316606086015291166080808501919091528151808503909101815260a09093019052815191012090565b90506040518061016001604052808a608001516bffffffffffffffffffffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff1681526020018a6020015173ffffffffffffffffffffffffffffffffffffffff1681526020018a6000015167ffffffffffffffff1681526020018a6040015163ffffffff168152602001876bffffffffffffffffffffffff168152602001600960000160109054906101000a900463ffffffff1663ffffffff16426134799190614eb4565b64ffffffffff168152602080820184905269ffffffffffffffffffff8a1660408084019190915260095463ffffffff680100000000000000008204811660608601526c010000000000000000000000009091041660809093019290925290519199506134e7918a91016143fc565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000938452600890925290912055509498975050505050505050565b600080613544611036565b905060008113613583576040517f43d4cf6600000000000000000000000000000000000000000000000000000000815260048101829052602401610c05565b60095460009087906135b99063ffffffff6c01000000000000000000000000820481169168010000000000000000900416614ce5565b6135c39190614ce5565b63ffffffff1690506000612710600960010154886135e19190614c9f565b6135eb91906151e9565b6135f59088614eb4565b90506000838361360d84670de0b6b3a7640000614c9f565b6136179190614c9f565b61362191906151e9565b905060006136406bffffffffffffffffffffffff808916908a16614eb4565b9050613658816b033b2e3c9fd0803ce8000000614a32565b821115613691576040517fe80fa38100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61369b8183614eb4565b9a9950505050505050505050565b60006136b3610d91565b5111156136c2576136c261283c565b5050565b6000808a8a8a8a8a8a8a8a8a6040516020016136ea999897969594939291906151fd565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179150509998505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff8216036137f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610c05565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000808380602001905181019061387d91906152a7565b60008881526008602052604090205490915061389d576002915050611d24565b806040516020016138ae91906143fc565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008a8152600890935291205414613900576006915050611d24565b600061390a611036565b905060008113613949576040517f43d4cf6600000000000000000000000000000000000000000000000000000000815260048101829052602401610c05565b60008161395e3a670de0b6b3a7640000614c9f565b61396891906151e9565b90506000836101400151846101200151613982919061537a565b6139939064ffffffffff1683614c9f565b90506000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a1d4c8288c8c878a610100015169ffffffffffffffffffff16886139f49190614db3565b338c6040518763ffffffff1660e01b8152600401613a1796959493929190615398565b60408051808303816000875af1158015613a35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a599190615414565b9150915060008260ff166006811115613a7457613a74614aaf565b90506000816006811115613a8a57613a8a614aaf565b1480613aa757506001816006811115613aa557613aa5614aaf565b145b15613b625760008d815260086020526040812055613ac58285614db3565b336000908152600c6020526040812080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff938416179055610100890151600d805469ffffffffffffffffffff90921693909291613b3391859116614db3565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055505b9c9b505050505050505050505050565b508054613b7e906145fa565b6000825580601f10613b8e575050565b601f0160209004906000526020600020908101906106899190613bcb565b604051806103e00160405280601f906020820280368337509192915050565b5b80821115613be05760008155600101613bcc565b5090565b60008083601f840112613bf657600080fd5b50813567ffffffffffffffff811115613c0e57600080fd5b602083019150836020828501011115613c2657600080fd5b9250929050565b60008060208385031215613c4057600080fd5b823567ffffffffffffffff811115613c5757600080fd5b613c6385828601613be4565b90969095509350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff81118282101715613cc157613cc1613c6f565b60405290565b6040516080810167ffffffffffffffff81118282101715613cc157613cc1613c6f565b604051610160810167ffffffffffffffff81118282101715613cc157613cc1613c6f565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613d5557613d55613c6f565b604052919050565b600082601f830112613d6e57600080fd5b813567ffffffffffffffff811115613d8857613d88613c6f565b613db960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613d0e565b818152846020838601011115613dce57600080fd5b816020850160208301376000918101602001919091529392505050565b67ffffffffffffffff8116811461068957600080fd5b8035610fac81613deb565b73ffffffffffffffffffffffffffffffffffffffff8116811461068957600080fd5b63ffffffff8116811461068957600080fd5b6bffffffffffffffffffffffff8116811461068957600080fd5b60008082840360c0811215613e6e57600080fd5b833567ffffffffffffffff811115613e8557600080fd5b613e9186828701613d5d565b93505060a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082011215613ec457600080fd5b50613ecd613c9e565b6020840135613edb81613deb565b81526040840135613eeb81613e0c565b60208201526060840135613efe81613e2e565b60408201526080840135606082015260a0840135613f1b81613e40565b6080820152919491935090915050565b6000815180845260005b81811015613f5157602081850181015186830182015201613f35565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000613fa26020830184613f2b565b9392505050565b600060208284031215613fbb57600080fd5b8135613fa281613e0c565b600081518084526020808501945080840160005b8381101561400c57815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101613fda565b509495945050505050565b60408152600061402a6040830185613fc6565b6020838203818501528185518084528284019150828160051b85010183880160005b83811015614098577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0878403018552614086838351613f2b565b9486019492509085019060010161404c565b50909998505050505050505050565b600080604083850312156140ba57600080fd5b82356140c581613e0c565b915060208301356140d581613e40565b809150509250929050565b6000806000604084860312156140f557600080fd5b833561410081613e0c565b9250602084013567ffffffffffffffff81111561411c57600080fd5b61412886828701613be4565b9497909650939450505050565b602081526000613fa26020830184613fc6565b60006020828403121561415a57600080fd5b5035919050565b60006020828403121561417357600080fd5b813567ffffffffffffffff81111561418a57600080fd5b61419684828501613d5d565b949350505050565b60008083601f8401126141b057600080fd5b50813567ffffffffffffffff8111156141c857600080fd5b6020830191508360208260051b8501011115613c2657600080fd5b60008060008060008060008060e0898b0312156141ff57600080fd5b606089018a81111561421057600080fd5b8998503567ffffffffffffffff8082111561422a57600080fd5b6142368c838d01613be4565b909950975060808b013591508082111561424f57600080fd5b61425b8c838d0161419e565b909750955060a08b013591508082111561427457600080fd5b506142818b828c0161419e565b999c989b50969995989497949560c00135949350505050565b6000602082840312156142ac57600080fd5b813567ffffffffffffffff8111156142c357600080fd5b82016101008185031215613fa257600080fd5b80516bffffffffffffffffffffffff168252602081015161430f602084018273ffffffffffffffffffffffffffffffffffffffff169052565b506040810151614337604084018273ffffffffffffffffffffffffffffffffffffffff169052565b506060810151614353606084018267ffffffffffffffff169052565b50608081015161436b608084018263ffffffff169052565b5060a081015161438b60a08401826bffffffffffffffffffffffff169052565b5060c08101516143a460c084018264ffffffffff169052565b5060e081015160e0830152610100808201516143cd8285018269ffffffffffffffffffff169052565b50506101208181015164ffffffffff81168483015250506101408181015164ffffffffff811684830152610d8b565b61016081016105e482846142d6565b60008060008060006080868803121561442357600080fd5b853561442e81613deb565b9450602086013567ffffffffffffffff81111561444a57600080fd5b61445688828901613be4565b909550935050604086013561446a81613e2e565b949793965091946060013592915050565b600067ffffffffffffffff82111561449557614495613c6f565b5060051b60200190565b600082601f8301126144b057600080fd5b813560206144c56144c08361447b565b613d0e565b82815260059290921b840181019181810190868411156144e457600080fd5b8286015b848110156145085780356144fb81613e0c565b83529183019183016144e8565b509695505050505050565b60ff8116811461068957600080fd5b8035610fac81614513565b60008060008060008060c0878903121561454657600080fd5b863567ffffffffffffffff8082111561455e57600080fd5b61456a8a838b0161449f565b9750602089013591508082111561458057600080fd5b61458c8a838b0161449f565b965061459a60408a01614522565b955060608901359150808211156145b057600080fd5b6145bc8a838b01613d5d565b94506145ca60808a01613e01565b935060a08901359150808211156145e057600080fd5b506145ed89828a01613d5d565b9150509295509295509295565b600181811c9082168061460e57607f821691505b602082108103614647577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f8211156105b757600081815260208120601f850160051c810160208610156146745750805b601f850160051c820191505b8181101561469357828155600101614680565b505050505050565b67ffffffffffffffff8311156146b3576146b3613c6f565b6146c7836146c183546145fa565b8361464d565b6000601f84116001811461471957600085156146e35750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556147af565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156147685786850135825560209485019460019092019101614748565b50868210156147a3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b61ffff8116811461068957600080fd5b8051610fac81613e40565b8051610fac81613e2e565b600060208083850312156147ef57600080fd5b825167ffffffffffffffff8082111561480757600080fd5b908401906080828703121561481b57600080fd5b614823613cc7565b825161482e816147b6565b81528284015161483d81613e40565b8185015260408301517fffffffff000000000000000000000000000000000000000000000000000000008116811461487457600080fd5b604082015260608301518281111561488b57600080fd5b80840193505086601f8401126148a057600080fd5b825191506148b06144c08361447b565b82815260059290921b830184019184810190888411156148cf57600080fd5b938501935b838510156148f65784516148e781613e2e565b825293850193908501906148d4565b6060830152509695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361499557614995614935565b5060010190565b6bffffffffffffffffffffffff8281168282160390808211156149c1576149c1614935565b5092915050565b805169ffffffffffffffffffff81168114610fac57600080fd5b600080600080600060a086880312156149fa57600080fd5b614a03866149c8565b9450602086015193506040860151925060608601519150614a26608087016149c8565b90509295509295909350565b818103818111156105e4576105e4614935565b60ff81811683821601908111156105e4576105e4614935565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680614aa057614aa0614a5e565b8060ff84160491505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8183823760009101908152919050565b828152606082602083013760800192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614b3757600080fd5b83018035915067ffffffffffffffff821115614b5257600080fd5b602001915036819003821315613c2657600080fd5b600060208284031215614b7957600080fd5b8135613fa281613deb565b600060208284031215614b9657600080fd5b8135613fa281613e2e565b600060208284031215614bb357600080fd5b8135613fa281613e40565b600060208284031215614bd057600080fd5b8135613fa2816147b6565b73ffffffffffffffffffffffffffffffffffffffff8a8116825267ffffffffffffffff8a16602083015288166040820152610100606082018190528101869052600061012087898285013760008189850101527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f890116830161ffff881660808501528660a0850152614c7860c085018763ffffffff169052565b818482030160e0850152614c8e82820186613f2b565b9d9c50505050505050505050505050565b80820281158282048414176105e4576105e4614935565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b63ffffffff8181168382160190808211156149c1576149c1614935565b600061012063ffffffff808d1684528b6020850152808b16604085015250806060840152614d328184018a613fc6565b90508281036080840152614d468189613fc6565b905060ff871660a084015282810360c0840152614d638187613f2b565b905067ffffffffffffffff851660e0840152828103610100840152613b628185613f2b565b60006bffffffffffffffffffffffff80841680614da757614da7614a5e565b92169190910492915050565b6bffffffffffffffffffffffff8181168382160190808211156149c1576149c1614935565b6bffffffffffffffffffffffff818116838216028082169190828114614e0057614e00614935565b505092915050565b60008060008060008060008060006101208a8c031215614e2757600080fd5b8951614e3281613e2e565b60208b0151909950614e4381613e2e565b60408b0151909850614e5481613e2e565b60608b0151909750614e6581613e2e565b60808b0151909650614e7681613e2e565b9450614e8460a08b016149c8565b935060c08a0151614e94816147b6565b8093505060e08a015191506101008a015190509295985092959850929598565b808201808211156105e4576105e4614935565b600082601f830112614ed857600080fd5b81356020614ee86144c08361447b565b82815260059290921b84018101918181019086841115614f0757600080fd5b8286015b848110156145085780358352918301918301614f0b565b600082601f830112614f3357600080fd5b81356020614f436144c08361447b565b82815260059290921b84018101918181019086841115614f6257600080fd5b8286015b8481101561450857803567ffffffffffffffff811115614f865760008081fd5b614f948986838b0101613d5d565b845250918301918301614f66565b600080600080600060a08688031215614fba57600080fd5b853567ffffffffffffffff80821115614fd257600080fd5b614fde89838a01614ec7565b96506020880135915080821115614ff457600080fd5b61500089838a01614f22565b9550604088013591508082111561501657600080fd5b61502289838a01614f22565b9450606088013591508082111561503857600080fd5b61504489838a01614f22565b9350608088013591508082111561505a57600080fd5b5061506788828901614f22565b9150509295509295909350565b8051610fac81613e0c565b600080600080600060a0868803121561509757600080fd5b85516150a281613e40565b809550506020808701516150b581613e40565b60408801519095506150c681613e0c565b60608801519094506150d781613e0c565b608088015190935067ffffffffffffffff8111156150f457600080fd5b8701601f8101891361510557600080fd5b80516151136144c08261447b565b81815260059190911b8201830190838101908b83111561513257600080fd5b928401925b8284101561515957835161514a81613e0c565b82529284019290840190615137565b80955050505050509295509295909350565b8051610fac81613deb565b60008060006060848603121561518b57600080fd5b8351801515811461519b57600080fd5b60208501519093506151ac81613deb565b60408501519092506151bd81613deb565b809150509250925092565b67ffffffffffffffff8181168382160190808211156149c1576149c1614935565b6000826151f8576151f8614a5e565b500490565b60006101208b835273ffffffffffffffffffffffffffffffffffffffff8b16602084015267ffffffffffffffff808b1660408501528160608501526152448285018b613fc6565b91508382036080850152615258828a613fc6565b915060ff881660a085015283820360c08501526152758288613f2b565b90861660e08501528381036101008501529050613b628185613f2b565b805164ffffffffff81168114610fac57600080fd5b600061016082840312156152ba57600080fd5b6152c2613cea565b6152cb836147c6565b81526152d960208401615074565b60208201526152ea60408401615074565b60408201526152fb6060840161516b565b606082015261530c608084016147d1565b608082015261531d60a084016147c6565b60a082015261532e60c08401615292565b60c082015260e083015160e082015261010061534b8185016149c8565b9082015261012061535d848201615292565b9082015261014061536f848201615292565b908201529392505050565b64ffffffffff8181168382160190808211156149c1576149c1614935565b60006102008083526153ac8184018a613f2b565b905082810360208401526153c08189613f2b565b6bffffffffffffffffffffffff88811660408601528716606085015273ffffffffffffffffffffffffffffffffffffffff861660808501529150615409905060a08301846142d6565b979650505050505050565b6000806040838503121561542757600080fd5b825161543281614513565b60208401519092506140d581613e4056fea164736f6c6343000813000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"linkToNativeFeed\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"EmptyPublicKey\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyRequestData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentReportData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCalldata\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"linkWei\",\"type\":\"int256\"}],\"name\":\"InvalidLinkWeiPrice\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSubscription\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"MustBeSubOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoTransmittersSet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByRouter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByRouterOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PaymentTooLarge\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReportInvalid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RouterMustBeSet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedPublicKeyChange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedSender\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedRequestDataVersion\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"}],\"name\":\"CommitmentDeleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"maxCallbackGasLimit\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"feedStalenessSeconds\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"gasOverheadBeforeCallback\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"gasOverheadAfterCallback\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"requestTimeoutSeconds\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint80\",\"name\":\"donFee\",\"type\":\"uint80\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"maxSupportedRequestDataVersion\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fulfillmentGasPriceOverEstimationBP\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"int256\",\"name\":\"fallbackNativePerUnitLink\",\"type\":\"int256\"}],\"name\":\"ConfigChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"previousConfigBlockNumber\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"configCount\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"onchainConfig\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"requestingContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"requestInitiator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"subscriptionOwner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"dataVersion\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"flags\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"callbackGasLimit\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"commitment\",\"type\":\"bytes\"}],\"name\":\"OracleRequest\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"}],\"name\":\"OracleResponse\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"name\":\"Transmitted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"}],\"name\":\"deleteCommitment\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"node\",\"type\":\"address\"}],\"name\":\"deleteNodePublicKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"gasPrice\",\"type\":\"uint256\"}],\"name\":\"estimateCost\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAdminFee\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllNodePublicKeys\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"},{\"internalType\":\"bytes[]\",\"name\":\"\",\"type\":\"bytes[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConfig\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"maxCallbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"feedStalenessSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasOverheadBeforeCallback\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasOverheadAfterCallback\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"requestTimeoutSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint80\",\"name\":\"donFee\",\"type\":\"uint80\"},{\"internalType\":\"uint16\",\"name\":\"maxSupportedRequestDataVersion\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"fulfillmentGasPriceOverEstimationBP\",\"type\":\"uint256\"},{\"internalType\":\"int256\",\"name\":\"fallbackNativePerUnitLink\",\"type\":\"int256\"},{\"internalType\":\"address\",\"name\":\"linkPriceFeed\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"client\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"expectedGasPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint96\",\"name\":\"adminFee\",\"type\":\"uint96\"}],\"internalType\":\"structIFunctionsBilling.RequestBilling\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"getDONFee\",\"outputs\":[{\"internalType\":\"uint80\",\"name\":\"\",\"type\":\"uint80\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDONPublicKey\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFeedData\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getThresholdPublicKey\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDetails\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDigestAndEpoch\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"scanLogs\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"amount\",\"type\":\"uint96\"}],\"name\":\"oracleWithdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"requestingContract\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"subscriptionOwner\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"internalType\":\"uint16\",\"name\":\"dataVersion\",\"type\":\"uint16\"},{\"internalType\":\"bytes32\",\"name\":\"flags\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint96\",\"name\":\"adminFee\",\"type\":\"uint96\"}],\"internalType\":\"structIFunctionsCoordinator.Request\",\"name\":\"request\",\"type\":\"tuple\"}],\"name\":\"sendRequest\",\"outputs\":[{\"components\":[{\"internalType\":\"uint96\",\"name\":\"adminFee\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"coordinator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"client\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint96\",\"name\":\"estimatedTotalCostJuels\",\"type\":\"uint96\"},{\"internalType\":\"uint40\",\"name\":\"timeoutTimestamp\",\"type\":\"uint40\"},{\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"},{\"internalType\":\"uint80\",\"name\":\"donFee\",\"type\":\"uint80\"},{\"internalType\":\"uint40\",\"name\":\"gasOverheadBeforeCallback\",\"type\":\"uint40\"},{\"internalType\":\"uint40\",\"name\":\"gasOverheadAfterCallback\",\"type\":\"uint40\"}],\"internalType\":\"structIFunctionsRequest.Commitment\",\"name\":\"commitment\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"_transmitters\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"_f\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"_onchainConfig\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"_offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"_offchainConfig\",\"type\":\"bytes\"}],\"name\":\"setConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"donPublicKey\",\"type\":\"bytes\"}],\"name\":\"setDONPublicKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"node\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"publicKey\",\"type\":\"bytes\"}],\"name\":\"setNodePublicKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"thresholdPublicKey\",\"type\":\"bytes\"}],\"name\":\"setThresholdPublicKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"rs\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"ss\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32\",\"name\":\"rawVs\",\"type\":\"bytes32\"}],\"name\":\"transmit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"transmitters\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"name\":\"updateConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x60c06040523480156200001157600080fd5b5060405162005ab338038062005ab3833981016040819052620000349162000458565b828282828260013380600081620000925760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c557620000c5816200014a565b50505015156080526001600160a01b038216620000f557604051632530e88560e11b815260040160405180910390fd5b6001600160a01b03821660a0526200010d81620001f5565b5050600c80546001600160a01b039092166c01000000000000000000000000026001600160601b03909216919091179055506200062a9350505050565b336001600160a01b03821603620001a45760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000089565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008060008060008060008060008980602001905181019062000219919062000568565b9850985098509850985098509850985098506000811362000251576040516321ea67b360e11b81526004810182905260240162000089565b604080516101208101825263ffffffff808c168083528b8216602084018190528b83168486018190528b841660608601819052938b16608086018190526001600160501b038b1660a0870181905261ffff8b1660c0880181905260e088018b905261010090970189905260088054600160f01b9098026001600160f01b03600160a01b909302600160a01b600160f01b0319600160801b90950294909416600160801b600160f01b03196c0100000000000000000000000090990263ffffffff60601b196801000000000000000090970296909616600160401b600160801b03196401000000009098026001600160401b0319909b1690981799909917959095169590951792909217949094169490941792909217929092161790556009839055600a829055517f3332571032ee658b30d567e63b2443e9d921162625e0f3fe86968a586c1a090f9062000411908b908b908b908b908b908b908b908b908b9063ffffffff998a1681529789166020890152958816604088015293871660608701529190951660808501526001600160501b039490941660a084015261ffff9390931660c083015260e08201929092526101008101919091526101200190565b60405180910390a150505050505050505050565b80516001600160a01b03811681146200043d57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b6000806000606084860312156200046e57600080fd5b620004798462000425565b602085810151919450906001600160401b03808211156200049957600080fd5b818701915087601f830112620004ae57600080fd5b815181811115620004c357620004c362000442565b604051601f8201601f19908116603f01168101908382118183101715620004ee57620004ee62000442565b816040528281528a868487010111156200050757600080fd5b600093505b828410156200052b57848401860151818501870152928501926200050c565b60008684830101528097505050505050506200054a6040850162000425565b90509250925092565b805163ffffffff811681146200043d57600080fd5b60008060008060008060008060006101208a8c0312156200058857600080fd5b620005938a62000553565b9850620005a360208b0162000553565b9750620005b360408b0162000553565b9650620005c360608b0162000553565b9550620005d360808b0162000553565b60a08b01519095506001600160501b0381168114620005f157600080fd5b60c08b015190945061ffff811681146200060a57600080fd5b8093505060e08a015191506101008a015190509295985092959850929598565b60805160a051615432620006816000396000818161068201528181610ab901528181610edc01528181610fba015281816118af01528181611b4901528181613121015261397d0152600061128001526154326000f3fe608060405234801561001057600080fd5b50600436106101a35760003560e01c806381ff7048116100ee578063b1dc65a411610097578063d227d24511610071578063d227d24514610517578063d328a91e1461052a578063e3d0e71214610532578063f2fde38b1461054557600080fd5b8063b1dc65a4146103e6578063bdd7e880146103f9578063c3f909d41461041957600080fd5b80638da5cb5b116100c85780638da5cb5b14610388578063af1296d3146103b0578063afcb95d7146103c657600080fd5b806381ff7048146102e557806385b214cf146103525780638cc6acce1461037557600080fd5b806366316d8d11610150578063807560311161012a57806380756031146102b557806381411834146102c857806381f1b938146102dd57600080fd5b806366316d8d1461028757806379ba50971461029a5780637f15e166146102a257600080fd5b806326ceabac1161018157806326ceabac146102395780632a905ccc1461024c578063533989871461027157600080fd5b8063083a5466146101a85780630e7ada39146101bd578063181f5a77146101f0575b600080fd5b6101bb6101b6366004613bf7565b610558565b005b6101d06101cb366004613e24565b6105ad565b60405169ffffffffffffffffffff90911681526020015b60405180910390f35b61022c6040518060400160405280601c81526020017f46756e6374696f6e7320436f6f7264696e61746f722076312e302e300000000081525081565b6040516101e79190613f59565b6101bb610247366004613f73565b6105db565b61025461067d565b6040516bffffffffffffffffffffffff90911681526020016101e7565b61027961073b565b6040516101e7929190613fe1565b6101bb610295366004614071565b6109bf565b6101bb610b79565b6101bb6102b0366004613bf7565b610c7b565b6101bb6102c33660046140aa565b610ccb565b6102d0610d82565b6040516101e791906140ff565b61022c610df1565b61032f60015460025463ffffffff74010000000000000000000000000000000000000000830481169378010000000000000000000000000000000000000000000000009093041691565b6040805163ffffffff9485168152939092166020840152908201526060016101e7565b610365610360366004614112565b610ec2565b60405190151581526020016101e7565b6101bb61038336600461412b565b610fa2565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101e7565b6103b861101a565b6040519081526020016101e7565b6040805160018152600060208201819052918101919091526060016101e7565b6101bb6103f43660046141ad565b61110d565b61040c610407366004614264565b61183e565b6040516101e791906143c6565b600854600954600a54600c546040805163ffffffff80871682526401000000008704811660208301526801000000000000000087048116928201929092526c01000000000000000000000000808704831660608301527001000000000000000000000000000000008704909216608082015274010000000000000000000000000000000000000000860469ffffffffffffffffffff1660a08201527e0100000000000000000000000000000000000000000000000000000000000090950461ffff1660c086015260e08501939093526101008401919091520473ffffffffffffffffffffffffffffffffffffffff16610120820152610140016101e7565b6102546105253660046143d5565b611b45565b61022c611d11565b6101bb6105403660046144ee565b611d68565b6101bb610553366004613f73565b61278c565b61056061279d565b600081900361059b576040517f4f42be3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f6105a882848361465c565b505050565b60085474010000000000000000000000000000000000000000900469ffffffffffffffffffff165b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633148061061657503373ffffffffffffffffffffffffffffffffffffffff8216145b61064c576040517fed6dd19b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600e6020526040812061067a91613b3c565b50565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c3f909d46040518163ffffffff1660e01b8152600401600060405180830381865afa1580156106eb573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610731919081019061479d565b5090949350505050565b606080600060068054806020026020016040519081016040528092919081815260200182805480156107a357602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610778575b505050505090506000815167ffffffffffffffff8111156107c6576107c6613c39565b6040519080825280602002602001820160405280156107f957816020015b60608152602001906001900390816107e45790505b50905060005b82518110156109b557600e600084838151811061081e5761081e614898565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805461086b906145bb565b90506000036108a6576040517f4f42be3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e60008483815181106108bc576108bc614898565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054610909906145bb565b80601f0160208091040260200160405190810160405280929190818152602001828054610935906145bb565b80156109825780601f1061095757610100808354040283529160200191610982565b820191906000526020600020905b81548152906001019060200180831161096557829003601f168201915b505050505082828151811061099957610999614898565b6020026020010181905250806109ae906148f6565b90506107ff565b5090939092509050565b6109c7612820565b806bffffffffffffffffffffffff166000036109fd5750336000908152600b60205260409020546bffffffffffffffffffffffff165b336000908152600b60205260409020546bffffffffffffffffffffffff80831691161015610a57576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600b602052604081208054839290610a849084906bffffffffffffffffffffffff1661492e565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055506000610adb7f000000000000000000000000000000000000000000000000000000000000000090565b6040517f66316d8d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301526bffffffffffffffffffffffff85166024830152919250908216906366316d8d90604401600060405180830381600087803b158015610b5c57600080fd5b505af1158015610b70573d6000803e3d6000fd5b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610bff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610c8361279d565b6000819003610cbe576040517f4f42be3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d6105a882848361465c565b60005473ffffffffffffffffffffffffffffffffffffffff16331480610d165750610cf5336129b1565b8015610d1657503373ffffffffffffffffffffffffffffffffffffffff8416145b610d4c576040517fed6dd19b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600e60205260409020610d7c82848361465c565b50505050565b60606006805480602002602001604051908101604052809291908181526020018280548015610de757602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610dbc575b5050505050905090565b6060600f8054610e00906145bb565b9050600003610e3b576040517f4f42be3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f8054610e48906145bb565b80601f0160208091040260200160405190810160405280929190818152602001828054610e74906145bb565b8015610de75780601f10610e9657610100808354040283529160200191610de7565b820191906000526020600020905b815481529060010190602001808311610ea457509395945050505050565b60003373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610f33576040517fc41a5b0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260076020526040902054610f4e57506000919050565b60008281526007602052604080822091909155517f8a4b97add3359bd6bcf5e82874363670eb5ad0f7615abddbd0ed0a3a98f0f41690610f919084815260200190565b60405180910390a15060015b919050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614611011576040517fc41a5b0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61067a81612a9a565b600854600c54604080517ffeaf968c0000000000000000000000000000000000000000000000000000000081529051600093640100000000900463ffffffff169283151592859283926c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff169163feaf968c9160048083019260a09291908290030181865afa1580156110b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d89190614974565b509350509250508280156110fa57506110f181426149c4565b8463ffffffff16105b1561110557600a5491505b509392505050565b60005a604080516020601f8b018190048102820181019092528981529192508a3591818c01359161116391849163ffffffff851691908e908e9081908401838280828437600092019190915250612da392505050565b611199576040517f0be3632800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805183815262ffffff600884901c1660208201527fb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62910160405180910390a16040805160608101825260025480825260035460ff8082166020850152610100909104169282019290925290831461126e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f636f6e666967446967657374206d69736d6174636800000000000000000000006044820152606401610bf6565b61127c8b8b8b8b8b8b612dac565b60007f0000000000000000000000000000000000000000000000000000000000000000156112d9576002826020015183604001516112ba91906149d7565b6112c49190614a1f565b6112cf9060016149d7565b60ff1690506112ef565b60208201516112e99060016149d7565b60ff1690505b888114611358576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f77726f6e67206e756d626572206f66207369676e6174757265730000000000006044820152606401610bf6565b8887146113c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f7369676e617475726573206f7574206f6620726567697374726174696f6e00006044820152606401610bf6565b3360009081526004602090815260408083208151808301909252805460ff8082168452929391929184019161010090910416600281111561140457611404614a41565b600281111561141557611415614a41565b905250905060028160200151600281111561143257611432614a41565b14801561147957506006816000015160ff168154811061145457611454614898565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1633145b6114df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f756e617574686f72697a6564207472616e736d697474657200000000000000006044820152606401610bf6565b50505050506114ec613b76565b6000808a8a6040516114ff929190614a70565b604051908190038120611516918e90602001614a80565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120838301909252600080845290830152915060005b8981101561182057600060018489846020811061157f5761157f614898565b61158c91901a601b6149d7565b8e8e8681811061159e5761159e614898565b905060200201358d8d878181106115b7576115b7614898565b90506020020135604051600081526020016040526040516115f4949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015611616573d6000803e3d6000fd5b5050604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081015173ffffffffffffffffffffffffffffffffffffffff811660009081526004602090815290849020838501909452835460ff8082168552929650929450840191610100900416600281111561169657611696614a41565b60028111156116a7576116a7614a41565b90525092506001836020015160028111156116c4576116c4614a41565b1461172b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f61646472657373206e6f7420617574686f72697a656420746f207369676e00006044820152606401610bf6565b8251600090879060ff16601f811061174557611745614898565b602002015173ffffffffffffffffffffffffffffffffffffffff16146117c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f6e6f6e2d756e69717565207369676e61747572650000000000000000000000006044820152606401610bf6565b8086846000015160ff16601f81106117e1576117e1614898565b73ffffffffffffffffffffffffffffffffffffffff909216602092909202015261180c6001866149d7565b94505080611819906148f6565b9050611560565b505050611831833383858e8e612e5a565b5050505050505050505050565b6040805161016081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101919091523373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614611906576040517fc41a5b0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119136040830183614a94565b905060000361194d576040517ec1cfc000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006040518060a0016040528084606001602081019061196d9190614af9565b67ffffffffffffffff16815260209081019061198b90860186613f73565b73ffffffffffffffffffffffffffffffffffffffff1681526020016119b660e0860160c08701614b16565b63ffffffff1681523a60208201526040016119d8610100860160e08701614b33565b6bffffffffffffffffffffffff1690529050611a456119fa6040850185614a94565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611a3f9250505060a0860160808701614b50565b83613028565b9150611a546020840184613f73565b73ffffffffffffffffffffffffffffffffffffffff168260e001517fd88ef982f3624222a23ef83ed2192cbdfba8e1e474a6cb1d315736d08479d2e332866060016020810190611aa49190614af9565b611ab46040890160208a01613f73565b611ac160408a018a614a94565b611ad160a08c0160808d01614b50565b60a08c0135611ae660e08e0160c08f01614b16565b8c604051602001611af791906143c6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611b37999897969594939291614b6d565b60405180910390a350919050565b60007f00000000000000000000000000000000000000000000000000000000000000006040517f10fc49c100000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8816600482015263ffffffff8516602482015273ffffffffffffffffffffffffffffffffffffffff91909116906310fc49c19060440160006040518083038186803b158015611be557600080fd5b505afa158015611bf9573d6000803e3d6000fd5b50505050620f4240821115611c3a576040517f8129bbcd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611c4461067d565b905060006040518060a001604052808967ffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018663ffffffff168152602001858152602001836bffffffffffffffffffffffff1681525090506000611ce888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508692506105ad915050565b69ffffffffffffffffffff169050611d028686838661351c565b93505050505b95945050505050565b6060600d8054611d20906145bb565b9050600003611d5b576040517f4f42be3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d8054610e48906145bb565b855185518560ff16601f831115611ddb576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f746f6f206d616e79207369676e657273000000000000000000000000000000006044820152606401610bf6565b80600003611e45576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f66206d75737420626520706f73697469766500000000000000000000000000006044820152606401610bf6565b818314611ed3576040517f89a61989000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f6f7261636c6520616464726573736573206f7574206f6620726567697374726160448201527f74696f6e000000000000000000000000000000000000000000000000000000006064820152608401610bf6565b611ede816003614c31565b8311611f46576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661756c74792d6f7261636c65206620746f6f206869676800000000000000006044820152606401610bf6565b611f4e61279d565b6040805160c0810182528a8152602081018a905260ff89169181018290526060810188905267ffffffffffffffff8716608082015260a0810186905290611f95908861368c565b6005541561214a57600554600090611faf906001906149c4565b9050600060058281548110611fc657611fc6614898565b60009182526020822001546006805473ffffffffffffffffffffffffffffffffffffffff9092169350908490811061200057612000614898565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff85811684526004909252604080842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009081169091559290911680845292208054909116905560058054919250908061208057612080614c48565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905501905560068054806120e9576120e9614c48565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905501905550611f95915050565b60005b8151518110156125b1576000600460008460000151848151811061217357612173614898565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002054610100900460ff1660028111156121bd576121bd614a41565b14612224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f7265706561746564207369676e657220616464726573730000000000000000006044820152606401610bf6565b6040805180820190915260ff8216815260016020820152825180516004916000918590811061225557612255614898565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff168252818101929092526040016000208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117835592840151919283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016176101008360028111156122f6576122f6614a41565b0217905550600091506123069050565b600460008460200151848151811061232057612320614898565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002054610100900460ff16600281111561236a5761236a614a41565b146123d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f7265706561746564207472616e736d69747465722061646472657373000000006044820152606401610bf6565b6040805180820190915260ff82168152602081016002815250600460008460200151848151811061240457612404614898565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff168252818101929092526040016000208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117835592840151919283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016176101008360028111156124a5576124a5614a41565b0217905550508251805160059250839081106124c3576124c3614898565b602090810291909101810151825460018101845560009384529282902090920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909316929092179091558201518051600691908390811061253f5761253f614898565b60209081029190910181015182546001810184556000938452919092200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055806125a9816148f6565b91505061214d565b506040810151600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff909216919091179055600180547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff8116780100000000000000000000000000000000000000000000000063ffffffff438116820292909217808555920481169291829160149161266991849174010000000000000000000000000000000000000000900416614c77565b92506101000a81548163ffffffff021916908363ffffffff1602179055506126c84630600160149054906101000a900463ffffffff1663ffffffff16856000015186602001518760400151886060015189608001518a60a001516136a9565b600281905582518051600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010060ff9093169290920291909117905560015460208501516040808701516060880151608089015160a08a015193517f1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e059861277f988b9891977401000000000000000000000000000000000000000090920463ffffffff16969095919491939192614c94565b60405180910390a1611831565b61279461279d565b61067a81613754565b60005473ffffffffffffffffffffffffffffffffffffffff16331461281e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610bf6565b565b600061282a610d82565b90508051600003612867576040517f30274b3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600c54600091612886916bffffffffffffffffffffffff16614d2a565b905060005b82518110156129525781600b60008584815181106128ab576128ab614898565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a90046bffffffffffffffffffffffff166129139190614d55565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508061294b906148f6565b905061288b565b50815161295f9082614d7a565b600c805460009061297f9084906bffffffffffffffffffffffff1661492e565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055505050565b6000806006805480602002602001604051908101604052809291908181526020018280548015612a1757602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116129ec575b5050505050905060005b8151811015612a90578373ffffffffffffffffffffffffffffffffffffffff16828281518110612a5357612a53614898565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603612a80575060019392505050565b612a89816148f6565b9050612a21565b5060009392505050565b600080600080600080600080600089806020019051810190612abc9190614daa565b98509850985098509850985098509850985060008113612b0b576040517f43d4cf6600000000000000000000000000000000000000000000000000000000815260048101829052602401610bf6565b604080516101208101825263ffffffff808c168083528b8216602084018190528b83168486018190528b841660608601819052938b166080860181905269ffffffffffffffffffff8b1660a0870181905261ffff8b1660c0880181905260e088018b9052610100909701899052600880547e010000000000000000000000000000000000000000000000000000000000009098027dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff740100000000000000000000000000000000000000009093027fffff00000000000000000000ffffffffffffffffffffffffffffffffffffffff700100000000000000000000000000000000909502949094167fffff0000000000000000000000000000ffffffffffffffffffffffffffffffff6c010000000000000000000000009099027fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff68010000000000000000909702969096167fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6401000000009098027fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000909b1690981799909917959095169590951792909217949094169490941792909217929092161790556009839055600a829055517f3332571032ee658b30d567e63b2443e9d921162625e0f3fe86968a586c1a090f90612d8f908b908b908b908b908b908b908b908b908b9063ffffffff998a16815297891660208901529588166040880152938716606087015291909516608085015269ffffffffffffffffffff9490941660a084015261ffff9390931660c083015260e08201929092526101008101919091526101200190565b60405180910390a150505050505050505050565b60019392505050565b6000612db9826020614c31565b612dc4856020614c31565b612dd088610144614e56565b612dda9190614e56565b612de49190614e56565b612def906000614e56565b9050368114610b70576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f63616c6c64617461206c656e677468206d69736d6174636800000000000000006044820152606401610bf6565b606080808080612e6c86880188614f44565b8451949950929750909550935091501580612e8957508351855114155b80612e9657508251855114155b80612ea357508151855114155b80612eb057508051855114155b15612ee7576040517f0be3632800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b855181101561301a576000612f7f878381518110612f0a57612f0a614898565b6020026020010151878481518110612f2457612f24614898565b6020026020010151878581518110612f3e57612f3e614898565b6020026020010151878681518110612f5857612f58614898565b6020026020010151878781518110612f7257612f72614898565b6020026020010151613849565b90506000816006811115612f9557612f95614a41565b1480612fb257506001816006811115612fb057612fb0614a41565b145b1561300957868281518110612fc957612fc9614898565b60209081029190910181015160405133815290917fc708e0440951fd63499c0f7a73819b469ee5dd3ecc356c0ab4eb7f18389009d9910160405180910390a25b50613013816148f6565b9050612eea565b505050505050505050505050565b6040805161016081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081019190915260085461ffff7e01000000000000000000000000000000000000000000000000000000000000909104811690841611156130e7576040517fdada758700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006130f385846105ad565b9050600061311b846040015185606001518469ffffffffffffffffffff16876080015161351c565b905060007f000000000000000000000000000000000000000000000000000000000000000085516040517fa47c769600000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015290915060009073ffffffffffffffffffffffffffffffffffffffff83169063a47c769690602401600060405180830381865afa1580156131bd573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526132039190810190615085565b602087015187516040517f674603d000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff928316600482015267ffffffffffffffff90911660248201529192506000919084169063674603d090604401606060405180830381865afa15801561328e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132b29190615154565b50604084015184519193506bffffffffffffffffffffffff871692506132d79161492e565b6bffffffffffffffffffffffff16101561331d576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061339c3089602001518a6000015185600161333a91906151a6565b6040805173ffffffffffffffffffffffffffffffffffffffff958616602080830191909152949095168582015267ffffffffffffffff928316606086015291166080808501919091528151808503909101815260a09093019052815191012090565b905060405180610160016040528089608001516bffffffffffffffffffffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff168152602001896020015173ffffffffffffffffffffffffffffffffffffffff168152602001896000015167ffffffffffffffff168152602001896040015163ffffffff168152602001866bffffffffffffffffffffffff168152602001600860000160109054906101000a900463ffffffff1663ffffffff164261345d9190614e56565b64ffffffffff168152602080820184905269ffffffffffffffffffff891660408084019190915260085463ffffffff680100000000000000008204811660608601526c010000000000000000000000009091041660809093019290925290519198506134cb918991016143c6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060009384526007909252909120555093979650505050505050565b60008061352761101a565b905060008113613566576040517f43d4cf6600000000000000000000000000000000000000000000000000000000815260048101829052602401610bf6565b600854600090879061359c9063ffffffff6c01000000000000000000000000820481169168010000000000000000900416614c77565b6135a69190614c77565b63ffffffff1690506000612710600860010154886135c49190614c31565b6135ce91906151c7565b6135d89088614e56565b9050600083836135f084670de0b6b3a7640000614c31565b6135fa9190614c31565b61360491906151c7565b905060006136236bffffffffffffffffffffffff808916908a16614e56565b905061363b816b033b2e3c9fd0803ce80000006149c4565b821115613674576040517fe80fa38100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61367e8183614e56565b9a9950505050505050505050565b6000613696610d82565b5111156136a5576136a5612820565b5050565b6000808a8a8a8a8a8a8a8a8a6040516020016136cd999897969594939291906151db565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179150509998505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff8216036137d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610bf6565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600080838060200190518101906138609190615285565b600088815260076020526040902054909150613880576002915050611d08565b8060405160200161389191906143c6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008a81526007909352912054146138e3576006915050611d08565b60006138ed61101a565b90506000811361392c576040517f43d4cf6600000000000000000000000000000000000000000000000000000000815260048101829052602401610bf6565b6000816139413a670de0b6b3a7640000614c31565b61394b91906151c7565b905060008361014001518461012001516139659190615358565b6139769064ffffffffff1683614c31565b90506000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a1d4c8288c8c878a610100015169ffffffffffffffffffff16886139d79190614d55565b338c6040518763ffffffff1660e01b81526004016139fa96959493929190615376565b60408051808303816000875af1158015613a18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a3c91906153f2565b90925090506000826006811115613a5557613a55614a41565b1480613a7257506001826006811115613a7057613a70614a41565b145b15613b2d5760008c815260076020526040812055613a908184614d55565b336000908152600b6020526040812080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff938416179055610100880151600c805469ffffffffffffffffffff90921693909291613afe91859116614d55565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055505b509a9950505050505050505050565b508054613b48906145bb565b6000825580601f10613b58575050565b601f01602090049060005260206000209081019061067a9190613b95565b604051806103e00160405280601f906020820280368337509192915050565b5b80821115613baa5760008155600101613b96565b5090565b60008083601f840112613bc057600080fd5b50813567ffffffffffffffff811115613bd857600080fd5b602083019150836020828501011115613bf057600080fd5b9250929050565b60008060208385031215613c0a57600080fd5b823567ffffffffffffffff811115613c2157600080fd5b613c2d85828601613bae565b90969095509350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff81118282101715613c8b57613c8b613c39565b60405290565b60405160c0810167ffffffffffffffff81118282101715613c8b57613c8b613c39565b604051610160810167ffffffffffffffff81118282101715613c8b57613c8b613c39565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613d1f57613d1f613c39565b604052919050565b600082601f830112613d3857600080fd5b813567ffffffffffffffff811115613d5257613d52613c39565b613d8360207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613cd8565b818152846020838601011115613d9857600080fd5b816020850160208301376000918101602001919091529392505050565b67ffffffffffffffff8116811461067a57600080fd5b8035610f9d81613db5565b73ffffffffffffffffffffffffffffffffffffffff8116811461067a57600080fd5b63ffffffff8116811461067a57600080fd5b6bffffffffffffffffffffffff8116811461067a57600080fd5b60008082840360c0811215613e3857600080fd5b833567ffffffffffffffff811115613e4f57600080fd5b613e5b86828701613d27565b93505060a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082011215613e8e57600080fd5b50613e97613c68565b6020840135613ea581613db5565b81526040840135613eb581613dd6565b60208201526060840135613ec881613df8565b60408201526080840135606082015260a0840135613ee581613e0a565b6080820152919491935090915050565b6000815180845260005b81811015613f1b57602081850181015186830182015201613eff565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000613f6c6020830184613ef5565b9392505050565b600060208284031215613f8557600080fd5b8135613f6c81613dd6565b600081518084526020808501945080840160005b83811015613fd657815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101613fa4565b509495945050505050565b604081526000613ff46040830185613f90565b6020838203818501528185518084528284019150828160051b85010183880160005b83811015614062577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0878403018552614050838351613ef5565b94860194925090850190600101614016565b50909998505050505050505050565b6000806040838503121561408457600080fd5b823561408f81613dd6565b9150602083013561409f81613e0a565b809150509250929050565b6000806000604084860312156140bf57600080fd5b83356140ca81613dd6565b9250602084013567ffffffffffffffff8111156140e657600080fd5b6140f286828701613bae565b9497909650939450505050565b602081526000613f6c6020830184613f90565b60006020828403121561412457600080fd5b5035919050565b60006020828403121561413d57600080fd5b813567ffffffffffffffff81111561415457600080fd5b61416084828501613d27565b949350505050565b60008083601f84011261417a57600080fd5b50813567ffffffffffffffff81111561419257600080fd5b6020830191508360208260051b8501011115613bf057600080fd5b60008060008060008060008060e0898b0312156141c957600080fd5b606089018a8111156141da57600080fd5b8998503567ffffffffffffffff808211156141f457600080fd5b6142008c838d01613bae565b909950975060808b013591508082111561421957600080fd5b6142258c838d01614168565b909750955060a08b013591508082111561423e57600080fd5b5061424b8b828c01614168565b999c989b50969995989497949560c00135949350505050565b60006020828403121561427657600080fd5b813567ffffffffffffffff81111561428d57600080fd5b82016101008185031215613f6c57600080fd5b80516bffffffffffffffffffffffff16825260208101516142d9602084018273ffffffffffffffffffffffffffffffffffffffff169052565b506040810151614301604084018273ffffffffffffffffffffffffffffffffffffffff169052565b50606081015161431d606084018267ffffffffffffffff169052565b506080810151614335608084018263ffffffff169052565b5060a081015161435560a08401826bffffffffffffffffffffffff169052565b5060c081015161436e60c084018264ffffffffff169052565b5060e081015160e0830152610100808201516143978285018269ffffffffffffffffffff169052565b50506101208181015164ffffffffff81168483015250506101408181015164ffffffffff811684830152610d7c565b61016081016105d582846142a0565b6000806000806000608086880312156143ed57600080fd5b85356143f881613db5565b9450602086013567ffffffffffffffff81111561441457600080fd5b61442088828901613bae565b909550935050604086013561443481613df8565b949793965091946060013592915050565b600067ffffffffffffffff82111561445f5761445f613c39565b5060051b60200190565b600082601f83011261447a57600080fd5b8135602061448f61448a83614445565b613cd8565b82815260059290921b840181019181810190868411156144ae57600080fd5b8286015b848110156144d25780356144c581613dd6565b83529183019183016144b2565b509695505050505050565b803560ff81168114610f9d57600080fd5b60008060008060008060c0878903121561450757600080fd5b863567ffffffffffffffff8082111561451f57600080fd5b61452b8a838b01614469565b9750602089013591508082111561454157600080fd5b61454d8a838b01614469565b965061455b60408a016144dd565b9550606089013591508082111561457157600080fd5b61457d8a838b01613d27565b945061458b60808a01613dcb565b935060a08901359150808211156145a157600080fd5b506145ae89828a01613d27565b9150509295509295509295565b600181811c908216806145cf57607f821691505b602082108103614608577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f8211156105a857600081815260208120601f850160051c810160208610156146355750805b601f850160051c820191505b8181101561465457828155600101614641565b505050505050565b67ffffffffffffffff83111561467457614674613c39565b6146888361468283546145bb565b8361460e565b6000601f8411600181146146da57600085156146a45750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355614770565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156147295786850135825560209485019460019092019101614709565b5086821015614764577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b61ffff8116811461067a57600080fd5b8051610f9d81613e0a565b8051610f9d81613df8565b600080600080608085870312156147b357600080fd5b84516147be81614777565b809450506020808601516147d181613e0a565b60408701519094507fffffffff000000000000000000000000000000000000000000000000000000008116811461480757600080fd5b606087015190935067ffffffffffffffff81111561482457600080fd5b8601601f8101881361483557600080fd5b805161484361448a82614445565b81815260059190911b8201830190838101908a83111561486257600080fd5b928401925b8284101561488957835161487a81613df8565b82529284019290840190614867565b979a9699509497505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614927576149276148c7565b5060010190565b6bffffffffffffffffffffffff828116828216039080821115614953576149536148c7565b5092915050565b805169ffffffffffffffffffff81168114610f9d57600080fd5b600080600080600060a0868803121561498c57600080fd5b6149958661495a565b94506020860151935060408601519250606086015191506149b86080870161495a565b90509295509295909350565b818103818111156105d5576105d56148c7565b60ff81811683821601908111156105d5576105d56148c7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff831680614a3257614a326149f0565b8060ff84160491505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8183823760009101908152919050565b828152606082602083013760800192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614ac957600080fd5b83018035915067ffffffffffffffff821115614ae457600080fd5b602001915036819003821315613bf057600080fd5b600060208284031215614b0b57600080fd5b8135613f6c81613db5565b600060208284031215614b2857600080fd5b8135613f6c81613df8565b600060208284031215614b4557600080fd5b8135613f6c81613e0a565b600060208284031215614b6257600080fd5b8135613f6c81614777565b73ffffffffffffffffffffffffffffffffffffffff8a8116825267ffffffffffffffff8a16602083015288166040820152610100606082018190528101869052600061012087898285013760008189850101527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f890116830161ffff881660808501528660a0850152614c0a60c085018763ffffffff169052565b818482030160e0850152614c2082820186613ef5565b9d9c50505050505050505050505050565b80820281158282048414176105d5576105d56148c7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b63ffffffff818116838216019080821115614953576149536148c7565b600061012063ffffffff808d1684528b6020850152808b16604085015250806060840152614cc48184018a613f90565b90508281036080840152614cd88189613f90565b905060ff871660a084015282810360c0840152614cf58187613ef5565b905067ffffffffffffffff851660e0840152828103610100840152614d1a8185613ef5565b9c9b505050505050505050505050565b60006bffffffffffffffffffffffff80841680614d4957614d496149f0565b92169190910492915050565b6bffffffffffffffffffffffff818116838216019080821115614953576149536148c7565b6bffffffffffffffffffffffff818116838216028082169190828114614da257614da26148c7565b505092915050565b60008060008060008060008060006101208a8c031215614dc957600080fd5b8951614dd481613df8565b60208b0151909950614de581613df8565b60408b0151909850614df681613df8565b60608b0151909750614e0781613df8565b60808b0151909650614e1881613df8565b9450614e2660a08b0161495a565b935060c08a0151614e3681614777565b8093505060e08a015191506101008a015190509295985092959850929598565b808201808211156105d5576105d56148c7565b600082601f830112614e7a57600080fd5b81356020614e8a61448a83614445565b82815260059290921b84018101918181019086841115614ea957600080fd5b8286015b848110156144d25780358352918301918301614ead565b600082601f830112614ed557600080fd5b81356020614ee561448a83614445565b82815260059290921b84018101918181019086841115614f0457600080fd5b8286015b848110156144d257803567ffffffffffffffff811115614f285760008081fd5b614f368986838b0101613d27565b845250918301918301614f08565b600080600080600060a08688031215614f5c57600080fd5b853567ffffffffffffffff80821115614f7457600080fd5b614f8089838a01614e69565b96506020880135915080821115614f9657600080fd5b614fa289838a01614ec4565b95506040880135915080821115614fb857600080fd5b614fc489838a01614ec4565b94506060880135915080821115614fda57600080fd5b614fe689838a01614ec4565b93506080880135915080821115614ffc57600080fd5b5061500988828901614ec4565b9150509295509295909350565b8051610f9d81613dd6565b600082601f83011261503257600080fd5b8151602061504261448a83614445565b82815260059290921b8401810191818101908684111561506157600080fd5b8286015b848110156144d257805161507881613dd6565b8352918301918301615065565b60006020828403121561509757600080fd5b815167ffffffffffffffff808211156150af57600080fd5b9083019060c082860312156150c357600080fd5b6150cb613c91565b82516150d681613e0a565b815260208301516150e681613dd6565b602082015260408301516150f981613e0a565b604082015261510a60608401615016565b606082015260808301518281111561512157600080fd5b61512d87828601615021565b60808301525060a083015160a082015280935050505092915050565b8051610f9d81613db5565b60008060006060848603121561516957600080fd5b8351801515811461517957600080fd5b602085015190935061518a81613db5565b604085015190925061519b81613db5565b809150509250925092565b67ffffffffffffffff818116838216019080821115614953576149536148c7565b6000826151d6576151d66149f0565b500490565b60006101208b835273ffffffffffffffffffffffffffffffffffffffff8b16602084015267ffffffffffffffff808b1660408501528160608501526152228285018b613f90565b91508382036080850152615236828a613f90565b915060ff881660a085015283820360c08501526152538288613ef5565b90861660e08501528381036101008501529050614d1a8185613ef5565b805164ffffffffff81168114610f9d57600080fd5b6000610160828403121561529857600080fd5b6152a0613cb4565b6152a983614787565b81526152b760208401615016565b60208201526152c860408401615016565b60408201526152d960608401615149565b60608201526152ea60808401614792565b60808201526152fb60a08401614787565b60a082015261530c60c08401615270565b60c082015260e083015160e082015261010061532981850161495a565b9082015261012061533b848201615270565b9082015261014061534d848201615270565b908201529392505050565b64ffffffffff818116838216019080821115614953576149536148c7565b600061020080835261538a8184018a613ef5565b9050828103602084015261539e8189613ef5565b6bffffffffffffffffffffffff88811660408601528716606085015273ffffffffffffffffffffffffffffffffffffffff8616608085015291506153e7905060a08301846142a0565b979650505050505050565b6000806040838503121561540557600080fd5b82516007811061541457600080fd5b602084015190925061409f81613e0a56fea164736f6c6343000813000a", } var FunctionsCoordinatorABI = FunctionsCoordinatorMetaData.ABI @@ -309,28 +309,6 @@ func (_FunctionsCoordinator *FunctionsCoordinatorCallerSession) GetConfig() (Get return _FunctionsCoordinator.Contract.GetConfig(&_FunctionsCoordinator.CallOpts) } -func (_FunctionsCoordinator *FunctionsCoordinatorCaller) GetConfigHash(opts *bind.CallOpts) ([32]byte, error) { - var out []interface{} - err := _FunctionsCoordinator.contract.Call(opts, &out, "getConfigHash") - - if err != nil { - return *new([32]byte), err - } - - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) - - return out0, err - -} - -func (_FunctionsCoordinator *FunctionsCoordinatorSession) GetConfigHash() ([32]byte, error) { - return _FunctionsCoordinator.Contract.GetConfigHash(&_FunctionsCoordinator.CallOpts) -} - -func (_FunctionsCoordinator *FunctionsCoordinatorCallerSession) GetConfigHash() ([32]byte, error) { - return _FunctionsCoordinator.Contract.GetConfigHash(&_FunctionsCoordinator.CallOpts) -} - func (_FunctionsCoordinator *FunctionsCoordinatorCaller) GetDONFee(opts *bind.CallOpts, arg0 []byte, arg1 IFunctionsBillingRequestBilling) (*big.Int, error) { var out []interface{} err := _FunctionsCoordinator.contract.Call(opts, &out, "getDONFee", arg0, arg1) @@ -1814,8 +1792,6 @@ type FunctionsCoordinatorInterface interface { error) - GetConfigHash(opts *bind.CallOpts) ([32]byte, error) - GetDONFee(opts *bind.CallOpts, arg0 []byte, arg1 IFunctionsBillingRequestBilling) (*big.Int, error) GetDONPublicKey(opts *bind.CallOpts) ([]byte, error) diff --git a/core/gethwrappers/functions/generated/functions_router/functions_router.go b/core/gethwrappers/functions/generated/functions_router/functions_router.go index 44c59d6afad..1a4079979f0 100644 --- a/core/gethwrappers/functions/generated/functions_router/functions_router.go +++ b/core/gethwrappers/functions/generated/functions_router/functions_router.go @@ -44,16 +44,18 @@ type IFunctionsRequestCommitment struct { GasOverheadAfterCallback *big.Int } -type IFunctionsRouterConfig struct { - MaxConsumers uint16 - AdminFee *big.Int - HandleOracleFulfillmentSelector [4]byte - MaxCallbackGasLimits []uint32 +type IFunctionsSubscriptionsSubscription struct { + Balance *big.Int + Owner common.Address + BlockedBalance *big.Int + RequestedOwner common.Address + Consumers []common.Address + Flags [32]byte } var FunctionsRouterMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"timelockBlocks\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"maximumTimelockBlocks\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"internalBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"externalBalance\",\"type\":\"uint256\"}],\"name\":\"BalanceInvariantViolated\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ConsumerRequestsInFlight\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"limit\",\"type\":\"uint32\"}],\"name\":\"GasLimitTooBig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"IdentifierIsReserved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCalldata\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfigData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"InvalidConsumer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"value\",\"type\":\"uint8\"}],\"name\":\"InvalidGasFlagValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidProposal\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSubscription\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proposedOwner\",\"type\":\"address\"}],\"name\":\"MustBeRequestedOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeSubscriptionOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByRoute\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableFromCoordinator\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableFromLink\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PendingRequestExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ProposedTimelockAboveMaximum\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Reentrant\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"RouteNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderMustAcceptTermsOfService\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TimelockInEffect\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyConsumers\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"adminFee\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"bytes4\",\"name\":\"handleOracleFulfillmentSelector\",\"type\":\"bytes4\"},{\"indexed\":false,\"internalType\":\"uint32[]\",\"name\":\"maxCallbackGasLimits\",\"type\":\"uint32[]\"}],\"name\":\"ConfigChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"fromHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"toBytes\",\"type\":\"bytes\"}],\"name\":\"ConfigProposed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"fromHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"toBytes\",\"type\":\"bytes\"}],\"name\":\"ConfigUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"proposedContractSetId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"proposedContractSetFromAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"proposedContractSetToAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timelockEndBlock\",\"type\":\"uint256\"}],\"name\":\"ContractProposed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"proposedContractSetId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"proposedContractSetFromAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"proposedContractSetToAddress\",\"type\":\"address\"}],\"name\":\"ContractUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"FundsRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"coordinator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"resultCode\",\"type\":\"uint8\"}],\"name\":\"RequestNotProcessed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"totalCostJuels\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"resultCode\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"response\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"name\":\"RequestProcessed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"donId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"subscriptionOwner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"requestingContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"requestInitiator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"dataVersion\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"}],\"name\":\"RequestStart\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"}],\"name\":\"RequestTimedOut\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"fundsRecipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fundsAmount\",\"type\":\"uint256\"}],\"name\":\"SubscriptionCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"SubscriptionConsumerAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"SubscriptionConsumerRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"SubscriptionCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBalance\",\"type\":\"uint256\"}],\"name\":\"SubscriptionFunded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"SubscriptionOwnerTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"SubscriptionOwnerTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"from\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"to\",\"type\":\"uint16\"}],\"name\":\"TimeLockProposed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"from\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"to\",\"type\":\"uint16\"}],\"name\":\"TimeLockUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MAX_CALLBACK_RETURN_BYTES\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"}],\"name\":\"acceptSubscriptionOwnerTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"addConsumer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"cancelSubscription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"createSubscription\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"response\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"},{\"internalType\":\"uint96\",\"name\":\"juelsPerGas\",\"type\":\"uint96\"},{\"internalType\":\"uint96\",\"name\":\"costWithoutFulfillment\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint96\",\"name\":\"adminFee\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"coordinator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"client\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint96\",\"name\":\"estimatedTotalCostJuels\",\"type\":\"uint96\"},{\"internalType\":\"uint40\",\"name\":\"timeoutTimestamp\",\"type\":\"uint40\"},{\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"},{\"internalType\":\"uint80\",\"name\":\"donFee\",\"type\":\"uint80\"},{\"internalType\":\"uint40\",\"name\":\"gasOverheadBeforeCallback\",\"type\":\"uint40\"},{\"internalType\":\"uint40\",\"name\":\"gasOverheadAfterCallback\",\"type\":\"uint40\"}],\"internalType\":\"structIFunctionsRequest.Commitment\",\"name\":\"commitment\",\"type\":\"tuple\"}],\"name\":\"fulfill\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"resultCode\",\"type\":\"uint8\"},{\"internalType\":\"uint96\",\"name\":\"callbackGasCostJuels\",\"type\":\"uint96\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowListId\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint16\",\"name\":\"maxConsumers\",\"type\":\"uint16\"},{\"internalType\":\"uint96\",\"name\":\"adminFee\",\"type\":\"uint96\"},{\"internalType\":\"bytes4\",\"name\":\"handleOracleFulfillmentSelector\",\"type\":\"bytes4\"},{\"internalType\":\"uint32[]\",\"name\":\"maxCallbackGasLimits\",\"type\":\"uint32[]\"}],\"internalType\":\"structIFunctionsRouter.Config\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConfigHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"config\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"client\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"}],\"name\":\"getConsumer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"initiatedRequests\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"completedRequests\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"useProposed\",\"type\":\"bool\"}],\"name\":\"getContractById\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"routeDestination\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"getContractById\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"routeDestination\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"}],\"name\":\"getFlags\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getProposedContractSet\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"},{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"}],\"name\":\"getSubscription\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"balance\",\"type\":\"uint96\"},{\"internalType\":\"uint96\",\"name\":\"blockedBalance\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"requestedOwner\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"consumers\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSubscriptionCount\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBalance\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"}],\"name\":\"isValidCallbackGasLimit\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onTokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"amount\",\"type\":\"uint96\"}],\"name\":\"oracleWithdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"}],\"name\":\"ownerCancelSubscription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"amount\",\"type\":\"uint96\"}],\"name\":\"ownerWithdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"}],\"name\":\"pendingRequestExists\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"name\":\"proposeConfigUpdate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"proposedContractSetIds\",\"type\":\"bytes32[]\"},{\"internalType\":\"address[]\",\"name\":\"proposedContractSetAddresses\",\"type\":\"address[]\"}],\"name\":\"proposeContractsUpdate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"proposeSubscriptionOwnerTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"blocks\",\"type\":\"uint16\"}],\"name\":\"proposeTimelockBlocks\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"recoverFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"removeConsumer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint16\",\"name\":\"dataVersion\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"donId\",\"type\":\"bytes32\"}],\"name\":\"sendRequest\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"flags\",\"type\":\"bytes32\"}],\"name\":\"setFlags\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint96\",\"name\":\"adminFee\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"coordinator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"client\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint96\",\"name\":\"estimatedTotalCostJuels\",\"type\":\"uint96\"},{\"internalType\":\"uint40\",\"name\":\"timeoutTimestamp\",\"type\":\"uint40\"},{\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"},{\"internalType\":\"uint80\",\"name\":\"donFee\",\"type\":\"uint80\"},{\"internalType\":\"uint40\",\"name\":\"gasOverheadBeforeCallback\",\"type\":\"uint40\"},{\"internalType\":\"uint40\",\"name\":\"gasOverheadAfterCallback\",\"type\":\"uint40\"}],\"internalType\":\"structIFunctionsRequest.Commitment[]\",\"name\":\"requestsToTimeoutByCommitment\",\"type\":\"tuple[]\"}],\"name\":\"timeoutRequests\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"updateConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"updateContracts\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"updateTimelockBlocks\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"validateProposedContracts\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60a06040523480156200001157600080fd5b506040516200666b3803806200666b83398101604081905262000034916200044b565b6000805460ff191681558290339086908690859084908190816200009f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0380851661010002610100600160a81b031990921691909117909155811615620000d957620000d98162000178565b50506009805461ffff80871661ffff19909216919091179091558316608052506000805260026020527fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b80546001600160a01b031916301790556200013e8162000229565b80516020909101206007555050600a80546001600160a01b0319166001600160a01b03939093169290921790915550620006d79350505050565b336001600160a01b03821603620001d25760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000096565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929361010090910416917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000806000808480602001905181019062000245919062000548565b6040805160808101825261ffff86168082526001600160601b03861660208084018290526001600160e01b031987169484019490945260608301859052600f80546001600160701b031916909217620100009091021763ffffffff60701b1916600160701b60e087901c021781558351969a509498509296509094509092620002d591601091908601906200031d565b509050507fe6a1eda76d42a6d1d813f26765716562044db1e8bd8be7d088705e64afd301ca8383836040516200030e9392919062000666565b60405180910390a15050505050565b82805482825590600052602060002090600701600890048101928215620003c15791602002820160005b838211156200038d57835183826101000a81548163ffffffff021916908363ffffffff160217905550926020019260040160208160030104928301926001030262000347565b8015620003bf5782816101000a81549063ffffffff02191690556004016020816003010492830192600103026200038d565b505b50620003cf929150620003d3565b5090565b5b80821115620003cf5760008155600101620003d4565b805161ffff81168114620003fd57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562000443576200044362000402565b604052919050565b600080600080608085870312156200046257600080fd5b6200046d85620003ea565b935060206200047e818701620003ea565b60408701519094506001600160a01b03811681146200049c57600080fd5b60608701519093506001600160401b0380821115620004ba57600080fd5b818801915088601f830112620004cf57600080fd5b815181811115620004e457620004e462000402565b620004f8601f8201601f1916850162000418565b915080825289848285010111156200050f57600080fd5b60005b818110156200052f57838101850151838201860152840162000512565b5060008482840101525080935050505092959194509250565b600080600080608085870312156200055f57600080fd5b6200056a85620003ea565b602086810151919550906001600160601b03811681146200058a57600080fd5b60408701519094506001600160e01b031981168114620005a957600080fd5b60608701519093506001600160401b0380821115620005c757600080fd5b818801915088601f830112620005dc57600080fd5b815181811115620005f157620005f162000402565b8060051b91506200060484830162000418565b818152918301840191848101908b8411156200061f57600080fd5b938501935b8385101562000656578451925063ffffffff83168314620006455760008081fd5b828252938501939085019062000624565b989b979a50959850505050505050565b6001600160601b03841681526001600160e01b031983166020808301919091526060604083018190528351908301819052600091848101916080850190845b81811015620006c957845163ffffffff1683529383019391830191600101620006a5565b509098975050505050505050565b608051615f78620006f3600039600061294f0152615f786000f3fe608060405234801561001057600080fd5b50600436106102f45760003560e01c80638456cb5911610191578063b187bd26116100e3578063c4614d6111610097578063e82ad7d411610071578063e82ad7d414610752578063eb523d6c14610765578063f2fde38b1461077857600080fd5b8063c4614d6114610719578063d7ae1d301461072c578063e72f6e301461073f57600080fd5b8063b734c0f4116100c8578063b734c0f4146106e5578063badc3eb6146106ed578063c3f909d41461070457600080fd5b8063b187bd26146106c7578063b5643858146106d257600080fd5b8063a1d4c82811610145578063a4c0ed361161011f578063a4c0ed361461067b578063a9c9a9181461068e578063aab396bd146106a157600080fd5b8063a1d4c82814610616578063a21a23e41461064f578063a47c76961461065757600080fd5b80638fde5317116101765780638fde5317146105f35780639883c10d146105fb5780639f87fad71461060357600080fd5b80638456cb59146105c85780638da5cb5b146105d057600080fd5b806355fedefa1161024a578063674603d0116101fe5780637341c10c116101d85780637341c10c1461059a57806379ba5097146105ad57806382359740146105b557600080fd5b8063674603d0146104ba5780636a6df79b1461054f5780636e3b33231461058757600080fd5b80635ed6dfba1161022f5780635ed6dfba1461046657806366316d8d14610479578063664199701461048c57600080fd5b806355fedefa1461043c5780635c975abb1461044f57600080fd5b80631ded3b36116102ac5780633f4ba83a116102865780633f4ba83a14610400578063461d2762146104085780634b8832d31461042957600080fd5b80631ded3b36146103c7578063385de9ae146103da5780633e871e4d146103ed57600080fd5b806310fc49c1116102dd57806310fc49c11461032e57806312b5834914610341578063181f5a771461037e57600080fd5b806302bcc5b6146102f95780630c5d49cb1461030e575b600080fd5b61030c610307366004614ab1565b61078b565b005b610316608481565b60405161ffff90911681526020015b60405180910390f35b61030c61033c366004614aeb565b610818565b6009546b01000000000000000000000090046bffffffffffffffffffffffff166040516bffffffffffffffffffffffff9091168152602001610325565b6103ba6040518060400160405280601781526020017f46756e6374696f6e7320526f757465722076312e302e3000000000000000000081525081565b6040516103259190614b88565b61030c6103d5366004614b9b565b610942565b61030c6103e8366004614c10565b610973565b61030c6103fb366004614dc9565b610b51565b61030c610e47565b61041b610416366004614e92565b610e59565b604051908152602001610325565b61030c610437366004614f17565b610ead565b61041b61044a366004614ab1565b610faa565b60005460ff165b6040519015158152602001610325565b61030c610474366004614f6a565b610fce565b61030c610487366004614f6a565b6112a4565b6009546301000000900467ffffffffffffffff165b60405167ffffffffffffffff9091168152602001610325565b6105276104c8366004614f98565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600c6020908152604080832067ffffffffffffffff948516845290915290205460ff8116926101008204831692690100000000000000000090920490911690565b60408051931515845267ffffffffffffffff9283166020850152911690820152606001610325565b61056261055d366004614fd4565b6114cb565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610325565b61030c610595366004614ff9565b6114de565b61030c6105a8366004614f17565b6117b4565b61030c61194a565b61030c6105c3366004614ab1565b611a6c565b61030c611bbb565b600054610100900473ffffffffffffffffffffffffffffffffffffffff16610562565b61030c611bcb565b60075461041b565b61030c610611366004614f17565b611c73565b610629610624366004615212565b61207b565b6040805160ff90931683526bffffffffffffffffffffffff909116602083015201610325565b6104a1612447565b61066a610665366004614ab1565b6125db565b604051610325959493929190615310565b61030c610689366004615365565b6126c7565b61056261069c3660046153c1565b6128f6565b7fd8e0666292c202b1ce6a8ff0dd638652e662402ac53fbf9bd9d3bcc39d5eb09761041b565b60005460ff16610456565b61030c6106e03660046153da565b612903565b61030c612a64565b6106f5612bd2565b604051610325939291906153f7565b61070c612cad565b604051610325919061548e565b6103ba610727366004614c10565b612dc4565b61030c61073a366004614f17565b612dd9565b61030c61074d3660046154fb565b612e32565b610456610760366004614ab1565b61303d565b61030c6107733660046153c1565b613048565b61030c6107863660046154fb565b613266565b610793613277565b67ffffffffffffffff81166000908152600b60205260409020546c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff168061080a576040517f1f6a65b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610814828261327f565b5050565b67ffffffffffffffff82166000908152600b6020526040812060030154601054911a90811061087d576040517f45c108ce00000000000000000000000000000000000000000000000000000000815260ff821660048201526024015b60405180910390fd5b6010805460ff831690811061089457610894615518565b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1663ffffffff168263ffffffff16111561093d576010805460ff83169081106108e4576108e4615518565b600091825260209091206008820401546040517f1d70f87a000000000000000000000000000000000000000000000000000000008152600790921660049081026101000a90910463ffffffff1690820152602401610874565b505050565b61094a613277565b610953826135ed565b67ffffffffffffffff9091166000908152600b6020526040902060030155565b61097b613663565b60006109888460006136e9565b905060003073ffffffffffffffffffffffffffffffffffffffff8316036109b25750600754610a26565b8173ffffffffffffffffffffffffffffffffffffffff16639883c10d6040518163ffffffff1660e01b81526004016020604051808303816000875af11580156109ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a239190615547565b90505b8383604051610a36929190615560565b60405180910390208103610a76576040517fee03280800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051806060016040528082815260200185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250600954602090910190610ad79061ffff164361559f565b9052600086815260066020908152604090912082518155908201516001820190610b019082615653565b50604091820151600290910155517f0fcfd32a68209b42944376bc5f4bf72c41ba0f378cf60434f84390b82c9844cf90610b4290879084908890889061576d565b60405180910390a15050505050565b610b59613663565b8151815181141580610b6b5750600881115b15610ba2576040517fee03280800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610cce576000848281518110610bc157610bc1615518565b602002602001015190506000848381518110610bdf57610bdf615518565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610c4a575060008281526002602052604090205473ffffffffffffffffffffffffffffffffffffffff8281169116145b15610c81576040517fee03280800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81610cbb576040517f4855c28800000000000000000000000000000000000000000000000000000000815260048101839052602401610874565b505080610cc7906157c8565b9050610ba5565b50600954600090610ce39061ffff164361559f565b604080516060810182528681526020808201879052918101839052865192935091600391610d159183918901906148f1565b506020828101518051610d2e9260018501920190614938565b506040820151816002015590505060005b8451811015610e40577f72a33d2f293a0a70fad221bb610d3d6b52aed2d840adae1fa721071fbd290cfd858281518110610d7b57610d7b615518565b602002602001015160026000888581518110610d9957610d99615518565b6020026020010151815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16868481518110610de257610de2615518565b602002602001015185604051610e28949392919093845273ffffffffffffffffffffffffffffffffffffffff928316602085015291166040830152606082015260800190565b60405180910390a1610e39816157c8565b9050610d3f565b5050505050565b610e4f613663565b610e576137e0565b565b6000610ea28260008989898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508b92508a915061385d9050565b979650505050505050565b610eb5613bb3565b610ebe82613bbb565b610ec6613c81565b67ffffffffffffffff82166000908152600b602052604090206001015473ffffffffffffffffffffffffffffffffffffffff8281166c0100000000000000000000000090920416146108145767ffffffffffffffff82166000818152600b602090815260409182902060010180546bffffffffffffffffffffffff166c0100000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8716908102919091179091558251338152918201527f69436ea6df009049404f564eff6622cd00522b0bd6a89efd9e52a355c4a879be91015b60405180910390a25050565b67ffffffffffffffff81166000908152600b60205260408120600301545b92915050565b610fd6613277565b806bffffffffffffffffffffffff1660000361100c5750306000908152600d60205260409020546bffffffffffffffffffffffff165b306000908152600d60205260409020546bffffffffffffffffffffffff80831691161015611066576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b306000908152600d6020526040812080548392906110939084906bffffffffffffffffffffffff16615800565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550806009600b8282829054906101000a90046bffffffffffffffffffffffff166110ea9190615800565b82546101009290920a6bffffffffffffffffffffffff818102199093169183160217909155600a546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015292851660248201529116915063a9059cbb906044016020604051808303816000875af1158015611189573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ad919061582c565b61081457600a546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611220573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112449190615547565b6009546040517fa99da3020000000000000000000000000000000000000000000000000000000081526b0100000000000000000000009091046bffffffffffffffffffffffff166004820181905260248201839052919250604401610874565b6112ac613bb3565b806bffffffffffffffffffffffff166000036112f4576040517f8129bbcd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600d60205260409020546bffffffffffffffffffffffff8083169116101561134e576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600d60205260408120805483929061137b9084906bffffffffffffffffffffffff16615800565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550806009600b8282829054906101000a90046bffffffffffffffffffffffff166113d29190615800565b82546101009290920a6bffffffffffffffffffffffff818102199093169183160217909155600a546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015292851660248201529116915063a9059cbb906044016020604051808303816000875af1158015611471573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611495919061582c565b610814576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006114d783836136e9565b9392505050565b6114e6613bb3565b60005b8181101561093d57600083838381811061150557611505615518565b9050610160020180360381019061151c9190615849565b905060008160e001519050600e6000828152602001908152602001600020548260405160200161154c9190615866565b6040516020818303038152906040528051906020012014611599576040517f8129bbcd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160c0015164ffffffffff164210156115de576040517fbcc4005500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208201516040517f85b214cf0000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff8216906385b214cf906024016020604051808303816000875af1158015611650573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611674919061582c565b5060a0830151606084015167ffffffffffffffff166000908152600b6020526040812060010180549091906116b89084906bffffffffffffffffffffffff16615800565b82546bffffffffffffffffffffffff9182166101009390930a92830291909202199091161790555060408084015173ffffffffffffffffffffffffffffffffffffffff166000908152600c6020908152828220606087015167ffffffffffffffff9081168452915291902080546001926009916117449185916901000000000000000000900416615995565b825467ffffffffffffffff9182166101009390930a9283029190920219909116179055506000828152600e60205260408082208290555183917ff1ca1e9147be737b04a2b018a79405f687a97de8dd8a2559bbe62357343af41491a2505050806117ad906157c8565b90506114e9565b6117bc613bb3565b6117c582613bbb565b6117cd613c81565b600f5467ffffffffffffffff83166000908152600b602052604090206002015461ffff909116900361182b576040517f05a48e0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600c6020908152604080832067ffffffffffffffff8616845290915290205460ff1615611872575050565b73ffffffffffffffffffffffffffffffffffffffff81166000818152600c6020908152604080832067ffffffffffffffff871680855290835281842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155600b84528285206002018054918201815585529383902090930180547fffffffffffffffffffffffff000000000000000000000000000000000000000016851790555192835290917f43dc749a04ac8fb825cbd514f7c0e13f13bc6f2ee66043b76629d51776cff8e09101610f9e565b60015473ffffffffffffffffffffffffffffffffffffffff1633146119cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610874565b60008054336101008181027fffffffffffffffffffffff0000000000000000000000000000000000000000ff8416178455600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905560405173ffffffffffffffffffffffffffffffffffffffff919093041692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b611a74613bb3565b611a7c613c81565b67ffffffffffffffff81166000908152600b60205260409020805460019091015473ffffffffffffffffffffffffffffffffffffffff6c010000000000000000000000009283900481169290910416338114611b1c576040517fd084e97500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610874565b67ffffffffffffffff83166000818152600b602090815260409182902080546c01000000000000000000000000339081026bffffffffffffffffffffffff928316178355600190920180549091169055825173ffffffffffffffffffffffffffffffffffffffff87168152918201527f6f1dc65165ffffedfd8e507b4a0f1fcfdada045ed11f6c26ba27cedfe87802f0910160405180910390a2505050565b611bc3613663565b610e57613d88565b611bd3613663565b60085464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16431015611c35576040517fa93d035c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600854600980546201000090920461ffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909216919091179055565b611c7b613bb3565b611c8482613bbb565b611c8c613c81565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600c6020908152604080832067ffffffffffffffff8087168552908352928190208151606081018352905460ff8116151580835261010082048616948301949094526901000000000000000000900490931690830152611d5c576040517ff0019fe600000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8416600482015273ffffffffffffffffffffffffffffffffffffffff83166024820152604401610874565b806040015167ffffffffffffffff16816020015167ffffffffffffffff1614611db1576040517fbcc4005500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff83166000908152600b6020908152604080832060020180548251818502810185019093528083529192909190830182828015611e2c57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611e01575b50505050509050600060018251611e4391906159b6565b905060005b8251811015611fdf578473ffffffffffffffffffffffffffffffffffffffff16838281518110611e7a57611e7a615518565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603611fcf576000838381518110611eb157611eb1615518565b6020026020010151905080600b60008967ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018381548110611ef757611ef7615518565b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff949094169390931790925567ffffffffffffffff89168152600b90915260409020600201805480611f7157611f716159c9565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905501905550611fdf565b611fd8816157c8565b9050611e48565b5073ffffffffffffffffffffffffffffffffffffffff84166000818152600c6020908152604080832067ffffffffffffffff8a168085529083529281902080547fffffffffffffffffffffffffffffff00000000000000000000000000000000001690555192835290917f182bff9831466789164ca77075fffd84916d35a8180ba73c27e45634549b445b910160405180910390a25050505050565b600080612086613bb3565b826020015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146120ef576040517f8bec23e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60e08301516000908152600e60205260409020546121845760025b91508260e001517f1a90e9a50793db2e394cf581e7c522e10c358a81e70acf6b5a0edd620c08dee1846020015186856040516121779392919073ffffffffffffffffffffffffffffffffffffffff938416815291909216602082015260ff91909116604082015260600190565b60405180910390a261243c565b600e60008460e00151815260200190815260200160002054836040516020016121ad9190615866565b60405160208183030381529060405280519060200120146121cf57600661210a565b826101400151836080015163ffffffff166121ea91906159f8565b64ffffffffff165a10156121ff57600461210a565b606083015167ffffffffffffffff166000908152600b602052604090205460808401516bffffffffffffffffffffffff909116906122429063ffffffff16613de3565b61224c9088615a16565b8451612259908890615a3e565b6122639190615a3e565b6bffffffffffffffffffffffff1611156122f45760e0830180516000908152600e6020908152604080832092909255915182860151825173ffffffffffffffffffffffffffffffffffffffff9182168152908816938101939093526005918301829052909350907f1a90e9a50793db2e394cf581e7c522e10c358a81e70acf6b5a0edd620c08dee190606001612177565b8260a001516bffffffffffffffffffffffff1661231a846080015163ffffffff16613de3565b6123249088615a16565b8451612331908890615a3e565b61233b9190615a3e565b6bffffffffffffffffffffffff16111561235657600361210a565b60009150600e60008460e0015181526020019081526020016000206000905560006123908460e001518a8a87608001518860400151613e85565b80519091506123a05760016123a3565b60005b925060006123ca85606001518660a00151876040015188600001518c87602001518d614001565b9050846060015167ffffffffffffffff168560e001517f47ffcaa55fde21cc7135c65541826c9e65dda59c29dc109aae964989e8fc664b836020015189888760000151612417578e612419565b8f5b886040015160405161242f959493929190615a63565b60405180910390a3519150505b965096945050505050565b6000612451613bb3565b612459613c81565b6009805460039061247a906301000000900467ffffffffffffffff16615ac1565b825467ffffffffffffffff8083166101009490940a93840293021916919091179091556040805160c08101825260008082523360208301529181018290526060810182905291925060808201906040519080825280602002602001820160405280156124f0578160200160208202803683370190505b5081526000602091820181905267ffffffffffffffff84168152600b825260409081902083518484015173ffffffffffffffffffffffffffffffffffffffff9081166c010000000000000000000000009081026bffffffffffffffffffffffff938416178455938601516060870151909116909302921691909117600182015560808301518051919261258b92600285019290910190614938565b5060a0919091015160039091015560405133815267ffffffffffffffff8216907f464722b4166576d3dcbba877b999bc35cf911f4eaf434b7eba68fa113951d0bf9060200160405180910390a290565b60008060008060606125ec866135ed565b67ffffffffffffffff86166000908152600b602090815260409182902080546001820154600290920180548551818602810186019096528086526bffffffffffffffffffffffff8084169b508416995073ffffffffffffffffffffffffffffffffffffffff6c010000000000000000000000009384900481169950929093049091169550918301828280156126b757602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161268c575b5050505050905091939590929450565b6126cf613bb3565b600a5473ffffffffffffffffffffffffffffffffffffffff163314612720576040517f44b0e3c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020811461275a576040517f8129bbcd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061276882840184614ab1565b67ffffffffffffffff81166000908152600b60205260409020549091506c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff166127e1576040517f1f6a65b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff81166000908152600b6020526040812080546bffffffffffffffffffffffff16918691906128188385615a3e565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550846009600b8282829054906101000a90046bffffffffffffffffffffffff1661286f9190615a3e565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508167ffffffffffffffff167fd39ec07f4e209f627a4c427971473820dc129761ba28de8906bd56f57101d4f88287846128d6919061559f565b6040805192835260208301919091520160405180910390a2505050505050565b6000610fc88260006136e9565b61290b613663565b60095461ffff80831691160361294d576040517fee03280800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000061ffff168161ffff1611156129af576040517fe9a3062200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160608101825260095461ffff908116808352908416602083015290918201906129dc904361559f565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90811690915281516008805460208501516040909501519093166401000000000263ffffffff61ffff95861662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000009095169590931694909417929092171691909117905550565b612a6c613663565b600554431015612aa8576040517fa93d035c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b600354811015612bcf57600060036000018281548110612acd57612acd615518565b6000918252602080832090910154808352600290915260408220546004805492945073ffffffffffffffffffffffffffffffffffffffff909116929185908110612b1957612b19615518565b6000918252602080832091909101548583526002825260409283902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92831690811790915583518781529186169282019290925291820181905291507ff8a6175bca1ba37d682089187edc5e20a859989727f10ca6bd9a5bc0de8caf949060600160405180910390a150505080612bc8906157c8565b9050612aab565b50565b60006060806003600201546003600001600360010181805480602002602001604051908101604052809291908181526020018280548015612c3257602002820191906000526020600020905b815481526020019060010190808311612c1e575b5050505050915080805480602002602001604051908101604052809291908181526020018280548015612c9b57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311612c70575b50505050509050925092509250909192565b604080516080810182526000808252602082018190529181019190915260608082015260408051608081018252600f805461ffff811683526201000081046bffffffffffffffffffffffff166020808501919091526e01000000000000000000000000000090910460e01b7fffffffff0000000000000000000000000000000000000000000000000000000016838501526010805485518184028101840190965280865293949293606086019392830182828015612db657602002820191906000526020600020906000905b82829054906101000a900463ffffffff1663ffffffff1681526020019060040190602082600301049283019260010382029150808411612d795790505b505050505081525050905090565b6060612dd1848484614253565b949350505050565b612de1613bb3565b612dea82613bbb565b612df2613c81565b612dfb82614320565b1561080a576040517fb42f66e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e3a613277565b600a546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612ea9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ecd9190615547565b6009549091506b01000000000000000000000090046bffffffffffffffffffffffff1681811115612f34576040517fa99da3020000000000000000000000000000000000000000000000000000000081526004810182905260248101839052604401610874565b8181101561093d576000612f4882846159b6565b600a546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301526024820184905292935091169063a9059cbb906044016020604051808303816000875af1158015612fc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fe7919061582c565b506040805173ffffffffffffffffffffffffffffffffffffffff86168152602081018390527f59bfc682b673f8cbf945f1e454df9334834abf7dfe7f92237ca29ecb9b436600910160405180910390a150505050565b6000610fc882614320565b613050613663565b6000600660008381526020019081526020016000206040518060600160405290816000820154815260200160018201805461308a906155b2565b80601f01602080910402602001604051908101604052809291908181526020018280546130b6906155b2565b80156131035780601f106130d857610100808354040283529160200191613103565b820191906000526020600020905b8154815290600101906020018083116130e657829003601f168201915b5050505050815260200160028201548152505090508060400151431015613156576040517fa93d035c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8161317b57613168816020015161446f565b6020808201518051910120600755613223565b6131868260006136e9565b73ffffffffffffffffffffffffffffffffffffffff16638cc6acce82602001516040518263ffffffff1660e01b81526004016131c29190614b88565b600060405180830381600087803b1580156131dc57600080fd5b505af19250505080156131ed575060015b613223576040517ffe680b2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160208201516040517fc07626096b49b0462a576c9a7878cf0675e784bb4832584c1289c11664e55f479261325a928692615ae8565b60405180910390a15050565b61326e613663565b612bcf816145a6565b610e57613663565b67ffffffffffffffff82166000908152600b60209081526040808320815160c08101835281546bffffffffffffffffffffffff808216835273ffffffffffffffffffffffffffffffffffffffff6c010000000000000000000000009283900481168488015260018501549182168487015291900416606082015260028201805484518187028101870190955280855291949293608086019390929083018282801561336057602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311613335575b505050918352505060039190910154602090910152805190915060005b82608001515181101561342157600c6000846080015183815181106133a4576133a4615518565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff168252818101929092526040908101600090812067ffffffffffffffff89168252909252902080547fffffffffffffffffffffffffffffff000000000000000000000000000000000016905561341a816157c8565b905061337d565b5067ffffffffffffffff84166000908152600b60205260408120818155600181018290559061345360028301826149b2565b60038201600090555050806009600b8282829054906101000a90046bffffffffffffffffffffffff166134869190615800565b82546101009290920a6bffffffffffffffffffffffff818102199093169183160217909155600a546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015292851660248201529116915063a9059cbb906044016020604051808303816000875af1158015613525573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613549919061582c565b61357f576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff851681526bffffffffffffffffffffffff8316602082015267ffffffffffffffff8616917fe8ed5b475a5b5987aa9165e8731bb78043f39eee32ec5a1169a89e27fcd49815910160405180910390a250505050565b67ffffffffffffffff81166000908152600b60205260409020546c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff16612bcf576040517f1f6a65b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900473ffffffffffffffffffffffffffffffffffffffff163314610e57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610874565b6000816137285760008381526002602052604090205473ffffffffffffffffffffffffffffffffffffffff168015613722579050610fc8565b506137ab565b60005b6003548110156137a957600380548290811061374957613749615518565b9060005260206000200154840361379957600480548290811061376e5761376e615518565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169150610fc89050565b6137a2816157c8565b905061372b565b505b6040517f80833e3300000000000000000000000000000000000000000000000000000000815260048101849052602401610874565b6137e86146a1565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6000613867613bb3565b613870856135ed565b61387a338661470d565b6138848583610818565b600061389088886136e9565b604080516101008101825233815267ffffffffffffffff89166000818152600b6020818152858320805473ffffffffffffffffffffffffffffffffffffffff6c010000000000000000000000009091048116838801528688018e90526060870186905261ffff8d1660808801529484529190526003015460a084015263ffffffff881660c0840152600f546201000090046bffffffffffffffffffffffff1660e084015292517fbdd7e88000000000000000000000000000000000000000000000000000000000815293945091929184169163bdd7e8809161397491600401615b10565b610160604051808303816000875af1158015613994573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139b89190615c11565b90506139c933888360a001516147a9565b604051806101600160405280600f60000160029054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018867ffffffffffffffff1681526020018563ffffffff1681526020018260a001516bffffffffffffffffffffffff1681526020018260c0015164ffffffffff1681526020018260e00151815260200182610100015169ffffffffffffffffffff16815260200182610120015164ffffffffff16815260200182610140015164ffffffffff16815250604051602001613ad69190615866565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152828252805160209182012060e0850180516000908152600e8452848120929092555167ffffffffffffffff8c16808352600b9093529290205490928c92917f7c720ccd20069b8311a6be4ba1cf3294d09eb247aa5d73a8502054b6e68a2f5491613b9b916c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1690339032908e908e908e90615ce4565b60405180910390a460e0015198975050505050505050565b610e57614884565b67ffffffffffffffff81166000908152600b60205260409020546c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1680613c32576040517f1f6a65b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff821614610814576040517f5a68151d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613cac7fd8e0666292c202b1ce6a8ff0dd638652e662402ac53fbf9bd9d3bcc39d5eb09760006136e9565b604080516000815260208101918290527f6b14daf80000000000000000000000000000000000000000000000000000000090915273ffffffffffffffffffffffffffffffffffffffff9190911690636b14daf890613d0f90339060248101615d48565b602060405180830381865afa158015613d2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d50919061582c565b610e57576040517f22906263000000000000000000000000000000000000000000000000000000008152336004820152602401610874565b613d90614884565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586138333390565b60006bffffffffffffffffffffffff821115613e81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203960448201527f36206269747300000000000000000000000000000000000000000000000000006064820152608401610874565b5090565b60408051606080820183526000808352602083015291810191909152600f546040516000916e010000000000000000000000000000900460e01b90613ed290899089908990602401615d77565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00181529181526020820180517fffffffff00000000000000000000000000000000000000000000000000000000949094167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff909416939093179092528151608480825260c0820190935290925060009182918291602082018180368337019050509050853b613f8457600080fd5b5a611388811015613f9457600080fd5b611388810390508760408204820311613fac57600080fd5b60008086516020880160008b8df193505a900391503d6084811115613fcf575060845b808252806000602084013e50604080516060810182529315158452602084019290925290820152979650505050505050565b6040805180820190915260008082526020820152600061402084613de3565b61402a9086615a16565b90506000816140398886615a3e565b6140439190615a3e565b6040805180820182526bffffffffffffffffffffffff808616825280841660208084019190915267ffffffffffffffff8f166000908152600b90915292832080549297509394508493929161409a91859116615800565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555081846140d49190615a3e565b336000908152600d6020526040812080549091906141019084906bffffffffffffffffffffffff16615a3e565b82546101009290920a6bffffffffffffffffffffffff818102199093169183160217909155306000908152600d6020526040812080548b9450909261414891859116615a3e565b82546101009290920a6bffffffffffffffffffffffff81810219909316918316021790915567ffffffffffffffff8c166000908152600b6020526040812060010180548d9450909261419c91859116615800565b82546bffffffffffffffffffffffff9182166101009390930a92830291909202199091161790555073ffffffffffffffffffffffffffffffffffffffff88166000908152600c6020908152604080832067ffffffffffffffff808f168552925290912080546001926009916142209185916901000000000000000000900416615995565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050979650505050505050565b6060600080808061426686880188615dac565b9350935093509350600061427f8960018787878761385d565b60408051602080825281830190925291925060208201818036833701905050955060005b6020811015614313578181602081106142be576142be615518565b1a60f81b8782815181106142d4576142d4615518565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061430c816157c8565b90506142a3565b5050505050509392505050565b67ffffffffffffffff81166000908152600b602090815260408083206002018054825181850281018501909352808352849383018282801561439857602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161436d575b5050505050905060005b8151811015614465576000600c60008484815181106143c3576143c3615518565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff168252818101929092526040908101600090812067ffffffffffffffff808a168352908452908290208251606081018452905460ff811615158252610100810483169482018590526901000000000000000000900490911691810182905292501461445457506001949350505050565b5061445e816157c8565b90506143a2565b5060009392505050565b600080600080848060200190518101906144899190615e21565b6040805160808101825261ffff86168082526bffffffffffffffffffffffff861660208084018290527fffffffff0000000000000000000000000000000000000000000000000000000087169484019490945260608301859052600f80547fffffffffffffffffffffffffffffffffffff00000000000000000000000000001690921762010000909102177fffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffff166e01000000000000000000000000000060e087901c021781558351969a50949850929650909450909261456f91601091908601906149d0565b509050507fe6a1eda76d42a6d1d813f26765716562044db1e8bd8be7d088705e64afd301ca838383604051610b4293929190615f1c565b3373ffffffffffffffffffffffffffffffffffffffff821603614625576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610874565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929361010090910416917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60005460ff16610e57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610874565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600c6020908152604080832067ffffffffffffffff8516845290915290205460ff16610814576040517ff0019fe600000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8216600482015273ffffffffffffffffffffffffffffffffffffffff83166024820152604401610874565b67ffffffffffffffff82166000908152600b6020526040812060010180548392906147e39084906bffffffffffffffffffffffff16615a3e565b82546bffffffffffffffffffffffff91821661010093840a908102920219161790915573ffffffffffffffffffffffffffffffffffffffff85166000908152600c6020908152604080832067ffffffffffffffff8089168552925290912080546001945090928492614859928492900416615995565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505050565b60005460ff1615610e57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610874565b82805482825590600052602060002090810192821561492c579160200282015b8281111561492c578251825591602001919060010190614911565b50613e81929150614a76565b82805482825590600052602060002090810192821561492c579160200282015b8281111561492c57825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190614958565b5080546000825590600052602060002090810190612bcf9190614a76565b8280548282559060005260206000209060070160089004810192821561492c5791602002820160005b83821115614a3d57835183826101000a81548163ffffffff021916908363ffffffff16021790555092602001926004016020816003010492830192600103026149f9565b8015614a6d5782816101000a81549063ffffffff0219169055600401602081600301049283019260010302614a3d565b5050613e819291505b5b80821115613e815760008155600101614a77565b67ffffffffffffffff81168114612bcf57600080fd5b8035614aac81614a8b565b919050565b600060208284031215614ac357600080fd5b81356114d781614a8b565b63ffffffff81168114612bcf57600080fd5b8035614aac81614ace565b60008060408385031215614afe57600080fd5b8235614b0981614a8b565b91506020830135614b1981614ace565b809150509250929050565b6000815180845260005b81811015614b4a57602081850181015186830182015201614b2e565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815260006114d76020830184614b24565b60008060408385031215614bae57600080fd5b8235614bb981614a8b565b946020939093013593505050565b60008083601f840112614bd957600080fd5b50813567ffffffffffffffff811115614bf157600080fd5b602083019150836020828501011115614c0957600080fd5b9250929050565b600080600060408486031215614c2557600080fd5b83359250602084013567ffffffffffffffff811115614c4357600080fd5b614c4f86828701614bc7565b9497909650939450505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715614caf57614caf614c5c565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614cfc57614cfc614c5c565b604052919050565b600067ffffffffffffffff821115614d1e57614d1e614c5c565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81168114612bcf57600080fd5b8035614aac81614d28565b600082601f830112614d6657600080fd5b81356020614d7b614d7683614d04565b614cb5565b82815260059290921b84018101918181019086841115614d9a57600080fd5b8286015b84811015614dbe578035614db181614d28565b8352918301918301614d9e565b509695505050505050565b60008060408385031215614ddc57600080fd5b823567ffffffffffffffff80821115614df457600080fd5b818501915085601f830112614e0857600080fd5b81356020614e18614d7683614d04565b82815260059290921b84018101918181019089841115614e3757600080fd5b948201945b83861015614e5557853582529482019490820190614e3c565b96505086013592505080821115614e6b57600080fd5b50614e7885828601614d55565b9150509250929050565b61ffff81168114612bcf57600080fd5b60008060008060008060a08789031215614eab57600080fd5b8635614eb681614a8b565b9550602087013567ffffffffffffffff811115614ed257600080fd5b614ede89828a01614bc7565b9096509450506040870135614ef281614e82565b92506060870135614f0281614ace565b80925050608087013590509295509295509295565b60008060408385031215614f2a57600080fd5b8235614f3581614a8b565b91506020830135614b1981614d28565b6bffffffffffffffffffffffff81168114612bcf57600080fd5b8035614aac81614f45565b60008060408385031215614f7d57600080fd5b8235614f8881614d28565b91506020830135614b1981614f45565b60008060408385031215614fab57600080fd5b8235614fb681614d28565b91506020830135614b1981614a8b565b8015158114612bcf57600080fd5b60008060408385031215614fe757600080fd5b823591506020830135614b1981614fc6565b6000806020838503121561500c57600080fd5b823567ffffffffffffffff8082111561502457600080fd5b818501915085601f83011261503857600080fd5b81358181111561504757600080fd5b8660206101608302850101111561505d57600080fd5b60209290920196919550909350505050565b600082601f83011261508057600080fd5b813567ffffffffffffffff81111561509a5761509a614c5c565b6150cb60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614cb5565b8181528460208386010111156150e057600080fd5b816020850160208301376000918101602001919091529392505050565b64ffffffffff81168114612bcf57600080fd5b8035614aac816150fd565b69ffffffffffffffffffff81168114612bcf57600080fd5b8035614aac8161511b565b6000610160828403121561515157600080fd5b615159614c8b565b905061516482614f5f565b815261517260208301614d4a565b602082015261518360408301614d4a565b604082015261519460608301614aa1565b60608201526151a560808301614ae0565b60808201526151b660a08301614f5f565b60a08201526151c760c08301615110565b60c082015260e082013560e08201526101006151e4818401615133565b908201526101206151f6838201615110565b90820152610140615208838201615110565b9082015292915050565b600080600080600080610200878903121561522c57600080fd5b863567ffffffffffffffff8082111561524457600080fd5b6152508a838b0161506f565b9750602089013591508082111561526657600080fd5b5061527389828a0161506f565b955050604087013561528481614f45565b9350606087013561529481614f45565b925060808701356152a481614d28565b91506152b38860a0890161513e565b90509295509295509295565b600081518084526020808501945080840160005b8381101561530557815173ffffffffffffffffffffffffffffffffffffffff16875295820195908201906001016152d3565b509495945050505050565b6bffffffffffffffffffffffff86811682528516602082015273ffffffffffffffffffffffffffffffffffffffff84811660408301528316606082015260a060808201819052600090610ea2908301846152bf565b6000806000806060858703121561537b57600080fd5b843561538681614d28565b935060208501359250604085013567ffffffffffffffff8111156153a957600080fd5b6153b587828801614bc7565b95989497509550505050565b6000602082840312156153d357600080fd5b5035919050565b6000602082840312156153ec57600080fd5b81356114d781614e82565b6000606082018583526020606081850152818651808452608086019150828801935060005b818110156154385784518352938301939183019160010161541c565b5050848103604086015261544c81876152bf565b98975050505050505050565b600081518084526020808501945080840160005b8381101561530557815163ffffffff168752958201959082019060010161546c565b6020815261ffff82511660208201526bffffffffffffffffffffffff60208301511660408201527fffffffff00000000000000000000000000000000000000000000000000000000604083015116606082015260006060830151608080840152612dd160a0840182615458565b60006020828403121561550d57600080fd5b81356114d781614d28565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561555957600080fd5b5051919050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610fc857610fc8615570565b600181811c908216806155c657607f821691505b6020821081036155ff577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f82111561093d57600081815260208120601f850160051c8101602086101561562c5750805b601f850160051c820191505b8181101561564b57828155600101615638565b505050505050565b815167ffffffffffffffff81111561566d5761566d614c5c565b6156818161567b84546155b2565b84615605565b602080601f8311600181146156d4576000841561569e5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561564b565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561572157888601518255948401946001909101908401615702565b508582101561575d57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b84815283602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036157f9576157f9615570565b5060010190565b6bffffffffffffffffffffffff82811682821603908082111561582557615825615570565b5092915050565b60006020828403121561583e57600080fd5b81516114d781614fc6565b6000610160828403121561585c57600080fd5b6114d7838361513e565b81516bffffffffffffffffffffffff168152610160810160208301516158a4602084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060408301516158cc604084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060608301516158e8606084018267ffffffffffffffff169052565b506080830151615900608084018263ffffffff169052565b5060a083015161592060a08401826bffffffffffffffffffffffff169052565b5060c083015161593960c084018264ffffffffff169052565b5060e083015160e0830152610100808401516159628285018269ffffffffffffffffffff169052565b50506101208381015164ffffffffff81168483015250506101408381015164ffffffffff8116848301525b505092915050565b67ffffffffffffffff81811683821601908082111561582557615825615570565b81810381811115610fc857610fc8615570565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b64ffffffffff81811683821601908082111561582557615825615570565b6bffffffffffffffffffffffff81811683821602808216919082811461598d5761598d615570565b6bffffffffffffffffffffffff81811683821601908082111561582557615825615570565b6bffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff8516602082015260ff8416604082015260a060608201526000615aaf60a0830185614b24565b828103608084015261544c8185614b24565b600067ffffffffffffffff808316818103615ade57615ade615570565b6001019392505050565b838152826020820152606060408201526000615b076060830184614b24565b95945050505050565b60208152600073ffffffffffffffffffffffffffffffffffffffff808451166020840152806020850151166040840152506040830151610100806060850152615b5d610120850183614b24565b91506060850151615b7a608086018267ffffffffffffffff169052565b50608085015161ffff811660a08601525060a085015160c085015260c0850151615bac60e086018263ffffffff169052565b5060e08501516bffffffffffffffffffffffff8116858301525090949350505050565b8051614aac81614f45565b8051614aac81614d28565b8051614aac81614a8b565b8051614aac81614ace565b8051614aac816150fd565b8051614aac8161511b565b60006101608284031215615c2457600080fd5b615c2c614c8b565b615c3583615bcf565b8152615c4360208401615bda565b6020820152615c5460408401615bda565b6040820152615c6560608401615be5565b6060820152615c7660808401615bf0565b6080820152615c8760a08401615bcf565b60a0820152615c9860c08401615bfb565b60c082015260e083015160e0820152610100615cb5818501615c06565b90820152610120615cc7848201615bfb565b90820152610140615cd9848201615bfb565b908201529392505050565b600073ffffffffffffffffffffffffffffffffffffffff8089168352808816602084015280871660408401525060c06060830152615d2560c0830186614b24565b905061ffff8416608083015263ffffffff831660a0830152979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201526000612dd16040830184614b24565b838152606060208201526000615d906060830185614b24565b8281036040840152615da28185614b24565b9695505050505050565b60008060008060808587031215615dc257600080fd5b8435615dcd81614a8b565b9350602085013567ffffffffffffffff811115615de957600080fd5b615df58782880161506f565b9350506040850135615e0681614e82565b91506060850135615e1681614ace565b939692955090935050565b60008060008060808587031215615e3757600080fd5b8451615e4281614e82565b80945050602080860151615e5581614f45565b60408701519094507fffffffff0000000000000000000000000000000000000000000000000000000081168114615e8b57600080fd5b606087015190935067ffffffffffffffff811115615ea857600080fd5b8601601f81018813615eb957600080fd5b8051615ec7614d7682614d04565b81815260059190911b8201830190838101908a831115615ee657600080fd5b928401925b82841015615f0d578351615efe81614ace565b82529284019290840190615eeb565b979a9699509497505050505050565b6bffffffffffffffffffffffff841681527fffffffff0000000000000000000000000000000000000000000000000000000083166020820152606060408201526000615b07606083018461545856fea164736f6c6343000813000a", + ABI: "[{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"timelockBlocks\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"maximumTimelockBlocks\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AlreadyApplied\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"internalBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"externalBalance\",\"type\":\"uint256\"}],\"name\":\"BalanceInvariantViolated\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ConsumerRequestsInFlight\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"limit\",\"type\":\"uint32\"}],\"name\":\"GasLimitTooBig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"IdentifierIsReserved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCalldata\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfigData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConsumer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"value\",\"type\":\"uint8\"}],\"name\":\"InvalidGasFlagValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidProposal\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSubscription\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeProposedOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeSubscriptionOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByRoute\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableFromCoordinator\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableFromLink\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PendingRequestExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ProposedTimelockAboveMaximum\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"RouteNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderMustAcceptTermsOfService\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TimelockInEffect\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyConsumers\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"adminFee\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"bytes4\",\"name\":\"handleOracleFulfillmentSelector\",\"type\":\"bytes4\"},{\"indexed\":false,\"internalType\":\"uint32[]\",\"name\":\"maxCallbackGasLimits\",\"type\":\"uint32[]\"}],\"name\":\"ConfigChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"toBytes\",\"type\":\"bytes\"}],\"name\":\"ConfigProposed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"toBytes\",\"type\":\"bytes\"}],\"name\":\"ConfigUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"proposedContractSetId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"proposedContractSetFromAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"proposedContractSetToAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timelockEndBlock\",\"type\":\"uint256\"}],\"name\":\"ContractProposed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"ContractUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"FundsRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"coordinator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"enumFulfillResult\",\"name\":\"resultCode\",\"type\":\"uint8\"}],\"name\":\"RequestNotProcessed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"totalCostJuels\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"enumFulfillResult\",\"name\":\"resultCode\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"response\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"name\":\"RequestProcessed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"donId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"subscriptionOwner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"requestingContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"requestInitiator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"dataVersion\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"}],\"name\":\"RequestStart\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"}],\"name\":\"RequestTimedOut\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"fundsRecipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fundsAmount\",\"type\":\"uint256\"}],\"name\":\"SubscriptionCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"SubscriptionConsumerAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"SubscriptionConsumerRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"SubscriptionCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBalance\",\"type\":\"uint256\"}],\"name\":\"SubscriptionFunded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"SubscriptionOwnerTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"SubscriptionOwnerTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"from\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"to\",\"type\":\"uint16\"}],\"name\":\"TimeLockProposed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"from\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"to\",\"type\":\"uint16\"}],\"name\":\"TimeLockUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MAX_CALLBACK_RETURN_BYTES\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"}],\"name\":\"acceptSubscriptionOwnerTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"addConsumer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"cancelSubscription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"createSubscription\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"response\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"},{\"internalType\":\"uint96\",\"name\":\"juelsPerGas\",\"type\":\"uint96\"},{\"internalType\":\"uint96\",\"name\":\"costWithoutCallback\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint96\",\"name\":\"adminFee\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"coordinator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"client\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint96\",\"name\":\"estimatedTotalCostJuels\",\"type\":\"uint96\"},{\"internalType\":\"uint40\",\"name\":\"timeoutTimestamp\",\"type\":\"uint40\"},{\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"},{\"internalType\":\"uint80\",\"name\":\"donFee\",\"type\":\"uint80\"},{\"internalType\":\"uint40\",\"name\":\"gasOverheadBeforeCallback\",\"type\":\"uint40\"},{\"internalType\":\"uint40\",\"name\":\"gasOverheadAfterCallback\",\"type\":\"uint40\"}],\"internalType\":\"structIFunctionsRequest.Commitment\",\"name\":\"commitment\",\"type\":\"tuple\"}],\"name\":\"fulfill\",\"outputs\":[{\"internalType\":\"enumFulfillResult\",\"name\":\"resultCode\",\"type\":\"uint8\"},{\"internalType\":\"uint96\",\"name\":\"callbackGasCostJuels\",\"type\":\"uint96\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowListId\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConfig\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"},{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"},{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"},{\"internalType\":\"uint32[]\",\"name\":\"\",\"type\":\"uint32[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"client\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"}],\"name\":\"getConsumer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"initiatedRequests\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"completedRequests\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"getContractById\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"}],\"name\":\"getFlags\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"getProposedContractById\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getProposedContractSet\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"},{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"}],\"name\":\"getSubscription\",\"outputs\":[{\"components\":[{\"internalType\":\"uint96\",\"name\":\"balance\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"blockedBalance\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"requestedOwner\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"consumers\",\"type\":\"address[]\"},{\"internalType\":\"bytes32\",\"name\":\"flags\",\"type\":\"bytes32\"}],\"internalType\":\"structIFunctionsSubscriptions.Subscription\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSubscriptionCount\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBalance\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"}],\"name\":\"isValidCallbackGasLimit\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onTokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"amount\",\"type\":\"uint96\"}],\"name\":\"oracleWithdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"}],\"name\":\"ownerCancelSubscription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"amount\",\"type\":\"uint96\"}],\"name\":\"ownerWithdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"}],\"name\":\"pendingRequestExists\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"name\":\"proposeConfigUpdate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"name\":\"proposeConfigUpdateSelf\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"proposedContractSetIds\",\"type\":\"bytes32[]\"},{\"internalType\":\"address[]\",\"name\":\"proposedContractSetAddresses\",\"type\":\"address[]\"}],\"name\":\"proposeContractsUpdate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"proposeSubscriptionOwnerTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"blocks\",\"type\":\"uint16\"}],\"name\":\"proposeTimelockBlocks\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"recoverFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"removeConsumer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint16\",\"name\":\"dataVersion\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"donId\",\"type\":\"bytes32\"}],\"name\":\"sendRequest\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint16\",\"name\":\"dataVersion\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"donId\",\"type\":\"bytes32\"}],\"name\":\"sendRequestToProposed\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"flags\",\"type\":\"bytes32\"}],\"name\":\"setFlags\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint96\",\"name\":\"adminFee\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"coordinator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"client\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint96\",\"name\":\"estimatedTotalCostJuels\",\"type\":\"uint96\"},{\"internalType\":\"uint40\",\"name\":\"timeoutTimestamp\",\"type\":\"uint40\"},{\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"},{\"internalType\":\"uint80\",\"name\":\"donFee\",\"type\":\"uint80\"},{\"internalType\":\"uint40\",\"name\":\"gasOverheadBeforeCallback\",\"type\":\"uint40\"},{\"internalType\":\"uint40\",\"name\":\"gasOverheadAfterCallback\",\"type\":\"uint40\"}],\"internalType\":\"structIFunctionsRequest.Commitment[]\",\"name\":\"requestsToTimeoutByCommitment\",\"type\":\"tuple[]\"}],\"name\":\"timeoutRequests\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"updateConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"updateConfigSelf\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"updateContracts\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"updateTimelockBlocks\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x60a06040523480156200001157600080fd5b50604051620066d0380380620066d0833981016040819052620000349162000441565b6000805460ff191681558290339086908690859084908190816200009f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0380851661010002610100600160a81b031990921691909117909155811615620000d957620000d9816200016e565b50506008805461ffff80871661ffff19909216919091179091558316608052506000805260026020527fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b80546001600160a01b031916301790556200013e816200021f565b5050600980546001600160a01b0319166001600160a01b03949094169390931790925550620006cd945050505050565b336001600160a01b03821603620001c85760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000096565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929361010090910416917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600080600080848060200190518101906200023b91906200053e565b6040805160808101825261ffff86168082526001600160601b03861660208084018290526001600160e01b031987169484019490945260608301859052600e80546001600160701b031916909217620100009091021763ffffffff60701b1916600160701b60e087901c021781558351969a509498509296509094509092620002cb91600f919086019062000313565b509050507fe6a1eda76d42a6d1d813f26765716562044db1e8bd8be7d088705e64afd301ca83838360405162000304939291906200065c565b60405180910390a15050505050565b82805482825590600052602060002090600701600890048101928215620003b75791602002820160005b838211156200038357835183826101000a81548163ffffffff021916908363ffffffff16021790555092602001926004016020816003010492830192600103026200033d565b8015620003b55782816101000a81549063ffffffff021916905560040160208160030104928301926001030262000383565b505b50620003c5929150620003c9565b5090565b5b80821115620003c55760008155600101620003ca565b805161ffff81168114620003f357600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620004395762000439620003f8565b604052919050565b600080600080608085870312156200045857600080fd5b6200046385620003e0565b9350602062000474818701620003e0565b60408701519094506001600160a01b03811681146200049257600080fd5b60608701519093506001600160401b0380821115620004b057600080fd5b818801915088601f830112620004c557600080fd5b815181811115620004da57620004da620003f8565b620004ee601f8201601f191685016200040e565b915080825289848285010111156200050557600080fd5b60005b818110156200052557838101850151838201860152840162000508565b5060008482840101525080935050505092959194509250565b600080600080608085870312156200055557600080fd5b6200056085620003e0565b602086810151919550906001600160601b03811681146200058057600080fd5b60408701519094506001600160e01b0319811681146200059f57600080fd5b60608701519093506001600160401b0380821115620005bd57600080fd5b818801915088601f830112620005d257600080fd5b815181811115620005e757620005e7620003f8565b8060051b9150620005fa8483016200040e565b818152918301840191848101908b8411156200061557600080fd5b938501935b838510156200064c578451925063ffffffff831683146200063b5760008081fd5b82825293850193908501906200061a565b989b979a50959850505050505050565b6001600160601b03841681526001600160e01b031983166020808301919091526060604083018190528351908301819052600091848101916080850190845b81811015620006bf57845163ffffffff16835293830193918301916001016200069b565b509098975050505050505050565b608051615fe7620006e96000396000612af60152615fe76000f3fe608060405234801561001057600080fd5b50600436106102ff5760003560e01c806379ba50971161019c578063aab396bd116100ee578063d7ae1d3011610097578063ea5d840f11610071578063ea5d840f1461076f578063eb523d6c14610782578063f2fde38b1461079557600080fd5b8063d7ae1d3014610736578063e72f6e3014610749578063e82ad7d41461075c57600080fd5b8063b734c0f4116100c8578063b734c0f4146106ff578063badc3eb614610707578063c3f909d41461071e57600080fd5b8063aab396bd146106bb578063b187bd26146106e1578063b5643858146106ec57600080fd5b80639f87fad711610150578063a47c76961161012a578063a47c769614610675578063a4c0ed3614610695578063a9c9a918146106a857600080fd5b80639f87fad714610639578063a1d4c8281461064c578063a21a23e41461066d57600080fd5b80638456cb59116101815780638456cb59146106065780638da5cb5b1461060e5780638fde53171461063157600080fd5b806379ba5097146105eb57806382359740146105f357600080fd5b8063461d27621161025557806366316d8d116102095780636a2215de116101e35780636a2215de1461058d5780636e3b3323146105c55780637341c10c146105d857600080fd5b806366316d8d146104b857806366419970146104cb578063674603d0146104f857600080fd5b806355fedefa1161023a57806355fedefa146104615780635c975abb1461048e5780635ed6dfba146104a557600080fd5b8063461d27621461043b5780634b8832d31461044e57600080fd5b80631c024539116102b75780633e871e4d116102915780633e871e4d146103ff5780633f4ba83a1461041257806341db4ca31461041a57600080fd5b80631c024539146103d15780631ded3b36146103d9578063385de9ae146103ec57600080fd5b806310fc49c1116102e857806310fc49c11461033957806312b583491461034c578063181f5a771461038857600080fd5b806302bcc5b6146103045780630c5d49cb14610319575b600080fd5b610317610312366004614ac3565b6107a8565b005b610321608481565b60405161ffff90911681526020015b60405180910390f35b610317610347366004614b04565b610807565b6008546a010000000000000000000090046bffffffffffffffffffffffff166040516bffffffffffffffffffffffff9091168152602001610330565b6103c46040518060400160405280601781526020017f46756e6374696f6e7320526f757465722076312e302e3000000000000000000081525081565b6040516103309190614ba1565b610317610931565b6103176103e7366004614bb4565b610a93565b6103176103fa366004614c29565b610ac4565b61031761040d366004614de2565b610b8d565b610317610e83565b61042d610428366004614eab565b610e95565b604051908152602001610330565b61042d610449366004614eab565b610ef5565b61031761045c366004614f30565b610f01565b61042d61046f366004614ac3565b67ffffffffffffffff166000908152600a602052604090206003015490565b60005460ff165b6040519015158152602001610330565b6103176104b3366004614f83565b610fff565b6103176104c6366004614f83565b6112d4565b60085462010000900467ffffffffffffffff165b60405167ffffffffffffffff9091168152602001610330565b610565610506366004614fb1565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600b6020908152604080832067ffffffffffffffff948516845290915290205460ff8116926101008204831692690100000000000000000090920490911690565b60408051931515845267ffffffffffffffff9283166020850152911690820152606001610330565b6105a061059b366004614fdf565b6114fb565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610330565b6103176105d3366004614ff8565b6115ba565b6103176105e6366004614f30565b611890565b610317611a26565b610317610601366004614ac3565b611b48565b610317611c7f565b600054610100900473ffffffffffffffffffffffffffffffffffffffff166105a0565b610317611c8f565b610317610647366004614f30565b611d81565b61065f61065a366004615211565b612161565b6040516103309291906152f9565b6104df61254d565b610688610683366004614ac3565b6126e0565b6040516103309190615373565b6103176106a33660046153fb565b612815565b6105a06106b6366004614fdf565b612a44565b7fd8e0666292c202b1ce6a8ff0dd638652e662402ac53fbf9bd9d3bcc39d5eb09761042d565b60005460ff16610495565b6103176106fa366004615457565b612aaa565b610317612c0b565b61070f612d9f565b60405161033093929190615474565b610726612e7a565b60405161033094939291906154ff565b610317610744366004614f30565b612f45565b610317610757366004615562565b612fa8565b61049561076a366004614ac3565b6131b2565b61031761077d36600461557f565b6131c3565b610317610790366004614fdf565b6132aa565b6103176107a3366004615562565b613466565b6107b0613477565b6107b98161347f565b67ffffffffffffffff81166000908152600a60205260409020546108049082906c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff166134f5565b50565b67ffffffffffffffff82166000908152600a6020526040812060030154600f54911a90811061086c576040517f45c108ce00000000000000000000000000000000000000000000000000000000815260ff821660048201526024015b60405180910390fd5b600f805460ff8316908110610883576108836155c1565b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1663ffffffff168263ffffffff16111561092c57600f805460ff83169081106108d3576108d36155c1565b600091825260209091206008820401546040517f1d70f87a000000000000000000000000000000000000000000000000000000008152600790921660049081026101000a90910463ffffffff1690820152602401610863565b505050565b610939613863565b60008080526006602052604080518082019091527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f880548290829061097d906155f0565b80601f01602080910402602001604051908101604052809291908181526020018280546109a9906155f0565b80156109f65780601f106109cb576101008083540402835291602001916109f6565b820191906000526020600020905b8154815290600101906020018083116109d957829003601f168201915b5050505050815260200160018201548152505090508060200151431015610a49576040517fa93d035c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051610a54906138e9565b80516040517fd97d1d65f3cae3537cf4c61e688583d89aae53d8b32accdfe7cb189e65ef34c791610a889160009190615643565b60405180910390a150565b610a9b613477565b610aa48261347f565b67ffffffffffffffff9091166000908152600a6020526040902060030155565b610acc613863565b6040805160606020601f85018190040282018101835291810183815290918291908590859081908501838280828437600092019190915250505090825250600854602090910190610b219061ffff1643615693565b9052600084815260066020526040902081518190610b3f90826156f4565b50602082015181600101559050507fdf3b58e133a3ba6c2ac90fe2b70fef7f7d69dd675fe9c542a6f0fe2f3a8a6f3a838383604051610b809392919061580e565b60405180910390a1505050565b610b95613863565b8151815181141580610ba75750600881115b15610bde576040517fee03280800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610d0a576000848281518110610bfd57610bfd6155c1565b602002602001015190506000848381518110610c1b57610c1b6155c1565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610c86575060008281526002602052604090205473ffffffffffffffffffffffffffffffffffffffff8281169116145b15610cbd576040517fee03280800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81610cf7576040517f4855c28800000000000000000000000000000000000000000000000000000000815260048101839052602401610863565b505080610d0390615862565b9050610be1565b50600854600090610d1f9061ffff1643615693565b604080516060810182528681526020808201879052918101839052865192935091600391610d51918391890190614903565b506020828101518051610d6a926001850192019061494a565b506040820151816002015590505060005b8451811015610e7c577f72a33d2f293a0a70fad221bb610d3d6b52aed2d840adae1fa721071fbd290cfd858281518110610db757610db76155c1565b602002602001015160026000888581518110610dd557610dd56155c1565b6020026020010151815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16868481518110610e1e57610e1e6155c1565b602002602001015185604051610e64949392919093845273ffffffffffffffffffffffffffffffffffffffff928316602085015291166040830152606082015260800190565b60405180910390a1610e7581615862565b9050610d7b565b5050505050565b610e8b613863565b610e93613a2f565b565b600080610ea1836114fb565b9050610ee983828a8a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c92508b9150613aac9050565b98975050505050505050565b600080610ea183612a44565b610f09613dfc565b610f1282613e04565b610f1a613eca565b67ffffffffffffffff82166000908152600a602052604090206001015473ffffffffffffffffffffffffffffffffffffffff8281166c010000000000000000000000009092041614610ffb5767ffffffffffffffff82166000818152600a602090815260409182902060010180546bffffffffffffffffffffffff166c0100000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8716908102919091179091558251338152918201527f69436ea6df009049404f564eff6622cd00522b0bd6a89efd9e52a355c4a879be91015b60405180910390a25b5050565b611007613477565b806bffffffffffffffffffffffff1660000361103d5750306000908152600c60205260409020546bffffffffffffffffffffffff165b306000908152600c60205260409020546bffffffffffffffffffffffff80831691161015611097576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b306000908152600c6020526040812080548392906110c49084906bffffffffffffffffffffffff1661589a565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550806008600a8282829054906101000a90046bffffffffffffffffffffffff1661111b919061589a565b82546101009290920a6bffffffffffffffffffffffff8181021990931691831602179091556009546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015292851660248201529116915063a9059cbb906044016020604051808303816000875af11580156111ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111de91906158c6565b610ffb576009546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611251573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127591906158e8565b6008546040517fa99da3020000000000000000000000000000000000000000000000000000000081526a01000000000000000000009091046bffffffffffffffffffffffff166004820181905260248201839052919250604401610863565b6112dc613dfc565b806bffffffffffffffffffffffff16600003611324576040517f8129bbcd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600c60205260409020546bffffffffffffffffffffffff8083169116101561137e576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600c6020526040812080548392906113ab9084906bffffffffffffffffffffffff1661589a565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550806008600a8282829054906101000a90046bffffffffffffffffffffffff16611402919061589a565b82546101009290920a6bffffffffffffffffffffffff8181021990931691831602179091556009546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015292851660248201529116915063a9059cbb906044016020604051808303816000875af11580156114a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c591906158c6565b610ffb576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b60035460ff82161015611584576003805460ff8316908110611523576115236155c1565b90600052602060002001548303611574576004805460ff831690811061154b5761154b6155c1565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169392505050565b61157d81615901565b90506114ff565b506040517f80833e3300000000000000000000000000000000000000000000000000000000815260048101839052602401610863565b6115c2613dfc565b60005b8181101561092c5760008383838181106115e1576115e16155c1565b905061016002018036038101906115f89190615920565b905060008160e001519050600d60008281526020019081526020016000205482604051602001611628919061593d565b6040516020818303038152906040528051906020012014611675576040517f8129bbcd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160c0015164ffffffffff164210156116ba576040517fbcc4005500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208201516040517f85b214cf0000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff8216906385b214cf906024016020604051808303816000875af115801561172c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061175091906158c6565b5060a0830151606084015167ffffffffffffffff166000908152600a6020526040812060010180549091906117949084906bffffffffffffffffffffffff1661589a565b82546bffffffffffffffffffffffff9182166101009390930a92830291909202199091161790555060408084015173ffffffffffffffffffffffffffffffffffffffff166000908152600b6020908152828220606087015167ffffffffffffffff9081168452915291902080546001926009916118209185916901000000000000000000900416615a6c565b825467ffffffffffffffff9182166101009390930a9283029190920219909116179055506000828152600d60205260408082208290555183917ff1ca1e9147be737b04a2b018a79405f687a97de8dd8a2559bbe62357343af41491a25050508061188990615862565b90506115c5565b611898613dfc565b6118a182613e04565b6118a9613eca565b600e5467ffffffffffffffff83166000908152600a602052604090206002015461ffff9091169003611907576040517f05a48e0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600b6020908152604080832067ffffffffffffffff8616845290915290205460ff161561194e575050565b73ffffffffffffffffffffffffffffffffffffffff81166000818152600b6020908152604080832067ffffffffffffffff871680855290835281842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155600a84528285206002018054918201815585529383902090930180547fffffffffffffffffffffffff000000000000000000000000000000000000000016851790555192835290917f43dc749a04ac8fb825cbd514f7c0e13f13bc6f2ee66043b76629d51776cff8e09101610ff2565b60015473ffffffffffffffffffffffffffffffffffffffff163314611aa7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610863565b60008054336101008181027fffffffffffffffffffffff0000000000000000000000000000000000000000ff8416178455600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905560405173ffffffffffffffffffffffffffffffffffffffff919093041692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b611b50613dfc565b611b58613eca565b67ffffffffffffffff81166000908152600a60205260409020805460019091015473ffffffffffffffffffffffffffffffffffffffff6c010000000000000000000000009283900481169290910416338114611be0576040517f02b543c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff83166000818152600a602090815260409182902080546c01000000000000000000000000339081026bffffffffffffffffffffffff928316178355600190920180549091169055825173ffffffffffffffffffffffffffffffffffffffff87168152918201527f6f1dc65165ffffedfd8e507b4a0f1fcfdada045ed11f6c26ba27cedfe87802f0910160405180910390a2505050565b611c87613863565b610e93613fcf565b611c97613863565b60075464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16431015611cf9576040517fa93d035c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460085461ffff620100009092048216911603611d43576040517ea8180600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600754600880546201000090920461ffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909216919091179055565b611d89613dfc565b611d9282613e04565b611d9a613eca565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600b6020908152604080832067ffffffffffffffff8087168552908352928190208151606081018352905460ff8116151580835261010082048616948301949094526901000000000000000000900490931690830152611e42576040517f71e8313700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806040015167ffffffffffffffff16816020015167ffffffffffffffff1614611e97576040517fbcc4005500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff83166000908152600a6020908152604080832060020180548251818502810185019093528083529192909190830182828015611f1257602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611ee7575b50505050509050600060018251611f299190615a8d565b905060005b82518110156120c5578473ffffffffffffffffffffffffffffffffffffffff16838281518110611f6057611f606155c1565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16036120b5576000838381518110611f9757611f976155c1565b6020026020010151905080600a60008967ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018381548110611fdd57611fdd6155c1565b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff949094169390931790925567ffffffffffffffff89168152600a9091526040902060020180548061205757612057615aa0565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055019055506120c5565b6120be81615862565b9050611f2e565b5073ffffffffffffffffffffffffffffffffffffffff84166000818152600b6020908152604080832067ffffffffffffffff8a168085529083529281902080547fffffffffffffffffffffffffffffff00000000000000000000000000000000001690555192835290917f182bff9831466789164ca77075fffd84916d35a8180ba73c27e45634549b445b910160405180910390a25050505050565b60008061216c613dfc565b826020015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146121d5576040517f8bec23e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60e08301516000908152600d602052604090205461223a57600291508260e001517f1a90e9a50793db2e394cf581e7c522e10c358a81e70acf6b5a0edd620c08dee18460200151868560405161222d93929190615acf565b60405180910390a2612542565b600d60008460e0015181526020019081526020016000205483604051602001612263919061593d565b60405160208183030381529060405280519060200120146122be57600691508260e001517f1a90e9a50793db2e394cf581e7c522e10c358a81e70acf6b5a0edd620c08dee18460200151868560405161222d93929190615acf565b826101400151836080015163ffffffff166122d99190615b01565b64ffffffffff165a101561232757600491508260e001517f1a90e9a50793db2e394cf581e7c522e10c358a81e70acf6b5a0edd620c08dee18460200151868560405161222d93929190615acf565b600061233c846080015163ffffffff1661402a565b6123469088615b1f565b905060008187866000015161235b9190615b47565b6123659190615b47565b606086015167ffffffffffffffff166000908152600a60205260409020549091506bffffffffffffffffffffffff90811690821611156123ee57600593508460e001517f1a90e9a50793db2e394cf581e7c522e10c358a81e70acf6b5a0edd620c08dee1866020015188876040516123df93929190615acf565b60405180910390a25050612542565b8460a001516bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111561245657600393508460e001517f1a90e9a50793db2e394cf581e7c522e10c358a81e70acf6b5a0edd620c08dee1866020015188876040516123df93929190615acf565b5050600d60008460e00151815260200190815260200160002060009055600061248e8460e001518a8a876080015188604001516140cc565b805190915061249e5760016124a1565b60005b925060006124d085606001518660a00151876040015188600001518c6124ca886020015161402a565b8d614248565b9050846060015167ffffffffffffffff168560e001517f47ffcaa55fde21cc7135c65541826c9e65dda59c29dc109aae964989e8fc664b83602001518988876000015161251d578e61251f565b8f5b8860400151604051612535959493929190615b6c565b60405180910390a3519150505b965096945050505050565b6000612557613dfc565b61255f613eca565b6008805460029061257f9062010000900467ffffffffffffffff16615bce565b825467ffffffffffffffff8083166101009490940a93840293021916919091179091556040805160c08101825260008082523360208301529181018290526060810182905291925060808201906040519080825280602002602001820160405280156125f5578160200160208202803683370190505b5081526000602091820181905267ffffffffffffffff84168152600a825260409081902083518484015173ffffffffffffffffffffffffffffffffffffffff9081166c010000000000000000000000009081026bffffffffffffffffffffffff93841617845593860151606087015190911690930292169190911760018201556080830151805191926126909260028501929091019061494a565b5060a0919091015160039091015560405133815267ffffffffffffffff8216907f464722b4166576d3dcbba877b999bc35cf911f4eaf434b7eba68fa113951d0bf9060200160405180910390a290565b6040805160c0810182526000808252602082018190529181018290526060808201839052608082015260a081019190915261271a8261347f565b67ffffffffffffffff82166000908152600a6020908152604091829020825160c08101845281546bffffffffffffffffffffffff808216835273ffffffffffffffffffffffffffffffffffffffff6c010000000000000000000000009283900481168487015260018501549182168488015291900416606082015260028201805485518186028101860190965280865291949293608086019392908301828280156127fb57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116127d0575b505050505081526020016003820154815250509050919050565b61281d613dfc565b60095473ffffffffffffffffffffffffffffffffffffffff16331461286e576040517f44b0e3c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081146128a8576040517f8129bbcd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006128b682840184614ac3565b67ffffffffffffffff81166000908152600a60205260409020549091506c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1661292f576040517f1f6a65b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff81166000908152600a6020526040812080546bffffffffffffffffffffffff16918691906129668385615b47565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550846008600a8282829054906101000a90046bffffffffffffffffffffffff166129bd9190615b47565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508167ffffffffffffffff167fd39ec07f4e209f627a4c427971473820dc129761ba28de8906bd56f57101d4f8828784612a249190615693565b6040805192835260208301919091520160405180910390a2505050505050565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff168015612a755792915050565b6040517f80833e3300000000000000000000000000000000000000000000000000000000815260048101849052602401610863565b612ab2613863565b60085461ffff808316911603612af4576040517fee03280800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000061ffff168161ffff161115612b56576040517fe9a3062200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160608101825260085461ffff90811680835290841660208301529091820190612b839043615693565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90811690915281516007805460208501516040909501519093166401000000000263ffffffff61ffff95861662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000009095169590931694909417929092171691909117905550565b612c13613863565b600554431015612c4f576040517fa93d035c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b600354811015612d7657600060036000018281548110612c7457612c746155c1565b6000918252602080832090910154808352600290915260408220546004805492945073ffffffffffffffffffffffffffffffffffffffff909116929185908110612cc057612cc06155c1565b6000918252602080832091909101548583526002825260409283902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92831690811790915583518781529186169282019290925291820181905291507ff8a6175bca1ba37d682089187edc5e20a859989727f10ca6bd9a5bc0de8caf949060600160405180910390a150505080612d6f90615862565b9050612c52565b5060036000612d8582826149c4565b612d936001830160006149c4565b60028201600090555050565b60006060806003600201546003600001600360010181805480602002602001604051908101604052809291908181526020018280548015612dff57602002820191906000526020600020905b815481526020019060010190808311612deb575b5050505050915080805480602002602001604051908101604052809291908181526020018280548015612e6857602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311612e3d575b50505050509050925092509250909192565b600e54600f8054604080516020808402820181019092528281526000948594859460609461ffff8416946bffffffffffffffffffffffff62010000860416946e010000000000000000000000000000900460e01b93929091839190830182828015612f3057602002820191906000526020600020906000905b82829054906101000a900463ffffffff1663ffffffff1681526020019060040190602082600301049283019260010382029150808411612ef35790505b50505050509050935093509350935090919293565b612f4d613dfc565b612f5682613e04565b612f5e613eca565b612f6782614491565b15612f9e576040517fb42f66e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ffb82826134f5565b612fb0613477565b6009546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa15801561301f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061304391906158e8565b6008549091506a010000000000000000000090046bffffffffffffffffffffffff16818111156130a9576040517fa99da3020000000000000000000000000000000000000000000000000000000081526004810182905260248101839052604401610863565b8181101561092c5760006130bd8284615a8d565b6009546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301526024820184905292935091169063a9059cbb906044016020604051808303816000875af1158015613138573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061315c91906158c6565b506040805173ffffffffffffffffffffffffffffffffffffffff86168152602081018390527f59bfc682b673f8cbf945f1e454df9334834abf7dfe7f92237ca29ecb9b436600910160405180910390a150505050565b60006131bd82614491565b92915050565b6131cb613863565b6040805160606020601f850181900402820181018352918101838152909182919085908590819085018382808284376000920191909152505050908252506008546020909101906132209061ffff1643615693565b905260008052600660205280517f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f890819061325b90826156f4565b50602091909101516001909101556040517fdf3b58e133a3ba6c2ac90fe2b70fef7f7d69dd675fe9c542a6f0fe2f3a8a6f3a9061329e906000908590859061580e565b60405180910390a15050565b6132b2613863565b60008181526006602052604080822081518083019092528054829082906132d8906155f0565b80601f0160208091040260200160405190810160405280929190818152602001828054613304906155f0565b80156133515780601f1061332657610100808354040283529160200191613351565b820191906000526020600020905b81548152906001019060200180831161333457829003601f168201915b50505050508152602001600182015481525050905080602001514310156133a4576040517fa93d035c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6133ad82612a44565b81516040517f8cc6acce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9290921691638cc6acce9161340191600401614ba1565b600060405180830381600087803b15801561341b57600080fd5b505af115801561342f573d6000803e3d6000fd5b505082516040517fd97d1d65f3cae3537cf4c61e688583d89aae53d8b32accdfe7cb189e65ef34c7935061329e9250859190615643565b61346e613863565b610804816145e0565b610e93613863565b67ffffffffffffffff81166000908152600a60205260409020546c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff16610804576040517f1f6a65b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff82166000908152600a60209081526040808320815160c08101835281546bffffffffffffffffffffffff808216835273ffffffffffffffffffffffffffffffffffffffff6c01000000000000000000000000928390048116848801526001850154918216848701529190041660608201526002820180548451818702810187019095528085529194929360808601939092908301828280156135d657602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116135ab575b505050918352505060039190910154602090910152805190915060005b82608001515181101561369757600b60008460800151838151811061361a5761361a6155c1565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff168252818101929092526040908101600090812067ffffffffffffffff89168252909252902080547fffffffffffffffffffffffffffffff000000000000000000000000000000000016905561369081615862565b90506135f3565b5067ffffffffffffffff84166000908152600a6020526040812081815560018101829055906136c960028301826149c4565b60038201600090555050806008600a8282829054906101000a90046bffffffffffffffffffffffff166136fc919061589a565b82546101009290920a6bffffffffffffffffffffffff8181021990931691831602179091556009546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015292851660248201529116915063a9059cbb906044016020604051808303816000875af115801561379b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137bf91906158c6565b6137f5576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff851681526bffffffffffffffffffffffff8316602082015267ffffffffffffffff8616917fe8ed5b475a5b5987aa9165e8731bb78043f39eee32ec5a1169a89e27fcd49815910160405180910390a250505050565b600054610100900473ffffffffffffffffffffffffffffffffffffffff163314610e93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610863565b600080600080848060200190518101906139039190615c0b565b6040805160808101825261ffff86168082526bffffffffffffffffffffffff861660208084018290527fffffffff0000000000000000000000000000000000000000000000000000000087169484019490945260608301859052600e80547fffffffffffffffffffffffffffffffffffff00000000000000000000000000001690921762010000909102177fffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffff166e01000000000000000000000000000060e087901c021781558351969a5094985092965090945090926139e991600f91908601906149e2565b509050507fe6a1eda76d42a6d1d813f26765716562044db1e8bd8be7d088705e64afd301ca838383604051613a2093929190615d06565b60405180910390a15050505050565b613a376146db565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6000613ab6613dfc565b613abf8561347f565b613ac93386614747565b613ad38583610807565b604080516101008101825233815267ffffffffffffffff87166000818152600a6020818152858320805473ffffffffffffffffffffffffffffffffffffffff6c010000000000000000000000009091048116838801528688018c90526060870186905261ffff8b1660808801529484529190526003015460a084015263ffffffff861660c0840152600e546201000090046bffffffffffffffffffffffff1660e084015292517fbdd7e8800000000000000000000000000000000000000000000000000000000081529089169163bdd7e88091613bb39190600401615d5e565b610160604051808303816000875af1158015613bd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bf79190615e49565b9050604051806101600160405280600e60000160029054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018767ffffffffffffffff1681526020018463ffffffff1681526020018260a001516bffffffffffffffffffffffff1681526020018260c0015164ffffffffff1681526020018260e00151815260200182610100015169ffffffffffffffffffff16815260200182610120015164ffffffffff16815260200182610140015164ffffffffff16815250604051602001613d06919061593d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060e08401516000908152600d90935291205560a0810151613d6090339088906147bb565b60e081015167ffffffffffffffff87166000818152600a60205260409081902054905191928b9290917f7c720ccd20069b8311a6be4ba1cf3294d09eb247aa5d73a8502054b6e68a2f5491613de5916c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1690339032908d908d908d90615f1c565b60405180910390a460e00151979650505050505050565b610e93614896565b67ffffffffffffffff81166000908152600a60205260409020546c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1680613e7b576040517f1f6a65b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff821614610ffb576040517f5a68151d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613ef37fd8e0666292c202b1ce6a8ff0dd638652e662402ac53fbf9bd9d3bcc39d5eb097612a44565b604080516000815260208101918290527f6b14daf80000000000000000000000000000000000000000000000000000000090915273ffffffffffffffffffffffffffffffffffffffff9190911690636b14daf890613f5690339060248101615f80565b602060405180830381865afa158015613f73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f9791906158c6565b610e93576040517f22906263000000000000000000000000000000000000000000000000000000008152336004820152602401610863565b613fd7614896565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613a823390565b60006bffffffffffffffffffffffff8211156140c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203960448201527f36206269747300000000000000000000000000000000000000000000000000006064820152608401610863565b5090565b60408051606080820183526000808352602083015291810191909152600e546040516000916e010000000000000000000000000000900460e01b9061411990899089908990602401615faf565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00181529181526020820180517fffffffff00000000000000000000000000000000000000000000000000000000949094167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff909416939093179092528151608480825260c0820190935290925060009182918291602082018180368337019050509050853b6141cb57600080fd5b5a6113888110156141db57600080fd5b6113888103905087604082048203116141f357600080fd5b60008086516020880160008b8df193505a900391503d6084811115614216575060845b808252806000602084013e50604080516060810182529315158452602084019290925290820152979650505050505050565b604080518082019091526000808252602082015260006142688486615b1f565b90506000816142778886615b47565b6142819190615b47565b6040805180820182526bffffffffffffffffffffffff808616825280841660208084019190915267ffffffffffffffff8f166000908152600a9091529283208054929750939450849392916142d89185911661589a565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555081846143129190615b47565b336000908152600c60205260408120805490919061433f9084906bffffffffffffffffffffffff16615b47565b82546101009290920a6bffffffffffffffffffffffff818102199093169183160217909155306000908152600c6020526040812080548b9450909261438691859116615b47565b82546101009290920a6bffffffffffffffffffffffff81810219909316918316021790915567ffffffffffffffff8c166000908152600a6020526040812060010180548d945090926143da9185911661589a565b82546bffffffffffffffffffffffff9182166101009390930a92830291909202199091161790555073ffffffffffffffffffffffffffffffffffffffff88166000908152600b6020908152604080832067ffffffffffffffff808f1685529252909120805460019260099161445e9185916901000000000000000000900416615a6c565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050979650505050505050565b67ffffffffffffffff81166000908152600a602090815260408083206002018054825181850281018501909352808352849383018282801561450957602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116144de575b5050505050905060005b81518110156145d6576000600b6000848481518110614534576145346155c1565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff168252818101929092526040908101600090812067ffffffffffffffff808a168352908452908290208251606081018452905460ff81161515825261010081048316948201859052690100000000000000000090049091169181018290529250146145c557506001949350505050565b506145cf81615862565b9050614513565b5060009392505050565b3373ffffffffffffffffffffffffffffffffffffffff82160361465f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610863565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929361010090910416917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60005460ff16610e93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610863565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600b6020908152604080832067ffffffffffffffff8516845290915290205460ff16610ffb576040517f71e8313700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff82166000908152600a6020526040812060010180548392906147f59084906bffffffffffffffffffffffff16615b47565b82546bffffffffffffffffffffffff91821661010093840a908102920219161790915573ffffffffffffffffffffffffffffffffffffffff85166000908152600b6020908152604080832067ffffffffffffffff808916855292529091208054600194509092849261486b928492900416615a6c565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505050565b60005460ff1615610e93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610863565b82805482825590600052602060002090810192821561493e579160200282015b8281111561493e578251825591602001919060010190614923565b506140c8929150614a88565b82805482825590600052602060002090810192821561493e579160200282015b8281111561493e57825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90911617825560209092019160019091019061496a565b50805460008255906000526020600020908101906108049190614a88565b8280548282559060005260206000209060070160089004810192821561493e5791602002820160005b83821115614a4f57835183826101000a81548163ffffffff021916908363ffffffff1602179055509260200192600401602081600301049283019260010302614a0b565b8015614a7f5782816101000a81549063ffffffff0219169055600401602081600301049283019260010302614a4f565b50506140c89291505b5b808211156140c85760008155600101614a89565b67ffffffffffffffff8116811461080457600080fd5b8035614abe81614a9d565b919050565b600060208284031215614ad557600080fd5b8135614ae081614a9d565b9392505050565b63ffffffff8116811461080457600080fd5b8035614abe81614ae7565b60008060408385031215614b1757600080fd5b8235614b2281614a9d565b91506020830135614b3281614ae7565b809150509250929050565b6000815180845260005b81811015614b6357602081850181015186830182015201614b47565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000614ae06020830184614b3d565b60008060408385031215614bc757600080fd5b8235614bd281614a9d565b946020939093013593505050565b60008083601f840112614bf257600080fd5b50813567ffffffffffffffff811115614c0a57600080fd5b602083019150836020828501011115614c2257600080fd5b9250929050565b600080600060408486031215614c3e57600080fd5b83359250602084013567ffffffffffffffff811115614c5c57600080fd5b614c6886828701614be0565b9497909650939450505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715614cc857614cc8614c75565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614d1557614d15614c75565b604052919050565b600067ffffffffffffffff821115614d3757614d37614c75565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff8116811461080457600080fd5b8035614abe81614d41565b600082601f830112614d7f57600080fd5b81356020614d94614d8f83614d1d565b614cce565b82815260059290921b84018101918181019086841115614db357600080fd5b8286015b84811015614dd7578035614dca81614d41565b8352918301918301614db7565b509695505050505050565b60008060408385031215614df557600080fd5b823567ffffffffffffffff80821115614e0d57600080fd5b818501915085601f830112614e2157600080fd5b81356020614e31614d8f83614d1d565b82815260059290921b84018101918181019089841115614e5057600080fd5b948201945b83861015614e6e57853582529482019490820190614e55565b96505086013592505080821115614e8457600080fd5b50614e9185828601614d6e565b9150509250929050565b61ffff8116811461080457600080fd5b60008060008060008060a08789031215614ec457600080fd5b8635614ecf81614a9d565b9550602087013567ffffffffffffffff811115614eeb57600080fd5b614ef789828a01614be0565b9096509450506040870135614f0b81614e9b565b92506060870135614f1b81614ae7565b80925050608087013590509295509295509295565b60008060408385031215614f4357600080fd5b8235614f4e81614a9d565b91506020830135614b3281614d41565b6bffffffffffffffffffffffff8116811461080457600080fd5b8035614abe81614f5e565b60008060408385031215614f9657600080fd5b8235614fa181614d41565b91506020830135614b3281614f5e565b60008060408385031215614fc457600080fd5b8235614fcf81614d41565b91506020830135614b3281614a9d565b600060208284031215614ff157600080fd5b5035919050565b6000806020838503121561500b57600080fd5b823567ffffffffffffffff8082111561502357600080fd5b818501915085601f83011261503757600080fd5b81358181111561504657600080fd5b8660206101608302850101111561505c57600080fd5b60209290920196919550909350505050565b600082601f83011261507f57600080fd5b813567ffffffffffffffff81111561509957615099614c75565b6150ca60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614cce565b8181528460208386010111156150df57600080fd5b816020850160208301376000918101602001919091529392505050565b64ffffffffff8116811461080457600080fd5b8035614abe816150fc565b69ffffffffffffffffffff8116811461080457600080fd5b8035614abe8161511a565b6000610160828403121561515057600080fd5b615158614ca4565b905061516382614f78565b815261517160208301614d63565b602082015261518260408301614d63565b604082015261519360608301614ab3565b60608201526151a460808301614af9565b60808201526151b560a08301614f78565b60a08201526151c660c0830161510f565b60c082015260e082013560e08201526101006151e3818401615132565b908201526101206151f583820161510f565b9082015261014061520783820161510f565b9082015292915050565b600080600080600080610200878903121561522b57600080fd5b863567ffffffffffffffff8082111561524357600080fd5b61524f8a838b0161506e565b9750602089013591508082111561526557600080fd5b5061527289828a0161506e565b955050604087013561528381614f5e565b9350606087013561529381614f5e565b925060808701356152a381614d41565b91506152b28860a0890161513d565b90509295509295509295565b600781106152f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b6040810161530782856152be565b6bffffffffffffffffffffffff831660208301529392505050565b600081518084526020808501945080840160005b8381101561536857815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101615336565b509495945050505050565b6020815260006bffffffffffffffffffffffff808451166020840152602084015173ffffffffffffffffffffffffffffffffffffffff8082166040860152826040870151166060860152806060870151166080860152505050608083015160c060a08401526153e560e0840182615322565b905060a084015160c08401528091505092915050565b6000806000806060858703121561541157600080fd5b843561541c81614d41565b935060208501359250604085013567ffffffffffffffff81111561543f57600080fd5b61544b87828801614be0565b95989497509550505050565b60006020828403121561546957600080fd5b8135614ae081614e9b565b6000606082018583526020606081850152818651808452608086019150828801935060005b818110156154b557845183529383019391830191600101615499565b50508481036040860152610ee98187615322565b600081518084526020808501945080840160005b8381101561536857815163ffffffff16875295820195908201906001016154dd565b61ffff851681526bffffffffffffffffffffffff841660208201527fffffffff000000000000000000000000000000000000000000000000000000008316604082015260806060820152600061555860808301846154c9565b9695505050505050565b60006020828403121561557457600080fd5b8135614ae081614d41565b6000806020838503121561559257600080fd5b823567ffffffffffffffff8111156155a957600080fd5b6155b585828601614be0565b90969095509350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600181811c9082168061560457607f821691505b60208210810361563d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b82815260406020820152600061565c6040830184614b3d565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156131bd576131bd615664565b601f82111561092c57600081815260208120601f850160051c810160208610156156cd5750805b601f850160051c820191505b818110156156ec578281556001016156d9565b505050505050565b815167ffffffffffffffff81111561570e5761570e614c75565b6157228161571c84546155f0565b846156a6565b602080601f831160018114615775576000841561573f5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556156ec565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156157c2578886015182559484019460019091019084016157a3565b50858210156157fe57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b83815260406020820152816040820152818360608301376000818301606090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010192915050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361589357615893615664565b5060010190565b6bffffffffffffffffffffffff8281168282160390808211156158bf576158bf615664565b5092915050565b6000602082840312156158d857600080fd5b81518015158114614ae057600080fd5b6000602082840312156158fa57600080fd5b5051919050565b600060ff821660ff810361591757615917615664565b60010192915050565b6000610160828403121561593357600080fd5b614ae0838361513d565b81516bffffffffffffffffffffffff1681526101608101602083015161597b602084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060408301516159a3604084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060608301516159bf606084018267ffffffffffffffff169052565b5060808301516159d7608084018263ffffffff169052565b5060a08301516159f760a08401826bffffffffffffffffffffffff169052565b5060c0830151615a1060c084018264ffffffffff169052565b5060e083015160e083015261010080840151615a398285018269ffffffffffffffffffff169052565b50506101208381015164ffffffffff81168483015250506101408381015164ffffffffff8116848301525b505092915050565b67ffffffffffffffff8181168382160190808211156158bf576158bf615664565b818103818111156131bd576131bd615664565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff8481168252831660208201526060810161565c60408301846152be565b64ffffffffff8181168382160190808211156158bf576158bf615664565b6bffffffffffffffffffffffff818116838216028082169190828114615a6457615a64615664565b6bffffffffffffffffffffffff8181168382160190808211156158bf576158bf615664565b6bffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff85166020820152615ba660408201856152be565b60a060608201526000615bbc60a0830185614b3d565b8281036080840152610ee98185614b3d565b600067ffffffffffffffff808316818103615beb57615beb615664565b6001019392505050565b8051614abe81614f5e565b8051614abe81614ae7565b60008060008060808587031215615c2157600080fd5b8451615c2c81614e9b565b80945050602080860151615c3f81614f5e565b60408701519094507fffffffff0000000000000000000000000000000000000000000000000000000081168114615c7557600080fd5b606087015190935067ffffffffffffffff811115615c9257600080fd5b8601601f81018813615ca357600080fd5b8051615cb1614d8f82614d1d565b81815260059190911b8201830190838101908a831115615cd057600080fd5b928401925b82841015615cf7578351615ce881614ae7565b82529284019290840190615cd5565b979a9699509497505050505050565b6bffffffffffffffffffffffff841681527fffffffff0000000000000000000000000000000000000000000000000000000083166020820152606060408201526000615d5560608301846154c9565b95945050505050565b60208152600073ffffffffffffffffffffffffffffffffffffffff808451166020840152806020850151166040840152506040830151610100806060850152615dab610120850183614b3d565b91506060850151615dc8608086018267ffffffffffffffff169052565b50608085015161ffff811660a08601525060a085015160c085015260c0850151615dfa60e086018263ffffffff169052565b5060e08501516bffffffffffffffffffffffff8116858301525090949350505050565b8051614abe81614d41565b8051614abe81614a9d565b8051614abe816150fc565b8051614abe8161511a565b60006101608284031215615e5c57600080fd5b615e64614ca4565b615e6d83615bf5565b8152615e7b60208401615e1d565b6020820152615e8c60408401615e1d565b6040820152615e9d60608401615e28565b6060820152615eae60808401615c00565b6080820152615ebf60a08401615bf5565b60a0820152615ed060c08401615e33565b60c082015260e083015160e0820152610100615eed818501615e3e565b90820152610120615eff848201615e33565b90820152610140615f11848201615e33565b908201529392505050565b600073ffffffffffffffffffffffffffffffffffffffff8089168352808816602084015280871660408401525060c06060830152615f5d60c0830186614b3d565b905061ffff8416608083015263ffffffff831660a0830152979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316815260406020820152600061565c6040830184614b3d565b838152606060208201526000615fc86060830185614b3d565b82810360408401526155588185614b3d56fea164736f6c6343000813000a", } var FunctionsRouterABI = FunctionsRouterMetaData.ABI @@ -236,50 +238,31 @@ func (_FunctionsRouter *FunctionsRouterCallerSession) GetAllowListId() ([32]byte return _FunctionsRouter.Contract.GetAllowListId(&_FunctionsRouter.CallOpts) } -func (_FunctionsRouter *FunctionsRouterCaller) GetConfig(opts *bind.CallOpts) (IFunctionsRouterConfig, error) { +func (_FunctionsRouter *FunctionsRouterCaller) GetConfig(opts *bind.CallOpts) (uint16, *big.Int, [4]byte, []uint32, error) { var out []interface{} err := _FunctionsRouter.contract.Call(opts, &out, "getConfig") if err != nil { - return *new(IFunctionsRouterConfig), err + return *new(uint16), *new(*big.Int), *new([4]byte), *new([]uint32), err } - out0 := *abi.ConvertType(out[0], new(IFunctionsRouterConfig)).(*IFunctionsRouterConfig) + out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16) + out1 := *abi.ConvertType(out[1], new(*big.Int)).(**big.Int) + out2 := *abi.ConvertType(out[2], new([4]byte)).(*[4]byte) + out3 := *abi.ConvertType(out[3], new([]uint32)).(*[]uint32) - return out0, err + return out0, out1, out2, out3, err } -func (_FunctionsRouter *FunctionsRouterSession) GetConfig() (IFunctionsRouterConfig, error) { +func (_FunctionsRouter *FunctionsRouterSession) GetConfig() (uint16, *big.Int, [4]byte, []uint32, error) { return _FunctionsRouter.Contract.GetConfig(&_FunctionsRouter.CallOpts) } -func (_FunctionsRouter *FunctionsRouterCallerSession) GetConfig() (IFunctionsRouterConfig, error) { +func (_FunctionsRouter *FunctionsRouterCallerSession) GetConfig() (uint16, *big.Int, [4]byte, []uint32, error) { return _FunctionsRouter.Contract.GetConfig(&_FunctionsRouter.CallOpts) } -func (_FunctionsRouter *FunctionsRouterCaller) GetConfigHash(opts *bind.CallOpts) ([32]byte, error) { - var out []interface{} - err := _FunctionsRouter.contract.Call(opts, &out, "getConfigHash") - - if err != nil { - return *new([32]byte), err - } - - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) - - return out0, err - -} - -func (_FunctionsRouter *FunctionsRouterSession) GetConfigHash() ([32]byte, error) { - return _FunctionsRouter.Contract.GetConfigHash(&_FunctionsRouter.CallOpts) -} - -func (_FunctionsRouter *FunctionsRouterCallerSession) GetConfigHash() ([32]byte, error) { - return _FunctionsRouter.Contract.GetConfigHash(&_FunctionsRouter.CallOpts) -} - func (_FunctionsRouter *FunctionsRouterCaller) GetConsumer(opts *bind.CallOpts, client common.Address, subscriptionId uint64) (GetConsumer, error) { @@ -311,9 +294,9 @@ func (_FunctionsRouter *FunctionsRouterCallerSession) GetConsumer(client common. return _FunctionsRouter.Contract.GetConsumer(&_FunctionsRouter.CallOpts, client, subscriptionId) } -func (_FunctionsRouter *FunctionsRouterCaller) GetContractById(opts *bind.CallOpts, id [32]byte, useProposed bool) (common.Address, error) { +func (_FunctionsRouter *FunctionsRouterCaller) GetContractById(opts *bind.CallOpts, id [32]byte) (common.Address, error) { var out []interface{} - err := _FunctionsRouter.contract.Call(opts, &out, "getContractById", id, useProposed) + err := _FunctionsRouter.contract.Call(opts, &out, "getContractById", id) if err != nil { return *new(common.Address), err @@ -325,56 +308,56 @@ func (_FunctionsRouter *FunctionsRouterCaller) GetContractById(opts *bind.CallOp } -func (_FunctionsRouter *FunctionsRouterSession) GetContractById(id [32]byte, useProposed bool) (common.Address, error) { - return _FunctionsRouter.Contract.GetContractById(&_FunctionsRouter.CallOpts, id, useProposed) +func (_FunctionsRouter *FunctionsRouterSession) GetContractById(id [32]byte) (common.Address, error) { + return _FunctionsRouter.Contract.GetContractById(&_FunctionsRouter.CallOpts, id) } -func (_FunctionsRouter *FunctionsRouterCallerSession) GetContractById(id [32]byte, useProposed bool) (common.Address, error) { - return _FunctionsRouter.Contract.GetContractById(&_FunctionsRouter.CallOpts, id, useProposed) +func (_FunctionsRouter *FunctionsRouterCallerSession) GetContractById(id [32]byte) (common.Address, error) { + return _FunctionsRouter.Contract.GetContractById(&_FunctionsRouter.CallOpts, id) } -func (_FunctionsRouter *FunctionsRouterCaller) GetContractById0(opts *bind.CallOpts, id [32]byte) (common.Address, error) { +func (_FunctionsRouter *FunctionsRouterCaller) GetFlags(opts *bind.CallOpts, subscriptionId uint64) ([32]byte, error) { var out []interface{} - err := _FunctionsRouter.contract.Call(opts, &out, "getContractById0", id) + err := _FunctionsRouter.contract.Call(opts, &out, "getFlags", subscriptionId) if err != nil { - return *new(common.Address), err + return *new([32]byte), err } - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) return out0, err } -func (_FunctionsRouter *FunctionsRouterSession) GetContractById0(id [32]byte) (common.Address, error) { - return _FunctionsRouter.Contract.GetContractById0(&_FunctionsRouter.CallOpts, id) +func (_FunctionsRouter *FunctionsRouterSession) GetFlags(subscriptionId uint64) ([32]byte, error) { + return _FunctionsRouter.Contract.GetFlags(&_FunctionsRouter.CallOpts, subscriptionId) } -func (_FunctionsRouter *FunctionsRouterCallerSession) GetContractById0(id [32]byte) (common.Address, error) { - return _FunctionsRouter.Contract.GetContractById0(&_FunctionsRouter.CallOpts, id) +func (_FunctionsRouter *FunctionsRouterCallerSession) GetFlags(subscriptionId uint64) ([32]byte, error) { + return _FunctionsRouter.Contract.GetFlags(&_FunctionsRouter.CallOpts, subscriptionId) } -func (_FunctionsRouter *FunctionsRouterCaller) GetFlags(opts *bind.CallOpts, subscriptionId uint64) ([32]byte, error) { +func (_FunctionsRouter *FunctionsRouterCaller) GetProposedContractById(opts *bind.CallOpts, id [32]byte) (common.Address, error) { var out []interface{} - err := _FunctionsRouter.contract.Call(opts, &out, "getFlags", subscriptionId) + err := _FunctionsRouter.contract.Call(opts, &out, "getProposedContractById", id) if err != nil { - return *new([32]byte), err + return *new(common.Address), err } - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) return out0, err } -func (_FunctionsRouter *FunctionsRouterSession) GetFlags(subscriptionId uint64) ([32]byte, error) { - return _FunctionsRouter.Contract.GetFlags(&_FunctionsRouter.CallOpts, subscriptionId) +func (_FunctionsRouter *FunctionsRouterSession) GetProposedContractById(id [32]byte) (common.Address, error) { + return _FunctionsRouter.Contract.GetProposedContractById(&_FunctionsRouter.CallOpts, id) } -func (_FunctionsRouter *FunctionsRouterCallerSession) GetFlags(subscriptionId uint64) ([32]byte, error) { - return _FunctionsRouter.Contract.GetFlags(&_FunctionsRouter.CallOpts, subscriptionId) +func (_FunctionsRouter *FunctionsRouterCallerSession) GetProposedContractById(id [32]byte) (common.Address, error) { + return _FunctionsRouter.Contract.GetProposedContractById(&_FunctionsRouter.CallOpts, id) } func (_FunctionsRouter *FunctionsRouterCaller) GetProposedContractSet(opts *bind.CallOpts) (*big.Int, [][32]byte, []common.Address, error) { @@ -401,36 +384,25 @@ func (_FunctionsRouter *FunctionsRouterCallerSession) GetProposedContractSet() ( return _FunctionsRouter.Contract.GetProposedContractSet(&_FunctionsRouter.CallOpts) } -func (_FunctionsRouter *FunctionsRouterCaller) GetSubscription(opts *bind.CallOpts, subscriptionId uint64) (GetSubscription, - - error) { +func (_FunctionsRouter *FunctionsRouterCaller) GetSubscription(opts *bind.CallOpts, subscriptionId uint64) (IFunctionsSubscriptionsSubscription, error) { var out []interface{} err := _FunctionsRouter.contract.Call(opts, &out, "getSubscription", subscriptionId) - outstruct := new(GetSubscription) if err != nil { - return *outstruct, err + return *new(IFunctionsSubscriptionsSubscription), err } - outstruct.Balance = *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - outstruct.BlockedBalance = *abi.ConvertType(out[1], new(*big.Int)).(**big.Int) - outstruct.Owner = *abi.ConvertType(out[2], new(common.Address)).(*common.Address) - outstruct.RequestedOwner = *abi.ConvertType(out[3], new(common.Address)).(*common.Address) - outstruct.Consumers = *abi.ConvertType(out[4], new([]common.Address)).(*[]common.Address) + out0 := *abi.ConvertType(out[0], new(IFunctionsSubscriptionsSubscription)).(*IFunctionsSubscriptionsSubscription) - return *outstruct, err + return out0, err } -func (_FunctionsRouter *FunctionsRouterSession) GetSubscription(subscriptionId uint64) (GetSubscription, - - error) { +func (_FunctionsRouter *FunctionsRouterSession) GetSubscription(subscriptionId uint64) (IFunctionsSubscriptionsSubscription, error) { return _FunctionsRouter.Contract.GetSubscription(&_FunctionsRouter.CallOpts, subscriptionId) } -func (_FunctionsRouter *FunctionsRouterCallerSession) GetSubscription(subscriptionId uint64) (GetSubscription, - - error) { +func (_FunctionsRouter *FunctionsRouterCallerSession) GetSubscription(subscriptionId uint64) (IFunctionsSubscriptionsSubscription, error) { return _FunctionsRouter.Contract.GetSubscription(&_FunctionsRouter.CallOpts, subscriptionId) } @@ -668,16 +640,16 @@ func (_FunctionsRouter *FunctionsRouterTransactorSession) CreateSubscription() ( return _FunctionsRouter.Contract.CreateSubscription(&_FunctionsRouter.TransactOpts) } -func (_FunctionsRouter *FunctionsRouterTransactor) Fulfill(opts *bind.TransactOpts, response []byte, err []byte, juelsPerGas *big.Int, costWithoutFulfillment *big.Int, transmitter common.Address, commitment IFunctionsRequestCommitment) (*types.Transaction, error) { - return _FunctionsRouter.contract.Transact(opts, "fulfill", response, err, juelsPerGas, costWithoutFulfillment, transmitter, commitment) +func (_FunctionsRouter *FunctionsRouterTransactor) Fulfill(opts *bind.TransactOpts, response []byte, err []byte, juelsPerGas *big.Int, costWithoutCallback *big.Int, transmitter common.Address, commitment IFunctionsRequestCommitment) (*types.Transaction, error) { + return _FunctionsRouter.contract.Transact(opts, "fulfill", response, err, juelsPerGas, costWithoutCallback, transmitter, commitment) } -func (_FunctionsRouter *FunctionsRouterSession) Fulfill(response []byte, err []byte, juelsPerGas *big.Int, costWithoutFulfillment *big.Int, transmitter common.Address, commitment IFunctionsRequestCommitment) (*types.Transaction, error) { - return _FunctionsRouter.Contract.Fulfill(&_FunctionsRouter.TransactOpts, response, err, juelsPerGas, costWithoutFulfillment, transmitter, commitment) +func (_FunctionsRouter *FunctionsRouterSession) Fulfill(response []byte, err []byte, juelsPerGas *big.Int, costWithoutCallback *big.Int, transmitter common.Address, commitment IFunctionsRequestCommitment) (*types.Transaction, error) { + return _FunctionsRouter.Contract.Fulfill(&_FunctionsRouter.TransactOpts, response, err, juelsPerGas, costWithoutCallback, transmitter, commitment) } -func (_FunctionsRouter *FunctionsRouterTransactorSession) Fulfill(response []byte, err []byte, juelsPerGas *big.Int, costWithoutFulfillment *big.Int, transmitter common.Address, commitment IFunctionsRequestCommitment) (*types.Transaction, error) { - return _FunctionsRouter.Contract.Fulfill(&_FunctionsRouter.TransactOpts, response, err, juelsPerGas, costWithoutFulfillment, transmitter, commitment) +func (_FunctionsRouter *FunctionsRouterTransactorSession) Fulfill(response []byte, err []byte, juelsPerGas *big.Int, costWithoutCallback *big.Int, transmitter common.Address, commitment IFunctionsRequestCommitment) (*types.Transaction, error) { + return _FunctionsRouter.Contract.Fulfill(&_FunctionsRouter.TransactOpts, response, err, juelsPerGas, costWithoutCallback, transmitter, commitment) } func (_FunctionsRouter *FunctionsRouterTransactor) OnTokenTransfer(opts *bind.TransactOpts, arg0 common.Address, amount *big.Int, data []byte) (*types.Transaction, error) { @@ -752,6 +724,18 @@ func (_FunctionsRouter *FunctionsRouterTransactorSession) ProposeConfigUpdate(id return _FunctionsRouter.Contract.ProposeConfigUpdate(&_FunctionsRouter.TransactOpts, id, config) } +func (_FunctionsRouter *FunctionsRouterTransactor) ProposeConfigUpdateSelf(opts *bind.TransactOpts, config []byte) (*types.Transaction, error) { + return _FunctionsRouter.contract.Transact(opts, "proposeConfigUpdateSelf", config) +} + +func (_FunctionsRouter *FunctionsRouterSession) ProposeConfigUpdateSelf(config []byte) (*types.Transaction, error) { + return _FunctionsRouter.Contract.ProposeConfigUpdateSelf(&_FunctionsRouter.TransactOpts, config) +} + +func (_FunctionsRouter *FunctionsRouterTransactorSession) ProposeConfigUpdateSelf(config []byte) (*types.Transaction, error) { + return _FunctionsRouter.Contract.ProposeConfigUpdateSelf(&_FunctionsRouter.TransactOpts, config) +} + func (_FunctionsRouter *FunctionsRouterTransactor) ProposeContractsUpdate(opts *bind.TransactOpts, proposedContractSetIds [][32]byte, proposedContractSetAddresses []common.Address) (*types.Transaction, error) { return _FunctionsRouter.contract.Transact(opts, "proposeContractsUpdate", proposedContractSetIds, proposedContractSetAddresses) } @@ -824,6 +808,18 @@ func (_FunctionsRouter *FunctionsRouterTransactorSession) SendRequest(subscripti return _FunctionsRouter.Contract.SendRequest(&_FunctionsRouter.TransactOpts, subscriptionId, data, dataVersion, callbackGasLimit, donId) } +func (_FunctionsRouter *FunctionsRouterTransactor) SendRequestToProposed(opts *bind.TransactOpts, subscriptionId uint64, data []byte, dataVersion uint16, callbackGasLimit uint32, donId [32]byte) (*types.Transaction, error) { + return _FunctionsRouter.contract.Transact(opts, "sendRequestToProposed", subscriptionId, data, dataVersion, callbackGasLimit, donId) +} + +func (_FunctionsRouter *FunctionsRouterSession) SendRequestToProposed(subscriptionId uint64, data []byte, dataVersion uint16, callbackGasLimit uint32, donId [32]byte) (*types.Transaction, error) { + return _FunctionsRouter.Contract.SendRequestToProposed(&_FunctionsRouter.TransactOpts, subscriptionId, data, dataVersion, callbackGasLimit, donId) +} + +func (_FunctionsRouter *FunctionsRouterTransactorSession) SendRequestToProposed(subscriptionId uint64, data []byte, dataVersion uint16, callbackGasLimit uint32, donId [32]byte) (*types.Transaction, error) { + return _FunctionsRouter.Contract.SendRequestToProposed(&_FunctionsRouter.TransactOpts, subscriptionId, data, dataVersion, callbackGasLimit, donId) +} + func (_FunctionsRouter *FunctionsRouterTransactor) SetFlags(opts *bind.TransactOpts, subscriptionId uint64, flags [32]byte) (*types.Transaction, error) { return _FunctionsRouter.contract.Transact(opts, "setFlags", subscriptionId, flags) } @@ -884,6 +880,18 @@ func (_FunctionsRouter *FunctionsRouterTransactorSession) UpdateConfig(id [32]by return _FunctionsRouter.Contract.UpdateConfig(&_FunctionsRouter.TransactOpts, id) } +func (_FunctionsRouter *FunctionsRouterTransactor) UpdateConfigSelf(opts *bind.TransactOpts) (*types.Transaction, error) { + return _FunctionsRouter.contract.Transact(opts, "updateConfigSelf") +} + +func (_FunctionsRouter *FunctionsRouterSession) UpdateConfigSelf() (*types.Transaction, error) { + return _FunctionsRouter.Contract.UpdateConfigSelf(&_FunctionsRouter.TransactOpts) +} + +func (_FunctionsRouter *FunctionsRouterTransactorSession) UpdateConfigSelf() (*types.Transaction, error) { + return _FunctionsRouter.Contract.UpdateConfigSelf(&_FunctionsRouter.TransactOpts) +} + func (_FunctionsRouter *FunctionsRouterTransactor) UpdateContracts(opts *bind.TransactOpts) (*types.Transaction, error) { return _FunctionsRouter.contract.Transact(opts, "updateContracts") } @@ -908,18 +916,6 @@ func (_FunctionsRouter *FunctionsRouterTransactorSession) UpdateTimelockBlocks() return _FunctionsRouter.Contract.UpdateTimelockBlocks(&_FunctionsRouter.TransactOpts) } -func (_FunctionsRouter *FunctionsRouterTransactor) ValidateProposedContracts(opts *bind.TransactOpts, id [32]byte, data []byte) (*types.Transaction, error) { - return _FunctionsRouter.contract.Transact(opts, "validateProposedContracts", id, data) -} - -func (_FunctionsRouter *FunctionsRouterSession) ValidateProposedContracts(id [32]byte, data []byte) (*types.Transaction, error) { - return _FunctionsRouter.Contract.ValidateProposedContracts(&_FunctionsRouter.TransactOpts, id, data) -} - -func (_FunctionsRouter *FunctionsRouterTransactorSession) ValidateProposedContracts(id [32]byte, data []byte) (*types.Transaction, error) { - return _FunctionsRouter.Contract.ValidateProposedContracts(&_FunctionsRouter.TransactOpts, id, data) -} - type FunctionsRouterConfigChangedIterator struct { Event *FunctionsRouterConfigChanged @@ -1100,10 +1096,9 @@ func (it *FunctionsRouterConfigProposedIterator) Close() error { } type FunctionsRouterConfigProposed struct { - Id [32]byte - FromHash [32]byte - ToBytes []byte - Raw types.Log + Id [32]byte + ToBytes []byte + Raw types.Log } func (_FunctionsRouter *FunctionsRouterFilterer) FilterConfigProposed(opts *bind.FilterOpts) (*FunctionsRouterConfigProposedIterator, error) { @@ -1219,10 +1214,9 @@ func (it *FunctionsRouterConfigUpdatedIterator) Close() error { } type FunctionsRouterConfigUpdated struct { - Id [32]byte - FromHash [32]byte - ToBytes []byte - Raw types.Log + Id [32]byte + ToBytes []byte + Raw types.Log } func (_FunctionsRouter *FunctionsRouterFilterer) FilterConfigUpdated(opts *bind.FilterOpts) (*FunctionsRouterConfigUpdatedIterator, error) { @@ -1458,10 +1452,10 @@ func (it *FunctionsRouterContractUpdatedIterator) Close() error { } type FunctionsRouterContractUpdated struct { - ProposedContractSetId [32]byte - ProposedContractSetFromAddress common.Address - ProposedContractSetToAddress common.Address - Raw types.Log + Id [32]byte + From common.Address + To common.Address + Raw types.Log } func (_FunctionsRouter *FunctionsRouterFilterer) FilterContractUpdated(opts *bind.FilterOpts) (*FunctionsRouterContractUpdatedIterator, error) { @@ -3830,13 +3824,6 @@ type GetConsumer struct { InitiatedRequests uint64 CompletedRequests uint64 } -type GetSubscription struct { - Balance *big.Int - BlockedBalance *big.Int - Owner common.Address - RequestedOwner common.Address - Consumers []common.Address -} func (_FunctionsRouter *FunctionsRouter) ParseLog(log types.Log) (generated.AbigenLog, error) { switch log.Topics[0] { @@ -3897,11 +3884,11 @@ func (FunctionsRouterConfigChanged) Topic() common.Hash { } func (FunctionsRouterConfigProposed) Topic() common.Hash { - return common.HexToHash("0x0fcfd32a68209b42944376bc5f4bf72c41ba0f378cf60434f84390b82c9844cf") + return common.HexToHash("0xdf3b58e133a3ba6c2ac90fe2b70fef7f7d69dd675fe9c542a6f0fe2f3a8a6f3a") } func (FunctionsRouterConfigUpdated) Topic() common.Hash { - return common.HexToHash("0xc07626096b49b0462a576c9a7878cf0675e784bb4832584c1289c11664e55f47") + return common.HexToHash("0xd97d1d65f3cae3537cf4c61e688583d89aae53d8b32accdfe7cb189e65ef34c7") } func (FunctionsRouterContractProposed) Topic() common.Hash { @@ -3993,25 +3980,21 @@ type FunctionsRouterInterface interface { GetAllowListId(opts *bind.CallOpts) ([32]byte, error) - GetConfig(opts *bind.CallOpts) (IFunctionsRouterConfig, error) - - GetConfigHash(opts *bind.CallOpts) ([32]byte, error) + GetConfig(opts *bind.CallOpts) (uint16, *big.Int, [4]byte, []uint32, error) GetConsumer(opts *bind.CallOpts, client common.Address, subscriptionId uint64) (GetConsumer, error) - GetContractById(opts *bind.CallOpts, id [32]byte, useProposed bool) (common.Address, error) - - GetContractById0(opts *bind.CallOpts, id [32]byte) (common.Address, error) + GetContractById(opts *bind.CallOpts, id [32]byte) (common.Address, error) GetFlags(opts *bind.CallOpts, subscriptionId uint64) ([32]byte, error) - GetProposedContractSet(opts *bind.CallOpts) (*big.Int, [][32]byte, []common.Address, error) + GetProposedContractById(opts *bind.CallOpts, id [32]byte) (common.Address, error) - GetSubscription(opts *bind.CallOpts, subscriptionId uint64) (GetSubscription, + GetProposedContractSet(opts *bind.CallOpts) (*big.Int, [][32]byte, []common.Address, error) - error) + GetSubscription(opts *bind.CallOpts, subscriptionId uint64) (IFunctionsSubscriptionsSubscription, error) GetSubscriptionCount(opts *bind.CallOpts) (uint64, error) @@ -4039,7 +4022,7 @@ type FunctionsRouterInterface interface { CreateSubscription(opts *bind.TransactOpts) (*types.Transaction, error) - Fulfill(opts *bind.TransactOpts, response []byte, err []byte, juelsPerGas *big.Int, costWithoutFulfillment *big.Int, transmitter common.Address, commitment IFunctionsRequestCommitment) (*types.Transaction, error) + Fulfill(opts *bind.TransactOpts, response []byte, err []byte, juelsPerGas *big.Int, costWithoutCallback *big.Int, transmitter common.Address, commitment IFunctionsRequestCommitment) (*types.Transaction, error) OnTokenTransfer(opts *bind.TransactOpts, arg0 common.Address, amount *big.Int, data []byte) (*types.Transaction, error) @@ -4053,6 +4036,8 @@ type FunctionsRouterInterface interface { ProposeConfigUpdate(opts *bind.TransactOpts, id [32]byte, config []byte) (*types.Transaction, error) + ProposeConfigUpdateSelf(opts *bind.TransactOpts, config []byte) (*types.Transaction, error) + ProposeContractsUpdate(opts *bind.TransactOpts, proposedContractSetIds [][32]byte, proposedContractSetAddresses []common.Address) (*types.Transaction, error) ProposeSubscriptionOwnerTransfer(opts *bind.TransactOpts, subscriptionId uint64, newOwner common.Address) (*types.Transaction, error) @@ -4065,6 +4050,8 @@ type FunctionsRouterInterface interface { SendRequest(opts *bind.TransactOpts, subscriptionId uint64, data []byte, dataVersion uint16, callbackGasLimit uint32, donId [32]byte) (*types.Transaction, error) + SendRequestToProposed(opts *bind.TransactOpts, subscriptionId uint64, data []byte, dataVersion uint16, callbackGasLimit uint32, donId [32]byte) (*types.Transaction, error) + SetFlags(opts *bind.TransactOpts, subscriptionId uint64, flags [32]byte) (*types.Transaction, error) TimeoutRequests(opts *bind.TransactOpts, requestsToTimeoutByCommitment []IFunctionsRequestCommitment) (*types.Transaction, error) @@ -4075,12 +4062,12 @@ type FunctionsRouterInterface interface { UpdateConfig(opts *bind.TransactOpts, id [32]byte) (*types.Transaction, error) + UpdateConfigSelf(opts *bind.TransactOpts) (*types.Transaction, error) + UpdateContracts(opts *bind.TransactOpts) (*types.Transaction, error) UpdateTimelockBlocks(opts *bind.TransactOpts) (*types.Transaction, error) - ValidateProposedContracts(opts *bind.TransactOpts, id [32]byte, data []byte) (*types.Transaction, error) - FilterConfigChanged(opts *bind.FilterOpts) (*FunctionsRouterConfigChangedIterator, error) WatchConfigChanged(opts *bind.WatchOpts, sink chan<- *FunctionsRouterConfigChanged) (event.Subscription, error) diff --git a/core/gethwrappers/functions/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/functions/generation/generated-wrapper-dependency-versions-do-not-edit.txt index 857c960e0a7..0f2a76161d2 100644 --- a/core/gethwrappers/functions/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/functions/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -1,10 +1,10 @@ GETH_VERSION: 1.12.0 functions: ../../../contracts/solc/v0.8.19/functions/1_0_0/Functions.abi ../../../contracts/solc/v0.8.19/functions/1_0_0/Functions.bin 3c972870b0afeb6d73a29ebb182f24956a2cebb127b21c4f867d1ecf19a762db -functions_allow_list: ../../../contracts/solc/v0.8.19/functions/1_0_0/TermsOfServiceAllowList.abi ../../../contracts/solc/v0.8.19/functions/1_0_0/TermsOfServiceAllowList.bin 666319c8b9b06d75db166d87a7338a79e9abe9eff71b73ea905f16f9e7cc95cf +functions_allow_list: ../../../contracts/solc/v0.8.19/functions/1_0_0/TermsOfServiceAllowList.abi ../../../contracts/solc/v0.8.19/functions/1_0_0/TermsOfServiceAllowList.bin a6a0fae8fe9c6124f03bf66208fc74eac185be57919e9a3906f4020f0bde2074 functions_client: ../../../contracts/solc/v0.8.19/functions/1_0_0/FunctionsClient.abi ../../../contracts/solc/v0.8.19/functions/1_0_0/FunctionsClient.bin fcfdcd4c0916533f648e5290768a34382465944b2ffe9465add1d5e81175a415 functions_client_example: ../../../contracts/solc/v0.8.19/functions/1_0_0/FunctionsClientExample.abi ../../../contracts/solc/v0.8.19/functions/1_0_0/FunctionsClientExample.bin 6841ee6b3150ac5441218396b1fd54cce4ca0af72002489461dc7ba732c393b2 -functions_coordinator: ../../../contracts/solc/v0.8.19/functions/1_0_0/FunctionsCoordinator.abi ../../../contracts/solc/v0.8.19/functions/1_0_0/FunctionsCoordinator.bin 607be9fa262f499aeadb5572907eb9ed78c3ca1595a14ef0ef1bbeeda8da94bc -functions_router: ../../../contracts/solc/v0.8.19/functions/1_0_0/FunctionsRouter.abi ../../../contracts/solc/v0.8.19/functions/1_0_0/FunctionsRouter.bin 31b716f2bd9e26d5fd41d2c239cf102622de78b7aafcbb041d1298cb72079a09 +functions_coordinator: ../../../contracts/solc/v0.8.19/functions/1_0_0/FunctionsCoordinator.abi ../../../contracts/solc/v0.8.19/functions/1_0_0/FunctionsCoordinator.bin 9f3279ec5b9d6e724c596b5e315a07d64dea43e26f33eacd38145790d0cb92d6 +functions_router: ../../../contracts/solc/v0.8.19/functions/1_0_0/FunctionsRouter.abi ../../../contracts/solc/v0.8.19/functions/1_0_0/FunctionsRouter.bin 2047f8424d3038672f347ef5e6b401f0347b42f64defd43033cc75e0ac537287 ocr2dr: ../../../contracts/solc/v0.8.6/functions/0_0_0/Functions.abi ../../../contracts/solc/v0.8.6/functions/0_0_0/Functions.bin d9a794b33f47cc57563d216f7cf3a612309fc3062356a27e30005cf1d59e449d ocr2dr_client: ../../../contracts/solc/v0.8.6/functions/0_0_0/FunctionsClient.abi ../../../contracts/solc/v0.8.6/functions/0_0_0/FunctionsClient.bin 84aa63f9dbc5c7eac240db699b09e613ca4c6cd56dab10bdc25b02461b717e21 ocr2dr_client_example: ../../../contracts/solc/v0.8.6/functions/0_0_0/FunctionsClientExample.abi ../../../contracts/solc/v0.8.6/functions/0_0_0/FunctionsClientExample.bin a978d9b52a5a2da19eef0975979de256e62980a0cfb3084fe6d66a351b4ef534 diff --git a/core/services/ocr2/plugins/functions/integration_tests/v1/internal/testutils.go b/core/services/ocr2/plugins/functions/integration_tests/v1/internal/testutils.go index e00729b9fdd..7dc23007bb3 100644 --- a/core/services/ocr2/plugins/functions/integration_tests/v1/internal/testutils.go +++ b/core/services/ocr2/plugins/functions/integration_tests/v1/internal/testutils.go @@ -114,13 +114,11 @@ func CreateAndFundSubscriptions(t *testing.T, owner *bind.TransactOpts, linkToke allowed, err := allowListContract.HasAccess(nilOpts, owner.From, []byte{}) require.NoError(t, err) if !allowed { - messageHash, err := allowListContract.GetMessageHash(nilOpts, owner.From, owner.From) - require.NoError(t, err) - ethMessageHash, err := allowListContract.GetEthSignedMessageHash(nilOpts, messageHash) + message, err := allowListContract.GetMessage(nilOpts, owner.From, owner.From) require.NoError(t, err) privateKey, err := crypto.HexToECDSA(allowListPrivateKey[2:]) require.NoError(t, err) - flatSignature, err := crypto.Sign(ethMessageHash[:], privateKey) + flatSignature, err := crypto.Sign(message[:], privateKey) var r [32]byte copy(r[:], flatSignature[:32]) var s [32]byte