From 8241e811b2ed37ccd3bc11674735e0599c43429c Mon Sep 17 00:00:00 2001 From: Domino Valdano Date: Mon, 11 Mar 2024 08:11:34 -0700 Subject: [PATCH 01/15] Add support for eth_getLogs to simulated_backend_client.go (#12360) * Add support for eth_getLogs to simulated_backend_client.go Also: add support for finality tags * . * Handle case where blockNumber = nil Pre-existing bug, somehow we must not have hit this one before * pnpm changeset * - Fix lint error which disallows unreachable code - Fix Sonarcube complaint about complex case statement (7 lines exceeded max of 6) - Run goimports * Simplify switch statement * Replace incorrect panic message with appropriate error --- .changeset/warm-owls-act.md | 5 + .../evm/client/simulated_backend_client.go | 116 +++++++++++++++++- 2 files changed, 115 insertions(+), 6 deletions(-) create mode 100644 .changeset/warm-owls-act.md diff --git a/.changeset/warm-owls-act.md b/.changeset/warm-owls-act.md new file mode 100644 index 00000000000..22b674e7418 --- /dev/null +++ b/.changeset/warm-owls-act.md @@ -0,0 +1,5 @@ +--- +"chainlink": minor +--- + +Add support for eth_getLogs & finality tags in simulated_backend_client.go diff --git a/core/chains/evm/client/simulated_backend_client.go b/core/chains/evm/client/simulated_backend_client.go index c49637e7890..631ed1ffaca 100644 --- a/core/chains/evm/client/simulated_backend_client.go +++ b/core/chains/evm/client/simulated_backend_client.go @@ -18,6 +18,8 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/rpc" + "github.com/smartcontractkit/chainlink-common/pkg/utils/hex" + "github.com/smartcontractkit/chainlink-common/pkg/assets" "github.com/smartcontractkit/chainlink-common/pkg/logger" @@ -125,6 +127,10 @@ func (c *SimulatedBackendClient) currentBlockNumber() *big.Int { return c.b.Blockchain().CurrentBlock().Number } +func (c *SimulatedBackendClient) finalizedBlockNumber() *big.Int { + return c.b.Blockchain().CurrentFinalBlock().Number +} + func (c *SimulatedBackendClient) TokenBalance(ctx context.Context, address common.Address, contractAddress common.Address) (balance *big.Int, err error) { callData, err := balanceOfABI.Pack("balanceOf", address) if err != nil { @@ -171,6 +177,8 @@ func (c *SimulatedBackendClient) blockNumber(number interface{}) (blockNumber *b case "pending": panic("pending block not supported by simulated backend client") // I don't understand the semantics of this. // return big.NewInt(0).Add(c.currentBlockNumber(), big.NewInt(1)), nil + case "finalized": + return c.finalizedBlockNumber(), nil default: blockNumber, err := hexutil.DecodeBig(n) if err != nil { @@ -179,12 +187,16 @@ func (c *SimulatedBackendClient) blockNumber(number interface{}) (blockNumber *b return blockNumber, nil } case *big.Int: + if n == nil { + return nil, nil + } if n.Sign() < 0 { return nil, fmt.Errorf("block number must be non-negative") } return n, nil + default: + return nil, fmt.Errorf("invalid type %T for block number, must be string or *big.Int", n) } - panic("can never reach here") } // HeadByNumber returns our own header type. @@ -455,20 +467,24 @@ func (c *SimulatedBackendClient) BatchCallContext(ctx context.Context, b []rpc.B } for i, elem := range b { + var method func(context.Context, interface{}, ...interface{}) error switch elem.Method { case "eth_getTransactionReceipt": - b[i].Error = c.ethGetTransactionReceipt(ctx, b[i].Result, b[i].Args...) + method = c.ethGetTransactionReceipt case "eth_getBlockByNumber": - b[i].Error = c.ethGetBlockByNumber(ctx, b[i].Result, b[i].Args...) + method = c.ethGetBlockByNumber case "eth_call": - b[i].Error = c.ethCall(ctx, b[i].Result, b[i].Args...) + method = c.ethCall case "eth_getHeaderByNumber": - b[i].Error = c.ethGetHeaderByNumber(ctx, b[i].Result, b[i].Args...) + method = c.ethGetHeaderByNumber case "eth_estimateGas": - b[i].Error = c.ethEstimateGas(ctx, b[i].Result, b[i].Args...) + method = c.ethEstimateGas + case "eth_getLogs": + method = c.ethGetLogs default: return fmt.Errorf("SimulatedBackendClient got unsupported method %s", elem.Method) } + b[i].Error = method(ctx, b[i].Result, b[i].Args...) } return nil @@ -677,6 +693,76 @@ func (c *SimulatedBackendClient) ethGetHeaderByNumber(ctx context.Context, resul return nil } +func (c *SimulatedBackendClient) ethGetLogs(ctx context.Context, result interface{}, args ...interface{}) error { + var from, to *big.Int + var hash *common.Hash + var err error + var addresses []common.Address + var topics [][]common.Hash + + params := args[0].(map[string]interface{}) + if blockHash, ok := params["blockHash"]; ok { + hash, err = interfaceToHash(blockHash) + if err != nil { + return fmt.Errorf("SimultaedBackendClient received unexpected 'blockhash' param: %w", err) + } + } + + if fromBlock, ok := params["fromBlock"]; ok { + from, err = c.blockNumber(fromBlock) + if err != nil { + return fmt.Errorf("SimulatedBackendClient expected 'fromBlock' to be a string: %w", err) + } + } + + if toBlock, ok := params["toBlock"]; ok { + to, err = c.blockNumber(toBlock) + if err != nil { + return fmt.Errorf("SimulatedBackendClient expected 'toBlock' to be a string: %w", err) + } + } + + if a, ok := params["addresses"]; ok { + addresses = a.([]common.Address) + } + + if t, ok := params["topics"]; ok { + tt := t.([][]common.Hash) + lastTopic := len(tt) - 1 + for lastTopic >= 0 { + if tt[lastTopic] != nil { + break + } + lastTopic-- + } + // lastTopic is the topic index of the last non-nil topic slice + // We have to drop any nil values in the topics slice after that due to a quirk in FilterLogs(), + // which will only use nil as a wildcard if there are non-nil values after it in the slice + for i := 0; i < lastTopic; i++ { + topics = append(topics, tt[i]) + } + } + + query := ethereum.FilterQuery{ + BlockHash: hash, + FromBlock: from, + ToBlock: to, + Addresses: addresses, + Topics: topics, + } + logs, err := c.b.FilterLogs(ctx, query) + if err != nil { + return err + } + switch r := result.(type) { + case *[]types.Log: + *r = logs + return nil + default: + return fmt.Errorf("SimulatedBackendClient unexpected Type %T", r) + } +} + func toCallMsg(params map[string]interface{}) ethereum.CallMsg { var callMsg ethereum.CallMsg toAddr, err := interfaceToAddress(params["to"]) @@ -778,3 +864,21 @@ func interfaceToAddress(value interface{}) (common.Address, error) { return common.Address{}, fmt.Errorf("unrecognized value type: %T for converting value to common.Address; use hex encoded string, *big.Int, or common.Address", v) } } + +func interfaceToHash(value interface{}) (*common.Hash, error) { + switch v := value.(type) { + case common.Hash: + return &v, nil + case *common.Hash: + return v, nil + case string: + b, err := hex.DecodeString(v) + if err != nil || len(b) != 32 { + return nil, fmt.Errorf("string does not represent a 32-byte hexadecimal number") + } + h := common.Hash(b) + return &h, nil + default: + return nil, fmt.Errorf("unrecognized value type: %T for converting value to common.Hash; use hex encoded string or common.Hash", v) + } +} From a2db9de8a5d3da4a541e3807fe3139d1aa1b0375 Mon Sep 17 00:00:00 2001 From: Sri Kidambi <1702865+kidambisrinivas@users.noreply.github.com> Date: Mon, 11 Mar 2024 17:27:54 +0000 Subject: [PATCH 02/15] fulfillRandomWords msg.data length validation (#12325) * fulfillRandomWords msg.data length validation * Addressed PR comments * Added changeset --- .changeset/pretty-fishes-jam.md | 5 ++++ .../src/v0.8/vrf/dev/VRFCoordinatorV2_5.sol | 27 +++++++++++++++++++ .../vrf_coordinator_v2_5.go | 4 +-- ...rapper-dependency-versions-do-not-edit.txt | 2 +- 4 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 .changeset/pretty-fishes-jam.md diff --git a/.changeset/pretty-fishes-jam.md b/.changeset/pretty-fishes-jam.md new file mode 100644 index 00000000000..6026bb27971 --- /dev/null +++ b/.changeset/pretty-fishes-jam.md @@ -0,0 +1,5 @@ +--- +"chainlink": minor +--- + +VRF V2+ Coordinator msg.data len validation diff --git a/contracts/src/v0.8/vrf/dev/VRFCoordinatorV2_5.sol b/contracts/src/v0.8/vrf/dev/VRFCoordinatorV2_5.sol index e03181b7254..44401bae31f 100644 --- a/contracts/src/v0.8/vrf/dev/VRFCoordinatorV2_5.sol +++ b/contracts/src/v0.8/vrf/dev/VRFCoordinatorV2_5.sol @@ -27,6 +27,7 @@ contract VRFCoordinatorV2_5 is VRF, SubscriptionAPI, IVRFCoordinatorV2Plus { error InvalidRequestConfirmations(uint16 have, uint16 min, uint16 max); error GasLimitTooBig(uint32 have, uint32 want); error NumWordsTooBig(uint32 have, uint32 want); + error MsgDataTooBig(uint256 have, uint32 max); error ProvingKeyAlreadyRegistered(bytes32 keyHash); error NoSuchProvingKey(bytes32 keyHash); error InvalidLinkWeiPrice(int256 linkWei); @@ -444,6 +445,32 @@ contract VRFCoordinatorV2_5 is VRF, SubscriptionAPI, IVRFCoordinatorV2Plus { bool onlyPremium ) external nonReentrant returns (uint96 payment) { uint256 startGas = gasleft(); + // fulfillRandomWords msg.data has 772 bytes and with an additional + // buffer of 32 bytes, we get 804 bytes. + /* Data size split: + * fulfillRandomWords function signature - 4 bytes + * proof - 416 bytes + * pk - 64 bytes + * gamma - 64 bytes + * c - 32 bytes + * s - 32 bytes + * seed - 32 bytes + * uWitness - 32 bytes + * cGammaWitness - 64 bytes + * sHashWitness - 64 bytes + * zInv - 32 bytes + * requestCommitment - 320 bytes + * blockNum - 32 bytes + * subId - 32 bytes + * callbackGasLimit - 32 bytes + * numWords - 32 bytes + * sender - 32 bytes + * extraArgs - 128 bytes + * onlyPremium - 32 bytes + */ + if (msg.data.length > 804) { + revert MsgDataTooBig(msg.data.length, 804); + } Output memory output = _getRandomnessFromProof(proof, rc); uint256 gasPrice = _getValidatedGasPrice(onlyPremium, output.provingKey.maxGas); diff --git a/core/gethwrappers/generated/vrf_coordinator_v2_5/vrf_coordinator_v2_5.go b/core/gethwrappers/generated/vrf_coordinator_v2_5/vrf_coordinator_v2_5.go index 2d1c2f4cec7..e509cb7c22b 100644 --- a/core/gethwrappers/generated/vrf_coordinator_v2_5/vrf_coordinator_v2_5.go +++ b/core/gethwrappers/generated/vrf_coordinator_v2_5/vrf_coordinator_v2_5.go @@ -61,8 +61,8 @@ type VRFV2PlusClientRandomWordsRequest struct { } var VRFCoordinatorV25MetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"blockhashStore\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"internalBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"externalBalance\",\"type\":\"uint256\"}],\"name\":\"BalanceInvariantViolated\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNum\",\"type\":\"uint256\"}],\"name\":\"BlockhashNotInStore\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorNotRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedToSendNative\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedToTransferLink\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"have\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"want\",\"type\":\"uint32\"}],\"name\":\"GasLimitTooBig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"gasPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxGas\",\"type\":\"uint256\"}],\"name\":\"GasPriceExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectCommitment\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IndexOutOfRange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"have\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"want\",\"type\":\"uint256\"}],\"name\":\"InsufficientGasForConsumer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCalldata\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"InvalidConsumer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExtraArgsTag\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"linkWei\",\"type\":\"int256\"}],\"name\":\"InvalidLinkWeiPrice\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"have\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"min\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"max\",\"type\":\"uint16\"}],\"name\":\"InvalidRequestConfirmations\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSubscription\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkAlreadySet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"flatFeeLinkDiscountPPM\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"flatFeeNativePPM\",\"type\":\"uint32\"}],\"name\":\"LinkDiscountTooHigh\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkNotSet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proposedOwner\",\"type\":\"address\"}],\"name\":\"MustBeRequestedOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"MustBeSubOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoCorrespondingRequest\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"}],\"name\":\"NoSuchProvingKey\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"have\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"want\",\"type\":\"uint32\"}],\"name\":\"NumWordsTooBig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableFromLink\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PaymentTooLarge\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PendingRequestExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"}],\"name\":\"ProvingKeyAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Reentrant\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyConsumers\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"stalenessSeconds\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"gasAfterPaymentCalculation\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"int256\",\"name\":\"fallbackWeiPerUnitLink\",\"type\":\"int256\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeNativePPM\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeLinkDiscountPPM\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"nativePremiumPercentage\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"linkPremiumPercentage\",\"type\":\"uint8\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorDeregistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorRegistered\",\"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\":false,\"internalType\":\"address\",\"name\":\"newCoordinator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"MigrationCompleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"NativeFundsRecovered\",\"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\":\"keyHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"maxGas\",\"type\":\"uint64\"}],\"name\":\"ProvingKeyDeregistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"maxGas\",\"type\":\"uint64\"}],\"name\":\"ProvingKeyRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"outputSeed\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"payment\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"nativePayment\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"onlyPremium\",\"type\":\"bool\"}],\"name\":\"RandomWordsFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"preSeed\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RandomWordsRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountLink\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountNative\",\"type\":\"uint256\"}],\"name\":\"SubscriptionCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"SubscriptionConsumerAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"SubscriptionConsumerRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"SubscriptionCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"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\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldNativeBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newNativeBalance\",\"type\":\"uint256\"}],\"name\":\"SubscriptionFundedWithNative\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"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\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"SubscriptionOwnerTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BLOCKHASH_STORE\",\"outputs\":[{\"internalType\":\"contractBlockhashStoreInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"LINK\",\"outputs\":[{\"internalType\":\"contractLinkTokenInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"LINK_NATIVE_FEED\",\"outputs\":[{\"internalType\":\"contractAggregatorV3Interface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_CONSUMERS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_NUM_WORDS\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_REQUEST_CONFIRMATIONS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"acceptSubscriptionOwnerTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"addConsumer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"cancelSubscription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"createSubscription\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"deregisterMigratableCoordinator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"publicProvingKey\",\"type\":\"uint256[2]\"}],\"name\":\"deregisterProvingKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256[2]\",\"name\":\"pk\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"gamma\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"c\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"s\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"seed\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"uWitness\",\"type\":\"address\"},{\"internalType\":\"uint256[2]\",\"name\":\"cGammaWitness\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"sHashWitness\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"zInv\",\"type\":\"uint256\"}],\"internalType\":\"structVRF.Proof\",\"name\":\"proof\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"blockNum\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structVRFCoordinatorV2_5.RequestCommitment\",\"name\":\"rc\",\"type\":\"tuple\"},{\"internalType\":\"bool\",\"name\":\"onlyPremium\",\"type\":\"bool\"}],\"name\":\"fulfillRandomWords\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"payment\",\"type\":\"uint96\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"fundSubscriptionWithNative\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"startIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxCount\",\"type\":\"uint256\"}],\"name\":\"getActiveSubscriptionIds\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"getSubscription\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"balance\",\"type\":\"uint96\"},{\"internalType\":\"uint96\",\"name\":\"nativeBalance\",\"type\":\"uint96\"},{\"internalType\":\"uint64\",\"name\":\"reqCount\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"consumers\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"publicKey\",\"type\":\"uint256[2]\"}],\"name\":\"hashOfKey\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"newCoordinator\",\"type\":\"address\"}],\"name\":\"migrate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"ownerCancelSubscription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"pendingRequestExists\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"recoverFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"recoverNativeFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"registerMigratableCoordinator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"publicProvingKey\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint64\",\"name\":\"maxGas\",\"type\":\"uint64\"}],\"name\":\"registerProvingKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"removeConsumer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"uint16\",\"name\":\"requestConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structVRFV2PlusClient.RandomWordsRequest\",\"name\":\"req\",\"type\":\"tuple\"}],\"name\":\"requestRandomWords\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"requestSubscriptionOwnerTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_config\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"reentrancyLock\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"stalenessSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasAfterPaymentCalculation\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeNativePPM\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeLinkDiscountPPM\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"nativePremiumPercentage\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"linkPremiumPercentage\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_currentSubNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_fallbackWeiPerUnitLink\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"s_provingKeyHashes\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"s_provingKeys\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"exists\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"maxGas\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"s_requestCommitments\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_totalBalance\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_totalNativeBalance\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"stalenessSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasAfterPaymentCalculation\",\"type\":\"uint32\"},{\"internalType\":\"int256\",\"name\":\"fallbackWeiPerUnitLink\",\"type\":\"int256\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeNativePPM\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeLinkDiscountPPM\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"nativePremiumPercentage\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"linkPremiumPercentage\",\"type\":\"uint8\"}],\"name\":\"setConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"link\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"linkNativeFeed\",\"type\":\"address\"}],\"name\":\"setLINKAndLINKNativeFeed\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"withdrawNative\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162005db538038062005db5833981016040819052620000349162000183565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000d7565b50505060601b6001600160601b031916608052620001b5565b6001600160a01b038116331415620001325760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000602082840312156200019657600080fd5b81516001600160a01b0381168114620001ae57600080fd5b9392505050565b60805160601c615bda620001db6000396000818161055001526131fb0152615bda6000f3fe60806040526004361061021c5760003560e01c80638402595e11610124578063b2a7cac5116100a6578063b2a7cac514610732578063bec4c08c14610752578063caf70c4a14610772578063cb63179714610792578063d98e620e146107b2578063da2f2610146107d2578063dac83d2914610831578063dc311dd314610851578063e72f6e3014610882578063ee9d2d38146108a2578063f2fde38b146108cf57600080fd5b80638402595e146105c757806386fe91c7146105e75780638da5cb5b1461060757806395b55cfc146106255780639b1c385e146106385780639d40a6fd14610658578063a21a23e414610690578063a4c0ed36146106a5578063a63e0bfb146106c5578063aa433aff146106e5578063aefb212f1461070557600080fd5b8063405b84fa116101ad578063405b84fa1461044e57806340d6bb821461046e57806341af6c871461049957806351cff8d9146104c95780635d06b4ab146104e957806364d51a2a14610509578063659827441461051e578063689c45171461053e57806372e9d5651461057257806379ba5097146105925780637a5a2aef146105a757600080fd5b806304104edb14610221578063043bd6ae14610243578063088070f51461026c57806308821d581461033a5780630ae095401461035a57806315c48b841461037a57806318e3dd27146103a25780631b6b6d23146103e15780632f622e6b1461040e578063301f42e91461042e575b600080fd5b34801561022d57600080fd5b5061024161023c366004614fa6565b6108ef565b005b34801561024f57600080fd5b5061025960105481565b6040519081526020015b60405180910390f35b34801561027857600080fd5b50600c546102dd9061ffff81169063ffffffff62010000820481169160ff600160301b8204811692600160381b8304811692600160581b8104821692600160781b8204831692600160981b83041691600160b81b8104821691600160c01b9091041689565b6040805161ffff909a168a5263ffffffff98891660208b01529615159689019690965293861660608801529185166080870152841660a08601529290921660c084015260ff91821660e08401521661010082015261012001610263565b34801561034657600080fd5b50610241610355366004615084565b610a5c565b34801561036657600080fd5b5061024161037536600461536e565b610c06565b34801561038657600080fd5b5061038f60c881565b60405161ffff9091168152602001610263565b3480156103ae57600080fd5b50600a546103c990600160601b90046001600160601b031681565b6040516001600160601b039091168152602001610263565b3480156103ed57600080fd5b50600254610401906001600160a01b031681565b604051610263919061559f565b34801561041a57600080fd5b50610241610429366004614fa6565b610c4e565b34801561043a57600080fd5b506103c961044936600461518a565b610d9a565b34801561045a57600080fd5b5061024161046936600461536e565b610fd4565b34801561047a57600080fd5b506104846101f481565b60405163ffffffff9091168152602001610263565b3480156104a557600080fd5b506104b96104b436600461510d565b611386565b6040519015158152602001610263565b3480156104d557600080fd5b506102416104e4366004614fa6565b611496565b3480156104f557600080fd5b50610241610504366004614fa6565b611624565b34801561051557600080fd5b5061038f606481565b34801561052a57600080fd5b50610241610539366004614fc3565b6116db565b34801561054a57600080fd5b506104017f000000000000000000000000000000000000000000000000000000000000000081565b34801561057e57600080fd5b50600354610401906001600160a01b031681565b34801561059e57600080fd5b5061024161173b565b3480156105b357600080fd5b506102416105c23660046150a0565b6117e5565b3480156105d357600080fd5b506102416105e2366004614fa6565b611915565b3480156105f357600080fd5b50600a546103c9906001600160601b031681565b34801561061357600080fd5b506000546001600160a01b0316610401565b61024161063336600461510d565b611a27565b34801561064457600080fd5b50610259610653366004615278565b611b4b565b34801561066457600080fd5b50600754610678906001600160401b031681565b6040516001600160401b039091168152602001610263565b34801561069c57600080fd5b50610259611e8c565b3480156106b157600080fd5b506102416106c0366004614ffc565b61205f565b3480156106d157600080fd5b506102416106e03660046152cd565b6121db565b3480156106f157600080fd5b5061024161070036600461510d565b612458565b34801561071157600080fd5b50610725610720366004615393565b6124a0565b6040516102639190615616565b34801561073e57600080fd5b5061024161074d36600461510d565b6125a2565b34801561075e57600080fd5b5061024161076d36600461536e565b612697565b34801561077e57600080fd5b5061025961078d3660046150d4565b6127a3565b34801561079e57600080fd5b506102416107ad36600461536e565b6127d3565b3480156107be57600080fd5b506102596107cd36600461510d565b612a42565b3480156107de57600080fd5b506108126107ed36600461510d565b600d6020526000908152604090205460ff81169061010090046001600160401b031682565b6040805192151583526001600160401b03909116602083015201610263565b34801561083d57600080fd5b5061024161084c36600461536e565b612a63565b34801561085d57600080fd5b5061087161086c36600461510d565b612afa565b6040516102639594939291906157eb565b34801561088e57600080fd5b5061024161089d366004614fa6565b612be8565b3480156108ae57600080fd5b506102596108bd36600461510d565b600f6020526000908152604090205481565b3480156108db57600080fd5b506102416108ea366004614fa6565b612dbb565b6108f7612dcc565b60115460005b81811015610a3457826001600160a01b03166011828154811061092257610922615b36565b6000918252602090912001546001600160a01b03161415610a2457601161094a6001846159e6565b8154811061095a5761095a615b36565b600091825260209091200154601180546001600160a01b03909216918390811061098657610986615b36565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060118054806109c5576109c5615b20565b600082815260209020810160001990810180546001600160a01b03191690550190556040517ff80a1a97fd42251f3c33cda98635e7399253033a6774fe37cd3f650b5282af3790610a1790859061559f565b60405180910390a1505050565b610a2d81615a9e565b90506108fd565b5081604051635428d44960e01b8152600401610a50919061559f565b60405180910390fd5b50565b610a64612dcc565b604080518082018252600091610a939190849060029083908390808284376000920191909152506127a3915050565b6000818152600d602090815260409182902082518084019093525460ff811615158084526101009091046001600160401b03169183019190915291925090610af157604051631dfd6e1360e21b815260048101839052602401610a50565b6000828152600d6020526040812080546001600160481b0319169055600e54905b81811015610bc25783600e8281548110610b2e57610b2e615b36565b90600052602060002001541415610bb257600e610b4c6001846159e6565b81548110610b5c57610b5c615b36565b9060005260206000200154600e8281548110610b7a57610b7a615b36565b600091825260209091200155600e805480610b9757610b97615b20565b60019003818190600052602060002001600090559055610bc2565b610bbb81615a9e565b9050610b12565b507f9b6868e0eb737bcd72205360baa6bfd0ba4e4819a33ade2db384e8a8025639a5838360200151604051610bf8929190615629565b60405180910390a150505050565b81610c1081612e21565b610c18612e82565b610c2183611386565b15610c3f57604051631685ecdd60e31b815260040160405180910390fd5b610c498383612ead565b505050565b610c56612e82565b610c5e612dcc565b600b54600160601b90046001600160601b0316610c8e57604051631e9acf1760e31b815260040160405180910390fd5b600b8054600160601b90046001600160601b0316908190600c610cb18380615a22565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555080600a600c8282829054906101000a90046001600160601b0316610cf99190615a22565b92506101000a8154816001600160601b0302191690836001600160601b031602179055506000826001600160a01b0316826001600160601b031660405160006040518083038185875af1925050503d8060008114610d73576040519150601f19603f3d011682016040523d82523d6000602084013e610d78565b606091505b5050905080610c495760405163950b247960e01b815260040160405180910390fd5b6000610da4612e82565b60005a90506000610db58686613061565b90506000610dcb8583600001516020015161331d565b60408301516060888101519293509163ffffffff16806001600160401b03811115610df857610df8615b4c565b604051908082528060200260200182016040528015610e21578160200160208202803683370190505b50925060005b81811015610e895760408051602081018590529081018290526060016040516020818303038152906040528051906020012060001c848281518110610e6e57610e6e615b36565b6020908102919091010152610e8281615a9e565b9050610e27565b5050602080850180516000908152600f9092526040822082905551610eaf908a8561336b565b60208a8101516000908152600690915260409020805491925090601890610ee590600160c01b90046001600160401b0316615ab9565b91906101000a8154816001600160401b0302191690836001600160401b0316021790555060008960a0015160018b60a0015151610f2291906159e6565b81518110610f3257610f32615b36565b60209101015160f81c6001149050610f4c8786838c613406565b9750610f5d88828c60200151613436565b6020808b015187820151604080518781526001600160601b038d16948101949094528415159084015284151560608401528b1515608084015290917faeb4b4786571e184246d39587f659abf0e26f41f6a3358692250382c0cdb47b79060a00160405180910390a3505050505050505b9392505050565b610fdc612e82565b610fe581613589565b6110045780604051635428d44960e01b8152600401610a50919061559f565b60008060008061101386612afa565b945094505093509350336001600160a01b0316826001600160a01b0316146110765760405162461bcd60e51b81526020600482015260166024820152752737ba1039bab139b1b934b83a34b7b71037bbb732b960511b6044820152606401610a50565b61107f86611386565b156110c55760405162461bcd60e51b815260206004820152601660248201527550656e64696e6720726571756573742065786973747360501b6044820152606401610a50565b6040805160c0810182526001815260208082018990526001600160a01b03851682840152606082018490526001600160601b038088166080840152861660a08301529151909160009161111a91849101615653565b6040516020818303038152906040529050611134886135f5565b505060405163ce3f471960e01b81526001600160a01b0388169063ce3f4719906001600160601b0388169061116d908590600401615640565b6000604051808303818588803b15801561118657600080fd5b505af115801561119a573d6000803e3d6000fd5b50506002546001600160a01b0316158015935091506111c3905057506001600160601b03861615155b1561128d5760025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906111fa908a908a906004016155e6565b602060405180830381600087803b15801561121457600080fd5b505af1158015611228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124c91906150f0565b61128d5760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610a50565b600c805460ff60301b1916600160301b17905560005b8351811015611334578381815181106112be576112be615b36565b60200260200101516001600160a01b0316638ea98117896040518263ffffffff1660e01b81526004016112f1919061559f565b600060405180830381600087803b15801561130b57600080fd5b505af115801561131f573d6000803e3d6000fd5b505050508061132d90615a9e565b90506112a3565b50600c805460ff60301b191690556040517fd63ca8cb945956747ee69bfdc3ea754c24a4caf7418db70e46052f7850be4187906113749089908b906155b3565b60405180910390a15050505050505050565b60008181526005602052604081206002018054806113a8575060009392505050565b600e5460005b8281101561148a5760008482815481106113ca576113ca615b36565b60009182526020822001546001600160a01b031691505b8381101561147757600061143f600e838154811061140157611401615b36565b60009182526020808320909101546001600160a01b03871683526004825260408084208e855290925291205485908c906001600160401b031661379d565b506000818152600f6020526040902054909150156114665750600198975050505050505050565b5061147081615a9e565b90506113e1565b50508061148390615a9e565b90506113ae565b50600095945050505050565b61149e612e82565b6114a6612dcc565b6002546001600160a01b03166114cf5760405163c1f0c0a160e01b815260040160405180910390fd5b600b546001600160601b03166114f857604051631e9acf1760e31b815260040160405180910390fd5b600b80546001600160601b031690819060006115148380615a22565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555080600a60008282829054906101000a90046001600160601b031661155c9190615a22565b82546001600160601b039182166101009390930a92830291909202199091161790555060025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906115b190859085906004016155e6565b602060405180830381600087803b1580156115cb57600080fd5b505af11580156115df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160391906150f0565b61162057604051631e9acf1760e31b815260040160405180910390fd5b5050565b61162c612dcc565b61163581613589565b15611655578060405163ac8a27ef60e01b8152600401610a50919061559f565b601180546001810182556000919091527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c680180546001600160a01b0319166001600160a01b0383161790556040517fb7cabbfc11e66731fc77de0444614282023bcbd41d16781c753a431d0af01625906116d090839061559f565b60405180910390a150565b6116e3612dcc565b6002546001600160a01b03161561170d57604051631688c53760e11b815260040160405180910390fd5b600280546001600160a01b039384166001600160a01b03199182161790915560038054929093169116179055565b6001546001600160a01b0316331461178e5760405162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b6044820152606401610a50565b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6117ed612dcc565b60408051808201825260009161181c9190859060029083908390808284376000920191909152506127a3915050565b6000818152600d602052604090205490915060ff161561185257604051634a0b8fa760e01b815260048101829052602401610a50565b60408051808201825260018082526001600160401b0385811660208085019182526000878152600d9091528581209451855492516001600160481b031990931690151568ffffffffffffffff00191617610100929093169190910291909117909255600e805491820181559091527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd01829055517f9b911b2c240bfbef3b6a8f7ed6ee321d1258bb2a3fe6becab52ac1cd3210afd390610a179083908590615629565b61191d612dcc565b600a544790600160601b90046001600160601b03168181111561195d576040516354ced18160e11b81526004810182905260248101839052604401610a50565b81811015610c4957600061197182846159e6565b90506000846001600160a01b03168260405160006040518083038185875af1925050503d80600081146119c0576040519150601f19603f3d011682016040523d82523d6000602084013e6119c5565b606091505b50509050806119e75760405163950b247960e01b815260040160405180910390fd5b7f4aed7c8eed0496c8c19ea2681fcca25741c1602342e38b045d9f1e8e905d2e9c8583604051611a189291906155b3565b60405180910390a15050505050565b611a2f612e82565b6000818152600560205260409020546001600160a01b0316611a6457604051630fb532db60e11b815260040160405180910390fd5b60008181526006602052604090208054600160601b90046001600160601b0316903490600c611a938385615991565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555034600a600c8282829054906101000a90046001600160601b0316611adb9190615991565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550817f7603b205d03651ee812f803fccde89f1012e545a9c99f0abfea9cedd0fd8e902823484611b2e9190615932565b604080519283526020830191909152015b60405180910390a25050565b6000611b55612e82565b602080830135600081815260059092526040909120546001600160a01b0316611b9157604051630fb532db60e11b815260040160405180910390fd5b33600090815260046020908152604080832084845291829052909120546001600160401b031680611bd95782336040516379bfd40160e01b8152600401610a509291906156c8565b600c5461ffff16611bf060608701604088016152b2565b61ffff161080611c13575060c8611c0d60608701604088016152b2565b61ffff16115b15611c5957611c2860608601604087016152b2565b600c5460405163539c34bb60e11b815261ffff92831660048201529116602482015260c86044820152606401610a50565b600c5462010000900463ffffffff16611c7860808701606088016153b5565b63ffffffff161115611cc857611c9460808601606087016153b5565b600c54604051637aebf00f60e11b815263ffffffff9283166004820152620100009091049091166024820152604401610a50565b6101f4611cdb60a08701608088016153b5565b63ffffffff161115611d2157611cf760a08601608087016153b5565b6040516311ce1afb60e21b815263ffffffff90911660048201526101f46024820152604401610a50565b611d2a81615ab9565b90506000611d3b863533868561379d565b90955090506000611d5f611d5a611d5560a08a018a615840565b613816565b613893565b905085611d6a613904565b86611d7b60808b0160608c016153b5565b611d8b60a08c0160808d016153b5565b3386604051602001611da3979695949392919061574b565b60405160208183030381529060405280519060200120600f600088815260200190815260200160002081905550336001600160a01b03168588600001357feb0e3652e0f44f417695e6e90f2f42c99b65cd7169074c5a654b16b9748c3a4e89868c6040016020810190611e1691906152b2565b8d6060016020810190611e2991906153b5565b8e6080016020810190611e3c91906153b5565b89604051611e4f9695949392919061570c565b60405180910390a450506000928352602091909152604090912080546001600160401b0319166001600160401b039092169190911790555b919050565b6000611e96612e82565b6007546001600160401b031633611eae6001436159e6565b6040516001600160601b0319606093841b81166020830152914060348201523090921b1660548201526001600160c01b031960c083901b16606882015260700160408051601f1981840301815291905280516020909101209150611f1381600161594a565b600780546001600160401b0319166001600160401b03928316179055604080516000808252608082018352602080830182815283850183815260608086018581528a86526006855287862093518454935191516001600160601b039182166001600160c01b031990951694909417600160601b9190921602176001600160c01b0316600160c01b9290981691909102969096179055835194850184523385528481018281528585018481528884526005835294909220855181546001600160a01b03199081166001600160a01b0392831617835593516001830180549095169116179092559251805192949391926120119260028501920190614cc0565b5061202191506008905084613994565b50827f1d3015d7ba850fa198dc7b1a3f5d42779313a681035f77c8c03764c61005518d33604051612052919061559f565b60405180910390a2505090565b612067612e82565b6002546001600160a01b03163314612092576040516344b0e3c360e01b815260040160405180910390fd5b602081146120b357604051638129bbcd60e01b815260040160405180910390fd5b60006120c18284018461510d565b6000818152600560205260409020549091506001600160a01b03166120f957604051630fb532db60e11b815260040160405180910390fd5b600081815260066020526040812080546001600160601b0316918691906121208385615991565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555084600a60008282829054906101000a90046001600160601b03166121689190615991565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550817f1ced9348ff549fceab2ac57cd3a9de38edaaab274b725ee82c23e8fc8c4eec7a8287846121bb9190615932565b6040805192835260208301919091520160405180910390a2505050505050565b6121e3612dcc565b60c861ffff8a16111561221d5760405163539c34bb60e11b815261ffff8a1660048201819052602482015260c86044820152606401610a50565b60008513612241576040516321ea67b360e11b815260048101869052602401610a50565b60008463ffffffff1611801561226357508363ffffffff168363ffffffff1610155b15612291576040516313c06e5960e11b815263ffffffff808516600483015285166024820152604401610a50565b604080516101208101825261ffff8b1680825263ffffffff808c16602084018190526000848601528b8216606085018190528b8316608086018190528a841660a08701819052938a1660c0870181905260ff808b1660e08901819052908a16610100909801889052600c8054600160c01b90990260ff60c01b19600160b81b9093029290921661ffff60b81b19600160981b90940263ffffffff60981b19600160781b9099029890981667ffffffffffffffff60781b19600160581b90960263ffffffff60581b19600160381b9098029790971668ffffffffffffffffff60301b196201000090990265ffffffffffff19909c16909a179a909a1796909616979097179390931791909116959095179290921793909316929092179190911790556010869055517f2c6b6b12413678366b05b145c5f00745bdd00e739131ab5de82484a50c9d78b690612445908b908b908b908b908b908b908b908b908b9061ffff99909916895263ffffffff97881660208a0152958716604089015293861660608801526080870192909252841660a086015290921660c084015260ff91821660e0840152166101008201526101200190565b60405180910390a1505050505050505050565b612460612dcc565b6000818152600560205260409020546001600160a01b03168061249657604051630fb532db60e11b815260040160405180910390fd5b6116208282612ead565b606060006124ae60086139a0565b90508084106124d057604051631390f2a160e01b815260040160405180910390fd5b60006124dc8486615932565b9050818111806124ea575083155b6124f457806124f6565b815b9050600061250486836159e6565b9050806001600160401b0381111561251e5761251e615b4c565b604051908082528060200260200182016040528015612547578160200160208202803683370190505b50935060005b818110156125975761256a6125628883615932565b6008906139aa565b85828151811061257c5761257c615b36565b602090810291909101015261259081615a9e565b905061254d565b505050505b92915050565b6125aa612e82565b6000818152600560205260409020546001600160a01b0316806125e057604051630fb532db60e11b815260040160405180910390fd5b6000828152600560205260409020600101546001600160a01b03163314612637576000828152600560205260409081902060010154905163d084e97560e01b8152610a50916001600160a01b03169060040161559f565b600082815260056020526040908190208054336001600160a01b031991821681178355600190920180549091169055905183917fd4114ab6e9af9f597c52041f32d62dc57c5c4e4c0d4427006069635e216c938691611b3f9185916155cc565b816126a181612e21565b6126a9612e82565b60008381526005602052604090206002018054606414156126dd576040516305a48e0f60e01b815260040160405180910390fd5b6001600160a01b038316600090815260046020908152604080832087845291829052909120546001600160401b031615612718575050505050565b600085815260208281526040808320805460016001600160401b0319909116811790915585549081018655858452919092200180546001600160a01b0319166001600160a01b0387161790555185907f1e980d04aa7648e205713e5e8ea3808672ac163d10936d36f91b2c88ac1575e19061279490879061559f565b60405180910390a25050505050565b6000816040516020016127b69190615608565b604051602081830303815290604052805190602001209050919050565b816127dd81612e21565b6127e5612e82565b6127ee83611386565b1561280c57604051631685ecdd60e31b815260040160405180910390fd5b6001600160a01b03821660009081526004602090815260408083208684529091529020546001600160401b031661285a5782826040516379bfd40160e01b8152600401610a509291906156c8565b6000838152600560209081526040808320600201805482518185028101850190935280835291929091908301828280156128bd57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161289f575b505050505090506000600182516128d491906159e6565b905060005b82518110156129de57846001600160a01b03168382815181106128fe576128fe615b36565b60200260200101516001600160a01b031614156129ce57600083838151811061292957612929615b36565b602002602001015190508060056000898152602001908152602001600020600201838154811061295b5761295b615b36565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394909416939093179092558881526005909152604090206002018054806129a6576129a6615b20565b600082815260209020810160001990810180546001600160a01b0319169055019055506129de565b6129d781615a9e565b90506128d9565b506001600160a01b03841660009081526004602090815260408083208884529091529081902080546001600160401b03191690555185907f32158c6058347c1601b2d12bc696ac6901d8a9a9aa3ba10c27ab0a983e8425a79061279490879061559f565b600e8181548110612a5257600080fd5b600091825260209091200154905081565b81612a6d81612e21565b612a75612e82565b600083815260056020526040902060018101546001600160a01b03848116911614612af4576001810180546001600160a01b0319166001600160a01b03851617905560405184907f21a4dad170a6bf476c31bbcf4a16628295b0e450672eec25d7c93308e05344a190612aeb90339087906155cc565b60405180910390a25b50505050565b600081815260056020526040812054819081906001600160a01b0316606081612b3657604051630fb532db60e11b815260040160405180910390fd5b600086815260066020908152604080832054600583529281902060020180548251818502810185019093528083526001600160601b0380861695600160601b810490911694600160c01b9091046001600160401b0316938893929091839190830182828015612bce57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612bb0575b505050505090509450945094509450945091939590929450565b612bf0612dcc565b6002546001600160a01b0316612c195760405163c1f0c0a160e01b815260040160405180910390fd5b6002546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612c4a90309060040161559f565b60206040518083038186803b158015612c6257600080fd5b505afa158015612c76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c9a9190615126565b600a549091506001600160601b031681811115612cd4576040516354ced18160e11b81526004810182905260248101839052604401610a50565b81811015610c49576000612ce882846159e6565b60025460405163a9059cbb60e01b81529192506001600160a01b03169063a9059cbb90612d1b90879085906004016155b3565b602060405180830381600087803b158015612d3557600080fd5b505af1158015612d49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d6d91906150f0565b612d8a57604051631f01ff1360e21b815260040160405180910390fd5b7f59bfc682b673f8cbf945f1e454df9334834abf7dfe7f92237ca29ecb9b4366008482604051610bf89291906155b3565b612dc3612dcc565b610a59816139b6565b6000546001600160a01b03163314612e1f5760405162461bcd60e51b815260206004820152601660248201527527b7363c9031b0b63630b1363290313c9037bbb732b960511b6044820152606401610a50565b565b6000818152600560205260409020546001600160a01b031680612e5757604051630fb532db60e11b815260040160405180910390fd5b336001600160a01b038216146116205780604051636c51fda960e11b8152600401610a50919061559f565b600c54600160301b900460ff1615612e1f5760405163769dd35360e11b815260040160405180910390fd5b600080612eb9846135f5565b60025491935091506001600160a01b031615801590612ee057506001600160601b03821615155b15612f8f5760025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90612f209086906001600160601b038716906004016155b3565b602060405180830381600087803b158015612f3a57600080fd5b505af1158015612f4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f7291906150f0565b612f8f57604051631e9acf1760e31b815260040160405180910390fd5b6000836001600160a01b0316826001600160601b031660405160006040518083038185875af1925050503d8060008114612fe5576040519150601f19603f3d011682016040523d82523d6000602084013e612fea565b606091505b505090508061300c5760405163950b247960e01b815260040160405180910390fd5b604080516001600160a01b03861681526001600160601b03808616602083015284169181019190915285907f8c74ce8b8cf87f5eb001275c8be27eb34ea2b62bfab6814fcc62192bb63e81c490606001612794565b6040805160a0810182526000606082018181526080830182905282526020820181905291810191909152600061309a84600001516127a3565b6000818152600d602090815260409182902082518084019093525460ff811615158084526101009091046001600160401b031691830191909152919250906130f857604051631dfd6e1360e21b815260048101839052602401610a50565b600082866080015160405160200161311a929190918252602082015260400190565b60408051601f1981840301815291815281516020928301206000818152600f9093529120549091508061316057604051631b44092560e11b815260040160405180910390fd5b85516020808801516040808a015160608b015160808c015160a08d0151935161318f978a979096959101615797565b6040516020818303038152906040528051906020012081146131c45760405163354a450b60e21b815260040160405180910390fd5b60006131d38760000151613a5a565b9050806132ab578651604051631d2827a760e31b81526001600160401b0390911660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e9413d389060240160206040518083038186803b15801561324557600080fd5b505afa158015613259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061327d9190615126565b9050806132ab57865160405163175dadad60e01b81526001600160401b039091166004820152602401610a50565b60008860800151826040516020016132cd929190918252602082015260400190565b6040516020818303038152906040528051906020012060001c905060006132f48a83613b3c565b604080516060810182529788526020880196909652948601949094525092979650505050505050565b6000816001600160401b03163a111561336357821561334657506001600160401b03811661259c565b3a8260405163435e532d60e11b8152600401610a50929190615629565b503a92915050565b6000806000631fe543e360e01b868560405160240161338b9291906156f3565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252600c805460ff60301b1916600160301b1790559086015160808701519192506133ef9163ffffffff9091169083613ba7565b600c805460ff60301b191690559695505050505050565b6000821561342057613419858584613bf3565b905061342e565b61342b858584613d04565b90505b949350505050565b600081815260066020526040902082156134f55780546001600160601b03600160601b909104811690851681101561348157604051631e9acf1760e31b815260040160405180910390fd5b61348b8582615a22565b8254600160601b600160c01b031916600160601b6001600160601b039283168102919091178455600b805488939192600c926134cb928692900416615991565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555050612af4565b80546001600160601b0390811690851681101561352557604051631e9acf1760e31b815260040160405180910390fd5b61352f8582615a22565b82546001600160601b0319166001600160601b03918216178355600b8054879260009161355e91859116615991565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505050505050565b601154600090815b818110156135eb57836001600160a01b0316601182815481106135b6576135b6615b36565b6000918252602090912001546001600160a01b031614156135db575060019392505050565b6135e481615a9e565b9050613591565b5060009392505050565b60008181526005602090815260408083206006909252822054600290910180546001600160601b0380841694600160601b90940416925b81811015613697576004600084838154811061364a5761364a615b36565b60009182526020808320909101546001600160a01b031683528281019390935260409182018120898252909252902080546001600160401b031916905561369081615a9e565b905061362c565b50600085815260056020526040812080546001600160a01b031990811682556001820180549091169055906136cf6002830182614d25565b50506000858152600660205260408120556136eb600886613eed565b506001600160601b0384161561373e57600a80548591906000906137199084906001600160601b0316615a22565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505b6001600160601b038316156137965782600a600c8282829054906101000a90046001600160601b03166137719190615a22565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505b5050915091565b6040805160208082018790526001600160a01b03959095168183015260608101939093526001600160401b03919091166080808401919091528151808403909101815260a08301825280519084012060c083019490945260e0808301859052815180840390910181526101009092019052805191012091565b6040805160208101909152600081528161383f575060408051602081019091526000815261259c565b63125fa26760e31b6138518385615a42565b6001600160e01b0319161461387957604051632923fee760e11b815260040160405180910390fd5b6138868260048186615908565b810190610fcd919061513f565b60607f92fd13387c7fe7befbc38d303d6468778fb9731bc4583f17d92989c6fcfdeaaa826040516024016138cc91511515815260200190565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915292915050565b60004661391081613ef9565b1561398d5760646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561394f57600080fd5b505afa158015613963573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139879190615126565b91505090565b4391505090565b6000610fcd8383613f1c565b600061259c825490565b6000610fcd8383613f6b565b6001600160a01b038116331415613a095760405162461bcd60e51b815260206004820152601760248201527621b0b73737ba103a3930b739b332b9103a379039b2b63360491b6044820152606401610a50565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600046613a6681613ef9565b15613b2d57610100836001600160401b0316613a80613904565b613a8a91906159e6565b1180613aa65750613a99613904565b836001600160401b031610155b15613ab45750600092915050565b6040516315a03d4160e11b81526001600160401b0384166004820152606490632b407a82906024015b60206040518083038186803b158015613af557600080fd5b505afa158015613b09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fcd9190615126565b50506001600160401b03164090565b6000613b708360000151846020015185604001518660600151868860a001518960c001518a60e001518b6101000151613f95565b60038360200151604051602001613b889291906156df565b60408051601f1981840301815291905280516020909101209392505050565b60005a611388811015613bb957600080fd5b611388810390508460408204820311613bd157600080fd5b50823b613bdd57600080fd5b60008083516020850160008789f1949350505050565b600080613c366000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506141b192505050565b905060005a600c54613c56908890600160581b900463ffffffff16615932565b613c6091906159e6565b613c6a90866159c7565b600c54909150600090613c8f90600160781b900463ffffffff1664e8d4a510006159c7565b90508415613cdb57600c548190606490600160b81b900460ff16613cb38587615932565b613cbd91906159c7565b613cc791906159b3565b613cd19190615932565b9350505050610fcd565b600c548190606490613cf790600160b81b900460ff168261596c565b60ff16613cb38587615932565b600080613d0f61427f565b905060008113613d35576040516321ea67b360e11b815260048101829052602401610a50565b6000613d776000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506141b192505050565b9050600082825a600c54613d99908b90600160581b900463ffffffff16615932565b613da391906159e6565b613dad90896159c7565b613db79190615932565b613dc990670de0b6b3a76400006159c7565b613dd391906159b3565b600c54909150600090613dfc9063ffffffff600160981b8204811691600160781b9004166159fd565b613e119063ffffffff1664e8d4a510006159c7565b9050600084613e2883670de0b6b3a76400006159c7565b613e3291906159b3565b905060008715613e7357600c548290606490613e5890600160c01b900460ff16876159c7565b613e6291906159b3565b613e6c9190615932565b9050613eb3565b600c548290606490613e8f90600160c01b900460ff168261596c565b613e9c9060ff16876159c7565b613ea691906159b3565b613eb09190615932565b90505b6b033b2e3c9fd0803ce8000000811115613ee05760405163e80fa38160e01b815260040160405180910390fd5b9998505050505050505050565b6000610fcd838361434e565b600061a4b1821480613f0d575062066eed82145b8061259c57505062066eee1490565b6000818152600183016020526040812054613f635750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561259c565b50600061259c565b6000826000018281548110613f8257613f82615b36565b9060005260206000200154905092915050565b613f9e89614441565b613fe75760405162461bcd60e51b815260206004820152601a6024820152797075626c6963206b6579206973206e6f74206f6e20637572766560301b6044820152606401610a50565b613ff088614441565b6140345760405162461bcd60e51b815260206004820152601560248201527467616d6d61206973206e6f74206f6e20637572766560581b6044820152606401610a50565b61403d83614441565b6140895760405162461bcd60e51b815260206004820152601d60248201527f6347616d6d615769746e657373206973206e6f74206f6e2063757276650000006044820152606401610a50565b61409282614441565b6140de5760405162461bcd60e51b815260206004820152601c60248201527f73486173685769746e657373206973206e6f74206f6e206375727665000000006044820152606401610a50565b6140ea878a8887614504565b6141325760405162461bcd60e51b81526020600482015260196024820152786164647228632a706b2b732a6729213d5f755769746e65737360381b6044820152606401610a50565b600061413e8a87614627565b90506000614151898b878b86898961468b565b90506000614162838d8d8a866147aa565b9050808a146141a35760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b210383937b7b360991b6044820152606401610a50565b505050505050505050505050565b6000466141bd81613ef9565b156141fc57606c6001600160a01b031663c6f7de0e6040518163ffffffff1660e01b815260040160206040518083038186803b158015613af557600080fd5b614205816147ea565b1561427657600f602160991b016001600160a01b03166349948e0e84604051806080016040528060488152602001615b866048913960405160200161424b9291906154f5565b6040516020818303038152906040526040518263ffffffff1660e01b8152600401613add9190615640565b50600092915050565b600c5460035460408051633fabe5a360e21b81529051600093600160381b900463ffffffff169284926001600160a01b039091169163feaf968c9160048082019260a092909190829003018186803b1580156142da57600080fd5b505afa1580156142ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061431291906153d0565b50919550909250505063ffffffff82161580159061433e575061433581426159e6565b8263ffffffff16105b156143495760105492505b505090565b600081815260018301602052604081205480156144375760006143726001836159e6565b8554909150600090614386906001906159e6565b90508181146143eb5760008660000182815481106143a6576143a6615b36565b90600052602060002001549050808760000184815481106143c9576143c9615b36565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806143fc576143fc615b20565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061259c565b600091505061259c565b80516000906401000003d0191161448f5760405162461bcd60e51b8152602060048201526012602482015271696e76616c696420782d6f7264696e61746560701b6044820152606401610a50565b60208201516401000003d019116144dd5760405162461bcd60e51b8152602060048201526012602482015271696e76616c696420792d6f7264696e61746560701b6044820152606401610a50565b60208201516401000003d0199080096144fd8360005b6020020151614824565b1492915050565b60006001600160a01b03821661454a5760405162461bcd60e51b815260206004820152600b60248201526a626164207769746e65737360a81b6044820152606401610a50565b60208401516000906001161561456157601c614564565b601b5b9050600070014551231950b75fc4402da1732fc9bebe1985876000602002015109865170014551231950b75fc4402da1732fc9bebe19918203925060009190890987516040805160008082526020820180845287905260ff88169282019290925260608101929092526080820183905291925060019060a0016020604051602081039080840390855afa1580156145ff573d6000803e3d6000fd5b5050604051601f1901516001600160a01b039081169088161495505050505050949350505050565b61462f614d43565b61465c600184846040516020016146489392919061557e565b604051602081830303815290604052614848565b90505b61466881614441565b61259c5780516040805160208101929092526146849101614648565b905061465f565b614693614d43565b825186516401000003d01990819006910614156146f25760405162461bcd60e51b815260206004820152601e60248201527f706f696e747320696e2073756d206d7573742062652064697374696e637400006044820152606401610a50565b6146fd878988614896565b6147425760405162461bcd60e51b8152602060048201526016602482015275119a5c9cdd081b5d5b0818da1958dac819985a5b195960521b6044820152606401610a50565b61474d848685614896565b6147935760405162461bcd60e51b815260206004820152601760248201527614d958dbdb99081b5d5b0818da1958dac819985a5b1959604a1b6044820152606401610a50565b61479e8684846149be565b98975050505050505050565b6000600286868685876040516020016147c896959493929190615524565b60408051601f1981840301815291905280516020909101209695505050505050565b6000600a8214806147fc57506101a482145b80614809575062aa37dc82145b80614815575061210582145b8061259c57505062014a331490565b6000806401000003d01980848509840990506401000003d019600782089392505050565b614850614d43565b61485982614a81565b815261486e6148698260006144f3565b614abc565b602082018190526002900660011415611e87576020810180516401000003d019039052919050565b6000826148d35760405162461bcd60e51b815260206004820152600b60248201526a3d32b9379039b1b0b630b960a91b6044820152606401610a50565b835160208501516000906148e990600290615ae0565b156148f557601c6148f8565b601b5b9050600070014551231950b75fc4402da1732fc9bebe198387096040805160008082526020820180845281905260ff86169282019290925260608101869052608081018390529192509060019060a0016020604051602081039080840390855afa15801561496a573d6000803e3d6000fd5b50505060206040510351905060008660405160200161498991906154e3565b60408051601f1981840301815291905280516020909101206001600160a01b0392831692169190911498975050505050505050565b6149c6614d43565b8351602080860151855191860151600093849384936149e793909190614adc565b919450925090506401000003d019858209600114614a435760405162461bcd60e51b815260206004820152601960248201527834b73b2d1036bab9ba1031329034b73b32b939b29037b3103d60391b6044820152606401610a50565b60405180604001604052806401000003d01980614a6257614a62615b0a565b87860981526020016401000003d0198785099052979650505050505050565b805160208201205b6401000003d0198110611e8757604080516020808201939093528151808203840181529082019091528051910120614a89565b600061259c826002614ad56401000003d0196001615932565b901c614bbc565b60008080600180826401000003d019896401000003d019038808905060006401000003d0198b6401000003d019038a0890506000614b1c83838585614c53565b9098509050614b2d88828e88614c77565b9098509050614b3e88828c87614c77565b90985090506000614b518d878b85614c77565b9098509050614b6288828686614c53565b9098509050614b7388828e89614c77565b9098509050818114614ba8576401000003d019818a0998506401000003d01982890997506401000003d0198183099650614bac565b8196505b5050505050509450945094915050565b600080614bc7614d61565b6020808252818101819052604082015260608101859052608081018490526401000003d01960a0820152614bf9614d7f565b60208160c0846005600019fa925082614c495760405162461bcd60e51b81526020600482015260126024820152716269674d6f64457870206661696c7572652160701b6044820152606401610a50565b5195945050505050565b6000806401000003d0198487096401000003d0198487099097909650945050505050565b600080806401000003d019878509905060006401000003d01987876401000003d019030990506401000003d0198183086401000003d01986890990999098509650505050505050565b828054828255906000526020600020908101928215614d15579160200282015b82811115614d1557825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614ce0565b50614d21929150614d9d565b5090565b5080546000825590600052602060002090810190610a599190614d9d565b60405180604001604052806002906020820280368337509192915050565b6040518060c001604052806006906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b5b80821115614d215760008155600101614d9e565b8035611e8781615b62565b806040810183101561259c57600080fd5b600082601f830112614ddf57600080fd5b604051604081018181106001600160401b0382111715614e0157614e01615b4c565b8060405250808385604086011115614e1857600080fd5b60005b6002811015614e3a578135835260209283019290910190600101614e1b565b509195945050505050565b8035611e8781615b77565b600060c08284031215614e6257600080fd5b614e6a61588d565b9050614e7582614f64565b815260208083013581830152614e8d60408401614f50565b6040830152614e9e60608401614f50565b60608301526080830135614eb181615b62565b608083015260a08301356001600160401b0380821115614ed057600080fd5b818501915085601f830112614ee457600080fd5b813581811115614ef657614ef6615b4c565b614f08601f8201601f191685016158d8565b91508082528684828501011115614f1e57600080fd5b80848401858401376000848284010152508060a085015250505092915050565b803561ffff81168114611e8757600080fd5b803563ffffffff81168114611e8757600080fd5b80356001600160401b0381168114611e8757600080fd5b803560ff81168114611e8757600080fd5b805169ffffffffffffffffffff81168114611e8757600080fd5b600060208284031215614fb857600080fd5b8135610fcd81615b62565b60008060408385031215614fd657600080fd5b8235614fe181615b62565b91506020830135614ff181615b62565b809150509250929050565b6000806000806060858703121561501257600080fd5b843561501d81615b62565b93506020850135925060408501356001600160401b038082111561504057600080fd5b818701915087601f83011261505457600080fd5b81358181111561506357600080fd5b88602082850101111561507557600080fd5b95989497505060200194505050565b60006040828403121561509657600080fd5b610fcd8383614dbd565b600080606083850312156150b357600080fd5b6150bd8484614dbd565b91506150cb60408401614f64565b90509250929050565b6000604082840312156150e657600080fd5b610fcd8383614dce565b60006020828403121561510257600080fd5b8151610fcd81615b77565b60006020828403121561511f57600080fd5b5035919050565b60006020828403121561513857600080fd5b5051919050565b60006020828403121561515157600080fd5b604051602081018181106001600160401b038211171561517357615173615b4c565b604052823561518181615b77565b81529392505050565b60008060008385036101e08112156151a157600080fd5b6101a0808212156151b157600080fd5b6151b96158b5565b91506151c58787614dce565b82526151d48760408801614dce565b60208301526080860135604083015260a0860135606083015260c0860135608083015261520360e08701614db2565b60a083015261010061521788828901614dce565b60c084015261522a886101408901614dce565b60e0840152610180870135908301529093508401356001600160401b0381111561525357600080fd5b61525f86828701614e50565b92505061526f6101c08501614e45565b90509250925092565b60006020828403121561528a57600080fd5b81356001600160401b038111156152a057600080fd5b820160c08185031215610fcd57600080fd5b6000602082840312156152c457600080fd5b610fcd82614f3e565b60008060008060008060008060006101208a8c0312156152ec57600080fd5b6152f58a614f3e565b985061530360208b01614f50565b975061531160408b01614f50565b965061531f60608b01614f50565b955060808a0135945061533460a08b01614f50565b935061534260c08b01614f50565b925061535060e08b01614f7b565b915061535f6101008b01614f7b565b90509295985092959850929598565b6000806040838503121561538157600080fd5b823591506020830135614ff181615b62565b600080604083850312156153a657600080fd5b50508035926020909101359150565b6000602082840312156153c757600080fd5b610fcd82614f50565b600080600080600060a086880312156153e857600080fd5b6153f186614f8c565b945060208601519350604086015192506060860151915061541460808701614f8c565b90509295509295909350565b600081518084526020808501945080840160005b838110156154595781516001600160a01b031687529582019590820190600101615434565b509495945050505050565b8060005b6002811015612af4578151845260209384019390910190600101615468565b600081518084526020808501945080840160005b838110156154595781518752958201959082019060010161549b565b600081518084526154cf816020860160208601615a72565b601f01601f19169290920160200192915050565b6154ed8183615464565b604001919050565b60008351615507818460208801615a72565b83519083019061551b818360208801615a72565b01949350505050565b8681526155346020820187615464565b6155416060820186615464565b61554e60a0820185615464565b61555b60e0820184615464565b60609190911b6001600160601b0319166101208201526101340195945050505050565b83815261558e6020820184615464565b606081019190915260800192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039290921682526001600160601b0316602082015260400190565b6040810161259c8284615464565b602081526000610fcd6020830184615487565b9182526001600160401b0316602082015260400190565b602081526000610fcd60208301846154b7565b6020815260ff82511660208201526020820151604082015260018060a01b0360408301511660608201526000606083015160c0608084015261569860e0840182615420565b60808501516001600160601b0390811660a0868101919091529095015190941660c0909301929092525090919050565b9182526001600160a01b0316602082015260400190565b82815260608101610fcd6020830184615464565b82815260406020820152600061342e6040830184615487565b86815285602082015261ffff85166040820152600063ffffffff808616606084015280851660808401525060c060a083015261479e60c08301846154b7565b878152602081018790526040810186905263ffffffff8581166060830152841660808201526001600160a01b03831660a082015260e060c08201819052600090613ee0908301846154b7565b8781526001600160401b03871660208201526040810186905263ffffffff8581166060830152841660808201526001600160a01b03831660a082015260e060c08201819052600090613ee0908301846154b7565b6001600160601b038681168252851660208201526001600160401b03841660408201526001600160a01b038316606082015260a06080820181905260009061583590830184615420565b979650505050505050565b6000808335601e1984360301811261585757600080fd5b8301803591506001600160401b0382111561587157600080fd5b60200191503681900382131561588657600080fd5b9250929050565b60405160c081016001600160401b03811182821017156158af576158af615b4c565b60405290565b60405161012081016001600160401b03811182821017156158af576158af615b4c565b604051601f8201601f191681016001600160401b038111828210171561590057615900615b4c565b604052919050565b6000808585111561591857600080fd5b8386111561592557600080fd5b5050820193919092039150565b6000821982111561594557615945615af4565b500190565b60006001600160401b0380831681851680830382111561551b5761551b615af4565b600060ff821660ff84168060ff0382111561598957615989615af4565b019392505050565b60006001600160601b0382811684821680830382111561551b5761551b615af4565b6000826159c2576159c2615b0a565b500490565b60008160001904831182151516156159e1576159e1615af4565b500290565b6000828210156159f8576159f8615af4565b500390565b600063ffffffff83811690831681811015615a1a57615a1a615af4565b039392505050565b60006001600160601b0383811690831681811015615a1a57615a1a615af4565b6001600160e01b03198135818116916004851015615a6a5780818660040360031b1b83161692505b505092915050565b60005b83811015615a8d578181015183820152602001615a75565b83811115612af45750506000910152565b6000600019821415615ab257615ab2615af4565b5060010190565b60006001600160401b0380831681811415615ad657615ad6615af4565b6001019392505050565b600082615aef57615aef615b0a565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610a5957600080fd5b8015158114610a5957600080fdfe307866666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666a164736f6c6343000806000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"blockhashStore\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"internalBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"externalBalance\",\"type\":\"uint256\"}],\"name\":\"BalanceInvariantViolated\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNum\",\"type\":\"uint256\"}],\"name\":\"BlockhashNotInStore\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorNotRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedToSendNative\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedToTransferLink\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"have\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"want\",\"type\":\"uint32\"}],\"name\":\"GasLimitTooBig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"gasPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxGas\",\"type\":\"uint256\"}],\"name\":\"GasPriceExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectCommitment\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IndexOutOfRange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"have\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"want\",\"type\":\"uint256\"}],\"name\":\"InsufficientGasForConsumer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCalldata\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"InvalidConsumer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExtraArgsTag\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"linkWei\",\"type\":\"int256\"}],\"name\":\"InvalidLinkWeiPrice\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"have\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"min\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"max\",\"type\":\"uint16\"}],\"name\":\"InvalidRequestConfirmations\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSubscription\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkAlreadySet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"flatFeeLinkDiscountPPM\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"flatFeeNativePPM\",\"type\":\"uint32\"}],\"name\":\"LinkDiscountTooHigh\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkNotSet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"have\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"max\",\"type\":\"uint32\"}],\"name\":\"MsgDataTooBig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proposedOwner\",\"type\":\"address\"}],\"name\":\"MustBeRequestedOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"MustBeSubOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoCorrespondingRequest\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"}],\"name\":\"NoSuchProvingKey\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"have\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"want\",\"type\":\"uint32\"}],\"name\":\"NumWordsTooBig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableFromLink\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PaymentTooLarge\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PendingRequestExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"}],\"name\":\"ProvingKeyAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Reentrant\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyConsumers\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"stalenessSeconds\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"gasAfterPaymentCalculation\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"int256\",\"name\":\"fallbackWeiPerUnitLink\",\"type\":\"int256\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeNativePPM\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeLinkDiscountPPM\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"nativePremiumPercentage\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"linkPremiumPercentage\",\"type\":\"uint8\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorDeregistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorRegistered\",\"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\":false,\"internalType\":\"address\",\"name\":\"newCoordinator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"MigrationCompleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"NativeFundsRecovered\",\"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\":\"keyHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"maxGas\",\"type\":\"uint64\"}],\"name\":\"ProvingKeyDeregistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"maxGas\",\"type\":\"uint64\"}],\"name\":\"ProvingKeyRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"outputSeed\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"payment\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"nativePayment\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"onlyPremium\",\"type\":\"bool\"}],\"name\":\"RandomWordsFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"preSeed\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RandomWordsRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountLink\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountNative\",\"type\":\"uint256\"}],\"name\":\"SubscriptionCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"SubscriptionConsumerAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"SubscriptionConsumerRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"SubscriptionCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"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\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldNativeBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newNativeBalance\",\"type\":\"uint256\"}],\"name\":\"SubscriptionFundedWithNative\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"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\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"SubscriptionOwnerTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BLOCKHASH_STORE\",\"outputs\":[{\"internalType\":\"contractBlockhashStoreInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"LINK\",\"outputs\":[{\"internalType\":\"contractLinkTokenInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"LINK_NATIVE_FEED\",\"outputs\":[{\"internalType\":\"contractAggregatorV3Interface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_CONSUMERS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_NUM_WORDS\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_REQUEST_CONFIRMATIONS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"acceptSubscriptionOwnerTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"addConsumer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"cancelSubscription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"createSubscription\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"deregisterMigratableCoordinator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"publicProvingKey\",\"type\":\"uint256[2]\"}],\"name\":\"deregisterProvingKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256[2]\",\"name\":\"pk\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"gamma\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"c\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"s\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"seed\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"uWitness\",\"type\":\"address\"},{\"internalType\":\"uint256[2]\",\"name\":\"cGammaWitness\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"sHashWitness\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"zInv\",\"type\":\"uint256\"}],\"internalType\":\"structVRF.Proof\",\"name\":\"proof\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"blockNum\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structVRFCoordinatorV2_5.RequestCommitment\",\"name\":\"rc\",\"type\":\"tuple\"},{\"internalType\":\"bool\",\"name\":\"onlyPremium\",\"type\":\"bool\"}],\"name\":\"fulfillRandomWords\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"payment\",\"type\":\"uint96\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"fundSubscriptionWithNative\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"startIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxCount\",\"type\":\"uint256\"}],\"name\":\"getActiveSubscriptionIds\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"getSubscription\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"balance\",\"type\":\"uint96\"},{\"internalType\":\"uint96\",\"name\":\"nativeBalance\",\"type\":\"uint96\"},{\"internalType\":\"uint64\",\"name\":\"reqCount\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"consumers\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"publicKey\",\"type\":\"uint256[2]\"}],\"name\":\"hashOfKey\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"newCoordinator\",\"type\":\"address\"}],\"name\":\"migrate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"ownerCancelSubscription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"pendingRequestExists\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"recoverFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"recoverNativeFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"registerMigratableCoordinator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"publicProvingKey\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint64\",\"name\":\"maxGas\",\"type\":\"uint64\"}],\"name\":\"registerProvingKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"removeConsumer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"uint16\",\"name\":\"requestConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structVRFV2PlusClient.RandomWordsRequest\",\"name\":\"req\",\"type\":\"tuple\"}],\"name\":\"requestRandomWords\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"requestSubscriptionOwnerTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_config\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"reentrancyLock\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"stalenessSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasAfterPaymentCalculation\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeNativePPM\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeLinkDiscountPPM\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"nativePremiumPercentage\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"linkPremiumPercentage\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_currentSubNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_fallbackWeiPerUnitLink\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"s_provingKeyHashes\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"s_provingKeys\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"exists\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"maxGas\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"s_requestCommitments\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_totalBalance\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_totalNativeBalance\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"stalenessSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasAfterPaymentCalculation\",\"type\":\"uint32\"},{\"internalType\":\"int256\",\"name\":\"fallbackWeiPerUnitLink\",\"type\":\"int256\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeNativePPM\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeLinkDiscountPPM\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"nativePremiumPercentage\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"linkPremiumPercentage\",\"type\":\"uint8\"}],\"name\":\"setConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"link\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"linkNativeFeed\",\"type\":\"address\"}],\"name\":\"setLINKAndLINKNativeFeed\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"withdrawNative\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x60a06040523480156200001157600080fd5b5060405162005de238038062005de2833981016040819052620000349162000183565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000d7565b50505060601b6001600160601b031916608052620001b5565b6001600160a01b038116331415620001325760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000602082840312156200019657600080fd5b81516001600160a01b0381168114620001ae57600080fd5b9392505050565b60805160601c615c07620001db6000396000818161055001526132280152615c076000f3fe60806040526004361061021c5760003560e01c80638402595e11610124578063b2a7cac5116100a6578063b2a7cac514610732578063bec4c08c14610752578063caf70c4a14610772578063cb63179714610792578063d98e620e146107b2578063da2f2610146107d2578063dac83d2914610831578063dc311dd314610851578063e72f6e3014610882578063ee9d2d38146108a2578063f2fde38b146108cf57600080fd5b80638402595e146105c757806386fe91c7146105e75780638da5cb5b1461060757806395b55cfc146106255780639b1c385e146106385780639d40a6fd14610658578063a21a23e414610690578063a4c0ed36146106a5578063a63e0bfb146106c5578063aa433aff146106e5578063aefb212f1461070557600080fd5b8063405b84fa116101ad578063405b84fa1461044e57806340d6bb821461046e57806341af6c871461049957806351cff8d9146104c95780635d06b4ab146104e957806364d51a2a14610509578063659827441461051e578063689c45171461053e57806372e9d5651461057257806379ba5097146105925780637a5a2aef146105a757600080fd5b806304104edb14610221578063043bd6ae14610243578063088070f51461026c57806308821d581461033a5780630ae095401461035a57806315c48b841461037a57806318e3dd27146103a25780631b6b6d23146103e15780632f622e6b1461040e578063301f42e91461042e575b600080fd5b34801561022d57600080fd5b5061024161023c366004614fd3565b6108ef565b005b34801561024f57600080fd5b5061025960105481565b6040519081526020015b60405180910390f35b34801561027857600080fd5b50600c546102dd9061ffff81169063ffffffff62010000820481169160ff600160301b8204811692600160381b8304811692600160581b8104821692600160781b8204831692600160981b83041691600160b81b8104821691600160c01b9091041689565b6040805161ffff909a168a5263ffffffff98891660208b01529615159689019690965293861660608801529185166080870152841660a08601529290921660c084015260ff91821660e08401521661010082015261012001610263565b34801561034657600080fd5b506102416103553660046150b1565b610a5c565b34801561036657600080fd5b5061024161037536600461539b565b610c06565b34801561038657600080fd5b5061038f60c881565b60405161ffff9091168152602001610263565b3480156103ae57600080fd5b50600a546103c990600160601b90046001600160601b031681565b6040516001600160601b039091168152602001610263565b3480156103ed57600080fd5b50600254610401906001600160a01b031681565b60405161026391906155cc565b34801561041a57600080fd5b50610241610429366004614fd3565b610c4e565b34801561043a57600080fd5b506103c96104493660046151b7565b610d9a565b34801561045a57600080fd5b5061024161046936600461539b565b611001565b34801561047a57600080fd5b506104846101f481565b60405163ffffffff9091168152602001610263565b3480156104a557600080fd5b506104b96104b436600461513a565b6113b3565b6040519015158152602001610263565b3480156104d557600080fd5b506102416104e4366004614fd3565b6114c3565b3480156104f557600080fd5b50610241610504366004614fd3565b611651565b34801561051557600080fd5b5061038f606481565b34801561052a57600080fd5b50610241610539366004614ff0565b611708565b34801561054a57600080fd5b506104017f000000000000000000000000000000000000000000000000000000000000000081565b34801561057e57600080fd5b50600354610401906001600160a01b031681565b34801561059e57600080fd5b50610241611768565b3480156105b357600080fd5b506102416105c23660046150cd565b611812565b3480156105d357600080fd5b506102416105e2366004614fd3565b611942565b3480156105f357600080fd5b50600a546103c9906001600160601b031681565b34801561061357600080fd5b506000546001600160a01b0316610401565b61024161063336600461513a565b611a54565b34801561064457600080fd5b506102596106533660046152a5565b611b78565b34801561066457600080fd5b50600754610678906001600160401b031681565b6040516001600160401b039091168152602001610263565b34801561069c57600080fd5b50610259611eb9565b3480156106b157600080fd5b506102416106c0366004615029565b61208c565b3480156106d157600080fd5b506102416106e03660046152fa565b612208565b3480156106f157600080fd5b5061024161070036600461513a565b612485565b34801561071157600080fd5b506107256107203660046153c0565b6124cd565b6040516102639190615643565b34801561073e57600080fd5b5061024161074d36600461513a565b6125cf565b34801561075e57600080fd5b5061024161076d36600461539b565b6126c4565b34801561077e57600080fd5b5061025961078d366004615101565b6127d0565b34801561079e57600080fd5b506102416107ad36600461539b565b612800565b3480156107be57600080fd5b506102596107cd36600461513a565b612a6f565b3480156107de57600080fd5b506108126107ed36600461513a565b600d6020526000908152604090205460ff81169061010090046001600160401b031682565b6040805192151583526001600160401b03909116602083015201610263565b34801561083d57600080fd5b5061024161084c36600461539b565b612a90565b34801561085d57600080fd5b5061087161086c36600461513a565b612b27565b604051610263959493929190615818565b34801561088e57600080fd5b5061024161089d366004614fd3565b612c15565b3480156108ae57600080fd5b506102596108bd36600461513a565b600f6020526000908152604090205481565b3480156108db57600080fd5b506102416108ea366004614fd3565b612de8565b6108f7612df9565b60115460005b81811015610a3457826001600160a01b03166011828154811061092257610922615b63565b6000918252602090912001546001600160a01b03161415610a2457601161094a600184615a13565b8154811061095a5761095a615b63565b600091825260209091200154601180546001600160a01b03909216918390811061098657610986615b63565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060118054806109c5576109c5615b4d565b600082815260209020810160001990810180546001600160a01b03191690550190556040517ff80a1a97fd42251f3c33cda98635e7399253033a6774fe37cd3f650b5282af3790610a179085906155cc565b60405180910390a1505050565b610a2d81615acb565b90506108fd565b5081604051635428d44960e01b8152600401610a5091906155cc565b60405180910390fd5b50565b610a64612df9565b604080518082018252600091610a939190849060029083908390808284376000920191909152506127d0915050565b6000818152600d602090815260409182902082518084019093525460ff811615158084526101009091046001600160401b03169183019190915291925090610af157604051631dfd6e1360e21b815260048101839052602401610a50565b6000828152600d6020526040812080546001600160481b0319169055600e54905b81811015610bc25783600e8281548110610b2e57610b2e615b63565b90600052602060002001541415610bb257600e610b4c600184615a13565b81548110610b5c57610b5c615b63565b9060005260206000200154600e8281548110610b7a57610b7a615b63565b600091825260209091200155600e805480610b9757610b97615b4d565b60019003818190600052602060002001600090559055610bc2565b610bbb81615acb565b9050610b12565b507f9b6868e0eb737bcd72205360baa6bfd0ba4e4819a33ade2db384e8a8025639a5838360200151604051610bf8929190615656565b60405180910390a150505050565b81610c1081612e4e565b610c18612eaf565b610c21836113b3565b15610c3f57604051631685ecdd60e31b815260040160405180910390fd5b610c498383612eda565b505050565b610c56612eaf565b610c5e612df9565b600b54600160601b90046001600160601b0316610c8e57604051631e9acf1760e31b815260040160405180910390fd5b600b8054600160601b90046001600160601b0316908190600c610cb18380615a4f565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555080600a600c8282829054906101000a90046001600160601b0316610cf99190615a4f565b92506101000a8154816001600160601b0302191690836001600160601b031602179055506000826001600160a01b0316826001600160601b031660405160006040518083038185875af1925050503d8060008114610d73576040519150601f19603f3d011682016040523d82523d6000602084013e610d78565b606091505b5050905080610c495760405163950b247960e01b815260040160405180910390fd5b6000610da4612eaf565b60005a9050610324361115610dd657604051630f28961b60e01b81523660048201526103246024820152604401610a50565b6000610de2868661308e565b90506000610df88583600001516020015161334a565b60408301516060888101519293509163ffffffff16806001600160401b03811115610e2557610e25615b79565b604051908082528060200260200182016040528015610e4e578160200160208202803683370190505b50925060005b81811015610eb65760408051602081018590529081018290526060016040516020818303038152906040528051906020012060001c848281518110610e9b57610e9b615b63565b6020908102919091010152610eaf81615acb565b9050610e54565b5050602080850180516000908152600f9092526040822082905551610edc908a85613398565b60208a8101516000908152600690915260409020805491925090601890610f1290600160c01b90046001600160401b0316615ae6565b91906101000a8154816001600160401b0302191690836001600160401b0316021790555060008960a0015160018b60a0015151610f4f9190615a13565b81518110610f5f57610f5f615b63565b60209101015160f81c6001149050610f798786838c613433565b9750610f8a88828c60200151613463565b6020808b015187820151604080518781526001600160601b038d16948101949094528415159084015284151560608401528b1515608084015290917faeb4b4786571e184246d39587f659abf0e26f41f6a3358692250382c0cdb47b79060a00160405180910390a3505050505050505b9392505050565b611009612eaf565b611012816135b6565b6110315780604051635428d44960e01b8152600401610a5091906155cc565b60008060008061104086612b27565b945094505093509350336001600160a01b0316826001600160a01b0316146110a35760405162461bcd60e51b81526020600482015260166024820152752737ba1039bab139b1b934b83a34b7b71037bbb732b960511b6044820152606401610a50565b6110ac866113b3565b156110f25760405162461bcd60e51b815260206004820152601660248201527550656e64696e6720726571756573742065786973747360501b6044820152606401610a50565b6040805160c0810182526001815260208082018990526001600160a01b03851682840152606082018490526001600160601b038088166080840152861660a08301529151909160009161114791849101615680565b604051602081830303815290604052905061116188613622565b505060405163ce3f471960e01b81526001600160a01b0388169063ce3f4719906001600160601b0388169061119a90859060040161566d565b6000604051808303818588803b1580156111b357600080fd5b505af11580156111c7573d6000803e3d6000fd5b50506002546001600160a01b0316158015935091506111f0905057506001600160601b03861615155b156112ba5760025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611227908a908a90600401615613565b602060405180830381600087803b15801561124157600080fd5b505af1158015611255573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611279919061511d565b6112ba5760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610a50565b600c805460ff60301b1916600160301b17905560005b8351811015611361578381815181106112eb576112eb615b63565b60200260200101516001600160a01b0316638ea98117896040518263ffffffff1660e01b815260040161131e91906155cc565b600060405180830381600087803b15801561133857600080fd5b505af115801561134c573d6000803e3d6000fd5b505050508061135a90615acb565b90506112d0565b50600c805460ff60301b191690556040517fd63ca8cb945956747ee69bfdc3ea754c24a4caf7418db70e46052f7850be4187906113a19089908b906155e0565b60405180910390a15050505050505050565b60008181526005602052604081206002018054806113d5575060009392505050565b600e5460005b828110156114b75760008482815481106113f7576113f7615b63565b60009182526020822001546001600160a01b031691505b838110156114a457600061146c600e838154811061142e5761142e615b63565b60009182526020808320909101546001600160a01b03871683526004825260408084208e855290925291205485908c906001600160401b03166137ca565b506000818152600f6020526040902054909150156114935750600198975050505050505050565b5061149d81615acb565b905061140e565b5050806114b090615acb565b90506113db565b50600095945050505050565b6114cb612eaf565b6114d3612df9565b6002546001600160a01b03166114fc5760405163c1f0c0a160e01b815260040160405180910390fd5b600b546001600160601b031661152557604051631e9acf1760e31b815260040160405180910390fd5b600b80546001600160601b031690819060006115418380615a4f565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555080600a60008282829054906101000a90046001600160601b03166115899190615a4f565b82546001600160601b039182166101009390930a92830291909202199091161790555060025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906115de9085908590600401615613565b602060405180830381600087803b1580156115f857600080fd5b505af115801561160c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611630919061511d565b61164d57604051631e9acf1760e31b815260040160405180910390fd5b5050565b611659612df9565b611662816135b6565b15611682578060405163ac8a27ef60e01b8152600401610a5091906155cc565b601180546001810182556000919091527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c680180546001600160a01b0319166001600160a01b0383161790556040517fb7cabbfc11e66731fc77de0444614282023bcbd41d16781c753a431d0af01625906116fd9083906155cc565b60405180910390a150565b611710612df9565b6002546001600160a01b03161561173a57604051631688c53760e11b815260040160405180910390fd5b600280546001600160a01b039384166001600160a01b03199182161790915560038054929093169116179055565b6001546001600160a01b031633146117bb5760405162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b6044820152606401610a50565b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b61181a612df9565b6040805180820182526000916118499190859060029083908390808284376000920191909152506127d0915050565b6000818152600d602052604090205490915060ff161561187f57604051634a0b8fa760e01b815260048101829052602401610a50565b60408051808201825260018082526001600160401b0385811660208085019182526000878152600d9091528581209451855492516001600160481b031990931690151568ffffffffffffffff00191617610100929093169190910291909117909255600e805491820181559091527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd01829055517f9b911b2c240bfbef3b6a8f7ed6ee321d1258bb2a3fe6becab52ac1cd3210afd390610a179083908590615656565b61194a612df9565b600a544790600160601b90046001600160601b03168181111561198a576040516354ced18160e11b81526004810182905260248101839052604401610a50565b81811015610c4957600061199e8284615a13565b90506000846001600160a01b03168260405160006040518083038185875af1925050503d80600081146119ed576040519150601f19603f3d011682016040523d82523d6000602084013e6119f2565b606091505b5050905080611a145760405163950b247960e01b815260040160405180910390fd5b7f4aed7c8eed0496c8c19ea2681fcca25741c1602342e38b045d9f1e8e905d2e9c8583604051611a459291906155e0565b60405180910390a15050505050565b611a5c612eaf565b6000818152600560205260409020546001600160a01b0316611a9157604051630fb532db60e11b815260040160405180910390fd5b60008181526006602052604090208054600160601b90046001600160601b0316903490600c611ac083856159be565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555034600a600c8282829054906101000a90046001600160601b0316611b0891906159be565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550817f7603b205d03651ee812f803fccde89f1012e545a9c99f0abfea9cedd0fd8e902823484611b5b919061595f565b604080519283526020830191909152015b60405180910390a25050565b6000611b82612eaf565b602080830135600081815260059092526040909120546001600160a01b0316611bbe57604051630fb532db60e11b815260040160405180910390fd5b33600090815260046020908152604080832084845291829052909120546001600160401b031680611c065782336040516379bfd40160e01b8152600401610a509291906156f5565b600c5461ffff16611c1d60608701604088016152df565b61ffff161080611c40575060c8611c3a60608701604088016152df565b61ffff16115b15611c8657611c5560608601604087016152df565b600c5460405163539c34bb60e11b815261ffff92831660048201529116602482015260c86044820152606401610a50565b600c5462010000900463ffffffff16611ca560808701606088016153e2565b63ffffffff161115611cf557611cc160808601606087016153e2565b600c54604051637aebf00f60e11b815263ffffffff9283166004820152620100009091049091166024820152604401610a50565b6101f4611d0860a08701608088016153e2565b63ffffffff161115611d4e57611d2460a08601608087016153e2565b6040516311ce1afb60e21b815263ffffffff90911660048201526101f46024820152604401610a50565b611d5781615ae6565b90506000611d6886353386856137ca565b90955090506000611d8c611d87611d8260a08a018a61586d565b613843565b6138c0565b905085611d97613931565b86611da860808b0160608c016153e2565b611db860a08c0160808d016153e2565b3386604051602001611dd09796959493929190615778565b60405160208183030381529060405280519060200120600f600088815260200190815260200160002081905550336001600160a01b03168588600001357feb0e3652e0f44f417695e6e90f2f42c99b65cd7169074c5a654b16b9748c3a4e89868c6040016020810190611e4391906152df565b8d6060016020810190611e5691906153e2565b8e6080016020810190611e6991906153e2565b89604051611e7c96959493929190615739565b60405180910390a450506000928352602091909152604090912080546001600160401b0319166001600160401b039092169190911790555b919050565b6000611ec3612eaf565b6007546001600160401b031633611edb600143615a13565b6040516001600160601b0319606093841b81166020830152914060348201523090921b1660548201526001600160c01b031960c083901b16606882015260700160408051601f1981840301815291905280516020909101209150611f40816001615977565b600780546001600160401b0319166001600160401b03928316179055604080516000808252608082018352602080830182815283850183815260608086018581528a86526006855287862093518454935191516001600160601b039182166001600160c01b031990951694909417600160601b9190921602176001600160c01b0316600160c01b9290981691909102969096179055835194850184523385528481018281528585018481528884526005835294909220855181546001600160a01b03199081166001600160a01b03928316178355935160018301805490951691161790925592518051929493919261203e9260028501920190614ced565b5061204e915060089050846139c1565b50827f1d3015d7ba850fa198dc7b1a3f5d42779313a681035f77c8c03764c61005518d3360405161207f91906155cc565b60405180910390a2505090565b612094612eaf565b6002546001600160a01b031633146120bf576040516344b0e3c360e01b815260040160405180910390fd5b602081146120e057604051638129bbcd60e01b815260040160405180910390fd5b60006120ee8284018461513a565b6000818152600560205260409020549091506001600160a01b031661212657604051630fb532db60e11b815260040160405180910390fd5b600081815260066020526040812080546001600160601b03169186919061214d83856159be565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555084600a60008282829054906101000a90046001600160601b031661219591906159be565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550817f1ced9348ff549fceab2ac57cd3a9de38edaaab274b725ee82c23e8fc8c4eec7a8287846121e8919061595f565b6040805192835260208301919091520160405180910390a2505050505050565b612210612df9565b60c861ffff8a16111561224a5760405163539c34bb60e11b815261ffff8a1660048201819052602482015260c86044820152606401610a50565b6000851361226e576040516321ea67b360e11b815260048101869052602401610a50565b60008463ffffffff1611801561229057508363ffffffff168363ffffffff1610155b156122be576040516313c06e5960e11b815263ffffffff808516600483015285166024820152604401610a50565b604080516101208101825261ffff8b1680825263ffffffff808c16602084018190526000848601528b8216606085018190528b8316608086018190528a841660a08701819052938a1660c0870181905260ff808b1660e08901819052908a16610100909801889052600c8054600160c01b90990260ff60c01b19600160b81b9093029290921661ffff60b81b19600160981b90940263ffffffff60981b19600160781b9099029890981667ffffffffffffffff60781b19600160581b90960263ffffffff60581b19600160381b9098029790971668ffffffffffffffffff60301b196201000090990265ffffffffffff19909c16909a179a909a1796909616979097179390931791909116959095179290921793909316929092179190911790556010869055517f2c6b6b12413678366b05b145c5f00745bdd00e739131ab5de82484a50c9d78b690612472908b908b908b908b908b908b908b908b908b9061ffff99909916895263ffffffff97881660208a0152958716604089015293861660608801526080870192909252841660a086015290921660c084015260ff91821660e0840152166101008201526101200190565b60405180910390a1505050505050505050565b61248d612df9565b6000818152600560205260409020546001600160a01b0316806124c357604051630fb532db60e11b815260040160405180910390fd5b61164d8282612eda565b606060006124db60086139cd565b90508084106124fd57604051631390f2a160e01b815260040160405180910390fd5b6000612509848661595f565b905081811180612517575083155b6125215780612523565b815b905060006125318683615a13565b9050806001600160401b0381111561254b5761254b615b79565b604051908082528060200260200182016040528015612574578160200160208202803683370190505b50935060005b818110156125c45761259761258f888361595f565b6008906139d7565b8582815181106125a9576125a9615b63565b60209081029190910101526125bd81615acb565b905061257a565b505050505b92915050565b6125d7612eaf565b6000818152600560205260409020546001600160a01b03168061260d57604051630fb532db60e11b815260040160405180910390fd5b6000828152600560205260409020600101546001600160a01b03163314612664576000828152600560205260409081902060010154905163d084e97560e01b8152610a50916001600160a01b0316906004016155cc565b600082815260056020526040908190208054336001600160a01b031991821681178355600190920180549091169055905183917fd4114ab6e9af9f597c52041f32d62dc57c5c4e4c0d4427006069635e216c938691611b6c9185916155f9565b816126ce81612e4e565b6126d6612eaf565b600083815260056020526040902060020180546064141561270a576040516305a48e0f60e01b815260040160405180910390fd5b6001600160a01b038316600090815260046020908152604080832087845291829052909120546001600160401b031615612745575050505050565b600085815260208281526040808320805460016001600160401b0319909116811790915585549081018655858452919092200180546001600160a01b0319166001600160a01b0387161790555185907f1e980d04aa7648e205713e5e8ea3808672ac163d10936d36f91b2c88ac1575e1906127c19087906155cc565b60405180910390a25050505050565b6000816040516020016127e39190615635565b604051602081830303815290604052805190602001209050919050565b8161280a81612e4e565b612812612eaf565b61281b836113b3565b1561283957604051631685ecdd60e31b815260040160405180910390fd5b6001600160a01b03821660009081526004602090815260408083208684529091529020546001600160401b03166128875782826040516379bfd40160e01b8152600401610a509291906156f5565b6000838152600560209081526040808320600201805482518185028101850190935280835291929091908301828280156128ea57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116128cc575b505050505090506000600182516129019190615a13565b905060005b8251811015612a0b57846001600160a01b031683828151811061292b5761292b615b63565b60200260200101516001600160a01b031614156129fb57600083838151811061295657612956615b63565b602002602001015190508060056000898152602001908152602001600020600201838154811061298857612988615b63565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394909416939093179092558881526005909152604090206002018054806129d3576129d3615b4d565b600082815260209020810160001990810180546001600160a01b031916905501905550612a0b565b612a0481615acb565b9050612906565b506001600160a01b03841660009081526004602090815260408083208884529091529081902080546001600160401b03191690555185907f32158c6058347c1601b2d12bc696ac6901d8a9a9aa3ba10c27ab0a983e8425a7906127c19087906155cc565b600e8181548110612a7f57600080fd5b600091825260209091200154905081565b81612a9a81612e4e565b612aa2612eaf565b600083815260056020526040902060018101546001600160a01b03848116911614612b21576001810180546001600160a01b0319166001600160a01b03851617905560405184907f21a4dad170a6bf476c31bbcf4a16628295b0e450672eec25d7c93308e05344a190612b1890339087906155f9565b60405180910390a25b50505050565b600081815260056020526040812054819081906001600160a01b0316606081612b6357604051630fb532db60e11b815260040160405180910390fd5b600086815260066020908152604080832054600583529281902060020180548251818502810185019093528083526001600160601b0380861695600160601b810490911694600160c01b9091046001600160401b0316938893929091839190830182828015612bfb57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612bdd575b505050505090509450945094509450945091939590929450565b612c1d612df9565b6002546001600160a01b0316612c465760405163c1f0c0a160e01b815260040160405180910390fd5b6002546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612c779030906004016155cc565b60206040518083038186803b158015612c8f57600080fd5b505afa158015612ca3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cc79190615153565b600a549091506001600160601b031681811115612d01576040516354ced18160e11b81526004810182905260248101839052604401610a50565b81811015610c49576000612d158284615a13565b60025460405163a9059cbb60e01b81529192506001600160a01b03169063a9059cbb90612d4890879085906004016155e0565b602060405180830381600087803b158015612d6257600080fd5b505af1158015612d76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d9a919061511d565b612db757604051631f01ff1360e21b815260040160405180910390fd5b7f59bfc682b673f8cbf945f1e454df9334834abf7dfe7f92237ca29ecb9b4366008482604051610bf89291906155e0565b612df0612df9565b610a59816139e3565b6000546001600160a01b03163314612e4c5760405162461bcd60e51b815260206004820152601660248201527527b7363c9031b0b63630b1363290313c9037bbb732b960511b6044820152606401610a50565b565b6000818152600560205260409020546001600160a01b031680612e8457604051630fb532db60e11b815260040160405180910390fd5b336001600160a01b0382161461164d5780604051636c51fda960e11b8152600401610a5091906155cc565b600c54600160301b900460ff1615612e4c5760405163769dd35360e11b815260040160405180910390fd5b600080612ee684613622565b60025491935091506001600160a01b031615801590612f0d57506001600160601b03821615155b15612fbc5760025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90612f4d9086906001600160601b038716906004016155e0565b602060405180830381600087803b158015612f6757600080fd5b505af1158015612f7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f9f919061511d565b612fbc57604051631e9acf1760e31b815260040160405180910390fd5b6000836001600160a01b0316826001600160601b031660405160006040518083038185875af1925050503d8060008114613012576040519150601f19603f3d011682016040523d82523d6000602084013e613017565b606091505b50509050806130395760405163950b247960e01b815260040160405180910390fd5b604080516001600160a01b03861681526001600160601b03808616602083015284169181019190915285907f8c74ce8b8cf87f5eb001275c8be27eb34ea2b62bfab6814fcc62192bb63e81c4906060016127c1565b6040805160a081018252600060608201818152608083018290528252602082018190529181019190915260006130c784600001516127d0565b6000818152600d602090815260409182902082518084019093525460ff811615158084526101009091046001600160401b0316918301919091529192509061312557604051631dfd6e1360e21b815260048101839052602401610a50565b6000828660800151604051602001613147929190918252602082015260400190565b60408051601f1981840301815291815281516020928301206000818152600f9093529120549091508061318d57604051631b44092560e11b815260040160405180910390fd5b85516020808801516040808a015160608b015160808c015160a08d015193516131bc978a9790969591016157c4565b6040516020818303038152906040528051906020012081146131f15760405163354a450b60e21b815260040160405180910390fd5b60006132008760000151613a87565b9050806132d8578651604051631d2827a760e31b81526001600160401b0390911660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e9413d389060240160206040518083038186803b15801561327257600080fd5b505afa158015613286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132aa9190615153565b9050806132d857865160405163175dadad60e01b81526001600160401b039091166004820152602401610a50565b60008860800151826040516020016132fa929190918252602082015260400190565b6040516020818303038152906040528051906020012060001c905060006133218a83613b69565b604080516060810182529788526020880196909652948601949094525092979650505050505050565b6000816001600160401b03163a111561339057821561337357506001600160401b0381166125c9565b3a8260405163435e532d60e11b8152600401610a50929190615656565b503a92915050565b6000806000631fe543e360e01b86856040516024016133b8929190615720565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252600c805460ff60301b1916600160301b17905590860151608087015191925061341c9163ffffffff9091169083613bd4565b600c805460ff60301b191690559695505050505050565b6000821561344d57613446858584613c20565b905061345b565b613458858584613d31565b90505b949350505050565b600081815260066020526040902082156135225780546001600160601b03600160601b90910481169085168110156134ae57604051631e9acf1760e31b815260040160405180910390fd5b6134b88582615a4f565b8254600160601b600160c01b031916600160601b6001600160601b039283168102919091178455600b805488939192600c926134f89286929004166159be565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555050612b21565b80546001600160601b0390811690851681101561355257604051631e9acf1760e31b815260040160405180910390fd5b61355c8582615a4f565b82546001600160601b0319166001600160601b03918216178355600b8054879260009161358b918591166159be565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505050505050565b601154600090815b8181101561361857836001600160a01b0316601182815481106135e3576135e3615b63565b6000918252602090912001546001600160a01b03161415613608575060019392505050565b61361181615acb565b90506135be565b5060009392505050565b60008181526005602090815260408083206006909252822054600290910180546001600160601b0380841694600160601b90940416925b818110156136c4576004600084838154811061367757613677615b63565b60009182526020808320909101546001600160a01b031683528281019390935260409182018120898252909252902080546001600160401b03191690556136bd81615acb565b9050613659565b50600085815260056020526040812080546001600160a01b031990811682556001820180549091169055906136fc6002830182614d52565b5050600085815260066020526040812055613718600886613f1a565b506001600160601b0384161561376b57600a80548591906000906137469084906001600160601b0316615a4f565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505b6001600160601b038316156137c35782600a600c8282829054906101000a90046001600160601b031661379e9190615a4f565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505b5050915091565b6040805160208082018790526001600160a01b03959095168183015260608101939093526001600160401b03919091166080808401919091528151808403909101815260a08301825280519084012060c083019490945260e0808301859052815180840390910181526101009092019052805191012091565b6040805160208101909152600081528161386c57506040805160208101909152600081526125c9565b63125fa26760e31b61387e8385615a6f565b6001600160e01b031916146138a657604051632923fee760e11b815260040160405180910390fd5b6138b38260048186615935565b810190610ffa919061516c565b60607f92fd13387c7fe7befbc38d303d6468778fb9731bc4583f17d92989c6fcfdeaaa826040516024016138f991511515815260200190565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915292915050565b60004661393d81613f26565b156139ba5760646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561397c57600080fd5b505afa158015613990573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139b49190615153565b91505090565b4391505090565b6000610ffa8383613f49565b60006125c9825490565b6000610ffa8383613f98565b6001600160a01b038116331415613a365760405162461bcd60e51b815260206004820152601760248201527621b0b73737ba103a3930b739b332b9103a379039b2b63360491b6044820152606401610a50565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600046613a9381613f26565b15613b5a57610100836001600160401b0316613aad613931565b613ab79190615a13565b1180613ad35750613ac6613931565b836001600160401b031610155b15613ae15750600092915050565b6040516315a03d4160e11b81526001600160401b0384166004820152606490632b407a82906024015b60206040518083038186803b158015613b2257600080fd5b505afa158015613b36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ffa9190615153565b50506001600160401b03164090565b6000613b9d8360000151846020015185604001518660600151868860a001518960c001518a60e001518b6101000151613fc2565b60038360200151604051602001613bb592919061570c565b60408051601f1981840301815291905280516020909101209392505050565b60005a611388811015613be657600080fd5b611388810390508460408204820311613bfe57600080fd5b50823b613c0a57600080fd5b60008083516020850160008789f1949350505050565b600080613c636000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506141de92505050565b905060005a600c54613c83908890600160581b900463ffffffff1661595f565b613c8d9190615a13565b613c9790866159f4565b600c54909150600090613cbc90600160781b900463ffffffff1664e8d4a510006159f4565b90508415613d0857600c548190606490600160b81b900460ff16613ce0858761595f565b613cea91906159f4565b613cf491906159e0565b613cfe919061595f565b9350505050610ffa565b600c548190606490613d2490600160b81b900460ff1682615999565b60ff16613ce0858761595f565b600080613d3c6142ac565b905060008113613d62576040516321ea67b360e11b815260048101829052602401610a50565b6000613da46000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506141de92505050565b9050600082825a600c54613dc6908b90600160581b900463ffffffff1661595f565b613dd09190615a13565b613dda90896159f4565b613de4919061595f565b613df690670de0b6b3a76400006159f4565b613e0091906159e0565b600c54909150600090613e299063ffffffff600160981b8204811691600160781b900416615a2a565b613e3e9063ffffffff1664e8d4a510006159f4565b9050600084613e5583670de0b6b3a76400006159f4565b613e5f91906159e0565b905060008715613ea057600c548290606490613e8590600160c01b900460ff16876159f4565b613e8f91906159e0565b613e99919061595f565b9050613ee0565b600c548290606490613ebc90600160c01b900460ff1682615999565b613ec99060ff16876159f4565b613ed391906159e0565b613edd919061595f565b90505b6b033b2e3c9fd0803ce8000000811115613f0d5760405163e80fa38160e01b815260040160405180910390fd5b9998505050505050505050565b6000610ffa838361437b565b600061a4b1821480613f3a575062066eed82145b806125c957505062066eee1490565b6000818152600183016020526040812054613f90575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556125c9565b5060006125c9565b6000826000018281548110613faf57613faf615b63565b9060005260206000200154905092915050565b613fcb8961446e565b6140145760405162461bcd60e51b815260206004820152601a6024820152797075626c6963206b6579206973206e6f74206f6e20637572766560301b6044820152606401610a50565b61401d8861446e565b6140615760405162461bcd60e51b815260206004820152601560248201527467616d6d61206973206e6f74206f6e20637572766560581b6044820152606401610a50565b61406a8361446e565b6140b65760405162461bcd60e51b815260206004820152601d60248201527f6347616d6d615769746e657373206973206e6f74206f6e2063757276650000006044820152606401610a50565b6140bf8261446e565b61410b5760405162461bcd60e51b815260206004820152601c60248201527f73486173685769746e657373206973206e6f74206f6e206375727665000000006044820152606401610a50565b614117878a8887614531565b61415f5760405162461bcd60e51b81526020600482015260196024820152786164647228632a706b2b732a6729213d5f755769746e65737360381b6044820152606401610a50565b600061416b8a87614654565b9050600061417e898b878b8689896146b8565b9050600061418f838d8d8a866147d7565b9050808a146141d05760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b210383937b7b360991b6044820152606401610a50565b505050505050505050505050565b6000466141ea81613f26565b1561422957606c6001600160a01b031663c6f7de0e6040518163ffffffff1660e01b815260040160206040518083038186803b158015613b2257600080fd5b61423281614817565b156142a357600f602160991b016001600160a01b03166349948e0e84604051806080016040528060488152602001615bb360489139604051602001614278929190615522565b6040516020818303038152906040526040518263ffffffff1660e01b8152600401613b0a919061566d565b50600092915050565b600c5460035460408051633fabe5a360e21b81529051600093600160381b900463ffffffff169284926001600160a01b039091169163feaf968c9160048082019260a092909190829003018186803b15801561430757600080fd5b505afa15801561431b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061433f91906153fd565b50919550909250505063ffffffff82161580159061436b57506143628142615a13565b8263ffffffff16105b156143765760105492505b505090565b6000818152600183016020526040812054801561446457600061439f600183615a13565b85549091506000906143b390600190615a13565b90508181146144185760008660000182815481106143d3576143d3615b63565b90600052602060002001549050808760000184815481106143f6576143f6615b63565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061442957614429615b4d565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506125c9565b60009150506125c9565b80516000906401000003d019116144bc5760405162461bcd60e51b8152602060048201526012602482015271696e76616c696420782d6f7264696e61746560701b6044820152606401610a50565b60208201516401000003d0191161450a5760405162461bcd60e51b8152602060048201526012602482015271696e76616c696420792d6f7264696e61746560701b6044820152606401610a50565b60208201516401000003d01990800961452a8360005b6020020151614851565b1492915050565b60006001600160a01b0382166145775760405162461bcd60e51b815260206004820152600b60248201526a626164207769746e65737360a81b6044820152606401610a50565b60208401516000906001161561458e57601c614591565b601b5b9050600070014551231950b75fc4402da1732fc9bebe1985876000602002015109865170014551231950b75fc4402da1732fc9bebe19918203925060009190890987516040805160008082526020820180845287905260ff88169282019290925260608101929092526080820183905291925060019060a0016020604051602081039080840390855afa15801561462c573d6000803e3d6000fd5b5050604051601f1901516001600160a01b039081169088161495505050505050949350505050565b61465c614d70565b61468960018484604051602001614675939291906155ab565b604051602081830303815290604052614875565b90505b6146958161446e565b6125c95780516040805160208101929092526146b19101614675565b905061468c565b6146c0614d70565b825186516401000003d019908190069106141561471f5760405162461bcd60e51b815260206004820152601e60248201527f706f696e747320696e2073756d206d7573742062652064697374696e637400006044820152606401610a50565b61472a8789886148c3565b61476f5760405162461bcd60e51b8152602060048201526016602482015275119a5c9cdd081b5d5b0818da1958dac819985a5b195960521b6044820152606401610a50565b61477a8486856148c3565b6147c05760405162461bcd60e51b815260206004820152601760248201527614d958dbdb99081b5d5b0818da1958dac819985a5b1959604a1b6044820152606401610a50565b6147cb8684846149eb565b98975050505050505050565b6000600286868685876040516020016147f596959493929190615551565b60408051601f1981840301815291905280516020909101209695505050505050565b6000600a82148061482957506101a482145b80614836575062aa37dc82145b80614842575061210582145b806125c957505062014a331490565b6000806401000003d01980848509840990506401000003d019600782089392505050565b61487d614d70565b61488682614aae565b815261489b614896826000614520565b614ae9565b602082018190526002900660011415611eb4576020810180516401000003d019039052919050565b6000826149005760405162461bcd60e51b815260206004820152600b60248201526a3d32b9379039b1b0b630b960a91b6044820152606401610a50565b8351602085015160009061491690600290615b0d565b1561492257601c614925565b601b5b9050600070014551231950b75fc4402da1732fc9bebe198387096040805160008082526020820180845281905260ff86169282019290925260608101869052608081018390529192509060019060a0016020604051602081039080840390855afa158015614997573d6000803e3d6000fd5b5050506020604051035190506000866040516020016149b69190615510565b60408051601f1981840301815291905280516020909101206001600160a01b0392831692169190911498975050505050505050565b6149f3614d70565b835160208086015185519186015160009384938493614a1493909190614b09565b919450925090506401000003d019858209600114614a705760405162461bcd60e51b815260206004820152601960248201527834b73b2d1036bab9ba1031329034b73b32b939b29037b3103d60391b6044820152606401610a50565b60405180604001604052806401000003d01980614a8f57614a8f615b37565b87860981526020016401000003d0198785099052979650505050505050565b805160208201205b6401000003d0198110611eb457604080516020808201939093528151808203840181529082019091528051910120614ab6565b60006125c9826002614b026401000003d019600161595f565b901c614be9565b60008080600180826401000003d019896401000003d019038808905060006401000003d0198b6401000003d019038a0890506000614b4983838585614c80565b9098509050614b5a88828e88614ca4565b9098509050614b6b88828c87614ca4565b90985090506000614b7e8d878b85614ca4565b9098509050614b8f88828686614c80565b9098509050614ba088828e89614ca4565b9098509050818114614bd5576401000003d019818a0998506401000003d01982890997506401000003d0198183099650614bd9565b8196505b5050505050509450945094915050565b600080614bf4614d8e565b6020808252818101819052604082015260608101859052608081018490526401000003d01960a0820152614c26614dac565b60208160c0846005600019fa925082614c765760405162461bcd60e51b81526020600482015260126024820152716269674d6f64457870206661696c7572652160701b6044820152606401610a50565b5195945050505050565b6000806401000003d0198487096401000003d0198487099097909650945050505050565b600080806401000003d019878509905060006401000003d01987876401000003d019030990506401000003d0198183086401000003d01986890990999098509650505050505050565b828054828255906000526020600020908101928215614d42579160200282015b82811115614d4257825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614d0d565b50614d4e929150614dca565b5090565b5080546000825590600052602060002090810190610a599190614dca565b60405180604001604052806002906020820280368337509192915050565b6040518060c001604052806006906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b5b80821115614d4e5760008155600101614dcb565b8035611eb481615b8f565b80604081018310156125c957600080fd5b600082601f830112614e0c57600080fd5b604051604081018181106001600160401b0382111715614e2e57614e2e615b79565b8060405250808385604086011115614e4557600080fd5b60005b6002811015614e67578135835260209283019290910190600101614e48565b509195945050505050565b8035611eb481615ba4565b600060c08284031215614e8f57600080fd5b614e976158ba565b9050614ea282614f91565b815260208083013581830152614eba60408401614f7d565b6040830152614ecb60608401614f7d565b60608301526080830135614ede81615b8f565b608083015260a08301356001600160401b0380821115614efd57600080fd5b818501915085601f830112614f1157600080fd5b813581811115614f2357614f23615b79565b614f35601f8201601f19168501615905565b91508082528684828501011115614f4b57600080fd5b80848401858401376000848284010152508060a085015250505092915050565b803561ffff81168114611eb457600080fd5b803563ffffffff81168114611eb457600080fd5b80356001600160401b0381168114611eb457600080fd5b803560ff81168114611eb457600080fd5b805169ffffffffffffffffffff81168114611eb457600080fd5b600060208284031215614fe557600080fd5b8135610ffa81615b8f565b6000806040838503121561500357600080fd5b823561500e81615b8f565b9150602083013561501e81615b8f565b809150509250929050565b6000806000806060858703121561503f57600080fd5b843561504a81615b8f565b93506020850135925060408501356001600160401b038082111561506d57600080fd5b818701915087601f83011261508157600080fd5b81358181111561509057600080fd5b8860208285010111156150a257600080fd5b95989497505060200194505050565b6000604082840312156150c357600080fd5b610ffa8383614dea565b600080606083850312156150e057600080fd5b6150ea8484614dea565b91506150f860408401614f91565b90509250929050565b60006040828403121561511357600080fd5b610ffa8383614dfb565b60006020828403121561512f57600080fd5b8151610ffa81615ba4565b60006020828403121561514c57600080fd5b5035919050565b60006020828403121561516557600080fd5b5051919050565b60006020828403121561517e57600080fd5b604051602081018181106001600160401b03821117156151a0576151a0615b79565b60405282356151ae81615ba4565b81529392505050565b60008060008385036101e08112156151ce57600080fd5b6101a0808212156151de57600080fd5b6151e66158e2565b91506151f28787614dfb565b82526152018760408801614dfb565b60208301526080860135604083015260a0860135606083015260c0860135608083015261523060e08701614ddf565b60a083015261010061524488828901614dfb565b60c0840152615257886101408901614dfb565b60e0840152610180870135908301529093508401356001600160401b0381111561528057600080fd5b61528c86828701614e7d565b92505061529c6101c08501614e72565b90509250925092565b6000602082840312156152b757600080fd5b81356001600160401b038111156152cd57600080fd5b820160c08185031215610ffa57600080fd5b6000602082840312156152f157600080fd5b610ffa82614f6b565b60008060008060008060008060006101208a8c03121561531957600080fd5b6153228a614f6b565b985061533060208b01614f7d565b975061533e60408b01614f7d565b965061534c60608b01614f7d565b955060808a0135945061536160a08b01614f7d565b935061536f60c08b01614f7d565b925061537d60e08b01614fa8565b915061538c6101008b01614fa8565b90509295985092959850929598565b600080604083850312156153ae57600080fd5b82359150602083013561501e81615b8f565b600080604083850312156153d357600080fd5b50508035926020909101359150565b6000602082840312156153f457600080fd5b610ffa82614f7d565b600080600080600060a0868803121561541557600080fd5b61541e86614fb9565b945060208601519350604086015192506060860151915061544160808701614fb9565b90509295509295909350565b600081518084526020808501945080840160005b838110156154865781516001600160a01b031687529582019590820190600101615461565b509495945050505050565b8060005b6002811015612b21578151845260209384019390910190600101615495565b600081518084526020808501945080840160005b83811015615486578151875295820195908201906001016154c8565b600081518084526154fc816020860160208601615a9f565b601f01601f19169290920160200192915050565b61551a8183615491565b604001919050565b60008351615534818460208801615a9f565b835190830190615548818360208801615a9f565b01949350505050565b8681526155616020820187615491565b61556e6060820186615491565b61557b60a0820185615491565b61558860e0820184615491565b60609190911b6001600160601b0319166101208201526101340195945050505050565b8381526155bb6020820184615491565b606081019190915260800192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039290921682526001600160601b0316602082015260400190565b604081016125c98284615491565b602081526000610ffa60208301846154b4565b9182526001600160401b0316602082015260400190565b602081526000610ffa60208301846154e4565b6020815260ff82511660208201526020820151604082015260018060a01b0360408301511660608201526000606083015160c060808401526156c560e084018261544d565b60808501516001600160601b0390811660a0868101919091529095015190941660c0909301929092525090919050565b9182526001600160a01b0316602082015260400190565b82815260608101610ffa6020830184615491565b82815260406020820152600061345b60408301846154b4565b86815285602082015261ffff85166040820152600063ffffffff808616606084015280851660808401525060c060a08301526147cb60c08301846154e4565b878152602081018790526040810186905263ffffffff8581166060830152841660808201526001600160a01b03831660a082015260e060c08201819052600090613f0d908301846154e4565b8781526001600160401b03871660208201526040810186905263ffffffff8581166060830152841660808201526001600160a01b03831660a082015260e060c08201819052600090613f0d908301846154e4565b6001600160601b038681168252851660208201526001600160401b03841660408201526001600160a01b038316606082015260a0608082018190526000906158629083018461544d565b979650505050505050565b6000808335601e1984360301811261588457600080fd5b8301803591506001600160401b0382111561589e57600080fd5b6020019150368190038213156158b357600080fd5b9250929050565b60405160c081016001600160401b03811182821017156158dc576158dc615b79565b60405290565b60405161012081016001600160401b03811182821017156158dc576158dc615b79565b604051601f8201601f191681016001600160401b038111828210171561592d5761592d615b79565b604052919050565b6000808585111561594557600080fd5b8386111561595257600080fd5b5050820193919092039150565b6000821982111561597257615972615b21565b500190565b60006001600160401b0380831681851680830382111561554857615548615b21565b600060ff821660ff84168060ff038211156159b6576159b6615b21565b019392505050565b60006001600160601b0382811684821680830382111561554857615548615b21565b6000826159ef576159ef615b37565b500490565b6000816000190483118215151615615a0e57615a0e615b21565b500290565b600082821015615a2557615a25615b21565b500390565b600063ffffffff83811690831681811015615a4757615a47615b21565b039392505050565b60006001600160601b0383811690831681811015615a4757615a47615b21565b6001600160e01b03198135818116916004851015615a975780818660040360031b1b83161692505b505092915050565b60005b83811015615aba578181015183820152602001615aa2565b83811115612b215750506000910152565b6000600019821415615adf57615adf615b21565b5060010190565b60006001600160401b0380831681811415615b0357615b03615b21565b6001019392505050565b600082615b1c57615b1c615b37565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610a5957600080fd5b8015158114610a5957600080fdfe307866666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666a164736f6c6343000806000a", } var VRFCoordinatorV25ABI = VRFCoordinatorV25MetaData.ABI diff --git a/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt index b7095b85fef..18b0ba1c431 100644 --- a/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -93,7 +93,7 @@ vrf_consumer_v2_upgradeable_example: ../../contracts/solc/v0.8.6/VRFConsumerV2Up vrf_coordinator_mock: ../../contracts/solc/v0.8.6/VRFCoordinatorMock/VRFCoordinatorMock.abi ../../contracts/solc/v0.8.6/VRFCoordinatorMock/VRFCoordinatorMock.bin 5c495cf8df1f46d8736b9150cdf174cce358cb8352f60f0d5bb9581e23920501 vrf_coordinator_test_v2: ../../contracts/solc/v0.8.6/VRFCoordinatorTestV2/VRFCoordinatorTestV2.abi ../../contracts/solc/v0.8.6/VRFCoordinatorTestV2/VRFCoordinatorTestV2.bin eaefd785c38bac67fb11a7fc2737ab2da68c988ca170e7db8ff235c80893e01c vrf_coordinator_v2: ../../contracts/solc/v0.8.6/VRFCoordinatorV2/VRFCoordinatorV2.abi ../../contracts/solc/v0.8.6/VRFCoordinatorV2/VRFCoordinatorV2.bin 295f35ce282060317dfd01f45959f5a2b05ba26913e422fbd4fb6bf90b107006 -vrf_coordinator_v2_5: ../../contracts/solc/v0.8.6/VRFCoordinatorV2_5/VRFCoordinatorV2_5.abi ../../contracts/solc/v0.8.6/VRFCoordinatorV2_5/VRFCoordinatorV2_5.bin 3230631b7920236588ccd4ad8795e52ede6222cac7a70fa477c7240da0955a5e +vrf_coordinator_v2_5: ../../contracts/solc/v0.8.6/VRFCoordinatorV2_5/VRFCoordinatorV2_5.abi ../../contracts/solc/v0.8.6/VRFCoordinatorV2_5/VRFCoordinatorV2_5.bin bab68f50e20025ad0c9a2c9559cbd854734c8d7fd9d5bcd62ac0629d6615ff6a vrf_coordinator_v2_plus_v2_example: ../../contracts/solc/v0.8.6/VRFCoordinatorV2Plus_V2Example/VRFCoordinatorV2Plus_V2Example.abi ../../contracts/solc/v0.8.6/VRFCoordinatorV2Plus_V2Example/VRFCoordinatorV2Plus_V2Example.bin 4a5b86701983b1b65f0a8dfa116b3f6d75f8f706fa274004b57bdf5992e4cec3 vrf_coordinator_v2plus_interface: ../../contracts/solc/v0.8.6/IVRFCoordinatorV2PlusInternal/IVRFCoordinatorV2PlusInternal.abi ../../contracts/solc/v0.8.6/IVRFCoordinatorV2PlusInternal/IVRFCoordinatorV2PlusInternal.bin 86b8e23aab28c5b98e3d2384dc4f702b093e382dc985c88101278e6e4bf6f7b8 vrf_external_sub_owner_example: ../../contracts/solc/v0.8.6/VRFExternalSubOwnerExample/VRFExternalSubOwnerExample.abi ../../contracts/solc/v0.8.6/VRFExternalSubOwnerExample/VRFExternalSubOwnerExample.bin 14f888eb313930b50233a6f01ea31eba0206b7f41a41f6311670da8bb8a26963 From 710c60c5eeaf0043a88555038fecfee0621eb397 Mon Sep 17 00:00:00 2001 From: Anirudh Warrier <12178754+anirudhwarrier@users.noreply.github.com> Date: Mon, 11 Mar 2024 23:01:28 +0400 Subject: [PATCH 03/15] update smoke test to use UpkeepCounter [AUTO-9246] (#12371) * update smoke test to use UpkeepCounter * fix references in chaincli --- .changeset/fresh-spies-melt.md | 5 +++ .../automation/testhelpers/UpkeepCounter.sol | 28 ++++++------ .../upkeep_counter_wrapper.go | 44 +++++++++---------- ...rapper-dependency-versions-do-not-edit.txt | 2 +- .../chaincli/handler/keeper_upkeep_events.go | 8 ++-- integration-tests/actions/keeper_helpers.go | 2 +- .../contracts/ethereum_keeper_contracts.go | 6 +++ 7 files changed, 53 insertions(+), 42 deletions(-) create mode 100644 .changeset/fresh-spies-melt.md diff --git a/.changeset/fresh-spies-melt.md b/.changeset/fresh-spies-melt.md new file mode 100644 index 00000000000..ad341d1db91 --- /dev/null +++ b/.changeset/fresh-spies-melt.md @@ -0,0 +1,5 @@ +--- +"chainlink": patch +--- + +Update automation smoke test to use UpkeepCounter with time based counter diff --git a/contracts/src/v0.8/automation/testhelpers/UpkeepCounter.sol b/contracts/src/v0.8/automation/testhelpers/UpkeepCounter.sol index caeed98e302..24a8b1f9010 100644 --- a/contracts/src/v0.8/automation/testhelpers/UpkeepCounter.sol +++ b/contracts/src/v0.8/automation/testhelpers/UpkeepCounter.sol @@ -4,25 +4,25 @@ pragma solidity 0.8.16; contract UpkeepCounter { event PerformingUpkeep( address indexed from, - uint256 initialBlock, - uint256 lastBlock, + uint256 initialTimestamp, + uint256 lastTimestamp, uint256 previousBlock, uint256 counter ); uint256 public testRange; uint256 public interval; - uint256 public lastBlock; + uint256 public lastTimestamp; uint256 public previousPerformBlock; - uint256 public initialBlock; + uint256 public initialTimestamp; uint256 public counter; constructor(uint256 _testRange, uint256 _interval) { testRange = _testRange; interval = _interval; previousPerformBlock = 0; - lastBlock = block.number; - initialBlock = 0; + lastTimestamp = block.timestamp; + initialTimestamp = 0; counter = 0; } @@ -31,28 +31,28 @@ contract UpkeepCounter { } function performUpkeep(bytes calldata performData) external { - if (initialBlock == 0) { - initialBlock = block.number; + if (initialTimestamp == 0) { + initialTimestamp = block.timestamp; } - lastBlock = block.number; + lastTimestamp = block.timestamp; counter = counter + 1; performData; - emit PerformingUpkeep(tx.origin, initialBlock, lastBlock, previousPerformBlock, counter); - previousPerformBlock = lastBlock; + emit PerformingUpkeep(tx.origin, initialTimestamp, lastTimestamp, previousPerformBlock, counter); + previousPerformBlock = lastTimestamp; } function eligible() public view returns (bool) { - if (initialBlock == 0) { + if (initialTimestamp == 0) { return true; } - return (block.number - initialBlock) < testRange && (block.number - lastBlock) >= interval; + return (block.timestamp - initialTimestamp) < testRange && (block.timestamp - lastTimestamp) >= interval; } function setSpread(uint256 _testRange, uint256 _interval) external { testRange = _testRange; interval = _interval; - initialBlock = 0; + initialTimestamp = 0; counter = 0; } } diff --git a/core/gethwrappers/generated/upkeep_counter_wrapper/upkeep_counter_wrapper.go b/core/gethwrappers/generated/upkeep_counter_wrapper/upkeep_counter_wrapper.go index 13db591730e..5363e4e57de 100644 --- a/core/gethwrappers/generated/upkeep_counter_wrapper/upkeep_counter_wrapper.go +++ b/core/gethwrappers/generated/upkeep_counter_wrapper/upkeep_counter_wrapper.go @@ -31,8 +31,8 @@ var ( ) var UpkeepCounterMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_testRange\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_interval\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"initialBlock\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"lastBlock\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"previousBlock\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"counter\",\"type\":\"uint256\"}],\"name\":\"PerformingUpkeep\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"checkUpkeep\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"counter\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"eligible\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialBlock\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"interval\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastBlock\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"}],\"name\":\"performUpkeep\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"previousPerformBlock\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_testRange\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_interval\",\"type\":\"uint256\"}],\"name\":\"setSpread\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"testRange\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x608060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f9161004d565b60009182556001556003819055436002556004819055600555610071565b6000806040838503121561006057600080fd5b505080516020909101519092909150565b610403806100806000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c80637f407edf11610076578063917d895f1161005b578063917d895f14610150578063947a36fb14610159578063d832d92f1461016257600080fd5b80637f407edf14610127578063806b984f1461014757600080fd5b806361bc221a116100a757806361bc221a146100f45780636250a13a146100fd5780636e04ff0d1461010657600080fd5b80632cb15864146100c35780634585e33b146100df575b600080fd5b6100cc60045481565b6040519081526020015b60405180910390f35b6100f26100ed366004610291565b61017a565b005b6100cc60055481565b6100cc60005481565b610119610114366004610291565b6101fd565b6040516100d6929190610303565b6100f2610135366004610379565b60009182556001556004819055600555565b6100cc60025481565b6100cc60035481565b6100cc60015481565b61016a61024f565b60405190151581526020016100d6565b60045460000361018957436004555b4360025560055461019b9060016103ca565b600581905560045460025460035460408051938452602084019290925290820152606081019190915232907f8e8112f20a2134e18e591d2cdd68cd86a95d06e6328ede501fc6314f4a5075fa9060800160405180910390a25050600254600355565b6000606061020961024f565b848481818080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250959a92995091975050505050505050565b60006004546000036102615750600190565b60005460045461027190436103e3565b10801561028c575060015460025461028990436103e3565b10155b905090565b600080602083850312156102a457600080fd5b823567ffffffffffffffff808211156102bc57600080fd5b818501915085601f8301126102d057600080fd5b8135818111156102df57600080fd5b8660208285010111156102f157600080fd5b60209290920196919550909350505050565b821515815260006020604081840152835180604085015260005b818110156103395785810183015185820160600152820161031d565b5060006060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116850101925050509392505050565b6000806040838503121561038c57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156103dd576103dd61039b565b92915050565b818103818111156103dd576103dd61039b56fea164736f6c6343000810000a", + ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_testRange\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_interval\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"initialTimestamp\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"lastTimestamp\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"previousBlock\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"counter\",\"type\":\"uint256\"}],\"name\":\"PerformingUpkeep\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"checkUpkeep\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"counter\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"eligible\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"interval\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"}],\"name\":\"performUpkeep\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"previousPerformBlock\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_testRange\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_interval\",\"type\":\"uint256\"}],\"name\":\"setSpread\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"testRange\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + Bin: "0x608060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f9161004d565b60009182556001556003819055426002556004819055600555610071565b6000806040838503121561006057600080fd5b505080516020909101519092909150565b610403806100806000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c80637f407edf11610076578063947a36fb1161005b578063947a36fb14610150578063d6d1417114610159578063d832d92f1461016257600080fd5b80637f407edf14610127578063917d895f1461014757600080fd5b806361bc221a116100a757806361bc221a146100f45780636250a13a146100fd5780636e04ff0d1461010657600080fd5b806319d8ac61146100c35780634585e33b146100df575b600080fd5b6100cc60025481565b6040519081526020015b60405180910390f35b6100f26100ed366004610291565b61017a565b005b6100cc60055481565b6100cc60005481565b610119610114366004610291565b6101fd565b6040516100d6929190610303565b6100f2610135366004610379565b60009182556001556004819055600555565b6100cc60035481565b6100cc60015481565b6100cc60045481565b61016a61024f565b60405190151581526020016100d6565b60045460000361018957426004555b4260025560055461019b9060016103ca565b600581905560045460025460035460408051938452602084019290925290820152606081019190915232907f8e8112f20a2134e18e591d2cdd68cd86a95d06e6328ede501fc6314f4a5075fa9060800160405180910390a25050600254600355565b6000606061020961024f565b848481818080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250959a92995091975050505050505050565b60006004546000036102615750600190565b60005460045461027190426103e3565b10801561028c575060015460025461028990426103e3565b10155b905090565b600080602083850312156102a457600080fd5b823567ffffffffffffffff808211156102bc57600080fd5b818501915085601f8301126102d057600080fd5b8135818111156102df57600080fd5b8660208285010111156102f157600080fd5b60209290920196919550909350505050565b821515815260006020604081840152835180604085015260005b818110156103395785810183015185820160600152820161031d565b5060006060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116850101925050509392505050565b6000806040838503121561038c57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156103dd576103dd61039b565b92915050565b818103818111156103dd576103dd61039b56fea164736f6c6343000810000a", } var UpkeepCounterABI = UpkeepCounterMetaData.ABI @@ -238,9 +238,9 @@ func (_UpkeepCounter *UpkeepCounterCallerSession) Eligible() (bool, error) { return _UpkeepCounter.Contract.Eligible(&_UpkeepCounter.CallOpts) } -func (_UpkeepCounter *UpkeepCounterCaller) InitialBlock(opts *bind.CallOpts) (*big.Int, error) { +func (_UpkeepCounter *UpkeepCounterCaller) InitialTimestamp(opts *bind.CallOpts) (*big.Int, error) { var out []interface{} - err := _UpkeepCounter.contract.Call(opts, &out, "initialBlock") + err := _UpkeepCounter.contract.Call(opts, &out, "initialTimestamp") if err != nil { return *new(*big.Int), err @@ -252,12 +252,12 @@ func (_UpkeepCounter *UpkeepCounterCaller) InitialBlock(opts *bind.CallOpts) (*b } -func (_UpkeepCounter *UpkeepCounterSession) InitialBlock() (*big.Int, error) { - return _UpkeepCounter.Contract.InitialBlock(&_UpkeepCounter.CallOpts) +func (_UpkeepCounter *UpkeepCounterSession) InitialTimestamp() (*big.Int, error) { + return _UpkeepCounter.Contract.InitialTimestamp(&_UpkeepCounter.CallOpts) } -func (_UpkeepCounter *UpkeepCounterCallerSession) InitialBlock() (*big.Int, error) { - return _UpkeepCounter.Contract.InitialBlock(&_UpkeepCounter.CallOpts) +func (_UpkeepCounter *UpkeepCounterCallerSession) InitialTimestamp() (*big.Int, error) { + return _UpkeepCounter.Contract.InitialTimestamp(&_UpkeepCounter.CallOpts) } func (_UpkeepCounter *UpkeepCounterCaller) Interval(opts *bind.CallOpts) (*big.Int, error) { @@ -282,9 +282,9 @@ func (_UpkeepCounter *UpkeepCounterCallerSession) Interval() (*big.Int, error) { return _UpkeepCounter.Contract.Interval(&_UpkeepCounter.CallOpts) } -func (_UpkeepCounter *UpkeepCounterCaller) LastBlock(opts *bind.CallOpts) (*big.Int, error) { +func (_UpkeepCounter *UpkeepCounterCaller) LastTimestamp(opts *bind.CallOpts) (*big.Int, error) { var out []interface{} - err := _UpkeepCounter.contract.Call(opts, &out, "lastBlock") + err := _UpkeepCounter.contract.Call(opts, &out, "lastTimestamp") if err != nil { return *new(*big.Int), err @@ -296,12 +296,12 @@ func (_UpkeepCounter *UpkeepCounterCaller) LastBlock(opts *bind.CallOpts) (*big. } -func (_UpkeepCounter *UpkeepCounterSession) LastBlock() (*big.Int, error) { - return _UpkeepCounter.Contract.LastBlock(&_UpkeepCounter.CallOpts) +func (_UpkeepCounter *UpkeepCounterSession) LastTimestamp() (*big.Int, error) { + return _UpkeepCounter.Contract.LastTimestamp(&_UpkeepCounter.CallOpts) } -func (_UpkeepCounter *UpkeepCounterCallerSession) LastBlock() (*big.Int, error) { - return _UpkeepCounter.Contract.LastBlock(&_UpkeepCounter.CallOpts) +func (_UpkeepCounter *UpkeepCounterCallerSession) LastTimestamp() (*big.Int, error) { + return _UpkeepCounter.Contract.LastTimestamp(&_UpkeepCounter.CallOpts) } func (_UpkeepCounter *UpkeepCounterCaller) PreviousPerformBlock(opts *bind.CallOpts) (*big.Int, error) { @@ -433,12 +433,12 @@ func (it *UpkeepCounterPerformingUpkeepIterator) Close() error { } type UpkeepCounterPerformingUpkeep struct { - From common.Address - InitialBlock *big.Int - LastBlock *big.Int - PreviousBlock *big.Int - Counter *big.Int - Raw types.Log + From common.Address + InitialTimestamp *big.Int + LastTimestamp *big.Int + PreviousBlock *big.Int + Counter *big.Int + Raw types.Log } func (_UpkeepCounter *UpkeepCounterFilterer) FilterPerformingUpkeep(opts *bind.FilterOpts, from []common.Address) (*UpkeepCounterPerformingUpkeepIterator, error) { @@ -528,11 +528,11 @@ type UpkeepCounterInterface interface { Eligible(opts *bind.CallOpts) (bool, error) - InitialBlock(opts *bind.CallOpts) (*big.Int, error) + InitialTimestamp(opts *bind.CallOpts) (*big.Int, error) Interval(opts *bind.CallOpts) (*big.Int, error) - LastBlock(opts *bind.CallOpts) (*big.Int, error) + LastTimestamp(opts *bind.CallOpts) (*big.Int, error) PreviousPerformBlock(opts *bind.CallOpts) (*big.Int, error) diff --git a/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt index 18b0ba1c431..446b481d1d7 100644 --- a/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -81,7 +81,7 @@ streams_lookup_upkeep_wrapper: ../../contracts/solc/v0.8.16/StreamsLookupUpkeep/ test_api_consumer_wrapper: ../../contracts/solc/v0.6/TestAPIConsumer/TestAPIConsumer.abi ../../contracts/solc/v0.6/TestAPIConsumer/TestAPIConsumer.bin ed10893cb18894c18e275302329c955f14ea2de37ee044f84aa1e067ac5ea71e trusted_blockhash_store: ../../contracts/solc/v0.8.6/TrustedBlockhashStore/TrustedBlockhashStore.abi ../../contracts/solc/v0.8.6/TrustedBlockhashStore/TrustedBlockhashStore.bin 98cb0dc06c15af5dcd3b53bdfc98e7ed2489edc96a42203294ac2fc0efdda02b type_and_version_interface_wrapper: ../../contracts/solc/v0.8.6/KeeperRegistry1_2/TypeAndVersionInterface.abi ../../contracts/solc/v0.8.6/KeeperRegistry1_2/TypeAndVersionInterface.bin bc9c3a6e73e3ebd5b58754df0deeb3b33f4bb404d5709bb904aed51d32f4b45e -upkeep_counter_wrapper: ../../contracts/solc/v0.8.16/UpkeepCounter/UpkeepCounter.abi ../../contracts/solc/v0.8.16/UpkeepCounter/UpkeepCounter.bin 77f000229a501f638dd2dc439859257f632894c728b31e68aea4f6d6c52f1b71 +upkeep_counter_wrapper: ../../contracts/solc/v0.8.16/UpkeepCounter/UpkeepCounter.abi ../../contracts/solc/v0.8.16/UpkeepCounter/UpkeepCounter.bin cef953186d12ac802e54d17c897d01605b60bbe0ce2df3b4cf2c31c5c3168b35 upkeep_perform_counter_restrictive_wrapper: ../../contracts/solc/v0.8.16/UpkeepPerformCounterRestrictive/UpkeepPerformCounterRestrictive.abi ../../contracts/solc/v0.8.16/UpkeepPerformCounterRestrictive/UpkeepPerformCounterRestrictive.bin 20955b21acceb58355fa287b29194a73edf5937067ba7140667301017cb2b24c upkeep_transcoder: ../../contracts/solc/v0.8.6/UpkeepTranscoder/UpkeepTranscoder.abi ../../contracts/solc/v0.8.6/UpkeepTranscoder/UpkeepTranscoder.bin 336c92a981597be26508455f81a908a0784a817b129a59686c5b2c4afcba730a verifiable_load_log_trigger_upkeep_wrapper: ../../contracts/solc/v0.8.16/VerifiableLoadLogTriggerUpkeep/VerifiableLoadLogTriggerUpkeep.abi ../../contracts/solc/v0.8.16/VerifiableLoadLogTriggerUpkeep/VerifiableLoadLogTriggerUpkeep.bin ee5c608e4e84c80934e42b0c02a49624840adf10b50c91f688bf8f0c7c6994c2 diff --git a/core/scripts/chaincli/handler/keeper_upkeep_events.go b/core/scripts/chaincli/handler/keeper_upkeep_events.go index d63badb6f61..9625eaea67a 100644 --- a/core/scripts/chaincli/handler/keeper_upkeep_events.go +++ b/core/scripts/chaincli/handler/keeper_upkeep_events.go @@ -48,14 +48,14 @@ func (k *Keeper) UpkeepCounterEvents(ctx context.Context, hexAddr string, fromBl for upkeepIterator.Next() { fmt.Printf("%s,%s,%s,%s,%s\n", upkeepIterator.Event.From, - upkeepIterator.Event.InitialBlock, - upkeepIterator.Event.LastBlock, + upkeepIterator.Event.InitialTimestamp, + upkeepIterator.Event.LastTimestamp, upkeepIterator.Event.PreviousBlock, upkeepIterator.Event.Counter, ) row = []string{upkeepIterator.Event.From.String(), - upkeepIterator.Event.InitialBlock.String(), - upkeepIterator.Event.LastBlock.String(), + upkeepIterator.Event.InitialTimestamp.String(), + upkeepIterator.Event.LastTimestamp.String(), upkeepIterator.Event.PreviousBlock.String(), upkeepIterator.Event.Counter.String()} if err = w.Write(row); err != nil { diff --git a/integration-tests/actions/keeper_helpers.go b/integration-tests/actions/keeper_helpers.go index edd0dc5f735..950d14ac8ea 100644 --- a/integration-tests/actions/keeper_helpers.go +++ b/integration-tests/actions/keeper_helpers.go @@ -418,7 +418,7 @@ func DeployKeeperConsumers(t *testing.T, contractDeployer contracts.ContractDepl keeperConsumerInstance, err = contractDeployer.DeployAutomationLogTriggerConsumer(big.NewInt(1000)) // 1000 block test range } else { // v2.0 and v2.1: Conditional based contract without Mercury - keeperConsumerInstance, err = contractDeployer.DeployKeeperConsumer(big.NewInt(5)) + keeperConsumerInstance, err = contractDeployer.DeployUpkeepCounter(big.NewInt(999999), big.NewInt(5)) } require.NoError(t, err, "Deploying Consumer instance %d shouldn't fail", contractCount+1) diff --git a/integration-tests/contracts/ethereum_keeper_contracts.go b/integration-tests/contracts/ethereum_keeper_contracts.go index 3622edcef5f..ac8e12a47ec 100644 --- a/integration-tests/contracts/ethereum_keeper_contracts.go +++ b/integration-tests/contracts/ethereum_keeper_contracts.go @@ -106,6 +106,7 @@ type UpkeepCounter interface { Fund(ethAmount *big.Float) error Counter(ctx context.Context) (*big.Int, error) SetSpread(testRange *big.Int, interval *big.Int) error + Start() error } type UpkeepPerformCounterRestrictive interface { @@ -1834,6 +1835,11 @@ func (v *EthereumUpkeepCounter) SetSpread(testRange *big.Int, interval *big.Int) return v.client.ProcessTransaction(tx) } +// Just pass for non-logtrigger +func (v *EthereumUpkeepCounter) Start() error { + return nil +} + // EthereumUpkeepPerformCounterRestrictive represents keeper consumer (upkeep) counter contract type EthereumUpkeepPerformCounterRestrictive struct { client blockchain.EVMClient From 18c7237181e8f9134e2f4992ba16b64f3548725d Mon Sep 17 00:00:00 2001 From: FelixFan1992 Date: Mon, 11 Mar 2024 16:16:26 -0400 Subject: [PATCH 04/15] check simulation address for zkEVM (#12378) * check simulation address for zkEVM * update go wrappers * fix tests --- .changeset/dirty-weeks-shave.md | 5 +++++ contracts/src/v0.8/automation/AutomationBase.sol | 2 +- contracts/test/v0.8/automation/KeeperRegistry1_2.test.ts | 2 +- .../keeper_consumer_wrapper/keeper_consumer_wrapper.go | 2 +- .../keeper_registry_wrapper1_2/keeper_registry_wrapper1_2.go | 2 +- .../generated-wrapper-dependency-versions-do-not-edit.txt | 4 ++-- 6 files changed, 11 insertions(+), 6 deletions(-) create mode 100644 .changeset/dirty-weeks-shave.md diff --git a/.changeset/dirty-weeks-shave.md b/.changeset/dirty-weeks-shave.md new file mode 100644 index 00000000000..9fcb0c39ab1 --- /dev/null +++ b/.changeset/dirty-weeks-shave.md @@ -0,0 +1,5 @@ +--- +"chainlink": minor +--- + +update AutomationBase interface to check for ready only address on polygon zkEVM diff --git a/contracts/src/v0.8/automation/AutomationBase.sol b/contracts/src/v0.8/automation/AutomationBase.sol index 8267fbc6a4e..72ee8aaeff2 100644 --- a/contracts/src/v0.8/automation/AutomationBase.sol +++ b/contracts/src/v0.8/automation/AutomationBase.sol @@ -10,7 +10,7 @@ contract AutomationBase { */ function _preventExecution() internal view { // solhint-disable-next-line avoid-tx-origin - if (tx.origin != address(0)) { + if (tx.origin != address(0) && tx.origin != address(0x1111111111111111111111111111111111111111)) { revert OnlySimulatedBackend(); } } diff --git a/contracts/test/v0.8/automation/KeeperRegistry1_2.test.ts b/contracts/test/v0.8/automation/KeeperRegistry1_2.test.ts index 31d1ba297e0..7da13b9e266 100644 --- a/contracts/test/v0.8/automation/KeeperRegistry1_2.test.ts +++ b/contracts/test/v0.8/automation/KeeperRegistry1_2.test.ts @@ -28,7 +28,7 @@ import { toWei } from '../../test-helpers/helpers' const BYTECODE = KeeperRegistryFactory.bytecode const BYTECODE_CHECKSUM = - '0x8e465b93eae52724b7edbef5bc133c96520dad33f959373e5d026549ca40158c' + '0x4a23953416a64a0fa4c943954d9a92059f862257440f2cbcf5f238314b89f416' describe('KeeperRegistry1_2 - Frozen [ @skip-coverage ]', () => { it('has not changed', () => { diff --git a/core/gethwrappers/generated/keeper_consumer_wrapper/keeper_consumer_wrapper.go b/core/gethwrappers/generated/keeper_consumer_wrapper/keeper_consumer_wrapper.go index feb614aa83b..c283db26bbd 100644 --- a/core/gethwrappers/generated/keeper_consumer_wrapper/keeper_consumer_wrapper.go +++ b/core/gethwrappers/generated/keeper_consumer_wrapper/keeper_consumer_wrapper.go @@ -30,7 +30,7 @@ var ( var KeeperConsumerMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"updateInterval\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"OnlySimulatedBackend\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"checkData\",\"type\":\"bytes\"}],\"name\":\"checkUpkeep\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"upkeepNeeded\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"counter\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"interval\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastTimeStamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"}],\"name\":\"performUpkeep\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60a060405234801561001057600080fd5b5060405161033838038061033883398101604081905261002f9161003f565b6080524260015560008055610058565b60006020828403121561005157600080fd5b5051919050565b6080516102c6610072600039600060cc01526102c66000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c806361bc221a1161005057806361bc221a1461009d5780636e04ff0d146100a6578063947a36fb146100c757600080fd5b80633f3b3b271461006c5780634585e33b14610088575b600080fd5b61007560015481565b6040519081526020015b60405180910390f35b61009b610096366004610191565b6100ee565b005b61007560005481565b6100b96100b4366004610191565b610103565b60405161007f929190610203565b6100757f000000000000000000000000000000000000000000000000000000000000000081565b6000546100fc906001610279565b6000555050565b6000606061010f610157565b6001848481818080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250959a92995091975050505050505050565b321561018f576040517fb60ac5db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b600080602083850312156101a457600080fd5b823567ffffffffffffffff808211156101bc57600080fd5b818501915085601f8301126101d057600080fd5b8135818111156101df57600080fd5b8660208285010111156101f157600080fd5b60209290920196919550909350505050565b821515815260006020604081840152835180604085015260005b818110156102395785810183015185820160600152820161021d565b5060006060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116850101925050509392505050565b808201808211156102b3577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9291505056fea164736f6c6343000810000a", + Bin: "0x60a060405234801561001057600080fd5b5060405161035a38038061035a83398101604081905261002f9161003f565b6080524260015560008055610058565b60006020828403121561005157600080fd5b5051919050565b6080516102e8610072600039600060cc01526102e86000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c806361bc221a1161005057806361bc221a1461009d5780636e04ff0d146100a6578063947a36fb146100c757600080fd5b80633f3b3b271461006c5780634585e33b14610088575b600080fd5b61007560015481565b6040519081526020015b60405180910390f35b61009b6100963660046101b3565b6100ee565b005b61007560005481565b6100b96100b43660046101b3565b610103565b60405161007f929190610225565b6100757f000000000000000000000000000000000000000000000000000000000000000081565b6000546100fc90600161029b565b6000555050565b6000606061010f610157565b6001848481818080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250959a92995091975050505050505050565b321580159061017a57503273111111111111111111111111111111111111111114155b156101b1576040517fb60ac5db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b600080602083850312156101c657600080fd5b823567ffffffffffffffff808211156101de57600080fd5b818501915085601f8301126101f257600080fd5b81358181111561020157600080fd5b86602082850101111561021357600080fd5b60209290920196919550909350505050565b821515815260006020604081840152835180604085015260005b8181101561025b5785810183015185820160600152820161023f565b5060006060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116850101925050509392505050565b808201808211156102d5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9291505056fea164736f6c6343000810000a", } var KeeperConsumerABI = KeeperConsumerMetaData.ABI diff --git a/core/gethwrappers/generated/keeper_registry_wrapper1_2/keeper_registry_wrapper1_2.go b/core/gethwrappers/generated/keeper_registry_wrapper1_2/keeper_registry_wrapper1_2.go index 6fa0d55b78d..027bfc274e2 100644 --- a/core/gethwrappers/generated/keeper_registry_wrapper1_2/keeper_registry_wrapper1_2.go +++ b/core/gethwrappers/generated/keeper_registry_wrapper1_2/keeper_registry_wrapper1_2.go @@ -54,7 +54,7 @@ type State struct { var KeeperRegistryMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"link\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"linkEthFeed\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"fastGasFeed\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"paymentPremiumPPB\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"flatFeeMicroLink\",\"type\":\"uint32\"},{\"internalType\":\"uint24\",\"name\":\"blockCountPerTurn\",\"type\":\"uint24\"},{\"internalType\":\"uint32\",\"name\":\"checkGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint24\",\"name\":\"stalenessSeconds\",\"type\":\"uint24\"},{\"internalType\":\"uint16\",\"name\":\"gasCeilingMultiplier\",\"type\":\"uint16\"},{\"internalType\":\"uint96\",\"name\":\"minUpkeepSpend\",\"type\":\"uint96\"},{\"internalType\":\"uint32\",\"name\":\"maxPerformGas\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"fallbackGasPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fallbackLinkPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"transcoder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"registrar\",\"type\":\"address\"}],\"internalType\":\"structConfig\",\"name\":\"config\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ArrayHasNoEntries\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CannotCancel\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DuplicateEntry\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GasLimitCanOnlyIncrease\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GasLimitOutsideRange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IndexOutOfRange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientFunds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidDataLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidPayee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"KeepersMustTakeTurns\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MigrationNotPermitted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotAContract\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyActiveKeepers\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByLINKToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrRegistrar\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByPayee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByProposedPayee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySimulatedBackend\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ParameterLengthError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PaymentGreaterThanAllLINK\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"TargetCheckReverted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TranscoderNotSet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpkeepNotActive\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpkeepNotCanceled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpkeepNotNeeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ValueNotChanged\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"paymentPremiumPPB\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"flatFeeMicroLink\",\"type\":\"uint32\"},{\"internalType\":\"uint24\",\"name\":\"blockCountPerTurn\",\"type\":\"uint24\"},{\"internalType\":\"uint32\",\"name\":\"checkGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint24\",\"name\":\"stalenessSeconds\",\"type\":\"uint24\"},{\"internalType\":\"uint16\",\"name\":\"gasCeilingMultiplier\",\"type\":\"uint16\"},{\"internalType\":\"uint96\",\"name\":\"minUpkeepSpend\",\"type\":\"uint96\"},{\"internalType\":\"uint32\",\"name\":\"maxPerformGas\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"fallbackGasPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fallbackLinkPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"transcoder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"registrar\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structConfig\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"amount\",\"type\":\"uint96\"}],\"name\":\"FundsAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"FundsWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"keepers\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"payees\",\"type\":\"address[]\"}],\"name\":\"KeepersUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"amount\",\"type\":\"uint96\"}],\"name\":\"OwnerFundsWithdrawn\",\"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\":\"address\",\"name\":\"keeper\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"PayeeshipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"keeper\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"PayeeshipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"keeper\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"payee\",\"type\":\"address\"}],\"name\":\"PaymentWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"atBlockHeight\",\"type\":\"uint64\"}],\"name\":\"UpkeepCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"gasLimit\",\"type\":\"uint96\"}],\"name\":\"UpkeepGasLimitSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"remainingBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"destination\",\"type\":\"address\"}],\"name\":\"UpkeepMigrated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"payment\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"}],\"name\":\"UpkeepPerformed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startingBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"importedFrom\",\"type\":\"address\"}],\"name\":\"UpkeepReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"executeGas\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"}],\"name\":\"UpkeepRegistered\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"FAST_GAS_FEED\",\"outputs\":[{\"internalType\":\"contractAggregatorV3Interface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"LINK\",\"outputs\":[{\"internalType\":\"contractLinkTokenInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"LINK_ETH_FEED\",\"outputs\":[{\"internalType\":\"contractAggregatorV3Interface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"keeper\",\"type\":\"address\"}],\"name\":\"acceptPayeeship\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint96\",\"name\":\"amount\",\"type\":\"uint96\"}],\"name\":\"addFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"cancelUpkeep\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"}],\"name\":\"checkUpkeep\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"maxLinkPayment\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"adjustedGasWei\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"linkEth\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"startIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxCount\",\"type\":\"uint256\"}],\"name\":\"getActiveUpkeepIDs\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"query\",\"type\":\"address\"}],\"name\":\"getKeeperInfo\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"payee\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"active\",\"type\":\"bool\"},{\"internalType\":\"uint96\",\"name\":\"balance\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"}],\"name\":\"getMaxPaymentForGas\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"maxPayment\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getMinBalanceForUpkeep\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"minBalance\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"peer\",\"type\":\"address\"}],\"name\":\"getPeerRegistryMigrationPermission\",\"outputs\":[{\"internalType\":\"enumKeeperRegistry1_2.MigrationPermission\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"nonce\",\"type\":\"uint32\"},{\"internalType\":\"uint96\",\"name\":\"ownerLinkBalance\",\"type\":\"uint96\"},{\"internalType\":\"uint256\",\"name\":\"expectedLinkBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"numUpkeeps\",\"type\":\"uint256\"}],\"internalType\":\"structState\",\"name\":\"state\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"paymentPremiumPPB\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"flatFeeMicroLink\",\"type\":\"uint32\"},{\"internalType\":\"uint24\",\"name\":\"blockCountPerTurn\",\"type\":\"uint24\"},{\"internalType\":\"uint32\",\"name\":\"checkGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint24\",\"name\":\"stalenessSeconds\",\"type\":\"uint24\"},{\"internalType\":\"uint16\",\"name\":\"gasCeilingMultiplier\",\"type\":\"uint16\"},{\"internalType\":\"uint96\",\"name\":\"minUpkeepSpend\",\"type\":\"uint96\"},{\"internalType\":\"uint32\",\"name\":\"maxPerformGas\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"fallbackGasPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fallbackLinkPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"transcoder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"registrar\",\"type\":\"address\"}],\"internalType\":\"structConfig\",\"name\":\"config\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"keepers\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getUpkeep\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"executeGas\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"checkData\",\"type\":\"bytes\"},{\"internalType\":\"uint96\",\"name\":\"balance\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"lastKeeper\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"maxValidBlocknumber\",\"type\":\"uint64\"},{\"internalType\":\"uint96\",\"name\":\"amountSpent\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"address\",\"name\":\"destination\",\"type\":\"address\"}],\"name\":\"migrateUpkeeps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onTokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"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\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"}],\"name\":\"performUpkeep\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedUpkeeps\",\"type\":\"bytes\"}],\"name\":\"receiveUpkeeps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"recoverFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"gasLimit\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"checkData\",\"type\":\"bytes\"}],\"name\":\"registerUpkeep\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"paymentPremiumPPB\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"flatFeeMicroLink\",\"type\":\"uint32\"},{\"internalType\":\"uint24\",\"name\":\"blockCountPerTurn\",\"type\":\"uint24\"},{\"internalType\":\"uint32\",\"name\":\"checkGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint24\",\"name\":\"stalenessSeconds\",\"type\":\"uint24\"},{\"internalType\":\"uint16\",\"name\":\"gasCeilingMultiplier\",\"type\":\"uint16\"},{\"internalType\":\"uint96\",\"name\":\"minUpkeepSpend\",\"type\":\"uint96\"},{\"internalType\":\"uint32\",\"name\":\"maxPerformGas\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"fallbackGasPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fallbackLinkPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"transcoder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"registrar\",\"type\":\"address\"}],\"internalType\":\"structConfig\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"setConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"keepers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"payees\",\"type\":\"address[]\"}],\"name\":\"setKeepers\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"peer\",\"type\":\"address\"},{\"internalType\":\"enumKeeperRegistry1_2.MigrationPermission\",\"name\":\"permission\",\"type\":\"uint8\"}],\"name\":\"setPeerRegistryMigrationPermission\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"gasLimit\",\"type\":\"uint32\"}],\"name\":\"setUpkeepGasLimit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"keeper\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"proposed\",\"type\":\"address\"}],\"name\":\"transferPayeeship\",\"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\":[],\"name\":\"upkeepTranscoderVersion\",\"outputs\":[{\"internalType\":\"enumUpkeepFormat\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"withdrawFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawOwnerFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"withdrawPayment\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60e06040523480156200001157600080fd5b50604051620066f2380380620066f2833981016040819052620000349162000577565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be8162000107565b50506001600255506003805460ff191690556001600160601b0319606085811b821660805284811b821660a05283901b1660c052620000fd81620001b3565b50505050620007fa565b6001600160a01b038116331415620001625760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b620001bd620004a8565b600d5460e082015163ffffffff91821691161015620001ef57604051630e6af04160e21b815260040160405180910390fd5b604051806101200160405280826000015163ffffffff168152602001826020015163ffffffff168152602001826040015162ffffff168152602001826060015163ffffffff168152602001826080015162ffffff1681526020018260a0015161ffff1681526020018260c001516001600160601b031681526020018260e0015163ffffffff168152602001600c60010160049054906101000a900463ffffffff1663ffffffff16815250600c60008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160086101000a81548162ffffff021916908362ffffff160217905550606082015181600001600b6101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600f6101000a81548162ffffff021916908362ffffff16021790555060a08201518160000160126101000a81548161ffff021916908361ffff16021790555060c08201518160000160146101000a8154816001600160601b0302191690836001600160601b0316021790555060e08201518160010160006101000a81548163ffffffff021916908363ffffffff1602179055506101008201518160010160046101000a81548163ffffffff021916908363ffffffff160217905550905050806101000151600e81905550806101200151600f81905550806101400151601260006101000a8154816001600160a01b0302191690836001600160a01b03160217905550806101600151601360006101000a8154816001600160a01b0302191690836001600160a01b031602179055507ffe125a41957477226ba20f85ef30a4024ea3bb8d066521ddc16df3f2944de325816040516200049d9190620006c3565b60405180910390a150565b6000546001600160a01b03163314620005045760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640162000082565b565b80516001600160a01b03811681146200051e57600080fd5b919050565b805161ffff811681146200051e57600080fd5b805162ffffff811681146200051e57600080fd5b805163ffffffff811681146200051e57600080fd5b80516001600160601b03811681146200051e57600080fd5b6000806000808486036101e08112156200059057600080fd5b6200059b8662000506565b9450620005ab6020870162000506565b9350620005bb6040870162000506565b925061018080605f1983011215620005d257600080fd5b620005dc620007c2565b9150620005ec606088016200054a565b8252620005fc608088016200054a565b60208301526200060f60a0880162000536565b60408301526200062260c088016200054a565b60608301526200063560e0880162000536565b60808301526101006200064a81890162000523565b60a08401526101206200065f818a016200055f565b60c085015261014062000674818b016200054a565b60e0860152610160808b015184870152848b0151838701526200069b6101a08c0162000506565b82870152620006ae6101c08c0162000506565b90860152509699959850939650909450505050565b815163ffffffff16815261018081016020830151620006ea602084018263ffffffff169052565b50604083015162000702604084018262ffffff169052565b5060608301516200071b606084018263ffffffff169052565b50608083015162000733608084018262ffffff169052565b5060a08301516200074a60a084018261ffff169052565b5060c08301516200076660c08401826001600160601b03169052565b5060e08301516200077f60e084018263ffffffff169052565b5061010083810151908301526101208084015190830152610140808401516001600160a01b03908116918401919091526101609384015116929091019190915290565b60405161018081016001600160401b0381118282101715620007f457634e487b7160e01b600052604160045260246000fd5b60405290565b60805160601c60a05160601c60c05160601c615e7962000879600039600081816104240152614126015260008181610575015261420701526000818161030401528181610e10015281816110d10152818161192201528181611cad01528181611da1015281816121990152818161251701526125aa0152615e796000f3fe608060405234801561001057600080fd5b506004361061025c5760003560e01c806393f0c1fc11610145578063b7fdb436116100bd578063da5c67411161008c578063ef47a0ce11610071578063ef47a0ce1461066a578063f2fde38b1461067d578063faa3e9961461069057600080fd5b8063da5c674114610636578063eb5dcd6c1461065757600080fd5b8063b7fdb436146105c5578063c41b813a146105d8578063c7c3a19a146105fc578063c80480221461062357600080fd5b8063a72aa27e11610114578063b121e147116100f9578063b121e14714610597578063b657bc9c146105aa578063b79550be146105bd57600080fd5b8063a72aa27e1461055d578063ad1783611461057057600080fd5b806393f0c1fc146104f4578063948108f714610524578063a4c0ed3614610537578063a710b2211461054a57600080fd5b80635c975abb116101d85780637d9b97e0116101a757806385c1b0ba1161018c57806385c1b0ba146104b05780638da5cb5b146104c35780638e86139b146104e157600080fd5b80637d9b97e0146104a05780638456cb59146104a857600080fd5b80635c975abb1461045b578063744bfe611461047257806379ba5097146104855780637bbaf1ea1461048d57600080fd5b80631b6b6d231161022f5780633f4ba83a116102145780633f4ba83a146104175780634584a4191461041f57806348013d7b1461044657600080fd5b80631b6b6d23146102ff5780631e12b8a51461034b57600080fd5b806306e3b63214610261578063181f5a771461028a5780631865c57d146102d3578063187256e8146102ea575b600080fd5b61027461026f3660046152fd565b6106d6565b60405161028191906157fb565b60405180910390f35b6102c66040518060400160405280601481526020017f4b6565706572526567697374727920312e322e3000000000000000000000000081525081565b604051610281919061583f565b6102db6107d2565b604051610281939291906159cc565b6102fd6102f8366004614dda565b610a8a565b005b6103267f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610281565b6103d7610359366004614d8c565b73ffffffffffffffffffffffffffffffffffffffff90811660009081526008602090815260409182902082516060810184528154948516808252740100000000000000000000000000000000000000009095046bffffffffffffffffffffffff1692810183905260019091015460ff16151592018290529192909190565b6040805173ffffffffffffffffffffffffffffffffffffffff909416845291151560208401526bffffffffffffffffffffffff1690820152606001610281565b6102fd610afb565b6103267f000000000000000000000000000000000000000000000000000000000000000081565b61044e600081565b6040516102819190615982565b60035460ff165b6040519015158152602001610281565b6102fd61048036600461528e565b610b0d565b6102fd610e99565b61046261049b3660046152b1565b610f9b565b6102fd610ff9565b6102fd611167565b6102fd6104be366004614f45565b611177565b60005473ffffffffffffffffffffffffffffffffffffffff16610326565b6102fd6104ef3660046150e6565b611953565b61050761050236600461525c565b611b53565b6040516bffffffffffffffffffffffff9091168152602001610281565b6102fd610532366004615342565b611b87565b6102fd610545366004614e15565b611d89565b6102fd610558366004614da7565b611f84565b6102fd61056b36600461531f565b61221e565b6103267f000000000000000000000000000000000000000000000000000000000000000081565b6102fd6105a5366004614d8c565b6123c5565b6105076105b836600461525c565b6124bd565b6102fd6124de565b6102fd6105d3366004614ee5565b612649565b6105eb6105e636600461528e565b6129aa565b604051610281959493929190615852565b61060f61060a36600461525c565b612c5f565b6040516102819897969594939291906155f1565b6102fd61063136600461525c565b612dea565b610649610644366004614e6f565b612fe0565b604051908152602001610281565b6102fd610665366004614da7565b6131d7565b6102fd61067836600461517e565b613336565b6102fd61068b366004614d8c565b613682565b6106c961069e366004614d8c565b73ffffffffffffffffffffffffffffffffffffffff166000908152600b602052604090205460ff1690565b6040516102819190615968565b606060006106e46005613696565b905080841061071f576040517f1390f2a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826107315761072e8482615c60565b92505b60008367ffffffffffffffff81111561074c5761074c615e3d565b604051908082528060200260200182016040528015610775578160200160208202803683370190505b50905060005b848110156107c7576107986107908288615ba0565b6005906136a0565b8282815181106107aa576107aa615e0e565b6020908102919091010152806107bf81615d24565b91505061077b565b509150505b92915050565b6040805160808101825260008082526020820181905291810182905260608101919091526040805161018081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081018290526101608101919091526040805161012081018252600c5463ffffffff8082168352640100000000808304821660208086019190915262ffffff6801000000000000000085048116868801526b010000000000000000000000850484166060878101919091526f010000000000000000000000000000008604909116608087015261ffff720100000000000000000000000000000000000086041660a08701526bffffffffffffffffffffffff74010000000000000000000000000000000000000000909504851660c0870152600d5480851660e0880152929092049092166101008501819052875260105490921690860152601154928501929092526109546005613696565b606080860191909152815163ffffffff908116855260208084015182168187015260408085015162ffffff90811682890152858501518416948801949094526080808601519094169387019390935260a08085015161ffff169087015260c0808501516bffffffffffffffffffffffff169087015260e08085015190921691860191909152600e54610100860152600f5461012086015260125473ffffffffffffffffffffffffffffffffffffffff90811661014087015260135416610160860152600480548351818402810184019094528084528793879390918391830182828015610a7757602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610a4c575b5050505050905093509350935050909192565b610a926136b3565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600b6020526040902080548291907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001836003811115610af257610af2615db0565b02179055505050565b610b036136b3565b610b0b613734565b565b8073ffffffffffffffffffffffffffffffffffffffff8116610b5b576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526007602052604090206002015483906c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610bcd576040517fa47c170600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000848152600760205260409020600101544364010000000090910467ffffffffffffffff161115610c2b576040517fff84e5dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c54600085815260076020526040812080546002909101546bffffffffffffffffffffffff740100000000000000000000000000000000000000009094048416939182169291169083821015610caf57610c868285615c77565b9050826bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115610caf5750815b6000610cbb8285615c77565b60008a815260076020526040902080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169055601054909150610d0e9083906bffffffffffffffffffffffff16615bb8565b601080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff928316179055601154610d5691831690615c60565b601155604080516bffffffffffffffffffffffff8316815273ffffffffffffffffffffffffffffffffffffffff8a1660208201528a917ff3b5906e5672f3e524854103bcafbbdba80dbdfeca2c35e116127b1060a68318910160405180910390a26040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89811660048301526bffffffffffffffffffffffff831660248301527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044015b602060405180830381600087803b158015610e5557600080fd5b505af1158015610e69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8d919061507d565b50505050505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610f1f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6000610fa56137b1565b610ff1610fec338686868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061381e915050565b613918565b949350505050565b6110016136b3565b6010546011546bffffffffffffffffffffffff90911690611023908290615c60565b601155601080547fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001690556040516bffffffffffffffffffffffff821681527f1d07d0b0be43d3e5fee41a80b579af370affee03fa595bf56d5d4c19328162f19060200160405180910390a16040517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526bffffffffffffffffffffffff821660248201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a9059cbb906044015b602060405180830381600087803b15801561112b57600080fd5b505af115801561113f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611163919061507d565b5050565b61116f6136b3565b610b0b613d39565b600173ffffffffffffffffffffffffffffffffffffffff82166000908152600b602052604090205460ff1660038111156111b3576111b3615db0565b141580156111fb5750600373ffffffffffffffffffffffffffffffffffffffff82166000908152600b602052604090205460ff1660038111156111f8576111f8615db0565b14155b15611232576040517f0ebeec3c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60125473ffffffffffffffffffffffffffffffffffffffff16611281576040517fd12d7d8d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816112b8576040517f2c2fc94100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290526000808567ffffffffffffffff81111561130c5761130c615e3d565b60405190808252806020026020018201604052801561133f57816020015b606081526020019060019003908161132a5790505b50905060008667ffffffffffffffff81111561135d5761135d615e3d565b6040519080825280602002602001820160405280156113e257816020015b6040805160e08101825260008082526020808301829052928201819052606082018190526080820181905260a0820181905260c082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191018161137b5790505b50905060005b878110156116e25788888281811061140257611402615e0e565b60209081029290920135600081815260078452604090819020815160e08101835281546bffffffffffffffffffffffff808216835273ffffffffffffffffffffffffffffffffffffffff6c0100000000000000000000000092839004811698840198909852600184015463ffffffff81169584019590955267ffffffffffffffff6401000000008604166060840152938190048716608083015260029092015492831660a0820152910490931660c084018190529098509196505033146114f5576040517fa47c170600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606085015167ffffffffffffffff9081161461153d576040517fd096219c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8482828151811061155057611550615e0e565b6020026020010181905250600a6000878152602001908152602001600020805461157990615cd0565b80601f01602080910402602001604051908101604052809291908181526020018280546115a590615cd0565b80156115f25780601f106115c7576101008083540402835291602001916115f2565b820191906000526020600020905b8154815290600101906020018083116115d557829003601f168201915b505050505083828151811061160957611609615e0e565b6020908102919091010152845161162e906bffffffffffffffffffffffff1685615ba0565b600087815260076020908152604080832083815560018101849055600201839055600a909152812091955061166391906148f8565b61166e600587613d94565b508451604080516bffffffffffffffffffffffff909216825273ffffffffffffffffffffffffffffffffffffffff8916602083015287917fb38647142fbb1ea4c000fc4569b37a4e9a9f6313317b84ee3e5326c1a6cd06ff910160405180910390a2806116da81615d24565b9150506113e8565b50826011546116f19190615c60565b60115560405160009061170e908a908a90859087906020016156ad565b60405160208183030381529060405290508673ffffffffffffffffffffffffffffffffffffffff16638e86139b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c71249ab60008b73ffffffffffffffffffffffffffffffffffffffff166348013d7b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156117c157600080fd5b505afa1580156117d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f9919061515d565b866040518463ffffffff1660e01b815260040161181893929190615990565b60006040518083038186803b15801561183057600080fd5b505afa158015611844573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261188a9190810190615128565b6040518263ffffffff1660e01b81526004016118a6919061583f565b600060405180830381600087803b1580156118c057600080fd5b505af11580156118d4573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152602482018890527f000000000000000000000000000000000000000000000000000000000000000016925063a9059cbb9150604401610e3b565b6002336000908152600b602052604090205460ff16600381111561197957611979615db0565b141580156119ab57506003336000908152600b602052604090205460ff1660038111156119a8576119a8615db0565b14155b156119e2576040517f0ebeec3c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080806119f284860186614f99565b92509250925060005b8351811015611b4b57611ab8848281518110611a1957611a19615e0e565b6020026020010151848381518110611a3357611a33615e0e565b602002602001015160800151858481518110611a5157611a51615e0e565b602002602001015160400151868581518110611a6f57611a6f615e0e565b602002602001015160c00151878681518110611a8d57611a8d615e0e565b602002602001015160000151878781518110611aab57611aab615e0e565b6020026020010151613da0565b838181518110611aca57611aca615e0e565b60200260200101517f74931a144e43a50694897f241d973aecb5024c0e910f9bb80a163ea3c1cf5a71848381518110611b0557611b05615e0e565b60209081029190910181015151604080516bffffffffffffffffffffffff909216825233928201929092520160405180910390a280611b4381615d24565b9150506119fb565b505050505050565b6000806000611b606140f3565b915091506000611b718360006142ee565b9050611b7e858284614333565b95945050505050565b6000828152600760205260409020600101548290640100000000900467ffffffffffffffff90811614611be6576040517fd096219c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083815260076020526040902054611c0e9083906bffffffffffffffffffffffff16615bb8565b600084815260076020526040902080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff928316179055601154611c6291841690615ba0565b6011556040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526bffffffffffffffffffffffff831660448201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906323b872dd90606401602060405180830381600087803b158015611d0657600080fd5b505af1158015611d1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d3e919061507d565b506040516bffffffffffffffffffffffff83168152339084907fafd24114486da8ebfc32f3626dada8863652e187461aa74d4bfa7348915062039060200160405180910390a3505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614611df8576040517fc8bad78d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208114611e32576040517fdfe9309000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e408284018461525c565b600081815260076020526040902060010154909150640100000000900467ffffffffffffffff90811614611ea0576040517fd096219c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081815260076020526040902054611ec89085906bffffffffffffffffffffffff16615bb8565b600082815260076020526040902080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff92909216919091179055601154611f1f908590615ba0565b6011556040516bffffffffffffffffffffffff8516815273ffffffffffffffffffffffffffffffffffffffff86169082907fafd24114486da8ebfc32f3626dada8863652e187461aa74d4bfa7348915062039060200160405180910390a35050505050565b8073ffffffffffffffffffffffffffffffffffffffff8116611fd2576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83811660009081526008602090815260409182902082516060810184528154948516808252740100000000000000000000000000000000000000009095046bffffffffffffffffffffffff16928101929092526001015460ff16151591810191909152903314612083576040517fcebf515b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff808516600090815260086020908152604090912080549092169091558101516011546120d2916bffffffffffffffffffffffff1690615c60565b60115560208082015160405133815273ffffffffffffffffffffffffffffffffffffffff808716936bffffffffffffffffffffffff90931692908816917f9819093176a1851202c7bcfa46845809b4e47c261866550e94ed3775d2f40698910160405180910390a460208101516040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301526bffffffffffffffffffffffff90921660248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb90604401602060405180830381600087803b1580156121df57600080fd5b505af11580156121f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612217919061507d565b5050505050565b6000828152600760205260409020600101548290640100000000900467ffffffffffffffff9081161461227d576040517fd096219c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526007602052604090206002015483906c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146122ef576040517fa47c170600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108fc8363ffffffff1610806123105750600d5463ffffffff908116908416115b15612347576040517f14c237fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526007602090815260409182902060010180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff8716908117909155915191825285917fc24c07e655ce79fba8a589778987d3c015bc6af1632bb20cf9182e02a65d972c910160405180910390a250505050565b73ffffffffffffffffffffffffffffffffffffffff818116600090815260096020526040902054163314612425576040517f6752e7aa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81811660008181526008602090815260408083208054337fffffffffffffffffffffffff000000000000000000000000000000000000000080831682179093556009909452828520805490921690915590519416939092849290917f78af32efdcad432315431e9b03d27e6cd98fb79c405fdc5af7c1714d9c0f75b39190a45050565b6000818152600760205260408120600101546107cc9063ffffffff16611b53565b6124e66136b3565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b15801561256e57600080fd5b505afa158015612582573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125a69190615275565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33601154846125f39190615c60565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401611111565b6126516136b3565b82811415806126605750600283105b15612697576040517fcf54c06a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b600454811015612723576000600482815481106126b9576126b9615e0e565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168252600890526040902060010180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055508061271b81615d24565b91505061269a565b5060005b8381101561295957600085858381811061274357612743615e0e565b90506020020160208101906127589190614d8c565b73ffffffffffffffffffffffffffffffffffffffff80821660009081526008602052604081208054939450929091169086868681811061279a5761279a615e0e565b90506020020160208101906127af9190614d8c565b905073ffffffffffffffffffffffffffffffffffffffff81161580612842575073ffffffffffffffffffffffffffffffffffffffff82161580159061282057508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612842575073ffffffffffffffffffffffffffffffffffffffff81811614155b15612879576040517fb387a23800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600183015460ff16156128b8576040517f357d0cc400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600183810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016909117905573ffffffffffffffffffffffffffffffffffffffff818116146129425782547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff82161783555b50505050808061295190615d24565b915050612727565b5061296660048585614932565b507f056264c94f28bb06c99d13f0446eb96c67c215d8d707bce2655a98ddf1c0b71f8484848460405161299c949392919061567b565b60405180910390a150505050565b60606000806000806129ba614410565b6000878152600760209081526040808320815160e08101835281546bffffffffffffffffffffffff808216835273ffffffffffffffffffffffffffffffffffffffff6c0100000000000000000000000092839004811684880152600185015463ffffffff81168588015267ffffffffffffffff64010000000082041660608601528390048116608085015260029094015490811660a08401520490911660c08201528a8452600a90925280832090519192917f6e04ff0d0000000000000000000000000000000000000000000000000000000091612a9a91602401615889565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600080836080015173ffffffffffffffffffffffffffffffffffffffff16600c600001600b9054906101000a900463ffffffff1663ffffffff1684604051612b4191906155d5565b60006040518083038160008787f1925050503d8060008114612b7f576040519150601f19603f3d011682016040523d82523d6000602084013e612b84565b606091505b509150915081612bc257806040517f96c36235000000000000000000000000000000000000000000000000000000008152600401610f16919061583f565b80806020019051810190612bd69190615098565b9950915081612c11576040517f865676e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612c208b8d8c600061381e565b9050612c358582600001518360600151614448565b6060810151608082015160a083015160c0909301519b9e919d509b50909998509650505050505050565b6000818152600760209081526040808320815160e08101835281546bffffffffffffffffffffffff808216835273ffffffffffffffffffffffffffffffffffffffff6c01000000000000000000000000928390048116848801908152600186015463ffffffff811686890181905267ffffffffffffffff64010000000083041660608881019182529287900485166080890181905260029099015495861660a089019081529690950490931660c087019081528b8b52600a9099529689208551915198519351945181548b9a8b998a998a998a998a9992989397929692959394939092908690612d4e90615cd0565b80601f0160208091040260200160405190810160405280929190818152602001828054612d7a90615cd0565b8015612dc75780601f10612d9c57610100808354040283529160200191612dc7565b820191906000526020600020905b815481529060010190602001808311612daa57829003601f168201915b505050505095509850985098509850985098509850985050919395975091939597565b60008181526007602052604081206001015467ffffffffffffffff6401000000009091048116919082141590612e3560005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16149050818015612e855750808015612e835750438367ffffffffffffffff16115b155b15612ebc576040517ffbc0357800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80158015612f0157506000848152600760205260409020600201546c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314155b15612f38576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4381612f4c57612f49603282615ba0565b90505b600085815260076020526040902060010180547fffffffffffffffffffffffffffffffffffffffff0000000000000000ffffffff1664010000000067ffffffffffffffff841602179055612fa1600586613d94565b5060405167ffffffffffffffff82169086907f91cb3bb75cfbd718bbfccc56b7f53d92d7048ef4ca39a3b7b7c6d4af1f79118190600090a35050505050565b6000805473ffffffffffffffffffffffffffffffffffffffff163314801590613021575060135473ffffffffffffffffffffffffffffffffffffffff163314155b15613058576040517fd48b678b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613063600143615c60565b600d5460408051924060208401523060601b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001690830152640100000000900460e01b7fffffffff000000000000000000000000000000000000000000000000000000001660548201526058016040516020818303038152906040528051906020012060001c905061313081878787600088888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613da092505050565b600d8054640100000000900463ffffffff1690600461314e83615d5d565b91906101000a81548163ffffffff021916908363ffffffff16021790555050807fbae366358c023f887e791d7a62f2e4316f1026bd77f6fb49501a917b3bc5d01286866040516131c692919063ffffffff92909216825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b60405180910390a295945050505050565b73ffffffffffffffffffffffffffffffffffffffff828116600090815260086020526040902054163314613237576040517fcebf515b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116331415613287576040517f8c8728c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8281166000908152600960205260409020548116908216146111635773ffffffffffffffffffffffffffffffffffffffff82811660008181526009602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169486169485179055513392917f84f7c7c80bb8ed2279b4aab5f61cd05e6374073d38f46d7f32de8c30e9e3836791a45050565b61333e6136b3565b600d5460e082015163ffffffff91821691161015613388576040517f39abc10400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051806101200160405280826000015163ffffffff168152602001826020015163ffffffff168152602001826040015162ffffff168152602001826060015163ffffffff168152602001826080015162ffffff1681526020018260a0015161ffff1681526020018260c001516bffffffffffffffffffffffff1681526020018260e0015163ffffffff168152602001600c60010160049054906101000a900463ffffffff1663ffffffff16815250600c60008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160086101000a81548162ffffff021916908362ffffff160217905550606082015181600001600b6101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600f6101000a81548162ffffff021916908362ffffff16021790555060a08201518160000160126101000a81548161ffff021916908361ffff16021790555060c08201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555060e08201518160010160006101000a81548163ffffffff021916908363ffffffff1602179055506101008201518160010160046101000a81548163ffffffff021916908363ffffffff160217905550905050806101000151600e81905550806101200151600f81905550806101400151601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806101600151601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ffe125a41957477226ba20f85ef30a4024ea3bb8d066521ddc16df3f2944de3258160405161367791906159bd565b60405180910390a150565b61368a6136b3565b61369381614562565b50565b60006107cc825490565b60006136ac8383614658565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610b0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610f16565b61373c614682565b600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b60035460ff1615610b0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610f16565b6138746040518060e00160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160608152602001600081526020016000815260200160008152602001600081525090565b60008481526007602052604081206001015463ffffffff1690806138966140f3565b9150915060006138a683876142ee565b905060006138b5858385614333565b6040805160e08101825273ffffffffffffffffffffffffffffffffffffffff8d168152602081018c90529081018a90526bffffffffffffffffffffffff909116606082015260808101959095525060a084015260c0830152509050949350505050565b60006139226146ee565b602082810151600081815260079092526040909120600101544364010000000090910467ffffffffffffffff1611613986576040517fd096219c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602080840151600090815260078252604090819020815160e08101835281546bffffffffffffffffffffffff808216835273ffffffffffffffffffffffffffffffffffffffff6c0100000000000000000000000092839004811696840196909652600184015463ffffffff81169584019590955267ffffffffffffffff640100000000860416606080850191909152948290048616608084015260029093015492831660a083015290910490921660c0830152845190850151613a4a918391614448565b60005a90506000634585e33b60e01b8660400151604051602401613a6e919061583f565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050613ae08660800151846080015183614760565b94505a613aed9083615c60565b91506000613b04838860a001518960c00151614333565b602080890151600090815260079091526040902054909150613b359082906bffffffffffffffffffffffff16615c77565b6020888101805160009081526007909252604080832080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff95861617905590518252902060020154613b9891839116615bb8565b60208881018051600090815260078352604080822060020180547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff9687161790558b5192518252808220805486166c0100000000000000000000000073ffffffffffffffffffffffffffffffffffffffff958616021790558b5190921681526008909252902054613c5191839174010000000000000000000000000000000000000000900416615bb8565b60086000896000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550866000015173ffffffffffffffffffffffffffffffffffffffff1686151588602001517fcaacad83e47cc45c280d487ec84184eee2fa3b54ebaa393bda7549f13da228f6848b60400151604051613d1d929190615a73565b60405180910390a45050505050613d346001600255565b919050565b613d416137b1565b600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586137873390565b60006136ac83836147ac565b613da86137b1565b73ffffffffffffffffffffffffffffffffffffffff85163b613df6576040517f09ee12d500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108fc8463ffffffff161080613e175750600d5463ffffffff908116908516115b15613e4e576040517f14c237fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040518060e00160405280836bffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020018563ffffffff16815260200167ffffffffffffffff801681526020018673ffffffffffffffffffffffffffffffffffffffff16815260200160006bffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff168152506007600088815260200190815260200160002060008201518160000160006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550602082015181600001600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548163ffffffff021916908363ffffffff16021790555060608201518160010160046101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550608082015181600101600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a08201518160020160006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555060c082015181600201600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050816bffffffffffffffffffffffff166011546140bc9190615ba0565b6011556000868152600a6020908152604090912082516140de928401906149ba565b506140ea60058761489f565b50505050505050565b6000806000600c600001600f9054906101000a900462ffffff1662ffffff1690506000808263ffffffff161190506000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b15801561418a57600080fd5b505afa15801561419e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141c29190615365565b5094509092508491505080156141e657506141dd8242615c60565b8463ffffffff16105b806141f2575060008113155b1561420157600e549550614205565b8095505b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b15801561426b57600080fd5b505afa15801561427f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142a39190615365565b5094509092508491505080156142c757506142be8242615c60565b8463ffffffff16105b806142d3575060008113155b156142e257600f5494506142e6565b8094505b505050509091565b600c54600090614318907201000000000000000000000000000000000000900461ffff1684615c23565b90508180156143265750803a105b156107cc57503a92915050565b6000806143436201388086615ba0565b61434d9085615c23565b600c5490915060009061436a9063ffffffff16633b9aca00615ba0565b600c5490915060009061439090640100000000900463ffffffff1664e8d4a51000615c23565b85836143a086633b9aca00615c23565b6143aa9190615c23565b6143b49190615be8565b6143be9190615ba0565b90506b033b2e3c9fd0803ce8000000811115614406576040517f2ad7547a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9695505050505050565b3215610b0b576040517fb60ac5db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526008602052604090206001015460ff166144aa576040517fcfbacfd800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82516bffffffffffffffffffffffff168111156144f3576040517f356680b700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16836020015173ffffffffffffffffffffffffffffffffffffffff16141561455d576040517f06bc104000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b73ffffffffffffffffffffffffffffffffffffffff81163314156145e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610f16565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600082600001828154811061466f5761466f615e0e565b9060005260206000200154905092915050565b60035460ff16610b0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610f16565b60028054141561475a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610f16565b60028055565b60005a61138881101561477257600080fd5b61138881039050846040820482031161478a57600080fd5b50823b61479657600080fd5b60008083516020850160008789f1949350505050565b600081815260018301602052604081205480156148955760006147d0600183615c60565b85549091506000906147e490600190615c60565b905081811461484957600086600001828154811061480457614804615e0e565b906000526020600020015490508087600001848154811061482757614827615e0e565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061485a5761485a615ddf565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506107cc565b60009150506107cc565b60008181526001830160205260408120546136ac908490849084906148f0575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556107cc565b5060006107cc565b50805461490490615cd0565b6000825580601f10614914575050565b601f0160209004906000526020600020908101906136939190614a2e565b8280548282559060005260206000209081019282156149aa579160200282015b828111156149aa5781547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff843516178255602090920191600190910190614952565b506149b6929150614a2e565b5090565b8280546149c690615cd0565b90600052602060002090601f0160209004810192826149e857600085556149aa565b82601f10614a0157805160ff19168380011785556149aa565b828001600101855582156149aa579182015b828111156149aa578251825591602001919060010190614a13565b5b808211156149b65760008155600101614a2f565b803573ffffffffffffffffffffffffffffffffffffffff81168114613d3457600080fd5b60008083601f840112614a7957600080fd5b50813567ffffffffffffffff811115614a9157600080fd5b6020830191508360208260051b8501011115614aac57600080fd5b9250929050565b600082601f830112614ac457600080fd5b81356020614ad9614ad483615b36565b615ae7565b80838252828201915082860187848660051b8901011115614af957600080fd5b60005b85811015614b7957813567ffffffffffffffff811115614b1b57600080fd5b8801603f81018a13614b2c57600080fd5b858101356040614b3e614ad483615b5a565b8281528c82848601011115614b5257600080fd5b828285018a8301376000928101890192909252508552509284019290840190600101614afc565b5090979650505050505050565b600082601f830112614b9757600080fd5b81356020614ba7614ad483615b36565b8281528181019085830160e080860288018501891015614bc657600080fd5b60005b86811015614c785781838b031215614be057600080fd5b614be8615a9a565b614bf184614d70565b8152614bfe878501614a43565b878201526040614c0f818601614d42565b9082015260608481013567ffffffffffffffff81168114614c2f57600080fd5b908201526080614c40858201614a43565b9082015260a0614c51858201614d70565b9082015260c0614c62858201614a43565b9082015285529385019391810191600101614bc9565b509198975050505050505050565b80518015158114613d3457600080fd5b60008083601f840112614ca857600080fd5b50813567ffffffffffffffff811115614cc057600080fd5b602083019150836020828501011115614aac57600080fd5b600082601f830112614ce957600080fd5b8151614cf7614ad482615b5a565b818152846020838601011115614d0c57600080fd5b610ff1826020830160208701615ca4565b803561ffff81168114613d3457600080fd5b803562ffffff81168114613d3457600080fd5b803563ffffffff81168114613d3457600080fd5b805169ffffffffffffffffffff81168114613d3457600080fd5b80356bffffffffffffffffffffffff81168114613d3457600080fd5b600060208284031215614d9e57600080fd5b6136ac82614a43565b60008060408385031215614dba57600080fd5b614dc383614a43565b9150614dd160208401614a43565b90509250929050565b60008060408385031215614ded57600080fd5b614df683614a43565b9150602083013560048110614e0a57600080fd5b809150509250929050565b60008060008060608587031215614e2b57600080fd5b614e3485614a43565b935060208501359250604085013567ffffffffffffffff811115614e5757600080fd5b614e6387828801614c96565b95989497509550505050565b600080600080600060808688031215614e8757600080fd5b614e9086614a43565b9450614e9e60208701614d42565b9350614eac60408701614a43565b9250606086013567ffffffffffffffff811115614ec857600080fd5b614ed488828901614c96565b969995985093965092949392505050565b60008060008060408587031215614efb57600080fd5b843567ffffffffffffffff80821115614f1357600080fd5b614f1f88838901614a67565b90965094506020870135915080821115614f3857600080fd5b50614e6387828801614a67565b600080600060408486031215614f5a57600080fd5b833567ffffffffffffffff811115614f7157600080fd5b614f7d86828701614a67565b9094509250614f90905060208501614a43565b90509250925092565b600080600060608486031215614fae57600080fd5b833567ffffffffffffffff80821115614fc657600080fd5b818601915086601f830112614fda57600080fd5b81356020614fea614ad483615b36565b8083825282820191508286018b848660051b890101111561500a57600080fd5b600096505b8487101561502d57803583526001969096019591830191830161500f565b509750508701359250508082111561504457600080fd5b61505087838801614b86565b9350604086013591508082111561506657600080fd5b5061507386828701614ab3565b9150509250925092565b60006020828403121561508f57600080fd5b6136ac82614c86565b600080604083850312156150ab57600080fd5b6150b483614c86565b9150602083015167ffffffffffffffff8111156150d057600080fd5b6150dc85828601614cd8565b9150509250929050565b600080602083850312156150f957600080fd5b823567ffffffffffffffff81111561511057600080fd5b61511c85828601614c96565b90969095509350505050565b60006020828403121561513a57600080fd5b815167ffffffffffffffff81111561515157600080fd5b610ff184828501614cd8565b60006020828403121561516f57600080fd5b8151600381106136ac57600080fd5b6000610180828403121561519157600080fd5b615199615ac3565b6151a283614d42565b81526151b060208401614d42565b60208201526151c160408401614d2f565b60408201526151d260608401614d42565b60608201526151e360808401614d2f565b60808201526151f460a08401614d1d565b60a082015261520560c08401614d70565b60c082015261521660e08401614d42565b60e08201526101008381013590820152610120808401359082015261014061523f818501614a43565b90820152610160615251848201614a43565b908201529392505050565b60006020828403121561526e57600080fd5b5035919050565b60006020828403121561528757600080fd5b5051919050565b600080604083850312156152a157600080fd5b82359150614dd160208401614a43565b6000806000604084860312156152c657600080fd5b83359250602084013567ffffffffffffffff8111156152e457600080fd5b6152f086828701614c96565b9497909650939450505050565b6000806040838503121561531057600080fd5b50508035926020909101359150565b6000806040838503121561533257600080fd5b82359150614dd160208401614d42565b6000806040838503121561535557600080fd5b82359150614dd160208401614d70565b600080600080600060a0868803121561537d57600080fd5b61538686614d56565b94506020860151935060408601519250606086015191506153a960808701614d56565b90509295509295909350565b8183526000602080850194508260005b858110156153fe5773ffffffffffffffffffffffffffffffffffffffff6153eb83614a43565b16875295820195908201906001016153c5565b509495945050505050565b600081518084526020808501808196508360051b8101915082860160005b8581101561545157828403895261543f84835161545e565b98850198935090840190600101615427565b5091979650505050505050565b60008151808452615476816020860160208601615ca4565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600381106154b8576154b8615db0565b9052565b805163ffffffff16825260208101516154dd602084018263ffffffff169052565b5060408101516154f4604084018262ffffff169052565b50606081015161550c606084018263ffffffff169052565b506080810151615523608084018262ffffff169052565b5060a081015161553960a084018261ffff169052565b5060c081015161555960c08401826bffffffffffffffffffffffff169052565b5060e081015161557160e084018263ffffffff169052565b50610100818101519083015261012080820151908301526101408082015173ffffffffffffffffffffffffffffffffffffffff81168285015250506101608181015173ffffffffffffffffffffffffffffffffffffffff8116848301525b50505050565b600082516155e7818460208701615ca4565b9190910192915050565b600061010073ffffffffffffffffffffffffffffffffffffffff808c16845263ffffffff8b16602085015281604085015261562e8285018b61545e565b6bffffffffffffffffffffffff998a16606086015297811660808501529590951660a08301525067ffffffffffffffff9290921660c083015290931660e090930192909252949350505050565b60408152600061568f6040830186886153b5565b82810360208401526156a28185876153b5565b979650505050505050565b60006060808352858184015260807f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8711156156e857600080fd5b8660051b808983870137808501905081810160008152602083878403018188015281895180845260a093508385019150828b01945060005b818110156157d757855180516bffffffffffffffffffffffff1684528481015173ffffffffffffffffffffffffffffffffffffffff9081168686015260408083015163ffffffff16908601528982015167ffffffffffffffff168a860152888201511688850152858101516157a4878601826bffffffffffffffffffffffff169052565b5060c09081015173ffffffffffffffffffffffffffffffffffffffff16908401529483019460e090920191600101615720565b505087810360408901526157eb818a615409565b9c9b505050505050505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561583357835183529284019291840191600101615817565b50909695505050505050565b6020815260006136ac602083018461545e565b60a08152600061586560a083018861545e565b90508560208301528460408301528360608301528260808301529695505050505050565b600060208083526000845481600182811c9150808316806158ab57607f831692505b8583108114156158e2577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b8786018381526020018180156158ff576001811461592e57615959565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861682528782019650615959565b60008b81526020902060005b868110156159535781548482015290850190890161593a565b83019750505b50949998505050505050505050565b602081016004831061597c5761597c615db0565b91905290565b602081016107cc82846154a8565b61599a81856154a8565b6159a760208201846154a8565b606060408201526000611b7e606083018461545e565b61018081016107cc82846154bc565b600061022080830163ffffffff875116845260206bffffffffffffffffffffffff8189015116818601526040880151604086015260608801516060860152615a1760808601886154bc565b6102008501929092528451908190526102408401918086019160005b81811015615a6557835173ffffffffffffffffffffffffffffffffffffffff1685529382019392820192600101615a33565b509298975050505050505050565b6bffffffffffffffffffffffff83168152604060208201526000610ff1604083018461545e565b60405160e0810167ffffffffffffffff81118282101715615abd57615abd615e3d565b60405290565b604051610180810167ffffffffffffffff81118282101715615abd57615abd615e3d565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715615b2e57615b2e615e3d565b604052919050565b600067ffffffffffffffff821115615b5057615b50615e3d565b5060051b60200190565b600067ffffffffffffffff821115615b7457615b74615e3d565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60008219821115615bb357615bb3615d81565b500190565b60006bffffffffffffffffffffffff808316818516808303821115615bdf57615bdf615d81565b01949350505050565b600082615c1e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615c5b57615c5b615d81565b500290565b600082821015615c7257615c72615d81565b500390565b60006bffffffffffffffffffffffff83811690831681811015615c9c57615c9c615d81565b039392505050565b60005b83811015615cbf578181015183820152602001615ca7565b838111156155cf5750506000910152565b600181811c90821680615ce457607f821691505b60208210811415615d1e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615d5657615d56615d81565b5060010190565b600063ffffffff80831681811415615d7757615d77615d81565b6001019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfea164736f6c6343000806000a", + Bin: "0x60e06040523480156200001157600080fd5b506040516200671438038062006714833981016040819052620000349162000577565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be8162000107565b50506001600255506003805460ff191690556001600160601b0319606085811b821660805284811b821660a05283901b1660c052620000fd81620001b3565b50505050620007fa565b6001600160a01b038116331415620001625760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b620001bd620004a8565b600d5460e082015163ffffffff91821691161015620001ef57604051630e6af04160e21b815260040160405180910390fd5b604051806101200160405280826000015163ffffffff168152602001826020015163ffffffff168152602001826040015162ffffff168152602001826060015163ffffffff168152602001826080015162ffffff1681526020018260a0015161ffff1681526020018260c001516001600160601b031681526020018260e0015163ffffffff168152602001600c60010160049054906101000a900463ffffffff1663ffffffff16815250600c60008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160086101000a81548162ffffff021916908362ffffff160217905550606082015181600001600b6101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600f6101000a81548162ffffff021916908362ffffff16021790555060a08201518160000160126101000a81548161ffff021916908361ffff16021790555060c08201518160000160146101000a8154816001600160601b0302191690836001600160601b0316021790555060e08201518160010160006101000a81548163ffffffff021916908363ffffffff1602179055506101008201518160010160046101000a81548163ffffffff021916908363ffffffff160217905550905050806101000151600e81905550806101200151600f81905550806101400151601260006101000a8154816001600160a01b0302191690836001600160a01b03160217905550806101600151601360006101000a8154816001600160a01b0302191690836001600160a01b031602179055507ffe125a41957477226ba20f85ef30a4024ea3bb8d066521ddc16df3f2944de325816040516200049d9190620006c3565b60405180910390a150565b6000546001600160a01b03163314620005045760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640162000082565b565b80516001600160a01b03811681146200051e57600080fd5b919050565b805161ffff811681146200051e57600080fd5b805162ffffff811681146200051e57600080fd5b805163ffffffff811681146200051e57600080fd5b80516001600160601b03811681146200051e57600080fd5b6000806000808486036101e08112156200059057600080fd5b6200059b8662000506565b9450620005ab6020870162000506565b9350620005bb6040870162000506565b925061018080605f1983011215620005d257600080fd5b620005dc620007c2565b9150620005ec606088016200054a565b8252620005fc608088016200054a565b60208301526200060f60a0880162000536565b60408301526200062260c088016200054a565b60608301526200063560e0880162000536565b60808301526101006200064a81890162000523565b60a08401526101206200065f818a016200055f565b60c085015261014062000674818b016200054a565b60e0860152610160808b015184870152848b0151838701526200069b6101a08c0162000506565b82870152620006ae6101c08c0162000506565b90860152509699959850939650909450505050565b815163ffffffff16815261018081016020830151620006ea602084018263ffffffff169052565b50604083015162000702604084018262ffffff169052565b5060608301516200071b606084018263ffffffff169052565b50608083015162000733608084018262ffffff169052565b5060a08301516200074a60a084018261ffff169052565b5060c08301516200076660c08401826001600160601b03169052565b5060e08301516200077f60e084018263ffffffff169052565b5061010083810151908301526101208084015190830152610140808401516001600160a01b03908116918401919091526101609384015116929091019190915290565b60405161018081016001600160401b0381118282101715620007f457634e487b7160e01b600052604160045260246000fd5b60405290565b60805160601c60a05160601c60c05160601c615e9b62000879600039600081816104240152614126015260008181610575015261420701526000818161030401528181610e10015281816110d10152818161192201528181611cad01528181611da1015281816121990152818161251701526125aa0152615e9b6000f3fe608060405234801561001057600080fd5b506004361061025c5760003560e01c806393f0c1fc11610145578063b7fdb436116100bd578063da5c67411161008c578063ef47a0ce11610071578063ef47a0ce1461066a578063f2fde38b1461067d578063faa3e9961461069057600080fd5b8063da5c674114610636578063eb5dcd6c1461065757600080fd5b8063b7fdb436146105c5578063c41b813a146105d8578063c7c3a19a146105fc578063c80480221461062357600080fd5b8063a72aa27e11610114578063b121e147116100f9578063b121e14714610597578063b657bc9c146105aa578063b79550be146105bd57600080fd5b8063a72aa27e1461055d578063ad1783611461057057600080fd5b806393f0c1fc146104f4578063948108f714610524578063a4c0ed3614610537578063a710b2211461054a57600080fd5b80635c975abb116101d85780637d9b97e0116101a757806385c1b0ba1161018c57806385c1b0ba146104b05780638da5cb5b146104c35780638e86139b146104e157600080fd5b80637d9b97e0146104a05780638456cb59146104a857600080fd5b80635c975abb1461045b578063744bfe611461047257806379ba5097146104855780637bbaf1ea1461048d57600080fd5b80631b6b6d231161022f5780633f4ba83a116102145780633f4ba83a146104175780634584a4191461041f57806348013d7b1461044657600080fd5b80631b6b6d23146102ff5780631e12b8a51461034b57600080fd5b806306e3b63214610261578063181f5a771461028a5780631865c57d146102d3578063187256e8146102ea575b600080fd5b61027461026f36600461531f565b6106d6565b604051610281919061581d565b60405180910390f35b6102c66040518060400160405280601481526020017f4b6565706572526567697374727920312e322e3000000000000000000000000081525081565b6040516102819190615861565b6102db6107d2565b604051610281939291906159ee565b6102fd6102f8366004614dfc565b610a8a565b005b6103267f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610281565b6103d7610359366004614dae565b73ffffffffffffffffffffffffffffffffffffffff90811660009081526008602090815260409182902082516060810184528154948516808252740100000000000000000000000000000000000000009095046bffffffffffffffffffffffff1692810183905260019091015460ff16151592018290529192909190565b6040805173ffffffffffffffffffffffffffffffffffffffff909416845291151560208401526bffffffffffffffffffffffff1690820152606001610281565b6102fd610afb565b6103267f000000000000000000000000000000000000000000000000000000000000000081565b61044e600081565b60405161028191906159a4565b60035460ff165b6040519015158152602001610281565b6102fd6104803660046152b0565b610b0d565b6102fd610e99565b61046261049b3660046152d3565b610f9b565b6102fd610ff9565b6102fd611167565b6102fd6104be366004614f67565b611177565b60005473ffffffffffffffffffffffffffffffffffffffff16610326565b6102fd6104ef366004615108565b611953565b61050761050236600461527e565b611b53565b6040516bffffffffffffffffffffffff9091168152602001610281565b6102fd610532366004615364565b611b87565b6102fd610545366004614e37565b611d89565b6102fd610558366004614dc9565b611f84565b6102fd61056b366004615341565b61221e565b6103267f000000000000000000000000000000000000000000000000000000000000000081565b6102fd6105a5366004614dae565b6123c5565b6105076105b836600461527e565b6124bd565b6102fd6124de565b6102fd6105d3366004614f07565b612649565b6105eb6105e63660046152b0565b6129aa565b604051610281959493929190615874565b61060f61060a36600461527e565b612c5f565b604051610281989796959493929190615613565b6102fd61063136600461527e565b612dea565b610649610644366004614e91565b612fe0565b604051908152602001610281565b6102fd610665366004614dc9565b6131d7565b6102fd6106783660046151a0565b613336565b6102fd61068b366004614dae565b613682565b6106c961069e366004614dae565b73ffffffffffffffffffffffffffffffffffffffff166000908152600b602052604090205460ff1690565b604051610281919061598a565b606060006106e46005613696565b905080841061071f576040517f1390f2a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826107315761072e8482615c82565b92505b60008367ffffffffffffffff81111561074c5761074c615e5f565b604051908082528060200260200182016040528015610775578160200160208202803683370190505b50905060005b848110156107c7576107986107908288615bc2565b6005906136a0565b8282815181106107aa576107aa615e30565b6020908102919091010152806107bf81615d46565b91505061077b565b509150505b92915050565b6040805160808101825260008082526020820181905291810182905260608101919091526040805161018081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081018290526101608101919091526040805161012081018252600c5463ffffffff8082168352640100000000808304821660208086019190915262ffffff6801000000000000000085048116868801526b010000000000000000000000850484166060878101919091526f010000000000000000000000000000008604909116608087015261ffff720100000000000000000000000000000000000086041660a08701526bffffffffffffffffffffffff74010000000000000000000000000000000000000000909504851660c0870152600d5480851660e0880152929092049092166101008501819052875260105490921690860152601154928501929092526109546005613696565b606080860191909152815163ffffffff908116855260208084015182168187015260408085015162ffffff90811682890152858501518416948801949094526080808601519094169387019390935260a08085015161ffff169087015260c0808501516bffffffffffffffffffffffff169087015260e08085015190921691860191909152600e54610100860152600f5461012086015260125473ffffffffffffffffffffffffffffffffffffffff90811661014087015260135416610160860152600480548351818402810184019094528084528793879390918391830182828015610a7757602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610a4c575b5050505050905093509350935050909192565b610a926136b3565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600b6020526040902080548291907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001836003811115610af257610af2615dd2565b02179055505050565b610b036136b3565b610b0b613734565b565b8073ffffffffffffffffffffffffffffffffffffffff8116610b5b576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526007602052604090206002015483906c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610bcd576040517fa47c170600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000848152600760205260409020600101544364010000000090910467ffffffffffffffff161115610c2b576040517fff84e5dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c54600085815260076020526040812080546002909101546bffffffffffffffffffffffff740100000000000000000000000000000000000000009094048416939182169291169083821015610caf57610c868285615c99565b9050826bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115610caf5750815b6000610cbb8285615c99565b60008a815260076020526040902080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169055601054909150610d0e9083906bffffffffffffffffffffffff16615bda565b601080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff928316179055601154610d5691831690615c82565b601155604080516bffffffffffffffffffffffff8316815273ffffffffffffffffffffffffffffffffffffffff8a1660208201528a917ff3b5906e5672f3e524854103bcafbbdba80dbdfeca2c35e116127b1060a68318910160405180910390a26040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89811660048301526bffffffffffffffffffffffff831660248301527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044015b602060405180830381600087803b158015610e5557600080fd5b505af1158015610e69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8d919061509f565b50505050505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610f1f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6000610fa56137b1565b610ff1610fec338686868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061381e915050565b613918565b949350505050565b6110016136b3565b6010546011546bffffffffffffffffffffffff90911690611023908290615c82565b601155601080547fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001690556040516bffffffffffffffffffffffff821681527f1d07d0b0be43d3e5fee41a80b579af370affee03fa595bf56d5d4c19328162f19060200160405180910390a16040517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526bffffffffffffffffffffffff821660248201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a9059cbb906044015b602060405180830381600087803b15801561112b57600080fd5b505af115801561113f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611163919061509f565b5050565b61116f6136b3565b610b0b613d39565b600173ffffffffffffffffffffffffffffffffffffffff82166000908152600b602052604090205460ff1660038111156111b3576111b3615dd2565b141580156111fb5750600373ffffffffffffffffffffffffffffffffffffffff82166000908152600b602052604090205460ff1660038111156111f8576111f8615dd2565b14155b15611232576040517f0ebeec3c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60125473ffffffffffffffffffffffffffffffffffffffff16611281576040517fd12d7d8d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816112b8576040517f2c2fc94100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290526000808567ffffffffffffffff81111561130c5761130c615e5f565b60405190808252806020026020018201604052801561133f57816020015b606081526020019060019003908161132a5790505b50905060008667ffffffffffffffff81111561135d5761135d615e5f565b6040519080825280602002602001820160405280156113e257816020015b6040805160e08101825260008082526020808301829052928201819052606082018190526080820181905260a0820181905260c082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191018161137b5790505b50905060005b878110156116e25788888281811061140257611402615e30565b60209081029290920135600081815260078452604090819020815160e08101835281546bffffffffffffffffffffffff808216835273ffffffffffffffffffffffffffffffffffffffff6c0100000000000000000000000092839004811698840198909852600184015463ffffffff81169584019590955267ffffffffffffffff6401000000008604166060840152938190048716608083015260029092015492831660a0820152910490931660c084018190529098509196505033146114f5576040517fa47c170600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606085015167ffffffffffffffff9081161461153d576040517fd096219c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8482828151811061155057611550615e30565b6020026020010181905250600a6000878152602001908152602001600020805461157990615cf2565b80601f01602080910402602001604051908101604052809291908181526020018280546115a590615cf2565b80156115f25780601f106115c7576101008083540402835291602001916115f2565b820191906000526020600020905b8154815290600101906020018083116115d557829003601f168201915b505050505083828151811061160957611609615e30565b6020908102919091010152845161162e906bffffffffffffffffffffffff1685615bc2565b600087815260076020908152604080832083815560018101849055600201839055600a9091528120919550611663919061491a565b61166e600587613d94565b508451604080516bffffffffffffffffffffffff909216825273ffffffffffffffffffffffffffffffffffffffff8916602083015287917fb38647142fbb1ea4c000fc4569b37a4e9a9f6313317b84ee3e5326c1a6cd06ff910160405180910390a2806116da81615d46565b9150506113e8565b50826011546116f19190615c82565b60115560405160009061170e908a908a90859087906020016156cf565b60405160208183030381529060405290508673ffffffffffffffffffffffffffffffffffffffff16638e86139b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c71249ab60008b73ffffffffffffffffffffffffffffffffffffffff166348013d7b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156117c157600080fd5b505afa1580156117d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f9919061517f565b866040518463ffffffff1660e01b8152600401611818939291906159b2565b60006040518083038186803b15801561183057600080fd5b505afa158015611844573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261188a919081019061514a565b6040518263ffffffff1660e01b81526004016118a69190615861565b600060405180830381600087803b1580156118c057600080fd5b505af11580156118d4573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152602482018890527f000000000000000000000000000000000000000000000000000000000000000016925063a9059cbb9150604401610e3b565b6002336000908152600b602052604090205460ff16600381111561197957611979615dd2565b141580156119ab57506003336000908152600b602052604090205460ff1660038111156119a8576119a8615dd2565b14155b156119e2576040517f0ebeec3c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080806119f284860186614fbb565b92509250925060005b8351811015611b4b57611ab8848281518110611a1957611a19615e30565b6020026020010151848381518110611a3357611a33615e30565b602002602001015160800151858481518110611a5157611a51615e30565b602002602001015160400151868581518110611a6f57611a6f615e30565b602002602001015160c00151878681518110611a8d57611a8d615e30565b602002602001015160000151878781518110611aab57611aab615e30565b6020026020010151613da0565b838181518110611aca57611aca615e30565b60200260200101517f74931a144e43a50694897f241d973aecb5024c0e910f9bb80a163ea3c1cf5a71848381518110611b0557611b05615e30565b60209081029190910181015151604080516bffffffffffffffffffffffff909216825233928201929092520160405180910390a280611b4381615d46565b9150506119fb565b505050505050565b6000806000611b606140f3565b915091506000611b718360006142ee565b9050611b7e858284614333565b95945050505050565b6000828152600760205260409020600101548290640100000000900467ffffffffffffffff90811614611be6576040517fd096219c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083815260076020526040902054611c0e9083906bffffffffffffffffffffffff16615bda565b600084815260076020526040902080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff928316179055601154611c6291841690615bc2565b6011556040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526bffffffffffffffffffffffff831660448201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906323b872dd90606401602060405180830381600087803b158015611d0657600080fd5b505af1158015611d1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d3e919061509f565b506040516bffffffffffffffffffffffff83168152339084907fafd24114486da8ebfc32f3626dada8863652e187461aa74d4bfa7348915062039060200160405180910390a3505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614611df8576040517fc8bad78d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208114611e32576040517fdfe9309000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e408284018461527e565b600081815260076020526040902060010154909150640100000000900467ffffffffffffffff90811614611ea0576040517fd096219c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081815260076020526040902054611ec89085906bffffffffffffffffffffffff16615bda565b600082815260076020526040902080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff92909216919091179055601154611f1f908590615bc2565b6011556040516bffffffffffffffffffffffff8516815273ffffffffffffffffffffffffffffffffffffffff86169082907fafd24114486da8ebfc32f3626dada8863652e187461aa74d4bfa7348915062039060200160405180910390a35050505050565b8073ffffffffffffffffffffffffffffffffffffffff8116611fd2576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83811660009081526008602090815260409182902082516060810184528154948516808252740100000000000000000000000000000000000000009095046bffffffffffffffffffffffff16928101929092526001015460ff16151591810191909152903314612083576040517fcebf515b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff808516600090815260086020908152604090912080549092169091558101516011546120d2916bffffffffffffffffffffffff1690615c82565b60115560208082015160405133815273ffffffffffffffffffffffffffffffffffffffff808716936bffffffffffffffffffffffff90931692908816917f9819093176a1851202c7bcfa46845809b4e47c261866550e94ed3775d2f40698910160405180910390a460208101516040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301526bffffffffffffffffffffffff90921660248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb90604401602060405180830381600087803b1580156121df57600080fd5b505af11580156121f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612217919061509f565b5050505050565b6000828152600760205260409020600101548290640100000000900467ffffffffffffffff9081161461227d576040517fd096219c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526007602052604090206002015483906c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146122ef576040517fa47c170600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108fc8363ffffffff1610806123105750600d5463ffffffff908116908416115b15612347576040517f14c237fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526007602090815260409182902060010180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff8716908117909155915191825285917fc24c07e655ce79fba8a589778987d3c015bc6af1632bb20cf9182e02a65d972c910160405180910390a250505050565b73ffffffffffffffffffffffffffffffffffffffff818116600090815260096020526040902054163314612425576040517f6752e7aa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81811660008181526008602090815260408083208054337fffffffffffffffffffffffff000000000000000000000000000000000000000080831682179093556009909452828520805490921690915590519416939092849290917f78af32efdcad432315431e9b03d27e6cd98fb79c405fdc5af7c1714d9c0f75b39190a45050565b6000818152600760205260408120600101546107cc9063ffffffff16611b53565b6124e66136b3565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b15801561256e57600080fd5b505afa158015612582573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125a69190615297565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33601154846125f39190615c82565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401611111565b6126516136b3565b82811415806126605750600283105b15612697576040517fcf54c06a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b600454811015612723576000600482815481106126b9576126b9615e30565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168252600890526040902060010180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055508061271b81615d46565b91505061269a565b5060005b8381101561295957600085858381811061274357612743615e30565b90506020020160208101906127589190614dae565b73ffffffffffffffffffffffffffffffffffffffff80821660009081526008602052604081208054939450929091169086868681811061279a5761279a615e30565b90506020020160208101906127af9190614dae565b905073ffffffffffffffffffffffffffffffffffffffff81161580612842575073ffffffffffffffffffffffffffffffffffffffff82161580159061282057508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612842575073ffffffffffffffffffffffffffffffffffffffff81811614155b15612879576040517fb387a23800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600183015460ff16156128b8576040517f357d0cc400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600183810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016909117905573ffffffffffffffffffffffffffffffffffffffff818116146129425782547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff82161783555b50505050808061295190615d46565b915050612727565b5061296660048585614954565b507f056264c94f28bb06c99d13f0446eb96c67c215d8d707bce2655a98ddf1c0b71f8484848460405161299c949392919061569d565b60405180910390a150505050565b60606000806000806129ba614410565b6000878152600760209081526040808320815160e08101835281546bffffffffffffffffffffffff808216835273ffffffffffffffffffffffffffffffffffffffff6c0100000000000000000000000092839004811684880152600185015463ffffffff81168588015267ffffffffffffffff64010000000082041660608601528390048116608085015260029094015490811660a08401520490911660c08201528a8452600a90925280832090519192917f6e04ff0d0000000000000000000000000000000000000000000000000000000091612a9a916024016158ab565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600080836080015173ffffffffffffffffffffffffffffffffffffffff16600c600001600b9054906101000a900463ffffffff1663ffffffff1684604051612b4191906155f7565b60006040518083038160008787f1925050503d8060008114612b7f576040519150601f19603f3d011682016040523d82523d6000602084013e612b84565b606091505b509150915081612bc257806040517f96c36235000000000000000000000000000000000000000000000000000000008152600401610f169190615861565b80806020019051810190612bd691906150ba565b9950915081612c11576040517f865676e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612c208b8d8c600061381e565b9050612c35858260000151836060015161446a565b6060810151608082015160a083015160c0909301519b9e919d509b50909998509650505050505050565b6000818152600760209081526040808320815160e08101835281546bffffffffffffffffffffffff808216835273ffffffffffffffffffffffffffffffffffffffff6c01000000000000000000000000928390048116848801908152600186015463ffffffff811686890181905267ffffffffffffffff64010000000083041660608881019182529287900485166080890181905260029099015495861660a089019081529690950490931660c087019081528b8b52600a9099529689208551915198519351945181548b9a8b998a998a998a998a9992989397929692959394939092908690612d4e90615cf2565b80601f0160208091040260200160405190810160405280929190818152602001828054612d7a90615cf2565b8015612dc75780601f10612d9c57610100808354040283529160200191612dc7565b820191906000526020600020905b815481529060010190602001808311612daa57829003601f168201915b505050505095509850985098509850985098509850985050919395975091939597565b60008181526007602052604081206001015467ffffffffffffffff6401000000009091048116919082141590612e3560005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16149050818015612e855750808015612e835750438367ffffffffffffffff16115b155b15612ebc576040517ffbc0357800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80158015612f0157506000848152600760205260409020600201546c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314155b15612f38576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4381612f4c57612f49603282615bc2565b90505b600085815260076020526040902060010180547fffffffffffffffffffffffffffffffffffffffff0000000000000000ffffffff1664010000000067ffffffffffffffff841602179055612fa1600586613d94565b5060405167ffffffffffffffff82169086907f91cb3bb75cfbd718bbfccc56b7f53d92d7048ef4ca39a3b7b7c6d4af1f79118190600090a35050505050565b6000805473ffffffffffffffffffffffffffffffffffffffff163314801590613021575060135473ffffffffffffffffffffffffffffffffffffffff163314155b15613058576040517fd48b678b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613063600143615c82565b600d5460408051924060208401523060601b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001690830152640100000000900460e01b7fffffffff000000000000000000000000000000000000000000000000000000001660548201526058016040516020818303038152906040528051906020012060001c905061313081878787600088888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613da092505050565b600d8054640100000000900463ffffffff1690600461314e83615d7f565b91906101000a81548163ffffffff021916908363ffffffff16021790555050807fbae366358c023f887e791d7a62f2e4316f1026bd77f6fb49501a917b3bc5d01286866040516131c692919063ffffffff92909216825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b60405180910390a295945050505050565b73ffffffffffffffffffffffffffffffffffffffff828116600090815260086020526040902054163314613237576040517fcebf515b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116331415613287576040517f8c8728c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8281166000908152600960205260409020548116908216146111635773ffffffffffffffffffffffffffffffffffffffff82811660008181526009602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169486169485179055513392917f84f7c7c80bb8ed2279b4aab5f61cd05e6374073d38f46d7f32de8c30e9e3836791a45050565b61333e6136b3565b600d5460e082015163ffffffff91821691161015613388576040517f39abc10400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051806101200160405280826000015163ffffffff168152602001826020015163ffffffff168152602001826040015162ffffff168152602001826060015163ffffffff168152602001826080015162ffffff1681526020018260a0015161ffff1681526020018260c001516bffffffffffffffffffffffff1681526020018260e0015163ffffffff168152602001600c60010160049054906101000a900463ffffffff1663ffffffff16815250600c60008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160086101000a81548162ffffff021916908362ffffff160217905550606082015181600001600b6101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600f6101000a81548162ffffff021916908362ffffff16021790555060a08201518160000160126101000a81548161ffff021916908361ffff16021790555060c08201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555060e08201518160010160006101000a81548163ffffffff021916908363ffffffff1602179055506101008201518160010160046101000a81548163ffffffff021916908363ffffffff160217905550905050806101000151600e81905550806101200151600f81905550806101400151601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806101600151601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ffe125a41957477226ba20f85ef30a4024ea3bb8d066521ddc16df3f2944de3258160405161367791906159df565b60405180910390a150565b61368a6136b3565b61369381614584565b50565b60006107cc825490565b60006136ac838361467a565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610b0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610f16565b61373c6146a4565b600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b60035460ff1615610b0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610f16565b6138746040518060e00160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160608152602001600081526020016000815260200160008152602001600081525090565b60008481526007602052604081206001015463ffffffff1690806138966140f3565b9150915060006138a683876142ee565b905060006138b5858385614333565b6040805160e08101825273ffffffffffffffffffffffffffffffffffffffff8d168152602081018c90529081018a90526bffffffffffffffffffffffff909116606082015260808101959095525060a084015260c0830152509050949350505050565b6000613922614710565b602082810151600081815260079092526040909120600101544364010000000090910467ffffffffffffffff1611613986576040517fd096219c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602080840151600090815260078252604090819020815160e08101835281546bffffffffffffffffffffffff808216835273ffffffffffffffffffffffffffffffffffffffff6c0100000000000000000000000092839004811696840196909652600184015463ffffffff81169584019590955267ffffffffffffffff640100000000860416606080850191909152948290048616608084015260029093015492831660a083015290910490921660c0830152845190850151613a4a91839161446a565b60005a90506000634585e33b60e01b8660400151604051602401613a6e9190615861565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050613ae08660800151846080015183614782565b94505a613aed9083615c82565b91506000613b04838860a001518960c00151614333565b602080890151600090815260079091526040902054909150613b359082906bffffffffffffffffffffffff16615c99565b6020888101805160009081526007909252604080832080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff95861617905590518252902060020154613b9891839116615bda565b60208881018051600090815260078352604080822060020180547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff9687161790558b5192518252808220805486166c0100000000000000000000000073ffffffffffffffffffffffffffffffffffffffff958616021790558b5190921681526008909252902054613c5191839174010000000000000000000000000000000000000000900416615bda565b60086000896000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550866000015173ffffffffffffffffffffffffffffffffffffffff1686151588602001517fcaacad83e47cc45c280d487ec84184eee2fa3b54ebaa393bda7549f13da228f6848b60400151604051613d1d929190615a95565b60405180910390a45050505050613d346001600255565b919050565b613d416137b1565b600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586137873390565b60006136ac83836147ce565b613da86137b1565b73ffffffffffffffffffffffffffffffffffffffff85163b613df6576040517f09ee12d500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108fc8463ffffffff161080613e175750600d5463ffffffff908116908516115b15613e4e576040517f14c237fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040518060e00160405280836bffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020018563ffffffff16815260200167ffffffffffffffff801681526020018673ffffffffffffffffffffffffffffffffffffffff16815260200160006bffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff168152506007600088815260200190815260200160002060008201518160000160006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550602082015181600001600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548163ffffffff021916908363ffffffff16021790555060608201518160010160046101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550608082015181600101600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a08201518160020160006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555060c082015181600201600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050816bffffffffffffffffffffffff166011546140bc9190615bc2565b6011556000868152600a6020908152604090912082516140de928401906149dc565b506140ea6005876148c1565b50505050505050565b6000806000600c600001600f9054906101000a900462ffffff1662ffffff1690506000808263ffffffff161190506000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b15801561418a57600080fd5b505afa15801561419e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141c29190615387565b5094509092508491505080156141e657506141dd8242615c82565b8463ffffffff16105b806141f2575060008113155b1561420157600e549550614205565b8095505b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b15801561426b57600080fd5b505afa15801561427f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142a39190615387565b5094509092508491505080156142c757506142be8242615c82565b8463ffffffff16105b806142d3575060008113155b156142e257600f5494506142e6565b8094505b505050509091565b600c54600090614318907201000000000000000000000000000000000000900461ffff1684615c45565b90508180156143265750803a105b156107cc57503a92915050565b6000806143436201388086615bc2565b61434d9085615c45565b600c5490915060009061436a9063ffffffff16633b9aca00615bc2565b600c5490915060009061439090640100000000900463ffffffff1664e8d4a51000615c45565b85836143a086633b9aca00615c45565b6143aa9190615c45565b6143b49190615c0a565b6143be9190615bc2565b90506b033b2e3c9fd0803ce8000000811115614406576040517f2ad7547a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9695505050505050565b321580159061443357503273111111111111111111111111111111111111111114155b15610b0b576040517fb60ac5db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526008602052604090206001015460ff166144cc576040517fcfbacfd800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82516bffffffffffffffffffffffff16811115614515576040517f356680b700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16836020015173ffffffffffffffffffffffffffffffffffffffff16141561457f576040517f06bc104000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b73ffffffffffffffffffffffffffffffffffffffff8116331415614604576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610f16565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600082600001828154811061469157614691615e30565b9060005260206000200154905092915050565b60035460ff16610b0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610f16565b60028054141561477c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610f16565b60028055565b60005a61138881101561479457600080fd5b6113888103905084604082048203116147ac57600080fd5b50823b6147b857600080fd5b60008083516020850160008789f1949350505050565b600081815260018301602052604081205480156148b75760006147f2600183615c82565b855490915060009061480690600190615c82565b905081811461486b57600086600001828154811061482657614826615e30565b906000526020600020015490508087600001848154811061484957614849615e30565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061487c5761487c615e01565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506107cc565b60009150506107cc565b60008181526001830160205260408120546136ac90849084908490614912575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556107cc565b5060006107cc565b50805461492690615cf2565b6000825580601f10614936575050565b601f0160209004906000526020600020908101906136939190614a50565b8280548282559060005260206000209081019282156149cc579160200282015b828111156149cc5781547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff843516178255602090920191600190910190614974565b506149d8929150614a50565b5090565b8280546149e890615cf2565b90600052602060002090601f016020900481019282614a0a57600085556149cc565b82601f10614a2357805160ff19168380011785556149cc565b828001600101855582156149cc579182015b828111156149cc578251825591602001919060010190614a35565b5b808211156149d85760008155600101614a51565b803573ffffffffffffffffffffffffffffffffffffffff81168114613d3457600080fd5b60008083601f840112614a9b57600080fd5b50813567ffffffffffffffff811115614ab357600080fd5b6020830191508360208260051b8501011115614ace57600080fd5b9250929050565b600082601f830112614ae657600080fd5b81356020614afb614af683615b58565b615b09565b80838252828201915082860187848660051b8901011115614b1b57600080fd5b60005b85811015614b9b57813567ffffffffffffffff811115614b3d57600080fd5b8801603f81018a13614b4e57600080fd5b858101356040614b60614af683615b7c565b8281528c82848601011115614b7457600080fd5b828285018a8301376000928101890192909252508552509284019290840190600101614b1e565b5090979650505050505050565b600082601f830112614bb957600080fd5b81356020614bc9614af683615b58565b8281528181019085830160e080860288018501891015614be857600080fd5b60005b86811015614c9a5781838b031215614c0257600080fd5b614c0a615abc565b614c1384614d92565b8152614c20878501614a65565b878201526040614c31818601614d64565b9082015260608481013567ffffffffffffffff81168114614c5157600080fd5b908201526080614c62858201614a65565b9082015260a0614c73858201614d92565b9082015260c0614c84858201614a65565b9082015285529385019391810191600101614beb565b509198975050505050505050565b80518015158114613d3457600080fd5b60008083601f840112614cca57600080fd5b50813567ffffffffffffffff811115614ce257600080fd5b602083019150836020828501011115614ace57600080fd5b600082601f830112614d0b57600080fd5b8151614d19614af682615b7c565b818152846020838601011115614d2e57600080fd5b610ff1826020830160208701615cc6565b803561ffff81168114613d3457600080fd5b803562ffffff81168114613d3457600080fd5b803563ffffffff81168114613d3457600080fd5b805169ffffffffffffffffffff81168114613d3457600080fd5b80356bffffffffffffffffffffffff81168114613d3457600080fd5b600060208284031215614dc057600080fd5b6136ac82614a65565b60008060408385031215614ddc57600080fd5b614de583614a65565b9150614df360208401614a65565b90509250929050565b60008060408385031215614e0f57600080fd5b614e1883614a65565b9150602083013560048110614e2c57600080fd5b809150509250929050565b60008060008060608587031215614e4d57600080fd5b614e5685614a65565b935060208501359250604085013567ffffffffffffffff811115614e7957600080fd5b614e8587828801614cb8565b95989497509550505050565b600080600080600060808688031215614ea957600080fd5b614eb286614a65565b9450614ec060208701614d64565b9350614ece60408701614a65565b9250606086013567ffffffffffffffff811115614eea57600080fd5b614ef688828901614cb8565b969995985093965092949392505050565b60008060008060408587031215614f1d57600080fd5b843567ffffffffffffffff80821115614f3557600080fd5b614f4188838901614a89565b90965094506020870135915080821115614f5a57600080fd5b50614e8587828801614a89565b600080600060408486031215614f7c57600080fd5b833567ffffffffffffffff811115614f9357600080fd5b614f9f86828701614a89565b9094509250614fb2905060208501614a65565b90509250925092565b600080600060608486031215614fd057600080fd5b833567ffffffffffffffff80821115614fe857600080fd5b818601915086601f830112614ffc57600080fd5b8135602061500c614af683615b58565b8083825282820191508286018b848660051b890101111561502c57600080fd5b600096505b8487101561504f578035835260019690960195918301918301615031565b509750508701359250508082111561506657600080fd5b61507287838801614ba8565b9350604086013591508082111561508857600080fd5b5061509586828701614ad5565b9150509250925092565b6000602082840312156150b157600080fd5b6136ac82614ca8565b600080604083850312156150cd57600080fd5b6150d683614ca8565b9150602083015167ffffffffffffffff8111156150f257600080fd5b6150fe85828601614cfa565b9150509250929050565b6000806020838503121561511b57600080fd5b823567ffffffffffffffff81111561513257600080fd5b61513e85828601614cb8565b90969095509350505050565b60006020828403121561515c57600080fd5b815167ffffffffffffffff81111561517357600080fd5b610ff184828501614cfa565b60006020828403121561519157600080fd5b8151600381106136ac57600080fd5b600061018082840312156151b357600080fd5b6151bb615ae5565b6151c483614d64565b81526151d260208401614d64565b60208201526151e360408401614d51565b60408201526151f460608401614d64565b606082015261520560808401614d51565b608082015261521660a08401614d3f565b60a082015261522760c08401614d92565b60c082015261523860e08401614d64565b60e082015261010083810135908201526101208084013590820152610140615261818501614a65565b90820152610160615273848201614a65565b908201529392505050565b60006020828403121561529057600080fd5b5035919050565b6000602082840312156152a957600080fd5b5051919050565b600080604083850312156152c357600080fd5b82359150614df360208401614a65565b6000806000604084860312156152e857600080fd5b83359250602084013567ffffffffffffffff81111561530657600080fd5b61531286828701614cb8565b9497909650939450505050565b6000806040838503121561533257600080fd5b50508035926020909101359150565b6000806040838503121561535457600080fd5b82359150614df360208401614d64565b6000806040838503121561537757600080fd5b82359150614df360208401614d92565b600080600080600060a0868803121561539f57600080fd5b6153a886614d78565b94506020860151935060408601519250606086015191506153cb60808701614d78565b90509295509295909350565b8183526000602080850194508260005b858110156154205773ffffffffffffffffffffffffffffffffffffffff61540d83614a65565b16875295820195908201906001016153e7565b509495945050505050565b600081518084526020808501808196508360051b8101915082860160005b85811015615473578284038952615461848351615480565b98850198935090840190600101615449565b5091979650505050505050565b60008151808452615498816020860160208601615cc6565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600381106154da576154da615dd2565b9052565b805163ffffffff16825260208101516154ff602084018263ffffffff169052565b506040810151615516604084018262ffffff169052565b50606081015161552e606084018263ffffffff169052565b506080810151615545608084018262ffffff169052565b5060a081015161555b60a084018261ffff169052565b5060c081015161557b60c08401826bffffffffffffffffffffffff169052565b5060e081015161559360e084018263ffffffff169052565b50610100818101519083015261012080820151908301526101408082015173ffffffffffffffffffffffffffffffffffffffff81168285015250506101608181015173ffffffffffffffffffffffffffffffffffffffff8116848301525b50505050565b60008251615609818460208701615cc6565b9190910192915050565b600061010073ffffffffffffffffffffffffffffffffffffffff808c16845263ffffffff8b1660208501528160408501526156508285018b615480565b6bffffffffffffffffffffffff998a16606086015297811660808501529590951660a08301525067ffffffffffffffff9290921660c083015290931660e090930192909252949350505050565b6040815260006156b16040830186886153d7565b82810360208401526156c48185876153d7565b979650505050505050565b60006060808352858184015260807f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87111561570a57600080fd5b8660051b808983870137808501905081810160008152602083878403018188015281895180845260a093508385019150828b01945060005b818110156157f957855180516bffffffffffffffffffffffff1684528481015173ffffffffffffffffffffffffffffffffffffffff9081168686015260408083015163ffffffff16908601528982015167ffffffffffffffff168a860152888201511688850152858101516157c6878601826bffffffffffffffffffffffff169052565b5060c09081015173ffffffffffffffffffffffffffffffffffffffff16908401529483019460e090920191600101615742565b5050878103604089015261580d818a61542b565b9c9b505050505050505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561585557835183529284019291840191600101615839565b50909695505050505050565b6020815260006136ac6020830184615480565b60a08152600061588760a0830188615480565b90508560208301528460408301528360608301528260808301529695505050505050565b600060208083526000845481600182811c9150808316806158cd57607f831692505b858310811415615904577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b87860183815260200181801561592157600181146159505761597b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0086168252878201965061597b565b60008b81526020902060005b868110156159755781548482015290850190890161595c565b83019750505b50949998505050505050505050565b602081016004831061599e5761599e615dd2565b91905290565b602081016107cc82846154ca565b6159bc81856154ca565b6159c960208201846154ca565b606060408201526000611b7e6060830184615480565b61018081016107cc82846154de565b600061022080830163ffffffff875116845260206bffffffffffffffffffffffff8189015116818601526040880151604086015260608801516060860152615a3960808601886154de565b6102008501929092528451908190526102408401918086019160005b81811015615a8757835173ffffffffffffffffffffffffffffffffffffffff1685529382019392820192600101615a55565b509298975050505050505050565b6bffffffffffffffffffffffff83168152604060208201526000610ff16040830184615480565b60405160e0810167ffffffffffffffff81118282101715615adf57615adf615e5f565b60405290565b604051610180810167ffffffffffffffff81118282101715615adf57615adf615e5f565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715615b5057615b50615e5f565b604052919050565b600067ffffffffffffffff821115615b7257615b72615e5f565b5060051b60200190565b600067ffffffffffffffff821115615b9657615b96615e5f565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60008219821115615bd557615bd5615da3565b500190565b60006bffffffffffffffffffffffff808316818516808303821115615c0157615c01615da3565b01949350505050565b600082615c40577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615c7d57615c7d615da3565b500290565b600082821015615c9457615c94615da3565b500390565b60006bffffffffffffffffffffffff83811690831681811015615cbe57615cbe615da3565b039392505050565b60005b83811015615ce1578181015183820152602001615cc9565b838111156155f15750506000910152565b600181811c90821680615d0657607f821691505b60208210811415615d40577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615d7857615d78615da3565b5060010190565b600063ffffffff80831681811415615d9957615d99615da3565b6001019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfea164736f6c6343000806000a", } var KeeperRegistryABI = KeeperRegistryMetaData.ABI diff --git a/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt index 446b481d1d7..12cc4afbebf 100644 --- a/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -38,7 +38,7 @@ i_chain_module: ../../contracts/solc/v0.8.19/IChainModule/IChainModule.abi ../.. i_keeper_registry_master_wrapper_2_1: ../../contracts/solc/v0.8.16/IKeeperRegistryMaster/IKeeperRegistryMaster.abi ../../contracts/solc/v0.8.16/IKeeperRegistryMaster/IKeeperRegistryMaster.bin 6501bb9bcf5048bab2737b00685c6984a24867e234ddf5b60a65904eee9a4ebc i_log_automation: ../../contracts/solc/v0.8.16/ILogAutomation/ILogAutomation.abi ../../contracts/solc/v0.8.16/ILogAutomation/ILogAutomation.bin 296beccb6af655d6fc3a6e676b244831cce2da6688d3afc4f21f8738ae59e03e keeper_consumer_performance_wrapper: ../../contracts/solc/v0.8.16/KeeperConsumerPerformance/KeeperConsumerPerformance.abi ../../contracts/solc/v0.8.16/KeeperConsumerPerformance/KeeperConsumerPerformance.bin eeda39f5d3e1c8ffa0fb6cd1803731b98a4bc262d41833458e3fe8b40933ae90 -keeper_consumer_wrapper: ../../contracts/solc/v0.8.16/KeeperConsumer/KeeperConsumer.abi ../../contracts/solc/v0.8.16/KeeperConsumer/KeeperConsumer.bin 2c6163b145082fbab74b7343577a9cec8fda8b0da9daccf2a82581b1f5a84b83 +keeper_consumer_wrapper: ../../contracts/solc/v0.8.16/KeeperConsumer/KeeperConsumer.abi ../../contracts/solc/v0.8.16/KeeperConsumer/KeeperConsumer.bin 2b7f39ede193273782c2ab653fcb9941920eff02f16bdd128c582082a7352554 keeper_registrar_wrapper1_2: ../../contracts/solc/v0.8.6/KeeperRegistrar1_2/KeeperRegistrar.abi ../../contracts/solc/v0.8.6/KeeperRegistrar1_2/KeeperRegistrar.bin e49b2f8b23da17af1ed2209b8ae0968cc04350554d636711e6c24a3ad3118692 keeper_registrar_wrapper1_2_mock: ../../contracts/solc/v0.8.6/KeeperRegistrar1_2Mock/KeeperRegistrar1_2Mock.abi ../../contracts/solc/v0.8.6/KeeperRegistrar1_2Mock/KeeperRegistrar1_2Mock.bin 5b155a7cb3def309fd7525de1d7cd364ebf8491bdc3060eac08ea0ff55ab29bc keeper_registrar_wrapper2_0: ../../contracts/solc/v0.8.6/KeeperRegistrar2_0/KeeperRegistrar2_0.abi ../../contracts/solc/v0.8.6/KeeperRegistrar2_0/KeeperRegistrar2_0.bin 647f125c2f0dafabcdc545cb77b15dc2ec3ea9429357806813179b1fd555c2d2 @@ -48,7 +48,7 @@ keeper_registry_logic_a_wrapper_2_1: ../../contracts/solc/v0.8.16/KeeperRegistry keeper_registry_logic_b_wrapper_2_1: ../../contracts/solc/v0.8.16/KeeperRegistryLogicB2_1/KeeperRegistryLogicB2_1.abi ../../contracts/solc/v0.8.16/KeeperRegistryLogicB2_1/KeeperRegistryLogicB2_1.bin 467d10741a04601b136553a2b1c6ab37f2a65d809366faf03180a22ff26be215 keeper_registry_wrapper1_1: ../../contracts/solc/v0.7/KeeperRegistry1_1/KeeperRegistry1_1.abi ../../contracts/solc/v0.7/KeeperRegistry1_1/KeeperRegistry1_1.bin 6ce079f2738f015f7374673a2816e8e9787143d00b780ea7652c8aa9ad9e1e20 keeper_registry_wrapper1_1_mock: ../../contracts/solc/v0.7/KeeperRegistry1_1Mock/KeeperRegistry1_1Mock.abi ../../contracts/solc/v0.7/KeeperRegistry1_1Mock/KeeperRegistry1_1Mock.bin 98ddb3680e86359de3b5d17e648253ba29a84703f087a1b52237824003a8c6df -keeper_registry_wrapper1_2: ../../contracts/solc/v0.8.6/KeeperRegistry1_2/KeeperRegistry1_2.abi ../../contracts/solc/v0.8.6/KeeperRegistry1_2/KeeperRegistry1_2.bin a40ff877dd7c280f984cbbb2b428e160662b0c295e881d5f778f941c0088ca22 +keeper_registry_wrapper1_2: ../../contracts/solc/v0.8.6/KeeperRegistry1_2/KeeperRegistry1_2.abi ../../contracts/solc/v0.8.6/KeeperRegistry1_2/KeeperRegistry1_2.bin f6f48cc6a4e03ffc987a017041417a1db78566275ec8ed7673fbfc9052ce0215 keeper_registry_wrapper1_3: ../../contracts/solc/v0.8.6/KeeperRegistry1_3/KeeperRegistry1_3.abi ../../contracts/solc/v0.8.6/KeeperRegistry1_3/KeeperRegistry1_3.bin d4dc760b767ae274ee25c4a604ea371e1fa603a7b6421b69efb2088ad9e8abb3 keeper_registry_wrapper2_0: ../../contracts/solc/v0.8.6/KeeperRegistry2_0/KeeperRegistry2_0.abi ../../contracts/solc/v0.8.6/KeeperRegistry2_0/KeeperRegistry2_0.bin c32dea7d5ef66b7c58ddc84ddf69aa44df1b3ae8601fbc271c95be4ff5853056 keeper_registry_wrapper_2_1: ../../contracts/solc/v0.8.16/KeeperRegistry2_1/KeeperRegistry2_1.abi ../../contracts/solc/v0.8.16/KeeperRegistry2_1/KeeperRegistry2_1.bin 604e4a0cd980c713929b523b999462a3aa0ed06f96ff563a4c8566cf59c8445b From bb0a33f54b8648405b774b2c2526ebccaf050bd7 Mon Sep 17 00:00:00 2001 From: Bartek Tofel Date: Mon, 11 Mar 2024 23:24:41 +0100 Subject: [PATCH 05/15] Mumbai soak fix light (#12384) * use EIP-1559 for sending funds (if enabled), validate Seth config, return early on error during funds sending * hacky fix for Duration copying for now --- integration-tests/actions/seth/actions.go | 45 +++++++++++------- integration-tests/chaos/ocr_chaos_test.go | 2 + .../docker/test_env/test_env_builder.go | 4 ++ integration-tests/testconfig/default.toml | 7 +-- integration-tests/testconfig/testconfig.go | 11 +++++ integration-tests/testsetups/ocr.go | 2 + integration-tests/utils/seth.go | 47 +++++++++++++++++++ 7 files changed, 97 insertions(+), 21 deletions(-) diff --git a/integration-tests/actions/seth/actions.go b/integration-tests/actions/seth/actions.go index 990b195a800..8de166f0fce 100644 --- a/integration-tests/actions/seth/actions.go +++ b/integration-tests/actions/seth/actions.go @@ -52,7 +52,6 @@ func FundChainlinkNodes( privateKey *ecdsa.PrivateKey, amount *big.Float, ) error { - fundingErrors := []error{} for _, cl := range nodes { toAddress, err := cl.PrimaryEthAddress() if err != nil { @@ -70,12 +69,12 @@ func FundChainlinkNodes( PrivateKey: privateKey, }) if err != nil { - fundingErrors = append(fundingErrors, err) - logger.Err(err). Str("From", fromAddress.Hex()). Str("To", toAddress). Msg("Failed to fund Chainlink node") + + return err } txHash := "(none)" @@ -91,14 +90,6 @@ func FundChainlinkNodes( Msg("Funded Chainlink node") } - if len(fundingErrors) > 0 { - var wrapped error - for _, e := range fundingErrors { - wrapped = errors.Wrapf(e, ",") - } - return fmt.Errorf("failed to fund chainlink nodes due to following errors: %w", wrapped) - } - return nil } @@ -130,14 +121,29 @@ func SendFunds(logger zerolog.Logger, client *seth.Client, payload FundsToSendPa gasLimit = *payload.GasLimit } - rawTx := &types.LegacyTx{ - Nonce: nonce, - To: &payload.ToAddress, - Value: payload.Amount, - Gas: gasLimit, - GasPrice: big.NewInt(client.Cfg.Network.GasPrice), + var signedTx *types.Transaction + + if client.Cfg.Network.EIP1559DynamicFees { + rawTx := &types.DynamicFeeTx{ + Nonce: nonce, + To: &payload.ToAddress, + Value: payload.Amount, + Gas: gasLimit, + GasFeeCap: big.NewInt(client.Cfg.Network.GasFeeCap), + GasTipCap: big.NewInt(client.Cfg.Network.GasTipCap), + } + signedTx, err = types.SignNewTx(payload.PrivateKey, types.NewLondonSigner(big.NewInt(client.ChainID)), rawTx) + } else { + rawTx := &types.LegacyTx{ + Nonce: nonce, + To: &payload.ToAddress, + Value: payload.Amount, + Gas: gasLimit, + GasPrice: big.NewInt(client.Cfg.Network.GasPrice), + } + signedTx, err = types.SignNewTx(payload.PrivateKey, types.NewEIP155Signer(big.NewInt(client.ChainID)), rawTx) } - signedTx, err := types.SignNewTx(payload.PrivateKey, types.NewEIP155Signer(big.NewInt(client.ChainID)), rawTx) + if err != nil { return nil, errors.Wrap(err, "failed to sign tx") } @@ -157,6 +163,9 @@ func SendFunds(logger zerolog.Logger, client *seth.Client, payload FundsToSendPa Uint64("Nonce", nonce). Uint64("Gas Limit", gasLimit). Int64("Gas Price", client.Cfg.Network.GasPrice). + Int64("Gas Fee Cap", client.Cfg.Network.GasFeeCap). + Int64("Gas Tip Cap", client.Cfg.Network.GasTipCap). + Bool("Dynamic fees", client.Cfg.Network.EIP1559DynamicFees). Msg("Sent funds") return client.WaitMined(ctx, logger, client.Client, signedTx) diff --git a/integration-tests/chaos/ocr_chaos_test.go b/integration-tests/chaos/ocr_chaos_test.go index b2adec04117..c99318d51dd 100644 --- a/integration-tests/chaos/ocr_chaos_test.go +++ b/integration-tests/chaos/ocr_chaos_test.go @@ -171,6 +171,8 @@ func TestOCRChaos(t *testing.T) { network = utils.MustReplaceSimulatedNetworkUrlWithK8(l, network, *testEnvironment) sethCfg := utils.MergeSethAndEvmNetworkConfigs(l, network, *readSethCfg) + err = utils.ValidateSethNetworkConfig(sethCfg.Network) + require.NoError(t, err, "Error validating seth network config") seth, err := seth.NewClientWithConfig(&sethCfg) require.NoError(t, err, "Error creating seth client") diff --git a/integration-tests/docker/test_env/test_env_builder.go b/integration-tests/docker/test_env/test_env_builder.go index 127ec921ef7..7c50bd1c725 100644 --- a/integration-tests/docker/test_env/test_env_builder.go +++ b/integration-tests/docker/test_env/test_env_builder.go @@ -391,6 +391,10 @@ func (b *CLTestEnvBuilder) Build() (*CLClusterTestEnv, error) { if b.hasSeth { readSethCfg := b.testConfig.GetSethConfig() sethCfg := utils.MergeSethAndEvmNetworkConfigs(b.l, networkConfig, *readSethCfg) + err = utils.ValidateSethNetworkConfig(sethCfg.Network) + if err != nil { + return nil, err + } seth, err := seth.NewClientWithConfig(&sethCfg) if err != nil { return nil, err diff --git a/integration-tests/testconfig/default.toml b/integration-tests/testconfig/default.toml index 6ba70d31216..06c792be882 100644 --- a/integration-tests/testconfig/default.toml +++ b/integration-tests/testconfig/default.toml @@ -86,12 +86,13 @@ gas_tip_cap = 10_000_000_000 name = "Mumbai" chain_id = "80001" transaction_timeout = "3m" -transfer_gas_fee = 21_000 +transfer_gas_fee = 40_000 +gas_limit = 6_000_000 # legacy transactions #gas_price = 1_800_000_000 # EIP-1559 transactions eip_1559_dynamic_fees = true -gas_fee_cap = 1_800_000_000 +gas_fee_cap = 3_800_000_000 gas_tip_cap = 1_800_000_000 [[Seth.networks]] @@ -104,5 +105,5 @@ gas_limit = 3_000_000 gas_price = 50_000_000 # EIP-1559 transactions #eip_1559_dynamic_fees = true -gas_fee_cap = 1_800_000_000 +gas_fee_cap = 3_800_000_000 gas_tip_cap = 1_800_000_000 \ No newline at end of file diff --git a/integration-tests/testconfig/testconfig.go b/integration-tests/testconfig/testconfig.go index cd44eb5aa33..c83b67f204b 100644 --- a/integration-tests/testconfig/testconfig.go +++ b/integration-tests/testconfig/testconfig.go @@ -581,6 +581,17 @@ func handleDefaultConfigOverride(logger zerolog.Logger, filename, configurationN return errors.Wrapf(err, "error reading file %s", filename) } + // temporary fix for Duration not being correctly copied + if oldConfig != nil && oldConfig.Seth != nil && oldConfig.Seth.Networks != nil { + for i, old_network := range oldConfig.Seth.Networks { + for _, target_network := range target.Seth.Networks { + if old_network.ChainID == target_network.ChainID { + oldConfig.Seth.Networks[i].TxnTimeout = old_network.TxnTimeout + } + } + } + } + // override instead of merging if (newConfig.Seth != nil && len(newConfig.Seth.Networks) > 0) && (oldConfig != nil && oldConfig.Seth != nil && len(oldConfig.Seth.Networks) > 0) { for i, old_network := range oldConfig.Seth.Networks { diff --git a/integration-tests/testsetups/ocr.go b/integration-tests/testsetups/ocr.go index f3a7a77e8cf..14e337a43b2 100644 --- a/integration-tests/testsetups/ocr.go +++ b/integration-tests/testsetups/ocr.go @@ -171,6 +171,8 @@ func (o *OCRSoakTest) Setup(ocrTestConfig tt.OcrTestConfig) { require.NotNil(o.t, readSethCfg, "Seth config shouldn't be nil") sethCfg := utils.MergeSethAndEvmNetworkConfigs(o.log, network, *readSethCfg) + err = utils.ValidateSethNetworkConfig(sethCfg.Network) + require.NoError(o.t, err, "Error validating seth network config") seth, err := seth.NewClientWithConfig(&sethCfg) require.NoError(o.t, err, "Error creating seth client") diff --git a/integration-tests/utils/seth.go b/integration-tests/utils/seth.go index adb63e4f9c2..c2d4f743a6b 100644 --- a/integration-tests/utils/seth.go +++ b/integration-tests/utils/seth.go @@ -2,6 +2,7 @@ package utils import ( "fmt" + "strconv" "github.com/rs/zerolog" "github.com/smartcontractkit/seth" @@ -82,3 +83,49 @@ func MustReplaceSimulatedNetworkUrlWithK8(l zerolog.Logger, network blockchain.E return network } + +// ValidateSethNetworkConfig validates the Seth network config +func ValidateSethNetworkConfig(cfg *seth.Network) error { + if cfg == nil { + return fmt.Errorf("Network cannot be nil") + } + if cfg.ChainID == "" { + return fmt.Errorf("ChainID is required") + } + _, err := strconv.Atoi(cfg.ChainID) + if err != nil { + return fmt.Errorf("ChainID needs to be a number") + } + if cfg.URLs == nil || len(cfg.URLs) == 0 { + return fmt.Errorf("URLs are required") + } + if cfg.PrivateKeys == nil || len(cfg.PrivateKeys) == 0 { + return fmt.Errorf("PrivateKeys are required") + } + if cfg.TransferGasFee == 0 { + return fmt.Errorf("TransferGasFee needs to be above 0. It's the gas fee for a simple transfer transaction") + } + if cfg.TxnTimeout.Duration() == 0 { + return fmt.Errorf("TxnTimeout needs to be above 0. It's the timeout for a transaction") + } + if cfg.GasLimit == 0 { + return fmt.Errorf("GasLimit needs to be above 0. It's the gas limit for a transaction") + } + if cfg.EIP1559DynamicFees { + if cfg.GasFeeCap == 0 { + return fmt.Errorf("GasFeeCap needs to be above 0. It's the maximum fee per gas for a transaction (including tip)") + } + if cfg.GasTipCap == 0 { + return fmt.Errorf("GasTipCap needs to be above 0. It's the maximum tip per gas for a transaction") + } + if cfg.GasFeeCap <= cfg.GasTipCap { + return fmt.Errorf("GasFeeCap needs to be above GasTipCap (as it is base fee + tip cap)") + } + } else { + if cfg.GasPrice == 0 { + return fmt.Errorf("GasPrice needs to be above 0. It's the price of gas for a transaction") + } + } + + return nil +} From 8cdc34791d040f8ec5039518331a143ec0a71d0d Mon Sep 17 00:00:00 2001 From: Dmytro Haidashenko <34754799+dhaidashenko@users.noreply.github.com> Date: Tue, 12 Mar 2024 03:00:22 +0100 Subject: [PATCH 06/15] fixed evm client flake (#12376) * fixed evm client flake * change set * Revert "change set" This reverts commit 04e167b524c67d6a6ef64922eed1374c4468c19e. --------- Co-authored-by: Prashant Yadav <34992934+prashantkumar1982@users.noreply.github.com> --- core/chains/evm/client/chain_client_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/chains/evm/client/chain_client_test.go b/core/chains/evm/client/chain_client_test.go index 1718036641e..13fddf67622 100644 --- a/core/chains/evm/client/chain_client_test.go +++ b/core/chains/evm/client/chain_client_test.go @@ -23,8 +23,9 @@ func newMockRpc(t *testing.T) *mocks.RPCClient { mockRpc.On("Dial", mock.Anything).Return(nil).Once() mockRpc.On("Close").Return(nil).Once() mockRpc.On("ChainID", mock.Anything).Return(testutils.FixtureChainID, nil).Once() - mockRpc.On("Subscribe", mock.Anything, mock.Anything, mock.Anything).Return(client.NewMockSubscription(), nil).Once() - mockRpc.On("SetAliveLoopSub", mock.Anything).Return().Once() + // node does not always manage to fully setup aliveLoop, so we have to make calls optional to avoid flakes + mockRpc.On("Subscribe", mock.Anything, mock.Anything, mock.Anything).Return(client.NewMockSubscription(), nil).Maybe() + mockRpc.On("SetAliveLoopSub", mock.Anything).Return().Maybe() return mockRpc } From 2e08d9be685f6a9d6acce9a656ed92a028539157 Mon Sep 17 00:00:00 2001 From: Sri Kidambi <1702865+kidambisrinivas@users.noreply.github.com> Date: Tue, 12 Mar 2024 10:31:39 +0000 Subject: [PATCH 07/15] VRF flat fee config validation (#12355) * fulfillRandomWords msg.data length validation * Addressed PR comments * Validate if flat fee configs are configured correctly * Update flat fee discount check * Allow fulfillmentFlatFeeLinkDiscountPPM to be equal to fulfillmentFlatFeeNativePPM * Added changeset * Update VRFV2Plus test * Remove arbitrary bounds * Remove unused error --- .changeset/wild-walls-suffer.md | 5 +++++ .../src/v0.8/vrf/dev/VRFCoordinatorV2_5.sol | 2 +- contracts/test/v0.8/foundry/vrf/VRFV2Plus.t.sol | 17 +++++++++++++++-- .../vrf_coordinator_v2_5.go | 2 +- ...-wrapper-dependency-versions-do-not-edit.txt | 2 +- 5 files changed, 23 insertions(+), 5 deletions(-) create mode 100644 .changeset/wild-walls-suffer.md diff --git a/.changeset/wild-walls-suffer.md b/.changeset/wild-walls-suffer.md new file mode 100644 index 00000000000..7573d354806 --- /dev/null +++ b/.changeset/wild-walls-suffer.md @@ -0,0 +1,5 @@ +--- +"chainlink": minor +--- + +Validate if flat fee configs are configured correctly diff --git a/contracts/src/v0.8/vrf/dev/VRFCoordinatorV2_5.sol b/contracts/src/v0.8/vrf/dev/VRFCoordinatorV2_5.sol index 44401bae31f..438ddaca263 100644 --- a/contracts/src/v0.8/vrf/dev/VRFCoordinatorV2_5.sol +++ b/contracts/src/v0.8/vrf/dev/VRFCoordinatorV2_5.sol @@ -177,7 +177,7 @@ contract VRFCoordinatorV2_5 is VRF, SubscriptionAPI, IVRFCoordinatorV2Plus { if (fallbackWeiPerUnitLink <= 0) { revert InvalidLinkWeiPrice(fallbackWeiPerUnitLink); } - if (fulfillmentFlatFeeNativePPM > 0 && fulfillmentFlatFeeLinkDiscountPPM >= fulfillmentFlatFeeNativePPM) { + if (fulfillmentFlatFeeLinkDiscountPPM > fulfillmentFlatFeeNativePPM) { revert LinkDiscountTooHigh(fulfillmentFlatFeeLinkDiscountPPM, fulfillmentFlatFeeNativePPM); } s_config = Config({ diff --git a/contracts/test/v0.8/foundry/vrf/VRFV2Plus.t.sol b/contracts/test/v0.8/foundry/vrf/VRFV2Plus.t.sol index 7fbbd788bdd..6d1b291392f 100644 --- a/contracts/test/v0.8/foundry/vrf/VRFV2Plus.t.sol +++ b/contracts/test/v0.8/foundry/vrf/VRFV2Plus.t.sol @@ -136,7 +136,7 @@ contract VRFV2Plus is BaseTest { ); // Test that setting link discount flat fee higher than native flat fee reverts - vm.expectRevert(abi.encodeWithSelector(VRFCoordinatorV2_5.LinkDiscountTooHigh.selector, uint32(1000), uint32(500))); + vm.expectRevert(abi.encodeWithSelector(VRFCoordinatorV2_5.LinkDiscountTooHigh.selector, uint32(501), uint32(500))); s_testCoordinator.setConfig( 0, @@ -145,7 +145,20 @@ contract VRFV2Plus is BaseTest { 50_000, 500, 500, // fulfillmentFlatFeeNativePPM - 1000, // fulfillmentFlatFeeLinkDiscountPPM + 501, // fulfillmentFlatFeeLinkDiscountPPM + 15, // nativePremiumPercentage + 10 // linkPremiumPercentage + ); + + // // Test that setting link discount flat fee equal to native flat fee does not revert + s_testCoordinator.setConfig( + 0, + 2_500_000, + 1, + 50_000, + 500, + 450, // fulfillmentFlatFeeNativePPM + 450, // fulfillmentFlatFeeLinkDiscountPPM 15, // nativePremiumPercentage 10 // linkPremiumPercentage ); diff --git a/core/gethwrappers/generated/vrf_coordinator_v2_5/vrf_coordinator_v2_5.go b/core/gethwrappers/generated/vrf_coordinator_v2_5/vrf_coordinator_v2_5.go index e509cb7c22b..6f6896b1ebc 100644 --- a/core/gethwrappers/generated/vrf_coordinator_v2_5/vrf_coordinator_v2_5.go +++ b/core/gethwrappers/generated/vrf_coordinator_v2_5/vrf_coordinator_v2_5.go @@ -62,7 +62,7 @@ type VRFV2PlusClientRandomWordsRequest struct { var VRFCoordinatorV25MetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"blockhashStore\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"internalBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"externalBalance\",\"type\":\"uint256\"}],\"name\":\"BalanceInvariantViolated\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNum\",\"type\":\"uint256\"}],\"name\":\"BlockhashNotInStore\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorNotRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedToSendNative\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedToTransferLink\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"have\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"want\",\"type\":\"uint32\"}],\"name\":\"GasLimitTooBig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"gasPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxGas\",\"type\":\"uint256\"}],\"name\":\"GasPriceExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectCommitment\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IndexOutOfRange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"have\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"want\",\"type\":\"uint256\"}],\"name\":\"InsufficientGasForConsumer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCalldata\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"InvalidConsumer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExtraArgsTag\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"linkWei\",\"type\":\"int256\"}],\"name\":\"InvalidLinkWeiPrice\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"have\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"min\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"max\",\"type\":\"uint16\"}],\"name\":\"InvalidRequestConfirmations\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSubscription\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkAlreadySet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"flatFeeLinkDiscountPPM\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"flatFeeNativePPM\",\"type\":\"uint32\"}],\"name\":\"LinkDiscountTooHigh\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkNotSet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"have\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"max\",\"type\":\"uint32\"}],\"name\":\"MsgDataTooBig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proposedOwner\",\"type\":\"address\"}],\"name\":\"MustBeRequestedOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"MustBeSubOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoCorrespondingRequest\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"}],\"name\":\"NoSuchProvingKey\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"have\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"want\",\"type\":\"uint32\"}],\"name\":\"NumWordsTooBig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableFromLink\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PaymentTooLarge\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PendingRequestExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"}],\"name\":\"ProvingKeyAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Reentrant\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyConsumers\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"stalenessSeconds\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"gasAfterPaymentCalculation\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"int256\",\"name\":\"fallbackWeiPerUnitLink\",\"type\":\"int256\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeNativePPM\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeLinkDiscountPPM\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"nativePremiumPercentage\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"linkPremiumPercentage\",\"type\":\"uint8\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorDeregistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorRegistered\",\"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\":false,\"internalType\":\"address\",\"name\":\"newCoordinator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"MigrationCompleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"NativeFundsRecovered\",\"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\":\"keyHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"maxGas\",\"type\":\"uint64\"}],\"name\":\"ProvingKeyDeregistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"maxGas\",\"type\":\"uint64\"}],\"name\":\"ProvingKeyRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"outputSeed\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"payment\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"nativePayment\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"onlyPremium\",\"type\":\"bool\"}],\"name\":\"RandomWordsFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"preSeed\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RandomWordsRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountLink\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountNative\",\"type\":\"uint256\"}],\"name\":\"SubscriptionCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"SubscriptionConsumerAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"SubscriptionConsumerRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"SubscriptionCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"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\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldNativeBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newNativeBalance\",\"type\":\"uint256\"}],\"name\":\"SubscriptionFundedWithNative\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"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\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"SubscriptionOwnerTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BLOCKHASH_STORE\",\"outputs\":[{\"internalType\":\"contractBlockhashStoreInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"LINK\",\"outputs\":[{\"internalType\":\"contractLinkTokenInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"LINK_NATIVE_FEED\",\"outputs\":[{\"internalType\":\"contractAggregatorV3Interface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_CONSUMERS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_NUM_WORDS\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_REQUEST_CONFIRMATIONS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"acceptSubscriptionOwnerTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"addConsumer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"cancelSubscription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"createSubscription\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"deregisterMigratableCoordinator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"publicProvingKey\",\"type\":\"uint256[2]\"}],\"name\":\"deregisterProvingKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256[2]\",\"name\":\"pk\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"gamma\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"c\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"s\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"seed\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"uWitness\",\"type\":\"address\"},{\"internalType\":\"uint256[2]\",\"name\":\"cGammaWitness\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"sHashWitness\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"zInv\",\"type\":\"uint256\"}],\"internalType\":\"structVRF.Proof\",\"name\":\"proof\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"blockNum\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structVRFCoordinatorV2_5.RequestCommitment\",\"name\":\"rc\",\"type\":\"tuple\"},{\"internalType\":\"bool\",\"name\":\"onlyPremium\",\"type\":\"bool\"}],\"name\":\"fulfillRandomWords\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"payment\",\"type\":\"uint96\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"fundSubscriptionWithNative\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"startIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxCount\",\"type\":\"uint256\"}],\"name\":\"getActiveSubscriptionIds\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"getSubscription\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"balance\",\"type\":\"uint96\"},{\"internalType\":\"uint96\",\"name\":\"nativeBalance\",\"type\":\"uint96\"},{\"internalType\":\"uint64\",\"name\":\"reqCount\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"consumers\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"publicKey\",\"type\":\"uint256[2]\"}],\"name\":\"hashOfKey\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"newCoordinator\",\"type\":\"address\"}],\"name\":\"migrate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"ownerCancelSubscription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"pendingRequestExists\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"recoverFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"recoverNativeFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"registerMigratableCoordinator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"publicProvingKey\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint64\",\"name\":\"maxGas\",\"type\":\"uint64\"}],\"name\":\"registerProvingKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"removeConsumer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"uint16\",\"name\":\"requestConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structVRFV2PlusClient.RandomWordsRequest\",\"name\":\"req\",\"type\":\"tuple\"}],\"name\":\"requestRandomWords\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"requestSubscriptionOwnerTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_config\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"reentrancyLock\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"stalenessSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasAfterPaymentCalculation\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeNativePPM\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeLinkDiscountPPM\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"nativePremiumPercentage\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"linkPremiumPercentage\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_currentSubNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_fallbackWeiPerUnitLink\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"s_provingKeyHashes\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"s_provingKeys\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"exists\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"maxGas\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"s_requestCommitments\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_totalBalance\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_totalNativeBalance\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"stalenessSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasAfterPaymentCalculation\",\"type\":\"uint32\"},{\"internalType\":\"int256\",\"name\":\"fallbackWeiPerUnitLink\",\"type\":\"int256\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeNativePPM\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeLinkDiscountPPM\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"nativePremiumPercentage\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"linkPremiumPercentage\",\"type\":\"uint8\"}],\"name\":\"setConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"link\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"linkNativeFeed\",\"type\":\"address\"}],\"name\":\"setLINKAndLINKNativeFeed\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"withdrawNative\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162005de238038062005de2833981016040819052620000349162000183565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000d7565b50505060601b6001600160601b031916608052620001b5565b6001600160a01b038116331415620001325760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000602082840312156200019657600080fd5b81516001600160a01b0381168114620001ae57600080fd5b9392505050565b60805160601c615c07620001db6000396000818161055001526132280152615c076000f3fe60806040526004361061021c5760003560e01c80638402595e11610124578063b2a7cac5116100a6578063b2a7cac514610732578063bec4c08c14610752578063caf70c4a14610772578063cb63179714610792578063d98e620e146107b2578063da2f2610146107d2578063dac83d2914610831578063dc311dd314610851578063e72f6e3014610882578063ee9d2d38146108a2578063f2fde38b146108cf57600080fd5b80638402595e146105c757806386fe91c7146105e75780638da5cb5b1461060757806395b55cfc146106255780639b1c385e146106385780639d40a6fd14610658578063a21a23e414610690578063a4c0ed36146106a5578063a63e0bfb146106c5578063aa433aff146106e5578063aefb212f1461070557600080fd5b8063405b84fa116101ad578063405b84fa1461044e57806340d6bb821461046e57806341af6c871461049957806351cff8d9146104c95780635d06b4ab146104e957806364d51a2a14610509578063659827441461051e578063689c45171461053e57806372e9d5651461057257806379ba5097146105925780637a5a2aef146105a757600080fd5b806304104edb14610221578063043bd6ae14610243578063088070f51461026c57806308821d581461033a5780630ae095401461035a57806315c48b841461037a57806318e3dd27146103a25780631b6b6d23146103e15780632f622e6b1461040e578063301f42e91461042e575b600080fd5b34801561022d57600080fd5b5061024161023c366004614fd3565b6108ef565b005b34801561024f57600080fd5b5061025960105481565b6040519081526020015b60405180910390f35b34801561027857600080fd5b50600c546102dd9061ffff81169063ffffffff62010000820481169160ff600160301b8204811692600160381b8304811692600160581b8104821692600160781b8204831692600160981b83041691600160b81b8104821691600160c01b9091041689565b6040805161ffff909a168a5263ffffffff98891660208b01529615159689019690965293861660608801529185166080870152841660a08601529290921660c084015260ff91821660e08401521661010082015261012001610263565b34801561034657600080fd5b506102416103553660046150b1565b610a5c565b34801561036657600080fd5b5061024161037536600461539b565b610c06565b34801561038657600080fd5b5061038f60c881565b60405161ffff9091168152602001610263565b3480156103ae57600080fd5b50600a546103c990600160601b90046001600160601b031681565b6040516001600160601b039091168152602001610263565b3480156103ed57600080fd5b50600254610401906001600160a01b031681565b60405161026391906155cc565b34801561041a57600080fd5b50610241610429366004614fd3565b610c4e565b34801561043a57600080fd5b506103c96104493660046151b7565b610d9a565b34801561045a57600080fd5b5061024161046936600461539b565b611001565b34801561047a57600080fd5b506104846101f481565b60405163ffffffff9091168152602001610263565b3480156104a557600080fd5b506104b96104b436600461513a565b6113b3565b6040519015158152602001610263565b3480156104d557600080fd5b506102416104e4366004614fd3565b6114c3565b3480156104f557600080fd5b50610241610504366004614fd3565b611651565b34801561051557600080fd5b5061038f606481565b34801561052a57600080fd5b50610241610539366004614ff0565b611708565b34801561054a57600080fd5b506104017f000000000000000000000000000000000000000000000000000000000000000081565b34801561057e57600080fd5b50600354610401906001600160a01b031681565b34801561059e57600080fd5b50610241611768565b3480156105b357600080fd5b506102416105c23660046150cd565b611812565b3480156105d357600080fd5b506102416105e2366004614fd3565b611942565b3480156105f357600080fd5b50600a546103c9906001600160601b031681565b34801561061357600080fd5b506000546001600160a01b0316610401565b61024161063336600461513a565b611a54565b34801561064457600080fd5b506102596106533660046152a5565b611b78565b34801561066457600080fd5b50600754610678906001600160401b031681565b6040516001600160401b039091168152602001610263565b34801561069c57600080fd5b50610259611eb9565b3480156106b157600080fd5b506102416106c0366004615029565b61208c565b3480156106d157600080fd5b506102416106e03660046152fa565b612208565b3480156106f157600080fd5b5061024161070036600461513a565b612485565b34801561071157600080fd5b506107256107203660046153c0565b6124cd565b6040516102639190615643565b34801561073e57600080fd5b5061024161074d36600461513a565b6125cf565b34801561075e57600080fd5b5061024161076d36600461539b565b6126c4565b34801561077e57600080fd5b5061025961078d366004615101565b6127d0565b34801561079e57600080fd5b506102416107ad36600461539b565b612800565b3480156107be57600080fd5b506102596107cd36600461513a565b612a6f565b3480156107de57600080fd5b506108126107ed36600461513a565b600d6020526000908152604090205460ff81169061010090046001600160401b031682565b6040805192151583526001600160401b03909116602083015201610263565b34801561083d57600080fd5b5061024161084c36600461539b565b612a90565b34801561085d57600080fd5b5061087161086c36600461513a565b612b27565b604051610263959493929190615818565b34801561088e57600080fd5b5061024161089d366004614fd3565b612c15565b3480156108ae57600080fd5b506102596108bd36600461513a565b600f6020526000908152604090205481565b3480156108db57600080fd5b506102416108ea366004614fd3565b612de8565b6108f7612df9565b60115460005b81811015610a3457826001600160a01b03166011828154811061092257610922615b63565b6000918252602090912001546001600160a01b03161415610a2457601161094a600184615a13565b8154811061095a5761095a615b63565b600091825260209091200154601180546001600160a01b03909216918390811061098657610986615b63565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060118054806109c5576109c5615b4d565b600082815260209020810160001990810180546001600160a01b03191690550190556040517ff80a1a97fd42251f3c33cda98635e7399253033a6774fe37cd3f650b5282af3790610a179085906155cc565b60405180910390a1505050565b610a2d81615acb565b90506108fd565b5081604051635428d44960e01b8152600401610a5091906155cc565b60405180910390fd5b50565b610a64612df9565b604080518082018252600091610a939190849060029083908390808284376000920191909152506127d0915050565b6000818152600d602090815260409182902082518084019093525460ff811615158084526101009091046001600160401b03169183019190915291925090610af157604051631dfd6e1360e21b815260048101839052602401610a50565b6000828152600d6020526040812080546001600160481b0319169055600e54905b81811015610bc25783600e8281548110610b2e57610b2e615b63565b90600052602060002001541415610bb257600e610b4c600184615a13565b81548110610b5c57610b5c615b63565b9060005260206000200154600e8281548110610b7a57610b7a615b63565b600091825260209091200155600e805480610b9757610b97615b4d565b60019003818190600052602060002001600090559055610bc2565b610bbb81615acb565b9050610b12565b507f9b6868e0eb737bcd72205360baa6bfd0ba4e4819a33ade2db384e8a8025639a5838360200151604051610bf8929190615656565b60405180910390a150505050565b81610c1081612e4e565b610c18612eaf565b610c21836113b3565b15610c3f57604051631685ecdd60e31b815260040160405180910390fd5b610c498383612eda565b505050565b610c56612eaf565b610c5e612df9565b600b54600160601b90046001600160601b0316610c8e57604051631e9acf1760e31b815260040160405180910390fd5b600b8054600160601b90046001600160601b0316908190600c610cb18380615a4f565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555080600a600c8282829054906101000a90046001600160601b0316610cf99190615a4f565b92506101000a8154816001600160601b0302191690836001600160601b031602179055506000826001600160a01b0316826001600160601b031660405160006040518083038185875af1925050503d8060008114610d73576040519150601f19603f3d011682016040523d82523d6000602084013e610d78565b606091505b5050905080610c495760405163950b247960e01b815260040160405180910390fd5b6000610da4612eaf565b60005a9050610324361115610dd657604051630f28961b60e01b81523660048201526103246024820152604401610a50565b6000610de2868661308e565b90506000610df88583600001516020015161334a565b60408301516060888101519293509163ffffffff16806001600160401b03811115610e2557610e25615b79565b604051908082528060200260200182016040528015610e4e578160200160208202803683370190505b50925060005b81811015610eb65760408051602081018590529081018290526060016040516020818303038152906040528051906020012060001c848281518110610e9b57610e9b615b63565b6020908102919091010152610eaf81615acb565b9050610e54565b5050602080850180516000908152600f9092526040822082905551610edc908a85613398565b60208a8101516000908152600690915260409020805491925090601890610f1290600160c01b90046001600160401b0316615ae6565b91906101000a8154816001600160401b0302191690836001600160401b0316021790555060008960a0015160018b60a0015151610f4f9190615a13565b81518110610f5f57610f5f615b63565b60209101015160f81c6001149050610f798786838c613433565b9750610f8a88828c60200151613463565b6020808b015187820151604080518781526001600160601b038d16948101949094528415159084015284151560608401528b1515608084015290917faeb4b4786571e184246d39587f659abf0e26f41f6a3358692250382c0cdb47b79060a00160405180910390a3505050505050505b9392505050565b611009612eaf565b611012816135b6565b6110315780604051635428d44960e01b8152600401610a5091906155cc565b60008060008061104086612b27565b945094505093509350336001600160a01b0316826001600160a01b0316146110a35760405162461bcd60e51b81526020600482015260166024820152752737ba1039bab139b1b934b83a34b7b71037bbb732b960511b6044820152606401610a50565b6110ac866113b3565b156110f25760405162461bcd60e51b815260206004820152601660248201527550656e64696e6720726571756573742065786973747360501b6044820152606401610a50565b6040805160c0810182526001815260208082018990526001600160a01b03851682840152606082018490526001600160601b038088166080840152861660a08301529151909160009161114791849101615680565b604051602081830303815290604052905061116188613622565b505060405163ce3f471960e01b81526001600160a01b0388169063ce3f4719906001600160601b0388169061119a90859060040161566d565b6000604051808303818588803b1580156111b357600080fd5b505af11580156111c7573d6000803e3d6000fd5b50506002546001600160a01b0316158015935091506111f0905057506001600160601b03861615155b156112ba5760025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611227908a908a90600401615613565b602060405180830381600087803b15801561124157600080fd5b505af1158015611255573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611279919061511d565b6112ba5760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610a50565b600c805460ff60301b1916600160301b17905560005b8351811015611361578381815181106112eb576112eb615b63565b60200260200101516001600160a01b0316638ea98117896040518263ffffffff1660e01b815260040161131e91906155cc565b600060405180830381600087803b15801561133857600080fd5b505af115801561134c573d6000803e3d6000fd5b505050508061135a90615acb565b90506112d0565b50600c805460ff60301b191690556040517fd63ca8cb945956747ee69bfdc3ea754c24a4caf7418db70e46052f7850be4187906113a19089908b906155e0565b60405180910390a15050505050505050565b60008181526005602052604081206002018054806113d5575060009392505050565b600e5460005b828110156114b75760008482815481106113f7576113f7615b63565b60009182526020822001546001600160a01b031691505b838110156114a457600061146c600e838154811061142e5761142e615b63565b60009182526020808320909101546001600160a01b03871683526004825260408084208e855290925291205485908c906001600160401b03166137ca565b506000818152600f6020526040902054909150156114935750600198975050505050505050565b5061149d81615acb565b905061140e565b5050806114b090615acb565b90506113db565b50600095945050505050565b6114cb612eaf565b6114d3612df9565b6002546001600160a01b03166114fc5760405163c1f0c0a160e01b815260040160405180910390fd5b600b546001600160601b031661152557604051631e9acf1760e31b815260040160405180910390fd5b600b80546001600160601b031690819060006115418380615a4f565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555080600a60008282829054906101000a90046001600160601b03166115899190615a4f565b82546001600160601b039182166101009390930a92830291909202199091161790555060025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906115de9085908590600401615613565b602060405180830381600087803b1580156115f857600080fd5b505af115801561160c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611630919061511d565b61164d57604051631e9acf1760e31b815260040160405180910390fd5b5050565b611659612df9565b611662816135b6565b15611682578060405163ac8a27ef60e01b8152600401610a5091906155cc565b601180546001810182556000919091527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c680180546001600160a01b0319166001600160a01b0383161790556040517fb7cabbfc11e66731fc77de0444614282023bcbd41d16781c753a431d0af01625906116fd9083906155cc565b60405180910390a150565b611710612df9565b6002546001600160a01b03161561173a57604051631688c53760e11b815260040160405180910390fd5b600280546001600160a01b039384166001600160a01b03199182161790915560038054929093169116179055565b6001546001600160a01b031633146117bb5760405162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b6044820152606401610a50565b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b61181a612df9565b6040805180820182526000916118499190859060029083908390808284376000920191909152506127d0915050565b6000818152600d602052604090205490915060ff161561187f57604051634a0b8fa760e01b815260048101829052602401610a50565b60408051808201825260018082526001600160401b0385811660208085019182526000878152600d9091528581209451855492516001600160481b031990931690151568ffffffffffffffff00191617610100929093169190910291909117909255600e805491820181559091527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd01829055517f9b911b2c240bfbef3b6a8f7ed6ee321d1258bb2a3fe6becab52ac1cd3210afd390610a179083908590615656565b61194a612df9565b600a544790600160601b90046001600160601b03168181111561198a576040516354ced18160e11b81526004810182905260248101839052604401610a50565b81811015610c4957600061199e8284615a13565b90506000846001600160a01b03168260405160006040518083038185875af1925050503d80600081146119ed576040519150601f19603f3d011682016040523d82523d6000602084013e6119f2565b606091505b5050905080611a145760405163950b247960e01b815260040160405180910390fd5b7f4aed7c8eed0496c8c19ea2681fcca25741c1602342e38b045d9f1e8e905d2e9c8583604051611a459291906155e0565b60405180910390a15050505050565b611a5c612eaf565b6000818152600560205260409020546001600160a01b0316611a9157604051630fb532db60e11b815260040160405180910390fd5b60008181526006602052604090208054600160601b90046001600160601b0316903490600c611ac083856159be565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555034600a600c8282829054906101000a90046001600160601b0316611b0891906159be565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550817f7603b205d03651ee812f803fccde89f1012e545a9c99f0abfea9cedd0fd8e902823484611b5b919061595f565b604080519283526020830191909152015b60405180910390a25050565b6000611b82612eaf565b602080830135600081815260059092526040909120546001600160a01b0316611bbe57604051630fb532db60e11b815260040160405180910390fd5b33600090815260046020908152604080832084845291829052909120546001600160401b031680611c065782336040516379bfd40160e01b8152600401610a509291906156f5565b600c5461ffff16611c1d60608701604088016152df565b61ffff161080611c40575060c8611c3a60608701604088016152df565b61ffff16115b15611c8657611c5560608601604087016152df565b600c5460405163539c34bb60e11b815261ffff92831660048201529116602482015260c86044820152606401610a50565b600c5462010000900463ffffffff16611ca560808701606088016153e2565b63ffffffff161115611cf557611cc160808601606087016153e2565b600c54604051637aebf00f60e11b815263ffffffff9283166004820152620100009091049091166024820152604401610a50565b6101f4611d0860a08701608088016153e2565b63ffffffff161115611d4e57611d2460a08601608087016153e2565b6040516311ce1afb60e21b815263ffffffff90911660048201526101f46024820152604401610a50565b611d5781615ae6565b90506000611d6886353386856137ca565b90955090506000611d8c611d87611d8260a08a018a61586d565b613843565b6138c0565b905085611d97613931565b86611da860808b0160608c016153e2565b611db860a08c0160808d016153e2565b3386604051602001611dd09796959493929190615778565b60405160208183030381529060405280519060200120600f600088815260200190815260200160002081905550336001600160a01b03168588600001357feb0e3652e0f44f417695e6e90f2f42c99b65cd7169074c5a654b16b9748c3a4e89868c6040016020810190611e4391906152df565b8d6060016020810190611e5691906153e2565b8e6080016020810190611e6991906153e2565b89604051611e7c96959493929190615739565b60405180910390a450506000928352602091909152604090912080546001600160401b0319166001600160401b039092169190911790555b919050565b6000611ec3612eaf565b6007546001600160401b031633611edb600143615a13565b6040516001600160601b0319606093841b81166020830152914060348201523090921b1660548201526001600160c01b031960c083901b16606882015260700160408051601f1981840301815291905280516020909101209150611f40816001615977565b600780546001600160401b0319166001600160401b03928316179055604080516000808252608082018352602080830182815283850183815260608086018581528a86526006855287862093518454935191516001600160601b039182166001600160c01b031990951694909417600160601b9190921602176001600160c01b0316600160c01b9290981691909102969096179055835194850184523385528481018281528585018481528884526005835294909220855181546001600160a01b03199081166001600160a01b03928316178355935160018301805490951691161790925592518051929493919261203e9260028501920190614ced565b5061204e915060089050846139c1565b50827f1d3015d7ba850fa198dc7b1a3f5d42779313a681035f77c8c03764c61005518d3360405161207f91906155cc565b60405180910390a2505090565b612094612eaf565b6002546001600160a01b031633146120bf576040516344b0e3c360e01b815260040160405180910390fd5b602081146120e057604051638129bbcd60e01b815260040160405180910390fd5b60006120ee8284018461513a565b6000818152600560205260409020549091506001600160a01b031661212657604051630fb532db60e11b815260040160405180910390fd5b600081815260066020526040812080546001600160601b03169186919061214d83856159be565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555084600a60008282829054906101000a90046001600160601b031661219591906159be565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550817f1ced9348ff549fceab2ac57cd3a9de38edaaab274b725ee82c23e8fc8c4eec7a8287846121e8919061595f565b6040805192835260208301919091520160405180910390a2505050505050565b612210612df9565b60c861ffff8a16111561224a5760405163539c34bb60e11b815261ffff8a1660048201819052602482015260c86044820152606401610a50565b6000851361226e576040516321ea67b360e11b815260048101869052602401610a50565b60008463ffffffff1611801561229057508363ffffffff168363ffffffff1610155b156122be576040516313c06e5960e11b815263ffffffff808516600483015285166024820152604401610a50565b604080516101208101825261ffff8b1680825263ffffffff808c16602084018190526000848601528b8216606085018190528b8316608086018190528a841660a08701819052938a1660c0870181905260ff808b1660e08901819052908a16610100909801889052600c8054600160c01b90990260ff60c01b19600160b81b9093029290921661ffff60b81b19600160981b90940263ffffffff60981b19600160781b9099029890981667ffffffffffffffff60781b19600160581b90960263ffffffff60581b19600160381b9098029790971668ffffffffffffffffff60301b196201000090990265ffffffffffff19909c16909a179a909a1796909616979097179390931791909116959095179290921793909316929092179190911790556010869055517f2c6b6b12413678366b05b145c5f00745bdd00e739131ab5de82484a50c9d78b690612472908b908b908b908b908b908b908b908b908b9061ffff99909916895263ffffffff97881660208a0152958716604089015293861660608801526080870192909252841660a086015290921660c084015260ff91821660e0840152166101008201526101200190565b60405180910390a1505050505050505050565b61248d612df9565b6000818152600560205260409020546001600160a01b0316806124c357604051630fb532db60e11b815260040160405180910390fd5b61164d8282612eda565b606060006124db60086139cd565b90508084106124fd57604051631390f2a160e01b815260040160405180910390fd5b6000612509848661595f565b905081811180612517575083155b6125215780612523565b815b905060006125318683615a13565b9050806001600160401b0381111561254b5761254b615b79565b604051908082528060200260200182016040528015612574578160200160208202803683370190505b50935060005b818110156125c45761259761258f888361595f565b6008906139d7565b8582815181106125a9576125a9615b63565b60209081029190910101526125bd81615acb565b905061257a565b505050505b92915050565b6125d7612eaf565b6000818152600560205260409020546001600160a01b03168061260d57604051630fb532db60e11b815260040160405180910390fd5b6000828152600560205260409020600101546001600160a01b03163314612664576000828152600560205260409081902060010154905163d084e97560e01b8152610a50916001600160a01b0316906004016155cc565b600082815260056020526040908190208054336001600160a01b031991821681178355600190920180549091169055905183917fd4114ab6e9af9f597c52041f32d62dc57c5c4e4c0d4427006069635e216c938691611b6c9185916155f9565b816126ce81612e4e565b6126d6612eaf565b600083815260056020526040902060020180546064141561270a576040516305a48e0f60e01b815260040160405180910390fd5b6001600160a01b038316600090815260046020908152604080832087845291829052909120546001600160401b031615612745575050505050565b600085815260208281526040808320805460016001600160401b0319909116811790915585549081018655858452919092200180546001600160a01b0319166001600160a01b0387161790555185907f1e980d04aa7648e205713e5e8ea3808672ac163d10936d36f91b2c88ac1575e1906127c19087906155cc565b60405180910390a25050505050565b6000816040516020016127e39190615635565b604051602081830303815290604052805190602001209050919050565b8161280a81612e4e565b612812612eaf565b61281b836113b3565b1561283957604051631685ecdd60e31b815260040160405180910390fd5b6001600160a01b03821660009081526004602090815260408083208684529091529020546001600160401b03166128875782826040516379bfd40160e01b8152600401610a509291906156f5565b6000838152600560209081526040808320600201805482518185028101850190935280835291929091908301828280156128ea57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116128cc575b505050505090506000600182516129019190615a13565b905060005b8251811015612a0b57846001600160a01b031683828151811061292b5761292b615b63565b60200260200101516001600160a01b031614156129fb57600083838151811061295657612956615b63565b602002602001015190508060056000898152602001908152602001600020600201838154811061298857612988615b63565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394909416939093179092558881526005909152604090206002018054806129d3576129d3615b4d565b600082815260209020810160001990810180546001600160a01b031916905501905550612a0b565b612a0481615acb565b9050612906565b506001600160a01b03841660009081526004602090815260408083208884529091529081902080546001600160401b03191690555185907f32158c6058347c1601b2d12bc696ac6901d8a9a9aa3ba10c27ab0a983e8425a7906127c19087906155cc565b600e8181548110612a7f57600080fd5b600091825260209091200154905081565b81612a9a81612e4e565b612aa2612eaf565b600083815260056020526040902060018101546001600160a01b03848116911614612b21576001810180546001600160a01b0319166001600160a01b03851617905560405184907f21a4dad170a6bf476c31bbcf4a16628295b0e450672eec25d7c93308e05344a190612b1890339087906155f9565b60405180910390a25b50505050565b600081815260056020526040812054819081906001600160a01b0316606081612b6357604051630fb532db60e11b815260040160405180910390fd5b600086815260066020908152604080832054600583529281902060020180548251818502810185019093528083526001600160601b0380861695600160601b810490911694600160c01b9091046001600160401b0316938893929091839190830182828015612bfb57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612bdd575b505050505090509450945094509450945091939590929450565b612c1d612df9565b6002546001600160a01b0316612c465760405163c1f0c0a160e01b815260040160405180910390fd5b6002546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612c779030906004016155cc565b60206040518083038186803b158015612c8f57600080fd5b505afa158015612ca3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cc79190615153565b600a549091506001600160601b031681811115612d01576040516354ced18160e11b81526004810182905260248101839052604401610a50565b81811015610c49576000612d158284615a13565b60025460405163a9059cbb60e01b81529192506001600160a01b03169063a9059cbb90612d4890879085906004016155e0565b602060405180830381600087803b158015612d6257600080fd5b505af1158015612d76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d9a919061511d565b612db757604051631f01ff1360e21b815260040160405180910390fd5b7f59bfc682b673f8cbf945f1e454df9334834abf7dfe7f92237ca29ecb9b4366008482604051610bf89291906155e0565b612df0612df9565b610a59816139e3565b6000546001600160a01b03163314612e4c5760405162461bcd60e51b815260206004820152601660248201527527b7363c9031b0b63630b1363290313c9037bbb732b960511b6044820152606401610a50565b565b6000818152600560205260409020546001600160a01b031680612e8457604051630fb532db60e11b815260040160405180910390fd5b336001600160a01b0382161461164d5780604051636c51fda960e11b8152600401610a5091906155cc565b600c54600160301b900460ff1615612e4c5760405163769dd35360e11b815260040160405180910390fd5b600080612ee684613622565b60025491935091506001600160a01b031615801590612f0d57506001600160601b03821615155b15612fbc5760025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90612f4d9086906001600160601b038716906004016155e0565b602060405180830381600087803b158015612f6757600080fd5b505af1158015612f7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f9f919061511d565b612fbc57604051631e9acf1760e31b815260040160405180910390fd5b6000836001600160a01b0316826001600160601b031660405160006040518083038185875af1925050503d8060008114613012576040519150601f19603f3d011682016040523d82523d6000602084013e613017565b606091505b50509050806130395760405163950b247960e01b815260040160405180910390fd5b604080516001600160a01b03861681526001600160601b03808616602083015284169181019190915285907f8c74ce8b8cf87f5eb001275c8be27eb34ea2b62bfab6814fcc62192bb63e81c4906060016127c1565b6040805160a081018252600060608201818152608083018290528252602082018190529181019190915260006130c784600001516127d0565b6000818152600d602090815260409182902082518084019093525460ff811615158084526101009091046001600160401b0316918301919091529192509061312557604051631dfd6e1360e21b815260048101839052602401610a50565b6000828660800151604051602001613147929190918252602082015260400190565b60408051601f1981840301815291815281516020928301206000818152600f9093529120549091508061318d57604051631b44092560e11b815260040160405180910390fd5b85516020808801516040808a015160608b015160808c015160a08d015193516131bc978a9790969591016157c4565b6040516020818303038152906040528051906020012081146131f15760405163354a450b60e21b815260040160405180910390fd5b60006132008760000151613a87565b9050806132d8578651604051631d2827a760e31b81526001600160401b0390911660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e9413d389060240160206040518083038186803b15801561327257600080fd5b505afa158015613286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132aa9190615153565b9050806132d857865160405163175dadad60e01b81526001600160401b039091166004820152602401610a50565b60008860800151826040516020016132fa929190918252602082015260400190565b6040516020818303038152906040528051906020012060001c905060006133218a83613b69565b604080516060810182529788526020880196909652948601949094525092979650505050505050565b6000816001600160401b03163a111561339057821561337357506001600160401b0381166125c9565b3a8260405163435e532d60e11b8152600401610a50929190615656565b503a92915050565b6000806000631fe543e360e01b86856040516024016133b8929190615720565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252600c805460ff60301b1916600160301b17905590860151608087015191925061341c9163ffffffff9091169083613bd4565b600c805460ff60301b191690559695505050505050565b6000821561344d57613446858584613c20565b905061345b565b613458858584613d31565b90505b949350505050565b600081815260066020526040902082156135225780546001600160601b03600160601b90910481169085168110156134ae57604051631e9acf1760e31b815260040160405180910390fd5b6134b88582615a4f565b8254600160601b600160c01b031916600160601b6001600160601b039283168102919091178455600b805488939192600c926134f89286929004166159be565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555050612b21565b80546001600160601b0390811690851681101561355257604051631e9acf1760e31b815260040160405180910390fd5b61355c8582615a4f565b82546001600160601b0319166001600160601b03918216178355600b8054879260009161358b918591166159be565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505050505050565b601154600090815b8181101561361857836001600160a01b0316601182815481106135e3576135e3615b63565b6000918252602090912001546001600160a01b03161415613608575060019392505050565b61361181615acb565b90506135be565b5060009392505050565b60008181526005602090815260408083206006909252822054600290910180546001600160601b0380841694600160601b90940416925b818110156136c4576004600084838154811061367757613677615b63565b60009182526020808320909101546001600160a01b031683528281019390935260409182018120898252909252902080546001600160401b03191690556136bd81615acb565b9050613659565b50600085815260056020526040812080546001600160a01b031990811682556001820180549091169055906136fc6002830182614d52565b5050600085815260066020526040812055613718600886613f1a565b506001600160601b0384161561376b57600a80548591906000906137469084906001600160601b0316615a4f565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505b6001600160601b038316156137c35782600a600c8282829054906101000a90046001600160601b031661379e9190615a4f565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505b5050915091565b6040805160208082018790526001600160a01b03959095168183015260608101939093526001600160401b03919091166080808401919091528151808403909101815260a08301825280519084012060c083019490945260e0808301859052815180840390910181526101009092019052805191012091565b6040805160208101909152600081528161386c57506040805160208101909152600081526125c9565b63125fa26760e31b61387e8385615a6f565b6001600160e01b031916146138a657604051632923fee760e11b815260040160405180910390fd5b6138b38260048186615935565b810190610ffa919061516c565b60607f92fd13387c7fe7befbc38d303d6468778fb9731bc4583f17d92989c6fcfdeaaa826040516024016138f991511515815260200190565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915292915050565b60004661393d81613f26565b156139ba5760646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561397c57600080fd5b505afa158015613990573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139b49190615153565b91505090565b4391505090565b6000610ffa8383613f49565b60006125c9825490565b6000610ffa8383613f98565b6001600160a01b038116331415613a365760405162461bcd60e51b815260206004820152601760248201527621b0b73737ba103a3930b739b332b9103a379039b2b63360491b6044820152606401610a50565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600046613a9381613f26565b15613b5a57610100836001600160401b0316613aad613931565b613ab79190615a13565b1180613ad35750613ac6613931565b836001600160401b031610155b15613ae15750600092915050565b6040516315a03d4160e11b81526001600160401b0384166004820152606490632b407a82906024015b60206040518083038186803b158015613b2257600080fd5b505afa158015613b36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ffa9190615153565b50506001600160401b03164090565b6000613b9d8360000151846020015185604001518660600151868860a001518960c001518a60e001518b6101000151613fc2565b60038360200151604051602001613bb592919061570c565b60408051601f1981840301815291905280516020909101209392505050565b60005a611388811015613be657600080fd5b611388810390508460408204820311613bfe57600080fd5b50823b613c0a57600080fd5b60008083516020850160008789f1949350505050565b600080613c636000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506141de92505050565b905060005a600c54613c83908890600160581b900463ffffffff1661595f565b613c8d9190615a13565b613c9790866159f4565b600c54909150600090613cbc90600160781b900463ffffffff1664e8d4a510006159f4565b90508415613d0857600c548190606490600160b81b900460ff16613ce0858761595f565b613cea91906159f4565b613cf491906159e0565b613cfe919061595f565b9350505050610ffa565b600c548190606490613d2490600160b81b900460ff1682615999565b60ff16613ce0858761595f565b600080613d3c6142ac565b905060008113613d62576040516321ea67b360e11b815260048101829052602401610a50565b6000613da46000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506141de92505050565b9050600082825a600c54613dc6908b90600160581b900463ffffffff1661595f565b613dd09190615a13565b613dda90896159f4565b613de4919061595f565b613df690670de0b6b3a76400006159f4565b613e0091906159e0565b600c54909150600090613e299063ffffffff600160981b8204811691600160781b900416615a2a565b613e3e9063ffffffff1664e8d4a510006159f4565b9050600084613e5583670de0b6b3a76400006159f4565b613e5f91906159e0565b905060008715613ea057600c548290606490613e8590600160c01b900460ff16876159f4565b613e8f91906159e0565b613e99919061595f565b9050613ee0565b600c548290606490613ebc90600160c01b900460ff1682615999565b613ec99060ff16876159f4565b613ed391906159e0565b613edd919061595f565b90505b6b033b2e3c9fd0803ce8000000811115613f0d5760405163e80fa38160e01b815260040160405180910390fd5b9998505050505050505050565b6000610ffa838361437b565b600061a4b1821480613f3a575062066eed82145b806125c957505062066eee1490565b6000818152600183016020526040812054613f90575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556125c9565b5060006125c9565b6000826000018281548110613faf57613faf615b63565b9060005260206000200154905092915050565b613fcb8961446e565b6140145760405162461bcd60e51b815260206004820152601a6024820152797075626c6963206b6579206973206e6f74206f6e20637572766560301b6044820152606401610a50565b61401d8861446e565b6140615760405162461bcd60e51b815260206004820152601560248201527467616d6d61206973206e6f74206f6e20637572766560581b6044820152606401610a50565b61406a8361446e565b6140b65760405162461bcd60e51b815260206004820152601d60248201527f6347616d6d615769746e657373206973206e6f74206f6e2063757276650000006044820152606401610a50565b6140bf8261446e565b61410b5760405162461bcd60e51b815260206004820152601c60248201527f73486173685769746e657373206973206e6f74206f6e206375727665000000006044820152606401610a50565b614117878a8887614531565b61415f5760405162461bcd60e51b81526020600482015260196024820152786164647228632a706b2b732a6729213d5f755769746e65737360381b6044820152606401610a50565b600061416b8a87614654565b9050600061417e898b878b8689896146b8565b9050600061418f838d8d8a866147d7565b9050808a146141d05760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b210383937b7b360991b6044820152606401610a50565b505050505050505050505050565b6000466141ea81613f26565b1561422957606c6001600160a01b031663c6f7de0e6040518163ffffffff1660e01b815260040160206040518083038186803b158015613b2257600080fd5b61423281614817565b156142a357600f602160991b016001600160a01b03166349948e0e84604051806080016040528060488152602001615bb360489139604051602001614278929190615522565b6040516020818303038152906040526040518263ffffffff1660e01b8152600401613b0a919061566d565b50600092915050565b600c5460035460408051633fabe5a360e21b81529051600093600160381b900463ffffffff169284926001600160a01b039091169163feaf968c9160048082019260a092909190829003018186803b15801561430757600080fd5b505afa15801561431b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061433f91906153fd565b50919550909250505063ffffffff82161580159061436b57506143628142615a13565b8263ffffffff16105b156143765760105492505b505090565b6000818152600183016020526040812054801561446457600061439f600183615a13565b85549091506000906143b390600190615a13565b90508181146144185760008660000182815481106143d3576143d3615b63565b90600052602060002001549050808760000184815481106143f6576143f6615b63565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061442957614429615b4d565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506125c9565b60009150506125c9565b80516000906401000003d019116144bc5760405162461bcd60e51b8152602060048201526012602482015271696e76616c696420782d6f7264696e61746560701b6044820152606401610a50565b60208201516401000003d0191161450a5760405162461bcd60e51b8152602060048201526012602482015271696e76616c696420792d6f7264696e61746560701b6044820152606401610a50565b60208201516401000003d01990800961452a8360005b6020020151614851565b1492915050565b60006001600160a01b0382166145775760405162461bcd60e51b815260206004820152600b60248201526a626164207769746e65737360a81b6044820152606401610a50565b60208401516000906001161561458e57601c614591565b601b5b9050600070014551231950b75fc4402da1732fc9bebe1985876000602002015109865170014551231950b75fc4402da1732fc9bebe19918203925060009190890987516040805160008082526020820180845287905260ff88169282019290925260608101929092526080820183905291925060019060a0016020604051602081039080840390855afa15801561462c573d6000803e3d6000fd5b5050604051601f1901516001600160a01b039081169088161495505050505050949350505050565b61465c614d70565b61468960018484604051602001614675939291906155ab565b604051602081830303815290604052614875565b90505b6146958161446e565b6125c95780516040805160208101929092526146b19101614675565b905061468c565b6146c0614d70565b825186516401000003d019908190069106141561471f5760405162461bcd60e51b815260206004820152601e60248201527f706f696e747320696e2073756d206d7573742062652064697374696e637400006044820152606401610a50565b61472a8789886148c3565b61476f5760405162461bcd60e51b8152602060048201526016602482015275119a5c9cdd081b5d5b0818da1958dac819985a5b195960521b6044820152606401610a50565b61477a8486856148c3565b6147c05760405162461bcd60e51b815260206004820152601760248201527614d958dbdb99081b5d5b0818da1958dac819985a5b1959604a1b6044820152606401610a50565b6147cb8684846149eb565b98975050505050505050565b6000600286868685876040516020016147f596959493929190615551565b60408051601f1981840301815291905280516020909101209695505050505050565b6000600a82148061482957506101a482145b80614836575062aa37dc82145b80614842575061210582145b806125c957505062014a331490565b6000806401000003d01980848509840990506401000003d019600782089392505050565b61487d614d70565b61488682614aae565b815261489b614896826000614520565b614ae9565b602082018190526002900660011415611eb4576020810180516401000003d019039052919050565b6000826149005760405162461bcd60e51b815260206004820152600b60248201526a3d32b9379039b1b0b630b960a91b6044820152606401610a50565b8351602085015160009061491690600290615b0d565b1561492257601c614925565b601b5b9050600070014551231950b75fc4402da1732fc9bebe198387096040805160008082526020820180845281905260ff86169282019290925260608101869052608081018390529192509060019060a0016020604051602081039080840390855afa158015614997573d6000803e3d6000fd5b5050506020604051035190506000866040516020016149b69190615510565b60408051601f1981840301815291905280516020909101206001600160a01b0392831692169190911498975050505050505050565b6149f3614d70565b835160208086015185519186015160009384938493614a1493909190614b09565b919450925090506401000003d019858209600114614a705760405162461bcd60e51b815260206004820152601960248201527834b73b2d1036bab9ba1031329034b73b32b939b29037b3103d60391b6044820152606401610a50565b60405180604001604052806401000003d01980614a8f57614a8f615b37565b87860981526020016401000003d0198785099052979650505050505050565b805160208201205b6401000003d0198110611eb457604080516020808201939093528151808203840181529082019091528051910120614ab6565b60006125c9826002614b026401000003d019600161595f565b901c614be9565b60008080600180826401000003d019896401000003d019038808905060006401000003d0198b6401000003d019038a0890506000614b4983838585614c80565b9098509050614b5a88828e88614ca4565b9098509050614b6b88828c87614ca4565b90985090506000614b7e8d878b85614ca4565b9098509050614b8f88828686614c80565b9098509050614ba088828e89614ca4565b9098509050818114614bd5576401000003d019818a0998506401000003d01982890997506401000003d0198183099650614bd9565b8196505b5050505050509450945094915050565b600080614bf4614d8e565b6020808252818101819052604082015260608101859052608081018490526401000003d01960a0820152614c26614dac565b60208160c0846005600019fa925082614c765760405162461bcd60e51b81526020600482015260126024820152716269674d6f64457870206661696c7572652160701b6044820152606401610a50565b5195945050505050565b6000806401000003d0198487096401000003d0198487099097909650945050505050565b600080806401000003d019878509905060006401000003d01987876401000003d019030990506401000003d0198183086401000003d01986890990999098509650505050505050565b828054828255906000526020600020908101928215614d42579160200282015b82811115614d4257825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614d0d565b50614d4e929150614dca565b5090565b5080546000825590600052602060002090810190610a599190614dca565b60405180604001604052806002906020820280368337509192915050565b6040518060c001604052806006906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b5b80821115614d4e5760008155600101614dcb565b8035611eb481615b8f565b80604081018310156125c957600080fd5b600082601f830112614e0c57600080fd5b604051604081018181106001600160401b0382111715614e2e57614e2e615b79565b8060405250808385604086011115614e4557600080fd5b60005b6002811015614e67578135835260209283019290910190600101614e48565b509195945050505050565b8035611eb481615ba4565b600060c08284031215614e8f57600080fd5b614e976158ba565b9050614ea282614f91565b815260208083013581830152614eba60408401614f7d565b6040830152614ecb60608401614f7d565b60608301526080830135614ede81615b8f565b608083015260a08301356001600160401b0380821115614efd57600080fd5b818501915085601f830112614f1157600080fd5b813581811115614f2357614f23615b79565b614f35601f8201601f19168501615905565b91508082528684828501011115614f4b57600080fd5b80848401858401376000848284010152508060a085015250505092915050565b803561ffff81168114611eb457600080fd5b803563ffffffff81168114611eb457600080fd5b80356001600160401b0381168114611eb457600080fd5b803560ff81168114611eb457600080fd5b805169ffffffffffffffffffff81168114611eb457600080fd5b600060208284031215614fe557600080fd5b8135610ffa81615b8f565b6000806040838503121561500357600080fd5b823561500e81615b8f565b9150602083013561501e81615b8f565b809150509250929050565b6000806000806060858703121561503f57600080fd5b843561504a81615b8f565b93506020850135925060408501356001600160401b038082111561506d57600080fd5b818701915087601f83011261508157600080fd5b81358181111561509057600080fd5b8860208285010111156150a257600080fd5b95989497505060200194505050565b6000604082840312156150c357600080fd5b610ffa8383614dea565b600080606083850312156150e057600080fd5b6150ea8484614dea565b91506150f860408401614f91565b90509250929050565b60006040828403121561511357600080fd5b610ffa8383614dfb565b60006020828403121561512f57600080fd5b8151610ffa81615ba4565b60006020828403121561514c57600080fd5b5035919050565b60006020828403121561516557600080fd5b5051919050565b60006020828403121561517e57600080fd5b604051602081018181106001600160401b03821117156151a0576151a0615b79565b60405282356151ae81615ba4565b81529392505050565b60008060008385036101e08112156151ce57600080fd5b6101a0808212156151de57600080fd5b6151e66158e2565b91506151f28787614dfb565b82526152018760408801614dfb565b60208301526080860135604083015260a0860135606083015260c0860135608083015261523060e08701614ddf565b60a083015261010061524488828901614dfb565b60c0840152615257886101408901614dfb565b60e0840152610180870135908301529093508401356001600160401b0381111561528057600080fd5b61528c86828701614e7d565b92505061529c6101c08501614e72565b90509250925092565b6000602082840312156152b757600080fd5b81356001600160401b038111156152cd57600080fd5b820160c08185031215610ffa57600080fd5b6000602082840312156152f157600080fd5b610ffa82614f6b565b60008060008060008060008060006101208a8c03121561531957600080fd5b6153228a614f6b565b985061533060208b01614f7d565b975061533e60408b01614f7d565b965061534c60608b01614f7d565b955060808a0135945061536160a08b01614f7d565b935061536f60c08b01614f7d565b925061537d60e08b01614fa8565b915061538c6101008b01614fa8565b90509295985092959850929598565b600080604083850312156153ae57600080fd5b82359150602083013561501e81615b8f565b600080604083850312156153d357600080fd5b50508035926020909101359150565b6000602082840312156153f457600080fd5b610ffa82614f7d565b600080600080600060a0868803121561541557600080fd5b61541e86614fb9565b945060208601519350604086015192506060860151915061544160808701614fb9565b90509295509295909350565b600081518084526020808501945080840160005b838110156154865781516001600160a01b031687529582019590820190600101615461565b509495945050505050565b8060005b6002811015612b21578151845260209384019390910190600101615495565b600081518084526020808501945080840160005b83811015615486578151875295820195908201906001016154c8565b600081518084526154fc816020860160208601615a9f565b601f01601f19169290920160200192915050565b61551a8183615491565b604001919050565b60008351615534818460208801615a9f565b835190830190615548818360208801615a9f565b01949350505050565b8681526155616020820187615491565b61556e6060820186615491565b61557b60a0820185615491565b61558860e0820184615491565b60609190911b6001600160601b0319166101208201526101340195945050505050565b8381526155bb6020820184615491565b606081019190915260800192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039290921682526001600160601b0316602082015260400190565b604081016125c98284615491565b602081526000610ffa60208301846154b4565b9182526001600160401b0316602082015260400190565b602081526000610ffa60208301846154e4565b6020815260ff82511660208201526020820151604082015260018060a01b0360408301511660608201526000606083015160c060808401526156c560e084018261544d565b60808501516001600160601b0390811660a0868101919091529095015190941660c0909301929092525090919050565b9182526001600160a01b0316602082015260400190565b82815260608101610ffa6020830184615491565b82815260406020820152600061345b60408301846154b4565b86815285602082015261ffff85166040820152600063ffffffff808616606084015280851660808401525060c060a08301526147cb60c08301846154e4565b878152602081018790526040810186905263ffffffff8581166060830152841660808201526001600160a01b03831660a082015260e060c08201819052600090613f0d908301846154e4565b8781526001600160401b03871660208201526040810186905263ffffffff8581166060830152841660808201526001600160a01b03831660a082015260e060c08201819052600090613f0d908301846154e4565b6001600160601b038681168252851660208201526001600160401b03841660408201526001600160a01b038316606082015260a0608082018190526000906158629083018461544d565b979650505050505050565b6000808335601e1984360301811261588457600080fd5b8301803591506001600160401b0382111561589e57600080fd5b6020019150368190038213156158b357600080fd5b9250929050565b60405160c081016001600160401b03811182821017156158dc576158dc615b79565b60405290565b60405161012081016001600160401b03811182821017156158dc576158dc615b79565b604051601f8201601f191681016001600160401b038111828210171561592d5761592d615b79565b604052919050565b6000808585111561594557600080fd5b8386111561595257600080fd5b5050820193919092039150565b6000821982111561597257615972615b21565b500190565b60006001600160401b0380831681851680830382111561554857615548615b21565b600060ff821660ff84168060ff038211156159b6576159b6615b21565b019392505050565b60006001600160601b0382811684821680830382111561554857615548615b21565b6000826159ef576159ef615b37565b500490565b6000816000190483118215151615615a0e57615a0e615b21565b500290565b600082821015615a2557615a25615b21565b500390565b600063ffffffff83811690831681811015615a4757615a47615b21565b039392505050565b60006001600160601b0383811690831681811015615a4757615a47615b21565b6001600160e01b03198135818116916004851015615a975780818660040360031b1b83161692505b505092915050565b60005b83811015615aba578181015183820152602001615aa2565b83811115612b215750506000910152565b6000600019821415615adf57615adf615b21565b5060010190565b60006001600160401b0380831681811415615b0357615b03615b21565b6001019392505050565b600082615b1c57615b1c615b37565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610a5957600080fd5b8015158114610a5957600080fdfe307866666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666a164736f6c6343000806000a", + Bin: "0x60a06040523480156200001157600080fd5b5060405162005dcf38038062005dcf833981016040819052620000349162000183565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000d7565b50505060601b6001600160601b031916608052620001b5565b6001600160a01b038116331415620001325760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000602082840312156200019657600080fd5b81516001600160a01b0381168114620001ae57600080fd5b9392505050565b60805160601c615bf4620001db6000396000818161055001526132150152615bf46000f3fe60806040526004361061021c5760003560e01c80638402595e11610124578063b2a7cac5116100a6578063b2a7cac514610732578063bec4c08c14610752578063caf70c4a14610772578063cb63179714610792578063d98e620e146107b2578063da2f2610146107d2578063dac83d2914610831578063dc311dd314610851578063e72f6e3014610882578063ee9d2d38146108a2578063f2fde38b146108cf57600080fd5b80638402595e146105c757806386fe91c7146105e75780638da5cb5b1461060757806395b55cfc146106255780639b1c385e146106385780639d40a6fd14610658578063a21a23e414610690578063a4c0ed36146106a5578063a63e0bfb146106c5578063aa433aff146106e5578063aefb212f1461070557600080fd5b8063405b84fa116101ad578063405b84fa1461044e57806340d6bb821461046e57806341af6c871461049957806351cff8d9146104c95780635d06b4ab146104e957806364d51a2a14610509578063659827441461051e578063689c45171461053e57806372e9d5651461057257806379ba5097146105925780637a5a2aef146105a757600080fd5b806304104edb14610221578063043bd6ae14610243578063088070f51461026c57806308821d581461033a5780630ae095401461035a57806315c48b841461037a57806318e3dd27146103a25780631b6b6d23146103e15780632f622e6b1461040e578063301f42e91461042e575b600080fd5b34801561022d57600080fd5b5061024161023c366004614fc0565b6108ef565b005b34801561024f57600080fd5b5061025960105481565b6040519081526020015b60405180910390f35b34801561027857600080fd5b50600c546102dd9061ffff81169063ffffffff62010000820481169160ff600160301b8204811692600160381b8304811692600160581b8104821692600160781b8204831692600160981b83041691600160b81b8104821691600160c01b9091041689565b6040805161ffff909a168a5263ffffffff98891660208b01529615159689019690965293861660608801529185166080870152841660a08601529290921660c084015260ff91821660e08401521661010082015261012001610263565b34801561034657600080fd5b5061024161035536600461509e565b610a5c565b34801561036657600080fd5b50610241610375366004615388565b610c06565b34801561038657600080fd5b5061038f60c881565b60405161ffff9091168152602001610263565b3480156103ae57600080fd5b50600a546103c990600160601b90046001600160601b031681565b6040516001600160601b039091168152602001610263565b3480156103ed57600080fd5b50600254610401906001600160a01b031681565b60405161026391906155b9565b34801561041a57600080fd5b50610241610429366004614fc0565b610c4e565b34801561043a57600080fd5b506103c96104493660046151a4565b610d9a565b34801561045a57600080fd5b50610241610469366004615388565b611001565b34801561047a57600080fd5b506104846101f481565b60405163ffffffff9091168152602001610263565b3480156104a557600080fd5b506104b96104b4366004615127565b6113b3565b6040519015158152602001610263565b3480156104d557600080fd5b506102416104e4366004614fc0565b6114c3565b3480156104f557600080fd5b50610241610504366004614fc0565b611651565b34801561051557600080fd5b5061038f606481565b34801561052a57600080fd5b50610241610539366004614fdd565b611708565b34801561054a57600080fd5b506104017f000000000000000000000000000000000000000000000000000000000000000081565b34801561057e57600080fd5b50600354610401906001600160a01b031681565b34801561059e57600080fd5b50610241611768565b3480156105b357600080fd5b506102416105c23660046150ba565b611812565b3480156105d357600080fd5b506102416105e2366004614fc0565b611942565b3480156105f357600080fd5b50600a546103c9906001600160601b031681565b34801561061357600080fd5b506000546001600160a01b0316610401565b610241610633366004615127565b611a54565b34801561064457600080fd5b50610259610653366004615292565b611b78565b34801561066457600080fd5b50600754610678906001600160401b031681565b6040516001600160401b039091168152602001610263565b34801561069c57600080fd5b50610259611eb9565b3480156106b157600080fd5b506102416106c0366004615016565b61208c565b3480156106d157600080fd5b506102416106e03660046152e7565b612208565b3480156106f157600080fd5b50610241610700366004615127565b612472565b34801561071157600080fd5b506107256107203660046153ad565b6124ba565b6040516102639190615630565b34801561073e57600080fd5b5061024161074d366004615127565b6125bc565b34801561075e57600080fd5b5061024161076d366004615388565b6126b1565b34801561077e57600080fd5b5061025961078d3660046150ee565b6127bd565b34801561079e57600080fd5b506102416107ad366004615388565b6127ed565b3480156107be57600080fd5b506102596107cd366004615127565b612a5c565b3480156107de57600080fd5b506108126107ed366004615127565b600d6020526000908152604090205460ff81169061010090046001600160401b031682565b6040805192151583526001600160401b03909116602083015201610263565b34801561083d57600080fd5b5061024161084c366004615388565b612a7d565b34801561085d57600080fd5b5061087161086c366004615127565b612b14565b604051610263959493929190615805565b34801561088e57600080fd5b5061024161089d366004614fc0565b612c02565b3480156108ae57600080fd5b506102596108bd366004615127565b600f6020526000908152604090205481565b3480156108db57600080fd5b506102416108ea366004614fc0565b612dd5565b6108f7612de6565b60115460005b81811015610a3457826001600160a01b03166011828154811061092257610922615b50565b6000918252602090912001546001600160a01b03161415610a2457601161094a600184615a00565b8154811061095a5761095a615b50565b600091825260209091200154601180546001600160a01b03909216918390811061098657610986615b50565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060118054806109c5576109c5615b3a565b600082815260209020810160001990810180546001600160a01b03191690550190556040517ff80a1a97fd42251f3c33cda98635e7399253033a6774fe37cd3f650b5282af3790610a179085906155b9565b60405180910390a1505050565b610a2d81615ab8565b90506108fd565b5081604051635428d44960e01b8152600401610a5091906155b9565b60405180910390fd5b50565b610a64612de6565b604080518082018252600091610a939190849060029083908390808284376000920191909152506127bd915050565b6000818152600d602090815260409182902082518084019093525460ff811615158084526101009091046001600160401b03169183019190915291925090610af157604051631dfd6e1360e21b815260048101839052602401610a50565b6000828152600d6020526040812080546001600160481b0319169055600e54905b81811015610bc25783600e8281548110610b2e57610b2e615b50565b90600052602060002001541415610bb257600e610b4c600184615a00565b81548110610b5c57610b5c615b50565b9060005260206000200154600e8281548110610b7a57610b7a615b50565b600091825260209091200155600e805480610b9757610b97615b3a565b60019003818190600052602060002001600090559055610bc2565b610bbb81615ab8565b9050610b12565b507f9b6868e0eb737bcd72205360baa6bfd0ba4e4819a33ade2db384e8a8025639a5838360200151604051610bf8929190615643565b60405180910390a150505050565b81610c1081612e3b565b610c18612e9c565b610c21836113b3565b15610c3f57604051631685ecdd60e31b815260040160405180910390fd5b610c498383612ec7565b505050565b610c56612e9c565b610c5e612de6565b600b54600160601b90046001600160601b0316610c8e57604051631e9acf1760e31b815260040160405180910390fd5b600b8054600160601b90046001600160601b0316908190600c610cb18380615a3c565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555080600a600c8282829054906101000a90046001600160601b0316610cf99190615a3c565b92506101000a8154816001600160601b0302191690836001600160601b031602179055506000826001600160a01b0316826001600160601b031660405160006040518083038185875af1925050503d8060008114610d73576040519150601f19603f3d011682016040523d82523d6000602084013e610d78565b606091505b5050905080610c495760405163950b247960e01b815260040160405180910390fd5b6000610da4612e9c565b60005a9050610324361115610dd657604051630f28961b60e01b81523660048201526103246024820152604401610a50565b6000610de2868661307b565b90506000610df885836000015160200151613337565b60408301516060888101519293509163ffffffff16806001600160401b03811115610e2557610e25615b66565b604051908082528060200260200182016040528015610e4e578160200160208202803683370190505b50925060005b81811015610eb65760408051602081018590529081018290526060016040516020818303038152906040528051906020012060001c848281518110610e9b57610e9b615b50565b6020908102919091010152610eaf81615ab8565b9050610e54565b5050602080850180516000908152600f9092526040822082905551610edc908a85613385565b60208a8101516000908152600690915260409020805491925090601890610f1290600160c01b90046001600160401b0316615ad3565b91906101000a8154816001600160401b0302191690836001600160401b0316021790555060008960a0015160018b60a0015151610f4f9190615a00565b81518110610f5f57610f5f615b50565b60209101015160f81c6001149050610f798786838c613420565b9750610f8a88828c60200151613450565b6020808b015187820151604080518781526001600160601b038d16948101949094528415159084015284151560608401528b1515608084015290917faeb4b4786571e184246d39587f659abf0e26f41f6a3358692250382c0cdb47b79060a00160405180910390a3505050505050505b9392505050565b611009612e9c565b611012816135a3565b6110315780604051635428d44960e01b8152600401610a5091906155b9565b60008060008061104086612b14565b945094505093509350336001600160a01b0316826001600160a01b0316146110a35760405162461bcd60e51b81526020600482015260166024820152752737ba1039bab139b1b934b83a34b7b71037bbb732b960511b6044820152606401610a50565b6110ac866113b3565b156110f25760405162461bcd60e51b815260206004820152601660248201527550656e64696e6720726571756573742065786973747360501b6044820152606401610a50565b6040805160c0810182526001815260208082018990526001600160a01b03851682840152606082018490526001600160601b038088166080840152861660a0830152915190916000916111479184910161566d565b60405160208183030381529060405290506111618861360f565b505060405163ce3f471960e01b81526001600160a01b0388169063ce3f4719906001600160601b0388169061119a90859060040161565a565b6000604051808303818588803b1580156111b357600080fd5b505af11580156111c7573d6000803e3d6000fd5b50506002546001600160a01b0316158015935091506111f0905057506001600160601b03861615155b156112ba5760025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611227908a908a90600401615600565b602060405180830381600087803b15801561124157600080fd5b505af1158015611255573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611279919061510a565b6112ba5760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610a50565b600c805460ff60301b1916600160301b17905560005b8351811015611361578381815181106112eb576112eb615b50565b60200260200101516001600160a01b0316638ea98117896040518263ffffffff1660e01b815260040161131e91906155b9565b600060405180830381600087803b15801561133857600080fd5b505af115801561134c573d6000803e3d6000fd5b505050508061135a90615ab8565b90506112d0565b50600c805460ff60301b191690556040517fd63ca8cb945956747ee69bfdc3ea754c24a4caf7418db70e46052f7850be4187906113a19089908b906155cd565b60405180910390a15050505050505050565b60008181526005602052604081206002018054806113d5575060009392505050565b600e5460005b828110156114b75760008482815481106113f7576113f7615b50565b60009182526020822001546001600160a01b031691505b838110156114a457600061146c600e838154811061142e5761142e615b50565b60009182526020808320909101546001600160a01b03871683526004825260408084208e855290925291205485908c906001600160401b03166137b7565b506000818152600f6020526040902054909150156114935750600198975050505050505050565b5061149d81615ab8565b905061140e565b5050806114b090615ab8565b90506113db565b50600095945050505050565b6114cb612e9c565b6114d3612de6565b6002546001600160a01b03166114fc5760405163c1f0c0a160e01b815260040160405180910390fd5b600b546001600160601b031661152557604051631e9acf1760e31b815260040160405180910390fd5b600b80546001600160601b031690819060006115418380615a3c565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555080600a60008282829054906101000a90046001600160601b03166115899190615a3c565b82546001600160601b039182166101009390930a92830291909202199091161790555060025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906115de9085908590600401615600565b602060405180830381600087803b1580156115f857600080fd5b505af115801561160c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611630919061510a565b61164d57604051631e9acf1760e31b815260040160405180910390fd5b5050565b611659612de6565b611662816135a3565b15611682578060405163ac8a27ef60e01b8152600401610a5091906155b9565b601180546001810182556000919091527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c680180546001600160a01b0319166001600160a01b0383161790556040517fb7cabbfc11e66731fc77de0444614282023bcbd41d16781c753a431d0af01625906116fd9083906155b9565b60405180910390a150565b611710612de6565b6002546001600160a01b03161561173a57604051631688c53760e11b815260040160405180910390fd5b600280546001600160a01b039384166001600160a01b03199182161790915560038054929093169116179055565b6001546001600160a01b031633146117bb5760405162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b6044820152606401610a50565b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b61181a612de6565b6040805180820182526000916118499190859060029083908390808284376000920191909152506127bd915050565b6000818152600d602052604090205490915060ff161561187f57604051634a0b8fa760e01b815260048101829052602401610a50565b60408051808201825260018082526001600160401b0385811660208085019182526000878152600d9091528581209451855492516001600160481b031990931690151568ffffffffffffffff00191617610100929093169190910291909117909255600e805491820181559091527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd01829055517f9b911b2c240bfbef3b6a8f7ed6ee321d1258bb2a3fe6becab52ac1cd3210afd390610a179083908590615643565b61194a612de6565b600a544790600160601b90046001600160601b03168181111561198a576040516354ced18160e11b81526004810182905260248101839052604401610a50565b81811015610c4957600061199e8284615a00565b90506000846001600160a01b03168260405160006040518083038185875af1925050503d80600081146119ed576040519150601f19603f3d011682016040523d82523d6000602084013e6119f2565b606091505b5050905080611a145760405163950b247960e01b815260040160405180910390fd5b7f4aed7c8eed0496c8c19ea2681fcca25741c1602342e38b045d9f1e8e905d2e9c8583604051611a459291906155cd565b60405180910390a15050505050565b611a5c612e9c565b6000818152600560205260409020546001600160a01b0316611a9157604051630fb532db60e11b815260040160405180910390fd5b60008181526006602052604090208054600160601b90046001600160601b0316903490600c611ac083856159ab565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555034600a600c8282829054906101000a90046001600160601b0316611b0891906159ab565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550817f7603b205d03651ee812f803fccde89f1012e545a9c99f0abfea9cedd0fd8e902823484611b5b919061594c565b604080519283526020830191909152015b60405180910390a25050565b6000611b82612e9c565b602080830135600081815260059092526040909120546001600160a01b0316611bbe57604051630fb532db60e11b815260040160405180910390fd5b33600090815260046020908152604080832084845291829052909120546001600160401b031680611c065782336040516379bfd40160e01b8152600401610a509291906156e2565b600c5461ffff16611c1d60608701604088016152cc565b61ffff161080611c40575060c8611c3a60608701604088016152cc565b61ffff16115b15611c8657611c5560608601604087016152cc565b600c5460405163539c34bb60e11b815261ffff92831660048201529116602482015260c86044820152606401610a50565b600c5462010000900463ffffffff16611ca560808701606088016153cf565b63ffffffff161115611cf557611cc160808601606087016153cf565b600c54604051637aebf00f60e11b815263ffffffff9283166004820152620100009091049091166024820152604401610a50565b6101f4611d0860a08701608088016153cf565b63ffffffff161115611d4e57611d2460a08601608087016153cf565b6040516311ce1afb60e21b815263ffffffff90911660048201526101f46024820152604401610a50565b611d5781615ad3565b90506000611d6886353386856137b7565b90955090506000611d8c611d87611d8260a08a018a61585a565b613830565b6138ad565b905085611d9761391e565b86611da860808b0160608c016153cf565b611db860a08c0160808d016153cf565b3386604051602001611dd09796959493929190615765565b60405160208183030381529060405280519060200120600f600088815260200190815260200160002081905550336001600160a01b03168588600001357feb0e3652e0f44f417695e6e90f2f42c99b65cd7169074c5a654b16b9748c3a4e89868c6040016020810190611e4391906152cc565b8d6060016020810190611e5691906153cf565b8e6080016020810190611e6991906153cf565b89604051611e7c96959493929190615726565b60405180910390a450506000928352602091909152604090912080546001600160401b0319166001600160401b039092169190911790555b919050565b6000611ec3612e9c565b6007546001600160401b031633611edb600143615a00565b6040516001600160601b0319606093841b81166020830152914060348201523090921b1660548201526001600160c01b031960c083901b16606882015260700160408051601f1981840301815291905280516020909101209150611f40816001615964565b600780546001600160401b0319166001600160401b03928316179055604080516000808252608082018352602080830182815283850183815260608086018581528a86526006855287862093518454935191516001600160601b039182166001600160c01b031990951694909417600160601b9190921602176001600160c01b0316600160c01b9290981691909102969096179055835194850184523385528481018281528585018481528884526005835294909220855181546001600160a01b03199081166001600160a01b03928316178355935160018301805490951691161790925592518051929493919261203e9260028501920190614cda565b5061204e915060089050846139ae565b50827f1d3015d7ba850fa198dc7b1a3f5d42779313a681035f77c8c03764c61005518d3360405161207f91906155b9565b60405180910390a2505090565b612094612e9c565b6002546001600160a01b031633146120bf576040516344b0e3c360e01b815260040160405180910390fd5b602081146120e057604051638129bbcd60e01b815260040160405180910390fd5b60006120ee82840184615127565b6000818152600560205260409020549091506001600160a01b031661212657604051630fb532db60e11b815260040160405180910390fd5b600081815260066020526040812080546001600160601b03169186919061214d83856159ab565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555084600a60008282829054906101000a90046001600160601b031661219591906159ab565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550817f1ced9348ff549fceab2ac57cd3a9de38edaaab274b725ee82c23e8fc8c4eec7a8287846121e8919061594c565b6040805192835260208301919091520160405180910390a2505050505050565b612210612de6565b60c861ffff8a16111561224a5760405163539c34bb60e11b815261ffff8a1660048201819052602482015260c86044820152606401610a50565b6000851361226e576040516321ea67b360e11b815260048101869052602401610a50565b8363ffffffff168363ffffffff1611156122ab576040516313c06e5960e11b815263ffffffff808516600483015285166024820152604401610a50565b604080516101208101825261ffff8b1680825263ffffffff808c16602084018190526000848601528b8216606085018190528b8316608086018190528a841660a08701819052938a1660c0870181905260ff808b1660e08901819052908a16610100909801889052600c8054600160c01b90990260ff60c01b19600160b81b9093029290921661ffff60b81b19600160981b90940263ffffffff60981b19600160781b9099029890981667ffffffffffffffff60781b19600160581b90960263ffffffff60581b19600160381b9098029790971668ffffffffffffffffff60301b196201000090990265ffffffffffff19909c16909a179a909a1796909616979097179390931791909116959095179290921793909316929092179190911790556010869055517f2c6b6b12413678366b05b145c5f00745bdd00e739131ab5de82484a50c9d78b69061245f908b908b908b908b908b908b908b908b908b9061ffff99909916895263ffffffff97881660208a0152958716604089015293861660608801526080870192909252841660a086015290921660c084015260ff91821660e0840152166101008201526101200190565b60405180910390a1505050505050505050565b61247a612de6565b6000818152600560205260409020546001600160a01b0316806124b057604051630fb532db60e11b815260040160405180910390fd5b61164d8282612ec7565b606060006124c860086139ba565b90508084106124ea57604051631390f2a160e01b815260040160405180910390fd5b60006124f6848661594c565b905081811180612504575083155b61250e5780612510565b815b9050600061251e8683615a00565b9050806001600160401b0381111561253857612538615b66565b604051908082528060200260200182016040528015612561578160200160208202803683370190505b50935060005b818110156125b15761258461257c888361594c565b6008906139c4565b85828151811061259657612596615b50565b60209081029190910101526125aa81615ab8565b9050612567565b505050505b92915050565b6125c4612e9c565b6000818152600560205260409020546001600160a01b0316806125fa57604051630fb532db60e11b815260040160405180910390fd5b6000828152600560205260409020600101546001600160a01b03163314612651576000828152600560205260409081902060010154905163d084e97560e01b8152610a50916001600160a01b0316906004016155b9565b600082815260056020526040908190208054336001600160a01b031991821681178355600190920180549091169055905183917fd4114ab6e9af9f597c52041f32d62dc57c5c4e4c0d4427006069635e216c938691611b6c9185916155e6565b816126bb81612e3b565b6126c3612e9c565b60008381526005602052604090206002018054606414156126f7576040516305a48e0f60e01b815260040160405180910390fd5b6001600160a01b038316600090815260046020908152604080832087845291829052909120546001600160401b031615612732575050505050565b600085815260208281526040808320805460016001600160401b0319909116811790915585549081018655858452919092200180546001600160a01b0319166001600160a01b0387161790555185907f1e980d04aa7648e205713e5e8ea3808672ac163d10936d36f91b2c88ac1575e1906127ae9087906155b9565b60405180910390a25050505050565b6000816040516020016127d09190615622565b604051602081830303815290604052805190602001209050919050565b816127f781612e3b565b6127ff612e9c565b612808836113b3565b1561282657604051631685ecdd60e31b815260040160405180910390fd5b6001600160a01b03821660009081526004602090815260408083208684529091529020546001600160401b03166128745782826040516379bfd40160e01b8152600401610a509291906156e2565b6000838152600560209081526040808320600201805482518185028101850190935280835291929091908301828280156128d757602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116128b9575b505050505090506000600182516128ee9190615a00565b905060005b82518110156129f857846001600160a01b031683828151811061291857612918615b50565b60200260200101516001600160a01b031614156129e857600083838151811061294357612943615b50565b602002602001015190508060056000898152602001908152602001600020600201838154811061297557612975615b50565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394909416939093179092558881526005909152604090206002018054806129c0576129c0615b3a565b600082815260209020810160001990810180546001600160a01b0319169055019055506129f8565b6129f181615ab8565b90506128f3565b506001600160a01b03841660009081526004602090815260408083208884529091529081902080546001600160401b03191690555185907f32158c6058347c1601b2d12bc696ac6901d8a9a9aa3ba10c27ab0a983e8425a7906127ae9087906155b9565b600e8181548110612a6c57600080fd5b600091825260209091200154905081565b81612a8781612e3b565b612a8f612e9c565b600083815260056020526040902060018101546001600160a01b03848116911614612b0e576001810180546001600160a01b0319166001600160a01b03851617905560405184907f21a4dad170a6bf476c31bbcf4a16628295b0e450672eec25d7c93308e05344a190612b0590339087906155e6565b60405180910390a25b50505050565b600081815260056020526040812054819081906001600160a01b0316606081612b5057604051630fb532db60e11b815260040160405180910390fd5b600086815260066020908152604080832054600583529281902060020180548251818502810185019093528083526001600160601b0380861695600160601b810490911694600160c01b9091046001600160401b0316938893929091839190830182828015612be857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612bca575b505050505090509450945094509450945091939590929450565b612c0a612de6565b6002546001600160a01b0316612c335760405163c1f0c0a160e01b815260040160405180910390fd5b6002546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612c649030906004016155b9565b60206040518083038186803b158015612c7c57600080fd5b505afa158015612c90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cb49190615140565b600a549091506001600160601b031681811115612cee576040516354ced18160e11b81526004810182905260248101839052604401610a50565b81811015610c49576000612d028284615a00565b60025460405163a9059cbb60e01b81529192506001600160a01b03169063a9059cbb90612d3590879085906004016155cd565b602060405180830381600087803b158015612d4f57600080fd5b505af1158015612d63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d87919061510a565b612da457604051631f01ff1360e21b815260040160405180910390fd5b7f59bfc682b673f8cbf945f1e454df9334834abf7dfe7f92237ca29ecb9b4366008482604051610bf89291906155cd565b612ddd612de6565b610a59816139d0565b6000546001600160a01b03163314612e395760405162461bcd60e51b815260206004820152601660248201527527b7363c9031b0b63630b1363290313c9037bbb732b960511b6044820152606401610a50565b565b6000818152600560205260409020546001600160a01b031680612e7157604051630fb532db60e11b815260040160405180910390fd5b336001600160a01b0382161461164d5780604051636c51fda960e11b8152600401610a5091906155b9565b600c54600160301b900460ff1615612e395760405163769dd35360e11b815260040160405180910390fd5b600080612ed38461360f565b60025491935091506001600160a01b031615801590612efa57506001600160601b03821615155b15612fa95760025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90612f3a9086906001600160601b038716906004016155cd565b602060405180830381600087803b158015612f5457600080fd5b505af1158015612f68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f8c919061510a565b612fa957604051631e9acf1760e31b815260040160405180910390fd5b6000836001600160a01b0316826001600160601b031660405160006040518083038185875af1925050503d8060008114612fff576040519150601f19603f3d011682016040523d82523d6000602084013e613004565b606091505b50509050806130265760405163950b247960e01b815260040160405180910390fd5b604080516001600160a01b03861681526001600160601b03808616602083015284169181019190915285907f8c74ce8b8cf87f5eb001275c8be27eb34ea2b62bfab6814fcc62192bb63e81c4906060016127ae565b6040805160a081018252600060608201818152608083018290528252602082018190529181019190915260006130b484600001516127bd565b6000818152600d602090815260409182902082518084019093525460ff811615158084526101009091046001600160401b0316918301919091529192509061311257604051631dfd6e1360e21b815260048101839052602401610a50565b6000828660800151604051602001613134929190918252602082015260400190565b60408051601f1981840301815291815281516020928301206000818152600f9093529120549091508061317a57604051631b44092560e11b815260040160405180910390fd5b85516020808801516040808a015160608b015160808c015160a08d015193516131a9978a9790969591016157b1565b6040516020818303038152906040528051906020012081146131de5760405163354a450b60e21b815260040160405180910390fd5b60006131ed8760000151613a74565b9050806132c5578651604051631d2827a760e31b81526001600160401b0390911660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e9413d389060240160206040518083038186803b15801561325f57600080fd5b505afa158015613273573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132979190615140565b9050806132c557865160405163175dadad60e01b81526001600160401b039091166004820152602401610a50565b60008860800151826040516020016132e7929190918252602082015260400190565b6040516020818303038152906040528051906020012060001c9050600061330e8a83613b56565b604080516060810182529788526020880196909652948601949094525092979650505050505050565b6000816001600160401b03163a111561337d57821561336057506001600160401b0381166125b6565b3a8260405163435e532d60e11b8152600401610a50929190615643565b503a92915050565b6000806000631fe543e360e01b86856040516024016133a592919061570d565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252600c805460ff60301b1916600160301b1790559086015160808701519192506134099163ffffffff9091169083613bc1565b600c805460ff60301b191690559695505050505050565b6000821561343a57613433858584613c0d565b9050613448565b613445858584613d1e565b90505b949350505050565b6000818152600660205260409020821561350f5780546001600160601b03600160601b909104811690851681101561349b57604051631e9acf1760e31b815260040160405180910390fd5b6134a58582615a3c565b8254600160601b600160c01b031916600160601b6001600160601b039283168102919091178455600b805488939192600c926134e59286929004166159ab565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555050612b0e565b80546001600160601b0390811690851681101561353f57604051631e9acf1760e31b815260040160405180910390fd5b6135498582615a3c565b82546001600160601b0319166001600160601b03918216178355600b80548792600091613578918591166159ab565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505050505050565b601154600090815b8181101561360557836001600160a01b0316601182815481106135d0576135d0615b50565b6000918252602090912001546001600160a01b031614156135f5575060019392505050565b6135fe81615ab8565b90506135ab565b5060009392505050565b60008181526005602090815260408083206006909252822054600290910180546001600160601b0380841694600160601b90940416925b818110156136b1576004600084838154811061366457613664615b50565b60009182526020808320909101546001600160a01b031683528281019390935260409182018120898252909252902080546001600160401b03191690556136aa81615ab8565b9050613646565b50600085815260056020526040812080546001600160a01b031990811682556001820180549091169055906136e96002830182614d3f565b5050600085815260066020526040812055613705600886613f07565b506001600160601b0384161561375857600a80548591906000906137339084906001600160601b0316615a3c565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505b6001600160601b038316156137b05782600a600c8282829054906101000a90046001600160601b031661378b9190615a3c565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505b5050915091565b6040805160208082018790526001600160a01b03959095168183015260608101939093526001600160401b03919091166080808401919091528151808403909101815260a08301825280519084012060c083019490945260e0808301859052815180840390910181526101009092019052805191012091565b6040805160208101909152600081528161385957506040805160208101909152600081526125b6565b63125fa26760e31b61386b8385615a5c565b6001600160e01b0319161461389357604051632923fee760e11b815260040160405180910390fd5b6138a08260048186615922565b810190610ffa9190615159565b60607f92fd13387c7fe7befbc38d303d6468778fb9731bc4583f17d92989c6fcfdeaaa826040516024016138e691511515815260200190565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915292915050565b60004661392a81613f13565b156139a75760646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561396957600080fd5b505afa15801561397d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139a19190615140565b91505090565b4391505090565b6000610ffa8383613f36565b60006125b6825490565b6000610ffa8383613f85565b6001600160a01b038116331415613a235760405162461bcd60e51b815260206004820152601760248201527621b0b73737ba103a3930b739b332b9103a379039b2b63360491b6044820152606401610a50565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600046613a8081613f13565b15613b4757610100836001600160401b0316613a9a61391e565b613aa49190615a00565b1180613ac05750613ab361391e565b836001600160401b031610155b15613ace5750600092915050565b6040516315a03d4160e11b81526001600160401b0384166004820152606490632b407a82906024015b60206040518083038186803b158015613b0f57600080fd5b505afa158015613b23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ffa9190615140565b50506001600160401b03164090565b6000613b8a8360000151846020015185604001518660600151868860a001518960c001518a60e001518b6101000151613faf565b60038360200151604051602001613ba29291906156f9565b60408051601f1981840301815291905280516020909101209392505050565b60005a611388811015613bd357600080fd5b611388810390508460408204820311613beb57600080fd5b50823b613bf757600080fd5b60008083516020850160008789f1949350505050565b600080613c506000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506141cb92505050565b905060005a600c54613c70908890600160581b900463ffffffff1661594c565b613c7a9190615a00565b613c8490866159e1565b600c54909150600090613ca990600160781b900463ffffffff1664e8d4a510006159e1565b90508415613cf557600c548190606490600160b81b900460ff16613ccd858761594c565b613cd791906159e1565b613ce191906159cd565b613ceb919061594c565b9350505050610ffa565b600c548190606490613d1190600160b81b900460ff1682615986565b60ff16613ccd858761594c565b600080613d29614299565b905060008113613d4f576040516321ea67b360e11b815260048101829052602401610a50565b6000613d916000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506141cb92505050565b9050600082825a600c54613db3908b90600160581b900463ffffffff1661594c565b613dbd9190615a00565b613dc790896159e1565b613dd1919061594c565b613de390670de0b6b3a76400006159e1565b613ded91906159cd565b600c54909150600090613e169063ffffffff600160981b8204811691600160781b900416615a17565b613e2b9063ffffffff1664e8d4a510006159e1565b9050600084613e4283670de0b6b3a76400006159e1565b613e4c91906159cd565b905060008715613e8d57600c548290606490613e7290600160c01b900460ff16876159e1565b613e7c91906159cd565b613e86919061594c565b9050613ecd565b600c548290606490613ea990600160c01b900460ff1682615986565b613eb69060ff16876159e1565b613ec091906159cd565b613eca919061594c565b90505b6b033b2e3c9fd0803ce8000000811115613efa5760405163e80fa38160e01b815260040160405180910390fd5b9998505050505050505050565b6000610ffa8383614368565b600061a4b1821480613f27575062066eed82145b806125b657505062066eee1490565b6000818152600183016020526040812054613f7d575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556125b6565b5060006125b6565b6000826000018281548110613f9c57613f9c615b50565b9060005260206000200154905092915050565b613fb88961445b565b6140015760405162461bcd60e51b815260206004820152601a6024820152797075626c6963206b6579206973206e6f74206f6e20637572766560301b6044820152606401610a50565b61400a8861445b565b61404e5760405162461bcd60e51b815260206004820152601560248201527467616d6d61206973206e6f74206f6e20637572766560581b6044820152606401610a50565b6140578361445b565b6140a35760405162461bcd60e51b815260206004820152601d60248201527f6347616d6d615769746e657373206973206e6f74206f6e2063757276650000006044820152606401610a50565b6140ac8261445b565b6140f85760405162461bcd60e51b815260206004820152601c60248201527f73486173685769746e657373206973206e6f74206f6e206375727665000000006044820152606401610a50565b614104878a888761451e565b61414c5760405162461bcd60e51b81526020600482015260196024820152786164647228632a706b2b732a6729213d5f755769746e65737360381b6044820152606401610a50565b60006141588a87614641565b9050600061416b898b878b8689896146a5565b9050600061417c838d8d8a866147c4565b9050808a146141bd5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b210383937b7b360991b6044820152606401610a50565b505050505050505050505050565b6000466141d781613f13565b1561421657606c6001600160a01b031663c6f7de0e6040518163ffffffff1660e01b815260040160206040518083038186803b158015613b0f57600080fd5b61421f81614804565b1561429057600f602160991b016001600160a01b03166349948e0e84604051806080016040528060488152602001615ba06048913960405160200161426592919061550f565b6040516020818303038152906040526040518263ffffffff1660e01b8152600401613af7919061565a565b50600092915050565b600c5460035460408051633fabe5a360e21b81529051600093600160381b900463ffffffff169284926001600160a01b039091169163feaf968c9160048082019260a092909190829003018186803b1580156142f457600080fd5b505afa158015614308573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061432c91906153ea565b50919550909250505063ffffffff821615801590614358575061434f8142615a00565b8263ffffffff16105b156143635760105492505b505090565b6000818152600183016020526040812054801561445157600061438c600183615a00565b85549091506000906143a090600190615a00565b90508181146144055760008660000182815481106143c0576143c0615b50565b90600052602060002001549050808760000184815481106143e3576143e3615b50565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061441657614416615b3a565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506125b6565b60009150506125b6565b80516000906401000003d019116144a95760405162461bcd60e51b8152602060048201526012602482015271696e76616c696420782d6f7264696e61746560701b6044820152606401610a50565b60208201516401000003d019116144f75760405162461bcd60e51b8152602060048201526012602482015271696e76616c696420792d6f7264696e61746560701b6044820152606401610a50565b60208201516401000003d0199080096145178360005b602002015161483e565b1492915050565b60006001600160a01b0382166145645760405162461bcd60e51b815260206004820152600b60248201526a626164207769746e65737360a81b6044820152606401610a50565b60208401516000906001161561457b57601c61457e565b601b5b9050600070014551231950b75fc4402da1732fc9bebe1985876000602002015109865170014551231950b75fc4402da1732fc9bebe19918203925060009190890987516040805160008082526020820180845287905260ff88169282019290925260608101929092526080820183905291925060019060a0016020604051602081039080840390855afa158015614619573d6000803e3d6000fd5b5050604051601f1901516001600160a01b039081169088161495505050505050949350505050565b614649614d5d565b6146766001848460405160200161466293929190615598565b604051602081830303815290604052614862565b90505b6146828161445b565b6125b657805160408051602081019290925261469e9101614662565b9050614679565b6146ad614d5d565b825186516401000003d019908190069106141561470c5760405162461bcd60e51b815260206004820152601e60248201527f706f696e747320696e2073756d206d7573742062652064697374696e637400006044820152606401610a50565b6147178789886148b0565b61475c5760405162461bcd60e51b8152602060048201526016602482015275119a5c9cdd081b5d5b0818da1958dac819985a5b195960521b6044820152606401610a50565b6147678486856148b0565b6147ad5760405162461bcd60e51b815260206004820152601760248201527614d958dbdb99081b5d5b0818da1958dac819985a5b1959604a1b6044820152606401610a50565b6147b88684846149d8565b98975050505050505050565b6000600286868685876040516020016147e29695949392919061553e565b60408051601f1981840301815291905280516020909101209695505050505050565b6000600a82148061481657506101a482145b80614823575062aa37dc82145b8061482f575061210582145b806125b657505062014a331490565b6000806401000003d01980848509840990506401000003d019600782089392505050565b61486a614d5d565b61487382614a9b565b815261488861488382600061450d565b614ad6565b602082018190526002900660011415611eb4576020810180516401000003d019039052919050565b6000826148ed5760405162461bcd60e51b815260206004820152600b60248201526a3d32b9379039b1b0b630b960a91b6044820152606401610a50565b8351602085015160009061490390600290615afa565b1561490f57601c614912565b601b5b9050600070014551231950b75fc4402da1732fc9bebe198387096040805160008082526020820180845281905260ff86169282019290925260608101869052608081018390529192509060019060a0016020604051602081039080840390855afa158015614984573d6000803e3d6000fd5b5050506020604051035190506000866040516020016149a391906154fd565b60408051601f1981840301815291905280516020909101206001600160a01b0392831692169190911498975050505050505050565b6149e0614d5d565b835160208086015185519186015160009384938493614a0193909190614af6565b919450925090506401000003d019858209600114614a5d5760405162461bcd60e51b815260206004820152601960248201527834b73b2d1036bab9ba1031329034b73b32b939b29037b3103d60391b6044820152606401610a50565b60405180604001604052806401000003d01980614a7c57614a7c615b24565b87860981526020016401000003d0198785099052979650505050505050565b805160208201205b6401000003d0198110611eb457604080516020808201939093528151808203840181529082019091528051910120614aa3565b60006125b6826002614aef6401000003d019600161594c565b901c614bd6565b60008080600180826401000003d019896401000003d019038808905060006401000003d0198b6401000003d019038a0890506000614b3683838585614c6d565b9098509050614b4788828e88614c91565b9098509050614b5888828c87614c91565b90985090506000614b6b8d878b85614c91565b9098509050614b7c88828686614c6d565b9098509050614b8d88828e89614c91565b9098509050818114614bc2576401000003d019818a0998506401000003d01982890997506401000003d0198183099650614bc6565b8196505b5050505050509450945094915050565b600080614be1614d7b565b6020808252818101819052604082015260608101859052608081018490526401000003d01960a0820152614c13614d99565b60208160c0846005600019fa925082614c635760405162461bcd60e51b81526020600482015260126024820152716269674d6f64457870206661696c7572652160701b6044820152606401610a50565b5195945050505050565b6000806401000003d0198487096401000003d0198487099097909650945050505050565b600080806401000003d019878509905060006401000003d01987876401000003d019030990506401000003d0198183086401000003d01986890990999098509650505050505050565b828054828255906000526020600020908101928215614d2f579160200282015b82811115614d2f57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614cfa565b50614d3b929150614db7565b5090565b5080546000825590600052602060002090810190610a599190614db7565b60405180604001604052806002906020820280368337509192915050565b6040518060c001604052806006906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b5b80821115614d3b5760008155600101614db8565b8035611eb481615b7c565b80604081018310156125b657600080fd5b600082601f830112614df957600080fd5b604051604081018181106001600160401b0382111715614e1b57614e1b615b66565b8060405250808385604086011115614e3257600080fd5b60005b6002811015614e54578135835260209283019290910190600101614e35565b509195945050505050565b8035611eb481615b91565b600060c08284031215614e7c57600080fd5b614e846158a7565b9050614e8f82614f7e565b815260208083013581830152614ea760408401614f6a565b6040830152614eb860608401614f6a565b60608301526080830135614ecb81615b7c565b608083015260a08301356001600160401b0380821115614eea57600080fd5b818501915085601f830112614efe57600080fd5b813581811115614f1057614f10615b66565b614f22601f8201601f191685016158f2565b91508082528684828501011115614f3857600080fd5b80848401858401376000848284010152508060a085015250505092915050565b803561ffff81168114611eb457600080fd5b803563ffffffff81168114611eb457600080fd5b80356001600160401b0381168114611eb457600080fd5b803560ff81168114611eb457600080fd5b805169ffffffffffffffffffff81168114611eb457600080fd5b600060208284031215614fd257600080fd5b8135610ffa81615b7c565b60008060408385031215614ff057600080fd5b8235614ffb81615b7c565b9150602083013561500b81615b7c565b809150509250929050565b6000806000806060858703121561502c57600080fd5b843561503781615b7c565b93506020850135925060408501356001600160401b038082111561505a57600080fd5b818701915087601f83011261506e57600080fd5b81358181111561507d57600080fd5b88602082850101111561508f57600080fd5b95989497505060200194505050565b6000604082840312156150b057600080fd5b610ffa8383614dd7565b600080606083850312156150cd57600080fd5b6150d78484614dd7565b91506150e560408401614f7e565b90509250929050565b60006040828403121561510057600080fd5b610ffa8383614de8565b60006020828403121561511c57600080fd5b8151610ffa81615b91565b60006020828403121561513957600080fd5b5035919050565b60006020828403121561515257600080fd5b5051919050565b60006020828403121561516b57600080fd5b604051602081018181106001600160401b038211171561518d5761518d615b66565b604052823561519b81615b91565b81529392505050565b60008060008385036101e08112156151bb57600080fd5b6101a0808212156151cb57600080fd5b6151d36158cf565b91506151df8787614de8565b82526151ee8760408801614de8565b60208301526080860135604083015260a0860135606083015260c0860135608083015261521d60e08701614dcc565b60a083015261010061523188828901614de8565b60c0840152615244886101408901614de8565b60e0840152610180870135908301529093508401356001600160401b0381111561526d57600080fd5b61527986828701614e6a565b9250506152896101c08501614e5f565b90509250925092565b6000602082840312156152a457600080fd5b81356001600160401b038111156152ba57600080fd5b820160c08185031215610ffa57600080fd5b6000602082840312156152de57600080fd5b610ffa82614f58565b60008060008060008060008060006101208a8c03121561530657600080fd5b61530f8a614f58565b985061531d60208b01614f6a565b975061532b60408b01614f6a565b965061533960608b01614f6a565b955060808a0135945061534e60a08b01614f6a565b935061535c60c08b01614f6a565b925061536a60e08b01614f95565b91506153796101008b01614f95565b90509295985092959850929598565b6000806040838503121561539b57600080fd5b82359150602083013561500b81615b7c565b600080604083850312156153c057600080fd5b50508035926020909101359150565b6000602082840312156153e157600080fd5b610ffa82614f6a565b600080600080600060a0868803121561540257600080fd5b61540b86614fa6565b945060208601519350604086015192506060860151915061542e60808701614fa6565b90509295509295909350565b600081518084526020808501945080840160005b838110156154735781516001600160a01b03168752958201959082019060010161544e565b509495945050505050565b8060005b6002811015612b0e578151845260209384019390910190600101615482565b600081518084526020808501945080840160005b83811015615473578151875295820195908201906001016154b5565b600081518084526154e9816020860160208601615a8c565b601f01601f19169290920160200192915050565b615507818361547e565b604001919050565b60008351615521818460208801615a8c565b835190830190615535818360208801615a8c565b01949350505050565b86815261554e602082018761547e565b61555b606082018661547e565b61556860a082018561547e565b61557560e082018461547e565b60609190911b6001600160601b0319166101208201526101340195945050505050565b8381526155a8602082018461547e565b606081019190915260800192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039290921682526001600160601b0316602082015260400190565b604081016125b6828461547e565b602081526000610ffa60208301846154a1565b9182526001600160401b0316602082015260400190565b602081526000610ffa60208301846154d1565b6020815260ff82511660208201526020820151604082015260018060a01b0360408301511660608201526000606083015160c060808401526156b260e084018261543a565b60808501516001600160601b0390811660a0868101919091529095015190941660c0909301929092525090919050565b9182526001600160a01b0316602082015260400190565b82815260608101610ffa602083018461547e565b82815260406020820152600061344860408301846154a1565b86815285602082015261ffff85166040820152600063ffffffff808616606084015280851660808401525060c060a08301526147b860c08301846154d1565b878152602081018790526040810186905263ffffffff8581166060830152841660808201526001600160a01b03831660a082015260e060c08201819052600090613efa908301846154d1565b8781526001600160401b03871660208201526040810186905263ffffffff8581166060830152841660808201526001600160a01b03831660a082015260e060c08201819052600090613efa908301846154d1565b6001600160601b038681168252851660208201526001600160401b03841660408201526001600160a01b038316606082015260a06080820181905260009061584f9083018461543a565b979650505050505050565b6000808335601e1984360301811261587157600080fd5b8301803591506001600160401b0382111561588b57600080fd5b6020019150368190038213156158a057600080fd5b9250929050565b60405160c081016001600160401b03811182821017156158c9576158c9615b66565b60405290565b60405161012081016001600160401b03811182821017156158c9576158c9615b66565b604051601f8201601f191681016001600160401b038111828210171561591a5761591a615b66565b604052919050565b6000808585111561593257600080fd5b8386111561593f57600080fd5b5050820193919092039150565b6000821982111561595f5761595f615b0e565b500190565b60006001600160401b0380831681851680830382111561553557615535615b0e565b600060ff821660ff84168060ff038211156159a3576159a3615b0e565b019392505050565b60006001600160601b0382811684821680830382111561553557615535615b0e565b6000826159dc576159dc615b24565b500490565b60008160001904831182151516156159fb576159fb615b0e565b500290565b600082821015615a1257615a12615b0e565b500390565b600063ffffffff83811690831681811015615a3457615a34615b0e565b039392505050565b60006001600160601b0383811690831681811015615a3457615a34615b0e565b6001600160e01b03198135818116916004851015615a845780818660040360031b1b83161692505b505092915050565b60005b83811015615aa7578181015183820152602001615a8f565b83811115612b0e5750506000910152565b6000600019821415615acc57615acc615b0e565b5060010190565b60006001600160401b0380831681811415615af057615af0615b0e565b6001019392505050565b600082615b0957615b09615b24565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610a5957600080fd5b8015158114610a5957600080fdfe307866666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666a164736f6c6343000806000a", } var VRFCoordinatorV25ABI = VRFCoordinatorV25MetaData.ABI diff --git a/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt index 12cc4afbebf..ac7e9a2acff 100644 --- a/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -93,7 +93,7 @@ vrf_consumer_v2_upgradeable_example: ../../contracts/solc/v0.8.6/VRFConsumerV2Up vrf_coordinator_mock: ../../contracts/solc/v0.8.6/VRFCoordinatorMock/VRFCoordinatorMock.abi ../../contracts/solc/v0.8.6/VRFCoordinatorMock/VRFCoordinatorMock.bin 5c495cf8df1f46d8736b9150cdf174cce358cb8352f60f0d5bb9581e23920501 vrf_coordinator_test_v2: ../../contracts/solc/v0.8.6/VRFCoordinatorTestV2/VRFCoordinatorTestV2.abi ../../contracts/solc/v0.8.6/VRFCoordinatorTestV2/VRFCoordinatorTestV2.bin eaefd785c38bac67fb11a7fc2737ab2da68c988ca170e7db8ff235c80893e01c vrf_coordinator_v2: ../../contracts/solc/v0.8.6/VRFCoordinatorV2/VRFCoordinatorV2.abi ../../contracts/solc/v0.8.6/VRFCoordinatorV2/VRFCoordinatorV2.bin 295f35ce282060317dfd01f45959f5a2b05ba26913e422fbd4fb6bf90b107006 -vrf_coordinator_v2_5: ../../contracts/solc/v0.8.6/VRFCoordinatorV2_5/VRFCoordinatorV2_5.abi ../../contracts/solc/v0.8.6/VRFCoordinatorV2_5/VRFCoordinatorV2_5.bin bab68f50e20025ad0c9a2c9559cbd854734c8d7fd9d5bcd62ac0629d6615ff6a +vrf_coordinator_v2_5: ../../contracts/solc/v0.8.6/VRFCoordinatorV2_5/VRFCoordinatorV2_5.abi ../../contracts/solc/v0.8.6/VRFCoordinatorV2_5/VRFCoordinatorV2_5.bin 4d531bc128b1a5bd8fb13d562b00fc15f450c020c9f9cc30b63bb8a461b2508f vrf_coordinator_v2_plus_v2_example: ../../contracts/solc/v0.8.6/VRFCoordinatorV2Plus_V2Example/VRFCoordinatorV2Plus_V2Example.abi ../../contracts/solc/v0.8.6/VRFCoordinatorV2Plus_V2Example/VRFCoordinatorV2Plus_V2Example.bin 4a5b86701983b1b65f0a8dfa116b3f6d75f8f706fa274004b57bdf5992e4cec3 vrf_coordinator_v2plus_interface: ../../contracts/solc/v0.8.6/IVRFCoordinatorV2PlusInternal/IVRFCoordinatorV2PlusInternal.abi ../../contracts/solc/v0.8.6/IVRFCoordinatorV2PlusInternal/IVRFCoordinatorV2PlusInternal.bin 86b8e23aab28c5b98e3d2384dc4f702b093e382dc985c88101278e6e4bf6f7b8 vrf_external_sub_owner_example: ../../contracts/solc/v0.8.6/VRFExternalSubOwnerExample/VRFExternalSubOwnerExample.abi ../../contracts/solc/v0.8.6/VRFExternalSubOwnerExample/VRFExternalSubOwnerExample.bin 14f888eb313930b50233a6f01ea31eba0206b7f41a41f6311670da8bb8a26963 From fbe4b0ff566ff563f88ea7c83c00a4bbf12d6614 Mon Sep 17 00:00:00 2001 From: David Cauchi <13139524+davidcauchi@users.noreply.github.com> Date: Tue, 12 Mar 2024 15:35:43 +0100 Subject: [PATCH 08/15] [ship-1068] Adds OP Sepolia config (#12393) * Add OP Sepolia config * make config-docs --- .../toml/defaults/Optimism_Sepolia.toml | 29 +++++++ docs/CONFIG.md | 84 +++++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 core/chains/evm/config/toml/defaults/Optimism_Sepolia.toml diff --git a/core/chains/evm/config/toml/defaults/Optimism_Sepolia.toml b/core/chains/evm/config/toml/defaults/Optimism_Sepolia.toml new file mode 100644 index 00000000000..116ae9d680b --- /dev/null +++ b/core/chains/evm/config/toml/defaults/Optimism_Sepolia.toml @@ -0,0 +1,29 @@ +ChainID = '11155420' +ChainType = 'optimismBedrock' +FinalityDepth = 200 +LogPollInterval = '2s' +NoNewHeadsThreshold = '40s' +MinIncomingConfirmations = 1 + +[GasEstimator] +EIP1559DynamicFees = true +PriceMin = '1 wei' +BumpMin = '100 wei' + +[GasEstimator.BlockHistory] +BlockHistorySize = 60 + +[Transactions] +ResendAfterThreshold = '30s' + +[HeadTracker] +HistoryDepth = 300 + +[NodePool] +SyncThreshold = 10 + +[OCR] +ContractConfirmations = 1 + +[OCR2.Automation] +GasLimit = 6500000 diff --git a/docs/CONFIG.md b/docs/CONFIG.md index 37c130e46b2..c7b9edf3cad 100644 --- a/docs/CONFIG.md +++ b/docs/CONFIG.md @@ -5873,6 +5873,90 @@ GasLimit = 5400000

+
Optimism Sepolia (11155420)

+ +```toml +AutoCreateKey = true +BlockBackfillDepth = 10 +BlockBackfillSkip = false +ChainType = 'optimismBedrock' +FinalityDepth = 200 +FinalityTagEnabled = false +LogBackfillBatchSize = 1000 +LogPollInterval = '2s' +LogKeepBlocksDepth = 100000 +LogPrunePageSize = 0 +BackupLogPollerBlockDelay = 100 +MinIncomingConfirmations = 1 +MinContractPayment = '0.00001 link' +NonceAutoSync = true +NoNewHeadsThreshold = '40s' +RPCDefaultBatchSize = 250 +RPCBlockQueryDelay = 1 + +[Transactions] +ForwardersEnabled = false +MaxInFlight = 16 +MaxQueued = 250 +ReaperInterval = '1h0m0s' +ReaperThreshold = '168h0m0s' +ResendAfterThreshold = '30s' + +[BalanceMonitor] +Enabled = true + +[GasEstimator] +Mode = 'BlockHistory' +PriceDefault = '20 gwei' +PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' +PriceMin = '1 wei' +LimitDefault = 500000 +LimitMax = 500000 +LimitMultiplier = '1' +LimitTransfer = 21000 +BumpMin = '100 wei' +BumpPercent = 20 +BumpThreshold = 3 +EIP1559DynamicFees = true +FeeCapDefault = '100 gwei' +TipCapDefault = '1 wei' +TipCapMin = '1 wei' + +[GasEstimator.BlockHistory] +BatchSize = 25 +BlockHistorySize = 60 +CheckInclusionBlocks = 12 +CheckInclusionPercentile = 90 +TransactionPercentile = 60 + +[HeadTracker] +HistoryDepth = 300 +MaxBufferSize = 3 +SamplingInterval = '1s' + +[NodePool] +PollFailureThreshold = 5 +PollInterval = '10s' +SelectionMode = 'HighestHead' +SyncThreshold = 10 +LeaseDuration = '0s' +NodeIsSyncingEnabled = false + +[OCR] +ContractConfirmations = 1 +ContractTransmitterTransmitTimeout = '10s' +DatabaseTimeout = '10s' +DeltaCOverride = '168h0m0s' +DeltaCJitterOverride = '1h0m0s' +ObservationGracePeriod = '1s' + +[OCR2] +[OCR2.Automation] +GasLimit = 6500000 +``` + +

+
Harmony Mainnet (1666600000)

```toml From 15103b8ced1d931244d915c912a506b165fefb84 Mon Sep 17 00:00:00 2001 From: Iva Brajer Date: Tue, 12 Mar 2024 16:08:02 +0100 Subject: [PATCH 09/15] Explicit bounds for premium config params in VRFCoordinatorV2_5 (#12314) * Explicit bounds for premium config params in VRFCoordinatorV2_5 * setConfig method will revert if premium percentages are above 100 * added unit tests for coverage * Generated Go wrappers and executed prettier tool * Added constants for percentage bounds and changed revert error * Removed min boundary * Added changeset * Changed upper premium percentage boundary to 155 --- .changeset/tasty-buckets-relate.md | 5 +++ .../src/v0.8/vrf/dev/VRFCoordinatorV2_5.sol | 9 +++++ .../test/v0.8/foundry/vrf/VRFV2Plus.t.sol | 34 +++++++++++++++++++ .../vrf_coordinator_v2_5.go | 4 +-- ...rapper-dependency-versions-do-not-edit.txt | 2 +- 5 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 .changeset/tasty-buckets-relate.md diff --git a/.changeset/tasty-buckets-relate.md b/.changeset/tasty-buckets-relate.md new file mode 100644 index 00000000000..a627e392e82 --- /dev/null +++ b/.changeset/tasty-buckets-relate.md @@ -0,0 +1,5 @@ +--- +"chainlink": patch +--- + +Validation for premium limits added to VRFCoordinatorV2_5 contract diff --git a/contracts/src/v0.8/vrf/dev/VRFCoordinatorV2_5.sol b/contracts/src/v0.8/vrf/dev/VRFCoordinatorV2_5.sol index 438ddaca263..97f8dadbf91 100644 --- a/contracts/src/v0.8/vrf/dev/VRFCoordinatorV2_5.sol +++ b/contracts/src/v0.8/vrf/dev/VRFCoordinatorV2_5.sol @@ -24,6 +24,8 @@ contract VRFCoordinatorV2_5 is VRF, SubscriptionAPI, IVRFCoordinatorV2Plus { // 5k is plenty for an EXTCODESIZE call (2600) + warm CALL (100) // and some arithmetic operations. uint256 private constant GAS_FOR_CALL_EXACT_CHECK = 5_000; + // upper bound limit for premium percentages to make sure fee calculations don't overflow + uint8 private constant PREMIUM_PERCENTAGE_MAX = 155; error InvalidRequestConfirmations(uint16 have, uint16 min, uint16 max); error GasLimitTooBig(uint32 have, uint32 want); error NumWordsTooBig(uint32 have, uint32 want); @@ -32,6 +34,7 @@ contract VRFCoordinatorV2_5 is VRF, SubscriptionAPI, IVRFCoordinatorV2Plus { error NoSuchProvingKey(bytes32 keyHash); error InvalidLinkWeiPrice(int256 linkWei); error LinkDiscountTooHigh(uint32 flatFeeLinkDiscountPPM, uint32 flatFeeNativePPM); + error InvalidPremiumPercentage(uint8 premiumPercentage, uint8 max); error InsufficientGasForConsumer(uint256 have, uint256 want); error NoCorrespondingRequest(); error IncorrectCommitment(); @@ -180,6 +183,12 @@ contract VRFCoordinatorV2_5 is VRF, SubscriptionAPI, IVRFCoordinatorV2Plus { if (fulfillmentFlatFeeLinkDiscountPPM > fulfillmentFlatFeeNativePPM) { revert LinkDiscountTooHigh(fulfillmentFlatFeeLinkDiscountPPM, fulfillmentFlatFeeNativePPM); } + if (nativePremiumPercentage > PREMIUM_PERCENTAGE_MAX) { + revert InvalidPremiumPercentage(nativePremiumPercentage, PREMIUM_PERCENTAGE_MAX); + } + if (linkPremiumPercentage > PREMIUM_PERCENTAGE_MAX) { + revert InvalidPremiumPercentage(linkPremiumPercentage, PREMIUM_PERCENTAGE_MAX); + } s_config = Config({ minimumRequestConfirmations: minimumRequestConfirmations, maxGasLimit: maxGasLimit, diff --git a/contracts/test/v0.8/foundry/vrf/VRFV2Plus.t.sol b/contracts/test/v0.8/foundry/vrf/VRFV2Plus.t.sol index 6d1b291392f..cd390dc3a94 100644 --- a/contracts/test/v0.8/foundry/vrf/VRFV2Plus.t.sol +++ b/contracts/test/v0.8/foundry/vrf/VRFV2Plus.t.sol @@ -162,6 +162,40 @@ contract VRFV2Plus is BaseTest { 15, // nativePremiumPercentage 10 // linkPremiumPercentage ); + + // Test that setting native premium percentage higher than 155 will revert + vm.expectRevert( + abi.encodeWithSelector(VRFCoordinatorV2_5.InvalidPremiumPercentage.selector, uint8(156), uint8(155)) + ); + + s_testCoordinator.setConfig( + 0, + 2_500_000, + 1, + 50_000, + 500, + 500_000, // fulfillmentFlatFeeNativePPM + 100_000, // fulfillmentFlatFeeLinkDiscountPPM + 156, // nativePremiumPercentage + 10 // linkPremiumPercentage + ); + + // Test that setting LINK premium percentage higher than 155 will revert + vm.expectRevert( + abi.encodeWithSelector(VRFCoordinatorV2_5.InvalidPremiumPercentage.selector, uint8(202), uint8(155)) + ); + + s_testCoordinator.setConfig( + 0, + 2_500_000, + 1, + 50_000, + 500, + 500_000, // fulfillmentFlatFeeNativePPM + 100_000, // fulfillmentFlatFeeLinkDiscountPPM + 15, // nativePremiumPercentage + 202 // linkPremiumPercentage + ); } function testRegisterProvingKey() public { diff --git a/core/gethwrappers/generated/vrf_coordinator_v2_5/vrf_coordinator_v2_5.go b/core/gethwrappers/generated/vrf_coordinator_v2_5/vrf_coordinator_v2_5.go index 6f6896b1ebc..2422325c901 100644 --- a/core/gethwrappers/generated/vrf_coordinator_v2_5/vrf_coordinator_v2_5.go +++ b/core/gethwrappers/generated/vrf_coordinator_v2_5/vrf_coordinator_v2_5.go @@ -61,8 +61,8 @@ type VRFV2PlusClientRandomWordsRequest struct { } var VRFCoordinatorV25MetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"blockhashStore\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"internalBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"externalBalance\",\"type\":\"uint256\"}],\"name\":\"BalanceInvariantViolated\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNum\",\"type\":\"uint256\"}],\"name\":\"BlockhashNotInStore\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorNotRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedToSendNative\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedToTransferLink\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"have\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"want\",\"type\":\"uint32\"}],\"name\":\"GasLimitTooBig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"gasPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxGas\",\"type\":\"uint256\"}],\"name\":\"GasPriceExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectCommitment\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IndexOutOfRange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"have\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"want\",\"type\":\"uint256\"}],\"name\":\"InsufficientGasForConsumer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCalldata\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"InvalidConsumer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExtraArgsTag\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"linkWei\",\"type\":\"int256\"}],\"name\":\"InvalidLinkWeiPrice\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"have\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"min\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"max\",\"type\":\"uint16\"}],\"name\":\"InvalidRequestConfirmations\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSubscription\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkAlreadySet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"flatFeeLinkDiscountPPM\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"flatFeeNativePPM\",\"type\":\"uint32\"}],\"name\":\"LinkDiscountTooHigh\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkNotSet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"have\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"max\",\"type\":\"uint32\"}],\"name\":\"MsgDataTooBig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proposedOwner\",\"type\":\"address\"}],\"name\":\"MustBeRequestedOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"MustBeSubOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoCorrespondingRequest\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"}],\"name\":\"NoSuchProvingKey\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"have\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"want\",\"type\":\"uint32\"}],\"name\":\"NumWordsTooBig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableFromLink\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PaymentTooLarge\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PendingRequestExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"}],\"name\":\"ProvingKeyAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Reentrant\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyConsumers\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"stalenessSeconds\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"gasAfterPaymentCalculation\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"int256\",\"name\":\"fallbackWeiPerUnitLink\",\"type\":\"int256\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeNativePPM\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeLinkDiscountPPM\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"nativePremiumPercentage\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"linkPremiumPercentage\",\"type\":\"uint8\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorDeregistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorRegistered\",\"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\":false,\"internalType\":\"address\",\"name\":\"newCoordinator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"MigrationCompleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"NativeFundsRecovered\",\"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\":\"keyHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"maxGas\",\"type\":\"uint64\"}],\"name\":\"ProvingKeyDeregistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"maxGas\",\"type\":\"uint64\"}],\"name\":\"ProvingKeyRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"outputSeed\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"payment\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"nativePayment\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"onlyPremium\",\"type\":\"bool\"}],\"name\":\"RandomWordsFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"preSeed\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RandomWordsRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountLink\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountNative\",\"type\":\"uint256\"}],\"name\":\"SubscriptionCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"SubscriptionConsumerAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"SubscriptionConsumerRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"SubscriptionCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"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\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldNativeBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newNativeBalance\",\"type\":\"uint256\"}],\"name\":\"SubscriptionFundedWithNative\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"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\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"SubscriptionOwnerTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BLOCKHASH_STORE\",\"outputs\":[{\"internalType\":\"contractBlockhashStoreInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"LINK\",\"outputs\":[{\"internalType\":\"contractLinkTokenInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"LINK_NATIVE_FEED\",\"outputs\":[{\"internalType\":\"contractAggregatorV3Interface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_CONSUMERS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_NUM_WORDS\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_REQUEST_CONFIRMATIONS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"acceptSubscriptionOwnerTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"addConsumer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"cancelSubscription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"createSubscription\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"deregisterMigratableCoordinator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"publicProvingKey\",\"type\":\"uint256[2]\"}],\"name\":\"deregisterProvingKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256[2]\",\"name\":\"pk\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"gamma\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"c\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"s\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"seed\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"uWitness\",\"type\":\"address\"},{\"internalType\":\"uint256[2]\",\"name\":\"cGammaWitness\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"sHashWitness\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"zInv\",\"type\":\"uint256\"}],\"internalType\":\"structVRF.Proof\",\"name\":\"proof\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"blockNum\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structVRFCoordinatorV2_5.RequestCommitment\",\"name\":\"rc\",\"type\":\"tuple\"},{\"internalType\":\"bool\",\"name\":\"onlyPremium\",\"type\":\"bool\"}],\"name\":\"fulfillRandomWords\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"payment\",\"type\":\"uint96\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"fundSubscriptionWithNative\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"startIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxCount\",\"type\":\"uint256\"}],\"name\":\"getActiveSubscriptionIds\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"getSubscription\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"balance\",\"type\":\"uint96\"},{\"internalType\":\"uint96\",\"name\":\"nativeBalance\",\"type\":\"uint96\"},{\"internalType\":\"uint64\",\"name\":\"reqCount\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"consumers\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"publicKey\",\"type\":\"uint256[2]\"}],\"name\":\"hashOfKey\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"newCoordinator\",\"type\":\"address\"}],\"name\":\"migrate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"ownerCancelSubscription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"pendingRequestExists\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"recoverFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"recoverNativeFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"registerMigratableCoordinator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"publicProvingKey\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint64\",\"name\":\"maxGas\",\"type\":\"uint64\"}],\"name\":\"registerProvingKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"removeConsumer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"uint16\",\"name\":\"requestConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structVRFV2PlusClient.RandomWordsRequest\",\"name\":\"req\",\"type\":\"tuple\"}],\"name\":\"requestRandomWords\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"requestSubscriptionOwnerTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_config\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"reentrancyLock\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"stalenessSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasAfterPaymentCalculation\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeNativePPM\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeLinkDiscountPPM\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"nativePremiumPercentage\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"linkPremiumPercentage\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_currentSubNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_fallbackWeiPerUnitLink\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"s_provingKeyHashes\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"s_provingKeys\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"exists\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"maxGas\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"s_requestCommitments\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_totalBalance\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_totalNativeBalance\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"stalenessSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasAfterPaymentCalculation\",\"type\":\"uint32\"},{\"internalType\":\"int256\",\"name\":\"fallbackWeiPerUnitLink\",\"type\":\"int256\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeNativePPM\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeLinkDiscountPPM\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"nativePremiumPercentage\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"linkPremiumPercentage\",\"type\":\"uint8\"}],\"name\":\"setConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"link\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"linkNativeFeed\",\"type\":\"address\"}],\"name\":\"setLINKAndLINKNativeFeed\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"withdrawNative\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162005dcf38038062005dcf833981016040819052620000349162000183565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000d7565b50505060601b6001600160601b031916608052620001b5565b6001600160a01b038116331415620001325760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000602082840312156200019657600080fd5b81516001600160a01b0381168114620001ae57600080fd5b9392505050565b60805160601c615bf4620001db6000396000818161055001526132150152615bf46000f3fe60806040526004361061021c5760003560e01c80638402595e11610124578063b2a7cac5116100a6578063b2a7cac514610732578063bec4c08c14610752578063caf70c4a14610772578063cb63179714610792578063d98e620e146107b2578063da2f2610146107d2578063dac83d2914610831578063dc311dd314610851578063e72f6e3014610882578063ee9d2d38146108a2578063f2fde38b146108cf57600080fd5b80638402595e146105c757806386fe91c7146105e75780638da5cb5b1461060757806395b55cfc146106255780639b1c385e146106385780639d40a6fd14610658578063a21a23e414610690578063a4c0ed36146106a5578063a63e0bfb146106c5578063aa433aff146106e5578063aefb212f1461070557600080fd5b8063405b84fa116101ad578063405b84fa1461044e57806340d6bb821461046e57806341af6c871461049957806351cff8d9146104c95780635d06b4ab146104e957806364d51a2a14610509578063659827441461051e578063689c45171461053e57806372e9d5651461057257806379ba5097146105925780637a5a2aef146105a757600080fd5b806304104edb14610221578063043bd6ae14610243578063088070f51461026c57806308821d581461033a5780630ae095401461035a57806315c48b841461037a57806318e3dd27146103a25780631b6b6d23146103e15780632f622e6b1461040e578063301f42e91461042e575b600080fd5b34801561022d57600080fd5b5061024161023c366004614fc0565b6108ef565b005b34801561024f57600080fd5b5061025960105481565b6040519081526020015b60405180910390f35b34801561027857600080fd5b50600c546102dd9061ffff81169063ffffffff62010000820481169160ff600160301b8204811692600160381b8304811692600160581b8104821692600160781b8204831692600160981b83041691600160b81b8104821691600160c01b9091041689565b6040805161ffff909a168a5263ffffffff98891660208b01529615159689019690965293861660608801529185166080870152841660a08601529290921660c084015260ff91821660e08401521661010082015261012001610263565b34801561034657600080fd5b5061024161035536600461509e565b610a5c565b34801561036657600080fd5b50610241610375366004615388565b610c06565b34801561038657600080fd5b5061038f60c881565b60405161ffff9091168152602001610263565b3480156103ae57600080fd5b50600a546103c990600160601b90046001600160601b031681565b6040516001600160601b039091168152602001610263565b3480156103ed57600080fd5b50600254610401906001600160a01b031681565b60405161026391906155b9565b34801561041a57600080fd5b50610241610429366004614fc0565b610c4e565b34801561043a57600080fd5b506103c96104493660046151a4565b610d9a565b34801561045a57600080fd5b50610241610469366004615388565b611001565b34801561047a57600080fd5b506104846101f481565b60405163ffffffff9091168152602001610263565b3480156104a557600080fd5b506104b96104b4366004615127565b6113b3565b6040519015158152602001610263565b3480156104d557600080fd5b506102416104e4366004614fc0565b6114c3565b3480156104f557600080fd5b50610241610504366004614fc0565b611651565b34801561051557600080fd5b5061038f606481565b34801561052a57600080fd5b50610241610539366004614fdd565b611708565b34801561054a57600080fd5b506104017f000000000000000000000000000000000000000000000000000000000000000081565b34801561057e57600080fd5b50600354610401906001600160a01b031681565b34801561059e57600080fd5b50610241611768565b3480156105b357600080fd5b506102416105c23660046150ba565b611812565b3480156105d357600080fd5b506102416105e2366004614fc0565b611942565b3480156105f357600080fd5b50600a546103c9906001600160601b031681565b34801561061357600080fd5b506000546001600160a01b0316610401565b610241610633366004615127565b611a54565b34801561064457600080fd5b50610259610653366004615292565b611b78565b34801561066457600080fd5b50600754610678906001600160401b031681565b6040516001600160401b039091168152602001610263565b34801561069c57600080fd5b50610259611eb9565b3480156106b157600080fd5b506102416106c0366004615016565b61208c565b3480156106d157600080fd5b506102416106e03660046152e7565b612208565b3480156106f157600080fd5b50610241610700366004615127565b612472565b34801561071157600080fd5b506107256107203660046153ad565b6124ba565b6040516102639190615630565b34801561073e57600080fd5b5061024161074d366004615127565b6125bc565b34801561075e57600080fd5b5061024161076d366004615388565b6126b1565b34801561077e57600080fd5b5061025961078d3660046150ee565b6127bd565b34801561079e57600080fd5b506102416107ad366004615388565b6127ed565b3480156107be57600080fd5b506102596107cd366004615127565b612a5c565b3480156107de57600080fd5b506108126107ed366004615127565b600d6020526000908152604090205460ff81169061010090046001600160401b031682565b6040805192151583526001600160401b03909116602083015201610263565b34801561083d57600080fd5b5061024161084c366004615388565b612a7d565b34801561085d57600080fd5b5061087161086c366004615127565b612b14565b604051610263959493929190615805565b34801561088e57600080fd5b5061024161089d366004614fc0565b612c02565b3480156108ae57600080fd5b506102596108bd366004615127565b600f6020526000908152604090205481565b3480156108db57600080fd5b506102416108ea366004614fc0565b612dd5565b6108f7612de6565b60115460005b81811015610a3457826001600160a01b03166011828154811061092257610922615b50565b6000918252602090912001546001600160a01b03161415610a2457601161094a600184615a00565b8154811061095a5761095a615b50565b600091825260209091200154601180546001600160a01b03909216918390811061098657610986615b50565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060118054806109c5576109c5615b3a565b600082815260209020810160001990810180546001600160a01b03191690550190556040517ff80a1a97fd42251f3c33cda98635e7399253033a6774fe37cd3f650b5282af3790610a179085906155b9565b60405180910390a1505050565b610a2d81615ab8565b90506108fd565b5081604051635428d44960e01b8152600401610a5091906155b9565b60405180910390fd5b50565b610a64612de6565b604080518082018252600091610a939190849060029083908390808284376000920191909152506127bd915050565b6000818152600d602090815260409182902082518084019093525460ff811615158084526101009091046001600160401b03169183019190915291925090610af157604051631dfd6e1360e21b815260048101839052602401610a50565b6000828152600d6020526040812080546001600160481b0319169055600e54905b81811015610bc25783600e8281548110610b2e57610b2e615b50565b90600052602060002001541415610bb257600e610b4c600184615a00565b81548110610b5c57610b5c615b50565b9060005260206000200154600e8281548110610b7a57610b7a615b50565b600091825260209091200155600e805480610b9757610b97615b3a565b60019003818190600052602060002001600090559055610bc2565b610bbb81615ab8565b9050610b12565b507f9b6868e0eb737bcd72205360baa6bfd0ba4e4819a33ade2db384e8a8025639a5838360200151604051610bf8929190615643565b60405180910390a150505050565b81610c1081612e3b565b610c18612e9c565b610c21836113b3565b15610c3f57604051631685ecdd60e31b815260040160405180910390fd5b610c498383612ec7565b505050565b610c56612e9c565b610c5e612de6565b600b54600160601b90046001600160601b0316610c8e57604051631e9acf1760e31b815260040160405180910390fd5b600b8054600160601b90046001600160601b0316908190600c610cb18380615a3c565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555080600a600c8282829054906101000a90046001600160601b0316610cf99190615a3c565b92506101000a8154816001600160601b0302191690836001600160601b031602179055506000826001600160a01b0316826001600160601b031660405160006040518083038185875af1925050503d8060008114610d73576040519150601f19603f3d011682016040523d82523d6000602084013e610d78565b606091505b5050905080610c495760405163950b247960e01b815260040160405180910390fd5b6000610da4612e9c565b60005a9050610324361115610dd657604051630f28961b60e01b81523660048201526103246024820152604401610a50565b6000610de2868661307b565b90506000610df885836000015160200151613337565b60408301516060888101519293509163ffffffff16806001600160401b03811115610e2557610e25615b66565b604051908082528060200260200182016040528015610e4e578160200160208202803683370190505b50925060005b81811015610eb65760408051602081018590529081018290526060016040516020818303038152906040528051906020012060001c848281518110610e9b57610e9b615b50565b6020908102919091010152610eaf81615ab8565b9050610e54565b5050602080850180516000908152600f9092526040822082905551610edc908a85613385565b60208a8101516000908152600690915260409020805491925090601890610f1290600160c01b90046001600160401b0316615ad3565b91906101000a8154816001600160401b0302191690836001600160401b0316021790555060008960a0015160018b60a0015151610f4f9190615a00565b81518110610f5f57610f5f615b50565b60209101015160f81c6001149050610f798786838c613420565b9750610f8a88828c60200151613450565b6020808b015187820151604080518781526001600160601b038d16948101949094528415159084015284151560608401528b1515608084015290917faeb4b4786571e184246d39587f659abf0e26f41f6a3358692250382c0cdb47b79060a00160405180910390a3505050505050505b9392505050565b611009612e9c565b611012816135a3565b6110315780604051635428d44960e01b8152600401610a5091906155b9565b60008060008061104086612b14565b945094505093509350336001600160a01b0316826001600160a01b0316146110a35760405162461bcd60e51b81526020600482015260166024820152752737ba1039bab139b1b934b83a34b7b71037bbb732b960511b6044820152606401610a50565b6110ac866113b3565b156110f25760405162461bcd60e51b815260206004820152601660248201527550656e64696e6720726571756573742065786973747360501b6044820152606401610a50565b6040805160c0810182526001815260208082018990526001600160a01b03851682840152606082018490526001600160601b038088166080840152861660a0830152915190916000916111479184910161566d565b60405160208183030381529060405290506111618861360f565b505060405163ce3f471960e01b81526001600160a01b0388169063ce3f4719906001600160601b0388169061119a90859060040161565a565b6000604051808303818588803b1580156111b357600080fd5b505af11580156111c7573d6000803e3d6000fd5b50506002546001600160a01b0316158015935091506111f0905057506001600160601b03861615155b156112ba5760025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611227908a908a90600401615600565b602060405180830381600087803b15801561124157600080fd5b505af1158015611255573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611279919061510a565b6112ba5760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610a50565b600c805460ff60301b1916600160301b17905560005b8351811015611361578381815181106112eb576112eb615b50565b60200260200101516001600160a01b0316638ea98117896040518263ffffffff1660e01b815260040161131e91906155b9565b600060405180830381600087803b15801561133857600080fd5b505af115801561134c573d6000803e3d6000fd5b505050508061135a90615ab8565b90506112d0565b50600c805460ff60301b191690556040517fd63ca8cb945956747ee69bfdc3ea754c24a4caf7418db70e46052f7850be4187906113a19089908b906155cd565b60405180910390a15050505050505050565b60008181526005602052604081206002018054806113d5575060009392505050565b600e5460005b828110156114b75760008482815481106113f7576113f7615b50565b60009182526020822001546001600160a01b031691505b838110156114a457600061146c600e838154811061142e5761142e615b50565b60009182526020808320909101546001600160a01b03871683526004825260408084208e855290925291205485908c906001600160401b03166137b7565b506000818152600f6020526040902054909150156114935750600198975050505050505050565b5061149d81615ab8565b905061140e565b5050806114b090615ab8565b90506113db565b50600095945050505050565b6114cb612e9c565b6114d3612de6565b6002546001600160a01b03166114fc5760405163c1f0c0a160e01b815260040160405180910390fd5b600b546001600160601b031661152557604051631e9acf1760e31b815260040160405180910390fd5b600b80546001600160601b031690819060006115418380615a3c565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555080600a60008282829054906101000a90046001600160601b03166115899190615a3c565b82546001600160601b039182166101009390930a92830291909202199091161790555060025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906115de9085908590600401615600565b602060405180830381600087803b1580156115f857600080fd5b505af115801561160c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611630919061510a565b61164d57604051631e9acf1760e31b815260040160405180910390fd5b5050565b611659612de6565b611662816135a3565b15611682578060405163ac8a27ef60e01b8152600401610a5091906155b9565b601180546001810182556000919091527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c680180546001600160a01b0319166001600160a01b0383161790556040517fb7cabbfc11e66731fc77de0444614282023bcbd41d16781c753a431d0af01625906116fd9083906155b9565b60405180910390a150565b611710612de6565b6002546001600160a01b03161561173a57604051631688c53760e11b815260040160405180910390fd5b600280546001600160a01b039384166001600160a01b03199182161790915560038054929093169116179055565b6001546001600160a01b031633146117bb5760405162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b6044820152606401610a50565b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b61181a612de6565b6040805180820182526000916118499190859060029083908390808284376000920191909152506127bd915050565b6000818152600d602052604090205490915060ff161561187f57604051634a0b8fa760e01b815260048101829052602401610a50565b60408051808201825260018082526001600160401b0385811660208085019182526000878152600d9091528581209451855492516001600160481b031990931690151568ffffffffffffffff00191617610100929093169190910291909117909255600e805491820181559091527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd01829055517f9b911b2c240bfbef3b6a8f7ed6ee321d1258bb2a3fe6becab52ac1cd3210afd390610a179083908590615643565b61194a612de6565b600a544790600160601b90046001600160601b03168181111561198a576040516354ced18160e11b81526004810182905260248101839052604401610a50565b81811015610c4957600061199e8284615a00565b90506000846001600160a01b03168260405160006040518083038185875af1925050503d80600081146119ed576040519150601f19603f3d011682016040523d82523d6000602084013e6119f2565b606091505b5050905080611a145760405163950b247960e01b815260040160405180910390fd5b7f4aed7c8eed0496c8c19ea2681fcca25741c1602342e38b045d9f1e8e905d2e9c8583604051611a459291906155cd565b60405180910390a15050505050565b611a5c612e9c565b6000818152600560205260409020546001600160a01b0316611a9157604051630fb532db60e11b815260040160405180910390fd5b60008181526006602052604090208054600160601b90046001600160601b0316903490600c611ac083856159ab565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555034600a600c8282829054906101000a90046001600160601b0316611b0891906159ab565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550817f7603b205d03651ee812f803fccde89f1012e545a9c99f0abfea9cedd0fd8e902823484611b5b919061594c565b604080519283526020830191909152015b60405180910390a25050565b6000611b82612e9c565b602080830135600081815260059092526040909120546001600160a01b0316611bbe57604051630fb532db60e11b815260040160405180910390fd5b33600090815260046020908152604080832084845291829052909120546001600160401b031680611c065782336040516379bfd40160e01b8152600401610a509291906156e2565b600c5461ffff16611c1d60608701604088016152cc565b61ffff161080611c40575060c8611c3a60608701604088016152cc565b61ffff16115b15611c8657611c5560608601604087016152cc565b600c5460405163539c34bb60e11b815261ffff92831660048201529116602482015260c86044820152606401610a50565b600c5462010000900463ffffffff16611ca560808701606088016153cf565b63ffffffff161115611cf557611cc160808601606087016153cf565b600c54604051637aebf00f60e11b815263ffffffff9283166004820152620100009091049091166024820152604401610a50565b6101f4611d0860a08701608088016153cf565b63ffffffff161115611d4e57611d2460a08601608087016153cf565b6040516311ce1afb60e21b815263ffffffff90911660048201526101f46024820152604401610a50565b611d5781615ad3565b90506000611d6886353386856137b7565b90955090506000611d8c611d87611d8260a08a018a61585a565b613830565b6138ad565b905085611d9761391e565b86611da860808b0160608c016153cf565b611db860a08c0160808d016153cf565b3386604051602001611dd09796959493929190615765565b60405160208183030381529060405280519060200120600f600088815260200190815260200160002081905550336001600160a01b03168588600001357feb0e3652e0f44f417695e6e90f2f42c99b65cd7169074c5a654b16b9748c3a4e89868c6040016020810190611e4391906152cc565b8d6060016020810190611e5691906153cf565b8e6080016020810190611e6991906153cf565b89604051611e7c96959493929190615726565b60405180910390a450506000928352602091909152604090912080546001600160401b0319166001600160401b039092169190911790555b919050565b6000611ec3612e9c565b6007546001600160401b031633611edb600143615a00565b6040516001600160601b0319606093841b81166020830152914060348201523090921b1660548201526001600160c01b031960c083901b16606882015260700160408051601f1981840301815291905280516020909101209150611f40816001615964565b600780546001600160401b0319166001600160401b03928316179055604080516000808252608082018352602080830182815283850183815260608086018581528a86526006855287862093518454935191516001600160601b039182166001600160c01b031990951694909417600160601b9190921602176001600160c01b0316600160c01b9290981691909102969096179055835194850184523385528481018281528585018481528884526005835294909220855181546001600160a01b03199081166001600160a01b03928316178355935160018301805490951691161790925592518051929493919261203e9260028501920190614cda565b5061204e915060089050846139ae565b50827f1d3015d7ba850fa198dc7b1a3f5d42779313a681035f77c8c03764c61005518d3360405161207f91906155b9565b60405180910390a2505090565b612094612e9c565b6002546001600160a01b031633146120bf576040516344b0e3c360e01b815260040160405180910390fd5b602081146120e057604051638129bbcd60e01b815260040160405180910390fd5b60006120ee82840184615127565b6000818152600560205260409020549091506001600160a01b031661212657604051630fb532db60e11b815260040160405180910390fd5b600081815260066020526040812080546001600160601b03169186919061214d83856159ab565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555084600a60008282829054906101000a90046001600160601b031661219591906159ab565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550817f1ced9348ff549fceab2ac57cd3a9de38edaaab274b725ee82c23e8fc8c4eec7a8287846121e8919061594c565b6040805192835260208301919091520160405180910390a2505050505050565b612210612de6565b60c861ffff8a16111561224a5760405163539c34bb60e11b815261ffff8a1660048201819052602482015260c86044820152606401610a50565b6000851361226e576040516321ea67b360e11b815260048101869052602401610a50565b8363ffffffff168363ffffffff1611156122ab576040516313c06e5960e11b815263ffffffff808516600483015285166024820152604401610a50565b604080516101208101825261ffff8b1680825263ffffffff808c16602084018190526000848601528b8216606085018190528b8316608086018190528a841660a08701819052938a1660c0870181905260ff808b1660e08901819052908a16610100909801889052600c8054600160c01b90990260ff60c01b19600160b81b9093029290921661ffff60b81b19600160981b90940263ffffffff60981b19600160781b9099029890981667ffffffffffffffff60781b19600160581b90960263ffffffff60581b19600160381b9098029790971668ffffffffffffffffff60301b196201000090990265ffffffffffff19909c16909a179a909a1796909616979097179390931791909116959095179290921793909316929092179190911790556010869055517f2c6b6b12413678366b05b145c5f00745bdd00e739131ab5de82484a50c9d78b69061245f908b908b908b908b908b908b908b908b908b9061ffff99909916895263ffffffff97881660208a0152958716604089015293861660608801526080870192909252841660a086015290921660c084015260ff91821660e0840152166101008201526101200190565b60405180910390a1505050505050505050565b61247a612de6565b6000818152600560205260409020546001600160a01b0316806124b057604051630fb532db60e11b815260040160405180910390fd5b61164d8282612ec7565b606060006124c860086139ba565b90508084106124ea57604051631390f2a160e01b815260040160405180910390fd5b60006124f6848661594c565b905081811180612504575083155b61250e5780612510565b815b9050600061251e8683615a00565b9050806001600160401b0381111561253857612538615b66565b604051908082528060200260200182016040528015612561578160200160208202803683370190505b50935060005b818110156125b15761258461257c888361594c565b6008906139c4565b85828151811061259657612596615b50565b60209081029190910101526125aa81615ab8565b9050612567565b505050505b92915050565b6125c4612e9c565b6000818152600560205260409020546001600160a01b0316806125fa57604051630fb532db60e11b815260040160405180910390fd5b6000828152600560205260409020600101546001600160a01b03163314612651576000828152600560205260409081902060010154905163d084e97560e01b8152610a50916001600160a01b0316906004016155b9565b600082815260056020526040908190208054336001600160a01b031991821681178355600190920180549091169055905183917fd4114ab6e9af9f597c52041f32d62dc57c5c4e4c0d4427006069635e216c938691611b6c9185916155e6565b816126bb81612e3b565b6126c3612e9c565b60008381526005602052604090206002018054606414156126f7576040516305a48e0f60e01b815260040160405180910390fd5b6001600160a01b038316600090815260046020908152604080832087845291829052909120546001600160401b031615612732575050505050565b600085815260208281526040808320805460016001600160401b0319909116811790915585549081018655858452919092200180546001600160a01b0319166001600160a01b0387161790555185907f1e980d04aa7648e205713e5e8ea3808672ac163d10936d36f91b2c88ac1575e1906127ae9087906155b9565b60405180910390a25050505050565b6000816040516020016127d09190615622565b604051602081830303815290604052805190602001209050919050565b816127f781612e3b565b6127ff612e9c565b612808836113b3565b1561282657604051631685ecdd60e31b815260040160405180910390fd5b6001600160a01b03821660009081526004602090815260408083208684529091529020546001600160401b03166128745782826040516379bfd40160e01b8152600401610a509291906156e2565b6000838152600560209081526040808320600201805482518185028101850190935280835291929091908301828280156128d757602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116128b9575b505050505090506000600182516128ee9190615a00565b905060005b82518110156129f857846001600160a01b031683828151811061291857612918615b50565b60200260200101516001600160a01b031614156129e857600083838151811061294357612943615b50565b602002602001015190508060056000898152602001908152602001600020600201838154811061297557612975615b50565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394909416939093179092558881526005909152604090206002018054806129c0576129c0615b3a565b600082815260209020810160001990810180546001600160a01b0319169055019055506129f8565b6129f181615ab8565b90506128f3565b506001600160a01b03841660009081526004602090815260408083208884529091529081902080546001600160401b03191690555185907f32158c6058347c1601b2d12bc696ac6901d8a9a9aa3ba10c27ab0a983e8425a7906127ae9087906155b9565b600e8181548110612a6c57600080fd5b600091825260209091200154905081565b81612a8781612e3b565b612a8f612e9c565b600083815260056020526040902060018101546001600160a01b03848116911614612b0e576001810180546001600160a01b0319166001600160a01b03851617905560405184907f21a4dad170a6bf476c31bbcf4a16628295b0e450672eec25d7c93308e05344a190612b0590339087906155e6565b60405180910390a25b50505050565b600081815260056020526040812054819081906001600160a01b0316606081612b5057604051630fb532db60e11b815260040160405180910390fd5b600086815260066020908152604080832054600583529281902060020180548251818502810185019093528083526001600160601b0380861695600160601b810490911694600160c01b9091046001600160401b0316938893929091839190830182828015612be857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612bca575b505050505090509450945094509450945091939590929450565b612c0a612de6565b6002546001600160a01b0316612c335760405163c1f0c0a160e01b815260040160405180910390fd5b6002546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612c649030906004016155b9565b60206040518083038186803b158015612c7c57600080fd5b505afa158015612c90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cb49190615140565b600a549091506001600160601b031681811115612cee576040516354ced18160e11b81526004810182905260248101839052604401610a50565b81811015610c49576000612d028284615a00565b60025460405163a9059cbb60e01b81529192506001600160a01b03169063a9059cbb90612d3590879085906004016155cd565b602060405180830381600087803b158015612d4f57600080fd5b505af1158015612d63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d87919061510a565b612da457604051631f01ff1360e21b815260040160405180910390fd5b7f59bfc682b673f8cbf945f1e454df9334834abf7dfe7f92237ca29ecb9b4366008482604051610bf89291906155cd565b612ddd612de6565b610a59816139d0565b6000546001600160a01b03163314612e395760405162461bcd60e51b815260206004820152601660248201527527b7363c9031b0b63630b1363290313c9037bbb732b960511b6044820152606401610a50565b565b6000818152600560205260409020546001600160a01b031680612e7157604051630fb532db60e11b815260040160405180910390fd5b336001600160a01b0382161461164d5780604051636c51fda960e11b8152600401610a5091906155b9565b600c54600160301b900460ff1615612e395760405163769dd35360e11b815260040160405180910390fd5b600080612ed38461360f565b60025491935091506001600160a01b031615801590612efa57506001600160601b03821615155b15612fa95760025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90612f3a9086906001600160601b038716906004016155cd565b602060405180830381600087803b158015612f5457600080fd5b505af1158015612f68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f8c919061510a565b612fa957604051631e9acf1760e31b815260040160405180910390fd5b6000836001600160a01b0316826001600160601b031660405160006040518083038185875af1925050503d8060008114612fff576040519150601f19603f3d011682016040523d82523d6000602084013e613004565b606091505b50509050806130265760405163950b247960e01b815260040160405180910390fd5b604080516001600160a01b03861681526001600160601b03808616602083015284169181019190915285907f8c74ce8b8cf87f5eb001275c8be27eb34ea2b62bfab6814fcc62192bb63e81c4906060016127ae565b6040805160a081018252600060608201818152608083018290528252602082018190529181019190915260006130b484600001516127bd565b6000818152600d602090815260409182902082518084019093525460ff811615158084526101009091046001600160401b0316918301919091529192509061311257604051631dfd6e1360e21b815260048101839052602401610a50565b6000828660800151604051602001613134929190918252602082015260400190565b60408051601f1981840301815291815281516020928301206000818152600f9093529120549091508061317a57604051631b44092560e11b815260040160405180910390fd5b85516020808801516040808a015160608b015160808c015160a08d015193516131a9978a9790969591016157b1565b6040516020818303038152906040528051906020012081146131de5760405163354a450b60e21b815260040160405180910390fd5b60006131ed8760000151613a74565b9050806132c5578651604051631d2827a760e31b81526001600160401b0390911660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e9413d389060240160206040518083038186803b15801561325f57600080fd5b505afa158015613273573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132979190615140565b9050806132c557865160405163175dadad60e01b81526001600160401b039091166004820152602401610a50565b60008860800151826040516020016132e7929190918252602082015260400190565b6040516020818303038152906040528051906020012060001c9050600061330e8a83613b56565b604080516060810182529788526020880196909652948601949094525092979650505050505050565b6000816001600160401b03163a111561337d57821561336057506001600160401b0381166125b6565b3a8260405163435e532d60e11b8152600401610a50929190615643565b503a92915050565b6000806000631fe543e360e01b86856040516024016133a592919061570d565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252600c805460ff60301b1916600160301b1790559086015160808701519192506134099163ffffffff9091169083613bc1565b600c805460ff60301b191690559695505050505050565b6000821561343a57613433858584613c0d565b9050613448565b613445858584613d1e565b90505b949350505050565b6000818152600660205260409020821561350f5780546001600160601b03600160601b909104811690851681101561349b57604051631e9acf1760e31b815260040160405180910390fd5b6134a58582615a3c565b8254600160601b600160c01b031916600160601b6001600160601b039283168102919091178455600b805488939192600c926134e59286929004166159ab565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555050612b0e565b80546001600160601b0390811690851681101561353f57604051631e9acf1760e31b815260040160405180910390fd5b6135498582615a3c565b82546001600160601b0319166001600160601b03918216178355600b80548792600091613578918591166159ab565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505050505050565b601154600090815b8181101561360557836001600160a01b0316601182815481106135d0576135d0615b50565b6000918252602090912001546001600160a01b031614156135f5575060019392505050565b6135fe81615ab8565b90506135ab565b5060009392505050565b60008181526005602090815260408083206006909252822054600290910180546001600160601b0380841694600160601b90940416925b818110156136b1576004600084838154811061366457613664615b50565b60009182526020808320909101546001600160a01b031683528281019390935260409182018120898252909252902080546001600160401b03191690556136aa81615ab8565b9050613646565b50600085815260056020526040812080546001600160a01b031990811682556001820180549091169055906136e96002830182614d3f565b5050600085815260066020526040812055613705600886613f07565b506001600160601b0384161561375857600a80548591906000906137339084906001600160601b0316615a3c565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505b6001600160601b038316156137b05782600a600c8282829054906101000a90046001600160601b031661378b9190615a3c565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505b5050915091565b6040805160208082018790526001600160a01b03959095168183015260608101939093526001600160401b03919091166080808401919091528151808403909101815260a08301825280519084012060c083019490945260e0808301859052815180840390910181526101009092019052805191012091565b6040805160208101909152600081528161385957506040805160208101909152600081526125b6565b63125fa26760e31b61386b8385615a5c565b6001600160e01b0319161461389357604051632923fee760e11b815260040160405180910390fd5b6138a08260048186615922565b810190610ffa9190615159565b60607f92fd13387c7fe7befbc38d303d6468778fb9731bc4583f17d92989c6fcfdeaaa826040516024016138e691511515815260200190565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915292915050565b60004661392a81613f13565b156139a75760646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561396957600080fd5b505afa15801561397d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139a19190615140565b91505090565b4391505090565b6000610ffa8383613f36565b60006125b6825490565b6000610ffa8383613f85565b6001600160a01b038116331415613a235760405162461bcd60e51b815260206004820152601760248201527621b0b73737ba103a3930b739b332b9103a379039b2b63360491b6044820152606401610a50565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600046613a8081613f13565b15613b4757610100836001600160401b0316613a9a61391e565b613aa49190615a00565b1180613ac05750613ab361391e565b836001600160401b031610155b15613ace5750600092915050565b6040516315a03d4160e11b81526001600160401b0384166004820152606490632b407a82906024015b60206040518083038186803b158015613b0f57600080fd5b505afa158015613b23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ffa9190615140565b50506001600160401b03164090565b6000613b8a8360000151846020015185604001518660600151868860a001518960c001518a60e001518b6101000151613faf565b60038360200151604051602001613ba29291906156f9565b60408051601f1981840301815291905280516020909101209392505050565b60005a611388811015613bd357600080fd5b611388810390508460408204820311613beb57600080fd5b50823b613bf757600080fd5b60008083516020850160008789f1949350505050565b600080613c506000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506141cb92505050565b905060005a600c54613c70908890600160581b900463ffffffff1661594c565b613c7a9190615a00565b613c8490866159e1565b600c54909150600090613ca990600160781b900463ffffffff1664e8d4a510006159e1565b90508415613cf557600c548190606490600160b81b900460ff16613ccd858761594c565b613cd791906159e1565b613ce191906159cd565b613ceb919061594c565b9350505050610ffa565b600c548190606490613d1190600160b81b900460ff1682615986565b60ff16613ccd858761594c565b600080613d29614299565b905060008113613d4f576040516321ea67b360e11b815260048101829052602401610a50565b6000613d916000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506141cb92505050565b9050600082825a600c54613db3908b90600160581b900463ffffffff1661594c565b613dbd9190615a00565b613dc790896159e1565b613dd1919061594c565b613de390670de0b6b3a76400006159e1565b613ded91906159cd565b600c54909150600090613e169063ffffffff600160981b8204811691600160781b900416615a17565b613e2b9063ffffffff1664e8d4a510006159e1565b9050600084613e4283670de0b6b3a76400006159e1565b613e4c91906159cd565b905060008715613e8d57600c548290606490613e7290600160c01b900460ff16876159e1565b613e7c91906159cd565b613e86919061594c565b9050613ecd565b600c548290606490613ea990600160c01b900460ff1682615986565b613eb69060ff16876159e1565b613ec091906159cd565b613eca919061594c565b90505b6b033b2e3c9fd0803ce8000000811115613efa5760405163e80fa38160e01b815260040160405180910390fd5b9998505050505050505050565b6000610ffa8383614368565b600061a4b1821480613f27575062066eed82145b806125b657505062066eee1490565b6000818152600183016020526040812054613f7d575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556125b6565b5060006125b6565b6000826000018281548110613f9c57613f9c615b50565b9060005260206000200154905092915050565b613fb88961445b565b6140015760405162461bcd60e51b815260206004820152601a6024820152797075626c6963206b6579206973206e6f74206f6e20637572766560301b6044820152606401610a50565b61400a8861445b565b61404e5760405162461bcd60e51b815260206004820152601560248201527467616d6d61206973206e6f74206f6e20637572766560581b6044820152606401610a50565b6140578361445b565b6140a35760405162461bcd60e51b815260206004820152601d60248201527f6347616d6d615769746e657373206973206e6f74206f6e2063757276650000006044820152606401610a50565b6140ac8261445b565b6140f85760405162461bcd60e51b815260206004820152601c60248201527f73486173685769746e657373206973206e6f74206f6e206375727665000000006044820152606401610a50565b614104878a888761451e565b61414c5760405162461bcd60e51b81526020600482015260196024820152786164647228632a706b2b732a6729213d5f755769746e65737360381b6044820152606401610a50565b60006141588a87614641565b9050600061416b898b878b8689896146a5565b9050600061417c838d8d8a866147c4565b9050808a146141bd5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b210383937b7b360991b6044820152606401610a50565b505050505050505050505050565b6000466141d781613f13565b1561421657606c6001600160a01b031663c6f7de0e6040518163ffffffff1660e01b815260040160206040518083038186803b158015613b0f57600080fd5b61421f81614804565b1561429057600f602160991b016001600160a01b03166349948e0e84604051806080016040528060488152602001615ba06048913960405160200161426592919061550f565b6040516020818303038152906040526040518263ffffffff1660e01b8152600401613af7919061565a565b50600092915050565b600c5460035460408051633fabe5a360e21b81529051600093600160381b900463ffffffff169284926001600160a01b039091169163feaf968c9160048082019260a092909190829003018186803b1580156142f457600080fd5b505afa158015614308573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061432c91906153ea565b50919550909250505063ffffffff821615801590614358575061434f8142615a00565b8263ffffffff16105b156143635760105492505b505090565b6000818152600183016020526040812054801561445157600061438c600183615a00565b85549091506000906143a090600190615a00565b90508181146144055760008660000182815481106143c0576143c0615b50565b90600052602060002001549050808760000184815481106143e3576143e3615b50565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061441657614416615b3a565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506125b6565b60009150506125b6565b80516000906401000003d019116144a95760405162461bcd60e51b8152602060048201526012602482015271696e76616c696420782d6f7264696e61746560701b6044820152606401610a50565b60208201516401000003d019116144f75760405162461bcd60e51b8152602060048201526012602482015271696e76616c696420792d6f7264696e61746560701b6044820152606401610a50565b60208201516401000003d0199080096145178360005b602002015161483e565b1492915050565b60006001600160a01b0382166145645760405162461bcd60e51b815260206004820152600b60248201526a626164207769746e65737360a81b6044820152606401610a50565b60208401516000906001161561457b57601c61457e565b601b5b9050600070014551231950b75fc4402da1732fc9bebe1985876000602002015109865170014551231950b75fc4402da1732fc9bebe19918203925060009190890987516040805160008082526020820180845287905260ff88169282019290925260608101929092526080820183905291925060019060a0016020604051602081039080840390855afa158015614619573d6000803e3d6000fd5b5050604051601f1901516001600160a01b039081169088161495505050505050949350505050565b614649614d5d565b6146766001848460405160200161466293929190615598565b604051602081830303815290604052614862565b90505b6146828161445b565b6125b657805160408051602081019290925261469e9101614662565b9050614679565b6146ad614d5d565b825186516401000003d019908190069106141561470c5760405162461bcd60e51b815260206004820152601e60248201527f706f696e747320696e2073756d206d7573742062652064697374696e637400006044820152606401610a50565b6147178789886148b0565b61475c5760405162461bcd60e51b8152602060048201526016602482015275119a5c9cdd081b5d5b0818da1958dac819985a5b195960521b6044820152606401610a50565b6147678486856148b0565b6147ad5760405162461bcd60e51b815260206004820152601760248201527614d958dbdb99081b5d5b0818da1958dac819985a5b1959604a1b6044820152606401610a50565b6147b88684846149d8565b98975050505050505050565b6000600286868685876040516020016147e29695949392919061553e565b60408051601f1981840301815291905280516020909101209695505050505050565b6000600a82148061481657506101a482145b80614823575062aa37dc82145b8061482f575061210582145b806125b657505062014a331490565b6000806401000003d01980848509840990506401000003d019600782089392505050565b61486a614d5d565b61487382614a9b565b815261488861488382600061450d565b614ad6565b602082018190526002900660011415611eb4576020810180516401000003d019039052919050565b6000826148ed5760405162461bcd60e51b815260206004820152600b60248201526a3d32b9379039b1b0b630b960a91b6044820152606401610a50565b8351602085015160009061490390600290615afa565b1561490f57601c614912565b601b5b9050600070014551231950b75fc4402da1732fc9bebe198387096040805160008082526020820180845281905260ff86169282019290925260608101869052608081018390529192509060019060a0016020604051602081039080840390855afa158015614984573d6000803e3d6000fd5b5050506020604051035190506000866040516020016149a391906154fd565b60408051601f1981840301815291905280516020909101206001600160a01b0392831692169190911498975050505050505050565b6149e0614d5d565b835160208086015185519186015160009384938493614a0193909190614af6565b919450925090506401000003d019858209600114614a5d5760405162461bcd60e51b815260206004820152601960248201527834b73b2d1036bab9ba1031329034b73b32b939b29037b3103d60391b6044820152606401610a50565b60405180604001604052806401000003d01980614a7c57614a7c615b24565b87860981526020016401000003d0198785099052979650505050505050565b805160208201205b6401000003d0198110611eb457604080516020808201939093528151808203840181529082019091528051910120614aa3565b60006125b6826002614aef6401000003d019600161594c565b901c614bd6565b60008080600180826401000003d019896401000003d019038808905060006401000003d0198b6401000003d019038a0890506000614b3683838585614c6d565b9098509050614b4788828e88614c91565b9098509050614b5888828c87614c91565b90985090506000614b6b8d878b85614c91565b9098509050614b7c88828686614c6d565b9098509050614b8d88828e89614c91565b9098509050818114614bc2576401000003d019818a0998506401000003d01982890997506401000003d0198183099650614bc6565b8196505b5050505050509450945094915050565b600080614be1614d7b565b6020808252818101819052604082015260608101859052608081018490526401000003d01960a0820152614c13614d99565b60208160c0846005600019fa925082614c635760405162461bcd60e51b81526020600482015260126024820152716269674d6f64457870206661696c7572652160701b6044820152606401610a50565b5195945050505050565b6000806401000003d0198487096401000003d0198487099097909650945050505050565b600080806401000003d019878509905060006401000003d01987876401000003d019030990506401000003d0198183086401000003d01986890990999098509650505050505050565b828054828255906000526020600020908101928215614d2f579160200282015b82811115614d2f57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614cfa565b50614d3b929150614db7565b5090565b5080546000825590600052602060002090810190610a599190614db7565b60405180604001604052806002906020820280368337509192915050565b6040518060c001604052806006906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b5b80821115614d3b5760008155600101614db8565b8035611eb481615b7c565b80604081018310156125b657600080fd5b600082601f830112614df957600080fd5b604051604081018181106001600160401b0382111715614e1b57614e1b615b66565b8060405250808385604086011115614e3257600080fd5b60005b6002811015614e54578135835260209283019290910190600101614e35565b509195945050505050565b8035611eb481615b91565b600060c08284031215614e7c57600080fd5b614e846158a7565b9050614e8f82614f7e565b815260208083013581830152614ea760408401614f6a565b6040830152614eb860608401614f6a565b60608301526080830135614ecb81615b7c565b608083015260a08301356001600160401b0380821115614eea57600080fd5b818501915085601f830112614efe57600080fd5b813581811115614f1057614f10615b66565b614f22601f8201601f191685016158f2565b91508082528684828501011115614f3857600080fd5b80848401858401376000848284010152508060a085015250505092915050565b803561ffff81168114611eb457600080fd5b803563ffffffff81168114611eb457600080fd5b80356001600160401b0381168114611eb457600080fd5b803560ff81168114611eb457600080fd5b805169ffffffffffffffffffff81168114611eb457600080fd5b600060208284031215614fd257600080fd5b8135610ffa81615b7c565b60008060408385031215614ff057600080fd5b8235614ffb81615b7c565b9150602083013561500b81615b7c565b809150509250929050565b6000806000806060858703121561502c57600080fd5b843561503781615b7c565b93506020850135925060408501356001600160401b038082111561505a57600080fd5b818701915087601f83011261506e57600080fd5b81358181111561507d57600080fd5b88602082850101111561508f57600080fd5b95989497505060200194505050565b6000604082840312156150b057600080fd5b610ffa8383614dd7565b600080606083850312156150cd57600080fd5b6150d78484614dd7565b91506150e560408401614f7e565b90509250929050565b60006040828403121561510057600080fd5b610ffa8383614de8565b60006020828403121561511c57600080fd5b8151610ffa81615b91565b60006020828403121561513957600080fd5b5035919050565b60006020828403121561515257600080fd5b5051919050565b60006020828403121561516b57600080fd5b604051602081018181106001600160401b038211171561518d5761518d615b66565b604052823561519b81615b91565b81529392505050565b60008060008385036101e08112156151bb57600080fd5b6101a0808212156151cb57600080fd5b6151d36158cf565b91506151df8787614de8565b82526151ee8760408801614de8565b60208301526080860135604083015260a0860135606083015260c0860135608083015261521d60e08701614dcc565b60a083015261010061523188828901614de8565b60c0840152615244886101408901614de8565b60e0840152610180870135908301529093508401356001600160401b0381111561526d57600080fd5b61527986828701614e6a565b9250506152896101c08501614e5f565b90509250925092565b6000602082840312156152a457600080fd5b81356001600160401b038111156152ba57600080fd5b820160c08185031215610ffa57600080fd5b6000602082840312156152de57600080fd5b610ffa82614f58565b60008060008060008060008060006101208a8c03121561530657600080fd5b61530f8a614f58565b985061531d60208b01614f6a565b975061532b60408b01614f6a565b965061533960608b01614f6a565b955060808a0135945061534e60a08b01614f6a565b935061535c60c08b01614f6a565b925061536a60e08b01614f95565b91506153796101008b01614f95565b90509295985092959850929598565b6000806040838503121561539b57600080fd5b82359150602083013561500b81615b7c565b600080604083850312156153c057600080fd5b50508035926020909101359150565b6000602082840312156153e157600080fd5b610ffa82614f6a565b600080600080600060a0868803121561540257600080fd5b61540b86614fa6565b945060208601519350604086015192506060860151915061542e60808701614fa6565b90509295509295909350565b600081518084526020808501945080840160005b838110156154735781516001600160a01b03168752958201959082019060010161544e565b509495945050505050565b8060005b6002811015612b0e578151845260209384019390910190600101615482565b600081518084526020808501945080840160005b83811015615473578151875295820195908201906001016154b5565b600081518084526154e9816020860160208601615a8c565b601f01601f19169290920160200192915050565b615507818361547e565b604001919050565b60008351615521818460208801615a8c565b835190830190615535818360208801615a8c565b01949350505050565b86815261554e602082018761547e565b61555b606082018661547e565b61556860a082018561547e565b61557560e082018461547e565b60609190911b6001600160601b0319166101208201526101340195945050505050565b8381526155a8602082018461547e565b606081019190915260800192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039290921682526001600160601b0316602082015260400190565b604081016125b6828461547e565b602081526000610ffa60208301846154a1565b9182526001600160401b0316602082015260400190565b602081526000610ffa60208301846154d1565b6020815260ff82511660208201526020820151604082015260018060a01b0360408301511660608201526000606083015160c060808401526156b260e084018261543a565b60808501516001600160601b0390811660a0868101919091529095015190941660c0909301929092525090919050565b9182526001600160a01b0316602082015260400190565b82815260608101610ffa602083018461547e565b82815260406020820152600061344860408301846154a1565b86815285602082015261ffff85166040820152600063ffffffff808616606084015280851660808401525060c060a08301526147b860c08301846154d1565b878152602081018790526040810186905263ffffffff8581166060830152841660808201526001600160a01b03831660a082015260e060c08201819052600090613efa908301846154d1565b8781526001600160401b03871660208201526040810186905263ffffffff8581166060830152841660808201526001600160a01b03831660a082015260e060c08201819052600090613efa908301846154d1565b6001600160601b038681168252851660208201526001600160401b03841660408201526001600160a01b038316606082015260a06080820181905260009061584f9083018461543a565b979650505050505050565b6000808335601e1984360301811261587157600080fd5b8301803591506001600160401b0382111561588b57600080fd5b6020019150368190038213156158a057600080fd5b9250929050565b60405160c081016001600160401b03811182821017156158c9576158c9615b66565b60405290565b60405161012081016001600160401b03811182821017156158c9576158c9615b66565b604051601f8201601f191681016001600160401b038111828210171561591a5761591a615b66565b604052919050565b6000808585111561593257600080fd5b8386111561593f57600080fd5b5050820193919092039150565b6000821982111561595f5761595f615b0e565b500190565b60006001600160401b0380831681851680830382111561553557615535615b0e565b600060ff821660ff84168060ff038211156159a3576159a3615b0e565b019392505050565b60006001600160601b0382811684821680830382111561553557615535615b0e565b6000826159dc576159dc615b24565b500490565b60008160001904831182151516156159fb576159fb615b0e565b500290565b600082821015615a1257615a12615b0e565b500390565b600063ffffffff83811690831681811015615a3457615a34615b0e565b039392505050565b60006001600160601b0383811690831681811015615a3457615a34615b0e565b6001600160e01b03198135818116916004851015615a845780818660040360031b1b83161692505b505092915050565b60005b83811015615aa7578181015183820152602001615a8f565b83811115612b0e5750506000910152565b6000600019821415615acc57615acc615b0e565b5060010190565b60006001600160401b0380831681811415615af057615af0615b0e565b6001019392505050565b600082615b0957615b09615b24565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610a5957600080fd5b8015158114610a5957600080fdfe307866666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666a164736f6c6343000806000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"blockhashStore\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"internalBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"externalBalance\",\"type\":\"uint256\"}],\"name\":\"BalanceInvariantViolated\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNum\",\"type\":\"uint256\"}],\"name\":\"BlockhashNotInStore\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorNotRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedToSendNative\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedToTransferLink\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"have\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"want\",\"type\":\"uint32\"}],\"name\":\"GasLimitTooBig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"gasPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxGas\",\"type\":\"uint256\"}],\"name\":\"GasPriceExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectCommitment\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IndexOutOfRange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"have\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"want\",\"type\":\"uint256\"}],\"name\":\"InsufficientGasForConsumer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCalldata\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"InvalidConsumer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExtraArgsTag\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"linkWei\",\"type\":\"int256\"}],\"name\":\"InvalidLinkWeiPrice\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"premiumPercentage\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"max\",\"type\":\"uint8\"}],\"name\":\"InvalidPremiumPercentage\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"have\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"min\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"max\",\"type\":\"uint16\"}],\"name\":\"InvalidRequestConfirmations\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSubscription\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkAlreadySet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"flatFeeLinkDiscountPPM\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"flatFeeNativePPM\",\"type\":\"uint32\"}],\"name\":\"LinkDiscountTooHigh\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkNotSet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"have\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"max\",\"type\":\"uint32\"}],\"name\":\"MsgDataTooBig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proposedOwner\",\"type\":\"address\"}],\"name\":\"MustBeRequestedOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"MustBeSubOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoCorrespondingRequest\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"}],\"name\":\"NoSuchProvingKey\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"have\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"want\",\"type\":\"uint32\"}],\"name\":\"NumWordsTooBig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableFromLink\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PaymentTooLarge\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PendingRequestExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"}],\"name\":\"ProvingKeyAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Reentrant\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyConsumers\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"stalenessSeconds\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"gasAfterPaymentCalculation\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"int256\",\"name\":\"fallbackWeiPerUnitLink\",\"type\":\"int256\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeNativePPM\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeLinkDiscountPPM\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"nativePremiumPercentage\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"linkPremiumPercentage\",\"type\":\"uint8\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorDeregistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorRegistered\",\"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\":false,\"internalType\":\"address\",\"name\":\"newCoordinator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"MigrationCompleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"NativeFundsRecovered\",\"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\":\"keyHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"maxGas\",\"type\":\"uint64\"}],\"name\":\"ProvingKeyDeregistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"maxGas\",\"type\":\"uint64\"}],\"name\":\"ProvingKeyRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"outputSeed\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"payment\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"nativePayment\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"onlyPremium\",\"type\":\"bool\"}],\"name\":\"RandomWordsFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"preSeed\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RandomWordsRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountLink\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountNative\",\"type\":\"uint256\"}],\"name\":\"SubscriptionCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"SubscriptionConsumerAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"SubscriptionConsumerRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"SubscriptionCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"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\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldNativeBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newNativeBalance\",\"type\":\"uint256\"}],\"name\":\"SubscriptionFundedWithNative\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"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\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"SubscriptionOwnerTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BLOCKHASH_STORE\",\"outputs\":[{\"internalType\":\"contractBlockhashStoreInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"LINK\",\"outputs\":[{\"internalType\":\"contractLinkTokenInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"LINK_NATIVE_FEED\",\"outputs\":[{\"internalType\":\"contractAggregatorV3Interface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_CONSUMERS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_NUM_WORDS\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_REQUEST_CONFIRMATIONS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"acceptSubscriptionOwnerTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"addConsumer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"cancelSubscription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"createSubscription\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"deregisterMigratableCoordinator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"publicProvingKey\",\"type\":\"uint256[2]\"}],\"name\":\"deregisterProvingKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256[2]\",\"name\":\"pk\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"gamma\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"c\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"s\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"seed\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"uWitness\",\"type\":\"address\"},{\"internalType\":\"uint256[2]\",\"name\":\"cGammaWitness\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"sHashWitness\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"zInv\",\"type\":\"uint256\"}],\"internalType\":\"structVRF.Proof\",\"name\":\"proof\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"blockNum\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structVRFCoordinatorV2_5.RequestCommitment\",\"name\":\"rc\",\"type\":\"tuple\"},{\"internalType\":\"bool\",\"name\":\"onlyPremium\",\"type\":\"bool\"}],\"name\":\"fulfillRandomWords\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"payment\",\"type\":\"uint96\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"fundSubscriptionWithNative\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"startIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxCount\",\"type\":\"uint256\"}],\"name\":\"getActiveSubscriptionIds\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"getSubscription\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"balance\",\"type\":\"uint96\"},{\"internalType\":\"uint96\",\"name\":\"nativeBalance\",\"type\":\"uint96\"},{\"internalType\":\"uint64\",\"name\":\"reqCount\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"consumers\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"publicKey\",\"type\":\"uint256[2]\"}],\"name\":\"hashOfKey\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"newCoordinator\",\"type\":\"address\"}],\"name\":\"migrate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"ownerCancelSubscription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"pendingRequestExists\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"recoverFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"recoverNativeFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"registerMigratableCoordinator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"publicProvingKey\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint64\",\"name\":\"maxGas\",\"type\":\"uint64\"}],\"name\":\"registerProvingKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"removeConsumer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"uint16\",\"name\":\"requestConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structVRFV2PlusClient.RandomWordsRequest\",\"name\":\"req\",\"type\":\"tuple\"}],\"name\":\"requestRandomWords\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"requestSubscriptionOwnerTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_config\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"reentrancyLock\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"stalenessSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasAfterPaymentCalculation\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeNativePPM\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeLinkDiscountPPM\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"nativePremiumPercentage\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"linkPremiumPercentage\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_currentSubNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_fallbackWeiPerUnitLink\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"s_provingKeyHashes\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"s_provingKeys\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"exists\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"maxGas\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"s_requestCommitments\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_totalBalance\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_totalNativeBalance\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"stalenessSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasAfterPaymentCalculation\",\"type\":\"uint32\"},{\"internalType\":\"int256\",\"name\":\"fallbackWeiPerUnitLink\",\"type\":\"int256\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeNativePPM\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeLinkDiscountPPM\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"nativePremiumPercentage\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"linkPremiumPercentage\",\"type\":\"uint8\"}],\"name\":\"setConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"link\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"linkNativeFeed\",\"type\":\"address\"}],\"name\":\"setLINKAndLINKNativeFeed\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"withdrawNative\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x60a06040523480156200001157600080fd5b5060405162005e3138038062005e31833981016040819052620000349162000183565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000d7565b50505060601b6001600160601b031916608052620001b5565b6001600160a01b038116331415620001325760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000602082840312156200019657600080fd5b81516001600160a01b0381168114620001ae57600080fd5b9392505050565b60805160601c615c56620001db6000396000818161055001526132770152615c566000f3fe60806040526004361061021c5760003560e01c80638402595e11610124578063b2a7cac5116100a6578063b2a7cac514610732578063bec4c08c14610752578063caf70c4a14610772578063cb63179714610792578063d98e620e146107b2578063da2f2610146107d2578063dac83d2914610831578063dc311dd314610851578063e72f6e3014610882578063ee9d2d38146108a2578063f2fde38b146108cf57600080fd5b80638402595e146105c757806386fe91c7146105e75780638da5cb5b1461060757806395b55cfc146106255780639b1c385e146106385780639d40a6fd14610658578063a21a23e414610690578063a4c0ed36146106a5578063a63e0bfb146106c5578063aa433aff146106e5578063aefb212f1461070557600080fd5b8063405b84fa116101ad578063405b84fa1461044e57806340d6bb821461046e57806341af6c871461049957806351cff8d9146104c95780635d06b4ab146104e957806364d51a2a14610509578063659827441461051e578063689c45171461053e57806372e9d5651461057257806379ba5097146105925780637a5a2aef146105a757600080fd5b806304104edb14610221578063043bd6ae14610243578063088070f51461026c57806308821d581461033a5780630ae095401461035a57806315c48b841461037a57806318e3dd27146103a25780631b6b6d23146103e15780632f622e6b1461040e578063301f42e91461042e575b600080fd5b34801561022d57600080fd5b5061024161023c366004615022565b6108ef565b005b34801561024f57600080fd5b5061025960105481565b6040519081526020015b60405180910390f35b34801561027857600080fd5b50600c546102dd9061ffff81169063ffffffff62010000820481169160ff600160301b8204811692600160381b8304811692600160581b8104821692600160781b8204831692600160981b83041691600160b81b8104821691600160c01b9091041689565b6040805161ffff909a168a5263ffffffff98891660208b01529615159689019690965293861660608801529185166080870152841660a08601529290921660c084015260ff91821660e08401521661010082015261012001610263565b34801561034657600080fd5b50610241610355366004615100565b610a5c565b34801561036657600080fd5b506102416103753660046153ea565b610c06565b34801561038657600080fd5b5061038f60c881565b60405161ffff9091168152602001610263565b3480156103ae57600080fd5b50600a546103c990600160601b90046001600160601b031681565b6040516001600160601b039091168152602001610263565b3480156103ed57600080fd5b50600254610401906001600160a01b031681565b604051610263919061561b565b34801561041a57600080fd5b50610241610429366004615022565b610c4e565b34801561043a57600080fd5b506103c9610449366004615206565b610d9a565b34801561045a57600080fd5b506102416104693660046153ea565b611001565b34801561047a57600080fd5b506104846101f481565b60405163ffffffff9091168152602001610263565b3480156104a557600080fd5b506104b96104b4366004615189565b6113b3565b6040519015158152602001610263565b3480156104d557600080fd5b506102416104e4366004615022565b6114c3565b3480156104f557600080fd5b50610241610504366004615022565b611651565b34801561051557600080fd5b5061038f606481565b34801561052a57600080fd5b5061024161053936600461503f565b611708565b34801561054a57600080fd5b506104017f000000000000000000000000000000000000000000000000000000000000000081565b34801561057e57600080fd5b50600354610401906001600160a01b031681565b34801561059e57600080fd5b50610241611768565b3480156105b357600080fd5b506102416105c236600461511c565b611812565b3480156105d357600080fd5b506102416105e2366004615022565b611942565b3480156105f357600080fd5b50600a546103c9906001600160601b031681565b34801561061357600080fd5b506000546001600160a01b0316610401565b610241610633366004615189565b611a54565b34801561064457600080fd5b506102596106533660046152f4565b611b78565b34801561066457600080fd5b50600754610678906001600160401b031681565b6040516001600160401b039091168152602001610263565b34801561069c57600080fd5b50610259611eb9565b3480156106b157600080fd5b506102416106c0366004615078565b61208c565b3480156106d157600080fd5b506102416106e0366004615349565b612208565b3480156106f157600080fd5b50610241610700366004615189565b6124d4565b34801561071157600080fd5b5061072561072036600461540f565b61251c565b6040516102639190615692565b34801561073e57600080fd5b5061024161074d366004615189565b61261e565b34801561075e57600080fd5b5061024161076d3660046153ea565b612713565b34801561077e57600080fd5b5061025961078d366004615150565b61281f565b34801561079e57600080fd5b506102416107ad3660046153ea565b61284f565b3480156107be57600080fd5b506102596107cd366004615189565b612abe565b3480156107de57600080fd5b506108126107ed366004615189565b600d6020526000908152604090205460ff81169061010090046001600160401b031682565b6040805192151583526001600160401b03909116602083015201610263565b34801561083d57600080fd5b5061024161084c3660046153ea565b612adf565b34801561085d57600080fd5b5061087161086c366004615189565b612b76565b604051610263959493929190615867565b34801561088e57600080fd5b5061024161089d366004615022565b612c64565b3480156108ae57600080fd5b506102596108bd366004615189565b600f6020526000908152604090205481565b3480156108db57600080fd5b506102416108ea366004615022565b612e37565b6108f7612e48565b60115460005b81811015610a3457826001600160a01b03166011828154811061092257610922615bb2565b6000918252602090912001546001600160a01b03161415610a2457601161094a600184615a62565b8154811061095a5761095a615bb2565b600091825260209091200154601180546001600160a01b03909216918390811061098657610986615bb2565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060118054806109c5576109c5615b9c565b600082815260209020810160001990810180546001600160a01b03191690550190556040517ff80a1a97fd42251f3c33cda98635e7399253033a6774fe37cd3f650b5282af3790610a1790859061561b565b60405180910390a1505050565b610a2d81615b1a565b90506108fd565b5081604051635428d44960e01b8152600401610a50919061561b565b60405180910390fd5b50565b610a64612e48565b604080518082018252600091610a9391908490600290839083908082843760009201919091525061281f915050565b6000818152600d602090815260409182902082518084019093525460ff811615158084526101009091046001600160401b03169183019190915291925090610af157604051631dfd6e1360e21b815260048101839052602401610a50565b6000828152600d6020526040812080546001600160481b0319169055600e54905b81811015610bc25783600e8281548110610b2e57610b2e615bb2565b90600052602060002001541415610bb257600e610b4c600184615a62565b81548110610b5c57610b5c615bb2565b9060005260206000200154600e8281548110610b7a57610b7a615bb2565b600091825260209091200155600e805480610b9757610b97615b9c565b60019003818190600052602060002001600090559055610bc2565b610bbb81615b1a565b9050610b12565b507f9b6868e0eb737bcd72205360baa6bfd0ba4e4819a33ade2db384e8a8025639a5838360200151604051610bf89291906156a5565b60405180910390a150505050565b81610c1081612e9d565b610c18612efe565b610c21836113b3565b15610c3f57604051631685ecdd60e31b815260040160405180910390fd5b610c498383612f29565b505050565b610c56612efe565b610c5e612e48565b600b54600160601b90046001600160601b0316610c8e57604051631e9acf1760e31b815260040160405180910390fd5b600b8054600160601b90046001600160601b0316908190600c610cb18380615a9e565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555080600a600c8282829054906101000a90046001600160601b0316610cf99190615a9e565b92506101000a8154816001600160601b0302191690836001600160601b031602179055506000826001600160a01b0316826001600160601b031660405160006040518083038185875af1925050503d8060008114610d73576040519150601f19603f3d011682016040523d82523d6000602084013e610d78565b606091505b5050905080610c495760405163950b247960e01b815260040160405180910390fd5b6000610da4612efe565b60005a9050610324361115610dd657604051630f28961b60e01b81523660048201526103246024820152604401610a50565b6000610de286866130dd565b90506000610df885836000015160200151613399565b60408301516060888101519293509163ffffffff16806001600160401b03811115610e2557610e25615bc8565b604051908082528060200260200182016040528015610e4e578160200160208202803683370190505b50925060005b81811015610eb65760408051602081018590529081018290526060016040516020818303038152906040528051906020012060001c848281518110610e9b57610e9b615bb2565b6020908102919091010152610eaf81615b1a565b9050610e54565b5050602080850180516000908152600f9092526040822082905551610edc908a856133e7565b60208a8101516000908152600690915260409020805491925090601890610f1290600160c01b90046001600160401b0316615b35565b91906101000a8154816001600160401b0302191690836001600160401b0316021790555060008960a0015160018b60a0015151610f4f9190615a62565b81518110610f5f57610f5f615bb2565b60209101015160f81c6001149050610f798786838c613482565b9750610f8a88828c602001516134b2565b6020808b015187820151604080518781526001600160601b038d16948101949094528415159084015284151560608401528b1515608084015290917faeb4b4786571e184246d39587f659abf0e26f41f6a3358692250382c0cdb47b79060a00160405180910390a3505050505050505b9392505050565b611009612efe565b61101281613605565b6110315780604051635428d44960e01b8152600401610a50919061561b565b60008060008061104086612b76565b945094505093509350336001600160a01b0316826001600160a01b0316146110a35760405162461bcd60e51b81526020600482015260166024820152752737ba1039bab139b1b934b83a34b7b71037bbb732b960511b6044820152606401610a50565b6110ac866113b3565b156110f25760405162461bcd60e51b815260206004820152601660248201527550656e64696e6720726571756573742065786973747360501b6044820152606401610a50565b6040805160c0810182526001815260208082018990526001600160a01b03851682840152606082018490526001600160601b038088166080840152861660a083015291519091600091611147918491016156cf565b604051602081830303815290604052905061116188613671565b505060405163ce3f471960e01b81526001600160a01b0388169063ce3f4719906001600160601b0388169061119a9085906004016156bc565b6000604051808303818588803b1580156111b357600080fd5b505af11580156111c7573d6000803e3d6000fd5b50506002546001600160a01b0316158015935091506111f0905057506001600160601b03861615155b156112ba5760025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611227908a908a90600401615662565b602060405180830381600087803b15801561124157600080fd5b505af1158015611255573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611279919061516c565b6112ba5760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610a50565b600c805460ff60301b1916600160301b17905560005b8351811015611361578381815181106112eb576112eb615bb2565b60200260200101516001600160a01b0316638ea98117896040518263ffffffff1660e01b815260040161131e919061561b565b600060405180830381600087803b15801561133857600080fd5b505af115801561134c573d6000803e3d6000fd5b505050508061135a90615b1a565b90506112d0565b50600c805460ff60301b191690556040517fd63ca8cb945956747ee69bfdc3ea754c24a4caf7418db70e46052f7850be4187906113a19089908b9061562f565b60405180910390a15050505050505050565b60008181526005602052604081206002018054806113d5575060009392505050565b600e5460005b828110156114b75760008482815481106113f7576113f7615bb2565b60009182526020822001546001600160a01b031691505b838110156114a457600061146c600e838154811061142e5761142e615bb2565b60009182526020808320909101546001600160a01b03871683526004825260408084208e855290925291205485908c906001600160401b0316613819565b506000818152600f6020526040902054909150156114935750600198975050505050505050565b5061149d81615b1a565b905061140e565b5050806114b090615b1a565b90506113db565b50600095945050505050565b6114cb612efe565b6114d3612e48565b6002546001600160a01b03166114fc5760405163c1f0c0a160e01b815260040160405180910390fd5b600b546001600160601b031661152557604051631e9acf1760e31b815260040160405180910390fd5b600b80546001600160601b031690819060006115418380615a9e565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555080600a60008282829054906101000a90046001600160601b03166115899190615a9e565b82546001600160601b039182166101009390930a92830291909202199091161790555060025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906115de9085908590600401615662565b602060405180830381600087803b1580156115f857600080fd5b505af115801561160c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611630919061516c565b61164d57604051631e9acf1760e31b815260040160405180910390fd5b5050565b611659612e48565b61166281613605565b15611682578060405163ac8a27ef60e01b8152600401610a50919061561b565b601180546001810182556000919091527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c680180546001600160a01b0319166001600160a01b0383161790556040517fb7cabbfc11e66731fc77de0444614282023bcbd41d16781c753a431d0af01625906116fd90839061561b565b60405180910390a150565b611710612e48565b6002546001600160a01b03161561173a57604051631688c53760e11b815260040160405180910390fd5b600280546001600160a01b039384166001600160a01b03199182161790915560038054929093169116179055565b6001546001600160a01b031633146117bb5760405162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b6044820152606401610a50565b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b61181a612e48565b60408051808201825260009161184991908590600290839083908082843760009201919091525061281f915050565b6000818152600d602052604090205490915060ff161561187f57604051634a0b8fa760e01b815260048101829052602401610a50565b60408051808201825260018082526001600160401b0385811660208085019182526000878152600d9091528581209451855492516001600160481b031990931690151568ffffffffffffffff00191617610100929093169190910291909117909255600e805491820181559091527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd01829055517f9b911b2c240bfbef3b6a8f7ed6ee321d1258bb2a3fe6becab52ac1cd3210afd390610a1790839085906156a5565b61194a612e48565b600a544790600160601b90046001600160601b03168181111561198a576040516354ced18160e11b81526004810182905260248101839052604401610a50565b81811015610c4957600061199e8284615a62565b90506000846001600160a01b03168260405160006040518083038185875af1925050503d80600081146119ed576040519150601f19603f3d011682016040523d82523d6000602084013e6119f2565b606091505b5050905080611a145760405163950b247960e01b815260040160405180910390fd5b7f4aed7c8eed0496c8c19ea2681fcca25741c1602342e38b045d9f1e8e905d2e9c8583604051611a4592919061562f565b60405180910390a15050505050565b611a5c612efe565b6000818152600560205260409020546001600160a01b0316611a9157604051630fb532db60e11b815260040160405180910390fd5b60008181526006602052604090208054600160601b90046001600160601b0316903490600c611ac08385615a0d565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555034600a600c8282829054906101000a90046001600160601b0316611b089190615a0d565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550817f7603b205d03651ee812f803fccde89f1012e545a9c99f0abfea9cedd0fd8e902823484611b5b91906159ae565b604080519283526020830191909152015b60405180910390a25050565b6000611b82612efe565b602080830135600081815260059092526040909120546001600160a01b0316611bbe57604051630fb532db60e11b815260040160405180910390fd5b33600090815260046020908152604080832084845291829052909120546001600160401b031680611c065782336040516379bfd40160e01b8152600401610a50929190615744565b600c5461ffff16611c1d606087016040880161532e565b61ffff161080611c40575060c8611c3a606087016040880161532e565b61ffff16115b15611c8657611c55606086016040870161532e565b600c5460405163539c34bb60e11b815261ffff92831660048201529116602482015260c86044820152606401610a50565b600c5462010000900463ffffffff16611ca56080870160608801615431565b63ffffffff161115611cf557611cc16080860160608701615431565b600c54604051637aebf00f60e11b815263ffffffff9283166004820152620100009091049091166024820152604401610a50565b6101f4611d0860a0870160808801615431565b63ffffffff161115611d4e57611d2460a0860160808701615431565b6040516311ce1afb60e21b815263ffffffff90911660048201526101f46024820152604401610a50565b611d5781615b35565b90506000611d688635338685613819565b90955090506000611d8c611d87611d8260a08a018a6158bc565b613892565b61390f565b905085611d97613980565b86611da860808b0160608c01615431565b611db860a08c0160808d01615431565b3386604051602001611dd097969594939291906157c7565b60405160208183030381529060405280519060200120600f600088815260200190815260200160002081905550336001600160a01b03168588600001357feb0e3652e0f44f417695e6e90f2f42c99b65cd7169074c5a654b16b9748c3a4e89868c6040016020810190611e43919061532e565b8d6060016020810190611e569190615431565b8e6080016020810190611e699190615431565b89604051611e7c96959493929190615788565b60405180910390a450506000928352602091909152604090912080546001600160401b0319166001600160401b039092169190911790555b919050565b6000611ec3612efe565b6007546001600160401b031633611edb600143615a62565b6040516001600160601b0319606093841b81166020830152914060348201523090921b1660548201526001600160c01b031960c083901b16606882015260700160408051601f1981840301815291905280516020909101209150611f408160016159c6565b600780546001600160401b0319166001600160401b03928316179055604080516000808252608082018352602080830182815283850183815260608086018581528a86526006855287862093518454935191516001600160601b039182166001600160c01b031990951694909417600160601b9190921602176001600160c01b0316600160c01b9290981691909102969096179055835194850184523385528481018281528585018481528884526005835294909220855181546001600160a01b03199081166001600160a01b03928316178355935160018301805490951691161790925592518051929493919261203e9260028501920190614d3c565b5061204e91506008905084613a10565b50827f1d3015d7ba850fa198dc7b1a3f5d42779313a681035f77c8c03764c61005518d3360405161207f919061561b565b60405180910390a2505090565b612094612efe565b6002546001600160a01b031633146120bf576040516344b0e3c360e01b815260040160405180910390fd5b602081146120e057604051638129bbcd60e01b815260040160405180910390fd5b60006120ee82840184615189565b6000818152600560205260409020549091506001600160a01b031661212657604051630fb532db60e11b815260040160405180910390fd5b600081815260066020526040812080546001600160601b03169186919061214d8385615a0d565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555084600a60008282829054906101000a90046001600160601b03166121959190615a0d565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550817f1ced9348ff549fceab2ac57cd3a9de38edaaab274b725ee82c23e8fc8c4eec7a8287846121e891906159ae565b6040805192835260208301919091520160405180910390a2505050505050565b612210612e48565b60c861ffff8a16111561224a5760405163539c34bb60e11b815261ffff8a1660048201819052602482015260c86044820152606401610a50565b6000851361226e576040516321ea67b360e11b815260048101869052602401610a50565b8363ffffffff168363ffffffff1611156122ab576040516313c06e5960e11b815263ffffffff808516600483015285166024820152604401610a50565b609b60ff831611156122dc57604051631d66288d60e11b815260ff83166004820152609b6024820152604401610a50565b609b60ff8216111561230d57604051631d66288d60e11b815260ff82166004820152609b6024820152604401610a50565b604080516101208101825261ffff8b1680825263ffffffff808c16602084018190526000848601528b8216606085018190528b8316608086018190528a841660a08701819052938a1660c0870181905260ff808b1660e08901819052908a16610100909801889052600c8054600160c01b90990260ff60c01b19600160b81b9093029290921661ffff60b81b19600160981b90940263ffffffff60981b19600160781b9099029890981667ffffffffffffffff60781b19600160581b90960263ffffffff60581b19600160381b9098029790971668ffffffffffffffffff60301b196201000090990265ffffffffffff19909c16909a179a909a1796909616979097179390931791909116959095179290921793909316929092179190911790556010869055517f2c6b6b12413678366b05b145c5f00745bdd00e739131ab5de82484a50c9d78b6906124c1908b908b908b908b908b908b908b908b908b9061ffff99909916895263ffffffff97881660208a0152958716604089015293861660608801526080870192909252841660a086015290921660c084015260ff91821660e0840152166101008201526101200190565b60405180910390a1505050505050505050565b6124dc612e48565b6000818152600560205260409020546001600160a01b03168061251257604051630fb532db60e11b815260040160405180910390fd5b61164d8282612f29565b6060600061252a6008613a1c565b905080841061254c57604051631390f2a160e01b815260040160405180910390fd5b600061255884866159ae565b905081811180612566575083155b6125705780612572565b815b905060006125808683615a62565b9050806001600160401b0381111561259a5761259a615bc8565b6040519080825280602002602001820160405280156125c3578160200160208202803683370190505b50935060005b81811015612613576125e66125de88836159ae565b600890613a26565b8582815181106125f8576125f8615bb2565b602090810291909101015261260c81615b1a565b90506125c9565b505050505b92915050565b612626612efe565b6000818152600560205260409020546001600160a01b03168061265c57604051630fb532db60e11b815260040160405180910390fd5b6000828152600560205260409020600101546001600160a01b031633146126b3576000828152600560205260409081902060010154905163d084e97560e01b8152610a50916001600160a01b03169060040161561b565b600082815260056020526040908190208054336001600160a01b031991821681178355600190920180549091169055905183917fd4114ab6e9af9f597c52041f32d62dc57c5c4e4c0d4427006069635e216c938691611b6c918591615648565b8161271d81612e9d565b612725612efe565b6000838152600560205260409020600201805460641415612759576040516305a48e0f60e01b815260040160405180910390fd5b6001600160a01b038316600090815260046020908152604080832087845291829052909120546001600160401b031615612794575050505050565b600085815260208281526040808320805460016001600160401b0319909116811790915585549081018655858452919092200180546001600160a01b0319166001600160a01b0387161790555185907f1e980d04aa7648e205713e5e8ea3808672ac163d10936d36f91b2c88ac1575e19061281090879061561b565b60405180910390a25050505050565b6000816040516020016128329190615684565b604051602081830303815290604052805190602001209050919050565b8161285981612e9d565b612861612efe565b61286a836113b3565b1561288857604051631685ecdd60e31b815260040160405180910390fd5b6001600160a01b03821660009081526004602090815260408083208684529091529020546001600160401b03166128d65782826040516379bfd40160e01b8152600401610a50929190615744565b60008381526005602090815260408083206002018054825181850281018501909352808352919290919083018282801561293957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161291b575b505050505090506000600182516129509190615a62565b905060005b8251811015612a5a57846001600160a01b031683828151811061297a5761297a615bb2565b60200260200101516001600160a01b03161415612a4a5760008383815181106129a5576129a5615bb2565b60200260200101519050806005600089815260200190815260200160002060020183815481106129d7576129d7615bb2565b600091825260208083209190910180546001600160a01b0319166001600160a01b039490941693909317909255888152600590915260409020600201805480612a2257612a22615b9c565b600082815260209020810160001990810180546001600160a01b031916905501905550612a5a565b612a5381615b1a565b9050612955565b506001600160a01b03841660009081526004602090815260408083208884529091529081902080546001600160401b03191690555185907f32158c6058347c1601b2d12bc696ac6901d8a9a9aa3ba10c27ab0a983e8425a79061281090879061561b565b600e8181548110612ace57600080fd5b600091825260209091200154905081565b81612ae981612e9d565b612af1612efe565b600083815260056020526040902060018101546001600160a01b03848116911614612b70576001810180546001600160a01b0319166001600160a01b03851617905560405184907f21a4dad170a6bf476c31bbcf4a16628295b0e450672eec25d7c93308e05344a190612b679033908790615648565b60405180910390a25b50505050565b600081815260056020526040812054819081906001600160a01b0316606081612bb257604051630fb532db60e11b815260040160405180910390fd5b600086815260066020908152604080832054600583529281902060020180548251818502810185019093528083526001600160601b0380861695600160601b810490911694600160c01b9091046001600160401b0316938893929091839190830182828015612c4a57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612c2c575b505050505090509450945094509450945091939590929450565b612c6c612e48565b6002546001600160a01b0316612c955760405163c1f0c0a160e01b815260040160405180910390fd5b6002546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612cc690309060040161561b565b60206040518083038186803b158015612cde57600080fd5b505afa158015612cf2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d1691906151a2565b600a549091506001600160601b031681811115612d50576040516354ced18160e11b81526004810182905260248101839052604401610a50565b81811015610c49576000612d648284615a62565b60025460405163a9059cbb60e01b81529192506001600160a01b03169063a9059cbb90612d97908790859060040161562f565b602060405180830381600087803b158015612db157600080fd5b505af1158015612dc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612de9919061516c565b612e0657604051631f01ff1360e21b815260040160405180910390fd5b7f59bfc682b673f8cbf945f1e454df9334834abf7dfe7f92237ca29ecb9b4366008482604051610bf892919061562f565b612e3f612e48565b610a5981613a32565b6000546001600160a01b03163314612e9b5760405162461bcd60e51b815260206004820152601660248201527527b7363c9031b0b63630b1363290313c9037bbb732b960511b6044820152606401610a50565b565b6000818152600560205260409020546001600160a01b031680612ed357604051630fb532db60e11b815260040160405180910390fd5b336001600160a01b0382161461164d5780604051636c51fda960e11b8152600401610a50919061561b565b600c54600160301b900460ff1615612e9b5760405163769dd35360e11b815260040160405180910390fd5b600080612f3584613671565b60025491935091506001600160a01b031615801590612f5c57506001600160601b03821615155b1561300b5760025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90612f9c9086906001600160601b0387169060040161562f565b602060405180830381600087803b158015612fb657600080fd5b505af1158015612fca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fee919061516c565b61300b57604051631e9acf1760e31b815260040160405180910390fd5b6000836001600160a01b0316826001600160601b031660405160006040518083038185875af1925050503d8060008114613061576040519150601f19603f3d011682016040523d82523d6000602084013e613066565b606091505b50509050806130885760405163950b247960e01b815260040160405180910390fd5b604080516001600160a01b03861681526001600160601b03808616602083015284169181019190915285907f8c74ce8b8cf87f5eb001275c8be27eb34ea2b62bfab6814fcc62192bb63e81c490606001612810565b6040805160a08101825260006060820181815260808301829052825260208201819052918101919091526000613116846000015161281f565b6000818152600d602090815260409182902082518084019093525460ff811615158084526101009091046001600160401b0316918301919091529192509061317457604051631dfd6e1360e21b815260048101839052602401610a50565b6000828660800151604051602001613196929190918252602082015260400190565b60408051601f1981840301815291815281516020928301206000818152600f909352912054909150806131dc57604051631b44092560e11b815260040160405180910390fd5b85516020808801516040808a015160608b015160808c015160a08d0151935161320b978a979096959101615813565b6040516020818303038152906040528051906020012081146132405760405163354a450b60e21b815260040160405180910390fd5b600061324f8760000151613ad6565b905080613327578651604051631d2827a760e31b81526001600160401b0390911660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e9413d389060240160206040518083038186803b1580156132c157600080fd5b505afa1580156132d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132f991906151a2565b90508061332757865160405163175dadad60e01b81526001600160401b039091166004820152602401610a50565b6000886080015182604051602001613349929190918252602082015260400190565b6040516020818303038152906040528051906020012060001c905060006133708a83613bb8565b604080516060810182529788526020880196909652948601949094525092979650505050505050565b6000816001600160401b03163a11156133df5782156133c257506001600160401b038116612618565b3a8260405163435e532d60e11b8152600401610a509291906156a5565b503a92915050565b6000806000631fe543e360e01b868560405160240161340792919061576f565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252600c805460ff60301b1916600160301b17905590860151608087015191925061346b9163ffffffff9091169083613c23565b600c805460ff60301b191690559695505050505050565b6000821561349c57613495858584613c6f565b90506134aa565b6134a7858584613d80565b90505b949350505050565b600081815260066020526040902082156135715780546001600160601b03600160601b90910481169085168110156134fd57604051631e9acf1760e31b815260040160405180910390fd5b6135078582615a9e565b8254600160601b600160c01b031916600160601b6001600160601b039283168102919091178455600b805488939192600c92613547928692900416615a0d565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555050612b70565b80546001600160601b039081169085168110156135a157604051631e9acf1760e31b815260040160405180910390fd5b6135ab8582615a9e565b82546001600160601b0319166001600160601b03918216178355600b805487926000916135da91859116615a0d565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505050505050565b601154600090815b8181101561366757836001600160a01b03166011828154811061363257613632615bb2565b6000918252602090912001546001600160a01b03161415613657575060019392505050565b61366081615b1a565b905061360d565b5060009392505050565b60008181526005602090815260408083206006909252822054600290910180546001600160601b0380841694600160601b90940416925b8181101561371357600460008483815481106136c6576136c6615bb2565b60009182526020808320909101546001600160a01b031683528281019390935260409182018120898252909252902080546001600160401b031916905561370c81615b1a565b90506136a8565b50600085815260056020526040812080546001600160a01b0319908116825560018201805490911690559061374b6002830182614da1565b5050600085815260066020526040812055613767600886613f69565b506001600160601b038416156137ba57600a80548591906000906137959084906001600160601b0316615a9e565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505b6001600160601b038316156138125782600a600c8282829054906101000a90046001600160601b03166137ed9190615a9e565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505b5050915091565b6040805160208082018790526001600160a01b03959095168183015260608101939093526001600160401b03919091166080808401919091528151808403909101815260a08301825280519084012060c083019490945260e0808301859052815180840390910181526101009092019052805191012091565b604080516020810190915260008152816138bb5750604080516020810190915260008152612618565b63125fa26760e31b6138cd8385615abe565b6001600160e01b031916146138f557604051632923fee760e11b815260040160405180910390fd5b6139028260048186615984565b810190610ffa91906151bb565b60607f92fd13387c7fe7befbc38d303d6468778fb9731bc4583f17d92989c6fcfdeaaa8260405160240161394891511515815260200190565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915292915050565b60004661398c81613f75565b15613a095760646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b815260040160206040518083038186803b1580156139cb57600080fd5b505afa1580156139df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a0391906151a2565b91505090565b4391505090565b6000610ffa8383613f98565b6000612618825490565b6000610ffa8383613fe7565b6001600160a01b038116331415613a855760405162461bcd60e51b815260206004820152601760248201527621b0b73737ba103a3930b739b332b9103a379039b2b63360491b6044820152606401610a50565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600046613ae281613f75565b15613ba957610100836001600160401b0316613afc613980565b613b069190615a62565b1180613b225750613b15613980565b836001600160401b031610155b15613b305750600092915050565b6040516315a03d4160e11b81526001600160401b0384166004820152606490632b407a82906024015b60206040518083038186803b158015613b7157600080fd5b505afa158015613b85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ffa91906151a2565b50506001600160401b03164090565b6000613bec8360000151846020015185604001518660600151868860a001518960c001518a60e001518b6101000151614011565b60038360200151604051602001613c0492919061575b565b60408051601f1981840301815291905280516020909101209392505050565b60005a611388811015613c3557600080fd5b611388810390508460408204820311613c4d57600080fd5b50823b613c5957600080fd5b60008083516020850160008789f1949350505050565b600080613cb26000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061422d92505050565b905060005a600c54613cd2908890600160581b900463ffffffff166159ae565b613cdc9190615a62565b613ce69086615a43565b600c54909150600090613d0b90600160781b900463ffffffff1664e8d4a51000615a43565b90508415613d5757600c548190606490600160b81b900460ff16613d2f85876159ae565b613d399190615a43565b613d439190615a2f565b613d4d91906159ae565b9350505050610ffa565b600c548190606490613d7390600160b81b900460ff16826159e8565b60ff16613d2f85876159ae565b600080613d8b6142fb565b905060008113613db1576040516321ea67b360e11b815260048101829052602401610a50565b6000613df36000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061422d92505050565b9050600082825a600c54613e15908b90600160581b900463ffffffff166159ae565b613e1f9190615a62565b613e299089615a43565b613e3391906159ae565b613e4590670de0b6b3a7640000615a43565b613e4f9190615a2f565b600c54909150600090613e789063ffffffff600160981b8204811691600160781b900416615a79565b613e8d9063ffffffff1664e8d4a51000615a43565b9050600084613ea483670de0b6b3a7640000615a43565b613eae9190615a2f565b905060008715613eef57600c548290606490613ed490600160c01b900460ff1687615a43565b613ede9190615a2f565b613ee891906159ae565b9050613f2f565b600c548290606490613f0b90600160c01b900460ff16826159e8565b613f189060ff1687615a43565b613f229190615a2f565b613f2c91906159ae565b90505b6b033b2e3c9fd0803ce8000000811115613f5c5760405163e80fa38160e01b815260040160405180910390fd5b9998505050505050505050565b6000610ffa83836143ca565b600061a4b1821480613f89575062066eed82145b8061261857505062066eee1490565b6000818152600183016020526040812054613fdf57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155612618565b506000612618565b6000826000018281548110613ffe57613ffe615bb2565b9060005260206000200154905092915050565b61401a896144bd565b6140635760405162461bcd60e51b815260206004820152601a6024820152797075626c6963206b6579206973206e6f74206f6e20637572766560301b6044820152606401610a50565b61406c886144bd565b6140b05760405162461bcd60e51b815260206004820152601560248201527467616d6d61206973206e6f74206f6e20637572766560581b6044820152606401610a50565b6140b9836144bd565b6141055760405162461bcd60e51b815260206004820152601d60248201527f6347616d6d615769746e657373206973206e6f74206f6e2063757276650000006044820152606401610a50565b61410e826144bd565b61415a5760405162461bcd60e51b815260206004820152601c60248201527f73486173685769746e657373206973206e6f74206f6e206375727665000000006044820152606401610a50565b614166878a8887614580565b6141ae5760405162461bcd60e51b81526020600482015260196024820152786164647228632a706b2b732a6729213d5f755769746e65737360381b6044820152606401610a50565b60006141ba8a876146a3565b905060006141cd898b878b868989614707565b905060006141de838d8d8a86614826565b9050808a1461421f5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b210383937b7b360991b6044820152606401610a50565b505050505050505050505050565b60004661423981613f75565b1561427857606c6001600160a01b031663c6f7de0e6040518163ffffffff1660e01b815260040160206040518083038186803b158015613b7157600080fd5b61428181614866565b156142f257600f602160991b016001600160a01b03166349948e0e84604051806080016040528060488152602001615c02604891396040516020016142c7929190615571565b6040516020818303038152906040526040518263ffffffff1660e01b8152600401613b5991906156bc565b50600092915050565b600c5460035460408051633fabe5a360e21b81529051600093600160381b900463ffffffff169284926001600160a01b039091169163feaf968c9160048082019260a092909190829003018186803b15801561435657600080fd5b505afa15801561436a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061438e919061544c565b50919550909250505063ffffffff8216158015906143ba57506143b18142615a62565b8263ffffffff16105b156143c55760105492505b505090565b600081815260018301602052604081205480156144b35760006143ee600183615a62565b855490915060009061440290600190615a62565b905081811461446757600086600001828154811061442257614422615bb2565b906000526020600020015490508087600001848154811061444557614445615bb2565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061447857614478615b9c565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612618565b6000915050612618565b80516000906401000003d0191161450b5760405162461bcd60e51b8152602060048201526012602482015271696e76616c696420782d6f7264696e61746560701b6044820152606401610a50565b60208201516401000003d019116145595760405162461bcd60e51b8152602060048201526012602482015271696e76616c696420792d6f7264696e61746560701b6044820152606401610a50565b60208201516401000003d0199080096145798360005b60200201516148a0565b1492915050565b60006001600160a01b0382166145c65760405162461bcd60e51b815260206004820152600b60248201526a626164207769746e65737360a81b6044820152606401610a50565b6020840151600090600116156145dd57601c6145e0565b601b5b9050600070014551231950b75fc4402da1732fc9bebe1985876000602002015109865170014551231950b75fc4402da1732fc9bebe19918203925060009190890987516040805160008082526020820180845287905260ff88169282019290925260608101929092526080820183905291925060019060a0016020604051602081039080840390855afa15801561467b573d6000803e3d6000fd5b5050604051601f1901516001600160a01b039081169088161495505050505050949350505050565b6146ab614dbf565b6146d8600184846040516020016146c4939291906155fa565b6040516020818303038152906040526148c4565b90505b6146e4816144bd565b61261857805160408051602081019290925261470091016146c4565b90506146db565b61470f614dbf565b825186516401000003d019908190069106141561476e5760405162461bcd60e51b815260206004820152601e60248201527f706f696e747320696e2073756d206d7573742062652064697374696e637400006044820152606401610a50565b614779878988614912565b6147be5760405162461bcd60e51b8152602060048201526016602482015275119a5c9cdd081b5d5b0818da1958dac819985a5b195960521b6044820152606401610a50565b6147c9848685614912565b61480f5760405162461bcd60e51b815260206004820152601760248201527614d958dbdb99081b5d5b0818da1958dac819985a5b1959604a1b6044820152606401610a50565b61481a868484614a3a565b98975050505050505050565b600060028686868587604051602001614844969594939291906155a0565b60408051601f1981840301815291905280516020909101209695505050505050565b6000600a82148061487857506101a482145b80614885575062aa37dc82145b80614891575061210582145b8061261857505062014a331490565b6000806401000003d01980848509840990506401000003d019600782089392505050565b6148cc614dbf565b6148d582614afd565b81526148ea6148e582600061456f565b614b38565b602082018190526002900660011415611eb4576020810180516401000003d019039052919050565b60008261494f5760405162461bcd60e51b815260206004820152600b60248201526a3d32b9379039b1b0b630b960a91b6044820152606401610a50565b8351602085015160009061496590600290615b5c565b1561497157601c614974565b601b5b9050600070014551231950b75fc4402da1732fc9bebe198387096040805160008082526020820180845281905260ff86169282019290925260608101869052608081018390529192509060019060a0016020604051602081039080840390855afa1580156149e6573d6000803e3d6000fd5b505050602060405103519050600086604051602001614a05919061555f565b60408051601f1981840301815291905280516020909101206001600160a01b0392831692169190911498975050505050505050565b614a42614dbf565b835160208086015185519186015160009384938493614a6393909190614b58565b919450925090506401000003d019858209600114614abf5760405162461bcd60e51b815260206004820152601960248201527834b73b2d1036bab9ba1031329034b73b32b939b29037b3103d60391b6044820152606401610a50565b60405180604001604052806401000003d01980614ade57614ade615b86565b87860981526020016401000003d0198785099052979650505050505050565b805160208201205b6401000003d0198110611eb457604080516020808201939093528151808203840181529082019091528051910120614b05565b6000612618826002614b516401000003d01960016159ae565b901c614c38565b60008080600180826401000003d019896401000003d019038808905060006401000003d0198b6401000003d019038a0890506000614b9883838585614ccf565b9098509050614ba988828e88614cf3565b9098509050614bba88828c87614cf3565b90985090506000614bcd8d878b85614cf3565b9098509050614bde88828686614ccf565b9098509050614bef88828e89614cf3565b9098509050818114614c24576401000003d019818a0998506401000003d01982890997506401000003d0198183099650614c28565b8196505b5050505050509450945094915050565b600080614c43614ddd565b6020808252818101819052604082015260608101859052608081018490526401000003d01960a0820152614c75614dfb565b60208160c0846005600019fa925082614cc55760405162461bcd60e51b81526020600482015260126024820152716269674d6f64457870206661696c7572652160701b6044820152606401610a50565b5195945050505050565b6000806401000003d0198487096401000003d0198487099097909650945050505050565b600080806401000003d019878509905060006401000003d01987876401000003d019030990506401000003d0198183086401000003d01986890990999098509650505050505050565b828054828255906000526020600020908101928215614d91579160200282015b82811115614d9157825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614d5c565b50614d9d929150614e19565b5090565b5080546000825590600052602060002090810190610a599190614e19565b60405180604001604052806002906020820280368337509192915050565b6040518060c001604052806006906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b5b80821115614d9d5760008155600101614e1a565b8035611eb481615bde565b806040810183101561261857600080fd5b600082601f830112614e5b57600080fd5b604051604081018181106001600160401b0382111715614e7d57614e7d615bc8565b8060405250808385604086011115614e9457600080fd5b60005b6002811015614eb6578135835260209283019290910190600101614e97565b509195945050505050565b8035611eb481615bf3565b600060c08284031215614ede57600080fd5b614ee6615909565b9050614ef182614fe0565b815260208083013581830152614f0960408401614fcc565b6040830152614f1a60608401614fcc565b60608301526080830135614f2d81615bde565b608083015260a08301356001600160401b0380821115614f4c57600080fd5b818501915085601f830112614f6057600080fd5b813581811115614f7257614f72615bc8565b614f84601f8201601f19168501615954565b91508082528684828501011115614f9a57600080fd5b80848401858401376000848284010152508060a085015250505092915050565b803561ffff81168114611eb457600080fd5b803563ffffffff81168114611eb457600080fd5b80356001600160401b0381168114611eb457600080fd5b803560ff81168114611eb457600080fd5b805169ffffffffffffffffffff81168114611eb457600080fd5b60006020828403121561503457600080fd5b8135610ffa81615bde565b6000806040838503121561505257600080fd5b823561505d81615bde565b9150602083013561506d81615bde565b809150509250929050565b6000806000806060858703121561508e57600080fd5b843561509981615bde565b93506020850135925060408501356001600160401b03808211156150bc57600080fd5b818701915087601f8301126150d057600080fd5b8135818111156150df57600080fd5b8860208285010111156150f157600080fd5b95989497505060200194505050565b60006040828403121561511257600080fd5b610ffa8383614e39565b6000806060838503121561512f57600080fd5b6151398484614e39565b915061514760408401614fe0565b90509250929050565b60006040828403121561516257600080fd5b610ffa8383614e4a565b60006020828403121561517e57600080fd5b8151610ffa81615bf3565b60006020828403121561519b57600080fd5b5035919050565b6000602082840312156151b457600080fd5b5051919050565b6000602082840312156151cd57600080fd5b604051602081018181106001600160401b03821117156151ef576151ef615bc8565b60405282356151fd81615bf3565b81529392505050565b60008060008385036101e081121561521d57600080fd5b6101a08082121561522d57600080fd5b615235615931565b91506152418787614e4a565b82526152508760408801614e4a565b60208301526080860135604083015260a0860135606083015260c0860135608083015261527f60e08701614e2e565b60a083015261010061529388828901614e4a565b60c08401526152a6886101408901614e4a565b60e0840152610180870135908301529093508401356001600160401b038111156152cf57600080fd5b6152db86828701614ecc565b9250506152eb6101c08501614ec1565b90509250925092565b60006020828403121561530657600080fd5b81356001600160401b0381111561531c57600080fd5b820160c08185031215610ffa57600080fd5b60006020828403121561534057600080fd5b610ffa82614fba565b60008060008060008060008060006101208a8c03121561536857600080fd5b6153718a614fba565b985061537f60208b01614fcc565b975061538d60408b01614fcc565b965061539b60608b01614fcc565b955060808a013594506153b060a08b01614fcc565b93506153be60c08b01614fcc565b92506153cc60e08b01614ff7565b91506153db6101008b01614ff7565b90509295985092959850929598565b600080604083850312156153fd57600080fd5b82359150602083013561506d81615bde565b6000806040838503121561542257600080fd5b50508035926020909101359150565b60006020828403121561544357600080fd5b610ffa82614fcc565b600080600080600060a0868803121561546457600080fd5b61546d86615008565b945060208601519350604086015192506060860151915061549060808701615008565b90509295509295909350565b600081518084526020808501945080840160005b838110156154d55781516001600160a01b0316875295820195908201906001016154b0565b509495945050505050565b8060005b6002811015612b705781518452602093840193909101906001016154e4565b600081518084526020808501945080840160005b838110156154d557815187529582019590820190600101615517565b6000815180845261554b816020860160208601615aee565b601f01601f19169290920160200192915050565b61556981836154e0565b604001919050565b60008351615583818460208801615aee565b835190830190615597818360208801615aee565b01949350505050565b8681526155b060208201876154e0565b6155bd60608201866154e0565b6155ca60a08201856154e0565b6155d760e08201846154e0565b60609190911b6001600160601b0319166101208201526101340195945050505050565b83815261560a60208201846154e0565b606081019190915260800192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039290921682526001600160601b0316602082015260400190565b6040810161261882846154e0565b602081526000610ffa6020830184615503565b9182526001600160401b0316602082015260400190565b602081526000610ffa6020830184615533565b6020815260ff82511660208201526020820151604082015260018060a01b0360408301511660608201526000606083015160c0608084015261571460e084018261549c565b60808501516001600160601b0390811660a0868101919091529095015190941660c0909301929092525090919050565b9182526001600160a01b0316602082015260400190565b82815260608101610ffa60208301846154e0565b8281526040602082015260006134aa6040830184615503565b86815285602082015261ffff85166040820152600063ffffffff808616606084015280851660808401525060c060a083015261481a60c0830184615533565b878152602081018790526040810186905263ffffffff8581166060830152841660808201526001600160a01b03831660a082015260e060c08201819052600090613f5c90830184615533565b8781526001600160401b03871660208201526040810186905263ffffffff8581166060830152841660808201526001600160a01b03831660a082015260e060c08201819052600090613f5c90830184615533565b6001600160601b038681168252851660208201526001600160401b03841660408201526001600160a01b038316606082015260a0608082018190526000906158b19083018461549c565b979650505050505050565b6000808335601e198436030181126158d357600080fd5b8301803591506001600160401b038211156158ed57600080fd5b60200191503681900382131561590257600080fd5b9250929050565b60405160c081016001600160401b038111828210171561592b5761592b615bc8565b60405290565b60405161012081016001600160401b038111828210171561592b5761592b615bc8565b604051601f8201601f191681016001600160401b038111828210171561597c5761597c615bc8565b604052919050565b6000808585111561599457600080fd5b838611156159a157600080fd5b5050820193919092039150565b600082198211156159c1576159c1615b70565b500190565b60006001600160401b0380831681851680830382111561559757615597615b70565b600060ff821660ff84168060ff03821115615a0557615a05615b70565b019392505050565b60006001600160601b0382811684821680830382111561559757615597615b70565b600082615a3e57615a3e615b86565b500490565b6000816000190483118215151615615a5d57615a5d615b70565b500290565b600082821015615a7457615a74615b70565b500390565b600063ffffffff83811690831681811015615a9657615a96615b70565b039392505050565b60006001600160601b0383811690831681811015615a9657615a96615b70565b6001600160e01b03198135818116916004851015615ae65780818660040360031b1b83161692505b505092915050565b60005b83811015615b09578181015183820152602001615af1565b83811115612b705750506000910152565b6000600019821415615b2e57615b2e615b70565b5060010190565b60006001600160401b0380831681811415615b5257615b52615b70565b6001019392505050565b600082615b6b57615b6b615b86565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610a5957600080fd5b8015158114610a5957600080fdfe307866666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666a164736f6c6343000806000a", } var VRFCoordinatorV25ABI = VRFCoordinatorV25MetaData.ABI diff --git a/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt index ac7e9a2acff..280859047c6 100644 --- a/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -93,7 +93,7 @@ vrf_consumer_v2_upgradeable_example: ../../contracts/solc/v0.8.6/VRFConsumerV2Up vrf_coordinator_mock: ../../contracts/solc/v0.8.6/VRFCoordinatorMock/VRFCoordinatorMock.abi ../../contracts/solc/v0.8.6/VRFCoordinatorMock/VRFCoordinatorMock.bin 5c495cf8df1f46d8736b9150cdf174cce358cb8352f60f0d5bb9581e23920501 vrf_coordinator_test_v2: ../../contracts/solc/v0.8.6/VRFCoordinatorTestV2/VRFCoordinatorTestV2.abi ../../contracts/solc/v0.8.6/VRFCoordinatorTestV2/VRFCoordinatorTestV2.bin eaefd785c38bac67fb11a7fc2737ab2da68c988ca170e7db8ff235c80893e01c vrf_coordinator_v2: ../../contracts/solc/v0.8.6/VRFCoordinatorV2/VRFCoordinatorV2.abi ../../contracts/solc/v0.8.6/VRFCoordinatorV2/VRFCoordinatorV2.bin 295f35ce282060317dfd01f45959f5a2b05ba26913e422fbd4fb6bf90b107006 -vrf_coordinator_v2_5: ../../contracts/solc/v0.8.6/VRFCoordinatorV2_5/VRFCoordinatorV2_5.abi ../../contracts/solc/v0.8.6/VRFCoordinatorV2_5/VRFCoordinatorV2_5.bin 4d531bc128b1a5bd8fb13d562b00fc15f450c020c9f9cc30b63bb8a461b2508f +vrf_coordinator_v2_5: ../../contracts/solc/v0.8.6/VRFCoordinatorV2_5/VRFCoordinatorV2_5.abi ../../contracts/solc/v0.8.6/VRFCoordinatorV2_5/VRFCoordinatorV2_5.bin e494ede10f7b28af91de4f210b98382c7e9be7064c46e2077af7534df8555124 vrf_coordinator_v2_plus_v2_example: ../../contracts/solc/v0.8.6/VRFCoordinatorV2Plus_V2Example/VRFCoordinatorV2Plus_V2Example.abi ../../contracts/solc/v0.8.6/VRFCoordinatorV2Plus_V2Example/VRFCoordinatorV2Plus_V2Example.bin 4a5b86701983b1b65f0a8dfa116b3f6d75f8f706fa274004b57bdf5992e4cec3 vrf_coordinator_v2plus_interface: ../../contracts/solc/v0.8.6/IVRFCoordinatorV2PlusInternal/IVRFCoordinatorV2PlusInternal.abi ../../contracts/solc/v0.8.6/IVRFCoordinatorV2PlusInternal/IVRFCoordinatorV2PlusInternal.bin 86b8e23aab28c5b98e3d2384dc4f702b093e382dc985c88101278e6e4bf6f7b8 vrf_external_sub_owner_example: ../../contracts/solc/v0.8.6/VRFExternalSubOwnerExample/VRFExternalSubOwnerExample.abi ../../contracts/solc/v0.8.6/VRFExternalSubOwnerExample/VRFExternalSubOwnerExample.bin 14f888eb313930b50233a6f01ea31eba0206b7f41a41f6311670da8bb8a26963 From f9b9d337a44fdbab3fc5a4bae12d209753454f12 Mon Sep 17 00:00:00 2001 From: Lee Yik Jiun Date: Wed, 13 Mar 2024 00:02:15 +0800 Subject: [PATCH 10/15] Combine setLink and setLinkNativeFeed into a single function (#12368) --- .../src/v0.8/vrf/dev/VRFV2PlusWrapper.sol | 11 ++----- .../test/v0.8/foundry/vrf/VRFV2Wrapper.t.sol | 5 ++- .../vrfv2plus_wrapper/vrfv2plus_wrapper.go | 32 ++++++------------- ...rapper-dependency-versions-do-not-edit.txt | 2 +- 4 files changed, 15 insertions(+), 35 deletions(-) diff --git a/contracts/src/v0.8/vrf/dev/VRFV2PlusWrapper.sol b/contracts/src/v0.8/vrf/dev/VRFV2PlusWrapper.sol index a724b70a3d8..625ee1287b1 100644 --- a/contracts/src/v0.8/vrf/dev/VRFV2PlusWrapper.sol +++ b/contracts/src/v0.8/vrf/dev/VRFV2PlusWrapper.sol @@ -143,22 +143,17 @@ contract VRFV2PlusWrapper is ConfirmedOwner, TypeAndVersionInterface, VRFConsume } /** - * @notice set the link token to be used by this wrapper + * @notice set the link token and link native feed to be used by this wrapper * @param link address of the link token + * @param linkNativeFeed address of the link native feed */ - function setLINK(address link) external onlyOwner { + function setLinkAndLinkNativeFeed(address link, address linkNativeFeed) external onlyOwner { // Disallow re-setting link token because the logic wouldn't really make sense if (address(s_link) != address(0)) { revert LinkAlreadySet(); } s_link = LinkTokenInterface(link); - } - /** - * @notice set the link native feed to be used by this wrapper - * @param linkNativeFeed address of the link native feed - */ - function setLinkNativeFeed(address linkNativeFeed) external onlyOwner { s_linkNativeFeed = AggregatorV3Interface(linkNativeFeed); } diff --git a/contracts/test/v0.8/foundry/vrf/VRFV2Wrapper.t.sol b/contracts/test/v0.8/foundry/vrf/VRFV2Wrapper.t.sol index a843f31911f..29f4469a8eb 100644 --- a/contracts/test/v0.8/foundry/vrf/VRFV2Wrapper.t.sol +++ b/contracts/test/v0.8/foundry/vrf/VRFV2Wrapper.t.sol @@ -109,14 +109,13 @@ contract VRFV2PlusWrapperTest is BaseTest { VRFV2PlusWrapper wrapper = new VRFV2PlusWrapper(address(0), address(0), address(s_testCoordinator)); // Set LINK and LINK/Native feed on wrapper. - wrapper.setLINK(address(s_linkToken)); - wrapper.setLinkNativeFeed(address(s_linkNativeFeed)); + wrapper.setLinkAndLinkNativeFeed(address(s_linkToken), address(s_linkNativeFeed)); assertEq(address(wrapper.s_link()), address(s_linkToken)); assertEq(address(wrapper.s_linkNativeFeed()), address(s_linkNativeFeed)); // Revert for subsequent assignment. vm.expectRevert(VRFV2PlusWrapper.LinkAlreadySet.selector); - wrapper.setLINK(address(s_linkToken)); + wrapper.setLinkAndLinkNativeFeed(address(s_linkToken), address(s_linkNativeFeed)); // Consumer can set LINK token. VRFV2PlusWrapperConsumerExample consumer = new VRFV2PlusWrapperConsumerExample(address(0), address(wrapper)); diff --git a/core/gethwrappers/generated/vrfv2plus_wrapper/vrfv2plus_wrapper.go b/core/gethwrappers/generated/vrfv2plus_wrapper/vrfv2plus_wrapper.go index 5a5ccb34f1d..167ba3d1425 100644 --- a/core/gethwrappers/generated/vrfv2plus_wrapper/vrfv2plus_wrapper.go +++ b/core/gethwrappers/generated/vrfv2plus_wrapper/vrfv2plus_wrapper.go @@ -31,8 +31,8 @@ var ( ) var VRFV2PlusWrapperMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_link\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_linkNativeFeed\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_coordinator\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"FailedToTransferLink\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"expectedMinimumLength\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"actualLength\",\"type\":\"uint16\"}],\"name\":\"IncorrectExtraArgsLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LINKPaymentInRequestRandomWordsInNative\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkAlreadySet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NativePaymentInOnTokenTransfer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"have\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"want\",\"type\":\"address\"}],\"name\":\"OnlyCoordinatorCanFulfill\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"have\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"coordinator\",\"type\":\"address\"}],\"name\":\"OnlyOwnerOrCoordinator\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"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\":true,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"WrapperFulfillmentFailed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"SUBSCRIPTION_ID\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_callbackGasLimit\",\"type\":\"uint32\"}],\"name\":\"calculateRequestPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_callbackGasLimit\",\"type\":\"uint32\"}],\"name\":\"calculateRequestPriceNative\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"isLinkMode\",\"type\":\"bool\"}],\"name\":\"checkPaymentMode\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"disable\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enable\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"_requestGasPriceWei\",\"type\":\"uint256\"}],\"name\":\"estimateRequestPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"_requestGasPriceWei\",\"type\":\"uint256\"}],\"name\":\"estimateRequestPriceNative\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConfig\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"fallbackWeiPerUnitLink\",\"type\":\"int256\"},{\"internalType\":\"uint32\",\"name\":\"stalenessSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeLinkPPM\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeNativePPM\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"wrapperGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"coordinatorGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"wrapperPremiumPercentage\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"maxNumWords\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastRequestId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newCoordinator\",\"type\":\"address\"}],\"name\":\"migrate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"onTokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"internalType\":\"uint256[]\",\"name\":\"randomWords\",\"type\":\"uint256[]\"}],\"name\":\"rawFulfillRandomWords\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"_requestConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"_numWords\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"name\":\"requestRandomWordsInNative\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"s_callbacks\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"callbackAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"requestGasPrice\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_configured\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_disabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_fulfillmentTxSizeBytes\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_link\",\"outputs\":[{\"internalType\":\"contractLinkTokenInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_linkNativeFeed\",\"outputs\":[{\"internalType\":\"contractAggregatorV3Interface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_vrfCoordinator\",\"outputs\":[{\"internalType\":\"contractIVRFCoordinatorV2Plus\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_wrapperGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"_coordinatorGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"_wrapperPremiumPercentage\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"_keyHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"_maxNumWords\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"_stalenessSeconds\",\"type\":\"uint32\"},{\"internalType\":\"int256\",\"name\":\"_fallbackWeiPerUnitLink\",\"type\":\"int256\"},{\"internalType\":\"uint32\",\"name\":\"_fulfillmentFlatFeeLinkPPM\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"_fulfillmentFlatFeeNativePPM\",\"type\":\"uint32\"}],\"name\":\"setConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_vrfCoordinator\",\"type\":\"address\"}],\"name\":\"setCoordinator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"size\",\"type\":\"uint32\"}],\"name\":\"setFulfillmentTxSize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"link\",\"type\":\"address\"}],\"name\":\"setLINK\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"linkNativeFeed\",\"type\":\"address\"}],\"name\":\"setLinkNativeFeed\",\"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\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNative\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60a06040526007805463ffffffff60201b1916650244000000001790553480156200002957600080fd5b506040516200366e3803806200366e8339810160408190526200004c9162000323565b803380600081620000a45760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000d757620000d7816200025a565b5050600280546001600160a01b0319166001600160a01b03938416179055508316156200012857600680546001600160601b03166c010000000000000000000000006001600160a01b038616021790555b6001600160a01b038216156200016257600780546001600160601b03166c010000000000000000000000006001600160a01b038516021790555b6002546040805163288688f960e21b815290516000926001600160a01b03169163a21a23e491600480830192602092919082900301818787803b158015620001a957600080fd5b505af1158015620001be573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001e491906200036d565b6080819052600254604051632fb1302360e21b8152600481018390523060248201529192506001600160a01b03169063bec4c08c90604401600060405180830381600087803b1580156200023757600080fd5b505af11580156200024c573d6000803e3d6000fd5b505050505050505062000387565b6001600160a01b038116331415620002b55760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200009b565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b03811681146200031e57600080fd5b919050565b6000806000606084860312156200033957600080fd5b620003448462000306565b9250620003546020850162000306565b9150620003646040850162000306565b90509250925092565b6000602082840312156200038057600080fd5b5051919050565b6080516132b6620003b8600039600081816101fa015281816112690152818161183a0152611c3201526132b66000f3fe6080604052600436106101e35760003560e01c80639cfc058e11610102578063c3f909d411610095578063f254bdc711610064578063f254bdc71461072c578063f2fde38b14610769578063f3fef3a314610789578063fc2a88c3146107a957600080fd5b8063c3f909d4146105fc578063cdd8d88514610695578063ce5494bb146106cf578063da4f5e6d146106ef57600080fd5b8063a4c0ed36116100d1578063a4c0ed361461057d578063a608a1e11461059d578063bed41a93146105bc578063bf17e559146105dc57600080fd5b80639cfc058e146105085780639eccacf61461051b578063a02e061614610548578063a3907d711461056857600080fd5b806348baa1c51161017a57806379ba50971161014957806379ba5097146104675780637fb5d19d1461047c5780638da5cb5b1461049c5780638ea98117146104e857600080fd5b806348baa1c5146103325780634b160935146103fd57806357a8070a1461041d578063650596541461044757600080fd5b80631fe543e3116101b65780631fe543e3146102bd5780632f2770db146102dd5780633255c456146102f25780634306d3541461031257600080fd5b8063030932bb146101e857806307b18bde1461022f578063181f5a771461025157806318b6f4c81461029d575b600080fd5b3480156101f457600080fd5b5061021c7f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b34801561023b57600080fd5b5061024f61024a366004612a22565b6107bf565b005b34801561025d57600080fd5b50604080518082018252601281527f56524656325772617070657220312e302e300000000000000000000000000000602082015290516102269190612ebb565b3480156102a957600080fd5b5061024f6102b8366004612ac3565b61089b565b3480156102c957600080fd5b5061024f6102d8366004612b47565b610a12565b3480156102e957600080fd5b5061024f610a8f565b3480156102fe57600080fd5b5061021c61030d366004612d4a565b610ac5565b34801561031e57600080fd5b5061021c61032d366004612c4a565b610bbf565b34801561033e57600080fd5b506103bc61034d366004612b15565b60096020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000810463ffffffff16907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1683565b6040805173ffffffffffffffffffffffffffffffffffffffff909416845263ffffffff909216602084015267ffffffffffffffff1690820152606001610226565b34801561040957600080fd5b5061021c610418366004612c4a565b610cc6565b34801561042957600080fd5b506008546104379060ff1681565b6040519015158152602001610226565b34801561045357600080fd5b5061024f610462366004612a07565b610db7565b34801561047357600080fd5b5061024f610e02565b34801561048857600080fd5b5061021c610497366004612d4a565b610eff565b3480156104a857600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610226565b3480156104f457600080fd5b5061024f610503366004612a07565b611005565b61021c610516366004612c65565b611110565b34801561052757600080fd5b506002546104c39073ffffffffffffffffffffffffffffffffffffffff1681565b34801561055457600080fd5b5061024f610563366004612a07565b6114a5565b34801561057457600080fd5b5061024f611550565b34801561058957600080fd5b5061024f610598366004612a4c565b611582565b3480156105a957600080fd5b5060085461043790610100900460ff1681565b3480156105c857600080fd5b5061024f6105d7366004612d66565b611a62565b3480156105e857600080fd5b5061024f6105f7366004612c4a565b611bb8565b34801561060857600080fd5b506005546006546007546008546003546040805195865263ffffffff8086166020880152640100000000860481169187019190915268010000000000000000948590048116606087015280841660808701529390920490921660a084015260ff620100008304811660c085015260e084019190915263010000009091041661010082015261012001610226565b3480156106a157600080fd5b506007546106ba90640100000000900463ffffffff1681565b60405163ffffffff9091168152602001610226565b3480156106db57600080fd5b5061024f6106ea366004612a07565b611bff565b3480156106fb57600080fd5b506006546104c3906c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561073857600080fd5b506007546104c3906c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561077557600080fd5b5061024f610784366004612a07565b611cb5565b34801561079557600080fd5b5061024f6107a4366004612a22565b611cc9565b3480156107b557600080fd5b5061021c60045481565b6107c7611dc4565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114610821576040519150601f19603f3d011682016040523d82523d6000602084013e610826565b606091505b5050905080610896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f6661696c656420746f207769746864726177206e61746976650000000000000060448201526064015b60405180910390fd5b505050565b81516108dc57806108d8576040517f6b81746e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b81516024111561092d5781516040517f51200dce00000000000000000000000000000000000000000000000000000000815261088d9160249160040161ffff92831681529116602082015260400190565b6000826023815181106109425761094261323d565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f01000000000000000000000000000000000000000000000000000000000000001490508080156109985750815b156109cf576040517f6048aa6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b801580156109db575081155b15610896576040517f6b81746e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025473ffffffffffffffffffffffffffffffffffffffff163314610a85576002546040517f1cf993f400000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440161088d565b6108d88282611e47565b610a97611dc4565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055565b60085460009060ff16610b34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f77726170706572206973206e6f7420636f6e6669677572656400000000000000604482015260640161088d565b600854610100900460ff1615610ba6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f777261707065722069732064697361626c656400000000000000000000000000604482015260640161088d565b610bb68363ffffffff168361202f565b90505b92915050565b60085460009060ff16610c2e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f77726170706572206973206e6f7420636f6e6669677572656400000000000000604482015260640161088d565b600854610100900460ff1615610ca0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f777261707065722069732064697361626c656400000000000000000000000000604482015260640161088d565b6000610caa612105565b9050610cbd8363ffffffff163a8361226c565b9150505b919050565b60085460009060ff16610d35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f77726170706572206973206e6f7420636f6e6669677572656400000000000000604482015260640161088d565b600854610100900460ff1615610da7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f777261707065722069732064697361626c656400000000000000000000000000604482015260640161088d565b610bb98263ffffffff163a61202f565b610dbf611dc4565b6007805473ffffffffffffffffffffffffffffffffffffffff9092166c01000000000000000000000000026bffffffffffffffffffffffff909216919091179055565b60015473ffffffffffffffffffffffffffffffffffffffff163314610e83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015260640161088d565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b60085460009060ff16610f6e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f77726170706572206973206e6f7420636f6e6669677572656400000000000000604482015260640161088d565b600854610100900460ff1615610fe0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f777261707065722069732064697361626c656400000000000000000000000000604482015260640161088d565b6000610fea612105565b9050610ffd8463ffffffff16848361226c565b949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314801590611045575060025473ffffffffffffffffffffffffffffffffffffffff163314155b156110c9573361106a60005473ffffffffffffffffffffffffffffffffffffffff1690565b6002546040517f061db9c100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9384166004820152918316602483015291909116604482015260640161088d565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600061115183838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250925061089b915050565b600061115c8761235e565b905060006111708863ffffffff163a61202f565b9050803410156111dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f66656520746f6f206c6f77000000000000000000000000000000000000000000604482015260640161088d565b6008546301000000900460ff1663ffffffff87161115611258576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f6e756d576f72647320746f6f2068696768000000000000000000000000000000604482015260640161088d565b6040805160c08101825260035481527f0000000000000000000000000000000000000000000000000000000000000000602082015261ffff89169181019190915260075460009190606082019063ffffffff166112b5868d612fe0565b6112bf9190612fe0565b63ffffffff1681526020018863ffffffff16815260200187878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152506002546040517f9b1c385e00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff1690639b1c385e90611365908490600401612ece565b602060405180830381600087803b15801561137f57600080fd5b505af1158015611393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b79190612b2e565b6040805160608101825233815263ffffffff808d16602080840191825267ffffffffffffffff3a81168587019081526000888152600990935295909120935184549251955190911678010000000000000000000000000000000000000000000000000277ffffffffffffffffffffffffffffffffffffffffffffffff9590931674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090921673ffffffffffffffffffffffffffffffffffffffff91909116171792909216919091179055935050505095945050505050565b6114ad611dc4565b6006546c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff161561150d576040517f2d118a6e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006805473ffffffffffffffffffffffffffffffffffffffff9092166c01000000000000000000000000026bffffffffffffffffffffffff909216919091179055565b611558611dc4565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055565b60085460ff166115ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f77726170706572206973206e6f7420636f6e6669677572656400000000000000604482015260640161088d565b600854610100900460ff1615611660576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f777261707065722069732064697361626c656400000000000000000000000000604482015260640161088d565b6006546c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146116f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f6f6e6c792063616c6c61626c652066726f6d204c494e4b000000000000000000604482015260640161088d565b600080808061170285870187612cdb565b935093509350935061171581600161089b565b60006117208561235e565b9050600061172c612105565b905060006117418763ffffffff163a8461226c565b9050808a10156117ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f66656520746f6f206c6f77000000000000000000000000000000000000000000604482015260640161088d565b6008546301000000900460ff1663ffffffff86161115611829576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f6e756d576f72647320746f6f2068696768000000000000000000000000000000604482015260640161088d565b6040805160c08101825260035481527f0000000000000000000000000000000000000000000000000000000000000000602082015261ffff88169181019190915260075460009190606082019063ffffffff16611886878c612fe0565b6118909190612fe0565b63ffffffff908116825288166020820152604090810187905260025490517f9b1c385e00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff90911690639b1c385e90611904908590600401612ece565b602060405180830381600087803b15801561191e57600080fd5b505af1158015611932573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119569190612b2e565b905060405180606001604052808e73ffffffffffffffffffffffffffffffffffffffff1681526020018a63ffffffff1681526020013a67ffffffffffffffff168152506009600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050508060048190555050505050505050505050505050565b611a6a611dc4565b6007805463ffffffff9a8b167fffffffffffffffffffffffffffffffffffffffff00000000ffffffff000000009091161768010000000000000000998b168a02179055600880546003979097557fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff9096166201000060ff988916027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff161763010000009590971694909402959095177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117909355600680546005949094557fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff9187167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009094169390931764010000000094871694909402939093179290921691909316909102179055565b611bc0611dc4565b6007805463ffffffff909216640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff909216919091179055565b611c07611dc4565b6002546040517f405b84fa0000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff83811660248301529091169063405b84fa90604401600060405180830381600087803b158015611c9a57600080fd5b505af1158015611cae573d6000803e3d6000fd5b5050505050565b611cbd611dc4565b611cc681612376565b50565b611cd1611dc4565b6006546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018490526c010000000000000000000000009092049091169063a9059cbb90604401602060405180830381600087803b158015611d5657600080fd5b505af1158015611d6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8e9190612aa6565b6108d8576040517f7c07fc4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314611e45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161088d565b565b60008281526009602081815260408084208151606081018352815473ffffffffffffffffffffffffffffffffffffffff808216835274010000000000000000000000000000000000000000820463ffffffff1683870152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff1693820193909352878652939092529290558051909116611f41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f72657175657374206e6f7420666f756e64000000000000000000000000000000604482015260640161088d565b600080631fe543e360e01b8585604051602401611f5f929190612f2b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000611fd9846020015163ffffffff1685600001518461246c565b90508061202757835160405173ffffffffffffffffffffffffffffffffffffffff9091169087907fc551b83c151f2d1c7eeb938ac59008e0409f1c1dc1e2f112449d4d79b458902290600090a35b505050505050565b600754600090819061204e90640100000000900463ffffffff166124b8565b60075463ffffffff680100000000000000008204811691612070911687612fc8565b61207a9190612fc8565b612084908561318b565b61208e9190612fc8565b60085490915081906000906064906120af9062010000900460ff1682613008565b6120bc9060ff168461318b565b6120c6919061302d565b6006549091506000906120f09068010000000000000000900463ffffffff1664e8d4a5100061318b565b6120fa9083612fc8565b979650505050505050565b600654600754604080517ffeaf968c000000000000000000000000000000000000000000000000000000008152905160009363ffffffff16151592849283926c0100000000000000000000000090920473ffffffffffffffffffffffffffffffffffffffff169163feaf968c9160048082019260a092909190829003018186803b15801561219257600080fd5b505afa1580156121a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ca9190612e00565b5094509092508491505080156121f057506121e582426131c8565b60065463ffffffff16105b156121fa57506005545b6000811215612265576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496e76616c6964204c494e4b2077656920707269636500000000000000000000604482015260640161088d565b9392505050565b600754600090819061228b90640100000000900463ffffffff166124b8565b60075463ffffffff6801000000000000000082048116916122ad911688612fc8565b6122b79190612fc8565b6122c1908661318b565b6122cb9190612fc8565b90506000836122e283670de0b6b3a764000061318b565b6122ec919061302d565b60085490915060009060649061230b9062010000900460ff1682613008565b6123189060ff168461318b565b612322919061302d565b60065490915060009061234890640100000000900463ffffffff1664e8d4a5100061318b565b6123529083612fc8565b98975050505050505050565b600061236b603f83613041565b610bb9906001612fe0565b73ffffffffffffffffffffffffffffffffffffffff81163314156123f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161088d565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60005a61138881101561247e57600080fd5b61138881039050846040820482031161249657600080fd5b50823b6124a257600080fd5b60008083516020850160008789f1949350505050565b6000466124c481612588565b15612568576000606c73ffffffffffffffffffffffffffffffffffffffff166341b247a86040518163ffffffff1660e01b815260040160c06040518083038186803b15801561251257600080fd5b505afa158015612526573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061254a9190612c00565b5050505091505083608c61255e9190612fc8565b610ffd908261318b565b612571816125ab565b1561257f57610cbd836125e5565b50600092915050565b600061a4b182148061259c575062066eed82145b80610bb957505062066eee1490565b6000600a8214806125bd57506101a482145b806125ca575062aa37dc82145b806125d6575061210582145b80610bb957505062014a331490565b60008073420000000000000000000000000000000000000f73ffffffffffffffffffffffffffffffffffffffff1663519b4bd36040518163ffffffff1660e01b815260040160206040518083038186803b15801561264257600080fd5b505afa158015612656573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061267a9190612b2e565b905060008061268981866131c8565b9050600061269882601061318b565b6126a384600461318b565b6126ad9190612fc8565b9050600073420000000000000000000000000000000000000f73ffffffffffffffffffffffffffffffffffffffff16630c18c1626040518163ffffffff1660e01b815260040160206040518083038186803b15801561270b57600080fd5b505afa15801561271f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127439190612b2e565b9050600073420000000000000000000000000000000000000f73ffffffffffffffffffffffffffffffffffffffff1663f45e65d86040518163ffffffff1660e01b815260040160206040518083038186803b1580156127a157600080fd5b505afa1580156127b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127d99190612b2e565b9050600073420000000000000000000000000000000000000f73ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561283757600080fd5b505afa15801561284b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061286f9190612b2e565b9050600061287e82600a6130c5565b90506000818461288e8789612fc8565b612898908c61318b565b6128a2919061318b565b6128ac919061302d565b9b9a5050505050505050505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610cc157600080fd5b60008083601f8401126128f157600080fd5b50813567ffffffffffffffff81111561290957600080fd5b60208301915083602082850101111561292157600080fd5b9250929050565b600082601f83011261293957600080fd5b813567ffffffffffffffff8111156129535761295361326c565b61298460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612f79565b81815284602083860101111561299957600080fd5b816020850160208301376000918101602001919091529392505050565b803561ffff81168114610cc157600080fd5b803563ffffffff81168114610cc157600080fd5b803560ff81168114610cc157600080fd5b805169ffffffffffffffffffff81168114610cc157600080fd5b600060208284031215612a1957600080fd5b610bb6826128bb565b60008060408385031215612a3557600080fd5b612a3e836128bb565b946020939093013593505050565b60008060008060608587031215612a6257600080fd5b612a6b856128bb565b935060208501359250604085013567ffffffffffffffff811115612a8e57600080fd5b612a9a878288016128df565b95989497509550505050565b600060208284031215612ab857600080fd5b81516122658161329b565b60008060408385031215612ad657600080fd5b823567ffffffffffffffff811115612aed57600080fd5b612af985828601612928565b9250506020830135612b0a8161329b565b809150509250929050565b600060208284031215612b2757600080fd5b5035919050565b600060208284031215612b4057600080fd5b5051919050565b60008060408385031215612b5a57600080fd5b8235915060208084013567ffffffffffffffff80821115612b7a57600080fd5b818601915086601f830112612b8e57600080fd5b813581811115612ba057612ba061326c565b8060051b9150612bb1848301612f79565b8181528481019084860184860187018b1015612bcc57600080fd5b600095505b83861015612bef578035835260019590950194918601918601612bd1565b508096505050505050509250929050565b60008060008060008060c08789031215612c1957600080fd5b865195506020870151945060408701519350606087015192506080870151915060a087015190509295509295509295565b600060208284031215612c5c57600080fd5b610bb6826129c8565b600080600080600060808688031215612c7d57600080fd5b612c86866129c8565b9450612c94602087016129b6565b9350612ca2604087016129c8565b9250606086013567ffffffffffffffff811115612cbe57600080fd5b612cca888289016128df565b969995985093965092949392505050565b60008060008060808587031215612cf157600080fd5b612cfa856129c8565b9350612d08602086016129b6565b9250612d16604086016129c8565b9150606085013567ffffffffffffffff811115612d3257600080fd5b612d3e87828801612928565b91505092959194509250565b60008060408385031215612d5d57600080fd5b612a3e836129c8565b60008060008060008060008060006101208a8c031215612d8557600080fd5b612d8e8a6129c8565b9850612d9c60208b016129c8565b9750612daa60408b016129dc565b965060608a01359550612dbf60808b016129dc565b9450612dcd60a08b016129c8565b935060c08a01359250612de260e08b016129c8565b9150612df16101008b016129c8565b90509295985092959850929598565b600080600080600060a08688031215612e1857600080fd5b612e21866129ed565b9450602086015193506040860151925060608601519150612e44608087016129ed565b90509295509295909350565b6000815180845260005b81811015612e7657602081850181015186830182015201612e5a565b81811115612e88576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610bb66020830184612e50565b60208152815160208201526020820151604082015261ffff60408301511660608201526000606083015163ffffffff80821660808501528060808601511660a0850152505060a083015160c080840152610ffd60e0840182612e50565b6000604082018483526020604081850152818551808452606086019150828701935060005b81811015612f6c57845183529383019391830191600101612f50565b5090979650505050505050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612fc057612fc061326c565b604052919050565b60008219821115612fdb57612fdb6131df565b500190565b600063ffffffff808316818516808303821115612fff57612fff6131df565b01949350505050565b600060ff821660ff84168060ff03821115613025576130256131df565b019392505050565b60008261303c5761303c61320e565b500490565b600063ffffffff808416806130585761305861320e565b92169190910492915050565b600181815b808511156130bd57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156130a3576130a36131df565b808516156130b057918102915b93841c9390800290613069565b509250929050565b6000610bb683836000826130db57506001610bb9565b816130e857506000610bb9565b81600181146130fe576002811461310857613124565b6001915050610bb9565b60ff841115613119576131196131df565b50506001821b610bb9565b5060208310610133831016604e8410600b8410161715613147575081810a610bb9565b6131518383613064565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115613183576131836131df565b029392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156131c3576131c36131df565b500290565b6000828210156131da576131da6131df565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8015158114611cc657600080fdfea164736f6c6343000806000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_link\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_linkNativeFeed\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_coordinator\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"FailedToTransferLink\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"expectedMinimumLength\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"actualLength\",\"type\":\"uint16\"}],\"name\":\"IncorrectExtraArgsLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LINKPaymentInRequestRandomWordsInNative\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkAlreadySet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NativePaymentInOnTokenTransfer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"have\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"want\",\"type\":\"address\"}],\"name\":\"OnlyCoordinatorCanFulfill\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"have\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"coordinator\",\"type\":\"address\"}],\"name\":\"OnlyOwnerOrCoordinator\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"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\":true,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"WrapperFulfillmentFailed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"SUBSCRIPTION_ID\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_callbackGasLimit\",\"type\":\"uint32\"}],\"name\":\"calculateRequestPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_callbackGasLimit\",\"type\":\"uint32\"}],\"name\":\"calculateRequestPriceNative\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"isLinkMode\",\"type\":\"bool\"}],\"name\":\"checkPaymentMode\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"disable\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enable\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"_requestGasPriceWei\",\"type\":\"uint256\"}],\"name\":\"estimateRequestPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"_requestGasPriceWei\",\"type\":\"uint256\"}],\"name\":\"estimateRequestPriceNative\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConfig\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"fallbackWeiPerUnitLink\",\"type\":\"int256\"},{\"internalType\":\"uint32\",\"name\":\"stalenessSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeLinkPPM\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeNativePPM\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"wrapperGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"coordinatorGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"wrapperPremiumPercentage\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"maxNumWords\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastRequestId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newCoordinator\",\"type\":\"address\"}],\"name\":\"migrate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"onTokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"internalType\":\"uint256[]\",\"name\":\"randomWords\",\"type\":\"uint256[]\"}],\"name\":\"rawFulfillRandomWords\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"_requestConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"_numWords\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"name\":\"requestRandomWordsInNative\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"s_callbacks\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"callbackAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"requestGasPrice\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_configured\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_disabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_fulfillmentTxSizeBytes\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_link\",\"outputs\":[{\"internalType\":\"contractLinkTokenInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_linkNativeFeed\",\"outputs\":[{\"internalType\":\"contractAggregatorV3Interface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_vrfCoordinator\",\"outputs\":[{\"internalType\":\"contractIVRFCoordinatorV2Plus\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_wrapperGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"_coordinatorGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"_wrapperPremiumPercentage\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"_keyHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"_maxNumWords\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"_stalenessSeconds\",\"type\":\"uint32\"},{\"internalType\":\"int256\",\"name\":\"_fallbackWeiPerUnitLink\",\"type\":\"int256\"},{\"internalType\":\"uint32\",\"name\":\"_fulfillmentFlatFeeLinkPPM\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"_fulfillmentFlatFeeNativePPM\",\"type\":\"uint32\"}],\"name\":\"setConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_vrfCoordinator\",\"type\":\"address\"}],\"name\":\"setCoordinator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"size\",\"type\":\"uint32\"}],\"name\":\"setFulfillmentTxSize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"link\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"linkNativeFeed\",\"type\":\"address\"}],\"name\":\"setLinkAndLinkNativeFeed\",\"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\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNative\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x60a06040526007805463ffffffff60201b1916650244000000001790553480156200002957600080fd5b506040516200363b3803806200363b8339810160408190526200004c9162000323565b803380600081620000a45760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000d757620000d7816200025a565b5050600280546001600160a01b0319166001600160a01b03938416179055508316156200012857600680546001600160601b03166c010000000000000000000000006001600160a01b038616021790555b6001600160a01b038216156200016257600780546001600160601b03166c010000000000000000000000006001600160a01b038516021790555b6002546040805163288688f960e21b815290516000926001600160a01b03169163a21a23e491600480830192602092919082900301818787803b158015620001a957600080fd5b505af1158015620001be573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001e491906200036d565b6080819052600254604051632fb1302360e21b8152600481018390523060248201529192506001600160a01b03169063bec4c08c90604401600060405180830381600087803b1580156200023757600080fd5b505af11580156200024c573d6000803e3d6000fd5b505050505050505062000387565b6001600160a01b038116331415620002b55760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200009b565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b03811681146200031e57600080fd5b919050565b6000806000606084860312156200033957600080fd5b620003448462000306565b9250620003546020850162000306565b9150620003646040850162000306565b90509250925092565b6000602082840312156200038057600080fd5b5051919050565b608051613283620003b8600039600081816101ef015281816111f3015281816117190152611b1101526132836000f3fe6080604052600436106101d85760003560e01c80639cfc058e11610102578063cdd8d88511610095578063f2fde38b11610064578063f2fde38b1461071e578063f3fef3a31461073e578063fb8f80101461075e578063fc2a88c31461077e57600080fd5b8063cdd8d8851461064a578063ce5494bb14610684578063da4f5e6d146106a4578063f254bdc7146106e157600080fd5b8063a608a1e1116100d1578063a608a1e114610552578063bed41a9314610571578063bf17e55914610591578063c3f909d4146105b157600080fd5b80639cfc058e146104dd5780639eccacf6146104f0578063a3907d711461051d578063a4c0ed361461053257600080fd5b80634306d3541161017a57806379ba50971161014957806379ba50971461043c5780637fb5d19d146104515780638da5cb5b146104715780638ea98117146104bd57600080fd5b80634306d3541461030757806348baa1c5146103275780634b160935146103f257806357a8070a1461041257600080fd5b806318b6f4c8116101b657806318b6f4c8146102925780631fe543e3146102b25780632f2770db146102d25780633255c456146102e757600080fd5b8063030932bb146101dd57806307b18bde14610224578063181f5a7714610246575b600080fd5b3480156101e957600080fd5b506102117f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b34801561023057600080fd5b5061024461023f3660046129ef565b610794565b005b34801561025257600080fd5b50604080518082018252601281527f56524656325772617070657220312e302e3000000000000000000000000000006020820152905161021b9190612e88565b34801561029e57600080fd5b506102446102ad366004612a90565b610870565b3480156102be57600080fd5b506102446102cd366004612b14565b6109e7565b3480156102de57600080fd5b50610244610a64565b3480156102f357600080fd5b50610211610302366004612d17565b610a9a565b34801561031357600080fd5b50610211610322366004612c17565b610b94565b34801561033357600080fd5b506103b1610342366004612ae2565b60096020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000810463ffffffff16907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1683565b6040805173ffffffffffffffffffffffffffffffffffffffff909416845263ffffffff909216602084015267ffffffffffffffff169082015260600161021b565b3480156103fe57600080fd5b5061021161040d366004612c17565b610c9b565b34801561041e57600080fd5b5060085461042c9060ff1681565b604051901515815260200161021b565b34801561044857600080fd5b50610244610d8c565b34801561045d57600080fd5b5061021161046c366004612d17565b610e89565b34801561047d57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161021b565b3480156104c957600080fd5b506102446104d83660046129a1565b610f8f565b6102116104eb366004612c32565b61109a565b3480156104fc57600080fd5b506002546104989073ffffffffffffffffffffffffffffffffffffffff1681565b34801561052957600080fd5b5061024461142f565b34801561053e57600080fd5b5061024461054d366004612a19565b611461565b34801561055e57600080fd5b5060085461042c90610100900460ff1681565b34801561057d57600080fd5b5061024461058c366004612d33565b611941565b34801561059d57600080fd5b506102446105ac366004612c17565b611a97565b3480156105bd57600080fd5b506005546006546007546008546003546040805195865263ffffffff8086166020880152640100000000860481169187019190915268010000000000000000948590048116606087015280841660808701529390920490921660a084015260ff620100008304811660c085015260e08401919091526301000000909104166101008201526101200161021b565b34801561065657600080fd5b5060075461066f90640100000000900463ffffffff1681565b60405163ffffffff909116815260200161021b565b34801561069057600080fd5b5061024461069f3660046129a1565b611ade565b3480156106b057600080fd5b50600654610498906c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156106ed57600080fd5b50600754610498906c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561072a57600080fd5b506102446107393660046129a1565b611b94565b34801561074a57600080fd5b506102446107593660046129ef565b611ba8565b34801561076a57600080fd5b506102446107793660046129bc565b611ca3565b34801561078a57600080fd5b5061021160045481565b61079c611d5e565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146107f6576040519150601f19603f3d011682016040523d82523d6000602084013e6107fb565b606091505b505090508061086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f6661696c656420746f207769746864726177206e61746976650000000000000060448201526064015b60405180910390fd5b505050565b81516108b157806108ad576040517f6b81746e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b8151602411156109025781516040517f51200dce0000000000000000000000000000000000000000000000000000000081526108629160249160040161ffff92831681529116602082015260400190565b6000826023815181106109175761091761320a565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f010000000000000000000000000000000000000000000000000000000000000014905080801561096d5750815b156109a4576040517f6048aa6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b801580156109b0575081155b1561086b576040517f6b81746e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025473ffffffffffffffffffffffffffffffffffffffff163314610a5a576002546040517f1cf993f400000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9091166024820152604401610862565b6108ad8282611de1565b610a6c611d5e565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055565b60085460009060ff16610b09576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f77726170706572206973206e6f7420636f6e66696775726564000000000000006044820152606401610862565b600854610100900460ff1615610b7b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f777261707065722069732064697361626c6564000000000000000000000000006044820152606401610862565b610b8b8363ffffffff1683611fc9565b90505b92915050565b60085460009060ff16610c03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f77726170706572206973206e6f7420636f6e66696775726564000000000000006044820152606401610862565b600854610100900460ff1615610c75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f777261707065722069732064697361626c6564000000000000000000000000006044820152606401610862565b6000610c7f61209f565b9050610c928363ffffffff163a83612206565b9150505b919050565b60085460009060ff16610d0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f77726170706572206973206e6f7420636f6e66696775726564000000000000006044820152606401610862565b600854610100900460ff1615610d7c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f777261707065722069732064697361626c6564000000000000000000000000006044820152606401610862565b610b8e8263ffffffff163a611fc9565b60015473ffffffffffffffffffffffffffffffffffffffff163314610e0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610862565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b60085460009060ff16610ef8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f77726170706572206973206e6f7420636f6e66696775726564000000000000006044820152606401610862565b600854610100900460ff1615610f6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f777261707065722069732064697361626c6564000000000000000000000000006044820152606401610862565b6000610f7461209f565b9050610f878463ffffffff168483612206565b949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314801590610fcf575060025473ffffffffffffffffffffffffffffffffffffffff163314155b156110535733610ff460005473ffffffffffffffffffffffffffffffffffffffff1690565b6002546040517f061db9c100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff93841660048201529183166024830152919091166044820152606401610862565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006110db83838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509250610870915050565b60006110e6876122f8565b905060006110fa8863ffffffff163a611fc9565b905080341015611166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f66656520746f6f206c6f770000000000000000000000000000000000000000006044820152606401610862565b6008546301000000900460ff1663ffffffff871611156111e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f6e756d576f72647320746f6f20686967680000000000000000000000000000006044820152606401610862565b6040805160c08101825260035481527f0000000000000000000000000000000000000000000000000000000000000000602082015261ffff89169181019190915260075460009190606082019063ffffffff1661123f868d612fad565b6112499190612fad565b63ffffffff1681526020018863ffffffff16815260200187878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152506002546040517f9b1c385e00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff1690639b1c385e906112ef908490600401612e9b565b602060405180830381600087803b15801561130957600080fd5b505af115801561131d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113419190612afb565b6040805160608101825233815263ffffffff808d16602080840191825267ffffffffffffffff3a81168587019081526000888152600990935295909120935184549251955190911678010000000000000000000000000000000000000000000000000277ffffffffffffffffffffffffffffffffffffffffffffffff9590931674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090921673ffffffffffffffffffffffffffffffffffffffff91909116171792909216919091179055935050505095945050505050565b611437611d5e565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055565b60085460ff166114cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f77726170706572206973206e6f7420636f6e66696775726564000000000000006044820152606401610862565b600854610100900460ff161561153f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f777261707065722069732064697361626c6564000000000000000000000000006044820152606401610862565b6006546c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146115d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f6f6e6c792063616c6c61626c652066726f6d204c494e4b0000000000000000006044820152606401610862565b60008080806115e185870187612ca8565b93509350935093506115f4816001610870565b60006115ff856122f8565b9050600061160b61209f565b905060006116208763ffffffff163a84612206565b9050808a101561168c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f66656520746f6f206c6f770000000000000000000000000000000000000000006044820152606401610862565b6008546301000000900460ff1663ffffffff86161115611708576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f6e756d576f72647320746f6f20686967680000000000000000000000000000006044820152606401610862565b6040805160c08101825260035481527f0000000000000000000000000000000000000000000000000000000000000000602082015261ffff88169181019190915260075460009190606082019063ffffffff16611765878c612fad565b61176f9190612fad565b63ffffffff908116825288166020820152604090810187905260025490517f9b1c385e00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff90911690639b1c385e906117e3908590600401612e9b565b602060405180830381600087803b1580156117fd57600080fd5b505af1158015611811573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118359190612afb565b905060405180606001604052808e73ffffffffffffffffffffffffffffffffffffffff1681526020018a63ffffffff1681526020013a67ffffffffffffffff168152506009600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050508060048190555050505050505050505050505050565b611949611d5e565b6007805463ffffffff9a8b167fffffffffffffffffffffffffffffffffffffffff00000000ffffffff000000009091161768010000000000000000998b168a02179055600880546003979097557fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff9096166201000060ff988916027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff161763010000009590971694909402959095177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117909355600680546005949094557fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff9187167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009094169390931764010000000094871694909402939093179290921691909316909102179055565b611a9f611d5e565b6007805463ffffffff909216640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff909216919091179055565b611ae6611d5e565b6002546040517f405b84fa0000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff83811660248301529091169063405b84fa90604401600060405180830381600087803b158015611b7957600080fd5b505af1158015611b8d573d6000803e3d6000fd5b5050505050565b611b9c611d5e565b611ba581612310565b50565b611bb0611d5e565b6006546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018490526c010000000000000000000000009092049091169063a9059cbb90604401602060405180830381600087803b158015611c3557600080fd5b505af1158015611c49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c6d9190612a73565b6108ad576040517f7c07fc4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cab611d5e565b6006546c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1615611d0b576040517f2d118a6e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006805473ffffffffffffffffffffffffffffffffffffffff9384166c010000000000000000000000009081026bffffffffffffffffffffffff9283161790925560078054939094169091029116179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314611ddf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610862565b565b60008281526009602081815260408084208151606081018352815473ffffffffffffffffffffffffffffffffffffffff808216835274010000000000000000000000000000000000000000820463ffffffff1683870152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff1693820193909352878652939092529290558051909116611edb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f72657175657374206e6f7420666f756e640000000000000000000000000000006044820152606401610862565b600080631fe543e360e01b8585604051602401611ef9929190612ef8565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000611f73846020015163ffffffff16856000015184612406565b905080611fc157835160405173ffffffffffffffffffffffffffffffffffffffff9091169087907fc551b83c151f2d1c7eeb938ac59008e0409f1c1dc1e2f112449d4d79b458902290600090a35b505050505050565b6007546000908190611fe890640100000000900463ffffffff16612452565b60075463ffffffff68010000000000000000820481169161200a911687612f95565b6120149190612f95565b61201e9085613158565b6120289190612f95565b60085490915081906000906064906120499062010000900460ff1682612fd5565b6120569060ff1684613158565b6120609190612ffa565b60065490915060009061208a9068010000000000000000900463ffffffff1664e8d4a51000613158565b6120949083612f95565b979650505050505050565b600654600754604080517ffeaf968c000000000000000000000000000000000000000000000000000000008152905160009363ffffffff16151592849283926c0100000000000000000000000090920473ffffffffffffffffffffffffffffffffffffffff169163feaf968c9160048082019260a092909190829003018186803b15801561212c57600080fd5b505afa158015612140573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121649190612dcd565b50945090925084915050801561218a575061217f8242613195565b60065463ffffffff16105b1561219457506005545b60008112156121ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496e76616c6964204c494e4b20776569207072696365000000000000000000006044820152606401610862565b9392505050565b600754600090819061222590640100000000900463ffffffff16612452565b60075463ffffffff680100000000000000008204811691612247911688612f95565b6122519190612f95565b61225b9086613158565b6122659190612f95565b905060008361227c83670de0b6b3a7640000613158565b6122869190612ffa565b6008549091506000906064906122a59062010000900460ff1682612fd5565b6122b29060ff1684613158565b6122bc9190612ffa565b6006549091506000906122e290640100000000900463ffffffff1664e8d4a51000613158565b6122ec9083612f95565b98975050505050505050565b6000612305603f8361300e565b610b8e906001612fad565b73ffffffffffffffffffffffffffffffffffffffff8116331415612390576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610862565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60005a61138881101561241857600080fd5b61138881039050846040820482031161243057600080fd5b50823b61243c57600080fd5b60008083516020850160008789f1949350505050565b60004661245e81612522565b15612502576000606c73ffffffffffffffffffffffffffffffffffffffff166341b247a86040518163ffffffff1660e01b815260040160c06040518083038186803b1580156124ac57600080fd5b505afa1580156124c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124e49190612bcd565b5050505091505083608c6124f89190612f95565b610f879082613158565b61250b81612545565b1561251957610c928361257f565b50600092915050565b600061a4b1821480612536575062066eed82145b80610b8e57505062066eee1490565b6000600a82148061255757506101a482145b80612564575062aa37dc82145b80612570575061210582145b80610b8e57505062014a331490565b60008073420000000000000000000000000000000000000f73ffffffffffffffffffffffffffffffffffffffff1663519b4bd36040518163ffffffff1660e01b815260040160206040518083038186803b1580156125dc57600080fd5b505afa1580156125f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126149190612afb565b90506000806126238186613195565b90506000612632826010613158565b61263d846004613158565b6126479190612f95565b9050600073420000000000000000000000000000000000000f73ffffffffffffffffffffffffffffffffffffffff16630c18c1626040518163ffffffff1660e01b815260040160206040518083038186803b1580156126a557600080fd5b505afa1580156126b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126dd9190612afb565b9050600073420000000000000000000000000000000000000f73ffffffffffffffffffffffffffffffffffffffff1663f45e65d86040518163ffffffff1660e01b815260040160206040518083038186803b15801561273b57600080fd5b505afa15801561274f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127739190612afb565b9050600073420000000000000000000000000000000000000f73ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156127d157600080fd5b505afa1580156127e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128099190612afb565b9050600061281882600a613092565b9050600081846128288789612f95565b612832908c613158565b61283c9190613158565b6128469190612ffa565b9b9a5050505050505050505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610c9657600080fd5b60008083601f84011261288b57600080fd5b50813567ffffffffffffffff8111156128a357600080fd5b6020830191508360208285010111156128bb57600080fd5b9250929050565b600082601f8301126128d357600080fd5b813567ffffffffffffffff8111156128ed576128ed613239565b61291e60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612f46565b81815284602083860101111561293357600080fd5b816020850160208301376000918101602001919091529392505050565b803561ffff81168114610c9657600080fd5b803563ffffffff81168114610c9657600080fd5b803560ff81168114610c9657600080fd5b805169ffffffffffffffffffff81168114610c9657600080fd5b6000602082840312156129b357600080fd5b610b8b82612855565b600080604083850312156129cf57600080fd5b6129d883612855565b91506129e660208401612855565b90509250929050565b60008060408385031215612a0257600080fd5b612a0b83612855565b946020939093013593505050565b60008060008060608587031215612a2f57600080fd5b612a3885612855565b935060208501359250604085013567ffffffffffffffff811115612a5b57600080fd5b612a6787828801612879565b95989497509550505050565b600060208284031215612a8557600080fd5b81516121ff81613268565b60008060408385031215612aa357600080fd5b823567ffffffffffffffff811115612aba57600080fd5b612ac6858286016128c2565b9250506020830135612ad781613268565b809150509250929050565b600060208284031215612af457600080fd5b5035919050565b600060208284031215612b0d57600080fd5b5051919050565b60008060408385031215612b2757600080fd5b8235915060208084013567ffffffffffffffff80821115612b4757600080fd5b818601915086601f830112612b5b57600080fd5b813581811115612b6d57612b6d613239565b8060051b9150612b7e848301612f46565b8181528481019084860184860187018b1015612b9957600080fd5b600095505b83861015612bbc578035835260019590950194918601918601612b9e565b508096505050505050509250929050565b60008060008060008060c08789031215612be657600080fd5b865195506020870151945060408701519350606087015192506080870151915060a087015190509295509295509295565b600060208284031215612c2957600080fd5b610b8b82612962565b600080600080600060808688031215612c4a57600080fd5b612c5386612962565b9450612c6160208701612950565b9350612c6f60408701612962565b9250606086013567ffffffffffffffff811115612c8b57600080fd5b612c9788828901612879565b969995985093965092949392505050565b60008060008060808587031215612cbe57600080fd5b612cc785612962565b9350612cd560208601612950565b9250612ce360408601612962565b9150606085013567ffffffffffffffff811115612cff57600080fd5b612d0b878288016128c2565b91505092959194509250565b60008060408385031215612d2a57600080fd5b612a0b83612962565b60008060008060008060008060006101208a8c031215612d5257600080fd5b612d5b8a612962565b9850612d6960208b01612962565b9750612d7760408b01612976565b965060608a01359550612d8c60808b01612976565b9450612d9a60a08b01612962565b935060c08a01359250612daf60e08b01612962565b9150612dbe6101008b01612962565b90509295985092959850929598565b600080600080600060a08688031215612de557600080fd5b612dee86612987565b9450602086015193506040860151925060608601519150612e1160808701612987565b90509295509295909350565b6000815180845260005b81811015612e4357602081850181015186830182015201612e27565b81811115612e55576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610b8b6020830184612e1d565b60208152815160208201526020820151604082015261ffff60408301511660608201526000606083015163ffffffff80821660808501528060808601511660a0850152505060a083015160c080840152610f8760e0840182612e1d565b6000604082018483526020604081850152818551808452606086019150828701935060005b81811015612f3957845183529383019391830191600101612f1d565b5090979650505050505050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612f8d57612f8d613239565b604052919050565b60008219821115612fa857612fa86131ac565b500190565b600063ffffffff808316818516808303821115612fcc57612fcc6131ac565b01949350505050565b600060ff821660ff84168060ff03821115612ff257612ff26131ac565b019392505050565b600082613009576130096131db565b500490565b600063ffffffff80841680613025576130256131db565b92169190910492915050565b600181815b8085111561308a57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115613070576130706131ac565b8085161561307d57918102915b93841c9390800290613036565b509250929050565b6000610b8b83836000826130a857506001610b8e565b816130b557506000610b8e565b81600181146130cb57600281146130d5576130f1565b6001915050610b8e565b60ff8411156130e6576130e66131ac565b50506001821b610b8e565b5060208310610133831016604e8410600b8410161715613114575081810a610b8e565b61311e8383613031565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115613150576131506131ac565b029392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613190576131906131ac565b500290565b6000828210156131a7576131a76131ac565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8015158114611ba557600080fdfea164736f6c6343000806000a", } var VRFV2PlusWrapperABI = VRFV2PlusWrapperMetaData.ABI @@ -687,28 +687,16 @@ func (_VRFV2PlusWrapper *VRFV2PlusWrapperTransactorSession) SetFulfillmentTxSize return _VRFV2PlusWrapper.Contract.SetFulfillmentTxSize(&_VRFV2PlusWrapper.TransactOpts, size) } -func (_VRFV2PlusWrapper *VRFV2PlusWrapperTransactor) SetLINK(opts *bind.TransactOpts, link common.Address) (*types.Transaction, error) { - return _VRFV2PlusWrapper.contract.Transact(opts, "setLINK", link) +func (_VRFV2PlusWrapper *VRFV2PlusWrapperTransactor) SetLinkAndLinkNativeFeed(opts *bind.TransactOpts, link common.Address, linkNativeFeed common.Address) (*types.Transaction, error) { + return _VRFV2PlusWrapper.contract.Transact(opts, "setLinkAndLinkNativeFeed", link, linkNativeFeed) } -func (_VRFV2PlusWrapper *VRFV2PlusWrapperSession) SetLINK(link common.Address) (*types.Transaction, error) { - return _VRFV2PlusWrapper.Contract.SetLINK(&_VRFV2PlusWrapper.TransactOpts, link) +func (_VRFV2PlusWrapper *VRFV2PlusWrapperSession) SetLinkAndLinkNativeFeed(link common.Address, linkNativeFeed common.Address) (*types.Transaction, error) { + return _VRFV2PlusWrapper.Contract.SetLinkAndLinkNativeFeed(&_VRFV2PlusWrapper.TransactOpts, link, linkNativeFeed) } -func (_VRFV2PlusWrapper *VRFV2PlusWrapperTransactorSession) SetLINK(link common.Address) (*types.Transaction, error) { - return _VRFV2PlusWrapper.Contract.SetLINK(&_VRFV2PlusWrapper.TransactOpts, link) -} - -func (_VRFV2PlusWrapper *VRFV2PlusWrapperTransactor) SetLinkNativeFeed(opts *bind.TransactOpts, linkNativeFeed common.Address) (*types.Transaction, error) { - return _VRFV2PlusWrapper.contract.Transact(opts, "setLinkNativeFeed", linkNativeFeed) -} - -func (_VRFV2PlusWrapper *VRFV2PlusWrapperSession) SetLinkNativeFeed(linkNativeFeed common.Address) (*types.Transaction, error) { - return _VRFV2PlusWrapper.Contract.SetLinkNativeFeed(&_VRFV2PlusWrapper.TransactOpts, linkNativeFeed) -} - -func (_VRFV2PlusWrapper *VRFV2PlusWrapperTransactorSession) SetLinkNativeFeed(linkNativeFeed common.Address) (*types.Transaction, error) { - return _VRFV2PlusWrapper.Contract.SetLinkNativeFeed(&_VRFV2PlusWrapper.TransactOpts, linkNativeFeed) +func (_VRFV2PlusWrapper *VRFV2PlusWrapperTransactorSession) SetLinkAndLinkNativeFeed(link common.Address, linkNativeFeed common.Address) (*types.Transaction, error) { + return _VRFV2PlusWrapper.Contract.SetLinkAndLinkNativeFeed(&_VRFV2PlusWrapper.TransactOpts, link, linkNativeFeed) } func (_VRFV2PlusWrapper *VRFV2PlusWrapperTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { @@ -1261,9 +1249,7 @@ type VRFV2PlusWrapperInterface interface { SetFulfillmentTxSize(opts *bind.TransactOpts, size uint32) (*types.Transaction, error) - SetLINK(opts *bind.TransactOpts, link common.Address) (*types.Transaction, error) - - SetLinkNativeFeed(opts *bind.TransactOpts, linkNativeFeed common.Address) (*types.Transaction, error) + SetLinkAndLinkNativeFeed(opts *bind.TransactOpts, link common.Address, linkNativeFeed common.Address) (*types.Transaction, error) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) diff --git a/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt index 280859047c6..450d53838e7 100644 --- a/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -124,6 +124,6 @@ vrfv2plus_client: ../../contracts/solc/v0.8.6/VRFV2PlusClient/VRFV2PlusClient.ab vrfv2plus_consumer_example: ../../contracts/solc/v0.8.6/VRFV2PlusConsumerExample/VRFV2PlusConsumerExample.abi ../../contracts/solc/v0.8.6/VRFV2PlusConsumerExample/VRFV2PlusConsumerExample.bin 2c480a6d7955d33a00690fdd943486d95802e48a03f3cc243df314448e4ddb2c vrfv2plus_malicious_migrator: ../../contracts/solc/v0.8.6/VRFV2PlusMaliciousMigrator/VRFV2PlusMaliciousMigrator.abi ../../contracts/solc/v0.8.6/VRFV2PlusMaliciousMigrator/VRFV2PlusMaliciousMigrator.bin 80dbc98be5e42246960c889d29488f978d3db0127e95e9b295352c481d8c9b07 vrfv2plus_reverting_example: ../../contracts/solc/v0.8.6/VRFV2PlusRevertingExample/VRFV2PlusRevertingExample.abi ../../contracts/solc/v0.8.6/VRFV2PlusRevertingExample/VRFV2PlusRevertingExample.bin 6c9053a94f90b8151964d3311310478b57744fbbd153e8ee742ed570e1e49798 -vrfv2plus_wrapper: ../../contracts/solc/v0.8.6/VRFV2PlusWrapper/VRFV2PlusWrapper.abi ../../contracts/solc/v0.8.6/VRFV2PlusWrapper/VRFV2PlusWrapper.bin 934bafba386b934f491827e535306726069f4cafef9125079ea88abf0d808877 +vrfv2plus_wrapper: ../../contracts/solc/v0.8.6/VRFV2PlusWrapper/VRFV2PlusWrapper.abi ../../contracts/solc/v0.8.6/VRFV2PlusWrapper/VRFV2PlusWrapper.bin 86f352f70da2a52bf0081ec3780a363fb8f5873217f81b4e4a8b68a59dff3575 vrfv2plus_wrapper_consumer_example: ../../contracts/solc/v0.8.6/VRFV2PlusWrapperConsumerExample/VRFV2PlusWrapperConsumerExample.abi ../../contracts/solc/v0.8.6/VRFV2PlusWrapperConsumerExample/VRFV2PlusWrapperConsumerExample.bin a14c4c6e2299cd963a8f0ed069e61dd135af5aad4c13a94f6ea7e086eced7191 vrfv2plus_wrapper_load_test_consumer: ../../contracts/solc/v0.8.6/VRFV2PlusWrapperLoadTestConsumer/VRFV2PlusWrapperLoadTestConsumer.abi ../../contracts/solc/v0.8.6/VRFV2PlusWrapperLoadTestConsumer/VRFV2PlusWrapperLoadTestConsumer.bin 55e3bd534045125fb6579a201ab766185e9b0fac5737b4f37897bb69c9f599fa From e6495f37becc1c48ef3937e5e3658fed289ee449 Mon Sep 17 00:00:00 2001 From: Bolek <1416262+bolekk@users.noreply.github.com> Date: Tue, 12 Mar 2024 09:44:18 -0700 Subject: [PATCH 11/15] [Functions] Fix bug in comparing subscriptions (#12379) --- .../handlers/functions/subscriptions/user_subscriptions.go | 3 ++- .../functions/subscriptions/user_subscriptions_test.go | 7 ++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/core/services/gateway/handlers/functions/subscriptions/user_subscriptions.go b/core/services/gateway/handlers/functions/subscriptions/user_subscriptions.go index ec506b6a864..8d30f7de9cf 100644 --- a/core/services/gateway/handlers/functions/subscriptions/user_subscriptions.go +++ b/core/services/gateway/handlers/functions/subscriptions/user_subscriptions.go @@ -2,6 +2,7 @@ package subscriptions import ( "math/big" + "reflect" "github.com/ethereum/go-ethereum/common" "github.com/pkg/errors" @@ -54,7 +55,7 @@ func (us *userSubscriptions) UpdateSubscription(subscriptionId uint64, subscript } // there is no change to the subscription - if us.userSubscriptionsMap[subscription.Owner][subscriptionId] == subscription { + if reflect.DeepEqual(us.userSubscriptionsMap[subscription.Owner][subscriptionId], subscription) { return false } diff --git a/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go b/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go index 4d58155735f..aba39678973 100644 --- a/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go +++ b/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go @@ -135,15 +135,16 @@ func TestUserSubscriptions_UpdateSubscription(t *testing.T) { t.Run("no actual changes", func(t *testing.T) { us := subscriptions.NewUserSubscriptions() - subscription := &functions_router.IFunctionsSubscriptionsSubscription{ + subscription := functions_router.IFunctionsSubscriptionsSubscription{ Owner: utils.RandomAddress(), Balance: big.NewInt(25), BlockedBalance: big.NewInt(25), } - updated := us.UpdateSubscription(5, subscription) + identicalSubscription := subscription + updated := us.UpdateSubscription(5, &subscription) assert.True(t, updated) - updated = us.UpdateSubscription(5, subscription) + updated = us.UpdateSubscription(5, &identicalSubscription) assert.False(t, updated) }) } From 8626f1b83df0fc5725d46874fd6e973567ce8edd Mon Sep 17 00:00:00 2001 From: ilija42 <57732589+ilija42@users.noreply.github.com> Date: Tue, 12 Mar 2024 18:40:29 +0100 Subject: [PATCH 12/15] BCF-3052 - Job Based KV Store and juelsFeePerCoin reboot persistence (#12392) * Add kv store migration * Add kv store implementation * Init kv store in ocr2 delegate and pass into median service * Update ds cache to have kv store fallback for final observation value * Prettify ds cache updateCache, add ERR log severity on consecutive errs * Add ds cache test for cache value persistence * Remove unused field in jobKVStore * Make sonar SQL migration lint happy * Rename TestJobKVStore * Add kv store mock * Add changeset file * Fix sonar sql lint * Change kv orm to use raw json message instead of jsonText * minor change * minor change * Fix SQ SQL lint * Add comments in KVStore * Rename jobKVStore to kVStore and return struct from constructor * Update core/store/migrate/migrations/0227_kv_store_table.sql Co-authored-by: Sam * Update kVStore sql to match migration * Add more kv_orm tests --------- Co-authored-by: Sam --- .changeset/lemon-ladybugs-doubt.md | 5 + core/services/job/kv_orm.go | 68 ++++++++++++++ core/services/job/kv_orm_test.go | 85 +++++++++++++++++ core/services/job/mocks/kv_store.go | 60 ++++++++++++ core/services/ocr2/delegate.go | 7 +- core/services/ocr2/plugins/median/services.go | 3 +- core/services/ocrcommon/data_source.go | 60 +++++++++--- core/services/ocrcommon/data_source_test.go | 93 ++++++++++++++----- .../migrations/0227_kv_store_table.sql | 13 +++ 9 files changed, 353 insertions(+), 41 deletions(-) create mode 100644 .changeset/lemon-ladybugs-doubt.md create mode 100644 core/services/job/kv_orm.go create mode 100644 core/services/job/kv_orm_test.go create mode 100644 core/services/job/mocks/kv_store.go create mode 100644 core/store/migrate/migrations/0227_kv_store_table.sql diff --git a/.changeset/lemon-ladybugs-doubt.md b/.changeset/lemon-ladybugs-doubt.md new file mode 100644 index 00000000000..d7d1c7a8492 --- /dev/null +++ b/.changeset/lemon-ladybugs-doubt.md @@ -0,0 +1,5 @@ +--- +"chainlink": patch +--- + +Add kv store tied to jobs and use it for juels fee per coin cache to store persisted values for backup diff --git a/core/services/job/kv_orm.go b/core/services/job/kv_orm.go new file mode 100644 index 00000000000..890336b4ec7 --- /dev/null +++ b/core/services/job/kv_orm.go @@ -0,0 +1,68 @@ +package job + +import ( + "encoding/json" + "fmt" + "time" + + "github.com/jmoiron/sqlx" + "github.com/jmoiron/sqlx/types" + + "github.com/smartcontractkit/chainlink/v2/core/logger" + "github.com/smartcontractkit/chainlink/v2/core/services/pg" +) + +// KVStore is a simple KV store that can store and retrieve serializable data. +// +//go:generate mockery --quiet --name KVStore --output ./mocks/ --case=underscore +type KVStore interface { + Store(key string, val interface{}) error + Get(key string, dest interface{}) error +} + +type kVStore struct { + jobID int32 + q pg.Q + lggr logger.SugaredLogger +} + +var _ KVStore = (*kVStore)(nil) + +func NewKVStore(jobID int32, db *sqlx.DB, cfg pg.QConfig, lggr logger.Logger) kVStore { + namedLogger := logger.Sugared(lggr.Named("JobORM")) + return kVStore{ + jobID: jobID, + q: pg.NewQ(db, namedLogger, cfg), + lggr: namedLogger, + } +} + +// Store saves serializable value by key. +func (kv kVStore) Store(key string, val interface{}) error { + jsonVal, err := json.Marshal(val) + if err != nil { + return err + } + + sql := `INSERT INTO job_kv_store (job_id, key, val) + VALUES ($1, $2, $3) + ON CONFLICT (job_id, key) DO UPDATE SET + val = EXCLUDED.val, + updated_at = $4;` + + if err = kv.q.ExecQ(sql, kv.jobID, key, types.JSONText(jsonVal), time.Now()); err != nil { + return fmt.Errorf("failed to store value: %s for key: %s for jobID: %d : %w", string(jsonVal), key, kv.jobID, err) + } + return nil +} + +// Get retrieves serializable value by key. +func (kv kVStore) Get(key string, dest interface{}) error { + var ret json.RawMessage + sql := "SELECT val FROM job_kv_store WHERE job_id = $1 AND key = $2" + if err := kv.q.Get(&ret, sql, kv.jobID, key); err != nil { + return fmt.Errorf("failed to get value by key: %s for jobID: %d : %w", key, kv.jobID, err) + } + + return json.Unmarshal(ret, dest) +} diff --git a/core/services/job/kv_orm_test.go b/core/services/job/kv_orm_test.go new file mode 100644 index 00000000000..794e27b3c9f --- /dev/null +++ b/core/services/job/kv_orm_test.go @@ -0,0 +1,85 @@ +package job_test + +import ( + "fmt" + "reflect" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/smartcontractkit/chainlink/v2/core/bridges" + "github.com/smartcontractkit/chainlink/v2/core/internal/cltest" + "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/configtest" + "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/pgtest" + "github.com/smartcontractkit/chainlink/v2/core/logger" + "github.com/smartcontractkit/chainlink/v2/core/services/directrequest" + "github.com/smartcontractkit/chainlink/v2/core/services/job" + "github.com/smartcontractkit/chainlink/v2/core/services/pipeline" + "github.com/smartcontractkit/chainlink/v2/core/testdata/testspecs" +) + +func TestJobKVStore(t *testing.T) { + config := configtest.NewTestGeneralConfig(t) + db := pgtest.NewSqlxDB(t) + + lggr := logger.TestLogger(t) + + pipelineORM := pipeline.NewORM(db, logger.TestLogger(t), config.Database(), config.JobPipeline().MaxSuccessfulRuns()) + bridgesORM := bridges.NewORM(db, logger.TestLogger(t), config.Database()) + + jobID := int32(1337) + kvStore := job.NewKVStore(jobID, db, config.Database(), lggr) + jobORM := NewTestORM(t, db, pipelineORM, bridgesORM, cltest.NewKeyStore(t, db, config.Database()), config.Database()) + + jb, err := directrequest.ValidatedDirectRequestSpec(testspecs.GetDirectRequestSpec()) + require.NoError(t, err) + jb.ID = jobID + require.NoError(t, jobORM.CreateJob(&jb)) + + type testData struct { + Test string + } + + type nested struct { + Contact testData // Nested struct + } + + values := []interface{}{ + 42, // int + "hello", // string + 3.14, // float64 + true, // bool + []int{1, 2, 3}, // slice of ints + map[string]int{"a": 1, "b": 2}, // map of string to int + testData{Test: "value1"}, // regular struct + nested{testData{"value2"}}, // nested struct + } + + for i, value := range values { + testKey := "test_key_" + fmt.Sprint(i) + require.NoError(t, kvStore.Store(testKey, value)) + + // Get the type of the current value + valueType := reflect.TypeOf(value) + // Create a new instance of the value's type + temp := reflect.New(valueType).Interface() + + require.NoError(t, kvStore.Get(testKey, &temp)) + + tempValue := reflect.ValueOf(temp).Elem().Interface() + require.Equal(t, value, tempValue) + } + + key := "test_key_updating" + td1 := testData{Test: "value1"} + td2 := testData{Test: "value2"} + + var retData testData + require.NoError(t, kvStore.Store(key, td1)) + require.NoError(t, kvStore.Get(key, &retData)) + require.Equal(t, td1, retData) + + require.NoError(t, kvStore.Store(key, td2)) + require.NoError(t, kvStore.Get(key, &retData)) + require.Equal(t, td2, retData) +} diff --git a/core/services/job/mocks/kv_store.go b/core/services/job/mocks/kv_store.go new file mode 100644 index 00000000000..48e4538f606 --- /dev/null +++ b/core/services/job/mocks/kv_store.go @@ -0,0 +1,60 @@ +// Code generated by mockery v2.38.0. DO NOT EDIT. + +package mocks + +import mock "github.com/stretchr/testify/mock" + +// KVStore is an autogenerated mock type for the KVStore type +type KVStore struct { + mock.Mock +} + +// Get provides a mock function with given fields: key, dest +func (_m *KVStore) Get(key string, dest interface{}) error { + ret := _m.Called(key, dest) + + if len(ret) == 0 { + panic("no return value specified for Get") + } + + var r0 error + if rf, ok := ret.Get(0).(func(string, interface{}) error); ok { + r0 = rf(key, dest) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// Store provides a mock function with given fields: key, val +func (_m *KVStore) Store(key string, val interface{}) error { + ret := _m.Called(key, val) + + if len(ret) == 0 { + panic("no return value specified for Store") + } + + var r0 error + if rf, ok := ret.Get(0).(func(string, interface{}) error); ok { + r0 = rf(key, val) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// NewKVStore creates a new instance of KVStore. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewKVStore(t interface { + mock.TestingT + Cleanup(func()) +}) *KVStore { + mock := &KVStore{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/core/services/ocr2/delegate.go b/core/services/ocr2/delegate.go index 198b6fc0553..33f0af6db10 100644 --- a/core/services/ocr2/delegate.go +++ b/core/services/ocr2/delegate.go @@ -375,6 +375,8 @@ func (d *Delegate) ServicesForSpec(ctx context.Context, jb job.Job) ([]job.Servi } lggr := logger.Sugared(d.lggr.Named(jb.ExternalJobID.String()).With(lggrCtx.Args()...)) + kvStore := job.NewKVStore(jb.ID, d.db, d.cfg.Database(), lggr) + rid, err := spec.RelayID() if err != nil { return nil, ErrJobSpecNoRelayer{Err: err, PluginName: string(spec.PluginType)} @@ -448,7 +450,7 @@ func (d *Delegate) ServicesForSpec(ctx context.Context, jb job.Job) ([]job.Servi return d.newServicesLLO(ctx, lggr, jb, bootstrapPeers, kb, ocrDB, lc, ocrLogger) case types.Median: - return d.newServicesMedian(ctx, lggr, jb, bootstrapPeers, kb, ocrDB, lc, ocrLogger) + return d.newServicesMedian(ctx, lggr, jb, bootstrapPeers, kb, kvStore, ocrDB, lc, ocrLogger) case types.DKG: return d.newServicesDKG(lggr, jb, bootstrapPeers, kb, ocrDB, lc, ocrLogger) @@ -927,6 +929,7 @@ func (d *Delegate) newServicesMedian( jb job.Job, bootstrapPeers []commontypes.BootstrapperLocator, kb ocr2key.KeyBundle, + kvStore job.KVStore, ocrDB *db, lc ocrtypes.LocalConfig, ocrLogger commontypes.Logger, @@ -962,7 +965,7 @@ func (d *Delegate) newServicesMedian( return nil, ErrRelayNotEnabled{Err: err, PluginName: "median", Relay: spec.Relay} } - medianServices, err2 := median.NewMedianServices(ctx, jb, d.isNewlyCreatedJob, relayer, d.pipelineRunner, lggr, oracleArgsNoPlugin, mConfig, enhancedTelemChan, errorLog) + medianServices, err2 := median.NewMedianServices(ctx, jb, d.isNewlyCreatedJob, relayer, kvStore, d.pipelineRunner, lggr, oracleArgsNoPlugin, mConfig, enhancedTelemChan, errorLog) if ocrcommon.ShouldCollectEnhancedTelemetry(&jb) { enhancedTelemService := ocrcommon.NewEnhancedTelemetryService(&jb, enhancedTelemChan, make(chan struct{}), d.monitoringEndpointGen.GenMonitoringEndpoint(rid.Network, rid.ChainID, spec.ContractID, synchronization.EnhancedEA), lggr.Named("EnhancedTelemetry")) diff --git a/core/services/ocr2/plugins/median/services.go b/core/services/ocr2/plugins/median/services.go index 74690565e94..a432045c867 100644 --- a/core/services/ocr2/plugins/median/services.go +++ b/core/services/ocr2/plugins/median/services.go @@ -56,6 +56,7 @@ func NewMedianServices(ctx context.Context, jb job.Job, isNewlyCreatedJob bool, relayer loop.Relayer, + kvStore job.KVStore, pipelineRunner pipeline.Runner, lggr logger.Logger, argsNoPlugin libocr.OCR2OracleArgs, @@ -128,7 +129,7 @@ func NewMedianServices(ctx context.Context, if !pluginConfig.JuelsPerFeeCoinCacheDisabled { lggr.Infof("juelsPerFeeCoin data source caching is enabled") - if juelsPerFeeCoinSource, err = ocrcommon.NewInMemoryDataSourceCache(juelsPerFeeCoinSource, pluginConfig.JuelsPerFeeCoinCacheDuration.Duration()); err != nil { + if juelsPerFeeCoinSource, err = ocrcommon.NewInMemoryDataSourceCache(juelsPerFeeCoinSource, kvStore, pluginConfig.JuelsPerFeeCoinCacheDuration.Duration()); err != nil { return nil, err } } diff --git a/core/services/ocrcommon/data_source.go b/core/services/ocrcommon/data_source.go index 3dd7e4eebc0..011b8d0644d 100644 --- a/core/services/ocrcommon/data_source.go +++ b/core/services/ocrcommon/data_source.go @@ -13,6 +13,7 @@ import ( ocr2types "github.com/smartcontractkit/libocr/offchainreporting2plus/types" "github.com/smartcontractkit/chainlink/v2/core/bridges" + serializablebig "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils/big" "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/job" "github.com/smartcontractkit/chainlink/v2/core/services/pipeline" @@ -99,20 +100,22 @@ func NewInMemoryDataSource(pr pipeline.Runner, jb job.Job, spec pipeline.Spec, l } } -const defaultInMemoryCacheDuration = time.Minute * 5 +const defaultCacheFreshness = time.Minute * 5 +const dataSourceCacheKey = "dscache" -func NewInMemoryDataSourceCache(ds median.DataSource, cacheExpiryDuration time.Duration) (median.DataSource, error) { +func NewInMemoryDataSourceCache(ds median.DataSource, kvStore job.KVStore, cacheFreshness time.Duration) (median.DataSource, error) { inMemoryDS, ok := ds.(*inMemoryDataSource) if !ok { return nil, errors.Errorf("unsupported data source type: %T, only inMemoryDataSource supported", ds) } - if cacheExpiryDuration == 0 { - cacheExpiryDuration = defaultInMemoryCacheDuration + if cacheFreshness == 0 { + cacheFreshness = defaultCacheFreshness } dsCache := &inMemoryDataSourceCache{ - cacheExpiration: cacheExpiryDuration, + kvStore: kvStore, + cacheFreshness: cacheFreshness, inMemoryDataSource: inMemoryDS, } go func() { dsCache.updater() }() @@ -217,20 +220,23 @@ func (ds *inMemoryDataSource) Observe(ctx context.Context, timestamp ocr2types.R // If cache update is overdue Observe defaults to standard inMemoryDataSource behaviour. type inMemoryDataSourceCache struct { *inMemoryDataSource - cacheExpiration time.Duration + // cacheFreshness indicates duration between cache updates. + // Even if updates fail, previous values are returned. + cacheFreshness time.Duration mu sync.RWMutex latestUpdateErr error latestTrrs pipeline.TaskRunResults latestResult pipeline.FinalResult + kvStore job.KVStore } // updater periodically updates data source cache. func (ds *inMemoryDataSourceCache) updater() { - ticker := time.NewTicker(ds.cacheExpiration) + ticker := time.NewTicker(ds.cacheFreshness) for ; true; <-ticker.C { ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) if err := ds.updateCache(ctx); err != nil { - ds.lggr.Infow("failed to update cache", "err", err) + ds.lggr.Warnf("failed to update cache", "err", err) } cancel() } @@ -239,15 +245,35 @@ func (ds *inMemoryDataSourceCache) updater() { func (ds *inMemoryDataSourceCache) updateCache(ctx context.Context) error { ds.mu.Lock() defer ds.mu.Unlock() - _, ds.latestTrrs, ds.latestUpdateErr = ds.executeRun(ctx) - if ds.latestUpdateErr != nil { - return errors.Wrapf(ds.latestUpdateErr, "error executing run for spec ID %v", ds.spec.ID) - } else if ds.latestTrrs.FinalResult(ds.lggr).HasErrors() { - ds.latestUpdateErr = errjoin.Join(ds.latestTrrs.FinalResult(ds.lggr).AllErrors...) + + // check for any errors + _, latestTrrs, latestUpdateErr := ds.executeRun(ctx) + if latestTrrs.FinalResult(ds.lggr).HasErrors() { + latestUpdateErr = errjoin.Join(append(latestTrrs.FinalResult(ds.lggr).AllErrors, latestUpdateErr)...) + } + + if latestUpdateErr != nil { + previousUpdateErr := ds.latestUpdateErr + ds.latestUpdateErr = latestUpdateErr + // raise log severity + if previousUpdateErr != nil { + ds.lggr.Errorf("consecutive cache updates errored: previous err: %w new err: %w", previousUpdateErr, ds.latestUpdateErr) + } return errors.Wrapf(ds.latestUpdateErr, "error executing run for spec ID %v", ds.spec.ID) } + ds.latestTrrs = latestTrrs ds.latestResult = ds.latestTrrs.FinalResult(ds.lggr) + value, err := ds.inMemoryDataSource.parse(ds.latestResult) + if err != nil { + return errors.Wrapf(err, "invalid result") + } + + // backup in case data source fails continuously and node gets rebooted + if err = ds.kvStore.Store(dataSourceCacheKey, serializablebig.New(value)); err != nil { + ds.lggr.Errorf("failed to persist latest task run value", err) + } + return nil } @@ -261,7 +287,7 @@ func (ds *inMemoryDataSourceCache) get(ctx context.Context) (pipeline.FinalResul ds.mu.RUnlock() if err := ds.updateCache(ctx); err != nil { - ds.lggr.Errorw("failed to update cache, returning stale result now", "err", err) + ds.lggr.Warnf("failed to update cache, returning stale result now", "err", err) } ds.mu.RLock() @@ -270,7 +296,13 @@ func (ds *inMemoryDataSourceCache) get(ctx context.Context) (pipeline.FinalResul } func (ds *inMemoryDataSourceCache) Observe(ctx context.Context, timestamp ocr2types.ReportTimestamp) (*big.Int, error) { + var val serializablebig.Big latestResult, latestTrrs := ds.get(ctx) + if latestTrrs == nil { + ds.lggr.Errorf("cache is empty, returning persisted value now") + return val.ToInt(), ds.kvStore.Get(dataSourceCacheKey, &val) + } + setEATelemetry(ds.inMemoryDataSource, latestResult, latestTrrs, ObservationTimestamp{ Round: timestamp.Round, Epoch: timestamp.Epoch, diff --git a/core/services/ocrcommon/data_source_test.go b/core/services/ocrcommon/data_source_test.go index 2e4e07973a0..a921bc060ff 100644 --- a/core/services/ocrcommon/data_source_test.go +++ b/core/services/ocrcommon/data_source_test.go @@ -14,9 +14,11 @@ import ( "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" + serializablebig "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils/big" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/job" + "github.com/smartcontractkit/chainlink/v2/core/services/job/mocks" "github.com/smartcontractkit/chainlink/v2/core/services/ocrcommon" "github.com/smartcontractkit/chainlink/v2/core/services/pipeline" pipelinemocks "github.com/smartcontractkit/chainlink/v2/core/services/pipeline/mocks" @@ -47,13 +49,7 @@ func Test_InMemoryDataSource(t *testing.T) { } func Test_CachedInMemoryDataSourceErrHandling(t *testing.T) { - runner := pipelinemocks.NewRunner(t) - - ds := ocrcommon.NewInMemoryDataSource(runner, job.Job{}, pipeline.Spec{}, logger.TestLogger(t)) - dsCache, err := ocrcommon.NewInMemoryDataSourceCache(ds, time.Second*2) - require.NoError(t, err) - - changeResultValue := func(value string, returnErr, once bool) { + changeResultValue := func(runner *pipelinemocks.Runner, value string, returnErr, once bool) { result := pipeline.Result{ Value: value, Error: nil, @@ -74,23 +70,72 @@ func Test_CachedInMemoryDataSourceErrHandling(t *testing.T) { call.Once() } } - - mockVal := int64(1) - // Test if Observe notices that cache updater failed and can refresh the cache on its own - // 1. Set initial value - changeResultValue(fmt.Sprint(mockVal), false, true) - time.Sleep(time.Millisecond * 100) - val, err := dsCache.Observe(testutils.Context(t), types.ReportTimestamp{}) - require.NoError(t, err) - assert.Equal(t, mockVal, val.Int64()) - // 2. Set values again, but make it error in updater - changeResultValue(fmt.Sprint(mockVal+1), true, true) - time.Sleep(time.Second*2 + time.Millisecond*100) - // 3. Set value in between updates and call Observe (shouldn't flake because of huge wait time) - changeResultValue(fmt.Sprint(mockVal+2), false, false) - val, err = dsCache.Observe(testutils.Context(t), types.ReportTimestamp{}) - require.NoError(t, err) - assert.Equal(t, mockVal+2, val.Int64()) + t.Run("test normal cache updater fail recovery", func(t *testing.T) { + runner := pipelinemocks.NewRunner(t) + ds := ocrcommon.NewInMemoryDataSource(runner, job.Job{}, pipeline.Spec{}, logger.TestLogger(t)) + mockKVStore := mocks.KVStore{} + mockKVStore.On("Store", mock.Anything, mock.Anything).Return(nil) + mockKVStore.On("Get", mock.Anything, mock.AnythingOfType("*big.Big")).Return(nil) + dsCache, err := ocrcommon.NewInMemoryDataSourceCache(ds, &mockKVStore, time.Second*2) + require.NoError(t, err) + + mockVal := int64(1) + // Test if Observe notices that cache updater failed and can refresh the cache on its own + // 1. Set initial value + changeResultValue(runner, fmt.Sprint(mockVal), false, true) + time.Sleep(time.Millisecond * 100) + val, err := dsCache.Observe(testutils.Context(t), types.ReportTimestamp{}) + require.NoError(t, err) + assert.Equal(t, mockVal, val.Int64()) + // 2. Set values again, but make it error in updater + changeResultValue(runner, fmt.Sprint(mockVal+1), true, true) + time.Sleep(time.Second*2 + time.Millisecond*100) + // 3. Set value in between updates and call Observe (shouldn't flake because of huge wait time) + changeResultValue(runner, fmt.Sprint(mockVal+2), false, false) + val, err = dsCache.Observe(testutils.Context(t), types.ReportTimestamp{}) + require.NoError(t, err) + assert.Equal(t, mockVal+2, val.Int64()) + }) + + t.Run("test total updater fail with persisted value recovery", func(t *testing.T) { + persistedVal := big.NewInt(1337) + runner := pipelinemocks.NewRunner(t) + ds := ocrcommon.NewInMemoryDataSource(runner, job.Job{}, pipeline.Spec{}, logger.TestLogger(t)) + + mockKVStore := mocks.KVStore{} + mockKVStore.On("Get", mock.Anything, mock.AnythingOfType("*big.Big")).Return(nil).Run(func(args mock.Arguments) { + arg := args.Get(1).(*serializablebig.Big) + arg.ToInt().Set(persistedVal) + }) + + // set updater to a long time so that it doesn't log errors after the test is done + dsCache, err := ocrcommon.NewInMemoryDataSourceCache(ds, &mockKVStore, time.Hour*100) + require.NoError(t, err) + changeResultValue(runner, "-1", true, false) + + time.Sleep(time.Millisecond * 100) + val, err := dsCache.Observe(testutils.Context(t), types.ReportTimestamp{}) + require.NoError(t, err) + assert.Equal(t, persistedVal.String(), val.String()) + + }) + + t.Run("test total updater fail with no persisted value ", func(t *testing.T) { + runner := pipelinemocks.NewRunner(t) + ds := ocrcommon.NewInMemoryDataSource(runner, job.Job{}, pipeline.Spec{}, logger.TestLogger(t)) + + mockKVStore := mocks.KVStore{} + mockKVStore.On("Get", mock.Anything, mock.AnythingOfType("*big.Big")).Return(nil).Return(assert.AnError) + + // set updater to a long time so that it doesn't log errors after the test is done + dsCache, err := ocrcommon.NewInMemoryDataSourceCache(ds, &mockKVStore, time.Hour*100) + require.NoError(t, err) + changeResultValue(runner, "-1", true, false) + + time.Sleep(time.Millisecond * 100) + _, err = dsCache.Observe(testutils.Context(t), types.ReportTimestamp{}) + require.Error(t, err) + }) } func Test_InMemoryDataSourceWithProm(t *testing.T) { diff --git a/core/store/migrate/migrations/0227_kv_store_table.sql b/core/store/migrate/migrations/0227_kv_store_table.sql new file mode 100644 index 00000000000..403e157af44 --- /dev/null +++ b/core/store/migrate/migrations/0227_kv_store_table.sql @@ -0,0 +1,13 @@ +-- +goose Up + +CREATE TABLE job_kv_store ( + job_id INTEGER NOT NULL REFERENCES jobs(id), + key TEXT NOT NULL, + val JSONB NOT NULL, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + PRIMARY KEY (job_id, key) +); + +-- +goose Down +DROP TABLE job_kv_store; From 2c624fedb3c60a669ebe3aa1f77dcdfe6c42c2db Mon Sep 17 00:00:00 2001 From: Ryan Hall Date: Tue, 12 Mar 2024 15:23:15 -0300 Subject: [PATCH 13/15] skip coverage on long cron contract test (#12400) --- contracts/test/v0.8/Cron.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/test/v0.8/Cron.test.ts b/contracts/test/v0.8/Cron.test.ts index 2cdc7c247f9..87d81e563b9 100644 --- a/contracts/test/v0.8/Cron.test.ts +++ b/contracts/test/v0.8/Cron.test.ts @@ -68,7 +68,7 @@ describe('Cron', () => { }) describe('calculateNextTick() / calculateLastTick()', () => { - it('correctly identifies the next & last ticks for cron jobs', async () => { + it('correctly identifies the next & last ticks for cron jobs [ @skip-coverage ]', async () => { await setTimestamp(timeStamp) const now = () => moment.unix(timeStamp) const tests = [ From 92785ec63dad4c5ca653c86b760bb31b3bfb9f9e Mon Sep 17 00:00:00 2001 From: Francisco de Borja Aranda Castillejo Date: Tue, 12 Mar 2024 19:23:21 +0100 Subject: [PATCH 14/15] gas optimizations and minor fixes (#12156) * gas optimizations and minor fixes * minor fixes II * avoid creating the same struct twice * include all possible corner cases into addToWatchListOrDecomission Signed-off-by: Borja Aranda --------- Signed-off-by: Borja Aranda --- .../upkeeps/LinkAvailableBalanceMonitor.sol | 76 ++++++++++++------- 1 file changed, 50 insertions(+), 26 deletions(-) diff --git a/contracts/src/v0.8/automation/upkeeps/LinkAvailableBalanceMonitor.sol b/contracts/src/v0.8/automation/upkeeps/LinkAvailableBalanceMonitor.sol index b858800d73a..ea01678fe76 100644 --- a/contracts/src/v0.8/automation/upkeeps/LinkAvailableBalanceMonitor.sol +++ b/contracts/src/v0.8/automation/upkeeps/LinkAvailableBalanceMonitor.sol @@ -71,8 +71,8 @@ contract LinkAvailableBalanceMonitor is AccessControl, AutomationCompatibleInter bytes32 private constant ADMIN_ROLE = keccak256("ADMIN_ROLE"); bytes32 private constant EXECUTOR_ROLE = keccak256("EXECUTOR_ROLE"); - uint96 private constant DEFAULT_TOP_UP_AMOUNT_JULES = 9000000000000000000; - uint96 private constant DEFAULT_MIN_BALANCE_JULES = 1000000000000000000; + uint96 private constant DEFAULT_TOP_UP_AMOUNT_JUELS = 9000000000000000000; + uint96 private constant DEFAULT_MIN_BALANCE_JUELS = 1000000000000000000; IERC20 private immutable i_linkToken; uint256 private s_minWaitPeriodSeconds; @@ -142,14 +142,15 @@ contract LinkAvailableBalanceMonitor is AccessControl, AutomationCompatibleInter } // s_onRampAddresses is not the same length as s_watchList, so it has // to be clean in a separate loop - for (uint256 idx = 0; idx < s_onRampAddresses.length(); idx++) { - (uint256 key, ) = s_onRampAddresses.at(idx); + for (uint256 idx = s_onRampAddresses.length(); idx > 0; idx--) { + (uint256 key, ) = s_onRampAddresses.at(idx - 1); s_onRampAddresses.remove(key); } for (uint256 idx = 0; idx < addresses.length; idx++) { address targetAddress = addresses[idx]; if (s_targets[targetAddress].isActive) revert DuplicateAddress(targetAddress); if (targetAddress == address(0)) revert InvalidWatchList(); + if (minBalances[idx] == 0) revert InvalidWatchList(); if (topUpAmounts[idx] == 0) revert InvalidWatchList(); s_targets[targetAddress] = MonitoredAddress({ isActive: true, @@ -173,6 +174,7 @@ contract LinkAvailableBalanceMonitor is AccessControl, AutomationCompatibleInter /// in which case it will carry the proper dstChainSelector along with the 0x0 address function addToWatchListOrDecomission(address targetAddress, uint64 dstChainSelector) public onlyAdminOrExecutor { if (s_targets[targetAddress].isActive) revert DuplicateAddress(targetAddress); + if (targetAddress == address(0) && dstChainSelector == 0) revert InvalidAddress(targetAddress); bool onRampExists = s_onRampAddresses.contains(dstChainSelector); // if targetAddress is an existing onRamp, there's a need of cleaning the previous onRamp associated to this dstChainSelector // there's no need to remove any other address that's not an onRamp @@ -182,16 +184,19 @@ contract LinkAvailableBalanceMonitor is AccessControl, AutomationCompatibleInter } // only add the new address if it's not 0x0 if (targetAddress != address(0)) { - s_onRampAddresses.set(dstChainSelector, targetAddress); s_targets[targetAddress] = MonitoredAddress({ isActive: true, - minBalance: DEFAULT_MIN_BALANCE_JULES, - topUpAmount: DEFAULT_TOP_UP_AMOUNT_JULES, + minBalance: DEFAULT_MIN_BALANCE_JUELS, + topUpAmount: DEFAULT_TOP_UP_AMOUNT_JUELS, lastTopUpTimestamp: 0 }); s_watchList.add(targetAddress); - } else { - // if the address is 0x0, it means the onRamp has ben decomissioned and has to be cleaned + // add the contract to onRampAddresses if it carries a valid dstChainSelector + if (dstChainSelector > 0) { + s_onRampAddresses.set(dstChainSelector, targetAddress); + } + // else if is refundant as this is the only corner case left, maintaining it for legibility + } else if (targetAddress == address(0) && dstChainSelector > 0) { s_onRampAddresses.remove(dstChainSelector); } } @@ -219,16 +224,24 @@ contract LinkAvailableBalanceMonitor is AccessControl, AutomationCompatibleInter uint256 idx = uint256(blockhash(block.number - (block.number % s_upkeepInterval) - 1)) % numTargets; uint256 numToCheck = numTargets < maxCheck ? numTargets : maxCheck; uint256 numFound = 0; + uint256 minWaitPeriod = s_minWaitPeriodSeconds; address[] memory targetsToFund = new address[](maxPerform); - MonitoredAddress memory target; + MonitoredAddress memory contractToFund; for ( uint256 numChecked = 0; numChecked < numToCheck; (idx, numChecked) = ((idx + 1) % numTargets, numChecked + 1) ) { address targetAddress = s_watchList.at(idx); - target = s_targets[targetAddress]; - if (_needsFunding(targetAddress, target.minBalance)) { + contractToFund = s_targets[targetAddress]; + if ( + _needsFunding( + targetAddress, + contractToFund.lastTopUpTimestamp + minWaitPeriod, + contractToFund.minBalance, + contractToFund.isActive + ) + ) { targetsToFund[numFound] = targetAddress; numFound++; if (numFound == maxPerform) { @@ -247,15 +260,24 @@ contract LinkAvailableBalanceMonitor is AccessControl, AutomationCompatibleInter /// @notice tries to fund an array of target addresses, checking if they're underfunded in the process /// @param targetAddresses is an array of contract addresses to be funded in case they're underfunded function topUp(address[] memory targetAddresses) public whenNotPaused { - MonitoredAddress memory target; + MonitoredAddress memory contractToFund; + uint256 minWaitPeriod = s_minWaitPeriodSeconds; uint256 localBalance = i_linkToken.balanceOf(address(this)); for (uint256 idx = 0; idx < targetAddresses.length; idx++) { address targetAddress = targetAddresses[idx]; - target = s_targets[targetAddress]; - if (localBalance >= target.topUpAmount && _needsFunding(targetAddress, target.minBalance)) { - bool success = i_linkToken.transfer(targetAddress, target.topUpAmount); + contractToFund = s_targets[targetAddress]; + if ( + localBalance >= contractToFund.topUpAmount && + _needsFunding( + targetAddress, + contractToFund.lastTopUpTimestamp + minWaitPeriod, + contractToFund.minBalance, + contractToFund.isActive + ) + ) { + bool success = i_linkToken.transfer(targetAddress, contractToFund.topUpAmount); if (success) { - localBalance -= target.topUpAmount; + localBalance -= contractToFund.topUpAmount; s_targets[targetAddress].lastTopUpTimestamp = uint56(block.timestamp); emit TopUpSucceeded(targetAddress); } else { @@ -271,8 +293,14 @@ contract LinkAvailableBalanceMonitor is AccessControl, AutomationCompatibleInter /// if it is elligible for funding /// @param targetAddress the target to check /// @param minBalance minimum balance required for the target + /// @param minWaitPeriodPassed the minimum wait period (target lastTopUpTimestamp + minWaitPeriod) /// @return bool whether the target needs funding or not - function _needsFunding(address targetAddress, uint256 minBalance) private view returns (bool) { + function _needsFunding( + address targetAddress, + uint256 minWaitPeriodPassed, + uint256 minBalance, + bool contractIsActive + ) private view returns (bool) { // Explicitly check if the targetAddress is the zero address // or if it's not a contract. In both cases return with false, // to prevent target.linkAvailableForPayment from running, @@ -280,21 +308,17 @@ contract LinkAvailableBalanceMonitor is AccessControl, AutomationCompatibleInter if (targetAddress == address(0) || targetAddress.code.length == 0) { return false; } - MonitoredAddress memory addressToCheck = s_targets[targetAddress]; ILinkAvailable target; IAggregatorProxy proxy = IAggregatorProxy(targetAddress); try proxy.aggregator() returns (address aggregatorAddress) { + // proxy.aggregator() can return a 0 address if the address is not an aggregator if (aggregatorAddress == address(0)) return false; target = ILinkAvailable(aggregatorAddress); } catch { target = ILinkAvailable(targetAddress); } try target.linkAvailableForPayment() returns (int256 balance) { - if ( - balance < int256(minBalance) && - addressToCheck.lastTopUpTimestamp + s_minWaitPeriodSeconds <= block.timestamp && - addressToCheck.isActive - ) { + if (balance < int256(minBalance) && minWaitPeriodPassed <= block.timestamp && contractIsActive) { return true; } } catch {} @@ -408,9 +432,9 @@ contract LinkAvailableBalanceMonitor is AccessControl, AutomationCompatibleInter /// @notice Gets configuration information for an address on the watchlist function getAccountInfo( address targetAddress - ) external view returns (bool isActive, uint256 minBalance, uint256 topUpAmount) { + ) external view returns (bool isActive, uint96 minBalance, uint96 topUpAmount, uint56 lastTopUpTimestamp) { MonitoredAddress memory target = s_targets[targetAddress]; - return (target.isActive, target.minBalance, target.topUpAmount); + return (target.isActive, target.minBalance, target.topUpAmount, target.lastTopUpTimestamp); } /// @dev Modifier to make a function callable only by executor role or the From 2743b556c5364f961d04fe3b22e8ee90412fdf68 Mon Sep 17 00:00:00 2001 From: Clement Date: Tue, 12 Mar 2024 19:54:12 +0100 Subject: [PATCH 15/15] feat(dashboard): add panel for metric multi_node_states (#12377) --- dashboard/lib/core-don/component.go | 114 ++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) diff --git a/dashboard/lib/core-don/component.go b/dashboard/lib/core-don/component.go index b37610cf3f1..421ee2ff19d 100644 --- a/dashboard/lib/core-don/component.go +++ b/dashboard/lib/core-don/component.go @@ -791,6 +791,119 @@ func evmPoolLifecycleRow(p Props) []dashboard.Option { } } +func nodesRPCRow(p Props) []dashboard.Option { + return []dashboard.Option{ + dashboard.Row( + "Node RPC State", + row.Collapse(), + row.WithStat( + "Node RPC Alive", + stat.DataSource(p.PrometheusDataSource), + stat.Text(stat.TextValueAndName), + stat.Orientation(stat.OrientationHorizontal), + stat.TitleFontSize(12), + stat.ValueFontSize(20), + stat.Span(3), + stat.WithPrometheusTarget( + `sum(multi_node_states{`+p.PlatformOpts.LabelQuery+`chainId=~"$evmChainID", state="Alive"}) by (`+p.PlatformOpts.LegendString+`, chainId)`, + prometheus.Legend("{{pod}} - {{chainId}}"), + ), + ), + row.WithStat( + "Node RPC Closed", + stat.DataSource(p.PrometheusDataSource), + stat.Text(stat.TextValueAndName), + stat.Orientation(stat.OrientationHorizontal), + stat.TitleFontSize(12), + stat.ValueFontSize(20), + stat.Span(3), + stat.WithPrometheusTarget( + `sum(multi_node_states{`+p.PlatformOpts.LabelQuery+`chainId=~"$evmChainID", state="Closed"}) by (`+p.PlatformOpts.LegendString+`, chainId)`, + prometheus.Legend("{{pod}} - {{chainId}}"), + ), + ), + row.WithStat( + "Node RPC Dialed", + stat.DataSource(p.PrometheusDataSource), + stat.Text(stat.TextValueAndName), + stat.Orientation(stat.OrientationHorizontal), + stat.TitleFontSize(12), + stat.ValueFontSize(20), + stat.Span(3), + stat.WithPrometheusTarget( + `sum(multi_node_states{`+p.PlatformOpts.LabelQuery+`chainId=~"$evmChainID", state="Dialed"}) by (`+p.PlatformOpts.LegendString+`, chainId)`, + prometheus.Legend("{{pod}} - {{chainId}}"), + ), + ), + row.WithStat( + "Node RPC InvalidChainID", + stat.DataSource(p.PrometheusDataSource), + stat.Text(stat.TextValueAndName), + stat.Orientation(stat.OrientationHorizontal), + stat.TitleFontSize(12), + stat.ValueFontSize(20), + stat.Span(3), + stat.WithPrometheusTarget( + `sum(multi_node_states{`+p.PlatformOpts.LabelQuery+`chainId=~"$evmChainID", state="InvalidChainID"}) by (`+p.PlatformOpts.LegendString+`, chainId)`, + prometheus.Legend("{{pod}} - {{chainId}}"), + ), + ), + row.WithStat( + "Node RPC OutOfSync", + stat.DataSource(p.PrometheusDataSource), + stat.Text(stat.TextValueAndName), + stat.Orientation(stat.OrientationHorizontal), + stat.TitleFontSize(12), + stat.ValueFontSize(20), + stat.Span(3), + stat.WithPrometheusTarget( + `sum(multi_node_states{`+p.PlatformOpts.LabelQuery+`chainId=~"$evmChainID", state="OutOfSync"}) by (`+p.PlatformOpts.LegendString+`, chainId)`, + prometheus.Legend("{{pod}} - {{chainId}}"), + ), + ), + row.WithStat( + "Node RPC UnDialed", + stat.DataSource(p.PrometheusDataSource), + stat.Text(stat.TextValueAndName), + stat.Orientation(stat.OrientationHorizontal), + stat.TitleFontSize(12), + stat.ValueFontSize(20), + stat.Span(3), + stat.WithPrometheusTarget( + `sum(multi_node_states{`+p.PlatformOpts.LabelQuery+`chainId=~"$evmChainID", state="Undialed"}) by (`+p.PlatformOpts.LegendString+`, chainId)`, + prometheus.Legend("{{pod}} - {{chainId}}"), + ), + ), + row.WithStat( + "Node RPC Unreachable", + stat.DataSource(p.PrometheusDataSource), + stat.Text(stat.TextValueAndName), + stat.Orientation(stat.OrientationHorizontal), + stat.TitleFontSize(12), + stat.ValueFontSize(20), + stat.Span(3), + stat.WithPrometheusTarget( + `sum(multi_node_states{`+p.PlatformOpts.LabelQuery+`chainId=~"$evmChainID", state="Unreachable"}) by (`+p.PlatformOpts.LegendString+`, chainId)`, + prometheus.Legend("{{pod}} - {{chainId}}"), + ), + ), + row.WithStat( + "Node RPC Unusable", + stat.DataSource(p.PrometheusDataSource), + stat.Text(stat.TextValueAndName), + stat.Orientation(stat.OrientationHorizontal), + stat.TitleFontSize(12), + stat.ValueFontSize(20), + stat.Span(3), + stat.WithPrometheusTarget( + `sum(multi_node_states{`+p.PlatformOpts.LabelQuery+`chainId=~"$evmChainID", state="Unusable"}) by (`+p.PlatformOpts.LegendString+`, chainId)`, + prometheus.Legend("{{pod}} - {{chainId}}"), + ), + ), + ), + } +} + func evmNodeRPCRow(p Props) []dashboard.Option { return []dashboard.Option{ dashboard.Row( @@ -1604,6 +1717,7 @@ func New(p Props) []dashboard.Option { opts = append(opts, sqlQueriesRow(p)...) opts = append(opts, logsCountersRow(p)...) opts = append(opts, evmPoolLifecycleRow(p)...) + opts = append(opts, nodesRPCRow(p)...) opts = append(opts, evmNodeRPCRow(p)...) opts = append(opts, evmRPCNodeLatenciesRow(p)...) opts = append(opts, evmBlockHistoryEstimatorRow(p)...)